mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-12 17:24:09 +00:00
Restore MULTRES for snapshots pointing to CALLM etc. bytecodes.
This commit is contained in:
parent
4f19a15bd9
commit
16f33422f1
23
src/lj_asm.c
23
src/lj_asm.c
@ -3253,6 +3253,16 @@ static void asm_head_side(ASMState *as)
|
|||||||
|
|
||||||
/* -- Tail of trace ------------------------------------------------------- */
|
/* -- Tail of trace ------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Set MULTRES in C frame. */
|
||||||
|
static void asm_tail_multres(ASMState *as, BCReg mres)
|
||||||
|
{
|
||||||
|
/* We don't know spadj yet, so get the C frame from L->cframe. */
|
||||||
|
emit_movmroi(as, RID_RET, CFRAME_OFS_MULTRES, mres);
|
||||||
|
emit_gri(as, XG_ARITHi(XOg_AND), RID_RET|REX_64, CFRAME_RAWMASK);
|
||||||
|
emit_rmro(as, XO_MOV, RID_RET|REX_64, RID_RET, offsetof(lua_State, cframe));
|
||||||
|
emit_getgl(as, RID_RET, jit_L);
|
||||||
|
}
|
||||||
|
|
||||||
/* Link to another trace. */
|
/* Link to another trace. */
|
||||||
static void asm_tail_link(ASMState *as)
|
static void asm_tail_link(ASMState *as)
|
||||||
{
|
{
|
||||||
@ -3273,6 +3283,19 @@ static void asm_tail_link(ASMState *as)
|
|||||||
}
|
}
|
||||||
emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch);
|
emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch);
|
||||||
emit_loada(as, RID_PC, pc);
|
emit_loada(as, RID_PC, pc);
|
||||||
|
switch (bc_op(*pc)) {
|
||||||
|
case BC_CALLM: case BC_CALLMT:
|
||||||
|
asm_tail_multres(as, snap->nslots - baseslot - 1 - bc_a(*pc) - bc_c(*pc));
|
||||||
|
break;
|
||||||
|
case BC_RETM:
|
||||||
|
asm_tail_multres(as, snap->nslots - baseslot - bc_a(*pc) - bc_d(*pc));
|
||||||
|
break;
|
||||||
|
case BC_TSETM:
|
||||||
|
asm_tail_multres(as, snap->nslots - baseslot - bc_a(*pc));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else if (baseslot) {
|
} else if (baseslot) {
|
||||||
/* Save modified BASE for linking to trace with higher start frame. */
|
/* Save modified BASE for linking to trace with higher start frame. */
|
||||||
emit_setgl(as, RID_BASE, jit_base);
|
emit_setgl(as, RID_BASE, jit_base);
|
||||||
|
@ -309,7 +309,14 @@ const BCIns *lj_snap_restore(jit_State *J, void *exptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
switch (bc_op(*pc)) {
|
||||||
|
case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM:
|
||||||
|
L->top = frame + nslots;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
L->top = curr_topL(L);
|
L->top = curr_topL(L);
|
||||||
|
break;
|
||||||
|
}
|
||||||
lua_assert(map + nent == flinks);
|
lua_assert(map + nent == flinks);
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
@ -666,6 +666,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
|
|||||||
ExitDataCP exd;
|
ExitDataCP exd;
|
||||||
int errcode;
|
int errcode;
|
||||||
const BCIns *pc;
|
const BCIns *pc;
|
||||||
|
void *cf;
|
||||||
exd.J = J;
|
exd.J = J;
|
||||||
exd.exptr = exptr;
|
exd.exptr = exptr;
|
||||||
errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);
|
errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);
|
||||||
@ -692,7 +693,9 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
|
|||||||
|
|
||||||
pc = exd.pc;
|
pc = exd.pc;
|
||||||
trace_hotside(J, pc);
|
trace_hotside(J, pc);
|
||||||
if (bc_op(*pc) == BC_JLOOP) {
|
cf = cframe_raw(L->cframe);
|
||||||
|
switch (bc_op(*pc)) {
|
||||||
|
case BC_JLOOP: {
|
||||||
BCIns *retpc = &J->trace[bc_d(*pc)]->startins;
|
BCIns *retpc = &J->trace[bc_d(*pc)]->startins;
|
||||||
if (bc_isret(bc_op(*retpc))) {
|
if (bc_isret(bc_op(*retpc))) {
|
||||||
if (J->state == LJ_TRACE_RECORD) {
|
if (J->state == LJ_TRACE_RECORD) {
|
||||||
@ -703,8 +706,21 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
|
|||||||
pc = retpc;
|
pc = retpc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
setcframe_pc(cframe_raw(L->cframe), pc);
|
case BC_CALLM: case BC_CALLMT:
|
||||||
|
cframe_multres(cf) = (BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc);
|
||||||
|
break;
|
||||||
|
case BC_RETM:
|
||||||
|
cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc);
|
||||||
|
break;
|
||||||
|
case BC_TSETM:
|
||||||
|
cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
setcframe_pc(cf, pc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user