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 |