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