22#define GET_INSTRINFO_CTOR_DTOR
23#include "R600GenDFAPacketizer.inc"
25#define GET_INSTRINFO_CTOR_DTOR
26#define GET_INSTRMAP_INFO
27#define GET_INSTRINFO_NAMED_OPS
28#include "R600GenInstrInfo.inc"
41 bool RenamableDest,
bool RenamableSrc)
const {
42 unsigned VectorComponents = 0;
43 if ((R600::R600_Reg128RegClass.
contains(DestReg) ||
44 R600::R600_Reg128VerticalRegClass.
contains(DestReg)) &&
45 (R600::R600_Reg128RegClass.
contains(SrcReg) ||
46 R600::R600_Reg128VerticalRegClass.
contains(SrcReg))) {
48 }
else if((R600::R600_Reg64RegClass.
contains(DestReg) ||
49 R600::R600_Reg64VerticalRegClass.
contains(DestReg)) &&
50 (R600::R600_Reg64RegClass.
contains(SrcReg) ||
51 R600::R600_Reg64VerticalRegClass.
contains(SrcReg))) {
55 if (VectorComponents > 0) {
56 for (
unsigned I = 0;
I < VectorComponents;
I++) {
59 RI.getSubReg(DestReg, SubRegIndex),
60 RI.getSubReg(SrcReg, SubRegIndex))
76 if (!MO.getReg().isVirtual() && RI.isPhysRegLiveAcrossClauses(MO.getReg()))
86 case R600::MOV_IMM_F32:
87 case R600::MOV_IMM_I32:
98 default:
return false;
99 case R600::CUBE_r600_pseudo:
100 case R600::CUBE_r600_real:
101 case R600::CUBE_eg_pseudo:
102 case R600::CUBE_eg_real:
108 unsigned TargetFlags =
get(Opcode).TSFlags;
114 unsigned TargetFlags =
get(Opcode).TSFlags;
122 unsigned TargetFlags =
get(Opcode).TSFlags;
138 switch (
MI.getOpcode()) {
140 case R600::INTERP_PAIR_XY:
141 case R600::INTERP_PAIR_ZW:
142 case R600::INTERP_VEC_LOAD:
152 if (ST.hasCaymanISA())
154 return (
get(Opcode).getSchedClass() == R600::Sched::TransALU);
162 return (
get(Opcode).getSchedClass() == R600::Sched::VecALU);
174 return ST.hasVertexCache() &&
IS_VTX(
get(Opcode));
197 case R600::GROUP_BARRIER:
205 return MI.findRegisterUseOperandIdx(R600::AR_X, &RI,
false) != -1;
209 return MI.findRegisterDefOperandIdx(R600::AR_X, &RI,
false,
false) != -1;
217 if (MO.getReg().isPhysical() &&
218 R600::R600_LDS_SRC_REGRegClass.contains(MO.getReg()))
224 static const R600::OpName SrcSelTable[][2] = {
225 {R600::OpName::src0, R600::OpName::src0_sel},
226 {R600::OpName::src1, R600::OpName::src1_sel},
227 {R600::OpName::src2, R600::OpName::src2_sel},
228 {R600::OpName::src0_X, R600::OpName::src0_sel_X},
229 {R600::OpName::src0_Y, R600::OpName::src0_sel_Y},
230 {R600::OpName::src0_Z, R600::OpName::src0_sel_Z},
231 {R600::OpName::src0_W, R600::OpName::src0_sel_W},
232 {R600::OpName::src1_X, R600::OpName::src1_sel_X},
233 {R600::OpName::src1_Y, R600::OpName::src1_sel_Y},
234 {R600::OpName::src1_Z, R600::OpName::src1_sel_Z},
235 {R600::OpName::src1_W, R600::OpName::src1_sel_W}};
237 for (
const auto &Row : SrcSelTable) {
249 if (
MI.getOpcode() == R600::DOT_4) {
250 static const R600::OpName OpTable[8][2] = {
251 {R600::OpName::src0_X, R600::OpName::src0_sel_X},
252 {R600::OpName::src0_Y, R600::OpName::src0_sel_Y},
253 {R600::OpName::src0_Z, R600::OpName::src0_sel_Z},
254 {R600::OpName::src0_W, R600::OpName::src0_sel_W},
255 {R600::OpName::src1_X, R600::OpName::src1_sel_X},
256 {R600::OpName::src1_Y, R600::OpName::src1_sel_Y},
257 {R600::OpName::src1_Z, R600::OpName::src1_sel_Z},
258 {R600::OpName::src1_W, R600::OpName::src1_sel_W},
261 for (
const auto &
Op : OpTable) {
264 if (Reg == R600::ALU_CONST) {
267 Result.push_back(std::pair(&MO, Sel.
getImm()));
274 static const R600::OpName OpTable[3][2] = {
275 {R600::OpName::src0, R600::OpName::src0_sel},
276 {R600::OpName::src1, R600::OpName::src1_sel},
277 {R600::OpName::src2, R600::OpName::src2_sel},
280 for (
const auto &
Op : OpTable) {
286 if (Reg == R600::ALU_CONST) {
288 Result.push_back(std::pair(&MO, Sel.
getImm()));
291 if (Reg == R600::ALU_LITERAL_X) {
294 if (Operand.
isImm()) {
295 Result.push_back(std::pair(&MO, Operand.
getImm()));
300 Result.push_back(std::pair(&MO, 0));
305std::vector<std::pair<int, unsigned>>
308 unsigned &ConstCount)
const {
310 const std::pair<int, unsigned> DummyPair(-1, 0);
311 std::vector<std::pair<int, unsigned>> Result;
316 int Index = RI.getEncodingValue(Reg) & 0xff;
317 if (Reg == R600::OQAP) {
318 Result.emplace_back(Index, 0U);
322 Result.emplace_back(255, 0U);
327 Result.push_back(DummyPair);
331 Result.emplace_back(Index, Chan);
334 Result.push_back(DummyPair);
338static std::vector<std::pair<int, unsigned>>
339Swizzle(std::vector<std::pair<int, unsigned>> Src,
341 if (Src[0] == Src[1])
368 assert(
Op < 3 &&
"Out of range swizzle index");
371 unsigned Cycles[3] = { 2, 1, 0};
375 unsigned Cycles[3] = { 1, 2, 2};
379 unsigned Cycles[3] = { 2, 1, 2};
383 unsigned Cycles[3] = { 2, 2, 1};
395 const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
396 const std::vector<R600InstrInfo::BankSwizzle> &Swz,
397 const std::vector<std::pair<int, unsigned>> &TransSrcs,
401 for (
unsigned i = 0, e = IGSrcs.size(); i < e; i++) {
402 const std::vector<std::pair<int, unsigned>> &Srcs =
404 for (
unsigned j = 0; j < 3; j++) {
405 const std::pair<int, unsigned> &Src = Srcs[j];
406 if (Src.first < 0 || Src.first == 255)
408 if (Src.first ==
GET_REG_INDEX(RI.getEncodingValue(R600::OQAP))) {
418 if (
Vector[Src.second][j] < 0)
419 Vector[Src.second][j] = Src.first;
420 if (
Vector[Src.second][j] != Src.first)
425 for (
unsigned i = 0, e = TransSrcs.size(); i < e; ++i) {
426 const std::pair<int, unsigned> &Src = TransSrcs[i];
430 if (Src.first == 255)
432 if (
Vector[Src.second][Cycle] < 0)
433 Vector[Src.second][Cycle] = Src.first;
434 if (
Vector[Src.second][Cycle] != Src.first)
435 return IGSrcs.size() - 1;
437 return IGSrcs.size();
445 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
447 assert(Idx < SwzCandidate.size());
451 for (
unsigned i = ResetIdx + 1, e = SwzCandidate.size(); i < e; i++) {
456 int NextSwizzle = SwzCandidate[ResetIdx] + 1;
464 const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
465 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
466 const std::vector<std::pair<int, unsigned>> &TransSrcs,
468 unsigned ValidUpTo = 0;
470 ValidUpTo =
isLegalUpTo(IGSrcs, SwzCandidate, TransSrcs, TransSwz);
471 if (ValidUpTo == IGSrcs.size())
481 const std::vector<std::pair<int, unsigned>> &TransOps,
482 unsigned ConstCount) {
486 for (
unsigned i = 0, e = TransOps.size(); i < e; ++i) {
487 const std::pair<int, unsigned> &Src = TransOps[i];
491 if (ConstCount > 0 && Cycle == 0)
493 if (ConstCount > 1 && Cycle == 1)
502 std::vector<BankSwizzle> &ValidSwizzle,
507 std::vector<std::vector<std::pair<int, unsigned>>> IGSrcs;
508 ValidSwizzle.clear();
512 IGSrcs.push_back(ExtractSrcs(*
MI, PV, ConstCount));
514 ValidSwizzle.push_back(
517 std::vector<std::pair<int, unsigned>> TransOps;
521 TransOps = std::move(IGSrcs.back());
523 ValidSwizzle.pop_back();
537 ValidSwizzle.push_back(TransBS);
548 assert (Consts.size() <= 12 &&
"Too many operands in instructions group");
549 unsigned Pair1 = 0, Pair2 = 0;
550 for (
unsigned Const : Consts) {
551 unsigned ReadConstHalf = Const & 2;
552 unsigned ReadConstIndex = Const & (~3);
553 unsigned ReadHalfConst = ReadConstIndex | ReadConstHalf;
555 Pair1 = ReadHalfConst;
558 if (Pair1 == ReadHalfConst)
561 Pair2 = ReadHalfConst;
564 if (Pair2 != ReadHalfConst)
573 std::vector<unsigned> Consts;
580 if (Src.first->getReg() == R600::ALU_LITERAL_X)
581 Literals.
insert(Src.second);
582 if (Literals.
size() > 4)
584 if (Src.first->getReg() == R600::ALU_CONST)
585 Consts.push_back(Src.second);
586 if (R600::R600_KC0RegClass.
contains(Src.first->getReg()) ||
587 R600::R600_KC1RegClass.contains(Src.first->getReg())) {
588 unsigned Index = RI.getEncodingValue(Src.first->getReg()) & 0xff;
589 unsigned Chan = RI.getHWRegChan(Src.first->getReg());
590 Consts.push_back((Index << 2) | Chan);
600 return static_cast<const R600Subtarget &
>(STI).createDFAPacketizer(
II);
616 while (
I !=
MBB.begin()) {
628 return Opcode == R600::JUMP || Opcode == R600::JUMP_COND;
632 return Opcode == R600::BRANCH || Opcode == R600::BRANCH_COND_i32 ||
633 Opcode == R600::BRANCH_COND_f32;
640 bool AllowModify)
const {
657 while (
I !=
MBB.begin() && std::prev(
I)->getOpcode() == R600::JUMP) {
660 I->removeFromParent();
667 if (
I ==
MBB.begin() || !
isJump((--
I)->getOpcode())) {
668 if (LastOpc == R600::JUMP) {
672 if (LastOpc == R600::JUMP_COND) {
678 Cond.push_back(predSet->getOperand(1));
679 Cond.push_back(predSet->getOperand(2));
688 unsigned SecondLastOpc = SecondLastInst.
getOpcode();
691 if (SecondLastOpc == R600::JUMP_COND && LastOpc == R600::JUMP) {
698 Cond.push_back(predSet->getOperand(1));
699 Cond.push_back(predSet->getOperand(2));
712 if (It->getOpcode() == R600::CF_ALU ||
713 It->getOpcode() == R600::CF_ALU_PUSH_BEFORE)
714 return It.getReverse();
724 int *BytesAdded)
const {
725 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
726 assert(!BytesAdded &&
"code size not handled");
734 assert(PredSet &&
"No previous predicate !");
742 if (CfAlu ==
MBB.end())
744 assert (CfAlu->getOpcode() == R600::CF_ALU);
745 CfAlu->setDesc(
get(R600::CF_ALU_PUSH_BEFORE));
749 assert(PredSet &&
"No previous predicate !");
757 if (CfAlu ==
MBB.end())
759 assert(CfAlu->getOpcode() == R600::CF_ALU);
760 CfAlu->setDesc(
get(R600::CF_ALU_PUSH_BEFORE));
765 int *BytesRemoved)
const {
766 assert(!BytesRemoved &&
"code size not handled");
773 if (
I ==
MBB.begin()) {
777 switch (
I->getOpcode()) {
780 case R600::JUMP_COND: {
783 I->eraseFromParent();
785 if (CfAlu ==
MBB.end())
787 assert (CfAlu->getOpcode() == R600::CF_ALU_PUSH_BEFORE);
788 CfAlu->setDesc(
get(R600::CF_ALU));
792 I->eraseFromParent();
797 if (
I ==
MBB.begin()) {
801 switch (
I->getOpcode()) {
805 case R600::JUMP_COND: {
808 I->eraseFromParent();
810 if (CfAlu ==
MBB.end())
812 assert (CfAlu->getOpcode() == R600::CF_ALU_PUSH_BEFORE);
813 CfAlu->setDesc(
get(R600::CF_ALU));
817 I->eraseFromParent();
824 int idx =
MI.findFirstPredOperandIdx();
830 default:
return false;
831 case R600::PRED_SEL_ONE:
832 case R600::PRED_SEL_ZERO:
833 case R600::PREDICATE_BIT:
844 if (
MI.getOpcode() == R600::KILLGT)
846 if (
MI.getOpcode() == R600::CF_ALU) {
852 return MI.getOperand(3).getImm() == 0 &&
MI.getOperand(4).getImm() == 0;
862 unsigned ExtraPredCycles,
870 unsigned ExtraTCycles,
873 unsigned ExtraFCycles,
896 case R600::PRED_SETE_INT:
897 MO.
setImm(R600::PRED_SETNE_INT);
899 case R600::PRED_SETNE_INT:
900 MO.
setImm(R600::PRED_SETE_INT);
902 case R600::PRED_SETE:
903 MO.
setImm(R600::PRED_SETNE);
905 case R600::PRED_SETNE:
906 MO.
setImm(R600::PRED_SETE);
914 case R600::PRED_SEL_ZERO:
915 MO2.
setReg(R600::PRED_SEL_ONE);
917 case R600::PRED_SEL_ONE:
918 MO2.
setReg(R600::PRED_SEL_ZERO);
927 std::vector<MachineOperand> &Pred,
928 bool SkipDead)
const {
934 int PIdx =
MI.findFirstPredOperandIdx();
936 if (
MI.getOpcode() == R600::CF_ALU) {
937 MI.getOperand(8).setImm(0);
941 if (
MI.getOpcode() == R600::DOT_4) {
943 .setReg(Pred[2].
getReg());
945 .setReg(Pred[2].
getReg());
947 .setReg(Pred[2].
getReg());
949 .setReg(Pred[2].
getReg());
972 unsigned *PredCost)
const {
979 unsigned Channel)
const {
985 switch (
MI.getOpcode()) {
989 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::addr);
992 int RegOpIdx = OffsetOpIdx + 1;
994 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::chan);
997 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::dst);
998 unsigned RegIndex =
MI.getOperand(RegOpIdx).getImm();
999 unsigned Channel =
MI.getOperand(ChanOpIdx).getImm();
1001 Register OffsetReg =
MI.getOperand(OffsetOpIdx).getReg();
1002 if (OffsetReg == R600::INDIRECT_BASE_ADDR) {
1006 buildIndirectRead(
MBB,
MI,
MI.getOperand(DstOpIdx).getReg(),
Address,
1011 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::val);
1012 unsigned RegIndex =
MI.getOperand(RegOpIdx).getImm();
1013 unsigned Channel =
MI.getOperand(ChanOpIdx).getImm();
1015 Register OffsetReg =
MI.getOperand(OffsetOpIdx).getReg();
1016 if (OffsetReg == R600::INDIRECT_BASE_ADDR) {
1018 MI.getOperand(ValOpIdx).getReg());
1020 buildIndirectWrite(
MBB,
MI,
MI.getOperand(ValOpIdx).getReg(),
1031 case R600::R600_EXTRACT_ELT_V2:
1032 case R600::R600_EXTRACT_ELT_V4:
1033 buildIndirectRead(
MI.getParent(),
MI,
MI.getOperand(0).getReg(),
1034 RI.getHWRegIndex(
MI.getOperand(1).getReg()),
1035 MI.getOperand(2).getReg(),
1036 RI.getHWRegChan(
MI.getOperand(1).getReg()));
1038 case R600::R600_INSERT_ELT_V2:
1039 case R600::R600_INSERT_ELT_V4:
1040 buildIndirectWrite(
MI.getParent(),
MI,
MI.getOperand(2).getReg(),
1041 RI.getHWRegIndex(
MI.getOperand(1).getReg()),
1042 MI.getOperand(3).getReg(),
1043 RI.getHWRegChan(
MI.getOperand(1).getReg()));
1046 MI.eraseFromParent();
1063 for (
unsigned Chan = 0; Chan < StackWidth; ++Chan) {
1065 R600::R600_TReg32RegClass.getRegister((4 * Index) + Chan);
1072 return &R600::R600_TReg32_XRegClass;
1077 unsigned ValueReg,
unsigned Address,
1078 unsigned OffsetReg)
const {
1079 return buildIndirectWrite(
MBB,
I, ValueReg,
Address, OffsetReg, 0);
1084 unsigned ValueReg,
unsigned Address,
1086 unsigned AddrChan)
const {
1090 case 0: AddrReg = R600::R600_AddrRegClass.getRegister(
Address);
break;
1091 case 1: AddrReg = R600::R600_Addr_YRegClass.getRegister(
Address);
break;
1092 case 2: AddrReg = R600::R600_Addr_ZRegClass.getRegister(
Address);
break;
1093 case 3: AddrReg = R600::R600_Addr_WRegClass.getRegister(
Address);
break;
1096 R600::AR_X, OffsetReg);
1109 unsigned ValueReg,
unsigned Address,
1110 unsigned OffsetReg)
const {
1111 return buildIndirectRead(
MBB,
I, ValueReg,
Address, OffsetReg, 0);
1116 unsigned ValueReg,
unsigned Address,
1118 unsigned AddrChan)
const {
1122 case 0: AddrReg = R600::R600_AddrRegClass.getRegister(
Address);
break;
1123 case 1: AddrReg = R600::R600_Addr_YRegClass.getRegister(
Address);
break;
1124 case 2: AddrReg = R600::R600_Addr_ZRegClass.getRegister(
Address);
break;
1125 case 3: AddrReg = R600::R600_Addr_WRegClass.getRegister(
Address);
break;
1155 for (std::pair<MCRegister, Register> LI : MRI.
liveins()) {
1157 if (Reg.isVirtual() || !IndirectRC->
contains(Reg))
1162 for (RegIndex = 0, RegEnd = IndirectRC->
getNumRegs(); RegIndex != RegEnd;
1164 if (IndirectRC->
getRegister(RegIndex) == (
unsigned)Reg)
1190 Offset = TFL->getFrameIndexReference(MF, -1, IgnoredFrameReg).getFixed();
1204 unsigned Src1Reg)
const {
1233 .
addReg(R600::PRED_SEL_OFF)
1240#define OPERAND_CASE(Label) \
1242 static const R600::OpName Ops[] = {Label##_X, Label##_Y, Label##_Z, \
1276 assert (
MI->getOpcode() == R600::DOT_4 &&
"Not Implemented");
1279 Opcode = R600::DOT4_r600;
1281 Opcode = R600::DOT4_eg;
1289 static const R600::OpName
Operands[14] = {
1290 R600::OpName::update_exec_mask,
1291 R600::OpName::update_pred,
1292 R600::OpName::write,
1294 R600::OpName::dst_rel,
1295 R600::OpName::clamp,
1296 R600::OpName::src0_neg,
1297 R600::OpName::src0_rel,
1298 R600::OpName::src0_abs,
1299 R600::OpName::src0_sel,
1300 R600::OpName::src1_neg,
1301 R600::OpName::src1_rel,
1302 R600::OpName::src1_abs,
1303 R600::OpName::src1_sel,
1311 for (R600::OpName Operand :
Operands) {
1324 uint64_t
Imm)
const {
1326 R600::ALU_LITERAL_X);
1333 unsigned DstReg,
unsigned SrcReg)
const {
1338 R600::OpName
Op)
const {
1343 return R600::getNamedOperandIdx(Opcode,
Op);
1347 int64_t
Imm)
const {
1349 assert(Idx != -1 &&
"Operand not supported for this instruction.");
1350 assert(
MI.getOperand(Idx).isImm());
1351 MI.getOperand(Idx).setImm(
Imm);
1359 unsigned Flag)
const {
1360 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1394 assert(!IsOP3 &&
"Cannot set absolute value modifier for OP3 "
1411 assert(FlagIndex != -1 &&
"Flag not supported for this instruction");
1415 "Instruction flags not supported for this instruction");
1424 unsigned Flag)
const {
1425 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1445 unsigned Flag)
const {
1446 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1452 unsigned InstFlags = FlagOp.
getImm();
1454 FlagOp.
setImm(InstFlags);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Register const TargetRegisterInfo * TRI
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
uint64_t IntrinsicInst * II
#define GET_REG_INDEX(reg)
#define HAS_NATIVE_OPERANDS(Flags)
#define GET_FLAG_OPERAND_IDX(Flags)
Helper for getting the operand index for the instruction flags operand.
static MachineInstr * findFirstPredicateSetterFrom(MachineBasicBlock &MBB, MachineBasicBlock::iterator I)
static R600::OpName getSlotedOps(R600::OpName Op, unsigned Slot)
static bool isBranch(unsigned Opcode)
static MachineBasicBlock::iterator FindLastAluClause(MachineBasicBlock &MBB)
#define OPERAND_CASE(Label)
static std::vector< std::pair< int, unsigned > > Swizzle(std::vector< std::pair< int, unsigned > > Src, R600InstrInfo::BankSwizzle Swz)
static unsigned getTransSwizzle(R600InstrInfo::BankSwizzle Swz, unsigned Op)
static bool isConstCompatible(R600InstrInfo::BankSwizzle TransSwz, const std::vector< std::pair< int, unsigned > > &TransOps, unsigned ConstCount)
Instructions in Trans slot can't read gpr at cycle 0 if they also read a const, and can't read a gpr ...
static bool isPredicateSetter(unsigned Opcode)
static bool NextPossibleSolution(std::vector< R600InstrInfo::BankSwizzle > &SwzCandidate, unsigned Idx)
Given a swizzle sequence SwzCandidate and an index Idx, returns the next (in lexicographic term) swiz...
static bool isJump(unsigned Opcode)
Interface definition for R600InstrInfo.
Provides R600 specific target descriptions.
AMDGPU R600 specific subclass of TargetSubtarget.
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
unsigned getStackWidth(const MachineFunction &MF) const
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Itinerary data supplied by a subtarget to be used by a target.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
unsigned getNumRegs() const
getNumRegs - Return the number of registers in this class.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
Wrapper class representing physical registers. Should be passed by value.
MachineInstrBundleIterator< const MachineInstr > const_iterator
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
unsigned getNumObjects() const
Return the number of objects.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
void setImm(int64_t immVal)
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
void setIsKill(bool Val=true)
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateReg(Register 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 isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool livein_empty() const
ArrayRef< std::pair< MCRegister, Register > > liveins() const
bool usesVertexCache(unsigned Opcode) const
MachineInstrBuilder buildDefaultInstruction(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned Opcode, unsigned DstReg, unsigned Src0Reg, unsigned Src1Reg=0) const
buildDefaultInstruction - This function returns a MachineInstr with all the instruction modifiers ini...
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void addFlag(MachineInstr &MI, unsigned SrcIdx, unsigned Flag) const
Add one of the MO_FLAG* flags to the operand at SrcIdx.
bool usesAddressRegister(MachineInstr &MI) const
unsigned calculateIndirectAddress(unsigned RegIndex, unsigned Channel) const
Calculate the "Indirect Address" for the given RegIndex and Channel.
bool hasInstrModifiers(unsigned Opcode) const
R600InstrInfo(const R600Subtarget &)
bool isMov(unsigned Opcode) const
bool isRegisterLoad(const MachineInstr &MI) const
int getIndirectIndexBegin(const MachineFunction &MF) const
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const override
bool usesTextureCache(unsigned Opcode) const
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
returns how many MIs (whose inputs are represented by IGSrcs) can be packed in the same Instruction G...
unsigned int getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const override
const TargetRegisterClass * getIndirectAddrRegClass() const
void clearFlag(MachineInstr &MI, unsigned SrcIdx, unsigned Flag) const
Clear the specified flag on the instruction.
MachineInstr * buildMovImm(MachineBasicBlock &BB, MachineBasicBlock::iterator I, unsigned DstReg, uint64_t Imm) const
bool definesAddressRegister(MachineInstr &MI) const
unsigned getMaxAlusPerClause() const
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const override
int getOperandIdx(const MachineInstr &MI, R600::OpName Op) const
Get the index of Op in the MachineInstr.
bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const override
bool canBeConsideredALU(const MachineInstr &MI) const
bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const override
bool fitsConstReadLimitations(const std::vector< MachineInstr * > &) const
An instruction group can only access 2 channel pair (either [XY] or [ZW]) from KCache bank on R700+.
bool isVector(const MachineInstr &MI) const
Vector instructions are instructions that must fill all instruction slots within an instruction group...
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
bool mustBeLastInClause(unsigned Opcode) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
int getIndirectIndexEnd(const MachineFunction &MF) const
bool isTransOnly(unsigned Opcode) const
DFAPacketizer * CreateTargetScheduleState(const TargetSubtargetInfo &) const override
bool isReductionOp(unsigned opcode) const
bool isRegisterStore(const MachineInstr &MI) const
bool isCubeOp(unsigned opcode) const
bool isLDSInstr(unsigned Opcode) const
void reserveIndirectRegisters(BitVector &Reserved, const MachineFunction &MF, const R600RegisterInfo &TRI) const
Reserve the registers that may be accessed using indirect addressing.
void setImmOperand(MachineInstr &MI, R600::OpName Op, int64_t Imm) const
Helper function for setting instruction flag values.
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
bool isPredicable(const MachineInstr &MI) const override
bool isPredicated(const MachineInstr &MI) const override
bool expandPostRAPseudo(MachineInstr &MI) const override
bool isLDSRetInstr(unsigned Opcode) const
int getSelIdx(unsigned Opcode, unsigned SrcIdx) const
MachineOperand & getFlagOp(MachineInstr &MI, unsigned SrcIdx=0, unsigned Flag=0) const
unsigned int getPredicationCost(const MachineInstr &) const override
MachineInstr * buildSlotOfVectorInstruction(MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg) const
bool readsLDSSrcReg(const 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
Enumerate all possible Swizzle sequence to find one that can meet all read port requirements.
bool fitsReadPortLimitations(const std::vector< MachineInstr * > &MIs, const DenseMap< unsigned, unsigned > &PV, std::vector< BankSwizzle > &BS, bool isLastAluTrans) const
Given the order VEC_012 < VEC_021 < VEC_120 < VEC_102 < VEC_201 < VEC_210 returns true and the first ...
bool ClobbersPredicate(MachineInstr &MI, std::vector< MachineOperand > &Pred, bool SkipDead) const override
bool isALUInstr(unsigned Opcode) const
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
bool isVectorOnly(unsigned Opcode) const
bool isExport(unsigned Opcode) const
SmallVector< std::pair< MachineOperand *, int64_t >, 3 > getSrcs(MachineInstr &MI) const
MachineInstr * buildMovInstr(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned DstReg, unsigned SrcReg) const
Wrapper class representing virtual and physical registers.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
virtual bool isPredicable(const MachineInstr &MI) const
Return true if the specified instruction can be predicated.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const InstrItineraryData * getInstrItineraryData() const
getInstrItineraryData - Returns instruction itinerary data for the target or specific subtarget.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_READNONE constexpr bool isCompute(CallingConv::ID CC)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Kill
The last use of a register.
@ Define
Register definition.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
DWARFExpression::Operation Op
MCRegisterClass TargetRegisterClass
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned getHWRegChan(unsigned reg) const
get the HW encoding for a register's channel.
static unsigned getSubRegFromChannel(unsigned Channel)