xref: /aosp_15_r20/external/llvm/lib/Target/Mips/InstPrinter/MipsInstPrinter.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This class prints a Mips MCInst to a .s file.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_INSTPRINTER_MIPSINSTPRINTER_H
15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_INSTPRINTER_MIPSINSTPRINTER_H
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstPrinter.h"
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker namespace llvm {
19*9880d681SAndroid Build Coastguard Worker // These enumeration declarations were originally in MipsInstrInfo.h but
20*9880d681SAndroid Build Coastguard Worker // had to be moved here to avoid circular dependencies between
21*9880d681SAndroid Build Coastguard Worker // LLVMMipsCodeGen and LLVMMipsAsmPrinter.
22*9880d681SAndroid Build Coastguard Worker namespace Mips {
23*9880d681SAndroid Build Coastguard Worker // Mips Branch Codes
24*9880d681SAndroid Build Coastguard Worker enum FPBranchCode {
25*9880d681SAndroid Build Coastguard Worker   BRANCH_F,
26*9880d681SAndroid Build Coastguard Worker   BRANCH_T,
27*9880d681SAndroid Build Coastguard Worker   BRANCH_FL,
28*9880d681SAndroid Build Coastguard Worker   BRANCH_TL,
29*9880d681SAndroid Build Coastguard Worker   BRANCH_INVALID
30*9880d681SAndroid Build Coastguard Worker };
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker // Mips Condition Codes
33*9880d681SAndroid Build Coastguard Worker enum CondCode {
34*9880d681SAndroid Build Coastguard Worker   // To be used with float branch True
35*9880d681SAndroid Build Coastguard Worker   FCOND_F,
36*9880d681SAndroid Build Coastguard Worker   FCOND_UN,
37*9880d681SAndroid Build Coastguard Worker   FCOND_OEQ,
38*9880d681SAndroid Build Coastguard Worker   FCOND_UEQ,
39*9880d681SAndroid Build Coastguard Worker   FCOND_OLT,
40*9880d681SAndroid Build Coastguard Worker   FCOND_ULT,
41*9880d681SAndroid Build Coastguard Worker   FCOND_OLE,
42*9880d681SAndroid Build Coastguard Worker   FCOND_ULE,
43*9880d681SAndroid Build Coastguard Worker   FCOND_SF,
44*9880d681SAndroid Build Coastguard Worker   FCOND_NGLE,
45*9880d681SAndroid Build Coastguard Worker   FCOND_SEQ,
46*9880d681SAndroid Build Coastguard Worker   FCOND_NGL,
47*9880d681SAndroid Build Coastguard Worker   FCOND_LT,
48*9880d681SAndroid Build Coastguard Worker   FCOND_NGE,
49*9880d681SAndroid Build Coastguard Worker   FCOND_LE,
50*9880d681SAndroid Build Coastguard Worker   FCOND_NGT,
51*9880d681SAndroid Build Coastguard Worker 
52*9880d681SAndroid Build Coastguard Worker   // To be used with float branch False
53*9880d681SAndroid Build Coastguard Worker   // This conditions have the same mnemonic as the
54*9880d681SAndroid Build Coastguard Worker   // above ones, but are used with a branch False;
55*9880d681SAndroid Build Coastguard Worker   FCOND_T,
56*9880d681SAndroid Build Coastguard Worker   FCOND_OR,
57*9880d681SAndroid Build Coastguard Worker   FCOND_UNE,
58*9880d681SAndroid Build Coastguard Worker   FCOND_ONE,
59*9880d681SAndroid Build Coastguard Worker   FCOND_UGE,
60*9880d681SAndroid Build Coastguard Worker   FCOND_OGE,
61*9880d681SAndroid Build Coastguard Worker   FCOND_UGT,
62*9880d681SAndroid Build Coastguard Worker   FCOND_OGT,
63*9880d681SAndroid Build Coastguard Worker   FCOND_ST,
64*9880d681SAndroid Build Coastguard Worker   FCOND_GLE,
65*9880d681SAndroid Build Coastguard Worker   FCOND_SNE,
66*9880d681SAndroid Build Coastguard Worker   FCOND_GL,
67*9880d681SAndroid Build Coastguard Worker   FCOND_NLT,
68*9880d681SAndroid Build Coastguard Worker   FCOND_GE,
69*9880d681SAndroid Build Coastguard Worker   FCOND_NLE,
70*9880d681SAndroid Build Coastguard Worker   FCOND_GT
71*9880d681SAndroid Build Coastguard Worker };
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker const char *MipsFCCToString(Mips::CondCode CC);
74*9880d681SAndroid Build Coastguard Worker } // end namespace Mips
75*9880d681SAndroid Build Coastguard Worker 
76*9880d681SAndroid Build Coastguard Worker class MipsInstPrinter : public MCInstPrinter {
77*9880d681SAndroid Build Coastguard Worker public:
MipsInstPrinter(const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)78*9880d681SAndroid Build Coastguard Worker   MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
79*9880d681SAndroid Build Coastguard Worker                   const MCRegisterInfo &MRI)
80*9880d681SAndroid Build Coastguard Worker     : MCInstPrinter(MAI, MII, MRI) {}
81*9880d681SAndroid Build Coastguard Worker 
82*9880d681SAndroid Build Coastguard Worker   // Autogenerated by tblgen.
83*9880d681SAndroid Build Coastguard Worker   void printInstruction(const MCInst *MI, raw_ostream &O);
84*9880d681SAndroid Build Coastguard Worker   static const char *getRegisterName(unsigned RegNo);
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
87*9880d681SAndroid Build Coastguard Worker   void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
88*9880d681SAndroid Build Coastguard Worker                  const MCSubtargetInfo &STI) override;
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker   bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
91*9880d681SAndroid Build Coastguard Worker   void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
92*9880d681SAndroid Build Coastguard Worker                                unsigned PrintMethodIdx, raw_ostream &O);
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker private:
95*9880d681SAndroid Build Coastguard Worker   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
96*9880d681SAndroid Build Coastguard Worker   template <unsigned Bits, unsigned Offset = 0>
97*9880d681SAndroid Build Coastguard Worker   void printUImm(const MCInst *MI, int opNum, raw_ostream &O);
98*9880d681SAndroid Build Coastguard Worker   void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
99*9880d681SAndroid Build Coastguard Worker   void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
100*9880d681SAndroid Build Coastguard Worker   void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
101*9880d681SAndroid Build Coastguard Worker   void printRegisterPair(const MCInst *MI, int opNum, raw_ostream &O);
102*9880d681SAndroid Build Coastguard Worker   void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker   bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo,
105*9880d681SAndroid Build Coastguard Worker                   raw_ostream &OS);
106*9880d681SAndroid Build Coastguard Worker   bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0,
107*9880d681SAndroid Build Coastguard Worker                   unsigned OpNo1, raw_ostream &OS);
108*9880d681SAndroid Build Coastguard Worker   bool printAlias(const MCInst &MI, raw_ostream &OS);
109*9880d681SAndroid Build Coastguard Worker   void printSaveRestore(const MCInst *MI, raw_ostream &O);
110*9880d681SAndroid Build Coastguard Worker   void printRegisterList(const MCInst *MI, int opNum, raw_ostream &O);
111*9880d681SAndroid Build Coastguard Worker };
112*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker #endif
115