aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-11-05 23:12:43 +0100
committerMike Pall <mike>2010-11-05 23:12:43 +0100
commitfe21a42a92546416cc235511c4e1949d850c0139 (patch)
tree96f1796c4640564e19e142b46942e89f5e9f76a5 /src
parent188f0b04e1bfec8d12c1845eb14217100814b737 (diff)
downloadluajit-fe21a42a92546416cc235511c4e1949d850c0139.tar.gz
luajit-fe21a42a92546416cc235511c4e1949d850c0139.tar.bz2
luajit-fe21a42a92546416cc235511c4e1949d850c0139.zip
Fix conflict between loop branch inversion and HREF+NE/EQ merging.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index d2ba4bfc..322799e6 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -1614,11 +1614,13 @@ static MCode *merge_href_niltv(ASMState *as, IRIns *ir)
1614 /* Assumes nothing else generates NE of HREF. */ 1614 /* Assumes nothing else generates NE of HREF. */
1615 if ((ir[1].o == IR_NE || ir[1].o == IR_EQ) && ir[1].op1 == as->curins && 1615 if ((ir[1].o == IR_NE || ir[1].o == IR_EQ) && ir[1].op1 == as->curins &&
1616 ra_hasreg(ir->r)) { 1616 ra_hasreg(ir->r)) {
1617 if (LJ_64 && *as->mcp != XI_ARITHi) 1617 MCode *p = as->mcp;
1618 as->mcp += 7+6; 1618 p += (LJ_64 && *p != XI_ARITHi) ? 7+6 : 6+6;
1619 else 1619 /* Ensure no loop branch inversion happened. */
1620 as->mcp += 6+6; /* Kill cmp reg, imm32 + jz exit. */ 1620 if (p[-6] == 0x0f && p[-5] == XI_JCCn+(CC_NE^(ir[1].o & 1))) {
1621 return as->mcp + *(int32_t *)(as->mcp-4); /* Return exit address. */ 1621 as->mcp = p; /* Kill cmp reg, imm32 + jz exit. */
1622 return p + *(int32_t *)(p-4); /* Return exit address. */
1623 }
1622 } 1624 }
1623 return NULL; 1625 return NULL;
1624} 1626}