Home | History | Annotate | Download | only in InstPrinter
      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:
     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