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 17 namespace 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. 21 namespace Mips { 22 // Mips Branch Codes 23 enum FPBranchCode { 24 BRANCH_F, 25 BRANCH_T, 26 BRANCH_FL, 27 BRANCH_TL, 28 BRANCH_INVALID 29 }; 30 31 // Mips Condition Codes 32 enum 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 72 const char *MipsFCCToString(Mips::CondCode CC); 73 } // end namespace Mips 74 75 class MipsInstPrinter : public MCInstPrinter { 76 public: 77 MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 78 const MCRegisterInfo &MRI) 79 : MCInstPrinter(MAI, MII, MRI) {} 80 81 // Autogenerated by tblgen. 82 std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override; 83 void printInstruction(const MCInst *MI, uint64_t Address, 84 const MCSubtargetInfo &STI, raw_ostream &O); 85 static const char *getRegisterName(unsigned RegNo); 86 87 void printRegName(raw_ostream &OS, unsigned RegNo) const override; 88 void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, 89 const MCSubtargetInfo &STI, raw_ostream &O) override; 90 91 bool printAliasInstr(const MCInst *MI, uint64_t Address, 92 const MCSubtargetInfo &STI, raw_ostream &OS); 93 void printCustomAliasOperand(const MCInst *MI, uint64_t Address, 94 unsigned OpIdx, unsigned PrintMethodIdx, 95 const MCSubtargetInfo &STI, raw_ostream &O); 96 97 private: 98 void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 99 raw_ostream &O); 100 void printJumpOperand(const MCInst *MI, unsigned OpNo, 101 const MCSubtargetInfo &STI, raw_ostream &O); 102 void printBranchOperand(const MCInst *MI, uint64_t Address, unsigned OpNo, 103 const MCSubtargetInfo &STI, raw_ostream &O); 104 template <unsigned Bits, unsigned Offset = 0> 105 void printUImm(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, 106 raw_ostream &O); 107 void printMemOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, 108 raw_ostream &O); 109 void printMemOperandEA(const MCInst *MI, int opNum, 110 const MCSubtargetInfo &STI, raw_ostream &O); 111 void printFCCOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, 112 raw_ostream &O); 113 void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O); 114 115 bool printAlias(const char *Str, const MCInst &MI, uint64_t Address, 116 unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &OS, 117 bool IsBranch = false); 118 bool printAlias(const char *Str, const MCInst &MI, uint64_t Address, 119 unsigned OpNo0, unsigned OpNo1, const MCSubtargetInfo &STI, 120 raw_ostream &OS, bool IsBranch = false); 121 bool printAlias(const MCInst &MI, uint64_t Address, 122 const MCSubtargetInfo &STI, raw_ostream &OS); 123 void printSaveRestore(const MCInst *MI, const MCSubtargetInfo &STI, 124 raw_ostream &O); 125 void printRegisterList(const MCInst *MI, int opNum, 126 const MCSubtargetInfo &STI, raw_ostream &O); 127 }; 128 } // end namespace llvm 129 130 #endif 131