blob: 18122b3dfd0d95c3528965f4ff56bada46bd8bc5 [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 {
25 kCoreReg,
26 kFPReg,
27 kAnyReg,
28};
29
30enum SpecialTargetRegister {
buzbee02031b12012-11-23 09:41:35 -080031 kSelf, // Thread pointer.
32 kSuspend, // Used to reduce suspend checks for some targets.
buzbeecbd6d442012-11-17 14:11:25 -080033 kLr,
34 kPc,
35 kSp,
36 kArg0,
37 kArg1,
38 kArg2,
39 kArg3,
40 kFArg0,
41 kFArg1,
42 kFArg2,
43 kFArg3,
44 kRet0,
45 kRet1,
46 kInvokeTgt,
Jeff Hao88474b42013-10-23 16:24:40 -070047 kHiddenArg,
48 kHiddenFpArg,
buzbeecbd6d442012-11-17 14:11:25 -080049 kCount
50};
51
52enum RegLocationType {
Brian Carlstrom7934ac22013-07-26 10:54:15 -070053 kLocDalvikFrame = 0, // Normal Dalvik register
buzbeecbd6d442012-11-17 14:11:25 -080054 kLocPhysReg,
55 kLocCompilerTemp,
56 kLocInvalid
57};
58
Bill Buzbeed61ba4b2014-01-13 21:44:01 +000059/**
60 * Support for vector registers. Initially used for x86 floats. This will be used
61 * to replace the assumption that a double takes up 2 single FP registers
62 */
63enum VectorLengthType {
64 kVectorNotUsed = 0, // This value is NOT in a vector register.
65 kVectorLength4, // The value occupies 4 bytes in a vector register.
66 kVectorLength8, // The value occupies 8 bytes in a vector register.
67 kVectorLength16 // The value occupies 16 bytes in a vector register (unused now).
68};
69
buzbeecbd6d442012-11-17 14:11:25 -080070enum BBType {
buzbee0d829482013-10-11 15:24:55 -070071 kNullBlock,
buzbeecbd6d442012-11-17 14:11:25 -080072 kEntryBlock,
73 kDalvikByteCode,
74 kExitBlock,
75 kExceptionHandling,
76 kDead,
77};
78
79/*
buzbeefa57c472012-11-21 12:06:18 -080080 * Def/Use encoding in 64-bit use_mask/def_mask. Low positions used for target-specific
buzbeecbd6d442012-11-17 14:11:25 -080081 * registers (and typically use the register number as the position). High positions
82 * reserved for common and abstract resources.
83 */
84
85enum ResourceEncodingPos {
86 kMustNotAlias = 63,
buzbee02031b12012-11-23 09:41:35 -080087 kHeapRef = 62, // Default memory reference type.
88 kLiteral = 61, // Literal pool memory reference.
89 kDalvikReg = 60, // Dalvik v_reg memory reference.
buzbeecbd6d442012-11-17 14:11:25 -080090 kFPStatus = 59,
91 kCCode = 58,
92 kLowestCommonResource = kCCode
93};
94
buzbee02031b12012-11-23 09:41:35 -080095// Shared pseudo opcodes - must be < 0.
buzbeecbd6d442012-11-17 14:11:25 -080096enum LIRPseudoOpcode {
buzbeea169e1d2012-12-05 14:26:44 -080097 kPseudoExportedPC = -16,
98 kPseudoSafepointPC = -15,
99 kPseudoIntrinsicRetry = -14,
100 kPseudoSuspendTarget = -13,
101 kPseudoThrowTarget = -12,
102 kPseudoCaseLabel = -11,
103 kPseudoMethodEntry = -10,
104 kPseudoMethodExit = -9,
105 kPseudoBarrier = -8,
buzbeecbd6d442012-11-17 14:11:25 -0800106 kPseudoEntryBlock = -7,
107 kPseudoExitBlock = -6,
108 kPseudoTargetLabel = -5,
109 kPseudoDalvikByteCodeBoundary = -4,
110 kPseudoPseudoAlign4 = -3,
111 kPseudoEHBlockLabel = -2,
112 kPseudoNormalBlockLabel = -1,
113};
114
115enum ExtendedMIROpcode {
116 kMirOpFirst = kNumPackedOpcodes,
117 kMirOpPhi = kMirOpFirst,
118 kMirOpCopy,
119 kMirOpFusedCmplFloat,
120 kMirOpFusedCmpgFloat,
121 kMirOpFusedCmplDouble,
122 kMirOpFusedCmpgDouble,
123 kMirOpFusedCmpLong,
124 kMirOpNop,
125 kMirOpNullCheck,
126 kMirOpRangeCheck,
127 kMirOpDivZeroCheck,
128 kMirOpCheck,
buzbeea169e1d2012-12-05 14:26:44 -0800129 kMirOpCheckPart2,
buzbeef662a7c2013-02-12 16:19:43 -0800130 kMirOpSelect,
buzbeecbd6d442012-11-17 14:11:25 -0800131 kMirOpLast,
132};
133
134enum MIROptimizationFlagPositons {
135 kMIRIgnoreNullCheck = 0,
136 kMIRNullCheckOnly,
137 kMIRIgnoreRangeCheck,
138 kMIRRangeCheckOnly,
buzbee02031b12012-11-23 09:41:35 -0800139 kMIRInlined, // Invoke is inlined (ie dead).
140 kMIRInlinedPred, // Invoke is inlined via prediction.
141 kMIRCallee, // Instruction is inlined from callee.
buzbeecbd6d442012-11-17 14:11:25 -0800142 kMIRIgnoreSuspendCheck,
143 kMIRDup,
buzbee02031b12012-11-23 09:41:35 -0800144 kMIRMark, // Temporary node mark.
buzbeecbd6d442012-11-17 14:11:25 -0800145};
146
buzbee02031b12012-11-23 09:41:35 -0800147// For successor_block_list.
buzbeecbd6d442012-11-17 14:11:25 -0800148enum BlockListType {
149 kNotUsed = 0,
150 kCatch,
151 kPackedSwitch,
152 kSparseSwitch,
153};
154
155enum AssemblerStatus {
156 kSuccess,
157 kRetryAll,
158};
159
160enum OpSize {
161 kWord,
162 kLong,
163 kSingle,
164 kDouble,
165 kUnsignedHalf,
166 kSignedHalf,
167 kUnsignedByte,
168 kSignedByte,
169};
170
171std::ostream& operator<<(std::ostream& os, const OpSize& kind);
172
173enum OpKind {
174 kOpMov,
Razvan A Lupusorubd288c22013-12-20 17:27:23 -0800175 kOpCmov,
buzbeecbd6d442012-11-17 14:11:25 -0800176 kOpMvn,
177 kOpCmp,
178 kOpLsl,
179 kOpLsr,
180 kOpAsr,
181 kOpRor,
182 kOpNot,
183 kOpAnd,
184 kOpOr,
185 kOpXor,
186 kOpNeg,
187 kOpAdd,
188 kOpAdc,
189 kOpSub,
190 kOpSbc,
191 kOpRsub,
192 kOpMul,
193 kOpDiv,
194 kOpRem,
195 kOpBic,
196 kOpCmn,
197 kOpTst,
Vladimir Markoa8b4caf2013-10-24 15:08:57 +0100198 kOpRev,
199 kOpRevsh,
buzbeecbd6d442012-11-17 14:11:25 -0800200 kOpBkpt,
201 kOpBlx,
202 kOpPush,
203 kOpPop,
204 kOp2Char,
205 kOp2Short,
206 kOp2Byte,
207 kOpCondBr,
208 kOpUncondBr,
209 kOpBx,
210 kOpInvalid,
211};
212
213std::ostream& operator<<(std::ostream& os, const OpKind& kind);
214
215enum ConditionCode {
216 kCondEq, // equal
217 kCondNe, // not equal
Vladimir Marko58af1f92013-12-19 13:31:15 +0000218 kCondCs, // carry set
219 kCondCc, // carry clear
Vladimir Marko459f4df2013-12-20 17:03:09 +0000220 kCondUlt, // unsigned less than
221 kCondUge, // unsigned greater than or same
buzbeecbd6d442012-11-17 14:11:25 -0800222 kCondMi, // minus
223 kCondPl, // plus, positive or zero
224 kCondVs, // overflow
225 kCondVc, // no overflow
226 kCondHi, // unsigned greater than
227 kCondLs, // unsigned lower or same
228 kCondGe, // signed greater than or equal
229 kCondLt, // signed less than
230 kCondGt, // signed greater than
231 kCondLe, // signed less than or equal
232 kCondAl, // always
233 kCondNv, // never
234};
235
236std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
237
238// Target specific condition encodings
239enum ArmConditionCode {
240 kArmCondEq = 0x0, // 0000
241 kArmCondNe = 0x1, // 0001
242 kArmCondCs = 0x2, // 0010
243 kArmCondCc = 0x3, // 0011
244 kArmCondMi = 0x4, // 0100
245 kArmCondPl = 0x5, // 0101
246 kArmCondVs = 0x6, // 0110
247 kArmCondVc = 0x7, // 0111
248 kArmCondHi = 0x8, // 1000
249 kArmCondLs = 0x9, // 1001
250 kArmCondGe = 0xa, // 1010
251 kArmCondLt = 0xb, // 1011
252 kArmCondGt = 0xc, // 1100
253 kArmCondLe = 0xd, // 1101
254 kArmCondAl = 0xe, // 1110
255 kArmCondNv = 0xf, // 1111
256};
257
258std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
259
260enum X86ConditionCode {
261 kX86CondO = 0x0, // overflow
262 kX86CondNo = 0x1, // not overflow
263
264 kX86CondB = 0x2, // below
265 kX86CondNae = kX86CondB, // not-above-equal
266 kX86CondC = kX86CondB, // carry
267
268 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700269 kX86CondAe = kX86CondNb, // above-equal
270 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800271
272 kX86CondZ = 0x4, // zero
273 kX86CondEq = kX86CondZ, // equal
274
275 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700276 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800277
278 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700279 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800280
281 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700282 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800283
284 kX86CondS = 0x8, // sign
285 kX86CondNs = 0x9, // not-sign
286
287 kX86CondP = 0xa, // 8-bit parity even
288 kX86CondPE = kX86CondP,
289
290 kX86CondNp = 0xb, // 8-bit parity odd
291 kX86CondPo = kX86CondNp,
292
293 kX86CondL = 0xc, // less-than
294 kX86CondNge = kX86CondL, // not-greater-equal
295
296 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700297 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800298
299 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700300 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800301
302 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700303 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800304};
305
306std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
307
308enum ThrowKind {
309 kThrowNullPointer,
310 kThrowDivZero,
311 kThrowArrayBounds,
buzbee4ef3e452012-12-14 13:35:28 -0800312 kThrowConstantArrayBounds,
buzbeecbd6d442012-11-17 14:11:25 -0800313 kThrowNoSuchMethod,
314 kThrowStackOverflow,
315};
316
buzbeecbd6d442012-11-17 14:11:25 -0800317enum DividePattern {
318 DivideNone,
319 Divide3,
320 Divide5,
321 Divide7,
322};
323
324std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
325
buzbee02031b12012-11-23 09:41:35 -0800326// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800327enum MemBarrierKind {
328 kLoadStore,
329 kLoadLoad,
330 kStoreStore,
331 kStoreLoad
332};
333
334std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
335
buzbee02031b12012-11-23 09:41:35 -0800336enum OpFeatureFlags {
337 kIsBranch = 0,
338 kNoOperand,
339 kIsUnaryOp,
340 kIsBinaryOp,
341 kIsTertiaryOp,
342 kIsQuadOp,
343 kIsQuinOp,
344 kIsSextupleOp,
345 kIsIT,
346 kMemLoad,
347 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700348 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800349 kRegDef0,
350 kRegDef1,
351 kRegDefA,
352 kRegDefD,
353 kRegDefFPCSList0,
354 kRegDefFPCSList2,
355 kRegDefList0,
356 kRegDefList1,
357 kRegDefList2,
358 kRegDefLR,
359 kRegDefSP,
360 kRegUse0,
361 kRegUse1,
362 kRegUse2,
363 kRegUse3,
364 kRegUse4,
365 kRegUseA,
366 kRegUseC,
367 kRegUseD,
Vladimir Marko70b797d2013-12-03 15:25:24 +0000368 kRegUseB,
buzbee02031b12012-11-23 09:41:35 -0800369 kRegUseFPCSList0,
370 kRegUseFPCSList2,
371 kRegUseList0,
372 kRegUseList1,
373 kRegUseLR,
374 kRegUsePC,
375 kRegUseSP,
376 kSetsCCodes,
377 kUsesCCodes
378};
379
buzbeef662a7c2013-02-12 16:19:43 -0800380enum SelectInstructionKind {
381 kSelectNone,
382 kSelectConst,
383 kSelectMove,
384 kSelectGoto
385};
386
buzbeea5abf702013-04-12 14:39:29 -0700387std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
388
389// Type of growable bitmap for memory tuning.
390enum OatBitMapKind {
391 kBitMapMisc = 0,
392 kBitMapUse,
393 kBitMapDef,
394 kBitMapLiveIn,
395 kBitMapBMatrix,
396 kBitMapDominators,
397 kBitMapIDominated,
398 kBitMapDomFrontier,
399 kBitMapPhi,
400 kBitMapTmpBlocks,
401 kBitMapInputBlocks,
402 kBitMapRegisterV,
403 kBitMapTempSSARegisterV,
404 kBitMapNullCheck,
405 kBitMapTmpBlockV,
406 kBitMapPredecessors,
407 kNumBitMapKinds
408};
409
410std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800411
buzbeeb48819d2013-09-14 16:15:25 -0700412// LIR fixup kinds for Arm
413enum FixupKind {
414 kFixupNone,
415 kFixupLabel, // For labels we just adjust the offset.
416 kFixupLoad, // Mostly for imediates.
417 kFixupVLoad, // FP load which *may* be pc-relative.
418 kFixupCBxZ, // Cbz, Cbnz.
419 kFixupPushPop, // Not really pc relative, but changes size based on args.
420 kFixupCondBranch, // Conditional branch
421 kFixupT1Branch, // Thumb1 Unconditional branch
422 kFixupT2Branch, // Thumb2 Unconditional branch
423 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
424 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
425 kFixupAdr, // Adr.
426 kFixupMovImmLST, // kThumb2MovImm16LST.
427 kFixupMovImmHST, // kThumb2MovImm16HST.
428 kFixupAlign4, // Align to 4-byte boundary.
429};
430
431std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
432
buzbeecbd6d442012-11-17 14:11:25 -0800433} // namespace art
434
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700435#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_