code wiki / _hdl_build / nx_rv64_jit_w_gate.nx
nx_rv64_jit_w_gate.nx source
↩ module page · 56 lines · 4783 B
1// nx_rv64_jit_w_gate.nx -- GATE: the JIT now compiles *W (32-bit word) ops, so REAL `int` loops accelerate. Before this,
2// jit_compile lacked ADDIW/ADDW/SUBW/MULW/SLLIW/SRLIW/SRAIW -> real compiled int loops (i++ = addiw) NEVER JIT'd (the
3// realc gate showed 0 loops JIT'd). A *W-heavy loop (sum of i*i for i in 1..K using mulw/addw/addiw + a 32-bit branch)
4// now JITs: T1 result == the golden interpreter (correctness, incl. 32-bit sign-extension), T2 it actually compiled +
5// ran native, T3 measurably faster. Uses the sovereign assembler (which emits *W). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_rv64_asm.nx"
8import "nx_rv64_fast.nx"
9import "nx_rv64_jit.nx"
10import "nx_rv64_tier.nx"
11
12func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func g_pn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var x: i64=v; if x<0{b[0]=45;sys_write(1,b,1);x=0-x} if x==0{b[0]=48;sys_write(1,b,1);return 0} var d: i64=0; var y: i64=x; while y>0{d=d+1;y=y/10} var i: i64=d-1; y=x; while i>=0{b[i]=(48+(y%10)) as u8;y=y/10;i=i-1} sys_write(1,b,d); return 0 }
14func ck(name: *u8, c: i64) -> i64 { if c==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) } g_puts(name); g_puts("\n" as *u8); return c }
15const MEMSZ: i64 = 4096
16
17func main() -> i64 {
18 g_puts("nx_rv64_jit_w_gate (the JIT compiles *W ops -> real int loops accelerate: correctness + it JITs + faster)\n" as *u8)
19 var pass: i64=0; var total: i64=0
20 let code: *u8=sys_mmap(4096)
21 let opk: *i64=sys_mmap(128*8) as *i64; let rd: *i64=sys_mmap(128*8) as *i64; let rs1: *i64=sys_mmap(128*8) as *i64; let rs2: *i64=sys_mmap(128*8) as *i64; let imm: *i64=sys_mmap(128*8) as *i64
22
23 // sum of i*i for i in 1..2000000, all 32-bit int (mulw + addw + addiw + blt). t0=sum(x5) t1=i(x6) t2=limit(x7).
24 let nb: i64=rvasm_assemble_str(" li t0, 0\n li t1, 1\n lui t2, 0x1e9\n addi t2, t2, -0x780\nsq:\n mulw t3, t1, t1\n addw t0, t0, t3\n addiw t1, t1, 1\n blt t1, t2, sq\n" as *u8, code, 4096)
25 if nb<0 { g_puts(" ASSEMBLE FAILED\n" as *u8); sys_exit(1); return 1 }
26 let nc: i64=fk_predecode(code, nb, opk, rd, rs1, rs2, imm)
27
28 // golden interpreter
29 let ri: *i64=sys_mmap(32*8) as *i64; let mi: *u8=sys_mmap(MEMSZ); var z: i64=0; while z<32 { ri[z]=0; z=z+1 }
30 let it0: i64=sys_now_us(); fk_run(opk, rd, rs1, rs2, imm, nc, ri, mi, MEMSZ, 200000000, (0 as i64) as *NxVirtioMmio); let it1: i64=sys_now_us()
31 // tiered/JIT
32 let rt: *i64=sys_mmap(32*8) as *i64; let mt: *u8=sys_mmap(MEMSZ); let stats: *i64=sys_mmap(64) as *i64; z=0; while z<32 { rt[z]=0; z=z+1 }
33 let tt0: i64=sys_now_us(); tier_run(opk, rd, rs1, rs2, imm, nc, rt, mt, MEMSZ, 200000000, (0 as i64) as *NxVirtioMmio, 5, stats); let tt1: i64=sys_now_us()
34
35 g_puts(" sum(i*i,1..1999999) mod 2^32 sext: interp t0="); g_pn(ri[5]); g_puts(" tiered t0="); g_pn(rt[5]); g_puts("\n" as *u8)
36 g_puts(" tiered stats: interpreted="); g_pn(stats[0]); g_puts(" loops-JIT'd="); g_pn(stats[1]); g_puts(" native-runs="); g_pn(stats[2]); g_puts("\n" as *u8)
37 g_puts(" time: interp="); g_pn(it1-it0); g_puts("us tiered="); g_pn(tt1-tt0); g_puts("us\n" as *u8)
38
39 var t1: i64=0; if rt[5]==ri[5] { t1=1 }
40 pass=pass+ck("T1: the *W loop on the tiered/JIT engine == the golden interpreter (correctness incl. 32-bit sign-ext)" as *u8, t1); total=total+1
41 var t2: i64=0; if stats[1]>=1 { if stats[2]>=1 { t2=1 } }
42 pass=pass+ck("T2: the *W loop actually JIT-COMPILED + ran native (before this, real int loops NEVER JIT'd -- 0)" as *u8, t2); total=total+1
43 var t3: i64=0; if (tt1-tt0) < (it1-it0) { t3=1 }
44 var sp: i64=0; if (tt1-tt0)>0 { sp=((it1-it0)*100)/(tt1-tt0) }
45 g_puts(" JIT speedup on the *W loop = "); g_pn(sp/100); g_puts("."); if sp%100<10 { g_puts("0" as *u8) } g_pn(sp%100); g_puts("x\n" as *u8)
46 pass=pass+ck("T3: the JIT'd *W loop is measurably faster than interpretation (real int code now accelerates)" as *u8, t3); total=total+1
47
48 var okall: i64=0; if pass==total { okall=1 }
49 g_puts("---- nx_rv64_jit_w_gate: passed "); g_pn(pass); g_puts(" / "); g_pn(total); g_puts(" ----\n" as *u8)
50 if okall==1 {
51 let logf: i64=sys_openat_append("knowledge/status/jit_w.log" as *u8, 420)
52 if logf>=0 { let z2: i64=sys_write(logf,"NXRV64JITW GREEN: the JIT compiles *W ops (ADDIW/ADDW/SUBW/MULW/SLLIW/SRLIW/SRAIW via EAX+MOVSXD) -- real int loops now JIT-accelerate (were 0), correct vs interp incl 32-bit sign-ext, measurably faster\n" as *u8,205); sys_close(logf) }
53 g_puts("verdict=GREEN (the JIT now compiles *W ops -> real int loops JIT-accelerate, correct vs the interpreter + faster; the JIT fires on real code now)\n" as *u8); sys_exit(0); return 0
54 }
55 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
56}