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_CONSTANTS_X64_H_ | 5 #ifndef VM_CONSTANTS_X64_H_ |
6 #define VM_CONSTANTS_X64_H_ | 6 #define VM_CONSTANTS_X64_H_ |
7 | 7 |
8 namespace dart { | 8 namespace dart { |
9 | 9 |
10 enum Register { | 10 enum Register { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
131 GREATER = 15, | 131 GREATER = 15, |
132 | 132 |
133 ZERO = EQUAL, | 133 ZERO = EQUAL, |
134 NOT_ZERO = NOT_EQUAL, | 134 NOT_ZERO = NOT_EQUAL, |
135 NEGATIVE = SIGN, | 135 NEGATIVE = SIGN, |
136 POSITIVE = NOT_SIGN, | 136 POSITIVE = NOT_SIGN, |
137 CARRY = BELOW, | 137 CARRY = BELOW, |
138 NOT_CARRY = ABOVE_EQUAL | 138 NOT_CARRY = ABOVE_EQUAL |
139 }; | 139 }; |
140 | 140 |
141 #define R(reg) (1 << (reg)) | |
siva
2014/06/05 17:21:18
R seems cryptic why not REG?
Ivan Posva
2014/06/05 17:42:11
I don't find R such a bad use here, especially as
Vyacheslav Egorov (Google)
2014/06/05 18:05:55
REG is too long I think. I will keep it R() for no
| |
142 | |
143 #if defined(_WIN64) | |
144 class CallingConventions { | |
145 public: | |
146 static const Register kArg1Reg = RCX; | |
147 static const Register kArg2Reg = RDX; | |
148 static const Register kArg3Reg = R8; | |
149 static const Register kArg4Reg = R9; | |
150 static const intptr_t kShadowSpaceBytes = 4 * kWordSize; | |
151 | |
152 static const intptr_t kVolatileCpuRegisters = | |
153 R(RAX) | R(RCX) | R(RDX) | R(R8) | R(R9) | R(R10) | R(R11); | |
srdjan
2014/06/05 17:00:46
4 spaces indent: here and below.
Vyacheslav Egorov (Google)
2014/06/05 18:05:55
Done.
| |
154 | |
155 static const intptr_t kVolatileXmmRegisters = | |
156 R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) | R(XMM5); | |
157 | |
158 static const intptr_t kCalleeSaveCpuRegisters = | |
159 R(RBX) | R(RSI) | R(RDI) | R(R12) | R(R13) | R(R14) | R(R15); | |
160 | |
161 static const intptr_t kCalleeSaveXmmRegisters = | |
162 R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) | R(XMM10) | R(XMM11) | R(XMM12) | | |
163 R(XMM13) | R(XMM14) | R(XMM15); | |
164 | |
165 // Windows x64 ABI specifies that small objects are passed in registers. | |
166 // Otherwise they are passed by reference. | |
167 static const size_t kRegisterTransferLimit = 16; | |
168 }; | |
169 #else | |
170 class CallingConventions { | |
171 public: | |
172 static const Register kArg1Reg = RDI; | |
173 static const Register kArg2Reg = RSI; | |
174 static const Register kArg3Reg = RDX; | |
175 static const Register kArg4Reg = RCX; | |
176 static const Register kArg5Reg = R8; | |
177 static const Register kArg6Reg = R9; | |
178 static const intptr_t kShadowSpaceBytes = 0; | |
179 | |
180 static const intptr_t kVolatileCpuRegisters = | |
181 R(RAX) | R(RCX) | R(RDX) | R(RSI) | R(RDI) | | |
182 R(R8) | R(R9) | R(R10) | R(R11); | |
183 | |
184 static const intptr_t kVolatileXmmRegisters = | |
185 R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) | | |
186 R(XMM5) | R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) | | |
187 R(XMM10) | R(XMM11) | R(XMM12) | R(XMM13) | R(XMM14) | R(XMM15); | |
188 | |
189 static const intptr_t kCalleeSaveCpuRegisters = | |
190 R(RBX) | R(R12) | R(R13) | R(R14) | R(R15); | |
191 | |
192 static const intptr_t kCalleeSaveXmmRegisters = 0; | |
193 }; | |
194 #endif | |
195 | |
196 #undef R | |
141 | 197 |
142 class Instr { | 198 class Instr { |
143 public: | 199 public: |
144 static const uint8_t kHltInstruction = 0xF4; | 200 static const uint8_t kHltInstruction = 0xF4; |
145 // We prefer not to use the int3 instruction since it conflicts with gdb. | 201 // We prefer not to use the int3 instruction since it conflicts with gdb. |
146 static const uint8_t kBreakPointInstruction = kHltInstruction; | 202 static const uint8_t kBreakPointInstruction = kHltInstruction; |
147 static const int kBreakPointInstructionSize = 1; | 203 static const int kBreakPointInstructionSize = 1; |
148 | 204 |
149 bool IsBreakPoint() { | 205 bool IsBreakPoint() { |
150 ASSERT(kBreakPointInstructionSize == 1); | 206 ASSERT(kBreakPointInstructionSize == 1); |
(...skipping 13 matching lines...) Expand all Loading... | |
164 }; | 220 }; |
165 | 221 |
166 | 222 |
167 // The largest multibyte nop we will emit. This could go up to 15 if it | 223 // The largest multibyte nop we will emit. This could go up to 15 if it |
168 // becomes important to us. | 224 // becomes important to us. |
169 const int MAX_NOP_SIZE = 8; | 225 const int MAX_NOP_SIZE = 8; |
170 | 226 |
171 } // namespace dart | 227 } // namespace dart |
172 | 228 |
173 #endif // VM_CONSTANTS_X64_H_ | 229 #endif // VM_CONSTANTS_X64_H_ |
OLD | NEW |