1234353Sdim//=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// This class prints a Mips MCInst to a .s file.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14280031Sdim#ifndef LLVM_LIB_TARGET_MIPS_INSTPRINTER_MIPSINSTPRINTER_H
15280031Sdim#define LLVM_LIB_TARGET_MIPS_INSTPRINTER_MIPSINSTPRINTER_H
16224133Sdim#include "llvm/MC/MCInstPrinter.h"
17224133Sdim
18224133Sdimnamespace llvm {
19239462Sdim// These enumeration declarations were originally in MipsInstrInfo.h but
20224133Sdim// had to be moved here to avoid circular dependencies between
21234353Sdim// LLVMMipsCodeGen and LLVMMipsAsmPrinter.
22224133Sdimnamespace Mips {
23224133Sdim// Mips Branch Codes
24224133Sdimenum FPBranchCode {
25224133Sdim  BRANCH_F,
26224133Sdim  BRANCH_T,
27224133Sdim  BRANCH_FL,
28224133Sdim  BRANCH_TL,
29224133Sdim  BRANCH_INVALID
30224133Sdim};
31224133Sdim
32224133Sdim// Mips Condition Codes
33224133Sdimenum CondCode {
34224133Sdim  // To be used with float branch True
35224133Sdim  FCOND_F,
36224133Sdim  FCOND_UN,
37224133Sdim  FCOND_OEQ,
38224133Sdim  FCOND_UEQ,
39224133Sdim  FCOND_OLT,
40224133Sdim  FCOND_ULT,
41224133Sdim  FCOND_OLE,
42224133Sdim  FCOND_ULE,
43224133Sdim  FCOND_SF,
44224133Sdim  FCOND_NGLE,
45224133Sdim  FCOND_SEQ,
46224133Sdim  FCOND_NGL,
47224133Sdim  FCOND_LT,
48224133Sdim  FCOND_NGE,
49224133Sdim  FCOND_LE,
50224133Sdim  FCOND_NGT,
51224133Sdim
52224133Sdim  // To be used with float branch False
53224133Sdim  // This conditions have the same mnemonic as the
54224133Sdim  // above ones, but are used with a branch False;
55224133Sdim  FCOND_T,
56224133Sdim  FCOND_OR,
57224133Sdim  FCOND_UNE,
58224133Sdim  FCOND_ONE,
59224133Sdim  FCOND_UGE,
60224133Sdim  FCOND_OGE,
61224133Sdim  FCOND_UGT,
62224133Sdim  FCOND_OGT,
63224133Sdim  FCOND_ST,
64224133Sdim  FCOND_GLE,
65224133Sdim  FCOND_SNE,
66224133Sdim  FCOND_GL,
67224133Sdim  FCOND_NLT,
68224133Sdim  FCOND_GE,
69224133Sdim  FCOND_NLE,
70224133Sdim  FCOND_GT
71224133Sdim};
72224133Sdim
73224133Sdimconst char *MipsFCCToString(Mips::CondCode CC);
74224133Sdim} // end namespace Mips
75224133Sdim
76224133Sdimclass MipsInstPrinter : public MCInstPrinter {
77224133Sdimpublic:
78234353Sdim  MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
79234353Sdim                  const MCRegisterInfo &MRI)
80234353Sdim    : MCInstPrinter(MAI, MII, MRI) {}
81234353Sdim
82224133Sdim  // Autogenerated by tblgen.
83224133Sdim  void printInstruction(const MCInst *MI, raw_ostream &O);
84224133Sdim  static const char *getRegisterName(unsigned RegNo);
85234353Sdim
86276479Sdim  void printRegName(raw_ostream &OS, unsigned RegNo) const override;
87288943Sdim  void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
88288943Sdim                 const MCSubtargetInfo &STI) override;
89234353Sdim
90249423Sdim  bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
91276479Sdim  void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
92276479Sdim                               unsigned PrintMethodIdx, raw_ostream &O);
93249423Sdim
94224133Sdimprivate:
95224133Sdim  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
96224133Sdim  void printUnsignedImm(const MCInst *MI, int opNum, raw_ostream &O);
97261991Sdim  void printUnsignedImm8(const MCInst *MI, int opNum, raw_ostream &O);
98224133Sdim  void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
99224133Sdim  void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
100224133Sdim  void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
101280031Sdim  void printRegisterPair(const MCInst *MI, int opNum, raw_ostream &O);
102261991Sdim  void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);
103261991Sdim
104261991Sdim  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo,
105261991Sdim                  raw_ostream &OS);
106261991Sdim  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0,
107261991Sdim                  unsigned OpNo1, raw_ostream &OS);
108261991Sdim  bool printAlias(const MCInst &MI, raw_ostream &OS);
109276479Sdim  void printSaveRestore(const MCInst *MI, raw_ostream &O);
110280031Sdim  void printRegisterList(const MCInst *MI, int opNum, raw_ostream &O);
111224133Sdim};
112224133Sdim} // end namespace llvm
113224133Sdim
114224133Sdim#endif
115