Index: src/ic/handler-compiler.cc |
diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc |
index ab1c2e10cf78111a21c5e21a4fea83539b953673..db2e319b90f34afd445d39e17e12e673e279e923 100644 |
--- a/src/ic/handler-compiler.cc |
+++ b/src/ic/handler-compiler.cc |
@@ -129,13 +129,13 @@ Register NamedStoreHandlerCompiler::FrontendHeader(Register object_reg, |
Register PropertyHandlerCompiler::Frontend(Handle<Name> name) { |
Label miss; |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
PushVectorAndSlot(); |
} |
Register reg = FrontendHeader(receiver(), name, &miss, RETURN_HOLDER); |
FrontendFooter(name, &miss); |
// The footer consumes the vector and slot from the stack if miss occurs. |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
DiscardVectorAndSlot(); |
} |
return reg; |
@@ -209,12 +209,12 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(Handle<Name> name, |
Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent( |
Handle<Name> name) { |
Label miss; |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
DCHECK(kind() == Code::LOAD_IC); |
PushVectorAndSlot(); |
} |
NonexistentFrontendHeader(name, &miss, scratch2(), scratch3()); |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
DiscardVectorAndSlot(); |
} |
GenerateLoadConstant(isolate()->factory()->undefined_value()); |
@@ -247,7 +247,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback( |
void NamedLoadHandlerCompiler::InterceptorVectorSlotPush(Register holder_reg) { |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
if (holder_reg.is(receiver())) { |
PushVectorAndSlot(); |
} else { |
@@ -260,7 +260,7 @@ void NamedLoadHandlerCompiler::InterceptorVectorSlotPush(Register holder_reg) { |
void NamedLoadHandlerCompiler::InterceptorVectorSlotPop(Register holder_reg, |
PopMode mode) { |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
if (mode == DISCARD) { |
DiscardVectorAndSlot(); |
} else { |
@@ -438,16 +438,28 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( |
Handle<Map> transition, Handle<Name> name) { |
Label miss; |
- bool vector_and_slot_on_stack = |
- StoreTransitionDescriptor::PassVectorAndSlotOnStack(); |
- if (vector_and_slot_on_stack) { |
- // Speculatively prepare for calling StoreTransitionStub by converting |
- // StoreWithVectorDescriptor arguments to StoreTransitionDescriptor |
- // arguments. |
- PopReturnAddress(this->name()); |
- PushVectorAndSlot(); |
- PushReturnAddress(this->name()); |
- } else { |
+ // Ensure that the StoreTransitionStub we are going to call has the same |
+ // number of stack arguments. This means that we don't have to adapt them |
+ // if we decide to call the transition or miss stub. |
+ STATIC_ASSERT(StoreWithVectorDescriptor::kStackArgumentsCount == |
+ StoreTransitionDescriptor::kStackArgumentsCount); |
+ STATIC_ASSERT(StoreWithVectorDescriptor::kStackArgumentsCount == 0 || |
+ StoreWithVectorDescriptor::kStackArgumentsCount == 3); |
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount - |
+ StoreWithVectorDescriptor::kValue == |
+ StoreTransitionDescriptor::kParameterCount - |
+ StoreTransitionDescriptor::kValue); |
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount - |
+ StoreWithVectorDescriptor::kSlot == |
+ StoreTransitionDescriptor::kParameterCount - |
+ StoreTransitionDescriptor::kSlot); |
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount - |
+ StoreWithVectorDescriptor::kVector == |
+ StoreTransitionDescriptor::kParameterCount - |
+ StoreTransitionDescriptor::kVector); |
+ |
+ bool need_save_restore = IC::ShouldPushPopSlotAndVector(kind()); |
+ if (need_save_restore) { |
PushVectorAndSlot(); |
} |
@@ -487,7 +499,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( |
DCHECK(descriptors->GetValue(descriptor)->IsJSFunction()); |
GenerateRestoreMap(transition, map_reg, scratch1(), &miss); |
GenerateConstantCheck(map_reg, descriptor, value(), scratch1(), &miss); |
- if (!vector_and_slot_on_stack) { |
+ if (need_save_restore) { |
PopVectorAndSlot(); |
} |
GenerateRestoreName(name); |
@@ -504,7 +516,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( |
? StoreTransitionStub::ExtendStorageAndStoreMapAndValue |
: StoreTransitionStub::StoreMapAndValue; |
GenerateRestoreMap(transition, map_reg, scratch1(), &miss); |
- if (!vector_and_slot_on_stack) { |
+ if (need_save_restore) { |
PopVectorAndSlot(); |
} |
GenerateRestoreName(name); |
@@ -515,12 +527,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( |
} |
__ bind(&miss); |
- if (vector_and_slot_on_stack) { |
- // Prepare for calling miss builtin with StoreWithVectorDescriptor. |
- PopReturnAddress(this->name()); |
- PopVectorAndSlot(); |
- PushReturnAddress(this->name()); |
- } else { |
+ if (need_save_restore) { |
PopVectorAndSlot(); |
} |
GenerateRestoreName(name); |
@@ -542,7 +549,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupIterator* it) { |
FieldType* field_type = *it->GetFieldType(); |
bool need_save_restore = false; |
if (RequiresFieldTypeChecks(field_type)) { |
- need_save_restore = IC::ICUseVector(kind()); |
+ need_save_restore = IC::ShouldPushPopSlotAndVector(kind()); |
if (need_save_restore) PushVectorAndSlot(); |
GenerateFieldTypeChecks(field_type, value(), &miss); |
if (need_save_restore) PopVectorAndSlot(); |