blob: 4650f25a90b469c15af443d20497f1d12db0881a [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
59enum BBType {
buzbee0d829482013-10-11 15:24:55 -070060 kNullBlock,
buzbeecbd6d442012-11-17 14:11:25 -080061 kEntryBlock,
62 kDalvikByteCode,
63 kExitBlock,
64 kExceptionHandling,
65 kDead,
66};
67
68/*
buzbeefa57c472012-11-21 12:06:18 -080069 * Def/Use encoding in 64-bit use_mask/def_mask. Low positions used for target-specific
buzbeecbd6d442012-11-17 14:11:25 -080070 * registers (and typically use the register number as the position). High positions
71 * reserved for common and abstract resources.
72 */
73
74enum ResourceEncodingPos {
75 kMustNotAlias = 63,
buzbee02031b12012-11-23 09:41:35 -080076 kHeapRef = 62, // Default memory reference type.
77 kLiteral = 61, // Literal pool memory reference.
78 kDalvikReg = 60, // Dalvik v_reg memory reference.
buzbeecbd6d442012-11-17 14:11:25 -080079 kFPStatus = 59,
80 kCCode = 58,
81 kLowestCommonResource = kCCode
82};
83
buzbee02031b12012-11-23 09:41:35 -080084// Shared pseudo opcodes - must be < 0.
buzbeecbd6d442012-11-17 14:11:25 -080085enum LIRPseudoOpcode {
buzbeea169e1d2012-12-05 14:26:44 -080086 kPseudoExportedPC = -16,
87 kPseudoSafepointPC = -15,
88 kPseudoIntrinsicRetry = -14,
89 kPseudoSuspendTarget = -13,
90 kPseudoThrowTarget = -12,
91 kPseudoCaseLabel = -11,
92 kPseudoMethodEntry = -10,
93 kPseudoMethodExit = -9,
94 kPseudoBarrier = -8,
buzbeecbd6d442012-11-17 14:11:25 -080095 kPseudoEntryBlock = -7,
96 kPseudoExitBlock = -6,
97 kPseudoTargetLabel = -5,
98 kPseudoDalvikByteCodeBoundary = -4,
99 kPseudoPseudoAlign4 = -3,
100 kPseudoEHBlockLabel = -2,
101 kPseudoNormalBlockLabel = -1,
102};
103
104enum ExtendedMIROpcode {
105 kMirOpFirst = kNumPackedOpcodes,
106 kMirOpPhi = kMirOpFirst,
107 kMirOpCopy,
108 kMirOpFusedCmplFloat,
109 kMirOpFusedCmpgFloat,
110 kMirOpFusedCmplDouble,
111 kMirOpFusedCmpgDouble,
112 kMirOpFusedCmpLong,
113 kMirOpNop,
114 kMirOpNullCheck,
115 kMirOpRangeCheck,
116 kMirOpDivZeroCheck,
117 kMirOpCheck,
buzbeea169e1d2012-12-05 14:26:44 -0800118 kMirOpCheckPart2,
buzbeef662a7c2013-02-12 16:19:43 -0800119 kMirOpSelect,
buzbeecbd6d442012-11-17 14:11:25 -0800120 kMirOpLast,
121};
122
123enum MIROptimizationFlagPositons {
124 kMIRIgnoreNullCheck = 0,
125 kMIRNullCheckOnly,
126 kMIRIgnoreRangeCheck,
127 kMIRRangeCheckOnly,
buzbee02031b12012-11-23 09:41:35 -0800128 kMIRInlined, // Invoke is inlined (ie dead).
129 kMIRInlinedPred, // Invoke is inlined via prediction.
130 kMIRCallee, // Instruction is inlined from callee.
buzbeecbd6d442012-11-17 14:11:25 -0800131 kMIRIgnoreSuspendCheck,
132 kMIRDup,
buzbee02031b12012-11-23 09:41:35 -0800133 kMIRMark, // Temporary node mark.
buzbeecbd6d442012-11-17 14:11:25 -0800134};
135
buzbee02031b12012-11-23 09:41:35 -0800136// For successor_block_list.
buzbeecbd6d442012-11-17 14:11:25 -0800137enum BlockListType {
138 kNotUsed = 0,
139 kCatch,
140 kPackedSwitch,
141 kSparseSwitch,
142};
143
144enum AssemblerStatus {
145 kSuccess,
146 kRetryAll,
147};
148
149enum OpSize {
150 kWord,
151 kLong,
152 kSingle,
153 kDouble,
154 kUnsignedHalf,
155 kSignedHalf,
156 kUnsignedByte,
157 kSignedByte,
158};
159
160std::ostream& operator<<(std::ostream& os, const OpSize& kind);
161
162enum OpKind {
163 kOpMov,
Razvan A Lupusorubd288c22013-12-20 17:27:23 -0800164 kOpCmov,
buzbeecbd6d442012-11-17 14:11:25 -0800165 kOpMvn,
166 kOpCmp,
167 kOpLsl,
168 kOpLsr,
169 kOpAsr,
170 kOpRor,
171 kOpNot,
172 kOpAnd,
173 kOpOr,
174 kOpXor,
175 kOpNeg,
176 kOpAdd,
177 kOpAdc,
178 kOpSub,
179 kOpSbc,
180 kOpRsub,
181 kOpMul,
182 kOpDiv,
183 kOpRem,
184 kOpBic,
185 kOpCmn,
186 kOpTst,
Vladimir Markoa8b4caf2013-10-24 15:08:57 +0100187 kOpRev,
188 kOpRevsh,
buzbeecbd6d442012-11-17 14:11:25 -0800189 kOpBkpt,
190 kOpBlx,
191 kOpPush,
192 kOpPop,
193 kOp2Char,
194 kOp2Short,
195 kOp2Byte,
196 kOpCondBr,
197 kOpUncondBr,
198 kOpBx,
199 kOpInvalid,
200};
201
202std::ostream& operator<<(std::ostream& os, const OpKind& kind);
203
204enum ConditionCode {
205 kCondEq, // equal
206 kCondNe, // not equal
Vladimir Marko58af1f92013-12-19 13:31:15 +0000207 kCondCs, // carry set
208 kCondCc, // carry clear
Vladimir Marko459f4df2013-12-20 17:03:09 +0000209 kCondUlt, // unsigned less than
210 kCondUge, // unsigned greater than or same
buzbeecbd6d442012-11-17 14:11:25 -0800211 kCondMi, // minus
212 kCondPl, // plus, positive or zero
213 kCondVs, // overflow
214 kCondVc, // no overflow
215 kCondHi, // unsigned greater than
216 kCondLs, // unsigned lower or same
217 kCondGe, // signed greater than or equal
218 kCondLt, // signed less than
219 kCondGt, // signed greater than
220 kCondLe, // signed less than or equal
221 kCondAl, // always
222 kCondNv, // never
223};
224
225std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
226
227// Target specific condition encodings
228enum ArmConditionCode {
229 kArmCondEq = 0x0, // 0000
230 kArmCondNe = 0x1, // 0001
231 kArmCondCs = 0x2, // 0010
232 kArmCondCc = 0x3, // 0011
233 kArmCondMi = 0x4, // 0100
234 kArmCondPl = 0x5, // 0101
235 kArmCondVs = 0x6, // 0110
236 kArmCondVc = 0x7, // 0111
237 kArmCondHi = 0x8, // 1000
238 kArmCondLs = 0x9, // 1001
239 kArmCondGe = 0xa, // 1010
240 kArmCondLt = 0xb, // 1011
241 kArmCondGt = 0xc, // 1100
242 kArmCondLe = 0xd, // 1101
243 kArmCondAl = 0xe, // 1110
244 kArmCondNv = 0xf, // 1111
245};
246
247std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
248
249enum X86ConditionCode {
250 kX86CondO = 0x0, // overflow
251 kX86CondNo = 0x1, // not overflow
252
253 kX86CondB = 0x2, // below
254 kX86CondNae = kX86CondB, // not-above-equal
255 kX86CondC = kX86CondB, // carry
256
257 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700258 kX86CondAe = kX86CondNb, // above-equal
259 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800260
261 kX86CondZ = 0x4, // zero
262 kX86CondEq = kX86CondZ, // equal
263
264 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700265 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800266
267 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700268 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800269
270 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700271 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800272
273 kX86CondS = 0x8, // sign
274 kX86CondNs = 0x9, // not-sign
275
276 kX86CondP = 0xa, // 8-bit parity even
277 kX86CondPE = kX86CondP,
278
279 kX86CondNp = 0xb, // 8-bit parity odd
280 kX86CondPo = kX86CondNp,
281
282 kX86CondL = 0xc, // less-than
283 kX86CondNge = kX86CondL, // not-greater-equal
284
285 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700286 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800287
288 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700289 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800290
291 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700292 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800293};
294
295std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
296
297enum ThrowKind {
298 kThrowNullPointer,
299 kThrowDivZero,
300 kThrowArrayBounds,
buzbee4ef3e452012-12-14 13:35:28 -0800301 kThrowConstantArrayBounds,
buzbeecbd6d442012-11-17 14:11:25 -0800302 kThrowNoSuchMethod,
303 kThrowStackOverflow,
304};
305
buzbeecbd6d442012-11-17 14:11:25 -0800306enum DividePattern {
307 DivideNone,
308 Divide3,
309 Divide5,
310 Divide7,
311};
312
313std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
314
buzbee02031b12012-11-23 09:41:35 -0800315// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800316enum MemBarrierKind {
317 kLoadStore,
318 kLoadLoad,
319 kStoreStore,
320 kStoreLoad
321};
322
323std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
324
buzbee02031b12012-11-23 09:41:35 -0800325enum OpFeatureFlags {
326 kIsBranch = 0,
327 kNoOperand,
328 kIsUnaryOp,
329 kIsBinaryOp,
330 kIsTertiaryOp,
331 kIsQuadOp,
332 kIsQuinOp,
333 kIsSextupleOp,
334 kIsIT,
335 kMemLoad,
336 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700337 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800338 kRegDef0,
339 kRegDef1,
340 kRegDefA,
341 kRegDefD,
342 kRegDefFPCSList0,
343 kRegDefFPCSList2,
344 kRegDefList0,
345 kRegDefList1,
346 kRegDefList2,
347 kRegDefLR,
348 kRegDefSP,
349 kRegUse0,
350 kRegUse1,
351 kRegUse2,
352 kRegUse3,
353 kRegUse4,
354 kRegUseA,
355 kRegUseC,
356 kRegUseD,
Vladimir Marko70b797d2013-12-03 15:25:24 +0000357 kRegUseB,
buzbee02031b12012-11-23 09:41:35 -0800358 kRegUseFPCSList0,
359 kRegUseFPCSList2,
360 kRegUseList0,
361 kRegUseList1,
362 kRegUseLR,
363 kRegUsePC,
364 kRegUseSP,
365 kSetsCCodes,
366 kUsesCCodes
367};
368
buzbeef662a7c2013-02-12 16:19:43 -0800369enum SelectInstructionKind {
370 kSelectNone,
371 kSelectConst,
372 kSelectMove,
373 kSelectGoto
374};
375
buzbeea5abf702013-04-12 14:39:29 -0700376std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
377
378// Type of growable bitmap for memory tuning.
379enum OatBitMapKind {
380 kBitMapMisc = 0,
381 kBitMapUse,
382 kBitMapDef,
383 kBitMapLiveIn,
384 kBitMapBMatrix,
385 kBitMapDominators,
386 kBitMapIDominated,
387 kBitMapDomFrontier,
388 kBitMapPhi,
389 kBitMapTmpBlocks,
390 kBitMapInputBlocks,
391 kBitMapRegisterV,
392 kBitMapTempSSARegisterV,
393 kBitMapNullCheck,
394 kBitMapTmpBlockV,
395 kBitMapPredecessors,
396 kNumBitMapKinds
397};
398
399std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800400
buzbeeb48819d2013-09-14 16:15:25 -0700401// LIR fixup kinds for Arm
402enum FixupKind {
403 kFixupNone,
404 kFixupLabel, // For labels we just adjust the offset.
405 kFixupLoad, // Mostly for imediates.
406 kFixupVLoad, // FP load which *may* be pc-relative.
407 kFixupCBxZ, // Cbz, Cbnz.
408 kFixupPushPop, // Not really pc relative, but changes size based on args.
409 kFixupCondBranch, // Conditional branch
410 kFixupT1Branch, // Thumb1 Unconditional branch
411 kFixupT2Branch, // Thumb2 Unconditional branch
412 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
413 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
414 kFixupAdr, // Adr.
415 kFixupMovImmLST, // kThumb2MovImm16LST.
416 kFixupMovImmHST, // kThumb2MovImm16HST.
417 kFixupAlign4, // Align to 4-byte boundary.
418};
419
420std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
421
buzbeecbd6d442012-11-17 14:11:25 -0800422} // namespace art
423
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700424#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_