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 } 78 79 class MipsInstrInfo : public MipsGenInstrInfo { 80 MipsTargetMachine &TM; 81 const MipsRegisterInfo RI; 82 public: 83 explicit MipsInstrInfo(MipsTargetMachine &TM); 84 85 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As 86 /// such, whenever a client has an instance of instruction info, it should 87 /// always be able to get register info as well (through this method). 88 /// 89 virtual const MipsRegisterInfo &getRegisterInfo() const; 90 91 /// isLoadFromStackSlot - If the specified machine instruction is a direct 92 /// load from a stack slot, return the virtual or physical register number of 93 /// the destination along with the FrameIndex of the loaded stack slot. If 94 /// not, return 0. This predicate must return 0 if the instruction has 95 /// any side effects other than loading from the stack slot. 96 virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, 97 int &FrameIndex) const; 98 99 /// isStoreToStackSlot - If the specified machine instruction is a direct 100 /// store to a stack slot, return the virtual or physical register number of 101 /// the source reg along with the FrameIndex of the loaded stack slot. If 102 /// not, return 0. This predicate must return 0 if the instruction has 103 /// any side effects other than storing to the stack slot. 104 virtual unsigned isStoreToStackSlot(const MachineInstr *MI, 105 int &FrameIndex) const; 106 107 /// Branch Analysis 108 virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 109 MachineBasicBlock *&FBB, 110 SmallVectorImpl<MachineOperand> &Cond, 111 bool AllowModify) const; 112 virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; 113 114 private: 115 void BuildCondBr(MachineBasicBlock &MBB, MachineBasicBlock *TBB, DebugLoc DL, 116 const SmallVectorImpl<MachineOperand>& Cond) const; 117 118 public: 119 virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 120 MachineBasicBlock *FBB, 121 const SmallVectorImpl<MachineOperand> &Cond, 122 DebugLoc DL) const; 123 virtual void copyPhysReg(MachineBasicBlock &MBB, 124 MachineBasicBlock::iterator MI, DebugLoc DL, 125 unsigned DestReg, unsigned SrcReg, 126 bool KillSrc) const; 127 virtual void storeRegToStackSlot(MachineBasicBlock &MBB, 128 MachineBasicBlock::iterator MBBI, 129 unsigned SrcReg, bool isKill, int FrameIndex, 130 const TargetRegisterClass *RC, 131 const TargetRegisterInfo *TRI) const; 132 133 virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, 134 MachineBasicBlock::iterator MBBI, 135 unsigned DestReg, int FrameIndex, 136 const TargetRegisterClass *RC, 137 const TargetRegisterInfo *TRI) const; 138 139 virtual MachineInstr* emitFrameIndexDebugValue(MachineFunction &MF, 140 int FrameIx, uint64_t Offset, 141 const MDNode *MDPtr, 142 DebugLoc DL) const; 143 144 virtual 145 bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; 146 147 /// Insert nop instruction when hazard condition is found 148 virtual void insertNoop(MachineBasicBlock &MBB, 149 MachineBasicBlock::iterator MI) const; 150 151 /// getGlobalBaseReg - Return a virtual register initialized with the 152 /// the global base register value. Output instructions required to 153 /// initialize the register in the function entry block, if necessary. 154 /// 155 unsigned getGlobalBaseReg(MachineFunction *MF) const; 156 }; 157 158 } 159 160 #endif 161