| Index: src/mips64/full-codegen-mips64.cc
 | 
| diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc
 | 
| index e4f0c7f12492279d89f09192b3a659a408e3a757..876d5f967589aed78a8d7a7111fb99ed765ab097 100644
 | 
| --- a/src/mips64/full-codegen-mips64.cc
 | 
| +++ b/src/mips64/full-codegen-mips64.cc
 | 
| @@ -1249,7 +1249,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
 | 
|    __ mov(result_register(), a3);
 | 
|    // Perform the assignment as if via '='.
 | 
|    { EffectContext context(this);
 | 
| -    EmitAssignment(stmt->each());
 | 
| +    EmitAssignment(stmt->each(), stmt->EachFeedbackSlot());
 | 
|      PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS);
 | 
|    }
 | 
|  
 | 
| @@ -1331,13 +1331,15 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) {
 | 
|  
 | 
|  
 | 
|  void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
 | 
| -                                                  int offset) {
 | 
| +                                                  int offset,
 | 
| +                                                  FeedbackVectorICSlot slot) {
 | 
|    if (NeedsHomeObject(initializer)) {
 | 
|      __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
 | 
|      __ li(StoreDescriptor::NameRegister(),
 | 
|            Operand(isolate()->factory()->home_object_symbol()));
 | 
|      __ ld(StoreDescriptor::ValueRegister(),
 | 
|            MemOperand(sp, offset * kPointerSize));
 | 
| +    if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
 | 
|      CallStoreIC();
 | 
|    }
 | 
|  }
 | 
| @@ -1662,6 +1664,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|  
 | 
|    AccessorTable accessor_table(zone());
 | 
|    int property_index = 0;
 | 
| +  // store_slot_index points to the vector ic slot for the next store ic used.
 | 
| +  // ObjectLiteral::ComputeFeedbackRequirements controls the allocation of slots
 | 
| +  // and must be updated if the number of store ics emitted here changes.
 | 
| +  int store_slot_index = 0;
 | 
|    for (; property_index < expr->properties()->length(); property_index++) {
 | 
|      ObjectLiteral::Property* property = expr->properties()->at(property_index);
 | 
|      if (property->is_computed_name()) break;
 | 
| @@ -1689,7 +1695,12 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|              DCHECK(StoreDescriptor::ValueRegister().is(a0));
 | 
|              __ li(StoreDescriptor::NameRegister(), Operand(key->value()));
 | 
|              __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
 | 
| -            CallStoreIC(key->LiteralFeedbackId());
 | 
| +            if (FLAG_vector_stores) {
 | 
| +              EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
 | 
| +              CallStoreIC();
 | 
| +            } else {
 | 
| +              CallStoreIC(key->LiteralFeedbackId());
 | 
| +            }
 | 
|              PrepareForBailoutForId(key->id(), NO_REGISTERS);
 | 
|  
 | 
|              if (NeedsHomeObject(value)) {
 | 
| @@ -1697,6 +1708,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|                __ li(StoreDescriptor::NameRegister(),
 | 
|                      Operand(isolate()->factory()->home_object_symbol()));
 | 
|                __ ld(StoreDescriptor::ValueRegister(), MemOperand(sp));
 | 
| +              if (FLAG_vector_stores) {
 | 
| +                EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
 | 
| +              }
 | 
|                CallStoreIC();
 | 
|              }
 | 
|            } else {
 | 
| @@ -1710,7 +1724,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|          VisitForStackValue(key);
 | 
|          VisitForStackValue(value);
 | 
|          if (property->emit_store()) {
 | 
| -          EmitSetHomeObjectIfNeeded(value, 2);
 | 
| +          EmitSetHomeObjectIfNeeded(
 | 
| +              value, 2, expr->SlotForHomeObject(value, &store_slot_index));
 | 
|            __ li(a0, Operand(Smi::FromInt(SLOPPY)));  // PropertyAttributes.
 | 
|            __ push(a0);
 | 
|            __ CallRuntime(Runtime::kSetProperty, 4);
 | 
| @@ -1748,9 +1763,13 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|      __ push(a0);
 | 
|      VisitForStackValue(it->first);
 | 
|      EmitAccessor(it->second->getter);
 | 
| -    EmitSetHomeObjectIfNeeded(it->second->getter, 2);
 | 
| +    EmitSetHomeObjectIfNeeded(
 | 
| +        it->second->getter, 2,
 | 
| +        expr->SlotForHomeObject(it->second->getter, &store_slot_index));
 | 
|      EmitAccessor(it->second->setter);
 | 
| -    EmitSetHomeObjectIfNeeded(it->second->setter, 3);
 | 
| +    EmitSetHomeObjectIfNeeded(
 | 
| +        it->second->setter, 3,
 | 
| +        expr->SlotForHomeObject(it->second->setter, &store_slot_index));
 | 
|      __ li(a0, Operand(Smi::FromInt(NONE)));
 | 
|      __ push(a0);
 | 
|      __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
 | 
| @@ -1785,7 +1804,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|      } else {
 | 
|        EmitPropertyKey(property, expr->GetIdForProperty(property_index));
 | 
|        VisitForStackValue(value);
 | 
| -      EmitSetHomeObjectIfNeeded(value, 2);
 | 
| +      EmitSetHomeObjectIfNeeded(
 | 
| +          value, 2, expr->SlotForHomeObject(value, &store_slot_index));
 | 
|  
 | 
|        switch (property->kind()) {
 | 
|          case ObjectLiteral::Property::CONSTANT:
 | 
| @@ -1831,6 +1851,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
 | 
|    } else {
 | 
|      context()->Plug(v0);
 | 
|    }
 | 
| +
 | 
| +  // Verify that compilation exactly consumed the number of store ic slots that
 | 
| +  // the ObjectLiteral node had to offer.
 | 
| +  DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count());
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1947,7 +1971,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
 | 
|    Comment cmnt(masm_, "[ Assignment");
 | 
|  
 | 
|    Property* property = expr->target()->AsProperty();
 | 
| -  LhsKind assign_type = GetAssignType(property);
 | 
| +  LhsKind assign_type = Property::GetAssignType(property);
 | 
|  
 | 
|    // Evaluate LHS expression.
 | 
|    switch (assign_type) {
 | 
| @@ -2058,7 +2082,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
 | 
|    switch (assign_type) {
 | 
|      case VARIABLE:
 | 
|        EmitVariableAssignment(expr->target()->AsVariableProxy()->var(),
 | 
| -                             expr->op());
 | 
| +                             expr->op(), expr->AssignmentSlot());
 | 
|        PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|        context()->Plug(v0);
 | 
|        break;
 | 
| @@ -2583,17 +2607,18 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::EmitAssignment(Expression* expr) {
 | 
| +void FullCodeGenerator::EmitAssignment(Expression* expr,
 | 
| +                                       FeedbackVectorICSlot slot) {
 | 
|    DCHECK(expr->IsValidReferenceExpression());
 | 
|  
 | 
|    Property* prop = expr->AsProperty();
 | 
| -  LhsKind assign_type = GetAssignType(prop);
 | 
| +  LhsKind assign_type = Property::GetAssignType(prop);
 | 
|  
 | 
|    switch (assign_type) {
 | 
|      case VARIABLE: {
 | 
|        Variable* var = expr->AsVariableProxy()->var();
 | 
|        EffectContext context(this);
 | 
| -      EmitVariableAssignment(var, Token::ASSIGN);
 | 
| +      EmitVariableAssignment(var, Token::ASSIGN, slot);
 | 
|        break;
 | 
|      }
 | 
|      case NAMED_PROPERTY: {
 | 
| @@ -2603,6 +2628,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
 | 
|        __ pop(StoreDescriptor::ValueRegister());  // Restore value.
 | 
|        __ li(StoreDescriptor::NameRegister(),
 | 
|              Operand(prop->key()->AsLiteral()->value()));
 | 
| +      if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
 | 
|        CallStoreIC();
 | 
|        break;
 | 
|      }
 | 
| @@ -2649,6 +2675,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
 | 
|        __ Move(StoreDescriptor::NameRegister(), result_register());
 | 
|        __ Pop(StoreDescriptor::ValueRegister(),
 | 
|               StoreDescriptor::ReceiverRegister());
 | 
| +      if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
 | 
|        Handle<Code> ic =
 | 
|            CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
 | 
|        CallIC(ic);
 | 
| @@ -2672,12 +2699,14 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) {
 | 
| +void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
 | 
| +                                               FeedbackVectorICSlot slot) {
 | 
|    if (var->IsUnallocated()) {
 | 
|      // Global var, const, or let.
 | 
|      __ mov(StoreDescriptor::ValueRegister(), result_register());
 | 
|      __ li(StoreDescriptor::NameRegister(), Operand(var->name()));
 | 
|      __ ld(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand());
 | 
| +    if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
 | 
|      CallStoreIC();
 | 
|  
 | 
|    } else if (var->mode() == LET && op != Token::INIT_LET) {
 | 
| @@ -2776,7 +2805,12 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
 | 
|    __ li(StoreDescriptor::NameRegister(),
 | 
|          Operand(prop->key()->AsLiteral()->value()));
 | 
|    __ pop(StoreDescriptor::ReceiverRegister());
 | 
| -  CallStoreIC(expr->AssignmentFeedbackId());
 | 
| +  if (FLAG_vector_stores) {
 | 
| +    EmitLoadStoreICSlot(expr->AssignmentSlot());
 | 
| +    CallStoreIC();
 | 
| +  } else {
 | 
| +    CallStoreIC(expr->AssignmentFeedbackId());
 | 
| +  }
 | 
|  
 | 
|    PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|    context()->Plug(v0);
 | 
| @@ -2829,7 +2863,12 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
 | 
|  
 | 
|    Handle<Code> ic =
 | 
|        CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
 | 
| -  CallIC(ic, expr->AssignmentFeedbackId());
 | 
| +  if (FLAG_vector_stores) {
 | 
| +    EmitLoadStoreICSlot(expr->AssignmentSlot());
 | 
| +    CallIC(ic);
 | 
| +  } else {
 | 
| +    CallIC(ic, expr->AssignmentFeedbackId());
 | 
| +  }
 | 
|  
 | 
|    PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|    context()->Plug(v0);
 | 
| @@ -3068,7 +3107,7 @@ void FullCodeGenerator::EmitLoadSuperConstructor() {
 | 
|  
 | 
|  
 | 
|  void FullCodeGenerator::EmitInitializeThisAfterSuper(
 | 
| -    SuperReference* super_ref) {
 | 
| +    SuperReference* super_ref, FeedbackVectorICSlot slot) {
 | 
|    Variable* this_var = super_ref->this_var()->var();
 | 
|    GetVar(a1, this_var);
 | 
|    __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
 | 
| @@ -3079,7 +3118,7 @@ void FullCodeGenerator::EmitInitializeThisAfterSuper(
 | 
|    __ CallRuntime(Runtime::kThrowReferenceError, 1);
 | 
|    __ bind(&uninitialized_this);
 | 
|  
 | 
| -  EmitVariableAssignment(this_var, Token::INIT_CONST);
 | 
| +  EmitVariableAssignment(this_var, Token::INIT_CONST, slot);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -3304,7 +3343,8 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) {
 | 
|  
 | 
|    RecordJSReturnSite(expr);
 | 
|  
 | 
| -  EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference());
 | 
| +  EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference(),
 | 
| +                               expr->CallFeedbackICSlot());
 | 
|    context()->Plug(v0);
 | 
|  }
 | 
|  
 | 
| @@ -4629,6 +4669,7 @@ void FullCodeGenerator::EmitCallSuperWithSpread(CallRuntime* expr) {
 | 
|    __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
 | 
|    context()->DropAndPlug(1, v0);
 | 
|  
 | 
| +  // TODO(mvstanton): with FLAG_vector_stores this needs a slot id.
 | 
|    EmitInitializeThisAfterSuper(super_reference);
 | 
|  }
 | 
|  
 | 
| @@ -4830,7 +4871,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
 | 
|    SetSourcePosition(expr->position());
 | 
|  
 | 
|    Property* prop = expr->expression()->AsProperty();
 | 
| -  LhsKind assign_type = GetAssignType(prop);
 | 
| +  LhsKind assign_type = Property::GetAssignType(prop);
 | 
|  
 | 
|    // Evaluate expression and get value.
 | 
|    if (assign_type == VARIABLE) {
 | 
| @@ -4995,7 +5036,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
 | 
|        if (expr->is_postfix()) {
 | 
|          { EffectContext context(this);
 | 
|            EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
 | 
| -                                 Token::ASSIGN);
 | 
| +                                 Token::ASSIGN, expr->CountSlot());
 | 
|            PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|            context.Plug(v0);
 | 
|          }
 | 
| @@ -5016,7 +5057,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
 | 
|        __ li(StoreDescriptor::NameRegister(),
 | 
|              Operand(prop->key()->AsLiteral()->value()));
 | 
|        __ pop(StoreDescriptor::ReceiverRegister());
 | 
| -      CallStoreIC(expr->CountStoreFeedbackId());
 | 
| +      if (FLAG_vector_stores) {
 | 
| +        EmitLoadStoreICSlot(expr->CountSlot());
 | 
| +        CallStoreIC();
 | 
| +      } else {
 | 
| +        CallStoreIC(expr->CountStoreFeedbackId());
 | 
| +      }
 | 
|        PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|        if (expr->is_postfix()) {
 | 
|          if (!context()->IsEffect()) {
 | 
| @@ -5055,7 +5101,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
 | 
|               StoreDescriptor::NameRegister());
 | 
|        Handle<Code> ic =
 | 
|            CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
 | 
| -      CallIC(ic, expr->CountStoreFeedbackId());
 | 
| +      if (FLAG_vector_stores) {
 | 
| +        EmitLoadStoreICSlot(expr->CountSlot());
 | 
| +        CallIC(ic);
 | 
| +      } else {
 | 
| +        CallIC(ic, expr->CountStoreFeedbackId());
 | 
| +      }
 | 
|        PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
 | 
|        if (expr->is_postfix()) {
 | 
|          if (!context()->IsEffect()) {
 | 
| @@ -5387,6 +5438,13 @@ void FullCodeGenerator::ClearPendingMessage() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorICSlot slot) {
 | 
| +  DCHECK(FLAG_vector_stores && !slot.IsInvalid());
 | 
| +  __ li(VectorStoreICTrampolineDescriptor::SlotRegister(),
 | 
| +        Operand(SmiFromSlot(slot)));
 | 
| +}
 | 
| +
 | 
| +
 | 
|  #undef __
 | 
|  
 | 
|  
 | 
| 
 |