code wiki / (root) / _scalar_bitops_kat.nx

_scalar_bitops_kat.nx source

↩ module page · 66 lines · 2787 B

1// _scalar_bitops_kat.nx — KAT for __bswap64/__clz32/__ctz32/__popcnt64 2// intrinsics (native compiler parity regression smoke). 3import "nx_syscalls.nx" 4import "nx_bits.nx" 5 6func _puti(label: *u8, ln: i64, v: i64, exp: i64) -> i64 { 7 sys_write(2, label, ln) 8 // crude decimal of v then exp 9 let b: *u8 = sys_mmap(32) 10 var n: i64 = 0 11 var x: i64 = v 12 if x == 0 { b[0] = 0x30 as u8; n = 1 } else { 13 let tmp: *u8 = sys_mmap(32); var t: i64 = 0 14 while x > 0 { tmp[t] = (0x30 + (x % 10)) as u8; x = x / 10; t = t + 1 } 15 while t > 0 { t = t - 1; b[n] = tmp[t]; n = n + 1 } 16 } 17 b[n] = 0x20 as u8; n = n + 1 18 b[n] = 0x28 as u8; n = n + 1 // ( 19 let e: *u8 = "exp " as *u8 20 var k: i64 = 0; while k < 4 { b[n] = e[k]; n = n + 1; k = k + 1 } 21 var y: i64 = exp 22 if y == 0 { b[n] = 0x30 as u8; n = n + 1 } else { 23 let tmp2: *u8 = sys_mmap(32); var t2: i64 = 0 24 while y > 0 { tmp2[t2] = (0x30 + (y % 10)) as u8; y = y / 10; t2 = t2 + 1 } 25 while t2 > 0 { t2 = t2 - 1; b[n] = tmp2[t2]; n = n + 1 } 26 } 27 b[n] = 0x29 as u8; n = n + 1 // ) 28 if v == exp { let ok: *u8 = " OK\n" as *u8; var j: i64 = 0; while j < 4 { b[n] = ok[j]; n = n + 1; j = j + 1 } } 29 else { let f: *u8 = " FAIL\n" as *u8; var j2: i64 = 0; while j2 < 6 { b[n] = f[j2]; n = n + 1; j2 = j2 + 1 } } 30 sys_write(2, b, n) 31 return 0 32} 33 34func main() -> i64 { 35 var fails: i64 = 0 36 // bswap64(0x0123456789abcdef) = 0xefcdab8967452301 37 let bs: i64 = nx_bits_bswap64(0x0123456789abcdef) 38 _puti("bswap64: got " as *u8, 13, bs, 0xefcdab8967452301) 39 if bs != 0xefcdab8967452301 { fails = fails + 1 } 40 // popcount64(0xFFFFFFFFFFFFFFFF) = 64 41 let pc: i64 = nx_bits_popcount64(0xFFFFFFFFFFFFFFFF) 42 _puti("popcnt(all1s): got " as *u8, 19, pc, 64) 43 if pc != 64 { fails = fails + 1 } 44 // popcount64(0x5555555555555555) = 32 45 let pc2: i64 = nx_bits_popcount64(0x5555555555555555) 46 _puti("popcnt(0x55..): got " as *u8, 20, pc2, 32) 47 if pc2 != 32 { fails = fails + 1 } 48 // clz32(1) = 31 ; clz32(0) = 32 ; clz32(0x80000000) = 0 49 let c1: i64 = nx_bits_clz32(1) 50 _puti("clz32(1): got " as *u8, 14, c1, 31) 51 if c1 != 31 { fails = fails + 1 } 52 let c0: i64 = nx_bits_clz32(0) 53 _puti("clz32(0): got " as *u8, 14, c0, 32) 54 if c0 != 32 { fails = fails + 1 } 55 // ctz32(8) = 3 ; ctz32(0) = 32 ; ctz32(1) = 0 56 let t8: i64 = nx_bits_ctz32(8) 57 _puti("ctz32(8): got " as *u8, 14, t8, 3) 58 if t8 != 3 { fails = fails + 1 } 59 let t0: i64 = nx_bits_ctz32(0) 60 _puti("ctz32(0): got " as *u8, 14, t0, 32) 61 if t0 != 32 { fails = fails + 1 } 62 63 if fails == 0 { sys_write(1, "SCALAR BITOPS KAT PASS\n" as *u8, 23); return 0 } 64 sys_write(1, "SCALAR BITOPS KAT FAIL\n" as *u8, 23) 65 return fails 66}