update stack pointer before allocations
This commit is contained in:
parent
d3555b4af6
commit
d4da8a1127
@ -613,10 +613,10 @@ Nvm_res m_nvm(Body* body) {
|
|||||||
break;
|
break;
|
||||||
case MD1C: TOPp; GET(R_A1,1,1); IMM(R_A2,off); CCALL(i_MD1C); break; // (B f,B m, u32* bc)
|
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 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 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,0); CCALL(i_TR2D); break; // (B g, B h)
|
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,0); CCALL(i_TR3D); break; // (B f,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,0); CCALL(i_TR3O); 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 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 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);
|
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 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 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 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 ALIM: TOPp; GET(R_A1,0,2); IMM(R_A1,*bc++); CCALL(i_ALIM); break; // (B, u32 l)
|
||||||
case VFYM: TOPp; CCALL(i_VFYM); break; // (B)
|
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 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 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;
|
case RETN: if (lGPos!=0) GS_SET(r_CS); ret=true; break;
|
||||||
|
|||||||
14
src/vm.c
14
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 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 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 MD2R: { P(m)P(g) GS_UPD; ADD(m2_h (m, g)); break; }
|
||||||
case TR2D: { P(g)P(h) ADD(m_atop( g,h)); break; }
|
case TR2D: { P(g)P(h) GS_UPD; ADD(m_atop( g,h)); break; }
|
||||||
case TR3D: { P(f)P(g)P(h) ADD(m_fork(f,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)
|
case TR3O: { P(f)P(g)P(h) GS_UPD;
|
||||||
if (q_N(f)) { ADD(m_atop(g,h)); dec(f); }
|
if (q_N(f)) { ADD(m_atop(g,h)); dec(f); }
|
||||||
else ADD(m_fork(f,g,h));
|
else ADD(m_fork(f,g,h));
|
||||||
break;
|
break;
|
||||||
@ -764,7 +764,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
|
|||||||
dec(ns);
|
dec(ns);
|
||||||
break;
|
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);
|
FldAlias* a = mm_alloc(sizeof(FldAlias), t_fldAlias);
|
||||||
a->obj = o;
|
a->obj = o;
|
||||||
a->p = l;
|
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 (·)"); }
|
if (q_N(PEEK(1))) { GS_UPD; POS_UPD; thrM("Unexpected Nothing (·)"); }
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VFYM: { P(o)
|
case VFYM: { P(o) GS_UPD;
|
||||||
VfyObj* a = mm_alloc(sizeof(VfyObj), t_vfyObj);
|
VfyObj* a = mm_alloc(sizeof(VfyObj), t_vfyObj);
|
||||||
a->obj = o;
|
a->obj = o;
|
||||||
ADD(tag(a,OBJ_TAG));
|
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 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)));
|
ADD(m_ns(ptr_inc(sc), ptr_inc(b->nsDesc)));
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user