39 case AMDGPU::INTERP_PAIR_XY:
40 case AMDGPU::INTERP_PAIR_ZW:
41 case AMDGPU::INTERP_VEC_LOAD:
55 if(
TII->isVector(*MI) ||
60 unsigned NumLiteral = 0;
64 if (MO.
isReg() && MO.
getReg() == AMDGPU::ALU_LITERAL_X)
67 return 1 + NumLiteral;
77 case AMDGPU::INTERP_PAIR_XY:
78 case AMDGPU::INTERP_PAIR_ZW:
79 case AMDGPU::INTERP_VEC_LOAD:
99 std::pair<unsigned, unsigned> getAccessedBankLine(
unsigned Sel)
const {
103 return std::pair<unsigned, unsigned>(
104 ((Sel >> 2) - 512) >> 12,
110 ((((Sel >> 2) - 512) & 4095) >> 5) << 1);
114 std::vector<std::pair<unsigned, unsigned> > &CachedConsts,
115 bool UpdateInstr =
true)
const {
116 std::vector<std::pair<unsigned, unsigned> > UsedKCache;
124 MI->
getOpcode() == AMDGPU::DOT_4) &&
"Can't assign Const");
125 for (
unsigned i = 0, n = Consts.
size(); i < n; ++i) {
126 if (Consts[i].first->getReg() != AMDGPU::ALU_CONST)
128 unsigned Sel = Consts[i].second;
129 unsigned Chan = Sel & 3, Index = ((Sel >> 2) - 512) & 31;
130 unsigned KCacheIndex = Index * 4 + Chan;
131 const std::pair<unsigned, unsigned> &BankLine = getAccessedBankLine(Sel);
132 if (CachedConsts.empty()) {
133 CachedConsts.push_back(BankLine);
134 UsedKCache.push_back(std::pair<unsigned, unsigned>(0, KCacheIndex));
137 if (CachedConsts[0] == BankLine) {
138 UsedKCache.push_back(std::pair<unsigned, unsigned>(0, KCacheIndex));
141 if (CachedConsts.size() == 1) {
142 CachedConsts.push_back(BankLine);
143 UsedKCache.push_back(std::pair<unsigned, unsigned>(1, KCacheIndex));
146 if (CachedConsts[1] == BankLine) {
147 UsedKCache.push_back(std::pair<unsigned, unsigned>(1, KCacheIndex));
156 for (
unsigned i = 0, j = 0, n = Consts.
size(); i < n; ++i) {
157 if (Consts[i].first->getReg() != AMDGPU::ALU_CONST)
159 switch(UsedKCache[j].first) {
161 Consts[i].first->setReg(
162 AMDGPU::R600_KC0RegClass.getRegister(UsedKCache[j].second));
165 Consts[i].first->setReg(
166 AMDGPU::R600_KC1RegClass.getRegister(UsedKCache[j].second));
176 bool canClauseLocalKillFitInClause(
177 unsigned AluInstCount,
178 std::vector<std::pair<unsigned, unsigned> > KCacheBanks,
183 MOI = Def->operands_begin(),
184 MOE = Def->operands_end(); MOI != MOE; ++MOI) {
185 if (!MOI->isReg() || !MOI->isDef() ||
191 unsigned LastUseCount = 0;
193 AluInstCount += OccupiedDwords(UseI);
195 if (!SubstituteKCacheBank(UseI, KCacheBanks,
false))
201 if (AluInstCount >=
TII->getMaxAlusPerClause())
209 if (UseI->findRegisterUseOperandIdx(MOI->getReg()))
210 LastUseCount = AluInstCount;
212 if (UseI != Def && UseI->findRegisterDefOperandIdx(MOI->getReg()) != -1)
216 return LastUseCount <=
TII->getMaxAlusPerClause();
225 std::vector<std::pair<unsigned, unsigned> > KCacheBanks;
226 bool PushBeforeModifier =
false;
227 unsigned AluInstCount = 0;
229 if (IsTrivialInst(I))
233 if (AluInstCount >
TII->getMaxAlusPerClause())
235 if (I->getOpcode() == AMDGPU::PRED_X) {
242 if (AluInstCount > 0)
245 PushBeforeModifier =
true;
256 if (
TII->mustBeLastInClause(I->getOpcode())) {
263 if (!canClauseLocalKillFitInClause(AluInstCount, KCacheBanks, I, E))
266 if (!SubstituteKCacheBank(I, KCacheBanks))
268 AluInstCount += OccupiedDwords(I);
270 unsigned Opcode = PushBeforeModifier ?
271 AMDGPU::CF_ALU_PUSH_BEFORE : AMDGPU::CF_ALU;
278 .
addImm(KCacheBanks.empty()?0:KCacheBanks[0].first)
279 .addImm((KCacheBanks.size() < 2)?0:KCacheBanks[1].first)
280 .
addImm(KCacheBanks.empty()?0:2)
281 .addImm((KCacheBanks.size() < 2)?0:2)
282 .
addImm(KCacheBanks.empty()?0:KCacheBanks[0].second)
283 .addImm((KCacheBanks.size() < 2)?0:KCacheBanks[1].second)
291 TII(0), Address(0) { }
300 if (I->getOpcode() == AMDGPU::CF_ALU)
304 I = MakeALUClause(MBB, I);
312 const char *getPassName()
const {
313 return "R600 Emit Clause Markers Pass";
323 return new R600EmitClauseMarkersPass(TM);
mop_iterator operands_end()
Interface definition for R600InstrInfo.
Interface definition for R600RegisterInfo.
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
ID
LLVM Calling Convention Representation.
const MachineInstrBuilder & addImm(int64_t Val) const
bundle_iterator< MachineInstr, instr_iterator > iterator
FunctionPass * createR600EmitClauseMarkers(TargetMachine &tm)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
DebugLoc findDebugLoc(instr_iterator MBBI)
virtual const TargetInstrInfo * getInstrInfo() const
virtual bool isPhysRegLiveAcrossClauses(unsigned Reg) const
IMPLICIT_DEF - This is the MachineInstr-level equivalent of undef.
const TargetMachine & getTarget() const
unsigned getReg() const
getReg - Returns the register number.
virtual const HexagonRegisterInfo & getRegisterInfo() const
mop_iterator operands_begin()
BasicBlockListType::iterator iterator