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
17namespace 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.
21namespace Mips {
22// Mips Branch Codes
23enum FPBranchCode {
24  BRANCH_F,
25  BRANCH_T,
26  BRANCH_FL,
27  BRANCH_TL,
28  BRANCH_INVALID
29};
30
31// Mips Condition Codes
32enum 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
72const char *MipsFCCToString(Mips::CondCode CC);
73} // end namespace Mips
74
75class MipsInstPrinter : public MCInstPrinter {
76public:
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
93private:
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