LCOV - code coverage report
Current view: top level - lib/Target/AMDGPU/InstPrinter - AMDGPUInstPrinter.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 755 827 91.3 %
Date: 2018-06-17 00:07:59 Functions: 107 112 95.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : // \file
       9             : //===----------------------------------------------------------------------===//
      10             : 
      11             : #include "AMDGPUInstPrinter.h"
      12             : #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
      13             : #include "SIDefines.h"
      14             : #include "Utils/AMDGPUAsmUtils.h"
      15             : #include "Utils/AMDGPUBaseInfo.h"
      16             : #include "llvm/MC/MCExpr.h"
      17             : #include "llvm/MC/MCInst.h"
      18             : #include "llvm/MC/MCInstrDesc.h"
      19             : #include "llvm/MC/MCInstrInfo.h"
      20             : #include "llvm/MC/MCRegisterInfo.h"
      21             : #include "llvm/MC/MCSubtargetInfo.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      648507 : void AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
      31             :                                   StringRef Annot, const MCSubtargetInfo &STI) {
      32             :   OS.flush();
      33      648507 :   printInstruction(MI, STI, OS);
      34      648507 :   printAnnotation(OS, Annot);
      35      648507 : }
      36             : 
      37       30406 : void AMDGPUInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,
      38             :                                           const MCSubtargetInfo &STI,
      39             :                                           raw_ostream &O) {
      40       60812 :   O << formatHex(MI->getOperand(OpNo).getImm() & 0xf);
      41       30406 : }
      42             : 
      43           0 : void AMDGPUInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,
      44             :                                           raw_ostream &O) {
      45           0 :   O << formatHex(MI->getOperand(OpNo).getImm() & 0xff);
      46           0 : }
      47             : 
      48        7808 : void AMDGPUInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
      49             :                                            const MCSubtargetInfo &STI,
      50             :                                            raw_ostream &O) {
      51             :   // It's possible to end up with a 32-bit literal used with a 16-bit operand
      52             :   // with ignored high bits. Print as 32-bit anyway in that case.
      53        7808 :   int64_t Imm = MI->getOperand(OpNo).getImm();
      54        7808 :   if (isInt<16>(Imm) || isUInt<16>(Imm))
      55        7804 :     O << formatHex(static_cast<uint64_t>(Imm & 0xffff));
      56             :   else
      57           4 :     printU32ImmOperand(MI, OpNo, STI, O);
      58        7808 : }
      59             : 
      60        3591 : void AMDGPUInstPrinter::printU4ImmDecOperand(const MCInst *MI, unsigned OpNo,
      61             :                                              raw_ostream &O) {
      62        7182 :   O << formatDec(MI->getOperand(OpNo).getImm() & 0xf);
      63        3591 : }
      64             : 
      65        7931 : void AMDGPUInstPrinter::printU8ImmDecOperand(const MCInst *MI, unsigned OpNo,
      66             :                                              raw_ostream &O) {
      67       15862 :   O << formatDec(MI->getOperand(OpNo).getImm() & 0xff);
      68        7931 : }
      69             : 
      70       30668 : void AMDGPUInstPrinter::printU16ImmDecOperand(const MCInst *MI, unsigned OpNo,
      71             :                                               raw_ostream &O) {
      72       61336 :   O << formatDec(MI->getOperand(OpNo).getImm() & 0xffff);
      73       30668 : }
      74             : 
      75        1487 : void AMDGPUInstPrinter::printS13ImmDecOperand(const MCInst *MI, unsigned OpNo,
      76             :                                               raw_ostream &O) {
      77        4461 :   O << formatDec(SignExtend32<13>(MI->getOperand(OpNo).getImm()));
      78        1487 : }
      79             : 
      80       34027 : void AMDGPUInstPrinter::printU32ImmOperand(const MCInst *MI, unsigned OpNo,
      81             :                                            const MCSubtargetInfo &STI,
      82             :                                            raw_ostream &O) {
      83       68054 :   O << formatHex(MI->getOperand(OpNo).getImm() & 0xffffffff);
      84       34027 : }
      85             : 
      86      231776 : void AMDGPUInstPrinter::printNamedBit(const MCInst *MI, unsigned OpNo,
      87             :                                       raw_ostream &O, StringRef BitName) {
      88      231776 :   if (MI->getOperand(OpNo).getImm()) {
      89        6471 :     O << ' ' << BitName;
      90             :   }
      91      231776 : }
      92             : 
      93           0 : void AMDGPUInstPrinter::printOffen(const MCInst *MI, unsigned OpNo,
      94             :                                    raw_ostream &O) {
      95           0 :   printNamedBit(MI, OpNo, O, "offen");
      96           0 : }
      97             : 
      98           0 : void AMDGPUInstPrinter::printIdxen(const MCInst *MI, unsigned OpNo,
      99             :                                    raw_ostream &O) {
     100           0 :   printNamedBit(MI, OpNo, O, "idxen");
     101           0 : }
     102             : 
     103           0 : void AMDGPUInstPrinter::printAddr64(const MCInst *MI, unsigned OpNo,
     104             :                                     raw_ostream &O) {
     105           0 :   printNamedBit(MI, OpNo, O, "addr64");
     106           0 : }
     107             : 
     108           0 : void AMDGPUInstPrinter::printMBUFOffset(const MCInst *MI, unsigned OpNo,
     109             :                                         raw_ostream &O) {
     110           0 :   if (MI->getOperand(OpNo).getImm()) {
     111           0 :     O << " offset:";
     112           0 :     printU16ImmDecOperand(MI, OpNo, O);
     113             :   }
     114           0 : }
     115             : 
     116       63033 : void AMDGPUInstPrinter::printOffset(const MCInst *MI, unsigned OpNo,
     117             :                                     const MCSubtargetInfo &STI,
     118             :                                     raw_ostream &O) {
     119       63033 :   uint16_t Imm = MI->getOperand(OpNo).getImm();
     120       63033 :   if (Imm != 0) {
     121       30645 :     O << ((OpNo == 0)? "offset:" : " offset:");
     122       30645 :     printU16ImmDecOperand(MI, OpNo, O);
     123             :   }
     124       63033 : }
     125             : 
     126        4077 : void AMDGPUInstPrinter::printOffsetS13(const MCInst *MI, unsigned OpNo,
     127             :                                        const MCSubtargetInfo &STI,
     128             :                                        raw_ostream &O) {
     129        4077 :   uint16_t Imm = MI->getOperand(OpNo).getImm();
     130        4077 :   if (Imm != 0) {
     131        1487 :     O << ((OpNo == 0)? "offset:" : " offset:");
     132        1487 :     printS13ImmDecOperand(MI, OpNo, O);
     133             :   }
     134        4077 : }
     135             : 
     136        4458 : void AMDGPUInstPrinter::printOffset0(const MCInst *MI, unsigned OpNo,
     137             :                                      const MCSubtargetInfo &STI,
     138             :                                      raw_ostream &O) {
     139        4458 :   if (MI->getOperand(OpNo).getImm()) {
     140        3351 :     O << " offset0:";
     141        3351 :     printU8ImmDecOperand(MI, OpNo, O);
     142             :   }
     143        4458 : }
     144             : 
     145        4458 : void AMDGPUInstPrinter::printOffset1(const MCInst *MI, unsigned OpNo,
     146             :                                      const MCSubtargetInfo &STI,
     147             :                                      raw_ostream &O) {
     148        4458 :   if (MI->getOperand(OpNo).getImm()) {
     149        4226 :     O << " offset1:";
     150        4226 :     printU8ImmDecOperand(MI, OpNo, O);
     151             :   }
     152        4458 : }
     153             : 
     154       15550 : void AMDGPUInstPrinter::printSMRDOffset8(const MCInst *MI, unsigned OpNo,
     155             :                                         const MCSubtargetInfo &STI,
     156             :                                         raw_ostream &O) {
     157       15550 :   printU32ImmOperand(MI, OpNo, STI, O);
     158       15550 : }
     159             : 
     160       18272 : void AMDGPUInstPrinter::printSMRDOffset20(const MCInst *MI, unsigned OpNo,
     161             :                                         const MCSubtargetInfo &STI,
     162             :                                         raw_ostream &O) {
     163       18272 :   printU32ImmOperand(MI, OpNo, STI, O);
     164       18272 : }
     165             : 
     166          39 : void AMDGPUInstPrinter::printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
     167             :                                                const MCSubtargetInfo &STI,
     168             :                                                raw_ostream &O) {
     169          39 :   printU32ImmOperand(MI, OpNo, STI, O);
     170          39 : }
     171             : 
     172       15305 : void AMDGPUInstPrinter::printGDS(const MCInst *MI, unsigned OpNo,
     173             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     174       15305 :   printNamedBit(MI, OpNo, O, "gds");
     175       15305 : }
     176             : 
     177       91400 : void AMDGPUInstPrinter::printGLC(const MCInst *MI, unsigned OpNo,
     178             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     179       91400 :   printNamedBit(MI, OpNo, O, "glc");
     180       91400 : }
     181             : 
     182       61347 : void AMDGPUInstPrinter::printSLC(const MCInst *MI, unsigned OpNo,
     183             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     184       61347 :   printNamedBit(MI, OpNo, O, "slc");
     185       61347 : }
     186             : 
     187       43228 : void AMDGPUInstPrinter::printTFE(const MCInst *MI, unsigned OpNo,
     188             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     189       43228 :   printNamedBit(MI, OpNo, O, "tfe");
     190       43228 : }
     191             : 
     192        5124 : void AMDGPUInstPrinter::printDMask(const MCInst *MI, unsigned OpNo,
     193             :                                    const MCSubtargetInfo &STI, raw_ostream &O) {
     194        5124 :   if (MI->getOperand(OpNo).getImm()) {
     195        4842 :     O << " dmask:";
     196        4842 :     printU16ImmOperand(MI, OpNo, STI, O);
     197             :   }
     198        5124 : }
     199             : 
     200        5124 : void AMDGPUInstPrinter::printUNorm(const MCInst *MI, unsigned OpNo,
     201             :                                    const MCSubtargetInfo &STI, raw_ostream &O) {
     202        5124 :   printNamedBit(MI, OpNo, O, "unorm");
     203        5124 : }
     204             : 
     205        5124 : void AMDGPUInstPrinter::printDA(const MCInst *MI, unsigned OpNo,
     206             :                                 const MCSubtargetInfo &STI, raw_ostream &O) {
     207        5124 :   printNamedBit(MI, OpNo, O, "da");
     208        5124 : }
     209             : 
     210        5124 : void AMDGPUInstPrinter::printR128(const MCInst *MI, unsigned OpNo,
     211             :                                   const MCSubtargetInfo &STI, raw_ostream &O) {
     212        5124 :   printNamedBit(MI, OpNo, O, "r128");
     213        5124 : }
     214             : 
     215        5124 : void AMDGPUInstPrinter::printLWE(const MCInst *MI, unsigned OpNo,
     216             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     217        5124 :   printNamedBit(MI, OpNo, O, "lwe");
     218        5124 : }
     219             : 
     220         687 : void AMDGPUInstPrinter::printExpCompr(const MCInst *MI, unsigned OpNo,
     221             :                                       const MCSubtargetInfo &STI,
     222             :                                       raw_ostream &O) {
     223         687 :   if (MI->getOperand(OpNo).getImm())
     224         113 :     O << " compr";
     225         687 : }
     226             : 
     227         687 : void AMDGPUInstPrinter::printExpVM(const MCInst *MI, unsigned OpNo,
     228             :                                    const MCSubtargetInfo &STI,
     229             :                                    raw_ostream &O) {
     230         687 :   if (MI->getOperand(OpNo).getImm())
     231         156 :     O << " vm";
     232         687 : }
     233             : 
     234         177 : void AMDGPUInstPrinter::printDFMT(const MCInst *MI, unsigned OpNo,
     235             :                                   const MCSubtargetInfo &STI,
     236             :                                   raw_ostream &O) {
     237         177 :   if (MI->getOperand(OpNo).getImm()) {
     238         177 :     O << " dfmt:";
     239         177 :     printU8ImmDecOperand(MI, OpNo, O);
     240             :   }
     241         177 : }
     242             : 
     243         177 : void AMDGPUInstPrinter::printNFMT(const MCInst *MI, unsigned OpNo,
     244             :                                   const MCSubtargetInfo &STI,
     245             :                                   raw_ostream &O) {
     246         177 :   if (MI->getOperand(OpNo).getImm()) {
     247         177 :     O << " nfmt:";
     248         177 :     printU8ImmDecOperand(MI, OpNo, O);
     249             :   }
     250         177 : }
     251             : 
     252     1178902 : void AMDGPUInstPrinter::printRegOperand(unsigned RegNo, raw_ostream &O,
     253             :                                         const MCRegisterInfo &MRI) {
     254     1178902 :   switch (RegNo) {
     255        7559 :   case AMDGPU::VCC:
     256        7559 :     O << "vcc";
     257        7559 :     return;
     258           0 :   case AMDGPU::SCC:
     259           0 :     O << "scc";
     260           0 :     return;
     261        4896 :   case AMDGPU::EXEC:
     262        4896 :     O << "exec";
     263        4896 :     return;
     264        9559 :   case AMDGPU::M0:
     265        9559 :     O << "m0";
     266        9559 :     return;
     267           0 :   case AMDGPU::FLAT_SCR:
     268           0 :     O << "flat_scratch";
     269           0 :     return;
     270           4 :   case AMDGPU::XNACK_MASK:
     271           4 :     O << "xnack_mask";
     272           4 :     return;
     273        7136 :   case AMDGPU::VCC_LO:
     274        7136 :     O << "vcc_lo";
     275        7136 :     return;
     276        7134 :   case AMDGPU::VCC_HI:
     277        7134 :     O << "vcc_hi";
     278        7134 :     return;
     279        2870 :   case AMDGPU::TBA_LO:
     280        2870 :     O << "tba_lo";
     281        2870 :     return;
     282        2870 :   case AMDGPU::TBA_HI:
     283        2870 :     O << "tba_hi";
     284        2870 :     return;
     285        2884 :   case AMDGPU::TMA_LO:
     286        2884 :     O << "tma_lo";
     287        2884 :     return;
     288        2877 :   case AMDGPU::TMA_HI:
     289        2877 :     O << "tma_hi";
     290        2877 :     return;
     291        6902 :   case AMDGPU::EXEC_LO:
     292        6902 :     O << "exec_lo";
     293        6902 :     return;
     294        6895 :   case AMDGPU::EXEC_HI:
     295        6895 :     O << "exec_hi";
     296        6895 :     return;
     297           0 :   case AMDGPU::FLAT_SCR_LO:
     298           0 :     O << "flat_scratch_lo";
     299           0 :     return;
     300           0 :   case AMDGPU::FLAT_SCR_HI:
     301           0 :     O << "flat_scratch_hi";
     302           0 :     return;
     303           3 :   case AMDGPU::XNACK_MASK_LO:
     304           3 :     O << "xnack_mask_lo";
     305           3 :     return;
     306           4 :   case AMDGPU::XNACK_MASK_HI:
     307           4 :     O << "xnack_mask_hi";
     308           4 :     return;
     309           0 :   case AMDGPU::FP_REG:
     310             :   case AMDGPU::SP_REG:
     311             :   case AMDGPU::SCRATCH_WAVE_OFFSET_REG:
     312             :   case AMDGPU::PRIVATE_RSRC_REG:
     313           0 :     llvm_unreachable("pseudo-register should not ever be emitted");
     314             :   default:
     315             :     break;
     316             :   }
     317             : 
     318             :   // The low 8 bits of the encoding value is the register index, for both VGPRs
     319             :   // and SGPRs.
     320     2234618 :   unsigned RegIdx = MRI.getEncodingValue(RegNo) & ((1 << 8) - 1);
     321             : 
     322             :   unsigned NumRegs;
     323     1922336 :   if (MRI.getRegClass(AMDGPU::VGPR_32RegClassID).contains(RegNo)) {
     324             :     O << 'v';
     325             :     NumRegs = 1;
     326      758370 :   } else  if (MRI.getRegClass(AMDGPU::SGPR_32RegClassID).contains(RegNo)) {
     327             :     O << 's';
     328             :     NumRegs = 1;
     329      669432 :   } else if (MRI.getRegClass(AMDGPU::VReg_64RegClassID).contains(RegNo)) {
     330             :     O <<'v';
     331             :     NumRegs = 2;
     332      479311 :   } else  if (MRI.getRegClass(AMDGPU::SGPR_64RegClassID).contains(RegNo)) {
     333             :     O << 's';
     334             :     NumRegs = 2;
     335      198709 :   } else if (MRI.getRegClass(AMDGPU::VReg_128RegClassID).contains(RegNo)) {
     336             :     O << 'v';
     337             :     NumRegs = 4;
     338      159093 :   } else  if (MRI.getRegClass(AMDGPU::SGPR_128RegClassID).contains(RegNo)) {
     339             :     O << 's';
     340             :     NumRegs = 4;
     341       71450 :   } else if (MRI.getRegClass(AMDGPU::VReg_96RegClassID).contains(RegNo)) {
     342             :     O << 'v';
     343             :     NumRegs = 3;
     344       69022 :   } else if (MRI.getRegClass(AMDGPU::VReg_256RegClassID).contains(RegNo)) {
     345             :     O << 'v';
     346             :     NumRegs = 8;
     347       68476 :   } else if (MRI.getRegClass(AMDGPU::SGPR_256RegClassID).contains(RegNo)) {
     348             :     O << 's';
     349             :     NumRegs = 8;
     350       57788 :   } else if (MRI.getRegClass(AMDGPU::VReg_512RegClassID).contains(RegNo)) {
     351             :     O << 'v';
     352             :     NumRegs = 16;
     353       57772 :   } else if (MRI.getRegClass(AMDGPU::SGPR_512RegClassID).contains(RegNo)) {
     354             :     O << 's';
     355             :     NumRegs = 16;
     356             :   } else {
     357       28474 :     O << getRegisterName(RegNo);
     358       28474 :     return;
     359             :   }
     360             : 
     361             :   if (NumRegs == 1) {
     362             :     O << RegIdx;
     363             :     return;
     364             :   }
     365             : 
     366      306318 :   O << '[' << RegIdx << ':' << (RegIdx + NumRegs - 1) << ']';
     367             : }
     368             : 
     369      234292 : void AMDGPUInstPrinter::printVOPDst(const MCInst *MI, unsigned OpNo,
     370             :                                     const MCSubtargetInfo &STI, raw_ostream &O) {
     371      468584 :   if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3)
     372       73594 :     O << "_e64 ";
     373      160698 :   else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::DPP)
     374       15199 :     O << "_dpp ";
     375      145499 :   else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::SDWA)
     376       34171 :     O << "_sdwa ";
     377             :   else
     378      111328 :     O << "_e32 ";
     379             : 
     380      234292 :   printOperand(MI, OpNo, STI, O);
     381      234292 : }
     382             : 
     383         678 : void AMDGPUInstPrinter::printVINTRPDst(const MCInst *MI, unsigned OpNo,
     384             :                                        const MCSubtargetInfo &STI, raw_ostream &O) {
     385         678 :   if (AMDGPU::isSI(STI) || AMDGPU::isCI(STI))
     386         182 :     O << " ";
     387             :   else
     388         496 :     O << "_e32 ";
     389             : 
     390         678 :   printOperand(MI, OpNo, STI, O);
     391         678 : }
     392             : 
     393       12701 : void AMDGPUInstPrinter::printImmediate16(uint32_t Imm,
     394             :                                          const MCSubtargetInfo &STI,
     395             :                                          raw_ostream &O) {
     396       12701 :   int16_t SImm = static_cast<int16_t>(Imm);
     397       12701 :   if (SImm >= -16 && SImm <= 64) {
     398             :     O << SImm;
     399             :     return;
     400             :   }
     401             : 
     402        5568 :   if (Imm == 0x3C00)
     403          83 :     O<< "1.0";
     404        5485 :   else if (Imm == 0xBC00)
     405          17 :     O<< "-1.0";
     406        5468 :   else if (Imm == 0x3800)
     407        2121 :     O<< "0.5";
     408        3347 :   else if (Imm == 0xB800)
     409           9 :     O<< "-0.5";
     410        3338 :   else if (Imm == 0x4000)
     411          74 :     O<< "2.0";
     412        3264 :   else if (Imm == 0xC000)
     413          23 :     O<< "-2.0";
     414        3241 :   else if (Imm == 0x4400)
     415          52 :     O<< "4.0";
     416        3189 :   else if (Imm == 0xC400)
     417        2071 :     O<< "-4.0";
     418        1118 :   else if (Imm == 0x3118) {
     419             :     assert(STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm]);
     420          13 :     O << "0.15915494";
     421             :   } else
     422        1105 :     O << formatHex(static_cast<uint64_t>(Imm));
     423             : }
     424             : 
     425         319 : void AMDGPUInstPrinter::printImmediateV216(uint32_t Imm,
     426             :                                            const MCSubtargetInfo &STI,
     427             :                                            raw_ostream &O) {
     428             :   uint16_t Lo16 = static_cast<uint16_t>(Imm);
     429         319 :   printImmediate16(Lo16, STI, O);
     430         319 : }
     431             : 
     432      133245 : void AMDGPUInstPrinter::printImmediate32(uint32_t Imm,
     433             :                                          const MCSubtargetInfo &STI,
     434             :                                          raw_ostream &O) {
     435      133245 :   int32_t SImm = static_cast<int32_t>(Imm);
     436      133245 :   if (SImm >= -16 && SImm <= 64) {
     437             :     O << SImm;
     438             :     return;
     439             :   }
     440             : 
     441       33643 :   if (Imm == FloatToBits(0.0f))
     442           0 :     O << "0.0";
     443       33643 :   else if (Imm == FloatToBits(1.0f))
     444         843 :     O << "1.0";
     445       32800 :   else if (Imm == FloatToBits(-1.0f))
     446         124 :     O << "-1.0";
     447       32676 :   else if (Imm == FloatToBits(0.5f))
     448        4898 :     O << "0.5";
     449       27778 :   else if (Imm == FloatToBits(-0.5f))
     450          21 :     O << "-0.5";
     451       27757 :   else if (Imm == FloatToBits(2.0f))
     452         349 :     O << "2.0";
     453       27408 :   else if (Imm == FloatToBits(-2.0f))
     454          98 :     O << "-2.0";
     455       27310 :   else if (Imm == FloatToBits(4.0f))
     456         311 :     O << "4.0";
     457       26999 :   else if (Imm == FloatToBits(-4.0f))
     458        4788 :     O << "-4.0";
     459       22302 :   else if (Imm == 0x3e22f983 &&
     460             :            STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
     461          59 :     O << "0.15915494";
     462             :   else
     463       22152 :     O << formatHex(static_cast<uint64_t>(Imm));
     464             : }
     465             : 
     466       10526 : void AMDGPUInstPrinter::printImmediate64(uint64_t Imm,
     467             :                                          const MCSubtargetInfo &STI,
     468             :                                          raw_ostream &O) {
     469       10526 :   int64_t SImm = static_cast<int64_t>(Imm);
     470       10526 :   if (SImm >= -16 && SImm <= 64) {
     471        4536 :     O << SImm;
     472        4536 :     return;
     473             :   }
     474             : 
     475        5990 :   if (Imm == DoubleToBits(0.0))
     476           0 :     O << "0.0";
     477        5990 :   else if (Imm == DoubleToBits(1.0))
     478         165 :     O << "1.0";
     479        5825 :   else if (Imm == DoubleToBits(-1.0))
     480          33 :     O << "-1.0";
     481        5792 :   else if (Imm == DoubleToBits(0.5))
     482        1970 :     O << "0.5";
     483        3822 :   else if (Imm == DoubleToBits(-0.5))
     484           4 :     O << "-0.5";
     485        3818 :   else if (Imm == DoubleToBits(2.0))
     486          44 :     O << "2.0";
     487        3774 :   else if (Imm == DoubleToBits(-2.0))
     488           4 :     O << "-2.0";
     489        3770 :   else if (Imm == DoubleToBits(4.0))
     490          36 :     O << "4.0";
     491        3734 :   else if (Imm == DoubleToBits(-4.0))
     492        1947 :     O << "-4.0";
     493        1802 :   else if (Imm == 0x3fc45f306dc9c882 &&
     494             :            STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
     495          15 :   O << "0.15915494";
     496             :   else {
     497             :     assert(isUInt<32>(Imm) || Imm == 0x3fc45f306dc9c882);
     498             : 
     499             :     // In rare situations, we will have a 32-bit literal in a 64-bit
     500             :     // operand. This is technically allowed for the encoding of s_mov_b64.
     501        1772 :     O << formatHex(static_cast<uint64_t>(Imm));
     502             :   }
     503             : }
     504             : 
     505     1554496 : void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
     506             :                                      const MCSubtargetInfo &STI,
     507             :                                      raw_ostream &O) {
     508     1554496 :   if (!STI.getFeatureBits()[AMDGPU::FeatureGCN]) {
     509      219059 :     static_cast<R600InstPrinter*>(this)->printOperand(MI, OpNo, O);
     510      219059 :     return;
     511             :   }
     512             : 
     513     1335437 :   if (OpNo >= MI->getNumOperands()) {
     514           0 :     O << "/*Missing OP" << OpNo << "*/";
     515           0 :     return;
     516             :   }
     517             : 
     518             :   const MCOperand &Op = MI->getOperand(OpNo);
     519     1335437 :   if (Op.isReg()) {
     520     1176017 :     printRegOperand(Op.getReg(), O, MRI);
     521      159420 :   } else if (Op.isImm()) {
     522      156646 :     const MCInstrDesc &Desc = MII.get(MI->getOpcode());
     523      156646 :     switch (Desc.OpInfo[OpNo].OperandType) {
     524      133245 :     case AMDGPU::OPERAND_REG_IMM_INT32:
     525             :     case AMDGPU::OPERAND_REG_IMM_FP32:
     526             :     case AMDGPU::OPERAND_REG_INLINE_C_INT32:
     527             :     case AMDGPU::OPERAND_REG_INLINE_C_FP32:
     528             :     case MCOI::OPERAND_IMMEDIATE:
     529      133245 :       printImmediate32(Op.getImm(), STI, O);
     530      133245 :       break;
     531       10526 :     case AMDGPU::OPERAND_REG_IMM_INT64:
     532             :     case AMDGPU::OPERAND_REG_IMM_FP64:
     533             :     case AMDGPU::OPERAND_REG_INLINE_C_INT64:
     534             :     case AMDGPU::OPERAND_REG_INLINE_C_FP64:
     535       10526 :       printImmediate64(Op.getImm(), STI, O);
     536       10526 :       break;
     537       12382 :     case AMDGPU::OPERAND_REG_INLINE_C_INT16:
     538             :     case AMDGPU::OPERAND_REG_INLINE_C_FP16:
     539             :     case AMDGPU::OPERAND_REG_IMM_INT16:
     540             :     case AMDGPU::OPERAND_REG_IMM_FP16:
     541       12382 :       printImmediate16(Op.getImm(), STI, O);
     542       12382 :       break;
     543         319 :     case AMDGPU::OPERAND_REG_INLINE_C_V2FP16:
     544             :     case AMDGPU::OPERAND_REG_INLINE_C_V2INT16:
     545         319 :       printImmediateV216(Op.getImm(), STI, O);
     546         319 :       break;
     547         174 :     case MCOI::OPERAND_UNKNOWN:
     548             :     case MCOI::OPERAND_PCREL:
     549         174 :       O << formatDec(Op.getImm());
     550         174 :       break;
     551           0 :     case MCOI::OPERAND_REGISTER:
     552             :       // FIXME: This should be removed and handled somewhere else. Seems to come
     553             :       // from a disassembler bug.
     554           0 :       O << "/*invalid immediate*/";
     555           0 :       break;
     556           0 :     default:
     557             :       // We hit this for the immediate instruction bits that don't yet have a
     558             :       // custom printer.
     559           0 :       llvm_unreachable("unexpected immediate operand type");
     560             :     }
     561        2774 :   } else if (Op.isFPImm()) {
     562             :     // We special case 0.0 because otherwise it will be printed as an integer.
     563           0 :     if (Op.getFPImm() == 0.0)
     564           0 :       O << "0.0";
     565             :     else {
     566           0 :       const MCInstrDesc &Desc = MII.get(MI->getOpcode());
     567           0 :       int RCID = Desc.OpInfo[OpNo].RegClass;
     568           0 :       unsigned RCBits = AMDGPU::getRegBitWidth(MRI.getRegClass(RCID));
     569           0 :       if (RCBits == 32)
     570           0 :         printImmediate32(FloatToBits(Op.getFPImm()), STI, O);
     571           0 :       else if (RCBits == 64)
     572           0 :         printImmediate64(DoubleToBits(Op.getFPImm()), STI, O);
     573             :       else
     574           0 :         llvm_unreachable("Invalid register class size");
     575             :     }
     576        2774 :   } else if (Op.isExpr()) {
     577        2774 :     const MCExpr *Exp = Op.getExpr();
     578        2774 :     Exp->print(O, &MAI);
     579             :   } else {
     580           0 :     O << "/*INV_OP*/";
     581             :   }
     582             : }
     583             : 
     584      151905 : void AMDGPUInstPrinter::printOperandAndFPInputMods(const MCInst *MI,
     585             :                                                    unsigned OpNo,
     586             :                                                    const MCSubtargetInfo &STI,
     587             :                                                    raw_ostream &O) {
     588      151905 :   unsigned InputModifiers = MI->getOperand(OpNo).getImm();
     589             : 
     590             :   // Use 'neg(...)' instead of '-' to avoid ambiguity.
     591             :   // This is important for integer literals because
     592             :   // -1 is not the same value as neg(1).
     593             :   bool NegMnemo = false;
     594             : 
     595      151905 :   if (InputModifiers & SISrcMods::NEG) {
     596       22656 :     if (OpNo + 1 < MI->getNumOperands() &&
     597        7552 :         (InputModifiers & SISrcMods::ABS) == 0) {
     598             :       const MCOperand &Op = MI->getOperand(OpNo + 1);
     599        7259 :       NegMnemo = Op.isImm() || Op.isFPImm();
     600             :     }
     601             :     if (NegMnemo) {
     602          32 :       O << "neg(";
     603             :     } else {
     604             :       O << '-';
     605             :     }
     606             :   }
     607             : 
     608      151905 :   if (InputModifiers & SISrcMods::ABS)
     609             :     O << '|';
     610      151905 :   printOperand(MI, OpNo + 1, STI, O);
     611      151905 :   if (InputModifiers & SISrcMods::ABS)
     612             :     O << '|';
     613             : 
     614      151905 :   if (NegMnemo) {
     615             :     O << ')';
     616             :   }
     617      151905 : }
     618             : 
     619       38608 : void AMDGPUInstPrinter::printOperandAndIntInputMods(const MCInst *MI,
     620             :                                                     unsigned OpNo,
     621             :                                                     const MCSubtargetInfo &STI,
     622             :                                                     raw_ostream &O) {
     623       38608 :   unsigned InputModifiers = MI->getOperand(OpNo).getImm();
     624       38608 :   if (InputModifiers & SISrcMods::SEXT)
     625        1744 :     O << "sext(";
     626       38608 :   printOperand(MI, OpNo + 1, STI, O);
     627       38608 :   if (InputModifiers & SISrcMods::SEXT)
     628             :     O << ')';
     629       38608 : }
     630             : 
     631       15203 : void AMDGPUInstPrinter::printDPPCtrl(const MCInst *MI, unsigned OpNo,
     632             :                                      const MCSubtargetInfo &STI,
     633             :                                      raw_ostream &O) {
     634             :   using namespace AMDGPU::DPP;
     635             : 
     636       15203 :   unsigned Imm = MI->getOperand(OpNo).getImm();
     637       15203 :   if (Imm <= DppCtrl::QUAD_PERM_LAST) {
     638        7394 :     O << " quad_perm:[";
     639       14788 :     O << formatDec(Imm & 0x3)         << ',';
     640       14788 :     O << formatDec((Imm & 0xc)  >> 2) << ',';
     641       14788 :     O << formatDec((Imm & 0x30) >> 4) << ',';
     642       14788 :     O << formatDec((Imm & 0xc0) >> 6) << ']';
     643        7809 :   } else if ((Imm >= DppCtrl::ROW_SHL_FIRST) &&
     644             :              (Imm <= DppCtrl::ROW_SHL_LAST)) {
     645        1485 :     O << " row_shl:";
     646        1485 :     printU4ImmDecOperand(MI, OpNo, O);
     647        6324 :   } else if ((Imm >= DppCtrl::ROW_SHR_FIRST) &&
     648             :              (Imm <= DppCtrl::ROW_SHR_LAST)) {
     649        1053 :     O << " row_shr:";
     650        1053 :     printU4ImmDecOperand(MI, OpNo, O);
     651        5271 :   } else if ((Imm >= DppCtrl::ROW_ROR_FIRST) &&
     652             :              (Imm <= DppCtrl::ROW_ROR_LAST)) {
     653        1053 :     O << " row_ror:";
     654        1053 :     printU4ImmDecOperand(MI, OpNo, O);
     655        4218 :   } else if (Imm == DppCtrl::WAVE_SHL1) {
     656         528 :     O << " wave_shl:1";
     657        3690 :   } else if (Imm == DppCtrl::WAVE_ROL1) {
     658         528 :     O << " wave_rol:1";
     659        3162 :   } else if (Imm == DppCtrl::WAVE_SHR1) {
     660         528 :     O << " wave_shr:1";
     661        2634 :   } else if (Imm == DppCtrl::WAVE_ROR1) {
     662         528 :     O << " wave_ror:1";
     663        2106 :   } else if (Imm == DppCtrl::ROW_MIRROR) {
     664         526 :     O << " row_mirror";
     665        1580 :   } else if (Imm == DppCtrl::ROW_HALF_MIRROR) {
     666         526 :     O << " row_half_mirror";
     667        1054 :   } else if (Imm == DppCtrl::BCAST15) {
     668         528 :     O << " row_bcast:15";
     669         526 :   } else if (Imm == DppCtrl::BCAST31) {
     670         526 :     O << " row_bcast:31";
     671             :   } else {
     672           0 :     O << " /* Invalid dpp_ctrl value */";
     673             :   }
     674       15203 : }
     675             : 
     676       15203 : void AMDGPUInstPrinter::printRowMask(const MCInst *MI, unsigned OpNo,
     677             :                                      const MCSubtargetInfo &STI,
     678             :                                      raw_ostream &O) {
     679       15203 :   O << " row_mask:";
     680       15203 :   printU4ImmOperand(MI, OpNo, STI, O);
     681       15203 : }
     682             : 
     683       15203 : void AMDGPUInstPrinter::printBankMask(const MCInst *MI, unsigned OpNo,
     684             :                                       const MCSubtargetInfo &STI,
     685             :                                       raw_ostream &O) {
     686       15203 :   O << " bank_mask:";
     687       15203 :   printU4ImmOperand(MI, OpNo, STI, O);
     688       15203 : }
     689             : 
     690       15203 : void AMDGPUInstPrinter::printBoundCtrl(const MCInst *MI, unsigned OpNo,
     691             :                                        const MCSubtargetInfo &STI,
     692             :                                        raw_ostream &O) {
     693       15203 :   unsigned Imm = MI->getOperand(OpNo).getImm();
     694       15203 :   if (Imm) {
     695         992 :     O << " bound_ctrl:0"; // XXX - this syntax is used in sp3
     696             :   }
     697       15203 : }
     698             : 
     699       89467 : void AMDGPUInstPrinter::printSDWASel(const MCInst *MI, unsigned OpNo,
     700             :                                      raw_ostream &O) {
     701             :   using namespace llvm::AMDGPU::SDWA;
     702             : 
     703       89467 :   unsigned Imm = MI->getOperand(OpNo).getImm();
     704       89467 :   switch (Imm) {
     705        2970 :   case SdwaSel::BYTE_0: O << "BYTE_0"; break;
     706        2667 :   case SdwaSel::BYTE_1: O << "BYTE_1"; break;
     707        3067 :   case SdwaSel::BYTE_2: O << "BYTE_2"; break;
     708        2618 :   case SdwaSel::BYTE_3: O << "BYTE_3"; break;
     709        3315 :   case SdwaSel::WORD_0: O << "WORD_0"; break;
     710        4143 :   case SdwaSel::WORD_1: O << "WORD_1"; break;
     711       70687 :   case SdwaSel::DWORD: O << "DWORD"; break;
     712           0 :   default: llvm_unreachable("Invalid SDWA data select operand");
     713             :   }
     714       89467 : }
     715             : 
     716       19692 : void AMDGPUInstPrinter::printSDWADstSel(const MCInst *MI, unsigned OpNo,
     717             :                                         const MCSubtargetInfo &STI,
     718             :                                         raw_ostream &O) {
     719       19692 :   O << "dst_sel:";
     720       19692 :   printSDWASel(MI, OpNo, O);
     721       19692 : }
     722             : 
     723       39345 : void AMDGPUInstPrinter::printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
     724             :                                          const MCSubtargetInfo &STI,
     725             :                                          raw_ostream &O) {
     726       39345 :   O << "src0_sel:";
     727       39345 :   printSDWASel(MI, OpNo, O);
     728       39345 : }
     729             : 
     730       30430 : void AMDGPUInstPrinter::printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
     731             :                                          const MCSubtargetInfo &STI,
     732             :                                          raw_ostream &O) {
     733       30430 :   O << "src1_sel:";
     734       30430 :   printSDWASel(MI, OpNo, O);
     735       30430 : }
     736             : 
     737       19692 : void AMDGPUInstPrinter::printSDWADstUnused(const MCInst *MI, unsigned OpNo,
     738             :                                            const MCSubtargetInfo &STI,
     739             :                                            raw_ostream &O) {
     740             :   using namespace llvm::AMDGPU::SDWA;
     741             : 
     742       19692 :   O << "dst_unused:";
     743       19692 :   unsigned Imm = MI->getOperand(OpNo).getImm();
     744       19692 :   switch (Imm) {
     745       18169 :   case DstUnused::UNUSED_PAD: O << "UNUSED_PAD"; break;
     746         530 :   case DstUnused::UNUSED_SEXT: O << "UNUSED_SEXT"; break;
     747         993 :   case DstUnused::UNUSED_PRESERVE: O << "UNUSED_PRESERVE"; break;
     748           0 :   default: llvm_unreachable("Invalid SDWA dest_unused operand");
     749             :   }
     750       19692 : }
     751             : 
     752             : template <unsigned N>
     753        2748 : void AMDGPUInstPrinter::printExpSrcN(const MCInst *MI, unsigned OpNo,
     754             :                                      const MCSubtargetInfo &STI,
     755             :                                      raw_ostream &O) {
     756        2748 :   unsigned Opc = MI->getOpcode();
     757        2748 :   int EnIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::en);
     758        5496 :   unsigned En = MI->getOperand(EnIdx).getImm();
     759             : 
     760        2061 :   int ComprIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::compr);
     761             : 
     762             :   // If compr is set, print as src0, src0, src1, src1
     763        4122 :   if (MI->getOperand(ComprIdx).getImm()) {
     764             :     if (N == 1 || N == 2)
     765         226 :       --OpNo;
     766             :     else if (N == 3)
     767         113 :       OpNo -= 2;
     768             :   }
     769             : 
     770        2748 :   if (En & (1 << N))
     771        4502 :     printRegOperand(MI->getOperand(OpNo).getReg(), O, MRI);
     772             :   else
     773         497 :     O << "off";
     774        2748 : }
     775             : 
     776         687 : void AMDGPUInstPrinter::printExpSrc0(const MCInst *MI, unsigned OpNo,
     777             :                                      const MCSubtargetInfo &STI,
     778             :                                      raw_ostream &O) {
     779         687 :   printExpSrcN<0>(MI, OpNo, STI, O);
     780         687 : }
     781             : 
     782         687 : void AMDGPUInstPrinter::printExpSrc1(const MCInst *MI, unsigned OpNo,
     783             :                                      const MCSubtargetInfo &STI,
     784             :                                      raw_ostream &O) {
     785         687 :   printExpSrcN<1>(MI, OpNo, STI, O);
     786         687 : }
     787             : 
     788         687 : void AMDGPUInstPrinter::printExpSrc2(const MCInst *MI, unsigned OpNo,
     789             :                                      const MCSubtargetInfo &STI,
     790             :                                      raw_ostream &O) {
     791         687 :   printExpSrcN<2>(MI, OpNo, STI, O);
     792         687 : }
     793             : 
     794         687 : void AMDGPUInstPrinter::printExpSrc3(const MCInst *MI, unsigned OpNo,
     795             :                                      const MCSubtargetInfo &STI,
     796             :                                      raw_ostream &O) {
     797         687 :   printExpSrcN<3>(MI, OpNo, STI, O);
     798         687 : }
     799             : 
     800         687 : void AMDGPUInstPrinter::printExpTgt(const MCInst *MI, unsigned OpNo,
     801             :                                     const MCSubtargetInfo &STI,
     802             :                                     raw_ostream &O) {
     803             :   // This is really a 6 bit field.
     804         687 :   uint32_t Tgt = MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
     805             : 
     806         687 :   if (Tgt <= 7)
     807         426 :     O << " mrt" << Tgt;
     808         261 :   else if (Tgt == 8)
     809          37 :     O << " mrtz";
     810         224 :   else if (Tgt == 9)
     811          22 :     O << " null";
     812         202 :   else if (Tgt >= 12 && Tgt <= 15)
     813          51 :     O << " pos" << Tgt - 12;
     814         151 :   else if (Tgt >= 32 && Tgt <= 63)
     815         135 :     O << " param" << Tgt - 32;
     816             :   else {
     817             :     // Reserved values 10, 11
     818          16 :     O << " invalid_target_" << Tgt;
     819             :   }
     820         687 : }
     821             : 
     822             : static bool allOpsDefaultValue(const int* Ops, int NumOps, int Mod,
     823             :                                bool IsPacked, bool HasDstSel) {
     824       16293 :   int DefaultValue = IsPacked && (Mod == SISrcMods::OP_SEL_1);
     825             : 
     826       88275 :   for (int I = 0; I < NumOps; ++I) {
     827       37844 :     if (!!(Ops[I] & Mod) != DefaultValue)
     828             :       return false;
     829             :   }
     830             : 
     831       14440 :   if (HasDstSel && (Ops[0] & SISrcMods::DST_OP_SEL) != 0)
     832             :     return false;
     833             : 
     834             :   return true;
     835             : }
     836             : 
     837       16293 : void AMDGPUInstPrinter::printPackedModifier(const MCInst *MI,
     838             :                                             StringRef Name,
     839             :                                             unsigned Mod,
     840             :                                             raw_ostream &O) {
     841       16293 :   unsigned Opc = MI->getOpcode();
     842             :   int NumOps = 0;
     843             :   int Ops[3];
     844             : 
     845       88909 :   for (int OpName : { AMDGPU::OpName::src0_modifiers,
     846             :                       AMDGPU::OpName::src1_modifiers,
     847       56323 :                       AMDGPU::OpName::src2_modifiers }) {
     848       48879 :     int Idx = AMDGPU::getNamedOperandIdx(Opc, OpName);
     849       48879 :     if (Idx == -1)
     850             :       break;
     851             : 
     852       80060 :     Ops[NumOps++] = MI->getOperand(Idx).getImm();
     853             :   }
     854             : 
     855             :   const bool HasDstSel =
     856       32586 :     NumOps > 0 &&
     857       39593 :     Mod == SISrcMods::OP_SEL_0 &&
     858       14014 :     MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3_OPSEL;
     859             : 
     860             :   const bool IsPacked =
     861       32586 :     MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::IsPacked;
     862             : 
     863       16293 :   if (allOpsDefaultValue(Ops, NumOps, Mod, IsPacked, HasDstSel))
     864       14364 :     return;
     865             : 
     866        1929 :   O << Name;
     867       12355 :   for (int I = 0; I < NumOps; ++I) {
     868        5213 :     if (I != 0)
     869             :       O << ',';
     870             : 
     871        5213 :     O << !!(Ops[I] & Mod);
     872             :   }
     873             : 
     874        1929 :   if (HasDstSel) {
     875         355 :     O << ',' << !!(Ops[0] & SISrcMods::DST_OP_SEL);
     876             :   }
     877             : 
     878             :   O << ']';
     879             : }
     880             : 
     881        7007 : void AMDGPUInstPrinter::printOpSel(const MCInst *MI, unsigned,
     882             :                                    const MCSubtargetInfo &STI,
     883             :                                    raw_ostream &O) {
     884        7007 :   printPackedModifier(MI, " op_sel:[", SISrcMods::OP_SEL_0, O);
     885        7007 : }
     886             : 
     887        3710 : void AMDGPUInstPrinter::printOpSelHi(const MCInst *MI, unsigned OpNo,
     888             :                                      const MCSubtargetInfo &STI,
     889             :                                      raw_ostream &O) {
     890        3710 :   printPackedModifier(MI, " op_sel_hi:[", SISrcMods::OP_SEL_1, O);
     891        3710 : }
     892             : 
     893        2788 : void AMDGPUInstPrinter::printNegLo(const MCInst *MI, unsigned OpNo,
     894             :                                    const MCSubtargetInfo &STI,
     895             :                                    raw_ostream &O) {
     896        2788 :   printPackedModifier(MI, " neg_lo:[", SISrcMods::NEG, O);
     897        2788 : }
     898             : 
     899        2788 : void AMDGPUInstPrinter::printNegHi(const MCInst *MI, unsigned OpNo,
     900             :                                    const MCSubtargetInfo &STI,
     901             :                                    raw_ostream &O) {
     902        2788 :   printPackedModifier(MI, " neg_hi:[", SISrcMods::NEG_HI, O);
     903        2788 : }
     904             : 
     905         244 : void AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,
     906             :                                         const MCSubtargetInfo &STI,
     907             :                                         raw_ostream &O) {
     908         244 :   unsigned Imm = MI->getOperand(OpNum).getImm();
     909         244 :   switch (Imm) {
     910         160 :   case 0:
     911         160 :     O << "p10";
     912         160 :     break;
     913          20 :   case 1:
     914          20 :     O << "p20";
     915          20 :     break;
     916          46 :   case 2:
     917          46 :     O << "p0";
     918          46 :     break;
     919          18 :   default:
     920          18 :     O << "invalid_param_" << Imm;
     921             :   }
     922         244 : }
     923             : 
     924        1376 : void AMDGPUInstPrinter::printInterpAttr(const MCInst *MI, unsigned OpNum,
     925             :                                         const MCSubtargetInfo &STI,
     926             :                                         raw_ostream &O) {
     927        1376 :   unsigned Attr = MI->getOperand(OpNum).getImm();
     928        1376 :   O << "attr" << Attr;
     929        1376 : }
     930             : 
     931        1376 : void AMDGPUInstPrinter::printInterpAttrChan(const MCInst *MI, unsigned OpNum,
     932             :                                         const MCSubtargetInfo &STI,
     933             :                                         raw_ostream &O) {
     934        1376 :   unsigned Chan = MI->getOperand(OpNum).getImm();
     935        1376 :   O << '.' << "xyzw"[Chan & 0x3];
     936        1376 : }
     937             : 
     938         112 : void AMDGPUInstPrinter::printVGPRIndexMode(const MCInst *MI, unsigned OpNo,
     939             :                                            const MCSubtargetInfo &STI,
     940             :                                            raw_ostream &O) {
     941         112 :   unsigned Val = MI->getOperand(OpNo).getImm();
     942         112 :   if (Val == 0) {
     943          49 :     O << " 0";
     944          49 :     return;
     945             :   }
     946             : 
     947          63 :   if (Val & VGPRIndexMode::DST_ENABLE)
     948          32 :     O << " dst";
     949             : 
     950          63 :   if (Val & VGPRIndexMode::SRC0_ENABLE)
     951          39 :     O << " src0";
     952             : 
     953          63 :   if (Val & VGPRIndexMode::SRC1_ENABLE)
     954           9 :     O << " src1";
     955             : 
     956          63 :   if (Val & VGPRIndexMode::SRC2_ENABLE)
     957           8 :     O << " src2";
     958             : }
     959             : 
     960        1559 : void AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
     961             :                                         const MCSubtargetInfo &STI,
     962             :                                         raw_ostream &O) {
     963        1559 :   if (!STI.getFeatureBits()[AMDGPU::FeatureGCN]) {
     964        1559 :     static_cast<R600InstPrinter*>(this)->printMemOperand(MI, OpNo, O);
     965        1559 :     return;
     966             :   }
     967             : 
     968           0 :   printOperand(MI, OpNo, STI, O);
     969           0 :   O  << ", ";
     970           0 :   printOperand(MI, OpNo + 1, STI, O);
     971             : }
     972             : 
     973      154537 : void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
     974             :                                    raw_ostream &O, StringRef Asm,
     975             :                                    StringRef Default) {
     976             :   const MCOperand &Op = MI->getOperand(OpNo);
     977             :   assert(Op.isImm());
     978      154537 :   if (Op.getImm() == 1) {
     979       26009 :     O << Asm;
     980             :   } else {
     981      128528 :     O << Default;
     982             :   }
     983      154537 : }
     984             : 
     985      368743 : void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
     986             :                                    raw_ostream &O, char Asm) {
     987             :   const MCOperand &Op = MI->getOperand(OpNo);
     988             :   assert(Op.isImm());
     989      368743 :   if (Op.getImm() == 1)
     990             :     O << Asm;
     991      368743 : }
     992             : 
     993      136744 : void AMDGPUInstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
     994             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
     995      136744 :   static_cast<R600InstPrinter*>(this)->printAbs(MI, OpNo, O);
     996      136744 : }
     997             : 
     998       46109 : void AMDGPUInstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
     999             :                                    const MCSubtargetInfo &STI, raw_ostream &O) {
    1000       46109 :   static_cast<R600InstPrinter*>(this)->printClamp(MI, OpNo, O);
    1001       46109 : }
    1002             : 
    1003         410 : void AMDGPUInstPrinter::printHigh(const MCInst *MI, unsigned OpNo,
    1004             :                                   const MCSubtargetInfo &STI,
    1005             :                                   raw_ostream &O) {
    1006         410 :   if (MI->getOperand(OpNo).getImm())
    1007          32 :     O << " high";
    1008         410 : }
    1009             : 
    1010       87658 : void AMDGPUInstPrinter::printClampSI(const MCInst *MI, unsigned OpNo,
    1011             :                                      const MCSubtargetInfo &STI,
    1012             :                                      raw_ostream &O) {
    1013       87658 :   if (MI->getOperand(OpNo).getImm())
    1014        2197 :     O << " clamp";
    1015       87658 : }
    1016             : 
    1017       29936 : void AMDGPUInstPrinter::printOModSI(const MCInst *MI, unsigned OpNo,
    1018             :                                     const MCSubtargetInfo &STI,
    1019             :                                     raw_ostream &O) {
    1020       29936 :   int Imm = MI->getOperand(OpNo).getImm();
    1021       29936 :   if (Imm == SIOutMods::MUL2)
    1022         581 :     O << " mul:2";
    1023       29355 :   else if (Imm == SIOutMods::MUL4)
    1024         583 :     O << " mul:4";
    1025       28772 :   else if (Imm == SIOutMods::DIV2)
    1026         576 :     O << " div:2";
    1027       29936 : }
    1028             : 
    1029       27114 : void AMDGPUInstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
    1030             :                                      const MCSubtargetInfo &STI,
    1031             :                                      raw_ostream &O) {
    1032       27114 :   static_cast<R600InstPrinter*>(this)->printLiteral(MI, OpNo, O);
    1033       27114 : }
    1034             : 
    1035       49520 : void AMDGPUInstPrinter::printLast(const MCInst *MI, unsigned OpNo,
    1036             :                                   const MCSubtargetInfo &STI, raw_ostream &O) {
    1037       49520 :   static_cast<R600InstPrinter*>(this)->printLast(MI, OpNo, O);
    1038       49520 : }
    1039             : 
    1040       89945 : void AMDGPUInstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
    1041             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
    1042       89945 :   static_cast<R600InstPrinter*>(this)->printNeg(MI, OpNo, O);
    1043       89945 : }
    1044             : 
    1045       38918 : void AMDGPUInstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
    1046             :                                   const MCSubtargetInfo &STI, raw_ostream &O) {
    1047       38918 :   static_cast<R600InstPrinter*>(this)->printOMOD(MI, OpNo, O);
    1048       38918 : }
    1049             : 
    1050      142054 : void AMDGPUInstPrinter::printRel(const MCInst *MI, unsigned OpNo,
    1051             :                                  const MCSubtargetInfo &STI, raw_ostream &O) {
    1052      142054 :   static_cast<R600InstPrinter*>(this)->printRel(MI, OpNo, O);
    1053      142054 : }
    1054             : 
    1055       29454 : void AMDGPUInstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
    1056             :                                             const MCSubtargetInfo &STI,
    1057             :                                             raw_ostream &O) {
    1058       29454 :   static_cast<R600InstPrinter*>(this)->printUpdateExecMask(MI, OpNo, O);
    1059       29454 : }
    1060             : 
    1061       29454 : void AMDGPUInstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
    1062             :                                         const MCSubtargetInfo &STI,
    1063             :                                         raw_ostream &O) {
    1064       29454 :   static_cast<R600InstPrinter*>(this)->printUpdatePred(MI, OpNo, O);
    1065       29454 : }
    1066             : 
    1067       38918 : void AMDGPUInstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
    1068             :                                    const MCSubtargetInfo &STI, raw_ostream &O) {
    1069       38918 :   static_cast<R600InstPrinter*>(this)->printWrite(MI, OpNo, O);
    1070       38918 : }
    1071             : 
    1072       46109 : void AMDGPUInstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
    1073             :                                          const MCSubtargetInfo &STI,
    1074             :                                          raw_ostream &O) {
    1075       46109 :   static_cast<R600InstPrinter*>(this)->printBankSwizzle(MI, OpNo, O);
    1076       46109 : }
    1077             : 
    1078        2448 : void AMDGPUInstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
    1079             :                                   const MCSubtargetInfo &STI, raw_ostream &O) {
    1080        2448 :   static_cast<R600InstPrinter*>(this)->printRSel(MI, OpNo, O);
    1081        2448 : }
    1082             : 
    1083        1104 : void AMDGPUInstPrinter::printCT(const MCInst *MI, unsigned OpNo,
    1084             :                                 const MCSubtargetInfo &STI, raw_ostream &O) {
    1085        1104 :   static_cast<R600InstPrinter*>(this)->printCT(MI, OpNo, O);
    1086        1104 : }
    1087             : 
    1088        7344 : void AMDGPUInstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
    1089             :                                     const MCSubtargetInfo &STI, raw_ostream &O) {
    1090        7344 :   static_cast<R600InstPrinter*>(this)->printKCache(MI, OpNo, O);
    1091        7344 : }
    1092             : 
    1093         126 : void AMDGPUInstPrinter::printSendMsg(const MCInst *MI, unsigned OpNo,
    1094             :                                      const MCSubtargetInfo &STI,
    1095             :                                      raw_ostream &O) {
    1096             :   using namespace llvm::AMDGPU::SendMsg;
    1097             : 
    1098         126 :   const unsigned SImm16 = MI->getOperand(OpNo).getImm();
    1099         126 :   const unsigned Id = SImm16 & ID_MASK_;
    1100             :   do {
    1101         126 :     if (Id == ID_INTERRUPT) {
    1102          34 :       if ((SImm16 & ~ID_MASK_) != 0) // Unused/unknown bits must be 0.
    1103             :         break;
    1104          18 :       O << "sendmsg(" << IdSymbolic[Id] << ')';
    1105             :       return;
    1106             :     }
    1107          92 :     if (Id == ID_GS || Id == ID_GS_DONE) {
    1108          70 :       if ((SImm16 & ~(ID_MASK_|OP_GS_MASK_|STREAM_ID_MASK_)) != 0) // Unused/unknown bits must be 0.
    1109             :         break;
    1110          70 :       const unsigned OpGs = (SImm16 & OP_GS_MASK_) >> OP_SHIFT_;
    1111          70 :       const unsigned StreamId = (SImm16 & STREAM_ID_MASK_) >> STREAM_ID_SHIFT_;
    1112          70 :       if (OpGs == OP_GS_NOP && Id != ID_GS_DONE) // NOP to be used for GS_DONE only.
    1113             :         break;
    1114          66 :       if (OpGs == OP_GS_NOP && StreamId != 0) // NOP does not use/define stream id bits.
    1115             :         break;
    1116          66 :       O << "sendmsg(" << IdSymbolic[Id] << ", " << OpGsSymbolic[OpGs];
    1117          66 :       if (OpGs != OP_GS_NOP) {  O << ", " << StreamId; }
    1118             :       O << ')';
    1119             :       return;
    1120             :     }
    1121          22 :     if (Id == ID_SYSMSG) {
    1122          15 :       if ((SImm16 & ~(ID_MASK_|OP_SYS_MASK_)) != 0) // Unused/unknown bits must be 0.
    1123             :         break;
    1124          15 :       const unsigned OpSys = (SImm16 & OP_SYS_MASK_) >> OP_SHIFT_;
    1125          15 :       if (! (OP_SYS_FIRST_ <= OpSys && OpSys < OP_SYS_LAST_)) // Unused/unknown.
    1126             :         break;
    1127          10 :       O << "sendmsg(" << IdSymbolic[Id] << ", " << OpSysSymbolic[OpSys] << ')';
    1128             :       return;
    1129             :     }
    1130             :   } while (false);
    1131             :   O << SImm16; // Unknown simm16 code.
    1132             : }
    1133             : 
    1134          55 : static void printSwizzleBitmask(const uint16_t AndMask,
    1135             :                                 const uint16_t OrMask,
    1136             :                                 const uint16_t XorMask,
    1137             :                                 raw_ostream &O) {
    1138             :   using namespace llvm::AMDGPU::Swizzle;
    1139             : 
    1140          55 :   uint16_t Probe0 = ((0            & AndMask) | OrMask) ^ XorMask;
    1141          55 :   uint16_t Probe1 = ((BITMASK_MASK & AndMask) | OrMask) ^ XorMask;
    1142             : 
    1143          55 :   O << "\"";
    1144             : 
    1145         605 :   for (unsigned Mask = 1 << (BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
    1146         275 :     uint16_t p0 = Probe0 & Mask;
    1147         275 :     uint16_t p1 = Probe1 & Mask;
    1148             : 
    1149         275 :     if (p0 == p1) {
    1150         234 :       if (p0 == 0) {
    1151         209 :         O << "0";
    1152             :       } else {
    1153          25 :         O << "1";
    1154             :       }
    1155             :     } else {
    1156          41 :       if (p0 == 0) {
    1157          27 :         O << "p";
    1158             :       } else {
    1159          14 :         O << "i";
    1160             :       }
    1161             :     }
    1162             :   }
    1163             : 
    1164          55 :   O << "\"";
    1165          55 : }
    1166             : 
    1167         281 : void AMDGPUInstPrinter::printSwizzle(const MCInst *MI, unsigned OpNo,
    1168             :                                      const MCSubtargetInfo &STI,
    1169             :                                      raw_ostream &O) {
    1170             :   using namespace llvm::AMDGPU::Swizzle;
    1171             : 
    1172         281 :   uint16_t Imm = MI->getOperand(OpNo).getImm();
    1173         281 :   if (Imm == 0) {
    1174             :     return;
    1175             :   }
    1176             : 
    1177         248 :   O << " offset:";
    1178             : 
    1179         248 :   if ((Imm & QUAD_PERM_ENC_MASK) == QUAD_PERM_ENC) {
    1180             : 
    1181          14 :     O << "swizzle(" << IdSymbolic[ID_QUAD_PERM];
    1182         126 :     for (auto i = 0; i < LANE_NUM; ++i) {
    1183          56 :       O << ",";
    1184          56 :       O << formatDec(Imm & LANE_MASK);
    1185          56 :       Imm >>= LANE_SHIFT;
    1186             :     }
    1187          14 :     O << ")";
    1188             : 
    1189         234 :   } else if ((Imm & BITMASK_PERM_ENC_MASK) == BITMASK_PERM_ENC) {
    1190             : 
    1191         211 :     uint16_t AndMask = (Imm >> BITMASK_AND_SHIFT) & BITMASK_MASK;
    1192         211 :     uint16_t OrMask  = (Imm >> BITMASK_OR_SHIFT)  & BITMASK_MASK;
    1193         211 :     uint16_t XorMask = (Imm >> BITMASK_XOR_SHIFT) & BITMASK_MASK;
    1194             : 
    1195         422 :     if (AndMask == BITMASK_MAX &&
    1196         501 :         OrMask == 0 &&
    1197             :         countPopulation(XorMask) == 1) {
    1198             : 
    1199          44 :       O << "swizzle(" << IdSymbolic[ID_SWAP];
    1200          44 :       O << ",";
    1201          44 :       O << formatDec(XorMask);
    1202          44 :       O << ")";
    1203             : 
    1204             :     } else if (AndMask == BITMASK_MAX &&
    1205         167 :                OrMask == 0 && XorMask > 0 &&
    1206          35 :                isPowerOf2_64(XorMask + 1)) {
    1207             : 
    1208          35 :       O << "swizzle(" << IdSymbolic[ID_REVERSE];
    1209          35 :       O << ",";
    1210          35 :       O << formatDec(XorMask + 1);
    1211          35 :       O << ")";
    1212             : 
    1213             :     } else {
    1214             : 
    1215         132 :       uint16_t GroupSize = BITMASK_MAX - AndMask + 1;
    1216             :       if (GroupSize > 1 &&
    1217         132 :           isPowerOf2_64(GroupSize) &&
    1218         314 :           OrMask < GroupSize &&
    1219          91 :           XorMask == 0) {
    1220             : 
    1221          77 :         O << "swizzle(" << IdSymbolic[ID_BROADCAST];
    1222          77 :         O << ",";
    1223          77 :         O << formatDec(GroupSize);
    1224          77 :         O << ",";
    1225          77 :         O << formatDec(OrMask);
    1226          77 :         O << ")";
    1227             : 
    1228             :       } else {
    1229          55 :         O << "swizzle(" << IdSymbolic[ID_BITMASK_PERM];
    1230          55 :         O << ",";
    1231          55 :         printSwizzleBitmask(AndMask, OrMask, XorMask, O);
    1232          55 :         O << ")";
    1233             :       }
    1234             :     }
    1235             :   } else {
    1236          23 :     printU16ImmDecOperand(MI, OpNo, O);
    1237             :   }
    1238             : }
    1239             : 
    1240       38144 : void AMDGPUInstPrinter::printWaitFlag(const MCInst *MI, unsigned OpNo,
    1241             :                                       const MCSubtargetInfo &STI,
    1242             :                                       raw_ostream &O) {
    1243             :   AMDGPU::IsaInfo::IsaVersion ISA =
    1244       38144 :       AMDGPU::IsaInfo::getIsaVersion(STI.getFeatureBits());
    1245             : 
    1246       38144 :   unsigned SImm16 = MI->getOperand(OpNo).getImm();
    1247             :   unsigned Vmcnt, Expcnt, Lgkmcnt;
    1248       38144 :   decodeWaitcnt(ISA, SImm16, Vmcnt, Expcnt, Lgkmcnt);
    1249             : 
    1250             :   bool NeedSpace = false;
    1251             : 
    1252       38144 :   if (Vmcnt != getVmcntBitMask(ISA)) {
    1253       16799 :     O << "vmcnt(" << Vmcnt << ')';
    1254             :     NeedSpace = true;
    1255             :   }
    1256             : 
    1257       38144 :   if (Expcnt != getExpcntBitMask(ISA)) {
    1258        3704 :     if (NeedSpace)
    1259             :       O << ' ';
    1260        3704 :     O << "expcnt(" << Expcnt << ')';
    1261             :     NeedSpace = true;
    1262             :   }
    1263             : 
    1264       38144 :   if (Lgkmcnt != getLgkmcntBitMask(ISA)) {
    1265       23127 :     if (NeedSpace)
    1266             :       O << ' ';
    1267       23127 :     O << "lgkmcnt(" << Lgkmcnt << ')';
    1268             :   }
    1269       38144 : }
    1270             : 
    1271         336 : void AMDGPUInstPrinter::printHwreg(const MCInst *MI, unsigned OpNo,
    1272             :                                    const MCSubtargetInfo &STI, raw_ostream &O) {
    1273             :   using namespace llvm::AMDGPU::Hwreg;
    1274             : 
    1275         336 :   unsigned SImm16 = MI->getOperand(OpNo).getImm();
    1276         336 :   const unsigned Id = (SImm16 & ID_MASK_) >> ID_SHIFT_;
    1277         336 :   const unsigned Offset = (SImm16 & OFFSET_MASK_) >> OFFSET_SHIFT_;
    1278         336 :   const unsigned Width = ((SImm16 & WIDTH_M1_MASK_) >> WIDTH_M1_SHIFT_) + 1;
    1279             : 
    1280         336 :   O << "hwreg(";
    1281             :   unsigned Last = ID_SYMBOLIC_LAST_;
    1282         336 :   if (AMDGPU::isSI(STI) || AMDGPU::isCI(STI) || AMDGPU::isVI(STI))
    1283             :     Last = ID_SYMBOLIC_FIRST_GFX9_;
    1284         336 :   if (ID_SYMBOLIC_FIRST_ <= Id && Id < Last && IdSymbolic[Id]) {
    1285         275 :     O << IdSymbolic[Id];
    1286             :   } else {
    1287             :     O << Id;
    1288             :   }
    1289         336 :   if (Width != WIDTH_M1_DEFAULT_ + 1 || Offset != OFFSET_DEFAULT_) {
    1290         568 :     O << ", " << Offset << ", " << Width;
    1291             :   }
    1292             :   O << ')';
    1293         336 : }
    1294             : 
    1295             : #include "AMDGPUGenAsmWriter.inc"
    1296             : 
    1297      136744 : void R600InstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
    1298             :                                raw_ostream &O) {
    1299      136744 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '|');
    1300      136744 : }
    1301             : 
    1302       46109 : void R600InstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
    1303             :                                        raw_ostream &O) {
    1304       46109 :   int BankSwizzle = MI->getOperand(OpNo).getImm();
    1305       46109 :   switch (BankSwizzle) {
    1306         969 :   case 1:
    1307         969 :     O << "BS:VEC_021/SCL_122";
    1308         969 :     break;
    1309         708 :   case 2:
    1310         708 :     O << "BS:VEC_120/SCL_212";
    1311         708 :     break;
    1312         115 :   case 3:
    1313         115 :     O << "BS:VEC_102/SCL_221";
    1314         115 :     break;
    1315         176 :   case 4:
    1316         176 :     O << "BS:VEC_201";
    1317         176 :     break;
    1318          30 :   case 5:
    1319          30 :     O << "BS:VEC_210";
    1320          30 :     break;
    1321             :   default:
    1322             :     break;
    1323             :   }
    1324       46109 : }
    1325             : 
    1326       46109 : void R600InstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
    1327             :                                  raw_ostream &O) {
    1328       46109 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "_SAT");
    1329       46109 : }
    1330             : 
    1331        1104 : void R600InstPrinter::printCT(const MCInst *MI, unsigned OpNo,
    1332             :                                 raw_ostream &O) {
    1333        1104 :   unsigned CT = MI->getOperand(OpNo).getImm();
    1334        1104 :   switch (CT) {
    1335             :   case 0:
    1336             :     O << 'U';
    1337             :     break;
    1338             :   case 1:
    1339             :     O << 'N';
    1340             :     break;
    1341             :   default:
    1342             :     break;
    1343             :   }
    1344        1104 : }
    1345             : 
    1346        7344 : void R600InstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
    1347             :                                   raw_ostream &O) {
    1348        7344 :   int KCacheMode = MI->getOperand(OpNo).getImm();
    1349        7344 :   if (KCacheMode > 0) {
    1350        6468 :     int KCacheBank = MI->getOperand(OpNo - 2).getImm();
    1351        3234 :     O << "CB" << KCacheBank << ':';
    1352        6468 :     int KCacheAddr = MI->getOperand(OpNo + 2).getImm();
    1353        3234 :     int LineSize = (KCacheMode == 1) ? 16 : 32;
    1354        6468 :     O << KCacheAddr * 16 << '-' << KCacheAddr * 16 + LineSize;
    1355             :   }
    1356        7344 : }
    1357             : 
    1358       49520 : void R600InstPrinter::printLast(const MCInst *MI, unsigned OpNo,
    1359             :                                 raw_ostream &O) {
    1360       49520 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "*", " ");
    1361       49520 : }
    1362             : 
    1363       27114 : void R600InstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
    1364             :                                    raw_ostream &O) {
    1365             :   const MCOperand &Op = MI->getOperand(OpNo);
    1366             :   assert(Op.isImm() || Op.isExpr());
    1367       27114 :   if (Op.isImm()) {
    1368       27101 :     int64_t Imm = Op.getImm();
    1369       54202 :     O << Imm << '(' << BitsToFloat(Imm) << ')';
    1370             :   }
    1371       27114 :   if (Op.isExpr()) {
    1372          26 :     Op.getExpr()->print(O << '@', &MAI);
    1373             :   }
    1374       27114 : }
    1375             : 
    1376       89945 : void R600InstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
    1377             :                                raw_ostream &O) {
    1378       89945 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '-');
    1379       89945 : }
    1380             : 
    1381       38918 : void R600InstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
    1382             :                                 raw_ostream &O) {
    1383       38918 :   switch (MI->getOperand(OpNo).getImm()) {
    1384             :   default: break;
    1385           0 :   case 1:
    1386           0 :     O << " * 2.0";
    1387           0 :     break;
    1388           0 :   case 2:
    1389           0 :     O << " * 4.0";
    1390           0 :     break;
    1391           0 :   case 3:
    1392           0 :     O << " / 2.0";
    1393           0 :     break;
    1394             :   }
    1395       38918 : }
    1396             : 
    1397        1559 : void R600InstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
    1398             :                                       raw_ostream &O) {
    1399        1559 :   printOperand(MI, OpNo, O);
    1400        1559 :   O  << ", ";
    1401        1559 :   printOperand(MI, OpNo + 1, O);
    1402        1559 : }
    1403             : 
    1404      222177 : void R600InstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
    1405             :                                    raw_ostream &O) {
    1406      222177 :   if (OpNo >= MI->getNumOperands()) {
    1407           0 :     O << "/*Missing OP" << OpNo << "*/";
    1408           0 :     return;
    1409             :   }
    1410             : 
    1411             :   const MCOperand &Op = MI->getOperand(OpNo);
    1412      222177 :   if (Op.isReg()) {
    1413      201615 :     switch (Op.getReg()) {
    1414             :     // This is the default predicate state, so we don't need to print it.
    1415             :     case AMDGPU::PRED_SEL_OFF:
    1416             :       break;
    1417             : 
    1418      152349 :     default:
    1419      152349 :       O << getRegisterName(Op.getReg());
    1420      152349 :       break;
    1421             :     }
    1422       20562 :   } else if (Op.isImm()) {
    1423       20560 :       O << Op.getImm();
    1424           2 :   } else if (Op.isFPImm()) {
    1425             :     // We special case 0.0 because otherwise it will be printed as an integer.
    1426           0 :     if (Op.getFPImm() == 0.0)
    1427           0 :       O << "0.0";
    1428             :     else {
    1429           0 :       O << Op.getFPImm();
    1430             :     }
    1431           2 :   } else if (Op.isExpr()) {
    1432           2 :     const MCExpr *Exp = Op.getExpr();
    1433           2 :     Exp->print(O, &MAI);
    1434             :   } else {
    1435           0 :     O << "/*INV_OP*/";
    1436             :   }
    1437             : }
    1438             : 
    1439      142054 : void R600InstPrinter::printRel(const MCInst *MI, unsigned OpNo,
    1440             :                                raw_ostream &O) {
    1441      142054 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '+');
    1442      142054 : }
    1443             : 
    1444        2448 : void R600InstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
    1445             :                                   raw_ostream &O) {
    1446        2448 :   unsigned Sel = MI->getOperand(OpNo).getImm();
    1447        2448 :   switch (Sel) {
    1448             :   case 0:
    1449             :     O << 'X';
    1450             :     break;
    1451             :   case 1:
    1452             :     O << 'Y';
    1453             :     break;
    1454             :   case 2:
    1455             :     O << 'Z';
    1456             :     break;
    1457             :   case 3:
    1458             :     O << 'W';
    1459             :     break;
    1460             :   case 4:
    1461             :     O << '0';
    1462             :     break;
    1463             :   case 5:
    1464             :     O << '1';
    1465             :     break;
    1466             :   case 7:
    1467             :     O << '_';
    1468             :     break;
    1469             :   default:
    1470             :     break;
    1471             :   }
    1472        2448 : }
    1473             : 
    1474       29454 : void R600InstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
    1475             :                                           raw_ostream &O) {
    1476       29454 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "ExecMask,");
    1477       29454 : }
    1478             : 
    1479       29454 : void R600InstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
    1480             :                                       raw_ostream &O) {
    1481       29454 :   AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "Pred,");
    1482       29454 : }
    1483             : 
    1484       38918 : void R600InstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
    1485             :                                  raw_ostream &O) {
    1486             :   const MCOperand &Op = MI->getOperand(OpNo);
    1487       38918 :   if (Op.getImm() == 0) {
    1488         612 :     O << " (MASKED)";
    1489             :   }
    1490       38918 : }

Generated by: LCOV version 1.13