|
LLVM 24.0.0git
|
#include "Target/AMDGPU/R600InstrInfo.h"
Public Types | |
| enum | BankSwizzle { ALU_VEC_012_SCL_210 = 0 , ALU_VEC_021_SCL_122 , ALU_VEC_120_SCL_212 , ALU_VEC_102_SCL_221 , ALU_VEC_201 , ALU_VEC_210 } |
Definition at line 39 of file R600InstrInfo.h.
| Enumerator | |
|---|---|
| ALU_VEC_012_SCL_210 | |
| ALU_VEC_021_SCL_122 | |
| ALU_VEC_120_SCL_212 | |
| ALU_VEC_102_SCL_221 | |
| ALU_VEC_201 | |
| ALU_VEC_210 | |
Definition at line 60 of file R600InstrInfo.h.
|
explicit |
Definition at line 30 of file R600InstrInfo.cpp.
| void R600InstrInfo::addFlag | ( | MachineInstr & | MI, |
| unsigned | SrcIdx, | ||
| unsigned | Flag ) const |
Add one of the MO_FLAG* flags to the operand at SrcIdx.
Definition at line 1423 of file R600InstrInfo.cpp.
References clearFlag(), llvm::get(), getFlagOp(), llvm::MachineOperand::getImm(), HAS_NATIVE_OPERANDS, MI, MO_FLAG_LAST, MO_FLAG_MASK, MO_FLAG_NOT_LAST, NUM_MO_FLAGS, and llvm::MachineOperand::setImm().
Referenced by insertBranch().
|
override |
Definition at line 636 of file R600InstrInfo.cpp.
References Cond, llvm::MachineOperand::CreateReg(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), I, isBranch(), isJump(), isPredicateSetter(), MBB, and TBB.
| MachineInstrBuilder R600InstrInfo::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 initialized to their default values.
You can use this function to avoid manually specifying each instruction modifier operand when building a new instruction.
Definition at line 1199 of file R600InstrInfo.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::get(), I, and MBB.
Referenced by buildMovImm(), buildMovInstr(), buildSlotOfVectorInstruction(), and copyPhysReg().
| MachineInstrBuilder R600InstrInfo::buildIndirectRead | ( | MachineBasicBlock * | MBB, |
| MachineBasicBlock::iterator | I, | ||
| unsigned | ValueReg, | ||
| unsigned | Address, | ||
| unsigned | OffsetReg ) const |
Build instruction(s) for an indirect register read.
Definition at line 1107 of file R600InstrInfo.cpp.
References llvm::Address, I, and MBB.
| MachineInstrBuilder R600InstrInfo::buildIndirectWrite | ( | MachineBasicBlock * | MBB, |
| MachineBasicBlock::iterator | I, | ||
| unsigned | ValueReg, | ||
| unsigned | Address, | ||
| unsigned | OffsetReg ) const |
Build instruction(s) for an indirect register write.
Definition at line 1075 of file R600InstrInfo.cpp.
References llvm::Address, I, and MBB.
| MachineInstr * R600InstrInfo::buildMovImm | ( | MachineBasicBlock & | BB, |
| MachineBasicBlock::iterator | I, | ||
| unsigned | DstReg, | ||
| uint64_t | Imm ) const |
Definition at line 1321 of file R600InstrInfo.cpp.
References buildDefaultInstruction(), I, Imm, and setImmOperand().
| MachineInstr * R600InstrInfo::buildMovInstr | ( | MachineBasicBlock * | MBB, |
| MachineBasicBlock::iterator | I, | ||
| unsigned | DstReg, | ||
| unsigned | SrcReg ) const |
Definition at line 1331 of file R600InstrInfo.cpp.
References buildDefaultInstruction(), I, and MBB.
Referenced by expandPostRAPseudo().
| MachineInstr * R600InstrInfo::buildSlotOfVectorInstruction | ( | MachineBasicBlock & | MBB, |
| MachineInstr * | MI, | ||
| unsigned | Slot, | ||
| unsigned | DstReg ) const |
Definition at line 1273 of file R600InstrInfo.cpp.
References assert(), buildDefaultInstruction(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOperand(), getOperandIdx(), llvm::MachineOperand::getReg(), getSlotedOps(), I, llvm::MachineOperand::isImm(), MBB, MI, Operands, llvm::AMDGPUSubtarget::R700, llvm::MachineOperand::setImm(), setImmOperand(), and llvm::MachineOperand::setReg().
Calculate the "Indirect Address" for the given RegIndex and Channel.
We model indirect addressing using a virtual address space that can be accessed with loads and stores. The "Indirect Address" is the memory address in this virtual address space that maps to the given RegIndex and Channel.
Definition at line 978 of file R600InstrInfo.cpp.
References assert().
Referenced by expandPostRAPseudo().
| bool R600InstrInfo::canBeConsideredALU | ( | const MachineInstr & | MI | ) | const |
Opcode represents an ALU instruction or an instruction that will be lowered in ExpandSpecialInstrs Pass. Definition at line 133 of file R600InstrInfo.cpp.
References isALUInstr(), isCubeOp(), isVector(), and MI.
| void R600InstrInfo::clearFlag | ( | MachineInstr & | MI, |
| unsigned | SrcIdx, | ||
| unsigned | Flag ) const |
Clear the specified flag on the instruction.
Definition at line 1444 of file R600InstrInfo.cpp.
References llvm::get(), getFlagOp(), llvm::MachineOperand::getImm(), HAS_NATIVE_OPERANDS, MI, NUM_MO_FLAGS, and llvm::MachineOperand::setImm().
Referenced by addFlag(), and removeBranch().
|
override |
Definition at line 926 of file R600InstrInfo.cpp.
References isPredicateSetter(), and MI.
|
override |
Definition at line 37 of file R600InstrInfo.cpp.
References llvm::MachineInstrBuilder::addReg(), buildDefaultInstruction(), contains(), llvm::Define, DL, llvm::MachineInstr::getOperand(), getOperandIdx(), llvm::R600RegisterInfo::getSubRegFromChannel(), I, llvm::Implicit, MBB, MI, and llvm::MachineOperand::setIsKill().
|
override |
Definition at line 598 of file R600InstrInfo.cpp.
References llvm::TargetSubtargetInfo::getInstrItineraryData(), and II.
| bool R600InstrInfo::definesAddressRegister | ( | MachineInstr & | MI | ) | const |
Definition at line 208 of file R600InstrInfo.cpp.
References MI.
|
override |
Definition at line 984 of file R600InstrInfo.cpp.
References llvm::Address, buildMovInstr(), calculateIndirectAddress(), getIndirectAddrRegClass(), isRegisterLoad(), isRegisterStore(), MBB, and MI.
| bool R600InstrInfo::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.
Definition at line 463 of file R600InstrInfo.cpp.
References isLegalUpTo(), and NextPossibleSolution().
Referenced by fitsReadPortLimitations().
| bool R600InstrInfo::fitsConstReadLimitations | ( | const std::vector< MachineInstr * > & | MIs | ) | const |
An instruction group can only access 2 channel pair (either [XY] or [ZW]) from KCache bank on R700+.
This function check if MI set in input meet this limitations
Definition at line 571 of file R600InstrInfo.cpp.
References contains(), fitsConstReadLimitations(), getSrcs(), llvm::SmallSet< T, N, C >::insert(), isALUInstr(), MI, and llvm::SmallSet< T, N, C >::size().
Referenced by fitsConstReadLimitations().
Same but using const index set instead of MI set.
Definition at line 546 of file R600InstrInfo.cpp.
References assert().
| bool R600InstrInfo::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 (in lexical order) BankSwizzle affectation starting from the one already provided in the Instruction Group MIs that fits Read Port limitations in BS if available.
Otherwise returns false and undefined content in BS. isLastAluTrans should be set if the last Alu of MIs will be executed on Trans ALU. In this case, ValidTSwizzle returns the BankSwizzle value to apply to the last instruction. PV holds GPR to PV registers in the Instruction Group MIs.
Definition at line 500 of file R600InstrInfo.cpp.
References ALU_VEC_012_SCL_210, ALU_VEC_021_SCL_122, ALU_VEC_102_SCL_221, ALU_VEC_120_SCL_212, FindSwizzleForVectorSlot(), getOperandIdx(), isConstCompatible(), and MI.
| MachineOperand & R600InstrInfo::getFlagOp | ( | MachineInstr & | MI, |
| unsigned | SrcIdx = 0, | ||
| unsigned | Flag = 0 ) const |
| SrcIdx | The register source to set the flag on (e.g src0, src1, src2) |
| Flag | The flag being set. |
Definition at line 1358 of file R600InstrInfo.cpp.
References assert(), llvm::get(), GET_FLAG_OPERAND_IDX, getOperandIdx(), HAS_NATIVE_OPERANDS, llvm::MachineOperand::isImm(), MI, MO_FLAG_ABS, MO_FLAG_CLAMP, MO_FLAG_LAST, MO_FLAG_MASK, MO_FLAG_NEG, MO_FLAG_NOT_LAST, and R600_InstFlag::OP3.
Referenced by addFlag(), and clearFlag().
| const TargetRegisterClass * R600InstrInfo::getIndirectAddrRegClass | ( | ) | const |
Definition at line 1071 of file R600InstrInfo.cpp.
Referenced by expandPostRAPseudo(), and getIndirectIndexBegin().
| int R600InstrInfo::getIndirectIndexBegin | ( | const MachineFunction & | MF | ) | const |
Definition at line 1141 of file R600InstrInfo.cpp.
References llvm::MCRegisterClass::contains(), llvm::MachineFunction::getFrameInfo(), getIndirectAddrRegClass(), llvm::MachineFrameInfo::getNumObjects(), llvm::MCRegisterClass::getNumRegs(), llvm::MachineFunction::getRegInfo(), llvm::MCRegisterClass::getRegister(), llvm::MachineRegisterInfo::livein_empty(), llvm::MachineRegisterInfo::liveins(), and llvm::Offset.
Referenced by getIndirectIndexEnd(), and reserveIndirectRegisters().
| int R600InstrInfo::getIndirectIndexEnd | ( | const MachineFunction & | MF | ) | const |
Definition at line 1173 of file R600InstrInfo.cpp.
References llvm::MachineFunction::getFrameInfo(), getIndirectIndexBegin(), llvm::MachineFrameInfo::getNumObjects(), llvm::MachineFunction::getSubtarget(), llvm::MachineFrameInfo::hasVarSizedObjects(), and llvm::Offset.
Referenced by reserveIndirectRegisters().
|
override |
Definition at line 970 of file R600InstrInfo.cpp.
| unsigned R600InstrInfo::getMaxAlusPerClause | ( | ) | const |
Definition at line 1195 of file R600InstrInfo.cpp.
| int R600InstrInfo::getOperandIdx | ( | const MachineInstr & | MI, |
| R600::OpName | Op ) const |
Get the index of Op in the MachineInstr.
Op. Definition at line 1337 of file R600InstrInfo.cpp.
References getOperandIdx(), and MI.
Referenced by buildSlotOfVectorInstruction(), copyPhysReg(), fitsReadPortLimitations(), getFlagOp(), getOperandIdx(), getSelIdx(), getSrcs(), isLDSRetInstr(), PredicateInstruction(), and setImmOperand().
| int R600InstrInfo::getOperandIdx | ( | unsigned | Opcode, |
| R600::OpName | Op ) const |
Get the index of Op for the given Opcode.
Op. Definition at line 1342 of file R600InstrInfo.cpp.
|
override |
Definition at line 966 of file R600InstrInfo.cpp.
|
inline |
Definition at line 71 of file R600InstrInfo.h.
Definition at line 223 of file R600InstrInfo.cpp.
References getOperandIdx().
| SmallVector< std::pair< MachineOperand *, int64_t >, 3 > R600InstrInfo::getSrcs | ( | MachineInstr & | MI | ) | const |
Definition at line 246 of file R600InstrInfo.cpp.
References assert(), llvm::MachineOperand::getImm(), getOperandIdx(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isGlobal(), llvm::MachineOperand::isImm(), and MI.
Referenced by fitsConstReadLimitations().
Definition at line 113 of file R600InstrInfo.cpp.
References llvm::get(), R600_InstFlag::OP1, R600_InstFlag::OP2, and R600_InstFlag::OP3.
|
override |
Definition at line 719 of file R600InstrInfo.cpp.
References addFlag(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), Cond, DL, findFirstPredicateSetterFrom(), FindLastAluClause(), llvm::get(), llvm::getImm(), llvm::MachineInstr::getOperand(), llvm::Kill, MBB, MO_FLAG_PUSH, llvm::MachineOperand::setImm(), and TBB.
Opcode represents an ALU instruction. Definition at line 107 of file R600InstrInfo.cpp.
References R600_InstFlag::ALU_INST, and llvm::get().
Referenced by canBeConsideredALU(), fitsConstReadLimitations(), and readsLDSSrcReg().
Definition at line 96 of file R600InstrInfo.cpp.
Referenced by canBeConsideredALU().
Definition at line 169 of file R600InstrInfo.cpp.
References llvm::get(), and R600_InstFlag::IS_EXPORT.
| bool llvm::R600InstrInfo::isFlagSet | ( | const MachineInstr & | MI, |
| unsigned | SrcIdx, | ||
| unsigned | Flag ) const |
Determine if the specified Flag is set on operand at SrcIdx.
References MI.
Definition at line 121 of file R600InstrInfo.cpp.
References llvm::get(), R600_InstFlag::LDS_1A, R600_InstFlag::LDS_1A1D, and R600_InstFlag::LDS_1A2D.
Referenced by isLDSRetInstr().
Definition at line 129 of file R600InstrInfo.cpp.
References getOperandIdx(), and isLDSInstr().
|
override |
MBBI can be moved into a new basic. Definition at line 73 of file R600InstrInfo.cpp.
| unsigned R600InstrInfo::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 Group while meeting read port limitations given a Swz swizzle sequence.
Definition at line 394 of file R600InstrInfo.cpp.
References ALU_VEC_012_SCL_210, ALU_VEC_021_SCL_122, GET_REG_INDEX, getTransSwizzle(), Swizzle(), and llvm::Vector.
Referenced by FindSwizzleForVectorSlot().
Definition at line 81 of file R600InstrInfo.cpp.
|
override |
Definition at line 838 of file R600InstrInfo.cpp.
References llvm::TargetInstrInfo::isPredicable(), isVector(), and MI.
|
override |
Definition at line 823 of file R600InstrInfo.cpp.
References MI.
|
override |
Definition at line 879 of file R600InstrInfo.cpp.
References MBB.
|
override |
Definition at line 860 of file R600InstrInfo.cpp.
References MBB.
|
override |
Definition at line 868 of file R600InstrInfo.cpp.
|
override |
Definition at line 887 of file R600InstrInfo.cpp.
Definition at line 92 of file R600InstrInfo.cpp.
|
inline |
Definition at line 322 of file R600InstrInfo.h.
References llvm::get(), MI, and llvm::R600InstrFlags::REGISTER_LOAD.
Referenced by expandPostRAPseudo().
|
inline |
Definition at line 318 of file R600InstrInfo.h.
References llvm::get(), MI, and llvm::R600InstrFlags::REGISTER_STORE.
Referenced by expandPostRAPseudo().
| bool R600InstrInfo::isTransOnly | ( | const MachineInstr & | MI | ) | const |
Definition at line 157 of file R600InstrInfo.cpp.
References isTransOnly(), and MI.
Definition at line 151 of file R600InstrInfo.cpp.
References llvm::get().
Referenced by isTransOnly().
| bool R600InstrInfo::isVector | ( | const MachineInstr & | MI | ) | const |
Vector instructions are instructions that must fill all instruction slots within an instruction group.
Definition at line 33 of file R600InstrInfo.cpp.
References llvm::get(), MI, and R600_InstFlag::VECTOR.
Referenced by canBeConsideredALU(), and isPredicable().
| bool R600InstrInfo::isVectorOnly | ( | const MachineInstr & | MI | ) | const |
Definition at line 165 of file R600InstrInfo.cpp.
References isVectorOnly(), and MI.
Definition at line 161 of file R600InstrInfo.cpp.
References llvm::get().
Referenced by isVectorOnly().
Definition at line 194 of file R600InstrInfo.cpp.
|
override |
Definition at line 932 of file R600InstrInfo.cpp.
References llvm::MachineInstrBuilder::addReg(), getOperandIdx(), getReg(), llvm::Implicit, MI, and llvm::MachineOperand::setReg().
| bool R600InstrInfo::readsLDSSrcReg | ( | const MachineInstr & | MI | ) | const |
Definition at line 212 of file R600InstrInfo.cpp.
References isALUInstr(), and MI.
|
override |
Definition at line 764 of file R600InstrInfo.cpp.
References assert(), clearFlag(), findFirstPredicateSetterFrom(), FindLastAluClause(), llvm::get(), I, MBB, and MO_FLAG_PUSH.
| void R600InstrInfo::reserveIndirectRegisters | ( | BitVector & | Reserved, |
| const MachineFunction & | MF, | ||
| const R600RegisterInfo & | TRI ) const |
Reserve the registers that may be accessed using indirect addressing.
Definition at line 1050 of file R600InstrInfo.cpp.
References getIndirectIndexBegin(), getIndirectIndexEnd(), llvm::AMDGPUFrameLowering::getStackWidth(), llvm::MachineFunction::getSubtarget(), llvm::Reserved, and TRI.
|
override |
Definition at line 893 of file R600InstrInfo.cpp.
References Cond, llvm::MachineOperand::getImm(), llvm::MachineOperand::getReg(), llvm::MachineOperand::setImm(), and llvm::MachineOperand::setReg().
| void R600InstrInfo::setImmOperand | ( | MachineInstr & | MI, |
| R600::OpName | Op, | ||
| int64_t | Imm ) const |
Helper function for setting instruction flag values.
Definition at line 1346 of file R600InstrInfo.cpp.
References assert(), getOperandIdx(), Imm, and MI.
Referenced by buildMovImm(), and buildSlotOfVectorInstruction().
| bool R600InstrInfo::usesAddressRegister | ( | MachineInstr & | MI | ) | const |
Definition at line 204 of file R600InstrInfo.cpp.
References MI.
| bool R600InstrInfo::usesTextureCache | ( | const MachineInstr & | MI | ) | const |
Definition at line 187 of file R600InstrInfo.cpp.
References llvm::Function::getCallingConv(), llvm::MachineFunction::getFunction(), llvm::AMDGPU::isCompute(), MI, usesTextureCache(), and usesVertexCache().
Definition at line 183 of file R600InstrInfo.cpp.
References llvm::get(), IS_TEX, and IS_VTX.
Referenced by usesTextureCache().
| bool R600InstrInfo::usesVertexCache | ( | const MachineInstr & | MI | ) | const |
Definition at line 177 of file R600InstrInfo.cpp.
References llvm::Function::getCallingConv(), llvm::MachineFunction::getFunction(), llvm::AMDGPU::isCompute(), MI, and usesVertexCache().
Definition at line 173 of file R600InstrInfo.cpp.
References llvm::get(), and IS_VTX.
Referenced by usesTextureCache(), and usesVertexCache().