Chromium Code Reviews| 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 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 543 // Comparison. | 543 // Comparison. |
| 544 // rn cmp o. | 544 // rn cmp o. |
| 545 void cmp(Register rn, Operand o) { | 545 void cmp(Register rn, Operand o) { |
| 546 subs(ZR, rn, o); | 546 subs(ZR, rn, o); |
| 547 } | 547 } |
| 548 // rn cmp -o. | 548 // rn cmp -o. |
| 549 void cmn(Register rn, Operand o) { | 549 void cmn(Register rn, Operand o) { |
| 550 adds(ZR, rn, o); | 550 adds(ZR, rn, o); |
| 551 } | 551 } |
| 552 | 552 |
| 553 void CompareRegisters(Register rn, Register rm) { | |
| 554 if (rn == SP) { | |
| 555 // UXTX 0 on a 64-bit register (rm) is a nop, but forces R31 to be | |
| 556 // interpreted as SP. | |
| 557 cmp(SP, Operand(rm, UXTX, 0)); | |
|
regis
2014/04/22 23:38:10
I suppose you have an assert in cmp() making sure
zra
2014/04/23 17:18:45
The relevant asserts are in AddSubHelper. I've add
| |
| 558 } else { | |
| 559 cmp(rn, Operand(rm)); | |
| 560 } | |
| 561 } | |
| 562 | |
| 553 // Conditional branch. | 563 // Conditional branch. |
| 554 void b(Label* label, Condition cond = AL) { | 564 void b(Label* label, Condition cond = AL) { |
| 555 EmitBranch(BCOND, cond, label); | 565 EmitBranch(BCOND, cond, label); |
| 556 } | 566 } |
| 557 | 567 |
| 558 // TODO(zra): branch and link with imm26 offset. | 568 // TODO(zra): branch and link with imm26 offset. |
| 559 // TODO(zra): cbz, cbnz. | 569 // TODO(zra): cbz, cbnz. |
| 560 | 570 |
| 561 // Branch, link, return. | 571 // Branch, link, return. |
| 562 void br(Register rn) { | 572 void br(Register rn) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 626 } | 636 } |
| 627 void Asr(Register rd, Register rn, int shift) { | 637 void Asr(Register rd, Register rn, int shift) { |
| 628 add(rd, ZR, Operand(rn, ASR, shift)); | 638 add(rd, ZR, Operand(rn, ASR, shift)); |
| 629 } | 639 } |
| 630 | 640 |
| 631 void SmiUntag(Register reg) { | 641 void SmiUntag(Register reg) { |
| 632 Asr(reg, reg, kSmiTagSize); | 642 Asr(reg, reg, kSmiTagSize); |
| 633 } | 643 } |
| 634 | 644 |
| 635 // Branching to ExternalLabels. | 645 // Branching to ExternalLabels. |
| 636 void Branch(const ExternalLabel* label) { | 646 void BranchPatchable(const ExternalLabel* label, Register pp) { |
| 637 LoadExternalLabel(TMP, label, kPatchable, PP); | 647 LoadExternalLabel(TMP, label, kPatchable, pp); |
| 638 br(TMP); | 648 br(TMP); |
| 639 } | 649 } |
| 640 | 650 |
| 641 void BranchPatchable(const ExternalLabel* label) { | 651 void Branch(const ExternalLabel* label, Register pp) { |
| 642 LoadPatchableImmediate(TMP, label->address()); | 652 LoadExternalLabel(TMP, label, kNotPatchable, pp); |
| 653 br(TMP); | |
| 654 } | |
| 655 | |
| 656 // Fixed length branch to label. | |
| 657 void BranchFixed(const ExternalLabel* label) { | |
| 658 LoadImmediateFixed(TMP, label->address()); | |
| 643 br(TMP); | 659 br(TMP); |
| 644 } | 660 } |
| 645 | 661 |
| 646 void BranchLink(const ExternalLabel* label, Register pp) { | 662 void BranchLink(const ExternalLabel* label, Register pp) { |
| 647 if (Isolate::Current() == Dart::vm_isolate()) { | 663 if (Isolate::Current() == Dart::vm_isolate()) { |
| 648 LoadImmediate(TMP, label->address(), kNoRegister); | 664 LoadImmediate(TMP, label->address(), kNoRegister); |
| 649 blr(TMP); | 665 blr(TMP); |
| 650 } else { | 666 } else { |
| 651 LoadExternalLabel(TMP, label, kNotPatchable, pp); | 667 LoadExternalLabel(TMP, label, kNotPatchable, pp); |
| 652 blr(TMP); | 668 blr(TMP); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 697 intptr_t FindExternalLabel(const ExternalLabel* label, | 713 intptr_t FindExternalLabel(const ExternalLabel* label, |
| 698 Patchability patchable); | 714 Patchability patchable); |
| 699 intptr_t FindObject(const Object& obj, Patchability patchable); | 715 intptr_t FindObject(const Object& obj, Patchability patchable); |
| 700 intptr_t FindImmediate(int64_t imm); | 716 intptr_t FindImmediate(int64_t imm); |
| 701 bool CanLoadObjectFromPool(const Object& object); | 717 bool CanLoadObjectFromPool(const Object& object); |
| 702 bool CanLoadImmediateFromPool(int64_t imm, Register pp); | 718 bool CanLoadImmediateFromPool(int64_t imm, Register pp); |
| 703 void LoadExternalLabel(Register dst, const ExternalLabel* label, | 719 void LoadExternalLabel(Register dst, const ExternalLabel* label, |
| 704 Patchability patchable, Register pp); | 720 Patchability patchable, Register pp); |
| 705 void LoadObject(Register dst, const Object& obj, Register pp); | 721 void LoadObject(Register dst, const Object& obj, Register pp); |
| 706 void LoadDecodableImmediate(Register reg, int64_t imm, Register pp); | 722 void LoadDecodableImmediate(Register reg, int64_t imm, Register pp); |
| 707 void LoadPatchableImmediate(Register reg, int64_t imm); | 723 void LoadImmediateFixed(Register reg, int64_t imm); |
| 708 void LoadImmediate(Register reg, int64_t imm, Register pp); | 724 void LoadImmediate(Register reg, int64_t imm, Register pp); |
| 709 | 725 |
| 710 void PushObject(const Object& object, Register pp) { | 726 void PushObject(const Object& object, Register pp) { |
| 711 LoadObject(TMP, object, pp); | 727 LoadObject(TMP, object, pp); |
| 712 Push(TMP); | 728 Push(TMP); |
| 713 } | 729 } |
| 714 | 730 |
| 715 void EnterFrame(intptr_t frame_size); | 731 void EnterFrame(intptr_t frame_size); |
| 716 void LeaveFrame(); | 732 void LeaveFrame(); |
| 717 | 733 |
| 718 void EnterDartFrame(intptr_t frame_size); | 734 void EnterDartFrame(intptr_t frame_size); |
| 735 void EnterDartFrameWithInfo(intptr_t frame_size, Register new_pp); | |
| 736 void EnterOsrFrame(intptr_t extra_size, Register new_pp); | |
| 719 void LeaveDartFrame(); | 737 void LeaveDartFrame(); |
| 720 | 738 |
| 721 void EnterCallRuntimeFrame(intptr_t frame_size); | 739 void EnterCallRuntimeFrame(intptr_t frame_size); |
| 722 void LeaveCallRuntimeFrame(); | 740 void LeaveCallRuntimeFrame(); |
| 723 | 741 |
| 724 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); | 742 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); |
| 725 | 743 |
| 726 private: | 744 private: |
| 727 AssemblerBuffer buffer_; // Contains position independent code. | 745 AssemblerBuffer buffer_; // Contains position independent code. |
| 728 | 746 |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1034 Register value, | 1052 Register value, |
| 1035 Label* no_update); | 1053 Label* no_update); |
| 1036 | 1054 |
| 1037 DISALLOW_ALLOCATION(); | 1055 DISALLOW_ALLOCATION(); |
| 1038 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1056 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1039 }; | 1057 }; |
| 1040 | 1058 |
| 1041 } // namespace dart | 1059 } // namespace dart |
| 1042 | 1060 |
| 1043 #endif // VM_ASSEMBLER_ARM64_H_ | 1061 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |