_self_host_simd_i8_test.nx source
↩ module page · 52 lines · 2160 B
1// _self_host_simd_i8_test.nx -- i8x32 set: 6 ops, 6 assertions.
2
3import "nx_syscalls.nx"
4
5func main() -> i64 {
6 let a_raw: *u8 = sys_mmap(64)
7 let b_raw: *u8 = sys_mmap(64)
8 let o_raw: *u8 = sys_mmap(64)
9 let a: *i64 = a_raw as *i64
10 let b: *i64 = b_raw as *i64
11 let o: *i64 = o_raw as *i64
12
13 // Test 1: vbroadcast(5) -> 32 lanes of 5. vreduce_sum = 32*5 = 160.
14 let d1: i64 = __simd_vbroadcast_i8_x32(5, a as *i64)
15 let s1: i64 = __simd_vreduce_sum_i8_x32(a as *i64)
16 if s1 != 160 { return 1 }
17
18 // Test 2: vbroadcast(-3) -> sum = 32*(-3) = -96 (sign-ext correct).
19 let d2: i64 = __simd_vbroadcast_i8_x32(-3, a as *i64)
20 let s2: i64 = __simd_vreduce_sum_i8_x32(a as *i64)
21 if s2 != -96 { return 2 }
22
23 // Test 3: vadd. a=[5]*32 + b=[3]*32 -> out=[8]*32. sum = 256.
24 let d3a: i64 = __simd_vbroadcast_i8_x32(5, a as *i64)
25 let d3b: i64 = __simd_vbroadcast_i8_x32(3, b as *i64)
26 let d3: i64 = __simd_vadd_i8_x32(a as *i64, b as *i64, o as *i64)
27 let s3: i64 = __simd_vreduce_sum_i8_x32(o as *i64)
28 if s3 != 256 { return 3 }
29
30 // Test 4: vsub. a=[10]*32 - b=[7]*32 = [3]*32. sum = 96.
31 let d4a: i64 = __simd_vbroadcast_i8_x32(10, a as *i64)
32 let d4b: i64 = __simd_vbroadcast_i8_x32(7, b as *i64)
33 let d4: i64 = __simd_vsub_i8_x32(a as *i64, b as *i64, o as *i64)
34 let s4: i64 = __simd_vreduce_sum_i8_x32(o as *i64)
35 if s4 != 96 { return 4 }
36
37 // Test 5: vsadd signed saturating. a=[100]*32 + b=[100]*32 -> 200 sat to 127.
38 let d5a: i64 = __simd_vbroadcast_i8_x32(100, a as *i64)
39 let d5b: i64 = __simd_vbroadcast_i8_x32(100, b as *i64)
40 let d5: i64 = __simd_vsadd_i8_x32(a as *i64, b as *i64, o as *i64)
41 let s5: i64 = __simd_vreduce_sum_i8_x32(o as *i64)
42 if s5 != 32 * 127 { return 5 }
43
44 // Test 6: vssub signed sat. a=[-100]*32 - b=[100]*32 -> -200 sat to -128.
45 let d6a: i64 = __simd_vbroadcast_i8_x32(-100, a as *i64)
46 let d6b: i64 = __simd_vbroadcast_i8_x32(100, b as *i64)
47 let d6: i64 = __simd_vssub_i8_x32(a as *i64, b as *i64, o as *i64)
48 let s6: i64 = __simd_vreduce_sum_i8_x32(o as *i64)
49 if s6 != 32 * -128 { return 6 }
50
51 return 0
52}