summaryrefslogtreecommitdiff
path: root/src/lj_asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r--src/lj_asm.c17
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. */
1576static uint32_t ir_khash(IRIns *ir) 1576static 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 }