| 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();
 | 
| 
 |