Home | History | Annotate | Download | only in MBlaze
      1 //===- MBlazeInstrInfo.h - MBlaze 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 MBlaze implementation of the TargetInstrInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef MBLAZEINSTRUCTIONINFO_H
     15 #define MBLAZEINSTRUCTIONINFO_H
     16 
     17 #include "MBlaze.h"
     18 #include "llvm/Support/ErrorHandling.h"
     19 #include "llvm/Target/TargetInstrInfo.h"
     20 #include "MBlazeRegisterInfo.h"
     21 
     22 #define GET_INSTRINFO_HEADER
     23 #include "MBlazeGenInstrInfo.inc"
     24 
     25 namespace llvm {
     26 
     27 namespace MBlaze {
     28 
     29   // MBlaze Branch Codes
     30   enum FPBranchCode {
     31     BRANCH_F,
     32     BRANCH_T,
     33     BRANCH_FL,
     34     BRANCH_TL,
     35     BRANCH_INVALID
     36   };
     37 
     38   // MBlaze Condition Codes
     39   enum CondCode {
     40     // To be used with float branch True
     41     FCOND_F,
     42     FCOND_UN,
     43     FCOND_EQ,
     44     FCOND_UEQ,
     45     FCOND_OLT,
     46     FCOND_ULT,
     47     FCOND_OLE,
     48     FCOND_ULE,
     49     FCOND_SF,
     50     FCOND_NGLE,
     51     FCOND_SEQ,
     52     FCOND_NGL,
     53     FCOND_LT,
     54     FCOND_NGE,
     55     FCOND_LE,
     56     FCOND_NGT,
     57 
     58     // To be used with float branch False
     59     // This conditions have the same mnemonic as the
     60     // above ones, but are used with a branch False;
     61     FCOND_T,
     62     FCOND_OR,
     63     FCOND_NEQ,
     64     FCOND_OGL,
     65     FCOND_UGE,
     66     FCOND_OGE,
     67     FCOND_UGT,
     68     FCOND_OGT,
     69     FCOND_ST,
     70     FCOND_GLE,
     71     FCOND_SNE,
     72     FCOND_GL,
     73     FCOND_NLT,
     74     FCOND_GE,
     75     FCOND_NLE,
     76     FCOND_GT,
     77 
     78     // Only integer conditions
     79     COND_EQ,
     80     COND_GT,
     81     COND_GE,
     82     COND_LT,
     83     COND_LE,
     84     COND_NE,
     85     COND_INVALID
     86   };
     87 
     88   // Turn condition code into conditional branch opcode.
     89   inline static unsigned GetCondBranchFromCond(CondCode CC) {
     90     switch (CC) {
     91     default: llvm_unreachable("Unknown condition code");
     92     case COND_EQ: return MBlaze::BEQID;
     93     case COND_NE: return MBlaze::BNEID;
     94     case COND_GT: return MBlaze::BGTID;
     95     case COND_GE: return MBlaze::BGEID;
     96     case COND_LT: return MBlaze::BLTID;
     97     case COND_LE: return MBlaze::BLEID;
     98     }
     99   }
    100 
    101   /// GetOppositeBranchCondition - Return the inverse of the specified cond,
    102   /// e.g. turning COND_E to COND_NE.
    103   // CondCode GetOppositeBranchCondition(MBlaze::CondCode CC);
    104 
    105   /// MBlazeCCToString - Map each FP condition code to its string
    106   inline static const char *MBlazeFCCToString(MBlaze::CondCode CC) {
    107     switch (CC) {
    108     default: llvm_unreachable("Unknown condition code");
    109     case FCOND_F:
    110     case FCOND_T:   return "f";
    111     case FCOND_UN:
    112     case FCOND_OR:  return "un";
    113     case FCOND_EQ:
    114     case FCOND_NEQ: return "eq";
    115     case FCOND_UEQ:
    116     case FCOND_OGL: return "ueq";
    117     case FCOND_OLT:
    118     case FCOND_UGE: return "olt";
    119     case FCOND_ULT:
    120     case FCOND_OGE: return "ult";
    121     case FCOND_OLE:
    122     case FCOND_UGT: return "ole";
    123     case FCOND_ULE:
    124     case FCOND_OGT: return "ule";
    125     case FCOND_SF:
    126     case FCOND_ST:  return "sf";
    127     case FCOND_NGLE:
    128     case FCOND_GLE: return "ngle";
    129     case FCOND_SEQ:
    130     case FCOND_SNE: return "seq";
    131     case FCOND_NGL:
    132     case FCOND_GL:  return "ngl";
    133     case FCOND_LT:
    134     case FCOND_NLT: return "lt";
    135     case FCOND_NGE:
    136     case FCOND_GE:  return "ge";
    137     case FCOND_LE:
    138     case FCOND_NLE: return "nle";
    139     case FCOND_NGT:
    140     case FCOND_GT:  return "gt";
    141     }
    142   }
    143 
    144   inline static bool isUncondBranchOpcode(int Opc) {
    145     switch (Opc) {
    146     default: return false;
    147     case MBlaze::BRI:
    148     case MBlaze::BRAI:
    149     case MBlaze::BRID:
    150     case MBlaze::BRAID:
    151       return true;
    152     }
    153   }
    154 
    155   inline static bool isCondBranchOpcode(int Opc) {
    156     switch (Opc) {
    157     default: return false;
    158     case MBlaze::BEQI: case MBlaze::BEQID:
    159     case MBlaze::BNEI: case MBlaze::BNEID:
    160     case MBlaze::BGTI: case MBlaze::BGTID:
    161     case MBlaze::BGEI: case MBlaze::BGEID:
    162     case MBlaze::BLTI: case MBlaze::BLTID:
    163     case MBlaze::BLEI: case MBlaze::BLEID:
    164       return true;
    165     }
    166   }
    167 }
    168 
    169 /// MBlazeII - This namespace holds all of the target specific flags that
    170 /// instruction info tracks.
    171 ///
    172 namespace MBlazeII {
    173   enum {
    174     // PseudoFrm - This represents an instruction that is a pseudo instruction
    175     // or one that has not been implemented yet.  It is illegal to code generate
    176     // it, but tolerated for intermediate implementation stages.
    177     FPseudo = 0,
    178     FRRR,
    179     FRRI,
    180     FCRR,
    181     FCRI,
    182     FRCR,
    183     FRCI,
    184     FCCR,
    185     FCCI,
    186     FRRCI,
    187     FRRC,
    188     FRCX,
    189     FRCS,
    190     FCRCS,
    191     FCRCX,
    192     FCX,
    193     FCR,
    194     FRIR,
    195     FRRRR,
    196     FRI,
    197     FC,
    198     FormMask = 63
    199 
    200     //===------------------------------------------------------------------===//
    201     // MBlaze Specific MachineOperand flags.
    202     // MO_NO_FLAG,
    203 
    204     /// MO_GOT - Represents the offset into the global offset table at which
    205     /// the address the relocation entry symbol resides during execution.
    206     // MO_GOT,
    207 
    208     /// MO_GOT_CALL - Represents the offset into the global offset table at
    209     /// which the address of a call site relocation entry symbol resides
    210     /// during execution. This is different from the above since this flag
    211     /// can only be present in call instructions.
    212     // MO_GOT_CALL,
    213 
    214     /// MO_GPREL - Represents the offset from the current gp value to be used
    215     /// for the relocatable object file being produced.
    216     // MO_GPREL,
    217 
    218     /// MO_ABS_HILO - Represents the hi or low part of an absolute symbol
    219     /// address.
    220     // MO_ABS_HILO
    221 
    222   };
    223 }
    224 
    225 class MBlazeInstrInfo : public MBlazeGenInstrInfo {
    226   MBlazeTargetMachine &TM;
    227   const MBlazeRegisterInfo RI;
    228 public:
    229   explicit MBlazeInstrInfo(MBlazeTargetMachine &TM);
    230 
    231   /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
    232   /// such, whenever a client has an instance of instruction info, it should
    233   /// always be able to get register info as well (through this method).
    234   ///
    235   virtual const MBlazeRegisterInfo &getRegisterInfo() const { return RI; }
    236 
    237   /// isLoadFromStackSlot - If the specified machine instruction is a direct
    238   /// load from a stack slot, return the virtual or physical register number of
    239   /// the destination along with the FrameIndex of the loaded stack slot.  If
    240   /// not, return 0.  This predicate must return 0 if the instruction has
    241   /// any side effects other than loading from the stack slot.
    242   virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
    243                                        int &FrameIndex) const;
    244 
    245   /// isStoreToStackSlot - If the specified machine instruction is a direct
    246   /// store to a stack slot, return the virtual or physical register number of
    247   /// the source reg along with the FrameIndex of the loaded stack slot.  If
    248   /// not, return 0.  This predicate must return 0 if the instruction has
    249   /// any side effects other than storing to the stack slot.
    250   virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
    251                                       int &FrameIndex) const;
    252 
    253   /// Branch Analysis
    254   virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
    255                              MachineBasicBlock *&FBB,
    256                              SmallVectorImpl<MachineOperand> &Cond,
    257                              bool AllowModify) const;
    258   virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
    259                                 MachineBasicBlock *FBB,
    260                                 const SmallVectorImpl<MachineOperand> &Cond,
    261                                 DebugLoc DL) const;
    262   virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const;
    263 
    264   virtual bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond)
    265     const;
    266 
    267   virtual void copyPhysReg(MachineBasicBlock &MBB,
    268                            MachineBasicBlock::iterator I, DebugLoc DL,
    269                            unsigned DestReg, unsigned SrcReg,
    270                            bool KillSrc) const;
    271   virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
    272                                    MachineBasicBlock::iterator MBBI,
    273                                    unsigned SrcReg, bool isKill, int FrameIndex,
    274                                    const TargetRegisterClass *RC,
    275                                    const TargetRegisterInfo *TRI) const;
    276 
    277   virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
    278                                     MachineBasicBlock::iterator MBBI,
    279                                     unsigned DestReg, int FrameIndex,
    280                                     const TargetRegisterClass *RC,
    281                                     const TargetRegisterInfo *TRI) const;
    282 
    283   /// Insert nop instruction when hazard condition is found
    284   virtual void insertNoop(MachineBasicBlock &MBB,
    285                           MachineBasicBlock::iterator MI) const;
    286 
    287   /// getGlobalBaseReg - Return a virtual register initialized with the
    288   /// the global base register value. Output instructions required to
    289   /// initialize the register in the function entry block, if necessary.
    290   ///
    291   unsigned getGlobalBaseReg(MachineFunction *MF) const;
    292 };
    293 
    294 }
    295 
    296 #endif
    297