_nx_bits_fast_vs_soft.nx source
↩ module page · 85 lines · 2781 B
1// _nx_bits_fast_vs_soft.nx
2//
3// Paired correctness oracle: for every input in a curated set,
4// nx_bits_popcount64 (FAST, intrinsic dispatch) must agree with
5// nx_bits_popcount64_soft (SWAR fallback). Same for clz32 / ctz32.
6//
7// Exit code = 0 on agreement; 1..N on first disagreement (encodes
8// which case mismatched so the bench can decode).
9//
10// Closes the four-pillar PREVENT pillar: any future codegen drift
11// between intrinsic and software fallback fires here.
12
13import "syscalls.nx"
14import "nx_bits.nx"
15
16func main() -> i64 {
17 // popcount64 oracles
18 let p0_f: i64 = nx_bits_popcount64(0)
19 let p0_s: i64 = nx_bits_popcount64_soft(0)
20 if p0_f != p0_s { return 1 }
21
22 let p1_f: i64 = nx_bits_popcount64(1)
23 let p1_s: i64 = nx_bits_popcount64_soft(1)
24 if p1_f != p1_s { return 2 }
25
26 let pmax_f: i64 = nx_bits_popcount64(-1)
27 let pmax_s: i64 = nx_bits_popcount64_soft(-1)
28 if pmax_f != pmax_s { return 3 }
29
30 let phi_f: i64 = nx_bits_popcount64(0x7FFFFFFFFFFFFFFF)
31 let phi_s: i64 = nx_bits_popcount64_soft(0x7FFFFFFFFFFFFFFF)
32 if phi_f != phi_s { return 4 }
33
34 let palt_f: i64 = nx_bits_popcount64(0x5555555555555555)
35 let palt_s: i64 = nx_bits_popcount64_soft(0x5555555555555555)
36 if palt_f != palt_s { return 5 }
37
38 let pword_f: i64 = nx_bits_popcount64(0xCAFEBABE12345678)
39 let pword_s: i64 = nx_bits_popcount64_soft(0xCAFEBABE12345678)
40 if pword_f != pword_s { return 6 }
41
42 // clz32 oracles
43 let c0_f: i64 = nx_bits_clz32(0)
44 let c0_s: i64 = nx_bits_clz32_soft(0)
45 if c0_f != c0_s { return 7 }
46
47 let c1_f: i64 = nx_bits_clz32(1)
48 let c1_s: i64 = nx_bits_clz32_soft(1)
49 if c1_f != c1_s { return 8 }
50
51 let chi_f: i64 = nx_bits_clz32(0x80000000)
52 let chi_s: i64 = nx_bits_clz32_soft(0x80000000)
53 if chi_f != chi_s { return 9 }
54
55 let cmid_f: i64 = nx_bits_clz32(0x00010000)
56 let cmid_s: i64 = nx_bits_clz32_soft(0x00010000)
57 if cmid_f != cmid_s { return 10 }
58
59 let call_f: i64 = nx_bits_clz32(0xFFFFFFFF)
60 let call_s: i64 = nx_bits_clz32_soft(0xFFFFFFFF)
61 if call_f != call_s { return 11 }
62
63 // ctz32 oracles
64 let t0_f: i64 = nx_bits_ctz32(0)
65 let t0_s: i64 = nx_bits_ctz32_soft(0)
66 if t0_f != t0_s { return 12 }
67
68 let t1_f: i64 = nx_bits_ctz32(1)
69 let t1_s: i64 = nx_bits_ctz32_soft(1)
70 if t1_f != t1_s { return 13 }
71
72 let thi_f: i64 = nx_bits_ctz32(0x80000000)
73 let thi_s: i64 = nx_bits_ctz32_soft(0x80000000)
74 if thi_f != thi_s { return 14 }
75
76 let tmid_f: i64 = nx_bits_ctz32(0x00010000)
77 let tmid_s: i64 = nx_bits_ctz32_soft(0x00010000)
78 if tmid_f != tmid_s { return 15 }
79
80 let tall_f: i64 = nx_bits_ctz32(0xFFFFFFFF)
81 let tall_s: i64 = nx_bits_ctz32_soft(0xFFFFFFFF)
82 if tall_f != tall_s { return 16 }
83
84 return 0
85}