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:
77   MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
78                   const MCRegisterInfo &MRI)
79     : MCInstPrinter(MAI, MII, MRI) {}
80 
81   // Autogenerated by tblgen.
82   void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O);
83   static const char *getRegisterName(unsigned RegNo);
84 
85   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
86   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
87                  const MCSubtargetInfo &STI, raw_ostream &O) override;
88 
89   bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
90   void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
91                                unsigned PrintMethodIdx, raw_ostream &O);
92 
93 private:
94   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
95   template <unsigned Bits, unsigned Offset = 0>
96   void printUImm(const MCInst *MI, int opNum, raw_ostream &O);
97   void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
98   void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
99   void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
100   void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);
101 
102   bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo,
103                   raw_ostream &OS);
104   bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0,
105                   unsigned OpNo1, raw_ostream &OS);
106   bool printAlias(const MCInst &MI, raw_ostream &OS);
107   void printSaveRestore(const MCInst *MI, raw_ostream &O);
108   void printRegisterList(const MCInst *MI, int opNum, raw_ostream &O);
109 };
110 } // end namespace llvm
111 
112 #endif
113