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