diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 529c0da9..8a62b1a0 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -613,10 +613,10 @@ Nvm_res m_nvm(Body* body) { break; case MD1C: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_MD1C); break; // (B f,B m, u32* bc) case MD2C: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); IMM(R_A3,off); CCALL(i_MD2C); break; // (B f,B m, B g, u32* bc) - case MD2R: TOPp; GET(R_A1,1,0); CCALL(i_MD2R); 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 MD2R: TOPp; GET(R_A1,1,1); CCALL(i_MD2R); 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,1); CCALL(i_TR2D); break; // (B g, B h) + case TR3D: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3D); break; // (B f,B g, B h) + case TR3O: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3O); break; // (B f,B g, B h) case VARM: 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 VARO: TOPs; { u64 d=*bc++; u64 p=*bc++; LSC(R_A1,d); @@ -648,8 +648,8 @@ Nvm_res m_nvm(Body* body) { case SETMv:TOPp; { u64 d=*bc++; u64 p=*bc++; GET(R_A1,1,1); LSC(R_A2,d); IMM(R_A3,p); IMM(R_A4,off); CCALL(i_SETMv); NORES(2); break; } // (B f, B x, Scope* sc, u32 p, u32* bc) case SETCv:TOPp; { u64 d=*bc++; u64 p=*bc++; GET(R_A1,0,2); LSC(R_A1,d); IMM(R_A2,p); IMM(R_A3,off); CCALL(i_SETCv); NORES(1); break; } // (B f, Scope* sc, u32 p, u32* bc) case FLDO: TOPp; GET(R_A1,0,2); IMM(R_A1,*bc++); MOV(R_A2,r_SC); CCALL(i_FLDO); break; // (B, u32 p, Scope* sc) - case ALIM: TOPp; IMM(R_A1,*bc++); CCALL(i_ALIM); break; // (B, u32 l) - case VFYM: TOPp; CCALL(i_VFYM); break; // (B) + case ALIM: TOPp; GET(R_A1,0,2); IMM(R_A1,*bc++); CCALL(i_ALIM); break; // (B, u32 l) + case VFYM: TOPp; GET(R_A1,0,2); CCALL(i_VFYM); break; // (B) case CHKV: TOPp; IMM(R_A1,off); INV(2,0,i_CHKV); break; // (B, u32* bc, S) case RETD: if (lGPos!=0) GS_SET(r_CS); MOV(R_A0,r_SC); CCALL(i_RETD); ret=true; break; // (Scope* sc) case RETN: if (lGPos!=0) GS_SET(r_CS); ret=true; break; diff --git a/src/vm.c b/src/vm.c index 765637d7..cacaadc1 100644 --- a/src/vm.c +++ b/src/vm.c @@ -679,10 +679,10 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume case MD1C: { P(f)P(m) GS_UPD;POS_UPD; ADD(m1_d (m,f )); break; } case MD2C: { P(f)P(m)P(g) GS_UPD;POS_UPD; ADD(m2_d (m,f,g)); break; } - case MD2R: { P(m)P(g) ADD(m2_h (m, g)); break; } - case TR2D: { P(g)P(h) ADD(m_atop( g,h)); break; } - case TR3D: { P(f)P(g)P(h) ADD(m_fork(f,g,h)); break; } - case TR3O: { P(f)P(g)P(h) + case MD2R: { P(m)P(g) GS_UPD; ADD(m2_h (m, g)); break; } + case TR2D: { P(g)P(h) GS_UPD; ADD(m_atop( g,h)); break; } + case TR3D: { P(f)P(g)P(h) GS_UPD; ADD(m_fork(f,g,h)); break; } + case TR3O: { P(f)P(g)P(h) GS_UPD; if (q_N(f)) { ADD(m_atop(g,h)); dec(f); } else ADD(m_fork(f,g,h)); break; @@ -764,7 +764,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume dec(ns); break; } - case ALIM: { P(o) u32 l = *bc++; + case ALIM: { P(o) GS_UPD; u32 l = *bc++; FldAlias* a = mm_alloc(sizeof(FldAlias), t_fldAlias); a->obj = o; a->p = l; @@ -775,7 +775,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume if (q_N(PEEK(1))) { GS_UPD; POS_UPD; thrM("Unexpected Nothing (ยท)"); } break; } - case VFYM: { P(o) + case VFYM: { P(o) GS_UPD; VfyObj* a = mm_alloc(sizeof(VfyObj), t_vfyObj); a->obj = o; ADD(tag(a,OBJ_TAG)); @@ -783,7 +783,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume } case FAIL: thrM(q_N(sc->vars[2])? "This block cannot be called monadically" : "This block cannot be called dyadically"); - case RETD: { + case RETD: { GS_UPD; ADD(m_ns(ptr_inc(sc), ptr_inc(b->nsDesc))); goto end; }