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

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

Issue 253623003: Enables all startup code for arm64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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') | no next file with comments »
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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 // PC-relative load address. 148 // PC-relative load address.
149 static Address PC(int32_t pc_off) { 149 static Address PC(int32_t pc_off) {
150 ASSERT(CanHoldOffset(pc_off, PCOffset)); 150 ASSERT(CanHoldOffset(pc_off, PCOffset));
151 Address addr; 151 Address addr;
152 addr.encoding_ = (((pc_off >> 2) << kImm19Shift) & kImm19Mask); 152 addr.encoding_ = (((pc_off >> 2) << kImm19Shift) & kImm19Mask);
153 addr.base_ = kNoRegister; 153 addr.base_ = kNoRegister;
154 addr.type_ = PCOffset; 154 addr.type_ = PCOffset;
155 return addr; 155 return addr;
156 } 156 }
157 157
158 enum Scaling {
159 Unscaled,
160 Scaled,
161 };
162
158 // Base register rn with offset rm. rm is sign-extended according to ext. 163 // Base register rn with offset rm. rm is sign-extended according to ext.
159 // If ext is UXTX, rm may be optionally scaled by the 164 // If ext is UXTX, rm may be optionally scaled by the
160 // Log2OperandSize (specified by the instruction). 165 // Log2OperandSize (specified by the instruction).
161 Address(Register rn, Register rm, Extend ext = UXTX, bool scaled = false) { 166 Address(Register rn, Register rm,
167 Extend ext = UXTX, Scaling scale = Unscaled) {
162 ASSERT((rn != R31) && (rn != ZR)); 168 ASSERT((rn != R31) && (rn != ZR));
163 ASSERT((rm != R31) && (rm != SP)); 169 ASSERT((rm != R31) && (rm != SP));
164 ASSERT(!scaled || (ext == UXTX)); // Can only scale when ext = UXTX. 170 // Can only scale when ext = UXTX.
171 ASSERT((scale != Scaled) || (ext == UXTX));
165 ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX)); 172 ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX));
166 const Register crn = ConcreteRegister(rn); 173 const Register crn = ConcreteRegister(rn);
167 const Register crm = ConcreteRegister(rm); 174 const Register crm = ConcreteRegister(rm);
168 const int32_t s = scaled ? B12 : 0; 175 const int32_t s = (scale == Scaled) ? B12 : 0;
169 encoding_ = 176 encoding_ =
170 B21 | B11 | s | 177 B21 | B11 | s |
171 (static_cast<int32_t>(crn) << kRnShift) | 178 (static_cast<int32_t>(crn) << kRnShift) |
172 (static_cast<int32_t>(crm) << kRmShift) | 179 (static_cast<int32_t>(crm) << kRmShift) |
173 (static_cast<int32_t>(ext) << kExtendTypeShift); 180 (static_cast<int32_t>(ext) << kExtendTypeShift);
174 type_ = Reg; 181 type_ = Reg;
175 base_ = crn; 182 base_ = crn;
176 } 183 }
177 184
178 private: 185 private:
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 ASSERT(((a.type() != Address::PreIndex) && 543 ASSERT(((a.type() != Address::PreIndex) &&
537 (a.type() != Address::PostIndex)) || 544 (a.type() != Address::PostIndex)) ||
538 (rt != a.base())); 545 (rt != a.base()));
539 EmitLoadStoreReg(LDR, rt, a, sz); 546 EmitLoadStoreReg(LDR, rt, a, sz);
540 } 547 }
541 } 548 }
542 void str(Register rt, Address a, OperandSize sz = kDoubleWord) { 549 void str(Register rt, Address a, OperandSize sz = kDoubleWord) {
543 EmitLoadStoreReg(STR, rt, a, sz); 550 EmitLoadStoreReg(STR, rt, a, sz);
544 } 551 }
545 552
553 // Conditional select.
554 void csel(Register rd, Register rn, Register rm, Condition cond) {
555 EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
556 }
557
546 // Comparison. 558 // Comparison.
547 // rn cmp o. 559 // rn cmp o.
548 // For add and sub, to use SP for rn, o must be of type Operand::Extend. 560 // For add and sub, to use SP for rn, o must be of type Operand::Extend.
549 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); 561 // For an unmodified rm in this case, use Operand(rm, UXTX, 0);
550 void cmp(Register rn, Operand o) { 562 void cmp(Register rn, Operand o) {
551 subs(ZR, rn, o); 563 subs(ZR, rn, o);
552 } 564 }
553 // rn cmp -o. 565 // rn cmp -o.
554 void cmn(Register rn, Operand o) { 566 void cmn(Register rn, Operand o) {
555 adds(ZR, rn, o); 567 adds(ZR, rn, o);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 void Push(Register reg) { 624 void Push(Register reg) {
613 ASSERT(reg != PP); // Only push PP with TagAndPushPP(). 625 ASSERT(reg != PP); // Only push PP with TagAndPushPP().
614 str(reg, Address(SP, -1 * kWordSize, Address::PreIndex)); 626 str(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
615 } 627 }
616 void Pop(Register reg) { 628 void Pop(Register reg) {
617 ASSERT(reg != PP); // Only pop PP with PopAndUntagPP(). 629 ASSERT(reg != PP); // Only pop PP with PopAndUntagPP().
618 ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex)); 630 ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
619 } 631 }
620 void TagAndPushPP() { 632 void TagAndPushPP() {
621 // Add the heap object tag back to PP before putting it on the stack. 633 // Add the heap object tag back to PP before putting it on the stack.
622 add(PP, PP, Operand(kHeapObjectTag)); 634 add(TMP, PP, Operand(kHeapObjectTag));
623 str(PP, Address(SP, -1 * kWordSize, Address::PreIndex)); 635 str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex));
624 } 636 }
625 void PopAndUntagPP() { 637 void PopAndUntagPP() {
626 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); 638 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex));
627 sub(PP, PP, Operand(kHeapObjectTag)); 639 sub(PP, PP, Operand(kHeapObjectTag));
628 } 640 }
629 void tst(Register rn, Operand o) { 641 void tst(Register rn, Operand o) {
630 ands(ZR, rn, o); 642 ands(ZR, rn, o);
631 } 643 }
632 void tsti(Register rn, uint64_t imm) { 644 void tsti(Register rn, uint64_t imm) {
633 andis(ZR, rn, imm); 645 andis(ZR, rn, imm);
634 } 646 }
635 647
636 void Lsl(Register rd, Register rn, int shift) { 648 void Lsl(Register rd, Register rn, int shift) {
637 add(rd, ZR, Operand(rn, LSL, shift)); 649 add(rd, ZR, Operand(rn, LSL, shift));
638 } 650 }
639 void Lsr(Register rd, Register rn, int shift) { 651 void Lsr(Register rd, Register rn, int shift) {
640 add(rd, ZR, Operand(rn, LSR, shift)); 652 add(rd, ZR, Operand(rn, LSR, shift));
641 } 653 }
642 void Asr(Register rd, Register rn, int shift) { 654 void Asr(Register rd, Register rn, int shift) {
643 add(rd, ZR, Operand(rn, ASR, shift)); 655 add(rd, ZR, Operand(rn, ASR, shift));
644 } 656 }
645 657
646 void SmiUntag(Register reg) { 658 void SmiUntag(Register reg) {
647 Asr(reg, reg, kSmiTagSize); 659 Asr(reg, reg, kSmiTagSize);
648 } 660 }
661 void SmiTag(Register reg) {
662 Lsl(reg, reg, kSmiTagSize);
663 }
649 664
650 // Branching to ExternalLabels. 665 // Branching to ExternalLabels.
651 void BranchPatchable(const ExternalLabel* label, Register pp) { 666 void BranchPatchable(const ExternalLabel* label, Register pp) {
652 LoadExternalLabel(TMP, label, kPatchable, pp); 667 LoadExternalLabel(TMP, label, kPatchable, pp);
653 br(TMP); 668 br(TMP);
654 } 669 }
655 670
656 void Branch(const ExternalLabel* label, Register pp) { 671 void Branch(const ExternalLabel* label, Register pp) {
657 LoadExternalLabel(TMP, label, kNotPatchable, pp); 672 LoadExternalLabel(TMP, label, kNotPatchable, pp);
658 br(TMP); 673 br(TMP);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 void StoreIntoObjectNoBarrier(Register object, 721 void StoreIntoObjectNoBarrier(Register object,
707 const Address& dest, 722 const Address& dest,
708 Register value); 723 Register value);
709 void StoreIntoObjectNoBarrier(Register object, 724 void StoreIntoObjectNoBarrier(Register object,
710 const Address& dest, 725 const Address& dest,
711 const Object& value); 726 const Object& value);
712 727
713 // Object pool, loading from pool, etc. 728 // Object pool, loading from pool, etc.
714 void LoadPoolPointer(Register pp); 729 void LoadPoolPointer(Register pp);
715 730
731 // Index of constant pool entries pointing to debugger stubs.
732 static const int kBreakpointRuntimeCPIndex = 5;
733
716 enum Patchability { 734 enum Patchability {
717 kPatchable, 735 kPatchable,
718 kNotPatchable, 736 kNotPatchable,
719 }; 737 };
720 738
721 void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset); 739 void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset);
722 intptr_t FindExternalLabel(const ExternalLabel* label, 740 intptr_t FindExternalLabel(const ExternalLabel* label,
723 Patchability patchable); 741 Patchability patchable);
724 intptr_t FindObject(const Object& obj, Patchability patchable); 742 intptr_t FindObject(const Object& obj, Patchability patchable);
725 intptr_t FindImmediate(int64_t imm); 743 intptr_t FindImmediate(int64_t imm);
726 bool CanLoadObjectFromPool(const Object& object); 744 bool CanLoadObjectFromPool(const Object& object);
727 bool CanLoadImmediateFromPool(int64_t imm, Register pp); 745 bool CanLoadImmediateFromPool(int64_t imm, Register pp);
728 void LoadExternalLabel(Register dst, const ExternalLabel* label, 746 void LoadExternalLabel(Register dst, const ExternalLabel* label,
729 Patchability patchable, Register pp); 747 Patchability patchable, Register pp);
730 void LoadObject(Register dst, const Object& obj, Register pp); 748 void LoadObject(Register dst, const Object& obj, Register pp);
731 void LoadDecodableImmediate(Register reg, int64_t imm, Register pp); 749 void LoadDecodableImmediate(Register reg, int64_t imm, Register pp);
732 void LoadImmediateFixed(Register reg, int64_t imm); 750 void LoadImmediateFixed(Register reg, int64_t imm);
733 void LoadImmediate(Register reg, int64_t imm, Register pp); 751 void LoadImmediate(Register reg, int64_t imm, Register pp);
734 752
735 void PushObject(const Object& object, Register pp) { 753 void PushObject(const Object& object, Register pp) {
736 LoadObject(TMP, object, pp); 754 LoadObject(TMP, object, pp);
737 Push(TMP); 755 Push(TMP);
738 } 756 }
739 757
758 void LoadClassId(Register result, Register object);
759 void LoadClassById(Register result, Register class_id);
760 void LoadClass(Register result, Register object);
761 void CompareClassId(Register object, intptr_t class_id);
762
740 void EnterFrame(intptr_t frame_size); 763 void EnterFrame(intptr_t frame_size);
741 void LeaveFrame(); 764 void LeaveFrame();
742 765
743 void EnterDartFrame(intptr_t frame_size); 766 void EnterDartFrame(intptr_t frame_size);
744 void EnterDartFrameWithInfo(intptr_t frame_size, Register new_pp); 767 void EnterDartFrameWithInfo(intptr_t frame_size, Register new_pp);
745 void EnterOsrFrame(intptr_t extra_size, Register new_pp); 768 void EnterOsrFrame(intptr_t extra_size, Register new_pp);
746 void LeaveDartFrame(); 769 void LeaveDartFrame();
747 770
748 void EnterCallRuntimeFrame(intptr_t frame_size); 771 void EnterCallRuntimeFrame(intptr_t frame_size);
749 void LeaveCallRuntimeFrame(); 772 void LeaveCallRuntimeFrame();
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 Emit(encoding); 929 Emit(encoding);
907 } 930 }
908 931
909 int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) { 932 int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) {
910 const int32_t imm32 = static_cast<int32_t>(imm); 933 const int32_t imm32 = static_cast<int32_t>(imm);
911 const int32_t off = (((imm32 >> 2) << kImm19Shift) & kImm19Mask); 934 const int32_t off = (((imm32 >> 2) << kImm19Shift) & kImm19Mask);
912 return (instr & ~kImm19Mask) | off; 935 return (instr & ~kImm19Mask) | off;
913 } 936 }
914 937
915 int64_t DecodeImm19BranchOffset(int32_t instr) { 938 int64_t DecodeImm19BranchOffset(int32_t instr) {
916 const int32_t off = (((instr >> kImm19Shift) & kImm19Shift) << 13) >> 13; 939 const int32_t off = (((instr & kImm19Mask) >> kImm19Shift) << 13) >> 11;
917 return static_cast<int64_t>(off); 940 return static_cast<int64_t>(off);
918 } 941 }
919 942
920 void EmitCompareAndBranch(CompareAndBranchOp op, Register rt, int64_t imm, 943 void EmitCompareAndBranch(CompareAndBranchOp op, Register rt, int64_t imm,
921 OperandSize sz) { 944 OperandSize sz) {
922 ASSERT((sz == kDoubleWord) || (sz == kWord)); 945 ASSERT((sz == kDoubleWord) || (sz == kWord));
923 ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0)); 946 ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
924 ASSERT((rt != SP) && (rt != R31)); 947 ASSERT((rt != SP) && (rt != R31));
925 const Register crt = ConcreteRegister(rt); 948 const Register crt = ConcreteRegister(rt);
926 const int32_t size = (sz == kDoubleWord) ? B31 : 0; 949 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
(...skipping 10 matching lines...) Expand all
937 ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0)); 960 ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
938 const int32_t encoding = 961 const int32_t encoding =
939 op | 962 op |
940 (static_cast<int32_t>(cond) << kCondShift) | 963 (static_cast<int32_t>(cond) << kCondShift) |
941 (((imm >> 2) << kImm19Shift) & kImm19Mask); 964 (((imm >> 2) << kImm19Shift) & kImm19Mask);
942 Emit(encoding); 965 Emit(encoding);
943 } 966 }
944 967
945 bool CanEncodeImm19BranchOffset(int64_t offset) { 968 bool CanEncodeImm19BranchOffset(int64_t offset) {
946 ASSERT(Utils::IsAligned(offset, 4)); 969 ASSERT(Utils::IsAligned(offset, 4));
947 return Utils::IsInt(19, offset); 970 return Utils::IsInt(21, offset);
948 } 971 }
949 972
950 // TODO(zra): Implement far branches. Requires loading large immediates. 973 // TODO(zra): Implement far branches. Requires loading large immediates.
951 void EmitBranch(ConditionalBranchOp op, Condition cond, Label* label) { 974 void EmitBranch(ConditionalBranchOp op, Condition cond, Label* label) {
952 if (label->IsBound()) { 975 if (label->IsBound()) {
953 const int64_t dest = label->Position() - buffer_.Size(); 976 const int64_t dest = label->Position() - buffer_.Size();
954 ASSERT(CanEncodeImm19BranchOffset(dest)); 977 ASSERT(CanEncodeImm19BranchOffset(dest));
955 EmitConditionalBranch(op, cond, dest); 978 EmitConditionalBranch(op, cond, dest);
956 } else { 979 } else {
957 const int64_t position = buffer_.Size(); 980 const int64_t position = buffer_.Size();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 const int32_t encoding = 1044 const int32_t encoding =
1022 op | loimm | hiimm | 1045 op | loimm | hiimm |
1023 (static_cast<int32_t>(crd) << kRdShift); 1046 (static_cast<int32_t>(crd) << kRdShift);
1024 Emit(encoding); 1047 Emit(encoding);
1025 } 1048 }
1026 1049
1027 void EmitMiscDP2Source(MiscDP2SourceOp op, 1050 void EmitMiscDP2Source(MiscDP2SourceOp op,
1028 Register rd, Register rn, Register rm, 1051 Register rd, Register rn, Register rm,
1029 OperandSize sz) { 1052 OperandSize sz) {
1030 ASSERT((rd != SP) && (rn != SP) && (rm != SP)); 1053 ASSERT((rd != SP) && (rn != SP) && (rm != SP));
1054 ASSERT((sz == kDoubleWord) || (sz == kWord));
regis 2014/04/25 18:39:05 Should kUnsignedWord be allowed as well? (here and
zra 2014/04/25 18:54:23 Done.
1031 const Register crd = ConcreteRegister(rd); 1055 const Register crd = ConcreteRegister(rd);
1032 const Register crn = ConcreteRegister(rn); 1056 const Register crn = ConcreteRegister(rn);
1033 const Register crm = ConcreteRegister(rm); 1057 const Register crm = ConcreteRegister(rm);
1034 const int32_t size = (sz == kDoubleWord) ? B31 : 0; 1058 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
1035 const int32_t encoding = 1059 const int32_t encoding =
1036 op | size | 1060 op | size |
1037 (static_cast<int32_t>(crd) << kRdShift) | 1061 (static_cast<int32_t>(crd) << kRdShift) |
1038 (static_cast<int32_t>(crn) << kRnShift) | 1062 (static_cast<int32_t>(crn) << kRnShift) |
1039 (static_cast<int32_t>(crm) << kRmShift); 1063 (static_cast<int32_t>(crm) << kRmShift);
1040 Emit(encoding); 1064 Emit(encoding);
1041 } 1065 }
1042 1066
1043 void EmitMiscDP3Source(MiscDP3SourceOp op, 1067 void EmitMiscDP3Source(MiscDP3SourceOp op,
1044 Register rd, Register rn, Register rm, Register ra, 1068 Register rd, Register rn, Register rm, Register ra,
1045 OperandSize sz) { 1069 OperandSize sz) {
1046 ASSERT((rd != SP) && (rn != SP) && (rm != SP) && (ra != SP)); 1070 ASSERT((rd != SP) && (rn != SP) && (rm != SP) && (ra != SP));
1071 ASSERT((sz == kDoubleWord) || (sz == kWord));
1047 const Register crd = ConcreteRegister(rd); 1072 const Register crd = ConcreteRegister(rd);
1048 const Register crn = ConcreteRegister(rn); 1073 const Register crn = ConcreteRegister(rn);
1049 const Register crm = ConcreteRegister(rm); 1074 const Register crm = ConcreteRegister(rm);
1050 const Register cra = ConcreteRegister(ra); 1075 const Register cra = ConcreteRegister(ra);
1051 const int32_t size = (sz == kDoubleWord) ? B31 : 0; 1076 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
1052 const int32_t encoding = 1077 const int32_t encoding =
1053 op | size | 1078 op | size |
1054 (static_cast<int32_t>(crd) << kRdShift) | 1079 (static_cast<int32_t>(crd) << kRdShift) |
1055 (static_cast<int32_t>(crn) << kRnShift) | 1080 (static_cast<int32_t>(crn) << kRnShift) |
1056 (static_cast<int32_t>(crm) << kRmShift) | 1081 (static_cast<int32_t>(crm) << kRmShift) |
1057 (static_cast<int32_t>(cra) << kRaShift); 1082 (static_cast<int32_t>(cra) << kRaShift);
1058 Emit(encoding); 1083 Emit(encoding);
1059 } 1084 }
1060 1085
1086 void EmitCoditionalSelect(ConditionalSelectOp op,
1087 Register rd, Register rn, Register rm,
1088 Condition cond, OperandSize sz) {
1089 ASSERT((rd != SP) && (rn != SP) && (rm != SP));
1090 ASSERT((sz == kDoubleWord) || (sz == kWord));
1091 const Register crd = ConcreteRegister(rd);
1092 const Register crn = ConcreteRegister(rn);
1093 const Register crm = ConcreteRegister(rm);
1094 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
1095 const int32_t encoding =
1096 op | size |
1097 (static_cast<int32_t>(crd) << kRdShift) |
1098 (static_cast<int32_t>(crn) << kRnShift) |
1099 (static_cast<int32_t>(crm) << kRmShift) |
1100 (static_cast<int32_t>(cond) << kSelCondShift);
1101 Emit(encoding);
1102 }
1103
1061 void StoreIntoObjectFilter(Register object, Register value, Label* no_update); 1104 void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
1062 1105
1063 // Shorter filtering sequence that assumes that value is not a smi. 1106 // Shorter filtering sequence that assumes that value is not a smi.
1064 void StoreIntoObjectFilterNoSmi(Register object, 1107 void StoreIntoObjectFilterNoSmi(Register object,
1065 Register value, 1108 Register value,
1066 Label* no_update); 1109 Label* no_update);
1067 1110
1068 DISALLOW_ALLOCATION(); 1111 DISALLOW_ALLOCATION();
1069 DISALLOW_COPY_AND_ASSIGN(Assembler); 1112 DISALLOW_COPY_AND_ASSIGN(Assembler);
1070 }; 1113 };
1071 1114
1072 } // namespace dart 1115 } // namespace dart
1073 1116
1074 #endif // VM_ASSEMBLER_ARM64_H_ 1117 #endif // VM_ASSEMBLER_ARM64_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698