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 {
18class MCInstrDesc;
19
20class AMDGPUInstPrinter : public MCInstPrinter {
21public:
22  AMDGPUInstPrinter(const MCAsmInfo &MAI,
23                    const MCInstrInfo &MII, const MCRegisterInfo &MRI)
24    : MCInstPrinter(MAI, MII, MRI) {}
25
26  // Autogenerated by tblgen
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(MCRegister Reg);
31
32  void printRegName(raw_ostream &OS, MCRegister Reg) const override;
33  void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
34                 const MCSubtargetInfo &STI, raw_ostream &O) override;
35  static void printRegOperand(unsigned RegNo, raw_ostream &O,
36                              const MCRegisterInfo &MRI);
37
38private:
39  void printU4ImmOperand(const MCInst *MI, unsigned OpNo,
40                         const MCSubtargetInfo &STI, 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 printOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
51                   raw_ostream &O);
52  void printFlatOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
53                       raw_ostream &O);
54
55  void printOffset0(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
56                    raw_ostream &O);
57  void printOffset1(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
58                    raw_ostream &O);
59  void printSMRDOffset8(const MCInst *MI, unsigned OpNo,
60                       const MCSubtargetInfo &STI, raw_ostream &O);
61  void printSMEMOffset(const MCInst *MI, unsigned OpNo,
62                       const MCSubtargetInfo &STI, raw_ostream &O);
63  void printSMEMOffsetMod(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 printCPol(const MCInst *MI, unsigned OpNo,
68                 const MCSubtargetInfo &STI, raw_ostream &O);
69  void printTH(const MCInst *MI, int64_t TH, int64_t Scope, raw_ostream &O);
70  void printScope(int64_t Scope, raw_ostream &O);
71  void printDMask(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
72                  raw_ostream &O);
73  void printDim(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
74                raw_ostream &O);
75  void printR128A16(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
76                 raw_ostream &O);
77  void printFORMAT(const MCInst *MI, unsigned OpNo,
78                   const MCSubtargetInfo &STI, raw_ostream &O);
79  void printSymbolicFormat(const MCInst *MI,
80                           const MCSubtargetInfo &STI, raw_ostream &O);
81
82  void printRegOperand(unsigned RegNo, raw_ostream &O);
83  void printVOPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
84                   raw_ostream &O);
85  void printVINTRPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
86                      raw_ostream &O);
87  void printImmediateInt16(uint32_t Imm, const MCSubtargetInfo &STI,
88                           raw_ostream &O);
89  void printImmediate16(uint32_t Imm, const MCSubtargetInfo &STI,
90                        raw_ostream &O);
91  void printImmediateV216(uint32_t Imm, uint8_t OpType,
92                          const MCSubtargetInfo &STI, raw_ostream &O);
93  bool printImmediateFloat32(uint32_t Imm, const MCSubtargetInfo &STI,
94                             raw_ostream &O);
95  void printImmediate32(uint32_t Imm, const MCSubtargetInfo &STI,
96                        raw_ostream &O);
97  void printImmediate64(uint64_t Imm, const MCSubtargetInfo &STI,
98                        raw_ostream &O, bool IsFP);
99  void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
100                    raw_ostream &O);
101  void printRegularOperand(const MCInst *MI, unsigned OpNo,
102                           const MCSubtargetInfo &STI, raw_ostream &O);
103  void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
104                    const MCSubtargetInfo &STI, raw_ostream &O) {
105    printOperand(MI, OpNum, STI, O);
106  }
107  void printOperandAndFPInputMods(const MCInst *MI, unsigned OpNo,
108                                  const MCSubtargetInfo &STI, raw_ostream &O);
109  void printOperandAndIntInputMods(const MCInst *MI, unsigned OpNo,
110                                   const MCSubtargetInfo &STI, raw_ostream &O);
111  void printDPP8(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
112                 raw_ostream &O);
113  void printDPPCtrl(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
114                    raw_ostream &O);
115  void printDppRowMask(const MCInst *MI, unsigned OpNo,
116                       const MCSubtargetInfo &STI, raw_ostream &O);
117  void printDppBankMask(const MCInst *MI, unsigned OpNo,
118                        const MCSubtargetInfo &STI, raw_ostream &O);
119  void printDppBoundCtrl(const MCInst *MI, unsigned OpNo,
120                         const MCSubtargetInfo &STI, raw_ostream &O);
121  void printDppFI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
122                  raw_ostream &O);
123  void printSDWASel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
124  void printSDWADstSel(const MCInst *MI, unsigned OpNo,
125                       const MCSubtargetInfo &STI, raw_ostream &O);
126  void printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
127                        const MCSubtargetInfo &STI, raw_ostream &O);
128  void printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
129                        const MCSubtargetInfo &STI, raw_ostream &O);
130  void printSDWADstUnused(const MCInst *MI, unsigned OpNo,
131                          const MCSubtargetInfo &STI, raw_ostream &O);
132  void printPackedModifier(const MCInst *MI, StringRef Name, unsigned Mod,
133                           raw_ostream &O);
134  void printOpSel(const MCInst *MI, unsigned OpNo,
135                  const MCSubtargetInfo &STI, raw_ostream &O);
136  void printOpSelHi(const MCInst *MI, unsigned OpNo,
137                  const MCSubtargetInfo &STI, raw_ostream &O);
138  void printNegLo(const MCInst *MI, unsigned OpNo,
139                  const MCSubtargetInfo &STI, raw_ostream &O);
140  void printNegHi(const MCInst *MI, unsigned OpNo,
141                  const MCSubtargetInfo &STI, raw_ostream &O);
142  void printIndexKey8bit(const MCInst *MI, unsigned OpNo,
143                         const MCSubtargetInfo &STI, raw_ostream &O);
144  void printIndexKey16bit(const MCInst *MI, unsigned OpNo,
145                          const MCSubtargetInfo &STI, raw_ostream &O);
146  void printInterpSlot(const MCInst *MI, unsigned OpNo,
147                       const MCSubtargetInfo &STI, raw_ostream &O);
148  void printInterpAttr(const MCInst *MI, unsigned OpNo,
149                       const MCSubtargetInfo &STI, raw_ostream &O);
150  void printInterpAttrChan(const MCInst *MI, unsigned OpNo,
151                           const MCSubtargetInfo &STI, raw_ostream &O);
152
153  void printGPRIdxMode(const MCInst *MI, unsigned OpNo,
154                       const MCSubtargetInfo &STI, raw_ostream &O);
155  void printMemOperand(const MCInst *MI, unsigned OpNo,
156                       const MCSubtargetInfo &STI, raw_ostream &O);
157  void printBLGP(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
158                 raw_ostream &O);
159  void printCBSZ(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
160                 raw_ostream &O);
161  void printABID(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
162                 raw_ostream &O);
163  bool needsImpliedVcc(const MCInstrDesc &Desc, unsigned OpNo) const;
164  void printDefaultVccOperand(bool FirstOperand, const MCSubtargetInfo &STI,
165                              raw_ostream &O);
166  void printWaitVDST(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
167                    raw_ostream &O);
168  void printWaitEXP(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
169                    raw_ostream &O);
170  void printWaitVAVDst(const MCInst *MI, unsigned OpNo,
171                       const MCSubtargetInfo &STI, raw_ostream &O);
172  void printWaitVMVSrc(const MCInst *MI, unsigned OpNo,
173                       const MCSubtargetInfo &STI, raw_ostream &O);
174
175  void printExpSrcN(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
176                    raw_ostream &O, unsigned N);
177  void printExpSrc0(const MCInst *MI, unsigned OpNo,
178                    const MCSubtargetInfo &STI, raw_ostream &O);
179  void printExpSrc1(const MCInst *MI, unsigned OpNo,
180                    const MCSubtargetInfo &STI, raw_ostream &O);
181  void printExpSrc2(const MCInst *MI, unsigned OpNo,
182                    const MCSubtargetInfo &STI, raw_ostream &O);
183  void printExpSrc3(const MCInst *MI, unsigned OpNo,
184                    const MCSubtargetInfo &STI, raw_ostream &O);
185  void printExpTgt(const MCInst *MI, unsigned OpNo,
186                   const MCSubtargetInfo &STI, raw_ostream &O);
187
188public:
189  static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
190                         StringRef Asm, StringRef Default = "");
191  static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
192                         char Asm);
193protected:
194  void printAbs(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
195                raw_ostream &O);
196  void printClamp(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
197                  raw_ostream &O);
198  void printOModSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
199                   raw_ostream &O);
200  void printLiteral(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
201                    raw_ostream &O);
202  void printLast(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
203                 raw_ostream &O);
204  void printNeg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
205                raw_ostream &O);
206  void printOMOD(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
207                 raw_ostream &O);
208  void printRel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
209                raw_ostream &O);
210  void printUpdateExecMask(const MCInst *MI, unsigned OpNo,
211                           const MCSubtargetInfo &STI, raw_ostream &O);
212  void printUpdatePred(const MCInst *MI, unsigned OpNo,
213                       const MCSubtargetInfo &STI, raw_ostream &O);
214  void printWrite(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
215                  raw_ostream &O);
216  void printBankSwizzle(const MCInst *MI, unsigned OpNo,
217                        const MCSubtargetInfo &STI, raw_ostream &O);
218  void printRSel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
219                 raw_ostream &O);
220  void printCT(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
221               raw_ostream &O);
222  void printKCache(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
223                   raw_ostream &O);
224  void printSendMsg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
225                    raw_ostream &O);
226  void printSwizzle(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
227                    raw_ostream &O);
228  void printSWaitCnt(const MCInst *MI, unsigned OpNo,
229                     const MCSubtargetInfo &STI, raw_ostream &O);
230  void printDepCtr(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
231                   raw_ostream &O);
232  void printSDelayALU(const MCInst *MI, unsigned OpNo,
233                      const MCSubtargetInfo &STI, raw_ostream &O);
234  void printHwreg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
235                  raw_ostream &O);
236  void printEndpgm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
237                   raw_ostream &O);
238};
239
240} // End namespace llvm
241
242#endif
243