15 #ifndef R600INSTRUCTIONINFO_H_
16 #define R600INSTRUCTIONINFO_H_
25 class AMDGPUTargetMachine;
28 class MachineFunction;
30 class MachineInstrBuilder;
38 std::vector<std::pair<int, unsigned> >
56 unsigned DestReg,
unsigned SrcReg,
64 bool isCubeOp(
unsigned opcode)
const;
81 bool isExport(
unsigned Opcode)
const;
95 int getSrcIdx(
unsigned Opcode,
unsigned SrcNum)
const;
98 int getSelIdx(
unsigned Opcode,
unsigned SrcIdx)
const;
109 const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
110 const std::vector<R600InstrInfo::BankSwizzle> &Swz,
111 const std::vector<std::pair<int, unsigned> > &TransSrcs,
115 const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
116 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
117 const std::vector<std::pair<int, unsigned> > &TransSrcs,
131 std::vector<BankSwizzle> &BS,
132 bool isLastAluTrans)
const;
146 virtual bool isMov(
unsigned Opcode)
const;
169 unsigned ExtraPredCycles,
174 unsigned NumTCycles,
unsigned ExtraTCycles,
176 unsigned NumFCycles,
unsigned ExtraFCycles,
180 std::vector<MachineOperand> &Pred)
const;
195 unsigned *PredCost = 0)
const;
198 SDNode *Node)
const {
return 1;}
205 unsigned Channel)
const;
211 unsigned ValueReg,
unsigned Address,
212 unsigned OffsetReg)
const;
216 unsigned ValueReg,
unsigned Address,
217 unsigned OffsetReg)
const;
233 unsigned Src1Reg = 0)
const;
238 unsigned DstReg)
const;
247 unsigned DstReg,
unsigned SrcReg)
const;
276 unsigned Flag = 0)
const;
290 #endif // R600INSTRINFO_H_
MachineInstr * buildSlotOfVectorInstruction(MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg) const
bool readsLDSSrcReg(const MachineInstr *MI) const
void clearFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const
Clear the specified flag on the instruction.
void setImmOperand(MachineInstr *MI, unsigned Op, int64_t Imm) const
Helper function for setting instruction flag values.
bool isLDSInstr(unsigned Opcode) const
bool isFlagSet(const MachineInstr &MI, unsigned Operand, unsigned Flag) const
Determine if the specified Flag is set on this Operand.
int getSrcIdx(unsigned Opcode, unsigned SrcNum) const
bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
bool canBeConsideredALU(const MachineInstr *MI) const
virtual int getInstrLatency(const InstrItineraryData *ItinData, SDNode *Node) const
bool isVector(const MachineInstr &MI) const
virtual unsigned calculateIndirectAddress(unsigned RegIndex, unsigned Channel) const
Calculate the "Indirect Address" for the given RegIndex and Channel.
virtual MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const
Build instruction(s) for an indirect register write.
bool fitsReadPortLimitations(const std::vector< MachineInstr * > &MIs, const DenseMap< unsigned, unsigned > &PV, std::vector< BankSwizzle > &BS, bool isLastAluTrans) const
bool isPlaceHolderOpcode(unsigned opcode) const
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
Interface definition for R600RegisterInfo.
bool isVectorOnly(unsigned Opcode) const
bool hasFlagOperand(const MachineInstr &MI) const
bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
unsigned RemoveBranch(MachineBasicBlock &MBB) const
bool isCubeOp(unsigned opcode) const
bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const
int getLDSNoRetOp(uint16_t Opcode)
bool PredicateInstruction(MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const
MachineInstr * buildMovImm(MachineBasicBlock &BB, MachineBasicBlock::iterator I, unsigned DstReg, uint64_t Imm) const
bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
bool hasInstrModifiers(unsigned Opcode) const
MachineInstr * buildMovInstr(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned DstReg, unsigned SrcReg) const
Build a MOV instruction.
bool usesVertexCache(unsigned Opcode) const
virtual unsigned getIEQOpcode() const
R600InstrInfo(AMDGPUTargetMachine &tm)
MachineOperand & getFlagOp(MachineInstr *MI, unsigned SrcIdx=0, unsigned Flag=0) const
bool usesTextureCache(unsigned Opcode) const
bool isExport(unsigned Opcode) const
unsigned int getPredicationCost(const MachineInstr *) const
bool isPredicable(MachineInstr *MI) const
SmallVector< std::pair< MachineOperand *, int64_t >, 3 > getSrcs(MachineInstr *MI) const
bool FindSwizzleForVectorSlot(const std::vector< std::vector< std::pair< int, unsigned > > > &IGSrcs, std::vector< R600InstrInfo::BankSwizzle > &SwzCandidate, const std::vector< std::pair< int, unsigned > > &TransSrcs, R600InstrInfo::BankSwizzle TransSwz) const
bool isPredicated(const MachineInstr *MI) const
const R600RegisterInfo & getRegisterInfo() const
virtual const TargetRegisterClass * getIndirectAddrRegClass() const
int getOperandIdx(const MachineInstr &MI, unsigned Op) const
Get the index of Op in the MachineInstr.
bool usesAddressRegister(MachineInstr *MI) const
unsigned int getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr *MI, unsigned *PredCost=0) const
bool isTrig(const MachineInstr &MI) const
bool mustBeLastInClause(unsigned Opcode) const
int getSelIdx(unsigned Opcode, unsigned SrcIdx) const
Contains the definition of a TargetInstrInfo class that is common to all AMD GPUs.
unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
bool SubsumesPredicate(const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const
void addFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const
Add one of the MO_FLAG* flags to the specified Operand.
void reserveIndirectRegisters(BitVector &Reserved, const MachineFunction &MF) const
Reserve the registers that may be accesed using indirect addressing.
MachineInstrBuilder buildDefaultInstruction(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned Opcode, unsigned DstReg, unsigned Src0Reg, unsigned Src1Reg=0) const
bool DefinesPredicate(MachineInstr *MI, std::vector< MachineOperand > &Pred) const
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCyles, const BranchProbability &Probability) const
virtual MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const
Build instruction(s) for an indirect register read.
unsigned isLegalUpTo(const std::vector< std::vector< std::pair< int, unsigned > > > &IGSrcs, const std::vector< R600InstrInfo::BankSwizzle > &Swz, const std::vector< std::pair< int, unsigned > > &TransSrcs, R600InstrInfo::BankSwizzle TransSwz) const
unsigned getMaxAlusPerClause() const
bool isReductionOp(unsigned opcode) const
bool definesAddressRegister(MachineInstr *MI) const
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCyles, unsigned ExtraPredCycles, const BranchProbability &Probability) const
virtual bool isMov(unsigned Opcode) const
bool isLDSNoRetInstr(unsigned Opcode) const
bool fitsConstReadLimitations(const std::vector< MachineInstr * > &) const
bool isLDSRetInstr(unsigned Opcode) const
bool isALUInstr(unsigned Opcode) const
DFAPacketizer * CreateTargetScheduleState(const TargetMachine *TM, const ScheduleDAG *DAG) const
bool isTransOnly(unsigned Opcode) const