xref: /aosp_15_r20/external/capstone/MCInstrDesc.h (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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