Abstract out pointer hash to hashrot(). Tune hash constants.
This commit is contained in:
17
src/lj_asm.c
17
src/lj_asm.c
@@ -1572,7 +1572,7 @@ static void asm_aref(ASMState *as, IRIns *ir)
|
||||
emit_rr(as, XO_MOV, dest, as->mrm.base);
|
||||
}
|
||||
|
||||
/* Must match with hashkey() and hashrot() in lj_tab.c. */
|
||||
/* Must match with hash*() in lj_tab.c. */
|
||||
static uint32_t ir_khash(IRIns *ir)
|
||||
{
|
||||
uint32_t lo, hi;
|
||||
@@ -1587,12 +1587,9 @@ static uint32_t ir_khash(IRIns *ir)
|
||||
} else {
|
||||
lua_assert(irt_isgcv(ir->t));
|
||||
lo = u32ptr(ir_kgc(ir));
|
||||
hi = lo - 0x04c11db7;
|
||||
hi = lo + HASH_BIAS;
|
||||
}
|
||||
lo ^= hi; hi = lj_rol(hi, 14);
|
||||
lo -= hi; hi = lj_rol(hi, 5);
|
||||
hi ^= lo; hi -= lj_rol(lo, 27);
|
||||
return hi;
|
||||
return hashrot(lo, hi);
|
||||
}
|
||||
|
||||
/* Merge NE(HREF, niltv) check. */
|
||||
@@ -1717,11 +1714,11 @@ static void asm_href(ASMState *as, IRIns *ir)
|
||||
} else { /* Must match with hashrot() in lj_tab.c. */
|
||||
emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask));
|
||||
emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp);
|
||||
emit_shifti(as, XOg_ROL, tmp, 27);
|
||||
emit_shifti(as, XOg_ROL, tmp, HASH_ROT3);
|
||||
emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp);
|
||||
emit_shifti(as, XOg_ROL, dest, 5);
|
||||
emit_shifti(as, XOg_ROL, dest, HASH_ROT2);
|
||||
emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest);
|
||||
emit_shifti(as, XOg_ROL, dest, 14);
|
||||
emit_shifti(as, XOg_ROL, dest, HASH_ROT1);
|
||||
emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest);
|
||||
if (irt_isnum(kt)) {
|
||||
emit_rr(as, XO_ARITH(XOg_ADD), dest, dest);
|
||||
@@ -1735,7 +1732,7 @@ static void asm_href(ASMState *as, IRIns *ir)
|
||||
#endif
|
||||
} else {
|
||||
emit_rr(as, XO_MOV, tmp, key);
|
||||
emit_rmro(as, XO_LEA, dest, key, -0x04c11db7);
|
||||
emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user