blob: 05ca1b565e59d93948cc34074c45118bd7804bf5 [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,
184 kOpBkpt,
185 kOpBlx,
186 kOpPush,
187 kOpPop,
188 kOp2Char,
189 kOp2Short,
190 kOp2Byte,
191 kOpCondBr,
192 kOpUncondBr,
193 kOpBx,
194 kOpInvalid,
195};
196
197std::ostream& operator<<(std::ostream& os, const OpKind& kind);
198
199enum ConditionCode {
200 kCondEq, // equal
201 kCondNe, // not equal
202 kCondCs, // carry set (unsigned less than)
203 kCondUlt = kCondCs,
204 kCondCc, // carry clear (unsigned greater than or same)
205 kCondUge = kCondCc,
206 kCondMi, // minus
207 kCondPl, // plus, positive or zero
208 kCondVs, // overflow
209 kCondVc, // no overflow
210 kCondHi, // unsigned greater than
211 kCondLs, // unsigned lower or same
212 kCondGe, // signed greater than or equal
213 kCondLt, // signed less than
214 kCondGt, // signed greater than
215 kCondLe, // signed less than or equal
216 kCondAl, // always
217 kCondNv, // never
218};
219
220std::ostream& operator<<(std::ostream& os, const ConditionCode& kind);
221
222// Target specific condition encodings
223enum ArmConditionCode {
224 kArmCondEq = 0x0, // 0000
225 kArmCondNe = 0x1, // 0001
226 kArmCondCs = 0x2, // 0010
227 kArmCondCc = 0x3, // 0011
228 kArmCondMi = 0x4, // 0100
229 kArmCondPl = 0x5, // 0101
230 kArmCondVs = 0x6, // 0110
231 kArmCondVc = 0x7, // 0111
232 kArmCondHi = 0x8, // 1000
233 kArmCondLs = 0x9, // 1001
234 kArmCondGe = 0xa, // 1010
235 kArmCondLt = 0xb, // 1011
236 kArmCondGt = 0xc, // 1100
237 kArmCondLe = 0xd, // 1101
238 kArmCondAl = 0xe, // 1110
239 kArmCondNv = 0xf, // 1111
240};
241
242std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind);
243
244enum X86ConditionCode {
245 kX86CondO = 0x0, // overflow
246 kX86CondNo = 0x1, // not overflow
247
248 kX86CondB = 0x2, // below
249 kX86CondNae = kX86CondB, // not-above-equal
250 kX86CondC = kX86CondB, // carry
251
252 kX86CondNb = 0x3, // not-below
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700253 kX86CondAe = kX86CondNb, // above-equal
254 kX86CondNc = kX86CondNb, // not-carry
buzbeecbd6d442012-11-17 14:11:25 -0800255
256 kX86CondZ = 0x4, // zero
257 kX86CondEq = kX86CondZ, // equal
258
259 kX86CondNz = 0x5, // not-zero
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700260 kX86CondNe = kX86CondNz, // not-equal
buzbeecbd6d442012-11-17 14:11:25 -0800261
262 kX86CondBe = 0x6, // below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700263 kX86CondNa = kX86CondBe, // not-above
buzbeecbd6d442012-11-17 14:11:25 -0800264
265 kX86CondNbe = 0x7, // not-below-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700266 kX86CondA = kX86CondNbe, // above
buzbeecbd6d442012-11-17 14:11:25 -0800267
268 kX86CondS = 0x8, // sign
269 kX86CondNs = 0x9, // not-sign
270
271 kX86CondP = 0xa, // 8-bit parity even
272 kX86CondPE = kX86CondP,
273
274 kX86CondNp = 0xb, // 8-bit parity odd
275 kX86CondPo = kX86CondNp,
276
277 kX86CondL = 0xc, // less-than
278 kX86CondNge = kX86CondL, // not-greater-equal
279
280 kX86CondNl = 0xd, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700281 kX86CondGe = kX86CondNl, // not-greater-equal
buzbeecbd6d442012-11-17 14:11:25 -0800282
283 kX86CondLe = 0xe, // less-than-equal
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700284 kX86CondNg = kX86CondLe, // not-greater
buzbeecbd6d442012-11-17 14:11:25 -0800285
286 kX86CondNle = 0xf, // not-less-than
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700287 kX86CondG = kX86CondNle, // greater
buzbeecbd6d442012-11-17 14:11:25 -0800288};
289
290std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind);
291
292enum ThrowKind {
293 kThrowNullPointer,
294 kThrowDivZero,
295 kThrowArrayBounds,
buzbee4ef3e452012-12-14 13:35:28 -0800296 kThrowConstantArrayBounds,
buzbeecbd6d442012-11-17 14:11:25 -0800297 kThrowNoSuchMethod,
298 kThrowStackOverflow,
299};
300
301enum SpecialCaseHandler {
302 kNoHandler,
303 kNullMethod,
304 kConstFunction,
305 kIGet,
306 kIGetBoolean,
307 kIGetObject,
308 kIGetByte,
309 kIGetChar,
310 kIGetShort,
311 kIGetWide,
312 kIPut,
313 kIPutBoolean,
314 kIPutObject,
315 kIPutByte,
316 kIPutChar,
317 kIPutShort,
318 kIPutWide,
319 kIdentity,
320};
321
322enum DividePattern {
323 DivideNone,
324 Divide3,
325 Divide5,
326 Divide7,
327};
328
329std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
330
buzbee02031b12012-11-23 09:41:35 -0800331// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800332enum MemBarrierKind {
333 kLoadStore,
334 kLoadLoad,
335 kStoreStore,
336 kStoreLoad
337};
338
339std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
340
buzbee02031b12012-11-23 09:41:35 -0800341enum OpFeatureFlags {
342 kIsBranch = 0,
343 kNoOperand,
344 kIsUnaryOp,
345 kIsBinaryOp,
346 kIsTertiaryOp,
347 kIsQuadOp,
348 kIsQuinOp,
349 kIsSextupleOp,
350 kIsIT,
351 kMemLoad,
352 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700353 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800354 kRegDef0,
355 kRegDef1,
356 kRegDefA,
357 kRegDefD,
358 kRegDefFPCSList0,
359 kRegDefFPCSList2,
360 kRegDefList0,
361 kRegDefList1,
362 kRegDefList2,
363 kRegDefLR,
364 kRegDefSP,
365 kRegUse0,
366 kRegUse1,
367 kRegUse2,
368 kRegUse3,
369 kRegUse4,
370 kRegUseA,
371 kRegUseC,
372 kRegUseD,
373 kRegUseFPCSList0,
374 kRegUseFPCSList2,
375 kRegUseList0,
376 kRegUseList1,
377 kRegUseLR,
378 kRegUsePC,
379 kRegUseSP,
380 kSetsCCodes,
381 kUsesCCodes
382};
383
buzbeef662a7c2013-02-12 16:19:43 -0800384enum SelectInstructionKind {
385 kSelectNone,
386 kSelectConst,
387 kSelectMove,
388 kSelectGoto
389};
390
buzbeea5abf702013-04-12 14:39:29 -0700391std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
392
393// Type of growable bitmap for memory tuning.
394enum OatBitMapKind {
395 kBitMapMisc = 0,
396 kBitMapUse,
397 kBitMapDef,
398 kBitMapLiveIn,
399 kBitMapBMatrix,
400 kBitMapDominators,
401 kBitMapIDominated,
402 kBitMapDomFrontier,
403 kBitMapPhi,
404 kBitMapTmpBlocks,
405 kBitMapInputBlocks,
406 kBitMapRegisterV,
407 kBitMapTempSSARegisterV,
408 kBitMapNullCheck,
409 kBitMapTmpBlockV,
410 kBitMapPredecessors,
411 kNumBitMapKinds
412};
413
414std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800415
buzbeeb48819d2013-09-14 16:15:25 -0700416// LIR fixup kinds for Arm
417enum FixupKind {
418 kFixupNone,
419 kFixupLabel, // For labels we just adjust the offset.
420 kFixupLoad, // Mostly for imediates.
421 kFixupVLoad, // FP load which *may* be pc-relative.
422 kFixupCBxZ, // Cbz, Cbnz.
423 kFixupPushPop, // Not really pc relative, but changes size based on args.
424 kFixupCondBranch, // Conditional branch
425 kFixupT1Branch, // Thumb1 Unconditional branch
426 kFixupT2Branch, // Thumb2 Unconditional branch
427 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
428 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
429 kFixupAdr, // Adr.
430 kFixupMovImmLST, // kThumb2MovImm16LST.
431 kFixupMovImmHST, // kThumb2MovImm16HST.
432 kFixupAlign4, // Align to 4-byte boundary.
433};
434
435std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
436
buzbeecbd6d442012-11-17 14:11:25 -0800437} // namespace art
438
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700439#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_