| Index: src/ic/ic.cc
 | 
| diff --git a/src/ic/ic.cc b/src/ic/ic.cc
 | 
| index 964f1d876d5ec9671e7f1e37a48e6f37f33e114a..7f87345901445b0dca0076f0f699cf8899277928 100644
 | 
| --- a/src/ic/ic.cc
 | 
| +++ b/src/ic/ic.cc
 | 
| @@ -117,13 +117,10 @@ void IC::TraceIC(const char* type, Handle<Object> name, State old_state,
 | 
|                                                stdout, true);
 | 
|      }
 | 
|  
 | 
| -    ExtraICState extra_state = new_target->extra_ic_state();
 | 
|      const char* modifier = "";
 | 
|      if (new_target->kind() == Code::KEYED_STORE_IC) {
 | 
|        KeyedAccessStoreMode mode =
 | 
| -          FLAG_vector_stores
 | 
| -              ? casted_nexus<KeyedStoreICNexus>()->GetKeyedAccessStoreMode()
 | 
| -              : KeyedStoreIC::GetKeyedAccessStoreMode(extra_state);
 | 
| +          casted_nexus<KeyedStoreICNexus>()->GetKeyedAccessStoreMode();
 | 
|        modifier = GetTransitionMarkModifier(mode);
 | 
|      }
 | 
|      PrintF(" (%c->%c%s) ", TransitionMarkFromState(old_state),
 | 
| @@ -470,13 +467,9 @@ void IC::Clear(Isolate* isolate, Address address, Address constant_pool) {
 | 
|    switch (target->kind()) {
 | 
|      case Code::LOAD_IC:
 | 
|      case Code::KEYED_LOAD_IC:
 | 
| -      return;
 | 
|      case Code::STORE_IC:
 | 
| -      if (FLAG_vector_stores) return;
 | 
| -      return StoreIC::Clear(isolate, address, target, constant_pool);
 | 
|      case Code::KEYED_STORE_IC:
 | 
| -      if (FLAG_vector_stores) return;
 | 
| -      return KeyedStoreIC::Clear(isolate, address, target, constant_pool);
 | 
| +      return;
 | 
|      case Code::COMPARE_IC:
 | 
|        return CompareIC::Clear(isolate, address, target, constant_pool);
 | 
|      case Code::COMPARE_NIL_IC:
 | 
| @@ -810,12 +803,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Code> code) {
 | 
|    if (number_of_valid_maps > 1 && target()->is_keyed_stub()) return false;
 | 
|    Handle<Code> ic;
 | 
|    if (number_of_valid_maps == 1) {
 | 
| -    if (UseVector()) {
 | 
| -      ConfigureVectorState(name, receiver_map(), code);
 | 
| -    } else {
 | 
| -      ic = PropertyICCompiler::ComputeMonomorphic(kind(), name, map, code,
 | 
| -                                                  extra_ic_state());
 | 
| -    }
 | 
| +    ConfigureVectorState(name, receiver_map(), code);
 | 
|    } else {
 | 
|      if (handler_to_overwrite >= 0) {
 | 
|        handlers.Set(handler_to_overwrite, code);
 | 
| @@ -827,13 +815,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Code> code) {
 | 
|        handlers.Add(code);
 | 
|      }
 | 
|  
 | 
| -    if (UseVector()) {
 | 
| -      ConfigureVectorState(name, &maps, &handlers);
 | 
| -    } else {
 | 
| -      ic = PropertyICCompiler::ComputePolymorphic(kind(), &maps, &handlers,
 | 
| -                                                  number_of_valid_maps, name,
 | 
| -                                                  extra_ic_state());
 | 
| -    }
 | 
| +    ConfigureVectorState(name, &maps, &handlers);
 | 
|    }
 | 
|  
 | 
|    if (!UseVector()) set_target(*ic);
 | 
| @@ -843,13 +825,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Code> code) {
 | 
|  
 | 
|  void IC::UpdateMonomorphicIC(Handle<Code> handler, Handle<Name> name) {
 | 
|    DCHECK(handler->is_handler());
 | 
| -  if (UseVector()) {
 | 
| -    ConfigureVectorState(name, receiver_map(), handler);
 | 
| -  } else {
 | 
| -    Handle<Code> ic = PropertyICCompiler::ComputeMonomorphic(
 | 
| -        kind(), name, receiver_map(), handler, extra_ic_state());
 | 
| -    set_target(*ic);
 | 
| -  }
 | 
| +  ConfigureVectorState(name, receiver_map(), handler);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -973,7 +949,7 @@ static Handle<Code> KeyedStoreICInitializeStubHelper(
 | 
|  Handle<Code> KeyedStoreIC::initialize_stub(Isolate* isolate,
 | 
|                                             LanguageMode language_mode,
 | 
|                                             State initialization_state) {
 | 
| -  if (FLAG_vector_stores && initialization_state != MEGAMORPHIC) {
 | 
| +  if (initialization_state != MEGAMORPHIC) {
 | 
|      VectorKeyedStoreICTrampolineStub stub(isolate, StoreICState(language_mode));
 | 
|      return stub.GetCode();
 | 
|    }
 | 
| @@ -985,7 +961,7 @@ Handle<Code> KeyedStoreIC::initialize_stub(Isolate* isolate,
 | 
|  
 | 
|  Handle<Code> KeyedStoreIC::initialize_stub_in_optimized_code(
 | 
|      Isolate* isolate, LanguageMode language_mode, State initialization_state) {
 | 
| -  if (FLAG_vector_stores && initialization_state != MEGAMORPHIC) {
 | 
| +  if (initialization_state != MEGAMORPHIC) {
 | 
|      VectorKeyedStoreICStub stub(isolate, StoreICState(language_mode));
 | 
|      return stub.GetCode();
 | 
|    }
 | 
| @@ -1620,13 +1596,8 @@ Handle<Code> StoreIC::initialize_stub(Isolate* isolate,
 | 
|    DCHECK(initialization_state == UNINITIALIZED ||
 | 
|           initialization_state == PREMONOMORPHIC ||
 | 
|           initialization_state == MEGAMORPHIC);
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    VectorStoreICTrampolineStub stub(isolate, StoreICState(language_mode));
 | 
| -    return stub.GetCode();
 | 
| -  }
 | 
| -
 | 
| -  return StoreICInitializeStubHelper(
 | 
| -      isolate, ComputeExtraICState(language_mode), initialization_state);
 | 
| +  VectorStoreICTrampolineStub stub(isolate, StoreICState(language_mode));
 | 
| +  return stub.GetCode();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1635,7 +1606,7 @@ Handle<Code> StoreIC::initialize_stub_in_optimized_code(
 | 
|    DCHECK(initialization_state == UNINITIALIZED ||
 | 
|           initialization_state == PREMONOMORPHIC ||
 | 
|           initialization_state == MEGAMORPHIC);
 | 
| -  if (FLAG_vector_stores && initialization_state != MEGAMORPHIC) {
 | 
| +  if (initialization_state != MEGAMORPHIC) {
 | 
|      VectorStoreICStub stub(isolate, StoreICState(language_mode));
 | 
|      return stub.GetCode();
 | 
|    }
 | 
| @@ -1682,11 +1653,7 @@ void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value,
 | 
|    if (state() == UNINITIALIZED) {
 | 
|      // This is the first time we execute this inline cache. Set the target to
 | 
|      // the pre monomorphic stub to delay setting the monomorphic state.
 | 
| -    if (FLAG_vector_stores) {
 | 
| -      ConfigureVectorState(PREMONOMORPHIC);
 | 
| -    } else {
 | 
| -      set_target(*pre_monomorphic_stub());
 | 
| -    }
 | 
| +    ConfigureVectorState(PREMONOMORPHIC);
 | 
|      TRACE_IC("StoreIC", lookup->name());
 | 
|      return;
 | 
|    }
 | 
| @@ -1882,25 +1849,18 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
 | 
|      Handle<Map> monomorphic_map =
 | 
|          ComputeTransitionedMap(receiver_map, store_mode);
 | 
|      store_mode = GetNonTransitioningStoreMode(store_mode);
 | 
| -    if (FLAG_vector_stores) {
 | 
| -      Handle<Code> handler =
 | 
| -          PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| -              monomorphic_map, language_mode(), store_mode);
 | 
| -      ConfigureVectorState(Handle<Name>::null(), monomorphic_map, handler);
 | 
| -      return null_handle;
 | 
| -    }
 | 
| -    return PropertyICCompiler::ComputeKeyedStoreMonomorphic(
 | 
| -        monomorphic_map, language_mode(), store_mode);
 | 
| +    Handle<Code> handler =
 | 
| +        PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| +            monomorphic_map, language_mode(), store_mode);
 | 
| +    ConfigureVectorState(Handle<Name>::null(), monomorphic_map, handler);
 | 
| +    return null_handle;
 | 
|    }
 | 
|  
 | 
|    // There are several special cases where an IC that is MONOMORPHIC can still
 | 
|    // transition to a different GetNonTransitioningStoreMode IC that handles a
 | 
|    // superset of the original IC. Handle those here if the receiver map hasn't
 | 
|    // changed or it has transitioned to a more general kind.
 | 
| -  KeyedAccessStoreMode old_store_mode =
 | 
| -      FLAG_vector_stores
 | 
| -          ? GetKeyedAccessStoreMode()
 | 
| -          : KeyedStoreIC::GetKeyedAccessStoreMode(target()->extra_ic_state());
 | 
| +  KeyedAccessStoreMode old_store_mode = GetKeyedAccessStoreMode();
 | 
|    Handle<Map> previous_receiver_map = target_receiver_maps.at(0);
 | 
|    if (state() == MONOMORPHIC) {
 | 
|      Handle<Map> transitioned_receiver_map = receiver_map;
 | 
| @@ -1916,16 +1876,12 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
 | 
|        // if they at least come from the same origin for a transitioning store,
 | 
|        // stay MONOMORPHIC and use the map for the most generic ElementsKind.
 | 
|        store_mode = GetNonTransitioningStoreMode(store_mode);
 | 
| -      if (FLAG_vector_stores) {
 | 
| -        Handle<Code> handler =
 | 
| -            PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| -                transitioned_receiver_map, language_mode(), store_mode);
 | 
| -        ConfigureVectorState(Handle<Name>::null(), transitioned_receiver_map,
 | 
| -                             handler);
 | 
| -        return null_handle;
 | 
| -      }
 | 
| -      return PropertyICCompiler::ComputeKeyedStoreMonomorphic(
 | 
| -          transitioned_receiver_map, language_mode(), store_mode);
 | 
| +      Handle<Code> handler =
 | 
| +          PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| +              transitioned_receiver_map, language_mode(), store_mode);
 | 
| +      ConfigureVectorState(Handle<Name>::null(), transitioned_receiver_map,
 | 
| +                           handler);
 | 
| +      return null_handle;
 | 
|      } else if (receiver_map.is_identical_to(previous_receiver_map) &&
 | 
|                 old_store_mode == STANDARD_STORE &&
 | 
|                 (store_mode == STORE_AND_GROW_NO_TRANSITION ||
 | 
| @@ -1934,15 +1890,11 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
 | 
|        // A "normal" IC that handles stores can switch to a version that can
 | 
|        // grow at the end of the array, handle OOB accesses or copy COW arrays
 | 
|        // and still stay MONOMORPHIC.
 | 
| -      if (FLAG_vector_stores) {
 | 
| -        Handle<Code> handler =
 | 
| -            PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| -                receiver_map, language_mode(), store_mode);
 | 
| -        ConfigureVectorState(Handle<Name>::null(), receiver_map, handler);
 | 
| -        return null_handle;
 | 
| -      }
 | 
| -      return PropertyICCompiler::ComputeKeyedStoreMonomorphic(
 | 
| -          receiver_map, language_mode(), store_mode);
 | 
| +      Handle<Code> handler =
 | 
| +          PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
 | 
| +              receiver_map, language_mode(), store_mode);
 | 
| +      ConfigureVectorState(Handle<Name>::null(), receiver_map, handler);
 | 
| +      return null_handle;
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -2001,18 +1953,13 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    MapHandleList transitioned_maps(target_receiver_maps.length());
 | 
| -    CodeHandleList handlers(target_receiver_maps.length());
 | 
| -    PropertyICCompiler::ComputeKeyedStorePolymorphicHandlers(
 | 
| -        &target_receiver_maps, &transitioned_maps, &handlers, store_mode,
 | 
| -        language_mode());
 | 
| -    ConfigureVectorState(&target_receiver_maps, &transitioned_maps, &handlers);
 | 
| -    return null_handle;
 | 
| -  }
 | 
| -
 | 
| -  return PropertyICCompiler::ComputeKeyedStorePolymorphic(
 | 
| -      &target_receiver_maps, store_mode, language_mode());
 | 
| +  MapHandleList transitioned_maps(target_receiver_maps.length());
 | 
| +  CodeHandleList handlers(target_receiver_maps.length());
 | 
| +  PropertyICCompiler::ComputeKeyedStorePolymorphicHandlers(
 | 
| +      &target_receiver_maps, &transitioned_maps, &handlers, store_mode,
 | 
| +      language_mode());
 | 
| +  ConfigureVectorState(&target_receiver_maps, &transitioned_maps, &handlers);
 | 
| +  return null_handle;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2106,44 +2053,6 @@ static KeyedAccessStoreMode GetStoreMode(Handle<JSObject> receiver,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void KeyedStoreIC::ValidateStoreMode(Handle<Code> stub) {
 | 
| -#ifdef DEBUG
 | 
| -  DCHECK(!FLAG_vector_stores);
 | 
| -  if (stub.is_null() || *stub == *megamorphic_stub() || *stub == *slow_stub()) {
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Query the keyed store mode.
 | 
| -  ExtraICState state = stub->extra_ic_state();
 | 
| -  KeyedAccessStoreMode stub_mode = GetKeyedAccessStoreMode(state);
 | 
| -
 | 
| -  MapHandleList map_list;
 | 
| -  stub->FindAllMaps(&map_list);
 | 
| -  CodeHandleList list;
 | 
| -  stub->FindHandlers(&list, map_list.length());
 | 
| -  for (int i = 0; i < list.length(); i++) {
 | 
| -    Handle<Code> handler = list.at(i);
 | 
| -    CHECK(handler->is_handler());
 | 
| -    CodeStub::Major major_key = CodeStub::MajorKeyFromKey(handler->stub_key());
 | 
| -    uint32_t minor_key = CodeStub::MinorKeyFromKey(handler->stub_key());
 | 
| -    // Ensure that we only see handlers we know have the store mode embedded.
 | 
| -    CHECK(major_key == CodeStub::KeyedStoreSloppyArguments ||
 | 
| -          major_key == CodeStub::StoreFastElement ||
 | 
| -          major_key == CodeStub::StoreElement ||
 | 
| -          major_key == CodeStub::ElementsTransitionAndStore ||
 | 
| -          *handler == *isolate()->builtins()->KeyedStoreIC_Slow());
 | 
| -    // Ensure that the store mode matches that of the IC.
 | 
| -    CHECK(major_key == CodeStub::NoCache ||
 | 
| -          stub_mode == CommonStoreModeBits::decode(minor_key));
 | 
| -    // The one exception is the keyed store slow builtin, which doesn't include
 | 
| -    // store mode.
 | 
| -    CHECK(major_key != CodeStub::NoCache ||
 | 
| -          *handler == *isolate()->builtins()->KeyedStoreIC_Slow());
 | 
| -  }
 | 
| -#endif  // DEBUG
 | 
| -}
 | 
| -
 | 
| -
 | 
|  MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
 | 
|                                          Handle<Object> key,
 | 
|                                          Handle<Object> value) {
 | 
| @@ -2174,20 +2083,11 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
 | 
|          StoreIC::Store(object, Handle<Name>::cast(key), value,
 | 
|                         JSReceiver::MAY_BE_STORE_FROM_KEYED),
 | 
|          Object);
 | 
| -    if (FLAG_vector_stores) {
 | 
| -      if (!is_vector_set()) {
 | 
| -        ConfigureVectorState(MEGAMORPHIC);
 | 
| -        TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
| -                         "unhandled internalized string key");
 | 
| -        TRACE_IC("StoreIC", key);
 | 
| -      }
 | 
| -    } else {
 | 
| -      if (!is_target_set()) {
 | 
| -        TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
| -                         "unhandled internalized string key");
 | 
| -        TRACE_IC("StoreIC", key);
 | 
| -        set_target(*stub);
 | 
| -      }
 | 
| +    if (!is_vector_set()) {
 | 
| +      ConfigureVectorState(MEGAMORPHIC);
 | 
| +      TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
| +                       "unhandled internalized string key");
 | 
| +      TRACE_IC("StoreIC", key);
 | 
|      }
 | 
|      return store_handle;
 | 
|    }
 | 
| @@ -2244,10 +2144,6 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
 | 
|          // from fast path keyed stores.
 | 
|          if (!old_receiver_map->DictionaryElementsInPrototypeChainOnly()) {
 | 
|            stub = StoreElementStub(old_receiver_map, store_mode);
 | 
| -
 | 
| -          // Validate that the store_mode in the stub can also be derived
 | 
| -          // from peeking in the code bits of the handlers.
 | 
| -          if (!FLAG_vector_stores) ValidateStoreMode(stub);
 | 
|          } else {
 | 
|            TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
|                             "dictionary or proxy prototype");
 | 
| @@ -2260,27 +2156,12 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    if (!is_vector_set() || stub.is_null()) {
 | 
| -      Code* megamorphic = *megamorphic_stub();
 | 
| -      if (!stub.is_null() && (*stub == megamorphic || *stub == *slow_stub())) {
 | 
| -        ConfigureVectorState(MEGAMORPHIC);
 | 
| -        TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
| -                         *stub == megamorphic ? "set generic" : "slow stub");
 | 
| -      }
 | 
| -    }
 | 
| -  } else {
 | 
| -    DCHECK(!is_target_set());
 | 
| +  if (!is_vector_set() || stub.is_null()) {
 | 
|      Code* megamorphic = *megamorphic_stub();
 | 
| -    if (*stub == megamorphic) {
 | 
| -      TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic");
 | 
| -    } else if (*stub == *slow_stub()) {
 | 
| -      TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "slow stub");
 | 
| -    }
 | 
| -
 | 
| -    DCHECK(!stub.is_null());
 | 
| -    if (!AddressIsDeoptimizedCode()) {
 | 
| -      set_target(*stub);
 | 
| +    if (!stub.is_null() && (*stub == megamorphic || *stub == *slow_stub())) {
 | 
| +      ConfigureVectorState(MEGAMORPHIC);
 | 
| +      TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
 | 
| +                       *stub == megamorphic ? "set generic" : "slow stub");
 | 
|      }
 | 
|    }
 | 
|    TRACE_IC("StoreIC", key);
 | 
| @@ -2436,29 +2317,21 @@ RUNTIME_FUNCTION(Runtime_StoreIC_Miss) {
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    Handle<Object> result;
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    DCHECK(args.length() == 5 || args.length() == 6);
 | 
| -    Handle<Smi> slot = args.at<Smi>(3);
 | 
| -    Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| -    FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| -    if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
 | 
| -      StoreICNexus nexus(vector, vector_slot);
 | 
| -      StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| -      ic.UpdateState(receiver, key);
 | 
| -      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                         ic.Store(receiver, key, value));
 | 
| -    } else {
 | 
| -      DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
 | 
| -                vector->GetKind(vector_slot));
 | 
| -      KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| -      KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| -      ic.UpdateState(receiver, key);
 | 
| -      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                         ic.Store(receiver, key, value));
 | 
| -    }
 | 
| +  DCHECK(args.length() == 5 || args.length() == 6);
 | 
| +  Handle<Smi> slot = args.at<Smi>(3);
 | 
| +  Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| +  FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| +  if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
 | 
| +    StoreICNexus nexus(vector, vector_slot);
 | 
| +    StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| +    ic.UpdateState(receiver, key);
 | 
| +    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| +                                       ic.Store(receiver, key, value));
 | 
|    } else {
 | 
| -    DCHECK(args.length() == 3);
 | 
| -    StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
 | 
| +    DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
 | 
| +              vector->GetKind(vector_slot));
 | 
| +    KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| +    KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
|      ic.UpdateState(receiver, key);
 | 
|      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
|                                         ic.Store(receiver, key, value));
 | 
| @@ -2475,49 +2348,41 @@ RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) {
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    Handle<Object> result;
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    int length = args.length();
 | 
| -    DCHECK(length == 5 || length == 6);
 | 
| -    // We might have slot and vector, for a normal miss (slot(3), vector(4)).
 | 
| -    // Or, map and vector for a transitioning store miss (map(3), vector(4)).
 | 
| -    // In this case, we need to recover the slot from a virtual register.
 | 
| -    // If length == 6, then a map is included (map(3), slot(4), vector(5)).
 | 
| -    Handle<Smi> slot;
 | 
| -    Handle<TypeFeedbackVector> vector;
 | 
| -    if (length == 5) {
 | 
| -      if (args.at<Object>(3)->IsMap()) {
 | 
| -        vector = args.at<TypeFeedbackVector>(4);
 | 
| -        slot = handle(
 | 
| -            *reinterpret_cast<Smi**>(isolate->virtual_slot_register_address()),
 | 
| -            isolate);
 | 
| -      } else {
 | 
| -        vector = args.at<TypeFeedbackVector>(4);
 | 
| -        slot = args.at<Smi>(3);
 | 
| -      }
 | 
| +  int length = args.length();
 | 
| +  DCHECK(length == 5 || length == 6);
 | 
| +  // We might have slot and vector, for a normal miss (slot(3), vector(4)).
 | 
| +  // Or, map and vector for a transitioning store miss (map(3), vector(4)).
 | 
| +  // In this case, we need to recover the slot from a virtual register.
 | 
| +  // If length == 6, then a map is included (map(3), slot(4), vector(5)).
 | 
| +  Handle<Smi> slot;
 | 
| +  Handle<TypeFeedbackVector> vector;
 | 
| +  if (length == 5) {
 | 
| +    if (args.at<Object>(3)->IsMap()) {
 | 
| +      vector = args.at<TypeFeedbackVector>(4);
 | 
| +      slot = handle(
 | 
| +          *reinterpret_cast<Smi**>(isolate->virtual_slot_register_address()),
 | 
| +          isolate);
 | 
|      } else {
 | 
| -      vector = args.at<TypeFeedbackVector>(5);
 | 
| -      slot = args.at<Smi>(4);
 | 
| +      vector = args.at<TypeFeedbackVector>(4);
 | 
| +      slot = args.at<Smi>(3);
 | 
|      }
 | 
| +  } else {
 | 
| +    vector = args.at<TypeFeedbackVector>(5);
 | 
| +    slot = args.at<Smi>(4);
 | 
| +  }
 | 
|  
 | 
| -    FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| -    if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
 | 
| -      StoreICNexus nexus(vector, vector_slot);
 | 
| -      StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| -      ic.UpdateState(receiver, key);
 | 
| -      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                         ic.Store(receiver, key, value));
 | 
| -    } else {
 | 
| -      DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
 | 
| -                vector->GetKind(vector_slot));
 | 
| -      KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| -      KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| -      ic.UpdateState(receiver, key);
 | 
| -      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                         ic.Store(receiver, key, value));
 | 
| -    }
 | 
| +  FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| +  if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
 | 
| +    StoreICNexus nexus(vector, vector_slot);
 | 
| +    StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| +    ic.UpdateState(receiver, key);
 | 
| +    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| +                                       ic.Store(receiver, key, value));
 | 
|    } else {
 | 
| -    DCHECK(args.length() == 3 || args.length() == 4);
 | 
| -    StoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
 | 
| +    DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
 | 
| +              vector->GetKind(vector_slot));
 | 
| +    KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| +    KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
|      ic.UpdateState(receiver, key);
 | 
|      ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
|                                         ic.Store(receiver, key, value));
 | 
| @@ -2535,23 +2400,15 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) {
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    Handle<Object> result;
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    DCHECK(args.length() == 5);
 | 
| -    Handle<Smi> slot = args.at<Smi>(3);
 | 
| -    Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| -    FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| -    KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| -    KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| -    ic.UpdateState(receiver, key);
 | 
| -    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                       ic.Store(receiver, key, value));
 | 
| -  } else {
 | 
| -    DCHECK(args.length() == 3);
 | 
| -    KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
 | 
| -    ic.UpdateState(receiver, key);
 | 
| -    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                       ic.Store(receiver, key, value));
 | 
| -  }
 | 
| +  DCHECK(args.length() == 5);
 | 
| +  Handle<Smi> slot = args.at<Smi>(3);
 | 
| +  Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| +  FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| +  KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| +  KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| +  ic.UpdateState(receiver, key);
 | 
| +  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| +                                     ic.Store(receiver, key, value));
 | 
|    return *result;
 | 
|  }
 | 
|  
 | 
| @@ -2564,42 +2421,29 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) {
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    Handle<Object> result;
 | 
|  
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    DCHECK(args.length() == 5);
 | 
| -    Handle<Smi> slot = args.at<Smi>(3);
 | 
| -    Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| -    FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| -    KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| -    KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| -    ic.UpdateState(receiver, key);
 | 
| -    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| -                                       ic.Store(receiver, key, value));
 | 
| -  } else {
 | 
| -    DCHECK(args.length() == 3);
 | 
| -    KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
 | 
| -    ic.UpdateState(receiver, key);
 | 
| -    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
 | 
| -        isolate, result, ic.Store(receiver, key, args.at<Object>(2)));
 | 
| -  }
 | 
| +  DCHECK(args.length() == 5);
 | 
| +  Handle<Smi> slot = args.at<Smi>(3);
 | 
| +  Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
 | 
| +  FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
 | 
| +  KeyedStoreICNexus nexus(vector, vector_slot);
 | 
| +  KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| +  ic.UpdateState(receiver, key);
 | 
| +  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
 | 
| +                                     ic.Store(receiver, key, value));
 | 
|    return *result;
 | 
|  }
 | 
|  
 | 
|  
 | 
|  RUNTIME_FUNCTION(Runtime_StoreIC_Slow) {
 | 
|    HandleScope scope(isolate);
 | 
| -  DCHECK(args.length() == (FLAG_vector_stores ? 5 : 3));
 | 
| +  DCHECK(args.length() == 5);
 | 
|    Handle<Object> object = args.at<Object>(0);
 | 
|    Handle<Object> key = args.at<Object>(1);
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    LanguageMode language_mode;
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    StoreICNexus nexus(isolate);
 | 
| -    StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  } else {
 | 
| -    StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  }
 | 
| +  StoreICNexus nexus(isolate);
 | 
| +  StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| +  language_mode = ic.language_mode();
 | 
|    Handle<Object> result;
 | 
|    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
 | 
|        isolate, result,
 | 
| @@ -2610,19 +2454,14 @@ RUNTIME_FUNCTION(Runtime_StoreIC_Slow) {
 | 
|  
 | 
|  RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) {
 | 
|    HandleScope scope(isolate);
 | 
| -  DCHECK(args.length() == (FLAG_vector_stores ? 5 : 3));
 | 
| +  DCHECK(args.length() == 5);
 | 
|    Handle<Object> object = args.at<Object>(0);
 | 
|    Handle<Object> key = args.at<Object>(1);
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    LanguageMode language_mode;
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    KeyedStoreICNexus nexus(isolate);
 | 
| -    KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  } else {
 | 
| -    KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  }
 | 
| +  KeyedStoreICNexus nexus(isolate);
 | 
| +  KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
 | 
| +  language_mode = ic.language_mode();
 | 
|    Handle<Object> result;
 | 
|    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
 | 
|        isolate, result,
 | 
| @@ -2634,23 +2473,17 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) {
 | 
|  RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) {
 | 
|    TimerEventScope<TimerEventIcMiss> timer(isolate);
 | 
|    HandleScope scope(isolate);
 | 
| -  // Without vector stores, length == 4.
 | 
| -  // With vector stores, length == 5 or 6, depending on whether the vector slot
 | 
| +  // Length == 5 or 6, depending on whether the vector slot
 | 
|    // is passed in a virtual register or not.
 | 
| -  DCHECK(!FLAG_vector_stores || args.length() == 5 || args.length() == 6);
 | 
| +  DCHECK(args.length() == 5 || args.length() == 6);
 | 
|    Handle<Object> object = args.at<Object>(0);
 | 
|    Handle<Object> key = args.at<Object>(1);
 | 
|    Handle<Object> value = args.at<Object>(2);
 | 
|    Handle<Map> map = args.at<Map>(3);
 | 
|    LanguageMode language_mode;
 | 
| -  if (FLAG_vector_stores) {
 | 
| -    KeyedStoreICNexus nexus(isolate);
 | 
| -    KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  } else {
 | 
| -    KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
 | 
| -    language_mode = ic.language_mode();
 | 
| -  }
 | 
| +  KeyedStoreICNexus nexus(isolate);
 | 
| +  KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
 | 
| +  language_mode = ic.language_mode();
 | 
|    if (object->IsJSObject()) {
 | 
|      JSObject::TransitionElementsKind(Handle<JSObject>::cast(object),
 | 
|                                       map->elements_kind());
 | 
| 
 |