code wiki / (root) / _nx_bits_fast_vs_soft.nx

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