diff options
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r-- | src/lj_asm.c | 11 |
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) { |