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 | |
| parent | e3d5b218d3ae1f4804abdfb6caf8d383e160f5db (diff) | |
| download | luajit-2bc63bb6affdb378c1698bd0f97bacb286a61a6f.tar.gz luajit-2bc63bb6affdb378c1698bd0f97bacb286a61a6f.tar.bz2 luajit-2bc63bb6affdb378c1698bd0f97bacb286a61a6f.zip | |
Prevent BASE register coalescing if parent uses IR_RETF.
| -rw-r--r-- | src/lj_asm_arm.h | 7 | ||||
| -rw-r--r-- | src/lj_asm_mips.h | 5 | ||||
| -rw-r--r-- | src/lj_asm_ppc.h | 5 | ||||
| -rw-r--r-- | src/lj_asm_x86.h | 5 |
4 files changed, 14 insertions, 8 deletions
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 0ab3a567..72f205d9 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
| @@ -493,6 +493,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
| 493 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 493 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
| 494 | as->topslot -= (BCReg)delta; | 494 | as->topslot -= (BCReg)delta; |
| 495 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 495 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
| 496 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
| 496 | /* Need to force a spill on REF_BASE now to update the stack slot. */ | 497 | /* Need to force a spill on REF_BASE now to update the stack slot. */ |
| 497 | emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); | 498 | emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); |
| 498 | emit_setgl(as, base, jit_base); | 499 | emit_setgl(as, base, jit_base); |
| @@ -2102,7 +2103,8 @@ static void asm_head_root_base(ASMState *as) | |||
| 2102 | IRIns *ir; | 2103 | IRIns *ir; |
| 2103 | asm_head_lreg(as); | 2104 | asm_head_lreg(as); |
| 2104 | ir = IR(REF_BASE); | 2105 | ir = IR(REF_BASE); |
| 2105 | if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); | 2106 | if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) |
| 2107 | ra_spill(as, ir); | ||
| 2106 | ra_destreg(as, ir, RID_BASE); | 2108 | ra_destreg(as, ir, RID_BASE); |
| 2107 | } | 2109 | } |
| 2108 | 2110 | ||
| @@ -2112,7 +2114,8 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
| 2112 | IRIns *ir; | 2114 | IRIns *ir; |
| 2113 | asm_head_lreg(as); | 2115 | asm_head_lreg(as); |
| 2114 | ir = IR(REF_BASE); | 2116 | ir = IR(REF_BASE); |
| 2115 | if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); | 2117 | if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) |
| 2118 | ra_spill(as, ir); | ||
| 2116 | if (ra_hasspill(irp->s)) { | 2119 | if (ra_hasspill(irp->s)) { |
| 2117 | rset_clear(allow, ra_dest(as, ir, allow)); | 2120 | rset_clear(allow, ra_dest(as, ir, allow)); |
| 2118 | } else { | 2121 | } else { |
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index f5b0bab6..e5c67b53 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h | |||
| @@ -394,6 +394,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
| 394 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 394 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
| 395 | as->topslot -= (BCReg)delta; | 395 | as->topslot -= (BCReg)delta; |
| 396 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 396 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
| 397 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
| 397 | emit_setgl(as, base, jit_base); | 398 | emit_setgl(as, base, jit_base); |
| 398 | emit_addptr(as, base, -8*delta); | 399 | emit_addptr(as, base, -8*delta); |
| 399 | asm_guard(as, MIPSI_BNE, RID_TMP, | 400 | asm_guard(as, MIPSI_BNE, RID_TMP, |
| @@ -1723,7 +1724,7 @@ static void asm_head_root_base(ASMState *as) | |||
| 1723 | if (as->loopinv) as->mctop--; | 1724 | if (as->loopinv) as->mctop--; |
| 1724 | if (ra_hasreg(r)) { | 1725 | if (ra_hasreg(r)) { |
| 1725 | ra_free(as, r); | 1726 | ra_free(as, r); |
| 1726 | if (rset_test(as->modset, r)) | 1727 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
| 1727 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1728 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
| 1728 | if (r != RID_BASE) | 1729 | if (r != RID_BASE) |
| 1729 | emit_move(as, r, RID_BASE); | 1730 | emit_move(as, r, RID_BASE); |
| @@ -1738,7 +1739,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
| 1738 | if (as->loopinv) as->mctop--; | 1739 | if (as->loopinv) as->mctop--; |
| 1739 | if (ra_hasreg(r)) { | 1740 | if (ra_hasreg(r)) { |
| 1740 | ra_free(as, r); | 1741 | ra_free(as, r); |
| 1741 | if (rset_test(as->modset, r)) | 1742 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
| 1742 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1743 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
| 1743 | if (irp->r == r) { | 1744 | if (irp->r == r) { |
| 1744 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 1745 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |
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. */ |
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. */ |
