From 3646df7d6df88b482c42b1073daa6e85b5221700 Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Fri, 10 Aug 2012 12:28:12 +0000 Subject: [PATCH] MIPS: Improve load IC so it can call a native accessor even if the holder is in dictionary mode. Add a flag to all maps to indicate whether they are used for dictionary (normalized) objects or fast mode objects. This is a commit of https://chromiumcodereview.appspot.com/10826213/ for palfia. This is a port of r12264, https://chromiumcodereview.appspot.com/10831153 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12290 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/stub-cache-mips.cc | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index cf6ba81591..19eb44e319 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -1234,6 +1234,43 @@ void StubCompiler::GenerateLoadConstant(Handle object, } +void StubCompiler::GenerateDictionaryLoadCallback(Register receiver, + Register name_reg, + Register scratch1, + Register scratch2, + Register scratch3, + Handle callback, + Handle name, + Label* miss) { + Register dictionary = scratch1; + Register index = scratch2; + __ lw(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); + + // Probe the dictionary. + Label probe_done; + StringDictionaryLookupStub::GeneratePositiveLookup(masm(), + miss, + &probe_done, + dictionary, + name_reg, + index, // Set if we hit. + scratch3); + __ bind(&probe_done); + + // If probing finds an entry in the dictionary, check that the value is the + // callback. + 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)); +} + + void StubCompiler::GenerateLoadCallback(Handle object, Handle holder, Register receiver, @@ -1251,6 +1288,11 @@ void StubCompiler::GenerateLoadCallback(Handle object, Register reg = CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name, miss); + if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { + GenerateDictionaryLoadCallback( + receiver, name_reg, scratch1, scratch2, scratch3, callback, name, miss); + } + // Build AccessorInfo::args_ list on the stack and push property name below // the exit frame to make GC aware of them and store pointers to them. __ push(receiver);