| 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 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 madd(rd, rn, rm, ZR); | 653 madd(rd, rn, rm, ZR); |
| 654 } | 654 } |
| 655 void Push(Register reg) { | 655 void Push(Register reg) { |
| 656 ASSERT(reg != PP); // Only push PP with TagAndPushPP(). | 656 ASSERT(reg != PP); // Only push PP with TagAndPushPP(). |
| 657 str(reg, Address(SP, -1 * kWordSize, Address::PreIndex)); | 657 str(reg, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 658 } | 658 } |
| 659 void Pop(Register reg) { | 659 void Pop(Register reg) { |
| 660 ASSERT(reg != PP); // Only pop PP with PopAndUntagPP(). | 660 ASSERT(reg != PP); // Only pop PP with PopAndUntagPP(). |
| 661 ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex)); | 661 ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 662 } | 662 } |
| 663 void PushDouble(VRegister reg) { |
| 664 fstrd(reg, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 665 } |
| 666 void PopDouble(VRegister reg) { |
| 667 fldrd(reg, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 668 } |
| 663 void TagAndPushPP() { | 669 void TagAndPushPP() { |
| 664 // Add the heap object tag back to PP before putting it on the stack. | 670 // Add the heap object tag back to PP before putting it on the stack. |
| 665 add(TMP, PP, Operand(kHeapObjectTag)); | 671 add(TMP, PP, Operand(kHeapObjectTag)); |
| 666 str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex)); | 672 str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 667 } | 673 } |
| 668 void PopAndUntagPP() { | 674 void PopAndUntagPP() { |
| 669 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); | 675 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 670 sub(PP, PP, Operand(kHeapObjectTag)); | 676 sub(PP, PP, Operand(kHeapObjectTag)); |
| 671 } | 677 } |
| 672 void tst(Register rn, Operand o) { | 678 void tst(Register rn, Operand o) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 // PP should be passed for pp. | 737 // PP should be passed for pp. |
| 732 void AddImmediate(Register dest, Register rn, int64_t imm, Register pp); | 738 void AddImmediate(Register dest, Register rn, int64_t imm, Register pp); |
| 733 void TestImmediate(Register rn, int64_t imm, Register pp); | 739 void TestImmediate(Register rn, int64_t imm, Register pp); |
| 734 void CompareImmediate(Register rn, int64_t imm, Register pp); | 740 void CompareImmediate(Register rn, int64_t imm, Register pp); |
| 735 | 741 |
| 736 void LoadFromOffset(Register dest, Register base, int32_t offset, | 742 void LoadFromOffset(Register dest, Register base, int32_t offset, |
| 737 OperandSize sz = kDoubleWord); | 743 OperandSize sz = kDoubleWord); |
| 738 void LoadFieldFromOffset(Register dest, Register base, int32_t offset) { | 744 void LoadFieldFromOffset(Register dest, Register base, int32_t offset) { |
| 739 LoadFromOffset(dest, base, offset - kHeapObjectTag); | 745 LoadFromOffset(dest, base, offset - kHeapObjectTag); |
| 740 } | 746 } |
| 747 void LoadDFromOffset(VRegister dest, Register base, int32_t offset); |
| 748 void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) { |
| 749 LoadDFromOffset(dest, base, offset - kHeapObjectTag); |
| 750 } |
| 741 | 751 |
| 742 void StoreToOffset(Register dest, Register base, int32_t offset, | 752 void StoreToOffset(Register src, Register base, int32_t offset, |
| 743 OperandSize sz = kDoubleWord); | 753 OperandSize sz = kDoubleWord); |
| 744 void StoreFieldToOffset(Register dest, Register base, int32_t offset) { | 754 void StoreFieldToOffset(Register src, Register base, int32_t offset) { |
| 745 StoreToOffset(dest, base, offset - kHeapObjectTag); | 755 StoreToOffset(src, base, offset - kHeapObjectTag); |
| 756 } |
| 757 void StoreDToOffset(VRegister src, Register base, int32_t offset); |
| 758 void StoreDFieldToOffset(VRegister src, Register base, int32_t offset) { |
| 759 StoreDToOffset(src, base, offset - kHeapObjectTag); |
| 746 } | 760 } |
| 747 | 761 |
| 748 // Storing into an object. | 762 // Storing into an object. |
| 749 void StoreIntoObject(Register object, | 763 void StoreIntoObject(Register object, |
| 750 const Address& dest, | 764 const Address& dest, |
| 751 Register value, | 765 Register value, |
| 752 bool can_value_be_smi = true); | 766 bool can_value_be_smi = true); |
| 753 void StoreIntoObjectNoBarrier(Register object, | 767 void StoreIntoObjectNoBarrier(Register object, |
| 754 const Address& dest, | 768 const Address& dest, |
| 755 Register value); | 769 Register value); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 Register temp_reg, | 829 Register temp_reg, |
| 816 Register pp, | 830 Register pp, |
| 817 Heap::Space space = Heap::kNew); | 831 Heap::Space space = Heap::kNew); |
| 818 | 832 |
| 819 void UpdateAllocationStatsWithSize(intptr_t cid, | 833 void UpdateAllocationStatsWithSize(intptr_t cid, |
| 820 Register size_reg, | 834 Register size_reg, |
| 821 Register temp_reg, | 835 Register temp_reg, |
| 822 Register pp, | 836 Register pp, |
| 823 Heap::Space space = Heap::kNew); | 837 Heap::Space space = Heap::kNew); |
| 824 | 838 |
| 839 // Inlined allocation of an instance of class 'cls', code has no runtime |
| 840 // calls. Jump to 'failure' if the instance cannot be allocated here. |
| 841 // Allocated instance is returned in 'instance_reg'. |
| 842 // Only the tags field of the object is initialized. |
| 843 void TryAllocate(const Class& cls, |
| 844 Label* failure, |
| 845 Register instance_reg, |
| 846 Register temp_reg, |
| 847 Register pp); |
| 848 |
| 825 private: | 849 private: |
| 826 AssemblerBuffer buffer_; // Contains position independent code. | 850 AssemblerBuffer buffer_; // Contains position independent code. |
| 827 | 851 |
| 828 // Objects and patchable jump targets. | 852 // Objects and patchable jump targets. |
| 829 GrowableObjectArray& object_pool_; | 853 GrowableObjectArray& object_pool_; |
| 830 | 854 |
| 831 // Patchability of pool entries. | 855 // Patchability of pool entries. |
| 832 GrowableArray<Patchability> patchable_pool_entries_; | 856 GrowableArray<Patchability> patchable_pool_entries_; |
| 833 | 857 |
| 834 // Pair type parameter for DirectChainedHashMap. | 858 // Pair type parameter for DirectChainedHashMap. |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 Register value, | 1193 Register value, |
| 1170 Label* no_update); | 1194 Label* no_update); |
| 1171 | 1195 |
| 1172 DISALLOW_ALLOCATION(); | 1196 DISALLOW_ALLOCATION(); |
| 1173 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1197 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1174 }; | 1198 }; |
| 1175 | 1199 |
| 1176 } // namespace dart | 1200 } // namespace dart |
| 1177 | 1201 |
| 1178 #endif // VM_ASSEMBLER_ARM64_H_ | 1202 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |