code wiki / (root) / nx_bench_collatz.nx

nx_bench_collatz.nx source

↩ module page · 57 lines · 2205 B

1// nx_bench_collatz.nx -- NishiLang twin of bench/xlang/collatz.c (branch-heavy). 2// Max Collatz stopping-time over [1,N) + XOR step checksum. Prints checksum then 3// elapsed_us. Checksum MUST equal the gcc AND clang builds (3rd-party oracles). 4// license_tier: ORIGINAL No hw writes (Rule 26). 5// (nx_syscalls_x86_64.nx import REMOVED 2026-07-31, debt 1785528831. This file already 6// gets the canonical syscall layer transitively via nx_clock.nx -> syscalls.nx. Importing 7// nx_syscalls_x86_64.nx as well put TWO syscall layers in one translation unit: every 8// wrapper defined twice, one against RAW x86 numbers and one against the @ifndef 9// TARGET_X86_64 RV64 numbers the backend translates at emit (SYS_POLL 7 vs 73). nx_cc 10// accepted the redefinition silently and let definition ORDER pick the numbering.) 11import "nx_clock.nx" 12const K_MAGIC_3000000: i64 = 3000000 13const K_MAGIC_2654435761: i64 = 2654435761 14const K_MAGIC_1000003: i64 = 1000003 15 16func bc_emit_i64(fd: i64, n: i64) -> i64 { 17 let scratch: *u8 = sys_mmap(32) 18 var v: i64 = n 19 var neg: i64 = 0 20 if v < 0 { neg = 1; v = 0 - v } 21 var k: i64 = 0 22 if v == 0 { scratch[0] = 0x30 as u8; k = 1 } 23 while v > 0 { scratch[k] = (0x30 + (v - (v / 10) * 10)) as u8; v = v / 10; k = k + 1 } 24 let rev: *u8 = sys_mmap(48) 25 var ro: i64 = 0 26 if neg == 1 { rev[0] = 0x2D as u8; ro = 1 } 27 var j: i64 = 0 28 while j < k { rev[ro + j] = scratch[k - 1 - j]; j = j + 1 } 29 rev[ro + k] = 0x0A as u8 30 sys_write(fd, rev, ro + k + 1) 31 return 0 32} 33 34func main() -> i64 { 35 let N: i64 = K_MAGIC_3000000 36 var best: i64 = 0 37 var accum: i64 = 0 38 let start: i64 = nx_clock_monotonic_ns() 39 var n: i64 = 1 40 while n < N { 41 var c: i64 = n 42 var steps: i64 = 0 43 while c != 1 { 44 if (c & 1) == 0 { c = c / 2 } else { c = 3 * c + 1 } 45 steps = steps + 1 46 } 47 if steps > best { best = steps } 48 accum = accum ^ (steps * K_MAGIC_2654435761) 49 n = n + 1 50 } 51 let end: i64 = nx_clock_monotonic_ns() 52 let us: i64 = (end - start) / 1000 53 let chk: i64 = best * K_MAGIC_1000003 + accum 54 bc_emit_i64(1, chk) 55 bc_emit_i64(1, us) 56 return 0 57}