Chromium Code Reviews| 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)); |