Index: src/mips/macro-assembler-mips.cc |
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
index cdacbf3c0d86cb588e0bfafbfd8392f017f447f4..2a566f2c3ff7a7e147c197e7757445d7e498bf53 100644 |
--- a/src/mips/macro-assembler-mips.cc |
+++ b/src/mips/macro-assembler-mips.cc |
@@ -409,6 +409,44 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
} |
+void MacroAssembler::GetNumberHash(Register reg0, Register scratch) { |
+ // First of all we assign the hash seed to scratch. |
+ LoadRoot(scratch, Heap::kStringHashSeedRootIndex); |
+ SmiUntag(scratch); |
+ |
+ // Xor original key with a seed. |
+ xor_(reg0, reg0, scratch); |
+ |
+ // Compute the hash code from the untagged key. This must be kept in sync |
+ // with ComputeIntegerHash in utils.h. |
+ // |
+ // hash = ~hash + (hash << 15); |
+ nor(scratch, reg0, zero_reg); |
+ sll(at, reg0, 15); |
+ addu(reg0, scratch, at); |
+ |
+ // hash = hash ^ (hash >> 12); |
+ srl(at, reg0, 12); |
+ xor_(reg0, reg0, at); |
+ |
+ // hash = hash + (hash << 2); |
+ sll(at, reg0, 2); |
+ addu(reg0, reg0, at); |
+ |
+ // hash = hash ^ (hash >> 4); |
+ srl(at, reg0, 4); |
+ xor_(reg0, reg0, at); |
+ |
+ // hash = hash * 2057; |
+ li(scratch, Operand(2057)); |
+ mul(reg0, reg0, scratch); |
+ |
+ // hash = hash ^ (hash >> 16); |
+ srl(at, reg0, 16); |
+ xor_(reg0, reg0, at); |
+} |
+ |
+ |
void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
Register elements, |
Register key, |
@@ -440,33 +478,7 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
// at - Temporary (avoid MacroAssembler instructions also using 'at'). |
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); |
- nor(reg1, reg0, zero_reg); |
- sll(at, reg0, 15); |
- addu(reg0, reg1, at); |
- |
- // hash = hash ^ (hash >> 12); |
- srl(at, reg0, 12); |
- xor_(reg0, reg0, at); |
- |
- // hash = hash + (hash << 2); |
- sll(at, reg0, 2); |
- addu(reg0, reg0, at); |
- |
- // hash = hash ^ (hash >> 4); |
- srl(at, reg0, 4); |
- xor_(reg0, reg0, at); |
- |
- // hash = hash * 2057; |
- li(reg1, Operand(2057)); |
- mul(reg0, reg0, reg1); |
- |
- // hash = hash ^ (hash >> 16); |
- srl(at, reg0, 16); |
- xor_(reg0, reg0, at); |
+ GetNumberHash(reg0, reg1); |
// Compute the capacity mask. |
lw(reg1, FieldMemOperand(elements, NumberDictionary::kCapacityOffset)); |