diff options
-rw-r--r-- | src/lj_tab.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/lj_tab.h b/src/lj_tab.h index 0ccfb9b4..76e96f13 100644 --- a/src/lj_tab.h +++ b/src/lj_tab.h | |||
@@ -17,9 +17,17 @@ | |||
17 | /* Scramble the bits of numbers and pointers. */ | 17 | /* Scramble the bits of numbers and pointers. */ |
18 | static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi) | 18 | static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi) |
19 | { | 19 | { |
20 | #if LJ_TARGET_X86ORX64 | ||
21 | /* Prefer variant that compiles well for a 2-operand CPU. */ | ||
20 | lo ^= hi; hi = lj_rol(hi, HASH_ROT1); | 22 | lo ^= hi; hi = lj_rol(hi, HASH_ROT1); |
21 | lo -= hi; hi = lj_rol(hi, HASH_ROT2); | 23 | lo -= hi; hi = lj_rol(hi, HASH_ROT2); |
22 | hi ^= lo; hi -= lj_rol(lo, HASH_ROT3); | 24 | hi ^= lo; hi -= lj_rol(lo, HASH_ROT3); |
25 | #else | ||
26 | lo ^= hi; | ||
27 | lo = lo - lj_rol(hi, HASH_ROT1); | ||
28 | hi = lo ^ lj_rol(hi, HASH_ROT1 + HASH_ROT2); | ||
29 | hi = hi - lj_rol(lo, HASH_ROT3); | ||
30 | #endif | ||
23 | return hi; | 31 | return hi; |
24 | } | 32 | } |
25 | 33 | ||