OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/flow_graph_compiler.h" | 8 #include "vm/flow_graph_compiler.h" |
9 | 9 |
10 #include "vm/ast_printer.h" | 10 #include "vm/ast_printer.h" |
(...skipping 1652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1663 destination.base_reg(), destination.ToStackSlotOffset()); | 1663 destination.base_reg(), destination.ToStackSlotOffset()); |
1664 } else if (source.IsStackSlot() && destination.IsRegister()) { | 1664 } else if (source.IsStackSlot() && destination.IsRegister()) { |
1665 Exchange(destination.reg(), | 1665 Exchange(destination.reg(), |
1666 source.base_reg(), source.ToStackSlotOffset()); | 1666 source.base_reg(), source.ToStackSlotOffset()); |
1667 } else if (source.IsStackSlot() && destination.IsStackSlot()) { | 1667 } else if (source.IsStackSlot() && destination.IsStackSlot()) { |
1668 Exchange(source.base_reg(), source.ToStackSlotOffset(), | 1668 Exchange(source.base_reg(), source.ToStackSlotOffset(), |
1669 destination.base_reg(), destination.ToStackSlotOffset()); | 1669 destination.base_reg(), destination.ToStackSlotOffset()); |
1670 } else if (source.IsFpuRegister() && destination.IsFpuRegister()) { | 1670 } else if (source.IsFpuRegister() && destination.IsFpuRegister()) { |
1671 const VRegister dst = destination.fpu_reg(); | 1671 const VRegister dst = destination.fpu_reg(); |
1672 const VRegister src = source.fpu_reg(); | 1672 const VRegister src = source.fpu_reg(); |
1673 __ fmovdd(VTMP, src); | 1673 __ vmov(VTMP, src); |
1674 __ fmovdd(src, dst); | 1674 __ vmov(src, dst); |
1675 __ fmovdd(dst, VTMP); | 1675 __ vmov(dst, VTMP); |
1676 } else if (source.IsFpuRegister() || destination.IsFpuRegister()) { | 1676 } else if (source.IsFpuRegister() || destination.IsFpuRegister()) { |
1677 ASSERT(destination.IsDoubleStackSlot() || | 1677 ASSERT(destination.IsDoubleStackSlot() || |
1678 destination.IsQuadStackSlot() || | 1678 destination.IsQuadStackSlot() || |
1679 source.IsDoubleStackSlot() || | 1679 source.IsDoubleStackSlot() || |
1680 source.IsQuadStackSlot()); | 1680 source.IsQuadStackSlot()); |
1681 bool double_width = destination.IsDoubleStackSlot() || | 1681 bool double_width = destination.IsDoubleStackSlot() || |
1682 source.IsDoubleStackSlot(); | 1682 source.IsDoubleStackSlot(); |
1683 VRegister reg = source.IsFpuRegister() ? source.fpu_reg() | 1683 VRegister reg = source.IsFpuRegister() ? source.fpu_reg() |
1684 : destination.fpu_reg(); | 1684 : destination.fpu_reg(); |
1685 Register base_reg = source.IsFpuRegister() | 1685 Register base_reg = source.IsFpuRegister() |
1686 ? destination.base_reg() | 1686 ? destination.base_reg() |
1687 : source.base_reg(); | 1687 : source.base_reg(); |
1688 const intptr_t slot_offset = source.IsFpuRegister() | 1688 const intptr_t slot_offset = source.IsFpuRegister() |
1689 ? destination.ToStackSlotOffset() | 1689 ? destination.ToStackSlotOffset() |
1690 : source.ToStackSlotOffset(); | 1690 : source.ToStackSlotOffset(); |
1691 | 1691 |
1692 if (double_width) { | 1692 if (double_width) { |
1693 __ LoadDFromOffset(VTMP, base_reg, slot_offset, PP); | 1693 __ LoadDFromOffset(VTMP, base_reg, slot_offset, PP); |
1694 __ StoreDToOffset(reg, base_reg, slot_offset, PP); | 1694 __ StoreDToOffset(reg, base_reg, slot_offset, PP); |
1695 __ fmovdd(reg, VTMP); | 1695 __ fmovdd(reg, VTMP); |
1696 } else { | 1696 } else { |
1697 __ LoadQFromOffset(VTMP, base_reg, slot_offset, PP); | 1697 __ LoadQFromOffset(VTMP, base_reg, slot_offset, PP); |
1698 __ StoreQToOffset(reg, base_reg, slot_offset, PP); | 1698 __ StoreQToOffset(reg, base_reg, slot_offset, PP); |
1699 __ fmovdd(reg, VTMP); | 1699 __ vmov(reg, VTMP); |
1700 } | 1700 } |
1701 } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) { | 1701 } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) { |
1702 const intptr_t source_offset = source.ToStackSlotOffset(); | 1702 const intptr_t source_offset = source.ToStackSlotOffset(); |
1703 const intptr_t dest_offset = destination.ToStackSlotOffset(); | 1703 const intptr_t dest_offset = destination.ToStackSlotOffset(); |
1704 | 1704 |
1705 ScratchFpuRegisterScope ensure_scratch(this, kNoFpuRegister); | 1705 ScratchFpuRegisterScope ensure_scratch(this, kNoFpuRegister); |
1706 VRegister scratch = ensure_scratch.reg(); | 1706 VRegister scratch = ensure_scratch.reg(); |
1707 __ LoadDFromOffset(VTMP, source.base_reg(), source_offset, PP); | 1707 __ LoadDFromOffset(VTMP, source.base_reg(), source_offset, PP); |
1708 __ LoadDFromOffset(scratch, destination.base_reg(), dest_offset, PP); | 1708 __ LoadDFromOffset(scratch, destination.base_reg(), dest_offset, PP); |
1709 __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset, PP); | 1709 __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset, PP); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1806 void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) { | 1806 void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) { |
1807 __ PopDouble(reg); | 1807 __ PopDouble(reg); |
1808 } | 1808 } |
1809 | 1809 |
1810 | 1810 |
1811 #undef __ | 1811 #undef __ |
1812 | 1812 |
1813 } // namespace dart | 1813 } // namespace dart |
1814 | 1814 |
1815 #endif // defined TARGET_ARCH_ARM64 | 1815 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |