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 }