OLD | NEW |
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 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 void ffree(intptr_t value); | 643 void ffree(intptr_t value); |
644 | 644 |
645 void fsin(); | 645 void fsin(); |
646 void fcos(); | 646 void fcos(); |
647 | 647 |
648 // 'size' indicates size in bytes and must be in the range 1..8. | 648 // 'size' indicates size in bytes and must be in the range 1..8. |
649 void nop(int size = 1); | 649 void nop(int size = 1); |
650 void int3(); | 650 void int3(); |
651 void hlt(); | 651 void hlt(); |
652 | 652 |
| 653 // Note: verified_mem mode forces far jumps. |
653 void j(Condition condition, Label* label, bool near = kFarJump); | 654 void j(Condition condition, Label* label, bool near = kFarJump); |
654 void j(Condition condition, const ExternalLabel* label); | 655 void j(Condition condition, const ExternalLabel* label); |
655 | 656 |
656 void jmp(Register reg); | 657 void jmp(Register reg); |
| 658 // Note: verified_mem mode forces far jumps. |
657 void jmp(Label* label, bool near = kFarJump); | 659 void jmp(Label* label, bool near = kFarJump); |
658 void jmp(const ExternalLabel* label); | 660 void jmp(const ExternalLabel* label); |
659 | 661 |
660 void lock(); | 662 void lock(); |
661 void cmpxchgl(const Address& address, Register reg); | 663 void cmpxchgl(const Address& address, Register reg); |
662 void lock_cmpxchgl(const Address& address, Register reg) { | 664 void lock_cmpxchgl(const Address& address, Register reg) { |
663 lock(); | 665 lock(); |
664 cmpxchgl(address, reg); | 666 cmpxchgl(address, reg); |
665 } | 667 } |
666 | 668 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 // Destroys value. | 743 // Destroys value. |
742 void StoreIntoObject(Register object, // Object we are storing into. | 744 void StoreIntoObject(Register object, // Object we are storing into. |
743 const Address& dest, // Where we are storing into. | 745 const Address& dest, // Where we are storing into. |
744 Register value, // Value we are storing. | 746 Register value, // Value we are storing. |
745 bool can_value_be_smi = true); | 747 bool can_value_be_smi = true); |
746 | 748 |
747 void StoreIntoObjectNoBarrier(Register object, | 749 void StoreIntoObjectNoBarrier(Register object, |
748 const Address& dest, | 750 const Address& dest, |
749 Register value); | 751 Register value); |
750 | 752 |
| 753 // Stores a Smi value into a heap object field that always contains a Smi. |
| 754 void StoreIntoSmiField(const Address& dest, Register value); |
| 755 void ZeroSmiField(const Address& dest); |
| 756 // Increments a Smi field. Leaves flags in same state as an 'addq'. |
| 757 void IncrementSmiField(const Address& dest, int64_t increment); |
| 758 |
751 void DoubleNegate(XmmRegister d); | 759 void DoubleNegate(XmmRegister d); |
752 void FloatNegate(XmmRegister f); | 760 void FloatNegate(XmmRegister f); |
753 | 761 |
754 void DoubleAbs(XmmRegister reg); | 762 void DoubleAbs(XmmRegister reg); |
755 | 763 |
756 void LockCmpxchgq(const Address& address, Register reg) { | 764 void LockCmpxchgq(const Address& address, Register reg) { |
757 lock(); | 765 lock(); |
758 cmpxchgq(address, reg); | 766 cmpxchgq(address, reg); |
759 } | 767 } |
760 | 768 |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1069 void EmitGenericShift(bool wide, int rm, Register reg, const Immediate& imm); | 1077 void EmitGenericShift(bool wide, int rm, Register reg, const Immediate& imm); |
1070 void EmitGenericShift(bool wide, int rm, Register operand, Register shifter); | 1078 void EmitGenericShift(bool wide, int rm, Register operand, Register shifter); |
1071 | 1079 |
1072 void StoreIntoObjectFilter(Register object, Register value, Label* no_update); | 1080 void StoreIntoObjectFilter(Register object, Register value, Label* no_update); |
1073 | 1081 |
1074 // Shorter filtering sequence that assumes that value is not a smi. | 1082 // Shorter filtering sequence that assumes that value is not a smi. |
1075 void StoreIntoObjectFilterNoSmi(Register object, | 1083 void StoreIntoObjectFilterNoSmi(Register object, |
1076 Register value, | 1084 Register value, |
1077 Label* no_update); | 1085 Label* no_update); |
1078 | 1086 |
| 1087 // Analogous to VerifiedMemory::Verify(address, kWordSize). |
| 1088 void VerifyHeapWord(const Address& address); |
| 1089 // Analogous to VerifiedMemory::Write. |
| 1090 void VerifiedWrite(const Address& dest, Register value); |
| 1091 |
1079 void ComputeCounterAddressesForCid(intptr_t cid, | 1092 void ComputeCounterAddressesForCid(intptr_t cid, |
1080 Heap::Space space, | 1093 Heap::Space space, |
1081 Address* count_address, | 1094 Address* count_address, |
1082 Address* size_address); | 1095 Address* size_address); |
1083 DISALLOW_ALLOCATION(); | 1096 DISALLOW_ALLOCATION(); |
1084 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1097 DISALLOW_COPY_AND_ASSIGN(Assembler); |
1085 }; | 1098 }; |
1086 | 1099 |
1087 | 1100 |
1088 inline void Assembler::EmitUint8(uint8_t value) { | 1101 inline void Assembler::EmitUint8(uint8_t value) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 } | 1169 } |
1157 | 1170 |
1158 | 1171 |
1159 inline void Assembler::EmitOperandSizeOverride() { | 1172 inline void Assembler::EmitOperandSizeOverride() { |
1160 EmitUint8(0x66); | 1173 EmitUint8(0x66); |
1161 } | 1174 } |
1162 | 1175 |
1163 } // namespace dart | 1176 } // namespace dart |
1164 | 1177 |
1165 #endif // VM_ASSEMBLER_X64_H_ | 1178 #endif // VM_ASSEMBLER_X64_H_ |
OLD | NEW |