1 //=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This class prints a Mips MCInst to a .s file. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef MIPSINSTPRINTER_H 15 #define MIPSINSTPRINTER_H 16 #include "llvm/MC/MCInstPrinter.h" 17 18 namespace llvm { 19 // These enumeration declarations were originally in MipsInstrInfo.h but 20 // had to be moved here to avoid circular dependencies between 21 // LLVMMipsCodeGen and LLVMMipsAsmPrinter. 22 namespace Mips { 23 // Mips Branch Codes 24 enum FPBranchCode { 25 BRANCH_F, 26 BRANCH_T, 27 BRANCH_FL, 28 BRANCH_TL, 29 BRANCH_INVALID 30 }; 31 32 // Mips Condition Codes 33 enum CondCode { 34 // To be used with float branch True 35 FCOND_F, 36 FCOND_UN, 37 FCOND_OEQ, 38 FCOND_UEQ, 39 FCOND_OLT, 40 FCOND_ULT, 41 FCOND_OLE, 42 FCOND_ULE, 43 FCOND_SF, 44 FCOND_NGLE, 45 FCOND_SEQ, 46 FCOND_NGL, 47 FCOND_LT, 48 FCOND_NGE, 49 FCOND_LE, 50 FCOND_NGT, 51 52 // To be used with float branch False 53 // This conditions have the same mnemonic as the 54 // above ones, but are used with a branch False; 55 FCOND_T, 56 FCOND_OR, 57 FCOND_UNE, 58 FCOND_ONE, 59 FCOND_UGE, 60 FCOND_OGE, 61 FCOND_UGT, 62 FCOND_OGT, 63 FCOND_ST, 64 FCOND_GLE, 65 FCOND_SNE, 66 FCOND_GL, 67 FCOND_NLT, 68 FCOND_GE, 69 FCOND_NLE, 70 FCOND_GT 71 }; 72 73 const char *MipsFCCToString(Mips::CondCode CC); 74 } // end namespace Mips 75 76 class TargetMachine; 77 78 class MipsInstPrinter : public MCInstPrinter { 79 public: MipsInstPrinter(const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)80 MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 81 const MCRegisterInfo &MRI) 82 : MCInstPrinter(MAI, MII, MRI) {} 83 84 // Autogenerated by tblgen. 85 void printInstruction(const MCInst *MI, raw_ostream &O); 86 static const char *getRegisterName(unsigned RegNo); 87 88 void printRegName(raw_ostream &OS, unsigned RegNo) const override; 89 void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override; 90 91 bool printAliasInstr(const MCInst *MI, raw_ostream &OS); 92 void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx, 93 unsigned PrintMethodIdx, raw_ostream &O); 94 95 private: 96 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); 97 void printUnsignedImm(const MCInst *MI, int opNum, raw_ostream &O); 98 void printUnsignedImm8(const MCInst *MI, int opNum, raw_ostream &O); 99 void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O); 100 void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O); 101 void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O); 102 void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O); 103 104 bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo, 105 raw_ostream &OS); 106 bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0, 107 unsigned OpNo1, raw_ostream &OS); 108 bool printAlias(const MCInst &MI, raw_ostream &OS); 109 void printSaveRestore(const MCInst *MI, raw_ostream &O); 110 }; 111 } // end namespace llvm 112 113 #endif 114