_self_host_simd_minmax_sat_test.nx source
↩ module page · 49 lines · 2006 B
1// _self_host_simd_minmax_sat_test.nx -- 3 ops in one smoke.
2//
3// vec a = [-30000, 50, 17, 100, 200, 300, 400, 500,
4// 600, 700, 800, 900, 1000, 1100, 1200, 25000]
5// vec b = [10000] * 16 (constant 10000)
6//
7// Tests:
8// 1. vreduce_min(a) = -30000 (sign-ext negative)
9// 2. vreduce_max(a) = 25000
10// 3. vsadd(a, b) -> clip: a[0]+b[0] = -30000+10000 = -20000 (in range)
11// but a[15]+b[15] = 25000+10000 = 35000 > 32767 -> sat 32767
12// vreduce_max(out) should = 32767
13
14import "nx_syscalls.nx"
15
16func pack4_i16(a: i64, b: i64, c: i64, d: i64) -> i64 {
17 return (a & 0xFFFF) | ((b & 0xFFFF) << 16) | ((c & 0xFFFF) << 32) | ((d & 0xFFFF) << 48)
18}
19
20func main() -> i64 {
21 let a_raw: *u8 = sys_mmap(64)
22 let b_raw: *u8 = sys_mmap(64)
23 let o_raw: *u8 = sys_mmap(64)
24 let a: *i64 = a_raw as *i64
25 let b: *i64 = b_raw as *i64
26 let o: *i64 = o_raw as *i64
27 a[0] = pack4_i16(-30000, 50, 17, 100)
28 a[1] = pack4_i16(200, 300, 400, 500)
29 a[2] = pack4_i16(600, 700, 800, 900)
30 a[3] = pack4_i16(1000, 1100, 1200, 25000)
31 b[0] = pack4_i16(10000, 10000, 10000, 10000)
32 b[1] = pack4_i16(10000, 10000, 10000, 10000)
33 b[2] = pack4_i16(10000, 10000, 10000, 10000)
34 b[3] = pack4_i16(10000, 10000, 10000, 10000)
35 // Test 1: vreduce_min(a) should be -30000. Take low byte.
36 // -30000 as i64 is negative. (-30000) & 0xFF = 0xD0 = 208.
37 let r_min: i64 = __simd_vreduce_min_i16_x16(a as *i64)
38 if r_min != -30000 { return 1 }
39 // Test 2: vreduce_max(a) should be 25000. 25000 % 251 = ?
40 // 25000 / 251 = 99; 99*251 = 24849; 25000-24849 = 151.
41 let r_max: i64 = __simd_vreduce_max_i16_x16(a as *i64)
42 if r_max != 25000 { return 2 }
43 // Test 3: vsadd(a, b, o); vreduce_max(o) should be 32767 (saturated)
44 let dummy: i64 = __simd_vsadd_i16_x16(a as *i64, b as *i64, o as *i64)
45 let r_smax: i64 = __simd_vreduce_max_i16_x16(o as *i64)
46 if r_smax != 32767 { return 3 }
47 // All three PASS -- return 0 (exit code).
48 return 0
49}