1 //===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
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 // \file
8 //===----------------------------------------------------------------------===//
9 
10 #include "AMDGPUInstPrinter.h"
11 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
12 #include "SIDefines.h"
13 #include "Utils/AMDGPUAsmUtils.h"
14 #include "Utils/AMDGPUBaseInfo.h"
15 #include "llvm/MC/MCExpr.h"
16 #include "llvm/MC/MCInst.h"
17 #include "llvm/MC/MCInstrDesc.h"
18 #include "llvm/MC/MCInstrInfo.h"
19 #include "llvm/MC/MCRegisterInfo.h"
20 #include "llvm/MC/MCSubtargetInfo.h"
21 #include "llvm/Support/CommandLine.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Support/MathExtras.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <cassert>
26 
27 using namespace llvm;
28 using namespace llvm::AMDGPU;
29 
30 static cl::opt<bool> Keep16BitSuffixes(
31   "amdgpu-keep-16-bit-reg-suffixes",
32   cl::desc("Keep .l and .h suffixes in asm for debugging purposes"),
33   cl::init(false),
34   cl::ReallyHidden);
35 
36 void AMDGPUInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
37   // FIXME: The current implementation of
38   // AsmParser::parseRegisterOrRegisterNumber in MC implies we either emit this
39   // as an integer or we provide a name which represents a physical register.
40   // For CFI instructions we really want to emit a name for the DWARF register
41   // instead, because there may be multiple DWARF registers corresponding to a
42   // single physical register. One case where this problem manifests is with
43   // wave32/wave64 where using the physical register name is ambiguous: if we
44   // write e.g. `.cfi_undefined v0` we lose information about the wavefront
45   // size which we need to encode the register in the final DWARF. Ideally we
46   // would extend MC to support parsing DWARF register names so we could do
47   // something like `.cfi_undefined dwarf_wave32_v0`. For now we just live with
48   // non-pretty DWARF register names in assembly text.
49   OS << RegNo;
50 }
51 
52 void AMDGPUInstPrinter::printInst(const MCInst *MI, uint64_t Address,
53                                   StringRef Annot, const MCSubtargetInfo &STI,
54                                   raw_ostream &OS) {
55   OS.flush();
56   printInstruction(MI, Address, STI, OS);
57   printAnnotation(OS, Annot);
58 }
59 
60 void AMDGPUInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,
61                                           const MCSubtargetInfo &STI,
62                                           raw_ostream &O) {
63   O << formatHex(MI->getOperand(OpNo).getImm() & 0xf);
64 }
65 
66 void AMDGPUInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,
67                                           raw_ostream &O) {
68   O << formatHex(MI->getOperand(OpNo).getImm() & 0xff);
69 }
70 
71 void AMDGPUInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
72                                            const MCSubtargetInfo &STI,
73                                            raw_ostream &O) {
74   // It's possible to end up with a 32-bit literal used with a 16-bit operand
75   // with ignored high bits. Print as 32-bit anyway in that case.
76   int64_t Imm = MI->getOperand(OpNo).getImm();
77   if (isInt<16>(Imm) || isUInt<16>(Imm))
78     O << formatHex(static_cast<uint64_t>(Imm & 0xffff));
79   else
80     printU32ImmOperand(MI, OpNo, STI, O);
81 }
82 
83 void AMDGPUInstPrinter::printU4ImmDecOperand(const MCInst *MI, unsigned OpNo,
84                                              raw_ostream &O) {
85   O << formatDec(MI->getOperand(OpNo).getImm() & 0xf);
86 }
87 
88 void AMDGPUInstPrinter::printU8ImmDecOperand(const MCInst *MI, unsigned OpNo,
89                                              raw_ostream &O) {
90   O << formatDec(MI->getOperand(OpNo).getImm() & 0xff);
91 }
92 
93 void AMDGPUInstPrinter::printU16ImmDecOperand(const MCInst *MI, unsigned OpNo,
94                                               raw_ostream &O) {
95   O << formatDec(MI->getOperand(OpNo).getImm() & 0xffff);
96 }
97 
98 void AMDGPUInstPrinter::printU32ImmOperand(const MCInst *MI, unsigned OpNo,
99                                            const MCSubtargetInfo &STI,
100                                            raw_ostream &O) {
101   O << formatHex(MI->getOperand(OpNo).getImm() & 0xffffffff);
102 }
103 
104 void AMDGPUInstPrinter::printNamedBit(const MCInst *MI, unsigned OpNo,
105                                       raw_ostream &O, StringRef BitName) {
106   if (MI->getOperand(OpNo).getImm()) {
107     O << ' ' << BitName;
108   }
109 }
110 
111 void AMDGPUInstPrinter::printOffen(const MCInst *MI, unsigned OpNo,
112                                    raw_ostream &O) {
113   printNamedBit(MI, OpNo, O, "offen");
114 }
115 
116 void AMDGPUInstPrinter::printIdxen(const MCInst *MI, unsigned OpNo,
117                                    raw_ostream &O) {
118   printNamedBit(MI, OpNo, O, "idxen");
119 }
120 
121 void AMDGPUInstPrinter::printAddr64(const MCInst *MI, unsigned OpNo,
122                                     raw_ostream &O) {
123   printNamedBit(MI, OpNo, O, "addr64");
124 }
125 
126 void AMDGPUInstPrinter::printMBUFOffset(const MCInst *MI, unsigned OpNo,
127                                         raw_ostream &O) {
128   if (MI->getOperand(OpNo).getImm()) {
129     O << " offset:";
130     printU16ImmDecOperand(MI, OpNo, O);
131   }
132 }
133 
134 void AMDGPUInstPrinter::printOffset(const MCInst *MI, unsigned OpNo,
135                                     const MCSubtargetInfo &STI,
136                                     raw_ostream &O) {
137   uint16_t Imm = MI->getOperand(OpNo).getImm();
138   if (Imm != 0) {
139     O << ((OpNo == 0)? "offset:" : " offset:");
140     printU16ImmDecOperand(MI, OpNo, O);
141   }
142 }
143 
144 void AMDGPUInstPrinter::printFlatOffset(const MCInst *MI, unsigned OpNo,
145                                         const MCSubtargetInfo &STI,
146                                         raw_ostream &O) {
147   uint16_t Imm = MI->getOperand(OpNo).getImm();
148   if (Imm != 0) {
149     O << ((OpNo == 0)? "offset:" : " offset:");
150 
151     const MCInstrDesc &Desc = MII.get(MI->getOpcode());
152     bool IsFlatSeg = !(Desc.TSFlags & SIInstrFlags::IsNonFlatSeg);
153 
154     if (IsFlatSeg) { // Unsigned offset
155       printU16ImmDecOperand(MI, OpNo, O);
156     } else {         // Signed offset
157       if (AMDGPU::isGFX10(STI)) {
158         O << formatDec(SignExtend32<12>(MI->getOperand(OpNo).getImm()));
159       } else {
160         O << formatDec(SignExtend32<13>(MI->getOperand(OpNo).getImm()));
161       }
162     }
163   }
164 }
165 
166 void AMDGPUInstPrinter::printOffset0(const MCInst *MI, unsigned OpNo,
167                                      const MCSubtargetInfo &STI,
168                                      raw_ostream &O) {
169   if (MI->getOperand(OpNo).getImm()) {
170     O << " offset0:";
171     printU8ImmDecOperand(MI, OpNo, O);
172   }
173 }
174 
175 void AMDGPUInstPrinter::printOffset1(const MCInst *MI, unsigned OpNo,
176                                      const MCSubtargetInfo &STI,
177                                      raw_ostream &O) {
178   if (MI->getOperand(OpNo).getImm()) {
179     O << " offset1:";
180     printU8ImmDecOperand(MI, OpNo, O);
181   }
182 }
183 
184 void AMDGPUInstPrinter::printSMRDOffset8(const MCInst *MI, unsigned OpNo,
185                                         const MCSubtargetInfo &STI,
186                                         raw_ostream &O) {
187   printU32ImmOperand(MI, OpNo, STI, O);
188 }
189 
190 void AMDGPUInstPrinter::printSMEMOffset(const MCInst *MI, unsigned OpNo,
191                                         const MCSubtargetInfo &STI,
192                                         raw_ostream &O) {
193   O << formatHex(MI->getOperand(OpNo).getImm());
194 }
195 
196 void AMDGPUInstPrinter::printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
197                                                const MCSubtargetInfo &STI,
198                                                raw_ostream &O) {
199   printU32ImmOperand(MI, OpNo, STI, O);
200 }
201 
202 void AMDGPUInstPrinter::printGDS(const MCInst *MI, unsigned OpNo,
203                                  const MCSubtargetInfo &STI, raw_ostream &O) {
204   printNamedBit(MI, OpNo, O, "gds");
205 }
206 
207 void AMDGPUInstPrinter::printDLC(const MCInst *MI, unsigned OpNo,
208                                  const MCSubtargetInfo &STI, raw_ostream &O) {
209   if (AMDGPU::isGFX10(STI))
210     printNamedBit(MI, OpNo, O, "dlc");
211 }
212 
213 void AMDGPUInstPrinter::printGLC(const MCInst *MI, unsigned OpNo,
214                                  const MCSubtargetInfo &STI, raw_ostream &O) {
215   printNamedBit(MI, OpNo, O, "glc");
216 }
217 
218 void AMDGPUInstPrinter::printSLC(const MCInst *MI, unsigned OpNo,
219                                  const MCSubtargetInfo &STI, raw_ostream &O) {
220   printNamedBit(MI, OpNo, O, "slc");
221 }
222 
223 void AMDGPUInstPrinter::printSWZ(const MCInst *MI, unsigned OpNo,
224                                  const MCSubtargetInfo &STI, raw_ostream &O) {
225 }
226 
227 void AMDGPUInstPrinter::printTFE(const MCInst *MI, unsigned OpNo,
228                                  const MCSubtargetInfo &STI, raw_ostream &O) {
229   printNamedBit(MI, OpNo, O, "tfe");
230 }
231 
232 void AMDGPUInstPrinter::printDMask(const MCInst *MI, unsigned OpNo,
233                                    const MCSubtargetInfo &STI, raw_ostream &O) {
234   if (MI->getOperand(OpNo).getImm()) {
235     O << " dmask:";
236     printU16ImmOperand(MI, OpNo, STI, O);
237   }
238 }
239 
240 void AMDGPUInstPrinter::printDim(const MCInst *MI, unsigned OpNo,
241                                  const MCSubtargetInfo &STI, raw_ostream &O) {
242   unsigned Dim = MI->getOperand(OpNo).getImm();
243   O << " dim:SQ_RSRC_IMG_";
244 
245   const AMDGPU::MIMGDimInfo *DimInfo = AMDGPU::getMIMGDimInfoByEncoding(Dim);
246   if (DimInfo)
247     O << DimInfo->AsmSuffix;
248   else
249     O << Dim;
250 }
251 
252 void AMDGPUInstPrinter::printUNorm(const MCInst *MI, unsigned OpNo,
253                                    const MCSubtargetInfo &STI, raw_ostream &O) {
254   printNamedBit(MI, OpNo, O, "unorm");
255 }
256 
257 void AMDGPUInstPrinter::printDA(const MCInst *MI, unsigned OpNo,
258                                 const MCSubtargetInfo &STI, raw_ostream &O) {
259   printNamedBit(MI, OpNo, O, "da");
260 }
261 
262 void AMDGPUInstPrinter::printR128A16(const MCInst *MI, unsigned OpNo,
263                                   const MCSubtargetInfo &STI, raw_ostream &O) {
264   if (STI.hasFeature(AMDGPU::FeatureR128A16))
265     printNamedBit(MI, OpNo, O, "a16");
266   else
267     printNamedBit(MI, OpNo, O, "r128");
268 }
269 
270 void AMDGPUInstPrinter::printGFX10A16(const MCInst *MI, unsigned OpNo,
271                                   const MCSubtargetInfo &STI, raw_ostream &O) {
272   printNamedBit(MI, OpNo, O, "a16");
273 }
274 
275 void AMDGPUInstPrinter::printLWE(const MCInst *MI, unsigned OpNo,
276                                  const MCSubtargetInfo &STI, raw_ostream &O) {
277   printNamedBit(MI, OpNo, O, "lwe");
278 }
279 
280 void AMDGPUInstPrinter::printD16(const MCInst *MI, unsigned OpNo,
281                                  const MCSubtargetInfo &STI, raw_ostream &O) {
282   printNamedBit(MI, OpNo, O, "d16");
283 }
284 
285 void AMDGPUInstPrinter::printExpCompr(const MCInst *MI, unsigned OpNo,
286                                       const MCSubtargetInfo &STI,
287                                       raw_ostream &O) {
288   if (MI->getOperand(OpNo).getImm())
289     O << " compr";
290 }
291 
292 void AMDGPUInstPrinter::printExpVM(const MCInst *MI, unsigned OpNo,
293                                    const MCSubtargetInfo &STI,
294                                    raw_ostream &O) {
295   if (MI->getOperand(OpNo).getImm())
296     O << " vm";
297 }
298 
299 void AMDGPUInstPrinter::printFORMAT(const MCInst *MI, unsigned OpNo,
300                                     const MCSubtargetInfo &STI,
301                                     raw_ostream &O) {
302   using namespace llvm::AMDGPU::MTBUFFormat;
303 
304   unsigned Val = MI->getOperand(OpNo).getImm();
305   if (AMDGPU::isGFX10(STI)) {
306     if (Val == UFMT_DEFAULT)
307       return;
308     O << " format:" << Val;
309   } else {
310     if (Val == DFMT_NFMT_DEFAULT)
311       return;
312     unsigned Dfmt;
313     unsigned Nfmt;
314     decodeDfmtNfmt(Val, Dfmt, Nfmt);
315     O << " dfmt:" << Dfmt;
316     O << ", nfmt:" << Nfmt;
317   }
318   O << ',';
319 }
320 
321 void AMDGPUInstPrinter::printRegOperand(unsigned RegNo, raw_ostream &O,
322                                         const MCRegisterInfo &MRI) {
323 #if !defined(NDEBUG)
324   switch (RegNo) {
325   case AMDGPU::FP_REG:
326   case AMDGPU::SP_REG:
327   case AMDGPU::PRIVATE_RSRC_REG:
328     llvm_unreachable("pseudo-register should not ever be emitted");
329   case AMDGPU::SCC:
330     llvm_unreachable("pseudo scc should not ever be emitted");
331   default:
332     break;
333   }
334 #endif
335 
336   StringRef RegName(getRegisterName(RegNo));
337   if (!Keep16BitSuffixes)
338     if (!RegName.consume_back(".l"))
339       RegName.consume_back(".h");
340 
341   O << RegName;
342 }
343 
344 void AMDGPUInstPrinter::printVOPDst(const MCInst *MI, unsigned OpNo,
345                                     const MCSubtargetInfo &STI, raw_ostream &O) {
346   if (OpNo == 0) {
347     if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3)
348       O << "_e64 ";
349     else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::DPP)
350       O << "_dpp ";
351     else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::SDWA)
352       O << "_sdwa ";
353     else
354       O << "_e32 ";
355   }
356 
357   printOperand(MI, OpNo, STI, O);
358 
359   // Print default vcc/vcc_lo operand.
360   switch (MI->getOpcode()) {
361   default: break;
362 
363   case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
364   case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
365   case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
366   case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
367   case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
368   case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
369   case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
370   case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
371   case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
372   case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
373   case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
374   case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
375     printDefaultVccOperand(1, STI, O);
376     break;
377   }
378 }
379 
380 void AMDGPUInstPrinter::printVINTRPDst(const MCInst *MI, unsigned OpNo,
381                                        const MCSubtargetInfo &STI, raw_ostream &O) {
382   if (AMDGPU::isSI(STI) || AMDGPU::isCI(STI))
383     O << " ";
384   else
385     O << "_e32 ";
386 
387   printOperand(MI, OpNo, STI, O);
388 }
389 
390 void AMDGPUInstPrinter::printImmediateInt16(uint32_t Imm,
391                                             const MCSubtargetInfo &STI,
392                                             raw_ostream &O) {
393   int16_t SImm = static_cast<int16_t>(Imm);
394   if (isInlinableIntLiteral(SImm)) {
395     O << SImm;
396   } else {
397     uint64_t Imm16 = static_cast<uint16_t>(Imm);
398     O << formatHex(Imm16);
399   }
400 }
401 
402 void AMDGPUInstPrinter::printImmediate16(uint32_t Imm,
403                                          const MCSubtargetInfo &STI,
404                                          raw_ostream &O) {
405   int16_t SImm = static_cast<int16_t>(Imm);
406   if (isInlinableIntLiteral(SImm)) {
407     O << SImm;
408     return;
409   }
410 
411   if (Imm == 0x3C00)
412     O<< "1.0";
413   else if (Imm == 0xBC00)
414     O<< "-1.0";
415   else if (Imm == 0x3800)
416     O<< "0.5";
417   else if (Imm == 0xB800)
418     O<< "-0.5";
419   else if (Imm == 0x4000)
420     O<< "2.0";
421   else if (Imm == 0xC000)
422     O<< "-2.0";
423   else if (Imm == 0x4400)
424     O<< "4.0";
425   else if (Imm == 0xC400)
426     O<< "-4.0";
427   else if (Imm == 0x3118 &&
428            STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm]) {
429     O << "0.15915494";
430   } else {
431     uint64_t Imm16 = static_cast<uint16_t>(Imm);
432     O << formatHex(Imm16);
433   }
434 }
435 
436 void AMDGPUInstPrinter::printImmediateV216(uint32_t Imm,
437                                            const MCSubtargetInfo &STI,
438                                            raw_ostream &O) {
439   uint16_t Lo16 = static_cast<uint16_t>(Imm);
440   printImmediate16(Lo16, STI, O);
441 }
442 
443 void AMDGPUInstPrinter::printImmediate32(uint32_t Imm,
444                                          const MCSubtargetInfo &STI,
445                                          raw_ostream &O) {
446   int32_t SImm = static_cast<int32_t>(Imm);
447   if (SImm >= -16 && SImm <= 64) {
448     O << SImm;
449     return;
450   }
451 
452   if (Imm == FloatToBits(0.0f))
453     O << "0.0";
454   else if (Imm == FloatToBits(1.0f))
455     O << "1.0";
456   else if (Imm == FloatToBits(-1.0f))
457     O << "-1.0";
458   else if (Imm == FloatToBits(0.5f))
459     O << "0.5";
460   else if (Imm == FloatToBits(-0.5f))
461     O << "-0.5";
462   else if (Imm == FloatToBits(2.0f))
463     O << "2.0";
464   else if (Imm == FloatToBits(-2.0f))
465     O << "-2.0";
466   else if (Imm == FloatToBits(4.0f))
467     O << "4.0";
468   else if (Imm == FloatToBits(-4.0f))
469     O << "-4.0";
470   else if (Imm == 0x3e22f983 &&
471            STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
472     O << "0.15915494";
473   else
474     O << formatHex(static_cast<uint64_t>(Imm));
475 }
476 
477 void AMDGPUInstPrinter::printImmediate64(uint64_t Imm,
478                                          const MCSubtargetInfo &STI,
479                                          raw_ostream &O) {
480   int64_t SImm = static_cast<int64_t>(Imm);
481   if (SImm >= -16 && SImm <= 64) {
482     O << SImm;
483     return;
484   }
485 
486   if (Imm == DoubleToBits(0.0))
487     O << "0.0";
488   else if (Imm == DoubleToBits(1.0))
489     O << "1.0";
490   else if (Imm == DoubleToBits(-1.0))
491     O << "-1.0";
492   else if (Imm == DoubleToBits(0.5))
493     O << "0.5";
494   else if (Imm == DoubleToBits(-0.5))
495     O << "-0.5";
496   else if (Imm == DoubleToBits(2.0))
497     O << "2.0";
498   else if (Imm == DoubleToBits(-2.0))
499     O << "-2.0";
500   else if (Imm == DoubleToBits(4.0))
501     O << "4.0";
502   else if (Imm == DoubleToBits(-4.0))
503     O << "-4.0";
504   else if (Imm == 0x3fc45f306dc9c882 &&
505            STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
506     O << "0.15915494309189532";
507   else {
508     assert(isUInt<32>(Imm) || Imm == 0x3fc45f306dc9c882);
509 
510     // In rare situations, we will have a 32-bit literal in a 64-bit
511     // operand. This is technically allowed for the encoding of s_mov_b64.
512     O << formatHex(static_cast<uint64_t>(Imm));
513   }
514 }
515 
516 void AMDGPUInstPrinter::printBLGP(const MCInst *MI, unsigned OpNo,
517                                   const MCSubtargetInfo &STI,
518                                   raw_ostream &O) {
519   unsigned Imm = MI->getOperand(OpNo).getImm();
520   if (!Imm)
521     return;
522 
523   O << " blgp:" << Imm;
524 }
525 
526 void AMDGPUInstPrinter::printCBSZ(const MCInst *MI, unsigned OpNo,
527                                   const MCSubtargetInfo &STI,
528                                   raw_ostream &O) {
529   unsigned Imm = MI->getOperand(OpNo).getImm();
530   if (!Imm)
531     return;
532 
533   O << " cbsz:" << Imm;
534 }
535 
536 void AMDGPUInstPrinter::printABID(const MCInst *MI, unsigned OpNo,
537                                   const MCSubtargetInfo &STI,
538                                   raw_ostream &O) {
539   unsigned Imm = MI->getOperand(OpNo).getImm();
540   if (!Imm)
541     return;
542 
543   O << " abid:" << Imm;
544 }
545 
546 void AMDGPUInstPrinter::printDefaultVccOperand(unsigned OpNo,
547                                                const MCSubtargetInfo &STI,
548                                                raw_ostream &O) {
549   if (OpNo > 0)
550     O << ", ";
551   printRegOperand(STI.getFeatureBits()[AMDGPU::FeatureWavefrontSize64] ?
552                   AMDGPU::VCC : AMDGPU::VCC_LO, O, MRI);
553   if (OpNo == 0)
554     O << ", ";
555 }
556 
557 void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
558                                      const MCSubtargetInfo &STI,
559                                      raw_ostream &O) {
560   // Print default vcc/vcc_lo operand of VOPC.
561   const MCInstrDesc &Desc = MII.get(MI->getOpcode());
562   if (OpNo == 0 && (Desc.TSFlags & SIInstrFlags::VOPC) &&
563       (Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
564        Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO)))
565     printDefaultVccOperand(OpNo, STI, O);
566 
567   if (OpNo >= MI->getNumOperands()) {
568     O << "/*Missing OP" << OpNo << "*/";
569     return;
570   }
571 
572   const MCOperand &Op = MI->getOperand(OpNo);
573   if (Op.isReg()) {
574     printRegOperand(Op.getReg(), O, MRI);
575   } else if (Op.isImm()) {
576     const uint8_t OpTy = Desc.OpInfo[OpNo].OperandType;
577     switch (OpTy) {
578     case AMDGPU::OPERAND_REG_IMM_INT32:
579     case AMDGPU::OPERAND_REG_IMM_FP32:
580     case AMDGPU::OPERAND_REG_INLINE_C_INT32:
581     case AMDGPU::OPERAND_REG_INLINE_C_FP32:
582     case AMDGPU::OPERAND_REG_INLINE_AC_INT32:
583     case AMDGPU::OPERAND_REG_INLINE_AC_FP32:
584     case MCOI::OPERAND_IMMEDIATE:
585       printImmediate32(Op.getImm(), STI, O);
586       break;
587     case AMDGPU::OPERAND_REG_IMM_INT64:
588     case AMDGPU::OPERAND_REG_IMM_FP64:
589     case AMDGPU::OPERAND_REG_INLINE_C_INT64:
590     case AMDGPU::OPERAND_REG_INLINE_C_FP64:
591       printImmediate64(Op.getImm(), STI, O);
592       break;
593     case AMDGPU::OPERAND_REG_INLINE_C_INT16:
594     case AMDGPU::OPERAND_REG_INLINE_AC_INT16:
595     case AMDGPU::OPERAND_REG_IMM_INT16:
596       printImmediateInt16(Op.getImm(), STI, O);
597       break;
598     case AMDGPU::OPERAND_REG_INLINE_C_FP16:
599     case AMDGPU::OPERAND_REG_INLINE_AC_FP16:
600     case AMDGPU::OPERAND_REG_IMM_FP16:
601       printImmediate16(Op.getImm(), STI, O);
602       break;
603     case AMDGPU::OPERAND_REG_IMM_V2INT16:
604     case AMDGPU::OPERAND_REG_IMM_V2FP16:
605       if (!isUInt<16>(Op.getImm()) &&
606           STI.getFeatureBits()[AMDGPU::FeatureVOP3Literal]) {
607         printImmediate32(Op.getImm(), STI, O);
608         break;
609       }
610 
611       //  Deal with 16-bit FP inline immediates not working.
612       if (OpTy == AMDGPU::OPERAND_REG_IMM_V2FP16) {
613         printImmediate16(static_cast<uint16_t>(Op.getImm()), STI, O);
614         break;
615       }
616       LLVM_FALLTHROUGH;
617     case AMDGPU::OPERAND_REG_INLINE_C_V2INT16:
618     case AMDGPU::OPERAND_REG_INLINE_AC_V2INT16:
619       printImmediateInt16(static_cast<uint16_t>(Op.getImm()), STI, O);
620       break;
621     case AMDGPU::OPERAND_REG_INLINE_C_V2FP16:
622     case AMDGPU::OPERAND_REG_INLINE_AC_V2FP16:
623       printImmediateV216(Op.getImm(), STI, O);
624       break;
625     case MCOI::OPERAND_UNKNOWN:
626     case MCOI::OPERAND_PCREL:
627       O << formatDec(Op.getImm());
628       break;
629     case MCOI::OPERAND_REGISTER:
630       // FIXME: This should be removed and handled somewhere else. Seems to come
631       // from a disassembler bug.
632       O << "/*invalid immediate*/";
633       break;
634     default:
635       // We hit this for the immediate instruction bits that don't yet have a
636       // custom printer.
637       llvm_unreachable("unexpected immediate operand type");
638     }
639   } else if (Op.isFPImm()) {
640     // We special case 0.0 because otherwise it will be printed as an integer.
641     if (Op.getFPImm() == 0.0)
642       O << "0.0";
643     else {
644       const MCInstrDesc &Desc = MII.get(MI->getOpcode());
645       int RCID = Desc.OpInfo[OpNo].RegClass;
646       unsigned RCBits = AMDGPU::getRegBitWidth(MRI.getRegClass(RCID));
647       if (RCBits == 32)
648         printImmediate32(FloatToBits(Op.getFPImm()), STI, O);
649       else if (RCBits == 64)
650         printImmediate64(DoubleToBits(Op.getFPImm()), STI, O);
651       else
652         llvm_unreachable("Invalid register class size");
653     }
654   } else if (Op.isExpr()) {
655     const MCExpr *Exp = Op.getExpr();
656     Exp->print(O, &MAI);
657   } else {
658     O << "/*INV_OP*/";
659   }
660 
661   // Print default vcc/vcc_lo operand of v_cndmask_b32_e32.
662   switch (MI->getOpcode()) {
663   default: break;
664 
665   case AMDGPU::V_CNDMASK_B32_e32_gfx10:
666   case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
667   case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
668   case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
669   case AMDGPU::V_CNDMASK_B32_dpp_gfx10:
670   case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
671   case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
672   case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
673   case AMDGPU::V_CNDMASK_B32_dpp8_gfx10:
674   case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
675   case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
676   case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
677 
678   case AMDGPU::V_CNDMASK_B32_e32_gfx6_gfx7:
679   case AMDGPU::V_CNDMASK_B32_e32_vi:
680     if ((int)OpNo == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
681                                                 AMDGPU::OpName::src1))
682       printDefaultVccOperand(OpNo, STI, O);
683     break;
684   }
685 }
686 
687 void AMDGPUInstPrinter::printOperandAndFPInputMods(const MCInst *MI,
688                                                    unsigned OpNo,
689                                                    const MCSubtargetInfo &STI,
690                                                    raw_ostream &O) {
691   unsigned InputModifiers = MI->getOperand(OpNo).getImm();
692 
693   // Use 'neg(...)' instead of '-' to avoid ambiguity.
694   // This is important for integer literals because
695   // -1 is not the same value as neg(1).
696   bool NegMnemo = false;
697 
698   if (InputModifiers & SISrcMods::NEG) {
699     if (OpNo + 1 < MI->getNumOperands() &&
700         (InputModifiers & SISrcMods::ABS) == 0) {
701       const MCOperand &Op = MI->getOperand(OpNo + 1);
702       NegMnemo = Op.isImm() || Op.isFPImm();
703     }
704     if (NegMnemo) {
705       O << "neg(";
706     } else {
707       O << '-';
708     }
709   }
710 
711   if (InputModifiers & SISrcMods::ABS)
712     O << '|';
713   printOperand(MI, OpNo + 1, STI, O);
714   if (InputModifiers & SISrcMods::ABS)
715     O << '|';
716 
717   if (NegMnemo) {
718     O << ')';
719   }
720 }
721 
722 void AMDGPUInstPrinter::printOperandAndIntInputMods(const MCInst *MI,
723                                                     unsigned OpNo,
724                                                     const MCSubtargetInfo &STI,
725                                                     raw_ostream &O) {
726   unsigned InputModifiers = MI->getOperand(OpNo).getImm();
727   if (InputModifiers & SISrcMods::SEXT)
728     O << "sext(";
729   printOperand(MI, OpNo + 1, STI, O);
730   if (InputModifiers & SISrcMods::SEXT)
731     O << ')';
732 
733   // Print default vcc/vcc_lo operand of VOP2b.
734   switch (MI->getOpcode()) {
735   default: break;
736 
737   case AMDGPU::V_CNDMASK_B32_sdwa_gfx10:
738   case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
739   case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
740   case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
741     if ((int)OpNo + 1 == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
742                                                     AMDGPU::OpName::src1))
743       printDefaultVccOperand(OpNo, STI, O);
744     break;
745   }
746 }
747 
748 void AMDGPUInstPrinter::printDPP8(const MCInst *MI, unsigned OpNo,
749                                   const MCSubtargetInfo &STI,
750                                   raw_ostream &O) {
751   if (!AMDGPU::isGFX10(STI))
752     llvm_unreachable("dpp8 is not supported on ASICs earlier than GFX10");
753 
754   unsigned Imm = MI->getOperand(OpNo).getImm();
755   O << " dpp8:[" << formatDec(Imm & 0x7);
756   for (size_t i = 1; i < 8; ++i) {
757     O << ',' << formatDec((Imm >> (3 * i)) & 0x7);
758   }
759   O << ']';
760 }
761 
762 void AMDGPUInstPrinter::printDPPCtrl(const MCInst *MI, unsigned OpNo,
763                                      const MCSubtargetInfo &STI,
764                                      raw_ostream &O) {
765   using namespace AMDGPU::DPP;
766 
767   unsigned Imm = MI->getOperand(OpNo).getImm();
768   if (Imm <= DppCtrl::QUAD_PERM_LAST) {
769     O << " quad_perm:[";
770     O << formatDec(Imm & 0x3)         << ',';
771     O << formatDec((Imm & 0xc)  >> 2) << ',';
772     O << formatDec((Imm & 0x30) >> 4) << ',';
773     O << formatDec((Imm & 0xc0) >> 6) << ']';
774   } else if ((Imm >= DppCtrl::ROW_SHL_FIRST) &&
775              (Imm <= DppCtrl::ROW_SHL_LAST)) {
776     O << " row_shl:";
777     printU4ImmDecOperand(MI, OpNo, O);
778   } else if ((Imm >= DppCtrl::ROW_SHR_FIRST) &&
779              (Imm <= DppCtrl::ROW_SHR_LAST)) {
780     O << " row_shr:";
781     printU4ImmDecOperand(MI, OpNo, O);
782   } else if ((Imm >= DppCtrl::ROW_ROR_FIRST) &&
783              (Imm <= DppCtrl::ROW_ROR_LAST)) {
784     O << " row_ror:";
785     printU4ImmDecOperand(MI, OpNo, O);
786   } else if (Imm == DppCtrl::WAVE_SHL1) {
787     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
788       O << " /* wave_shl is not supported starting from GFX10 */";
789       return;
790     }
791     O << " wave_shl:1";
792   } else if (Imm == DppCtrl::WAVE_ROL1) {
793     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
794       O << " /* wave_rol is not supported starting from GFX10 */";
795       return;
796     }
797     O << " wave_rol:1";
798   } else if (Imm == DppCtrl::WAVE_SHR1) {
799     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
800       O << " /* wave_shr is not supported starting from GFX10 */";
801       return;
802     }
803     O << " wave_shr:1";
804   } else if (Imm == DppCtrl::WAVE_ROR1) {
805     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
806       O << " /* wave_ror is not supported starting from GFX10 */";
807       return;
808     }
809     O << " wave_ror:1";
810   } else if (Imm == DppCtrl::ROW_MIRROR) {
811     O << " row_mirror";
812   } else if (Imm == DppCtrl::ROW_HALF_MIRROR) {
813     O << " row_half_mirror";
814   } else if (Imm == DppCtrl::BCAST15) {
815     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
816       O << " /* row_bcast is not supported starting from GFX10 */";
817       return;
818     }
819     O << " row_bcast:15";
820   } else if (Imm == DppCtrl::BCAST31) {
821     if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
822       O << " /* row_bcast is not supported starting from GFX10 */";
823       return;
824     }
825     O << " row_bcast:31";
826   } else if ((Imm >= DppCtrl::ROW_SHARE_FIRST) &&
827              (Imm <= DppCtrl::ROW_SHARE_LAST)) {
828     if (!AMDGPU::isGFX10(STI)) {
829       O << " /* row_share is not supported on ASICs earlier than GFX10 */";
830       return;
831     }
832     O << " row_share:";
833     printU4ImmDecOperand(MI, OpNo, O);
834   } else if ((Imm >= DppCtrl::ROW_XMASK_FIRST) &&
835              (Imm <= DppCtrl::ROW_XMASK_LAST)) {
836     if (!AMDGPU::isGFX10(STI)) {
837       O << " /* row_xmask is not supported on ASICs earlier than GFX10 */";
838       return;
839     }
840     O << "row_xmask:";
841     printU4ImmDecOperand(MI, OpNo, O);
842   } else {
843     O << " /* Invalid dpp_ctrl value */";
844   }
845 }
846 
847 void AMDGPUInstPrinter::printRowMask(const MCInst *MI, unsigned OpNo,
848                                      const MCSubtargetInfo &STI,
849                                      raw_ostream &O) {
850   O << " row_mask:";
851   printU4ImmOperand(MI, OpNo, STI, O);
852 }
853 
854 void AMDGPUInstPrinter::printBankMask(const MCInst *MI, unsigned OpNo,
855                                       const MCSubtargetInfo &STI,
856                                       raw_ostream &O) {
857   O << " bank_mask:";
858   printU4ImmOperand(MI, OpNo, STI, O);
859 }
860 
861 void AMDGPUInstPrinter::printBoundCtrl(const MCInst *MI, unsigned OpNo,
862                                        const MCSubtargetInfo &STI,
863                                        raw_ostream &O) {
864   unsigned Imm = MI->getOperand(OpNo).getImm();
865   if (Imm) {
866     O << " bound_ctrl:0"; // XXX - this syntax is used in sp3
867   }
868 }
869 
870 void AMDGPUInstPrinter::printFI(const MCInst *MI, unsigned OpNo,
871                                 const MCSubtargetInfo &STI,
872                                 raw_ostream &O) {
873   using namespace llvm::AMDGPU::DPP;
874   unsigned Imm = MI->getOperand(OpNo).getImm();
875   if (Imm == DPP_FI_1 || Imm == DPP8_FI_1) {
876     O << " fi:1";
877   }
878 }
879 
880 void AMDGPUInstPrinter::printSDWASel(const MCInst *MI, unsigned OpNo,
881                                      raw_ostream &O) {
882   using namespace llvm::AMDGPU::SDWA;
883 
884   unsigned Imm = MI->getOperand(OpNo).getImm();
885   switch (Imm) {
886   case SdwaSel::BYTE_0: O << "BYTE_0"; break;
887   case SdwaSel::BYTE_1: O << "BYTE_1"; break;
888   case SdwaSel::BYTE_2: O << "BYTE_2"; break;
889   case SdwaSel::BYTE_3: O << "BYTE_3"; break;
890   case SdwaSel::WORD_0: O << "WORD_0"; break;
891   case SdwaSel::WORD_1: O << "WORD_1"; break;
892   case SdwaSel::DWORD: O << "DWORD"; break;
893   default: llvm_unreachable("Invalid SDWA data select operand");
894   }
895 }
896 
897 void AMDGPUInstPrinter::printSDWADstSel(const MCInst *MI, unsigned OpNo,
898                                         const MCSubtargetInfo &STI,
899                                         raw_ostream &O) {
900   O << "dst_sel:";
901   printSDWASel(MI, OpNo, O);
902 }
903 
904 void AMDGPUInstPrinter::printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
905                                          const MCSubtargetInfo &STI,
906                                          raw_ostream &O) {
907   O << "src0_sel:";
908   printSDWASel(MI, OpNo, O);
909 }
910 
911 void AMDGPUInstPrinter::printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
912                                          const MCSubtargetInfo &STI,
913                                          raw_ostream &O) {
914   O << "src1_sel:";
915   printSDWASel(MI, OpNo, O);
916 }
917 
918 void AMDGPUInstPrinter::printSDWADstUnused(const MCInst *MI, unsigned OpNo,
919                                            const MCSubtargetInfo &STI,
920                                            raw_ostream &O) {
921   using namespace llvm::AMDGPU::SDWA;
922 
923   O << "dst_unused:";
924   unsigned Imm = MI->getOperand(OpNo).getImm();
925   switch (Imm) {
926   case DstUnused::UNUSED_PAD: O << "UNUSED_PAD"; break;
927   case DstUnused::UNUSED_SEXT: O << "UNUSED_SEXT"; break;
928   case DstUnused::UNUSED_PRESERVE: O << "UNUSED_PRESERVE"; break;
929   default: llvm_unreachable("Invalid SDWA dest_unused operand");
930   }
931 }
932 
933 template <unsigned N>
934 void AMDGPUInstPrinter::printExpSrcN(const MCInst *MI, unsigned OpNo,
935                                      const MCSubtargetInfo &STI,
936                                      raw_ostream &O) {
937   unsigned Opc = MI->getOpcode();
938   int EnIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::en);
939   unsigned En = MI->getOperand(EnIdx).getImm();
940 
941   int ComprIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::compr);
942 
943   // If compr is set, print as src0, src0, src1, src1
944   if (MI->getOperand(ComprIdx).getImm()) {
945     if (N == 1 || N == 2)
946       --OpNo;
947     else if (N == 3)
948       OpNo -= 2;
949   }
950 
951   if (En & (1 << N))
952     printRegOperand(MI->getOperand(OpNo).getReg(), O, MRI);
953   else
954     O << "off";
955 }
956 
957 void AMDGPUInstPrinter::printExpSrc0(const MCInst *MI, unsigned OpNo,
958                                      const MCSubtargetInfo &STI,
959                                      raw_ostream &O) {
960   printExpSrcN<0>(MI, OpNo, STI, O);
961 }
962 
963 void AMDGPUInstPrinter::printExpSrc1(const MCInst *MI, unsigned OpNo,
964                                      const MCSubtargetInfo &STI,
965                                      raw_ostream &O) {
966   printExpSrcN<1>(MI, OpNo, STI, O);
967 }
968 
969 void AMDGPUInstPrinter::printExpSrc2(const MCInst *MI, unsigned OpNo,
970                                      const MCSubtargetInfo &STI,
971                                      raw_ostream &O) {
972   printExpSrcN<2>(MI, OpNo, STI, O);
973 }
974 
975 void AMDGPUInstPrinter::printExpSrc3(const MCInst *MI, unsigned OpNo,
976                                      const MCSubtargetInfo &STI,
977                                      raw_ostream &O) {
978   printExpSrcN<3>(MI, OpNo, STI, O);
979 }
980 
981 void AMDGPUInstPrinter::printExpTgt(const MCInst *MI, unsigned OpNo,
982                                     const MCSubtargetInfo &STI,
983                                     raw_ostream &O) {
984   // This is really a 6 bit field.
985   uint32_t Tgt = MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
986 
987   if (Tgt <= 7)
988     O << " mrt" << Tgt;
989   else if (Tgt == 8)
990     O << " mrtz";
991   else if (Tgt == 9)
992     O << " null";
993   else if ((Tgt >= 12 && Tgt <= 15) || (Tgt == 16 && AMDGPU::isGFX10(STI)))
994     O << " pos" << Tgt - 12;
995   else if (AMDGPU::isGFX10(STI) && Tgt == 20)
996     O << " prim";
997   else if (Tgt >= 32 && Tgt <= 63)
998     O << " param" << Tgt - 32;
999   else {
1000     // Reserved values 10, 11
1001     O << " invalid_target_" << Tgt;
1002   }
1003 }
1004 
1005 static bool allOpsDefaultValue(const int* Ops, int NumOps, int Mod,
1006                                bool IsPacked, bool HasDstSel) {
1007   int DefaultValue = IsPacked && (Mod == SISrcMods::OP_SEL_1);
1008 
1009   for (int I = 0; I < NumOps; ++I) {
1010     if (!!(Ops[I] & Mod) != DefaultValue)
1011       return false;
1012   }
1013 
1014   if (HasDstSel && (Ops[0] & SISrcMods::DST_OP_SEL) != 0)
1015     return false;
1016 
1017   return true;
1018 }
1019 
1020 void AMDGPUInstPrinter::printPackedModifier(const MCInst *MI,
1021                                             StringRef Name,
1022                                             unsigned Mod,
1023                                             raw_ostream &O) {
1024   unsigned Opc = MI->getOpcode();
1025   int NumOps = 0;
1026   int Ops[3];
1027 
1028   for (int OpName : { AMDGPU::OpName::src0_modifiers,
1029                       AMDGPU::OpName::src1_modifiers,
1030                       AMDGPU::OpName::src2_modifiers }) {
1031     int Idx = AMDGPU::getNamedOperandIdx(Opc, OpName);
1032     if (Idx == -1)
1033       break;
1034 
1035     Ops[NumOps++] = MI->getOperand(Idx).getImm();
1036   }
1037 
1038   const bool HasDstSel =
1039     NumOps > 0 &&
1040     Mod == SISrcMods::OP_SEL_0 &&
1041     MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3_OPSEL;
1042 
1043   const bool IsPacked =
1044     MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::IsPacked;
1045 
1046   if (allOpsDefaultValue(Ops, NumOps, Mod, IsPacked, HasDstSel))
1047     return;
1048 
1049   O << Name;
1050   for (int I = 0; I < NumOps; ++I) {
1051     if (I != 0)
1052       O << ',';
1053 
1054     O << !!(Ops[I] & Mod);
1055   }
1056 
1057   if (HasDstSel) {
1058     O << ',' << !!(Ops[0] & SISrcMods::DST_OP_SEL);
1059   }
1060 
1061   O << ']';
1062 }
1063 
1064 void AMDGPUInstPrinter::printOpSel(const MCInst *MI, unsigned,
1065                                    const MCSubtargetInfo &STI,
1066                                    raw_ostream &O) {
1067   unsigned Opc = MI->getOpcode();
1068   if (Opc == AMDGPU::V_PERMLANE16_B32_gfx10 ||
1069       Opc == AMDGPU::V_PERMLANEX16_B32_gfx10) {
1070     auto FIN = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src0_modifiers);
1071     auto BCN = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src1_modifiers);
1072     unsigned FI = !!(MI->getOperand(FIN).getImm() & SISrcMods::OP_SEL_0);
1073     unsigned BC = !!(MI->getOperand(BCN).getImm() & SISrcMods::OP_SEL_0);
1074     if (FI || BC)
1075       O << " op_sel:[" << FI << ',' << BC << ']';
1076     return;
1077   }
1078 
1079   printPackedModifier(MI, " op_sel:[", SISrcMods::OP_SEL_0, O);
1080 }
1081 
1082 void AMDGPUInstPrinter::printOpSelHi(const MCInst *MI, unsigned OpNo,
1083                                      const MCSubtargetInfo &STI,
1084                                      raw_ostream &O) {
1085   printPackedModifier(MI, " op_sel_hi:[", SISrcMods::OP_SEL_1, O);
1086 }
1087 
1088 void AMDGPUInstPrinter::printNegLo(const MCInst *MI, unsigned OpNo,
1089                                    const MCSubtargetInfo &STI,
1090                                    raw_ostream &O) {
1091   printPackedModifier(MI, " neg_lo:[", SISrcMods::NEG, O);
1092 }
1093 
1094 void AMDGPUInstPrinter::printNegHi(const MCInst *MI, unsigned OpNo,
1095                                    const MCSubtargetInfo &STI,
1096                                    raw_ostream &O) {
1097   printPackedModifier(MI, " neg_hi:[", SISrcMods::NEG_HI, O);
1098 }
1099 
1100 void AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,
1101                                         const MCSubtargetInfo &STI,
1102                                         raw_ostream &O) {
1103   unsigned Imm = MI->getOperand(OpNum).getImm();
1104   switch (Imm) {
1105   case 0:
1106     O << "p10";
1107     break;
1108   case 1:
1109     O << "p20";
1110     break;
1111   case 2:
1112     O << "p0";
1113     break;
1114   default:
1115     O << "invalid_param_" << Imm;
1116   }
1117 }
1118 
1119 void AMDGPUInstPrinter::printInterpAttr(const MCInst *MI, unsigned OpNum,
1120                                         const MCSubtargetInfo &STI,
1121                                         raw_ostream &O) {
1122   unsigned Attr = MI->getOperand(OpNum).getImm();
1123   O << "attr" << Attr;
1124 }
1125 
1126 void AMDGPUInstPrinter::printInterpAttrChan(const MCInst *MI, unsigned OpNum,
1127                                         const MCSubtargetInfo &STI,
1128                                         raw_ostream &O) {
1129   unsigned Chan = MI->getOperand(OpNum).getImm();
1130   O << '.' << "xyzw"[Chan & 0x3];
1131 }
1132 
1133 void AMDGPUInstPrinter::printVGPRIndexMode(const MCInst *MI, unsigned OpNo,
1134                                            const MCSubtargetInfo &STI,
1135                                            raw_ostream &O) {
1136   using namespace llvm::AMDGPU::VGPRIndexMode;
1137   unsigned Val = MI->getOperand(OpNo).getImm();
1138 
1139   if ((Val & ~ENABLE_MASK) != 0) {
1140     O << " " << formatHex(static_cast<uint64_t>(Val));
1141   } else {
1142     O << " gpr_idx(";
1143     bool NeedComma = false;
1144     for (unsigned ModeId = ID_MIN; ModeId <= ID_MAX; ++ModeId) {
1145       if (Val & (1 << ModeId)) {
1146         if (NeedComma)
1147           O << ',';
1148         O << IdSymbolic[ModeId];
1149         NeedComma = true;
1150       }
1151     }
1152     O << ')';
1153   }
1154 }
1155 
1156 void AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
1157                                         const MCSubtargetInfo &STI,
1158                                         raw_ostream &O) {
1159   printOperand(MI, OpNo, STI, O);
1160   O  << ", ";
1161   printOperand(MI, OpNo + 1, STI, O);
1162 }
1163 
1164 void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
1165                                    raw_ostream &O, StringRef Asm,
1166                                    StringRef Default) {
1167   const MCOperand &Op = MI->getOperand(OpNo);
1168   assert(Op.isImm());
1169   if (Op.getImm() == 1) {
1170     O << Asm;
1171   } else {
1172     O << Default;
1173   }
1174 }
1175 
1176 void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
1177                                    raw_ostream &O, char Asm) {
1178   const MCOperand &Op = MI->getOperand(OpNo);
1179   assert(Op.isImm());
1180   if (Op.getImm() == 1)
1181     O << Asm;
1182 }
1183 
1184 void AMDGPUInstPrinter::printHigh(const MCInst *MI, unsigned OpNo,
1185                                   const MCSubtargetInfo &STI,
1186                                   raw_ostream &O) {
1187   if (MI->getOperand(OpNo).getImm())
1188     O << " high";
1189 }
1190 
1191 void AMDGPUInstPrinter::printClampSI(const MCInst *MI, unsigned OpNo,
1192                                      const MCSubtargetInfo &STI,
1193                                      raw_ostream &O) {
1194   if (MI->getOperand(OpNo).getImm())
1195     O << " clamp";
1196 }
1197 
1198 void AMDGPUInstPrinter::printOModSI(const MCInst *MI, unsigned OpNo,
1199                                     const MCSubtargetInfo &STI,
1200                                     raw_ostream &O) {
1201   int Imm = MI->getOperand(OpNo).getImm();
1202   if (Imm == SIOutMods::MUL2)
1203     O << " mul:2";
1204   else if (Imm == SIOutMods::MUL4)
1205     O << " mul:4";
1206   else if (Imm == SIOutMods::DIV2)
1207     O << " div:2";
1208 }
1209 
1210 void AMDGPUInstPrinter::printSendMsg(const MCInst *MI, unsigned OpNo,
1211                                      const MCSubtargetInfo &STI,
1212                                      raw_ostream &O) {
1213   using namespace llvm::AMDGPU::SendMsg;
1214 
1215   const unsigned Imm16 = MI->getOperand(OpNo).getImm();
1216 
1217   uint16_t MsgId;
1218   uint16_t OpId;
1219   uint16_t StreamId;
1220   decodeMsg(Imm16, MsgId, OpId, StreamId);
1221 
1222   if (isValidMsgId(MsgId, STI) &&
1223       isValidMsgOp(MsgId, OpId) &&
1224       isValidMsgStream(MsgId, OpId, StreamId)) {
1225     O << "sendmsg(" << getMsgName(MsgId);
1226     if (msgRequiresOp(MsgId)) {
1227       O << ", " << getMsgOpName(MsgId, OpId);
1228       if (msgSupportsStream(MsgId, OpId)) {
1229         O << ", " << StreamId;
1230       }
1231     }
1232     O << ')';
1233   } else if (encodeMsg(MsgId, OpId, StreamId) == Imm16) {
1234     O << "sendmsg(" << MsgId << ", " << OpId << ", " << StreamId << ')';
1235   } else {
1236     O << Imm16; // Unknown imm16 code.
1237   }
1238 }
1239 
1240 static void printSwizzleBitmask(const uint16_t AndMask,
1241                                 const uint16_t OrMask,
1242                                 const uint16_t XorMask,
1243                                 raw_ostream &O) {
1244   using namespace llvm::AMDGPU::Swizzle;
1245 
1246   uint16_t Probe0 = ((0            & AndMask) | OrMask) ^ XorMask;
1247   uint16_t Probe1 = ((BITMASK_MASK & AndMask) | OrMask) ^ XorMask;
1248 
1249   O << "\"";
1250 
1251   for (unsigned Mask = 1 << (BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
1252     uint16_t p0 = Probe0 & Mask;
1253     uint16_t p1 = Probe1 & Mask;
1254 
1255     if (p0 == p1) {
1256       if (p0 == 0) {
1257         O << "0";
1258       } else {
1259         O << "1";
1260       }
1261     } else {
1262       if (p0 == 0) {
1263         O << "p";
1264       } else {
1265         O << "i";
1266       }
1267     }
1268   }
1269 
1270   O << "\"";
1271 }
1272 
1273 void AMDGPUInstPrinter::printSwizzle(const MCInst *MI, unsigned OpNo,
1274                                      const MCSubtargetInfo &STI,
1275                                      raw_ostream &O) {
1276   using namespace llvm::AMDGPU::Swizzle;
1277 
1278   uint16_t Imm = MI->getOperand(OpNo).getImm();
1279   if (Imm == 0) {
1280     return;
1281   }
1282 
1283   O << " offset:";
1284 
1285   if ((Imm & QUAD_PERM_ENC_MASK) == QUAD_PERM_ENC) {
1286 
1287     O << "swizzle(" << IdSymbolic[ID_QUAD_PERM];
1288     for (unsigned I = 0; I < LANE_NUM; ++I) {
1289       O << ",";
1290       O << formatDec(Imm & LANE_MASK);
1291       Imm >>= LANE_SHIFT;
1292     }
1293     O << ")";
1294 
1295   } else if ((Imm & BITMASK_PERM_ENC_MASK) == BITMASK_PERM_ENC) {
1296 
1297     uint16_t AndMask = (Imm >> BITMASK_AND_SHIFT) & BITMASK_MASK;
1298     uint16_t OrMask  = (Imm >> BITMASK_OR_SHIFT)  & BITMASK_MASK;
1299     uint16_t XorMask = (Imm >> BITMASK_XOR_SHIFT) & BITMASK_MASK;
1300 
1301     if (AndMask == BITMASK_MAX &&
1302         OrMask == 0 &&
1303         countPopulation(XorMask) == 1) {
1304 
1305       O << "swizzle(" << IdSymbolic[ID_SWAP];
1306       O << ",";
1307       O << formatDec(XorMask);
1308       O << ")";
1309 
1310     } else if (AndMask == BITMASK_MAX &&
1311                OrMask == 0 && XorMask > 0 &&
1312                isPowerOf2_64(XorMask + 1)) {
1313 
1314       O << "swizzle(" << IdSymbolic[ID_REVERSE];
1315       O << ",";
1316       O << formatDec(XorMask + 1);
1317       O << ")";
1318 
1319     } else {
1320 
1321       uint16_t GroupSize = BITMASK_MAX - AndMask + 1;
1322       if (GroupSize > 1 &&
1323           isPowerOf2_64(GroupSize) &&
1324           OrMask < GroupSize &&
1325           XorMask == 0) {
1326 
1327         O << "swizzle(" << IdSymbolic[ID_BROADCAST];
1328         O << ",";
1329         O << formatDec(GroupSize);
1330         O << ",";
1331         O << formatDec(OrMask);
1332         O << ")";
1333 
1334       } else {
1335         O << "swizzle(" << IdSymbolic[ID_BITMASK_PERM];
1336         O << ",";
1337         printSwizzleBitmask(AndMask, OrMask, XorMask, O);
1338         O << ")";
1339       }
1340     }
1341   } else {
1342     printU16ImmDecOperand(MI, OpNo, O);
1343   }
1344 }
1345 
1346 void AMDGPUInstPrinter::printWaitFlag(const MCInst *MI, unsigned OpNo,
1347                                       const MCSubtargetInfo &STI,
1348                                       raw_ostream &O) {
1349   AMDGPU::IsaVersion ISA = AMDGPU::getIsaVersion(STI.getCPU());
1350 
1351   unsigned SImm16 = MI->getOperand(OpNo).getImm();
1352   unsigned Vmcnt, Expcnt, Lgkmcnt;
1353   decodeWaitcnt(ISA, SImm16, Vmcnt, Expcnt, Lgkmcnt);
1354 
1355   bool NeedSpace = false;
1356 
1357   if (Vmcnt != getVmcntBitMask(ISA)) {
1358     O << "vmcnt(" << Vmcnt << ')';
1359     NeedSpace = true;
1360   }
1361 
1362   if (Expcnt != getExpcntBitMask(ISA)) {
1363     if (NeedSpace)
1364       O << ' ';
1365     O << "expcnt(" << Expcnt << ')';
1366     NeedSpace = true;
1367   }
1368 
1369   if (Lgkmcnt != getLgkmcntBitMask(ISA)) {
1370     if (NeedSpace)
1371       O << ' ';
1372     O << "lgkmcnt(" << Lgkmcnt << ')';
1373   }
1374 }
1375 
1376 void AMDGPUInstPrinter::printHwreg(const MCInst *MI, unsigned OpNo,
1377                                    const MCSubtargetInfo &STI, raw_ostream &O) {
1378   unsigned Id;
1379   unsigned Offset;
1380   unsigned Width;
1381 
1382   using namespace llvm::AMDGPU::Hwreg;
1383   unsigned Val = MI->getOperand(OpNo).getImm();
1384   decodeHwreg(Val, Id, Offset, Width);
1385   StringRef HwRegName = getHwreg(Id, STI);
1386 
1387   O << "hwreg(";
1388   if (!HwRegName.empty()) {
1389     O << HwRegName;
1390   } else {
1391     O << Id;
1392   }
1393   if (Width != WIDTH_DEFAULT_ || Offset != OFFSET_DEFAULT_) {
1394     O << ", " << Offset << ", " << Width;
1395   }
1396   O << ')';
1397 }
1398 
1399 void AMDGPUInstPrinter::printEndpgm(const MCInst *MI, unsigned OpNo,
1400                                     const MCSubtargetInfo &STI,
1401                                     raw_ostream &O) {
1402   uint16_t Imm = MI->getOperand(OpNo).getImm();
1403   if (Imm == 0) {
1404     return;
1405   }
1406 
1407   O << ' ' << formatDec(Imm);
1408 }
1409 
1410 #include "AMDGPUGenAsmWriter.inc"
1411 
1412 void R600InstPrinter::printInst(const MCInst *MI, uint64_t Address,
1413                                 StringRef Annot, const MCSubtargetInfo &STI,
1414                                 raw_ostream &O) {
1415   O.flush();
1416   printInstruction(MI, Address, O);
1417   printAnnotation(O, Annot);
1418 }
1419 
1420 void R600InstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
1421                                raw_ostream &O) {
1422   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '|');
1423 }
1424 
1425 void R600InstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
1426                                        raw_ostream &O) {
1427   int BankSwizzle = MI->getOperand(OpNo).getImm();
1428   switch (BankSwizzle) {
1429   case 1:
1430     O << "BS:VEC_021/SCL_122";
1431     break;
1432   case 2:
1433     O << "BS:VEC_120/SCL_212";
1434     break;
1435   case 3:
1436     O << "BS:VEC_102/SCL_221";
1437     break;
1438   case 4:
1439     O << "BS:VEC_201";
1440     break;
1441   case 5:
1442     O << "BS:VEC_210";
1443     break;
1444   default:
1445     break;
1446   }
1447 }
1448 
1449 void R600InstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
1450                                  raw_ostream &O) {
1451   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "_SAT");
1452 }
1453 
1454 void R600InstPrinter::printCT(const MCInst *MI, unsigned OpNo,
1455                                 raw_ostream &O) {
1456   unsigned CT = MI->getOperand(OpNo).getImm();
1457   switch (CT) {
1458   case 0:
1459     O << 'U';
1460     break;
1461   case 1:
1462     O << 'N';
1463     break;
1464   default:
1465     break;
1466   }
1467 }
1468 
1469 void R600InstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
1470                                   raw_ostream &O) {
1471   int KCacheMode = MI->getOperand(OpNo).getImm();
1472   if (KCacheMode > 0) {
1473     int KCacheBank = MI->getOperand(OpNo - 2).getImm();
1474     O << "CB" << KCacheBank << ':';
1475     int KCacheAddr = MI->getOperand(OpNo + 2).getImm();
1476     int LineSize = (KCacheMode == 1) ? 16 : 32;
1477     O << KCacheAddr * 16 << '-' << KCacheAddr * 16 + LineSize;
1478   }
1479 }
1480 
1481 void R600InstPrinter::printLast(const MCInst *MI, unsigned OpNo,
1482                                 raw_ostream &O) {
1483   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "*", " ");
1484 }
1485 
1486 void R600InstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
1487                                    raw_ostream &O) {
1488   const MCOperand &Op = MI->getOperand(OpNo);
1489   assert(Op.isImm() || Op.isExpr());
1490   if (Op.isImm()) {
1491     int64_t Imm = Op.getImm();
1492     O << Imm << '(' << BitsToFloat(Imm) << ')';
1493   }
1494   if (Op.isExpr()) {
1495     Op.getExpr()->print(O << '@', &MAI);
1496   }
1497 }
1498 
1499 void R600InstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
1500                                raw_ostream &O) {
1501   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '-');
1502 }
1503 
1504 void R600InstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
1505                                 raw_ostream &O) {
1506   switch (MI->getOperand(OpNo).getImm()) {
1507   default: break;
1508   case 1:
1509     O << " * 2.0";
1510     break;
1511   case 2:
1512     O << " * 4.0";
1513     break;
1514   case 3:
1515     O << " / 2.0";
1516     break;
1517   }
1518 }
1519 
1520 void R600InstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
1521                                       raw_ostream &O) {
1522   printOperand(MI, OpNo, O);
1523   O  << ", ";
1524   printOperand(MI, OpNo + 1, O);
1525 }
1526 
1527 void R600InstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
1528                                    raw_ostream &O) {
1529   if (OpNo >= MI->getNumOperands()) {
1530     O << "/*Missing OP" << OpNo << "*/";
1531     return;
1532   }
1533 
1534   const MCOperand &Op = MI->getOperand(OpNo);
1535   if (Op.isReg()) {
1536     switch (Op.getReg()) {
1537     // This is the default predicate state, so we don't need to print it.
1538     case R600::PRED_SEL_OFF:
1539       break;
1540 
1541     default:
1542       O << getRegisterName(Op.getReg());
1543       break;
1544     }
1545   } else if (Op.isImm()) {
1546       O << Op.getImm();
1547   } else if (Op.isFPImm()) {
1548     // We special case 0.0 because otherwise it will be printed as an integer.
1549     if (Op.getFPImm() == 0.0)
1550       O << "0.0";
1551     else {
1552       O << Op.getFPImm();
1553     }
1554   } else if (Op.isExpr()) {
1555     const MCExpr *Exp = Op.getExpr();
1556     Exp->print(O, &MAI);
1557   } else {
1558     O << "/*INV_OP*/";
1559   }
1560 }
1561 
1562 void R600InstPrinter::printRel(const MCInst *MI, unsigned OpNo,
1563                                raw_ostream &O) {
1564   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '+');
1565 }
1566 
1567 void R600InstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
1568                                   raw_ostream &O) {
1569   unsigned Sel = MI->getOperand(OpNo).getImm();
1570   switch (Sel) {
1571   case 0:
1572     O << 'X';
1573     break;
1574   case 1:
1575     O << 'Y';
1576     break;
1577   case 2:
1578     O << 'Z';
1579     break;
1580   case 3:
1581     O << 'W';
1582     break;
1583   case 4:
1584     O << '0';
1585     break;
1586   case 5:
1587     O << '1';
1588     break;
1589   case 7:
1590     O << '_';
1591     break;
1592   default:
1593     break;
1594   }
1595 }
1596 
1597 void R600InstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
1598                                           raw_ostream &O) {
1599   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "ExecMask,");
1600 }
1601 
1602 void R600InstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
1603                                       raw_ostream &O) {
1604   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "Pred,");
1605 }
1606 
1607 void R600InstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
1608                                  raw_ostream &O) {
1609   const MCOperand &Op = MI->getOperand(OpNo);
1610   if (Op.getImm() == 0) {
1611     O << " (MASKED)";
1612   }
1613 }
1614 
1615 #include "R600GenAsmWriter.inc"
1616