[ic] Reorder parameters of StoreIC_Miss and KeyedStoreIC_Miss runtime functions.
This will allow to simplify the miss part of store IC handlers when we decide to pass value/slot/vector on the stack. BUG=v8:5407 Review-Url: https://codereview.chromium.org/2351643005 Cr-Commit-Position: refs/heads/master@{#39549}
This commit is contained in:
parent
0f0912dd23
commit
05eb56798e
@ -120,8 +120,8 @@ void Builtins::Generate_StoreIC_Miss(CodeStubAssembler* assembler) {
|
||||
Node* vector = assembler->Parameter(Descriptor::kVector);
|
||||
Node* context = assembler->Parameter(Descriptor::kContext);
|
||||
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, receiver, name,
|
||||
value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
|
||||
vector, receiver, name);
|
||||
}
|
||||
|
||||
void Builtins::Generate_StoreIC_Normal(MacroAssembler* masm) {
|
||||
|
@ -552,8 +552,8 @@ void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
||||
assembler->Bind(&miss);
|
||||
{
|
||||
assembler->Comment("Miss");
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, receiver,
|
||||
name, value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
|
||||
vector, receiver, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4566,8 +4566,8 @@ void StoreFieldStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
||||
assembler->Bind(&miss);
|
||||
{
|
||||
assembler->Comment("Miss");
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, receiver,
|
||||
name, value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
|
||||
vector, receiver, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4662,8 +4662,8 @@ void StoreGlobalStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
||||
assembler->Bind(&miss);
|
||||
{
|
||||
assembler->Comment("Miss");
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, receiver, name,
|
||||
value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
|
||||
vector, receiver, name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4711,8 +4711,8 @@ void KeyedStoreSloppyArgumentsStub::GenerateAssembly(
|
||||
assembler->Bind(&miss);
|
||||
{
|
||||
assembler->Comment("Miss");
|
||||
assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, receiver,
|
||||
key, value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value,
|
||||
slot, vector, receiver, key);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5788,8 +5788,8 @@ void StoreFastElementStub::GenerateAssembly(
|
||||
assembler->Bind(&miss);
|
||||
{
|
||||
assembler->Comment("Miss");
|
||||
assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, receiver,
|
||||
key, value, slot, vector);
|
||||
assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value,
|
||||
slot, vector, receiver, key);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -441,10 +441,11 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
|
||||
|
@ -445,10 +445,11 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
|
||||
|
@ -711,12 +711,12 @@ static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
Register slot = StoreWithVectorDescriptor::SlotRegister();
|
||||
Register vector = StoreWithVectorDescriptor::VectorRegister();
|
||||
|
||||
__ xchg(receiver, Operand(esp, 0));
|
||||
__ push(name);
|
||||
__ push(value);
|
||||
__ xchg(value, Operand(esp, 0));
|
||||
__ push(slot);
|
||||
__ push(vector);
|
||||
__ push(receiver); // Contains the return address.
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(value); // Contains the return address.
|
||||
}
|
||||
|
||||
|
||||
|
27
src/ic/ic.cc
27
src/ic/ic.cc
@ -2404,11 +2404,11 @@ RUNTIME_FUNCTION(Runtime_StoreIC_Miss) {
|
||||
HandleScope scope(isolate);
|
||||
DCHECK_EQ(5, args.length());
|
||||
// Runtime functions don't follow the IC's calling convention.
|
||||
Handle<Object> receiver = args.at<Object>(0);
|
||||
Handle<Name> key = args.at<Name>(1);
|
||||
Handle<Object> value = args.at<Object>(2);
|
||||
Handle<Smi> slot = args.at<Smi>(3);
|
||||
Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
|
||||
Handle<Object> value = args.at<Object>(0);
|
||||
Handle<Smi> slot = args.at<Smi>(1);
|
||||
Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(2);
|
||||
Handle<Object> receiver = args.at<Object>(3);
|
||||
Handle<Name> key = args.at<Name>(4);
|
||||
FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
|
||||
if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
|
||||
StoreICNexus nexus(vector, vector_slot);
|
||||
@ -2460,11 +2460,11 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) {
|
||||
HandleScope scope(isolate);
|
||||
DCHECK_EQ(5, args.length());
|
||||
// Runtime functions don't follow the IC's calling convention.
|
||||
Handle<Object> receiver = args.at<Object>(0);
|
||||
Handle<Object> key = args.at<Object>(1);
|
||||
Handle<Object> value = args.at<Object>(2);
|
||||
Handle<Smi> slot = args.at<Smi>(3);
|
||||
Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
|
||||
Handle<Object> value = args.at<Object>(0);
|
||||
Handle<Smi> slot = args.at<Smi>(1);
|
||||
Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(2);
|
||||
Handle<Object> receiver = args.at<Object>(3);
|
||||
Handle<Object> key = args.at<Object>(4);
|
||||
FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
|
||||
KeyedStoreICNexus nexus(vector, vector_slot);
|
||||
KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
|
||||
@ -2496,9 +2496,10 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) {
|
||||
HandleScope scope(isolate);
|
||||
DCHECK_EQ(5, args.length());
|
||||
// Runtime functions don't follow the IC's calling convention.
|
||||
Handle<Object> object = args.at<Object>(0);
|
||||
Handle<Object> key = args.at<Object>(1);
|
||||
Handle<Object> value = args.at<Object>(2);
|
||||
Handle<Object> value = args.at<Object>(0);
|
||||
// slot and vector parameters are not used.
|
||||
Handle<Object> object = args.at<Object>(3);
|
||||
Handle<Object> key = args.at<Object>(4);
|
||||
LanguageMode language_mode;
|
||||
KeyedStoreICNexus nexus(isolate);
|
||||
KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
|
||||
|
@ -710,10 +710,11 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm,
|
||||
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
|
||||
|
@ -714,10 +714,11 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm,
|
||||
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
|
||||
|
@ -451,10 +451,11 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
|
||||
|
@ -437,10 +437,11 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
|
||||
StoreDescriptor::ValueRegister(),
|
||||
__ Push(StoreWithVectorDescriptor::ValueRegister(),
|
||||
StoreWithVectorDescriptor::SlotRegister(),
|
||||
StoreWithVectorDescriptor::VectorRegister());
|
||||
StoreWithVectorDescriptor::VectorRegister(),
|
||||
StoreWithVectorDescriptor::ReceiverRegister(),
|
||||
StoreWithVectorDescriptor::NameRegister());
|
||||
}
|
||||
|
||||
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
|
||||
|
@ -706,21 +706,20 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
Register receiver = StoreDescriptor::ReceiverRegister();
|
||||
Register name = StoreDescriptor::NameRegister();
|
||||
Register value = StoreDescriptor::ValueRegister();
|
||||
Register temp = r11;
|
||||
DCHECK(!temp.is(receiver) && !temp.is(name) && !temp.is(value));
|
||||
|
||||
__ PopReturnAddressTo(temp);
|
||||
__ Push(receiver);
|
||||
__ Push(name);
|
||||
__ Push(value);
|
||||
Register receiver = StoreWithVectorDescriptor::ReceiverRegister();
|
||||
Register name = StoreWithVectorDescriptor::NameRegister();
|
||||
Register value = StoreWithVectorDescriptor::ValueRegister();
|
||||
Register slot = StoreWithVectorDescriptor::SlotRegister();
|
||||
Register vector = StoreWithVectorDescriptor::VectorRegister();
|
||||
DCHECK(!temp.is(slot) && !temp.is(vector));
|
||||
Register temp = r11;
|
||||
DCHECK(!AreAliased(receiver, name, value, slot, vector, temp));
|
||||
|
||||
__ PopReturnAddressTo(temp);
|
||||
__ Push(value);
|
||||
__ Push(slot);
|
||||
__ Push(vector);
|
||||
__ Push(receiver);
|
||||
__ Push(name);
|
||||
__ PushReturnAddressFrom(temp);
|
||||
}
|
||||
|
||||
|
@ -711,12 +711,12 @@ static void StoreIC_PushArgs(MacroAssembler* masm) {
|
||||
Register slot = StoreWithVectorDescriptor::SlotRegister();
|
||||
Register vector = StoreWithVectorDescriptor::VectorRegister();
|
||||
|
||||
__ xchg(receiver, Operand(esp, 0));
|
||||
__ push(name);
|
||||
__ push(value);
|
||||
__ xchg(value, Operand(esp, 0));
|
||||
__ push(slot);
|
||||
__ push(vector);
|
||||
__ push(receiver); // Contains the return address.
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(value); // Contains the return address.
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user