From ee93543af377b6b36275b23090a77da47127679d Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 2 Jul 2021 19:17:49 +0300 Subject: [PATCH] stack management for TR__/OP__ 0.06% less performance, but these changes aren't for performance --- src/jit/nvm_x86_64.c | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 91797c27..335e21e8 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -109,16 +109,12 @@ INS B i_ARR_p(B el0, i64 sz GA1) { assert(sz>0); INS B i_DFND_0(u32* bc, Scope* sc, Block* bl GA1) { GS_UPD;POS_UPD; return m_funBlock(bl, sc); } INS B i_DFND_1(u32* bc, Scope* sc, Block* bl GA1) { GS_UPD;POS_UPD; return m_md1Block(bl, sc); } INS B i_DFND_2(u32* bc, Scope* sc, Block* bl GA1) { GS_UPD;POS_UPD; return m_md2Block(bl, sc); } -INS B i_OP1D(B f, u32* bc GA1) { P(m) GS_UPD;POS_UPD; return m1_d (m,f ); } -INS B i_OP2D(B f, u32* bc GA1) { P(m)P(g) GS_UPD;POS_UPD; return m2_d (m,f,g); } -INS B i_OP2H(B m GA1) { P(g) return m2_h (m, g); } -INS B i_TR2D(B g GA1) { P(h) return m_atop( g,h); } -INS B i_TR3D(B f GA1) { P(g)P(h) return m_fork(f,g,h); } -INS B i_TR3O(B f GA1) { P(g)P(h) B r; - if (isNothing(f)) { r=m_atop(g,h); dec(f); } - else { r=m_fork(f,g,h); } - return r; -} +INS B i_OP1D(B f,B m, u32* bc) { POS_UPD; return m1_d (m,f ); } +INS B i_OP2D(B f,B m, B g, u32* bc) { POS_UPD; return m2_d (m,f,g); } +INS B i_OP2H(B m, B g ) { return m2_h (m, g); } +INS B i_TR2D(B g, B h ) { return m_atop( g,h); } +INS B i_TR3D(B f,B g, B h ) { return m_fork(f,g,h); } +INS B i_TR3O(B f,B g, B h ) { return isNothing(f)? m_atop(g,h) : m_fork(f,g,h); } INS B i_LOCO(u32 p, Scope* sc, u32* bc GA1) { B l = sc->vars[p]; if(l.u==bi_noVar.u) { POS_UPD; GS_UPD; thrM("Reading variable before its defined"); } @@ -523,14 +519,12 @@ Nvm_res m_nvm(Body* body) { IMM(R_A0, L64); CCALL(i_ADDU); #endif break; - case FN1C: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_FN1C); break; // (B f, B x, u32* bc) - case FN1O: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_FN1O); break; // (B f, B x, u32* bc) - case FN2C: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_FN2C); break; // (B w, B f, B x, u32* bc, S) - case FN2O: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_FN2O); break; // (B w, B f, B x, u32* bc, S) + case FN1C: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_FN1C); break; // ( B f, B x, u32* bc) + case FN1O: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_FN1O); break; // ( B f, B x, u32* bc) + case FN2C: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_FN2C); break; // (B w, B f, B x, u32* bc) + case FN2O: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_FN2O); break; // (B w, B f, B x, u32* bc) case FN1Ci: { u64 fn = L64; POS_UPD(R_A0,R_A3); MOV(R_A1, R_RES); GET(R_A2,0,2); CCALL(fn); } break; case FN2Ci: { u64 fn = L64; POS_UPD(R_A0,R_A3); MOV(R_A1, R_RES); GET(R_A2,1,1); CCALL(fn); } break; - // case FN1Ci:TOPp; IMM(R_A1,L64); IMM(R_A2,off); INV(3,0,i_FN1Ci); break; // (B, BB2B fm, u32* bc, S) - // case FN2Ci:TOPp; IMM(R_A1,L64); IMM(R_A2,off); INV(3,0,i_FN2Ci); break; // (B, BBB2B fd, u32* bc, S) case FN1Oi:TOPp; IMM(R_A1,L64); IMM(R_A2,off); INV(3,0,i_FN1Oi); break; // (B, BB2B fm, u32* bc, S) case FN2Oi:TOPp; IMM(R_A1,L64); IMM(R_A2, L64); IMM(R_A3,off); INV(4,0,i_FN2Oi); break; // (B, BB2B fm, BBB2B fd, u32* bc, S) case ARRM: case ARRO:; @@ -544,12 +538,12 @@ Nvm_res m_nvm(Body* body) { if (fn==0) thrM("JIT: Bad DFND argument"); IMM(R_A0,off); MOV(R_A1,r_SC); IMM(R_A2,bl); INV(3,1,fn); break; - case OP1D: TOPp; IMM(R_A1,off); INV(2,0,i_OP1D); break; // (B, u32* bc, S) - case OP2D: TOPp; IMM(R_A1,off); INV(2,0,i_OP2D); break; // (B, u32* bc, S) - case OP2H: TOPp; INV(1,0,i_OP2H); break; // (B, S) - case TR2D: TOPp; INV(1,0,i_TR2D); break; // (B, S) - case TR3D: TOPp; INV(1,0,i_TR3D); break; // (B, S) - case TR3O: TOPp; INV(1,0,i_TR3O); break; // (B, S) + case OP1D: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_OP1D); break; // (B f,B m, u32* bc) + case OP2D: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_OP2D); break; // (B f,B m, B g, u32* bc) + case OP2H: TOPp; GET(R_A1,1,0); CCALL(i_OP2H); break; // (B m, B g) // TODO these can actually error on OOM so should do something with bc/gStack + case TR2D: TOPp; GET(R_A1,1,0); CCALL(i_TR2D); break; // (B g, B h) + case TR3D: TOPp; GET(R_A1,1,0); GET(R_A2,2,0); CCALL(i_TR3D); break; // (B f,B g, B h) + case TR3O: TOPp; GET(R_A1,1,0); GET(R_A2,2,0); CCALL(i_TR3O); break; // (B f,B g, B h) case LOCM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, VAR_TAG).u); } break; case EXTM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, EXT_TAG).u); } break; case LOCO: TOPs; { u64 d=*bc++; u64 p=*bc++; LSC(R_A1,d);