PPC: Now that vector ics are established for load, keyed load and call ics, let's remove dead code behind the flag.
Port 323ced9e27
R=mvstanton@chromium.org, dstence@us.ibm.com, michael_dawson@ca.ibm.com
BUG=
Review URL: https://codereview.chromium.org/1132513007
Cr-Commit-Position: refs/heads/master@{#28431}
This commit is contained in:
parent
055d4ee19c
commit
fd892a676e
@ -299,14 +299,10 @@ static const Register LoadIC_TempRegister() { return r6; }
|
||||
static void LoadIC_PushArgs(MacroAssembler* masm) {
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register name = LoadDescriptor::NameRegister();
|
||||
if (FLAG_vector_ics) {
|
||||
Register slot = VectorLoadICDescriptor::SlotRegister();
|
||||
Register vector = VectorLoadICDescriptor::VectorRegister();
|
||||
|
||||
__ Push(receiver, name, slot, vector);
|
||||
} else {
|
||||
__ Push(receiver, name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -314,8 +310,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
// The return address is in lr.
|
||||
Isolate* isolate = masm->isolate();
|
||||
|
||||
DCHECK(!FLAG_vector_ics ||
|
||||
!AreAliased(r7, r8, VectorLoadICDescriptor::SlotRegister(),
|
||||
DCHECK(!AreAliased(r7, r8, VectorLoadICDescriptor::SlotRegister(),
|
||||
VectorLoadICDescriptor::VectorRegister()));
|
||||
__ IncrementCounter(isolate->counters()->load_miss(), 1, r7, r8);
|
||||
|
||||
@ -323,7 +318,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
|
||||
// Perform tail call to the entry.
|
||||
ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate);
|
||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
||||
int arg_count = 4;
|
||||
__ TailCallExternalReference(ref, arg_count, 1);
|
||||
}
|
||||
|
||||
@ -453,8 +448,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
// The return address is in lr.
|
||||
Isolate* isolate = masm->isolate();
|
||||
|
||||
DCHECK(!FLAG_vector_ics ||
|
||||
!AreAliased(r7, r8, VectorLoadICDescriptor::SlotRegister(),
|
||||
DCHECK(!AreAliased(r7, r8, VectorLoadICDescriptor::SlotRegister(),
|
||||
VectorLoadICDescriptor::VectorRegister()));
|
||||
__ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, r7, r8);
|
||||
|
||||
@ -463,7 +457,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
// Perform tail call to the entry.
|
||||
ExternalReference ref =
|
||||
ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate);
|
||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
||||
int arg_count = 4;
|
||||
__ TailCallExternalReference(ref, arg_count, 1);
|
||||
}
|
||||
|
||||
@ -540,10 +534,8 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
__ beq(&probe_dictionary);
|
||||
|
||||
|
||||
if (FLAG_vector_ics) {
|
||||
// When vector ics are in use, the handlers in the stub cache expect a
|
||||
// vector and slot. Since we won't change the IC from any downstream
|
||||
// misses, a dummy vector can be used.
|
||||
// The handlers in the stub cache expect a vector and slot. Since we won't
|
||||
// change the IC from any downstream misses, a dummy vector can be used.
|
||||
Register vector = VectorLoadICDescriptor::VectorRegister();
|
||||
Register slot = VectorLoadICDescriptor::SlotRegister();
|
||||
DCHECK(!AreAliased(vector, slot, r7, r8, r9, r10));
|
||||
@ -552,7 +544,6 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
int int_slot = dummy_vector->GetIndex(FeedbackVectorICSlot(0));
|
||||
__ LoadRoot(vector, Heap::kKeyedLoadDummyVectorRootIndex);
|
||||
__ LoadSmiLiteral(slot, Smi::FromInt(int_slot));
|
||||
}
|
||||
|
||||
Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
|
||||
Code::ComputeHandlerFlags(Code::LOAD_IC));
|
||||
|
@ -1574,8 +1574,7 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
// Ensure that the vector and slot registers won't be clobbered before
|
||||
// calling the miss handler.
|
||||
DCHECK(!FLAG_vector_ics ||
|
||||
!AreAliased(r7, r8, VectorLoadICDescriptor::VectorRegister(),
|
||||
DCHECK(!AreAliased(r7, r8, VectorLoadICDescriptor::VectorRegister(),
|
||||
VectorLoadICDescriptor::SlotRegister()));
|
||||
|
||||
NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, r7,
|
||||
@ -1595,9 +1594,8 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
|
||||
Register scratch = r8;
|
||||
Register result = r3;
|
||||
DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
||||
DCHECK(!FLAG_vector_ics ||
|
||||
(!scratch.is(VectorLoadICDescriptor::VectorRegister()) &&
|
||||
result.is(VectorLoadICDescriptor::SlotRegister())));
|
||||
DCHECK(!scratch.is(VectorLoadICDescriptor::VectorRegister()) &&
|
||||
result.is(VectorLoadICDescriptor::SlotRegister()));
|
||||
|
||||
// StringCharAtGenerator doesn't use the result register until it's passed
|
||||
// the different miss possibilities. If it did, we would have a conflict
|
||||
@ -3125,7 +3123,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
||||
__ CheckMap(index_, result_, Heap::kHeapNumberMapRootIndex, index_not_number_,
|
||||
DONT_DO_SMI_CHECK);
|
||||
call_helper.BeforeCall(masm);
|
||||
if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
||||
if (embed_mode == PART_OF_IC_HANDLER) {
|
||||
__ Push(VectorLoadICDescriptor::VectorRegister(),
|
||||
VectorLoadICDescriptor::SlotRegister(), object_, index_);
|
||||
} else {
|
||||
@ -3142,7 +3140,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
||||
// Save the conversion result before the pop instructions below
|
||||
// have a chance to overwrite it.
|
||||
__ Move(index_, r3);
|
||||
if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
||||
if (embed_mode == PART_OF_IC_HANDLER) {
|
||||
__ Pop(VectorLoadICDescriptor::VectorRegister(),
|
||||
VectorLoadICDescriptor::SlotRegister(), object_);
|
||||
} else {
|
||||
|
@ -161,10 +161,8 @@ void DebugCodegen::GenerateLoadICDebugBreak(MacroAssembler* masm) {
|
||||
// Calling convention for IC load (from ic-ppc.cc).
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register name = LoadDescriptor::NameRegister();
|
||||
RegList regs = receiver.bit() | name.bit();
|
||||
if (FLAG_vector_ics) {
|
||||
regs |= VectorLoadICTrampolineDescriptor::SlotRegister().bit();
|
||||
}
|
||||
RegList regs = receiver.bit() | name.bit() |
|
||||
VectorLoadICTrampolineDescriptor::SlotRegister().bit();
|
||||
Generate_DebugBreakCallHelper(masm, regs, 0);
|
||||
}
|
||||
|
||||
|
@ -1293,13 +1293,9 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) {
|
||||
Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
|
||||
__ Move(LoadDescriptor::NameRegister(), home_object_symbol);
|
||||
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
|
||||
CallLoadIC(NOT_CONTEXTUAL);
|
||||
} else {
|
||||
CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
|
||||
}
|
||||
|
||||
__ Cmpi(r3, Operand(isolate()->factory()->undefined_value()), r0);
|
||||
Label done;
|
||||
@ -1372,10 +1368,8 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
|
||||
|
||||
__ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||
}
|
||||
|
||||
ContextualMode mode =
|
||||
(typeof_state == INSIDE_TYPEOF) ? NOT_CONTEXTUAL : CONTEXTUAL;
|
||||
@ -1460,10 +1454,8 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
||||
Comment cmnt(masm_, "[ Global variable");
|
||||
__ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(var->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||
}
|
||||
CallGlobalLoadIC(var->name());
|
||||
context()->Plug(r3);
|
||||
break;
|
||||
@ -2155,10 +2147,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
||||
__ bind(&l_call);
|
||||
__ LoadP(load_receiver, MemOperand(sp, kPointerSize));
|
||||
__ LoadP(load_name, MemOperand(sp, 2 * kPointerSize));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
|
||||
}
|
||||
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
||||
CallIC(ic, TypeFeedbackId::None());
|
||||
__ mr(r4, r3);
|
||||
@ -2174,10 +2164,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
||||
|
||||
__ push(load_receiver); // save result
|
||||
__ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
|
||||
}
|
||||
CallLoadIC(NOT_CONTEXTUAL); // r0=result.done
|
||||
Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
||||
CallIC(bool_ic);
|
||||
@ -2187,10 +2175,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
||||
// result.value
|
||||
__ pop(load_receiver); // result
|
||||
__ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
|
||||
}
|
||||
CallLoadIC(NOT_CONTEXTUAL); // r3=result.value
|
||||
context()->DropAndPlug(2, r3); // drop iter and g
|
||||
break;
|
||||
@ -2346,13 +2332,9 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
||||
DCHECK(!prop->IsSuperAccess());
|
||||
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(key->value()));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
||||
CallLoadIC(NOT_CONTEXTUAL);
|
||||
} else {
|
||||
CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2371,13 +2353,9 @@ void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
|
||||
void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
||||
SetSourcePosition(prop->position());
|
||||
Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
|
||||
CallIC(ic);
|
||||
} else {
|
||||
CallIC(ic, prop->PropertyFeedbackId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -4646,13 +4624,9 @@ void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) {
|
||||
|
||||
// Load the function from the receiver.
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(expr->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
|
||||
CallLoadIC(NOT_CONTEXTUAL);
|
||||
} else {
|
||||
CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -5081,10 +5055,8 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
||||
Comment cmnt(masm_, "[ Global variable");
|
||||
__ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(proxy->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
__ mov(VectorLoadICDescriptor::SlotRegister(),
|
||||
Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
||||
}
|
||||
// Use a regular load, not a contextual load, to avoid a reference
|
||||
// error.
|
||||
CallLoadIC(NOT_CONTEXTUAL);
|
||||
|
@ -3047,7 +3047,6 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
||||
|
||||
template <class T>
|
||||
void LCodeGen::EmitVectorLoadICRegisters(T* instr) {
|
||||
DCHECK(FLAG_vector_ics);
|
||||
Register vector_register = ToRegister(instr->temp_vector());
|
||||
Register slot_register = VectorLoadICDescriptor::SlotRegister();
|
||||
DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister()));
|
||||
@ -3070,9 +3069,7 @@ void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) {
|
||||
DCHECK(ToRegister(instr->result()).is(r3));
|
||||
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(instr->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr);
|
||||
}
|
||||
ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL;
|
||||
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode,
|
||||
PREMONOMORPHIC).code();
|
||||
@ -3189,9 +3186,7 @@ void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
|
||||
|
||||
// Name is always in r5.
|
||||
__ mov(LoadDescriptor::NameRegister(), Operand(instr->name()));
|
||||
if (FLAG_vector_ics) {
|
||||
EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr);
|
||||
}
|
||||
Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(
|
||||
isolate(), NOT_CONTEXTUAL,
|
||||
instr->hydrogen()->initialization_state()).code();
|
||||
@ -4178,29 +4173,6 @@ void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) {
|
||||
}
|
||||
|
||||
|
||||
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()));
|
||||
DCHECK(receiver.is(r4));
|
||||
DCHECK(name.is(r5));
|
||||
Register scratch = r7;
|
||||
Register extra = r8;
|
||||
Register extra2 = r9;
|
||||
Register extra3 = r10;
|
||||
|
||||
// The probe will tail call to a handler if found.
|
||||
isolate()->stub_cache()->GenerateProbe(
|
||||
masm(), Code::LOAD_IC, instr->hydrogen()->flags(), false, receiver, name,
|
||||
scratch, extra, extra2, extra3);
|
||||
|
||||
// Tail call to miss if we ended up here.
|
||||
LoadIC::GenerateMiss(masm());
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) {
|
||||
DCHECK(ToRegister(instr->result()).is(r3));
|
||||
|
||||
|
@ -1111,20 +1111,6 @@ LInstruction* LChunkBuilder::DoCallWithDescriptor(HCallWithDescriptor* instr) {
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
|
||||
HTailCallThroughMegamorphicCache* instr) {
|
||||
LOperand* context = UseFixed(instr->context(), cp);
|
||||
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) {
|
||||
LOperand* context = UseFixed(instr->context(), cp);
|
||||
LOperand* function = UseFixed(instr->function(), r4);
|
||||
|
@ -154,7 +154,6 @@ class LCodeGen;
|
||||
V(SubI) \
|
||||
V(RSubI) \
|
||||
V(TaggedToI) \
|
||||
V(TailCallThroughMegamorphicCache) \
|
||||
V(ThisFunction) \
|
||||
V(ToFastProperties) \
|
||||
V(TransitionElementsKind) \
|
||||
@ -465,26 +464,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> {
|
||||
public:
|
||||
bool HasInterestingComment(LCodeGen* gen) const override { return false; }
|
||||
|
Loading…
Reference in New Issue
Block a user