| Index: src/mips/stub-cache-mips.cc
|
| diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
|
| index 19eb44e31900c941b84f56dfbe7c7d0aeb5e81f9..2c24da5eeb64929aa2502c3b1f181cffc53b7399 100644
|
| --- a/src/mips/stub-cache-mips.cc
|
| +++ b/src/mips/stub-cache-mips.cc
|
| @@ -1242,8 +1242,12 @@ void StubCompiler::GenerateDictionaryLoadCallback(Register receiver,
|
| Handle<AccessorInfo> callback,
|
| Handle<String> name,
|
| Label* miss) {
|
| + ASSERT(!receiver.is(scratch1));
|
| + ASSERT(!receiver.is(scratch2));
|
| + ASSERT(!receiver.is(scratch3));
|
| +
|
| + // Load the properties dictionary.
|
| Register dictionary = scratch1;
|
| - Register index = scratch2;
|
| __ lw(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset));
|
|
|
| // Probe the dictionary.
|
| @@ -1253,21 +1257,18 @@ void StubCompiler::GenerateDictionaryLoadCallback(Register receiver,
|
| &probe_done,
|
| dictionary,
|
| name_reg,
|
| - index, // Set if we hit.
|
| + scratch2,
|
| scratch3);
|
| __ bind(&probe_done);
|
|
|
| - // If probing finds an entry in the dictionary, check that the value is the
|
| - // callback.
|
| - const int kElementsStartOffset =
|
| - StringDictionary::kHeaderSize +
|
| + // If probing finds an entry in the dictionary, scratch3 contains the
|
| + // pointer into the dictionary. Check that the value is the callback.
|
| + Register pointer = scratch3;
|
| + const int kElementsStartOffset = StringDictionary::kHeaderSize +
|
| StringDictionary::kElementsStartIndex * kPointerSize;
|
| const int kValueOffset = kElementsStartOffset + kPointerSize;
|
| - __ Addu(scratch1, dictionary, Operand(kValueOffset - kHeapObjectTag));
|
| - __ sll(scratch3, index, kPointerSizeLog2);
|
| - __ addu(scratch1, scratch1, scratch3);
|
| - __ lw(scratch3, MemOperand(scratch1));
|
| - __ Branch(miss, ne, scratch3, Operand(callback));
|
| + __ lw(scratch2, FieldMemOperand(pointer, kValueOffset));
|
| + __ Branch(miss, ne, scratch2, Operand(callback));
|
| }
|
|
|
|
|
| @@ -1278,6 +1279,7 @@ void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
|
| Register scratch1,
|
| Register scratch2,
|
| Register scratch3,
|
| + Register scratch4,
|
| Handle<AccessorInfo> callback,
|
| Handle<String> name,
|
| Label* miss) {
|
| @@ -1290,7 +1292,7 @@ void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
|
|
|
| if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
|
| GenerateDictionaryLoadCallback(
|
| - receiver, name_reg, scratch1, scratch2, scratch3, callback, name, miss);
|
| + reg, name_reg, scratch2, scratch3, scratch4, callback, name, miss);
|
| }
|
|
|
| // Build AccessorInfo::args_ list on the stack and push property name below
|
| @@ -2920,7 +2922,7 @@ Handle<Code> LoadStubCompiler::CompileLoadCallback(
|
| // -- ra : return address
|
| // -----------------------------------
|
| Label miss;
|
| - GenerateLoadCallback(object, holder, a0, a2, a3, a1, t0, callback, name,
|
| + GenerateLoadCallback(object, holder, a0, a2, a3, a1, t0, t1, callback, name,
|
| &miss);
|
| __ bind(&miss);
|
| GenerateLoadMiss(masm(), Code::LOAD_IC);
|
| @@ -3089,8 +3091,8 @@ Handle<Code> KeyedLoadStubCompiler::CompileLoadCallback(
|
| // Check the key is the cached one.
|
| __ Branch(&miss, ne, a0, Operand(name));
|
|
|
| - GenerateLoadCallback(receiver, holder, a1, a0, a2, a3, t0, callback, name,
|
| - &miss);
|
| + GenerateLoadCallback(receiver, holder, a1, a0, a2, a3, t0, t1, callback,
|
| + name, &miss);
|
| __ bind(&miss);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
|
|