| Index: runtime/vm/flow_graph_compiler_arm.cc
 | 
| diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
 | 
| index a11916db9e64fb4dc09567874900d56c39d8a174..6c5667fc7d8b4de897eac5d033df1b1503c134c7 100644
 | 
| --- a/runtime/vm/flow_graph_compiler_arm.cc
 | 
| +++ b/runtime/vm/flow_graph_compiler_arm.cc
 | 
| @@ -1267,7 +1267,7 @@ void FlowGraphCompiler::EmitMegamorphicInstanceCall(
 | 
|        MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 | 
|  
 | 
|    __ Comment("MegamorphicCall");
 | 
| -  __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
 | 
| +  __ LoadFromOffset(kWord, R1, SP, (argument_count - 1) * kWordSize);
 | 
|    __ LoadObject(R9, cache);
 | 
|    if (FLAG_use_megamorphic_stub) {
 | 
|      __ BranchLink(*StubCode::MegamorphicLookup_entry());
 | 
| @@ -1298,23 +1298,35 @@ void FlowGraphCompiler::EmitSwitchableInstanceCall(
 | 
|      intptr_t token_pos,
 | 
|      LocationSummary* locs) {
 | 
|    __ Comment("SwitchableCall");
 | 
| -  __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
 | 
| +  __ LoadFromOffset(kWord, R1, SP, (argument_count - 1) * kWordSize);
 | 
|    if (ic_data.NumArgsTested() == 1) {
 | 
|      __ LoadUniqueObject(R9, ic_data);
 | 
|      __ BranchLinkPatchable(*StubCode::ICLookup_entry());
 | 
|    } else {
 | 
|      const String& name = String::Handle(zone(), ic_data.target_name());
 | 
| -    const Array& arguments_descriptor =
 | 
| -        Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
 | 
| -    ASSERT(!arguments_descriptor.IsNull() &&
 | 
| -           (arguments_descriptor.Length() > 0));
 | 
| -    const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
 | 
| -        MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 | 
| -
 | 
| -    __ LoadUniqueObject(R9, cache);
 | 
| -    __ BranchLinkPatchable(*StubCode::MegamorphicLookup_entry());
 | 
| +
 | 
| +    if (name.raw() == Symbols::Plus().raw()) {
 | 
| +      __ LoadUniqueObject(R9, ic_data);
 | 
| +      __ BranchLinkPatchable(*StubCode::ICSmiAddLookup_entry());
 | 
| +    } else if (name.raw() == Symbols::Minus().raw()) {
 | 
| +      __ LoadUniqueObject(R9, ic_data);
 | 
| +      __ BranchLinkPatchable(*StubCode::ICSmiSubLookup_entry());
 | 
| +    } else if (name.raw() == Symbols::Equals().raw()) {
 | 
| +      __ LoadUniqueObject(R9, ic_data);
 | 
| +      __ BranchLinkPatchable(*StubCode::ICSmiEqualLookup_entry());
 | 
| +    } else {
 | 
| +      const Array& arguments_descriptor =
 | 
| +          Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
 | 
| +      ASSERT(!arguments_descriptor.IsNull() &&
 | 
| +             (arguments_descriptor.Length() > 0));
 | 
| +      const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
 | 
| +          MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 | 
| +
 | 
| +      __ LoadUniqueObject(R9, cache);
 | 
| +      __ BranchLinkPatchable(*StubCode::MegamorphicLookup_entry());
 | 
| +    }
 | 
|    }
 | 
| -  __ blx(R1);
 | 
| +  __ blx(R1);  // A fast Smi operation may return past this call.
 | 
|  
 | 
|    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
 | 
|    RecordSafepoint(locs);
 | 
| 
 |