DataLayout is mandatory, update the API to reflect it with references.
[oota-llvm.git] / lib / Target / R600 / R600InstrInfo.cpp
1 //===-- R600InstrInfo.cpp - R600 Instruction Information ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// \brief R600 Implementation of TargetInstrInfo.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "R600InstrInfo.h"
16 #include "AMDGPU.h"
17 #include "AMDGPUSubtarget.h"
18 #include "AMDGPUTargetMachine.h"
19 #include "R600Defines.h"
20 #include "R600MachineFunctionInfo.h"
21 #include "R600RegisterInfo.h"
22 #include "llvm/CodeGen/MachineFrameInfo.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/MachineRegisterInfo.h"
25
26 using namespace llvm;
27
28 #define GET_INSTRINFO_CTOR_DTOR
29 #include "AMDGPUGenDFAPacketizer.inc"
30
31 R600InstrInfo::R600InstrInfo(const AMDGPUSubtarget &st)
32   : AMDGPUInstrInfo(st),
33     RI(st)
34   { }
35
36 const R600RegisterInfo &R600InstrInfo::getRegisterInfo() const {
37   return RI;
38 }
39
40 bool R600InstrInfo::isTrig(const MachineInstr &MI) const {
41   return get(MI.getOpcode()).TSFlags & R600_InstFlag::TRIG;
42 }
43
44 bool R600InstrInfo::isVector(const MachineInstr &MI) const {
45   return get(MI.getOpcode()).TSFlags & R600_InstFlag::VECTOR;
46 }
47
48 void
49 R600InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
50                            MachineBasicBlock::iterator MI, DebugLoc DL,
51                            unsigned DestReg, unsigned SrcReg,
52                            bool KillSrc) const {
53   unsigned VectorComponents = 0;
54   if ((AMDGPU::R600_Reg128RegClass.contains(DestReg) ||
55       AMDGPU::R600_Reg128VerticalRegClass.contains(DestReg)) &&
56       (AMDGPU::R600_Reg128RegClass.contains(SrcReg) ||
57        AMDGPU::R600_Reg128VerticalRegClass.contains(SrcReg))) {
58     VectorComponents = 4;
59   } else if((AMDGPU::R600_Reg64RegClass.contains(DestReg) ||
60             AMDGPU::R600_Reg64VerticalRegClass.contains(DestReg)) &&
61             (AMDGPU::R600_Reg64RegClass.contains(SrcReg) ||
62              AMDGPU::R600_Reg64VerticalRegClass.contains(SrcReg))) {
63     VectorComponents = 2;
64   }
65
66   if (VectorComponents > 0) {
67     for (unsigned I = 0; I < VectorComponents; I++) {
68       unsigned SubRegIndex = RI.getSubRegFromChannel(I);
69       buildDefaultInstruction(MBB, MI, AMDGPU::MOV,
70                               RI.getSubReg(DestReg, SubRegIndex),
71                               RI.getSubReg(SrcReg, SubRegIndex))
72                               .addReg(DestReg,
73                                       RegState::Define | RegState::Implicit);
74     }
75   } else {
76     MachineInstr *NewMI = buildDefaultInstruction(MBB, MI, AMDGPU::MOV,
77                                                   DestReg, SrcReg);
78     NewMI->getOperand(getOperandIdx(*NewMI, AMDGPU::OpName::src0))
79                                     .setIsKill(KillSrc);
80   }
81 }
82
83 /// \returns true if \p MBBI can be moved into a new basic.
84 bool R600InstrInfo::isLegalToSplitMBBAt(MachineBasicBlock &MBB,
85                                        MachineBasicBlock::iterator MBBI) const {
86   for (MachineInstr::const_mop_iterator I = MBBI->operands_begin(),
87                                         E = MBBI->operands_end(); I != E; ++I) {
88     if (I->isReg() && !TargetRegisterInfo::isVirtualRegister(I->getReg()) &&
89         I->isUse() && RI.isPhysRegLiveAcrossClauses(I->getReg()))
90       return false;
91   }
92   return true;
93 }
94
95 bool R600InstrInfo::isMov(unsigned Opcode) const {
96
97
98   switch(Opcode) {
99   default: return false;
100   case AMDGPU::MOV:
101   case AMDGPU::MOV_IMM_F32:
102   case AMDGPU::MOV_IMM_I32:
103     return true;
104   }
105 }
106
107 // Some instructions act as place holders to emulate operations that the GPU
108 // hardware does automatically. This function can be used to check if
109 // an opcode falls into this category.
110 bool R600InstrInfo::isPlaceHolderOpcode(unsigned Opcode) const {
111   switch (Opcode) {
112   default: return false;
113   case AMDGPU::RETURN:
114     return true;
115   }
116 }
117
118 bool R600InstrInfo::isReductionOp(unsigned Opcode) const {
119   return false;
120 }
121
122 bool R600InstrInfo::isCubeOp(unsigned Opcode) const {
123   switch(Opcode) {
124     default: return false;
125     case AMDGPU::CUBE_r600_pseudo:
126     case AMDGPU::CUBE_r600_real:
127     case AMDGPU::CUBE_eg_pseudo:
128     case AMDGPU::CUBE_eg_real:
129       return true;
130   }
131 }
132
133 bool R600InstrInfo::isALUInstr(unsigned Opcode) const {
134   unsigned TargetFlags = get(Opcode).TSFlags;
135
136   return (TargetFlags & R600_InstFlag::ALU_INST);
137 }
138
139 bool R600InstrInfo::hasInstrModifiers(unsigned Opcode) const {
140   unsigned TargetFlags = get(Opcode).TSFlags;
141
142   return ((TargetFlags & R600_InstFlag::OP1) |
143           (TargetFlags & R600_InstFlag::OP2) |
144           (TargetFlags & R600_InstFlag::OP3));
145 }
146
147 bool R600InstrInfo::isLDSInstr(unsigned Opcode) const {
148   unsigned TargetFlags = get(Opcode).TSFlags;
149
150   return ((TargetFlags & R600_InstFlag::LDS_1A) |
151           (TargetFlags & R600_InstFlag::LDS_1A1D) |
152           (TargetFlags & R600_InstFlag::LDS_1A2D));
153 }
154
155 bool R600InstrInfo::isLDSNoRetInstr(unsigned Opcode) const {
156   return isLDSInstr(Opcode) && getOperandIdx(Opcode, AMDGPU::OpName::dst) == -1;
157 }
158
159 bool R600InstrInfo::isLDSRetInstr(unsigned Opcode) const {
160   return isLDSInstr(Opcode) && getOperandIdx(Opcode, AMDGPU::OpName::dst) != -1;
161 }
162
163 bool R600InstrInfo::canBeConsideredALU(const MachineInstr *MI) const {
164   if (isALUInstr(MI->getOpcode()))
165     return true;
166   if (isVector(*MI) || isCubeOp(MI->getOpcode()))
167     return true;
168   switch (MI->getOpcode()) {
169   case AMDGPU::PRED_X:
170   case AMDGPU::INTERP_PAIR_XY:
171   case AMDGPU::INTERP_PAIR_ZW:
172   case AMDGPU::INTERP_VEC_LOAD:
173   case AMDGPU::COPY:
174   case AMDGPU::DOT_4:
175     return true;
176   default:
177     return false;
178   }
179 }
180
181 bool R600InstrInfo::isTransOnly(unsigned Opcode) const {
182   if (ST.hasCaymanISA())
183     return false;
184   return (get(Opcode).getSchedClass() == AMDGPU::Sched::TransALU);
185 }
186
187 bool R600InstrInfo::isTransOnly(const MachineInstr *MI) const {
188   return isTransOnly(MI->getOpcode());
189 }
190
191 bool R600InstrInfo::isVectorOnly(unsigned Opcode) const {
192   return (get(Opcode).getSchedClass() == AMDGPU::Sched::VecALU);
193 }
194
195 bool R600InstrInfo::isVectorOnly(const MachineInstr *MI) const {
196   return isVectorOnly(MI->getOpcode());
197 }
198
199 bool R600InstrInfo::isExport(unsigned Opcode) const {
200   return (get(Opcode).TSFlags & R600_InstFlag::IS_EXPORT);
201 }
202
203 bool R600InstrInfo::usesVertexCache(unsigned Opcode) const {
204   return ST.hasVertexCache() && IS_VTX(get(Opcode));
205 }
206
207 bool R600InstrInfo::usesVertexCache(const MachineInstr *MI) const {
208   const MachineFunction *MF = MI->getParent()->getParent();
209   const R600MachineFunctionInfo *MFI = MF->getInfo<R600MachineFunctionInfo>();
210   return MFI->getShaderType() != ShaderType::COMPUTE &&
211     usesVertexCache(MI->getOpcode());
212 }
213
214 bool R600InstrInfo::usesTextureCache(unsigned Opcode) const {
215   return (!ST.hasVertexCache() && IS_VTX(get(Opcode))) || IS_TEX(get(Opcode));
216 }
217
218 bool R600InstrInfo::usesTextureCache(const MachineInstr *MI) const {
219   const MachineFunction *MF = MI->getParent()->getParent();
220   const R600MachineFunctionInfo *MFI = MF->getInfo<R600MachineFunctionInfo>();
221   return (MFI->getShaderType() == ShaderType::COMPUTE &&
222           usesVertexCache(MI->getOpcode())) ||
223     usesTextureCache(MI->getOpcode());
224 }
225
226 bool R600InstrInfo::mustBeLastInClause(unsigned Opcode) const {
227   switch (Opcode) {
228   case AMDGPU::KILLGT:
229   case AMDGPU::GROUP_BARRIER:
230     return true;
231   default:
232     return false;
233   }
234 }
235
236 bool R600InstrInfo::usesAddressRegister(MachineInstr *MI) const {
237   return  MI->findRegisterUseOperandIdx(AMDGPU::AR_X) != -1;
238 }
239
240 bool R600InstrInfo::definesAddressRegister(MachineInstr *MI) const {
241   return MI->findRegisterDefOperandIdx(AMDGPU::AR_X) != -1;
242 }
243
244 bool R600InstrInfo::readsLDSSrcReg(const MachineInstr *MI) const {
245   if (!isALUInstr(MI->getOpcode())) {
246     return false;
247   }
248   for (MachineInstr::const_mop_iterator I = MI->operands_begin(),
249                                         E = MI->operands_end(); I != E; ++I) {
250     if (!I->isReg() || !I->isUse() ||
251         TargetRegisterInfo::isVirtualRegister(I->getReg()))
252       continue;
253
254     if (AMDGPU::R600_LDS_SRC_REGRegClass.contains(I->getReg()))
255       return true;
256   }
257   return false;
258 }
259
260 int R600InstrInfo::getSrcIdx(unsigned Opcode, unsigned SrcNum) const {
261   static const unsigned OpTable[] = {
262     AMDGPU::OpName::src0,
263     AMDGPU::OpName::src1,
264     AMDGPU::OpName::src2
265   };
266
267   assert (SrcNum < 3);
268   return getOperandIdx(Opcode, OpTable[SrcNum]);
269 }
270
271 int R600InstrInfo::getSelIdx(unsigned Opcode, unsigned SrcIdx) const {
272   static const unsigned SrcSelTable[][2] = {
273     {AMDGPU::OpName::src0, AMDGPU::OpName::src0_sel},
274     {AMDGPU::OpName::src1, AMDGPU::OpName::src1_sel},
275     {AMDGPU::OpName::src2, AMDGPU::OpName::src2_sel},
276     {AMDGPU::OpName::src0_X, AMDGPU::OpName::src0_sel_X},
277     {AMDGPU::OpName::src0_Y, AMDGPU::OpName::src0_sel_Y},
278     {AMDGPU::OpName::src0_Z, AMDGPU::OpName::src0_sel_Z},
279     {AMDGPU::OpName::src0_W, AMDGPU::OpName::src0_sel_W},
280     {AMDGPU::OpName::src1_X, AMDGPU::OpName::src1_sel_X},
281     {AMDGPU::OpName::src1_Y, AMDGPU::OpName::src1_sel_Y},
282     {AMDGPU::OpName::src1_Z, AMDGPU::OpName::src1_sel_Z},
283     {AMDGPU::OpName::src1_W, AMDGPU::OpName::src1_sel_W}
284   };
285
286   for (const auto &Row : SrcSelTable) {
287     if (getOperandIdx(Opcode, Row[0]) == (int)SrcIdx) {
288       return getOperandIdx(Opcode, Row[1]);
289     }
290   }
291   return -1;
292 }
293
294 SmallVector<std::pair<MachineOperand *, int64_t>, 3>
295 R600InstrInfo::getSrcs(MachineInstr *MI) const {
296   SmallVector<std::pair<MachineOperand *, int64_t>, 3> Result;
297
298   if (MI->getOpcode() == AMDGPU::DOT_4) {
299     static const unsigned OpTable[8][2] = {
300       {AMDGPU::OpName::src0_X, AMDGPU::OpName::src0_sel_X},
301       {AMDGPU::OpName::src0_Y, AMDGPU::OpName::src0_sel_Y},
302       {AMDGPU::OpName::src0_Z, AMDGPU::OpName::src0_sel_Z},
303       {AMDGPU::OpName::src0_W, AMDGPU::OpName::src0_sel_W},
304       {AMDGPU::OpName::src1_X, AMDGPU::OpName::src1_sel_X},
305       {AMDGPU::OpName::src1_Y, AMDGPU::OpName::src1_sel_Y},
306       {AMDGPU::OpName::src1_Z, AMDGPU::OpName::src1_sel_Z},
307       {AMDGPU::OpName::src1_W, AMDGPU::OpName::src1_sel_W},
308     };
309
310     for (unsigned j = 0; j < 8; j++) {
311       MachineOperand &MO = MI->getOperand(getOperandIdx(MI->getOpcode(),
312                                                         OpTable[j][0]));
313       unsigned Reg = MO.getReg();
314       if (Reg == AMDGPU::ALU_CONST) {
315         unsigned Sel = MI->getOperand(getOperandIdx(MI->getOpcode(),
316                                                     OpTable[j][1])).getImm();
317         Result.push_back(std::pair<MachineOperand *, int64_t>(&MO, Sel));
318         continue;
319       }
320
321     }
322     return Result;
323   }
324
325   static const unsigned OpTable[3][2] = {
326     {AMDGPU::OpName::src0, AMDGPU::OpName::src0_sel},
327     {AMDGPU::OpName::src1, AMDGPU::OpName::src1_sel},
328     {AMDGPU::OpName::src2, AMDGPU::OpName::src2_sel},
329   };
330
331   for (unsigned j = 0; j < 3; j++) {
332     int SrcIdx = getOperandIdx(MI->getOpcode(), OpTable[j][0]);
333     if (SrcIdx < 0)
334       break;
335     MachineOperand &MO = MI->getOperand(SrcIdx);
336     unsigned Reg = MI->getOperand(SrcIdx).getReg();
337     if (Reg == AMDGPU::ALU_CONST) {
338       unsigned Sel = MI->getOperand(
339           getOperandIdx(MI->getOpcode(), OpTable[j][1])).getImm();
340       Result.push_back(std::pair<MachineOperand *, int64_t>(&MO, Sel));
341       continue;
342     }
343     if (Reg == AMDGPU::ALU_LITERAL_X) {
344       unsigned Imm = MI->getOperand(
345           getOperandIdx(MI->getOpcode(), AMDGPU::OpName::literal)).getImm();
346       Result.push_back(std::pair<MachineOperand *, int64_t>(&MO, Imm));
347       continue;
348     }
349     Result.push_back(std::pair<MachineOperand *, int64_t>(&MO, 0));
350   }
351   return Result;
352 }
353
354 std::vector<std::pair<int, unsigned> >
355 R600InstrInfo::ExtractSrcs(MachineInstr *MI,
356                            const DenseMap<unsigned, unsigned> &PV,
357                            unsigned &ConstCount) const {
358   ConstCount = 0;
359   const SmallVector<std::pair<MachineOperand *, int64_t>, 3> Srcs = getSrcs(MI);
360   const std::pair<int, unsigned> DummyPair(-1, 0);
361   std::vector<std::pair<int, unsigned> > Result;
362   unsigned i = 0;
363   for (unsigned n = Srcs.size(); i < n; ++i) {
364     unsigned Reg = Srcs[i].first->getReg();
365     unsigned Index = RI.getEncodingValue(Reg) & 0xff;
366     if (Reg == AMDGPU::OQAP) {
367       Result.push_back(std::pair<int, unsigned>(Index, 0));
368     }
369     if (PV.find(Reg) != PV.end()) {
370       // 255 is used to tells its a PS/PV reg
371       Result.push_back(std::pair<int, unsigned>(255, 0));
372       continue;
373     }
374     if (Index > 127) {
375       ConstCount++;
376       Result.push_back(DummyPair);
377       continue;
378     }
379     unsigned Chan = RI.getHWRegChan(Reg);
380     Result.push_back(std::pair<int, unsigned>(Index, Chan));
381   }
382   for (; i < 3; ++i)
383     Result.push_back(DummyPair);
384   return Result;
385 }
386
387 static std::vector<std::pair<int, unsigned> >
388 Swizzle(std::vector<std::pair<int, unsigned> > Src,
389         R600InstrInfo::BankSwizzle Swz) {
390   if (Src[0] == Src[1])
391     Src[1].first = -1;
392   switch (Swz) {
393   case R600InstrInfo::ALU_VEC_012_SCL_210:
394     break;
395   case R600InstrInfo::ALU_VEC_021_SCL_122:
396     std::swap(Src[1], Src[2]);
397     break;
398   case R600InstrInfo::ALU_VEC_102_SCL_221:
399     std::swap(Src[0], Src[1]);
400     break;
401   case R600InstrInfo::ALU_VEC_120_SCL_212:
402     std::swap(Src[0], Src[1]);
403     std::swap(Src[0], Src[2]);
404     break;
405   case R600InstrInfo::ALU_VEC_201:
406     std::swap(Src[0], Src[2]);
407     std::swap(Src[0], Src[1]);
408     break;
409   case R600InstrInfo::ALU_VEC_210:
410     std::swap(Src[0], Src[2]);
411     break;
412   }
413   return Src;
414 }
415
416 static unsigned
417 getTransSwizzle(R600InstrInfo::BankSwizzle Swz, unsigned Op) {
418   switch (Swz) {
419   case R600InstrInfo::ALU_VEC_012_SCL_210: {
420     unsigned Cycles[3] = { 2, 1, 0};
421     return Cycles[Op];
422   }
423   case R600InstrInfo::ALU_VEC_021_SCL_122: {
424     unsigned Cycles[3] = { 1, 2, 2};
425     return Cycles[Op];
426   }
427   case R600InstrInfo::ALU_VEC_120_SCL_212: {
428     unsigned Cycles[3] = { 2, 1, 2};
429     return Cycles[Op];
430   }
431   case R600InstrInfo::ALU_VEC_102_SCL_221: {
432     unsigned Cycles[3] = { 2, 2, 1};
433     return Cycles[Op];
434   }
435   default:
436     llvm_unreachable("Wrong Swizzle for Trans Slot");
437     return 0;
438   }
439 }
440
441 /// returns how many MIs (whose inputs are represented by IGSrcs) can be packed
442 /// in the same Instruction Group while meeting read port limitations given a
443 /// Swz swizzle sequence.
444 unsigned  R600InstrInfo::isLegalUpTo(
445     const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
446     const std::vector<R600InstrInfo::BankSwizzle> &Swz,
447     const std::vector<std::pair<int, unsigned> > &TransSrcs,
448     R600InstrInfo::BankSwizzle TransSwz) const {
449   int Vector[4][3];
450   memset(Vector, -1, sizeof(Vector));
451   for (unsigned i = 0, e = IGSrcs.size(); i < e; i++) {
452     const std::vector<std::pair<int, unsigned> > &Srcs =
453         Swizzle(IGSrcs[i], Swz[i]);
454     for (unsigned j = 0; j < 3; j++) {
455       const std::pair<int, unsigned> &Src = Srcs[j];
456       if (Src.first < 0 || Src.first == 255)
457         continue;
458       if (Src.first == GET_REG_INDEX(RI.getEncodingValue(AMDGPU::OQAP))) {
459         if (Swz[i] != R600InstrInfo::ALU_VEC_012_SCL_210 &&
460             Swz[i] != R600InstrInfo::ALU_VEC_021_SCL_122) {
461             // The value from output queue A (denoted by register OQAP) can
462             // only be fetched during the first cycle.
463             return false;
464         }
465         // OQAP does not count towards the normal read port restrictions
466         continue;
467       }
468       if (Vector[Src.second][j] < 0)
469         Vector[Src.second][j] = Src.first;
470       if (Vector[Src.second][j] != Src.first)
471         return i;
472     }
473   }
474   // Now check Trans Alu
475   for (unsigned i = 0, e = TransSrcs.size(); i < e; ++i) {
476     const std::pair<int, unsigned> &Src = TransSrcs[i];
477     unsigned Cycle = getTransSwizzle(TransSwz, i);
478     if (Src.first < 0)
479       continue;
480     if (Src.first == 255)
481       continue;
482     if (Vector[Src.second][Cycle] < 0)
483       Vector[Src.second][Cycle] = Src.first;
484     if (Vector[Src.second][Cycle] != Src.first)
485       return IGSrcs.size() - 1;
486   }
487   return IGSrcs.size();
488 }
489
490 /// Given a swizzle sequence SwzCandidate and an index Idx, returns the next
491 /// (in lexicographic term) swizzle sequence assuming that all swizzles after
492 /// Idx can be skipped
493 static bool
494 NextPossibleSolution(
495     std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
496     unsigned Idx) {
497   assert(Idx < SwzCandidate.size());
498   int ResetIdx = Idx;
499   while (ResetIdx > -1 && SwzCandidate[ResetIdx] == R600InstrInfo::ALU_VEC_210)
500     ResetIdx --;
501   for (unsigned i = ResetIdx + 1, e = SwzCandidate.size(); i < e; i++) {
502     SwzCandidate[i] = R600InstrInfo::ALU_VEC_012_SCL_210;
503   }
504   if (ResetIdx == -1)
505     return false;
506   int NextSwizzle = SwzCandidate[ResetIdx] + 1;
507   SwzCandidate[ResetIdx] = (R600InstrInfo::BankSwizzle)NextSwizzle;
508   return true;
509 }
510
511 /// Enumerate all possible Swizzle sequence to find one that can meet all
512 /// read port requirements.
513 bool R600InstrInfo::FindSwizzleForVectorSlot(
514     const std::vector<std::vector<std::pair<int, unsigned> > > &IGSrcs,
515     std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
516     const std::vector<std::pair<int, unsigned> > &TransSrcs,
517     R600InstrInfo::BankSwizzle TransSwz) const {
518   unsigned ValidUpTo = 0;
519   do {
520     ValidUpTo = isLegalUpTo(IGSrcs, SwzCandidate, TransSrcs, TransSwz);
521     if (ValidUpTo == IGSrcs.size())
522       return true;
523   } while (NextPossibleSolution(SwzCandidate, ValidUpTo));
524   return false;
525 }
526
527 /// Instructions in Trans slot can't read gpr at cycle 0 if they also read
528 /// a const, and can't read a gpr at cycle 1 if they read 2 const.
529 static bool
530 isConstCompatible(R600InstrInfo::BankSwizzle TransSwz,
531                   const std::vector<std::pair<int, unsigned> > &TransOps,
532                   unsigned ConstCount) {
533   // TransALU can't read 3 constants
534   if (ConstCount > 2)
535     return false;
536   for (unsigned i = 0, e = TransOps.size(); i < e; ++i) {
537     const std::pair<int, unsigned> &Src = TransOps[i];
538     unsigned Cycle = getTransSwizzle(TransSwz, i);
539     if (Src.first < 0)
540       continue;
541     if (ConstCount > 0 && Cycle == 0)
542       return false;
543     if (ConstCount > 1 && Cycle == 1)
544       return false;
545   }
546   return true;
547 }
548
549 bool
550 R600InstrInfo::fitsReadPortLimitations(const std::vector<MachineInstr *> &IG,
551                                        const DenseMap<unsigned, unsigned> &PV,
552                                        std::vector<BankSwizzle> &ValidSwizzle,
553                                        bool isLastAluTrans)
554     const {
555   //Todo : support shared src0 - src1 operand
556
557   std::vector<std::vector<std::pair<int, unsigned> > > IGSrcs;
558   ValidSwizzle.clear();
559   unsigned ConstCount;
560   BankSwizzle TransBS = ALU_VEC_012_SCL_210;
561   for (unsigned i = 0, e = IG.size(); i < e; ++i) {
562     IGSrcs.push_back(ExtractSrcs(IG[i], PV, ConstCount));
563     unsigned Op = getOperandIdx(IG[i]->getOpcode(),
564         AMDGPU::OpName::bank_swizzle);
565     ValidSwizzle.push_back( (R600InstrInfo::BankSwizzle)
566         IG[i]->getOperand(Op).getImm());
567   }
568   std::vector<std::pair<int, unsigned> > TransOps;
569   if (!isLastAluTrans)
570     return FindSwizzleForVectorSlot(IGSrcs, ValidSwizzle, TransOps, TransBS);
571
572   TransOps = std::move(IGSrcs.back());
573   IGSrcs.pop_back();
574   ValidSwizzle.pop_back();
575
576   static const R600InstrInfo::BankSwizzle TransSwz[] = {
577     ALU_VEC_012_SCL_210,
578     ALU_VEC_021_SCL_122,
579     ALU_VEC_120_SCL_212,
580     ALU_VEC_102_SCL_221
581   };
582   for (unsigned i = 0; i < 4; i++) {
583     TransBS = TransSwz[i];
584     if (!isConstCompatible(TransBS, TransOps, ConstCount))
585       continue;
586     bool Result = FindSwizzleForVectorSlot(IGSrcs, ValidSwizzle, TransOps,
587         TransBS);
588     if (Result) {
589       ValidSwizzle.push_back(TransBS);
590       return true;
591     }
592   }
593
594   return false;
595 }
596
597
598 bool
599 R600InstrInfo::fitsConstReadLimitations(const std::vector<unsigned> &Consts)
600     const {
601   assert (Consts.size() <= 12 && "Too many operands in instructions group");
602   unsigned Pair1 = 0, Pair2 = 0;
603   for (unsigned i = 0, n = Consts.size(); i < n; ++i) {
604     unsigned ReadConstHalf = Consts[i] & 2;
605     unsigned ReadConstIndex = Consts[i] & (~3);
606     unsigned ReadHalfConst = ReadConstIndex | ReadConstHalf;
607     if (!Pair1) {
608       Pair1 = ReadHalfConst;
609       continue;
610     }
611     if (Pair1 == ReadHalfConst)
612       continue;
613     if (!Pair2) {
614       Pair2 = ReadHalfConst;
615       continue;
616     }
617     if (Pair2 != ReadHalfConst)
618       return false;
619   }
620   return true;
621 }
622
623 bool
624 R600InstrInfo::fitsConstReadLimitations(const std::vector<MachineInstr *> &MIs)
625     const {
626   std::vector<unsigned> Consts;
627   SmallSet<int64_t, 4> Literals;
628   for (unsigned i = 0, n = MIs.size(); i < n; i++) {
629     MachineInstr *MI = MIs[i];
630     if (!isALUInstr(MI->getOpcode()))
631       continue;
632
633     const SmallVectorImpl<std::pair<MachineOperand *, int64_t> > &Srcs =
634         getSrcs(MI);
635
636     for (unsigned j = 0, e = Srcs.size(); j < e; j++) {
637       std::pair<MachineOperand *, unsigned> Src = Srcs[j];
638       if (Src.first->getReg() == AMDGPU::ALU_LITERAL_X)
639         Literals.insert(Src.second);
640       if (Literals.size() > 4)
641         return false;
642       if (Src.first->getReg() == AMDGPU::ALU_CONST)
643         Consts.push_back(Src.second);
644       if (AMDGPU::R600_KC0RegClass.contains(Src.first->getReg()) ||
645           AMDGPU::R600_KC1RegClass.contains(Src.first->getReg())) {
646         unsigned Index = RI.getEncodingValue(Src.first->getReg()) & 0xff;
647         unsigned Chan = RI.getHWRegChan(Src.first->getReg());
648         Consts.push_back((Index << 2) | Chan);
649       }
650     }
651   }
652   return fitsConstReadLimitations(Consts);
653 }
654
655 DFAPacketizer *
656 R600InstrInfo::CreateTargetScheduleState(const TargetSubtargetInfo &STI) const {
657   const InstrItineraryData *II = STI.getInstrItineraryData();
658   return static_cast<const AMDGPUSubtarget &>(STI).createDFAPacketizer(II);
659 }
660
661 static bool
662 isPredicateSetter(unsigned Opcode) {
663   switch (Opcode) {
664   case AMDGPU::PRED_X:
665     return true;
666   default:
667     return false;
668   }
669 }
670
671 static MachineInstr *
672 findFirstPredicateSetterFrom(MachineBasicBlock &MBB,
673                              MachineBasicBlock::iterator I) {
674   while (I != MBB.begin()) {
675     --I;
676     MachineInstr *MI = I;
677     if (isPredicateSetter(MI->getOpcode()))
678       return MI;
679   }
680
681   return nullptr;
682 }
683
684 static
685 bool isJump(unsigned Opcode) {
686   return Opcode == AMDGPU::JUMP || Opcode == AMDGPU::JUMP_COND;
687 }
688
689 static bool isBranch(unsigned Opcode) {
690   return Opcode == AMDGPU::BRANCH || Opcode == AMDGPU::BRANCH_COND_i32 ||
691       Opcode == AMDGPU::BRANCH_COND_f32;
692 }
693
694 bool
695 R600InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
696                              MachineBasicBlock *&TBB,
697                              MachineBasicBlock *&FBB,
698                              SmallVectorImpl<MachineOperand> &Cond,
699                              bool AllowModify) const {
700   // Most of the following comes from the ARM implementation of AnalyzeBranch
701
702   // If the block has no terminators, it just falls into the block after it.
703   MachineBasicBlock::iterator I = MBB.end();
704   if (I == MBB.begin())
705     return false;
706   --I;
707   while (I->isDebugValue()) {
708     if (I == MBB.begin())
709       return false;
710     --I;
711   }
712   // AMDGPU::BRANCH* instructions are only available after isel and are not
713   // handled
714   if (isBranch(I->getOpcode()))
715     return true;
716   if (!isJump(static_cast<MachineInstr *>(I)->getOpcode())) {
717     return false;
718   }
719
720   // Remove successive JUMP
721   while (I != MBB.begin() && std::prev(I)->getOpcode() == AMDGPU::JUMP) {
722       MachineBasicBlock::iterator PriorI = std::prev(I);
723       if (AllowModify)
724         I->removeFromParent();
725       I = PriorI;
726   }
727   MachineInstr *LastInst = I;
728
729   // If there is only one terminator instruction, process it.
730   unsigned LastOpc = LastInst->getOpcode();
731   if (I == MBB.begin() ||
732           !isJump(static_cast<MachineInstr *>(--I)->getOpcode())) {
733     if (LastOpc == AMDGPU::JUMP) {
734       TBB = LastInst->getOperand(0).getMBB();
735       return false;
736     } else if (LastOpc == AMDGPU::JUMP_COND) {
737       MachineInstr *predSet = I;
738       while (!isPredicateSetter(predSet->getOpcode())) {
739         predSet = --I;
740       }
741       TBB = LastInst->getOperand(0).getMBB();
742       Cond.push_back(predSet->getOperand(1));
743       Cond.push_back(predSet->getOperand(2));
744       Cond.push_back(MachineOperand::CreateReg(AMDGPU::PRED_SEL_ONE, false));
745       return false;
746     }
747     return true;  // Can't handle indirect branch.
748   }
749
750   // Get the instruction before it if it is a terminator.
751   MachineInstr *SecondLastInst = I;
752   unsigned SecondLastOpc = SecondLastInst->getOpcode();
753
754   // If the block ends with a B and a Bcc, handle it.
755   if (SecondLastOpc == AMDGPU::JUMP_COND && LastOpc == AMDGPU::JUMP) {
756     MachineInstr *predSet = --I;
757     while (!isPredicateSetter(predSet->getOpcode())) {
758       predSet = --I;
759     }
760     TBB = SecondLastInst->getOperand(0).getMBB();
761     FBB = LastInst->getOperand(0).getMBB();
762     Cond.push_back(predSet->getOperand(1));
763     Cond.push_back(predSet->getOperand(2));
764     Cond.push_back(MachineOperand::CreateReg(AMDGPU::PRED_SEL_ONE, false));
765     return false;
766   }
767
768   // Otherwise, can't handle this.
769   return true;
770 }
771
772 static
773 MachineBasicBlock::iterator FindLastAluClause(MachineBasicBlock &MBB) {
774   for (MachineBasicBlock::reverse_iterator It = MBB.rbegin(), E = MBB.rend();
775       It != E; ++It) {
776     if (It->getOpcode() == AMDGPU::CF_ALU ||
777         It->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE)
778       return std::prev(It.base());
779   }
780   return MBB.end();
781 }
782
783 unsigned
784 R600InstrInfo::InsertBranch(MachineBasicBlock &MBB,
785                             MachineBasicBlock *TBB,
786                             MachineBasicBlock *FBB,
787                             const SmallVectorImpl<MachineOperand> &Cond,
788                             DebugLoc DL) const {
789   assert(TBB && "InsertBranch must not be told to insert a fallthrough");
790
791   if (!FBB) {
792     if (Cond.empty()) {
793       BuildMI(&MBB, DL, get(AMDGPU::JUMP)).addMBB(TBB);
794       return 1;
795     } else {
796       MachineInstr *PredSet = findFirstPredicateSetterFrom(MBB, MBB.end());
797       assert(PredSet && "No previous predicate !");
798       addFlag(PredSet, 0, MO_FLAG_PUSH);
799       PredSet->getOperand(2).setImm(Cond[1].getImm());
800
801       BuildMI(&MBB, DL, get(AMDGPU::JUMP_COND))
802              .addMBB(TBB)
803              .addReg(AMDGPU::PREDICATE_BIT, RegState::Kill);
804       MachineBasicBlock::iterator CfAlu = FindLastAluClause(MBB);
805       if (CfAlu == MBB.end())
806         return 1;
807       assert (CfAlu->getOpcode() == AMDGPU::CF_ALU);
808       CfAlu->setDesc(get(AMDGPU::CF_ALU_PUSH_BEFORE));
809       return 1;
810     }
811   } else {
812     MachineInstr *PredSet = findFirstPredicateSetterFrom(MBB, MBB.end());
813     assert(PredSet && "No previous predicate !");
814     addFlag(PredSet, 0, MO_FLAG_PUSH);
815     PredSet->getOperand(2).setImm(Cond[1].getImm());
816     BuildMI(&MBB, DL, get(AMDGPU::JUMP_COND))
817             .addMBB(TBB)
818             .addReg(AMDGPU::PREDICATE_BIT, RegState::Kill);
819     BuildMI(&MBB, DL, get(AMDGPU::JUMP)).addMBB(FBB);
820     MachineBasicBlock::iterator CfAlu = FindLastAluClause(MBB);
821     if (CfAlu == MBB.end())
822       return 2;
823     assert (CfAlu->getOpcode() == AMDGPU::CF_ALU);
824     CfAlu->setDesc(get(AMDGPU::CF_ALU_PUSH_BEFORE));
825     return 2;
826   }
827 }
828
829 unsigned
830 R600InstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
831
832   // Note : we leave PRED* instructions there.
833   // They may be needed when predicating instructions.
834
835   MachineBasicBlock::iterator I = MBB.end();
836
837   if (I == MBB.begin()) {
838     return 0;
839   }
840   --I;
841   switch (I->getOpcode()) {
842   default:
843     return 0;
844   case AMDGPU::JUMP_COND: {
845     MachineInstr *predSet = findFirstPredicateSetterFrom(MBB, I);
846     clearFlag(predSet, 0, MO_FLAG_PUSH);
847     I->eraseFromParent();
848     MachineBasicBlock::iterator CfAlu = FindLastAluClause(MBB);
849     if (CfAlu == MBB.end())
850       break;
851     assert (CfAlu->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE);
852     CfAlu->setDesc(get(AMDGPU::CF_ALU));
853     break;
854   }
855   case AMDGPU::JUMP:
856     I->eraseFromParent();
857     break;
858   }
859   I = MBB.end();
860
861   if (I == MBB.begin()) {
862     return 1;
863   }
864   --I;
865   switch (I->getOpcode()) {
866     // FIXME: only one case??
867   default:
868     return 1;
869   case AMDGPU::JUMP_COND: {
870     MachineInstr *predSet = findFirstPredicateSetterFrom(MBB, I);
871     clearFlag(predSet, 0, MO_FLAG_PUSH);
872     I->eraseFromParent();
873     MachineBasicBlock::iterator CfAlu = FindLastAluClause(MBB);
874     if (CfAlu == MBB.end())
875       break;
876     assert (CfAlu->getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE);
877     CfAlu->setDesc(get(AMDGPU::CF_ALU));
878     break;
879   }
880   case AMDGPU::JUMP:
881     I->eraseFromParent();
882     break;
883   }
884   return 2;
885 }
886
887 bool
888 R600InstrInfo::isPredicated(const MachineInstr *MI) const {
889   int idx = MI->findFirstPredOperandIdx();
890   if (idx < 0)
891     return false;
892
893   unsigned Reg = MI->getOperand(idx).getReg();
894   switch (Reg) {
895   default: return false;
896   case AMDGPU::PRED_SEL_ONE:
897   case AMDGPU::PRED_SEL_ZERO:
898   case AMDGPU::PREDICATE_BIT:
899     return true;
900   }
901 }
902
903 bool
904 R600InstrInfo::isPredicable(MachineInstr *MI) const {
905   // XXX: KILL* instructions can be predicated, but they must be the last
906   // instruction in a clause, so this means any instructions after them cannot
907   // be predicated.  Until we have proper support for instruction clauses in the
908   // backend, we will mark KILL* instructions as unpredicable.
909
910   if (MI->getOpcode() == AMDGPU::KILLGT) {
911     return false;
912   } else if (MI->getOpcode() == AMDGPU::CF_ALU) {
913     // If the clause start in the middle of MBB then the MBB has more
914     // than a single clause, unable to predicate several clauses.
915     if (MI->getParent()->begin() != MachineBasicBlock::iterator(MI))
916       return false;
917     // TODO: We don't support KC merging atm
918     if (MI->getOperand(3).getImm() != 0 || MI->getOperand(4).getImm() != 0)
919       return false;
920     return true;
921   } else if (isVector(*MI)) {
922     return false;
923   } else {
924     return AMDGPUInstrInfo::isPredicable(MI);
925   }
926 }
927
928
929 bool
930 R600InstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
931                                    unsigned NumCyles,
932                                    unsigned ExtraPredCycles,
933                                    const BranchProbability &Probability) const{
934   return true;
935 }
936
937 bool
938 R600InstrInfo::isProfitableToIfCvt(MachineBasicBlock &TMBB,
939                                    unsigned NumTCycles,
940                                    unsigned ExtraTCycles,
941                                    MachineBasicBlock &FMBB,
942                                    unsigned NumFCycles,
943                                    unsigned ExtraFCycles,
944                                    const BranchProbability &Probability) const {
945   return true;
946 }
947
948 bool
949 R600InstrInfo::isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
950                                          unsigned NumCyles,
951                                          const BranchProbability &Probability)
952                                          const {
953   return true;
954 }
955
956 bool
957 R600InstrInfo::isProfitableToUnpredicate(MachineBasicBlock &TMBB,
958                                          MachineBasicBlock &FMBB) const {
959   return false;
960 }
961
962
963 bool
964 R600InstrInfo::ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
965   MachineOperand &MO = Cond[1];
966   switch (MO.getImm()) {
967   case OPCODE_IS_ZERO_INT:
968     MO.setImm(OPCODE_IS_NOT_ZERO_INT);
969     break;
970   case OPCODE_IS_NOT_ZERO_INT:
971     MO.setImm(OPCODE_IS_ZERO_INT);
972     break;
973   case OPCODE_IS_ZERO:
974     MO.setImm(OPCODE_IS_NOT_ZERO);
975     break;
976   case OPCODE_IS_NOT_ZERO:
977     MO.setImm(OPCODE_IS_ZERO);
978     break;
979   default:
980     return true;
981   }
982
983   MachineOperand &MO2 = Cond[2];
984   switch (MO2.getReg()) {
985   case AMDGPU::PRED_SEL_ZERO:
986     MO2.setReg(AMDGPU::PRED_SEL_ONE);
987     break;
988   case AMDGPU::PRED_SEL_ONE:
989     MO2.setReg(AMDGPU::PRED_SEL_ZERO);
990     break;
991   default:
992     return true;
993   }
994   return false;
995 }
996
997 bool
998 R600InstrInfo::DefinesPredicate(MachineInstr *MI,
999                                 std::vector<MachineOperand> &Pred) const {
1000   return isPredicateSetter(MI->getOpcode());
1001 }
1002
1003
1004 bool
1005 R600InstrInfo::SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,
1006                        const SmallVectorImpl<MachineOperand> &Pred2) const {
1007   return false;
1008 }
1009
1010
1011 bool
1012 R600InstrInfo::PredicateInstruction(MachineInstr *MI,
1013                       const SmallVectorImpl<MachineOperand> &Pred) const {
1014   int PIdx = MI->findFirstPredOperandIdx();
1015
1016   if (MI->getOpcode() == AMDGPU::CF_ALU) {
1017     MI->getOperand(8).setImm(0);
1018     return true;
1019   }
1020
1021   if (MI->getOpcode() == AMDGPU::DOT_4) {
1022     MI->getOperand(getOperandIdx(*MI, AMDGPU::OpName::pred_sel_X))
1023         .setReg(Pred[2].getReg());
1024     MI->getOperand(getOperandIdx(*MI, AMDGPU::OpName::pred_sel_Y))
1025         .setReg(Pred[2].getReg());
1026     MI->getOperand(getOperandIdx(*MI, AMDGPU::OpName::pred_sel_Z))
1027         .setReg(Pred[2].getReg());
1028     MI->getOperand(getOperandIdx(*MI, AMDGPU::OpName::pred_sel_W))
1029         .setReg(Pred[2].getReg());
1030     MachineInstrBuilder MIB(*MI->getParent()->getParent(), MI);
1031     MIB.addReg(AMDGPU::PREDICATE_BIT, RegState::Implicit);
1032     return true;
1033   }
1034
1035   if (PIdx != -1) {
1036     MachineOperand &PMO = MI->getOperand(PIdx);
1037     PMO.setReg(Pred[2].getReg());
1038     MachineInstrBuilder MIB(*MI->getParent()->getParent(), MI);
1039     MIB.addReg(AMDGPU::PREDICATE_BIT, RegState::Implicit);
1040     return true;
1041   }
1042
1043   return false;
1044 }
1045
1046 unsigned int R600InstrInfo::getPredicationCost(const MachineInstr *) const {
1047   return 2;
1048 }
1049
1050 unsigned int R600InstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
1051                                             const MachineInstr *MI,
1052                                             unsigned *PredCost) const {
1053   if (PredCost)
1054     *PredCost = 2;
1055   return 2;
1056 }
1057
1058 bool R600InstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) const {
1059
1060   switch(MI->getOpcode()) {
1061   default: return AMDGPUInstrInfo::expandPostRAPseudo(MI);
1062   case AMDGPU::R600_EXTRACT_ELT_V2:
1063   case AMDGPU::R600_EXTRACT_ELT_V4:
1064     buildIndirectRead(MI->getParent(), MI, MI->getOperand(0).getReg(),
1065                       RI.getHWRegIndex(MI->getOperand(1).getReg()), //  Address
1066                       MI->getOperand(2).getReg(),
1067                       RI.getHWRegChan(MI->getOperand(1).getReg()));
1068     break;
1069   case AMDGPU::R600_INSERT_ELT_V2:
1070   case AMDGPU::R600_INSERT_ELT_V4:
1071     buildIndirectWrite(MI->getParent(), MI, MI->getOperand(2).getReg(), // Value
1072                        RI.getHWRegIndex(MI->getOperand(1).getReg()),  // Address
1073                        MI->getOperand(3).getReg(),                    // Offset
1074                        RI.getHWRegChan(MI->getOperand(1).getReg()));  // Channel
1075     break;
1076   }
1077   MI->eraseFromParent();
1078   return true;
1079 }
1080
1081 void  R600InstrInfo::reserveIndirectRegisters(BitVector &Reserved,
1082                                              const MachineFunction &MF) const {
1083   const AMDGPUFrameLowering *TFL = static_cast<const AMDGPUFrameLowering *>(
1084       MF.getSubtarget().getFrameLowering());
1085
1086   unsigned StackWidth = TFL->getStackWidth(MF);
1087   int End = getIndirectIndexEnd(MF);
1088
1089   if (End == -1)
1090     return;
1091
1092   for (int Index = getIndirectIndexBegin(MF); Index <= End; ++Index) {
1093     unsigned SuperReg = AMDGPU::R600_Reg128RegClass.getRegister(Index);
1094     Reserved.set(SuperReg);
1095     for (unsigned Chan = 0; Chan < StackWidth; ++Chan) {
1096       unsigned Reg = AMDGPU::R600_TReg32RegClass.getRegister((4 * Index) + Chan);
1097       Reserved.set(Reg);
1098     }
1099   }
1100 }
1101
1102 unsigned R600InstrInfo::calculateIndirectAddress(unsigned RegIndex,
1103                                                  unsigned Channel) const {
1104   // XXX: Remove when we support a stack width > 2
1105   assert(Channel == 0);
1106   return RegIndex;
1107 }
1108
1109 const TargetRegisterClass *R600InstrInfo::getIndirectAddrRegClass() const {
1110   return &AMDGPU::R600_TReg32_XRegClass;
1111 }
1112
1113 MachineInstrBuilder R600InstrInfo::buildIndirectWrite(MachineBasicBlock *MBB,
1114                                        MachineBasicBlock::iterator I,
1115                                        unsigned ValueReg, unsigned Address,
1116                                        unsigned OffsetReg) const {
1117   return buildIndirectWrite(MBB, I, ValueReg, Address, OffsetReg, 0);
1118 }
1119
1120 MachineInstrBuilder R600InstrInfo::buildIndirectWrite(MachineBasicBlock *MBB,
1121                                        MachineBasicBlock::iterator I,
1122                                        unsigned ValueReg, unsigned Address,
1123                                        unsigned OffsetReg,
1124                                        unsigned AddrChan) const {
1125   unsigned AddrReg;
1126   switch (AddrChan) {
1127     default: llvm_unreachable("Invalid Channel");
1128     case 0: AddrReg = AMDGPU::R600_AddrRegClass.getRegister(Address); break;
1129     case 1: AddrReg = AMDGPU::R600_Addr_YRegClass.getRegister(Address); break;
1130     case 2: AddrReg = AMDGPU::R600_Addr_ZRegClass.getRegister(Address); break;
1131     case 3: AddrReg = AMDGPU::R600_Addr_WRegClass.getRegister(Address); break;
1132   }
1133   MachineInstr *MOVA = buildDefaultInstruction(*MBB, I, AMDGPU::MOVA_INT_eg,
1134                                                AMDGPU::AR_X, OffsetReg);
1135   setImmOperand(MOVA, AMDGPU::OpName::write, 0);
1136
1137   MachineInstrBuilder Mov = buildDefaultInstruction(*MBB, I, AMDGPU::MOV,
1138                                       AddrReg, ValueReg)
1139                                       .addReg(AMDGPU::AR_X,
1140                                            RegState::Implicit | RegState::Kill);
1141   setImmOperand(Mov, AMDGPU::OpName::dst_rel, 1);
1142   return Mov;
1143 }
1144
1145 MachineInstrBuilder R600InstrInfo::buildIndirectRead(MachineBasicBlock *MBB,
1146                                        MachineBasicBlock::iterator I,
1147                                        unsigned ValueReg, unsigned Address,
1148                                        unsigned OffsetReg) const {
1149   return buildIndirectRead(MBB, I, ValueReg, Address, OffsetReg, 0);
1150 }
1151
1152 MachineInstrBuilder R600InstrInfo::buildIndirectRead(MachineBasicBlock *MBB,
1153                                        MachineBasicBlock::iterator I,
1154                                        unsigned ValueReg, unsigned Address,
1155                                        unsigned OffsetReg,
1156                                        unsigned AddrChan) const {
1157   unsigned AddrReg;
1158   switch (AddrChan) {
1159     default: llvm_unreachable("Invalid Channel");
1160     case 0: AddrReg = AMDGPU::R600_AddrRegClass.getRegister(Address); break;
1161     case 1: AddrReg = AMDGPU::R600_Addr_YRegClass.getRegister(Address); break;
1162     case 2: AddrReg = AMDGPU::R600_Addr_ZRegClass.getRegister(Address); break;
1163     case 3: AddrReg = AMDGPU::R600_Addr_WRegClass.getRegister(Address); break;
1164   }
1165   MachineInstr *MOVA = buildDefaultInstruction(*MBB, I, AMDGPU::MOVA_INT_eg,
1166                                                        AMDGPU::AR_X,
1167                                                        OffsetReg);
1168   setImmOperand(MOVA, AMDGPU::OpName::write, 0);
1169   MachineInstrBuilder Mov = buildDefaultInstruction(*MBB, I, AMDGPU::MOV,
1170                                       ValueReg,
1171                                       AddrReg)
1172                                       .addReg(AMDGPU::AR_X,
1173                                            RegState::Implicit | RegState::Kill);
1174   setImmOperand(Mov, AMDGPU::OpName::src0_rel, 1);
1175
1176   return Mov;
1177 }
1178
1179 unsigned R600InstrInfo::getMaxAlusPerClause() const {
1180   return 115;
1181 }
1182
1183 MachineInstrBuilder R600InstrInfo::buildDefaultInstruction(MachineBasicBlock &MBB,
1184                                                   MachineBasicBlock::iterator I,
1185                                                   unsigned Opcode,
1186                                                   unsigned DstReg,
1187                                                   unsigned Src0Reg,
1188                                                   unsigned Src1Reg) const {
1189   MachineInstrBuilder MIB = BuildMI(MBB, I, MBB.findDebugLoc(I), get(Opcode),
1190     DstReg);           // $dst
1191
1192   if (Src1Reg) {
1193     MIB.addImm(0)     // $update_exec_mask
1194        .addImm(0);    // $update_predicate
1195   }
1196   MIB.addImm(1)        // $write
1197      .addImm(0)        // $omod
1198      .addImm(0)        // $dst_rel
1199      .addImm(0)        // $dst_clamp
1200      .addReg(Src0Reg)  // $src0
1201      .addImm(0)        // $src0_neg
1202      .addImm(0)        // $src0_rel
1203      .addImm(0)        // $src0_abs
1204      .addImm(-1);       // $src0_sel
1205
1206   if (Src1Reg) {
1207     MIB.addReg(Src1Reg) // $src1
1208        .addImm(0)       // $src1_neg
1209        .addImm(0)       // $src1_rel
1210        .addImm(0)       // $src1_abs
1211        .addImm(-1);      // $src1_sel
1212   }
1213
1214   //XXX: The r600g finalizer expects this to be 1, once we've moved the
1215   //scheduling to the backend, we can change the default to 0.
1216   MIB.addImm(1)        // $last
1217       .addReg(AMDGPU::PRED_SEL_OFF) // $pred_sel
1218       .addImm(0)         // $literal
1219       .addImm(0);        // $bank_swizzle
1220
1221   return MIB;
1222 }
1223
1224 #define OPERAND_CASE(Label) \
1225   case Label: { \
1226     static const unsigned Ops[] = \
1227     { \
1228       Label##_X, \
1229       Label##_Y, \
1230       Label##_Z, \
1231       Label##_W \
1232     }; \
1233     return Ops[Slot]; \
1234   }
1235
1236 static unsigned getSlotedOps(unsigned  Op, unsigned Slot) {
1237   switch (Op) {
1238   OPERAND_CASE(AMDGPU::OpName::update_exec_mask)
1239   OPERAND_CASE(AMDGPU::OpName::update_pred)
1240   OPERAND_CASE(AMDGPU::OpName::write)
1241   OPERAND_CASE(AMDGPU::OpName::omod)
1242   OPERAND_CASE(AMDGPU::OpName::dst_rel)
1243   OPERAND_CASE(AMDGPU::OpName::clamp)
1244   OPERAND_CASE(AMDGPU::OpName::src0)
1245   OPERAND_CASE(AMDGPU::OpName::src0_neg)
1246   OPERAND_CASE(AMDGPU::OpName::src0_rel)
1247   OPERAND_CASE(AMDGPU::OpName::src0_abs)
1248   OPERAND_CASE(AMDGPU::OpName::src0_sel)
1249   OPERAND_CASE(AMDGPU::OpName::src1)
1250   OPERAND_CASE(AMDGPU::OpName::src1_neg)
1251   OPERAND_CASE(AMDGPU::OpName::src1_rel)
1252   OPERAND_CASE(AMDGPU::OpName::src1_abs)
1253   OPERAND_CASE(AMDGPU::OpName::src1_sel)
1254   OPERAND_CASE(AMDGPU::OpName::pred_sel)
1255   default:
1256     llvm_unreachable("Wrong Operand");
1257   }
1258 }
1259
1260 #undef OPERAND_CASE
1261
1262 MachineInstr *R600InstrInfo::buildSlotOfVectorInstruction(
1263     MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg)
1264     const {
1265   assert (MI->getOpcode() == AMDGPU::DOT_4 && "Not Implemented");
1266   unsigned Opcode;
1267   if (ST.getGeneration() <= AMDGPUSubtarget::R700)
1268     Opcode = AMDGPU::DOT4_r600;
1269   else
1270     Opcode = AMDGPU::DOT4_eg;
1271   MachineBasicBlock::iterator I = MI;
1272   MachineOperand &Src0 = MI->getOperand(
1273       getOperandIdx(MI->getOpcode(), getSlotedOps(AMDGPU::OpName::src0, Slot)));
1274   MachineOperand &Src1 = MI->getOperand(
1275       getOperandIdx(MI->getOpcode(), getSlotedOps(AMDGPU::OpName::src1, Slot)));
1276   MachineInstr *MIB = buildDefaultInstruction(
1277       MBB, I, Opcode, DstReg, Src0.getReg(), Src1.getReg());
1278   static const unsigned  Operands[14] = {
1279     AMDGPU::OpName::update_exec_mask,
1280     AMDGPU::OpName::update_pred,
1281     AMDGPU::OpName::write,
1282     AMDGPU::OpName::omod,
1283     AMDGPU::OpName::dst_rel,
1284     AMDGPU::OpName::clamp,
1285     AMDGPU::OpName::src0_neg,
1286     AMDGPU::OpName::src0_rel,
1287     AMDGPU::OpName::src0_abs,
1288     AMDGPU::OpName::src0_sel,
1289     AMDGPU::OpName::src1_neg,
1290     AMDGPU::OpName::src1_rel,
1291     AMDGPU::OpName::src1_abs,
1292     AMDGPU::OpName::src1_sel,
1293   };
1294
1295   MachineOperand &MO = MI->getOperand(getOperandIdx(MI->getOpcode(),
1296       getSlotedOps(AMDGPU::OpName::pred_sel, Slot)));
1297   MIB->getOperand(getOperandIdx(Opcode, AMDGPU::OpName::pred_sel))
1298       .setReg(MO.getReg());
1299
1300   for (unsigned i = 0; i < 14; i++) {
1301     MachineOperand &MO = MI->getOperand(
1302         getOperandIdx(MI->getOpcode(), getSlotedOps(Operands[i], Slot)));
1303     assert (MO.isImm());
1304     setImmOperand(MIB, Operands[i], MO.getImm());
1305   }
1306   MIB->getOperand(20).setImm(0);
1307   return MIB;
1308 }
1309
1310 MachineInstr *R600InstrInfo::buildMovImm(MachineBasicBlock &BB,
1311                                          MachineBasicBlock::iterator I,
1312                                          unsigned DstReg,
1313                                          uint64_t Imm) const {
1314   MachineInstr *MovImm = buildDefaultInstruction(BB, I, AMDGPU::MOV, DstReg,
1315                                                   AMDGPU::ALU_LITERAL_X);
1316   setImmOperand(MovImm, AMDGPU::OpName::literal, Imm);
1317   return MovImm;
1318 }
1319
1320 MachineInstr *R600InstrInfo::buildMovInstr(MachineBasicBlock *MBB,
1321                                        MachineBasicBlock::iterator I,
1322                                        unsigned DstReg, unsigned SrcReg) const {
1323   return buildDefaultInstruction(*MBB, I, AMDGPU::MOV, DstReg, SrcReg);
1324 }
1325
1326 int R600InstrInfo::getOperandIdx(const MachineInstr &MI, unsigned Op) const {
1327   return getOperandIdx(MI.getOpcode(), Op);
1328 }
1329
1330 int R600InstrInfo::getOperandIdx(unsigned Opcode, unsigned Op) const {
1331   return AMDGPU::getNamedOperandIdx(Opcode, Op);
1332 }
1333
1334 void R600InstrInfo::setImmOperand(MachineInstr *MI, unsigned Op,
1335                                   int64_t Imm) const {
1336   int Idx = getOperandIdx(*MI, Op);
1337   assert(Idx != -1 && "Operand not supported for this instruction.");
1338   assert(MI->getOperand(Idx).isImm());
1339   MI->getOperand(Idx).setImm(Imm);
1340 }
1341
1342 //===----------------------------------------------------------------------===//
1343 // Instruction flag getters/setters
1344 //===----------------------------------------------------------------------===//
1345
1346 bool R600InstrInfo::hasFlagOperand(const MachineInstr &MI) const {
1347   return GET_FLAG_OPERAND_IDX(get(MI.getOpcode()).TSFlags) != 0;
1348 }
1349
1350 MachineOperand &R600InstrInfo::getFlagOp(MachineInstr *MI, unsigned SrcIdx,
1351                                          unsigned Flag) const {
1352   unsigned TargetFlags = get(MI->getOpcode()).TSFlags;
1353   int FlagIndex = 0;
1354   if (Flag != 0) {
1355     // If we pass something other than the default value of Flag to this
1356     // function, it means we are want to set a flag on an instruction
1357     // that uses native encoding.
1358     assert(HAS_NATIVE_OPERANDS(TargetFlags));
1359     bool IsOP3 = (TargetFlags & R600_InstFlag::OP3) == R600_InstFlag::OP3;
1360     switch (Flag) {
1361     case MO_FLAG_CLAMP:
1362       FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::clamp);
1363       break;
1364     case MO_FLAG_MASK:
1365       FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::write);
1366       break;
1367     case MO_FLAG_NOT_LAST:
1368     case MO_FLAG_LAST:
1369       FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::last);
1370       break;
1371     case MO_FLAG_NEG:
1372       switch (SrcIdx) {
1373       case 0: FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::src0_neg); break;
1374       case 1: FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::src1_neg); break;
1375       case 2: FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::src2_neg); break;
1376       }
1377       break;
1378
1379     case MO_FLAG_ABS:
1380       assert(!IsOP3 && "Cannot set absolute value modifier for OP3 "
1381                        "instructions.");
1382       (void)IsOP3;
1383       switch (SrcIdx) {
1384       case 0: FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::src0_abs); break;
1385       case 1: FlagIndex = getOperandIdx(*MI, AMDGPU::OpName::src1_abs); break;
1386       }
1387       break;
1388
1389     default:
1390       FlagIndex = -1;
1391       break;
1392     }
1393     assert(FlagIndex != -1 && "Flag not supported for this instruction");
1394   } else {
1395       FlagIndex = GET_FLAG_OPERAND_IDX(TargetFlags);
1396       assert(FlagIndex != 0 &&
1397          "Instruction flags not supported for this instruction");
1398   }
1399
1400   MachineOperand &FlagOp = MI->getOperand(FlagIndex);
1401   assert(FlagOp.isImm());
1402   return FlagOp;
1403 }
1404
1405 void R600InstrInfo::addFlag(MachineInstr *MI, unsigned Operand,
1406                             unsigned Flag) const {
1407   unsigned TargetFlags = get(MI->getOpcode()).TSFlags;
1408   if (Flag == 0) {
1409     return;
1410   }
1411   if (HAS_NATIVE_OPERANDS(TargetFlags)) {
1412     MachineOperand &FlagOp = getFlagOp(MI, Operand, Flag);
1413     if (Flag == MO_FLAG_NOT_LAST) {
1414       clearFlag(MI, Operand, MO_FLAG_LAST);
1415     } else if (Flag == MO_FLAG_MASK) {
1416       clearFlag(MI, Operand, Flag);
1417     } else {
1418       FlagOp.setImm(1);
1419     }
1420   } else {
1421       MachineOperand &FlagOp = getFlagOp(MI, Operand);
1422       FlagOp.setImm(FlagOp.getImm() | (Flag << (NUM_MO_FLAGS * Operand)));
1423   }
1424 }
1425
1426 void R600InstrInfo::clearFlag(MachineInstr *MI, unsigned Operand,
1427                               unsigned Flag) const {
1428   unsigned TargetFlags = get(MI->getOpcode()).TSFlags;
1429   if (HAS_NATIVE_OPERANDS(TargetFlags)) {
1430     MachineOperand &FlagOp = getFlagOp(MI, Operand, Flag);
1431     FlagOp.setImm(0);
1432   } else {
1433     MachineOperand &FlagOp = getFlagOp(MI);
1434     unsigned InstFlags = FlagOp.getImm();
1435     InstFlags &= ~(Flag << (NUM_MO_FLAGS * Operand));
1436     FlagOp.setImm(InstFlags);
1437   }
1438 }