nx_i128_test.nx source
↩ module page · 47 lines · 1645 B
1// nx_i128_test.nx -- smoke test for nx_i128.nx.
2// Exits 0 on success; non-zero codes flag specific failure modes.
3
4import "syscalls.nx"
5import "nx_i128.nx"
6
7func main() -> i64 {
8 // Test 1: nx_muldiv_i64 with values that overflow i64.
9 // a * b = 1_000_000_000 * 1_000_000_000 = 1e18; fits i64 narrowly.
10 // a * b * 4 = 4e18; fits i64 but no headroom.
11 // a * b * 10 = 1e19; OVERFLOWS i64.
12 // Verify (1e9 * 1e9 * 10) / 1e9 = 1e10 via i128 intermediate.
13 let a: i64 = 1000000000
14 let b: i64 = 1000000000
15 let c: i64 = 100000000
16 // a*b = 1e18; (a*b)/c = 1e18 / 1e8 = 1e10
17 let q1: i64 = nx_muldiv_i64(a, b, c)
18 if q1 != 10000000000 { return 11 }
19
20 // Test 2: muldiv with overflow case. a*b/c where a*b > i64.
21 // a = 2^62 = 4.6e18, b = 4, c = 8. a*b = 1.8e19 > i64 max.
22 // Result: a*b/c = 2^62 = 4.6e18. Fits i64.
23 let a2: i64 = 4611686018427387904 // 2^62
24 let b2: i64 = 4
25 let c2: i64 = 8
26 let q2: i64 = nx_muldiv_i64(a2, b2, c2)
27 if q2 != 2305843009213693952 { return 12 } // 2^61
28
29 // Test 3: nx_mulshl_div_i64 -- Q12 ratio.
30 // (3 * 7 << 12) / 1 = 21 * 4096 = 86016
31 let q3: i64 = nx_mulshl_div_i64(3, 7, 12, 1)
32 if q3 != 86016 { return 13 }
33
34 // Test 4: signed.
35 let q4: i64 = nx_muldiv_i64(-1000000000, 1000000000, 100000000)
36 if q4 != -10000000000 { return 14 }
37
38 // Test 5: zero.
39 let q5: i64 = nx_muldiv_i64(0, 1000000, 7)
40 if q5 != 0 { return 15 }
41
42 // Test 6: simple sanity (no overflow).
43 let q6: i64 = nx_muldiv_i64(100, 200, 5)
44 if q6 != 4000 { return 16 }
45
46 return 0
47}