| 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 #ifndef VM_ASSEMBLER_ARM64_H_ | 5 #ifndef VM_ASSEMBLER_ARM64_H_ |
| 6 #define VM_ASSEMBLER_ARM64_H_ | 6 #define VM_ASSEMBLER_ARM64_H_ |
| 7 | 7 |
| 8 #ifndef VM_ASSEMBLER_H_ | 8 #ifndef VM_ASSEMBLER_H_ |
| 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. |
| 10 #endif | 10 #endif |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 EmitLoadStoreReg(LDR, rt, a, sz); | 605 EmitLoadStoreReg(LDR, rt, a, sz); |
| 606 } | 606 } |
| 607 } | 607 } |
| 608 } | 608 } |
| 609 void str(Register rt, Address a, OperandSize sz = kDoubleWord) { | 609 void str(Register rt, Address a, OperandSize sz = kDoubleWord) { |
| 610 EmitLoadStoreReg(STR, rt, a, sz); | 610 EmitLoadStoreReg(STR, rt, a, sz); |
| 611 } | 611 } |
| 612 | 612 |
| 613 // Conditional select. | 613 // Conditional select. |
| 614 void csel(Register rd, Register rn, Register rm, Condition cond) { | 614 void csel(Register rd, Register rn, Register rm, Condition cond) { |
| 615 EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord); | 615 EmitConditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord); |
| 616 } | 616 } |
| 617 void csinc(Register rd, Register rn, Register rm, Condition cond) { | 617 void csinc(Register rd, Register rn, Register rm, Condition cond) { |
| 618 EmitCoditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord); | 618 EmitConditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord); |
| 619 } | 619 } |
| 620 void cinc(Register rd, Register rn, Condition cond) { | 620 void cinc(Register rd, Register rn, Condition cond) { |
| 621 csinc(rd, rn, rn, InvertCondition(cond)); | 621 csinc(rd, rn, rn, InvertCondition(cond)); |
| 622 } | 622 } |
| 623 void cset(Register rd, Condition cond) { | 623 void cset(Register rd, Condition cond) { |
| 624 csinc(rd, ZR, ZR, InvertCondition(cond)); | 624 csinc(rd, ZR, ZR, InvertCondition(cond)); |
| 625 } | 625 } |
| 626 void csinv(Register rd, Register rn, Register rm, Condition cond) { |
| 627 EmitConditionalSelect(CSINV, rd, rn, rm, cond, kDoubleWord); |
| 628 } |
| 629 void cinv(Register rd, Register rn, Condition cond) { |
| 630 csinv(rd, rn, rn, InvertCondition(cond)); |
| 631 } |
| 632 void csetm(Register rd, Condition cond) { |
| 633 csinv(rd, ZR, ZR, InvertCondition(cond)); |
| 634 } |
| 626 | 635 |
| 627 // Comparison. | 636 // Comparison. |
| 628 // rn cmp o. | 637 // rn cmp o. |
| 629 // For add and sub, to use SP for rn, o must be of type Operand::Extend. | 638 // For add and sub, to use SP for rn, o must be of type Operand::Extend. |
| 630 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); | 639 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); |
| 631 void cmp(Register rn, Operand o) { | 640 void cmp(Register rn, Operand o) { |
| 632 subs(ZR, rn, o); | 641 subs(ZR, rn, o); |
| 633 } | 642 } |
| 634 // rn cmp -o. | 643 // rn cmp -o. |
| 635 void cmn(Register rn, Operand o) { | 644 void cmn(Register rn, Operand o) { |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1003 void Asr(Register rd, Register rn, int shift) { | 1012 void Asr(Register rd, Register rn, int shift) { |
| 1004 add(rd, ZR, Operand(rn, ASR, shift)); | 1013 add(rd, ZR, Operand(rn, ASR, shift)); |
| 1005 } | 1014 } |
| 1006 | 1015 |
| 1007 void VRecps(VRegister vd, VRegister vn); | 1016 void VRecps(VRegister vd, VRegister vn); |
| 1008 void VRSqrts(VRegister vd, VRegister vn); | 1017 void VRSqrts(VRegister vd, VRegister vn); |
| 1009 | 1018 |
| 1010 void SmiUntag(Register reg) { | 1019 void SmiUntag(Register reg) { |
| 1011 Asr(reg, reg, kSmiTagSize); | 1020 Asr(reg, reg, kSmiTagSize); |
| 1012 } | 1021 } |
| 1022 void SmiUntag(Register dst, Register src) { |
| 1023 Asr(dst, src, kSmiTagSize); |
| 1024 } |
| 1013 void SmiTag(Register reg) { | 1025 void SmiTag(Register reg) { |
| 1014 Lsl(reg, reg, kSmiTagSize); | 1026 Lsl(reg, reg, kSmiTagSize); |
| 1015 } | 1027 } |
| 1016 | 1028 |
| 1017 // Branching to ExternalLabels. | 1029 // Branching to ExternalLabels. |
| 1018 void Branch(const ExternalLabel* label, Register pp) { | 1030 void Branch(const ExternalLabel* label, Register pp) { |
| 1019 LoadExternalLabel(TMP, label, kNotPatchable, pp); | 1031 LoadExternalLabel(TMP, label, kNotPatchable, pp); |
| 1020 br(TMP); | 1032 br(TMP); |
| 1021 } | 1033 } |
| 1022 | 1034 |
| (...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1542 const int32_t size = (sz == kDoubleWord) ? B31 : 0; | 1554 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 1543 const int32_t encoding = | 1555 const int32_t encoding = |
| 1544 op | size | | 1556 op | size | |
| 1545 (static_cast<int32_t>(crd) << kRdShift) | | 1557 (static_cast<int32_t>(crd) << kRdShift) | |
| 1546 (static_cast<int32_t>(crn) << kRnShift) | | 1558 (static_cast<int32_t>(crn) << kRnShift) | |
| 1547 (static_cast<int32_t>(crm) << kRmShift) | | 1559 (static_cast<int32_t>(crm) << kRmShift) | |
| 1548 (static_cast<int32_t>(cra) << kRaShift); | 1560 (static_cast<int32_t>(cra) << kRaShift); |
| 1549 Emit(encoding); | 1561 Emit(encoding); |
| 1550 } | 1562 } |
| 1551 | 1563 |
| 1552 void EmitCoditionalSelect(ConditionalSelectOp op, | 1564 void EmitConditionalSelect(ConditionalSelectOp op, |
| 1553 Register rd, Register rn, Register rm, | 1565 Register rd, Register rn, Register rm, |
| 1554 Condition cond, OperandSize sz) { | 1566 Condition cond, OperandSize sz) { |
| 1555 ASSERT((rd != SP) && (rn != SP) && (rm != SP)); | 1567 ASSERT((rd != SP) && (rn != SP) && (rm != SP)); |
| 1556 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord)); | 1568 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord)); |
| 1557 const Register crd = ConcreteRegister(rd); | 1569 const Register crd = ConcreteRegister(rd); |
| 1558 const Register crn = ConcreteRegister(rn); | 1570 const Register crn = ConcreteRegister(rn); |
| 1559 const Register crm = ConcreteRegister(rm); | 1571 const Register crm = ConcreteRegister(rm); |
| 1560 const int32_t size = (sz == kDoubleWord) ? B31 : 0; | 1572 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 1561 const int32_t encoding = | 1573 const int32_t encoding = |
| 1562 op | size | | 1574 op | size | |
| 1563 (static_cast<int32_t>(crd) << kRdShift) | | 1575 (static_cast<int32_t>(crd) << kRdShift) | |
| 1564 (static_cast<int32_t>(crn) << kRnShift) | | 1576 (static_cast<int32_t>(crn) << kRnShift) | |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1648 Register value, | 1660 Register value, |
| 1649 Label* no_update); | 1661 Label* no_update); |
| 1650 | 1662 |
| 1651 DISALLOW_ALLOCATION(); | 1663 DISALLOW_ALLOCATION(); |
| 1652 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1664 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1653 }; | 1665 }; |
| 1654 | 1666 |
| 1655 } // namespace dart | 1667 } // namespace dart |
| 1656 | 1668 |
| 1657 #endif // VM_ASSEMBLER_ARM64_H_ | 1669 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |