| 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 RUNTIME_VM_CONSTANTS_IA32_H_ | 5 #ifndef RUNTIME_VM_CONSTANTS_IA32_H_ |
| 6 #define RUNTIME_VM_CONSTANTS_IA32_H_ | 6 #define RUNTIME_VM_CONSTANTS_IA32_H_ |
| 7 | 7 |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| 11 | 11 |
| 12 enum Register { | 12 enum Register { |
| 13 EAX = 0, | 13 EAX = 0, |
| 14 ECX = 1, | 14 ECX = 1, |
| 15 EDX = 2, | 15 EDX = 2, |
| 16 EBX = 3, | 16 EBX = 3, |
| 17 ESP = 4, | 17 ESP = 4, |
| 18 EBP = 5, | 18 EBP = 5, |
| 19 ESI = 6, | 19 ESI = 6, |
| 20 EDI = 7, | 20 EDI = 7, |
| 21 kNumberOfCpuRegisters = 8, | 21 kNumberOfCpuRegisters = 8, |
| 22 kNoRegister = -1, // Signals an illegal register. | 22 kNoRegister = -1, // Signals an illegal register. |
| 23 }; | 23 }; |
| 24 | 24 |
| 25 | |
| 26 enum ByteRegister { | 25 enum ByteRegister { |
| 27 AL = 0, | 26 AL = 0, |
| 28 CL = 1, | 27 CL = 1, |
| 29 DL = 2, | 28 DL = 2, |
| 30 BL = 3, | 29 BL = 3, |
| 31 AH = 4, | 30 AH = 4, |
| 32 CH = 5, | 31 CH = 5, |
| 33 DH = 6, | 32 DH = 6, |
| 34 BH = 7, | 33 BH = 7, |
| 35 kNoByteRegister = -1 // Signals an illegal register. | 34 kNoByteRegister = -1 // Signals an illegal register. |
| 36 }; | 35 }; |
| 37 | 36 |
| 38 | |
| 39 enum XmmRegister { | 37 enum XmmRegister { |
| 40 XMM0 = 0, | 38 XMM0 = 0, |
| 41 XMM1 = 1, | 39 XMM1 = 1, |
| 42 XMM2 = 2, | 40 XMM2 = 2, |
| 43 XMM3 = 3, | 41 XMM3 = 3, |
| 44 XMM4 = 4, | 42 XMM4 = 4, |
| 45 XMM5 = 5, | 43 XMM5 = 5, |
| 46 XMM6 = 6, | 44 XMM6 = 6, |
| 47 XMM7 = 7, | 45 XMM7 = 7, |
| 48 kNumberOfXmmRegisters = 8, | 46 kNumberOfXmmRegisters = 8, |
| 49 kNoXmmRegister = -1 // Signals an illegal register. | 47 kNoXmmRegister = -1 // Signals an illegal register. |
| 50 }; | 48 }; |
| 51 | 49 |
| 52 | |
| 53 // Architecture independent aliases. | 50 // Architecture independent aliases. |
| 54 typedef XmmRegister FpuRegister; | 51 typedef XmmRegister FpuRegister; |
| 55 const FpuRegister FpuTMP = XMM0; | 52 const FpuRegister FpuTMP = XMM0; |
| 56 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters; | 53 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters; |
| 57 const FpuRegister kNoFpuRegister = kNoXmmRegister; | 54 const FpuRegister kNoFpuRegister = kNoXmmRegister; |
| 58 | 55 |
| 59 | |
| 60 // Register aliases. | 56 // Register aliases. |
| 61 const Register TMP = kNoRegister; // No scratch register used by assembler. | 57 const Register TMP = kNoRegister; // No scratch register used by assembler. |
| 62 const Register TMP2 = kNoRegister; // No second assembler scratch register. | 58 const Register TMP2 = kNoRegister; // No second assembler scratch register. |
| 63 const Register CTX = EDI; // Location of current context at method entry. | 59 const Register CTX = EDI; // Location of current context at method entry. |
| 64 const Register CODE_REG = EDI; | 60 const Register CODE_REG = EDI; |
| 65 const Register PP = kNoRegister; // No object pool pointer. | 61 const Register PP = kNoRegister; // No object pool pointer. |
| 66 const Register SPREG = ESP; // Stack pointer register. | 62 const Register SPREG = ESP; // Stack pointer register. |
| 67 const Register FPREG = EBP; // Frame pointer register. | 63 const Register FPREG = EBP; // Frame pointer register. |
| 68 const Register ICREG = ECX; // IC data register. | 64 const Register ICREG = ECX; // IC data register. |
| 69 const Register ARGS_DESC_REG = EDX; // Arguments descriptor register. | 65 const Register ARGS_DESC_REG = EDX; // Arguments descriptor register. |
| 70 const Register THR = ESI; // Caches current thread in generated code. | 66 const Register THR = ESI; // Caches current thread in generated code. |
| 71 const Register CALLEE_SAVED_TEMP = EBX; | 67 const Register CALLEE_SAVED_TEMP = EBX; |
| 72 const Register CALLEE_SAVED_TEMP2 = EDI; | 68 const Register CALLEE_SAVED_TEMP2 = EDI; |
| 73 | 69 |
| 74 // Exception object is passed in this register to the catch handlers when an | 70 // Exception object is passed in this register to the catch handlers when an |
| 75 // exception is thrown. | 71 // exception is thrown. |
| 76 const Register kExceptionObjectReg = EAX; | 72 const Register kExceptionObjectReg = EAX; |
| 77 | 73 |
| 78 // Stack trace object is passed in this register to the catch handlers when | 74 // Stack trace object is passed in this register to the catch handlers when |
| 79 // an exception is thrown. | 75 // an exception is thrown. |
| 80 const Register kStackTraceObjectReg = EDX; | 76 const Register kStackTraceObjectReg = EDX; |
| 81 | 77 |
| 82 | |
| 83 typedef uint32_t RegList; | 78 typedef uint32_t RegList; |
| 84 const RegList kAllCpuRegistersList = 0xFF; | 79 const RegList kAllCpuRegistersList = 0xFF; |
| 85 | 80 |
| 86 const intptr_t kReservedCpuRegisters = (1 << SPREG) | (1 << FPREG) | (1 << THR); | 81 const intptr_t kReservedCpuRegisters = (1 << SPREG) | (1 << FPREG) | (1 << THR); |
| 87 // CPU registers available to Dart allocator. | 82 // CPU registers available to Dart allocator. |
| 88 const RegList kDartAvailableCpuRegs = | 83 const RegList kDartAvailableCpuRegs = |
| 89 kAllCpuRegistersList & ~kReservedCpuRegisters; | 84 kAllCpuRegistersList & ~kReservedCpuRegisters; |
| 90 | 85 |
| 91 | |
| 92 enum ScaleFactor { | 86 enum ScaleFactor { |
| 93 TIMES_1 = 0, | 87 TIMES_1 = 0, |
| 94 TIMES_2 = 1, | 88 TIMES_2 = 1, |
| 95 TIMES_4 = 2, | 89 TIMES_4 = 2, |
| 96 TIMES_8 = 3, | 90 TIMES_8 = 3, |
| 97 TIMES_16 = 4, | 91 TIMES_16 = 4, |
| 98 TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1 | 92 TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1 |
| 99 }; | 93 }; |
| 100 | 94 |
| 101 | |
| 102 enum Condition { | 95 enum Condition { |
| 103 OVERFLOW = 0, | 96 OVERFLOW = 0, |
| 104 NO_OVERFLOW = 1, | 97 NO_OVERFLOW = 1, |
| 105 BELOW = 2, | 98 BELOW = 2, |
| 106 ABOVE_EQUAL = 3, | 99 ABOVE_EQUAL = 3, |
| 107 EQUAL = 4, | 100 EQUAL = 4, |
| 108 NOT_EQUAL = 5, | 101 NOT_EQUAL = 5, |
| 109 BELOW_EQUAL = 6, | 102 BELOW_EQUAL = 6, |
| 110 ABOVE = 7, | 103 ABOVE = 7, |
| 111 SIGN = 8, | 104 SIGN = 8, |
| 112 NOT_SIGN = 9, | 105 NOT_SIGN = 9, |
| 113 PARITY_EVEN = 10, | 106 PARITY_EVEN = 10, |
| 114 PARITY_ODD = 11, | 107 PARITY_ODD = 11, |
| 115 LESS = 12, | 108 LESS = 12, |
| 116 GREATER_EQUAL = 13, | 109 GREATER_EQUAL = 13, |
| 117 LESS_EQUAL = 14, | 110 LESS_EQUAL = 14, |
| 118 GREATER = 15, | 111 GREATER = 15, |
| 119 | 112 |
| 120 ZERO = EQUAL, | 113 ZERO = EQUAL, |
| 121 NOT_ZERO = NOT_EQUAL, | 114 NOT_ZERO = NOT_EQUAL, |
| 122 NEGATIVE = SIGN, | 115 NEGATIVE = SIGN, |
| 123 POSITIVE = NOT_SIGN, | 116 POSITIVE = NOT_SIGN, |
| 124 CARRY = BELOW, | 117 CARRY = BELOW, |
| 125 NOT_CARRY = ABOVE_EQUAL, | 118 NOT_CARRY = ABOVE_EQUAL, |
| 126 | 119 |
| 127 INVALID_CONDITION = 16 | 120 INVALID_CONDITION = 16 |
| 128 }; | 121 }; |
| 129 | 122 |
| 130 | |
| 131 class Instr { | 123 class Instr { |
| 132 public: | 124 public: |
| 133 static const uint8_t kHltInstruction = 0xF4; | 125 static const uint8_t kHltInstruction = 0xF4; |
| 134 // We prefer not to use the int3 instruction since it conflicts with gdb. | 126 // We prefer not to use the int3 instruction since it conflicts with gdb. |
| 135 static const uint8_t kBreakPointInstruction = kHltInstruction; | 127 static const uint8_t kBreakPointInstruction = kHltInstruction; |
| 136 static const int kBreakPointInstructionSize = 1; | 128 static const int kBreakPointInstructionSize = 1; |
| 137 | 129 |
| 138 bool IsBreakPoint() { | 130 bool IsBreakPoint() { |
| 139 ASSERT(kBreakPointInstructionSize == 1); | 131 ASSERT(kBreakPointInstructionSize == 1); |
| 140 return (*reinterpret_cast<const uint8_t*>(this)) == kBreakPointInstruction; | 132 return (*reinterpret_cast<const uint8_t*>(this)) == kBreakPointInstruction; |
| 141 } | 133 } |
| 142 | 134 |
| 143 // Instructions are read out of a code stream. The only way to get a | 135 // Instructions are read out of a code stream. The only way to get a |
| 144 // reference to an instruction is to convert a pointer. There is no way | 136 // reference to an instruction is to convert a pointer. There is no way |
| 145 // to allocate or create instances of class Instr. | 137 // to allocate or create instances of class Instr. |
| 146 // Use the At(pc) function to create references to Instr. | 138 // Use the At(pc) function to create references to Instr. |
| 147 static Instr* At(uword pc) { return reinterpret_cast<Instr*>(pc); } | 139 static Instr* At(uword pc) { return reinterpret_cast<Instr*>(pc); } |
| 148 | 140 |
| 149 private: | 141 private: |
| 150 DISALLOW_ALLOCATION(); | 142 DISALLOW_ALLOCATION(); |
| 151 // We need to prevent the creation of instances of class Instr. | 143 // We need to prevent the creation of instances of class Instr. |
| 152 DISALLOW_IMPLICIT_CONSTRUCTORS(Instr); | 144 DISALLOW_IMPLICIT_CONSTRUCTORS(Instr); |
| 153 }; | 145 }; |
| 154 | 146 |
| 155 | |
| 156 // The largest multibyte nop we will emit. This could go up to 15 if it | 147 // The largest multibyte nop we will emit. This could go up to 15 if it |
| 157 // becomes important to us. | 148 // becomes important to us. |
| 158 const int MAX_NOP_SIZE = 8; | 149 const int MAX_NOP_SIZE = 8; |
| 159 | 150 |
| 160 } // namespace dart | 151 } // namespace dart |
| 161 | 152 |
| 162 #endif // RUNTIME_VM_CONSTANTS_IA32_H_ | 153 #endif // RUNTIME_VM_CONSTANTS_IA32_H_ |
| OLD | NEW |