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