diff options
author | Mike Pall <mike> | 2014-02-19 17:09:22 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2014-02-19 17:09:22 +0100 |
commit | 2bc63bb6affdb378c1698bd0f97bacb286a61a6f (patch) | |
tree | ac1b4b6b306a5fa43e67813359ef847b669f6a5d /src/lj_asm_ppc.h | |
parent | e3d5b218d3ae1f4804abdfb6caf8d383e160f5db (diff) | |
download | luajit2-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.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) 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. */ |