code wiki / (root) / _bits_rotr64_kat.nx

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