23 #define GET_INSTRINFO_CTOR_DTOR
24 #define GET_INSTRINFO_NAMED_OPS
25 #define GET_INSTRMAP_INFO
26 #include "AMDGPUGenInstrInfo.inc"
32 void AMDGPUInstrInfo::anchor() {}
42 unsigned &SrcReg,
unsigned &DstReg,
43 unsigned &SubIdx)
const {
92 while (iter != MBB.
end()) {
93 switch (iter->getOpcode()) {
96 case AMDGPU::BRANCH_COND_i32:
97 case AMDGPU::BRANCH_COND_f32:
109 unsigned SrcReg,
bool isKill,
113 assert(!
"Not Implemented");
122 assert(!
"Not Implemented");
131 int RegOpIdx = OffsetOpIdx + 1;
138 unsigned RegIndex = MI->getOperand(RegOpIdx).getImm();
139 unsigned Channel = MI->getOperand(ChanOpIdx).getImm();
141 unsigned OffsetReg = MI->getOperand(OffsetOpIdx).getReg();
142 if (OffsetReg == AMDGPU::INDIRECT_BASE_ADDR) {
153 unsigned RegIndex = MI->getOperand(RegOpIdx).getImm();
154 unsigned Channel = MI->getOperand(ChanOpIdx).getImm();
156 unsigned OffsetReg = MI->getOperand(OffsetOpIdx).getReg();
157 if (OffsetReg == AMDGPU::INDIRECT_BASE_ADDR) {
159 MI->getOperand(ValOpIdx).getReg());
198 unsigned Reg,
bool UnfoldLoad,
214 bool UnfoldLoad,
bool UnfoldStore,
215 unsigned *LoadRegIndex)
const {
221 int64_t Offset1, int64_t Offset2,
222 unsigned NumLoads)
const {
223 assert(Offset2 > Offset1
224 &&
"Second offset should be larger than first offset!");
228 return (NumLoads < 16 && (Offset2 - Offset1) < 16);
255 std::vector<MachineOperand> &Pred)
const {
296 unsigned Reg =
LI->first;
303 for (RegIndex = 0, RegEnd = IndirectRC->
getNumRegs(); RegIndex != RegEnd;
308 Offset = std::max(Offset, (
int)RegIndex);
354 default:
return Opcode;
355 case 1:
return AMDGPU::getMaskedMIMGOp(Opcode, AMDGPU::Channels_1);
356 case 2:
return AMDGPU::getMaskedMIMGOp(Opcode, AMDGPU::Channels_2);
357 case 3:
return AMDGPU::getMaskedMIMGOp(Opcode, AMDGPU::Channels_3);
const MachineFunction * getParent() const
instr_iterator erase(instr_iterator I)
int getMaskedMIMGOp(uint16_t Opcode, unsigned Channels) const
Given a MIMG Opcode that writes all 4 channels, return the equivalent opcode that writes Channels Cha...
bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
unsigned getRegister(unsigned i) const
livein_iterator livein_end() const
#define AMDGPU_FLAG_REGISTER_STORE
static bool isVirtualRegister(unsigned Reg)
#define AMDGPU_FLAG_REGISTER_LOAD
unsigned getNumObjects() const
const MCInstrDesc & getDesc() const
MachineInstr * convertToThreeAddress(MachineFunction::iterator &MFI, MachineBasicBlock::iterator &MBBI, LiveVariables *LV) const
MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops, int FrameIndex) const
bool hasStoreFromStackSlot(const MachineInstr *MI, const MachineMemOperand *&MMO, int &FrameIndex) const
AMDGPUInstrInfo(TargetMachine &tm)
LoopInfoBase< BlockT, LoopT > * LI
virtual const AMDGPURegisterInfo & getRegisterInfo() const =0
bool isReg() const
isReg - Tests if this is a MO_Register operand.
const TargetRegisterClass * getRegClass(unsigned Reg) const
Abstract Stack Frame Information.
unsigned getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore, unsigned *LoadRegIndex=0) const
unsigned getNumOperands() const
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution. It may be set to 'al...
TargetRegisterInfo interface that is implemented by all hw codegen targets.
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
bool isPredicable(MachineInstr *MI) const
bool SubsumesPredicate(const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const
virtual unsigned calculateIndirectAddress(unsigned RegIndex, unsigned Channel) const =0
Calculate the "Indirect Address" for the given RegIndex and Channel.
bool canFoldMemoryOperand(const MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops) const
bundle_iterator< MachineInstr, instr_iterator > iterator
virtual MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const =0
Build instruction(s) for an indirect register write.
void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
const MachineOperand & getOperand(unsigned i) const
bool isRegisterLoad(const MachineInstr &MI) const
virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
virtual const TargetRegisterClass * getIndirectAddrRegClass() const =0
virtual MachineInstr * buildMovInstr(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned DstReg, unsigned SrcReg) const =0
Build a MOV instruction.
The AMDGPU TargetMachine interface definition for hw codgen targets.
unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
virtual const TargetFrameLowering * getFrameLowering() const
bool isPredicated(const MachineInstr *MI) const
virtual int getFrameIndexOffset(const MachineFunction &MF, int FI) const
bool hasLoadFromStackSlot(const MachineInstr *MI, const MachineMemOperand *&MMO, int &FrameIndex) const
unsigned isStoreFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
livein_iterator livein_begin() const
MachineFrameInfo * getFrameInfo()
virtual void convertToISA(MachineInstr &MI, MachineFunction &MF, DebugLoc DL) const
Convert the AMDIL MachineInstr to a supported ISA MachineInstr.
unsigned isStoreFromStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
unsigned getNumRegs() const
bool DefinesPredicate(MachineInstr *MI, std::vector< MachineOperand > &Pred) const
virtual int getIndirectIndexEnd(const MachineFunction &MF) const
Contains the definition of a TargetInstrInfo class that is common to all AMD GPUs.
MachineRegisterInfo & getRegInfo()
bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI, unsigned Reg, bool UnfoldLoad, bool UnfoldStore, SmallVectorImpl< MachineInstr * > &NewMIs) const
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
bool isRegisterStore(const MachineInstr &MI) const
virtual const TargetRegisterClass * getISARegClass(const TargetRegisterClass *RC) const
bool hasVarSizedObjects() const
std::vector< std::pair< unsigned, unsigned > >::const_iterator livein_iterator
unsigned getReg() const
getReg - Returns the register number.
bool livein_empty() const
virtual int getIndirectIndexBegin(const MachineFunction &MF) const
BasicBlockListType::iterator iterator
int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex)
bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const
void setRegClass(unsigned Reg, const TargetRegisterClass *RC)
const MCRegisterInfo & MRI
virtual MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const =0
Build instruction(s) for an indirect register read.
bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg, unsigned &SubIdx) const
bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const
bool contains(unsigned Reg) const