diff options
Diffstat (limited to 'deps/v8/src/ic/mips/ic-mips.cc')
-rw-r--r-- | deps/v8/src/ic/mips/ic-mips.cc | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/deps/v8/src/ic/mips/ic-mips.cc b/deps/v8/src/ic/mips/ic-mips.cc index 5a6f95a231..a673dbf254 100644 --- a/deps/v8/src/ic/mips/ic-mips.cc +++ b/deps/v8/src/ic/mips/ic-mips.cc @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - -#include "src/v8.h" - #if V8_TARGET_ARCH_MIPS #include "src/codegen.h" @@ -320,9 +317,8 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { LoadIC_PushArgs(masm); // Perform tail call to the entry. - ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); int arg_count = 4; - __ TailCallExternalReference(ref, arg_count, 1); + __ TailCallRuntime(Runtime::kLoadIC_Miss, arg_count, 1); } @@ -351,11 +347,8 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { LoadIC_PushArgs(masm); // Perform tail call to the entry. - ExternalReference ref = - ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); - int arg_count = 4; - __ TailCallExternalReference(ref, arg_count, 1); + __ TailCallRuntime(Runtime::kKeyedLoadIC_Miss, arg_count, 1); } @@ -440,16 +433,17 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm, Register vector = LoadWithVectorDescriptor::VectorRegister(); Register slot = LoadWithVectorDescriptor::SlotRegister(); DCHECK(!AreAliased(vector, slot, t0, t1, t2, t5)); - Handle<TypeFeedbackVector> dummy_vector = Handle<TypeFeedbackVector>::cast( - masm->isolate()->factory()->keyed_load_dummy_vector()); - int slot_index = dummy_vector->GetIndex(FeedbackVectorICSlot(0)); - __ LoadRoot(vector, Heap::kKeyedLoadDummyVectorRootIndex); + Handle<TypeFeedbackVector> dummy_vector = + TypeFeedbackVector::DummyVector(masm->isolate()); + int slot_index = dummy_vector->GetIndex( + FeedbackVectorICSlot(TypeFeedbackVector::kDummyKeyedLoadICSlot)); + __ LoadRoot(vector, Heap::kDummyVectorRootIndex); __ li(slot, Operand(Smi::FromInt(slot_index))); Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( Code::ComputeHandlerFlags(Code::LOAD_IC)); - masm->isolate()->stub_cache()->GenerateProbe( - masm, Code::LOAD_IC, flags, false, receiver, key, t0, t1, t2, t5); + masm->isolate()->stub_cache()->GenerateProbe(masm, Code::LOAD_IC, flags, + receiver, key, t0, t1, t2, t5); // Cache miss. GenerateMiss(masm); @@ -656,8 +650,11 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, // Check if the object is a JS array or not. __ lbu(t0, FieldMemOperand(receiver_map, Map::kInstanceTypeOffset)); __ Branch(&array, eq, t0, Operand(JS_ARRAY_TYPE)); - // Check that the object is some kind of JSObject. - __ Branch(&slow, lt, t0, Operand(FIRST_JS_OBJECT_TYPE)); + // Check that the object is some kind of JS object EXCEPT JS Value type. In + // the case that the object is a value-wrapper object, we enter the runtime + // system to make sure that indexing into string objects works as intended. + STATIC_ASSERT(JS_VALUE_TYPE < JS_OBJECT_TYPE); + __ Branch(&slow, lo, t0, Operand(JS_OBJECT_TYPE)); // Object case: Check key against length in the elements array. __ lw(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); @@ -685,17 +682,18 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, Register vector = VectorStoreICDescriptor::VectorRegister(); Register slot = VectorStoreICDescriptor::SlotRegister(); DCHECK(!AreAliased(vector, slot, a3, t0, t1, t2)); - Handle<TypeFeedbackVector> dummy_vector = Handle<TypeFeedbackVector>::cast( - masm->isolate()->factory()->keyed_store_dummy_vector()); - int slot_index = dummy_vector->GetIndex(FeedbackVectorICSlot(0)); - __ LoadRoot(vector, Heap::kKeyedStoreDummyVectorRootIndex); + Handle<TypeFeedbackVector> dummy_vector = + TypeFeedbackVector::DummyVector(masm->isolate()); + int slot_index = dummy_vector->GetIndex( + FeedbackVectorICSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)); + __ LoadRoot(vector, Heap::kDummyVectorRootIndex); __ li(slot, Operand(Smi::FromInt(slot_index))); } Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( Code::ComputeHandlerFlags(Code::STORE_IC)); - masm->isolate()->stub_cache()->GenerateProbe( - masm, Code::STORE_IC, flags, false, receiver, key, a3, t0, t1, t2); + masm->isolate()->stub_cache()->GenerateProbe(masm, Code::STORE_IC, flags, + receiver, key, a3, t0, t1, t2); // Cache miss. __ Branch(&miss); @@ -743,14 +741,24 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, } +static void StoreIC_PushArgs(MacroAssembler* masm) { + if (FLAG_vector_stores) { + __ Push(StoreDescriptor::ReceiverRegister(), + StoreDescriptor::NameRegister(), StoreDescriptor::ValueRegister(), + VectorStoreICDescriptor::SlotRegister(), + VectorStoreICDescriptor::VectorRegister()); + } else { + __ Push(StoreDescriptor::ReceiverRegister(), + StoreDescriptor::NameRegister(), StoreDescriptor::ValueRegister()); + } +} + + void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { - // Push receiver, key and value for runtime call. - __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), - StoreDescriptor::ValueRegister()); + StoreIC_PushArgs(masm); - ExternalReference ref = - ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); - __ TailCallExternalReference(ref, 3, 1); + int args = FLAG_vector_stores ? 5 : 3; + __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, args, 1); } @@ -764,8 +772,8 @@ void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { // Get the receiver from the stack and probe the stub cache. Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( Code::ComputeHandlerFlags(Code::STORE_IC)); - masm->isolate()->stub_cache()->GenerateProbe( - masm, Code::STORE_IC, flags, false, receiver, name, a3, t0, t1, t2); + masm->isolate()->stub_cache()->GenerateProbe(masm, Code::STORE_IC, flags, + receiver, name, a3, t0, t1, t2); // Cache miss: Jump to runtime. GenerateMiss(masm); @@ -773,12 +781,11 @@ void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { void StoreIC::GenerateMiss(MacroAssembler* masm) { - __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), - StoreDescriptor::ValueRegister()); + StoreIC_PushArgs(masm); + // Perform tail call to the entry. - ExternalReference ref = - ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); - __ TailCallExternalReference(ref, 3, 1); + int args = FLAG_vector_stores ? 5 : 3; + __ TailCallRuntime(Runtime::kStoreIC_Miss, args, 1); } |