diff options
| author | Mike Pall <mike> | 2010-11-05 23:12:43 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-11-05 23:12:43 +0100 |
| commit | fe21a42a92546416cc235511c4e1949d850c0139 (patch) | |
| tree | 96f1796c4640564e19e142b46942e89f5e9f76a5 /src | |
| parent | 188f0b04e1bfec8d12c1845eb14217100814b737 (diff) | |
| download | luajit-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.c | 12 |
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 | } |
