diff options
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r-- | src/lj_asm.c | 28 |
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. */ | ||
3257 | static 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. */ |
3267 | static void asm_tail_link(ASMState *as) | 3257 | static 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); |