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