diff options
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r-- | src/lj_asm.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 4070ccb3..56b39e32 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -1572,7 +1572,7 @@ static void asm_aref(ASMState *as, IRIns *ir) | |||
1572 | emit_rr(as, XO_MOV, dest, as->mrm.base); | 1572 | emit_rr(as, XO_MOV, dest, as->mrm.base); |
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | /* Must match with hashkey() and hashrot() in lj_tab.c. */ | 1575 | /* Must match with hash*() in lj_tab.c. */ |
1576 | static uint32_t ir_khash(IRIns *ir) | 1576 | static uint32_t ir_khash(IRIns *ir) |
1577 | { | 1577 | { |
1578 | uint32_t lo, hi; | 1578 | uint32_t lo, hi; |
@@ -1587,12 +1587,9 @@ static uint32_t ir_khash(IRIns *ir) | |||
1587 | } else { | 1587 | } else { |
1588 | lua_assert(irt_isgcv(ir->t)); | 1588 | lua_assert(irt_isgcv(ir->t)); |
1589 | lo = u32ptr(ir_kgc(ir)); | 1589 | lo = u32ptr(ir_kgc(ir)); |
1590 | hi = lo - 0x04c11db7; | 1590 | hi = lo + HASH_BIAS; |
1591 | } | 1591 | } |
1592 | lo ^= hi; hi = lj_rol(hi, 14); | 1592 | return hashrot(lo, hi); |
1593 | lo -= hi; hi = lj_rol(hi, 5); | ||
1594 | hi ^= lo; hi -= lj_rol(lo, 27); | ||
1595 | return hi; | ||
1596 | } | 1593 | } |
1597 | 1594 | ||
1598 | /* Merge NE(HREF, niltv) check. */ | 1595 | /* Merge NE(HREF, niltv) check. */ |
@@ -1717,11 +1714,11 @@ static void asm_href(ASMState *as, IRIns *ir) | |||
1717 | } else { /* Must match with hashrot() in lj_tab.c. */ | 1714 | } else { /* Must match with hashrot() in lj_tab.c. */ |
1718 | emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask)); | 1715 | emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask)); |
1719 | emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp); | 1716 | emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp); |
1720 | emit_shifti(as, XOg_ROL, tmp, 27); | 1717 | emit_shifti(as, XOg_ROL, tmp, HASH_ROT3); |
1721 | emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp); | 1718 | emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp); |
1722 | emit_shifti(as, XOg_ROL, dest, 5); | 1719 | emit_shifti(as, XOg_ROL, dest, HASH_ROT2); |
1723 | emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest); | 1720 | emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest); |
1724 | emit_shifti(as, XOg_ROL, dest, 14); | 1721 | emit_shifti(as, XOg_ROL, dest, HASH_ROT1); |
1725 | emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest); | 1722 | emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest); |
1726 | if (irt_isnum(kt)) { | 1723 | if (irt_isnum(kt)) { |
1727 | emit_rr(as, XO_ARITH(XOg_ADD), dest, dest); | 1724 | emit_rr(as, XO_ARITH(XOg_ADD), dest, dest); |
@@ -1735,7 +1732,7 @@ static void asm_href(ASMState *as, IRIns *ir) | |||
1735 | #endif | 1732 | #endif |
1736 | } else { | 1733 | } else { |
1737 | emit_rr(as, XO_MOV, tmp, key); | 1734 | emit_rr(as, XO_MOV, tmp, key); |
1738 | emit_rmro(as, XO_LEA, dest, key, -0x04c11db7); | 1735 | emit_rmro(as, XO_LEA, dest, key, HASH_BIAS); |
1739 | } | 1736 | } |
1740 | } | 1737 | } |
1741 | } | 1738 | } |