Index: runtime/vm/flow_graph_compiler_arm64.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler_arm64.cc (revision 36576) |
+++ runtime/vm/flow_graph_compiler_arm64.cc (working copy) |
@@ -1440,8 +1440,7 @@ |
reg_idx >= 0; --reg_idx) { |
VRegister fpu_reg = static_cast<VRegister>(reg_idx); |
if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) { |
- // TODO(zra): Save the whole V register. |
- __ PushDouble(fpu_reg); |
+ __ PushQuad(fpu_reg); |
} |
} |
} |
@@ -1473,8 +1472,7 @@ |
for (intptr_t reg_idx = 0; reg_idx < kNumberOfVRegisters; ++reg_idx) { |
VRegister fpu_reg = static_cast<VRegister>(reg_idx); |
if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) { |
- // TODO(zra): Restore the whole V register. |
- __ PopDouble(fpu_reg); |
+ __ PopQuad(fpu_reg); |
} |
} |
} |
@@ -1595,7 +1593,7 @@ |
} |
} else if (source.IsFpuRegister()) { |
if (destination.IsFpuRegister()) { |
- __ fmovdd(destination.fpu_reg(), source.fpu_reg()); |
+ __ vmov(destination.fpu_reg(), source.fpu_reg()); |
} else { |
if (destination.IsDoubleStackSlot()) { |
const intptr_t dest_offset = destination.ToStackSlotOffset(); |
@@ -1603,7 +1601,8 @@ |
__ StoreDToOffset(src, FP, dest_offset, PP); |
} else { |
ASSERT(destination.IsQuadStackSlot()); |
- UNIMPLEMENTED(); |
+ const intptr_t dest_offset = destination.ToStackSlotOffset(); |
+ __ StoreQToOffset(source.fpu_reg(), FP, dest_offset, PP); |
} |
} |
} else if (source.IsDoubleStackSlot()) { |
@@ -1619,7 +1618,16 @@ |
__ StoreDToOffset(VTMP, FP, dest_offset, PP); |
} |
} else if (source.IsQuadStackSlot()) { |
- UNIMPLEMENTED(); |
+ if (destination.IsFpuRegister()) { |
+ const intptr_t dest_offset = source.ToStackSlotOffset(); |
+ __ LoadQFromOffset(destination.fpu_reg(), FP, dest_offset, PP); |
+ } else { |
+ ASSERT(destination.IsQuadStackSlot()); |
+ const intptr_t source_offset = source.ToStackSlotOffset(); |
+ const intptr_t dest_offset = destination.ToStackSlotOffset(); |
+ __ LoadQFromOffset(VTMP, FP, source_offset, PP); |
+ __ StoreQToOffset(VTMP, FP, dest_offset, PP); |
+ } |
} else { |
ASSERT(source.IsConstant()); |
const Object& constant = source.constant(); |