| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 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 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1593 const intptr_t source_offset = source.ToStackSlotOffset(); | 1593 const intptr_t source_offset = source.ToStackSlotOffset(); |
| 1594 const intptr_t dest_offset = destination.ToStackSlotOffset(); | 1594 const intptr_t dest_offset = destination.ToStackSlotOffset(); |
| 1595 const DRegister dtmp0 = DTMP; | 1595 const DRegister dtmp0 = DTMP; |
| 1596 __ LoadMultipleDFromOffset(dtmp0, 2, FP, source_offset); | 1596 __ LoadMultipleDFromOffset(dtmp0, 2, FP, source_offset); |
| 1597 __ StoreMultipleDToOffset(dtmp0, 2, FP, dest_offset); | 1597 __ StoreMultipleDToOffset(dtmp0, 2, FP, dest_offset); |
| 1598 } | 1598 } |
| 1599 } else { | 1599 } else { |
| 1600 ASSERT(source.IsConstant()); | 1600 ASSERT(source.IsConstant()); |
| 1601 const Object& constant = source.constant(); | 1601 const Object& constant = source.constant(); |
| 1602 if (destination.IsRegister()) { | 1602 if (destination.IsRegister()) { |
| 1603 __ LoadObject(destination.reg(), constant); | 1603 if (source.constant_instruction()->representation() == kUnboxedInt32) { |
| 1604 __ LoadImmediate(destination.reg(), Smi::Cast(constant).Value()); |
| 1605 } else { |
| 1606 __ LoadObject(destination.reg(), constant); |
| 1607 } |
| 1604 } else if (destination.IsFpuRegister()) { | 1608 } else if (destination.IsFpuRegister()) { |
| 1605 const DRegister dst = EvenDRegisterOf(destination.fpu_reg()); | 1609 const DRegister dst = EvenDRegisterOf(destination.fpu_reg()); |
| 1606 if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) && | 1610 if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) && |
| 1607 TargetCPUFeatures::neon_supported()) { | 1611 TargetCPUFeatures::neon_supported()) { |
| 1608 QRegister qdst = destination.fpu_reg(); | 1612 QRegister qdst = destination.fpu_reg(); |
| 1609 __ veorq(qdst, qdst, qdst); | 1613 __ veorq(qdst, qdst, qdst); |
| 1610 } else { | 1614 } else { |
| 1611 __ LoadObject(TMP, constant); | 1615 __ LoadObject(TMP, constant); |
| 1612 __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag); | 1616 __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag); |
| 1613 __ vldrd(dst, Address(TMP, 0)); | 1617 __ vldrd(dst, Address(TMP, 0)); |
| 1614 } | 1618 } |
| 1615 } else if (destination.IsDoubleStackSlot()) { | 1619 } else if (destination.IsDoubleStackSlot()) { |
| 1616 if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) && | 1620 if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) && |
| 1617 TargetCPUFeatures::neon_supported()) { | 1621 TargetCPUFeatures::neon_supported()) { |
| 1618 __ veorq(QTMP, QTMP, QTMP); | 1622 __ veorq(QTMP, QTMP, QTMP); |
| 1619 } else { | 1623 } else { |
| 1620 __ LoadObject(TMP, constant); | 1624 __ LoadObject(TMP, constant); |
| 1621 __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag); | 1625 __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag); |
| 1622 __ vldrd(DTMP, Address(TMP, 0)); | 1626 __ vldrd(DTMP, Address(TMP, 0)); |
| 1623 } | 1627 } |
| 1624 const intptr_t dest_offset = destination.ToStackSlotOffset(); | 1628 const intptr_t dest_offset = destination.ToStackSlotOffset(); |
| 1625 __ StoreDToOffset(DTMP, FP, dest_offset); | 1629 __ StoreDToOffset(DTMP, FP, dest_offset); |
| 1626 } else { | 1630 } else { |
| 1627 ASSERT(destination.IsStackSlot()); | 1631 ASSERT(destination.IsStackSlot()); |
| 1628 const intptr_t dest_offset = destination.ToStackSlotOffset(); | 1632 const intptr_t dest_offset = destination.ToStackSlotOffset(); |
| 1629 __ LoadObject(TMP, constant); | 1633 if (source.constant_instruction()->representation() == kUnboxedInt32) { |
| 1634 __ LoadImmediate(TMP, Smi::Cast(constant).Value()); |
| 1635 } else { |
| 1636 __ LoadObject(TMP, constant); |
| 1637 } |
| 1630 __ StoreToOffset(kWord, TMP, FP, dest_offset); | 1638 __ StoreToOffset(kWord, TMP, FP, dest_offset); |
| 1631 } | 1639 } |
| 1632 } | 1640 } |
| 1633 | 1641 |
| 1634 move->Eliminate(); | 1642 move->Eliminate(); |
| 1635 } | 1643 } |
| 1636 | 1644 |
| 1637 | 1645 |
| 1638 void ParallelMoveResolver::EmitSwap(int index) { | 1646 void ParallelMoveResolver::EmitSwap(int index) { |
| 1639 MoveOperands* move = moves_[index]; | 1647 MoveOperands* move = moves_[index]; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1777 DRegister dreg = EvenDRegisterOf(reg); | 1785 DRegister dreg = EvenDRegisterOf(reg); |
| 1778 __ vldrd(dreg, Address(SP, kDoubleSize, Address::PostIndex)); | 1786 __ vldrd(dreg, Address(SP, kDoubleSize, Address::PostIndex)); |
| 1779 } | 1787 } |
| 1780 | 1788 |
| 1781 | 1789 |
| 1782 #undef __ | 1790 #undef __ |
| 1783 | 1791 |
| 1784 } // namespace dart | 1792 } // namespace dart |
| 1785 | 1793 |
| 1786 #endif // defined TARGET_ARCH_ARM | 1794 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |