Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| =================================================================== |
| --- src/arm/macro-assembler-arm.cc (revision 10379) |
| +++ src/arm/macro-assembler-arm.cc (working copy) |
| @@ -1337,6 +1337,34 @@ |
| } |
| +void MacroAssembler::GetNumberHash(Register t0, Register scratch) { |
| + // First of all we assign the hash seed to scratch. |
| + LoadRoot(scratch, Heap::kHashSeedRootIndex); |
| + SmiUntag(scratch); |
| + |
| + // Xor original key with a 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)); |
| + mul(t0, t0, scratch); |
|
Erik Corry
2012/01/19 15:35:00
This looks like a missing merge, but no big deal.
|
| + // hash = hash ^ (hash >> 16); |
| + eor(t0, t0, Operand(t0, LSR, 16)); |
| +} |
| + |
| + |
| void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
| Register elements, |
| Register key, |
| @@ -1366,26 +1394,10 @@ |
| // 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)); |
| + ldr(t1, FieldMemOperand(elements, SeededNumberDictionary::kCapacityOffset)); |
| mov(t1, Operand(t1, ASR, kSmiTagSize)); // convert smi to int |
| sub(t1, t1, Operand(1)); |
| @@ -1396,17 +1408,17 @@ |
| mov(t2, t0); |
| // Compute the masked index: (hash + i + i * i) & mask. |
| if (i > 0) { |
| - add(t2, t2, Operand(NumberDictionary::GetProbeOffset(i))); |
| + add(t2, t2, Operand(SeededNumberDictionary::GetProbeOffset(i))); |
| } |
| and_(t2, t2, Operand(t1)); |
| // Scale the index by multiplying by the element size. |
| - ASSERT(NumberDictionary::kEntrySize == 3); |
| + ASSERT(SeededNumberDictionary::kEntrySize == 3); |
| add(t2, t2, Operand(t2, LSL, 1)); // t2 = t2 * 3 |
| // Check if the key is identical to the name. |
| add(t2, elements, Operand(t2, LSL, kPointerSizeLog2)); |
| - ldr(ip, FieldMemOperand(t2, NumberDictionary::kElementsStartOffset)); |
| + ldr(ip, FieldMemOperand(t2, SeededNumberDictionary::kElementsStartOffset)); |
| cmp(key, Operand(ip)); |
| if (i != kProbes - 1) { |
| b(eq, &done); |
| @@ -1419,14 +1431,14 @@ |
| // Check that the value is a normal property. |
| // t2: elements + (index * kPointerSize) |
| const int kDetailsOffset = |
| - NumberDictionary::kElementsStartOffset + 2 * kPointerSize; |
| + SeededNumberDictionary::kElementsStartOffset + 2 * kPointerSize; |
| ldr(t1, FieldMemOperand(t2, kDetailsOffset)); |
| tst(t1, Operand(Smi::FromInt(PropertyDetails::TypeField::kMask))); |
| b(ne, miss); |
| // Get the value at the masked, scaled index and return. |
| const int kValueOffset = |
| - NumberDictionary::kElementsStartOffset + kPointerSize; |
| + SeededNumberDictionary::kElementsStartOffset + kPointerSize; |
| ldr(result, FieldMemOperand(t2, kValueOffset)); |
| } |