| Index: src/mips/macro-assembler-mips.cc
|
| ===================================================================
|
| --- src/mips/macro-assembler-mips.cc (revision 10379)
|
| +++ src/mips/macro-assembler-mips.cc (working copy)
|
| @@ -343,6 +343,44 @@
|
| }
|
|
|
|
|
| +void MacroAssembler::GetNumberHash(Register reg0, Register scratch) {
|
| + // First of all we assign the hash seed to scratch.
|
| + LoadRoot(scratch, Heap::kHashSeedRootIndex);
|
| + SmiUntag(scratch);
|
| +
|
| + // Xor original key with a seed.
|
| + xor_(reg0, reg0, scratch);
|
| +
|
| + // Compute the hash code from the untagged key. This must be kept in sync
|
| + // with ComputeIntegerHash in utils.h.
|
| + //
|
| + // hash = ~hash + (hash << 15);
|
| + nor(scratch, reg0, zero_reg);
|
| + sll(at, reg0, 15);
|
| + addu(reg0, scratch, at);
|
| +
|
| + // hash = hash ^ (hash >> 12);
|
| + srl(at, reg0, 12);
|
| + xor_(reg0, reg0, at);
|
| +
|
| + // hash = hash + (hash << 2);
|
| + sll(at, reg0, 2);
|
| + addu(reg0, reg0, at);
|
| +
|
| + // hash = hash ^ (hash >> 4);
|
| + srl(at, reg0, 4);
|
| + xor_(reg0, reg0, at);
|
| +
|
| + // hash = hash * 2057;
|
| + li(scratch, Operand(2057));
|
| + mul(reg0, reg0, scratch);
|
| +
|
| + // hash = hash ^ (hash >> 16);
|
| + srl(at, reg0, 16);
|
| + xor_(reg0, reg0, at);
|
| +}
|
| +
|
| +
|
| void MacroAssembler::LoadFromNumberDictionary(Label* miss,
|
| Register elements,
|
| Register key,
|
| @@ -374,36 +412,10 @@
|
| // at - Temporary (avoid MacroAssembler instructions also using 'at').
|
| 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);
|
| - nor(reg1, reg0, zero_reg);
|
| - sll(at, reg0, 15);
|
| - addu(reg0, reg1, at);
|
| + GetNumberHash(reg0, reg1);
|
|
|
| - // hash = hash ^ (hash >> 12);
|
| - srl(at, reg0, 12);
|
| - xor_(reg0, reg0, at);
|
| -
|
| - // hash = hash + (hash << 2);
|
| - sll(at, reg0, 2);
|
| - addu(reg0, reg0, at);
|
| -
|
| - // hash = hash ^ (hash >> 4);
|
| - srl(at, reg0, 4);
|
| - xor_(reg0, reg0, at);
|
| -
|
| - // hash = hash * 2057;
|
| - li(reg1, Operand(2057));
|
| - mul(reg0, reg0, reg1);
|
| -
|
| - // hash = hash ^ (hash >> 16);
|
| - srl(at, reg0, 16);
|
| - xor_(reg0, reg0, at);
|
| -
|
| // Compute the capacity mask.
|
| - lw(reg1, FieldMemOperand(elements, NumberDictionary::kCapacityOffset));
|
| + lw(reg1, FieldMemOperand(elements, SeededNumberDictionary::kCapacityOffset));
|
| sra(reg1, reg1, kSmiTagSize);
|
| Subu(reg1, reg1, Operand(1));
|
|
|
| @@ -414,12 +426,12 @@
|
| mov(reg2, reg0);
|
| // Compute the masked index: (hash + i + i * i) & mask.
|
| if (i > 0) {
|
| - Addu(reg2, reg2, Operand(NumberDictionary::GetProbeOffset(i)));
|
| + Addu(reg2, reg2, Operand(SeededNumberDictionary::GetProbeOffset(i)));
|
| }
|
| and_(reg2, reg2, reg1);
|
|
|
| // Scale the index by multiplying by the element size.
|
| - ASSERT(NumberDictionary::kEntrySize == 3);
|
| + ASSERT(SeededNumberDictionary::kEntrySize == 3);
|
| sll(at, reg2, 1); // 2x.
|
| addu(reg2, reg2, at); // reg2 = reg2 * 3.
|
|
|
| @@ -427,7 +439,7 @@
|
| sll(at, reg2, kPointerSizeLog2);
|
| addu(reg2, elements, at);
|
|
|
| - lw(at, FieldMemOperand(reg2, NumberDictionary::kElementsStartOffset));
|
| + lw(at, FieldMemOperand(reg2, SeededNumberDictionary::kElementsStartOffset));
|
| if (i != kProbes - 1) {
|
| Branch(&done, eq, key, Operand(at));
|
| } else {
|
| @@ -439,14 +451,14 @@
|
| // Check that the value is a normal property.
|
| // reg2: elements + (index * kPointerSize).
|
| const int kDetailsOffset =
|
| - NumberDictionary::kElementsStartOffset + 2 * kPointerSize;
|
| + SeededNumberDictionary::kElementsStartOffset + 2 * kPointerSize;
|
| lw(reg1, FieldMemOperand(reg2, kDetailsOffset));
|
| And(at, reg1, Operand(Smi::FromInt(PropertyDetails::TypeField::kMask)));
|
| Branch(miss, ne, at, Operand(zero_reg));
|
|
|
| // Get the value at the masked, scaled index and return.
|
| const int kValueOffset =
|
| - NumberDictionary::kElementsStartOffset + kPointerSize;
|
| + SeededNumberDictionary::kElementsStartOffset + kPointerSize;
|
| lw(result, FieldMemOperand(reg2, kValueOffset));
|
| }
|
|
|
|
|