_bits_rotr64_kat.nx source
↩ module page · 49 lines · 1942 B
1// _bits_rotr64_kat.nx — isolate the rotate intrinsic in native ELF.
2import "nx_syscalls.nx"
3import "nx_bits.nx"
4
5func _hex_putd(b: u8) -> i64 {
6 let buf: *u8 = sys_mmap(2)
7 let v: i64 = b as i64
8 let hi: i64 = (v >> 4) & 0xf
9 let lo: i64 = v & 0xf
10 if hi < 10 { buf[0] = (0x30 + hi) as u8 } else { buf[0] = (0x61 + hi - 10) as u8 }
11 if lo < 10 { buf[1] = (0x30 + lo) as u8 } else { buf[1] = (0x61 + lo - 10) as u8 }
12 sys_write(2, buf, 2)
13 return 0
14}
15
16// print i64 as 16 hex digits big-endian
17func _puthex64(v: i64) -> i64 {
18 var i: i64 = 7
19 while i >= 0 {
20 let byte: i64 = (v >> (i * 8)) & 0xff
21 _hex_putd(byte as u8)
22 i = i - 1
23 }
24 sys_write(2, "\n" as *u8, 1)
25 return 0
26}
27
28func main() -> i64 {
29 let x: i64 = 0x0123456789abcdef
30 // rotr by 8 -> 0xef0123456789abcd
31 sys_write(2, "rotr(x,8) got: " as *u8, 16); _puthex64(nx_bits_rotr64(x, 8))
32 sys_write(2, " exp: ef0123456789abcd\n" as *u8, 33)
33 // rotr by 4 -> 0xf0123456789abcde
34 sys_write(2, "rotr(x,4) got: " as *u8, 16); _puthex64(nx_bits_rotr64(x, 4))
35 sys_write(2, " exp: f0123456789abcde\n" as *u8, 33)
36 // rotr by 1 -> 0x8091a2b3c4d5e6f7
37 sys_write(2, "rotr(x,1) got: " as *u8, 16); _puthex64(nx_bits_rotr64(x, 1))
38 sys_write(2, " exp: 8091a2b3c4d5e6f7\n" as *u8, 33)
39 // soft variant for comparison
40 sys_write(2, "soft(x,8) got: " as *u8, 16); _puthex64(nx_bits_rotr64_soft(x, 8))
41 sys_write(2, " exp: ef0123456789abcd\n" as *u8, 33)
42 // raw shifts: x >> 8 (arithmetic on i64; top byte is 0 so logical==arith here)
43 sys_write(2, "x>>8 got: " as *u8, 16); _puthex64(x >> 8)
44 sys_write(2, " exp: 0001234567 89abcd (00 0123456789abcd)\n" as *u8, 53)
45 // x << 56
46 sys_write(2, "x<<56 got: " as *u8, 16); _puthex64(x << 56)
47 sys_write(2, " exp: ef00000000000000\n" as *u8, 33)
48 return 0
49}