code wiki / (root) / _self_host_simd_i64_test.nx

_self_host_simd_i64_test.nx source

↩ module page · 63 lines · 2766 B

1// _self_host_simd_i64_test.nx -- i64x4 closes the 4-width spectrum. 2// 7 ops verified: vadd, vsub, vmul, vsadd, vssub, vreduce_sum, vbroadcast. 3 4import "nx_syscalls.nx" 5 6func main() -> i64 { 7 let a_raw: *u8 = sys_mmap(64) 8 let b_raw: *u8 = sys_mmap(64) 9 let o_raw: *u8 = sys_mmap(64) 10 let a: *i64 = a_raw as *i64 11 let b: *i64 = b_raw as *i64 12 let o: *i64 = o_raw as *i64 13 14 // T1: broadcast(11) + reduce_sum = 44. 15 let d1: i64 = __simd_vbroadcast_i64_x4(11, a as *i64) 16 let s1: i64 = __simd_vreduce_sum_i64_x4(a as *i64) 17 if s1 != 44 { return 1 } 18 19 // T2: broadcast large i64 (1 billion) -> sum 4 billion. 20 let d2: i64 = __simd_vbroadcast_i64_x4(1000000000, a as *i64) 21 let s2: i64 = __simd_vreduce_sum_i64_x4(a as *i64) 22 if s2 != 4000000000 { return 2 } 23 24 // T3: vadd. [100]*4 + [50]*4 = [150]*4. sum = 600. 25 let d3a: i64 = __simd_vbroadcast_i64_x4(100, a as *i64) 26 let d3b: i64 = __simd_vbroadcast_i64_x4(50, b as *i64) 27 let d3: i64 = __simd_vadd_i64_x4(a as *i64, b as *i64, o as *i64) 28 let s3: i64 = __simd_vreduce_sum_i64_x4(o as *i64) 29 if s3 != 600 { return 3 } 30 31 // T4: vsub. [1000]*4 - [400]*4 = [600]*4. sum = 2400. 32 let d4a: i64 = __simd_vbroadcast_i64_x4(1000, a as *i64) 33 let d4b: i64 = __simd_vbroadcast_i64_x4(400, b as *i64) 34 let d4: i64 = __simd_vsub_i64_x4(a as *i64, b as *i64, o as *i64) 35 let s4: i64 = __simd_vreduce_sum_i64_x4(o as *i64) 36 if s4 != 2400 { return 4 } 37 38 // T5: vmul. [7]*4 * [9]*4 = [63]*4. sum = 252. 39 let d5a: i64 = __simd_vbroadcast_i64_x4(7, a as *i64) 40 let d5b: i64 = __simd_vbroadcast_i64_x4(9, b as *i64) 41 let d5: i64 = __simd_vmul_i64_x4(a as *i64, b as *i64, o as *i64) 42 let s5: i64 = __simd_vreduce_sum_i64_x4(o as *i64) 43 if s5 != 252 { return 5 } 44 45 // T6: vsadd. Large positive sat -- [INT64_MAX/2]*4 + [INT64_MAX/2]*4. 46 // INT64_MAX/2 = 4611686018427387903. Sum per lane saturates near INT64_MAX. 47 // Just verify it doesn't crash: sum of 4 saturated lanes = 4 * INT64_MAX. 48 // Use simpler value: 1e15 + 1e15 = 2e15 (no overflow), sum = 8e15. 49 let d6a: i64 = __simd_vbroadcast_i64_x4(1000000000000000, a as *i64) 50 let d6b: i64 = __simd_vbroadcast_i64_x4(1000000000000000, b as *i64) 51 let d6: i64 = __simd_vsadd_i64_x4(a as *i64, b as *i64, o as *i64) 52 let s6: i64 = __simd_vreduce_sum_i64_x4(o as *i64) 53 if s6 != 8000000000000000 { return 6 } 54 55 // T7: vssub. [500]*4 - [200]*4 = [300]*4. sum = 1200. 56 let d7a: i64 = __simd_vbroadcast_i64_x4(500, a as *i64) 57 let d7b: i64 = __simd_vbroadcast_i64_x4(200, b as *i64) 58 let d7: i64 = __simd_vssub_i64_x4(a as *i64, b as *i64, o as *i64) 59 let s7: i64 = __simd_vreduce_sum_i64_x4(o as *i64) 60 if s7 != 1200 { return 7 } 61 62 return 0 63}