Move all of the header files which are involved in modelling the LLVM IR
[oota-llvm.git] / lib / Target / NVPTX / VectorElementize.cpp
1 //===-- VectorElementize.cpp - Remove unreachable blocks for codegen --===//
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 // This pass converts operations on vector types to operations on their
11 // element types.
12 //
13 // For generic binary and unary vector instructions, the conversion is simple.
14 // Suppose we have
15 //        av = bv Vop cv
16 // where av, bv, and cv are vector virtual registers, and Vop is a vector op.
17 // This gets converted to the following :
18 //       a1 = b1 Sop c1
19 //       a2 = b2 Sop c2
20 //
21 // VectorToScalarMap maintains the vector vreg to scalar vreg mapping.
22 // For the above example, the map will look as follows:
23 // av => [a1, a2]
24 // bv => [b1, b2]
25 //
26 // In addition, initVectorInfo creates the following opcode->opcode map.
27 // Vop => Sop
28 // OtherVop => OtherSop
29 // ...
30 //
31 // For vector specific instructions like vecbuild, vecshuffle etc, the
32 // conversion is different. Look at comments near the functions with
33 // prefix createVec<...>.
34 //
35 //===----------------------------------------------------------------------===//
36
37 #include "NVPTX.h"
38 #include "NVPTXTargetMachine.h"
39 #include "llvm/ADT/DepthFirstIterator.h"
40 #include "llvm/ADT/SmallPtrSet.h"
41 #include "llvm/CodeGen/MachineFunctionPass.h"
42 #include "llvm/CodeGen/MachineInstrBuilder.h"
43 #include "llvm/CodeGen/MachineModuleInfo.h"
44 #include "llvm/CodeGen/MachineRegisterInfo.h"
45 #include "llvm/CodeGen/Passes.h"
46 #include "llvm/IR/Constant.h"
47 #include "llvm/IR/Function.h"
48 #include "llvm/IR/Instructions.h"
49 #include "llvm/IR/Type.h"
50 #include "llvm/Pass.h"
51 #include "llvm/Support/CFG.h"
52 #include "llvm/Support/CommandLine.h"
53 #include "llvm/Support/Compiler.h"
54 #include "llvm/Target/TargetInstrInfo.h"
55
56 using namespace llvm;
57
58 namespace {
59
60 class LLVM_LIBRARY_VISIBILITY VectorElementize : public MachineFunctionPass {
61   virtual bool runOnMachineFunction(MachineFunction &F);
62
63   NVPTXTargetMachine &TM;
64   MachineRegisterInfo *MRI;
65   const NVPTXRegisterInfo *RegInfo;
66   const NVPTXInstrInfo *InstrInfo;
67
68   llvm::DenseMap<const TargetRegisterClass *, const TargetRegisterClass *>
69   RegClassMap;
70   llvm::DenseMap<unsigned, bool> SimpleMoveMap;
71
72   llvm::DenseMap<unsigned, SmallVector<unsigned, 4> > VectorToScalarMap;
73
74   bool isVectorInstr(MachineInstr *);
75
76   SmallVector<unsigned, 4> getScalarRegisters(unsigned);
77   unsigned getScalarVersion(unsigned);
78   unsigned getScalarVersion(MachineInstr *);
79
80   bool isVectorRegister(unsigned);
81   const TargetRegisterClass *getScalarRegClass(const TargetRegisterClass *RC);
82   unsigned numCopiesNeeded(MachineInstr *);
83
84   void createLoadCopy(MachineFunction&, MachineInstr *,
85                       std::vector<MachineInstr *>&);
86   void createStoreCopy(MachineFunction&, MachineInstr *,
87                        std::vector<MachineInstr *>&);
88
89   void createVecDest(MachineFunction&, MachineInstr *,
90                      std::vector<MachineInstr *>&);
91
92   void createCopies(MachineFunction&, MachineInstr *,
93                     std::vector<MachineInstr *>&);
94
95   unsigned copyProp(MachineFunction&);
96   unsigned removeDeadMoves(MachineFunction&);
97
98   void elementize(MachineFunction&);
99
100   bool isSimpleMove(MachineInstr *);
101
102   void createVecShuffle(MachineFunction& F, MachineInstr *Instr,
103                         std::vector<MachineInstr *>& copies);
104
105   void createVecExtract(MachineFunction& F, MachineInstr *Instr,
106                         std::vector<MachineInstr *>& copies);
107
108   void createVecInsert(MachineFunction& F, MachineInstr *Instr,
109                        std::vector<MachineInstr *>& copies);
110
111   void createVecBuild(MachineFunction& F, MachineInstr *Instr,
112                       std::vector<MachineInstr *>& copies);
113
114 public:
115
116   static char ID; // Pass identification, replacement for typeid
117   VectorElementize(NVPTXTargetMachine &tm)
118   : MachineFunctionPass(ID), TM(tm) {}
119
120   virtual const char *getPassName() const {
121     return "Convert LLVM vector types to their element types";
122   }
123 };
124
125 char VectorElementize::ID = 1;
126 }
127
128 static cl::opt<bool>
129 RemoveRedundantMoves("nvptx-remove-redundant-moves",
130        cl::desc("NVPTX: Remove redundant moves introduced by vector lowering"),
131                      cl::init(true));
132
133 #define VECINST(x) ((((x)->getDesc().TSFlags) & NVPTX::VecInstTypeMask) \
134     >> NVPTX::VecInstTypeShift)
135 #define ISVECINST(x) (VECINST(x) != NVPTX::VecNOP)
136 #define ISVECLOAD(x)    (VECINST(x) == NVPTX::VecLoad)
137 #define ISVECSTORE(x)   (VECINST(x) == NVPTX::VecStore)
138 #define ISVECBUILD(x)   (VECINST(x) == NVPTX::VecBuild)
139 #define ISVECSHUFFLE(x) (VECINST(x) == NVPTX::VecShuffle)
140 #define ISVECEXTRACT(x) (VECINST(x) == NVPTX::VecExtract)
141 #define ISVECINSERT(x)  (VECINST(x) == NVPTX::VecInsert)
142 #define ISVECDEST(x)     (VECINST(x) == NVPTX::VecDest)
143
144 bool VectorElementize::isSimpleMove(MachineInstr *mi) {
145   if (mi->isCopy())
146     return true;
147   unsigned TSFlags = (mi->getDesc().TSFlags & NVPTX::SimpleMoveMask)
148         >> NVPTX::SimpleMoveShift;
149   return (TSFlags == 1);
150 }
151
152 bool VectorElementize::isVectorInstr(MachineInstr *mi) {
153   if ((mi->getOpcode() == NVPTX::PHI) ||
154       (mi->getOpcode() == NVPTX::IMPLICIT_DEF) || mi->isCopy()) {
155     MachineOperand dest = mi->getOperand(0);
156     return isVectorRegister(dest.getReg());
157   }
158   return ISVECINST(mi);
159 }
160
161 unsigned VectorElementize::getScalarVersion(MachineInstr *mi) {
162   return getScalarVersion(mi->getOpcode());
163 }
164
165 ///=============================================================================
166 ///Instr is assumed to be a vector instruction. For most vector instructions,
167 ///the size of the destination vector register gives the number of scalar copies
168 ///needed. For VecStore, size of getOperand(1) gives the number of scalar copies
169 ///needed. For VecExtract, the dest is a scalar. So getOperand(1) gives the
170 ///number of scalar copies needed.
171 ///=============================================================================
172 unsigned VectorElementize::numCopiesNeeded(MachineInstr *Instr) {
173   unsigned numDefs=0;
174   unsigned def;
175   for (unsigned i=0, e=Instr->getNumOperands(); i!=e; ++i) {
176     MachineOperand oper = Instr->getOperand(i);
177
178     if (!oper.isReg()) continue;
179     if (!oper.isDef()) continue;
180     def = i;
181     numDefs++;
182   }
183   assert((numDefs <= 1) && "Only 0 or 1 defs supported");
184
185   if (numDefs == 1) {
186     unsigned regnum = Instr->getOperand(def).getReg();
187     if (ISVECEXTRACT(Instr))
188       regnum = Instr->getOperand(1).getReg();
189     return getNVPTXVectorSize(MRI->getRegClass(regnum));
190   }
191   else if (numDefs == 0) {
192     assert(ISVECSTORE(Instr)
193            && "Only 0 def instruction supported is vector store");
194
195     unsigned regnum = Instr->getOperand(0).getReg();
196     return getNVPTXVectorSize(MRI->getRegClass(regnum));
197   }
198   return 1;
199 }
200
201 const TargetRegisterClass *VectorElementize::
202 getScalarRegClass(const TargetRegisterClass *RC) {
203   assert(isNVPTXVectorRegClass(RC) &&
204          "Not a vector register class");
205   return getNVPTXElemClass(RC);
206 }
207
208 bool VectorElementize::isVectorRegister(unsigned reg) {
209   const TargetRegisterClass *RC=MRI->getRegClass(reg);
210   return isNVPTXVectorRegClass(RC);
211 }
212
213 ///=============================================================================
214 ///For every vector register 'v' that is not already in the VectorToScalarMap,
215 ///create n scalar registers of the corresponding element type, where n
216 ///is 2 or 4 (getNVPTXVectorSize) and add it VectorToScalarMap.
217 ///=============================================================================
218 SmallVector<unsigned, 4> VectorElementize::getScalarRegisters(unsigned regnum) {
219   assert(isVectorRegister(regnum) && "Expecting a vector register here");
220   // Create the scalar registers and put them in the map, if not already there.
221   if (VectorToScalarMap.find(regnum) == VectorToScalarMap.end()) {
222     const TargetRegisterClass *vecClass = MRI->getRegClass(regnum);
223     const TargetRegisterClass *scalarClass = getScalarRegClass(vecClass);
224
225     SmallVector<unsigned, 4> temp;
226
227     for (unsigned i=0, e=getNVPTXVectorSize(vecClass); i!=e; ++i)
228       temp.push_back(MRI->createVirtualRegister(scalarClass));
229
230     VectorToScalarMap[regnum] = temp;
231   }
232   return VectorToScalarMap[regnum];
233 }
234
235 ///=============================================================================
236 ///For a vector load of the form
237 ///va <= ldv2 [addr]
238 ///the following multi output instruction is created :
239 ///[v1, v2] <= LD [addr]
240 ///Look at NVPTXVector.td for the definitions of multi output loads.
241 ///=============================================================================
242 void VectorElementize::createLoadCopy(MachineFunction& F, MachineInstr *Instr,
243                                       std::vector<MachineInstr *>& copies) {
244   copies.push_back(F.CloneMachineInstr(Instr));
245
246   MachineInstrBuilder copy(F, copies[0]);
247   copy->setDesc(InstrInfo->get(getScalarVersion(copy)));
248
249   // Remove the dest, that should be a vector operand.
250   MachineOperand dest = copy->getOperand(0);
251   unsigned regnum = dest.getReg();
252
253   SmallVector<unsigned, 4> scalarRegs = getScalarRegisters(regnum);
254   copy->RemoveOperand(0);
255
256   std::vector<MachineOperand> otherOperands;
257   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
258     otherOperands.push_back(copy->getOperand(i));
259
260   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
261     copy->RemoveOperand(0);
262
263   for (unsigned i=0, e=scalarRegs.size(); i!=e; ++i)
264     copy.addReg(scalarRegs[i], RegState::Define);
265
266   for (unsigned i=0, e=otherOperands.size(); i!=e; ++i)
267     copy.addOperand(otherOperands[i]);
268
269 }
270
271 ///=============================================================================
272 ///For a vector store of the form
273 ///stv2 va, [addr]
274 ///the following multi input instruction is created :
275 ///ST v1, v2, [addr]
276 ///Look at NVPTXVector.td for the definitions of multi input stores.
277 ///=============================================================================
278 void VectorElementize::createStoreCopy(MachineFunction& F, MachineInstr *Instr,
279                                        std::vector<MachineInstr *>& copies) {
280   copies.push_back(F.CloneMachineInstr(Instr));
281
282   MachineInstrBuilder copy(F, copies[0]);
283   copy->setDesc(InstrInfo->get(getScalarVersion(copy)));
284
285   MachineOperand src = copy->getOperand(0);
286   unsigned regnum = src.getReg();
287
288   SmallVector<unsigned, 4> scalarRegs = getScalarRegisters(regnum);
289   copy->RemoveOperand(0);
290
291   std::vector<MachineOperand> otherOperands;
292   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
293     otherOperands.push_back(copy->getOperand(i));
294
295   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
296     copy->RemoveOperand(0);
297
298   for (unsigned i=0, e=scalarRegs.size(); i!=e; ++i)
299     copy.addReg(scalarRegs[i]);
300
301   for (unsigned i=0, e=otherOperands.size(); i!=e; ++i)
302     copy.addOperand(otherOperands[i]);
303 }
304
305 ///=============================================================================
306 ///va <= shufflev2 vb, vc, <i1>, <i2>
307 ///gets converted to 2 moves into a1 and a2. The source of the moves depend on
308 ///i1 and i2. i1, i2 can belong to the set {0, 1, 2, 3} for shufflev2. For
309 ///shufflev4 the set is {0,..7}. For example, if i1=3, i2=0, the move
310 ///instructions will be
311 ///a1 <= c2
312 ///a2 <= b1
313 ///=============================================================================
314 void VectorElementize::createVecShuffle(MachineFunction& F, MachineInstr *Instr,
315                                         std::vector<MachineInstr *>& copies) {
316   unsigned numcopies=numCopiesNeeded(Instr);
317
318   unsigned destregnum = Instr->getOperand(0).getReg();
319   unsigned src1regnum = Instr->getOperand(1).getReg();
320   unsigned src2regnum = Instr->getOperand(2).getReg();
321
322   SmallVector<unsigned, 4> dest = getScalarRegisters(destregnum);
323   SmallVector<unsigned, 4> src1 = getScalarRegisters(src1regnum);
324   SmallVector<unsigned, 4> src2 = getScalarRegisters(src2regnum);
325
326   DebugLoc DL = Instr->getDebugLoc();
327
328   for (unsigned i=0; i<numcopies; i++) {
329     MachineInstrBuilder copy =
330       BuildMI(F, DL, InstrInfo->get(getScalarVersion(Instr)), dest[i]);
331     MachineOperand which=Instr->getOperand(3+i);
332     assert(which.isImm() && "Shuffle operand not a constant");
333
334     int src=which.getImm();
335     int elem=src%numcopies;
336
337     if (which.getImm() < numcopies)
338       copy.addReg(src1[elem]);
339     else
340       copy.addReg(src2[elem]);
341     copies.push_back(copy);
342   }
343 }
344
345 ///=============================================================================
346 ///a <= extractv2 va, <i1>
347 ///gets turned into a simple move to the scalar register a. The source depends
348 ///on i1.
349 ///=============================================================================
350 void VectorElementize::createVecExtract(MachineFunction& F, MachineInstr *Instr,
351                                         std::vector<MachineInstr *>& copies) {
352   unsigned srcregnum = Instr->getOperand(1).getReg();
353
354   SmallVector<unsigned, 4> src = getScalarRegisters(srcregnum);
355
356   MachineOperand which = Instr->getOperand(2);
357   assert(which.isImm() && "Extract operand not a constant");
358
359   DebugLoc DL = Instr->getDebugLoc();
360   copies.push_back(BuildMI(F, DL, InstrInfo->get(getScalarVersion(Instr)),
361                            Instr->getOperand(0).getReg())
362                    .addReg(src[which.getImm()]));
363 }
364
365 ///=============================================================================
366 ///va <= vecinsertv2 vb, c, <i1>
367 ///This instruction copies all elements of vb to va, except the 'i1'th element.
368 ///The scalar value c becomes the 'i1'th element of va.
369 ///This gets translated to 2 (4 for vecinsertv4) moves.
370 ///=============================================================================
371 void VectorElementize::createVecInsert(MachineFunction& F, MachineInstr *Instr,
372                                        std::vector<MachineInstr *>& copies) {
373   unsigned numcopies=numCopiesNeeded(Instr);
374
375   unsigned destregnum = Instr->getOperand(0).getReg();
376   unsigned srcregnum = Instr->getOperand(1).getReg();
377
378   SmallVector<unsigned, 4> dest = getScalarRegisters(destregnum);
379   SmallVector<unsigned, 4> src = getScalarRegisters(srcregnum);
380
381   MachineOperand which=Instr->getOperand(3);
382   assert(which.isImm() && "Insert operand not a constant");
383   unsigned int elem=which.getImm();
384
385   DebugLoc DL = Instr->getDebugLoc();
386
387   for (unsigned i=0; i<numcopies; i++) {
388     MachineInstrBuilder copy =
389       BuildMI(F, DL, InstrInfo->get(getScalarVersion(Instr)), dest[i]);
390
391     if (i != elem)
392       copy.addReg(src[i]);
393     else
394       copy.addOperand(Instr->getOperand(2));
395
396     copies.push_back(copy);
397   }
398
399 }
400
401 ///=============================================================================
402 ///va <= buildv2 b1, b2
403 ///gets translated to
404 ///a1 <= b1
405 ///a2 <= b2
406 ///=============================================================================
407 void VectorElementize::createVecBuild(MachineFunction& F, MachineInstr *Instr,
408                                       std::vector<MachineInstr *>& copies) {
409   unsigned numcopies=numCopiesNeeded(Instr);
410
411   unsigned destregnum = Instr->getOperand(0).getReg();
412
413   SmallVector<unsigned, 4> dest = getScalarRegisters(destregnum);
414
415   DebugLoc DL = Instr->getDebugLoc();
416
417   for (unsigned i=0; i<numcopies; i++)
418     copies.push_back(BuildMI(F, DL, InstrInfo->get(getScalarVersion(Instr)),
419                              dest[i])
420                      .addOperand(Instr->getOperand(1+i)));
421 }
422
423 ///=============================================================================
424 ///For a tex inst of the form
425 ///va <= op [scalar operands]
426 ///the following multi output instruction is created :
427 ///[v1, v2] <= op' [scalar operands]
428 ///=============================================================================
429 void VectorElementize::createVecDest(MachineFunction& F, MachineInstr *Instr,
430                                      std::vector<MachineInstr *>& copies) {
431   copies.push_back(F.CloneMachineInstr(Instr));
432
433   MachineInstrBuilder copy(F, copies[0]);
434   copy->setDesc(InstrInfo->get(getScalarVersion(copy)));
435
436   // Remove the dest, that should be a vector operand.
437   MachineOperand dest = copy->getOperand(0);
438   unsigned regnum = dest.getReg();
439
440   SmallVector<unsigned, 4> scalarRegs = getScalarRegisters(regnum);
441   copy->RemoveOperand(0);
442
443   std::vector<MachineOperand> otherOperands;
444   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
445     otherOperands.push_back(copy->getOperand(i));
446
447   for (unsigned i=0, e=copy->getNumOperands(); i!=e; ++i)
448     copy->RemoveOperand(0);
449
450   for (unsigned i=0, e=scalarRegs.size(); i!=e; ++i)
451     copy.addReg(scalarRegs[i], RegState::Define);
452
453   for (unsigned i=0, e=otherOperands.size(); i!=e; ++i)
454     copy.addOperand(otherOperands[i]);
455 }
456
457 ///=============================================================================
458 ///Look at the vector instruction type and dispatch to the createVec<...>
459 ///function that creates the scalar copies.
460 ///=============================================================================
461 void VectorElementize::createCopies(MachineFunction& F, MachineInstr *Instr,
462                                     std::vector<MachineInstr *>& copies) {
463   if (ISVECLOAD(Instr)) {
464     createLoadCopy(F, Instr, copies);
465     return;
466   }
467   if (ISVECSTORE(Instr)) {
468     createStoreCopy(F, Instr, copies);
469     return;
470   }
471   if (ISVECSHUFFLE(Instr)) {
472     createVecShuffle(F, Instr, copies);
473     return;
474   }
475   if (ISVECEXTRACT(Instr)) {
476     createVecExtract(F, Instr, copies);
477     return;
478   }
479   if (ISVECINSERT(Instr)) {
480     createVecInsert(F, Instr, copies);
481     return;
482   }
483   if (ISVECDEST(Instr)) {
484     createVecDest(F, Instr, copies);
485     return;
486   }
487   if (ISVECBUILD(Instr)) {
488     createVecBuild(F, Instr, copies);
489     return;
490   }
491
492   unsigned numcopies=numCopiesNeeded(Instr);
493
494   for (unsigned i=0; i<numcopies; ++i)
495     copies.push_back(F.CloneMachineInstr(Instr));
496
497   for (unsigned i=0; i<numcopies; ++i) {
498     MachineInstrBuilder copy(F, copies[i]);
499
500     std::vector<MachineOperand> allOperands;
501     std::vector<bool> isDef;
502
503     for (unsigned j=0, e=copy->getNumOperands(); j!=e; ++j) {
504       MachineOperand oper = copy->getOperand(j);
505       allOperands.push_back(oper);
506       if (oper.isReg())
507         isDef.push_back(oper.isDef());
508       else
509         isDef.push_back(false);
510     }
511
512     for (unsigned j=0, e=copy->getNumOperands(); j!=e; ++j)
513       copy->RemoveOperand(0);
514
515     copy->setDesc(InstrInfo->get(getScalarVersion(Instr)));
516
517     for (unsigned j=0, e=allOperands.size(); j!=e; ++j) {
518       MachineOperand oper=allOperands[j];
519       if (oper.isReg()) {
520         unsigned regnum = oper.getReg();
521         if (isVectorRegister(regnum)) {
522
523           SmallVector<unsigned, 4> scalarRegs = getScalarRegisters(regnum);
524           copy.addReg(scalarRegs[i], getDefRegState(isDef[j]));
525         }
526         else
527           copy.addOperand(oper);
528       }
529       else
530         copy.addOperand(oper);
531     }
532   }
533 }
534
535 ///=============================================================================
536 ///Scan through all basic blocks, looking for vector instructions.
537 ///For each vector instruction I, insert the scalar copies before I, and
538 ///add I into toRemove vector. Finally remove all instructions in toRemove.
539 ///=============================================================================
540 void VectorElementize::elementize(MachineFunction &F) {
541   for (MachineFunction::reverse_iterator BI=F.rbegin(), BE=F.rend();
542       BI!=BE; ++BI) {
543     MachineBasicBlock *BB = &*BI;
544
545     std::vector<MachineInstr *> copies;
546     std::vector<MachineInstr *> toRemove;
547
548     for (MachineBasicBlock::iterator II=BB->begin(), IE=BB->end();
549         II!=IE; ++II) {
550       MachineInstr *Instr = &*II;
551
552       if (!isVectorInstr(Instr))
553         continue;
554
555       copies.clear();
556       createCopies(F, Instr, copies);
557       for (unsigned i=0, e=copies.size(); i!=e; ++i)
558         BB->insert(II, copies[i]);
559
560       assert((copies.size() > 0) && "Problem in createCopies");
561       toRemove.push_back(Instr);
562     }
563     for (unsigned i=0, e=toRemove.size(); i!=e; ++i)
564       F.DeleteMachineInstr(toRemove[i]->getParent()->remove(toRemove[i]));
565   }
566 }
567
568 ///=============================================================================
569 ///a <= b
570 ///...
571 ///...
572 ///x <= op(a, ...)
573 ///gets converted to
574 ///
575 ///x <= op(b, ...)
576 ///The original move is still present. This works on SSA form machine code.
577 ///Note that a <= b should be a simple vreg-to-vreg move instruction.
578 ///TBD : I didn't find a function that can do replaceOperand, so I remove
579 ///all operands and add all of them again, replacing the one while adding.
580 ///=============================================================================
581 unsigned VectorElementize::copyProp(MachineFunction &F) {
582   unsigned numReplacements = 0;
583
584   for (MachineFunction::reverse_iterator BI=F.rbegin(), BE=F.rend(); BI!=BE;
585       ++BI) {
586     MachineBasicBlock *BB = &*BI;
587
588     for (MachineBasicBlock::iterator II=BB->begin(), IE=BB->end(); II!=IE;
589         ++II) {
590       MachineInstr *Instr = &*II;
591
592       // Don't do copy propagation on PHI as it will cause unnecessary
593       // live range overlap.
594       if ((Instr->getOpcode() == TargetOpcode::PHI) ||
595           (Instr->getOpcode() == TargetOpcode::DBG_VALUE))
596         continue;
597
598       bool needsReplacement = false;
599
600       for (unsigned i=0, e=Instr->getNumOperands(); i!=e; ++i) {
601         MachineOperand oper = Instr->getOperand(i);
602         if (!oper.isReg()) continue;
603         if (oper.isDef()) continue;
604         if (!RegInfo->isVirtualRegister(oper.getReg())) continue;
605
606         MachineInstr *defInstr = MRI->getVRegDef(oper.getReg());
607
608         if (!defInstr) continue;
609
610         if (!isSimpleMove(defInstr)) continue;
611
612         MachineOperand defSrc = defInstr->getOperand(1);
613         if (!defSrc.isReg()) continue;
614         if (!RegInfo->isVirtualRegister(defSrc.getReg())) continue;
615
616         needsReplacement = true;
617
618       }
619       if (!needsReplacement) continue;
620
621       numReplacements++;
622
623       std::vector<MachineOperand> operands;
624
625       for (unsigned i=0, e=Instr->getNumOperands(); i!=e; ++i) {
626         MachineOperand oper = Instr->getOperand(i);
627         bool flag = false;
628         do {
629           if (!(oper.isReg()))
630             break;
631           if (oper.isDef())
632             break;
633           if (!(RegInfo->isVirtualRegister(oper.getReg())))
634             break;
635           MachineInstr *defInstr = MRI->getVRegDef(oper.getReg());
636           if (!(isSimpleMove(defInstr)))
637             break;
638           MachineOperand defSrc = defInstr->getOperand(1);
639           if (!(defSrc.isReg()))
640             break;
641           if (!(RegInfo->isVirtualRegister(defSrc.getReg())))
642             break;
643           operands.push_back(defSrc);
644           flag = true;
645         } while (0);
646         if (flag == false)
647           operands.push_back(oper);
648       }
649
650       for (unsigned i=0, e=Instr->getNumOperands(); i!=e; ++i)
651         Instr->RemoveOperand(0);
652       for (unsigned i=0, e=operands.size(); i!=e; ++i)
653         Instr->addOperand(F, operands[i]);
654
655     }
656   }
657   return numReplacements;
658 }
659
660 ///=============================================================================
661 ///Look for simple vreg-to-vreg instructions whose use_empty() is true, add
662 ///them to deadMoves vector. Then remove all instructions in deadMoves.
663 ///=============================================================================
664 unsigned VectorElementize::removeDeadMoves(MachineFunction &F) {
665   std::vector<MachineInstr *> deadMoves;
666   for (MachineFunction::reverse_iterator BI=F.rbegin(), BE=F.rend(); BI!=BE;
667       ++BI) {
668     MachineBasicBlock *BB = &*BI;
669
670     for (MachineBasicBlock::iterator II=BB->begin(), IE=BB->end(); II!=IE;
671         ++II) {
672       MachineInstr *Instr = &*II;
673
674       if (!isSimpleMove(Instr)) continue;
675
676       MachineOperand dest = Instr->getOperand(0);
677       assert(dest.isReg() && "dest of move not a register");
678       assert(RegInfo->isVirtualRegister(dest.getReg()) &&
679              "dest of move not a virtual register");
680
681       if (MRI->use_empty(dest.getReg())) {
682         deadMoves.push_back(Instr);
683       }
684     }
685   }
686
687   for (unsigned i=0, e=deadMoves.size(); i!=e; ++i)
688     F.DeleteMachineInstr(deadMoves[i]->getParent()->remove(deadMoves[i]));
689
690   return deadMoves.size();
691 }
692
693 ///=============================================================================
694 ///Main function for this pass.
695 ///=============================================================================
696 bool VectorElementize::runOnMachineFunction(MachineFunction &F) {
697   MRI = &F.getRegInfo();
698
699   RegInfo = TM.getRegisterInfo();
700   InstrInfo = TM.getInstrInfo();
701
702   VectorToScalarMap.clear();
703
704   elementize(F);
705
706   if (RemoveRedundantMoves)
707     while (1) {
708       if (copyProp(F) == 0) break;
709       removeDeadMoves(F);
710     }
711
712   return true;
713 }
714
715 FunctionPass *llvm::createVectorElementizePass(NVPTXTargetMachine &tm) {
716   return new VectorElementize(tm);
717 }
718
719 unsigned VectorElementize::getScalarVersion(unsigned opcode) {
720   if (opcode == NVPTX::PHI)
721     return opcode;
722   if (opcode == NVPTX::IMPLICIT_DEF)
723     return opcode;
724   switch(opcode) {
725   default: llvm_unreachable("Scalar version not set, fix NVPTXVector.td");
726   case TargetOpcode::COPY: return TargetOpcode::COPY;
727   case NVPTX::AddCCCV2I32: return NVPTX::ADDCCCi32rr;
728   case NVPTX::AddCCCV4I32: return NVPTX::ADDCCCi32rr;
729   case NVPTX::AddCCV2I32: return NVPTX::ADDCCi32rr;
730   case NVPTX::AddCCV4I32: return NVPTX::ADDCCi32rr;
731   case NVPTX::Build_Vector2_f32: return NVPTX::FMOV32rr;
732   case NVPTX::Build_Vector2_f64: return NVPTX::FMOV64rr;
733   case NVPTX::Build_Vector2_i16: return NVPTX::IMOV16rr;
734   case NVPTX::Build_Vector2_i32: return NVPTX::IMOV32rr;
735   case NVPTX::Build_Vector2_i64: return NVPTX::IMOV64rr;
736   case NVPTX::Build_Vector2_i8: return NVPTX::IMOV8rr;
737   case NVPTX::Build_Vector4_f32: return NVPTX::FMOV32rr;
738   case NVPTX::Build_Vector4_i16: return NVPTX::IMOV16rr;
739   case NVPTX::Build_Vector4_i32: return NVPTX::IMOV32rr;
740   case NVPTX::Build_Vector4_i8: return NVPTX::IMOV8rr;
741   case NVPTX::CVTv2i16tov2i32: return NVPTX::Zint_extendext16to32;
742   case NVPTX::CVTv2i64tov2i32: return NVPTX::TRUNC_64to32;
743   case NVPTX::CVTv2i8tov2i32: return NVPTX::Zint_extendext8to32;
744   case NVPTX::CVTv4i16tov4i32: return NVPTX::Zint_extendext16to32;
745   case NVPTX::CVTv4i8tov4i32: return NVPTX::Zint_extendext8to32;
746   case NVPTX::F32MAD_ftzV2: return NVPTX::FMAD32_ftzrrr;
747   case NVPTX::F32MADV2: return NVPTX::FMAD32rrr;
748   case NVPTX::F32MAD_ftzV4: return NVPTX::FMAD32_ftzrrr;
749   case NVPTX::F32MADV4: return NVPTX::FMAD32rrr;
750   case NVPTX::F32FMA_ftzV2: return NVPTX::FMA32_ftzrrr;
751   case NVPTX::F32FMAV2: return NVPTX::FMA32rrr;
752   case NVPTX::F32FMA_ftzV4: return NVPTX::FMA32_ftzrrr;
753   case NVPTX::F32FMAV4: return NVPTX::FMA32rrr;
754   case NVPTX::F64FMAV2: return NVPTX::FMA64rrr;
755   case NVPTX::FVecEQV2F32: return NVPTX::FSetEQf32rr_toi32;
756   case NVPTX::FVecEQV2F64: return NVPTX::FSetEQf64rr_toi64;
757   case NVPTX::FVecEQV4F32: return NVPTX::FSetEQf32rr_toi32;
758   case NVPTX::FVecGEV2F32: return NVPTX::FSetGEf32rr_toi32;
759   case NVPTX::FVecGEV2F64: return NVPTX::FSetGEf64rr_toi64;
760   case NVPTX::FVecGEV4F32: return NVPTX::FSetGEf32rr_toi32;
761   case NVPTX::FVecGTV2F32: return NVPTX::FSetGTf32rr_toi32;
762   case NVPTX::FVecGTV2F64: return NVPTX::FSetGTf64rr_toi64;
763   case NVPTX::FVecGTV4F32: return NVPTX::FSetGTf32rr_toi32;
764   case NVPTX::FVecLEV2F32: return NVPTX::FSetLEf32rr_toi32;
765   case NVPTX::FVecLEV2F64: return NVPTX::FSetLEf64rr_toi64;
766   case NVPTX::FVecLEV4F32: return NVPTX::FSetLEf32rr_toi32;
767   case NVPTX::FVecLTV2F32: return NVPTX::FSetLTf32rr_toi32;
768   case NVPTX::FVecLTV2F64: return NVPTX::FSetLTf64rr_toi64;
769   case NVPTX::FVecLTV4F32: return NVPTX::FSetLTf32rr_toi32;
770   case NVPTX::FVecNANV2F32: return NVPTX::FSetNANf32rr_toi32;
771   case NVPTX::FVecNANV2F64: return NVPTX::FSetNANf64rr_toi64;
772   case NVPTX::FVecNANV4F32: return NVPTX::FSetNANf32rr_toi32;
773   case NVPTX::FVecNEV2F32: return NVPTX::FSetNEf32rr_toi32;
774   case NVPTX::FVecNEV2F64: return NVPTX::FSetNEf64rr_toi64;
775   case NVPTX::FVecNEV4F32: return NVPTX::FSetNEf32rr_toi32;
776   case NVPTX::FVecNUMV2F32: return NVPTX::FSetNUMf32rr_toi32;
777   case NVPTX::FVecNUMV2F64: return NVPTX::FSetNUMf64rr_toi64;
778   case NVPTX::FVecNUMV4F32: return NVPTX::FSetNUMf32rr_toi32;
779   case NVPTX::FVecUEQV2F32: return NVPTX::FSetUEQf32rr_toi32;
780   case NVPTX::FVecUEQV2F64: return NVPTX::FSetUEQf64rr_toi64;
781   case NVPTX::FVecUEQV4F32: return NVPTX::FSetUEQf32rr_toi32;
782   case NVPTX::FVecUGEV2F32: return NVPTX::FSetUGEf32rr_toi32;
783   case NVPTX::FVecUGEV2F64: return NVPTX::FSetUGEf64rr_toi64;
784   case NVPTX::FVecUGEV4F32: return NVPTX::FSetUGEf32rr_toi32;
785   case NVPTX::FVecUGTV2F32: return NVPTX::FSetUGTf32rr_toi32;
786   case NVPTX::FVecUGTV2F64: return NVPTX::FSetUGTf64rr_toi64;
787   case NVPTX::FVecUGTV4F32: return NVPTX::FSetUGTf32rr_toi32;
788   case NVPTX::FVecULEV2F32: return NVPTX::FSetULEf32rr_toi32;
789   case NVPTX::FVecULEV2F64: return NVPTX::FSetULEf64rr_toi64;
790   case NVPTX::FVecULEV4F32: return NVPTX::FSetULEf32rr_toi32;
791   case NVPTX::FVecULTV2F32: return NVPTX::FSetULTf32rr_toi32;
792   case NVPTX::FVecULTV2F64: return NVPTX::FSetULTf64rr_toi64;
793   case NVPTX::FVecULTV4F32: return NVPTX::FSetULTf32rr_toi32;
794   case NVPTX::FVecUNEV2F32: return NVPTX::FSetUNEf32rr_toi32;
795   case NVPTX::FVecUNEV2F64: return NVPTX::FSetUNEf64rr_toi64;
796   case NVPTX::FVecUNEV4F32: return NVPTX::FSetUNEf32rr_toi32;
797   case NVPTX::I16MADV2: return NVPTX::MAD16rrr;
798   case NVPTX::I16MADV4: return NVPTX::MAD16rrr;
799   case NVPTX::I32MADV2: return NVPTX::MAD32rrr;
800   case NVPTX::I32MADV4: return NVPTX::MAD32rrr;
801   case NVPTX::I64MADV2: return NVPTX::MAD64rrr;
802   case NVPTX::I8MADV2: return NVPTX::MAD8rrr;
803   case NVPTX::I8MADV4: return NVPTX::MAD8rrr;
804   case NVPTX::ShiftLV2I16: return NVPTX::SHLi16rr;
805   case NVPTX::ShiftLV2I32: return NVPTX::SHLi32rr;
806   case NVPTX::ShiftLV2I64: return NVPTX::SHLi64rr;
807   case NVPTX::ShiftLV2I8: return NVPTX::SHLi8rr;
808   case NVPTX::ShiftLV4I16: return NVPTX::SHLi16rr;
809   case NVPTX::ShiftLV4I32: return NVPTX::SHLi32rr;
810   case NVPTX::ShiftLV4I8: return NVPTX::SHLi8rr;
811   case NVPTX::ShiftRAV2I16: return NVPTX::SRAi16rr;
812   case NVPTX::ShiftRAV2I32: return NVPTX::SRAi32rr;
813   case NVPTX::ShiftRAV2I64: return NVPTX::SRAi64rr;
814   case NVPTX::ShiftRAV2I8: return NVPTX::SRAi8rr;
815   case NVPTX::ShiftRAV4I16: return NVPTX::SRAi16rr;
816   case NVPTX::ShiftRAV4I32: return NVPTX::SRAi32rr;
817   case NVPTX::ShiftRAV4I8: return NVPTX::SRAi8rr;
818   case NVPTX::ShiftRLV2I16: return NVPTX::SRLi16rr;
819   case NVPTX::ShiftRLV2I32: return NVPTX::SRLi32rr;
820   case NVPTX::ShiftRLV2I64: return NVPTX::SRLi64rr;
821   case NVPTX::ShiftRLV2I8: return NVPTX::SRLi8rr;
822   case NVPTX::ShiftRLV4I16: return NVPTX::SRLi16rr;
823   case NVPTX::ShiftRLV4I32: return NVPTX::SRLi32rr;
824   case NVPTX::ShiftRLV4I8: return NVPTX::SRLi8rr;
825   case NVPTX::SubCCCV2I32: return NVPTX::SUBCCCi32rr;
826   case NVPTX::SubCCCV4I32: return NVPTX::SUBCCCi32rr;
827   case NVPTX::SubCCV2I32: return NVPTX::SUBCCi32rr;
828   case NVPTX::SubCCV4I32: return NVPTX::SUBCCi32rr;
829   case NVPTX::V2F32Div_prec_ftz: return NVPTX::FDIV32rr_prec_ftz;
830   case NVPTX::V2F32Div_prec: return NVPTX::FDIV32rr_prec;
831   case NVPTX::V2F32Div_ftz: return NVPTX::FDIV32rr_ftz;
832   case NVPTX::V2F32Div: return NVPTX::FDIV32rr;
833   case NVPTX::V2F32_Select: return NVPTX::SELECTf32rr;
834   case NVPTX::V2F64Div: return NVPTX::FDIV64rr;
835   case NVPTX::V2F64_Select: return NVPTX::SELECTf64rr;
836   case NVPTX::V2I16_Select: return NVPTX::SELECTi16rr;
837   case NVPTX::V2I32_Select: return NVPTX::SELECTi32rr;
838   case NVPTX::V2I64_Select: return NVPTX::SELECTi64rr;
839   case NVPTX::V2I8_Select: return NVPTX::SELECTi8rr;
840   case NVPTX::V2f32Extract: return NVPTX::FMOV32rr;
841   case NVPTX::V2f32Insert: return NVPTX::FMOV32rr;
842   case NVPTX::V2f32Mov: return NVPTX::FMOV32rr;
843   case NVPTX::V2f64Extract: return NVPTX::FMOV64rr;
844   case NVPTX::V2f64Insert: return NVPTX::FMOV64rr;
845   case NVPTX::V2f64Mov: return NVPTX::FMOV64rr;
846   case NVPTX::V2i16Extract: return NVPTX::IMOV16rr;
847   case NVPTX::V2i16Insert: return NVPTX::IMOV16rr;
848   case NVPTX::V2i16Mov: return NVPTX::IMOV16rr;
849   case NVPTX::V2i32Extract: return NVPTX::IMOV32rr;
850   case NVPTX::V2i32Insert: return NVPTX::IMOV32rr;
851   case NVPTX::V2i32Mov: return NVPTX::IMOV32rr;
852   case NVPTX::V2i64Extract: return NVPTX::IMOV64rr;
853   case NVPTX::V2i64Insert: return NVPTX::IMOV64rr;
854   case NVPTX::V2i64Mov: return NVPTX::IMOV64rr;
855   case NVPTX::V2i8Extract: return NVPTX::IMOV8rr;
856   case NVPTX::V2i8Insert: return NVPTX::IMOV8rr;
857   case NVPTX::V2i8Mov: return NVPTX::IMOV8rr;
858   case NVPTX::V4F32Div_prec_ftz: return NVPTX::FDIV32rr_prec_ftz;
859   case NVPTX::V4F32Div_prec: return NVPTX::FDIV32rr_prec;
860   case NVPTX::V4F32Div_ftz: return NVPTX::FDIV32rr_ftz;
861   case NVPTX::V4F32Div: return NVPTX::FDIV32rr;
862   case NVPTX::V4F32_Select: return NVPTX::SELECTf32rr;
863   case NVPTX::V4I16_Select: return NVPTX::SELECTi16rr;
864   case NVPTX::V4I32_Select: return NVPTX::SELECTi32rr;
865   case NVPTX::V4I8_Select: return NVPTX::SELECTi8rr;
866   case NVPTX::V4f32Extract: return NVPTX::FMOV32rr;
867   case NVPTX::V4f32Insert: return NVPTX::FMOV32rr;
868   case NVPTX::V4f32Mov: return NVPTX::FMOV32rr;
869   case NVPTX::V4i16Extract: return NVPTX::IMOV16rr;
870   case NVPTX::V4i16Insert: return NVPTX::IMOV16rr;
871   case NVPTX::V4i16Mov: return NVPTX::IMOV16rr;
872   case NVPTX::V4i32Extract: return NVPTX::IMOV32rr;
873   case NVPTX::V4i32Insert: return NVPTX::IMOV32rr;
874   case NVPTX::V4i32Mov: return NVPTX::IMOV32rr;
875   case NVPTX::V4i8Extract: return NVPTX::IMOV8rr;
876   case NVPTX::V4i8Insert: return NVPTX::IMOV8rr;
877   case NVPTX::V4i8Mov: return NVPTX::IMOV8rr;
878   case NVPTX::VAddV2I16: return NVPTX::ADDi16rr;
879   case NVPTX::VAddV2I32: return NVPTX::ADDi32rr;
880   case NVPTX::VAddV2I64: return NVPTX::ADDi64rr;
881   case NVPTX::VAddV2I8: return NVPTX::ADDi8rr;
882   case NVPTX::VAddV4I16: return NVPTX::ADDi16rr;
883   case NVPTX::VAddV4I32: return NVPTX::ADDi32rr;
884   case NVPTX::VAddV4I8: return NVPTX::ADDi8rr;
885   case NVPTX::VAddfV2F32: return NVPTX::FADDf32rr;
886   case NVPTX::VAddfV2F32_ftz: return NVPTX::FADDf32rr_ftz;
887   case NVPTX::VAddfV2F64: return NVPTX::FADDf64rr;
888   case NVPTX::VAddfV4F32: return NVPTX::FADDf32rr;
889   case NVPTX::VAddfV4F32_ftz: return NVPTX::FADDf32rr_ftz;
890   case NVPTX::VAndV2I16: return NVPTX::ANDb16rr;
891   case NVPTX::VAndV2I32: return NVPTX::ANDb32rr;
892   case NVPTX::VAndV2I64: return NVPTX::ANDb64rr;
893   case NVPTX::VAndV2I8: return NVPTX::ANDb8rr;
894   case NVPTX::VAndV4I16: return NVPTX::ANDb16rr;
895   case NVPTX::VAndV4I32: return NVPTX::ANDb32rr;
896   case NVPTX::VAndV4I8: return NVPTX::ANDb8rr;
897   case NVPTX::VMulfV2F32_ftz: return NVPTX::FMULf32rr_ftz;
898   case NVPTX::VMulfV2F32: return NVPTX::FMULf32rr;
899   case NVPTX::VMulfV2F64: return NVPTX::FMULf64rr;
900   case NVPTX::VMulfV4F32_ftz: return NVPTX::FMULf32rr_ftz;
901   case NVPTX::VMulfV4F32: return NVPTX::FMULf32rr;
902   case NVPTX::VMultHSV2I16: return NVPTX::MULTHSi16rr;
903   case NVPTX::VMultHSV2I32: return NVPTX::MULTHSi32rr;
904   case NVPTX::VMultHSV2I64: return NVPTX::MULTHSi64rr;
905   case NVPTX::VMultHSV2I8: return NVPTX::MULTHSi8rr;
906   case NVPTX::VMultHSV4I16: return NVPTX::MULTHSi16rr;
907   case NVPTX::VMultHSV4I32: return NVPTX::MULTHSi32rr;
908   case NVPTX::VMultHSV4I8: return NVPTX::MULTHSi8rr;
909   case NVPTX::VMultHUV2I16: return NVPTX::MULTHUi16rr;
910   case NVPTX::VMultHUV2I32: return NVPTX::MULTHUi32rr;
911   case NVPTX::VMultHUV2I64: return NVPTX::MULTHUi64rr;
912   case NVPTX::VMultHUV2I8: return NVPTX::MULTHUi8rr;
913   case NVPTX::VMultHUV4I16: return NVPTX::MULTHUi16rr;
914   case NVPTX::VMultHUV4I32: return NVPTX::MULTHUi32rr;
915   case NVPTX::VMultHUV4I8: return NVPTX::MULTHUi8rr;
916   case NVPTX::VMultV2I16: return NVPTX::MULTi16rr;
917   case NVPTX::VMultV2I32: return NVPTX::MULTi32rr;
918   case NVPTX::VMultV2I64: return NVPTX::MULTi64rr;
919   case NVPTX::VMultV2I8: return NVPTX::MULTi8rr;
920   case NVPTX::VMultV4I16: return NVPTX::MULTi16rr;
921   case NVPTX::VMultV4I32: return NVPTX::MULTi32rr;
922   case NVPTX::VMultV4I8: return NVPTX::MULTi8rr;
923   case NVPTX::VNegV2I16: return NVPTX::INEG16;
924   case NVPTX::VNegV2I32: return NVPTX::INEG32;
925   case NVPTX::VNegV2I64: return NVPTX::INEG64;
926   case NVPTX::VNegV2I8: return NVPTX::INEG8;
927   case NVPTX::VNegV4I16: return NVPTX::INEG16;
928   case NVPTX::VNegV4I32: return NVPTX::INEG32;
929   case NVPTX::VNegV4I8: return NVPTX::INEG8;
930   case NVPTX::VNegv2f32: return NVPTX::FNEGf32;
931   case NVPTX::VNegv2f32_ftz: return NVPTX::FNEGf32_ftz;
932   case NVPTX::VNegv2f64: return NVPTX::FNEGf64;
933   case NVPTX::VNegv4f32: return NVPTX::FNEGf32;
934   case NVPTX::VNegv4f32_ftz: return NVPTX::FNEGf32_ftz;
935   case NVPTX::VNotV2I16: return NVPTX::NOT16;
936   case NVPTX::VNotV2I32: return NVPTX::NOT32;
937   case NVPTX::VNotV2I64: return NVPTX::NOT64;
938   case NVPTX::VNotV2I8: return NVPTX::NOT8;
939   case NVPTX::VNotV4I16: return NVPTX::NOT16;
940   case NVPTX::VNotV4I32: return NVPTX::NOT32;
941   case NVPTX::VNotV4I8: return NVPTX::NOT8;
942   case NVPTX::VOrV2I16: return NVPTX::ORb16rr;
943   case NVPTX::VOrV2I32: return NVPTX::ORb32rr;
944   case NVPTX::VOrV2I64: return NVPTX::ORb64rr;
945   case NVPTX::VOrV2I8: return NVPTX::ORb8rr;
946   case NVPTX::VOrV4I16: return NVPTX::ORb16rr;
947   case NVPTX::VOrV4I32: return NVPTX::ORb32rr;
948   case NVPTX::VOrV4I8: return NVPTX::ORb8rr;
949   case NVPTX::VSDivV2I16: return NVPTX::SDIVi16rr;
950   case NVPTX::VSDivV2I32: return NVPTX::SDIVi32rr;
951   case NVPTX::VSDivV2I64: return NVPTX::SDIVi64rr;
952   case NVPTX::VSDivV2I8: return NVPTX::SDIVi8rr;
953   case NVPTX::VSDivV4I16: return NVPTX::SDIVi16rr;
954   case NVPTX::VSDivV4I32: return NVPTX::SDIVi32rr;
955   case NVPTX::VSDivV4I8: return NVPTX::SDIVi8rr;
956   case NVPTX::VSRemV2I16: return NVPTX::SREMi16rr;
957   case NVPTX::VSRemV2I32: return NVPTX::SREMi32rr;
958   case NVPTX::VSRemV2I64: return NVPTX::SREMi64rr;
959   case NVPTX::VSRemV2I8: return NVPTX::SREMi8rr;
960   case NVPTX::VSRemV4I16: return NVPTX::SREMi16rr;
961   case NVPTX::VSRemV4I32: return NVPTX::SREMi32rr;
962   case NVPTX::VSRemV4I8: return NVPTX::SREMi8rr;
963   case NVPTX::VSubV2I16: return NVPTX::SUBi16rr;
964   case NVPTX::VSubV2I32: return NVPTX::SUBi32rr;
965   case NVPTX::VSubV2I64: return NVPTX::SUBi64rr;
966   case NVPTX::VSubV2I8: return NVPTX::SUBi8rr;
967   case NVPTX::VSubV4I16: return NVPTX::SUBi16rr;
968   case NVPTX::VSubV4I32: return NVPTX::SUBi32rr;
969   case NVPTX::VSubV4I8: return NVPTX::SUBi8rr;
970   case NVPTX::VSubfV2F32_ftz: return NVPTX::FSUBf32rr_ftz;
971   case NVPTX::VSubfV2F32: return NVPTX::FSUBf32rr;
972   case NVPTX::VSubfV2F64: return NVPTX::FSUBf64rr;
973   case NVPTX::VSubfV4F32_ftz: return NVPTX::FSUBf32rr_ftz;
974   case NVPTX::VSubfV4F32: return NVPTX::FSUBf32rr;
975   case NVPTX::VUDivV2I16: return NVPTX::UDIVi16rr;
976   case NVPTX::VUDivV2I32: return NVPTX::UDIVi32rr;
977   case NVPTX::VUDivV2I64: return NVPTX::UDIVi64rr;
978   case NVPTX::VUDivV2I8: return NVPTX::UDIVi8rr;
979   case NVPTX::VUDivV4I16: return NVPTX::UDIVi16rr;
980   case NVPTX::VUDivV4I32: return NVPTX::UDIVi32rr;
981   case NVPTX::VUDivV4I8: return NVPTX::UDIVi8rr;
982   case NVPTX::VURemV2I16: return NVPTX::UREMi16rr;
983   case NVPTX::VURemV2I32: return NVPTX::UREMi32rr;
984   case NVPTX::VURemV2I64: return NVPTX::UREMi64rr;
985   case NVPTX::VURemV2I8: return NVPTX::UREMi8rr;
986   case NVPTX::VURemV4I16: return NVPTX::UREMi16rr;
987   case NVPTX::VURemV4I32: return NVPTX::UREMi32rr;
988   case NVPTX::VURemV4I8: return NVPTX::UREMi8rr;
989   case NVPTX::VXorV2I16: return NVPTX::XORb16rr;
990   case NVPTX::VXorV2I32: return NVPTX::XORb32rr;
991   case NVPTX::VXorV2I64: return NVPTX::XORb64rr;
992   case NVPTX::VXorV2I8: return NVPTX::XORb8rr;
993   case NVPTX::VXorV4I16: return NVPTX::XORb16rr;
994   case NVPTX::VXorV4I32: return NVPTX::XORb32rr;
995   case NVPTX::VXorV4I8: return NVPTX::XORb8rr;
996   case NVPTX::VecSEQV2I16: return NVPTX::ISetSEQi16rr_toi16;
997   case NVPTX::VecSEQV2I32: return NVPTX::ISetSEQi32rr_toi32;
998   case NVPTX::VecSEQV2I64: return NVPTX::ISetSEQi64rr_toi64;
999   case NVPTX::VecSEQV2I8: return NVPTX::ISetSEQi8rr_toi8;
1000   case NVPTX::VecSEQV4I16: return NVPTX::ISetSEQi16rr_toi16;
1001   case NVPTX::VecSEQV4I32: return NVPTX::ISetSEQi32rr_toi32;
1002   case NVPTX::VecSEQV4I8: return NVPTX::ISetSEQi8rr_toi8;
1003   case NVPTX::VecSGEV2I16: return NVPTX::ISetSGEi16rr_toi16;
1004   case NVPTX::VecSGEV2I32: return NVPTX::ISetSGEi32rr_toi32;
1005   case NVPTX::VecSGEV2I64: return NVPTX::ISetSGEi64rr_toi64;
1006   case NVPTX::VecSGEV2I8: return NVPTX::ISetSGEi8rr_toi8;
1007   case NVPTX::VecSGEV4I16: return NVPTX::ISetSGEi16rr_toi16;
1008   case NVPTX::VecSGEV4I32: return NVPTX::ISetSGEi32rr_toi32;
1009   case NVPTX::VecSGEV4I8: return NVPTX::ISetSGEi8rr_toi8;
1010   case NVPTX::VecSGTV2I16: return NVPTX::ISetSGTi16rr_toi16;
1011   case NVPTX::VecSGTV2I32: return NVPTX::ISetSGTi32rr_toi32;
1012   case NVPTX::VecSGTV2I64: return NVPTX::ISetSGTi64rr_toi64;
1013   case NVPTX::VecSGTV2I8: return NVPTX::ISetSGTi8rr_toi8;
1014   case NVPTX::VecSGTV4I16: return NVPTX::ISetSGTi16rr_toi16;
1015   case NVPTX::VecSGTV4I32: return NVPTX::ISetSGTi32rr_toi32;
1016   case NVPTX::VecSGTV4I8: return NVPTX::ISetSGTi8rr_toi8;
1017   case NVPTX::VecSLEV2I16: return NVPTX::ISetSLEi16rr_toi16;
1018   case NVPTX::VecSLEV2I32: return NVPTX::ISetSLEi32rr_toi32;
1019   case NVPTX::VecSLEV2I64: return NVPTX::ISetSLEi64rr_toi64;
1020   case NVPTX::VecSLEV2I8: return NVPTX::ISetSLEi8rr_toi8;
1021   case NVPTX::VecSLEV4I16: return NVPTX::ISetSLEi16rr_toi16;
1022   case NVPTX::VecSLEV4I32: return NVPTX::ISetSLEi32rr_toi32;
1023   case NVPTX::VecSLEV4I8: return NVPTX::ISetSLEi8rr_toi8;
1024   case NVPTX::VecSLTV2I16: return NVPTX::ISetSLTi16rr_toi16;
1025   case NVPTX::VecSLTV2I32: return NVPTX::ISetSLTi32rr_toi32;
1026   case NVPTX::VecSLTV2I64: return NVPTX::ISetSLTi64rr_toi64;
1027   case NVPTX::VecSLTV2I8: return NVPTX::ISetSLTi8rr_toi8;
1028   case NVPTX::VecSLTV4I16: return NVPTX::ISetSLTi16rr_toi16;
1029   case NVPTX::VecSLTV4I32: return NVPTX::ISetSLTi32rr_toi32;
1030   case NVPTX::VecSLTV4I8: return NVPTX::ISetSLTi8rr_toi8;
1031   case NVPTX::VecSNEV2I16: return NVPTX::ISetSNEi16rr_toi16;
1032   case NVPTX::VecSNEV2I32: return NVPTX::ISetSNEi32rr_toi32;
1033   case NVPTX::VecSNEV2I64: return NVPTX::ISetSNEi64rr_toi64;
1034   case NVPTX::VecSNEV2I8: return NVPTX::ISetSNEi8rr_toi8;
1035   case NVPTX::VecSNEV4I16: return NVPTX::ISetSNEi16rr_toi16;
1036   case NVPTX::VecSNEV4I32: return NVPTX::ISetSNEi32rr_toi32;
1037   case NVPTX::VecSNEV4I8: return NVPTX::ISetSNEi8rr_toi8;
1038   case NVPTX::VecShuffle_v2f32: return NVPTX::FMOV32rr;
1039   case NVPTX::VecShuffle_v2f64: return NVPTX::FMOV64rr;
1040   case NVPTX::VecShuffle_v2i16: return NVPTX::IMOV16rr;
1041   case NVPTX::VecShuffle_v2i32: return NVPTX::IMOV32rr;
1042   case NVPTX::VecShuffle_v2i64: return NVPTX::IMOV64rr;
1043   case NVPTX::VecShuffle_v2i8: return NVPTX::IMOV8rr;
1044   case NVPTX::VecShuffle_v4f32: return NVPTX::FMOV32rr;
1045   case NVPTX::VecShuffle_v4i16: return NVPTX::IMOV16rr;
1046   case NVPTX::VecShuffle_v4i32: return NVPTX::IMOV32rr;
1047   case NVPTX::VecShuffle_v4i8: return NVPTX::IMOV8rr;
1048   case NVPTX::VecUEQV2I16: return NVPTX::ISetUEQi16rr_toi16;
1049   case NVPTX::VecUEQV2I32: return NVPTX::ISetUEQi32rr_toi32;
1050   case NVPTX::VecUEQV2I64: return NVPTX::ISetUEQi64rr_toi64;
1051   case NVPTX::VecUEQV2I8: return NVPTX::ISetUEQi8rr_toi8;
1052   case NVPTX::VecUEQV4I16: return NVPTX::ISetUEQi16rr_toi16;
1053   case NVPTX::VecUEQV4I32: return NVPTX::ISetUEQi32rr_toi32;
1054   case NVPTX::VecUEQV4I8: return NVPTX::ISetUEQi8rr_toi8;
1055   case NVPTX::VecUGEV2I16: return NVPTX::ISetUGEi16rr_toi16;
1056   case NVPTX::VecUGEV2I32: return NVPTX::ISetUGEi32rr_toi32;
1057   case NVPTX::VecUGEV2I64: return NVPTX::ISetUGEi64rr_toi64;
1058   case NVPTX::VecUGEV2I8: return NVPTX::ISetUGEi8rr_toi8;
1059   case NVPTX::VecUGEV4I16: return NVPTX::ISetUGEi16rr_toi16;
1060   case NVPTX::VecUGEV4I32: return NVPTX::ISetUGEi32rr_toi32;
1061   case NVPTX::VecUGEV4I8: return NVPTX::ISetUGEi8rr_toi8;
1062   case NVPTX::VecUGTV2I16: return NVPTX::ISetUGTi16rr_toi16;
1063   case NVPTX::VecUGTV2I32: return NVPTX::ISetUGTi32rr_toi32;
1064   case NVPTX::VecUGTV2I64: return NVPTX::ISetUGTi64rr_toi64;
1065   case NVPTX::VecUGTV2I8: return NVPTX::ISetUGTi8rr_toi8;
1066   case NVPTX::VecUGTV4I16: return NVPTX::ISetUGTi16rr_toi16;
1067   case NVPTX::VecUGTV4I32: return NVPTX::ISetUGTi32rr_toi32;
1068   case NVPTX::VecUGTV4I8: return NVPTX::ISetUGTi8rr_toi8;
1069   case NVPTX::VecULEV2I16: return NVPTX::ISetULEi16rr_toi16;
1070   case NVPTX::VecULEV2I32: return NVPTX::ISetULEi32rr_toi32;
1071   case NVPTX::VecULEV2I64: return NVPTX::ISetULEi64rr_toi64;
1072   case NVPTX::VecULEV2I8: return NVPTX::ISetULEi8rr_toi8;
1073   case NVPTX::VecULEV4I16: return NVPTX::ISetULEi16rr_toi16;
1074   case NVPTX::VecULEV4I32: return NVPTX::ISetULEi32rr_toi32;
1075   case NVPTX::VecULEV4I8: return NVPTX::ISetULEi8rr_toi8;
1076   case NVPTX::VecULTV2I16: return NVPTX::ISetULTi16rr_toi16;
1077   case NVPTX::VecULTV2I32: return NVPTX::ISetULTi32rr_toi32;
1078   case NVPTX::VecULTV2I64: return NVPTX::ISetULTi64rr_toi64;
1079   case NVPTX::VecULTV2I8: return NVPTX::ISetULTi8rr_toi8;
1080   case NVPTX::VecULTV4I16: return NVPTX::ISetULTi16rr_toi16;
1081   case NVPTX::VecULTV4I32: return NVPTX::ISetULTi32rr_toi32;
1082   case NVPTX::VecULTV4I8: return NVPTX::ISetULTi8rr_toi8;
1083   case NVPTX::VecUNEV2I16: return NVPTX::ISetUNEi16rr_toi16;
1084   case NVPTX::VecUNEV2I32: return NVPTX::ISetUNEi32rr_toi32;
1085   case NVPTX::VecUNEV2I64: return NVPTX::ISetUNEi64rr_toi64;
1086   case NVPTX::VecUNEV2I8: return NVPTX::ISetUNEi8rr_toi8;
1087   case NVPTX::VecUNEV4I16: return NVPTX::ISetUNEi16rr_toi16;
1088   case NVPTX::VecUNEV4I32: return NVPTX::ISetUNEi32rr_toi32;
1089   case NVPTX::VecUNEV4I8: return NVPTX::ISetUNEi8rr_toi8;
1090   case NVPTX::INT_PTX_LDU_G_v2i8_32: return NVPTX::INT_PTX_LDU_G_v2i8_ELE_32;
1091   case NVPTX::INT_PTX_LDU_G_v4i8_32: return NVPTX::INT_PTX_LDU_G_v4i8_ELE_32;
1092   case NVPTX::INT_PTX_LDU_G_v2i16_32: return NVPTX::INT_PTX_LDU_G_v2i16_ELE_32;
1093   case NVPTX::INT_PTX_LDU_G_v4i16_32: return NVPTX::INT_PTX_LDU_G_v4i16_ELE_32;
1094   case NVPTX::INT_PTX_LDU_G_v2i32_32: return NVPTX::INT_PTX_LDU_G_v2i32_ELE_32;
1095   case NVPTX::INT_PTX_LDU_G_v4i32_32: return NVPTX::INT_PTX_LDU_G_v4i32_ELE_32;
1096   case NVPTX::INT_PTX_LDU_G_v2f32_32: return NVPTX::INT_PTX_LDU_G_v2f32_ELE_32;
1097   case NVPTX::INT_PTX_LDU_G_v4f32_32: return NVPTX::INT_PTX_LDU_G_v4f32_ELE_32;
1098   case NVPTX::INT_PTX_LDU_G_v2i64_32: return NVPTX::INT_PTX_LDU_G_v2i64_ELE_32;
1099   case NVPTX::INT_PTX_LDU_G_v2f64_32: return NVPTX::INT_PTX_LDU_G_v2f64_ELE_32;
1100   case NVPTX::INT_PTX_LDU_G_v2i8_64: return NVPTX::INT_PTX_LDU_G_v2i8_ELE_64;
1101   case NVPTX::INT_PTX_LDU_G_v4i8_64: return NVPTX::INT_PTX_LDU_G_v4i8_ELE_64;
1102   case NVPTX::INT_PTX_LDU_G_v2i16_64: return NVPTX::INT_PTX_LDU_G_v2i16_ELE_64;
1103   case NVPTX::INT_PTX_LDU_G_v4i16_64: return NVPTX::INT_PTX_LDU_G_v4i16_ELE_64;
1104   case NVPTX::INT_PTX_LDU_G_v2i32_64: return NVPTX::INT_PTX_LDU_G_v2i32_ELE_64;
1105   case NVPTX::INT_PTX_LDU_G_v4i32_64: return NVPTX::INT_PTX_LDU_G_v4i32_ELE_64;
1106   case NVPTX::INT_PTX_LDU_G_v2f32_64: return NVPTX::INT_PTX_LDU_G_v2f32_ELE_64;
1107   case NVPTX::INT_PTX_LDU_G_v4f32_64: return NVPTX::INT_PTX_LDU_G_v4f32_ELE_64;
1108   case NVPTX::INT_PTX_LDU_G_v2i64_64: return NVPTX::INT_PTX_LDU_G_v2i64_ELE_64;
1109   case NVPTX::INT_PTX_LDU_G_v2f64_64: return NVPTX::INT_PTX_LDU_G_v2f64_ELE_64;
1110
1111   case NVPTX::LoadParamV4I32: return NVPTX::LoadParamScalar4I32;
1112   case NVPTX::LoadParamV4I16: return NVPTX::LoadParamScalar4I16;
1113   case NVPTX::LoadParamV4I8: return NVPTX::LoadParamScalar4I8;
1114   case NVPTX::LoadParamV2I64: return NVPTX::LoadParamScalar2I64;
1115   case NVPTX::LoadParamV2I32: return NVPTX::LoadParamScalar2I32;
1116   case NVPTX::LoadParamV2I16: return NVPTX::LoadParamScalar2I16;
1117   case NVPTX::LoadParamV2I8: return NVPTX::LoadParamScalar2I8;
1118   case NVPTX::LoadParamV4F32: return NVPTX::LoadParamScalar4F32;
1119   case NVPTX::LoadParamV2F32: return NVPTX::LoadParamScalar2F32;
1120   case NVPTX::LoadParamV2F64: return NVPTX::LoadParamScalar2F64;
1121   case NVPTX::StoreParamV4I32: return NVPTX::StoreParamScalar4I32;
1122   case NVPTX::StoreParamV4I16: return NVPTX::StoreParamScalar4I16;
1123   case NVPTX::StoreParamV4I8: return NVPTX::StoreParamScalar4I8;
1124   case NVPTX::StoreParamV2I64: return NVPTX::StoreParamScalar2I64;
1125   case NVPTX::StoreParamV2I32: return NVPTX::StoreParamScalar2I32;
1126   case NVPTX::StoreParamV2I16: return NVPTX::StoreParamScalar2I16;
1127   case NVPTX::StoreParamV2I8: return NVPTX::StoreParamScalar2I8;
1128   case NVPTX::StoreParamV4F32: return NVPTX::StoreParamScalar4F32;
1129   case NVPTX::StoreParamV2F32: return NVPTX::StoreParamScalar2F32;
1130   case NVPTX::StoreParamV2F64: return NVPTX::StoreParamScalar2F64;
1131   case NVPTX::StoreRetvalV4I32: return NVPTX::StoreRetvalScalar4I32;
1132   case NVPTX::StoreRetvalV4I16: return NVPTX::StoreRetvalScalar4I16;
1133   case NVPTX::StoreRetvalV4I8: return NVPTX::StoreRetvalScalar4I8;
1134   case NVPTX::StoreRetvalV2I64: return NVPTX::StoreRetvalScalar2I64;
1135   case NVPTX::StoreRetvalV2I32: return NVPTX::StoreRetvalScalar2I32;
1136   case NVPTX::StoreRetvalV2I16: return NVPTX::StoreRetvalScalar2I16;
1137   case NVPTX::StoreRetvalV2I8: return NVPTX::StoreRetvalScalar2I8;
1138   case NVPTX::StoreRetvalV4F32: return NVPTX::StoreRetvalScalar4F32;
1139   case NVPTX::StoreRetvalV2F32: return NVPTX::StoreRetvalScalar2F32;
1140   case NVPTX::StoreRetvalV2F64: return NVPTX::StoreRetvalScalar2F64;
1141   case NVPTX::VecI32toV4I8: return NVPTX::I32toV4I8;
1142   case NVPTX::VecI64toV4I16: return NVPTX::I64toV4I16;
1143   case NVPTX::VecI16toV2I8: return NVPTX::I16toV2I8;
1144   case NVPTX::VecI32toV2I16: return NVPTX::I32toV2I16;
1145   case NVPTX::VecI64toV2I32: return NVPTX::I64toV2I32;
1146   case NVPTX::VecF64toV2F32: return NVPTX::F64toV2F32;
1147
1148   case NVPTX::LD_v2i8_avar: return NVPTX::LDV_i8_v2_avar;
1149   case NVPTX::LD_v2i8_areg: return NVPTX::LDV_i8_v2_areg;
1150   case NVPTX::LD_v2i8_ari:  return NVPTX::LDV_i8_v2_ari;
1151   case NVPTX::LD_v2i8_asi:  return NVPTX::LDV_i8_v2_asi;
1152   case NVPTX::LD_v4i8_avar: return NVPTX::LDV_i8_v4_avar;
1153   case NVPTX::LD_v4i8_areg: return NVPTX::LDV_i8_v4_areg;
1154   case NVPTX::LD_v4i8_ari:  return NVPTX::LDV_i8_v4_ari;
1155   case NVPTX::LD_v4i8_asi:  return NVPTX::LDV_i8_v4_asi;
1156
1157   case NVPTX::LD_v2i16_avar: return NVPTX::LDV_i16_v2_avar;
1158   case NVPTX::LD_v2i16_areg: return NVPTX::LDV_i16_v2_areg;
1159   case NVPTX::LD_v2i16_ari:  return NVPTX::LDV_i16_v2_ari;
1160   case NVPTX::LD_v2i16_asi:  return NVPTX::LDV_i16_v2_asi;
1161   case NVPTX::LD_v4i16_avar: return NVPTX::LDV_i16_v4_avar;
1162   case NVPTX::LD_v4i16_areg: return NVPTX::LDV_i16_v4_areg;
1163   case NVPTX::LD_v4i16_ari:  return NVPTX::LDV_i16_v4_ari;
1164   case NVPTX::LD_v4i16_asi:  return NVPTX::LDV_i16_v4_asi;
1165
1166   case NVPTX::LD_v2i32_avar: return NVPTX::LDV_i32_v2_avar;
1167   case NVPTX::LD_v2i32_areg: return NVPTX::LDV_i32_v2_areg;
1168   case NVPTX::LD_v2i32_ari:  return NVPTX::LDV_i32_v2_ari;
1169   case NVPTX::LD_v2i32_asi:  return NVPTX::LDV_i32_v2_asi;
1170   case NVPTX::LD_v4i32_avar: return NVPTX::LDV_i32_v4_avar;
1171   case NVPTX::LD_v4i32_areg: return NVPTX::LDV_i32_v4_areg;
1172   case NVPTX::LD_v4i32_ari:  return NVPTX::LDV_i32_v4_ari;
1173   case NVPTX::LD_v4i32_asi:  return NVPTX::LDV_i32_v4_asi;
1174
1175   case NVPTX::LD_v2f32_avar: return NVPTX::LDV_f32_v2_avar;
1176   case NVPTX::LD_v2f32_areg: return NVPTX::LDV_f32_v2_areg;
1177   case NVPTX::LD_v2f32_ari:  return NVPTX::LDV_f32_v2_ari;
1178   case NVPTX::LD_v2f32_asi:  return NVPTX::LDV_f32_v2_asi;
1179   case NVPTX::LD_v4f32_avar: return NVPTX::LDV_f32_v4_avar;
1180   case NVPTX::LD_v4f32_areg: return NVPTX::LDV_f32_v4_areg;
1181   case NVPTX::LD_v4f32_ari:  return NVPTX::LDV_f32_v4_ari;
1182   case NVPTX::LD_v4f32_asi:  return NVPTX::LDV_f32_v4_asi;
1183
1184   case NVPTX::LD_v2i64_avar: return NVPTX::LDV_i64_v2_avar;
1185   case NVPTX::LD_v2i64_areg: return NVPTX::LDV_i64_v2_areg;
1186   case NVPTX::LD_v2i64_ari:  return NVPTX::LDV_i64_v2_ari;
1187   case NVPTX::LD_v2i64_asi:  return NVPTX::LDV_i64_v2_asi;
1188   case NVPTX::LD_v2f64_avar: return NVPTX::LDV_f64_v2_avar;
1189   case NVPTX::LD_v2f64_areg: return NVPTX::LDV_f64_v2_areg;
1190   case NVPTX::LD_v2f64_ari:  return NVPTX::LDV_f64_v2_ari;
1191   case NVPTX::LD_v2f64_asi:  return NVPTX::LDV_f64_v2_asi;
1192
1193   case NVPTX::ST_v2i8_avar: return NVPTX::STV_i8_v2_avar;
1194   case NVPTX::ST_v2i8_areg: return NVPTX::STV_i8_v2_areg;
1195   case NVPTX::ST_v2i8_ari:  return NVPTX::STV_i8_v2_ari;
1196   case NVPTX::ST_v2i8_asi:  return NVPTX::STV_i8_v2_asi;
1197   case NVPTX::ST_v4i8_avar: return NVPTX::STV_i8_v4_avar;
1198   case NVPTX::ST_v4i8_areg: return NVPTX::STV_i8_v4_areg;
1199   case NVPTX::ST_v4i8_ari:  return NVPTX::STV_i8_v4_ari;
1200   case NVPTX::ST_v4i8_asi:  return NVPTX::STV_i8_v4_asi;
1201
1202   case NVPTX::ST_v2i16_avar: return NVPTX::STV_i16_v2_avar;
1203   case NVPTX::ST_v2i16_areg: return NVPTX::STV_i16_v2_areg;
1204   case NVPTX::ST_v2i16_ari:  return NVPTX::STV_i16_v2_ari;
1205   case NVPTX::ST_v2i16_asi:  return NVPTX::STV_i16_v2_asi;
1206   case NVPTX::ST_v4i16_avar: return NVPTX::STV_i16_v4_avar;
1207   case NVPTX::ST_v4i16_areg: return NVPTX::STV_i16_v4_areg;
1208   case NVPTX::ST_v4i16_ari:  return NVPTX::STV_i16_v4_ari;
1209   case NVPTX::ST_v4i16_asi:  return NVPTX::STV_i16_v4_asi;
1210
1211   case NVPTX::ST_v2i32_avar: return NVPTX::STV_i32_v2_avar;
1212   case NVPTX::ST_v2i32_areg: return NVPTX::STV_i32_v2_areg;
1213   case NVPTX::ST_v2i32_ari:  return NVPTX::STV_i32_v2_ari;
1214   case NVPTX::ST_v2i32_asi:  return NVPTX::STV_i32_v2_asi;
1215   case NVPTX::ST_v4i32_avar: return NVPTX::STV_i32_v4_avar;
1216   case NVPTX::ST_v4i32_areg: return NVPTX::STV_i32_v4_areg;
1217   case NVPTX::ST_v4i32_ari:  return NVPTX::STV_i32_v4_ari;
1218   case NVPTX::ST_v4i32_asi:  return NVPTX::STV_i32_v4_asi;
1219
1220   case NVPTX::ST_v2f32_avar: return NVPTX::STV_f32_v2_avar;
1221   case NVPTX::ST_v2f32_areg: return NVPTX::STV_f32_v2_areg;
1222   case NVPTX::ST_v2f32_ari:  return NVPTX::STV_f32_v2_ari;
1223   case NVPTX::ST_v2f32_asi:  return NVPTX::STV_f32_v2_asi;
1224   case NVPTX::ST_v4f32_avar: return NVPTX::STV_f32_v4_avar;
1225   case NVPTX::ST_v4f32_areg: return NVPTX::STV_f32_v4_areg;
1226   case NVPTX::ST_v4f32_ari:  return NVPTX::STV_f32_v4_ari;
1227   case NVPTX::ST_v4f32_asi:  return NVPTX::STV_f32_v4_asi;
1228
1229   case NVPTX::ST_v2i64_avar: return NVPTX::STV_i64_v2_avar;
1230   case NVPTX::ST_v2i64_areg: return NVPTX::STV_i64_v2_areg;
1231   case NVPTX::ST_v2i64_ari:  return NVPTX::STV_i64_v2_ari;
1232   case NVPTX::ST_v2i64_asi:  return NVPTX::STV_i64_v2_asi;
1233   case NVPTX::ST_v2f64_avar: return NVPTX::STV_f64_v2_avar;
1234   case NVPTX::ST_v2f64_areg: return NVPTX::STV_f64_v2_areg;
1235   case NVPTX::ST_v2f64_ari:  return NVPTX::STV_f64_v2_ari;
1236   case NVPTX::ST_v2f64_asi:  return NVPTX::STV_f64_v2_asi;
1237   }
1238   return 0;
1239 }