Index: src/ia32/macro-assembler-ia32.cc |
=================================================================== |
--- src/ia32/macro-assembler-ia32.cc (revision 10379) |
+++ src/ia32/macro-assembler-ia32.cc (working copy) |
@@ -752,6 +752,49 @@ |
} |
+// Compute the hash code from the untagged key. This must be kept in sync |
+// with ComputeIntegerHash in utils.h. |
+// |
+// Note: r0 will contain hash code |
+void MacroAssembler::GetNumberHash(Register r0, Register scratch) { |
+ // Xor original key with a seed. |
+ if (Serializer::enabled()) { |
+ ExternalReference roots_address = |
+ ExternalReference::roots_address(isolate()); |
+ mov(scratch, Immediate(Heap::kHashSeedRootIndex)); |
Erik Corry
2012/01/11 10:20:35
There's a missing SmiUntag here. Probably it does
|
+ xor_(r0, Operand::StaticArray(scratch, |
+ times_pointer_size, |
Erik Corry
2012/01/11 10:20:35
Somehow the indentation got borked here.
|
+ roots_address)); |
+ } else { |
+ int32_t seed = isolate()->heap()->HashSeed(); |
+ xor_(r0, seed); |
+ } |
+ |
+ // hash = ~hash + (hash << 15); |
+ mov(scratch, r0); |
+ not_(r0); |
+ shl(scratch, 15); |
+ add(r0, Operand(scratch)); |
+ // hash = hash ^ (hash >> 12); |
+ mov(scratch, r0); |
+ shr(scratch, 12); |
+ xor_(r0, Operand(scratch)); |
+ // hash = hash + (hash << 2); |
+ lea(r0, Operand(r0, r0, times_4, 0)); |
+ // hash = hash ^ (hash >> 4); |
+ mov(scratch, r0); |
+ shr(scratch, 4); |
+ xor_(r0, Operand(scratch)); |
+ // hash = hash * 2057; |
+ imul(r0, r0, 2057); |
+ // hash = hash ^ (hash >> 16); |
+ mov(scratch, r0); |
+ shr(scratch, 16); |
+ xor_(r0, Operand(scratch)); |
+} |
+ |
+ |
+ |
void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
Register elements, |
Register key, |
@@ -777,30 +820,7 @@ |
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); |
- mov(r1, r0); |
- not_(r0); |
- shl(r1, 15); |
- add(r0, Operand(r1)); |
- // hash = hash ^ (hash >> 12); |
- mov(r1, r0); |
- shr(r1, 12); |
- xor_(r0, Operand(r1)); |
- // hash = hash + (hash << 2); |
- lea(r0, Operand(r0, r0, times_4, 0)); |
- // hash = hash ^ (hash >> 4); |
- mov(r1, r0); |
- shr(r1, 4); |
- xor_(r0, Operand(r1)); |
- // hash = hash * 2057; |
- imul(r0, r0, 2057); |
- // hash = hash ^ (hash >> 16); |
- mov(r1, r0); |
- shr(r1, 16); |
- xor_(r0, Operand(r1)); |
+ GetNumberHash(r0, r1); |
// Compute capacity mask. |
mov(r1, FieldOperand(elements, NumberDictionary::kCapacityOffset)); |