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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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_ |
OLD | NEW |