diff options
Diffstat (limited to 'src/lj_asm_ppc.h')
-rw-r--r-- | src/lj_asm_ppc.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index 57fd2513..e1a496a7 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h | |||
@@ -381,6 +381,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
381 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 381 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
382 | as->topslot -= (BCReg)delta; | 382 | as->topslot -= (BCReg)delta; |
383 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 383 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
384 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
384 | emit_setgl(as, base, jit_base); | 385 | emit_setgl(as, base, jit_base); |
385 | emit_addptr(as, base, -8*delta); | 386 | emit_addptr(as, base, -8*delta); |
386 | asm_guardcc(as, CC_NE); | 387 | asm_guardcc(as, CC_NE); |
@@ -1901,7 +1902,7 @@ static void asm_head_root_base(ASMState *as) | |||
1901 | Reg r = ir->r; | 1902 | Reg r = ir->r; |
1902 | if (ra_hasreg(r)) { | 1903 | if (ra_hasreg(r)) { |
1903 | ra_free(as, r); | 1904 | ra_free(as, r); |
1904 | if (rset_test(as->modset, r)) | 1905 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1905 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1906 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1906 | if (r != RID_BASE) | 1907 | if (r != RID_BASE) |
1907 | emit_mr(as, r, RID_BASE); | 1908 | emit_mr(as, r, RID_BASE); |
@@ -1915,7 +1916,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
1915 | Reg r = ir->r; | 1916 | Reg r = ir->r; |
1916 | if (ra_hasreg(r)) { | 1917 | if (ra_hasreg(r)) { |
1917 | ra_free(as, r); | 1918 | ra_free(as, r); |
1918 | if (rset_test(as->modset, r)) | 1919 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1919 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1920 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1920 | if (irp->r == r) { | 1921 | if (irp->r == r) { |
1921 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 1922 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |