Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: runtime/vm/assembler_arm64.h

Issue 246293010: Enables first codegen test on arm64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64.cc » ('j') | runtime/vm/assembler_x64.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64.cc » ('j') | runtime/vm/assembler_x64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698