code wiki / (root) / nx_f32_encode_test.nx

nx_f32_encode_test.nx source

↩ module page · 41 lines · 2017 B

1// nx_f32_encode_test.nx -- KAT gate: integer -> IEEE-754 single bit pattern, 2// against hand-verified reference values. Also round-trips through nx_f32's 3// decoder fields (sign/exp) as a cross-check. expect_exit: 0. 4 5import "nx_syscalls.nx" 6import "nx_f32_encode.nx" 7 8func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func wn(v: i64) -> i64 { 10 let b: *u8 = sys_mmap(28); var m: i64 = v 11 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 12 let t: *u8 = sys_mmap(28); var k: i64 = 0 13 if m == 0 { t[0] = 48 as u8; k = 1 } 14 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 15 var i: i64 = 0; while i < k { b[i] = t[k - 1 - i]; i = i + 1 } 16 sys_write(1, b, k); return 0 17} 18func chk(cond: i64, pass: *i64, fail: *i64, label: *u8) -> i64 { 19 if cond == 1 { pass[0] = pass[0] + 1; w(" ok " as *u8); w(label); w("\n" as *u8) } 20 else { fail[0] = fail[0] + 1; w(" XX " as *u8); w(label); w("\n" as *u8) } 21 return 0 22} 23 24func main() -> i64 { 25 let pass: *i64 = (sys_mmap(8)) as *i64 26 let fail: *i64 = (sys_mmap(8)) as *i64 27 pass[0] = 0 28 fail[0] = 0 29 w("=== nx_f32_encode KAT (int -> IEEE-754 single bits) ===\n" as *u8) 30 chk(f32_from_i64(0) == 0, pass, fail, "0.0 -> 0x00000000" as *u8) 31 chk(f32_from_i64(1) == 1065353216, pass, fail, "1.0 -> 0x3F800000" as *u8) 32 chk(f32_from_i64(2) == 1073741824, pass, fail, "2.0 -> 0x40000000" as *u8) 33 chk(f32_from_i64(4) == 1082130432, pass, fail, "4.0 -> 0x40800000" as *u8) 34 chk(f32_from_i64(10) == 1092616192, pass, fail, "10.0 -> 0x41200000" as *u8) 35 chk(f32_from_i64(20) == 1101004800, pass, fail, "20.0 -> 0x41A00000" as *u8) 36 chk(f32_from_i64(100) == 1120403456, pass, fail, "100.0 -> 0x42C80000" as *u8) 37 chk(f32_from_i64(0 - 1) == 3212836864, pass, fail, "-1.0 -> 0xBF800000" as *u8) 38 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8) 39 if fail[0] == 0 { return 0 } 40 return 1 41}