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}