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, raw_ostream &O); 84 static const char *getRegisterName(unsigned RegNo); 85 86 void printRegName(raw_ostream &OS, unsigned RegNo) const override; 87 void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, 88 const MCSubtargetInfo &STI, raw_ostream &O) override; 89 90 bool printAliasInstr(const MCInst *MI, uint64_t Address, raw_ostream &OS); 91 void printCustomAliasOperand(const MCInst *MI, uint64_t Address, 92 unsigned OpIdx, unsigned PrintMethodIdx, 93 raw_ostream &O); 94 95 private: 96 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); 97 void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum, 98 raw_ostream &O) { 99 printOperand(MI, OpNum, O); 100 } 101 template <unsigned Bits, unsigned Offset = 0> 102 void printUImm(const MCInst *MI, int opNum, raw_ostream &O); 103 void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O); 104 void printMemOperandEA(const MCInst *MI, int opNum, raw_ostream &O); 105 void printFCCOperand(const MCInst *MI, int opNum, raw_ostream &O); 106 void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O); 107 108 bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo, 109 raw_ostream &OS); 110 bool printAlias(const char *Str, const MCInst &MI, unsigned OpNo0, 111 unsigned OpNo1, raw_ostream &OS); 112 bool printAlias(const MCInst &MI, raw_ostream &OS); 113 void printSaveRestore(const MCInst *MI, raw_ostream &O); 114 void printRegisterList(const MCInst *MI, int opNum, raw_ostream &O); 115 }; 116 } // end namespace llvm 117 118 #endif 119