| Index: runtime/vm/intermediate_language_arm.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/intermediate_language_arm.cc	(revision 36258)
 | 
| +++ runtime/vm/intermediate_language_arm.cc	(working copy)
 | 
| @@ -290,7 +290,8 @@
 | 
|  void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
 | 
|    // The register allocator drops constant definitions that have no uses.
 | 
|    if (!locs()->out(0).IsInvalid()) {
 | 
| -    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
 | 
| +    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0) &&
 | 
| +        TargetCPUFeatures::neon_supported()) {
 | 
|        const QRegister dst = locs()->out(0).fpu_reg();
 | 
|        __ veorq(dst, dst, dst);
 | 
|      } else {
 | 
| @@ -2076,12 +2077,7 @@
 | 
|                           FieldAddress(instance_reg, offset_in_bytes_),
 | 
|                           temp2);
 | 
|        __ Bind(©_double);
 | 
| -      __ LoadDFromOffset(fpu_temp,
 | 
| -                         value_reg,
 | 
| -                         Double::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreDToOffset(fpu_temp,
 | 
| -                        temp,
 | 
| -                        Double::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
 | 
|        __ b(&skip_store);
 | 
|      }
 | 
|  
 | 
| @@ -2107,10 +2103,7 @@
 | 
|                           FieldAddress(instance_reg, offset_in_bytes_),
 | 
|                           temp2);
 | 
|        __ Bind(©_float32x4);
 | 
| -      __ LoadMultipleDFromOffset(fpu_temp, 2, value_reg,
 | 
| -          Float32x4::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreMultipleDToOffset(fpu_temp, 2, temp,
 | 
| -          Float32x4::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
 | 
|        __ b(&skip_store);
 | 
|      }
 | 
|  
 | 
| @@ -2136,10 +2129,7 @@
 | 
|                           FieldAddress(instance_reg, offset_in_bytes_),
 | 
|                           temp2);
 | 
|        __ Bind(©_float64x2);
 | 
| -      __ LoadMultipleDFromOffset(fpu_temp, 2, value_reg,
 | 
| -          Float64x2::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreMultipleDToOffset(fpu_temp, 2, temp,
 | 
| -          Float64x2::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
 | 
|        __ b(&skip_store);
 | 
|      }
 | 
|  
 | 
| @@ -2481,6 +2471,7 @@
 | 
|      locs->AddTemp(opt ? Location::RequiresFpuRegister()
 | 
|                        : Location::FpuRegisterLocation(Q1));
 | 
|      locs->AddTemp(Location::RequiresRegister());
 | 
| +    locs->AddTemp(Location::RequiresRegister());
 | 
|    }
 | 
|    locs->set_out(0, Location::RequiresRegister());
 | 
|    return locs;
 | 
| @@ -2488,7 +2479,7 @@
 | 
|  
 | 
|  
 | 
|  void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
 | 
| -  Register instance_reg = locs()->in(0).reg();
 | 
| +  const Register instance_reg = locs()->in(0).reg();
 | 
|    if (IsUnboxedLoad() && compiler->is_optimizing()) {
 | 
|      const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
 | 
|      const Register temp = locs()->temp(0).reg();
 | 
| @@ -2519,8 +2510,9 @@
 | 
|    Label done;
 | 
|    Register result_reg = locs()->out(0).reg();
 | 
|    if (IsPotentialUnboxedLoad()) {
 | 
| -    const Register temp = locs()->temp(1).reg();
 | 
|      const DRegister value = EvenDRegisterOf(locs()->temp(0).fpu_reg());
 | 
| +    const Register temp = locs()->temp(1).reg();
 | 
| +    const Register temp2 = locs()->temp(2).reg();
 | 
|  
 | 
|      Label load_pointer;
 | 
|      Label load_double;
 | 
| @@ -2567,10 +2559,7 @@
 | 
|                       temp);
 | 
|        __ Bind(slow_path->exit_label());
 | 
|        __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
 | 
| -      __ LoadDFromOffset(value, temp, Double::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreDToOffset(value,
 | 
| -                        result_reg,
 | 
| -                        Double::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyDoubleField(result_reg, temp, TMP, temp2, value);
 | 
|        __ b(&done);
 | 
|      }
 | 
|  
 | 
| @@ -2585,10 +2574,7 @@
 | 
|                       temp);
 | 
|        __ Bind(slow_path->exit_label());
 | 
|        __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
 | 
| -      __ LoadMultipleDFromOffset(value, 2, temp,
 | 
| -          Float32x4::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreMultipleDToOffset(value, 2, result_reg,
 | 
| -          Float32x4::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyFloat32x4Field(result_reg, temp, TMP, temp2, value);
 | 
|        __ b(&done);
 | 
|      }
 | 
|  
 | 
| @@ -2603,10 +2589,7 @@
 | 
|                       temp);
 | 
|        __ Bind(slow_path->exit_label());
 | 
|        __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
 | 
| -      __ LoadMultipleDFromOffset(value, 2, temp,
 | 
| -          Float64x2::value_offset() - kHeapObjectTag);
 | 
| -      __ StoreMultipleDToOffset(value, 2, result_reg,
 | 
| -          Float64x2::value_offset() - kHeapObjectTag);
 | 
| +      __ CopyFloat64x2Field(result_reg, temp, TMP, temp2, value);
 | 
|        __ b(&done);
 | 
|      }
 | 
|  
 | 
| 
 |