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