From bac284ee75c80be60cf0c41a144e7ff71e1e922b Mon Sep 17 00:00:00 2001 From: "chunyang.dai" Date: Sun, 27 Sep 2015 20:09:00 -0700 Subject: [PATCH] X87: Full code shouldn't embed the type feedback vector. port c90c60ba2689fb524a1526503c9c87f534cf58fb (r30940) original commit message: Make sure to always reference it indirectly. This allows us to make the vector native-context dependent should we wish. BUG= Review URL: https://codereview.chromium.org/1369963002 Cr-Commit-Position: refs/heads/master@{#30954} --- src/full-codegen/x87/full-codegen-x87.cc | 8 ++++---- src/x87/code-stubs-x87.cc | 18 +++++------------- src/x87/macro-assembler-x87.cc | 7 +++++++ src/x87/macro-assembler-x87.h | 3 +++ 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/full-codegen/x87/full-codegen-x87.cc b/src/full-codegen/x87/full-codegen-x87.cc index 4e9330d2d..4c67161c6 100644 --- a/src/full-codegen/x87/full-codegen-x87.cc +++ b/src/full-codegen/x87/full-codegen-x87.cc @@ -1051,8 +1051,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { __ bind(&fixed_array); // No need for a write barrier, we are storing a Smi in the feedback vector. - __ LoadHeapObject(ebx, FeedbackVector()); - int vector_index = FeedbackVector()->GetIndex(slot); + __ EmitLoadTypeFeedbackVector(ebx); + int vector_index = SmiFromSlot(slot)->value(); __ mov(FieldOperand(ebx, FixedArray::OffsetOfElementAt(vector_index)), Immediate(TypeFeedbackVector::MegamorphicSentinel(isolate()))); @@ -3065,7 +3065,7 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) { __ mov(edi, Operand(esp, arg_count * kPointerSize)); // Record call targets in unoptimized code. - __ LoadHeapObject(ebx, FeedbackVector()); + __ EmitLoadTypeFeedbackVector(ebx); __ mov(edx, Immediate(SmiFromSlot(expr->CallNewFeedbackSlot()))); CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET); @@ -3105,7 +3105,7 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) { __ mov(edi, Operand(esp, arg_count * kPointerSize)); // Record call targets in unoptimized code. - __ LoadHeapObject(ebx, FeedbackVector()); + __ EmitLoadTypeFeedbackVector(ebx); __ mov(edx, Immediate(SmiFromSlot(expr->CallFeedbackSlot()))); CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc index adecb3806..0d59b1806 100644 --- a/src/x87/code-stubs-x87.cc +++ b/src/x87/code-stubs-x87.cc @@ -1883,14 +1883,6 @@ void CallConstructStub::Generate(MacroAssembler* masm) { } -static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { - __ mov(vector, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); - __ mov(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset)); - __ mov(vector, FieldOperand(vector, - SharedFunctionInfo::kFeedbackVectorOffset)); -} - - void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { // edi - function // edx - slot id @@ -3991,14 +3983,14 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { void LoadICTrampolineStub::Generate(MacroAssembler* masm) { - EmitLoadTypeFeedbackVector(masm, LoadWithVectorDescriptor::VectorRegister()); + __ EmitLoadTypeFeedbackVector(LoadWithVectorDescriptor::VectorRegister()); LoadICStub stub(isolate(), state()); stub.GenerateForTrampoline(masm); } void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { - EmitLoadTypeFeedbackVector(masm, LoadWithVectorDescriptor::VectorRegister()); + __ EmitLoadTypeFeedbackVector(LoadWithVectorDescriptor::VectorRegister()); KeyedLoadICStub stub(isolate(), state()); stub.GenerateForTrampoline(masm); } @@ -4222,14 +4214,14 @@ void KeyedLoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { void VectorStoreICTrampolineStub::Generate(MacroAssembler* masm) { - EmitLoadTypeFeedbackVector(masm, VectorStoreICDescriptor::VectorRegister()); + __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); VectorStoreICStub stub(isolate(), state()); stub.GenerateForTrampoline(masm); } void VectorKeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { - EmitLoadTypeFeedbackVector(masm, VectorStoreICDescriptor::VectorRegister()); + __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); VectorKeyedStoreICStub stub(isolate(), state()); stub.GenerateForTrampoline(masm); } @@ -4582,7 +4574,7 @@ void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { void CallICTrampolineStub::Generate(MacroAssembler* masm) { - EmitLoadTypeFeedbackVector(masm, ebx); + __ EmitLoadTypeFeedbackVector(ebx); CallICStub stub(isolate(), state()); __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); } diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc index 80d13d3da..9fc8b79da 100644 --- a/src/x87/macro-assembler-x87.cc +++ b/src/x87/macro-assembler-x87.cc @@ -841,6 +841,13 @@ void MacroAssembler::Prologue(bool code_pre_aging) { } +void MacroAssembler::EmitLoadTypeFeedbackVector(Register vector) { + mov(vector, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); + mov(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset)); + mov(vector, FieldOperand(vector, SharedFunctionInfo::kFeedbackVectorOffset)); +} + + void MacroAssembler::EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg) { // Out-of-line constant pool not implemented on x87. diff --git a/src/x87/macro-assembler-x87.h b/src/x87/macro-assembler-x87.h index 1bae63c7e..f1a8f82fe 100644 --- a/src/x87/macro-assembler-x87.h +++ b/src/x87/macro-assembler-x87.h @@ -908,6 +908,9 @@ class MacroAssembler: public Assembler { return SafepointRegisterStackIndex(reg.code()); } + // Load the type feedback vector from a JavaScript frame. + void EmitLoadTypeFeedbackVector(Register vector); + // Activation support. void EnterFrame(StackFrame::Type type); void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg); -- 2.34.1