diff options
author | Mike Pall <mike> | 2010-03-28 06:47:04 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-03-28 06:47:04 +0200 |
commit | 1130ade4de66de1abc0246ba0c96a6d301d13398 (patch) | |
tree | c8a20fe013c63e2dcd869d1a756c9e4b9a57b848 /src | |
parent | 44756ded7ae7bcf66bd657f5d8084be5ba4fb43f (diff) | |
download | luajit-1130ade4de66de1abc0246ba0c96a6d301d13398.tar.gz luajit-1130ade4de66de1abc0246ba0c96a6d301d13398.tar.bz2 luajit-1130ade4de66de1abc0246ba0c96a6d301d13398.zip |
Also merge EQ(HREF, niltv) in backend.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_asm.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index ba34bff8..81b73867 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -1599,7 +1599,8 @@ static uint32_t ir_khash(IRIns *ir) | |||
1599 | static MCode *merge_href_niltv(ASMState *as, IRIns *ir) | 1599 | static MCode *merge_href_niltv(ASMState *as, IRIns *ir) |
1600 | { | 1600 | { |
1601 | /* Assumes nothing else generates NE of HREF. */ | 1601 | /* Assumes nothing else generates NE of HREF. */ |
1602 | if (ir[1].o == IR_NE && ir[1].op1 == as->curins) { | 1602 | if ((ir[1].o == IR_NE || ir[1].o == IR_EQ) && ir[1].op1 == as->curins && |
1603 | ra_hasreg(ir->r)) { | ||
1603 | if (LJ_64 && *as->mcp != XI_ARITHi) | 1604 | if (LJ_64 && *as->mcp != XI_ARITHi) |
1604 | as->mcp += 7+6; | 1605 | as->mcp += 7+6; |
1605 | else | 1606 | else |
@@ -1639,10 +1640,12 @@ static void asm_href(ASMState *as, IRIns *ir) | |||
1639 | 1640 | ||
1640 | /* Key not found in chain: jump to exit (if merged with NE) or load niltv. */ | 1641 | /* Key not found in chain: jump to exit (if merged with NE) or load niltv. */ |
1641 | l_end = emit_label(as); | 1642 | l_end = emit_label(as); |
1642 | if (nilexit) | 1643 | if (nilexit && ir[1].o == IR_NE) { |
1643 | emit_jcc(as, CC_E, nilexit); /* XI_JMP is not found by lj_asm_patchexit. */ | 1644 | emit_jcc(as, CC_E, nilexit); /* XI_JMP is not found by lj_asm_patchexit. */ |
1644 | else | 1645 | nilexit = NULL; |
1646 | } else { | ||
1645 | emit_loada(as, dest, niltvg(J2G(as->J))); | 1647 | emit_loada(as, dest, niltvg(J2G(as->J))); |
1648 | } | ||
1646 | 1649 | ||
1647 | /* Follow hash chain until the end. */ | 1650 | /* Follow hash chain until the end. */ |
1648 | l_loop = emit_sjcc_label(as, CC_NZ); | 1651 | l_loop = emit_sjcc_label(as, CC_NZ); |
@@ -1651,7 +1654,10 @@ static void asm_href(ASMState *as, IRIns *ir) | |||
1651 | l_next = emit_label(as); | 1654 | l_next = emit_label(as); |
1652 | 1655 | ||
1653 | /* Type and value comparison. */ | 1656 | /* Type and value comparison. */ |
1654 | emit_sjcc(as, CC_E, l_end); | 1657 | if (nilexit) |
1658 | emit_jcc(as, CC_E, nilexit); | ||
1659 | else | ||
1660 | emit_sjcc(as, CC_E, l_end); | ||
1655 | if (irt_isnum(kt)) { | 1661 | if (irt_isnum(kt)) { |
1656 | if (isk) { | 1662 | if (isk) { |
1657 | /* Assumes -0.0 is already canonicalized to +0.0. */ | 1663 | /* Assumes -0.0 is already canonicalized to +0.0. */ |