code wiki / (root) / _self_host_simd_i8_test.nx

_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}