summaryrefslogtreecommitdiff
path: root/src/lj_asm_ppc.h
diff options
context:
space:
mode:
authorMike Pall <mike>2014-02-19 17:09:22 +0100
committerMike Pall <mike>2014-02-19 17:09:22 +0100
commit2bc63bb6affdb378c1698bd0f97bacb286a61a6f (patch)
treeac1b4b6b306a5fa43e67813359ef847b669f6a5d /src/lj_asm_ppc.h
parente3d5b218d3ae1f4804abdfb6caf8d383e160f5db (diff)
downloadluajit2-2bc63bb6affdb378c1698bd0f97bacb286a61a6f.tar.gz
Prevent BASE register coalescing if parent uses IR_RETF.
Diffstat (limited to 'src/lj_asm_ppc.h')
-rw-r--r--src/lj_asm_ppc.h5
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)
int32_t delta = 1+bc_a(*((const BCIns *)pc - 1));
as->topslot -= (BCReg)delta;
if ((int32_t)as->topslot < 0) as->topslot = 0;
+ irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */
emit_setgl(as, base, jit_base);
emit_addptr(as, base, -8*delta);
asm_guardcc(as, CC_NE);
@@ -1901,7 +1902,7 @@ static void asm_head_root_base(ASMState *as)
Reg r = ir->r;
if (ra_hasreg(r)) {
ra_free(as, r);
- if (rset_test(as->modset, r))
+ if (rset_test(as->modset, r) || irt_ismarked(ir->t))
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
if (r != RID_BASE)
emit_mr(as, r, RID_BASE);
@@ -1915,7 +1916,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)
Reg r = ir->r;
if (ra_hasreg(r)) {
ra_free(as, r);
- if (rset_test(as->modset, r))
+ if (rset_test(as->modset, r) || irt_ismarked(ir->t))
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
if (irp->r == r) {
rset_clear(allow, r); /* Mark same BASE register as coalesced. */