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

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

Issue 2112043002: Land Ivan's change of 'Remove support for verified memory handling' (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address code review comments. Created 4 years, 5 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
« no previous file with comments | « runtime/vm/assembler_ia32.cc ('k') | runtime/vm/assembler_x64.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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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_X64_H_ 5 #ifndef VM_ASSEMBLER_X64_H_
6 #define VM_ASSEMBLER_X64_H_ 6 #define VM_ASSEMBLER_X64_H_
7 7
8 #ifndef VM_ASSEMBLER_H_ 8 #ifndef VM_ASSEMBLER_H_
9 #error Do not include assembler_x64.h directly; use assembler.h instead. 9 #error Do not include assembler_x64.h directly; use assembler.h instead.
10 #endif 10 #endif
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 679
680 // 'size' indicates size in bytes and must be in the range 1..8. 680 // 'size' indicates size in bytes and must be in the range 1..8.
681 void nop(int size = 1); 681 void nop(int size = 1);
682 void int3(); 682 void int3();
683 void hlt(); 683 void hlt();
684 684
685 static uword GetBreakInstructionFiller() { 685 static uword GetBreakInstructionFiller() {
686 return 0xCCCCCCCCCCCCCCCC; 686 return 0xCCCCCCCCCCCCCCCC;
687 } 687 }
688 688
689 // Note: verified_mem mode forces far jumps.
690 void j(Condition condition, Label* label, bool near = kFarJump); 689 void j(Condition condition, Label* label, bool near = kFarJump);
691 690
692 void jmp(Register reg); 691 void jmp(Register reg);
693 void jmp(const Address& address); 692 void jmp(const Address& address);
694 // Note: verified_mem mode forces far jumps.
695 void jmp(Label* label, bool near = kFarJump); 693 void jmp(Label* label, bool near = kFarJump);
696 void jmp(const ExternalLabel* label); 694 void jmp(const ExternalLabel* label);
697 void jmp(const StubEntry& stub_entry); 695 void jmp(const StubEntry& stub_entry);
698 696
699 void lock(); 697 void lock();
700 void cmpxchgl(const Address& address, Register reg); 698 void cmpxchgl(const Address& address, Register reg);
701 void lock_cmpxchgl(const Address& address, Register reg) { 699 void lock_cmpxchgl(const Address& address, Register reg) {
702 lock(); 700 lock();
703 cmpxchgl(address, reg); 701 cmpxchgl(address, reg);
704 } 702 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 // Emit a call that shares its object pool entries with other calls 775 // Emit a call that shares its object pool entries with other calls
778 // that have the same equivalence marker. 776 // that have the same equivalence marker.
779 void CallWithEquivalence(const StubEntry& stub_entry, 777 void CallWithEquivalence(const StubEntry& stub_entry,
780 const Object& equivalence); 778 const Object& equivalence);
781 // Unaware of write barrier (use StoreInto* methods for storing to objects). 779 // Unaware of write barrier (use StoreInto* methods for storing to objects).
782 // TODO(koda): Add StackAddress/HeapAddress types to prevent misuse. 780 // TODO(koda): Add StackAddress/HeapAddress types to prevent misuse.
783 void StoreObject(const Address& dst, const Object& obj); 781 void StoreObject(const Address& dst, const Object& obj);
784 void PushObject(const Object& object); 782 void PushObject(const Object& object);
785 void CompareObject(Register reg, const Object& object); 783 void CompareObject(Register reg, const Object& object);
786 784
787 // When storing into a heap object field, knowledge of the previous content
788 // is expressed through these constants.
789 enum FieldContent {
790 kEmptyOrSmiOrNull, // Empty = garbage/zapped in release/debug mode.
791 kHeapObjectOrSmi,
792 kOnlySmi,
793 };
794
795 // Destroys value. 785 // Destroys value.
796 void StoreIntoObject(Register object, // Object we are storing into. 786 void StoreIntoObject(Register object, // Object we are storing into.
797 const Address& dest, // Where we are storing into. 787 const Address& dest, // Where we are storing into.
798 Register value, // Value we are storing. 788 Register value, // Value we are storing.
799 bool can_value_be_smi = true); 789 bool can_value_be_smi = true);
800 790
801 void StoreIntoObjectNoBarrier(Register object, 791 void StoreIntoObjectNoBarrier(Register object,
802 const Address& dest, 792 const Address& dest,
803 Register value, 793 Register value);
804 FieldContent old_content = kHeapObjectOrSmi);
805 void InitializeFieldNoBarrier(Register object,
806 const Address& dest,
807 Register value) {
808 return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
809 }
810 void StoreIntoObjectNoBarrier(Register object, 794 void StoreIntoObjectNoBarrier(Register object,
811 const Address& dest, 795 const Address& dest,
812 const Object& value, 796 const Object& value);
813 FieldContent old_content = kHeapObjectOrSmi);
814 void InitializeFieldNoBarrier(Register object,
815 const Address& dest,
816 const Object& value) {
817 return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
818 }
819 797
820 // Stores a Smi value into a heap object field that always contains a Smi. 798 // Stores a Smi value into a heap object field that always contains a Smi.
821 void StoreIntoSmiField(const Address& dest, Register value); 799 void StoreIntoSmiField(const Address& dest, Register value);
822 void ZeroInitSmiField(const Address& dest); 800 void ZeroInitSmiField(const Address& dest);
823 // Increments a Smi field. Leaves flags in same state as an 'addq'. 801 // Increments a Smi field. Leaves flags in same state as an 'addq'.
824 void IncrementSmiField(const Address& dest, int64_t increment); 802 void IncrementSmiField(const Address& dest, int64_t increment);
825 803
826 void DoubleNegate(XmmRegister d); 804 void DoubleNegate(XmmRegister d);
827 void FloatNegate(XmmRegister f); 805 void FloatNegate(XmmRegister f);
828 806
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 1078
1101 void EmitGenericShift(bool wide, int rm, Register reg, const Immediate& imm); 1079 void EmitGenericShift(bool wide, int rm, Register reg, const Immediate& imm);
1102 void EmitGenericShift(bool wide, int rm, Register operand, Register shifter); 1080 void EmitGenericShift(bool wide, int rm, Register operand, Register shifter);
1103 1081
1104 void StoreIntoObjectFilter(Register object, Register value, Label* no_update); 1082 void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
1105 1083
1106 // Shorter filtering sequence that assumes that value is not a smi. 1084 // Shorter filtering sequence that assumes that value is not a smi.
1107 void StoreIntoObjectFilterNoSmi(Register object, 1085 void StoreIntoObjectFilterNoSmi(Register object,
1108 Register value, 1086 Register value,
1109 Label* no_update); 1087 Label* no_update);
1110 #if defined(DEBUG)
1111 void VerifyUninitialized(const Address& address);
1112 void VerifyObjectOrSmi(const Address& address);
1113 void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
1114 #endif // DEBUG
1115 // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
1116 // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
1117 void VerifyHeapWord(const Address& address, FieldContent old_content);
1118 void VerifiedWrite(const Address& dest,
1119 Register value,
1120 FieldContent old_content);
1121 // Unaware of write barrier (use StoreInto* methods for storing to objects). 1088 // Unaware of write barrier (use StoreInto* methods for storing to objects).
1122 void MoveImmediate(const Address& dst, const Immediate& imm); 1089 void MoveImmediate(const Address& dst, const Immediate& imm);
1123 1090
1124 void ComputeCounterAddressesForCid(intptr_t cid, 1091 void ComputeCounterAddressesForCid(intptr_t cid,
1125 Heap::Space space, 1092 Heap::Space space,
1126 Address* count_address, 1093 Address* count_address,
1127 Address* size_address); 1094 Address* size_address);
1128 DISALLOW_ALLOCATION(); 1095 DISALLOW_ALLOCATION();
1129 DISALLOW_COPY_AND_ASSIGN(Assembler); 1096 DISALLOW_COPY_AND_ASSIGN(Assembler);
1130 }; 1097 };
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 } 1168 }
1202 1169
1203 1170
1204 inline void Assembler::EmitOperandSizeOverride() { 1171 inline void Assembler::EmitOperandSizeOverride() {
1205 EmitUint8(0x66); 1172 EmitUint8(0x66);
1206 } 1173 }
1207 1174
1208 } // namespace dart 1175 } // namespace dart
1209 1176
1210 #endif // VM_ASSEMBLER_X64_H_ 1177 #endif // VM_ASSEMBLER_X64_H_
OLDNEW
« no previous file with comments | « runtime/vm/assembler_ia32.cc ('k') | runtime/vm/assembler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698