26 #define GET_INSTRINFO_CTOR_DTOR
27 #include "AMDGPUGenDFAPacketizer.inc"
52 unsigned DestReg,
unsigned SrcReg,
54 unsigned VectorComponents = 0;
55 if (AMDGPU::R600_Reg128RegClass.contains(DestReg) &&
56 AMDGPU::R600_Reg128RegClass.contains(SrcReg)) {
58 }
else if(AMDGPU::R600_Reg64RegClass.contains(DestReg) &&
59 AMDGPU::R600_Reg64RegClass.contains(SrcReg)) {
63 if (VectorComponents > 0) {
64 for (
unsigned I = 0;
I < VectorComponents;
I++) {
67 RI.getSubReg(DestReg, SubRegIndex),
68 RI.getSubReg(SrcReg, SubRegIndex))
84 E = MBBI->operands_end();
I != E; ++
I) {
93 return AMDGPU::SETE_INT;
100 default:
return false;
102 case AMDGPU::MOV_IMM_F32:
103 case AMDGPU::MOV_IMM_I32:
113 default:
return false;
125 default:
return false;
126 case AMDGPU::CUBE_r600_pseudo:
127 case AMDGPU::CUBE_r600_real:
128 case AMDGPU::CUBE_eg_pseudo:
129 case AMDGPU::CUBE_eg_real:
135 unsigned TargetFlags =
get(Opcode).TSFlags;
141 unsigned TargetFlags =
get(Opcode).TSFlags;
149 unsigned TargetFlags =
get(Opcode).TSFlags;
171 case AMDGPU::INTERP_PAIR_XY:
172 case AMDGPU::INTERP_PAIR_ZW:
173 case AMDGPU::INTERP_VEC_LOAD:
185 return (
get(Opcode).getSchedClass() == AMDGPU::Sched::TransALU);
193 return (
get(Opcode).getSchedClass() == AMDGPU::Sched::VecALU);
226 case AMDGPU::GROUP_BARRIER:
247 if (!
I->isReg() || !
I->isUse() ||
251 if (AMDGPU::R600_LDS_SRC_REGRegClass.contains(
I->getReg()))
258 static const unsigned OpTable[] = {
259 AMDGPU::OpName::src0,
260 AMDGPU::OpName::src1,
268 #define SRC_SEL_ROWS 11
271 {AMDGPU::OpName::src0, AMDGPU::OpName::src0_sel},
272 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_sel},
273 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_sel},
274 {AMDGPU::OpName::src0_X, AMDGPU::OpName::src0_sel_X},
275 {AMDGPU::OpName::src0_Y, AMDGPU::OpName::src0_sel_Y},
276 {AMDGPU::OpName::src0_Z, AMDGPU::OpName::src0_sel_Z},
277 {AMDGPU::OpName::src0_W, AMDGPU::OpName::src0_sel_W},
278 {AMDGPU::OpName::src1_X, AMDGPU::OpName::src1_sel_X},
279 {AMDGPU::OpName::src1_Y, AMDGPU::OpName::src1_sel_Y},
280 {AMDGPU::OpName::src1_Z, AMDGPU::OpName::src1_sel_Z},
281 {AMDGPU::OpName::src1_W, AMDGPU::OpName::src1_sel_W}
285 if (
getOperandIdx(Opcode, SrcSelTable[i][0]) == (
int)SrcIdx) {
298 static const unsigned OpTable[8][2] = {
299 {AMDGPU::OpName::src0_X, AMDGPU::OpName::src0_sel_X},
300 {AMDGPU::OpName::src0_Y, AMDGPU::OpName::src0_sel_Y},
301 {AMDGPU::OpName::src0_Z, AMDGPU::OpName::src0_sel_Z},
302 {AMDGPU::OpName::src0_W, AMDGPU::OpName::src0_sel_W},
303 {AMDGPU::OpName::src1_X, AMDGPU::OpName::src1_sel_X},
304 {AMDGPU::OpName::src1_Y, AMDGPU::OpName::src1_sel_Y},
305 {AMDGPU::OpName::src1_Z, AMDGPU::OpName::src1_sel_Z},
306 {AMDGPU::OpName::src1_W, AMDGPU::OpName::src1_sel_W},
309 for (
unsigned j = 0; j < 8; j++) {
313 if (Reg == AMDGPU::ALU_CONST) {
316 Result.
push_back(std::pair<MachineOperand *, int64_t>(&MO, Sel));
324 static const unsigned OpTable[3][2] = {
325 {AMDGPU::OpName::src0, AMDGPU::OpName::src0_sel},
326 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_sel},
327 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_sel},
330 for (
unsigned j = 0; j < 3; j++) {
336 if (Reg == AMDGPU::ALU_CONST) {
339 Result.
push_back(std::pair<MachineOperand *, int64_t>(&MO, Sel));
342 if (Reg == AMDGPU::ALU_LITERAL_X) {
345 Result.
push_back(std::pair<MachineOperand *, int64_t>(&MO, Imm));
348 Result.
push_back(std::pair<MachineOperand *, int64_t>(&MO, 0));
353 std::vector<std::pair<int, unsigned> >
356 unsigned &ConstCount)
const {
359 const std::pair<int, unsigned> DummyPair(-1, 0);
360 std::vector<std::pair<int, unsigned> > Result;
362 for (
unsigned n = Srcs.
size(); i < n; ++i) {
363 unsigned Reg = Srcs[i].first->getReg();
364 unsigned Index = RI.getEncodingValue(Reg) & 0xff;
365 if (Reg == AMDGPU::OQAP) {
366 Result.push_back(std::pair<int, unsigned>(Index, 0));
368 if (PV.
find(Reg) != PV.
end()) {
370 Result.push_back(std::pair<int, unsigned>(255, 0));
375 Result.push_back(DummyPair);
379 Result.push_back(std::pair<int, unsigned>(Index, Chan));
382 Result.push_back(DummyPair);
386 static std::vector<std::pair<int, unsigned> >
387 Swizzle(std::vector<std::pair<int, unsigned> > Src,
389 if (Src[0] == Src[1])
419 unsigned Cycles[3] = { 2, 1, 0};
423 unsigned Cycles[3] = { 1, 2, 2};
427 unsigned Cycles[3] = { 2, 1, 2};
431 unsigned Cycles[3] = { 2, 2, 1};
444 const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
445 const std::vector<R600InstrInfo::BankSwizzle> &Swz,
446 const std::vector<std::pair<int, unsigned> > &TransSrcs,
449 memset(Vector, -1,
sizeof(Vector));
450 for (
unsigned i = 0, e = IGSrcs.size(); i < e; i++) {
451 const std::vector<std::pair<int, unsigned> > &Srcs =
453 for (
unsigned j = 0; j < 3; j++) {
454 const std::pair<int, unsigned> &Src = Srcs[j];
455 if (Src.first < 0 || Src.first == 255)
457 if (Src.first ==
GET_REG_INDEX(RI.getEncodingValue(AMDGPU::OQAP))) {
467 if (Vector[Src.second][j] < 0)
468 Vector[Src.second][j] = Src.first;
469 if (Vector[Src.second][j] != Src.first)
474 for (
unsigned i = 0, e = TransSrcs.size(); i < e; ++i) {
475 const std::pair<int, unsigned> &Src = TransSrcs[i];
479 if (Src.first == 255)
481 if (Vector[Src.second][Cycle] < 0)
482 Vector[Src.second][Cycle] = Src.first;
483 if (Vector[Src.second][Cycle] != Src.first)
484 return IGSrcs.size() - 1;
486 return IGSrcs.size();
494 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
496 assert(Idx < SwzCandidate.size());
500 for (
unsigned i = ResetIdx + 1, e = SwzCandidate.size(); i < e; i++) {
505 int NextSwizzle = SwzCandidate[ResetIdx] + 1;
513 const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
514 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
515 const std::vector<std::pair<int, unsigned> > &TransSrcs,
517 unsigned ValidUpTo = 0;
519 ValidUpTo =
isLegalUpTo(IGSrcs, SwzCandidate, TransSrcs, TransSwz);
520 if (ValidUpTo == IGSrcs.size())
530 const std::vector<std::pair<int, unsigned> > &TransOps,
531 unsigned ConstCount) {
535 for (
unsigned i = 0, e = TransOps.size(); i < e; ++i) {
536 const std::pair<int, unsigned> &Src = TransOps[i];
540 if (ConstCount > 0 && Cycle == 0)
542 if (ConstCount > 1 && Cycle == 1)
551 std::vector<BankSwizzle> &ValidSwizzle,
556 std::vector<std::vector<std::pair<int, unsigned> > > IGSrcs;
557 ValidSwizzle.clear();
560 for (
unsigned i = 0, e = IG.size(); i < e; ++i) {
561 IGSrcs.push_back(ExtractSrcs(IG[i], PV, ConstCount));
563 AMDGPU::OpName::bank_swizzle);
565 IG[i]->getOperand(Op).getImm());
567 std::vector<std::pair<int, unsigned> > TransOps;
571 TransOps = IGSrcs.back();
573 ValidSwizzle.pop_back();
581 for (
unsigned i = 0; i < 4; i++) {
582 TransBS = TransSwz[i];
588 ValidSwizzle.push_back(TransBS);
600 assert (Consts.size() <= 12 &&
"Too many operands in instructions group");
601 unsigned Pair1 = 0, Pair2 = 0;
602 for (
unsigned i = 0, n = Consts.size(); i < n; ++i) {
603 unsigned ReadConstHalf = Consts[i] & 2;
604 unsigned ReadConstIndex = Consts[i] & (~3);
605 unsigned ReadHalfConst = ReadConstIndex | ReadConstHalf;
607 Pair1 = ReadHalfConst;
610 if (Pair1 == ReadHalfConst)
613 Pair2 = ReadHalfConst;
616 if (Pair2 != ReadHalfConst)
625 std::vector<unsigned> Consts;
627 for (
unsigned i = 0, n = MIs.size(); i < n; i++) {
635 for (
unsigned j = 0, e = Srcs.
size(); j < e; j++) {
636 std::pair<MachineOperand *, unsigned> Src = Srcs[j];
637 if (Src.first->getReg() == AMDGPU::ALU_LITERAL_X)
638 Literals.
insert(Src.second);
639 if (Literals.
size() > 4)
641 if (Src.first->getReg() == AMDGPU::ALU_CONST)
642 Consts.push_back(Src.second);
643 if (AMDGPU::R600_KC0RegClass.contains(Src.first->getReg()) ||
644 AMDGPU::R600_KC1RegClass.contains(Src.first->getReg())) {
645 unsigned Index = RI.getEncodingValue(Src.first->getReg()) & 0xff;
647 Consts.push_back((Index << 2) | Chan);
673 while (I != MBB.
begin()) {
685 return Opcode == AMDGPU::JUMP || Opcode == AMDGPU::JUMP_COND;
689 return Opcode == AMDGPU::BRANCH || Opcode == AMDGPU::BRANCH_COND_i32 ||
690 Opcode == AMDGPU::BRANCH_COND_f32;
698 bool AllowModify)
const {
703 if (I == MBB.
begin())
706 while (I->isDebugValue()) {
707 if (I == MBB.
begin())
715 if (!
isJump(static_cast<MachineInstr *>(I)->getOpcode())) {
723 unsigned LastOpc = LastInst->
getOpcode();
724 if (I == MBB.
begin() ||
725 !
isJump(static_cast<MachineInstr *>(--I)->getOpcode())) {
726 if (LastOpc == AMDGPU::JUMP) {
729 }
else if (LastOpc == AMDGPU::JUMP_COND) {
745 unsigned SecondLastOpc = SecondLastInst->
getOpcode();
748 if (SecondLastOpc == AMDGPU::JUMP_COND && LastOpc == AMDGPU::JUMP) {
765 int R600InstrInfo::getBranchInstr(
const MachineOperand &op)
const {
770 case AMDGPU::GPRI32RegClassID:
return AMDGPU::BRANCH_COND_i32;
771 case AMDGPU::GPRF32RegClassID:
return AMDGPU::BRANCH_COND_f32;
779 if (It->getOpcode() == AMDGPU::CF_ALU ||
780 It->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE)
792 assert(TBB &&
"InsertBranch must not be told to insert a fallthrough");
800 assert(PredSet &&
"No previous predicate !");
804 BuildMI(&MBB, DL,
get(AMDGPU::JUMP_COND))
808 if (CfAlu == MBB.
end())
810 assert (CfAlu->getOpcode() == AMDGPU::CF_ALU);
811 CfAlu->setDesc(
get(AMDGPU::CF_ALU_PUSH_BEFORE));
816 assert(PredSet &&
"No previous predicate !");
819 BuildMI(&MBB, DL,
get(AMDGPU::JUMP_COND))
824 if (CfAlu == MBB.
end())
826 assert (CfAlu->getOpcode() == AMDGPU::CF_ALU);
827 CfAlu->setDesc(
get(AMDGPU::CF_ALU_PUSH_BEFORE));
840 if (I == MBB.
begin()) {
844 switch (I->getOpcode()) {
847 case AMDGPU::JUMP_COND: {
850 I->eraseFromParent();
852 if (CfAlu == MBB.
end())
854 assert (CfAlu->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE);
855 CfAlu->setDesc(
get(AMDGPU::CF_ALU));
859 I->eraseFromParent();
864 if (I == MBB.
begin()) {
868 switch (I->getOpcode()) {
872 case AMDGPU::JUMP_COND: {
875 I->eraseFromParent();
877 if (CfAlu == MBB.
end())
879 assert (CfAlu->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE);
880 CfAlu->setDesc(
get(AMDGPU::CF_ALU));
884 I->eraseFromParent();
898 default:
return false;
899 case AMDGPU::PRED_SEL_ONE:
900 case AMDGPU::PRED_SEL_ZERO:
901 case AMDGPU::PREDICATE_BIT:
915 }
else if (MI->
getOpcode() == AMDGPU::CF_ALU) {
935 unsigned ExtraPredCycles,
943 unsigned ExtraTCycles,
946 unsigned ExtraFCycles,
988 case AMDGPU::PRED_SEL_ZERO:
989 MO2.
setReg(AMDGPU::PRED_SEL_ONE);
991 case AMDGPU::PRED_SEL_ONE:
992 MO2.
setReg(AMDGPU::PRED_SEL_ZERO);
1002 std::vector<MachineOperand> &Pred)
const {
1019 if (MI->
getOpcode() == AMDGPU::CF_ALU) {
1055 unsigned *PredCost)
const {
1073 unsigned SuperReg = AMDGPU::R600_Reg128RegClass.getRegister(Index);
1074 Reserved.
set(SuperReg);
1075 for (
unsigned Chan = 0; Chan < StackWidth; ++Chan) {
1076 unsigned Reg = AMDGPU::R600_TReg32RegClass.getRegister((4 * Index) + Chan);
1083 unsigned Channel)
const {
1085 assert(Channel == 0);
1090 return &AMDGPU::R600_TReg32_XRegClass;
1095 unsigned ValueReg,
unsigned Address,
1096 unsigned OffsetReg)
const {
1097 unsigned AddrReg = AMDGPU::R600_AddrRegClass.getRegister(Address);
1099 AMDGPU::AR_X, OffsetReg);
1112 unsigned ValueReg,
unsigned Address,
1113 unsigned OffsetReg)
const {
1114 unsigned AddrReg = AMDGPU::R600_AddrRegClass.getRegister(Address);
1138 unsigned Src1Reg)
const {
1167 .
addReg(AMDGPU::PRED_SEL_OFF)
1174 #define OPERAND_CASE(Label) \
1176 static const unsigned Ops[] = \
1215 assert (MI->
getOpcode() == AMDGPU::DOT_4 &&
"Not Implemented");
1219 Opcode = AMDGPU::DOT4_r600;
1221 Opcode = AMDGPU::DOT4_eg;
1229 static const unsigned Operands[14] = {
1230 AMDGPU::OpName::update_exec_mask,
1231 AMDGPU::OpName::update_pred,
1233 AMDGPU::OpName::omod,
1234 AMDGPU::OpName::dst_rel,
1235 AMDGPU::OpName::clamp,
1236 AMDGPU::OpName::src0_neg,
1237 AMDGPU::OpName::src0_rel,
1238 AMDGPU::OpName::src0_abs,
1239 AMDGPU::OpName::src0_sel,
1240 AMDGPU::OpName::src1_neg,
1241 AMDGPU::OpName::src1_rel,
1242 AMDGPU::OpName::src1_abs,
1243 AMDGPU::OpName::src1_sel,
1251 for (
unsigned i = 0; i < 14; i++) {
1254 assert (MO.
isImm());
1264 uint64_t Imm)
const {
1266 AMDGPU::ALU_LITERAL_X);
1273 unsigned DstReg,
unsigned SrcReg)
const {
1286 int64_t Imm)
const {
1288 assert(Idx != -1 &&
"Operand not supported for this instruction.");
1302 unsigned Flag)
const {
1303 unsigned TargetFlags =
get(MI->
getOpcode()).TSFlags;
1324 case 0: FlagIndex =
getOperandIdx(*MI, AMDGPU::OpName::src0_neg);
break;
1325 case 1: FlagIndex =
getOperandIdx(*MI, AMDGPU::OpName::src1_neg);
break;
1326 case 2: FlagIndex =
getOperandIdx(*MI, AMDGPU::OpName::src2_neg);
break;
1331 assert(!IsOP3 &&
"Cannot set absolute value modifier for OP3 "
1335 case 0: FlagIndex =
getOperandIdx(*MI, AMDGPU::OpName::src0_abs);
break;
1336 case 1: FlagIndex =
getOperandIdx(*MI, AMDGPU::OpName::src1_abs);
break;
1344 assert(FlagIndex != -1 &&
"Flag not supported for this instruction");
1347 assert(FlagIndex != 0 &&
1348 "Instruction flags not supported for this instruction");
1352 assert(FlagOp.
isImm());
1357 unsigned Flag)
const {
1358 unsigned TargetFlags =
get(MI->
getOpcode()).TSFlags;
1378 unsigned Flag)
const {
1379 unsigned TargetFlags =
get(MI->
getOpcode()).TSFlags;
1385 unsigned InstFlags = FlagOp.
getImm();
1387 FlagOp.
setImm(InstFlags);
MachineInstr * buildSlotOfVectorInstruction(MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg) const
bool readsLDSSrcReg(const MachineInstr *MI) const
void push_back(const T &Elt)
void clearFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const
Clear the specified flag on the instruction.
const MachineFunction * getParent() const
mop_iterator operands_end()
void setImmOperand(MachineInstr *MI, unsigned Op, int64_t Imm) const
Helper function for setting instruction flag values.
MachineInstr * getParent()
bool isLDSInstr(unsigned Opcode) const
AMDGPU specific subclass of TargetSubtarget.
int getSrcIdx(unsigned Opcode, unsigned SrcNum) const
bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
Interface definition for R600InstrInfo.
MachineBasicBlock * getMBB() const
unsigned getHWRegChan(unsigned reg) const
get the HW encoding for a register's channel.
bool canBeConsideredALU(const MachineInstr *MI) const
enum Generation getGeneration() const
bool isVector(const MachineInstr &MI) const
static bool isVirtualRegister(unsigned Reg)
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
const MCInstrDesc & getDesc() const
static unsigned getSlotedOps(unsigned Op, unsigned Slot)
static bool isConstCompatible(R600InstrInfo::BankSwizzle TransSwz, const std::vector< std::pair< int, unsigned > > &TransOps, unsigned ConstCount)
#define OPCODE_IS_NOT_ZERO_INT
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
static MachineBasicBlock::iterator FindLastAluClause(MachineBasicBlock &MBB)
static unsigned getTransSwizzle(R600InstrInfo::BankSwizzle Swz, unsigned Op)
static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
bool PredicateInstruction(MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const
MachineInstr * buildMovImm(MachineBasicBlock &BB, MachineBasicBlock::iterator I, unsigned DstReg, uint64_t Imm) const
virtual const InstrItineraryData * getInstrItineraryData() const
const MachineInstrBuilder & addImm(int64_t Val) const
bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
#define HAS_NATIVE_OPERANDS(Flags)
bool hasInstrModifiers(unsigned Opcode) const
MachineInstr * buildMovInstr(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned DstReg, unsigned SrcReg) const
Build a MOV instruction.
static bool isJump(unsigned Opcode)
bool usesVertexCache(unsigned Opcode) const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
#define OPCODE_IS_NOT_ZERO
virtual unsigned getIEQOpcode() const
R600InstrInfo(AMDGPUTargetMachine &tm)
MachineOperand & getFlagOp(MachineInstr *MI, unsigned SrcIdx=0, unsigned Flag=0) const
bool usesTextureCache(unsigned Opcode) const
bool isPredicable(MachineInstr *MI) const
reverse_iterator rbegin()
bool hasVertexCache() const
const MachineBasicBlock * getParent() const
bool isExport(unsigned Opcode) const
bundle_iterator< MachineInstr, instr_iterator > iterator
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
const MachineOperand & getOperand(unsigned i) const
unsigned getSubRegFromChannel(unsigned Channel) const
bool isPredicated(const MachineInstr *MI) const
const R600RegisterInfo & getRegisterInfo() const
virtual const TargetRegisterClass * getIndirectAddrRegClass() const
void setImm(int64_t immVal)
int getOperandIdx(const MachineInstr &MI, unsigned Op) const
Get the index of Op in the MachineInstr.
static MachineInstr * findFirstPredicateSetterFrom(MachineBasicBlock &MBB, MachineBasicBlock::iterator I)
The AMDGPU TargetMachine interface definition for hw codgen targets.
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
virtual const TargetFrameLowering * getFrameLowering() const
void setIsKill(bool Val=true)
DebugLoc findDebugLoc(instr_iterator MBBI)
static bool NextPossibleSolution(std::vector< R600InstrInfo::BankSwizzle > &SwzCandidate, unsigned Idx)
bool hasCaymanISA() const
const STC & getSubtarget() const
bool usesAddressRegister(MachineInstr *MI) const
virtual bool isPhysRegLiveAcrossClauses(unsigned Reg) const
#define OPERAND_CASE(Label)
virtual unsigned getStackWidth(const MachineFunction &MF) const
unsigned int getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr *MI, unsigned *PredCost=0) const
int findRegisterUseOperandIdx(unsigned Reg, bool isKill=false, const TargetRegisterInfo *TRI=NULL) const
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
bool isTrig(const MachineInstr &MI) const
bool mustBeLastInClause(unsigned Opcode) const
static bool isPredicateSetter(unsigned Opcode)
int findFirstPredOperandIdx() const
int getSelIdx(unsigned Opcode, unsigned SrcIdx) const
virtual int getIndirectIndexEnd(const MachineFunction &MF) const
ssize_t write(int fildes, const void *buf, size_t nbyte);
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.
#define GET_FLAG_OPERAND_IDX(Flags)
Helper for getting the operand index for the instruction flags operand.
Information about the stack frame layout on the AMDGPU targets.
void setReg(unsigned Reg)
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
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
int findRegisterDefOperandIdx(unsigned Reg, bool isDead=false, bool Overlap=false, const TargetRegisterInfo *TRI=NULL) const
static std::vector< std::pair< int, unsigned > > Swizzle(std::vector< std::pair< int, unsigned > > Src, R600InstrInfo::BankSwizzle Swz)
unsigned getMaxAlusPerClause() const
bool isReductionOp(unsigned opcode) const
unsigned getReg() const
getReg - Returns the register number.
static bool isBranch(unsigned Opcode)
std::reverse_iterator< iterator > reverse_iterator
mop_iterator operands_begin()
bool definesAddressRegister(MachineInstr *MI) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
virtual int getIndirectIndexBegin(const MachineFunction &MF) const
#define GET_REG_INDEX(reg)
const MCOperandInfo * OpInfo
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCyles, unsigned ExtraPredCycles, const BranchProbability &Probability) const
ItTy prior(ItTy it, Dist n)
int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex)
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
iterator find(const KeyT &Val)
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
DFAPacketizer * CreateTargetScheduleState(const TargetMachine *TM, const ScheduleDAG *DAG) const
bool isTransOnly(unsigned Opcode) const
#define OPCODE_IS_ZERO_INT