/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_COMPILER_DEX_COMPILER_ENUMS_H_ #define ART_COMPILER_DEX_COMPILER_ENUMS_H_ #include "dex_instruction.h" namespace art { enum RegisterClass { kCoreReg, kFPReg, kAnyReg, }; enum SpecialTargetRegister { kSelf, // Thread pointer. kSuspend, // Used to reduce suspend checks for some targets. kLr, kPc, kSp, kArg0, kArg1, kArg2, kArg3, kFArg0, kFArg1, kFArg2, kFArg3, kRet0, kRet1, kInvokeTgt, kCount }; enum RegLocationType { kLocDalvikFrame = 0, // Normal Dalvik register kLocPhysReg, kLocCompilerTemp, kLocInvalid }; enum BBType { kEntryBlock, kDalvikByteCode, kExitBlock, kExceptionHandling, kDead, }; /* * Def/Use encoding in 64-bit use_mask/def_mask. Low positions used for target-specific * registers (and typically use the register number as the position). High positions * reserved for common and abstract resources. */ enum ResourceEncodingPos { kMustNotAlias = 63, kHeapRef = 62, // Default memory reference type. kLiteral = 61, // Literal pool memory reference. kDalvikReg = 60, // Dalvik v_reg memory reference. kFPStatus = 59, kCCode = 58, kLowestCommonResource = kCCode }; // Shared pseudo opcodes - must be < 0. enum LIRPseudoOpcode { kPseudoExportedPC = -16, kPseudoSafepointPC = -15, kPseudoIntrinsicRetry = -14, kPseudoSuspendTarget = -13, kPseudoThrowTarget = -12, kPseudoCaseLabel = -11, kPseudoMethodEntry = -10, kPseudoMethodExit = -9, kPseudoBarrier = -8, kPseudoEntryBlock = -7, kPseudoExitBlock = -6, kPseudoTargetLabel = -5, kPseudoDalvikByteCodeBoundary = -4, kPseudoPseudoAlign4 = -3, kPseudoEHBlockLabel = -2, kPseudoNormalBlockLabel = -1, }; enum ExtendedMIROpcode { kMirOpFirst = kNumPackedOpcodes, kMirOpPhi = kMirOpFirst, kMirOpCopy, kMirOpFusedCmplFloat, kMirOpFusedCmpgFloat, kMirOpFusedCmplDouble, kMirOpFusedCmpgDouble, kMirOpFusedCmpLong, kMirOpNop, kMirOpNullCheck, kMirOpRangeCheck, kMirOpDivZeroCheck, kMirOpCheck, kMirOpCheckPart2, kMirOpSelect, kMirOpLast, }; enum MIROptimizationFlagPositons { kMIRIgnoreNullCheck = 0, kMIRNullCheckOnly, kMIRIgnoreRangeCheck, kMIRRangeCheckOnly, kMIRInlined, // Invoke is inlined (ie dead). kMIRInlinedPred, // Invoke is inlined via prediction. kMIRCallee, // Instruction is inlined from callee. kMIRIgnoreSuspendCheck, kMIRDup, kMIRMark, // Temporary node mark. }; // For successor_block_list. enum BlockListType { kNotUsed = 0, kCatch, kPackedSwitch, kSparseSwitch, }; enum AssemblerStatus { kSuccess, kRetryAll, }; enum OpSize { kWord, kLong, kSingle, kDouble, kUnsignedHalf, kSignedHalf, kUnsignedByte, kSignedByte, }; std::ostream& operator<<(std::ostream& os, const OpSize& kind); enum OpKind { kOpMov, kOpMvn, kOpCmp, kOpLsl, kOpLsr, kOpAsr, kOpRor, kOpNot, kOpAnd, kOpOr, kOpXor, kOpNeg, kOpAdd, kOpAdc, kOpSub, kOpSbc, kOpRsub, kOpMul, kOpDiv, kOpRem, kOpBic, kOpCmn, kOpTst, kOpBkpt, kOpBlx, kOpPush, kOpPop, kOp2Char, kOp2Short, kOp2Byte, kOpCondBr, kOpUncondBr, kOpBx, kOpInvalid, }; std::ostream& operator<<(std::ostream& os, const OpKind& kind); enum ConditionCode { kCondEq, // equal kCondNe, // not equal kCondCs, // carry set (unsigned less than) kCondUlt = kCondCs, kCondCc, // carry clear (unsigned greater than or same) kCondUge = kCondCc, kCondMi, // minus kCondPl, // plus, positive or zero kCondVs, // overflow kCondVc, // no overflow kCondHi, // unsigned greater than kCondLs, // unsigned lower or same kCondGe, // signed greater than or equal kCondLt, // signed less than kCondGt, // signed greater than kCondLe, // signed less than or equal kCondAl, // always kCondNv, // never }; std::ostream& operator<<(std::ostream& os, const ConditionCode& kind); // Target specific condition encodings enum ArmConditionCode { kArmCondEq = 0x0, // 0000 kArmCondNe = 0x1, // 0001 kArmCondCs = 0x2, // 0010 kArmCondCc = 0x3, // 0011 kArmCondMi = 0x4, // 0100 kArmCondPl = 0x5, // 0101 kArmCondVs = 0x6, // 0110 kArmCondVc = 0x7, // 0111 kArmCondHi = 0x8, // 1000 kArmCondLs = 0x9, // 1001 kArmCondGe = 0xa, // 1010 kArmCondLt = 0xb, // 1011 kArmCondGt = 0xc, // 1100 kArmCondLe = 0xd, // 1101 kArmCondAl = 0xe, // 1110 kArmCondNv = 0xf, // 1111 }; std::ostream& operator<<(std::ostream& os, const ArmConditionCode& kind); enum X86ConditionCode { kX86CondO = 0x0, // overflow kX86CondNo = 0x1, // not overflow kX86CondB = 0x2, // below kX86CondNae = kX86CondB, // not-above-equal kX86CondC = kX86CondB, // carry kX86CondNb = 0x3, // not-below kX86CondAe = kX86CondNb, // above-equal kX86CondNc = kX86CondNb, // not-carry kX86CondZ = 0x4, // zero kX86CondEq = kX86CondZ, // equal kX86CondNz = 0x5, // not-zero kX86CondNe = kX86CondNz, // not-equal kX86CondBe = 0x6, // below-equal kX86CondNa = kX86CondBe, // not-above kX86CondNbe = 0x7, // not-below-equal kX86CondA = kX86CondNbe, // above kX86CondS = 0x8, // sign kX86CondNs = 0x9, // not-sign kX86CondP = 0xa, // 8-bit parity even kX86CondPE = kX86CondP, kX86CondNp = 0xb, // 8-bit parity odd kX86CondPo = kX86CondNp, kX86CondL = 0xc, // less-than kX86CondNge = kX86CondL, // not-greater-equal kX86CondNl = 0xd, // not-less-than kX86CondGe = kX86CondNl, // not-greater-equal kX86CondLe = 0xe, // less-than-equal kX86CondNg = kX86CondLe, // not-greater kX86CondNle = 0xf, // not-less-than kX86CondG = kX86CondNle, // greater }; std::ostream& operator<<(std::ostream& os, const X86ConditionCode& kind); enum ThrowKind { kThrowNullPointer, kThrowDivZero, kThrowArrayBounds, kThrowConstantArrayBounds, kThrowNoSuchMethod, kThrowStackOverflow, }; enum SpecialCaseHandler { kNoHandler, kNullMethod, kConstFunction, kIGet, kIGetBoolean, kIGetObject, kIGetByte, kIGetChar, kIGetShort, kIGetWide, kIPut, kIPutBoolean, kIPutObject, kIPutByte, kIPutChar, kIPutShort, kIPutWide, kIdentity, }; enum DividePattern { DivideNone, Divide3, Divide5, Divide7, }; std::ostream& operator<<(std::ostream& os, const DividePattern& pattern); // Memory barrier types (see "The JSR-133 Cookbook for Compiler Writers"). enum MemBarrierKind { kLoadStore, kLoadLoad, kStoreStore, kStoreLoad }; std::ostream& operator<<(std::ostream& os, const MemBarrierKind& kind); enum OpFeatureFlags { kIsBranch = 0, kNoOperand, kIsUnaryOp, kIsBinaryOp, kIsTertiaryOp, kIsQuadOp, kIsQuinOp, kIsSextupleOp, kIsIT, kMemLoad, kMemStore, kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes. kRegDef0, kRegDef1, kRegDefA, kRegDefD, kRegDefFPCSList0, kRegDefFPCSList2, kRegDefList0, kRegDefList1, kRegDefList2, kRegDefLR, kRegDefSP, kRegUse0, kRegUse1, kRegUse2, kRegUse3, kRegUse4, kRegUseA, kRegUseC, kRegUseD, kRegUseFPCSList0, kRegUseFPCSList2, kRegUseList0, kRegUseList1, kRegUseLR, kRegUsePC, kRegUseSP, kSetsCCodes, kUsesCCodes }; enum SelectInstructionKind { kSelectNone, kSelectConst, kSelectMove, kSelectGoto }; std::ostream& operator<<(std::ostream& os, const SelectInstructionKind& kind); // Type of growable bitmap for memory tuning. enum OatBitMapKind { kBitMapMisc = 0, kBitMapUse, kBitMapDef, kBitMapLiveIn, kBitMapBMatrix, kBitMapDominators, kBitMapIDominated, kBitMapDomFrontier, kBitMapPhi, kBitMapTmpBlocks, kBitMapInputBlocks, kBitMapRegisterV, kBitMapTempSSARegisterV, kBitMapNullCheck, kBitMapTmpBlockV, kBitMapPredecessors, kNumBitMapKinds }; std::ostream& operator<<(std::ostream& os, const OatBitMapKind& kind); } // namespace art #endif // ART_COMPILER_DEX_COMPILER_ENUMS_H_