Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
| index 470e32207824c2dcd631dffe4d44f4f84364c29f..719bca45fe531e015a20d7a76c6f1c47b1c80875 100644 |
| --- a/src/arm/macro-assembler-arm.cc |
| +++ b/src/arm/macro-assembler-arm.cc |
| @@ -1414,6 +1414,34 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
| } |
| +void MacroAssembler::GetNumberHash(Register t0, Register scratch) { |
| + // First of all we assign the hash seed to scratch. |
| + LoadRoot(scratch, Heap::kStringHashSeedRootIndex); |
| + mov(scratch, Operand(scratch, LSR, kSmiTagSize)); |
|
Erik Corry
2012/01/10 11:53:16
Use SmiUntag(scratch)
|
| + |
| + // Xor original key with a seed |
|
Erik Corry
2012/01/10 11:53:16
seed -> seed.
|
| + eor(t0, t0, Operand(scratch)); |
| + |
| + // Compute the hash code from the untagged key. This must be kept in sync |
| + // with ComputeIntegerHash in utils.h. |
| + // |
| + // hash = ~hash + (hash << 15); |
| + mvn(scratch, Operand(t0)); |
| + add(t0, scratch, Operand(t0, LSL, 15)); |
| + // hash = hash ^ (hash >> 12); |
| + eor(t0, t0, Operand(t0, LSR, 12)); |
| + // hash = hash + (hash << 2); |
| + add(t0, t0, Operand(t0, LSL, 2)); |
| + // hash = hash ^ (hash >> 4); |
| + eor(t0, t0, Operand(t0, LSR, 4)); |
| + // hash = hash * 2057; |
| + mov(scratch, Operand(2057)); |
|
Erik Corry
2012/01/10 11:53:16
This should be done with shifts and adds. See the
|
| + mul(t0, t0, scratch); |
| + // hash = hash ^ (hash >> 16); |
| + eor(t0, t0, Operand(t0, LSR, 16)); |
| +} |
| + |
| + |
| void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
| Register elements, |
| Register key, |
| @@ -1443,23 +1471,7 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
| // t2 - used for the index into the dictionary. |
| 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); |
| - mvn(t1, Operand(t0)); |
| - add(t0, t1, Operand(t0, LSL, 15)); |
| - // hash = hash ^ (hash >> 12); |
| - eor(t0, t0, Operand(t0, LSR, 12)); |
| - // hash = hash + (hash << 2); |
| - add(t0, t0, Operand(t0, LSL, 2)); |
| - // hash = hash ^ (hash >> 4); |
| - eor(t0, t0, Operand(t0, LSR, 4)); |
| - // hash = hash * 2057; |
| - mov(t1, Operand(2057)); |
| - mul(t0, t0, t1); |
| - // hash = hash ^ (hash >> 16); |
| - eor(t0, t0, Operand(t0, LSR, 16)); |
| + GetNumberHash(t0, t1); |
| // Compute the capacity mask. |
| ldr(t1, FieldMemOperand(elements, NumberDictionary::kCapacityOffset)); |