code wiki / _hdl_build / nx_sext_wasm_kat_gate.nx
nx_sext_wasm_kat_gate.nx source
↩ module page · 81 lines · 4796 B
1// nx_sext_wasm_kat_gate.nx -- END-TO-END KAT for the WASM lane's subword sign-extend fix (2026-07-10):
2// forks the sovereign pipeline (nx_compile_wat: .nx -> wat; nx_wat_compiler: wat -> wasm) on
3// nx_sext_wasm_kat.nx, loads the wasm in nx_wasm_vm, and asserts the SEMANTICS in-VM:
4// T1 both tools rc=0 (pre-fix: nx_wat_compiler REFUSED -- i64.store32/load32_* were unknown atoms)
5// T2 exports resolve
6// T3 sext_kat() == 0 (*i32 negative+positive round-trip AND *u8 0xA0->160 witness, all in-VM)
7// T4 sext_load_neg() == -100 (the visible sign-extension number; a zero-extend lane returns 4294967196)
8// This is the WASM twin of nx_i32store_probe_gate (x86) -- one language semantic, every backend.
9// Stage first: nx_sov_build_run nx_compile_wat --build-only + nx_sov_build_run nx_wat_compiler --build-only.
10// expect_exit: 0 license_tier: ORIGINAL
11import "nx_syscalls.nx"
12import "nx_wasm_vm.nx"
13
14const SW_CWAT: *u8 = "/tmp/nx_compile_wat.sov.elf"
15const SW_WATC: *u8 = "/tmp/nx_wat_compiler.sov.elf"
16const SW_SRC: *u8 = "/mnt/c/Users/elder/nishi-core/nxc2/runtime/nx_sext_wasm_kat.nx"
17const SW_OWAT: *u8 = "/tmp/sextkat.wat"
18const SW_OWASM: *u8 = "/tmp/sextkat.wasm"
19
20func sw_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
21func sw_pn(v: i64) -> i64 {
22 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
23 let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}
24 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
25func sw_check(name: *u8, cond: i64) -> i64 {
26 if cond==1 { sw_puts(" PASS " as *u8) } else { sw_puts(" FAIL " as *u8) }
27 sw_puts(name); sw_puts("\n" as *u8); return cond }
28func sw_run_elf(elf: *u8, a1: *u8, a2: *u8) -> i64 {
29 let pid: i64 = sys_fork()
30 if pid == 0 {
31 let argv: *i64 = sys_mmap(64) as *i64
32 argv[0]=elf as i64; argv[1]=a1 as i64; argv[2]=a2 as i64; argv[3]=0
33 let envp: *i64 = sys_mmap(16) as *i64
34 envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0
35 sys_execve(elf, argv, envp); sys_exit(127)
36 }
37 let st: *i64 = sys_mmap(16) as *i64; sys_wait4(pid, st, 0)
38 return (st[0] >> 8) & 0xff }
39
40func main() -> i64 {
41 sw_puts("=== nx_sext_wasm_kat_gate: .nx -> wat -> wasm -> nx_wasm_vm, subword sign-extend semantics ===\n" as *u8)
42 var pass: i64 = 0; var total: i64 = 0
43
44 let rc1: i64 = sw_run_elf(SW_CWAT, SW_SRC, SW_OWAT)
45 sw_puts(" [build] nx_compile_wat rc=" as *u8); sw_pn(rc1); sw_puts("\n" as *u8)
46 let rc2: i64 = sw_run_elf(SW_WATC, SW_OWAT, SW_OWASM)
47 sw_puts(" [build] nx_wat_compiler rc=" as *u8); sw_pn(rc2); sw_puts("\n" as *u8)
48 var okb: i64 = 0
49 if rc1 == 0 { if rc2 == 0 { okb = 1 } }
50 pass = pass + sw_check("pipeline rc=0 (pre-fix: WATC REFUSED unknown i64.store32/load32_*)" as *u8, okb); total = total + 1
51 if okb == 0 { sw_puts("NX-SEXT-WASM-KAT-GATE verdict=RED (pipeline)\n" as *u8); return 1 }
52
53 let box: *i64 = sys_mmap(16) as *i64
54 let wasm: *u8 = sys_read_file(SW_OWASM, box)
55 if (wasm as i64)==0 { sw_puts(" FAIL cannot read sextkat.wasm\nNX-SEXT-WASM-KAT-GATE verdict=RED\n" as *u8); return 1 }
56 sw_puts(" [measure] wasm bytes=" as *u8); sw_pn(box[0]); sw_puts("\n" as *u8)
57 let mod: *WasmMod = wm_new(wasm, box[0])
58 if wm_parse(mod) != 0 { sw_puts(" FAIL wasm parse\nNX-SEXT-WASM-KAT-GATE verdict=RED\n" as *u8); return 1 }
59 mod.mem = sys_mmap(131072) as *u8
60
61 var oke: i64 = 0
62 if wm_find_export(mod, "sext_kat" as *u8) >= 0 { if wm_find_export(mod, "sext_load_neg" as *u8) >= 0 { oke = 1 } }
63 pass = pass + sw_check("exports sext_kat + sext_load_neg resolve" as *u8, oke); total = total + 1
64
65 let k: i64 = wm_run(mod, "sext_kat" as *u8, 0, 0, 0, 0, 0, 0)
66 sw_puts(" [run] sext_kat() fails=" as *u8); sw_pn(k); sw_puts("\n" as *u8)
67 var ok3: i64 = 0
68 if k == 0 { ok3 = 1 }
69 pass = pass + sw_check("in-VM semantics: *i32 neg+pos round-trip AND *u8 0xA0->160 (fails==0)" as *u8, ok3); total = total + 1
70
71 let nv: i64 = wm_run(mod, "sext_load_neg" as *u8, 0, 0, 0, 0, 0, 0)
72 sw_puts(" [run] sext_load_neg() = " as *u8); sw_pn(nv); sw_puts(" (want -100; zero-extend lane would say 4294967196)\n" as *u8)
73 var ok4: i64 = 0
74 if nv == (0 - 100) { ok4 = 1 }
75 pass = pass + sw_check("i64.load32_s sign-extends in the sovereign VM (== -100)" as *u8, ok4); total = total + 1
76
77 sw_puts("NX-SEXT-WASM-KAT-GATE passed " as *u8); sw_pn(pass); sw_puts("/" as *u8); sw_pn(total)
78 if pass == total { sw_puts(" verdict=GREEN (WASM lane sext-aligned with x86+RV64: signed loads sign-extend, u8 stays zero-extend)\n" as *u8); return 0 }
79 sw_puts(" verdict=RED\n" as *u8)
80 return 1
81}