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