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}