diff options
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r-- | src/lj_asm.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index cd1c0dbd..c749ada0 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -3253,6 +3253,16 @@ 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 | |||
3256 | /* Link to another trace. */ | 3266 | /* Link to another trace. */ |
3257 | static void asm_tail_link(ASMState *as) | 3267 | static void asm_tail_link(ASMState *as) |
3258 | { | 3268 | { |
@@ -3273,6 +3283,19 @@ static void asm_tail_link(ASMState *as) | |||
3273 | } | 3283 | } |
3274 | emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch); | 3284 | emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch); |
3275 | emit_loada(as, RID_PC, pc); | 3285 | emit_loada(as, RID_PC, pc); |
3286 | switch (bc_op(*pc)) { | ||
3287 | case BC_CALLM: case BC_CALLMT: | ||
3288 | asm_tail_multres(as, snap->nslots - baseslot - 1 - bc_a(*pc) - bc_c(*pc)); | ||
3289 | break; | ||
3290 | case BC_RETM: | ||
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 | } | ||
3276 | } else if (baseslot) { | 3299 | } else if (baseslot) { |
3277 | /* Save modified BASE for linking to trace with higher start frame. */ | 3300 | /* Save modified BASE for linking to trace with higher start frame. */ |
3278 | emit_setgl(as, RID_BASE, jit_base); | 3301 | emit_setgl(as, RID_BASE, jit_base); |