17 #define GET_INSTRINFO_CTOR_DTOR
18 #include "NVPTXGenInstrInfo.inc"
28 void NVPTXInstrInfo::anchor() {}
36 unsigned DestReg,
unsigned SrcReg,
bool KillSrc)
const {
44 if (DestRC == &NVPTX::Int32RegsRegClass)
45 BuildMI(MBB, I, DL,
get(NVPTX::IMOV32rr), DestReg)
47 else if (DestRC == &NVPTX::Int1RegsRegClass)
48 BuildMI(MBB, I, DL,
get(NVPTX::IMOV1rr), DestReg)
50 else if (DestRC == &NVPTX::Float32RegsRegClass)
51 BuildMI(MBB, I, DL,
get(NVPTX::FMOV32rr), DestReg)
53 else if (DestRC == &NVPTX::Int16RegsRegClass)
54 BuildMI(MBB, I, DL,
get(NVPTX::IMOV16rr), DestReg)
56 else if (DestRC == &NVPTX::Int64RegsRegClass)
57 BuildMI(MBB, I, DL,
get(NVPTX::IMOV64rr), DestReg)
59 else if (DestRC == &NVPTX::Float64RegsRegClass)
60 BuildMI(MBB, I, DL,
get(NVPTX::FMOV64rr), DestReg)
68 unsigned &DestReg)
const {
74 isMove = (TSFlags == 1);
79 assert(dest.
isReg() &&
"dest of a movrr is not a reg");
80 assert(src.
isReg() &&
"src of a movrr is not a reg");
94 case NVPTX::INT_PTX_SREG_NTID_X:
95 case NVPTX::INT_PTX_SREG_NTID_Y:
96 case NVPTX::INT_PTX_SREG_NTID_Z:
97 case NVPTX::INT_PTX_SREG_TID_X:
98 case NVPTX::INT_PTX_SREG_TID_Y:
99 case NVPTX::INT_PTX_SREG_TID_Z:
100 case NVPTX::INT_PTX_SREG_CTAID_X:
101 case NVPTX::INT_PTX_SREG_CTAID_Y:
102 case NVPTX::INT_PTX_SREG_CTAID_Z:
103 case NVPTX::INT_PTX_SREG_NCTAID_X:
104 case NVPTX::INT_PTX_SREG_NCTAID_Y:
105 case NVPTX::INT_PTX_SREG_NCTAID_Z:
106 case NVPTX::INT_PTX_SREG_WARPSIZE:
112 unsigned &AddrSpace)
const {
116 isLoad = (TSFlags == 1);
123 unsigned &AddrSpace)
const {
124 bool isStore =
false;
127 isStore = (TSFlags == 1);
134 unsigned addrspace = 0;
135 if (MI->
getOpcode() == NVPTX::INT_CUDA_SYNCTHREADS)
174 if (I == MBB.
begin() || !isUnpredicatedTerminator(--I))
181 if (I == MBB.
begin() || !isUnpredicatedTerminator(--I)) {
182 if (LastInst->
getOpcode() == NVPTX::GOTO) {
185 }
else if (LastInst->
getOpcode() == NVPTX::CBranch) {
199 if (SecondLastInst && I != MBB.
begin() && isUnpredicatedTerminator(--I))
203 if (SecondLastInst->
getOpcode() == NVPTX::CBranch &&
213 if (SecondLastInst->
getOpcode() == NVPTX::GOTO &&
228 if (I == MBB.
begin())
231 if (I->getOpcode() != NVPTX::GOTO && I->getOpcode() != NVPTX::CBranch)
235 I->eraseFromParent();
239 if (I == MBB.
begin())
242 if (I->getOpcode() != NVPTX::CBranch)
246 I->eraseFromParent();
254 assert(TBB &&
"InsertBranch must not be told to insert a fallthrough");
255 assert((Cond.
size() == 1 || Cond.
size() == 0) &&
256 "NVPTX branch conditions have two components!");
261 BuildMI(&MBB, DL,
get(NVPTX::GOTO)).addMBB(TBB);
void push_back(const T &Elt)
const MachineFunction * getParent() const
bool isStoreInstr(const MachineInstr &MI, unsigned &AddrSpace) const
MachineBasicBlock * getMBB() const
const MCInstrDesc & getDesc() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
unsigned getLdStCodeAddrSpace(const MachineInstr &MI) const
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
const TargetRegisterClass * getRegClass(unsigned Reg) const
bool isReadSpecialReg(MachineInstr &MI) const
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
unsigned getKillRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
virtual bool CanTailMerge(const MachineInstr *MI) const
const MachineOperand & getOperand(unsigned i) const
NVPTXInstrInfo(NVPTXTargetMachine &TM)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
MachineRegisterInfo & getRegInfo()
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
unsigned getReg() const
getReg - Returns the register number.
virtual bool isMoveInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DestReg) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
const MCRegisterInfo & MRI
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
bool isLoadInstr(const MachineInstr &MI, unsigned &AddrSpace) const