code wiki / _hdl_build / nx_chacha_scalar_bench.nx

nx_chacha_scalar_bench.nx source

↩ module page · 44 lines · 2085 B

1// nx_chacha_scalar_bench.nx -- matched scalar baseline for the SIMD ChaCha bench. Same block function 2// (scalar qr, RFC 8439 input), looped M=4,000,000 times (256 MB keystream), no print. Time it the same 3// way (`time ./elf`) so SIMD-vs-scalar is apples-to-apples on the same hardware/toolchain. license_tier: ORIGINAL 4import "nx_syscalls.nx" 5const K_MAGIC_4000000: i64 = 4000000 6 7func u32(x: i64) -> i64 { return x & 0xFFFFFFFF } 8func rotl32(x: i64, r: i64) -> i64 { let a: i64 = (x << r) & 0xFFFFFFFF; let b: i64 = (x & 0xFFFFFFFF) >> (32 - r); return a | b } 9func qr(s: *i64, a: i64, b: i64, c: i64, d: i64) -> i64 { 10 s[a] = u32(s[a] + s[b]); s[d] = rotl32(s[d] ^ s[a], 16) 11 s[c] = u32(s[c] + s[d]); s[b] = rotl32(s[b] ^ s[c], 12) 12 s[a] = u32(s[a] + s[b]); s[d] = rotl32(s[d] ^ s[a], 8) 13 s[c] = u32(s[c] + s[d]); s[b] = rotl32(s[b] ^ s[c], 7) 14 return 0 15} 16 17func main() -> i64 { 18 let s: *i64 = sys_mmap(8 * 16) as *i64 19 let init: *i64 = sys_mmap(8 * 16) as *i64 20 let out: *u8 = sys_mmap(64) 21 var blk: i64 = 0 22 while blk < K_MAGIC_4000000 { 23 s[0] = 0x61707865; s[1] = 0x3320646e; s[2] = 0x79622d32; s[3] = 0x6b206574 24 s[4] = 0x03020100; s[5] = 0x07060504; s[6] = 0x0b0a0908; s[7] = 0x0f0e0d0c 25 s[8] = 0x13121110; s[9] = 0x17161514; s[10] = 0x1b1a1918; s[11] = 0x1f1e1d1c 26 s[12] = 1; s[13] = 0x09000000; s[14] = 0x4a000000; s[15] = 0x00000000 27 var i: i64 = 0; while i < 16 { init[i] = s[i]; i = i + 1 } 28 var r: i64 = 0 29 while r < 10 { 30 qr(s, 0, 4, 8, 12); qr(s, 1, 5, 9, 13); qr(s, 2, 6, 10, 14); qr(s, 3, 7, 11, 15) 31 qr(s, 0, 5, 10, 15); qr(s, 1, 6, 11, 12); qr(s, 2, 7, 8, 13); qr(s, 3, 4, 9, 14) 32 r = r + 1 33 } 34 var j: i64 = 0 35 while j < 16 { 36 let v: i64 = u32(s[j] + init[j]) 37 out[j * 4 + 0] = (v & 0xff) as u8; out[j * 4 + 1] = ((v >> 8) & 0xff) as u8 38 out[j * 4 + 2] = ((v >> 16) & 0xff) as u8; out[j * 4 + 3] = ((v >> 24) & 0xff) as u8 39 j = j + 1 40 } 41 blk = blk + 1 42 } 43 return 0 44}