blob: d73f148dcf03f932d96591f37e9a674a7009da54 [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,
164 kOpMvn,
165 kOpCmp,
166 kOpLsl,
167 kOpLsr,
168 kOpAsr,
169 kOpRor,
170 kOpNot,
171 kOpAnd,
172 kOpOr,
173 kOpXor,
174 kOpNeg,
175 kOpAdd,
176 kOpAdc,
177 kOpSub,
178 kOpSbc,
179 kOpRsub,
180 kOpMul,
181 kOpDiv,
182 kOpRem,
183 kOpBic,
184 kOpCmn,
185 kOpTst,
Vladimir Markoa8b4caf2013-10-24 15:08:57 +0100186 kOpRev,
187 kOpRevsh,
buzbeecbd6d442012-11-17 14:11:25 -0800188 kOpBkpt,
189 kOpBlx,
190 kOpPush,
191 kOpPop,
192 kOp2Char,
193 kOp2Short,
194 kOp2Byte,
195 kOpCondBr,
196 kOpUncondBr,
197 kOpBx,
198 kOpInvalid,
199};
200
201std::ostream& operator<<(std::ostream& os, const OpKind& kind);
202
203enum ConditionCode {
204 kCondEq, // equal
205 kCondNe, // not equal
206 kCondCs, // carry set (unsigned less than)
207 kCondUlt = kCondCs,
208 kCondCc, // carry clear (unsigned greater than or same)
209 kCondUge = kCondCc,
210 kCondMi, // minus
211 kCondPl, // plus, positive or zero
212 kCondVs, // overflow
213 kCondVc, // no overflow
214 kCondHi, // unsigned greater than
215 kCondLs, // unsigned lower or same
216 kCondGe, // signed greater than or equal
217 kCondLt, // signed less than
218 kCondGt, // signed greater than
219 kCondLe, // signed less than or equal
220 kCondAl, // always
221 kCondNv, // never
222};
223
224std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
225
226// Target specific condition encodings
227enum ArmConditionCode {
228 kArmCondEq = 0x0, // 0000
229 kArmCondNe = 0x1, // 0001
230 kArmCondCs = 0x2, // 0010
231 kArmCondCc = 0x3, // 0011
232 kArmCondMi = 0x4, // 0100
233 kArmCondPl = 0x5, // 0101
234 kArmCondVs = 0x6, // 0110
235 kArmCondVc = 0x7, // 0111
236 kArmCondHi = 0x8, // 1000
237 kArmCondLs = 0x9, // 1001
238 kArmCondGe = 0xa, // 1010
239 kArmCondLt = 0xb, // 1011
240 kArmCondGt = 0xc, // 1100
241 kArmCondLe = 0xd, // 1101
242 kArmCondAl = 0xe, // 1110
243 kArmCondNv = 0xf, // 1111
244};
245
246std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
247
248enum X86ConditionCode {
249 kX86CondO = 0x0, // overflow
250 kX86CondNo = 0x1, // not overflow
251
252 kX86CondB = 0x2, // below
253 kX86CondNae = kX86CondB, // not-above-equal
254 kX86CondC = kX86CondB, // carry
255
256 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700257 kX86CondAe = kX86CondNb, // above-equal
258 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800259
260 kX86CondZ = 0x4, // zero
261 kX86CondEq = kX86CondZ, // equal
262
263 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700264 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800265
266 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700267 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800268
269 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700270 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800271
272 kX86CondS = 0x8, // sign
273 kX86CondNs = 0x9, // not-sign
274
275 kX86CondP = 0xa, // 8-bit parity even
276 kX86CondPE = kX86CondP,
277
278 kX86CondNp = 0xb, // 8-bit parity odd
279 kX86CondPo = kX86CondNp,
280
281 kX86CondL = 0xc, // less-than
282 kX86CondNge = kX86CondL, // not-greater-equal
283
284 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700285 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800286
287 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700288 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800289
290 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700291 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800292};
293
294std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
295
296enum ThrowKind {
297 kThrowNullPointer,
298 kThrowDivZero,
299 kThrowArrayBounds,
buzbee4ef3e452012-12-14 13:35:28 -0800300 kThrowConstantArrayBounds,
buzbeecbd6d442012-11-17 14:11:25 -0800301 kThrowNoSuchMethod,
302 kThrowStackOverflow,
303};
304
305enum SpecialCaseHandler {
306 kNoHandler,
307 kNullMethod,
308 kConstFunction,
309 kIGet,
310 kIGetBoolean,
311 kIGetObject,
312 kIGetByte,
313 kIGetChar,
314 kIGetShort,
315 kIGetWide,
316 kIPut,
317 kIPutBoolean,
318 kIPutObject,
319 kIPutByte,
320 kIPutChar,
321 kIPutShort,
322 kIPutWide,
323 kIdentity,
324};
325
326enum DividePattern {
327 DivideNone,
328 Divide3,
329 Divide5,
330 Divide7,
331};
332
333std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
334
buzbee02031b12012-11-23 09:41:35 -0800335// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800336enum MemBarrierKind {
337 kLoadStore,
338 kLoadLoad,
339 kStoreStore,
340 kStoreLoad
341};
342
343std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
344
buzbee02031b12012-11-23 09:41:35 -0800345enum OpFeatureFlags {
346 kIsBranch = 0,
347 kNoOperand,
348 kIsUnaryOp,
349 kIsBinaryOp,
350 kIsTertiaryOp,
351 kIsQuadOp,
352 kIsQuinOp,
353 kIsSextupleOp,
354 kIsIT,
355 kMemLoad,
356 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700357 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800358 kRegDef0,
359 kRegDef1,
360 kRegDefA,
361 kRegDefD,
362 kRegDefFPCSList0,
363 kRegDefFPCSList2,
364 kRegDefList0,
365 kRegDefList1,
366 kRegDefList2,
367 kRegDefLR,
368 kRegDefSP,
369 kRegUse0,
370 kRegUse1,
371 kRegUse2,
372 kRegUse3,
373 kRegUse4,
374 kRegUseA,
375 kRegUseC,
376 kRegUseD,
Vladimir Marko70b797d2013-12-03 15:25:24 +0000377 kRegUseB,
buzbee02031b12012-11-23 09:41:35 -0800378 kRegUseFPCSList0,
379 kRegUseFPCSList2,
380 kRegUseList0,
381 kRegUseList1,
382 kRegUseLR,
383 kRegUsePC,
384 kRegUseSP,
385 kSetsCCodes,
386 kUsesCCodes
387};
388
buzbeef662a7c2013-02-12 16:19:43 -0800389enum SelectInstructionKind {
390 kSelectNone,
391 kSelectConst,
392 kSelectMove,
393 kSelectGoto
394};
395
buzbeea5abf702013-04-12 14:39:29 -0700396std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
397
398// Type of growable bitmap for memory tuning.
399enum OatBitMapKind {
400 kBitMapMisc = 0,
401 kBitMapUse,
402 kBitMapDef,
403 kBitMapLiveIn,
404 kBitMapBMatrix,
405 kBitMapDominators,
406 kBitMapIDominated,
407 kBitMapDomFrontier,
408 kBitMapPhi,
409 kBitMapTmpBlocks,
410 kBitMapInputBlocks,
411 kBitMapRegisterV,
412 kBitMapTempSSARegisterV,
413 kBitMapNullCheck,
414 kBitMapTmpBlockV,
415 kBitMapPredecessors,
416 kNumBitMapKinds
417};
418
419std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800420
buzbeeb48819d2013-09-14 16:15:25 -0700421// LIR fixup kinds for Arm
422enum FixupKind {
423 kFixupNone,
424 kFixupLabel, // For labels we just adjust the offset.
425 kFixupLoad, // Mostly for imediates.
426 kFixupVLoad, // FP load which *may* be pc-relative.
427 kFixupCBxZ, // Cbz, Cbnz.
428 kFixupPushPop, // Not really pc relative, but changes size based on args.
429 kFixupCondBranch, // Conditional branch
430 kFixupT1Branch, // Thumb1 Unconditional branch
431 kFixupT2Branch, // Thumb2 Unconditional branch
432 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
433 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
434 kFixupAdr, // Adr.
435 kFixupMovImmLST, // kThumb2MovImm16LST.
436 kFixupMovImmHST, // kThumb2MovImm16HST.
437 kFixupAlign4, // Align to 4-byte boundary.
438};
439
440std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
441
buzbeecbd6d442012-11-17 14:11:25 -0800442} // namespace art
443
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700444#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_