text: //===-- AMDGPUInstPrinter.h - AMDGPU MC Inst -> ASM interface ---*- C++ -*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  //
  //===----------------------------------------------------------------------===//
  //
  /// \file
  //===----------------------------------------------------------------------===//
  
  #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H
  #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H
  
  #include "llvm/MC/MCInstPrinter.h"
  
  namespace llvm {
  
  class AMDGPUInstPrinter : public MCInstPrinter {
  public:
    AMDGPUInstPrinter(const MCAsmInfo &MAI,
                      const MCInstrInfo &MII, const MCRegisterInfo &MRI)
      : MCInstPrinter(MAI, MII, MRI) {}
  
    //Autogenerated by tblgen
    void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
                          raw_ostream &O);
    static const char *getRegisterName(unsigned RegNo);
  
    void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
                   const MCSubtargetInfo &STI) override;
    static void printRegOperand(unsigned RegNo, raw_ostream &O,
                                const MCRegisterInfo &MRI);
  
  private:
    void printU4ImmOperand(const MCInst *MI, unsigned OpNo,
                           const MCSubtargetInfo &STI, raw_ostream &O);
    void printU8ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printU16ImmOperand(const MCInst *MI, unsigned OpNo,
                            const MCSubtargetInfo &STI, raw_ostream &O);
    void printU4ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printU8ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printU16ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printU32ImmOperand(const MCInst *MI, unsigned OpNo,
                            const MCSubtargetInfo &STI, raw_ostream &O);
    void printNamedBit(const MCInst *MI, unsigned OpNo, raw_ostream &O,
                       StringRef BitName);
    void printOffen(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printIdxen(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printAddr64(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printMBUFOffset(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                     raw_ostream &O);
    void printFlatOffset(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                         raw_ostream &O);
  
    void printOffset0(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printOffset1(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printSMRDOffset8(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printSMRDOffset20(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
                                const MCSubtargetInfo &STI, raw_ostream &O);
    void printGDS(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printDLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printGLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printSLC(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printSWZ(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printTFE(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printDMask(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
    void printDim(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printUNorm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
    void printDA(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                 raw_ostream &O);
    void printR128A16(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printLWE(const MCInst *MI, unsigned OpNo,
                  const MCSubtargetInfo &STI, raw_ostream &O);
    void printD16(const MCInst *MI, unsigned OpNo,
                  const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpCompr(const MCInst *MI, unsigned OpNo,
                       const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpVM(const MCInst *MI, unsigned OpNo,
                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printFORMAT(const MCInst *MI, unsigned OpNo,
                     const MCSubtargetInfo &STI, raw_ostream &O);
  
    void printRegOperand(unsigned RegNo, raw_ostream &O);
    void printVOPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                     raw_ostream &O);
    void printVINTRPDst(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                        raw_ostream &O);
    void printImmediate16(uint32_t Imm, const MCSubtargetInfo &STI,
                          raw_ostream &O);
    void printImmediateV216(uint32_t Imm, const MCSubtargetInfo &STI,
                            raw_ostream &O);
    void printImmediate32(uint32_t Imm, const MCSubtargetInfo &STI,
                          raw_ostream &O);
    void printImmediate64(uint64_t Imm, const MCSubtargetInfo &STI,
                          raw_ostream &O);
    void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printOperandAndFPInputMods(const MCInst *MI, unsigned OpNo,
                                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printOperandAndIntInputMods(const MCInst *MI, unsigned OpNo,
                                     const MCSubtargetInfo &STI, raw_ostream &O);
    void printDPP8(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printDPPCtrl(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printRowMask(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printBankMask(const MCInst *MI, unsigned OpNo,
                       const MCSubtargetInfo &STI, raw_ostream &O);
    void printBoundCtrl(const MCInst *MI, unsigned OpNo,
                        const MCSubtargetInfo &STI, raw_ostream &O);
    void printFI(const MCInst *MI, unsigned OpNo,
                 const MCSubtargetInfo &STI, raw_ostream &O);
    void printSDWASel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printSDWADstSel(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
                          const MCSubtargetInfo &STI, raw_ostream &O);
    void printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
                          const MCSubtargetInfo &STI, raw_ostream &O);
    void printSDWADstUnused(const MCInst *MI, unsigned OpNo,
                            const MCSubtargetInfo &STI, raw_ostream &O);
    void printPackedModifier(const MCInst *MI, StringRef Name, unsigned Mod,
                             raw_ostream &O);
    void printOpSel(const MCInst *MI, unsigned OpNo,
                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printOpSelHi(const MCInst *MI, unsigned OpNo,
                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printNegLo(const MCInst *MI, unsigned OpNo,
                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printNegHi(const MCInst *MI, unsigned OpNo,
                    const MCSubtargetInfo &STI, raw_ostream &O);
    void printInterpSlot(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printInterpAttr(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printInterpAttrChan(const MCInst *MI, unsigned OpNo,
                             const MCSubtargetInfo &STI, raw_ostream &O);
  
    void printVGPRIndexMode(const MCInst *MI, unsigned OpNo,
                            const MCSubtargetInfo &STI, raw_ostream &O);
    void printMemOperand(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printBLGP(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printCBSZ(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printABID(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printDefaultVccOperand(unsigned OpNo, const MCSubtargetInfo &STI,
                                raw_ostream &O);
  
  
    template <unsigned N>
    void printExpSrcN(const MCInst *MI, unsigned OpNo,
                      const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpSrc0(const MCInst *MI, unsigned OpNo,
                      const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpSrc1(const MCInst *MI, unsigned OpNo,
                      const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpSrc2(const MCInst *MI, unsigned OpNo,
                      const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpSrc3(const MCInst *MI, unsigned OpNo,
                      const MCSubtargetInfo &STI, raw_ostream &O);
    void printExpTgt(const MCInst *MI, unsigned OpNo,
                     const MCSubtargetInfo &STI, raw_ostream &O);
  
  public:
    static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
                           StringRef Asm, StringRef Default = "");
    static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,
                           char Asm);
  protected:
    void printAbs(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printHigh(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printClamp(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
    void printClampSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printOModSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                     raw_ostream &O);
    void printLiteral(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printLast(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printNeg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printOMOD(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printRel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                  raw_ostream &O);
    void printUpdateExecMask(const MCInst *MI, unsigned OpNo,
                             const MCSubtargetInfo &STI, raw_ostream &O);
    void printUpdatePred(const MCInst *MI, unsigned OpNo,
                         const MCSubtargetInfo &STI, raw_ostream &O);
    void printWrite(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
    void printBankSwizzle(const MCInst *MI, unsigned OpNo,
                          const MCSubtargetInfo &STI, raw_ostream &O);
    void printRSel(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                   raw_ostream &O);
    void printCT(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                 raw_ostream &O);
    void printKCache(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                     raw_ostream &O);
    void printSendMsg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printSwizzle(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                      raw_ostream &O);
    void printWaitFlag(const MCInst *MI, unsigned OpNo,
                       const MCSubtargetInfo &STI, raw_ostream &O);
    void printHwreg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
    void printEndpgm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                     raw_ostream &O);
  };
  
  class R600InstPrinter : public MCInstPrinter {
  public:
    R600InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
                    const MCRegisterInfo &MRI)
      : MCInstPrinter(MAI, MII, MRI) {}
  
    void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
                   const MCSubtargetInfo &STI) override;
    void printInstruction(const MCInst *MI, raw_ostream &O);
    static const char *getRegisterName(unsigned RegNo);
  
    void printAbs(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printBankSwizzle(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printClamp(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printCT(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printKCache(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printLast(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printLiteral(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printNeg(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printOMOD(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printRel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printRSel(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printUpdateExecMask(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printUpdatePred(const MCInst *MI, unsigned OpNo, raw_ostream &O);
    void printWrite(const MCInst *MI, unsigned OpNo, raw_ostream &O);
  };
  
  } // End namespace llvm
  
  #endif
  