| 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();
|
|
|