From 27361ec6c89898f491edb9162e8a77001147562f Mon Sep 17 00:00:00 2001 From: "chunyang.dai" Date: Fri, 6 Feb 2015 23:52:17 -0800 Subject: [PATCH] X87: Use a trampoline stub to load the type feedback vector for CallICs port 2a567faa3e7242359e29c63f8dc8c18104af0610 (r26290) original commit message: Use a trampoline stub to load the type feedback vector for CallICs. BUG= Review URL: https://codereview.chromium.org/905983002 Cr-Commit-Position: refs/heads/master@{#26502} --- src/x87/code-stubs-x87.cc | 20 ++++++++++++++++---- src/x87/full-codegen-x87.cc | 3 +-- src/x87/interface-descriptors-x87.cc | 10 ++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc index a8b3e62235..28baf49fab 100644 --- a/src/x87/code-stubs-x87.cc +++ b/src/x87/code-stubs-x87.cc @@ -1879,12 +1879,11 @@ static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { void CallIC_ArrayStub::Generate(MacroAssembler* masm) { // edi - function // edx - slot id + // ebx - vector Label miss; int argc = arg_count(); ParameterCount actual(argc); - EmitLoadTypeFeedbackVector(masm, ebx); - __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, ecx); __ cmp(edi, ecx); __ j(not_equal, &miss); @@ -1920,6 +1919,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) { void CallICStub::Generate(MacroAssembler* masm) { // edi - function // edx - slot id + // ebx - vector Isolate* isolate = masm->isolate(); const int with_types_offset = FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); @@ -1931,8 +1931,6 @@ void CallICStub::Generate(MacroAssembler* masm) { int argc = arg_count(); ParameterCount actual(argc); - EmitLoadTypeFeedbackVector(masm, ebx); - // The checks. First, does edi match the recorded monomorphic target? __ cmp(edi, FieldOperand(ebx, edx, times_half_pointer_size, FixedArray::kHeaderSize)); @@ -3992,6 +3990,20 @@ void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { } +void CallICTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, ebx); + CallICStub stub(isolate(), state()); + __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); +} + + +void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { + EmitLoadTypeFeedbackVector(masm, ebx); + CallIC_ArrayStub stub(isolate(), state()); + __ jmp(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/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc index 4a3e5cc376..a7a5d714ec 100644 --- a/src/x87/full-codegen-x87.cc +++ b/src/x87/full-codegen-x87.cc @@ -2894,8 +2894,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(); __ Move(edx, Immediate(SmiFromSlot(expr->CallFeedbackSlot()))); __ mov(edi, Operand(esp, (arg_count + 1) * kPointerSize)); // Don't assign a type feedback id to the IC, since type feedback is provided diff --git a/src/x87/interface-descriptors-x87.cc b/src/x87/interface-descriptors-x87.cc index b2c4b6b5c0..9ab630f85f 100644 --- a/src/x87/interface-descriptors-x87.cc +++ b/src/x87/interface-descriptors-x87.cc @@ -128,6 +128,16 @@ void CallFunctionWithFeedbackDescriptor::Initialize( } +void CallFunctionWithFeedbackAndVectorDescriptor::Initialize( + CallInterfaceDescriptorData* data) { + Register registers[] = {esi, edi, edx, ebx}; + Representation representations[] = { + Representation::Tagged(), Representation::Tagged(), Representation::Smi(), + Representation::Tagged()}; + data->Initialize(arraysize(registers), registers, representations); +} + + void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { // eax : number of arguments // ebx : feedback vector