blob: 6ea21fc586542894303f0d124df5776e7ee6e46f [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,
47 kCount
48};
49
50enum RegLocationType {
Brian Carlstrom7934ac22013-07-26 10:54:15 -070051 kLocDalvikFrame = 0, // Normal Dalvik register
buzbeecbd6d442012-11-17 14:11:25 -080052 kLocPhysReg,
53 kLocCompilerTemp,
54 kLocInvalid
55};
56
57enum BBType {
buzbee0d829482013-10-11 15:24:55 -070058 kNullBlock,
buzbeecbd6d442012-11-17 14:11:25 -080059 kEntryBlock,
60 kDalvikByteCode,
61 kExitBlock,
62 kExceptionHandling,
63 kDead,
64};
65
66/*
buzbeefa57c472012-11-21 12:06:18 -080067 * Def/Use encoding in 64-bit use_mask/def_mask. Low positions used for target-specific
buzbeecbd6d442012-11-17 14:11:25 -080068 * registers (and typically use the register number as the position). High positions
69 * reserved for common and abstract resources.
70 */
71
72enum ResourceEncodingPos {
73 kMustNotAlias = 63,
buzbee02031b12012-11-23 09:41:35 -080074 kHeapRef = 62, // Default memory reference type.
75 kLiteral = 61, // Literal pool memory reference.
76 kDalvikReg = 60, // Dalvik v_reg memory reference.
buzbeecbd6d442012-11-17 14:11:25 -080077 kFPStatus = 59,
78 kCCode = 58,
79 kLowestCommonResource = kCCode
80};
81
buzbee02031b12012-11-23 09:41:35 -080082// Shared pseudo opcodes - must be < 0.
buzbeecbd6d442012-11-17 14:11:25 -080083enum LIRPseudoOpcode {
buzbeea169e1d2012-12-05 14:26:44 -080084 kPseudoExportedPC = -16,
85 kPseudoSafepointPC = -15,
86 kPseudoIntrinsicRetry = -14,
87 kPseudoSuspendTarget = -13,
88 kPseudoThrowTarget = -12,
89 kPseudoCaseLabel = -11,
90 kPseudoMethodEntry = -10,
91 kPseudoMethodExit = -9,
92 kPseudoBarrier = -8,
buzbeecbd6d442012-11-17 14:11:25 -080093 kPseudoEntryBlock = -7,
94 kPseudoExitBlock = -6,
95 kPseudoTargetLabel = -5,
96 kPseudoDalvikByteCodeBoundary = -4,
97 kPseudoPseudoAlign4 = -3,
98 kPseudoEHBlockLabel = -2,
99 kPseudoNormalBlockLabel = -1,
100};
101
102enum ExtendedMIROpcode {
103 kMirOpFirst = kNumPackedOpcodes,
104 kMirOpPhi = kMirOpFirst,
105 kMirOpCopy,
106 kMirOpFusedCmplFloat,
107 kMirOpFusedCmpgFloat,
108 kMirOpFusedCmplDouble,
109 kMirOpFusedCmpgDouble,
110 kMirOpFusedCmpLong,
111 kMirOpNop,
112 kMirOpNullCheck,
113 kMirOpRangeCheck,
114 kMirOpDivZeroCheck,
115 kMirOpCheck,
buzbeea169e1d2012-12-05 14:26:44 -0800116 kMirOpCheckPart2,
buzbeef662a7c2013-02-12 16:19:43 -0800117 kMirOpSelect,
buzbeecbd6d442012-11-17 14:11:25 -0800118 kMirOpLast,
119};
120
121enum MIROptimizationFlagPositons {
122 kMIRIgnoreNullCheck = 0,
123 kMIRNullCheckOnly,
124 kMIRIgnoreRangeCheck,
125 kMIRRangeCheckOnly,
buzbee02031b12012-11-23 09:41:35 -0800126 kMIRInlined, // Invoke is inlined (ie dead).
127 kMIRInlinedPred, // Invoke is inlined via prediction.
128 kMIRCallee, // Instruction is inlined from callee.
buzbeecbd6d442012-11-17 14:11:25 -0800129 kMIRIgnoreSuspendCheck,
130 kMIRDup,
buzbee02031b12012-11-23 09:41:35 -0800131 kMIRMark, // Temporary node mark.
buzbeecbd6d442012-11-17 14:11:25 -0800132};
133
buzbee02031b12012-11-23 09:41:35 -0800134// For successor_block_list.
buzbeecbd6d442012-11-17 14:11:25 -0800135enum BlockListType {
136 kNotUsed = 0,
137 kCatch,
138 kPackedSwitch,
139 kSparseSwitch,
140};
141
142enum AssemblerStatus {
143 kSuccess,
144 kRetryAll,
145};
146
147enum OpSize {
148 kWord,
149 kLong,
150 kSingle,
151 kDouble,
152 kUnsignedHalf,
153 kSignedHalf,
154 kUnsignedByte,
155 kSignedByte,
156};
157
158std::ostream& operator<<(std::ostream& os, const OpSize& kind);
159
160enum OpKind {
161 kOpMov,
162 kOpMvn,
163 kOpCmp,
164 kOpLsl,
165 kOpLsr,
166 kOpAsr,
167 kOpRor,
168 kOpNot,
169 kOpAnd,
170 kOpOr,
171 kOpXor,
172 kOpNeg,
173 kOpAdd,
174 kOpAdc,
175 kOpSub,
176 kOpSbc,
177 kOpRsub,
178 kOpMul,
179 kOpDiv,
180 kOpRem,
181 kOpBic,
182 kOpCmn,
183 kOpTst,
Vladimir Markoa8b4caf2013-10-24 15:08:57 +0100184 kOpRev,
185 kOpRevsh,
buzbeecbd6d442012-11-17 14:11:25 -0800186 kOpBkpt,
187 kOpBlx,
188 kOpPush,
189 kOpPop,
190 kOp2Char,
191 kOp2Short,
192 kOp2Byte,
193 kOpCondBr,
194 kOpUncondBr,
195 kOpBx,
196 kOpInvalid,
197};
198
199std::ostream& operator<<(std::ostream& os, const OpKind& kind);
200
201enum ConditionCode {
202 kCondEq, // equal
203 kCondNe, // not equal
204 kCondCs, // carry set (unsigned less than)
205 kCondUlt = kCondCs,
206 kCondCc, // carry clear (unsigned greater than or same)
207 kCondUge = kCondCc,
208 kCondMi, // minus
209 kCondPl, // plus, positive or zero
210 kCondVs, // overflow
211 kCondVc, // no overflow
212 kCondHi, // unsigned greater than
213 kCondLs, // unsigned lower or same
214 kCondGe, // signed greater than or equal
215 kCondLt, // signed less than
216 kCondGt, // signed greater than
217 kCondLe, // signed less than or equal
218 kCondAl, // always
219 kCondNv, // never
220};
221
222std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
223
224// Target specific condition encodings
225enum ArmConditionCode {
226 kArmCondEq = 0x0, // 0000
227 kArmCondNe = 0x1, // 0001
228 kArmCondCs = 0x2, // 0010
229 kArmCondCc = 0x3, // 0011
230 kArmCondMi = 0x4, // 0100
231 kArmCondPl = 0x5, // 0101
232 kArmCondVs = 0x6, // 0110
233 kArmCondVc = 0x7, // 0111
234 kArmCondHi = 0x8, // 1000
235 kArmCondLs = 0x9, // 1001
236 kArmCondGe = 0xa, // 1010
237 kArmCondLt = 0xb, // 1011
238 kArmCondGt = 0xc, // 1100
239 kArmCondLe = 0xd, // 1101
240 kArmCondAl = 0xe, // 1110
241 kArmCondNv = 0xf, // 1111
242};
243
244std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
245
246enum X86ConditionCode {
247 kX86CondO = 0x0, // overflow
248 kX86CondNo = 0x1, // not overflow
249
250 kX86CondB = 0x2, // below
251 kX86CondNae = kX86CondB, // not-above-equal
252 kX86CondC = kX86CondB, // carry
253
254 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700255 kX86CondAe = kX86CondNb, // above-equal
256 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800257
258 kX86CondZ = 0x4, // zero
259 kX86CondEq = kX86CondZ, // equal
260
261 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700262 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800263
264 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700265 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800266
267 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700268 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800269
270 kX86CondS = 0x8, // sign
271 kX86CondNs = 0x9, // not-sign
272
273 kX86CondP = 0xa, // 8-bit parity even
274 kX86CondPE = kX86CondP,
275
276 kX86CondNp = 0xb, // 8-bit parity odd
277 kX86CondPo = kX86CondNp,
278
279 kX86CondL = 0xc, // less-than
280 kX86CondNge = kX86CondL, // not-greater-equal
281
282 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700283 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800284
285 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700286 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800287
288 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700289 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800290};
291
292std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
293
294enum ThrowKind {
295 kThrowNullPointer,
296 kThrowDivZero,
297 kThrowArrayBounds,
buzbee4ef3e452012-12-14 13:35:28 -0800298 kThrowConstantArrayBounds,
buzbeecbd6d442012-11-17 14:11:25 -0800299 kThrowNoSuchMethod,
300 kThrowStackOverflow,
301};
302
303enum SpecialCaseHandler {
304 kNoHandler,
305 kNullMethod,
306 kConstFunction,
307 kIGet,
308 kIGetBoolean,
309 kIGetObject,
310 kIGetByte,
311 kIGetChar,
312 kIGetShort,
313 kIGetWide,
314 kIPut,
315 kIPutBoolean,
316 kIPutObject,
317 kIPutByte,
318 kIPutChar,
319 kIPutShort,
320 kIPutWide,
321 kIdentity,
322};
323
324enum DividePattern {
325 DivideNone,
326 Divide3,
327 Divide5,
328 Divide7,
329};
330
331std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
332
buzbee02031b12012-11-23 09:41:35 -0800333// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800334enum MemBarrierKind {
335 kLoadStore,
336 kLoadLoad,
337 kStoreStore,
338 kStoreLoad
339};
340
341std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
342
buzbee02031b12012-11-23 09:41:35 -0800343enum OpFeatureFlags {
344 kIsBranch = 0,
345 kNoOperand,
346 kIsUnaryOp,
347 kIsBinaryOp,
348 kIsTertiaryOp,
349 kIsQuadOp,
350 kIsQuinOp,
351 kIsSextupleOp,
352 kIsIT,
353 kMemLoad,
354 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700355 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800356 kRegDef0,
357 kRegDef1,
358 kRegDefA,
359 kRegDefD,
360 kRegDefFPCSList0,
361 kRegDefFPCSList2,
362 kRegDefList0,
363 kRegDefList1,
364 kRegDefList2,
365 kRegDefLR,
366 kRegDefSP,
367 kRegUse0,
368 kRegUse1,
369 kRegUse2,
370 kRegUse3,
371 kRegUse4,
372 kRegUseA,
373 kRegUseC,
374 kRegUseD,
375 kRegUseFPCSList0,
376 kRegUseFPCSList2,
377 kRegUseList0,
378 kRegUseList1,
379 kRegUseLR,
380 kRegUsePC,
381 kRegUseSP,
382 kSetsCCodes,
383 kUsesCCodes
384};
385
buzbeef662a7c2013-02-12 16:19:43 -0800386enum SelectInstructionKind {
387 kSelectNone,
388 kSelectConst,
389 kSelectMove,
390 kSelectGoto
391};
392
buzbeea5abf702013-04-12 14:39:29 -0700393std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
394
395// Type of growable bitmap for memory tuning.
396enum OatBitMapKind {
397 kBitMapMisc = 0,
398 kBitMapUse,
399 kBitMapDef,
400 kBitMapLiveIn,
401 kBitMapBMatrix,
402 kBitMapDominators,
403 kBitMapIDominated,
404 kBitMapDomFrontier,
405 kBitMapPhi,
406 kBitMapTmpBlocks,
407 kBitMapInputBlocks,
408 kBitMapRegisterV,
409 kBitMapTempSSARegisterV,
410 kBitMapNullCheck,
411 kBitMapTmpBlockV,
412 kBitMapPredecessors,
413 kNumBitMapKinds
414};
415
416std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800417
buzbeeb48819d2013-09-14 16:15:25 -0700418// LIR fixup kinds for Arm
419enum FixupKind {
420 kFixupNone,
421 kFixupLabel, // For labels we just adjust the offset.
422 kFixupLoad, // Mostly for imediates.
423 kFixupVLoad, // FP load which *may* be pc-relative.
424 kFixupCBxZ, // Cbz, Cbnz.
425 kFixupPushPop, // Not really pc relative, but changes size based on args.
426 kFixupCondBranch, // Conditional branch
427 kFixupT1Branch, // Thumb1 Unconditional branch
428 kFixupT2Branch, // Thumb2 Unconditional branch
429 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
430 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
431 kFixupAdr, // Adr.
432 kFixupMovImmLST, // kThumb2MovImm16LST.
433 kFixupMovImmHST, // kThumb2MovImm16HST.
434 kFixupAlign4, // Align to 4-byte boundary.
435};
436
437std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
438
buzbeecbd6d442012-11-17 14:11:25 -0800439} // namespace art
440
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700441#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_