code wiki / _hdl_build / nx_bit_kat.nx
nx_bit_kat.nx source
↩ module page · 57 lines · 2807 B
1// nx_bit_kat.nx -- KAT for nx_bit (popcount/clz/ctz/bswap/rotl -- low-level bit primitives). HONESTY [W]
2// weak point. Canonical known-answers: a wrong width or off-by-one fails. license_tier: ORIGINAL expect_exit:0
3import "nx_syscalls.nx"
4import "nx_bit.nx"
5
6func w(s: *u8) -> i64 { var n:i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
7func n(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
8
9func main() -> i64 {
10 var pass: i64 = 0
11
12 // T1: popcount32
13 var ok1: i64 = 1
14 if nx_popcount32(0) != 0 { ok1 = 0 }
15 if nx_popcount32(0xFFFFFFFF) != 32 { ok1 = 0 }
16 if nx_popcount32(0xFF) != 8 { ok1 = 0 }
17 if nx_popcount32(0x55555555) != 16 { ok1 = 0 }
18 if ok1 == 1 { pass = pass + 1; w("T1 popcount32 PASS\n" as *u8) } else { w("T1 FAIL\n" as *u8) }
19
20 // T2: clz32 (leading zeros in 32-bit)
21 var ok2: i64 = 1
22 if nx_clz32(1) != 31 { ok2 = 0 }
23 if nx_clz32(0x80000000) != 0 { ok2 = 0 }
24 if nx_clz32(0xFFFFFFFF) != 0 { ok2 = 0 }
25 if nx_clz32(0x00010000) != 15 { ok2 = 0 }
26 if ok2 == 1 { pass = pass + 1; w("T2 clz32 PASS\n" as *u8) } else { w("T2 FAIL\n" as *u8) }
27
28 // T3: ctz32 (trailing zeros in 32-bit)
29 var ok3: i64 = 1
30 if nx_ctz32(1) != 0 { ok3 = 0 }
31 if nx_ctz32(8) != 3 { ok3 = 0 }
32 if nx_ctz32(0x80000000) != 31 { ok3 = 0 }
33 if nx_ctz32(0xFFFFFFFF) != 0 { ok3 = 0 }
34 if ok3 == 1 { pass = pass + 1; w("T3 ctz32 PASS\n" as *u8) } else { w("T3 FAIL\n" as *u8) }
35
36 // T4: bswap32
37 if (nx_bswap32(0x12345678) & 0xFFFFFFFF) == 0x78563412 { pass = pass + 1; w("T4 bswap32 PASS\n" as *u8) } else { w("T4 FAIL got=" as *u8); n(nx_bswap32(0x12345678) & 0xFFFFFFFF); w("\n" as *u8) }
38
39 // T5: rotl32/rotr32 inverse + known
40 var ok5: i64 = 1
41 if (nx_rotl32(0x80000001, 1) & 0xFFFFFFFF) != 0x00000003 { ok5 = 0 }
42 if (nx_rotr32(0x00000003, 1) & 0xFFFFFFFF) != 0x80000001 { ok5 = 0 }
43 if (nx_rotl32(0x12345678, 0) & 0xFFFFFFFF) != 0x12345678 { ok5 = 0 }
44 if ok5 == 1 { pass = pass + 1; w("T5 rotl/rotr32 PASS\n" as *u8) } else { w("T5 FAIL\n" as *u8) }
45
46 // T6: popcount64 + roundtrip identity (popcount(x)+popcount(~x low32)=32)
47 var ok6: i64 = 1
48 if nx_popcount64(0xFFFFFFFFFFFFFFFF) != 64 { ok6 = 0 }
49 if nx_popcount64(0) != 0 { ok6 = 0 }
50 if nx_popcount32(0x0F0F0F0F) + nx_popcount32(0xF0F0F0F0) != 32 { ok6 = 0 }
51 if ok6 == 1 { pass = pass + 1; w("T6 popcount64 PASS\n" as *u8) } else { w("T6 FAIL\n" as *u8) }
52
53 w("NX-BIT-KAT " as *u8); n(pass); w("/6" as *u8)
54 if pass == 6 { w(" GREEN\n" as *u8); return 0 }
55 w(" RED\n" as *u8)
56 return 1
57}