xref: /llvm-project/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.h (revision d064d3fc2cf8841963151f428988475aab09ff56)
12758a013SAndrei Safronov //===- XtensaInstPrinter.h - Convert Xtensa MCInst to asm syntax -*- C++ -*-==//
22758a013SAndrei Safronov //
32758a013SAndrei Safronov //                     The LLVM Compiler Infrastructure
42758a013SAndrei Safronov //
52758a013SAndrei Safronov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
62758a013SAndrei Safronov // See https://llvm.org/LICENSE.txt for license information.
72758a013SAndrei Safronov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
82758a013SAndrei Safronov //
92758a013SAndrei Safronov //===----------------------------------------------------------------------===//
102758a013SAndrei Safronov //
112758a013SAndrei Safronov // This class prints an Xtensa MCInst to a .s file.
122758a013SAndrei Safronov //
132758a013SAndrei Safronov //===----------------------------------------------------------------------===//
142758a013SAndrei Safronov 
152758a013SAndrei Safronov #ifndef LLVM_LIB_TARGET_XTENSA_MCTARGETDESC_XTENSAINSTPRINTER_H
162758a013SAndrei Safronov #define LLVM_LIB_TARGET_XTENSA_MCTARGETDESC_XTENSAINSTPRINTER_H
172758a013SAndrei Safronov 
182758a013SAndrei Safronov #include "llvm/MC/MCInstPrinter.h"
192758a013SAndrei Safronov #include "llvm/Support/Compiler.h"
202758a013SAndrei Safronov 
212758a013SAndrei Safronov namespace llvm {
222758a013SAndrei Safronov class MCOperand;
232758a013SAndrei Safronov 
242758a013SAndrei Safronov class XtensaInstPrinter : public MCInstPrinter {
252758a013SAndrei Safronov public:
262758a013SAndrei Safronov   XtensaInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
272758a013SAndrei Safronov                     const MCRegisterInfo &MRI)
282758a013SAndrei Safronov       : MCInstPrinter(MAI, MII, MRI) {}
292758a013SAndrei Safronov 
302758a013SAndrei Safronov   // Automatically generated by tblgen.
31eeb987f6SSergei Barannikov   std::pair<const char *, uint64_t>
32eeb987f6SSergei Barannikov   getMnemonic(const MCInst &MI) const override;
332758a013SAndrei Safronov   void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O);
346ae84d66SSergei Barannikov   static const char *getRegisterName(MCRegister Reg);
352758a013SAndrei Safronov 
362758a013SAndrei Safronov   // Print the given operand.
372758a013SAndrei Safronov   static void printOperand(const MCOperand &MO, raw_ostream &O);
382758a013SAndrei Safronov 
392758a013SAndrei Safronov   // Override MCInstPrinter.
40facdae62SFangrui Song   void printRegName(raw_ostream &O, MCRegister Reg) override;
412758a013SAndrei Safronov   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
422758a013SAndrei Safronov                  const MCSubtargetInfo &STI, raw_ostream &O) override;
432758a013SAndrei Safronov 
442758a013SAndrei Safronov private:
452758a013SAndrei Safronov   // Print various types of operand.
462758a013SAndrei Safronov   void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
474e0c1d98SAndrei Safronov   void printMemOperand(const MCInst *MI, int OpNUm, raw_ostream &O);
48ff25800dSAndrei Safronov   void printBranchTarget(const MCInst *MI, int OpNum, raw_ostream &O);
49ff25800dSAndrei Safronov   void printJumpTarget(const MCInst *MI, int OpNum, raw_ostream &O);
50ff25800dSAndrei Safronov   void printCallOperand(const MCInst *MI, int OpNum, raw_ostream &O);
51ff25800dSAndrei Safronov   void printL32RTarget(const MCInst *MI, int OpNum, raw_ostream &O);
522758a013SAndrei Safronov 
532758a013SAndrei Safronov   void printImm8_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
542758a013SAndrei Safronov   void printImm8_sh8_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
554e0c1d98SAndrei Safronov   void printImm12_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
564e0c1d98SAndrei Safronov   void printImm12m_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
574e0c1d98SAndrei Safronov   void printUimm4_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
584e0c1d98SAndrei Safronov   void printUimm5_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
594e0c1d98SAndrei Safronov   void printShimm1_31_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
604e0c1d98SAndrei Safronov   void printImm1_16_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
61*c6967efeSAndrei Safronov   void printImm1n_15_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
62*c6967efeSAndrei Safronov   void printImm32n_95_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
634e0c1d98SAndrei Safronov   void printOffset8m8_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
644e0c1d98SAndrei Safronov   void printOffset8m16_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
654e0c1d98SAndrei Safronov   void printOffset8m32_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
664e0c1d98SAndrei Safronov   void printOffset4m32_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
67ff25800dSAndrei Safronov   void printB4const_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
68ff25800dSAndrei Safronov   void printB4constu_AsmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
692758a013SAndrei Safronov };
702758a013SAndrei Safronov } // end namespace llvm
712758a013SAndrei Safronov 
722758a013SAndrei Safronov #endif /* LLVM_LIB_TARGET_XTENSA_MCTARGETDESC_XTENSAINSTPRINTER_H */
73