| Index: src/code-stub-assembler.cc
 | 
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
 | 
| index 4e1c4a44f701bc3e879f1788334428e5a578402d..b0087154b4360f1eafb08de2bf7a640ef368109b 100644
 | 
| --- a/src/code-stub-assembler.cc
 | 
| +++ b/src/code-stub-assembler.cc
 | 
| @@ -4104,23 +4104,23 @@ compiler::Node* CodeStubAssembler::LoadReceiverMap(compiler::Node* receiver) {
 | 
|  }
 | 
|  
 | 
|  compiler::Node* CodeStubAssembler::TryMonomorphicCase(
 | 
| -    const LoadICParameters* p, compiler::Node* receiver_map, Label* if_handler,
 | 
| -    Variable* var_handler, Label* if_miss) {
 | 
| +    compiler::Node* slot, compiler::Node* vector, compiler::Node* receiver_map,
 | 
| +    Label* if_handler, Variable* var_handler, Label* if_miss) {
 | 
|    DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
 | 
|  
 | 
|    // TODO(ishell): add helper class that hides offset computations for a series
 | 
|    // of loads.
 | 
|    int32_t header_size = FixedArray::kHeaderSize - kHeapObjectTag;
 | 
| -  Node* offset = ElementOffsetFromIndex(p->slot, FAST_HOLEY_ELEMENTS,
 | 
| +  Node* offset = ElementOffsetFromIndex(slot, FAST_HOLEY_ELEMENTS,
 | 
|                                          SMI_PARAMETERS, header_size);
 | 
| -  Node* feedback = Load(MachineType::AnyTagged(), p->vector, offset);
 | 
| +  Node* feedback = Load(MachineType::AnyTagged(), vector, offset);
 | 
|  
 | 
|    // Try to quickly handle the monomorphic case without knowing for sure
 | 
|    // if we have a weak cell in feedback. We do know it's safe to look
 | 
|    // at WeakCell::kValueOffset.
 | 
|    GotoUnless(WordEqual(receiver_map, LoadWeakCellValue(feedback)), if_miss);
 | 
|  
 | 
| -  Node* handler = Load(MachineType::AnyTagged(), p->vector,
 | 
| +  Node* handler = Load(MachineType::AnyTagged(), vector,
 | 
|                         IntPtrAdd(offset, IntPtrConstant(kPointerSize)));
 | 
|  
 | 
|    var_handler->Bind(handler);
 | 
| @@ -4129,9 +4129,8 @@ compiler::Node* CodeStubAssembler::TryMonomorphicCase(
 | 
|  }
 | 
|  
 | 
|  void CodeStubAssembler::HandlePolymorphicCase(
 | 
| -    const LoadICParameters* p, compiler::Node* receiver_map,
 | 
| -    compiler::Node* feedback, Label* if_handler, Variable* var_handler,
 | 
| -    Label* if_miss, int unroll_count) {
 | 
| +    compiler::Node* receiver_map, compiler::Node* feedback, Label* if_handler,
 | 
| +    Variable* var_handler, Label* if_miss, int unroll_count) {
 | 
|    DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
 | 
|  
 | 
|    // Iterate {feedback} array.
 | 
| @@ -4664,8 +4663,9 @@ void CodeStubAssembler::LoadIC(const LoadICParameters* p) {
 | 
|    Node* receiver_map = LoadReceiverMap(p->receiver);
 | 
|  
 | 
|    // Check monomorphic case.
 | 
| -  Node* feedback = TryMonomorphicCase(p, receiver_map, &if_handler,
 | 
| -                                      &var_handler, &try_polymorphic);
 | 
| +  Node* feedback =
 | 
| +      TryMonomorphicCase(p->slot, p->vector, receiver_map, &if_handler,
 | 
| +                         &var_handler, &try_polymorphic);
 | 
|    Bind(&if_handler);
 | 
|    {
 | 
|      HandleLoadICHandlerCase(p, var_handler.value(), &miss);
 | 
| @@ -4677,7 +4677,7 @@ void CodeStubAssembler::LoadIC(const LoadICParameters* p) {
 | 
|      Comment("LoadIC_try_polymorphic");
 | 
|      GotoUnless(WordEqual(LoadMap(feedback), FixedArrayMapConstant()),
 | 
|                 &try_megamorphic);
 | 
| -    HandlePolymorphicCase(p, receiver_map, feedback, &if_handler, &var_handler,
 | 
| +    HandlePolymorphicCase(receiver_map, feedback, &if_handler, &var_handler,
 | 
|                            &miss, 2);
 | 
|    }
 | 
|  
 | 
| @@ -4709,8 +4709,9 @@ void CodeStubAssembler::KeyedLoadIC(const LoadICParameters* p) {
 | 
|    Node* receiver_map = LoadReceiverMap(p->receiver);
 | 
|  
 | 
|    // Check monomorphic case.
 | 
| -  Node* feedback = TryMonomorphicCase(p, receiver_map, &if_handler,
 | 
| -                                      &var_handler, &try_polymorphic);
 | 
| +  Node* feedback =
 | 
| +      TryMonomorphicCase(p->slot, p->vector, receiver_map, &if_handler,
 | 
| +                         &var_handler, &try_polymorphic);
 | 
|    Bind(&if_handler);
 | 
|    {
 | 
|      HandleLoadICHandlerCase(p, var_handler.value(), &miss, kSupportElements);
 | 
| @@ -4722,7 +4723,7 @@ void CodeStubAssembler::KeyedLoadIC(const LoadICParameters* p) {
 | 
|      Comment("KeyedLoadIC_try_polymorphic");
 | 
|      GotoUnless(WordEqual(LoadMap(feedback), FixedArrayMapConstant()),
 | 
|                 &try_megamorphic);
 | 
| -    HandlePolymorphicCase(p, receiver_map, feedback, &if_handler, &var_handler,
 | 
| +    HandlePolymorphicCase(receiver_map, feedback, &if_handler, &var_handler,
 | 
|                            &miss, 2);
 | 
|    }
 | 
|  
 | 
| @@ -4748,8 +4749,8 @@ void CodeStubAssembler::KeyedLoadIC(const LoadICParameters* p) {
 | 
|          p->slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS,
 | 
|          FixedArray::kHeaderSize + kPointerSize - kHeapObjectTag);
 | 
|      Node* array = Load(MachineType::AnyTagged(), p->vector, offset);
 | 
| -    HandlePolymorphicCase(p, receiver_map, array, &if_handler, &var_handler,
 | 
| -                          &miss, 1);
 | 
| +    HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, &miss,
 | 
| +                          1);
 | 
|    }
 | 
|    Bind(&miss);
 | 
|    {
 | 
| @@ -4915,6 +4916,55 @@ void CodeStubAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void CodeStubAssembler::StoreIC(const StoreICParameters* p) {
 | 
| +  Variable var_handler(this, MachineRepresentation::kTagged);
 | 
| +  // TODO(ishell): defer blocks when it works.
 | 
| +  Label if_handler(this, &var_handler), try_polymorphic(this),
 | 
| +      try_megamorphic(this /*, Label::kDeferred*/),
 | 
| +      miss(this /*, Label::kDeferred*/);
 | 
| +
 | 
| +  Node* receiver_map = LoadReceiverMap(p->receiver);
 | 
| +
 | 
| +  // Check monomorphic case.
 | 
| +  Node* feedback =
 | 
| +      TryMonomorphicCase(p->slot, p->vector, receiver_map, &if_handler,
 | 
| +                         &var_handler, &try_polymorphic);
 | 
| +  Bind(&if_handler);
 | 
| +  {
 | 
| +    Comment("StoreIC_if_handler");
 | 
| +    StoreWithVectorDescriptor descriptor(isolate());
 | 
| +    TailCallStub(descriptor, var_handler.value(), p->context, p->receiver,
 | 
| +                 p->name, p->value, p->slot, p->vector);
 | 
| +  }
 | 
| +
 | 
| +  Bind(&try_polymorphic);
 | 
| +  {
 | 
| +    // Check polymorphic case.
 | 
| +    Comment("StoreIC_try_polymorphic");
 | 
| +    GotoUnless(
 | 
| +        WordEqual(LoadMap(feedback), LoadRoot(Heap::kFixedArrayMapRootIndex)),
 | 
| +        &try_megamorphic);
 | 
| +    HandlePolymorphicCase(receiver_map, feedback, &if_handler, &var_handler,
 | 
| +                          &miss, 2);
 | 
| +  }
 | 
| +
 | 
| +  Bind(&try_megamorphic);
 | 
| +  {
 | 
| +    // Check megamorphic case.
 | 
| +    GotoUnless(
 | 
| +        WordEqual(feedback, LoadRoot(Heap::kmegamorphic_symbolRootIndex)),
 | 
| +        &miss);
 | 
| +
 | 
| +    TryProbeStubCache(isolate()->store_stub_cache(), p->receiver, p->name,
 | 
| +                      &if_handler, &var_handler, &miss);
 | 
| +  }
 | 
| +  Bind(&miss);
 | 
| +  {
 | 
| +    TailCallRuntime(Runtime::kStoreIC_Miss, p->context, p->value, p->slot,
 | 
| +                    p->vector, p->receiver, p->name);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  void CodeStubAssembler::LoadGlobalIC(const LoadICParameters* p) {
 | 
|    Label try_handler(this), miss(this);
 | 
|    Node* weak_cell =
 | 
| 
 |