18f5e8c1cd69fa77bea20140a7132ee2dea166c6dJia Liu//=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==//
2794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//
3794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//                     The LLVM Compiler Infrastructure
4794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//
5794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// This file is distributed under the University of Illinois Open Source
6794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// License. See LICENSE.TXT for details.
7794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//
8794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//===----------------------------------------------------------------------===//
9794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//
10794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// This class prints a Mips MCInst to a .s file.
11794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//
12794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka//===----------------------------------------------------------------------===//
13794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
14794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#ifndef MIPSINSTPRINTER_H
15794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#define MIPSINSTPRINTER_H
16794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#include "llvm/MC/MCInstPrinter.h"
17794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
18794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakanamespace llvm {
19d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer// These enumeration declarations were originally in MipsInstrInfo.h but
20794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// had to be moved here to avoid circular dependencies between
21bb481f882093fb738d2bb15610c79364bada5496Jia Liu// LLVMMipsCodeGen and LLVMMipsAsmPrinter.
22794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakanamespace Mips {
23794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// Mips Branch Codes
24794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaenum FPBranchCode {
25794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  BRANCH_F,
26794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  BRANCH_T,
27794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  BRANCH_FL,
28794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  BRANCH_TL,
29794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  BRANCH_INVALID
30794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka};
31794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
32794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka// Mips Condition Codes
33794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaenum CondCode {
34794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  // To be used with float branch True
35794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_F,
36794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_UN,
37794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OEQ,
38794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_UEQ,
39794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OLT,
40794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_ULT,
41794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OLE,
42794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_ULE,
43794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_SF,
44794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NGLE,
45794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_SEQ,
46794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NGL,
47794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_LT,
48794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NGE,
49794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_LE,
50794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NGT,
51794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
52794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  // To be used with float branch False
53794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  // This conditions have the same mnemonic as the
54794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  // above ones, but are used with a branch False;
55794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_T,
56794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OR,
57794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_UNE,
58794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_ONE,
59794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_UGE,
60794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OGE,
61794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_UGT,
62794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_OGT,
63794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_ST,
64794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_GLE,
65794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_SNE,
66794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_GL,
67794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NLT,
68794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_GE,
69794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_NLE,
70794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  FCOND_GT
71794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka};
72794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
73794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaconst char *MipsFCCToString(Mips::CondCode CC);
74794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka} // end namespace Mips
75794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
76794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaclass TargetMachine;
77794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
78794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaclass MipsInstPrinter : public MCInstPrinter {
79794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakapublic:
8017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper  MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
8117463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                  const MCRegisterInfo &MRI)
8217463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper    : MCInstPrinter(MAI, MII, MRI) {}
83bb481f882093fb738d2bb15610c79364bada5496Jia Liu
84794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  // Autogenerated by tblgen.
85794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printInstruction(const MCInst *MI, raw_ostream &O);
86794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  static const char *getRegisterName(unsigned RegNo);
87bb481f882093fb738d2bb15610c79364bada5496Jia Liu
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void printRegName(raw_ostream &OS, unsigned RegNo) const override;
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
90bb481f882093fb738d2bb15610c79364bada5496Jia Liu
9137ef65b9c1b93c386d13089d9ace6a1cc00e82dcJack Carter  bool printAliasInstr(const MCInst *MI, raw_ostream &OS);
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               unsigned PrintMethodIdx, raw_ostream &O);
9437ef65b9c1b93c386d13089d9ace6a1cc00e82dcJack Carter
95794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanakaprivate:
96794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
97794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printUnsignedImm(const MCInst *MI, int opNum, raw_ostream &O);
98c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  void printUnsignedImm8(const MCInst *MI, int opNum, raw_ostream &O);
99794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
100794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O);
101794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka  void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O);
10293d995719e2459a6e9ccdb2c93a8ede8fa88c899Daniel Sanders  void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);
1039b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka
1049b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo,
1059b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka                  raw_ostream &OS);
1069b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka  bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0,
1079b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka                  unsigned OpNo1, raw_ostream &OS);
1089b06dd6ca25fd1f8d2cf9227fdffc304c9f51564Akira Hatanaka  bool printAlias(const MCInst &MI, raw_ostream &OS);
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSaveRestore(const MCInst *MI, raw_ostream &O);
110794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka};
111794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka} // end namespace llvm
112794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
113794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#endif
114