Index: runtime/vm/flow_graph_compiler_arm.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler_arm.cc (revision 36258) |
+++ runtime/vm/flow_graph_compiler_arm.cc (working copy) |
@@ -24,6 +24,7 @@ |
DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization."); |
DEFINE_FLAG(bool, unbox_mints, true, "Optimize 64-bit integer arithmetic."); |
+DEFINE_FLAG(bool, unbox_doubles, true, "Optimize double arithmetic."); |
DECLARE_FLAG(int, optimization_counter_threshold); |
DECLARE_FLAG(int, reoptimization_counter_threshold); |
DECLARE_FLAG(bool, enable_type_checks); |
@@ -40,6 +41,11 @@ |
} |
+bool FlowGraphCompiler::SupportsUnboxedDoubles() { |
+ return TargetCPUFeatures::vfp_supported() && FLAG_unbox_doubles; |
+} |
+ |
+ |
bool FlowGraphCompiler::SupportsUnboxedMints() { |
return TargetCPUFeatures::neon_supported() && FLAG_unbox_mints; |
} |
@@ -1596,7 +1602,14 @@ |
} |
} else if (source.IsFpuRegister()) { |
if (destination.IsFpuRegister()) { |
- __ vmovq(destination.fpu_reg(), source.fpu_reg()); |
+ if (TargetCPUFeatures::neon_supported()) { |
+ __ vmovq(destination.fpu_reg(), source.fpu_reg()); |
+ } else { |
+ // If we're not inlining simd values, then only the even numbered D |
+ // register will have anything in them. |
+ __ vmovd(EvenDRegisterOf(destination.fpu_reg()), |
+ EvenDRegisterOf(source.fpu_reg())); |
+ } |
} else { |
if (destination.IsDoubleStackSlot()) { |
const intptr_t dest_offset = destination.ToStackSlotOffset(); |