| 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 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); | 611 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 612 sub(PP, PP, Operand(kHeapObjectTag)); | 612 sub(PP, PP, Operand(kHeapObjectTag)); |
| 613 } | 613 } |
| 614 void tst(Register rn, Operand o) { | 614 void tst(Register rn, Operand o) { |
| 615 ands(ZR, rn, o); | 615 ands(ZR, rn, o); |
| 616 } | 616 } |
| 617 void tsti(Register rn, uint64_t imm) { | 617 void tsti(Register rn, uint64_t imm) { |
| 618 andis(ZR, rn, imm); | 618 andis(ZR, rn, imm); |
| 619 } | 619 } |
| 620 | 620 |
| 621 void Lsl(Register rd, Register rn, int shift) { |
| 622 add(rd, ZR, Operand(rn, LSL, shift)); |
| 623 } |
| 624 void Lsr(Register rd, Register rn, int shift) { |
| 625 add(rd, ZR, Operand(rn, LSR, shift)); |
| 626 } |
| 627 void Asr(Register rd, Register rn, int shift) { |
| 628 add(rd, ZR, Operand(rn, ASR, shift)); |
| 629 } |
| 630 |
| 621 void SmiUntag(Register reg) { | 631 void SmiUntag(Register reg) { |
| 622 add(reg, ZR, Operand(reg, ASR, kSmiTagSize)); | 632 Asr(reg, reg, kSmiTagSize); |
| 623 } | 633 } |
| 624 | 634 |
| 625 // Branching to ExternalLabels. | 635 // Branching to ExternalLabels. |
| 626 void Branch(const ExternalLabel* label) { | 636 void Branch(const ExternalLabel* label) { |
| 627 LoadExternalLabel(TMP, label, kPatchable, PP); | 637 LoadExternalLabel(TMP, label, kPatchable, PP); |
| 628 br(TMP); | 638 br(TMP); |
| 629 } | 639 } |
| 630 | 640 |
| 631 void BranchPatchable(const ExternalLabel* label) { | 641 void BranchPatchable(const ExternalLabel* label) { |
| 632 LoadPatchableImmediate(TMP, label->address()); | 642 LoadPatchableImmediate(TMP, label->address()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 656 void CompareImmediate(Register rn, int64_t imm, Register pp); | 666 void CompareImmediate(Register rn, int64_t imm, Register pp); |
| 657 void LoadFromOffset(Register dest, Register base, int32_t offset); | 667 void LoadFromOffset(Register dest, Register base, int32_t offset); |
| 658 void LoadFieldFromOffset(Register dest, Register base, int32_t offset) { | 668 void LoadFieldFromOffset(Register dest, Register base, int32_t offset) { |
| 659 LoadFromOffset(dest, base, offset - kHeapObjectTag); | 669 LoadFromOffset(dest, base, offset - kHeapObjectTag); |
| 660 } | 670 } |
| 661 void StoreToOffset(Register dest, Register base, int32_t offset); | 671 void StoreToOffset(Register dest, Register base, int32_t offset); |
| 662 void StoreFieldToOffset(Register dest, Register base, int32_t offset) { | 672 void StoreFieldToOffset(Register dest, Register base, int32_t offset) { |
| 663 StoreToOffset(dest, base, offset - kHeapObjectTag); | 673 StoreToOffset(dest, base, offset - kHeapObjectTag); |
| 664 } | 674 } |
| 665 | 675 |
| 676 // Storing into an object. |
| 677 void StoreIntoObject(Register object, |
| 678 const Address& dest, |
| 679 Register value, |
| 680 bool can_value_be_smi = true); |
| 681 void StoreIntoObjectNoBarrier(Register object, |
| 682 const Address& dest, |
| 683 Register value); |
| 684 void StoreIntoObjectNoBarrier(Register object, |
| 685 const Address& dest, |
| 686 const Object& value); |
| 687 |
| 666 // Object pool, loading from pool, etc. | 688 // Object pool, loading from pool, etc. |
| 667 void LoadPoolPointer(Register pp); | 689 void LoadPoolPointer(Register pp); |
| 668 | 690 |
| 669 enum Patchability { | 691 enum Patchability { |
| 670 kPatchable, | 692 kPatchable, |
| 671 kNotPatchable, | 693 kNotPatchable, |
| 672 }; | 694 }; |
| 673 | 695 |
| 674 void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset); | 696 void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset); |
| 675 intptr_t FindExternalLabel(const ExternalLabel* label, | 697 intptr_t FindExternalLabel(const ExternalLabel* label, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 689 LoadObject(TMP, object, pp); | 711 LoadObject(TMP, object, pp); |
| 690 Push(TMP); | 712 Push(TMP); |
| 691 } | 713 } |
| 692 | 714 |
| 693 void EnterFrame(intptr_t frame_size); | 715 void EnterFrame(intptr_t frame_size); |
| 694 void LeaveFrame(); | 716 void LeaveFrame(); |
| 695 | 717 |
| 696 void EnterDartFrame(intptr_t frame_size); | 718 void EnterDartFrame(intptr_t frame_size); |
| 697 void LeaveDartFrame(); | 719 void LeaveDartFrame(); |
| 698 | 720 |
| 721 void EnterCallRuntimeFrame(intptr_t frame_size); |
| 722 void LeaveCallRuntimeFrame(); |
| 723 |
| 699 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); | 724 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); |
| 700 | 725 |
| 701 private: | 726 private: |
| 702 AssemblerBuffer buffer_; // Contains position independent code. | 727 AssemblerBuffer buffer_; // Contains position independent code. |
| 703 | 728 |
| 704 // Objects and patchable jump targets. | 729 // Objects and patchable jump targets. |
| 705 GrowableObjectArray& object_pool_; | 730 GrowableObjectArray& object_pool_; |
| 706 | 731 |
| 707 // Patchability of pool entries. | 732 // Patchability of pool entries. |
| 708 GrowableArray<Patchability> patchable_pool_entries_; | 733 GrowableArray<Patchability> patchable_pool_entries_; |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 const int32_t size = (sz == kDoubleWord) ? B31 : 0; | 1020 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 996 const int32_t encoding = | 1021 const int32_t encoding = |
| 997 op | size | | 1022 op | size | |
| 998 (static_cast<int32_t>(crd) << kRdShift) | | 1023 (static_cast<int32_t>(crd) << kRdShift) | |
| 999 (static_cast<int32_t>(crn) << kRnShift) | | 1024 (static_cast<int32_t>(crn) << kRnShift) | |
| 1000 (static_cast<int32_t>(crm) << kRmShift) | | 1025 (static_cast<int32_t>(crm) << kRmShift) | |
| 1001 (static_cast<int32_t>(cra) << kRaShift); | 1026 (static_cast<int32_t>(cra) << kRaShift); |
| 1002 Emit(encoding); | 1027 Emit(encoding); |
| 1003 } | 1028 } |
| 1004 | 1029 |
| 1030 void StoreIntoObjectFilter(Register object, Register value, Label* no_update); |
| 1031 |
| 1032 // Shorter filtering sequence that assumes that value is not a smi. |
| 1033 void StoreIntoObjectFilterNoSmi(Register object, |
| 1034 Register value, |
| 1035 Label* no_update); |
| 1036 |
| 1005 DISALLOW_ALLOCATION(); | 1037 DISALLOW_ALLOCATION(); |
| 1006 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1038 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1007 }; | 1039 }; |
| 1008 | 1040 |
| 1009 } // namespace dart | 1041 } // namespace dart |
| 1010 | 1042 |
| 1011 #endif // VM_ASSEMBLER_ARM64_H_ | 1043 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |