Home | History | Annotate | Download | only in Mips
      1 //===- MipsInstrInfo.h - Mips Instruction Information -----------*- 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 file contains the Mips implementation of the TargetInstrInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef MIPSINSTRUCTIONINFO_H
     15 #define MIPSINSTRUCTIONINFO_H
     16 
     17 #include "Mips.h"
     18 #include "llvm/Support/ErrorHandling.h"
     19 #include "llvm/Target/TargetInstrInfo.h"
     20 #include "MipsRegisterInfo.h"
     21 
     22 #define GET_INSTRINFO_HEADER
     23 #include "MipsGenInstrInfo.inc"
     24 
     25 namespace llvm {
     26 
     27 namespace Mips {
     28   /// GetOppositeBranchOpc - Return the inverse of the specified
     29   /// opcode, e.g. turning BEQ to BNE.
     30   unsigned GetOppositeBranchOpc(unsigned Opc);
     31 }
     32 
     33 /// MipsII - This namespace holds all of the target specific flags that
     34 /// instruction info tracks.
     35 ///
     36 namespace MipsII {
     37   /// Target Operand Flag enum.
     38   enum TOF {
     39     //===------------------------------------------------------------------===//
     40     // Mips Specific MachineOperand flags.
     41 
     42     MO_NO_FLAG,
     43 
     44     /// MO_GOT - Represents the offset into the global offset table at which
     45     /// the address the relocation entry symbol resides during execution.
     46     MO_GOT,
     47 
     48     /// MO_GOT_CALL - Represents the offset into the global offset table at
     49     /// which the address of a call site relocation entry symbol resides
     50     /// during execution. This is different from the above since this flag
     51     /// can only be present in call instructions.
     52     MO_GOT_CALL,
     53 
     54     /// MO_GPREL - Represents the offset from the current gp value to be used
     55     /// for the relocatable object file being produced.
     56     MO_GPREL,
     57 
     58     /// MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol
     59     /// address.
     60     MO_ABS_HI,
     61     MO_ABS_LO,
     62 
     63     /// MO_TLSGD - Represents the offset into the global offset table at which
     64     // the module ID and TSL block offset reside during execution (General
     65     // Dynamic TLS).
     66     MO_TLSGD,
     67 
     68     /// MO_GOTTPREL - Represents the offset from the thread pointer (Initial
     69     // Exec TLS).
     70     MO_GOTTPREL,
     71 
     72     /// MO_TPREL_HI/LO - Represents the hi and low part of the offset from
     73     // the thread pointer (Local Exec TLS).
     74     MO_TPREL_HI,
     75     MO_TPREL_LO,
     76 
     77     // N32/64 Flags.
     78     MO_GPOFF_HI,
     79     MO_GPOFF_LO,
     80     MO_GOT_DISP,
     81     MO_GOT_PAGE,
     82     MO_GOT_OFST
     83   };
     84 
     85   enum {
     86     //===------------------------------------------------------------------===//
     87     // Instruction encodings.  These are the standard/most common forms for
     88     // Mips instructions.
     89     //
     90 
     91     // Pseudo - This represents an instruction that is a pseudo instruction
     92     // or one that has not been implemented yet.  It is illegal to code generate
     93     // it, but tolerated for intermediate implementation stages.
     94     Pseudo   = 0,
     95 
     96     /// FrmR - This form is for instructions of the format R.
     97     FrmR  = 1,
     98     /// FrmI - This form is for instructions of the format I.
     99     FrmI  = 2,
    100     /// FrmJ - This form is for instructions of the format J.
    101     FrmJ  = 3,
    102     /// FrmFR - This form is for instructions of the format FR.
    103     FrmFR = 4,
    104     /// FrmFI - This form is for instructions of the format FI.
    105     FrmFI = 5,
    106     /// FrmOther - This form is for instructions that have no specific format.
    107     FrmOther = 6,
    108 
    109     FormMask = 15
    110   };
    111 }
    112 
    113 class MipsInstrInfo : public MipsGenInstrInfo {
    114   MipsTargetMachine &TM;
    115   bool IsN64;
    116   const MipsRegisterInfo RI;
    117 public:
    118   explicit MipsInstrInfo(MipsTargetMachine &TM);
    119 
    120   /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
    121   /// such, whenever a client has an instance of instruction info, it should
    122   /// always be able to get register info as well (through this method).
    123   ///
    124   virtual const MipsRegisterInfo &getRegisterInfo() const;
    125 
    126   /// isLoadFromStackSlot - If the specified machine instruction is a direct
    127   /// load from a stack slot, return the virtual or physical register number of
    128   /// the destination along with the FrameIndex of the loaded stack slot.  If
    129   /// not, return 0.  This predicate must return 0 if the instruction has
    130   /// any side effects other than loading from the stack slot.
    131   virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
    132                                        int &FrameIndex) const;
    133 
    134   /// isStoreToStackSlot - If the specified machine instruction is a direct
    135   /// store to a stack slot, return the virtual or physical register number of
    136   /// the source reg along with the FrameIndex of the loaded stack slot.  If
    137   /// not, return 0.  This predicate must return 0 if the instruction has
    138   /// any side effects other than storing to the stack slot.
    139   virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
    140                                       int &FrameIndex) const;
    141 
    142   /// Branch Analysis
    143   virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
    144                              MachineBasicBlock *&FBB,
    145                              SmallVectorImpl<MachineOperand> &Cond,
    146                              bool AllowModify) const;
    147   virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const;
    148 
    149 private:
    150   void BuildCondBr(MachineBasicBlock &MBB, MachineBasicBlock *TBB, DebugLoc DL,
    151                    const SmallVectorImpl<MachineOperand>& Cond) const;
    152 
    153 public:
    154   virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
    155                                 MachineBasicBlock *FBB,
    156                                 const SmallVectorImpl<MachineOperand> &Cond,
    157                                 DebugLoc DL) const;
    158   virtual void copyPhysReg(MachineBasicBlock &MBB,
    159                            MachineBasicBlock::iterator MI, DebugLoc DL,
    160                            unsigned DestReg, unsigned SrcReg,
    161                            bool KillSrc) const;
    162   virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
    163                                    MachineBasicBlock::iterator MBBI,
    164                                    unsigned SrcReg, bool isKill, int FrameIndex,
    165                                    const TargetRegisterClass *RC,
    166                                    const TargetRegisterInfo *TRI) const;
    167 
    168   virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
    169                                     MachineBasicBlock::iterator MBBI,
    170                                     unsigned DestReg, int FrameIndex,
    171                                     const TargetRegisterClass *RC,
    172                                     const TargetRegisterInfo *TRI) const;
    173 
    174   virtual MachineInstr* emitFrameIndexDebugValue(MachineFunction &MF,
    175                                                  int FrameIx, uint64_t Offset,
    176                                                  const MDNode *MDPtr,
    177                                                  DebugLoc DL) const;
    178 
    179   virtual
    180   bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
    181 
    182   /// Insert nop instruction when hazard condition is found
    183   virtual void insertNoop(MachineBasicBlock &MBB,
    184                           MachineBasicBlock::iterator MI) const;
    185 
    186   /// getGlobalBaseReg - Return a virtual register initialized with the
    187   /// the global base register value. Output instructions required to
    188   /// initialize the register in the function entry block, if necessary.
    189   ///
    190   unsigned getGlobalBaseReg(MachineFunction *MF) const;
    191 };
    192 
    193 }
    194 
    195 #endif
    196