1351278Sdim//=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==//
2351278Sdim//
3351278Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4351278Sdim// See https://llvm.org/LICENSE.txt for license information.
5351278Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6351278Sdim//
7351278Sdim//===----------------------------------------------------------------------===//
8351278Sdim//
9351278Sdim// This class prints a Mips MCInst to a .s file.
10351278Sdim//
11351278Sdim//===----------------------------------------------------------------------===//
12351278Sdim
13351278Sdim#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H
14351278Sdim#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H
15351278Sdim#include "llvm/MC/MCInstPrinter.h"
16351278Sdim
17351278Sdimnamespace llvm {
18351278Sdim// These enumeration declarations were originally in MipsInstrInfo.h but
19351278Sdim// had to be moved here to avoid circular dependencies between
20351278Sdim// LLVMMipsCodeGen and LLVMMipsAsmPrinter.
21351278Sdimnamespace Mips {
22351278Sdim// Mips Branch Codes
23351278Sdimenum FPBranchCode {
24351278Sdim  BRANCH_F,
25351278Sdim  BRANCH_T,
26351278Sdim  BRANCH_FL,
27351278Sdim  BRANCH_TL,
28351278Sdim  BRANCH_INVALID
29351278Sdim};
30351278Sdim
31351278Sdim// Mips Condition Codes
32351278Sdimenum CondCode {
33351278Sdim  // To be used with float branch True
34351278Sdim  FCOND_F,
35351278Sdim  FCOND_UN,
36351278Sdim  FCOND_OEQ,
37351278Sdim  FCOND_UEQ,
38351278Sdim  FCOND_OLT,
39351278Sdim  FCOND_ULT,
40351278Sdim  FCOND_OLE,
41351278Sdim  FCOND_ULE,
42351278Sdim  FCOND_SF,
43351278Sdim  FCOND_NGLE,
44351278Sdim  FCOND_SEQ,
45351278Sdim  FCOND_NGL,
46351278Sdim  FCOND_LT,
47351278Sdim  FCOND_NGE,
48351278Sdim  FCOND_LE,
49351278Sdim  FCOND_NGT,
50351278Sdim
51351278Sdim  // To be used with float branch False
52351278Sdim  // This conditions have the same mnemonic as the
53351278Sdim  // above ones, but are used with a branch False;
54351278Sdim  FCOND_T,
55351278Sdim  FCOND_OR,
56351278Sdim  FCOND_UNE,
57351278Sdim  FCOND_ONE,
58351278Sdim  FCOND_UGE,
59351278Sdim  FCOND_OGE,
60351278Sdim  FCOND_UGT,
61351278Sdim  FCOND_OGT,
62351278Sdim  FCOND_ST,
63351278Sdim  FCOND_GLE,
64351278Sdim  FCOND_SNE,
65351278Sdim  FCOND_GL,
66351278Sdim  FCOND_NLT,
67351278Sdim  FCOND_GE,
68351278Sdim  FCOND_NLE,
69351278Sdim  FCOND_GT
70351278Sdim};
71351278Sdim
72351278Sdimconst char *MipsFCCToString(Mips::CondCode CC);
73351278Sdim} // end namespace Mips
74351278Sdim
75351278Sdimclass MipsInstPrinter : public MCInstPrinter {
76351278Sdimpublic:
77351278Sdim  MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
78351278Sdim                  const MCRegisterInfo &MRI)
79351278Sdim    : MCInstPrinter(MAI, MII, MRI) {}
80351278Sdim
81351278Sdim  // Autogenerated by tblgen.
82360784Sdim  void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O);
83351278Sdim  static const char *getRegisterName(unsigned RegNo);
84351278Sdim
85351278Sdim  void printRegName(raw_ostream &OS, unsigned RegNo) const override;
86360784Sdim  void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
87360784Sdim                 const MCSubtargetInfo &STI, raw_ostream &O) override;
88351278Sdim
89351278Sdim  bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
90351278Sdim  void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
91351278Sdim                               unsigned PrintMethodIdx, raw_ostream &O);
92351278Sdim
93351278Sdimprivate:
94351278Sdim  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
95351278Sdim  template <unsigned Bits, unsigned Offset = 0>
96351278Sdim  void printUImm(const MCInst *MI, int opNum, raw_ostream &O);
97351278Sdim  void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
98351278Sdim  void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
99351278Sdim  void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
100351278Sdim  void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);
101351278Sdim
102351278Sdim  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo,
103351278Sdim                  raw_ostream &OS);
104351278Sdim  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0,
105351278Sdim                  unsigned OpNo1, raw_ostream &OS);
106351278Sdim  bool printAlias(const MCInst &MI, raw_ostream &OS);
107351278Sdim  void printSaveRestore(const MCInst *MI, raw_ostream &O);
108351278Sdim  void printRegisterList(const MCInst *MI, int opNum, raw_ostream &O);
109351278Sdim};
110351278Sdim} // end namespace llvm
111351278Sdim
112351278Sdim#endif
113