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}