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