X87: Now that vector ics are established for load, keyed load and call ics, let's remove dead code behind the flag.
port 323ced9e27
(r28422).
original commit message:
BUG=
Review URL: https://codereview.chromium.org/1142713007
Cr-Commit-Position: refs/heads/master@{#28467}
This commit is contained in:
parent
fe690c3e82
commit
528aa288bf
@ -130,10 +130,9 @@ void NamedLoadHandlerCompiler::GenerateDirectLoadGlobalFunctionPrototype(
|
|||||||
void NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(
|
void NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(
|
||||||
MacroAssembler* masm, Register receiver, Register scratch1,
|
MacroAssembler* masm, Register receiver, Register scratch1,
|
||||||
Register scratch2, Label* miss_label) {
|
Register scratch2, Label* miss_label) {
|
||||||
DCHECK(!FLAG_vector_ics);
|
// TODO(mvstanton): This isn't used on ia32. Move all the other
|
||||||
__ TryGetFunctionPrototype(receiver, scratch1, scratch2, miss_label);
|
// platform implementations into a code stub so this method can be removed.
|
||||||
__ mov(eax, scratch1);
|
UNREACHABLE();
|
||||||
__ ret(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -399,26 +399,21 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
|||||||
Immediate(isolate->factory()->hash_table_map()));
|
Immediate(isolate->factory()->hash_table_map()));
|
||||||
__ j(equal, &probe_dictionary);
|
__ j(equal, &probe_dictionary);
|
||||||
|
|
||||||
if (FLAG_vector_ics) {
|
// The handlers in the stub cache expect a vector and slot. Since we won't
|
||||||
// When vector ics are in use, the handlers in the stub cache expect a
|
// change the IC from any downstream misses, a dummy vector can be used.
|
||||||
// vector and slot. Since we won't change the IC from any downstream
|
|
||||||
// misses, a dummy vector can be used.
|
|
||||||
Handle<TypeFeedbackVector> dummy_vector = Handle<TypeFeedbackVector>::cast(
|
Handle<TypeFeedbackVector> dummy_vector = Handle<TypeFeedbackVector>::cast(
|
||||||
isolate->factory()->keyed_load_dummy_vector());
|
isolate->factory()->keyed_load_dummy_vector());
|
||||||
int slot = dummy_vector->GetIndex(FeedbackVectorICSlot(0));
|
int slot = dummy_vector->GetIndex(FeedbackVectorICSlot(0));
|
||||||
__ push(Immediate(Smi::FromInt(slot)));
|
__ push(Immediate(Smi::FromInt(slot)));
|
||||||
__ push(Immediate(dummy_vector));
|
__ push(Immediate(dummy_vector));
|
||||||
}
|
|
||||||
|
|
||||||
Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
|
Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
|
||||||
Code::ComputeHandlerFlags(Code::LOAD_IC));
|
Code::ComputeHandlerFlags(Code::LOAD_IC));
|
||||||
masm->isolate()->stub_cache()->GenerateProbe(masm, Code::KEYED_LOAD_IC, flags,
|
masm->isolate()->stub_cache()->GenerateProbe(masm, Code::KEYED_LOAD_IC, flags,
|
||||||
false, receiver, key, ebx, edi);
|
false, receiver, key, ebx, edi);
|
||||||
|
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ pop(VectorLoadICDescriptor::VectorRegister());
|
__ pop(VectorLoadICDescriptor::VectorRegister());
|
||||||
__ pop(VectorLoadICDescriptor::SlotRegister());
|
__ pop(VectorLoadICDescriptor::SlotRegister());
|
||||||
}
|
|
||||||
|
|
||||||
// Cache miss.
|
// Cache miss.
|
||||||
GenerateMiss(masm);
|
GenerateMiss(masm);
|
||||||
@ -733,7 +728,7 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) {
|
|||||||
static void LoadIC_PushArgs(MacroAssembler* masm) {
|
static void LoadIC_PushArgs(MacroAssembler* masm) {
|
||||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||||
Register name = LoadDescriptor::NameRegister();
|
Register name = LoadDescriptor::NameRegister();
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
Register slot = VectorLoadICDescriptor::SlotRegister();
|
Register slot = VectorLoadICDescriptor::SlotRegister();
|
||||||
Register vector = VectorLoadICDescriptor::VectorRegister();
|
Register vector = VectorLoadICDescriptor::VectorRegister();
|
||||||
DCHECK(!edi.is(receiver) && !edi.is(name) && !edi.is(slot) &&
|
DCHECK(!edi.is(receiver) && !edi.is(name) && !edi.is(slot) &&
|
||||||
@ -745,14 +740,6 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
|
|||||||
__ push(slot);
|
__ push(slot);
|
||||||
__ push(vector);
|
__ push(vector);
|
||||||
__ push(edi);
|
__ push(edi);
|
||||||
} else {
|
|
||||||
DCHECK(!ebx.is(receiver) && !ebx.is(name));
|
|
||||||
|
|
||||||
__ pop(ebx);
|
|
||||||
__ push(receiver);
|
|
||||||
__ push(name);
|
|
||||||
__ push(ebx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -764,7 +751,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
|||||||
// Perform tail call to the entry.
|
// Perform tail call to the entry.
|
||||||
ExternalReference ref =
|
ExternalReference ref =
|
||||||
ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate());
|
ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate());
|
||||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
int arg_count = 4;
|
||||||
__ TailCallExternalReference(ref, arg_count, 1);
|
__ TailCallExternalReference(ref, arg_count, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -794,7 +781,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
|||||||
// Perform tail call to the entry.
|
// Perform tail call to the entry.
|
||||||
ExternalReference ref =
|
ExternalReference ref =
|
||||||
ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate());
|
ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate());
|
||||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
int arg_count = 4;
|
||||||
__ TailCallExternalReference(ref, arg_count, 1);
|
__ TailCallExternalReference(ref, arg_count, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,8 +333,6 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
|||||||
void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
||||||
Label miss;
|
Label miss;
|
||||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||||
|
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
// With careful management, we won't have to save slot and vector on
|
// With careful management, we won't have to save slot and vector on
|
||||||
// the stack. Simply handle the possibly missing case first.
|
// the stack. Simply handle the possibly missing case first.
|
||||||
// TODO(mvstanton): this code can be more efficient.
|
// TODO(mvstanton): this code can be more efficient.
|
||||||
@ -343,10 +341,7 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
|||||||
__ j(equal, &miss);
|
__ j(equal, &miss);
|
||||||
__ TryGetFunctionPrototype(receiver, eax, ebx, &miss);
|
__ TryGetFunctionPrototype(receiver, eax, ebx, &miss);
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
} else {
|
|
||||||
NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, eax,
|
|
||||||
ebx, &miss);
|
|
||||||
}
|
|
||||||
__ bind(&miss);
|
__ bind(&miss);
|
||||||
PropertyAccessCompiler::TailCallBuiltin(
|
PropertyAccessCompiler::TailCallBuiltin(
|
||||||
masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC));
|
masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC));
|
||||||
@ -393,9 +388,8 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
|
|||||||
DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
||||||
Register result = eax;
|
Register result = eax;
|
||||||
DCHECK(!result.is(scratch));
|
DCHECK(!result.is(scratch));
|
||||||
DCHECK(!FLAG_vector_ics ||
|
DCHECK(!scratch.is(VectorLoadICDescriptor::VectorRegister()) &&
|
||||||
(!scratch.is(VectorLoadICDescriptor::VectorRegister()) &&
|
result.is(VectorLoadICDescriptor::SlotRegister()));
|
||||||
result.is(VectorLoadICDescriptor::SlotRegister())));
|
|
||||||
|
|
||||||
// StringCharAtGenerator doesn't use the result register until it's passed
|
// StringCharAtGenerator doesn't use the result register until it's passed
|
||||||
// the different miss possibilities. If it did, we would have a conflict
|
// the different miss possibilities. If it did, we would have a conflict
|
||||||
@ -2664,7 +2658,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
|||||||
index_not_number_,
|
index_not_number_,
|
||||||
DONT_DO_SMI_CHECK);
|
DONT_DO_SMI_CHECK);
|
||||||
call_helper.BeforeCall(masm);
|
call_helper.BeforeCall(masm);
|
||||||
if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
if (embed_mode == PART_OF_IC_HANDLER) {
|
||||||
__ push(VectorLoadICDescriptor::VectorRegister());
|
__ push(VectorLoadICDescriptor::VectorRegister());
|
||||||
__ push(VectorLoadICDescriptor::SlotRegister());
|
__ push(VectorLoadICDescriptor::SlotRegister());
|
||||||
}
|
}
|
||||||
@ -2683,7 +2677,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
|||||||
__ mov(index_, eax);
|
__ mov(index_, eax);
|
||||||
}
|
}
|
||||||
__ pop(object_);
|
__ pop(object_);
|
||||||
if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
if (embed_mode == PART_OF_IC_HANDLER) {
|
||||||
__ pop(VectorLoadICDescriptor::SlotRegister());
|
__ pop(VectorLoadICDescriptor::SlotRegister());
|
||||||
__ pop(VectorLoadICDescriptor::VectorRegister());
|
__ pop(VectorLoadICDescriptor::VectorRegister());
|
||||||
}
|
}
|
||||||
|
@ -182,10 +182,8 @@ void DebugCodegen::GenerateLoadICDebugBreak(MacroAssembler* masm) {
|
|||||||
// Register state for IC load call (from ic-x87.cc).
|
// Register state for IC load call (from ic-x87.cc).
|
||||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||||
Register name = LoadDescriptor::NameRegister();
|
Register name = LoadDescriptor::NameRegister();
|
||||||
RegList regs = receiver.bit() | name.bit();
|
RegList regs = receiver.bit() | name.bit() |
|
||||||
if (FLAG_vector_ics) {
|
VectorLoadICTrampolineDescriptor::SlotRegister().bit();
|
||||||
regs |= VectorLoadICTrampolineDescriptor::SlotRegister().bit();
|
|
||||||
}
|
|
||||||
Generate_DebugBreakCallHelper(masm, regs, 0, false);
|
Generate_DebugBreakCallHelper(masm, regs, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1252,13 +1252,9 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) {
|
|||||||
Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
|
Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
|
||||||
__ mov(LoadDescriptor::NameRegister(), home_object_symbol);
|
__ mov(LoadDescriptor::NameRegister(), home_object_symbol);
|
||||||
|
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
|
Immediate(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
|
||||||
CallLoadIC(NOT_CONTEXTUAL);
|
CallLoadIC(NOT_CONTEXTUAL);
|
||||||
} else {
|
|
||||||
CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
|
|
||||||
}
|
|
||||||
|
|
||||||
__ cmp(eax, isolate()->factory()->undefined_value());
|
__ cmp(eax, isolate()->factory()->undefined_value());
|
||||||
Label done;
|
Label done;
|
||||||
@ -1333,10 +1329,8 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
|
|||||||
// load IC call.
|
// load IC call.
|
||||||
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||||
__ mov(LoadDescriptor::NameRegister(), proxy->var()->name());
|
__ mov(LoadDescriptor::NameRegister(), proxy->var()->name());
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||||
}
|
|
||||||
|
|
||||||
ContextualMode mode = (typeof_state == INSIDE_TYPEOF)
|
ContextualMode mode = (typeof_state == INSIDE_TYPEOF)
|
||||||
? NOT_CONTEXTUAL
|
? NOT_CONTEXTUAL
|
||||||
@ -1421,10 +1415,8 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
|||||||
Comment cmnt(masm_, "[ Global variable");
|
Comment cmnt(masm_, "[ Global variable");
|
||||||
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||||
__ mov(LoadDescriptor::NameRegister(), var->name());
|
__ mov(LoadDescriptor::NameRegister(), var->name());
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||||
}
|
|
||||||
CallGlobalLoadIC(var->name());
|
CallGlobalLoadIC(var->name());
|
||||||
context()->Plug(eax);
|
context()->Plug(eax);
|
||||||
break;
|
break;
|
||||||
@ -2116,10 +2108,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
|||||||
// result = receiver[f](arg);
|
// result = receiver[f](arg);
|
||||||
__ bind(&l_call);
|
__ bind(&l_call);
|
||||||
__ mov(load_receiver, Operand(esp, kPointerSize));
|
__ mov(load_receiver, Operand(esp, kPointerSize));
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
|
Immediate(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
|
||||||
}
|
|
||||||
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
||||||
CallIC(ic, TypeFeedbackId::None());
|
CallIC(ic, TypeFeedbackId::None());
|
||||||
__ mov(edi, eax);
|
__ mov(edi, eax);
|
||||||
@ -2136,10 +2126,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
|||||||
__ Move(load_receiver, eax); // result
|
__ Move(load_receiver, eax); // result
|
||||||
__ mov(load_name,
|
__ mov(load_name,
|
||||||
isolate()->factory()->done_string()); // "done"
|
isolate()->factory()->done_string()); // "done"
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(expr->DoneFeedbackSlot())));
|
Immediate(SmiFromSlot(expr->DoneFeedbackSlot())));
|
||||||
}
|
|
||||||
CallLoadIC(NOT_CONTEXTUAL); // result.done in eax
|
CallLoadIC(NOT_CONTEXTUAL); // result.done in eax
|
||||||
Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
||||||
CallIC(bool_ic);
|
CallIC(bool_ic);
|
||||||
@ -2150,10 +2138,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
|||||||
__ pop(load_receiver); // result
|
__ pop(load_receiver); // result
|
||||||
__ mov(load_name,
|
__ mov(load_name,
|
||||||
isolate()->factory()->value_string()); // "value"
|
isolate()->factory()->value_string()); // "value"
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(expr->ValueFeedbackSlot())));
|
Immediate(SmiFromSlot(expr->ValueFeedbackSlot())));
|
||||||
}
|
|
||||||
CallLoadIC(NOT_CONTEXTUAL); // result.value in eax
|
CallLoadIC(NOT_CONTEXTUAL); // result.value in eax
|
||||||
context()->DropAndPlug(2, eax); // drop iter and g
|
context()->DropAndPlug(2, eax); // drop iter and g
|
||||||
break;
|
break;
|
||||||
@ -2291,13 +2277,9 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
|||||||
DCHECK(!prop->IsSuperAccess());
|
DCHECK(!prop->IsSuperAccess());
|
||||||
|
|
||||||
__ mov(LoadDescriptor::NameRegister(), Immediate(key->value()));
|
__ mov(LoadDescriptor::NameRegister(), Immediate(key->value()));
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
Immediate(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
||||||
CallLoadIC(NOT_CONTEXTUAL);
|
CallLoadIC(NOT_CONTEXTUAL);
|
||||||
} else {
|
|
||||||
CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2316,13 +2298,9 @@ void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
|
|||||||
void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
||||||
SetSourcePosition(prop->position());
|
SetSourcePosition(prop->position());
|
||||||
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
Immediate(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
||||||
CallIC(ic);
|
CallIC(ic);
|
||||||
} else {
|
|
||||||
CallIC(ic, prop->PropertyFeedbackId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4543,13 +4521,9 @@ void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) {
|
|||||||
// Load the function from the receiver.
|
// Load the function from the receiver.
|
||||||
__ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
|
__ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
|
||||||
__ mov(LoadDescriptor::NameRegister(), Immediate(expr->name()));
|
__ mov(LoadDescriptor::NameRegister(), Immediate(expr->name()));
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
|
Immediate(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
|
||||||
CallLoadIC(NOT_CONTEXTUAL);
|
CallLoadIC(NOT_CONTEXTUAL);
|
||||||
} else {
|
|
||||||
CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4988,10 +4962,8 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
|||||||
Comment cmnt(masm_, "[ Global variable");
|
Comment cmnt(masm_, "[ Global variable");
|
||||||
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
__ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||||
__ mov(LoadDescriptor::NameRegister(), Immediate(proxy->name()));
|
__ mov(LoadDescriptor::NameRegister(), Immediate(proxy->name()));
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||||
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
Immediate(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||||
}
|
|
||||||
// Use a regular load, not a contextual load, to avoid a reference
|
// Use a regular load, not a contextual load, to avoid a reference
|
||||||
// error.
|
// error.
|
||||||
CallLoadIC(NOT_CONTEXTUAL);
|
CallLoadIC(NOT_CONTEXTUAL);
|
||||||
|
@ -3144,7 +3144,6 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
|||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void LCodeGen::EmitVectorLoadICRegisters(T* instr) {
|
void LCodeGen::EmitVectorLoadICRegisters(T* instr) {
|
||||||
DCHECK(FLAG_vector_ics);
|
|
||||||
Register vector_register = ToRegister(instr->temp_vector());
|
Register vector_register = ToRegister(instr->temp_vector());
|
||||||
Register slot_register = VectorLoadICDescriptor::SlotRegister();
|
Register slot_register = VectorLoadICDescriptor::SlotRegister();
|
||||||
DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister()));
|
DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister()));
|
||||||
@ -3167,9 +3166,7 @@ void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) {
|
|||||||
DCHECK(ToRegister(instr->result()).is(eax));
|
DCHECK(ToRegister(instr->result()).is(eax));
|
||||||
|
|
||||||
__ mov(LoadDescriptor::NameRegister(), instr->name());
|
__ mov(LoadDescriptor::NameRegister(), instr->name());
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr);
|
EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr);
|
||||||
}
|
|
||||||
ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL;
|
ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL;
|
||||||
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode,
|
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode,
|
||||||
PREMONOMORPHIC).code();
|
PREMONOMORPHIC).code();
|
||||||
@ -3280,9 +3277,7 @@ void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
|
|||||||
DCHECK(ToRegister(instr->result()).is(eax));
|
DCHECK(ToRegister(instr->result()).is(eax));
|
||||||
|
|
||||||
__ mov(LoadDescriptor::NameRegister(), instr->name());
|
__ mov(LoadDescriptor::NameRegister(), instr->name());
|
||||||
if (FLAG_vector_ics) {
|
|
||||||
EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr);
|
EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr);
|
||||||
}
|
|
||||||
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(
|
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(
|
||||||
isolate(), NOT_CONTEXTUAL,
|
isolate(), NOT_CONTEXTUAL,
|
||||||
instr->hydrogen()->initialization_state()).code();
|
instr->hydrogen()->initialization_state()).code();
|
||||||
@ -3751,27 +3746,6 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LCodeGen::DoTailCallThroughMegamorphicCache(
|
|
||||||
LTailCallThroughMegamorphicCache* instr) {
|
|
||||||
Register receiver = ToRegister(instr->receiver());
|
|
||||||
Register name = ToRegister(instr->name());
|
|
||||||
DCHECK(receiver.is(LoadDescriptor::ReceiverRegister()));
|
|
||||||
DCHECK(name.is(LoadDescriptor::NameRegister()));
|
|
||||||
Register scratch = ebx;
|
|
||||||
Register extra = edi;
|
|
||||||
DCHECK(!scratch.is(receiver) && !scratch.is(name));
|
|
||||||
DCHECK(!extra.is(receiver) && !extra.is(name));
|
|
||||||
|
|
||||||
// The probe will tail call to a handler if found.
|
|
||||||
// If --vector-ics is on, then it knows to pop the two args first.
|
|
||||||
isolate()->stub_cache()->GenerateProbe(masm(), Code::LOAD_IC,
|
|
||||||
instr->hydrogen()->flags(), false,
|
|
||||||
receiver, name, scratch, extra);
|
|
||||||
|
|
||||||
LoadIC::GenerateMiss(masm());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) {
|
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) {
|
||||||
DCHECK(ToRegister(instr->result()).is(eax));
|
DCHECK(ToRegister(instr->result()).is(eax));
|
||||||
|
|
||||||
|
@ -1164,20 +1164,6 @@ LInstruction* LChunkBuilder::DoCallWithDescriptor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
|
|
||||||
HTailCallThroughMegamorphicCache* instr) {
|
|
||||||
LOperand* context = UseFixed(instr->context(), esi);
|
|
||||||
LOperand* receiver_register =
|
|
||||||
UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister());
|
|
||||||
LOperand* name_register =
|
|
||||||
UseFixed(instr->name(), LoadDescriptor::NameRegister());
|
|
||||||
|
|
||||||
// Not marked as call. It can't deoptimize, and it never returns.
|
|
||||||
return new (zone()) LTailCallThroughMegamorphicCache(
|
|
||||||
context, receiver_register, name_register);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
|
LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
|
||||||
LOperand* context = UseFixed(instr->context(), esi);
|
LOperand* context = UseFixed(instr->context(), esi);
|
||||||
LOperand* function = UseFixed(instr->function(), edi);
|
LOperand* function = UseFixed(instr->function(), edi);
|
||||||
|
@ -156,7 +156,6 @@ class LCodeGen;
|
|||||||
V(StringCompareAndBranch) \
|
V(StringCompareAndBranch) \
|
||||||
V(SubI) \
|
V(SubI) \
|
||||||
V(TaggedToI) \
|
V(TaggedToI) \
|
||||||
V(TailCallThroughMegamorphicCache) \
|
|
||||||
V(ThisFunction) \
|
V(ThisFunction) \
|
||||||
V(ToFastProperties) \
|
V(ToFastProperties) \
|
||||||
V(TransitionElementsKind) \
|
V(TransitionElementsKind) \
|
||||||
@ -486,26 +485,6 @@ class LCallStub final : public LTemplateInstruction<1, 1, 0> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class LTailCallThroughMegamorphicCache final
|
|
||||||
: public LTemplateInstruction<0, 3, 0> {
|
|
||||||
public:
|
|
||||||
LTailCallThroughMegamorphicCache(LOperand* context, LOperand* receiver,
|
|
||||||
LOperand* name) {
|
|
||||||
inputs_[0] = context;
|
|
||||||
inputs_[1] = receiver;
|
|
||||||
inputs_[2] = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOperand* context() { return inputs_[0]; }
|
|
||||||
LOperand* receiver() { return inputs_[1]; }
|
|
||||||
LOperand* name() { return inputs_[2]; }
|
|
||||||
|
|
||||||
DECLARE_CONCRETE_INSTRUCTION(TailCallThroughMegamorphicCache,
|
|
||||||
"tail-call-through-megamorphic-cache")
|
|
||||||
DECLARE_HYDROGEN_ACCESSOR(TailCallThroughMegamorphicCache)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class LUnknownOSRValue final : public LTemplateInstruction<1, 0, 0> {
|
class LUnknownOSRValue final : public LTemplateInstruction<1, 0, 0> {
|
||||||
public:
|
public:
|
||||||
bool HasInterestingComment(LCodeGen* gen) const override { return false; }
|
bool HasInterestingComment(LCodeGen* gen) const override { return false; }
|
||||||
|
Loading…
Reference in New Issue
Block a user