update stack pointer before allocations

This commit is contained in:
dzaima 2022-06-03 20:54:23 +03:00
parent d3555b4af6
commit d4da8a1127
2 changed files with 13 additions and 13 deletions

View File

@ -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;

View File

@ -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;
}