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.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index 81b73867..75a0cd53 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -3280,12 +3280,13 @@ static void asm_tail_link(ASMState *as)
3280 } 3280 }
3281 emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch); 3281 emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch);
3282 emit_loada(as, RID_PC, pc); 3282 emit_loada(as, RID_PC, pc);
3283 mres = (int32_t)(snap->nslots - baseslot - bc_a(*pc)); 3283 mres = (int32_t)(snap->nslots - baseslot);
3284 switch (bc_op(*pc)) { 3284 switch (bc_op(*pc)) {
3285 case BC_CALLM: case BC_CALLMT: mres -= (int32_t)(1 + bc_c(*pc)); break; 3285 case BC_CALLM: case BC_CALLMT:
3286 case BC_RETM: mres -= (int32_t)bc_d(*pc); break; 3286 mres -= (int32_t)(1 + bc_a(*pc) + bc_c(*pc)); break;
3287 case BC_TSETM: break; 3287 case BC_RETM: mres -= (int32_t)(bc_a(*pc) + bc_d(*pc)); break;
3288 default: mres = 0; break; 3288 case BC_TSETM: mres -= (int32_t)bc_a(*pc); break;
3289 default: if (bc_op(*pc) < BC_FUNCF) mres = 0; break;
3289 } 3290 }
3290 emit_loadi(as, RID_RET, mres); /* Return MULTRES or 0. */ 3291 emit_loadi(as, RID_RET, mres); /* Return MULTRES or 0. */
3291 } else if (baseslot) { 3292 } else if (baseslot) {