Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index d2d152389a14056906a2e0c8ba320c61a95d9628..05d67463c1a1cd22dd0926d3e98f7beb500a4d75 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -1414,6 +1414,35 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
} |
+void MacroAssembler::GetNumberHash(Register t0, Register scratch) { |
+ // First of all we assign the hash seed to scratch. |
+ LoadRoot(scratch, Heap::kStringHashSeedRootIndex); |
+ SmiUntag(scratch); |
+ |
+ // Xor original key with a seed. |
+ eor(t0, t0, Operand(scratch)); |
+ |
+ // Compute the hash code from the untagged key. This must be kept in sync |
+ // with ComputeIntegerHash in utils.h. |
+ // |
+ // hash = ~hash + (hash << 15); |
+ mvn(scratch, Operand(t0)); |
+ add(t0, scratch, Operand(t0, LSL, 15)); |
+ // hash = hash ^ (hash >> 12); |
+ eor(t0, t0, Operand(t0, LSR, 12)); |
+ // hash = hash + (hash << 2); |
+ add(t0, t0, Operand(t0, LSL, 2)); |
+ // hash = hash ^ (hash >> 4); |
+ eor(t0, t0, Operand(t0, LSR, 4)); |
+ // hash = hash * 2057; |
+ mov(scratch, Operand(t0, LSL, 11)); |
+ add(t0, t0, Operand(t0, LSL, 3)); |
+ add(t0, t0, scratch); |
+ // hash = hash ^ (hash >> 16); |
+ eor(t0, t0, Operand(t0, LSR, 16)); |
+} |
+ |
+ |
void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
Register elements, |
Register key, |
@@ -1443,24 +1472,7 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
// t2 - used for the index into the dictionary. |
Label done; |
- // Compute the hash code from the untagged key. This must be kept in sync |
- // with ComputeIntegerHash in utils.h. |
- // |
- // hash = ~hash + (hash << 15); |
- mvn(t1, Operand(t0)); |
- add(t0, t1, Operand(t0, LSL, 15)); |
- // hash = hash ^ (hash >> 12); |
- eor(t0, t0, Operand(t0, LSR, 12)); |
- // hash = hash + (hash << 2); |
- add(t0, t0, Operand(t0, LSL, 2)); |
- // hash = hash ^ (hash >> 4); |
- eor(t0, t0, Operand(t0, LSR, 4)); |
- // hash = hash * 2057; |
- mov(t1, Operand(t0, LSL, 11)); |
- add(t0, t0, Operand(t0, LSL, 3)); |
- add(t0, t0, t1); |
- // hash = hash ^ (hash >> 16); |
- eor(t0, t0, Operand(t0, LSR, 16)); |
+ GetNumberHash(t0, t1); |
// Compute the capacity mask. |
ldr(t1, FieldMemOperand(elements, NumberDictionary::kCapacityOffset)); |