1*9a0e4156SSadaf Ebrahimi //===-- llvm/MC/MCInstrDesc.h - Instruction Descriptors -*- C++ -*-===// 2*9a0e4156SSadaf Ebrahimi // 3*9a0e4156SSadaf Ebrahimi // The LLVM Compiler Infrastructure 4*9a0e4156SSadaf Ebrahimi // 5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source 6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details. 7*9a0e4156SSadaf Ebrahimi // 8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 9*9a0e4156SSadaf Ebrahimi // 10*9a0e4156SSadaf Ebrahimi // This file defines the MCOperandInfo and MCInstrDesc classes, which 11*9a0e4156SSadaf Ebrahimi // are used to describe target instructions and their operands. 12*9a0e4156SSadaf Ebrahimi // 13*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 14*9a0e4156SSadaf Ebrahimi 15*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */ 16*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */ 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimi #ifndef CS_LLVM_MC_MCINSTRDESC_H 19*9a0e4156SSadaf Ebrahimi #define CS_LLVM_MC_MCINSTRDESC_H 20*9a0e4156SSadaf Ebrahimi 21*9a0e4156SSadaf Ebrahimi #include "capstone/platform.h" 22*9a0e4156SSadaf Ebrahimi 23*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 24*9a0e4156SSadaf Ebrahimi // Machine Operand Flags and Description 25*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 26*9a0e4156SSadaf Ebrahimi 27*9a0e4156SSadaf Ebrahimi // Operand constraints 28*9a0e4156SSadaf Ebrahimi enum MCOI_OperandConstraint { 29*9a0e4156SSadaf Ebrahimi MCOI_TIED_TO = 0, // Must be allocated the same register as. 30*9a0e4156SSadaf Ebrahimi MCOI_EARLY_CLOBBER // Operand is an early clobber register operand 31*9a0e4156SSadaf Ebrahimi }; 32*9a0e4156SSadaf Ebrahimi 33*9a0e4156SSadaf Ebrahimi /// OperandFlags - These are flags set on operands, but should be considered 34*9a0e4156SSadaf Ebrahimi /// private, all access should go through the MCOperandInfo accessors. 35*9a0e4156SSadaf Ebrahimi /// See the accessors for a description of what these are. 36*9a0e4156SSadaf Ebrahimi enum MCOI_OperandFlags { 37*9a0e4156SSadaf Ebrahimi MCOI_LookupPtrRegClass = 0, 38*9a0e4156SSadaf Ebrahimi MCOI_Predicate, 39*9a0e4156SSadaf Ebrahimi MCOI_OptionalDef 40*9a0e4156SSadaf Ebrahimi }; 41*9a0e4156SSadaf Ebrahimi 42*9a0e4156SSadaf Ebrahimi /// Operand Type - Operands are tagged with one of the values of this enum. 43*9a0e4156SSadaf Ebrahimi enum MCOI_OperandType { 44*9a0e4156SSadaf Ebrahimi MCOI_OPERAND_UNKNOWN, 45*9a0e4156SSadaf Ebrahimi MCOI_OPERAND_IMMEDIATE, 46*9a0e4156SSadaf Ebrahimi MCOI_OPERAND_REGISTER, 47*9a0e4156SSadaf Ebrahimi MCOI_OPERAND_MEMORY, 48*9a0e4156SSadaf Ebrahimi MCOI_OPERAND_PCREL 49*9a0e4156SSadaf Ebrahimi }; 50*9a0e4156SSadaf Ebrahimi 51*9a0e4156SSadaf Ebrahimi 52*9a0e4156SSadaf Ebrahimi /// MCOperandInfo - This holds information about one operand of a machine 53*9a0e4156SSadaf Ebrahimi /// instruction, indicating the register class for register operands, etc. 54*9a0e4156SSadaf Ebrahimi /// 55*9a0e4156SSadaf Ebrahimi typedef struct MCOperandInfo { 56*9a0e4156SSadaf Ebrahimi /// RegClass - This specifies the register class enumeration of the operand 57*9a0e4156SSadaf Ebrahimi /// if the operand is a register. If isLookupPtrRegClass is set, then this is 58*9a0e4156SSadaf Ebrahimi /// an index that is passed to TargetRegisterInfo::getPointerRegClass(x) to 59*9a0e4156SSadaf Ebrahimi /// get a dynamic register class. 60*9a0e4156SSadaf Ebrahimi int16_t RegClass; 61*9a0e4156SSadaf Ebrahimi 62*9a0e4156SSadaf Ebrahimi /// Flags - These are flags from the MCOI::OperandFlags enum. 63*9a0e4156SSadaf Ebrahimi uint8_t Flags; 64*9a0e4156SSadaf Ebrahimi 65*9a0e4156SSadaf Ebrahimi /// OperandType - Information about the type of the operand. 66*9a0e4156SSadaf Ebrahimi uint8_t OperandType; 67*9a0e4156SSadaf Ebrahimi 68*9a0e4156SSadaf Ebrahimi /// Lower 16 bits are used to specify which constraints are set. The higher 16 69*9a0e4156SSadaf Ebrahimi /// bits are used to specify the value of constraints (4 bits each). 70*9a0e4156SSadaf Ebrahimi uint32_t Constraints; 71*9a0e4156SSadaf Ebrahimi /// Currently no other information. 72*9a0e4156SSadaf Ebrahimi } MCOperandInfo; 73*9a0e4156SSadaf Ebrahimi 74*9a0e4156SSadaf Ebrahimi 75*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 76*9a0e4156SSadaf Ebrahimi // Machine Instruction Flags and Description 77*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===// 78*9a0e4156SSadaf Ebrahimi 79*9a0e4156SSadaf Ebrahimi /// MCInstrDesc flags - These should be considered private to the 80*9a0e4156SSadaf Ebrahimi /// implementation of the MCInstrDesc class. Clients should use the predicate 81*9a0e4156SSadaf Ebrahimi /// methods on MCInstrDesc, not use these directly. These all correspond to 82*9a0e4156SSadaf Ebrahimi /// bitfields in the MCInstrDesc::Flags field. 83*9a0e4156SSadaf Ebrahimi enum { 84*9a0e4156SSadaf Ebrahimi MCID_Variadic = 0, 85*9a0e4156SSadaf Ebrahimi MCID_HasOptionalDef, 86*9a0e4156SSadaf Ebrahimi MCID_Pseudo, 87*9a0e4156SSadaf Ebrahimi MCID_Return, 88*9a0e4156SSadaf Ebrahimi MCID_Call, 89*9a0e4156SSadaf Ebrahimi MCID_Barrier, 90*9a0e4156SSadaf Ebrahimi MCID_Terminator, 91*9a0e4156SSadaf Ebrahimi MCID_Branch, 92*9a0e4156SSadaf Ebrahimi MCID_IndirectBranch, 93*9a0e4156SSadaf Ebrahimi MCID_Compare, 94*9a0e4156SSadaf Ebrahimi MCID_MoveImm, 95*9a0e4156SSadaf Ebrahimi MCID_Bitcast, 96*9a0e4156SSadaf Ebrahimi MCID_Select, 97*9a0e4156SSadaf Ebrahimi MCID_DelaySlot, 98*9a0e4156SSadaf Ebrahimi MCID_FoldableAsLoad, 99*9a0e4156SSadaf Ebrahimi MCID_MayLoad, 100*9a0e4156SSadaf Ebrahimi MCID_MayStore, 101*9a0e4156SSadaf Ebrahimi MCID_Predicable, 102*9a0e4156SSadaf Ebrahimi MCID_NotDuplicable, 103*9a0e4156SSadaf Ebrahimi MCID_UnmodeledSideEffects, 104*9a0e4156SSadaf Ebrahimi MCID_Commutable, 105*9a0e4156SSadaf Ebrahimi MCID_ConvertibleTo3Addr, 106*9a0e4156SSadaf Ebrahimi MCID_UsesCustomInserter, 107*9a0e4156SSadaf Ebrahimi MCID_HasPostISelHook, 108*9a0e4156SSadaf Ebrahimi MCID_Rematerializable, 109*9a0e4156SSadaf Ebrahimi MCID_CheapAsAMove, 110*9a0e4156SSadaf Ebrahimi MCID_ExtraSrcRegAllocReq, 111*9a0e4156SSadaf Ebrahimi MCID_ExtraDefRegAllocReq, 112*9a0e4156SSadaf Ebrahimi MCID_RegSequence, 113*9a0e4156SSadaf Ebrahimi MCID_ExtractSubreg, 114*9a0e4156SSadaf Ebrahimi MCID_InsertSubreg 115*9a0e4156SSadaf Ebrahimi }; 116*9a0e4156SSadaf Ebrahimi 117*9a0e4156SSadaf Ebrahimi /// MCInstrDesc - Describe properties that are true of each instruction in the 118*9a0e4156SSadaf Ebrahimi /// target description file. This captures information about side effects, 119*9a0e4156SSadaf Ebrahimi /// register use and many other things. There is one instance of this struct 120*9a0e4156SSadaf Ebrahimi /// for each target instruction class, and the MachineInstr class points to 121*9a0e4156SSadaf Ebrahimi /// this struct directly to describe itself. 122*9a0e4156SSadaf Ebrahimi typedef struct MCInstrDesc { 123*9a0e4156SSadaf Ebrahimi unsigned short Opcode; // The opcode number 124*9a0e4156SSadaf Ebrahimi unsigned char NumOperands; // Num of args (may be more if variable_ops) 125*9a0e4156SSadaf Ebrahimi unsigned char NumDefs; // Num of args that are definitions 126*9a0e4156SSadaf Ebrahimi unsigned short SchedClass; // enum identifying instr sched class 127*9a0e4156SSadaf Ebrahimi unsigned char Size; // Number of bytes in encoding. 128*9a0e4156SSadaf Ebrahimi unsigned Flags; // Flags identifying machine instr class 129*9a0e4156SSadaf Ebrahimi uint64_t TSFlags; // Target Specific Flag values 130*9a0e4156SSadaf Ebrahimi char ImplicitUses; // Registers implicitly read by this instr 131*9a0e4156SSadaf Ebrahimi char ImplicitDefs; // Registers implicitly defined by this instr 132*9a0e4156SSadaf Ebrahimi const MCOperandInfo *OpInfo; // 'NumOperands' entries about operands 133*9a0e4156SSadaf Ebrahimi uint64_t DeprecatedFeatureMask;// Feature bits that this is deprecated on, if any 134*9a0e4156SSadaf Ebrahimi // A complex method to determine is a certain is deprecated or not, and return 135*9a0e4156SSadaf Ebrahimi // the reason for deprecation. 136*9a0e4156SSadaf Ebrahimi //bool (*ComplexDeprecationInfo)(MCInst &, MCSubtargetInfo &, std::string &); 137*9a0e4156SSadaf Ebrahimi unsigned char ComplexDeprecationInfo; // dummy field, just to satisfy initializer 138*9a0e4156SSadaf Ebrahimi } MCInstrDesc; 139*9a0e4156SSadaf Ebrahimi 140*9a0e4156SSadaf Ebrahimi bool MCOperandInfo_isPredicate(const MCOperandInfo *m); 141*9a0e4156SSadaf Ebrahimi 142*9a0e4156SSadaf Ebrahimi bool MCOperandInfo_isOptionalDef(const MCOperandInfo *m); 143*9a0e4156SSadaf Ebrahimi 144*9a0e4156SSadaf Ebrahimi #endif 145