| Index: runtime/vm/stub_code_mips.cc
 | 
| diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
 | 
| index 58af41870b02afefe49bd1debde0f3f5e68ae828..abd4ba2d78f778cbac962db5c93d646978001384 100644
 | 
| --- a/runtime/vm/stub_code_mips.cc
 | 
| +++ b/runtime/vm/stub_code_mips.cc
 | 
| @@ -2211,6 +2211,13 @@ void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
 | 
|  }
 | 
|  
 | 
|  
 | 
| +// Called from megamorphic calls.
 | 
| +//  T0: receiver
 | 
| +//  S5: MegamorphicCache (preserved)
 | 
| +// Result:
 | 
| +//  T1: target entry point
 | 
| +//  CODE_REG: target Code
 | 
| +//  S4: arguments descriptor
 | 
|  void StubCode::EmitMegamorphicLookup(Assembler* assembler) {
 | 
|    __ LoadTaggedClassIdMayBeSmi(T0, T0);
 | 
|    // T0: class ID of the receiver (smi).
 | 
| @@ -2253,13 +2260,6 @@ void StubCode::EmitMegamorphicLookup(Assembler* assembler) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -// Called from megamorphic calls.
 | 
| -//  T0: receiver
 | 
| -//  S5: MegamorphicCache (preserved)
 | 
| -// Result:
 | 
| -//  T1: target entry point
 | 
| -//  CODE_REG: target Code
 | 
| -//  S4: arguments descriptor
 | 
|  void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
 | 
|    EmitMegamorphicLookup(assembler);
 | 
|    __ Ret();
 | 
| @@ -2273,7 +2273,50 @@ void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
 | 
|  //  T1: target entry point
 | 
|  //  CODE_REG: target Code object
 | 
|  //  S4: arguments descriptor
 | 
| -void StubCode::GenerateICLookupStub(Assembler* assembler) {
 | 
| +static void EmitICLookup(Assembler* assembler,
 | 
| +                         intptr_t args_checked,
 | 
| +                         Token::Kind kind) {
 | 
| +  if (kind != Token::kILLEGAL) {
 | 
| +    __ Comment("Fast Smi op");
 | 
| +    Label not_smi_or_overflow;
 | 
| +
 | 
| +    // T0: Receiver.
 | 
| +    __ lw(T1, Address(SP, 0 * kWordSize));
 | 
| +    // T1: Argument.
 | 
| +    __ or_(CMPRES1, T0, T1);
 | 
| +    __ andi(CMPRES1, CMPRES1, Immediate(kSmiTagMask));
 | 
| +    __ bne(CMPRES1, ZR, ¬_smi_or_overflow);
 | 
| +
 | 
| +    switch (kind) {
 | 
| +      case Token::kADD: {
 | 
| +        __ AdduDetectOverflow(V0, T1, T0, CMPRES1);  // Add.
 | 
| +        __ bltz(CMPRES1, ¬_smi_or_overflow);  // Fall through on overflow.
 | 
| +        break;
 | 
| +      }
 | 
| +      case Token::kSUB: {
 | 
| +        __ SubuDetectOverflow(V0, T1, T0, CMPRES1);  // Subtract.
 | 
| +        __ bltz(CMPRES1, ¬_smi_or_overflow);  // Fall through on overflow.
 | 
| +        break;
 | 
| +      }
 | 
| +      case Token::kEQ: {
 | 
| +        Label true_label, done;
 | 
| +        __ beq(T1, T0, &true_label);
 | 
| +        __ LoadObject(V0, Bool::False());
 | 
| +        __ b(&done);
 | 
| +        __ Bind(&true_label);
 | 
| +        __ LoadObject(V0, Bool::True());
 | 
| +        __ Bind(&done);
 | 
| +        break;
 | 
| +      }
 | 
| +      default: UNIMPLEMENTED();
 | 
| +    }
 | 
| +    // Return past the call to lookup result and delay slot.
 | 
| +    __ addiu(RA, RA, Immediate(2 * Instr::kInstrSize));
 | 
| +    __ Ret();
 | 
| +
 | 
| +    __ Bind(¬_smi_or_overflow);
 | 
| +  }
 | 
| +
 | 
|    Label loop, found, miss;
 | 
|    __ lw(T6, FieldAddress(S5, ICData::ic_data_offset()));
 | 
|    __ lw(S4, FieldAddress(S5, ICData::arguments_descriptor_offset()));
 | 
| @@ -2288,12 +2331,14 @@ void StubCode::GenerateICLookupStub(Assembler* assembler) {
 | 
|    ASSERT(Smi::RawValue(kIllegalCid) == 0);
 | 
|    __ beq(T2, ZR, &miss);
 | 
|  
 | 
| -  const intptr_t entry_length = ICData::TestEntryLengthFor(1) * kWordSize;
 | 
| +  const intptr_t entry_length =
 | 
| +      ICData::TestEntryLengthFor(args_checked) * kWordSize;
 | 
|    __ AddImmediate(T6, entry_length);  // Next entry.
 | 
|    __ b(&loop);
 | 
|  
 | 
|    __ Bind(&found);
 | 
| -  const intptr_t target_offset = ICData::TargetIndexFor(1) * kWordSize;
 | 
| +  const intptr_t target_offset =
 | 
| +      ICData::TargetIndexFor(args_checked) * kWordSize;
 | 
|    __ lw(T0, Address(T6, target_offset));
 | 
|    __ lw(T1, FieldAddress(T0, Function::entry_point_offset()));
 | 
|    __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
 | 
| @@ -2306,6 +2351,26 @@ void StubCode::GenerateICLookupStub(Assembler* assembler) {
 | 
|    __ Ret();
 | 
|  }
 | 
|  
 | 
| +
 | 
| +void StubCode::GenerateICLookupStub(Assembler* assembler) {
 | 
| +  EmitICLookup(assembler, 1, Token::kILLEGAL);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void StubCode::GenerateICSmiAddLookupStub(Assembler* assembler) {
 | 
| +  EmitICLookup(assembler, 2, Token::kADD);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void StubCode::GenerateICSmiSubLookupStub(Assembler* assembler) {
 | 
| +  EmitICLookup(assembler, 2, Token::kSUB);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void StubCode::GenerateICSmiEqualLookupStub(Assembler* assembler) {
 | 
| +  EmitICLookup(assembler, 2, Token::kEQ);
 | 
| +}
 | 
| +
 | 
|  }  // namespace dart
 | 
|  
 | 
|  #endif  // defined TARGET_ARCH_MIPS
 | 
| 
 |