| //===- PTXInstrInfo.h - PTX Instruction Information -------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains the PTX implementation of the TargetInstrInfo class. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef PTX_INSTR_INFO_H |
| #define PTX_INSTR_INFO_H |
| |
| #include "PTXRegisterInfo.h" |
| #include "llvm/Target/TargetInstrInfo.h" |
| |
| #define GET_INSTRINFO_HEADER |
| #include "PTXGenInstrInfo.inc" |
| |
| namespace llvm { |
| class PTXTargetMachine; |
| |
| class MachineSDNode; |
| class SDValue; |
| class SelectionDAG; |
| |
| class PTXInstrInfo : public PTXGenInstrInfo { |
| private: |
| const PTXRegisterInfo RI; |
| PTXTargetMachine &TM; |
| |
| public: |
| explicit PTXInstrInfo(PTXTargetMachine &_TM); |
| |
| virtual const PTXRegisterInfo &getRegisterInfo() const { return RI; } |
| |
| virtual void copyPhysReg(MachineBasicBlock &MBB, |
| MachineBasicBlock::iterator I, DebugLoc DL, |
| unsigned DstReg, unsigned SrcReg, |
| bool KillSrc) const; |
| |
| virtual bool copyRegToReg(MachineBasicBlock &MBB, |
| MachineBasicBlock::iterator I, |
| unsigned DstReg, unsigned SrcReg, |
| const TargetRegisterClass *DstRC, |
| const TargetRegisterClass *SrcRC, |
| DebugLoc DL) const; |
| |
| virtual bool isMoveInstr(const MachineInstr& MI, |
| unsigned &SrcReg, unsigned &DstReg, |
| unsigned &SrcSubIdx, unsigned &DstSubIdx) const; |
| |
| // predicate support |
| |
| virtual bool isPredicated(const MachineInstr *MI) const; |
| |
| virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const; |
| |
| virtual |
| bool PredicateInstruction(MachineInstr *MI, |
| const SmallVectorImpl<MachineOperand> &Pred) const; |
| |
| virtual |
| bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1, |
| const SmallVectorImpl<MachineOperand> &Pred2) const; |
| |
| virtual bool DefinesPredicate(MachineInstr *MI, |
| std::vector<MachineOperand> &Pred) const; |
| |
| // PTX is fully-predicable |
| virtual bool isPredicable(MachineInstr *MI) const { return true; } |
| |
| // branch support |
| |
| virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, |
| MachineBasicBlock *&FBB, |
| SmallVectorImpl<MachineOperand> &Cond, |
| bool AllowModify = false) const; |
| |
| virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; |
| |
| virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, |
| MachineBasicBlock *FBB, |
| const SmallVectorImpl<MachineOperand> &Cond, |
| DebugLoc DL) const; |
| |
| // Memory operand folding for spills |
| // TODO: Implement this eventually and get rid of storeRegToStackSlot and |
| // loadRegFromStackSlot. Doing so will get rid of the "stack" registers |
| // we currently use to spill, though I doubt the overall effect on ptxas |
| // output will be large. I have yet to see a case where ptxas is unable |
| // to see through the "stack" register usage and hence generates |
| // efficient code anyway. |
| // virtual MachineInstr* foldMemoryOperandImpl(MachineFunction &MF, |
| // MachineInstr* MI, |
| // const SmallVectorImpl<unsigned> &Ops, |
| // int FrameIndex) const; |
| |
| virtual void storeRegToStackSlot(MachineBasicBlock& MBB, |
| MachineBasicBlock::iterator MII, |
| unsigned SrcReg, bool isKill, int FrameIndex, |
| const TargetRegisterClass* RC, |
| const TargetRegisterInfo* TRI) const; |
| virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, |
| MachineBasicBlock::iterator MII, |
| unsigned DestReg, int FrameIdx, |
| const TargetRegisterClass *RC, |
| const TargetRegisterInfo *TRI) const; |
| |
| // static helper routines |
| |
| static MachineSDNode *GetPTXMachineNode(SelectionDAG *DAG, unsigned Opcode, |
| DebugLoc dl, EVT VT, |
| SDValue Op1); |
| |
| static MachineSDNode *GetPTXMachineNode(SelectionDAG *DAG, unsigned Opcode, |
| DebugLoc dl, EVT VT, |
| SDValue Op1, SDValue Op2); |
| |
| static void AddDefaultPredicate(MachineInstr *MI); |
| |
| static bool IsAnyKindOfBranch(const MachineInstr& inst); |
| |
| static bool IsAnySuccessorAlsoLayoutSuccessor(const MachineBasicBlock& MBB); |
| |
| static MachineBasicBlock *GetBranchTarget(const MachineInstr& inst); |
| }; // class PTXInstrInfo |
| } // namespace llvm |
| |
| #endif // PTX_INSTR_INFO_H |