blob: 35d04ae137f430e08b90a43deea001f05fbec75d [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
buzbeecbd6d442012-11-17 14:11:25 -0800305enum DividePattern {
306 DivideNone,
307 Divide3,
308 Divide5,
309 Divide7,
310};
311
312std::ostream& operator<<(std::ostream& os, const DividePattern& pattern);
313
buzbee02031b12012-11-23 09:41:35 -0800314// Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers").
buzbee1bc37c62012-11-20 13:35:41 -0800315enum MemBarrierKind {
316 kLoadStore,
317 kLoadLoad,
318 kStoreStore,
319 kStoreLoad
320};
321
322std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind);
323
buzbee02031b12012-11-23 09:41:35 -0800324enum OpFeatureFlags {
325 kIsBranch = 0,
326 kNoOperand,
327 kIsUnaryOp,
328 kIsBinaryOp,
329 kIsTertiaryOp,
330 kIsQuadOp,
331 kIsQuinOp,
332 kIsSextupleOp,
333 kIsIT,
334 kMemLoad,
335 kMemStore,
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700336 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes.
buzbee02031b12012-11-23 09:41:35 -0800337 kRegDef0,
338 kRegDef1,
339 kRegDefA,
340 kRegDefD,
341 kRegDefFPCSList0,
342 kRegDefFPCSList2,
343 kRegDefList0,
344 kRegDefList1,
345 kRegDefList2,
346 kRegDefLR,
347 kRegDefSP,
348 kRegUse0,
349 kRegUse1,
350 kRegUse2,
351 kRegUse3,
352 kRegUse4,
353 kRegUseA,
354 kRegUseC,
355 kRegUseD,
Vladimir Marko70b797d2013-12-03 15:25:24 +0000356 kRegUseB,
buzbee02031b12012-11-23 09:41:35 -0800357 kRegUseFPCSList0,
358 kRegUseFPCSList2,
359 kRegUseList0,
360 kRegUseList1,
361 kRegUseLR,
362 kRegUsePC,
363 kRegUseSP,
364 kSetsCCodes,
365 kUsesCCodes
366};
367
buzbeef662a7c2013-02-12 16:19:43 -0800368enum SelectInstructionKind {
369 kSelectNone,
370 kSelectConst,
371 kSelectMove,
372 kSelectGoto
373};
374
buzbeea5abf702013-04-12 14:39:29 -0700375std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind);
376
377// Type of growable bitmap for memory tuning.
378enum OatBitMapKind {
379 kBitMapMisc = 0,
380 kBitMapUse,
381 kBitMapDef,
382 kBitMapLiveIn,
383 kBitMapBMatrix,
384 kBitMapDominators,
385 kBitMapIDominated,
386 kBitMapDomFrontier,
387 kBitMapPhi,
388 kBitMapTmpBlocks,
389 kBitMapInputBlocks,
390 kBitMapRegisterV,
391 kBitMapTempSSARegisterV,
392 kBitMapNullCheck,
393 kBitMapTmpBlockV,
394 kBitMapPredecessors,
395 kNumBitMapKinds
396};
397
398std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind);
buzbee02031b12012-11-23 09:41:35 -0800399
buzbeeb48819d2013-09-14 16:15:25 -0700400// LIR fixup kinds for Arm
401enum FixupKind {
402 kFixupNone,
403 kFixupLabel, // For labels we just adjust the offset.
404 kFixupLoad, // Mostly for imediates.
405 kFixupVLoad, // FP load which *may* be pc-relative.
406 kFixupCBxZ, // Cbz, Cbnz.
407 kFixupPushPop, // Not really pc relative, but changes size based on args.
408 kFixupCondBranch, // Conditional branch
409 kFixupT1Branch, // Thumb1 Unconditional branch
410 kFixupT2Branch, // Thumb2 Unconditional branch
411 kFixupBlx1, // Blx1 (start of Blx1/Blx2 pair).
412 kFixupBl1, // Bl1 (start of Bl1/Bl2 pair).
413 kFixupAdr, // Adr.
414 kFixupMovImmLST, // kThumb2MovImm16LST.
415 kFixupMovImmHST, // kThumb2MovImm16HST.
416 kFixupAlign4, // Align to 4-byte boundary.
417};
418
419std::ostream& operator<<(std::ostream& os, const FixupKind& kind);
420
buzbeecbd6d442012-11-17 14:11:25 -0800421} // namespace art
422
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700423#endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_