[NVPTX] Use approximate FP ops when unsafe-fp-math is used, and append
[oota-llvm.git] / lib / Target / NVPTX / NVPTXISelDAGToDAG.cpp
1 //===-- NVPTXISelDAGToDAG.cpp - A dag to dag inst selector for NVPTX ------===//
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 file defines an instruction selector for the NVPTX target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "NVPTXISelDAGToDAG.h"
15 #include "llvm/IR/GlobalValue.h"
16 #include "llvm/IR/Instructions.h"
17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/Debug.h"
19 #include "llvm/Support/ErrorHandling.h"
20 #include "llvm/Support/raw_ostream.h"
21 #include "llvm/Target/TargetIntrinsicInfo.h"
22
23 #undef DEBUG_TYPE
24 #define DEBUG_TYPE "nvptx-isel"
25
26 using namespace llvm;
27
28 static cl::opt<int>
29 FMAContractLevel("nvptx-fma-level", cl::ZeroOrMore,
30                  cl::desc("NVPTX Specific: FMA contraction (0: don't do it"
31                           " 1: do it  2: do it aggressively"),
32                  cl::init(2));
33
34 static cl::opt<int> UsePrecDivF32(
35     "nvptx-prec-divf32", cl::ZeroOrMore,
36     cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
37              " IEEE Compliant F32 div.rnd if avaiable."),
38     cl::init(2));
39
40 static cl::opt<bool>
41 UsePrecSqrtF32("nvptx-prec-sqrtf32",
42           cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
43           cl::init(true));
44
45 static cl::opt<bool>
46 FtzEnabled("nvptx-f32ftz", cl::ZeroOrMore,
47            cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
48            cl::init(false));
49
50
51 /// createNVPTXISelDag - This pass converts a legalized DAG into a
52 /// NVPTX-specific DAG, ready for instruction scheduling.
53 FunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
54                                        llvm::CodeGenOpt::Level OptLevel) {
55   return new NVPTXDAGToDAGISel(TM, OptLevel);
56 }
57
58 NVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
59                                      CodeGenOpt::Level OptLevel)
60     : SelectionDAGISel(tm, OptLevel),
61       Subtarget(tm.getSubtarget<NVPTXSubtarget>()) {
62
63   doFMAF32 = (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel >= 1);
64   doFMAF64 = (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel >= 1);
65   doFMAF32AGG =
66       (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel == 2);
67   doFMAF64AGG =
68       (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel == 2);
69
70   allowFMA = (FMAContractLevel >= 1);
71
72   doMulWide = (OptLevel > 0);
73 }
74
75 int NVPTXDAGToDAGISel::getDivF32Level() const {
76   if (UsePrecDivF32.getNumOccurrences() > 0) {
77     // If nvptx-prec-div32=N is used on the command-line, always honor it
78     return UsePrecDivF32;
79   } else {
80     // Otherwise, use div.approx if fast math is enabled
81     if (TM.Options.UnsafeFPMath)
82       return 0;
83     else
84       return 2;
85   }
86 }
87
88 bool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
89   if (UsePrecSqrtF32.getNumOccurrences() > 0) {
90     // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
91     return UsePrecSqrtF32;
92   } else {
93     // Otherwise, use sqrt.approx if fast math is enabled
94     if (TM.Options.UnsafeFPMath)
95       return false;
96     else
97       return true;
98   }
99 }
100
101 bool NVPTXDAGToDAGISel::useF32FTZ() const {
102   if (FtzEnabled.getNumOccurrences() > 0) {
103     // If nvptx-f32ftz is used on the command-line, always honor it
104     return FtzEnabled;
105   } else {
106     const Function *F = MF->getFunction();
107     // Otherwise, check for an nvptx-f32ftz attribute on the function
108     if (F->hasFnAttribute("nvptx-f32ftz"))
109       return (F->getAttributes().getAttribute(AttributeSet::FunctionIndex,
110                                               "nvptx-f32ftz")
111                                               .getValueAsString() == "true");
112     else
113       return false;
114   }
115 }
116
117 /// Select - Select instructions not customized! Used for
118 /// expanded, promoted and normal instructions.
119 SDNode *NVPTXDAGToDAGISel::Select(SDNode *N) {
120
121   if (N->isMachineOpcode())
122     return NULL; // Already selected.
123
124   SDNode *ResNode = NULL;
125   switch (N->getOpcode()) {
126   case ISD::LOAD:
127     ResNode = SelectLoad(N);
128     break;
129   case ISD::STORE:
130     ResNode = SelectStore(N);
131     break;
132   case NVPTXISD::LoadV2:
133   case NVPTXISD::LoadV4:
134     ResNode = SelectLoadVector(N);
135     break;
136   case NVPTXISD::LDGV2:
137   case NVPTXISD::LDGV4:
138   case NVPTXISD::LDUV2:
139   case NVPTXISD::LDUV4:
140     ResNode = SelectLDGLDUVector(N);
141     break;
142   case NVPTXISD::StoreV2:
143   case NVPTXISD::StoreV4:
144     ResNode = SelectStoreVector(N);
145     break;
146   case NVPTXISD::LoadParam:
147   case NVPTXISD::LoadParamV2:
148   case NVPTXISD::LoadParamV4:
149     ResNode = SelectLoadParam(N);
150     break;
151   case NVPTXISD::StoreRetval:
152   case NVPTXISD::StoreRetvalV2:
153   case NVPTXISD::StoreRetvalV4:
154     ResNode = SelectStoreRetval(N);
155     break;
156   case NVPTXISD::StoreParam:
157   case NVPTXISD::StoreParamV2:
158   case NVPTXISD::StoreParamV4:
159   case NVPTXISD::StoreParamS32:
160   case NVPTXISD::StoreParamU32:
161     ResNode = SelectStoreParam(N);
162     break;
163   default:
164     break;
165   }
166   if (ResNode)
167     return ResNode;
168   return SelectCode(N);
169 }
170
171 static unsigned int getCodeAddrSpace(MemSDNode *N,
172                                      const NVPTXSubtarget &Subtarget) {
173   const Value *Src = N->getSrcValue();
174
175   if (!Src)
176     return NVPTX::PTXLdStInstCode::GENERIC;
177
178   if (const PointerType *PT = dyn_cast<PointerType>(Src->getType())) {
179     switch (PT->getAddressSpace()) {
180     case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
181     case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
182     case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
183     case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
184     case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
185     case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
186     default: break;
187     }
188   }
189   return NVPTX::PTXLdStInstCode::GENERIC;
190 }
191
192 SDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N) {
193   SDLoc dl(N);
194   LoadSDNode *LD = cast<LoadSDNode>(N);
195   EVT LoadedVT = LD->getMemoryVT();
196   SDNode *NVPTXLD = NULL;
197
198   // do not support pre/post inc/dec
199   if (LD->isIndexed())
200     return NULL;
201
202   if (!LoadedVT.isSimple())
203     return NULL;
204
205   // Address Space Setting
206   unsigned int codeAddrSpace = getCodeAddrSpace(LD, Subtarget);
207
208   // Volatile Setting
209   // - .volatile is only availalble for .global and .shared
210   bool isVolatile = LD->isVolatile();
211   if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
212       codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
213       codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
214     isVolatile = false;
215
216   // Vector Setting
217   MVT SimpleVT = LoadedVT.getSimpleVT();
218   unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
219   if (SimpleVT.isVector()) {
220     unsigned num = SimpleVT.getVectorNumElements();
221     if (num == 2)
222       vecType = NVPTX::PTXLdStInstCode::V2;
223     else if (num == 4)
224       vecType = NVPTX::PTXLdStInstCode::V4;
225     else
226       return NULL;
227   }
228
229   // Type Setting: fromType + fromTypeWidth
230   //
231   // Sign   : ISD::SEXTLOAD
232   // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
233   //          type is integer
234   // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
235   MVT ScalarVT = SimpleVT.getScalarType();
236   // Read at least 8 bits (predicates are stored as 8-bit values)
237   unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
238   unsigned int fromType;
239   if ((LD->getExtensionType() == ISD::SEXTLOAD))
240     fromType = NVPTX::PTXLdStInstCode::Signed;
241   else if (ScalarVT.isFloatingPoint())
242     fromType = NVPTX::PTXLdStInstCode::Float;
243   else
244     fromType = NVPTX::PTXLdStInstCode::Unsigned;
245
246   // Create the machine instruction DAG
247   SDValue Chain = N->getOperand(0);
248   SDValue N1 = N->getOperand(1);
249   SDValue Addr;
250   SDValue Offset, Base;
251   unsigned Opcode;
252   MVT::SimpleValueType TargetVT = LD->getValueType(0).getSimpleVT().SimpleTy;
253
254   if (SelectDirectAddr(N1, Addr)) {
255     switch (TargetVT) {
256     case MVT::i8:
257       Opcode = NVPTX::LD_i8_avar;
258       break;
259     case MVT::i16:
260       Opcode = NVPTX::LD_i16_avar;
261       break;
262     case MVT::i32:
263       Opcode = NVPTX::LD_i32_avar;
264       break;
265     case MVT::i64:
266       Opcode = NVPTX::LD_i64_avar;
267       break;
268     case MVT::f32:
269       Opcode = NVPTX::LD_f32_avar;
270       break;
271     case MVT::f64:
272       Opcode = NVPTX::LD_f64_avar;
273       break;
274     default:
275       return NULL;
276     }
277     SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
278                       getI32Imm(vecType), getI32Imm(fromType),
279                       getI32Imm(fromTypeWidth), Addr, Chain };
280     NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
281   } else if (Subtarget.is64Bit()
282                  ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
283                  : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
284     switch (TargetVT) {
285     case MVT::i8:
286       Opcode = NVPTX::LD_i8_asi;
287       break;
288     case MVT::i16:
289       Opcode = NVPTX::LD_i16_asi;
290       break;
291     case MVT::i32:
292       Opcode = NVPTX::LD_i32_asi;
293       break;
294     case MVT::i64:
295       Opcode = NVPTX::LD_i64_asi;
296       break;
297     case MVT::f32:
298       Opcode = NVPTX::LD_f32_asi;
299       break;
300     case MVT::f64:
301       Opcode = NVPTX::LD_f64_asi;
302       break;
303     default:
304       return NULL;
305     }
306     SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
307                       getI32Imm(vecType), getI32Imm(fromType),
308                       getI32Imm(fromTypeWidth), Base, Offset, Chain };
309     NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
310   } else if (Subtarget.is64Bit()
311                  ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
312                  : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
313     if (Subtarget.is64Bit()) {
314       switch (TargetVT) {
315       case MVT::i8:
316         Opcode = NVPTX::LD_i8_ari_64;
317         break;
318       case MVT::i16:
319         Opcode = NVPTX::LD_i16_ari_64;
320         break;
321       case MVT::i32:
322         Opcode = NVPTX::LD_i32_ari_64;
323         break;
324       case MVT::i64:
325         Opcode = NVPTX::LD_i64_ari_64;
326         break;
327       case MVT::f32:
328         Opcode = NVPTX::LD_f32_ari_64;
329         break;
330       case MVT::f64:
331         Opcode = NVPTX::LD_f64_ari_64;
332         break;
333       default:
334         return NULL;
335       }
336     } else {
337       switch (TargetVT) {
338       case MVT::i8:
339         Opcode = NVPTX::LD_i8_ari;
340         break;
341       case MVT::i16:
342         Opcode = NVPTX::LD_i16_ari;
343         break;
344       case MVT::i32:
345         Opcode = NVPTX::LD_i32_ari;
346         break;
347       case MVT::i64:
348         Opcode = NVPTX::LD_i64_ari;
349         break;
350       case MVT::f32:
351         Opcode = NVPTX::LD_f32_ari;
352         break;
353       case MVT::f64:
354         Opcode = NVPTX::LD_f64_ari;
355         break;
356       default:
357         return NULL;
358       }
359     }
360     SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
361                       getI32Imm(vecType), getI32Imm(fromType),
362                       getI32Imm(fromTypeWidth), Base, Offset, Chain };
363     NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
364   } else {
365     if (Subtarget.is64Bit()) {
366       switch (TargetVT) {
367       case MVT::i8:
368         Opcode = NVPTX::LD_i8_areg_64;
369         break;
370       case MVT::i16:
371         Opcode = NVPTX::LD_i16_areg_64;
372         break;
373       case MVT::i32:
374         Opcode = NVPTX::LD_i32_areg_64;
375         break;
376       case MVT::i64:
377         Opcode = NVPTX::LD_i64_areg_64;
378         break;
379       case MVT::f32:
380         Opcode = NVPTX::LD_f32_areg_64;
381         break;
382       case MVT::f64:
383         Opcode = NVPTX::LD_f64_areg_64;
384         break;
385       default:
386         return NULL;
387       }
388     } else {
389       switch (TargetVT) {
390       case MVT::i8:
391         Opcode = NVPTX::LD_i8_areg;
392         break;
393       case MVT::i16:
394         Opcode = NVPTX::LD_i16_areg;
395         break;
396       case MVT::i32:
397         Opcode = NVPTX::LD_i32_areg;
398         break;
399       case MVT::i64:
400         Opcode = NVPTX::LD_i64_areg;
401         break;
402       case MVT::f32:
403         Opcode = NVPTX::LD_f32_areg;
404         break;
405       case MVT::f64:
406         Opcode = NVPTX::LD_f64_areg;
407         break;
408       default:
409         return NULL;
410       }
411     }
412     SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
413                       getI32Imm(vecType), getI32Imm(fromType),
414                       getI32Imm(fromTypeWidth), N1, Chain };
415     NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
416   }
417
418   if (NVPTXLD != NULL) {
419     MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
420     MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
421     cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
422   }
423
424   return NVPTXLD;
425 }
426
427 SDNode *NVPTXDAGToDAGISel::SelectLoadVector(SDNode *N) {
428
429   SDValue Chain = N->getOperand(0);
430   SDValue Op1 = N->getOperand(1);
431   SDValue Addr, Offset, Base;
432   unsigned Opcode;
433   SDLoc DL(N);
434   SDNode *LD;
435   MemSDNode *MemSD = cast<MemSDNode>(N);
436   EVT LoadedVT = MemSD->getMemoryVT();
437
438   if (!LoadedVT.isSimple())
439     return NULL;
440
441   // Address Space Setting
442   unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
443
444   // Volatile Setting
445   // - .volatile is only availalble for .global and .shared
446   bool IsVolatile = MemSD->isVolatile();
447   if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
448       CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
449       CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
450     IsVolatile = false;
451
452   // Vector Setting
453   MVT SimpleVT = LoadedVT.getSimpleVT();
454
455   // Type Setting: fromType + fromTypeWidth
456   //
457   // Sign   : ISD::SEXTLOAD
458   // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
459   //          type is integer
460   // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
461   MVT ScalarVT = SimpleVT.getScalarType();
462   // Read at least 8 bits (predicates are stored as 8-bit values)
463   unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
464   unsigned int FromType;
465   // The last operand holds the original LoadSDNode::getExtensionType() value
466   unsigned ExtensionType = cast<ConstantSDNode>(
467       N->getOperand(N->getNumOperands() - 1))->getZExtValue();
468   if (ExtensionType == ISD::SEXTLOAD)
469     FromType = NVPTX::PTXLdStInstCode::Signed;
470   else if (ScalarVT.isFloatingPoint())
471     FromType = NVPTX::PTXLdStInstCode::Float;
472   else
473     FromType = NVPTX::PTXLdStInstCode::Unsigned;
474
475   unsigned VecType;
476
477   switch (N->getOpcode()) {
478   case NVPTXISD::LoadV2:
479     VecType = NVPTX::PTXLdStInstCode::V2;
480     break;
481   case NVPTXISD::LoadV4:
482     VecType = NVPTX::PTXLdStInstCode::V4;
483     break;
484   default:
485     return NULL;
486   }
487
488   EVT EltVT = N->getValueType(0);
489
490   if (SelectDirectAddr(Op1, Addr)) {
491     switch (N->getOpcode()) {
492     default:
493       return NULL;
494     case NVPTXISD::LoadV2:
495       switch (EltVT.getSimpleVT().SimpleTy) {
496       default:
497         return NULL;
498       case MVT::i8:
499         Opcode = NVPTX::LDV_i8_v2_avar;
500         break;
501       case MVT::i16:
502         Opcode = NVPTX::LDV_i16_v2_avar;
503         break;
504       case MVT::i32:
505         Opcode = NVPTX::LDV_i32_v2_avar;
506         break;
507       case MVT::i64:
508         Opcode = NVPTX::LDV_i64_v2_avar;
509         break;
510       case MVT::f32:
511         Opcode = NVPTX::LDV_f32_v2_avar;
512         break;
513       case MVT::f64:
514         Opcode = NVPTX::LDV_f64_v2_avar;
515         break;
516       }
517       break;
518     case NVPTXISD::LoadV4:
519       switch (EltVT.getSimpleVT().SimpleTy) {
520       default:
521         return NULL;
522       case MVT::i8:
523         Opcode = NVPTX::LDV_i8_v4_avar;
524         break;
525       case MVT::i16:
526         Opcode = NVPTX::LDV_i16_v4_avar;
527         break;
528       case MVT::i32:
529         Opcode = NVPTX::LDV_i32_v4_avar;
530         break;
531       case MVT::f32:
532         Opcode = NVPTX::LDV_f32_v4_avar;
533         break;
534       }
535       break;
536     }
537
538     SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
539                       getI32Imm(VecType), getI32Imm(FromType),
540                       getI32Imm(FromTypeWidth), Addr, Chain };
541     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
542   } else if (Subtarget.is64Bit()
543                  ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
544                  : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
545     switch (N->getOpcode()) {
546     default:
547       return NULL;
548     case NVPTXISD::LoadV2:
549       switch (EltVT.getSimpleVT().SimpleTy) {
550       default:
551         return NULL;
552       case MVT::i8:
553         Opcode = NVPTX::LDV_i8_v2_asi;
554         break;
555       case MVT::i16:
556         Opcode = NVPTX::LDV_i16_v2_asi;
557         break;
558       case MVT::i32:
559         Opcode = NVPTX::LDV_i32_v2_asi;
560         break;
561       case MVT::i64:
562         Opcode = NVPTX::LDV_i64_v2_asi;
563         break;
564       case MVT::f32:
565         Opcode = NVPTX::LDV_f32_v2_asi;
566         break;
567       case MVT::f64:
568         Opcode = NVPTX::LDV_f64_v2_asi;
569         break;
570       }
571       break;
572     case NVPTXISD::LoadV4:
573       switch (EltVT.getSimpleVT().SimpleTy) {
574       default:
575         return NULL;
576       case MVT::i8:
577         Opcode = NVPTX::LDV_i8_v4_asi;
578         break;
579       case MVT::i16:
580         Opcode = NVPTX::LDV_i16_v4_asi;
581         break;
582       case MVT::i32:
583         Opcode = NVPTX::LDV_i32_v4_asi;
584         break;
585       case MVT::f32:
586         Opcode = NVPTX::LDV_f32_v4_asi;
587         break;
588       }
589       break;
590     }
591
592     SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
593                       getI32Imm(VecType), getI32Imm(FromType),
594                       getI32Imm(FromTypeWidth), Base, Offset, Chain };
595     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
596   } else if (Subtarget.is64Bit()
597                  ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
598                  : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
599     if (Subtarget.is64Bit()) {
600       switch (N->getOpcode()) {
601       default:
602         return NULL;
603       case NVPTXISD::LoadV2:
604         switch (EltVT.getSimpleVT().SimpleTy) {
605         default:
606           return NULL;
607         case MVT::i8:
608           Opcode = NVPTX::LDV_i8_v2_ari_64;
609           break;
610         case MVT::i16:
611           Opcode = NVPTX::LDV_i16_v2_ari_64;
612           break;
613         case MVT::i32:
614           Opcode = NVPTX::LDV_i32_v2_ari_64;
615           break;
616         case MVT::i64:
617           Opcode = NVPTX::LDV_i64_v2_ari_64;
618           break;
619         case MVT::f32:
620           Opcode = NVPTX::LDV_f32_v2_ari_64;
621           break;
622         case MVT::f64:
623           Opcode = NVPTX::LDV_f64_v2_ari_64;
624           break;
625         }
626         break;
627       case NVPTXISD::LoadV4:
628         switch (EltVT.getSimpleVT().SimpleTy) {
629         default:
630           return NULL;
631         case MVT::i8:
632           Opcode = NVPTX::LDV_i8_v4_ari_64;
633           break;
634         case MVT::i16:
635           Opcode = NVPTX::LDV_i16_v4_ari_64;
636           break;
637         case MVT::i32:
638           Opcode = NVPTX::LDV_i32_v4_ari_64;
639           break;
640         case MVT::f32:
641           Opcode = NVPTX::LDV_f32_v4_ari_64;
642           break;
643         }
644         break;
645       }
646     } else {
647       switch (N->getOpcode()) {
648       default:
649         return NULL;
650       case NVPTXISD::LoadV2:
651         switch (EltVT.getSimpleVT().SimpleTy) {
652         default:
653           return NULL;
654         case MVT::i8:
655           Opcode = NVPTX::LDV_i8_v2_ari;
656           break;
657         case MVT::i16:
658           Opcode = NVPTX::LDV_i16_v2_ari;
659           break;
660         case MVT::i32:
661           Opcode = NVPTX::LDV_i32_v2_ari;
662           break;
663         case MVT::i64:
664           Opcode = NVPTX::LDV_i64_v2_ari;
665           break;
666         case MVT::f32:
667           Opcode = NVPTX::LDV_f32_v2_ari;
668           break;
669         case MVT::f64:
670           Opcode = NVPTX::LDV_f64_v2_ari;
671           break;
672         }
673         break;
674       case NVPTXISD::LoadV4:
675         switch (EltVT.getSimpleVT().SimpleTy) {
676         default:
677           return NULL;
678         case MVT::i8:
679           Opcode = NVPTX::LDV_i8_v4_ari;
680           break;
681         case MVT::i16:
682           Opcode = NVPTX::LDV_i16_v4_ari;
683           break;
684         case MVT::i32:
685           Opcode = NVPTX::LDV_i32_v4_ari;
686           break;
687         case MVT::f32:
688           Opcode = NVPTX::LDV_f32_v4_ari;
689           break;
690         }
691         break;
692       }
693     }
694
695     SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
696                       getI32Imm(VecType), getI32Imm(FromType),
697                       getI32Imm(FromTypeWidth), Base, Offset, Chain };
698
699     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
700   } else {
701     if (Subtarget.is64Bit()) {
702       switch (N->getOpcode()) {
703       default:
704         return NULL;
705       case NVPTXISD::LoadV2:
706         switch (EltVT.getSimpleVT().SimpleTy) {
707         default:
708           return NULL;
709         case MVT::i8:
710           Opcode = NVPTX::LDV_i8_v2_areg_64;
711           break;
712         case MVT::i16:
713           Opcode = NVPTX::LDV_i16_v2_areg_64;
714           break;
715         case MVT::i32:
716           Opcode = NVPTX::LDV_i32_v2_areg_64;
717           break;
718         case MVT::i64:
719           Opcode = NVPTX::LDV_i64_v2_areg_64;
720           break;
721         case MVT::f32:
722           Opcode = NVPTX::LDV_f32_v2_areg_64;
723           break;
724         case MVT::f64:
725           Opcode = NVPTX::LDV_f64_v2_areg_64;
726           break;
727         }
728         break;
729       case NVPTXISD::LoadV4:
730         switch (EltVT.getSimpleVT().SimpleTy) {
731         default:
732           return NULL;
733         case MVT::i8:
734           Opcode = NVPTX::LDV_i8_v4_areg_64;
735           break;
736         case MVT::i16:
737           Opcode = NVPTX::LDV_i16_v4_areg_64;
738           break;
739         case MVT::i32:
740           Opcode = NVPTX::LDV_i32_v4_areg_64;
741           break;
742         case MVT::f32:
743           Opcode = NVPTX::LDV_f32_v4_areg_64;
744           break;
745         }
746         break;
747       }
748     } else {
749       switch (N->getOpcode()) {
750       default:
751         return NULL;
752       case NVPTXISD::LoadV2:
753         switch (EltVT.getSimpleVT().SimpleTy) {
754         default:
755           return NULL;
756         case MVT::i8:
757           Opcode = NVPTX::LDV_i8_v2_areg;
758           break;
759         case MVT::i16:
760           Opcode = NVPTX::LDV_i16_v2_areg;
761           break;
762         case MVT::i32:
763           Opcode = NVPTX::LDV_i32_v2_areg;
764           break;
765         case MVT::i64:
766           Opcode = NVPTX::LDV_i64_v2_areg;
767           break;
768         case MVT::f32:
769           Opcode = NVPTX::LDV_f32_v2_areg;
770           break;
771         case MVT::f64:
772           Opcode = NVPTX::LDV_f64_v2_areg;
773           break;
774         }
775         break;
776       case NVPTXISD::LoadV4:
777         switch (EltVT.getSimpleVT().SimpleTy) {
778         default:
779           return NULL;
780         case MVT::i8:
781           Opcode = NVPTX::LDV_i8_v4_areg;
782           break;
783         case MVT::i16:
784           Opcode = NVPTX::LDV_i16_v4_areg;
785           break;
786         case MVT::i32:
787           Opcode = NVPTX::LDV_i32_v4_areg;
788           break;
789         case MVT::f32:
790           Opcode = NVPTX::LDV_f32_v4_areg;
791           break;
792         }
793         break;
794       }
795     }
796
797     SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
798                       getI32Imm(VecType), getI32Imm(FromType),
799                       getI32Imm(FromTypeWidth), Op1, Chain };
800     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
801   }
802
803   MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
804   MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
805   cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
806
807   return LD;
808 }
809
810 SDNode *NVPTXDAGToDAGISel::SelectLDGLDUVector(SDNode *N) {
811
812   SDValue Chain = N->getOperand(0);
813   SDValue Op1 = N->getOperand(1);
814   unsigned Opcode;
815   SDLoc DL(N);
816   SDNode *LD;
817   MemSDNode *Mem = cast<MemSDNode>(N);
818   SDValue Base, Offset, Addr;
819
820   EVT EltVT = Mem->getMemoryVT().getVectorElementType();
821
822   if (SelectDirectAddr(Op1, Addr)) {
823     switch (N->getOpcode()) {
824     default:
825       return NULL;
826     case NVPTXISD::LDGV2:
827       switch (EltVT.getSimpleVT().SimpleTy) {
828       default:
829         return NULL;
830       case MVT::i8:
831         Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
832         break;
833       case MVT::i16:
834         Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
835         break;
836       case MVT::i32:
837         Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
838         break;
839       case MVT::i64:
840         Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
841         break;
842       case MVT::f32:
843         Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
844         break;
845       case MVT::f64:
846         Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
847         break;
848       }
849       break;
850     case NVPTXISD::LDUV2:
851       switch (EltVT.getSimpleVT().SimpleTy) {
852       default:
853         return NULL;
854       case MVT::i8:
855         Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
856         break;
857       case MVT::i16:
858         Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
859         break;
860       case MVT::i32:
861         Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
862         break;
863       case MVT::i64:
864         Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
865         break;
866       case MVT::f32:
867         Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
868         break;
869       case MVT::f64:
870         Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
871         break;
872       }
873       break;
874     case NVPTXISD::LDGV4:
875       switch (EltVT.getSimpleVT().SimpleTy) {
876       default:
877         return NULL;
878       case MVT::i8:
879         Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
880         break;
881       case MVT::i16:
882         Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
883         break;
884       case MVT::i32:
885         Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
886         break;
887       case MVT::f32:
888         Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
889         break;
890       }
891       break;
892     case NVPTXISD::LDUV4:
893       switch (EltVT.getSimpleVT().SimpleTy) {
894       default:
895         return NULL;
896       case MVT::i8:
897         Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
898         break;
899       case MVT::i16:
900         Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
901         break;
902       case MVT::i32:
903         Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
904         break;
905       case MVT::f32:
906         Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
907         break;
908       }
909       break;
910     }
911
912     SDValue Ops[] = { Addr, Chain };
913     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
914                                 ArrayRef<SDValue>(Ops, 2));
915   } else if (Subtarget.is64Bit()
916                  ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
917                  : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
918     if (Subtarget.is64Bit()) {
919       switch (N->getOpcode()) {
920       default:
921         return NULL;
922       case NVPTXISD::LDGV2:
923         switch (EltVT.getSimpleVT().SimpleTy) {
924         default:
925           return NULL;
926         case MVT::i8:
927           Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
928           break;
929         case MVT::i16:
930           Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
931           break;
932         case MVT::i32:
933           Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
934           break;
935         case MVT::i64:
936           Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
937           break;
938         case MVT::f32:
939           Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
940           break;
941         case MVT::f64:
942           Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
943           break;
944         }
945         break;
946       case NVPTXISD::LDUV2:
947         switch (EltVT.getSimpleVT().SimpleTy) {
948         default:
949           return NULL;
950         case MVT::i8:
951           Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
952           break;
953         case MVT::i16:
954           Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
955           break;
956         case MVT::i32:
957           Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
958           break;
959         case MVT::i64:
960           Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
961           break;
962         case MVT::f32:
963           Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
964           break;
965         case MVT::f64:
966           Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
967           break;
968         }
969         break;
970       case NVPTXISD::LDGV4:
971         switch (EltVT.getSimpleVT().SimpleTy) {
972         default:
973           return NULL;
974         case MVT::i8:
975           Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
976           break;
977         case MVT::i16:
978           Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
979           break;
980         case MVT::i32:
981           Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
982           break;
983         case MVT::f32:
984           Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
985           break;
986         }
987         break;
988       case NVPTXISD::LDUV4:
989         switch (EltVT.getSimpleVT().SimpleTy) {
990         default:
991           return NULL;
992         case MVT::i8:
993           Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
994           break;
995         case MVT::i16:
996           Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
997           break;
998         case MVT::i32:
999           Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1000           break;
1001         case MVT::f32:
1002           Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1003           break;
1004         }
1005         break;
1006       }
1007     } else {
1008       switch (N->getOpcode()) {
1009       default:
1010         return NULL;
1011       case NVPTXISD::LDGV2:
1012         switch (EltVT.getSimpleVT().SimpleTy) {
1013         default:
1014           return NULL;
1015         case MVT::i8:
1016           Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1017           break;
1018         case MVT::i16:
1019           Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1020           break;
1021         case MVT::i32:
1022           Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1023           break;
1024         case MVT::i64:
1025           Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1026           break;
1027         case MVT::f32:
1028           Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1029           break;
1030         case MVT::f64:
1031           Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1032           break;
1033         }
1034         break;
1035       case NVPTXISD::LDUV2:
1036         switch (EltVT.getSimpleVT().SimpleTy) {
1037         default:
1038           return NULL;
1039         case MVT::i8:
1040           Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1041           break;
1042         case MVT::i16:
1043           Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1044           break;
1045         case MVT::i32:
1046           Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1047           break;
1048         case MVT::i64:
1049           Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1050           break;
1051         case MVT::f32:
1052           Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1053           break;
1054         case MVT::f64:
1055           Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1056           break;
1057         }
1058         break;
1059       case NVPTXISD::LDGV4:
1060         switch (EltVT.getSimpleVT().SimpleTy) {
1061         default:
1062           return NULL;
1063         case MVT::i8:
1064           Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1065           break;
1066         case MVT::i16:
1067           Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1068           break;
1069         case MVT::i32:
1070           Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1071           break;
1072         case MVT::f32:
1073           Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1074           break;
1075         }
1076         break;
1077       case NVPTXISD::LDUV4:
1078         switch (EltVT.getSimpleVT().SimpleTy) {
1079         default:
1080           return NULL;
1081         case MVT::i8:
1082           Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1083           break;
1084         case MVT::i16:
1085           Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1086           break;
1087         case MVT::i32:
1088           Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1089           break;
1090         case MVT::f32:
1091           Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1092           break;
1093         }
1094         break;
1095       }
1096     }
1097
1098     SDValue Ops[] = { Base, Offset, Chain };
1099
1100     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
1101                                 ArrayRef<SDValue>(Ops, 3));
1102   } else {
1103     if (Subtarget.is64Bit()) {
1104       switch (N->getOpcode()) {
1105       default:
1106         return NULL;
1107       case NVPTXISD::LDGV2:
1108         switch (EltVT.getSimpleVT().SimpleTy) {
1109         default:
1110           return NULL;
1111         case MVT::i8:
1112           Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1113           break;
1114         case MVT::i16:
1115           Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1116           break;
1117         case MVT::i32:
1118           Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1119           break;
1120         case MVT::i64:
1121           Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1122           break;
1123         case MVT::f32:
1124           Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1125           break;
1126         case MVT::f64:
1127           Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1128           break;
1129         }
1130         break;
1131       case NVPTXISD::LDUV2:
1132         switch (EltVT.getSimpleVT().SimpleTy) {
1133         default:
1134           return NULL;
1135         case MVT::i8:
1136           Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1137           break;
1138         case MVT::i16:
1139           Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1140           break;
1141         case MVT::i32:
1142           Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1143           break;
1144         case MVT::i64:
1145           Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1146           break;
1147         case MVT::f32:
1148           Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1149           break;
1150         case MVT::f64:
1151           Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1152           break;
1153         }
1154         break;
1155       case NVPTXISD::LDGV4:
1156         switch (EltVT.getSimpleVT().SimpleTy) {
1157         default:
1158           return NULL;
1159         case MVT::i8:
1160           Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1161           break;
1162         case MVT::i16:
1163           Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1164           break;
1165         case MVT::i32:
1166           Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1167           break;
1168         case MVT::f32:
1169           Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1170           break;
1171         }
1172         break;
1173       case NVPTXISD::LDUV4:
1174         switch (EltVT.getSimpleVT().SimpleTy) {
1175         default:
1176           return NULL;
1177         case MVT::i8:
1178           Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1179           break;
1180         case MVT::i16:
1181           Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1182           break;
1183         case MVT::i32:
1184           Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1185           break;
1186         case MVT::f32:
1187           Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1188           break;
1189         }
1190         break;
1191       }
1192     } else {
1193       switch (N->getOpcode()) {
1194       default:
1195         return NULL;
1196       case NVPTXISD::LDGV2:
1197         switch (EltVT.getSimpleVT().SimpleTy) {
1198         default:
1199           return NULL;
1200         case MVT::i8:
1201           Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
1202           break;
1203         case MVT::i16:
1204           Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
1205           break;
1206         case MVT::i32:
1207           Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
1208           break;
1209         case MVT::i64:
1210           Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
1211           break;
1212         case MVT::f32:
1213           Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
1214           break;
1215         case MVT::f64:
1216           Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
1217           break;
1218         }
1219         break;
1220       case NVPTXISD::LDUV2:
1221         switch (EltVT.getSimpleVT().SimpleTy) {
1222         default:
1223           return NULL;
1224         case MVT::i8:
1225           Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
1226           break;
1227         case MVT::i16:
1228           Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
1229           break;
1230         case MVT::i32:
1231           Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
1232           break;
1233         case MVT::i64:
1234           Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
1235           break;
1236         case MVT::f32:
1237           Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
1238           break;
1239         case MVT::f64:
1240           Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
1241           break;
1242         }
1243         break;
1244       case NVPTXISD::LDGV4:
1245         switch (EltVT.getSimpleVT().SimpleTy) {
1246         default:
1247           return NULL;
1248         case MVT::i8:
1249           Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
1250           break;
1251         case MVT::i16:
1252           Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
1253           break;
1254         case MVT::i32:
1255           Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
1256           break;
1257         case MVT::f32:
1258           Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
1259           break;
1260         }
1261         break;
1262       case NVPTXISD::LDUV4:
1263         switch (EltVT.getSimpleVT().SimpleTy) {
1264         default:
1265           return NULL;
1266         case MVT::i8:
1267           Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
1268           break;
1269         case MVT::i16:
1270           Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
1271           break;
1272         case MVT::i32:
1273           Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
1274           break;
1275         case MVT::f32:
1276           Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
1277           break;
1278         }
1279         break;
1280       }
1281     }
1282
1283     SDValue Ops[] = { Op1, Chain };
1284     LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
1285                                 ArrayRef<SDValue>(Ops, 2));
1286   }
1287
1288   MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1289   MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1290   cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1291
1292   return LD;
1293 }
1294
1295 SDNode *NVPTXDAGToDAGISel::SelectStore(SDNode *N) {
1296   SDLoc dl(N);
1297   StoreSDNode *ST = cast<StoreSDNode>(N);
1298   EVT StoreVT = ST->getMemoryVT();
1299   SDNode *NVPTXST = NULL;
1300
1301   // do not support pre/post inc/dec
1302   if (ST->isIndexed())
1303     return NULL;
1304
1305   if (!StoreVT.isSimple())
1306     return NULL;
1307
1308   // Address Space Setting
1309   unsigned int codeAddrSpace = getCodeAddrSpace(ST, Subtarget);
1310
1311   // Volatile Setting
1312   // - .volatile is only availalble for .global and .shared
1313   bool isVolatile = ST->isVolatile();
1314   if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
1315       codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
1316       codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
1317     isVolatile = false;
1318
1319   // Vector Setting
1320   MVT SimpleVT = StoreVT.getSimpleVT();
1321   unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
1322   if (SimpleVT.isVector()) {
1323     unsigned num = SimpleVT.getVectorNumElements();
1324     if (num == 2)
1325       vecType = NVPTX::PTXLdStInstCode::V2;
1326     else if (num == 4)
1327       vecType = NVPTX::PTXLdStInstCode::V4;
1328     else
1329       return NULL;
1330   }
1331
1332   // Type Setting: toType + toTypeWidth
1333   // - for integer type, always use 'u'
1334   //
1335   MVT ScalarVT = SimpleVT.getScalarType();
1336   unsigned toTypeWidth = ScalarVT.getSizeInBits();
1337   unsigned int toType;
1338   if (ScalarVT.isFloatingPoint())
1339     toType = NVPTX::PTXLdStInstCode::Float;
1340   else
1341     toType = NVPTX::PTXLdStInstCode::Unsigned;
1342
1343   // Create the machine instruction DAG
1344   SDValue Chain = N->getOperand(0);
1345   SDValue N1 = N->getOperand(1);
1346   SDValue N2 = N->getOperand(2);
1347   SDValue Addr;
1348   SDValue Offset, Base;
1349   unsigned Opcode;
1350   MVT::SimpleValueType SourceVT =
1351       N1.getNode()->getValueType(0).getSimpleVT().SimpleTy;
1352
1353   if (SelectDirectAddr(N2, Addr)) {
1354     switch (SourceVT) {
1355     case MVT::i8:
1356       Opcode = NVPTX::ST_i8_avar;
1357       break;
1358     case MVT::i16:
1359       Opcode = NVPTX::ST_i16_avar;
1360       break;
1361     case MVT::i32:
1362       Opcode = NVPTX::ST_i32_avar;
1363       break;
1364     case MVT::i64:
1365       Opcode = NVPTX::ST_i64_avar;
1366       break;
1367     case MVT::f32:
1368       Opcode = NVPTX::ST_f32_avar;
1369       break;
1370     case MVT::f64:
1371       Opcode = NVPTX::ST_f64_avar;
1372       break;
1373     default:
1374       return NULL;
1375     }
1376     SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1377                       getI32Imm(vecType), getI32Imm(toType),
1378                       getI32Imm(toTypeWidth), Addr, Chain };
1379     NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1380   } else if (Subtarget.is64Bit()
1381                  ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
1382                  : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
1383     switch (SourceVT) {
1384     case MVT::i8:
1385       Opcode = NVPTX::ST_i8_asi;
1386       break;
1387     case MVT::i16:
1388       Opcode = NVPTX::ST_i16_asi;
1389       break;
1390     case MVT::i32:
1391       Opcode = NVPTX::ST_i32_asi;
1392       break;
1393     case MVT::i64:
1394       Opcode = NVPTX::ST_i64_asi;
1395       break;
1396     case MVT::f32:
1397       Opcode = NVPTX::ST_f32_asi;
1398       break;
1399     case MVT::f64:
1400       Opcode = NVPTX::ST_f64_asi;
1401       break;
1402     default:
1403       return NULL;
1404     }
1405     SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1406                       getI32Imm(vecType), getI32Imm(toType),
1407                       getI32Imm(toTypeWidth), Base, Offset, Chain };
1408     NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1409   } else if (Subtarget.is64Bit()
1410                  ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
1411                  : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
1412     if (Subtarget.is64Bit()) {
1413       switch (SourceVT) {
1414       case MVT::i8:
1415         Opcode = NVPTX::ST_i8_ari_64;
1416         break;
1417       case MVT::i16:
1418         Opcode = NVPTX::ST_i16_ari_64;
1419         break;
1420       case MVT::i32:
1421         Opcode = NVPTX::ST_i32_ari_64;
1422         break;
1423       case MVT::i64:
1424         Opcode = NVPTX::ST_i64_ari_64;
1425         break;
1426       case MVT::f32:
1427         Opcode = NVPTX::ST_f32_ari_64;
1428         break;
1429       case MVT::f64:
1430         Opcode = NVPTX::ST_f64_ari_64;
1431         break;
1432       default:
1433         return NULL;
1434       }
1435     } else {
1436       switch (SourceVT) {
1437       case MVT::i8:
1438         Opcode = NVPTX::ST_i8_ari;
1439         break;
1440       case MVT::i16:
1441         Opcode = NVPTX::ST_i16_ari;
1442         break;
1443       case MVT::i32:
1444         Opcode = NVPTX::ST_i32_ari;
1445         break;
1446       case MVT::i64:
1447         Opcode = NVPTX::ST_i64_ari;
1448         break;
1449       case MVT::f32:
1450         Opcode = NVPTX::ST_f32_ari;
1451         break;
1452       case MVT::f64:
1453         Opcode = NVPTX::ST_f64_ari;
1454         break;
1455       default:
1456         return NULL;
1457       }
1458     }
1459     SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1460                       getI32Imm(vecType), getI32Imm(toType),
1461                       getI32Imm(toTypeWidth), Base, Offset, Chain };
1462     NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1463   } else {
1464     if (Subtarget.is64Bit()) {
1465       switch (SourceVT) {
1466       case MVT::i8:
1467         Opcode = NVPTX::ST_i8_areg_64;
1468         break;
1469       case MVT::i16:
1470         Opcode = NVPTX::ST_i16_areg_64;
1471         break;
1472       case MVT::i32:
1473         Opcode = NVPTX::ST_i32_areg_64;
1474         break;
1475       case MVT::i64:
1476         Opcode = NVPTX::ST_i64_areg_64;
1477         break;
1478       case MVT::f32:
1479         Opcode = NVPTX::ST_f32_areg_64;
1480         break;
1481       case MVT::f64:
1482         Opcode = NVPTX::ST_f64_areg_64;
1483         break;
1484       default:
1485         return NULL;
1486       }
1487     } else {
1488       switch (SourceVT) {
1489       case MVT::i8:
1490         Opcode = NVPTX::ST_i8_areg;
1491         break;
1492       case MVT::i16:
1493         Opcode = NVPTX::ST_i16_areg;
1494         break;
1495       case MVT::i32:
1496         Opcode = NVPTX::ST_i32_areg;
1497         break;
1498       case MVT::i64:
1499         Opcode = NVPTX::ST_i64_areg;
1500         break;
1501       case MVT::f32:
1502         Opcode = NVPTX::ST_f32_areg;
1503         break;
1504       case MVT::f64:
1505         Opcode = NVPTX::ST_f64_areg;
1506         break;
1507       default:
1508         return NULL;
1509       }
1510     }
1511     SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1512                       getI32Imm(vecType), getI32Imm(toType),
1513                       getI32Imm(toTypeWidth), N2, Chain };
1514     NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1515   }
1516
1517   if (NVPTXST != NULL) {
1518     MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1519     MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1520     cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
1521   }
1522
1523   return NVPTXST;
1524 }
1525
1526 SDNode *NVPTXDAGToDAGISel::SelectStoreVector(SDNode *N) {
1527   SDValue Chain = N->getOperand(0);
1528   SDValue Op1 = N->getOperand(1);
1529   SDValue Addr, Offset, Base;
1530   unsigned Opcode;
1531   SDLoc DL(N);
1532   SDNode *ST;
1533   EVT EltVT = Op1.getValueType();
1534   MemSDNode *MemSD = cast<MemSDNode>(N);
1535   EVT StoreVT = MemSD->getMemoryVT();
1536
1537   // Address Space Setting
1538   unsigned CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
1539
1540   if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
1541     report_fatal_error("Cannot store to pointer that points to constant "
1542                        "memory space");
1543   }
1544
1545   // Volatile Setting
1546   // - .volatile is only availalble for .global and .shared
1547   bool IsVolatile = MemSD->isVolatile();
1548   if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
1549       CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
1550       CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
1551     IsVolatile = false;
1552
1553   // Type Setting: toType + toTypeWidth
1554   // - for integer type, always use 'u'
1555   assert(StoreVT.isSimple() && "Store value is not simple");
1556   MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
1557   unsigned ToTypeWidth = ScalarVT.getSizeInBits();
1558   unsigned ToType;
1559   if (ScalarVT.isFloatingPoint())
1560     ToType = NVPTX::PTXLdStInstCode::Float;
1561   else
1562     ToType = NVPTX::PTXLdStInstCode::Unsigned;
1563
1564   SmallVector<SDValue, 12> StOps;
1565   SDValue N2;
1566   unsigned VecType;
1567
1568   switch (N->getOpcode()) {
1569   case NVPTXISD::StoreV2:
1570     VecType = NVPTX::PTXLdStInstCode::V2;
1571     StOps.push_back(N->getOperand(1));
1572     StOps.push_back(N->getOperand(2));
1573     N2 = N->getOperand(3);
1574     break;
1575   case NVPTXISD::StoreV4:
1576     VecType = NVPTX::PTXLdStInstCode::V4;
1577     StOps.push_back(N->getOperand(1));
1578     StOps.push_back(N->getOperand(2));
1579     StOps.push_back(N->getOperand(3));
1580     StOps.push_back(N->getOperand(4));
1581     N2 = N->getOperand(5);
1582     break;
1583   default:
1584     return NULL;
1585   }
1586
1587   StOps.push_back(getI32Imm(IsVolatile));
1588   StOps.push_back(getI32Imm(CodeAddrSpace));
1589   StOps.push_back(getI32Imm(VecType));
1590   StOps.push_back(getI32Imm(ToType));
1591   StOps.push_back(getI32Imm(ToTypeWidth));
1592
1593   if (SelectDirectAddr(N2, Addr)) {
1594     switch (N->getOpcode()) {
1595     default:
1596       return NULL;
1597     case NVPTXISD::StoreV2:
1598       switch (EltVT.getSimpleVT().SimpleTy) {
1599       default:
1600         return NULL;
1601       case MVT::i8:
1602         Opcode = NVPTX::STV_i8_v2_avar;
1603         break;
1604       case MVT::i16:
1605         Opcode = NVPTX::STV_i16_v2_avar;
1606         break;
1607       case MVT::i32:
1608         Opcode = NVPTX::STV_i32_v2_avar;
1609         break;
1610       case MVT::i64:
1611         Opcode = NVPTX::STV_i64_v2_avar;
1612         break;
1613       case MVT::f32:
1614         Opcode = NVPTX::STV_f32_v2_avar;
1615         break;
1616       case MVT::f64:
1617         Opcode = NVPTX::STV_f64_v2_avar;
1618         break;
1619       }
1620       break;
1621     case NVPTXISD::StoreV4:
1622       switch (EltVT.getSimpleVT().SimpleTy) {
1623       default:
1624         return NULL;
1625       case MVT::i8:
1626         Opcode = NVPTX::STV_i8_v4_avar;
1627         break;
1628       case MVT::i16:
1629         Opcode = NVPTX::STV_i16_v4_avar;
1630         break;
1631       case MVT::i32:
1632         Opcode = NVPTX::STV_i32_v4_avar;
1633         break;
1634       case MVT::f32:
1635         Opcode = NVPTX::STV_f32_v4_avar;
1636         break;
1637       }
1638       break;
1639     }
1640     StOps.push_back(Addr);
1641   } else if (Subtarget.is64Bit()
1642                  ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
1643                  : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
1644     switch (N->getOpcode()) {
1645     default:
1646       return NULL;
1647     case NVPTXISD::StoreV2:
1648       switch (EltVT.getSimpleVT().SimpleTy) {
1649       default:
1650         return NULL;
1651       case MVT::i8:
1652         Opcode = NVPTX::STV_i8_v2_asi;
1653         break;
1654       case MVT::i16:
1655         Opcode = NVPTX::STV_i16_v2_asi;
1656         break;
1657       case MVT::i32:
1658         Opcode = NVPTX::STV_i32_v2_asi;
1659         break;
1660       case MVT::i64:
1661         Opcode = NVPTX::STV_i64_v2_asi;
1662         break;
1663       case MVT::f32:
1664         Opcode = NVPTX::STV_f32_v2_asi;
1665         break;
1666       case MVT::f64:
1667         Opcode = NVPTX::STV_f64_v2_asi;
1668         break;
1669       }
1670       break;
1671     case NVPTXISD::StoreV4:
1672       switch (EltVT.getSimpleVT().SimpleTy) {
1673       default:
1674         return NULL;
1675       case MVT::i8:
1676         Opcode = NVPTX::STV_i8_v4_asi;
1677         break;
1678       case MVT::i16:
1679         Opcode = NVPTX::STV_i16_v4_asi;
1680         break;
1681       case MVT::i32:
1682         Opcode = NVPTX::STV_i32_v4_asi;
1683         break;
1684       case MVT::f32:
1685         Opcode = NVPTX::STV_f32_v4_asi;
1686         break;
1687       }
1688       break;
1689     }
1690     StOps.push_back(Base);
1691     StOps.push_back(Offset);
1692   } else if (Subtarget.is64Bit()
1693                  ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
1694                  : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
1695     if (Subtarget.is64Bit()) {
1696       switch (N->getOpcode()) {
1697       default:
1698         return NULL;
1699       case NVPTXISD::StoreV2:
1700         switch (EltVT.getSimpleVT().SimpleTy) {
1701         default:
1702           return NULL;
1703         case MVT::i8:
1704           Opcode = NVPTX::STV_i8_v2_ari_64;
1705           break;
1706         case MVT::i16:
1707           Opcode = NVPTX::STV_i16_v2_ari_64;
1708           break;
1709         case MVT::i32:
1710           Opcode = NVPTX::STV_i32_v2_ari_64;
1711           break;
1712         case MVT::i64:
1713           Opcode = NVPTX::STV_i64_v2_ari_64;
1714           break;
1715         case MVT::f32:
1716           Opcode = NVPTX::STV_f32_v2_ari_64;
1717           break;
1718         case MVT::f64:
1719           Opcode = NVPTX::STV_f64_v2_ari_64;
1720           break;
1721         }
1722         break;
1723       case NVPTXISD::StoreV4:
1724         switch (EltVT.getSimpleVT().SimpleTy) {
1725         default:
1726           return NULL;
1727         case MVT::i8:
1728           Opcode = NVPTX::STV_i8_v4_ari_64;
1729           break;
1730         case MVT::i16:
1731           Opcode = NVPTX::STV_i16_v4_ari_64;
1732           break;
1733         case MVT::i32:
1734           Opcode = NVPTX::STV_i32_v4_ari_64;
1735           break;
1736         case MVT::f32:
1737           Opcode = NVPTX::STV_f32_v4_ari_64;
1738           break;
1739         }
1740         break;
1741       }
1742     } else {
1743       switch (N->getOpcode()) {
1744       default:
1745         return NULL;
1746       case NVPTXISD::StoreV2:
1747         switch (EltVT.getSimpleVT().SimpleTy) {
1748         default:
1749           return NULL;
1750         case MVT::i8:
1751           Opcode = NVPTX::STV_i8_v2_ari;
1752           break;
1753         case MVT::i16:
1754           Opcode = NVPTX::STV_i16_v2_ari;
1755           break;
1756         case MVT::i32:
1757           Opcode = NVPTX::STV_i32_v2_ari;
1758           break;
1759         case MVT::i64:
1760           Opcode = NVPTX::STV_i64_v2_ari;
1761           break;
1762         case MVT::f32:
1763           Opcode = NVPTX::STV_f32_v2_ari;
1764           break;
1765         case MVT::f64:
1766           Opcode = NVPTX::STV_f64_v2_ari;
1767           break;
1768         }
1769         break;
1770       case NVPTXISD::StoreV4:
1771         switch (EltVT.getSimpleVT().SimpleTy) {
1772         default:
1773           return NULL;
1774         case MVT::i8:
1775           Opcode = NVPTX::STV_i8_v4_ari;
1776           break;
1777         case MVT::i16:
1778           Opcode = NVPTX::STV_i16_v4_ari;
1779           break;
1780         case MVT::i32:
1781           Opcode = NVPTX::STV_i32_v4_ari;
1782           break;
1783         case MVT::f32:
1784           Opcode = NVPTX::STV_f32_v4_ari;
1785           break;
1786         }
1787         break;
1788       }
1789     }
1790     StOps.push_back(Base);
1791     StOps.push_back(Offset);
1792   } else {
1793     if (Subtarget.is64Bit()) {
1794       switch (N->getOpcode()) {
1795       default:
1796         return NULL;
1797       case NVPTXISD::StoreV2:
1798         switch (EltVT.getSimpleVT().SimpleTy) {
1799         default:
1800           return NULL;
1801         case MVT::i8:
1802           Opcode = NVPTX::STV_i8_v2_areg_64;
1803           break;
1804         case MVT::i16:
1805           Opcode = NVPTX::STV_i16_v2_areg_64;
1806           break;
1807         case MVT::i32:
1808           Opcode = NVPTX::STV_i32_v2_areg_64;
1809           break;
1810         case MVT::i64:
1811           Opcode = NVPTX::STV_i64_v2_areg_64;
1812           break;
1813         case MVT::f32:
1814           Opcode = NVPTX::STV_f32_v2_areg_64;
1815           break;
1816         case MVT::f64:
1817           Opcode = NVPTX::STV_f64_v2_areg_64;
1818           break;
1819         }
1820         break;
1821       case NVPTXISD::StoreV4:
1822         switch (EltVT.getSimpleVT().SimpleTy) {
1823         default:
1824           return NULL;
1825         case MVT::i8:
1826           Opcode = NVPTX::STV_i8_v4_areg_64;
1827           break;
1828         case MVT::i16:
1829           Opcode = NVPTX::STV_i16_v4_areg_64;
1830           break;
1831         case MVT::i32:
1832           Opcode = NVPTX::STV_i32_v4_areg_64;
1833           break;
1834         case MVT::f32:
1835           Opcode = NVPTX::STV_f32_v4_areg_64;
1836           break;
1837         }
1838         break;
1839       }
1840     } else {
1841       switch (N->getOpcode()) {
1842       default:
1843         return NULL;
1844       case NVPTXISD::StoreV2:
1845         switch (EltVT.getSimpleVT().SimpleTy) {
1846         default:
1847           return NULL;
1848         case MVT::i8:
1849           Opcode = NVPTX::STV_i8_v2_areg;
1850           break;
1851         case MVT::i16:
1852           Opcode = NVPTX::STV_i16_v2_areg;
1853           break;
1854         case MVT::i32:
1855           Opcode = NVPTX::STV_i32_v2_areg;
1856           break;
1857         case MVT::i64:
1858           Opcode = NVPTX::STV_i64_v2_areg;
1859           break;
1860         case MVT::f32:
1861           Opcode = NVPTX::STV_f32_v2_areg;
1862           break;
1863         case MVT::f64:
1864           Opcode = NVPTX::STV_f64_v2_areg;
1865           break;
1866         }
1867         break;
1868       case NVPTXISD::StoreV4:
1869         switch (EltVT.getSimpleVT().SimpleTy) {
1870         default:
1871           return NULL;
1872         case MVT::i8:
1873           Opcode = NVPTX::STV_i8_v4_areg;
1874           break;
1875         case MVT::i16:
1876           Opcode = NVPTX::STV_i16_v4_areg;
1877           break;
1878         case MVT::i32:
1879           Opcode = NVPTX::STV_i32_v4_areg;
1880           break;
1881         case MVT::f32:
1882           Opcode = NVPTX::STV_f32_v4_areg;
1883           break;
1884         }
1885         break;
1886       }
1887     }
1888     StOps.push_back(N2);
1889   }
1890
1891   StOps.push_back(Chain);
1892
1893   ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
1894
1895   MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1896   MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1897   cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
1898
1899   return ST;
1900 }
1901
1902 SDNode *NVPTXDAGToDAGISel::SelectLoadParam(SDNode *Node) {
1903   SDValue Chain = Node->getOperand(0);
1904   SDValue Offset = Node->getOperand(2);
1905   SDValue Flag = Node->getOperand(3);
1906   SDLoc DL(Node);
1907   MemSDNode *Mem = cast<MemSDNode>(Node);
1908
1909   unsigned VecSize;
1910   switch (Node->getOpcode()) {
1911   default:
1912     return NULL;
1913   case NVPTXISD::LoadParam:
1914     VecSize = 1;
1915     break;
1916   case NVPTXISD::LoadParamV2:
1917     VecSize = 2;
1918     break;
1919   case NVPTXISD::LoadParamV4:
1920     VecSize = 4;
1921     break;
1922   }
1923
1924   EVT EltVT = Node->getValueType(0);
1925   EVT MemVT = Mem->getMemoryVT();
1926
1927   unsigned Opc = 0;
1928
1929   switch (VecSize) {
1930   default:
1931     return NULL;
1932   case 1:
1933     switch (MemVT.getSimpleVT().SimpleTy) {
1934     default:
1935       return NULL;
1936     case MVT::i1:
1937       Opc = NVPTX::LoadParamMemI8;
1938       break;
1939     case MVT::i8:
1940       Opc = NVPTX::LoadParamMemI8;
1941       break;
1942     case MVT::i16:
1943       Opc = NVPTX::LoadParamMemI16;
1944       break;
1945     case MVT::i32:
1946       Opc = NVPTX::LoadParamMemI32;
1947       break;
1948     case MVT::i64:
1949       Opc = NVPTX::LoadParamMemI64;
1950       break;
1951     case MVT::f32:
1952       Opc = NVPTX::LoadParamMemF32;
1953       break;
1954     case MVT::f64:
1955       Opc = NVPTX::LoadParamMemF64;
1956       break;
1957     }
1958     break;
1959   case 2:
1960     switch (MemVT.getSimpleVT().SimpleTy) {
1961     default:
1962       return NULL;
1963     case MVT::i1:
1964       Opc = NVPTX::LoadParamMemV2I8;
1965       break;
1966     case MVT::i8:
1967       Opc = NVPTX::LoadParamMemV2I8;
1968       break;
1969     case MVT::i16:
1970       Opc = NVPTX::LoadParamMemV2I16;
1971       break;
1972     case MVT::i32:
1973       Opc = NVPTX::LoadParamMemV2I32;
1974       break;
1975     case MVT::i64:
1976       Opc = NVPTX::LoadParamMemV2I64;
1977       break;
1978     case MVT::f32:
1979       Opc = NVPTX::LoadParamMemV2F32;
1980       break;
1981     case MVT::f64:
1982       Opc = NVPTX::LoadParamMemV2F64;
1983       break;
1984     }
1985     break;
1986   case 4:
1987     switch (MemVT.getSimpleVT().SimpleTy) {
1988     default:
1989       return NULL;
1990     case MVT::i1:
1991       Opc = NVPTX::LoadParamMemV4I8;
1992       break;
1993     case MVT::i8:
1994       Opc = NVPTX::LoadParamMemV4I8;
1995       break;
1996     case MVT::i16:
1997       Opc = NVPTX::LoadParamMemV4I16;
1998       break;
1999     case MVT::i32:
2000       Opc = NVPTX::LoadParamMemV4I32;
2001       break;
2002     case MVT::f32:
2003       Opc = NVPTX::LoadParamMemV4F32;
2004       break;
2005     }
2006     break;
2007   }
2008
2009   SDVTList VTs;
2010   if (VecSize == 1) {
2011     VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2012   } else if (VecSize == 2) {
2013     VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2014   } else {
2015     EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
2016     VTs = CurDAG->getVTList(&EVTs[0], 5);
2017   }
2018
2019   unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2020
2021   SmallVector<SDValue, 2> Ops;
2022   Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2023   Ops.push_back(Chain);
2024   Ops.push_back(Flag);
2025
2026   SDNode *Ret =
2027       CurDAG->getMachineNode(Opc, DL, VTs, Ops);
2028   return Ret;
2029 }
2030
2031 SDNode *NVPTXDAGToDAGISel::SelectStoreRetval(SDNode *N) {
2032   SDLoc DL(N);
2033   SDValue Chain = N->getOperand(0);
2034   SDValue Offset = N->getOperand(1);
2035   unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2036   MemSDNode *Mem = cast<MemSDNode>(N);
2037
2038   // How many elements do we have?
2039   unsigned NumElts = 1;
2040   switch (N->getOpcode()) {
2041   default:
2042     return NULL;
2043   case NVPTXISD::StoreRetval:
2044     NumElts = 1;
2045     break;
2046   case NVPTXISD::StoreRetvalV2:
2047     NumElts = 2;
2048     break;
2049   case NVPTXISD::StoreRetvalV4:
2050     NumElts = 4;
2051     break;
2052   }
2053
2054   // Build vector of operands
2055   SmallVector<SDValue, 6> Ops;
2056   for (unsigned i = 0; i < NumElts; ++i)
2057     Ops.push_back(N->getOperand(i + 2));
2058   Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2059   Ops.push_back(Chain);
2060
2061   // Determine target opcode
2062   // If we have an i1, use an 8-bit store. The lowering code in
2063   // NVPTXISelLowering will have already emitted an upcast.
2064   unsigned Opcode = 0;
2065   switch (NumElts) {
2066   default:
2067     return NULL;
2068   case 1:
2069     switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2070     default:
2071       return NULL;
2072     case MVT::i1:
2073       Opcode = NVPTX::StoreRetvalI8;
2074       break;
2075     case MVT::i8:
2076       Opcode = NVPTX::StoreRetvalI8;
2077       break;
2078     case MVT::i16:
2079       Opcode = NVPTX::StoreRetvalI16;
2080       break;
2081     case MVT::i32:
2082       Opcode = NVPTX::StoreRetvalI32;
2083       break;
2084     case MVT::i64:
2085       Opcode = NVPTX::StoreRetvalI64;
2086       break;
2087     case MVT::f32:
2088       Opcode = NVPTX::StoreRetvalF32;
2089       break;
2090     case MVT::f64:
2091       Opcode = NVPTX::StoreRetvalF64;
2092       break;
2093     }
2094     break;
2095   case 2:
2096     switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2097     default:
2098       return NULL;
2099     case MVT::i1:
2100       Opcode = NVPTX::StoreRetvalV2I8;
2101       break;
2102     case MVT::i8:
2103       Opcode = NVPTX::StoreRetvalV2I8;
2104       break;
2105     case MVT::i16:
2106       Opcode = NVPTX::StoreRetvalV2I16;
2107       break;
2108     case MVT::i32:
2109       Opcode = NVPTX::StoreRetvalV2I32;
2110       break;
2111     case MVT::i64:
2112       Opcode = NVPTX::StoreRetvalV2I64;
2113       break;
2114     case MVT::f32:
2115       Opcode = NVPTX::StoreRetvalV2F32;
2116       break;
2117     case MVT::f64:
2118       Opcode = NVPTX::StoreRetvalV2F64;
2119       break;
2120     }
2121     break;
2122   case 4:
2123     switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2124     default:
2125       return NULL;
2126     case MVT::i1:
2127       Opcode = NVPTX::StoreRetvalV4I8;
2128       break;
2129     case MVT::i8:
2130       Opcode = NVPTX::StoreRetvalV4I8;
2131       break;
2132     case MVT::i16:
2133       Opcode = NVPTX::StoreRetvalV4I16;
2134       break;
2135     case MVT::i32:
2136       Opcode = NVPTX::StoreRetvalV4I32;
2137       break;
2138     case MVT::f32:
2139       Opcode = NVPTX::StoreRetvalV4F32;
2140       break;
2141     }
2142     break;
2143   }
2144
2145   SDNode *Ret =
2146       CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
2147   MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2148   MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2149   cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2150
2151   return Ret;
2152 }
2153
2154 SDNode *NVPTXDAGToDAGISel::SelectStoreParam(SDNode *N) {
2155   SDLoc DL(N);
2156   SDValue Chain = N->getOperand(0);
2157   SDValue Param = N->getOperand(1);
2158   unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
2159   SDValue Offset = N->getOperand(2);
2160   unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2161   MemSDNode *Mem = cast<MemSDNode>(N);
2162   SDValue Flag = N->getOperand(N->getNumOperands() - 1);
2163
2164   // How many elements do we have?
2165   unsigned NumElts = 1;
2166   switch (N->getOpcode()) {
2167   default:
2168     return NULL;
2169   case NVPTXISD::StoreParamU32:
2170   case NVPTXISD::StoreParamS32:
2171   case NVPTXISD::StoreParam:
2172     NumElts = 1;
2173     break;
2174   case NVPTXISD::StoreParamV2:
2175     NumElts = 2;
2176     break;
2177   case NVPTXISD::StoreParamV4:
2178     NumElts = 4;
2179     break;
2180   }
2181
2182   // Build vector of operands
2183   SmallVector<SDValue, 8> Ops;
2184   for (unsigned i = 0; i < NumElts; ++i)
2185     Ops.push_back(N->getOperand(i + 3));
2186   Ops.push_back(CurDAG->getTargetConstant(ParamVal, MVT::i32));
2187   Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2188   Ops.push_back(Chain);
2189   Ops.push_back(Flag);
2190
2191   // Determine target opcode
2192   // If we have an i1, use an 8-bit store. The lowering code in
2193   // NVPTXISelLowering will have already emitted an upcast.
2194   unsigned Opcode = 0;
2195   switch (N->getOpcode()) {
2196   default:
2197     switch (NumElts) {
2198     default:
2199       return NULL;
2200     case 1:
2201       switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2202       default:
2203         return NULL;
2204       case MVT::i1:
2205         Opcode = NVPTX::StoreParamI8;
2206         break;
2207       case MVT::i8:
2208         Opcode = NVPTX::StoreParamI8;
2209         break;
2210       case MVT::i16:
2211         Opcode = NVPTX::StoreParamI16;
2212         break;
2213       case MVT::i32:
2214         Opcode = NVPTX::StoreParamI32;
2215         break;
2216       case MVT::i64:
2217         Opcode = NVPTX::StoreParamI64;
2218         break;
2219       case MVT::f32:
2220         Opcode = NVPTX::StoreParamF32;
2221         break;
2222       case MVT::f64:
2223         Opcode = NVPTX::StoreParamF64;
2224         break;
2225       }
2226       break;
2227     case 2:
2228       switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2229       default:
2230         return NULL;
2231       case MVT::i1:
2232         Opcode = NVPTX::StoreParamV2I8;
2233         break;
2234       case MVT::i8:
2235         Opcode = NVPTX::StoreParamV2I8;
2236         break;
2237       case MVT::i16:
2238         Opcode = NVPTX::StoreParamV2I16;
2239         break;
2240       case MVT::i32:
2241         Opcode = NVPTX::StoreParamV2I32;
2242         break;
2243       case MVT::i64:
2244         Opcode = NVPTX::StoreParamV2I64;
2245         break;
2246       case MVT::f32:
2247         Opcode = NVPTX::StoreParamV2F32;
2248         break;
2249       case MVT::f64:
2250         Opcode = NVPTX::StoreParamV2F64;
2251         break;
2252       }
2253       break;
2254     case 4:
2255       switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2256       default:
2257         return NULL;
2258       case MVT::i1:
2259         Opcode = NVPTX::StoreParamV4I8;
2260         break;
2261       case MVT::i8:
2262         Opcode = NVPTX::StoreParamV4I8;
2263         break;
2264       case MVT::i16:
2265         Opcode = NVPTX::StoreParamV4I16;
2266         break;
2267       case MVT::i32:
2268         Opcode = NVPTX::StoreParamV4I32;
2269         break;
2270       case MVT::f32:
2271         Opcode = NVPTX::StoreParamV4F32;
2272         break;
2273       }
2274       break;
2275     }
2276     break;
2277   // Special case: if we have a sign-extend/zero-extend node, insert the
2278   // conversion instruction first, and use that as the value operand to
2279   // the selected StoreParam node.
2280   case NVPTXISD::StoreParamU32: {
2281     Opcode = NVPTX::StoreParamI32;
2282     SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2283                                                 MVT::i32);
2284     SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
2285                                          MVT::i32, Ops[0], CvtNone);
2286     Ops[0] = SDValue(Cvt, 0);
2287     break;
2288   }
2289   case NVPTXISD::StoreParamS32: {
2290     Opcode = NVPTX::StoreParamI32;
2291     SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2292                                                 MVT::i32);
2293     SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
2294                                          MVT::i32, Ops[0], CvtNone);
2295     Ops[0] = SDValue(Cvt, 0);
2296     break;
2297   }
2298   }
2299
2300   SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
2301   SDNode *Ret =
2302       CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
2303   MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2304   MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2305   cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2306
2307   return Ret;
2308 }
2309
2310 // SelectDirectAddr - Match a direct address for DAG.
2311 // A direct address could be a globaladdress or externalsymbol.
2312 bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
2313   // Return true if TGA or ES.
2314   if (N.getOpcode() == ISD::TargetGlobalAddress ||
2315       N.getOpcode() == ISD::TargetExternalSymbol) {
2316     Address = N;
2317     return true;
2318   }
2319   if (N.getOpcode() == NVPTXISD::Wrapper) {
2320     Address = N.getOperand(0);
2321     return true;
2322   }
2323   if (N.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
2324     unsigned IID = cast<ConstantSDNode>(N.getOperand(0))->getZExtValue();
2325     if (IID == Intrinsic::nvvm_ptr_gen_to_param)
2326       if (N.getOperand(1).getOpcode() == NVPTXISD::MoveParam)
2327         return (SelectDirectAddr(N.getOperand(1).getOperand(0), Address));
2328   }
2329   return false;
2330 }
2331
2332 // symbol+offset
2333 bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
2334     SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
2335   if (Addr.getOpcode() == ISD::ADD) {
2336     if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
2337       SDValue base = Addr.getOperand(0);
2338       if (SelectDirectAddr(base, Base)) {
2339         Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
2340         return true;
2341       }
2342     }
2343   }
2344   return false;
2345 }
2346
2347 // symbol+offset
2348 bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
2349                                      SDValue &Base, SDValue &Offset) {
2350   return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
2351 }
2352
2353 // symbol+offset
2354 bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
2355                                        SDValue &Base, SDValue &Offset) {
2356   return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
2357 }
2358
2359 // register+offset
2360 bool NVPTXDAGToDAGISel::SelectADDRri_imp(
2361     SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
2362   if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
2363     Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
2364     Offset = CurDAG->getTargetConstant(0, mvt);
2365     return true;
2366   }
2367   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
2368       Addr.getOpcode() == ISD::TargetGlobalAddress)
2369     return false; // direct calls.
2370
2371   if (Addr.getOpcode() == ISD::ADD) {
2372     if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
2373       return false;
2374     }
2375     if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
2376       if (FrameIndexSDNode *FIN =
2377               dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
2378         // Constant offset from frame ref.
2379         Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
2380       else
2381         Base = Addr.getOperand(0);
2382       Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
2383       return true;
2384     }
2385   }
2386   return false;
2387 }
2388
2389 // register+offset
2390 bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
2391                                      SDValue &Base, SDValue &Offset) {
2392   return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
2393 }
2394
2395 // register+offset
2396 bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
2397                                        SDValue &Base, SDValue &Offset) {
2398   return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
2399 }
2400
2401 bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
2402                                                  unsigned int spN) const {
2403   const Value *Src = NULL;
2404   // Even though MemIntrinsicSDNode is a subclas of MemSDNode,
2405   // the classof() for MemSDNode does not include MemIntrinsicSDNode
2406   // (See SelectionDAGNodes.h). So we need to check for both.
2407   if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
2408     Src = mN->getSrcValue();
2409   } else if (MemSDNode *mN = dyn_cast<MemIntrinsicSDNode>(N)) {
2410     Src = mN->getSrcValue();
2411   }
2412   if (!Src)
2413     return false;
2414   if (const PointerType *PT = dyn_cast<PointerType>(Src->getType()))
2415     return (PT->getAddressSpace() == spN);
2416   return false;
2417 }
2418
2419 /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
2420 /// inline asm expressions.
2421 bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
2422     const SDValue &Op, char ConstraintCode, std::vector<SDValue> &OutOps) {
2423   SDValue Op0, Op1;
2424   switch (ConstraintCode) {
2425   default:
2426     return true;
2427   case 'm': // memory
2428     if (SelectDirectAddr(Op, Op0)) {
2429       OutOps.push_back(Op0);
2430       OutOps.push_back(CurDAG->getTargetConstant(0, MVT::i32));
2431       return false;
2432     }
2433     if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
2434       OutOps.push_back(Op0);
2435       OutOps.push_back(Op1);
2436       return false;
2437     }
2438     break;
2439   }
2440   return true;
2441 }
2442
2443 // Return true if N is a undef or a constant.
2444 // If N was undef, return a (i8imm 0) in Retval
2445 // If N was imm, convert it to i8imm and return in Retval
2446 // Note: The convert to i8imm is required, otherwise the
2447 // pattern matcher inserts a bunch of IMOVi8rr to convert
2448 // the imm to i8imm, and this causes instruction selection
2449 // to fail.
2450 bool NVPTXDAGToDAGISel::UndefOrImm(SDValue Op, SDValue N, SDValue &Retval) {
2451   if (!(N.getOpcode() == ISD::UNDEF) && !(N.getOpcode() == ISD::Constant))
2452     return false;
2453
2454   if (N.getOpcode() == ISD::UNDEF)
2455     Retval = CurDAG->getTargetConstant(0, MVT::i8);
2456   else {
2457     ConstantSDNode *cn = cast<ConstantSDNode>(N.getNode());
2458     unsigned retval = cn->getZExtValue();
2459     Retval = CurDAG->getTargetConstant(retval, MVT::i8);
2460   }
2461   return true;
2462 }