summaryrefslogtreecommitdiff
path: root/src/lj_asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r--src/lj_asm.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index e2fddbe9..382f2aa0 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -3253,16 +3253,6 @@ static void asm_head_side(ASMState *as)
3253 3253
3254/* -- Tail of trace ------------------------------------------------------- */ 3254/* -- Tail of trace ------------------------------------------------------- */
3255 3255
3256/* Set MULTRES in C frame. */
3257static void asm_tail_multres(ASMState *as, BCReg mres)
3258{
3259 /* We don't know spadj yet, so get the C frame from L->cframe. */
3260 emit_movmroi(as, RID_RET, CFRAME_OFS_MULTRES, mres);
3261 emit_gri(as, XG_ARITHi(XOg_AND), RID_RET|REX_64, CFRAME_RAWMASK);
3262 emit_rmro(as, XO_MOV, RID_RET|REX_64, RID_RET, offsetof(lua_State, cframe));
3263 emit_getgl(as, RID_RET, jit_L);
3264}
3265
3266/* Link to another trace. */ 3256/* Link to another trace. */
3267static void asm_tail_link(ASMState *as) 3257static void asm_tail_link(ASMState *as)
3268{ 3258{
@@ -3276,6 +3266,7 @@ static void asm_tail_link(ASMState *as)
3276 if (as->T->link == TRACE_INTERP) { 3266 if (as->T->link == TRACE_INTERP) {
3277 /* Setup fixed registers for exit to interpreter. */ 3267 /* Setup fixed registers for exit to interpreter. */
3278 const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]); 3268 const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]);
3269 int32_t mres;
3279 if (bc_op(*pc) == BC_JLOOP) { /* NYI: find a better way to do this. */ 3270 if (bc_op(*pc) == BC_JLOOP) { /* NYI: find a better way to do this. */
3280 BCIns *retpc = &as->J->trace[bc_d(*pc)]->startins; 3271 BCIns *retpc = &as->J->trace[bc_d(*pc)]->startins;
3281 if (bc_isret(bc_op(*retpc))) 3272 if (bc_isret(bc_op(*retpc)))
@@ -3283,19 +3274,14 @@ static void asm_tail_link(ASMState *as)
3283 } 3274 }
3284 emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch); 3275 emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch);
3285 emit_loada(as, RID_PC, pc); 3276 emit_loada(as, RID_PC, pc);
3277 mres = (int32_t)(snap->nslots - baseslot - bc_a(*pc));
3286 switch (bc_op(*pc)) { 3278 switch (bc_op(*pc)) {
3287 case BC_CALLM: case BC_CALLMT: 3279 case BC_CALLM: case BC_CALLMT: mres -= (int32_t)(1 + bc_c(*pc)); break;
3288 asm_tail_multres(as, snap->nslots - baseslot - 1 - bc_a(*pc) - bc_c(*pc)); 3280 case BC_RETM: mres -= (int32_t)bc_d(*pc); break;
3289 break; 3281 case BC_TSETM: break;
3290 case BC_RETM: 3282 default: mres = 0; break;
3291 asm_tail_multres(as, snap->nslots - baseslot - bc_a(*pc) - bc_d(*pc));
3292 break;
3293 case BC_TSETM:
3294 asm_tail_multres(as, snap->nslots - baseslot - bc_a(*pc));
3295 break;
3296 default:
3297 break;
3298 } 3283 }
3284 emit_loadi(as, RID_RET, mres); /* Return MULTRES or 0. */
3299 } else if (baseslot) { 3285 } else if (baseslot) {
3300 /* Save modified BASE for linking to trace with higher start frame. */ 3286 /* Save modified BASE for linking to trace with higher start frame. */
3301 emit_setgl(as, RID_BASE, jit_base); 3287 emit_setgl(as, RID_BASE, jit_base);