From: balazs.kilvady Date: Tue, 27 Jan 2015 15:54:37 +0000 (-0800) Subject: MIPS: Use a trampoline stub to load the type feedback vector for CallICs. X-Git-Tag: upstream/4.7.83~4742 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=701c6e747569926c13160d668035ac05d363e5dc;p=platform%2Fupstream%2Fv8.git MIPS: Use a trampoline stub to load the type feedback vector for CallICs. Port 2a567faa3e7242359e29c63f8dc8c18104af0610 BUG= Review URL: https://codereview.chromium.org/882683002 Cr-Commit-Position: refs/heads/master@{#26298} --- diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index 65c398dc6..5ce502cab 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -2746,10 +2746,9 @@ static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { void CallIC_ArrayStub::Generate(MacroAssembler* masm) { // a1 - function // a3 - slot id + // a2 - vector Label miss; - EmitLoadTypeFeedbackVector(masm, a2); - __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at); __ Branch(&miss, ne, a1, Operand(at)); @@ -2784,6 +2783,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) { void CallICStub::Generate(MacroAssembler* masm) { // a1 - function // a3 - slot id (Smi) + // a2 - vector const int with_types_offset = FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); const int generic_offset = @@ -2794,8 +2794,6 @@ void CallICStub::Generate(MacroAssembler* masm) { int argc = arg_count(); ParameterCount actual(argc); - EmitLoadTypeFeedbackVector(masm, a2); - // The checks. First, does r1 match the recorded monomorphic target? __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize); __ Addu(t0, a2, Operand(t0)); @@ -4479,6 +4477,20 @@ void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { } +void CallICTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, a2); + CallICStub stub(isolate(), state()); + __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); +} + + +void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, a2); + CallIC_ArrayStub stub(isolate(), state()); + __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); +} + + void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { if (masm->isolate()->function_entry_hook() != NULL) { ProfileEntryHookStub stub(masm->isolate()); diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 9baeaa74c..25ec2b578 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -2982,8 +2982,7 @@ void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) { // Record source position of the IC call. SetSourcePosition(expr->position()); - Handle ic = CallIC::initialize_stub( - isolate(), arg_count, call_type); + Handle ic = CodeFactory::CallIC(isolate(), arg_count, call_type).code(); __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); __ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Don't assign a type feedback id to the IC, since type feedback is provided diff --git a/src/mips/interface-descriptors-mips.cc b/src/mips/interface-descriptors-mips.cc index 979fbf45f..b2ac478a5 100644 --- a/src/mips/interface-descriptors-mips.cc +++ b/src/mips/interface-descriptors-mips.cc @@ -125,6 +125,16 @@ void CallFunctionWithFeedbackDescriptor::Initialize( } +void CallFunctionWithFeedbackAndVectorDescriptor::Initialize( + CallInterfaceDescriptorData* data) { + Register registers[] = {cp, a1, a3, a2}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), Representation::Smi(), + Representation::Tagged()}; + data->Initialize(arraysize(registers), registers, representations); +} + + void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { // a0 : number of arguments // a1 : the function to call diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc index 627d65b43..441940970 100644 --- a/src/mips64/code-stubs-mips64.cc +++ b/src/mips64/code-stubs-mips64.cc @@ -2821,10 +2821,9 @@ static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { void CallIC_ArrayStub::Generate(MacroAssembler* masm) { // a1 - function // a3 - slot id + // a2 - vector Label miss; - EmitLoadTypeFeedbackVector(masm, a2); - __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at); __ Branch(&miss, ne, a1, Operand(at)); @@ -2859,6 +2858,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) { void CallICStub::Generate(MacroAssembler* masm) { // a1 - function // a3 - slot id (Smi) + // a2 - vector const int with_types_offset = FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); const int generic_offset = @@ -2869,8 +2869,6 @@ void CallICStub::Generate(MacroAssembler* masm) { int argc = arg_count(); ParameterCount actual(argc); - EmitLoadTypeFeedbackVector(masm, a2); - // The checks. First, does r1 match the recorded monomorphic target? __ dsrl(a4, a3, 32 - kPointerSizeLog2); __ Daddu(a4, a2, Operand(a4)); @@ -4519,6 +4517,20 @@ void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { } +void CallICTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, a2); + CallICStub stub(isolate(), state()); + __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); +} + + +void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, a2); + CallIC_ArrayStub stub(isolate(), state()); + __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); +} + + void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { if (masm->isolate()->function_entry_hook() != NULL) { ProfileEntryHookStub stub(masm->isolate()); diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index ef71af461..d639c10f0 100644 --- a/src/mips64/full-codegen-mips64.cc +++ b/src/mips64/full-codegen-mips64.cc @@ -2982,8 +2982,7 @@ void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) { // Record source position of the IC call. SetSourcePosition(expr->position()); - Handle ic = CallIC::initialize_stub( - isolate(), arg_count, call_type); + Handle ic = CodeFactory::CallIC(isolate(), arg_count, call_type).code(); __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); __ ld(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Don't assign a type feedback id to the IC, since type feedback is provided diff --git a/src/mips64/interface-descriptors-mips64.cc b/src/mips64/interface-descriptors-mips64.cc index 8f76ff890..d7f0fe531 100644 --- a/src/mips64/interface-descriptors-mips64.cc +++ b/src/mips64/interface-descriptors-mips64.cc @@ -119,6 +119,16 @@ void CallFunctionWithFeedbackDescriptor::Initialize( } +void CallFunctionWithFeedbackAndVectorDescriptor::Initialize( + CallInterfaceDescriptorData* data) { + Register registers[] = {cp, a1, a3, a2}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), Representation::Smi(), + Representation::Tagged()}; + data->Initialize(arraysize(registers), registers, representations); +} + + void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {cp, a1}; data->Initialize(arraysize(registers), registers, NULL);