1 //===-- AMDGPUInstPrinter.h - AMDGPU MC Inst -> ASM interface ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 //===----------------------------------------------------------------------===//
11 
12 #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H
13 #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H
14 
15 #include "llvm/MC/MCInstPrinter.h"
16 
17 namespace llvm {
18 
19 class AMDGPUInstPrinter : public MCInstPrinter {
20 public:
21   AMDGPUInstPrinter(const MCAsmInfo &MAI,
22                     const MCInstrInfo &MII, const MCRegisterInfo &MRI)
23     : MCInstPrinter(MAI, MII, MRI) {}
24 
25   //Autogenerated by tblgen
26   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
27   std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
28   void printInstruction(const MCInst *MI, uint64_t Address,
29                         const MCSubtargetInfo &STI, raw_ostream &O);
30   static const char *getRegisterName(unsigned RegNo);
31 
32   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
33                  const MCSubtargetInfo &STI, raw_ostream &O) override;
34   static void printRegOperand(unsigned RegNo, raw_ostream &O,
35                               const MCRegisterInfo &MRI);
36 
37 private:
38   void printU4ImmOperand(const MCInst *MI, unsigned OpNo,
39                          const MCSubtargetInfo &STI, raw_ostream &O);
40   void printU8ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
41   void printU16ImmOperand(const MCInst *MI, unsigned OpNo,
42                           const MCSubtargetInfo &STI, raw_ostream &O);
43   void printU4ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
44   void printU8ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
45   void printU16ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
46   void printU32ImmOperand(const MCInst *MI, unsigned OpNo,
47                           const MCSubtargetInfo &STI, raw_ostream &O);
48   void printNamedBit(const MCInst *MI, unsigned OpNo, raw_ostream &O,
49                      StringRef BitName);
50   void printOffen(const MCInst *MI, unsigned OpNo, raw_ostream &O);
51   void printIdxen(const MCInst *MI, unsigned OpNo, raw_ostream &O);
52   void printAddr64(const MCInst *MI, unsigned OpNo, raw_ostream &O);
53   void printMBUFOffset(const MCInst *MI, unsigned OpNo, raw_ostream &O);
54   void printOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
55                    raw_ostream &O);
56   void printFlatOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
57                        raw_ostream &O);
58 
59   void printOffset0(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
60                     raw_ostream &O);
61   void printOffset1(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
62                     raw_ostream &O);
63   void printSMRDOffset8(const MCInst *MI, unsigned OpNo,
64                        const MCSubtargetInfo &STI, raw_ostream &O);
65   void printSMEMOffset(const MCInst *MI, unsigned OpNo,
66                        const MCSubtargetInfo &STI, raw_ostream &O);
67   void printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
68                               const MCSubtargetInfo &STI, raw_ostream &O);
69   void printGDS(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
70                 raw_ostream &O);
71   void printDLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
72                 raw_ostream &O);
73   void printSCCB(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
74                  raw_ostream &O);
75   void printGLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
76                 raw_ostream &O);
77   void printSLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
78                 raw_ostream &O);
79   void printSWZ(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
80                 raw_ostream &O);
81   void printTFE(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
82                 raw_ostream &O);
83   void printDMask(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
84                   raw_ostream &O);
85   void printDim(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
86                 raw_ostream &O);
87   void printUNorm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
88                   raw_ostream &O);
89   void printDA(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
90                raw_ostream &O);
91   void printR128A16(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
92                  raw_ostream &O);
93   void printGFX10A16(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
94                 raw_ostream &O);
95   void printLWE(const MCInst *MI, unsigned OpNo,
96                 const MCSubtargetInfo &STI, raw_ostream &O);
97   void printD16(const MCInst *MI, unsigned OpNo,
98                 const MCSubtargetInfo &STI, raw_ostream &O);
99   void printExpCompr(const MCInst *MI, unsigned OpNo,
100                      const MCSubtargetInfo &STI, raw_ostream &O);
101   void printExpVM(const MCInst *MI, unsigned OpNo,
102                   const MCSubtargetInfo &STI, raw_ostream &O);
103   void printFORMAT(const MCInst *MI, unsigned OpNo,
104                    const MCSubtargetInfo &STI, raw_ostream &O);
105   void printSymbolicFormat(const MCInst *MI,
106                            const MCSubtargetInfo &STI, raw_ostream &O);
107 
108   void printRegOperand(unsigned RegNo, raw_ostream &O);
109   void printVOPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
110                    raw_ostream &O);
111   void printVINTRPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
112                       raw_ostream &O);
113   void printImmediateInt16(uint32_t Imm, const MCSubtargetInfo &STI,
114                            raw_ostream &O);
115   void printImmediate16(uint32_t Imm, const MCSubtargetInfo &STI,
116                         raw_ostream &O);
117   void printImmediateV216(uint32_t Imm, const MCSubtargetInfo &STI,
118                           raw_ostream &O);
119   void printImmediate32(uint32_t Imm, const MCSubtargetInfo &STI,
120                         raw_ostream &O);
121   void printImmediate64(uint64_t Imm, const MCSubtargetInfo &STI,
122                         raw_ostream &O);
123   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
124                     raw_ostream &O);
125   void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
126                     const MCSubtargetInfo &STI, raw_ostream &O) {
127     printOperand(MI, OpNum, STI, O);
128   }
129   void printOperandAndFPInputMods(const MCInst *MI, unsigned OpNo,
130                                   const MCSubtargetInfo &STI, raw_ostream &O);
131   void printOperandAndIntInputMods(const MCInst *MI, unsigned OpNo,
132                                    const MCSubtargetInfo &STI, raw_ostream &O);
133   void printDPP8(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
134                  raw_ostream &O);
135   void printDPPCtrl(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
136                     raw_ostream &O);
137   void printRowMask(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
138                     raw_ostream &O);
139   void printBankMask(const MCInst *MI, unsigned OpNo,
140                      const MCSubtargetInfo &STI, raw_ostream &O);
141   void printBoundCtrl(const MCInst *MI, unsigned OpNo,
142                       const MCSubtargetInfo &STI, raw_ostream &O);
143   void printFI(const MCInst *MI, unsigned OpNo,
144                const MCSubtargetInfo &STI, raw_ostream &O);
145   void printSDWASel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
146   void printSDWADstSel(const MCInst *MI, unsigned OpNo,
147                        const MCSubtargetInfo &STI, raw_ostream &O);
148   void printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
149                         const MCSubtargetInfo &STI, raw_ostream &O);
150   void printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
151                         const MCSubtargetInfo &STI, raw_ostream &O);
152   void printSDWADstUnused(const MCInst *MI, unsigned OpNo,
153                           const MCSubtargetInfo &STI, raw_ostream &O);
154   void printPackedModifier(const MCInst *MI, StringRef Name, unsigned Mod,
155                            raw_ostream &O);
156   void printOpSel(const MCInst *MI, unsigned OpNo,
157                   const MCSubtargetInfo &STI, raw_ostream &O);
158   void printOpSelHi(const MCInst *MI, unsigned OpNo,
159                   const MCSubtargetInfo &STI, raw_ostream &O);
160   void printNegLo(const MCInst *MI, unsigned OpNo,
161                   const MCSubtargetInfo &STI, raw_ostream &O);
162   void printNegHi(const MCInst *MI, unsigned OpNo,
163                   const MCSubtargetInfo &STI, raw_ostream &O);
164   void printInterpSlot(const MCInst *MI, unsigned OpNo,
165                        const MCSubtargetInfo &STI, raw_ostream &O);
166   void printInterpAttr(const MCInst *MI, unsigned OpNo,
167                        const MCSubtargetInfo &STI, raw_ostream &O);
168   void printInterpAttrChan(const MCInst *MI, unsigned OpNo,
169                            const MCSubtargetInfo &STI, raw_ostream &O);
170 
171   void printVGPRIndexMode(const MCInst *MI, unsigned OpNo,
172                           const MCSubtargetInfo &STI, raw_ostream &O);
173   void printMemOperand(const MCInst *MI, unsigned OpNo,
174                        const MCSubtargetInfo &STI, raw_ostream &O);
175   void printBLGP(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
176                  raw_ostream &O);
177   void printCBSZ(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
178                  raw_ostream &O);
179   void printABID(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
180                  raw_ostream &O);
181   void printDefaultVccOperand(unsigned OpNo, const MCSubtargetInfo &STI,
182                               raw_ostream &O);
183 
184   void printExpSrcN(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
185                     raw_ostream &O, unsigned N);
186   void printExpSrc0(const MCInst *MI, unsigned OpNo,
187                     const MCSubtargetInfo &STI, raw_ostream &O);
188   void printExpSrc1(const MCInst *MI, unsigned OpNo,
189                     const MCSubtargetInfo &STI, raw_ostream &O);
190   void printExpSrc2(const MCInst *MI, unsigned OpNo,
191                     const MCSubtargetInfo &STI, raw_ostream &O);
192   void printExpSrc3(const MCInst *MI, unsigned OpNo,
193                     const MCSubtargetInfo &STI, raw_ostream &O);
194   void printExpTgt(const MCInst *MI, unsigned OpNo,
195                    const MCSubtargetInfo &STI, raw_ostream &O);
196 
197 public:
198   static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
199                          StringRef Asm, StringRef Default = "");
200   static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
201                          char Asm);
202 protected:
203   void printAbs(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
204                 raw_ostream &O);
205   void printHigh(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
206                  raw_ostream &O);
207   void printClamp(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
208                   raw_ostream &O);
209   void printClampSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
210                     raw_ostream &O);
211   void printOModSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
212                    raw_ostream &O);
213   void printLiteral(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
214                     raw_ostream &O);
215   void printLast(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
216                  raw_ostream &O);
217   void printNeg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
218                 raw_ostream &O);
219   void printOMOD(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
220                  raw_ostream &O);
221   void printRel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
222                 raw_ostream &O);
223   void printUpdateExecMask(const MCInst *MI, unsigned OpNo,
224                            const MCSubtargetInfo &STI, raw_ostream &O);
225   void printUpdatePred(const MCInst *MI, unsigned OpNo,
226                        const MCSubtargetInfo &STI, raw_ostream &O);
227   void printWrite(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
228                   raw_ostream &O);
229   void printBankSwizzle(const MCInst *MI, unsigned OpNo,
230                         const MCSubtargetInfo &STI, raw_ostream &O);
231   void printRSel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
232                  raw_ostream &O);
233   void printCT(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
234                raw_ostream &O);
235   void printKCache(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
236                    raw_ostream &O);
237   void printSendMsg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
238                     raw_ostream &O);
239   void printSwizzle(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
240                     raw_ostream &O);
241   void printWaitFlag(const MCInst *MI, unsigned OpNo,
242                      const MCSubtargetInfo &STI, raw_ostream &O);
243   void printHwreg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
244                   raw_ostream &O);
245   void printEndpgm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
246                    raw_ostream &O);
247 };
248 
249 class R600InstPrinter : public MCInstPrinter {
250 public:
251   R600InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
252                   const MCRegisterInfo &MRI)
253     : MCInstPrinter(MAI, MII, MRI) {}
254 
255   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
256                  const MCSubtargetInfo &STI, raw_ostream &O) override;
257   std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
258   void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O);
259   static const char *getRegisterName(unsigned RegNo);
260 
261   void printAbs(const MCInst *MI, unsigned OpNo, raw_ostream &O);
262   void printBankSwizzle(const MCInst *MI, unsigned OpNo, raw_ostream &O);
263   void printClamp(const MCInst *MI, unsigned OpNo, raw_ostream &O);
264   void printCT(const MCInst *MI, unsigned OpNo, raw_ostream &O);
265   void printKCache(const MCInst *MI, unsigned OpNo, raw_ostream &O);
266   void printLast(const MCInst *MI, unsigned OpNo, raw_ostream &O);
267   void printLiteral(const MCInst *MI, unsigned OpNo, raw_ostream &O);
268   void printMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
269   void printNeg(const MCInst *MI, unsigned OpNo, raw_ostream &O);
270   void printOMOD(const MCInst *MI, unsigned OpNo, raw_ostream &O);
271   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
272   void printRel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
273   void printRSel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
274   void printUpdateExecMask(const MCInst *MI, unsigned OpNo, raw_ostream &O);
275   void printUpdatePred(const MCInst *MI, unsigned OpNo, raw_ostream &O);
276   void printWrite(const MCInst *MI, unsigned OpNo, raw_ostream &O);
277 };
278 
279 } // End namespace llvm
280 
281 #endif
282