lib/stabilizer/src/intrinsics.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 
 3 pub fn powif(base: f32, exponent: c_int) f32 {
 4     return std.math.pow(f32, base, @floatFromInt(exponent));
 5 }
 6 
 7 pub fn memset_i8(dest: ?[*]u8, value: u8, len: u8, align_bytes: u32, is_volatile: bool) void {
 8     _ = align_bytes;
 9     _ = is_volatile;
10     fill(dest, value, len);
11 }
12 
13 pub fn memset_i16(dest: ?[*]u8, value: u8, len: u16, align_bytes: u32, is_volatile: bool) void {
14     _ = align_bytes;
15     _ = is_volatile;
16     fill(dest, value, len);
17 }
18 
19 pub fn memset_i32(dest: ?[*]u8, value: u8, len: u32, align_bytes: u32, is_volatile: bool) void {
20     _ = align_bytes;
21     _ = is_volatile;
22     fill(dest, value, len);
23 }
24 
25 pub fn memset_i64(dest: ?[*]u8, value: u8, len: u64, align_bytes: u32, is_volatile: bool) void {
26     _ = align_bytes;
27     _ = is_volatile;
28     fill(dest, value, len);
29 }
30 
31 fn fill(dest: ?[*]u8, value: u8, len: anytype) void {
32     @setRuntimeSafety(false);
33     const ptr = dest orelse return;
34     for (0..@as(usize, @intCast(len))) |index| ptr[index] = value;
35 }
36 
37 test "intrinsics expose upstream powif semantics" {
38     try std.testing.expectEqual(@as(f32, 8.0), powif(2.0, 3));
39     try std.testing.expectEqual(@as(f32, 0.25), powif(2.0, -2));
40     try std.testing.expectEqual(@as(f32, -8.0), powif(-2.0, 3));
41     try std.testing.expectEqual(@as(f32, 1.0), powif(-2.0, 0));
42 }
43 
44 test "intrinsics expose upstream memset variants" {
45     var bytes = @as([32]u8, @splat(0xaa));
46 
47     memset_i8(bytes[1..].ptr, 0x11, 3, 1, false);
48     try std.testing.expectEqual(@as(u8, 0xaa), bytes[0]);
49     try std.testing.expectEqualSlices(u8, &@as([3]u8, @splat(0x11)), bytes[1..4]);
50 
51     memset_i16(bytes[4..].ptr, 0x22, 5, 2, false);
52     try std.testing.expectEqualSlices(u8, &@as([5]u8, @splat(0x22)), bytes[4..9]);
53 
54     memset_i32(bytes[9..].ptr, 0x33, 7, 4, false);
55     try std.testing.expectEqualSlices(u8, &@as([7]u8, @splat(0x33)), bytes[9..16]);
56 
57     memset_i64(bytes[16..].ptr, 0x44, 9, 8, true);
58     try std.testing.expectEqualSlices(u8, &@as([9]u8, @splat(0x44)), bytes[16..25]);
59     try std.testing.expectEqualSlices(u8, &@as([7]u8, @splat(0xaa)), bytes[25..]);
60 
61     memset_i8(null, 0xff, 0, 1, false);
62     memset_i16(null, 0xff, 0, 1, false);
63     memset_i32(null, 0xff, 0, 1, false);
64     memset_i64(null, 0xff, 0, 1, false);
65 }