| Index: src/ia32/macro-assembler-ia32.cc
|
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
|
| index 66bfb6569ae3978966231b6354fb5eebc945b27d..f0cacc9377110eec955692b3d1d7c5012dbb116a 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -992,6 +992,49 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| }
|
|
|
|
|
| +// 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_array_start =
|
| + ExternalReference::roots_array_start(isolate());
|
| + mov(scratch, Immediate(Heap::kStringHashSeedRootIndex));
|
| + xor_(r0, Operand::StaticArray(scratch,
|
| + times_pointer_size,
|
| + roots_array_start));
|
| + } else {
|
| + int32_t seed = isolate()->heap()->StringHashSeed();
|
| + xor_(r0, Immediate(seed));
|
| + }
|
| +
|
| + // hash = ~hash + (hash << 15);
|
| + mov(scratch, r0);
|
| + not_(r0);
|
| + shl(scratch, 15);
|
| + add(r0, scratch);
|
| + // hash = hash ^ (hash >> 12);
|
| + mov(scratch, r0);
|
| + shr(scratch, 12);
|
| + xor_(r0, 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, scratch);
|
| + // hash = hash * 2057;
|
| + imul(r0, r0, 2057);
|
| + // hash = hash ^ (hash >> 16);
|
| + mov(scratch, r0);
|
| + shr(scratch, 16);
|
| + xor_(r0, scratch);
|
| +}
|
| +
|
| +
|
| +
|
| void MacroAssembler::LoadFromNumberDictionary(Label* miss,
|
| Register elements,
|
| Register key,
|
| @@ -1017,30 +1060,7 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss,
|
|
|
| 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, r1);
|
| - // hash = hash ^ (hash >> 12);
|
| - mov(r1, r0);
|
| - shr(r1, 12);
|
| - xor_(r0, 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, r1);
|
| - // hash = hash * 2057;
|
| - imul(r0, r0, 2057);
|
| - // hash = hash ^ (hash >> 16);
|
| - mov(r1, r0);
|
| - shr(r1, 16);
|
| - xor_(r0, r1);
|
| + GetNumberHash(r0, r1);
|
|
|
| // Compute capacity mask.
|
| mov(r1, FieldOperand(elements, NumberDictionary::kCapacityOffset));
|
|
|