code wiki / (root) / _self_host_simd_sum_bcast_test.nx

_self_host_simd_sum_bcast_test.nx source

↩ module page · 58 lines · 2094 B

1// _self_host_simd_sum_bcast_test.nx -- vreduce_sum + vbroadcast. 2 3import "nx_syscalls.nx" 4 5func main() -> i64 { 6 let a_raw: *u8 = sys_mmap(64) 7 let o_raw: *u8 = sys_mmap(64) 8 let a: *i64 = a_raw as *i64 9 let o: *i64 = o_raw as *i64 10 11 // Test 1: vreduce_sum of [1..16] = 136. 12 a[0] = 0x0004000300020001 13 a[1] = 0x0008000700060005 14 a[2] = 0x000c000b000a0009 15 a[3] = 0x0010000f000e000d 16 let s1: i64 = __simd_vreduce_sum_i16_x16(a as *i64) 17 if s1 != 136 { return 1 } 18 19 // Test 2: vreduce_sum of mixed positive/negative = 0. 20 // [1, -1, 2, -2, 3, -3, ..., 8, -8] -> sum 0. 21 a[0] = 0xFFFE0002FFFF0001 // (1, -1, 2, -2) 22 a[1] = 0xFFFC0004FFFD0003 // (3, -3, 4, -4) 23 a[2] = 0xFFFA0006FFFB0005 // (5, -5, 6, -6) 24 a[3] = 0xFFF80008FFF90007 // (7, -7, 8, -8) 25 let s2: i64 = __simd_vreduce_sum_i16_x16(a as *i64) 26 if s2 != 0 { return 2 } 27 28 // Test 3: vreduce_sum of all-zeros = 0. 29 a[0] = 0; a[1] = 0; a[2] = 0; a[3] = 0 30 let s3: i64 = __simd_vreduce_sum_i16_x16(a as *i64) 31 if s3 != 0 { return 3 } 32 33 // Test 4: vreduce_sum of all-(-1000) = -16000 (sign-ext through reduce). 34 a[0] = 0xFC18FC18FC18FC18 // 4 lanes of -1000 = 0xFC18 35 a[1] = 0xFC18FC18FC18FC18 36 a[2] = 0xFC18FC18FC18FC18 37 a[3] = 0xFC18FC18FC18FC18 38 let s4: i64 = __simd_vreduce_sum_i16_x16(a as *i64) 39 if s4 != -16000 { return 4 } 40 41 // Test 5: vbroadcast(42) -> all 16 lanes = 42, sum = 16*42 = 672. 42 let d5: i64 = __simd_vbroadcast_i16_x16(42, o as *i64) 43 let s5: i64 = __simd_vreduce_sum_i16_x16(o as *i64) 44 if s5 != 672 { return 5 } 45 let mn5: i64 = __simd_vreduce_min_i16_x16(o as *i64) 46 if mn5 != 42 { return 15 } 47 let mx5: i64 = __simd_vreduce_max_i16_x16(o as *i64) 48 if mx5 != 42 { return 25 } 49 50 // Test 6: vbroadcast(-100) -> sum = -1600, min = max = -100. 51 let d6: i64 = __simd_vbroadcast_i16_x16(-100, o as *i64) 52 let mn6: i64 = __simd_vreduce_min_i16_x16(o as *i64) 53 if mn6 != -100 { return 6 } 54 let s6: i64 = __simd_vreduce_sum_i16_x16(o as *i64) 55 if s6 != -1600 { return 16 } 56 57 return 0 58}