23#define GET_INSTRINFO_CTOR_DTOR
24#include "R600GenDFAPacketizer.inc"
26#define GET_INSTRINFO_CTOR_DTOR
27#define GET_INSTRMAP_INFO
28#define GET_INSTRINFO_NAMED_OPS
29#include "R600GenInstrInfo.inc"
42 bool RenamableDest,
bool RenamableSrc)
const {
43 unsigned VectorComponents = 0;
44 if ((R600::R600_Reg128RegClass.
contains(DestReg) ||
45 R600::R600_Reg128VerticalRegClass.
contains(DestReg)) &&
46 (R600::R600_Reg128RegClass.
contains(SrcReg) ||
47 R600::R600_Reg128VerticalRegClass.
contains(SrcReg))) {
49 }
else if((R600::R600_Reg64RegClass.
contains(DestReg) ||
50 R600::R600_Reg64VerticalRegClass.
contains(DestReg)) &&
51 (R600::R600_Reg64RegClass.
contains(SrcReg) ||
52 R600::R600_Reg64VerticalRegClass.
contains(SrcReg))) {
56 if (VectorComponents > 0) {
57 for (
unsigned I = 0;
I < VectorComponents;
I++) {
60 RI.getSubReg(DestReg, SubRegIndex),
61 RI.getSubReg(SrcReg, SubRegIndex))
87 case R600::MOV_IMM_F32:
88 case R600::MOV_IMM_I32:
99 default:
return false;
100 case R600::CUBE_r600_pseudo:
101 case R600::CUBE_r600_real:
102 case R600::CUBE_eg_pseudo:
103 case R600::CUBE_eg_real:
109 unsigned TargetFlags =
get(Opcode).TSFlags;
115 unsigned TargetFlags =
get(Opcode).TSFlags;
123 unsigned TargetFlags =
get(Opcode).TSFlags;
139 switch (
MI.getOpcode()) {
141 case R600::INTERP_PAIR_XY:
142 case R600::INTERP_PAIR_ZW:
143 case R600::INTERP_VEC_LOAD:
155 return (
get(Opcode).getSchedClass() == R600::Sched::TransALU);
163 return (
get(Opcode).getSchedClass() == R600::Sched::VecALU);
198 case R600::GROUP_BARRIER:
206 return MI.findRegisterUseOperandIdx(R600::AR_X, &RI,
false) != -1;
210 return MI.findRegisterDefOperandIdx(R600::AR_X, &RI,
false,
false) != -1;
218 if (MO.getReg().isPhysical() &&
219 R600::R600_LDS_SRC_REGRegClass.contains(MO.getReg()))
225 static const R600::OpName SrcSelTable[][2] = {
226 {R600::OpName::src0, R600::OpName::src0_sel},
227 {R600::OpName::src1, R600::OpName::src1_sel},
228 {R600::OpName::src2, R600::OpName::src2_sel},
229 {R600::OpName::src0_X, R600::OpName::src0_sel_X},
230 {R600::OpName::src0_Y, R600::OpName::src0_sel_Y},
231 {R600::OpName::src0_Z, R600::OpName::src0_sel_Z},
232 {R600::OpName::src0_W, R600::OpName::src0_sel_W},
233 {R600::OpName::src1_X, R600::OpName::src1_sel_X},
234 {R600::OpName::src1_Y, R600::OpName::src1_sel_Y},
235 {R600::OpName::src1_Z, R600::OpName::src1_sel_Z},
236 {R600::OpName::src1_W, R600::OpName::src1_sel_W}};
238 for (
const auto &Row : SrcSelTable) {
250 if (
MI.getOpcode() == R600::DOT_4) {
251 static const R600::OpName OpTable[8][2] = {
252 {R600::OpName::src0_X, R600::OpName::src0_sel_X},
253 {R600::OpName::src0_Y, R600::OpName::src0_sel_Y},
254 {R600::OpName::src0_Z, R600::OpName::src0_sel_Z},
255 {R600::OpName::src0_W, R600::OpName::src0_sel_W},
256 {R600::OpName::src1_X, R600::OpName::src1_sel_X},
257 {R600::OpName::src1_Y, R600::OpName::src1_sel_Y},
258 {R600::OpName::src1_Z, R600::OpName::src1_sel_Z},
259 {R600::OpName::src1_W, R600::OpName::src1_sel_W},
262 for (
const auto &
Op : OpTable) {
265 if (Reg == R600::ALU_CONST) {
268 Result.push_back(std::pair(&MO, Sel.
getImm()));
275 static const R600::OpName OpTable[3][2] = {
276 {R600::OpName::src0, R600::OpName::src0_sel},
277 {R600::OpName::src1, R600::OpName::src1_sel},
278 {R600::OpName::src2, R600::OpName::src2_sel},
281 for (
const auto &
Op : OpTable) {
287 if (Reg == R600::ALU_CONST) {
289 Result.push_back(std::pair(&MO, Sel.
getImm()));
292 if (Reg == R600::ALU_LITERAL_X) {
295 if (Operand.
isImm()) {
296 Result.push_back(std::pair(&MO, Operand.
getImm()));
301 Result.push_back(std::pair(&MO, 0));
306std::vector<std::pair<int, unsigned>>
309 unsigned &ConstCount)
const {
311 const std::pair<int, unsigned> DummyPair(-1, 0);
312 std::vector<std::pair<int, unsigned>> Result;
317 int Index = RI.getEncodingValue(Reg) & 0xff;
318 if (Reg == R600::OQAP) {
319 Result.emplace_back(Index, 0U);
323 Result.emplace_back(255, 0U);
328 Result.push_back(DummyPair);
332 Result.emplace_back(Index, Chan);
335 Result.push_back(DummyPair);
339static std::vector<std::pair<int, unsigned>>
340Swizzle(std::vector<std::pair<int, unsigned>> Src,
342 if (Src[0] == Src[1])
369 assert(
Op < 3 &&
"Out of range swizzle index");
372 unsigned Cycles[3] = { 2, 1, 0};
376 unsigned Cycles[3] = { 1, 2, 2};
380 unsigned Cycles[3] = { 2, 1, 2};
384 unsigned Cycles[3] = { 2, 2, 1};
396 const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
397 const std::vector<R600InstrInfo::BankSwizzle> &Swz,
398 const std::vector<std::pair<int, unsigned>> &TransSrcs,
402 for (
unsigned i = 0, e = IGSrcs.size(); i < e; i++) {
403 const std::vector<std::pair<int, unsigned>> &Srcs =
405 for (
unsigned j = 0; j < 3; j++) {
406 const std::pair<int, unsigned> &Src = Srcs[j];
407 if (Src.first < 0 || Src.first == 255)
409 if (Src.first ==
GET_REG_INDEX(RI.getEncodingValue(R600::OQAP))) {
419 if (
Vector[Src.second][j] < 0)
420 Vector[Src.second][j] = Src.first;
421 if (
Vector[Src.second][j] != Src.first)
426 for (
unsigned i = 0, e = TransSrcs.size(); i < e; ++i) {
427 const std::pair<int, unsigned> &Src = TransSrcs[i];
431 if (Src.first == 255)
436 return IGSrcs.size() - 1;
438 return IGSrcs.size();
446 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
452 for (
unsigned i = ResetIdx + 1, e = SwzCandidate.size(); i < e; i++) {
457 int NextSwizzle = SwzCandidate[ResetIdx] + 1;
465 const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
466 std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
467 const std::vector<std::pair<int, unsigned>> &TransSrcs,
469 unsigned ValidUpTo = 0;
471 ValidUpTo =
isLegalUpTo(IGSrcs, SwzCandidate, TransSrcs, TransSwz);
472 if (ValidUpTo == IGSrcs.size())
482 const std::vector<std::pair<int, unsigned>> &TransOps,
483 unsigned ConstCount) {
487 for (
unsigned i = 0, e = TransOps.size(); i < e; ++i) {
488 const std::pair<int, unsigned> &Src = TransOps[i];
492 if (ConstCount > 0 &&
Cycle == 0)
494 if (ConstCount > 1 &&
Cycle == 1)
503 std::vector<BankSwizzle> &ValidSwizzle,
508 std::vector<std::vector<std::pair<int, unsigned>>> IGSrcs;
509 ValidSwizzle.clear();
513 IGSrcs.push_back(ExtractSrcs(*
MI, PV, ConstCount));
515 ValidSwizzle.push_back(
518 std::vector<std::pair<int, unsigned>> TransOps;
522 TransOps = std::move(IGSrcs.back());
524 ValidSwizzle.pop_back();
538 ValidSwizzle.push_back(TransBS);
549 assert (Consts.size() <= 12 &&
"Too many operands in instructions group");
550 unsigned Pair1 = 0, Pair2 = 0;
551 for (
unsigned Const : Consts) {
552 unsigned ReadConstHalf = Const & 2;
553 unsigned ReadConstIndex = Const & (~3);
554 unsigned ReadHalfConst = ReadConstIndex | ReadConstHalf;
556 Pair1 = ReadHalfConst;
559 if (Pair1 == ReadHalfConst)
562 Pair2 = ReadHalfConst;
565 if (Pair2 != ReadHalfConst)
574 std::vector<unsigned> Consts;
581 if (Src.first->getReg() == R600::ALU_LITERAL_X)
582 Literals.
insert(Src.second);
583 if (Literals.
size() > 4)
585 if (Src.first->getReg() == R600::ALU_CONST)
586 Consts.push_back(Src.second);
587 if (R600::R600_KC0RegClass.
contains(Src.first->getReg()) ||
588 R600::R600_KC1RegClass.contains(Src.first->getReg())) {
589 unsigned Index = RI.getEncodingValue(Src.first->getReg()) & 0xff;
591 Consts.push_back((Index << 2) | Chan);
601 return static_cast<const R600Subtarget &
>(STI).createDFAPacketizer(
II);
629 return Opcode == R600::JUMP || Opcode == R600::JUMP_COND;
633 return Opcode == R600::BRANCH || Opcode == R600::BRANCH_COND_i32 ||
634 Opcode == R600::BRANCH_COND_f32;
641 bool AllowModify)
const {
658 while (
I !=
MBB.
begin() && std::prev(
I)->getOpcode() == R600::JUMP) {
661 I->removeFromParent();
669 if (LastOpc == R600::JUMP) {
673 if (LastOpc == R600::JUMP_COND) {
679 Cond.push_back(predSet->getOperand(1));
680 Cond.push_back(predSet->getOperand(2));
689 unsigned SecondLastOpc = SecondLastInst.
getOpcode();
692 if (SecondLastOpc == R600::JUMP_COND && LastOpc == R600::JUMP) {
699 Cond.push_back(predSet->getOperand(1));
700 Cond.push_back(predSet->getOperand(2));
713 if (It->getOpcode() == R600::CF_ALU ||
714 It->getOpcode() == R600::CF_ALU_PUSH_BEFORE)
725 int *BytesAdded)
const {
726 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
727 assert(!BytesAdded &&
"code size not handled");
735 assert(PredSet &&
"No previous predicate !");
745 assert (CfAlu->getOpcode() == R600::CF_ALU);
746 CfAlu->setDesc(
get(R600::CF_ALU_PUSH_BEFORE));
750 assert(PredSet &&
"No previous predicate !");
760 assert(CfAlu->getOpcode() == R600::CF_ALU);
761 CfAlu->setDesc(
get(R600::CF_ALU_PUSH_BEFORE));
766 int *BytesRemoved)
const {
767 assert(!BytesRemoved &&
"code size not handled");
778 switch (
I->getOpcode()) {
781 case R600::JUMP_COND: {
784 I->eraseFromParent();
788 assert (CfAlu->getOpcode() == R600::CF_ALU_PUSH_BEFORE);
789 CfAlu->setDesc(
get(R600::CF_ALU));
793 I->eraseFromParent();
802 switch (
I->getOpcode()) {
806 case R600::JUMP_COND: {
809 I->eraseFromParent();
813 assert (CfAlu->getOpcode() == R600::CF_ALU_PUSH_BEFORE);
814 CfAlu->setDesc(
get(R600::CF_ALU));
818 I->eraseFromParent();
825 int idx =
MI.findFirstPredOperandIdx();
831 default:
return false;
832 case R600::PRED_SEL_ONE:
833 case R600::PRED_SEL_ZERO:
834 case R600::PREDICATE_BIT:
845 if (
MI.getOpcode() == R600::KILLGT)
847 if (
MI.getOpcode() == R600::CF_ALU) {
853 return MI.getOperand(3).getImm() == 0 &&
MI.getOperand(4).getImm() == 0;
863 unsigned ExtraPredCycles,
871 unsigned ExtraTCycles,
874 unsigned ExtraFCycles,
897 case R600::PRED_SETE_INT:
898 MO.
setImm(R600::PRED_SETNE_INT);
900 case R600::PRED_SETNE_INT:
901 MO.
setImm(R600::PRED_SETE_INT);
903 case R600::PRED_SETE:
904 MO.
setImm(R600::PRED_SETNE);
906 case R600::PRED_SETNE:
907 MO.
setImm(R600::PRED_SETE);
915 case R600::PRED_SEL_ZERO:
916 MO2.
setReg(R600::PRED_SEL_ONE);
918 case R600::PRED_SEL_ONE:
919 MO2.
setReg(R600::PRED_SEL_ZERO);
928 std::vector<MachineOperand> &Pred,
929 bool SkipDead)
const {
935 int PIdx =
MI.findFirstPredOperandIdx();
937 if (
MI.getOpcode() == R600::CF_ALU) {
938 MI.getOperand(8).setImm(0);
942 if (
MI.getOpcode() == R600::DOT_4) {
944 .setReg(Pred[2].
getReg());
946 .setReg(Pred[2].
getReg());
948 .setReg(Pred[2].
getReg());
950 .setReg(Pred[2].
getReg());
973 unsigned *PredCost)
const {
980 unsigned Channel)
const {
986 switch (
MI.getOpcode()) {
990 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::addr);
993 int RegOpIdx = OffsetOpIdx + 1;
995 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::chan);
998 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::dst);
999 unsigned RegIndex =
MI.getOperand(RegOpIdx).getImm();
1000 unsigned Channel =
MI.getOperand(ChanOpIdx).getImm();
1002 Register OffsetReg =
MI.getOperand(OffsetOpIdx).getReg();
1003 if (OffsetReg == R600::INDIRECT_BASE_ADDR) {
1007 buildIndirectRead(
MBB,
MI,
MI.getOperand(DstOpIdx).getReg(),
Address,
1012 R600::getNamedOperandIdx(
MI.getOpcode(), R600::OpName::val);
1013 unsigned RegIndex =
MI.getOperand(RegOpIdx).getImm();
1014 unsigned Channel =
MI.getOperand(ChanOpIdx).getImm();
1016 Register OffsetReg =
MI.getOperand(OffsetOpIdx).getReg();
1017 if (OffsetReg == R600::INDIRECT_BASE_ADDR) {
1019 MI.getOperand(ValOpIdx).getReg());
1021 buildIndirectWrite(
MBB,
MI,
MI.getOperand(ValOpIdx).getReg(),
1032 case R600::R600_EXTRACT_ELT_V2:
1033 case R600::R600_EXTRACT_ELT_V4:
1034 buildIndirectRead(
MI.getParent(),
MI,
MI.getOperand(0).getReg(),
1036 MI.getOperand(2).getReg(),
1039 case R600::R600_INSERT_ELT_V2:
1040 case R600::R600_INSERT_ELT_V4:
1041 buildIndirectWrite(
MI.getParent(),
MI,
MI.getOperand(2).getReg(),
1043 MI.getOperand(3).getReg(),
1047 MI.eraseFromParent();
1057 unsigned StackWidth = TFL->getStackWidth(MF);
1064 for (
unsigned Chan = 0; Chan < StackWidth; ++Chan) {
1066 R600::R600_TReg32RegClass.getRegister((4 * Index) + Chan);
1073 return &R600::R600_TReg32_XRegClass;
1078 unsigned ValueReg,
unsigned Address,
1079 unsigned OffsetReg)
const {
1080 return buildIndirectWrite(
MBB,
I, ValueReg,
Address, OffsetReg, 0);
1085 unsigned ValueReg,
unsigned Address,
1087 unsigned AddrChan)
const {
1091 case 0: AddrReg = R600::R600_AddrRegClass.getRegister(
Address);
break;
1092 case 1: AddrReg = R600::R600_Addr_YRegClass.getRegister(
Address);
break;
1093 case 2: AddrReg = R600::R600_Addr_ZRegClass.getRegister(
Address);
break;
1094 case 3: AddrReg = R600::R600_Addr_WRegClass.getRegister(
Address);
break;
1097 R600::AR_X, OffsetReg);
1110 unsigned ValueReg,
unsigned Address,
1111 unsigned OffsetReg)
const {
1112 return buildIndirectRead(
MBB,
I, ValueReg,
Address, OffsetReg, 0);
1117 unsigned ValueReg,
unsigned Address,
1119 unsigned AddrChan)
const {
1123 case 0: AddrReg = R600::R600_AddrRegClass.getRegister(
Address);
break;
1124 case 1: AddrReg = R600::R600_Addr_YRegClass.getRegister(
Address);
break;
1125 case 2: AddrReg = R600::R600_Addr_ZRegClass.getRegister(
Address);
break;
1126 case 3: AddrReg = R600::R600_Addr_WRegClass.getRegister(
Address);
break;
1151 if (
MRI.livein_empty()) {
1156 for (std::pair<MCRegister, Register> LI :
MRI.liveins()) {
1158 if (Reg.isVirtual() || !IndirectRC->
contains(Reg))
1163 for (RegIndex = 0, RegEnd = IndirectRC->
getNumRegs(); RegIndex != RegEnd;
1165 if (IndirectRC->
getRegister(RegIndex) == (
unsigned)Reg)
1191 Offset = TFL->getFrameIndexReference(MF, -1, IgnoredFrameReg).getFixed();
1205 unsigned Src1Reg)
const {
1234 .
addReg(R600::PRED_SEL_OFF)
1241#define OPERAND_CASE(Label) \
1243 static const R600::OpName Ops[] = {Label##_X, Label##_Y, Label##_Z, \
1277 assert (
MI->getOpcode() == R600::DOT_4 &&
"Not Implemented");
1280 Opcode = R600::DOT4_r600;
1282 Opcode = R600::DOT4_eg;
1290 static const R600::OpName
Operands[14] = {
1291 R600::OpName::update_exec_mask,
1292 R600::OpName::update_pred,
1293 R600::OpName::write,
1295 R600::OpName::dst_rel,
1296 R600::OpName::clamp,
1297 R600::OpName::src0_neg,
1298 R600::OpName::src0_rel,
1299 R600::OpName::src0_abs,
1300 R600::OpName::src0_sel,
1301 R600::OpName::src1_neg,
1302 R600::OpName::src1_rel,
1303 R600::OpName::src1_abs,
1304 R600::OpName::src1_sel,
1312 for (R600::OpName Operand :
Operands) {
1327 R600::ALU_LITERAL_X);
1334 unsigned DstReg,
unsigned SrcReg)
const {
1339 R600::OpName
Op)
const {
1344 return R600::getNamedOperandIdx(Opcode,
Op);
1348 int64_t Imm)
const {
1350 assert(
Idx != -1 &&
"Operand not supported for this instruction.");
1352 MI.getOperand(
Idx).setImm(Imm);
1360 unsigned Flag)
const {
1361 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1395 assert(!IsOP3 &&
"Cannot set absolute value modifier for OP3 "
1412 assert(FlagIndex != -1 &&
"Flag not supported for this instruction");
1416 "Instruction flags not supported for this instruction");
1425 unsigned Flag)
const {
1426 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1446 unsigned Flag)
const {
1447 unsigned TargetFlags =
get(
MI.getOpcode()).TSFlags;
1453 unsigned InstFlags = FlagOp.
getImm();
1455 FlagOp.
setImm(InstFlags);
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
mir Rename Register Operands
Register const TargetRegisterInfo * TRI
static unsigned 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)
This file defines the SmallSet class.
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class represents an Operation in the Expression.
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...
A possibly irreducible generalization of a Loop.
Itinerary data supplied by a subtarget to be used by a target.
Wrapper class representing physical registers. Should be passed by value.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
reverse_iterator rbegin()
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 & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
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 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
bool hasVertexCache() const
bool hasCaymanISA() const
Generation getGeneration() 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.
unsigned getNumRegs() const
Return the number of registers in this class.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
MCRegister getRegister(unsigned i) const
Return the specified register in the class.
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)
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Define
Register definition.
@ Kill
The last use of a register.
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.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
DWARFExpression::Operation Op
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned getHWRegIndex(unsigned Reg) const
unsigned getHWRegChan(unsigned reg) const
get the HW encoding for a register's channel.
static unsigned getSubRegFromChannel(unsigned Channel)
bool isPhysRegLiveAcrossClauses(Register Reg) const