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

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

Issue 247023004: Adds StoreIntoObject for 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_arm64.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 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64.cc » ('j') | runtime/vm/assembler_arm64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698