code wiki / (root) / _self_host_simd_minmax_sat_test.nx

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