xref: /aosp_15_r20/external/capstone/MCRegisterInfo.h (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi //=== MC/MCRegisterInfo.h - Target Register Description ---------*- 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 describes an abstract interface used to get information about a
11*9a0e4156SSadaf Ebrahimi // target machines register file.  This information is used for a variety of
12*9a0e4156SSadaf Ebrahimi // purposed, especially register allocation.
13*9a0e4156SSadaf Ebrahimi //
14*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
15*9a0e4156SSadaf Ebrahimi 
16*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
17*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
18*9a0e4156SSadaf Ebrahimi 
19*9a0e4156SSadaf Ebrahimi #ifndef CS_LLVM_MC_MCREGISTERINFO_H
20*9a0e4156SSadaf Ebrahimi #define CS_LLVM_MC_MCREGISTERINFO_H
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi #include "capstone/platform.h"
23*9a0e4156SSadaf Ebrahimi 
24*9a0e4156SSadaf Ebrahimi /// An unsigned integer type large enough to represent all physical registers,
25*9a0e4156SSadaf Ebrahimi /// but not necessarily virtual registers.
26*9a0e4156SSadaf Ebrahimi typedef uint16_t MCPhysReg;
27*9a0e4156SSadaf Ebrahimi typedef const MCPhysReg* iterator;
28*9a0e4156SSadaf Ebrahimi 
29*9a0e4156SSadaf Ebrahimi typedef struct MCRegisterClass {
30*9a0e4156SSadaf Ebrahimi 	iterator RegsBegin;
31*9a0e4156SSadaf Ebrahimi 	const uint8_t *RegSet;
32*9a0e4156SSadaf Ebrahimi 	uint32_t NameIdx;
33*9a0e4156SSadaf Ebrahimi 	uint16_t RegsSize;
34*9a0e4156SSadaf Ebrahimi 	uint16_t RegSetSize;
35*9a0e4156SSadaf Ebrahimi 	uint16_t ID;
36*9a0e4156SSadaf Ebrahimi 	uint16_t RegSize, Alignment; // Size & Alignment of register in bytes
37*9a0e4156SSadaf Ebrahimi 	int8_t CopyCost;
38*9a0e4156SSadaf Ebrahimi 	bool Allocatable;
39*9a0e4156SSadaf Ebrahimi } MCRegisterClass;
40*9a0e4156SSadaf Ebrahimi 
41*9a0e4156SSadaf Ebrahimi /// MCRegisterDesc - This record contains information about a particular
42*9a0e4156SSadaf Ebrahimi /// register.  The SubRegs field is a zero terminated array of registers that
43*9a0e4156SSadaf Ebrahimi /// are sub-registers of the specific register, e.g. AL, AH are sub-registers
44*9a0e4156SSadaf Ebrahimi /// of AX. The SuperRegs field is a zero terminated array of registers that are
45*9a0e4156SSadaf Ebrahimi /// super-registers of the specific register, e.g. RAX, EAX, are
46*9a0e4156SSadaf Ebrahimi /// super-registers of AX.
47*9a0e4156SSadaf Ebrahimi ///
48*9a0e4156SSadaf Ebrahimi typedef struct MCRegisterDesc {
49*9a0e4156SSadaf Ebrahimi 	uint32_t Name;      // Printable name for the reg (for debugging)
50*9a0e4156SSadaf Ebrahimi 	uint32_t SubRegs;   // Sub-register set, described above
51*9a0e4156SSadaf Ebrahimi 	uint32_t SuperRegs; // Super-register set, described above
52*9a0e4156SSadaf Ebrahimi 
53*9a0e4156SSadaf Ebrahimi 	// Offset into MCRI::SubRegIndices of a list of sub-register indices for each
54*9a0e4156SSadaf Ebrahimi 	// sub-register in SubRegs.
55*9a0e4156SSadaf Ebrahimi 	uint32_t SubRegIndices;
56*9a0e4156SSadaf Ebrahimi 
57*9a0e4156SSadaf Ebrahimi 	// RegUnits - Points to the list of register units. The low 4 bits holds the
58*9a0e4156SSadaf Ebrahimi 	// Scale, the high bits hold an offset into DiffLists. See MCRegUnitIterator.
59*9a0e4156SSadaf Ebrahimi 	uint32_t RegUnits;
60*9a0e4156SSadaf Ebrahimi 
61*9a0e4156SSadaf Ebrahimi 	/// Index into list with lane mask sequences. The sequence contains a lanemask
62*9a0e4156SSadaf Ebrahimi 	/// for every register unit.
63*9a0e4156SSadaf Ebrahimi 	uint16_t RegUnitLaneMasks;
64*9a0e4156SSadaf Ebrahimi } MCRegisterDesc;
65*9a0e4156SSadaf Ebrahimi 
66*9a0e4156SSadaf Ebrahimi /// MCRegisterInfo base class - We assume that the target defines a static
67*9a0e4156SSadaf Ebrahimi /// array of MCRegisterDesc objects that represent all of the machine
68*9a0e4156SSadaf Ebrahimi /// registers that the target has.  As such, we simply have to track a pointer
69*9a0e4156SSadaf Ebrahimi /// to this array so that we can turn register number into a register
70*9a0e4156SSadaf Ebrahimi /// descriptor.
71*9a0e4156SSadaf Ebrahimi ///
72*9a0e4156SSadaf Ebrahimi /// Note this class is designed to be a base class of TargetRegisterInfo, which
73*9a0e4156SSadaf Ebrahimi /// is the interface used by codegen. However, specific targets *should never*
74*9a0e4156SSadaf Ebrahimi /// specialize this class. MCRegisterInfo should only contain getters to access
75*9a0e4156SSadaf Ebrahimi /// TableGen generated physical register data. It must not be extended with
76*9a0e4156SSadaf Ebrahimi /// virtual methods.
77*9a0e4156SSadaf Ebrahimi ///
78*9a0e4156SSadaf Ebrahimi typedef struct MCRegisterInfo {
79*9a0e4156SSadaf Ebrahimi 	const MCRegisterDesc *Desc;                 // Pointer to the descriptor array
80*9a0e4156SSadaf Ebrahimi 	unsigned NumRegs;                           // Number of entries in the array
81*9a0e4156SSadaf Ebrahimi 	unsigned RAReg;                             // Return address register
82*9a0e4156SSadaf Ebrahimi 	unsigned PCReg;                             // Program counter register
83*9a0e4156SSadaf Ebrahimi 	const MCRegisterClass *Classes;             // Pointer to the regclass array
84*9a0e4156SSadaf Ebrahimi 	unsigned NumClasses;                        // Number of entries in the array
85*9a0e4156SSadaf Ebrahimi 	unsigned NumRegUnits;                       // Number of regunits.
86*9a0e4156SSadaf Ebrahimi 	uint16_t (*RegUnitRoots)[2];          // Pointer to regunit root table.
87*9a0e4156SSadaf Ebrahimi 	const MCPhysReg *DiffLists;                 // Pointer to the difflists array
88*9a0e4156SSadaf Ebrahimi 	const char *RegStrings;                     // Pointer to the string table.
89*9a0e4156SSadaf Ebrahimi 	const uint16_t *SubRegIndices;              // Pointer to the subreg lookup
90*9a0e4156SSadaf Ebrahimi 	// array.
91*9a0e4156SSadaf Ebrahimi 	unsigned NumSubRegIndices;                  // Number of subreg indices.
92*9a0e4156SSadaf Ebrahimi 	const uint16_t *RegEncodingTable;           // Pointer to array of register
93*9a0e4156SSadaf Ebrahimi 	// encodings.
94*9a0e4156SSadaf Ebrahimi } MCRegisterInfo;
95*9a0e4156SSadaf Ebrahimi 
96*9a0e4156SSadaf Ebrahimi void MCRegisterInfo_InitMCRegisterInfo(MCRegisterInfo *RI,
97*9a0e4156SSadaf Ebrahimi 		const MCRegisterDesc *D, unsigned NR, unsigned RA,
98*9a0e4156SSadaf Ebrahimi 		unsigned PC,
99*9a0e4156SSadaf Ebrahimi 		const MCRegisterClass *C, unsigned NC,
100*9a0e4156SSadaf Ebrahimi 		uint16_t (*RURoots)[2],
101*9a0e4156SSadaf Ebrahimi 		unsigned NRU,
102*9a0e4156SSadaf Ebrahimi 		const MCPhysReg *DL,
103*9a0e4156SSadaf Ebrahimi 		const char *Strings,
104*9a0e4156SSadaf Ebrahimi 		const uint16_t *SubIndices,
105*9a0e4156SSadaf Ebrahimi 		unsigned NumIndices,
106*9a0e4156SSadaf Ebrahimi 		const uint16_t *RET);
107*9a0e4156SSadaf Ebrahimi 
108*9a0e4156SSadaf Ebrahimi unsigned MCRegisterInfo_getMatchingSuperReg(const MCRegisterInfo *RI, unsigned Reg, unsigned SubIdx, const MCRegisterClass *RC);
109*9a0e4156SSadaf Ebrahimi 
110*9a0e4156SSadaf Ebrahimi unsigned MCRegisterInfo_getSubReg(const MCRegisterInfo *RI, unsigned Reg, unsigned Idx);
111*9a0e4156SSadaf Ebrahimi 
112*9a0e4156SSadaf Ebrahimi const MCRegisterClass* MCRegisterInfo_getRegClass(const MCRegisterInfo *RI, unsigned i);
113*9a0e4156SSadaf Ebrahimi 
114*9a0e4156SSadaf Ebrahimi bool MCRegisterClass_contains(const MCRegisterClass *c, unsigned Reg);
115*9a0e4156SSadaf Ebrahimi 
116*9a0e4156SSadaf Ebrahimi #endif
117