blob: 39725dee38f8cf362eda0bcc5ab35571985632f1 [file] [log] [blame]
buzbeecbd6d442012-11-17 14:11:25 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_COMPILER_DEX_COMPILER_ENUMS_H_
18#define ART_COMPILER_DEX_COMPILER_ENUMS_H_
buzbeecbd6d442012-11-17 14:11:25 -080019
20#include "dex_instruction.h"
21
22namespace art {
23
24enum RegisterClass {
Serban Constantinescu032d3772014-05-23 17:38:18 +010025 kInvalidRegClass,
buzbeecbd6d442012-11-17 14:11:25 -080026 kCoreReg,
27 kFPReg,
buzbeea0cd2d72014-06-01 09:33:49 -070028 kRefReg,
buzbeecbd6d442012-11-17 14:11:25 -080029 kAnyReg,
30};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070031std::ostream& operator<<(std::ostream& os, const RegisterClass& rhs);
buzbeecbd6d442012-11-17 14:11:25 -080032
buzbee091cc402014-03-31 10:14:40 -070033enum BitsUsed {
34 kSize32Bits,
35 kSize64Bits,
36 kSize128Bits,
37 kSize256Bits,
38 kSize512Bits,
39 kSize1024Bits,
40};
Ian Rogersb28c1c02014-11-08 11:21:21 -080041std::ostream& operator<<(std::ostream& os, const BitsUsed& rhs);
buzbee091cc402014-03-31 10:14:40 -070042
buzbeecbd6d442012-11-17 14:11:25 -080043enum SpecialTargetRegister {
buzbee02031b12012-11-23 09:41:35 -080044 kSelf, // Thread pointer.
45 kSuspend, // Used to reduce suspend checks for some targets.
buzbeecbd6d442012-11-17 14:11:25 -080046 kLr,
47 kPc,
48 kSp,
49 kArg0,
50 kArg1,
51 kArg2,
52 kArg3,
Dmitry Petrochenko58994cd2014-05-17 01:02:18 +070053 kArg4,
54 kArg5,
buzbee33ae5582014-06-12 14:56:32 -070055 kArg6,
56 kArg7,
buzbeecbd6d442012-11-17 14:11:25 -080057 kFArg0,
58 kFArg1,
59 kFArg2,
60 kFArg3,
Dmitry Petrochenko58994cd2014-05-17 01:02:18 +070061 kFArg4,
62 kFArg5,
63 kFArg6,
64 kFArg7,
Zheng Xu5667fdb2014-10-23 18:29:55 +080065 kFArg8,
66 kFArg9,
67 kFArg10,
68 kFArg11,
69 kFArg12,
70 kFArg13,
71 kFArg14,
72 kFArg15,
buzbeecbd6d442012-11-17 14:11:25 -080073 kRet0,
74 kRet1,
75 kInvokeTgt,
Jeff Hao88474b42013-10-23 16:24:40 -070076 kHiddenArg,
77 kHiddenFpArg,
buzbeecbd6d442012-11-17 14:11:25 -080078 kCount
79};
Ian Rogersb28c1c02014-11-08 11:21:21 -080080std::ostream& operator<<(std::ostream& os, const SpecialTargetRegister& code);
buzbeecbd6d442012-11-17 14:11:25 -080081
82enum RegLocationType {
Brian Carlstrom7934ac22013-07-26 10:54:15 -070083 kLocDalvikFrame = 0, // Normal Dalvik register
buzbeecbd6d442012-11-17 14:11:25 -080084 kLocPhysReg,
85 kLocCompilerTemp,
86 kLocInvalid
87};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070088std::ostream& operator<<(std::ostream& os, const RegLocationType& rhs);
buzbeecbd6d442012-11-17 14:11:25 -080089
90enum BBType {
buzbee0d829482013-10-11 15:24:55 -070091 kNullBlock,
buzbeecbd6d442012-11-17 14:11:25 -080092 kEntryBlock,
93 kDalvikByteCode,
94 kExitBlock,
95 kExceptionHandling,
96 kDead,
97};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070098std::ostream& operator<<(std::ostream& os, const BBType& code);
buzbeecbd6d442012-11-17 14:11:25 -080099
buzbee02031b12012-11-23 09:41:35 -0800100// Shared pseudo opcodes - must be < 0.
buzbeecbd6d442012-11-17 14:11:25 -0800101enum LIRPseudoOpcode {
buzbeea169e1d2012-12-05 14:26:44 -0800102 kPseudoExportedPC = -16,
103 kPseudoSafepointPC = -15,
104 kPseudoIntrinsicRetry = -14,
105 kPseudoSuspendTarget = -13,
106 kPseudoThrowTarget = -12,
107 kPseudoCaseLabel = -11,
108 kPseudoMethodEntry = -10,
109 kPseudoMethodExit = -9,
110 kPseudoBarrier = -8,
buzbeecbd6d442012-11-17 14:11:25 -0800111 kPseudoEntryBlock = -7,
112 kPseudoExitBlock = -6,
113 kPseudoTargetLabel = -5,
114 kPseudoDalvikByteCodeBoundary = -4,
115 kPseudoPseudoAlign4 = -3,
116 kPseudoEHBlockLabel = -2,
117 kPseudoNormalBlockLabel = -1,
118};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700119std::ostream& operator<<(std::ostream& os, const LIRPseudoOpcode& rhs);
buzbeecbd6d442012-11-17 14:11:25 -0800120
121enum ExtendedMIROpcode {
122 kMirOpFirst = kNumPackedOpcodes,
123 kMirOpPhi = kMirOpFirst,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700124
125 // @brief Copy from one VR to another.
126 // @details
127 // vA: destination VR
128 // vB: source VR
buzbeecbd6d442012-11-17 14:11:25 -0800129 kMirOpCopy,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700130
131 // @brief Used to do float comparison with less-than bias.
132 // @details Unlike cmpl-float, this does not store result of comparison in VR.
133 // vA: left-hand side VR for comparison.
134 // vB: right-hand side VR for comparison.
buzbeecbd6d442012-11-17 14:11:25 -0800135 kMirOpFusedCmplFloat,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700136
137 // @brief Used to do float comparison with greater-than bias.
138 // @details Unlike cmpg-float, this does not store result of comparison in VR.
139 // vA: left-hand side VR for comparison.
140 // vB: right-hand side VR for comparison.
buzbeecbd6d442012-11-17 14:11:25 -0800141 kMirOpFusedCmpgFloat,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700142
143 // @brief Used to do double comparison with less-than bias.
144 // @details Unlike cmpl-double, this does not store result of comparison in VR.
145 // vA: left-hand side wide VR for comparison.
146 // vB: right-hand side wide VR for comparison.
buzbeecbd6d442012-11-17 14:11:25 -0800147 kMirOpFusedCmplDouble,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700148
149 // @brief Used to do double comparison with greater-than bias.
150 // @details Unlike cmpl-double, this does not store result of comparison in VR.
151 // vA: left-hand side wide VR for comparison.
152 // vB: right-hand side wide VR for comparison.
buzbeecbd6d442012-11-17 14:11:25 -0800153 kMirOpFusedCmpgDouble,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700154
155 // @brief Used to do comparison of 64-bit long integers.
156 // @details Unlike cmp-long, this does not store result of comparison in VR.
157 // vA: left-hand side wide VR for comparison.
158 // vB: right-hand side wide VR for comparison.
buzbeecbd6d442012-11-17 14:11:25 -0800159 kMirOpFusedCmpLong,
Razvan A Lupusoru1500e6f2014-08-22 15:39:50 -0700160
161 // @brief This represents no-op.
buzbeecbd6d442012-11-17 14:11:25 -0800162 kMirOpNop,
Razvan A Lupusoru76423242014-08-04 09:38:46 -0700163
164 // @brief Do a null check on the object register.
165 // @details The backends may implement this implicitly or explicitly. This MIR is guaranteed
166 // to have the correct offset as an exception thrower.
167 // vA: object register
buzbeecbd6d442012-11-17 14:11:25 -0800168 kMirOpNullCheck,
Razvan A Lupusoru76423242014-08-04 09:38:46 -0700169
buzbeecbd6d442012-11-17 14:11:25 -0800170 kMirOpRangeCheck,
171 kMirOpDivZeroCheck,
172 kMirOpCheck,
buzbeea169e1d2012-12-05 14:26:44 -0800173 kMirOpCheckPart2,
buzbeef662a7c2013-02-12 16:19:43 -0800174 kMirOpSelect,
Mark Mendelld65c51a2014-04-29 16:55:20 -0400175
176 // Vector opcodes:
177 // TypeSize is an encoded field giving the element type and the vector size.
178 // It is encoded as OpSize << 16 | (number of bits in vector)
179 //
180 // Destination and source are integers that will be interpreted by the
181 // backend that supports Vector operations. Backends are permitted to support only
182 // certain vector register sizes.
183 //
184 // At this point, only two operand instructions are supported. Three operand instructions
185 // could be supported by using a bit in TypeSize and arg[0] where needed.
186
187 // @brief MIR to move constant data to a vector register
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700188 // vA: destination
189 // vB: number of bits in register
Mark Mendelld65c51a2014-04-29 16:55:20 -0400190 // args[0]~args[3]: up to 128 bits of data for initialization
191 kMirOpConstVector,
192
193 // @brief MIR to move a vectorized register to another
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700194 // vA: destination
195 // vB: source
196 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400197 kMirOpMoveVector,
198
199 // @brief Packed multiply of units in two vector registers: vB = vB .* vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700200 // vA: destination and source
201 // vB: source
202 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400203 kMirOpPackedMultiply,
204
205 // @brief Packed addition of units in two vector registers: vB = vB .+ vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700206 // vA: destination and source
207 // vB: source
208 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400209 kMirOpPackedAddition,
210
211 // @brief Packed subtraction of units in two vector registers: vB = vB .- vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700212 // vA: destination and source
213 // vB: source
214 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400215 kMirOpPackedSubtract,
216
217 // @brief Packed shift left of units in two vector registers: vB = vB .<< vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700218 // vA: destination and source
219 // vB: amount to shift
220 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400221 kMirOpPackedShiftLeft,
222
223 // @brief Packed signed shift right of units in two vector registers: vB = vB .>> vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700224 // vA: destination and source
225 // vB: amount to shift
226 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400227 kMirOpPackedSignedShiftRight,
228
229 // @brief Packed unsigned shift right of units in two vector registers: vB = vB .>>> vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700230 // vA: destination and source
231 // vB: amount to shift
232 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400233 kMirOpPackedUnsignedShiftRight,
234
235 // @brief Packed bitwise and of units in two vector registers: vB = vB .& vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700236 // vA: destination and source
237 // vB: source
238 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400239 kMirOpPackedAnd,
240
241 // @brief Packed bitwise or of units in two vector registers: vB = vB .| vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700242 // vA: destination and source
243 // vB: source
244 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400245 kMirOpPackedOr,
246
247 // @brief Packed bitwise xor of units in two vector registers: vB = vB .^ vC using vA to know the type of the vector.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700248 // vA: destination and source
249 // vB: source
250 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400251 kMirOpPackedXor,
252
253 // @brief Reduce a 128-bit packed element into a single VR by taking lower bits
254 // @details Instruction does a horizontal addition of the packed elements and then adds it to VR
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700255 // vA: destination and source VR (not vector register)
256 // vB: source (vector register)
257 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400258 kMirOpPackedAddReduce,
259
260 // @brief Extract a packed element into a single VR.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700261 // vA: destination VR (not vector register)
262 // vB: source (vector register)
263 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400264 // arg[0]: The index to use for extraction from vector register (which packed element)
265 kMirOpPackedReduce,
266
267 // @brief Create a vector value, with all TypeSize values equal to vC
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700268 // vA: destination vector register
269 // vB: source VR (not vector register)
270 // vC: TypeSize
Mark Mendelld65c51a2014-04-29 16:55:20 -0400271 kMirOpPackedSet,
272
Lupusoru, Razvan Ab3a84e22014-07-28 14:11:01 -0700273 // @brief Reserve a range of vector registers.
274 // vA: Start vector register to reserve.
275 // vB: Inclusive end vector register to reserve.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700276 // @note: The backend may choose to map vector numbers used in vector opcodes.
277 // Reserved registers are removed from the list of backend temporary pool.
278 kMirOpReserveVectorRegisters,
279
Lupusoru, Razvan Ab3a84e22014-07-28 14:11:01 -0700280 // @brief Free a range of reserved vector registers
281 // vA: Start vector register to unreserve.
282 // vB: Inclusive end vector register to unreserve.
Udayan Banerji60bfe7b2014-07-08 19:59:43 -0700283 // @note: All currently reserved vector registers are returned to the temporary pool.
284 kMirOpReturnVectorRegisters,
285
Jean Christophe Beylerb5bce7c2014-07-25 12:32:18 -0700286 // @brief Create a memory barrier.
287 // vA: a constant defined by enum MemBarrierKind.
288 kMirOpMemBarrier,
289
Lupusoru, Razvan Ab3a84e22014-07-28 14:11:01 -0700290 // @brief Used to fill a vector register with array values.
291 // @details Just as with normal arrays, access on null object register must ensure NullPointerException
292 // and invalid index must ensure ArrayIndexOutOfBoundsException. Exception behavior must be the same
293 // as the aget it replaced and must happen at same index. Therefore, it is generally recommended that
294 // before using this MIR, it is proven that exception is guaranteed to not be thrown and marked with
295 // MIR_IGNORE_NULL_CHECK and MIR_IGNORE_RANGE_CHECK.
296 // vA: destination vector register
297 // vB: array register
298 // vC: index register
299 // arg[0]: TypeSize (most other vector opcodes have this in vC)
300 kMirOpPackedArrayGet,
301
302 // @brief Used to store a vector register into array.
303 // @details Just as with normal arrays, access on null object register must ensure NullPointerException
304 // and invalid index must ensure ArrayIndexOutOfBoundsException. Exception behavior must be the same
305 // as the aget it replaced and must happen at same index. Therefore, it is generally recommended that
306 // before using this MIR, it is proven that exception is guaranteed to not be thrown and marked with
307 // MIR_IGNORE_NULL_CHECK and MIR_IGNORE_RANGE_CHECK.
308 // vA: source vector register
309 // vB: array register
310 // vC: index register
311 // arg[0]: TypeSize (most other vector opcodes have this in vC)
312 kMirOpPackedArrayPut,
313
Ningsheng Jiana262f772014-11-25 16:48:07 +0800314 // @brief Multiply-add integer.
315 // vA: destination
316 // vB: multiplicand
317 // vC: multiplier
318 // arg[0]: addend
319 kMirOpMaddInt,
320
321 // @brief Multiply-subtract integer.
322 // vA: destination
323 // vB: multiplicand
324 // vC: multiplier
325 // arg[0]: minuend
326 kMirOpMsubInt,
327
328 // @brief Multiply-add long.
329 // vA: destination
330 // vB: multiplicand
331 // vC: multiplier
332 // arg[0]: addend
333 kMirOpMaddLong,
334
335 // @brief Multiply-subtract long.
336 // vA: destination
337 // vB: multiplicand
338 // vC: multiplier
339 // arg[0]: minuend
340 kMirOpMsubLong,
341
buzbeecbd6d442012-11-17 14:11:25 -0800342 kMirOpLast,
343};
344
Jean Christophe Beyler89fde262014-04-30 11:40:07 -0700345enum MIROptimizationFlagPositions {
buzbeecbd6d442012-11-17 14:11:25 -0800346 kMIRIgnoreNullCheck = 0,
buzbeecbd6d442012-11-17 14:11:25 -0800347 kMIRIgnoreRangeCheck,
Vladimir Marko22fe45d2015-03-18 11:33:58 +0000348 kMIRIgnoreCheckCast,
Vladimir Marko743b98c2014-11-24 19:45:41 +0000349 kMIRStoreNonNullValue, // Storing non-null value, always mark GC card.
Vladimir Marko66c6d7b2014-10-16 15:41:48 +0100350 kMIRClassIsInitialized,
351 kMIRClassIsInDexCache,
Razvan A Lupusoru5c5676b2014-09-29 16:42:11 -0700352 kMirIgnoreDivZeroCheck,
buzbee02031b12012-11-23 09:41:35 -0800353 kMIRInlined, // Invoke is inlined (ie dead).
354 kMIRInlinedPred, // Invoke is inlined via prediction.
355 kMIRCallee, // Instruction is inlined from callee.
buzbeecbd6d442012-11-17 14:11:25 -0800356 kMIRIgnoreSuspendCheck,
357 kMIRDup,
Yevgeny Rouban423b1372014-10-15 17:32:25 +0700358 kMIRMark, // Temporary node mark can be used by
359 // opt passes for their private needs.
Jean Christophe Beylerb5bce7c2014-07-25 12:32:18 -0700360 kMIRStoreNonTemporal,
Jean Christophe Beyler89fde262014-04-30 11:40:07 -0700361 kMIRLastMIRFlag,
buzbeecbd6d442012-11-17 14:11:25 -0800362};
363
buzbee02031b12012-11-23 09:41:35 -0800364// For successor_block_list.
buzbeecbd6d442012-11-17 14:11:25 -0800365enum BlockListType {
366 kNotUsed = 0,
367 kCatch,
368 kPackedSwitch,
369 kSparseSwitch,
370};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700371std::ostream& operator<<(std::ostream& os, const BlockListType& rhs);
buzbeecbd6d442012-11-17 14:11:25 -0800372
373enum AssemblerStatus {
374 kSuccess,
375 kRetryAll,
376};
Ian Rogersb28c1c02014-11-08 11:21:21 -0800377std::ostream& operator<<(std::ostream& os, const AssemblerStatus& rhs);
buzbeecbd6d442012-11-17 14:11:25 -0800378
379enum OpSize {
buzbee695d13a2014-04-19 13:32:20 -0700380 kWord, // Natural word size of target (32/64).
381 k32,
382 k64,
383 kReference, // Object reference; compressed on 64-bit targets.
buzbeecbd6d442012-11-17 14:11:25 -0800384 kSingle,
385 kDouble,
386 kUnsignedHalf,
387 kSignedHalf,
388 kUnsignedByte,
389 kSignedByte,
390};
buzbeecbd6d442012-11-17 14:11:25 -0800391std::ostream& operator<<(std::ostream& os, const OpSize& kind);
392
393enum OpKind {
394 kOpMov,
Razvan A Lupusorubd288c22013-12-20 17:27:23 -0800395 kOpCmov,
buzbeecbd6d442012-11-17 14:11:25 -0800396 kOpMvn,
397 kOpCmp,
398 kOpLsl,
399 kOpLsr,
400 kOpAsr,
401 kOpRor,
402 kOpNot,
403 kOpAnd,
404 kOpOr,
405 kOpXor,
406 kOpNeg,
407 kOpAdd,
408 kOpAdc,
409 kOpSub,
410 kOpSbc,
411 kOpRsub,
412 kOpMul,
413 kOpDiv,
414 kOpRem,
415 kOpBic,
416 kOpCmn,
417 kOpTst,
Vladimir Markoa8b4caf2013-10-24 15:08:57 +0100418 kOpRev,
419 kOpRevsh,
buzbeecbd6d442012-11-17 14:11:25 -0800420 kOpBkpt,
421 kOpBlx,
422 kOpPush,
423 kOpPop,
424 kOp2Char,
425 kOp2Short,
426 kOp2Byte,
427 kOpCondBr,
428 kOpUncondBr,
429 kOpBx,
430 kOpInvalid,
431};
Ian Rogersb28c1c02014-11-08 11:21:21 -0800432std::ostream& operator<<(std::ostream& os, const OpKind& rhs);
buzbeecbd6d442012-11-17 14:11:25 -0800433
Razvan A Lupusoru2c498d12014-01-29 16:02:57 -0800434enum MoveType {
435 kMov8GP, // Move 8-bit general purpose register.
436 kMov16GP, // Move 16-bit general purpose register.
437 kMov32GP, // Move 32-bit general purpose register.
438 kMov64GP, // Move 64-bit general purpose register.
439 kMov32FP, // Move 32-bit FP register.
440 kMov64FP, // Move 64-bit FP register.
441 kMovLo64FP, // Move low 32-bits of 64-bit FP register.
442 kMovHi64FP, // Move high 32-bits of 64-bit FP register.
443 kMovU128FP, // Move 128-bit FP register to/from possibly unaligned region.
444 kMov128FP = kMovU128FP,
445 kMovA128FP, // Move 128-bit FP register to/from region surely aligned to 16-bytes.
446 kMovLo128FP, // Move low 64-bits of 128-bit FP register.
447 kMovHi128FP, // Move high 64-bits of 128-bit FP register.
448};
Ian Rogersb28c1c02014-11-08 11:21:21 -0800449std::ostream& operator<<(std::ostream& os, const MoveType& kind);
buzbeecbd6d442012-11-17 14:11:25 -0800450
451enum ConditionCode {
452 kCondEq, // equal
453 kCondNe, // not equal
Vladimir Marko58af1f92013-12-19 13:31:15 +0000454 kCondCs, // carry set
455 kCondCc, // carry clear
Vladimir Marko459f4df2013-12-20 17:03:09 +0000456 kCondUlt, // unsigned less than
457 kCondUge, // unsigned greater than or same
buzbeecbd6d442012-11-17 14:11:25 -0800458 kCondMi, // minus
459 kCondPl, // plus, positive or zero
460 kCondVs, // overflow
461 kCondVc, // no overflow
462 kCondHi, // unsigned greater than
463 kCondLs, // unsigned lower or same
464 kCondGe, // signed greater than or equal
465 kCondLt, // signed less than
466 kCondGt, // signed greater than
467 kCondLe, // signed less than or equal
468 kCondAl, // always
469 kCondNv, // never
470};
buzbeecbd6d442012-11-17 14:11:25 -0800471std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
472
473// Target specific condition encodings
474enum ArmConditionCode {
475 kArmCondEq = 0x0, // 0000
476 kArmCondNe = 0x1, // 0001
477 kArmCondCs = 0x2, // 0010
478 kArmCondCc = 0x3, // 0011
479 kArmCondMi = 0x4, // 0100
480 kArmCondPl = 0x5, // 0101
481 kArmCondVs = 0x6, // 0110
482 kArmCondVc = 0x7, // 0111
483 kArmCondHi = 0x8, // 1000
484 kArmCondLs = 0x9, // 1001
485 kArmCondGe = 0xa, // 1010
486 kArmCondLt = 0xb, // 1011
487 kArmCondGt = 0xc, // 1100
488 kArmCondLe = 0xd, // 1101
489 kArmCondAl = 0xe, // 1110
490 kArmCondNv = 0xf, // 1111
491};
buzbeecbd6d442012-11-17 14:11:25 -0800492std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
493
494enum X86ConditionCode {
495 kX86CondO = 0x0, // overflow
496 kX86CondNo = 0x1, // not overflow
497
498 kX86CondB = 0x2, // below
499 kX86CondNae = kX86CondB, // not-above-equal
500 kX86CondC = kX86CondB, // carry
501
502 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700503 kX86CondAe = kX86CondNb, // above-equal
504 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800505
506 kX86CondZ = 0x4, // zero
507 kX86CondEq = kX86CondZ, // equal
508
509 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700510 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800511
512 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700513 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800514
515 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700516 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800517
518 kX86CondS = 0x8, // sign
519 kX86CondNs = 0x9, // not-sign
520
521 kX86CondP = 0xa, // 8-bit parity even
522 kX86CondPE = kX86CondP,
523
524 kX86CondNp = 0xb, // 8-bit parity odd
525 kX86CondPo = kX86CondNp,
526
527 kX86CondL = 0xc, // less-than
528 kX86CondNge = kX86CondL, // not-greater-equal
529
530 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700531 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800532
533 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700534 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800535
536 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700537 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800538};
buzbeecbd6d442012-11-17 14:11:25 -0800539std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
540
buzbeecbd6d442012-11-17 14:11:25 -0800541enum DividePattern {
542 DivideNone,
543 Divide3,
544 Divide5,
545 Divide7,
546};
buzbeecbd6d442012-11-17 14:11:25 -0800547std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
548
Razvan A Lupusoru99ad7232014-02-25 17:41:08 -0800549/**
550 * @brief Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
Hans Boehm48f5c472014-06-27 14:50:10 -0700551 * @details We define the combined barrier types that are actually required
552 * by the Java Memory Model, rather than using exactly the terminology from
553 * the JSR-133 cookbook. These should, in many cases, be replaced by acquire/release
554 * primitives. Note that the JSR-133 cookbook generally does not deal with
555 * store atomicity issues, and the recipes there are not always entirely sufficient.
556 * The current recipe is as follows:
557 * -# Use AnyStore ~= (LoadStore | StoreStore) ~= release barrier before volatile store.
558 * -# Use AnyAny barrier after volatile store. (StoreLoad is as expensive.)
Calin Juravle52c48962014-12-16 17:02:57 +0000559 * -# Use LoadAny barrier ~= (LoadLoad | LoadStore) ~= acquire barrier after each volatile load.
Razvan A Lupusoru99ad7232014-02-25 17:41:08 -0800560 * -# Use StoreStore barrier after all stores but before return from any constructor whose
Hans Boehm48f5c472014-06-27 14:50:10 -0700561 * class has final fields.
Jean Christophe Beylerb5bce7c2014-07-25 12:32:18 -0700562 * -# Use NTStoreStore to order non-temporal stores with respect to all later
563 * store-to-memory instructions. Only generated together with non-temporal stores.
Razvan A Lupusoru99ad7232014-02-25 17:41:08 -0800564 */
buzbee1bc37c62012-11-20 13:35:41 -0800565enum MemBarrierKind {
Hans Boehm48f5c472014-06-27 14:50:10 -0700566 kAnyStore,
567 kLoadAny,
buzbee1bc37c62012-11-20 13:35:41 -0800568 kStoreStore,
Jean Christophe Beylerb5bce7c2014-07-25 12:32:18 -0700569 kAnyAny,
570 kNTStoreStore,
buzbee1bc37c62012-11-20 13:35:41 -0800571};
buzbee1bc37c62012-11-20 13:35:41 -0800572std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
573
buzbee02031b12012-11-23 09:41:35 -0800574enum OpFeatureFlags {
575 kIsBranch = 0,
576 kNoOperand,
577 kIsUnaryOp,
578 kIsBinaryOp,
579 kIsTertiaryOp,
580 kIsQuadOp,
581 kIsQuinOp,
582 kIsSextupleOp,
583 kIsIT,
Serban Constantinescu63999682014-07-15 17:44:21 +0100584 kIsMoveOp,
buzbee02031b12012-11-23 09:41:35 -0800585 kMemLoad,
586 kMemStore,
Serban Constantinescu63999682014-07-15 17:44:21 +0100587 kMemVolatile,
588 kMemScaledx0,
589 kMemScaledx2,
590 kMemScaledx4,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700591 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800592 kRegDef0,
593 kRegDef1,
Razvan A Lupusoru99ad7232014-02-25 17:41:08 -0800594 kRegDef2,
buzbee02031b12012-11-23 09:41:35 -0800595 kRegDefA,
596 kRegDefD,
597 kRegDefFPCSList0,
598 kRegDefFPCSList2,
599 kRegDefList0,
600 kRegDefList1,
601 kRegDefList2,
602 kRegDefLR,
603 kRegDefSP,
604 kRegUse0,
605 kRegUse1,
606 kRegUse2,
607 kRegUse3,
608 kRegUse4,
609 kRegUseA,
610 kRegUseC,
611 kRegUseD,
Vladimir Marko70b797d2013-12-03 15:25:24 +0000612 kRegUseB,
buzbee02031b12012-11-23 09:41:35 -0800613 kRegUseFPCSList0,
614 kRegUseFPCSList2,
615 kRegUseList0,
616 kRegUseList1,
617 kRegUseLR,
618 kRegUsePC,
619 kRegUseSP,
620 kSetsCCodes,
Serguei Katkove90501d2014-03-12 15:56:54 +0700621 kUsesCCodes,
buzbee9da5c102014-03-28 12:59:18 -0700622 kUseFpStack,
623 kUseHi,
624 kUseLo,
625 kDefHi,
626 kDefLo
buzbee02031b12012-11-23 09:41:35 -0800627};
Ian Rogersb28c1c02014-11-08 11:21:21 -0800628std::ostream& operator<<(std::ostream& os, const OpFeatureFlags& rhs);
buzbee02031b12012-11-23 09:41:35 -0800629
buzbeef662a7c2013-02-12 16:19:43 -0800630enum SelectInstructionKind {
631 kSelectNone,
632 kSelectConst,
633 kSelectMove,
634 kSelectGoto
635};
buzbeea5abf702013-04-12 14:39:29 -0700636std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
637
Mark Mendell27dee8b2014-12-01 19:06:12 -0500638// LIR fixup kinds for Arm and X86.
buzbeeb48819d2013-09-14 16:15:25 -0700639enum FixupKind {
640 kFixupNone,
Matteo Franchin65420b22014-10-27 13:29:30 +0000641 kFixupLabel, // For labels we just adjust the offset.
642 kFixupLoad, // Mostly for immediates.
643 kFixupVLoad, // FP load which *may* be pc-relative.
644 kFixupCBxZ, // Cbz, Cbnz.
645 kFixupTBxZ, // Tbz, Tbnz.
Matteo Franchin65420b22014-10-27 13:29:30 +0000646 kFixupCondBranch, // Conditional branch
647 kFixupT1Branch, // Thumb1 Unconditional branch
648 kFixupT2Branch, // Thumb2 Unconditional branch
649 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
650 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
651 kFixupAdr, // Adr.
652 kFixupMovImmLST, // kThumb2MovImm16LST.
653 kFixupMovImmHST, // kThumb2MovImm16HST.
654 kFixupAlign4, // Align to 4-byte boundary.
655 kFixupA53Erratum835769, // Cortex A53 Erratum 835769.
Mark Mendell27dee8b2014-12-01 19:06:12 -0500656 kFixupSwitchTable, // X86_64 packed switch table.
buzbeeb48819d2013-09-14 16:15:25 -0700657};
buzbeeb48819d2013-09-14 16:15:25 -0700658std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
659
Andreas Gampe3c12c512014-06-24 18:46:29 +0000660enum VolatileKind {
661 kNotVolatile, // Load/Store is not volatile
662 kVolatile // Load/Store is volatile
663};
Andreas Gampe3c12c512014-06-24 18:46:29 +0000664std::ostream& operator<<(std::ostream& os, const VolatileKind& kind);
665
Andreas Gampeccc60262014-07-04 18:02:38 -0700666enum WideKind {
667 kNotWide, // Non-wide view
668 kWide, // Wide view
669 kRef // Ref width
670};
Andreas Gampeccc60262014-07-04 18:02:38 -0700671std::ostream& operator<<(std::ostream& os, const WideKind& kind);
672
buzbeecbd6d442012-11-17 14:11:25 -0800673} // namespace art
674
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700675#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_