| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 3aa78e9bee8b56da0b58cb9cff1baa7e193be211..bae010754a8ba591a71ac9db4ec5b2f751f2a0f9 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -3419,6 +3419,42 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| }
|
|
|
|
|
| +void MacroAssembler::GetNumberHash(Register r0, Register scratch) {
|
| + // First of all we assign the hash seed to scratch.
|
| + LoadRoot(scratch, Heap::kStringHashSeedRootIndex);
|
| + SmiToInteger32(scratch, scratch);
|
| +
|
| + // Xor original key with a seed.
|
| + xorl(r0, scratch);
|
| +
|
| + // Compute the hash code from the untagged key. This must be kept in sync
|
| + // with ComputeIntegerHash in utils.h.
|
| + //
|
| + // hash = ~hash + (hash << 15);
|
| + movl(scratch, r0);
|
| + notl(r0);
|
| + shll(scratch, Immediate(15));
|
| + addl(r0, scratch);
|
| + // hash = hash ^ (hash >> 12);
|
| + movl(scratch, r0);
|
| + shrl(scratch, Immediate(12));
|
| + xorl(r0, scratch);
|
| + // hash = hash + (hash << 2);
|
| + leal(r0, Operand(r0, r0, times_4, 0));
|
| + // hash = hash ^ (hash >> 4);
|
| + movl(scratch, r0);
|
| + shrl(scratch, Immediate(4));
|
| + xorl(r0, scratch);
|
| + // hash = hash * 2057;
|
| + imull(r0, r0, Immediate(2057));
|
| + // hash = hash ^ (hash >> 16);
|
| + movl(scratch, r0);
|
| + shrl(scratch, Immediate(16));
|
| + xorl(r0, scratch);
|
| +}
|
| +
|
| +
|
| +
|
| void MacroAssembler::LoadFromNumberDictionary(Label* miss,
|
| Register elements,
|
| Register key,
|
| @@ -3449,30 +3485,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);
|
| - movl(r1, r0);
|
| - notl(r0);
|
| - shll(r1, Immediate(15));
|
| - addl(r0, r1);
|
| - // hash = hash ^ (hash >> 12);
|
| - movl(r1, r0);
|
| - shrl(r1, Immediate(12));
|
| - xorl(r0, r1);
|
| - // hash = hash + (hash << 2);
|
| - leal(r0, Operand(r0, r0, times_4, 0));
|
| - // hash = hash ^ (hash >> 4);
|
| - movl(r1, r0);
|
| - shrl(r1, Immediate(4));
|
| - xorl(r0, r1);
|
| - // hash = hash * 2057;
|
| - imull(r0, r0, Immediate(2057));
|
| - // hash = hash ^ (hash >> 16);
|
| - movl(r1, r0);
|
| - shrl(r1, Immediate(16));
|
| - xorl(r0, r1);
|
| + GetNumberHash(r0, r1);
|
|
|
| // Compute capacity mask.
|
| SmiToInteger32(r1,
|
|
|