diff options
Diffstat (limited to 'src/lj_asm_x86.h')
-rw-r--r-- | src/lj_asm_x86.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 98a08d97..fda911e5 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
@@ -647,6 +647,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
647 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 647 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
648 | as->topslot -= (BCReg)delta; | 648 | as->topslot -= (BCReg)delta; |
649 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 649 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
650 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
650 | emit_setgl(as, base, jit_base); | 651 | emit_setgl(as, base, jit_base); |
651 | emit_addptr(as, base, -8*delta); | 652 | emit_addptr(as, base, -8*delta); |
652 | asm_guardcc(as, CC_NE); | 653 | asm_guardcc(as, CC_NE); |
@@ -2481,7 +2482,7 @@ static void asm_head_root_base(ASMState *as) | |||
2481 | Reg r = ir->r; | 2482 | Reg r = ir->r; |
2482 | if (ra_hasreg(r)) { | 2483 | if (ra_hasreg(r)) { |
2483 | ra_free(as, r); | 2484 | ra_free(as, r); |
2484 | if (rset_test(as->modset, r)) | 2485 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
2485 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 2486 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
2486 | if (r != RID_BASE) | 2487 | if (r != RID_BASE) |
2487 | emit_rr(as, XO_MOV, r, RID_BASE); | 2488 | emit_rr(as, XO_MOV, r, RID_BASE); |
@@ -2495,7 +2496,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
2495 | Reg r = ir->r; | 2496 | Reg r = ir->r; |
2496 | if (ra_hasreg(r)) { | 2497 | if (ra_hasreg(r)) { |
2497 | ra_free(as, r); | 2498 | ra_free(as, r); |
2498 | if (rset_test(as->modset, r)) | 2499 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
2499 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 2500 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
2500 | if (irp->r == r) { | 2501 | if (irp->r == r) { |
2501 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 2502 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |