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}