149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXISelDAGToDAG.cpp - A dag to dag inst selector for NVPTX ------===//
249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//                     The LLVM Compiler Infrastructure
449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source
649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details.
749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file defines an instruction selector for the NVPTX target.
1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXISelDAGToDAG.h"
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CommandLine.h"
1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/Debug.h"
1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/ErrorHandling.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h"
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetIntrinsicInfo.h"
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm;
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "nvptx-isel"
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesunsigned FMAContractLevel = 0;
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic cl::opt<unsigned, true>
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesFMAContractLevelOpt("nvptx-fma-level", cl::ZeroOrMore, cl::Hidden,
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                    cl::desc("NVPTX Specific: FMA contraction (0: don't do it"
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                             " 1: do it  2: do it aggressively"),
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                    cl::location(FMAContractLevel),
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                    cl::init(2));
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic cl::opt<int> UsePrecDivF32(
37fe16848601bdde6e3a5e0860199169dd171222a4Nadav Rotem    "nvptx-prec-divf32", cl::ZeroOrMore, cl::Hidden,
383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski             " IEEE Compliant F32 div.rnd if avaiable."),
403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::init(2));
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
42b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinskistatic cl::opt<bool>
43fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemUsePrecSqrtF32("nvptx-prec-sqrtf32", cl::Hidden,
44b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
45b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::init(true));
46b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski
473a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskistatic cl::opt<bool>
48fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemFtzEnabled("nvptx-f32ftz", cl::ZeroOrMore, cl::Hidden,
493a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski           cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
503a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski           cl::init(false));
513a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
523a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// createNVPTXISelDag - This pass converts a legalized DAG into a
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// NVPTX-specific DAG, ready for instruction scheduling.
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       llvm::CodeGenOpt::Level OptLevel) {
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return new NVPTXDAGToDAGISel(TM, OptLevel);
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6049683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     CodeGenOpt::Level OptLevel)
623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    : SelectionDAGISel(tm, OptLevel),
633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Subtarget(tm.getSubtarget<NVPTXSubtarget>()) {
6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32 = (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel >= 1);
663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64 = (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel >= 1);
673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32AGG =
683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel == 2);
693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64AGG =
703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel == 2);
7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
723a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  allowFMA = (FMAContractLevel >= 1);
73af878315192a9fa5b534364e327c24aeb8d73b5aBenjamin Kramer
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  doMulWide = (OptLevel > 0);
753a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
763a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
773a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskiint NVPTXDAGToDAGISel::getDivF32Level() const {
783a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (UsePrecDivF32.getNumOccurrences() > 0) {
793a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-prec-div32=N is used on the command-line, always honor it
803a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return UsePrecDivF32;
813a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
823a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, use div.approx if fast math is enabled
833a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (TM.Options.UnsafeFPMath)
843a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return 0;
853a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
863a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return 2;
873a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
883a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
903a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskibool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
913a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (UsePrecSqrtF32.getNumOccurrences() > 0) {
923a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
933a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return UsePrecSqrtF32;
943a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
953a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, use sqrt.approx if fast math is enabled
963a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (TM.Options.UnsafeFPMath)
973a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return false;
983a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
993a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return true;
1003a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
1013a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1033a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskibool NVPTXDAGToDAGISel::useF32FTZ() const {
1043a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (FtzEnabled.getNumOccurrences() > 0) {
1053a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-f32ftz is used on the command-line, always honor it
1063a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return FtzEnabled;
1073a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
1083a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    const Function *F = MF->getFunction();
1093a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, check for an nvptx-f32ftz attribute on the function
1103a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (F->hasFnAttribute("nvptx-f32ftz"))
1113a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return (F->getAttributes().getAttribute(AttributeSet::FunctionIndex,
1123a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski                                              "nvptx-f32ftz")
1133a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski                                              .getValueAsString() == "true");
1143a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
1153a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return false;
1163a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
11949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// Select - Select instructions not customized! Used for
12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// expanded, promoted and normal instructions.
1213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::Select(SDNode *N) {
12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1233e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover  if (N->isMachineOpcode()) {
1243e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover    N->setNodeId(-1);
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr; // Already selected.
1263e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover  }
12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *ResNode = nullptr;
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (N->getOpcode()) {
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::LOAD:
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectLoad(N);
13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::STORE:
13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectStore(N);
13549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
1367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV2:
1377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV4:
1387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectLoadVector(N);
1397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV2:
1417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV4:
1427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV2:
1437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV4:
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ResNode = SelectLDGLDU(N);
1457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
1477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
1487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectStoreVector(N);
1497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParam:
1511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV2:
1521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV4:
1531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectLoadParam(N);
1541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
1551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetval:
1561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV2:
1571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV4:
1581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectStoreRetval(N);
1591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
1601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParam:
1611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV2:
1621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV4:
1631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamS32:
1641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamU32:
1651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectStoreParam(N);
1661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case ISD::INTRINSIC_WO_CHAIN:
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ResNode = SelectIntrinsicNoChain(N);
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
170cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case ISD::INTRINSIC_W_CHAIN:
171cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ResNode = SelectIntrinsicChain(N);
172cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    break;
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatI32:
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloat:
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloatLevel:
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloatGrad:
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32I32:
178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32Float:
179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32FloatLevel:
180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32FloatGrad:
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatI32:
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloat:
183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloatLevel:
184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloatGrad:
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32I32:
186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32Float:
187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32FloatLevel:
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32FloatGrad:
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatI32:
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloat:
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloatLevel:
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloatGrad:
193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32I32:
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32Float:
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32FloatLevel:
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32FloatGrad:
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatI32:
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloat:
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloatLevel:
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloatGrad:
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32I32:
202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32Float:
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32FloatLevel:
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32FloatGrad:
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatI32:
206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloat:
207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloatLevel:
208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloatGrad:
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32I32:
210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32Float:
211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32FloatLevel:
212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32FloatGrad:
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ResNode = SelectTextureIntrinsic(N);
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI8Trap:
216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI16Trap:
217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI32Trap:
218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I8Trap:
219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I16Trap:
220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I32Trap:
221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I8Trap:
222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I16Trap:
223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I32Trap:
224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI8Trap:
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI16Trap:
226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI32Trap:
227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I8Trap:
228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I16Trap:
229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I32Trap:
230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I8Trap:
231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I16Trap:
232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I32Trap:
233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI8Trap:
234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI16Trap:
235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI32Trap:
236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I8Trap:
237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I16Trap:
238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I32Trap:
239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I8Trap:
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I16Trap:
241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I32Trap:
242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI8Trap:
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI16Trap:
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI32Trap:
245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I8Trap:
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I16Trap:
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I32Trap:
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I8Trap:
249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I16Trap:
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I32Trap:
251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI8Trap:
252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI16Trap:
253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI32Trap:
254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I8Trap:
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I16Trap:
256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I32Trap:
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I8Trap:
258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I16Trap:
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I32Trap:
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ResNode = SelectSurfaceIntrinsic(N);
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
262cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case ISD::AND:
263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case ISD::SRA:
264cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case ISD::SRL:
265cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Try to select BFE
266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ResNode = SelectBFE(N);
267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    break;
26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case ISD::ADDRSPACECAST:
26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ResNode = SelectAddrSpaceCast(N);
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
2713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
2723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
27349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
27449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ResNode)
27549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return ResNode;
27649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectCode(N);
27749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
27849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSDNode *NVPTXDAGToDAGISel::SelectIntrinsicChain(SDNode *N) {
280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  switch (IID) {
282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  default:
283cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return NULL;
284cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldg_global_f:
285cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldg_global_i:
286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldg_global_p:
287cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldu_global_f:
288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldu_global_i:
289cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  case Intrinsic::nvvm_ldu_global_p:
290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return SelectLDGLDU(N);
291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
292cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
293cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
2943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic unsigned int getCodeAddrSpace(MemSDNode *N,
2953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                                     const NVPTXSubtarget &Subtarget) {
296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const Value *Src = N->getMemOperand()->getValue();
2977c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski
29849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
2997c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    return NVPTX::PTXLdStInstCode::GENERIC;
30049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
30149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType())) {
30249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (PT->getAddressSpace()) {
3037c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
3047c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
3057c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
3067c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
3077c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
3087c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
3097c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    default: break;
31049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
31149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
3127c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski  return NVPTX::PTXLdStInstCode::GENERIC;
31349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
31449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDNode *NVPTXDAGToDAGISel::SelectIntrinsicNoChain(SDNode *N) {
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned IID = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (IID) {
318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default:
319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Intrinsic::nvvm_texsurf_handle_internal:
321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return SelectTexSurfHandle(N);
322dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
324dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDNode *NVPTXDAGToDAGISel::SelectTexSurfHandle(SDNode *N) {
326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Op 0 is the intrinsic ID
327dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue Wrapper = N->getOperand(1);
328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue GlobalVal = Wrapper.getOperand(0);
329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return CurDAG->getMachineNode(NVPTX::texsurf_handles, SDLoc(N), MVT::i64,
330dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                GlobalVal);
331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSDNode *NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SDValue Src = N->getOperand(0);
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AddrSpaceCastSDNode *CastN = cast<AddrSpaceCastSDNode>(N);
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned SrcAddrSpace = CastN->getSrcAddressSpace();
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned DstAddrSpace = CastN->getDestAddressSpace();
33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(SrcAddrSpace != DstAddrSpace &&
34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         "addrspacecast must be between different address spaces");
34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (DstAddrSpace == ADDRESS_SPACE_GENERIC) {
34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Specific to generic
34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned Opc;
34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    switch (SrcAddrSpace) {
34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    default: report_fatal_error("Bad address space in addrspacecast");
34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_GLOBAL:
34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_global_yes_64
34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_global_yes;
35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_SHARED:
35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_shared_yes_64
35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_shared_yes;
35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_CONST:
35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_const_yes_64
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_const_yes;
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_LOCAL:
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_local_yes_64
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_local_yes;
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0), Src);
36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  } else {
36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Generic to specific
36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (SrcAddrSpace != 0)
36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      report_fatal_error("Cannot cast between two non-generic address spaces");
36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned Opc;
37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    switch (DstAddrSpace) {
37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    default: report_fatal_error("Bad address space in addrspacecast");
37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_GLOBAL:
37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_to_global_yes_64
37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_to_global_yes;
37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_SHARED:
37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_to_shared_yes_64
37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_to_shared_yes;
37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_CONST:
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_to_const_yes_64
38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_to_const_yes;
38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case ADDRESS_SPACE_LOCAL:
38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Opc = Subtarget.is64Bit() ? NVPTX::cvta_to_local_yes_64
38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                : NVPTX::cvta_to_local_yes;
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0), Src);
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N) {
394ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
39549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LoadSDNode *LD = cast<LoadSDNode>(N);
39649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT LoadedVT = LD->getMemoryVT();
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *NVPTXLD = nullptr;
39849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
39949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
40049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (LD->isIndexed())
401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
40249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
40349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!LoadedVT.isSimple())
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
40549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
40649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
40749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(LD, Subtarget);
40849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
40949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
41049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
41149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = LD->isVolatile();
41249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
41349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
41449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
41549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
41649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
41749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
41849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
41949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
42049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
42149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
42249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
42349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
42449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
42549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
42649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
427dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
42849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
42949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
43049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: fromType + fromTypeWidth
43149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
43249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Sign   : ISD::SEXTLOAD
43349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
43449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //          type is integer
43549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
43649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
437d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
438d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
43949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int fromType;
44049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if ((LD->getExtensionType() == ISD::SEXTLOAD))
44149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Signed;
44249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else if (ScalarVT.isFloatingPoint())
44349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Float;
44449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
44549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Unsigned;
44649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
44749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
44849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
44949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
45049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
45149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
45249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
4530ff1190888f5b24f64a196392c452800447186d8Craig Topper  MVT::SimpleValueType TargetVT = LD->getSimpleValueType(0).SimpleTy;
45449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
45549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N1, Addr)) {
45649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
4573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
4583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_avar;
4593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
4613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_avar;
4623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
4643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_avar;
4653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
4673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_avar;
4683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
4703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_avar;
4713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
4733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_avar;
4743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
47749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
4783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
4793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
4803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Addr, Chain };
4812a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
4823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
4833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
4843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
48549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
4863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
4873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_asi;
4883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
4903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_asi;
4913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
4933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_asi;
4943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
4963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_asi;
4973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
4983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
4993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_asi;
5003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
5013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
5023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_asi;
5033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
5043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
505dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
50649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
5073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
5083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
5093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
5102a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
5113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
5123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
5133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
5147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
5157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
5163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari_64;
5183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari_64;
5213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari_64;
5243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari_64;
5273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari_64;
5303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari_64;
5333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
535dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
5367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
5387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
5393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari;
5413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari;
5443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari;
5473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari;
5503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari;
5533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari;
5563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
558dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
5597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
56049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
5613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
5623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
5633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
5642a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
5653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else {
5667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
5677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
5683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg_64;
5703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg_64;
5733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg_64;
5763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg_64;
5793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg_64;
5823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg_64;
5853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
587dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
5887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
5907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
5913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg;
5933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg;
5963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg;
5993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
6003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
6013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg;
6023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
6033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
6043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg;
6053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
6063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
6073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg;
6083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
6093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
610dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
6117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
61249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
6133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
6143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
6153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), N1, Chain };
6162a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
61749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
61849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
619dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (NVPTXLD) {
62049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
62149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
62249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
62349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
62449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
62549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXLD;
62649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
62749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6287eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoadVector(SDNode *N) {
6297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
6317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
6327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
6337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
634ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
6357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
6367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
6377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT LoadedVT = MemSD->getMemoryVT();
6387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (!LoadedVT.isSimple())
640dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
6417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
6437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
6447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
6467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
6477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
6487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
6497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
6507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
6517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
6527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Vector Setting
6547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
6557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: fromType + fromTypeWidth
6577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //
6587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Sign   : ISD::SEXTLOAD
6597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
6607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //          type is integer
6617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
6627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
663d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
664d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
6657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int FromType;
6667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // The last operand holds the original LoadSDNode::getExtensionType() value
6673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ExtensionType = cast<ConstantSDNode>(
6683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N->getOperand(N->getNumOperands() - 1))->getZExtValue();
6697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ExtensionType == ISD::SEXTLOAD)
6707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Signed;
6717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else if (ScalarVT.isFloatingPoint())
6727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Float;
6737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
6747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Unsigned;
6757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
6777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
6793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV2:
6803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
6813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
6823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV4:
6833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
6843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
6853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
686dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
6877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
6887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = N->getValueType(0);
6907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(Op1, Addr)) {
6927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
6933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
694dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
6957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
6967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
6973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
698dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
6993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
7003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_avar;
7013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
7033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_avar;
7043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
7063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_avar;
7073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
7093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_avar;
7103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
7123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_avar;
7133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
7153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_avar;
7163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
7197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
7207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
7213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
722dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
7233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
7243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_avar;
7253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
7273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_avar;
7283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
7303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_avar;
7313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
7333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_avar;
7343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
7377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
7387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
7403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
7413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Addr, Chain };
7422a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
7433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
7443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
7453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
7467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
7473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
748dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
7497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
7507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
7513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
752dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
7533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
7543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_asi;
7553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
7573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_asi;
7583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
7603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_asi;
7613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
7633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_asi;
7643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
7663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_asi;
7673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
7693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_asi;
7703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
7737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
7747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
7753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
776dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
7773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
7783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_asi;
7793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
7813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_asi;
7823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
7843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_asi;
7853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
7873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_asi;
7883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
7897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
7917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
7927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
7943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
7953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
7962a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
7973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
7983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
7993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
8007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
8017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
8023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
803dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
8047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
8057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
8063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
807dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
8083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
8093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari_64;
8103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
8123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari_64;
8133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
8153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari_64;
8163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
8183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari_64;
8193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
8213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari_64;
8223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
8243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari_64;
8253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
8277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
8287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
8297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
8303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
831dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
8323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
8333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari_64;
8343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
8363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari_64;
8373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
8393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari_64;
8403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
8423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari_64;
8433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
8457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
8467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
8487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
8493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
850dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
8517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
8527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
8533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
854dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
8553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
8563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari;
8573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
8593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari;
8603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
8623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari;
8633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
8653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari;
8663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
8683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari;
8693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
8713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari;
8723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
8747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
8757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
8767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
8773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
878dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
8793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
8803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari;
8813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
8833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari;
8843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
8863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari;
8873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
8893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari;
8903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
8917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
8927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
8937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
8957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
8973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
8983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
8997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9002a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
9017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
9027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
9037eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
9043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
905dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
9067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
9077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
909dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
9103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
9113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg_64;
9123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
9143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg_64;
9153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
9173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg_64;
9183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
9203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg_64;
9213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
9233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg_64;
9243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
9263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg_64;
9273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
9297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
9307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
9317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
933dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
9343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
9353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg_64;
9363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
9383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg_64;
9393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
9413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg_64;
9423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
9443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg_64;
9453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
9477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
9487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
9507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
9513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
952dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
9537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
9547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
956dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
9573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
9583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg;
9593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
9613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg;
9623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
9643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg;
9653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
9673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg;
9683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
9703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg;
9713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
9733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg;
9743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
9767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
9777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
9787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
980dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
9813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
9823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg;
9833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
9853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg;
9863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
9883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg;
9893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
9913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg;
9923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
9937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
9947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
9957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
9977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
9993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
10003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Op1, Chain };
10012a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
10027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
10037eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
10047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
10057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
10067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
10077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
10087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
10097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
10107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
1011cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSDNode *NVPTXDAGToDAGISel::SelectLDGLDU(SDNode *N) {
10127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
10137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
1014cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue Op1;
1015cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MemSDNode *Mem;
1016cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool IsLDG = true;
1017cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1018cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // If this is an LDG intrinsic, the address is the third operand. Its its an
1019cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // LDG/LDU SD node (from custom vector handling), then its the second operand
1020cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (N->getOpcode() == ISD::INTRINSIC_W_CHAIN) {
1021cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Op1 = N->getOperand(2);
1022cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Mem = cast<MemIntrinsicSDNode>(N);
1023cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
1024cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    switch (IID) {
1025cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    default:
1026cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return NULL;
1027cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldg_global_f:
1028cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldg_global_i:
1029cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldg_global_p:
1030cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      IsLDG = true;
1031cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      break;
1032cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldu_global_f:
1033cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldu_global_i:
1034cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case Intrinsic::nvvm_ldu_global_p:
1035cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      IsLDG = false;
1036cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      break;
1037cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
1038cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else {
1039cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Op1 = N->getOperand(1);
1040cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Mem = cast<MemSDNode>(N);
1041cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
1042cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
10437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
1044ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
10457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
10469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  SDValue Base, Offset, Addr;
10471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
1048cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EVT EltVT = Mem->getMemoryVT();
1049cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (EltVT.isVector()) {
1050cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    EltVT = EltVT.getVectorElementType();
1051cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
10527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
10539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  if (SelectDirectAddr(Op1, Addr)) {
10547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
10553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
1056dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
1057cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    case ISD::INTRINSIC_W_CHAIN:
1058cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (IsLDG) {
1059cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        switch (EltVT.getSimpleVT().SimpleTy) {
1060cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        default:
1061cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          return nullptr;
1062cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i8:
1063cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8avar;
1064cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1065cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i16:
1066cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16avar;
1067cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1068cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i32:
1069cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32avar;
1070cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1071cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i64:
1072cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64avar;
1073cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1074cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::f32:
1075cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32avar;
1076cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1077cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::f64:
1078cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64avar;
1079cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1080cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1081cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      } else {
1082cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        switch (EltVT.getSimpleVT().SimpleTy) {
1083cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        default:
1084cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          return nullptr;
1085cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i8:
1086cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8avar;
1087cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1088cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i16:
1089cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16avar;
1090cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1091cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i32:
1092cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32avar;
1093cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1094cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::i64:
1095cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64avar;
1096cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1097cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::f32:
1098cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32avar;
1099cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        case MVT::f64:
1101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64avar;
1102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          break;
1103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
1105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      break;
11067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV2:
11079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
11083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
11103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
11123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
11153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
11183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
11209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
11213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
11243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
11269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
11273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
11309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    case NVPTXISD::LDUV2:
11319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
11323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
11343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
11363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
11393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
11429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        break;
11439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case MVT::i64:
11449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
11453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
11489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        break;
11499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case MVT::f64:
11509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
11513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
11549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    case NVPTXISD::LDGV4:
11559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
11563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
11583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
11603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
11633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
11663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
11693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
11727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV4:
11739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
11743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
11763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
11783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
11813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
11843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
11873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
11907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
11919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
11929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Addr, Chain };
1193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
11949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  } else if (Subtarget.is64Bit()
11959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                 ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
11969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
11979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    if (Subtarget.is64Bit()) {
11989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
11993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
1201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case ISD::INTRINSIC_W_CHAIN:
1202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        if (IsLDG) {
1203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari64;
1208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari64;
1211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari64;
1214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari64;
1217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari64;
1220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari64;
1223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        } else {
1226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari64;
1231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari64;
1234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari64;
1237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari64;
1240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari64;
1243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari64;
1246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        break;
12509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
12519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
12529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
12549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
12569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
12599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
12629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
12649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
12659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
12689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
12709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
12719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
12759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
12769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
12789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
12809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
12839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
12869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12879bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
12889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
12899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
12929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
12949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
12959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
12999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
13009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1301dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
13029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
13039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
13049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13059bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
13069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
13079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
13099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
13109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
13129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
13139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
13153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
13179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
13189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
13209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
13219bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
13229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
13249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
13259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
13279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
13289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
13309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
13319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
13333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
13359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    } else {
13369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
13373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
1339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case ISD::INTRINSIC_W_CHAIN:
1340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        if (IsLDG) {
1341cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1342cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1345cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari;
1346cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari;
1349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1350cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari;
1352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1354cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari;
1355cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1356cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1357cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari;
1358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1359cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1360cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari;
1361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        } else {
1364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari;
1369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1371cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari;
1372cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari;
1375cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1376cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1377cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari;
1378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1379cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari;
1381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari;
1384cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1385cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        break;
13889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
13899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
13909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
13929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
13939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
13949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
13969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
13979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
13989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
13999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
14009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14019bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
14029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
14039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
14059bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
14069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
14089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
14099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
14113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
14139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
14169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
14179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
14189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14199bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
14209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
14219bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
14239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
14249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
14269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
14279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
14299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
14309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
14329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
14339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
14353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
14379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1439dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
14409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
14419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
14429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
14449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
14459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
14479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
14489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
14509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
14519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
14533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
14559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1457dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
14589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
14599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
14609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
14629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
14639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
14659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
14669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
14689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
14699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
14709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
14713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
14739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    }
14749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
14759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Base, Offset, Chain };
14769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
1477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
14789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  } else {
14799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    if (Subtarget.is64Bit()) {
14809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
14813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
1483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case ISD::INTRINSIC_W_CHAIN:
1484cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        if (IsLDG) {
1485cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1488cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1489cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg64;
1490cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1492cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg64;
1493cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1494cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1495cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg64;
1496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1497cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1498cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg64;
1499cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1500cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1501cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg64;
1502cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1503cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1504cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg64;
1505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        } else {
1508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg64;
1513cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1514cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg64;
1516cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1517cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1518cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg64;
1519cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1520cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1521cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg64;
1522cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1523cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1524cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg64;
1525cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1526cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1527cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg64;
1528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1531cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        break;
15329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
15339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1535dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
15369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
15379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
15389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15399bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
15409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
15419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
15439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
15449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
15469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
15479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
15499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
15509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
15529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
15539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
15553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
15579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
15609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
15619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
15629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
15649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
15659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
15679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
15689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
15709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
15719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
15739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
15749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
15769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
15779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
15793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
15819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1583dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
15849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
15859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
15869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15879bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
15889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
15899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
15919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
15929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
15949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
15959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
15969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
15973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
15999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
16009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1601dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
16029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
16039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
16049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16059bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
16069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
16079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
16099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
16109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
16129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
16139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
16153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
16179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    } else {
16189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
16193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1620dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
1621cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case ISD::INTRINSIC_W_CHAIN:
1622cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        if (IsLDG) {
1623cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1624cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1625cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1626cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1627cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg;
1628cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1629cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1630cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg;
1631cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1632cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1633cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg;
1634cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1635cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1636cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg;
1637cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1638cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1639cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg;
1640cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1641cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1642cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg;
1643cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1644cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1645cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        } else {
1646cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          switch (EltVT.getSimpleVT().SimpleTy) {
1647cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          default:
1648cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            return nullptr;
1649cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i8:
1650cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg;
1651cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1652cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i16:
1653cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg;
1654cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1655cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i32:
1656cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg;
1657cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1658cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::i64:
1659cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg;
1660cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1661cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f32:
1662cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg;
1663cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1664cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          case MVT::f64:
1665cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg;
1666cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            break;
1667cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
1668cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
1669cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        break;
16709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
16719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
16729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1673dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
16749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
16759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
16769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
16789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
16799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
16819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
16829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
16849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
16859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
16879bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
16889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
16909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
16919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
16929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
16933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
16959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
16969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1697dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
16989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
16999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
17009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17019bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
17029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
17039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
17059bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
17069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
17089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
17099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
17119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
17129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
17149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
17159bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
17173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
17189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
17199bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1721dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
17229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
17239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
17249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
17269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
17279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
17299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
17309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
17329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
17339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
17353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
17369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
17379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
1739dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
17409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
17419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
17429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
17449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
17459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
17479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
17489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
17509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
17519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
17529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
17533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
17547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
17557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
17567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
17579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Op1, Chain };
1758dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
17599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  }
17607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
17617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1762cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MemRefs0[0] = Mem->getMemOperand();
17637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
17647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
17657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
17667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
17677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
17683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStore(SDNode *N) {
1769ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
177049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreSDNode *ST = cast<StoreSDNode>(N);
177149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT StoreVT = ST->getMemoryVT();
1772dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *NVPTXST = nullptr;
177349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
177449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
177549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ST->isIndexed())
1776dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
177749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
177849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!StoreVT.isSimple())
1779dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
178049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
178149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
178249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(ST, Subtarget);
178349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
178449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
178549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
178649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = ST->isVolatile();
178749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
178849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
178949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
179049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
179149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
179249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
179349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = StoreVT.getSimpleVT();
179449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
179549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
179649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
179749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
179849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
179949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
180049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
180149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
1802dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
180349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
180449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
180549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: toType + toTypeWidth
180649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - for integer type, always use 'u'
180749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
180849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
18093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned toTypeWidth = ScalarVT.getSizeInBits();
181049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int toType;
181149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ScalarVT.isFloatingPoint())
181249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Float;
181349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
181449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Unsigned;
181549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
181649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
181749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
181849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
181949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N2 = N->getOperand(2);
182049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
182149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
182249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
18230ff1190888f5b24f64a196392c452800447186d8Craig Topper  MVT::SimpleValueType SourceVT = N1.getNode()->getSimpleValueType(0).SimpleTy;
182449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
182549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N2, Addr)) {
182649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
18273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
18283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_avar;
18293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
18313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_avar;
18323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
18343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_avar;
18353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
18373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_avar;
18383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
18403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_avar;
18413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
18433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_avar;
18443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
1846dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
184749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
18483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
18493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
18503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Addr, Chain };
18512a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
18523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
18533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
18543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
185549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
18563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
18573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_asi;
18583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
18603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_asi;
18613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
18633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_asi;
18643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
18663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_asi;
18673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
18693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_asi;
18703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
18723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_asi;
18733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
18743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
1875dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
187649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
18773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
18783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
18793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
18802a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
18813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
18823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
18833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
18847eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
18857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
18863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
18873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari_64;
18883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
18893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
18903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari_64;
18913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
18923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
18933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari_64;
18943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
18953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
18963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari_64;
18973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
18983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
18993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari_64;
19003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
19023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari_64;
19033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1905dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
19067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
19077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
19087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
19093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
19103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari;
19113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
19133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari;
19143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
19163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari;
19173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
19193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari;
19203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
19223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari;
19233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
19253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari;
19263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1928dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
19297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
193049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
19313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
19323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
19333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
19342a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
193549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  } else {
19367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
19377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
19383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
19393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg_64;
19403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
19423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg_64;
19433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
19453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg_64;
19463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
19483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg_64;
19493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
19513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg_64;
19523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
19543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg_64;
19553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1957dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
19587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
19597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
19607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
19613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
19623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg;
19633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
19653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg;
19663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
19683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg;
19693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
19713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg;
19723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
19743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg;
19753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
19773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg;
19783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
19793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
1980dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
19817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
198249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
19833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
19843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
19853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), N2, Chain };
19862a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
198749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
198849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1989dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (NVPTXST) {
199049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
199149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
199249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
199349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
199449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
199549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXST;
199649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
199749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
19987eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreVector(SDNode *N) {
19997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
20007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
20017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
20027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
2003ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
20047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *ST;
20057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = Op1.getValueType();
20067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
20077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT StoreVT = MemSD->getMemoryVT();
20087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
20107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
20117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
20137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    report_fatal_error("Cannot store to pointer that points to constant "
20147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski                       "memory space");
20157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
20167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
20187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
20197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
20207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
20217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
20227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
20237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
20247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: toType + toTypeWidth
20267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - for integer type, always use 'u'
20277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  assert(StoreVT.isSimple() && "Store value is not simple");
20287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
20293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ToTypeWidth = ScalarVT.getSizeInBits();
20307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned ToType;
20317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ScalarVT.isFloatingPoint())
20327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Float;
20337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
20347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Unsigned;
20357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SmallVector<SDValue, 12> StOps;
20377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue N2;
20387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
20397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
20417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
20427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
20437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
20447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
20457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(3);
20467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
20477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
20487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
20497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
20507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
20517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(3));
20527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(4));
20537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(5);
20547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
20553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
2056dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
20577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
20587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(IsVolatile));
20607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(CodeAddrSpace));
20617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(VecType));
20627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToType));
20637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToTypeWidth));
20647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
20657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(N2, Addr)) {
20667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
20673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
2068dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
20697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
20707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
20713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2072dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
20733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
20743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_avar;
20753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
20773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_avar;
20783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
20803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_avar;
20813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
20833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_avar;
20843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
20863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_avar;
20873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
20893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_avar;
20903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
20917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
20927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
20937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
20947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
20953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2096dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
20973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
20983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_avar;
20993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
21013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_avar;
21023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
21043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_avar;
21053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
21073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_avar;
21083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
21107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
21117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
21127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Addr);
21133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
21143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
21153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
21167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
21173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
2118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
21197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
21207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
21213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
21233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
21243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_asi;
21253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
21273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_asi;
21283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
21303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_asi;
21313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
21333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_asi;
21343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
21363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_asi;
21373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
21393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_asi;
21403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
21427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
21437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
21447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
21453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
21473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
21483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_asi;
21493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
21513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_asi;
21523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
21543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_asi;
21553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
21573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_asi;
21583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
21597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
21607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
21617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
21627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
21637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
21643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
21653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
21663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
21677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
21687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
21693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
21717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
21727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
21733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
21753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
21763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari_64;
21773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
21793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari_64;
21803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
21823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari_64;
21833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
21853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari_64;
21863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
21883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari_64;
21893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
21913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari_64;
21923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
21937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
21947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
21957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
21967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
21973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
21993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
22003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari_64;
22013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
22033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari_64;
22043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
22063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari_64;
22073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
22093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari_64;
22103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
22127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
22137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
22147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
22157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
22163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
22187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
22197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
22203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
22223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
22233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari;
22243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
22263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari;
22273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
22293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari;
22303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
22323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari;
22333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
22353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari;
22363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
22383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari;
22393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
22417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
22427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
22437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
22443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
22463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
22473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari;
22483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
22503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari;
22513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
22533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari;
22543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
22563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari;
22573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
22597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
22607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
22617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
22627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
22637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
22647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
22657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
22667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
22673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
22697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
22707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
22713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
22733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
22743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg_64;
22753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
22773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg_64;
22783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
22803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg_64;
22813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
22833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg_64;
22843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
22863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg_64;
22873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
22893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg_64;
22903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
22917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
22927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
22937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
22947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
22953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
22973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
22983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg_64;
22993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
23013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg_64;
23023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
23043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg_64;
23053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
23073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg_64;
23083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
23107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
23117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
23127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
23137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
23143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
2315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
23167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
23177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
23183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
23203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
23213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg;
23223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
23243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg;
23253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
23273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg;
23283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
23303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg;
23313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
23333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg;
23343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
23363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg;
23373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
23397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
23407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
23417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
23423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
2343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          return nullptr;
23443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
23453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg;
23463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
23483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg;
23493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
23513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg;
23523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
23543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg;
23553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
23567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
23577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
23587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
23597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
23607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N2);
23617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
23627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
23637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(Chain);
23647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
23652a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao  ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
23667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
23677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
23687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
23697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
23707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
23717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return ST;
23727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
23737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
23741c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoadParam(SDNode *Node) {
23751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = Node->getOperand(0);
23761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = Node->getOperand(2);
23771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Flag = Node->getOperand(3);
23781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(Node);
23791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(Node);
23801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
23811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned VecSize;
23821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (Node->getOpcode()) {
23831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
2384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
23851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParam:
23861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 1;
23871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
23881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV2:
23891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 2;
23901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
23911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV4:
23921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 4;
23931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
23941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
23951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
23961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  EVT EltVT = Node->getValueType(0);
23971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  EVT MemVT = Mem->getMemoryVT();
23981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
23991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opc = 0;
24001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
24011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (VecSize) {
24021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
2403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
24041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 1:
24051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
24061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2407dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
24081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
24091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI8;
24101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
24121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI8;
24131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
24151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI16;
24161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
24181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI32;
24191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
24211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI64;
24221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
24241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemF32;
24251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
24271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemF64;
24281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
24301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
24311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 2:
24321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
24331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
24351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
24361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I8;
24371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
24391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I8;
24401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
24421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I16;
24431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
24451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I32;
24461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
24481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I64;
24491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
24511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2F32;
24521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
24541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2F64;
24551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
24571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
24581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 4:
24591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
24601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2461dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
24621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
24631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I8;
24641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
24661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I8;
24671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
24691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I16;
24701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
24721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I32;
24731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
24751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4F32;
24761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
24771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
24781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
24791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
24801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
24811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDVTList VTs;
24821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  if (VecSize == 1) {
24831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
24841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  } else if (VecSize == 2) {
24851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
24861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  } else {
24871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
2488dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VTs = CurDAG->getVTList(EVTs);
24891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
24901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
24911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
24921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
24931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 2> Ops;
24941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
24951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
24961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Flag);
24971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
24981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
2499be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski      CurDAG->getMachineNode(Opc, DL, VTs, Ops);
25001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
25011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
25021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
25031c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreRetval(SDNode *N) {
25041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(N);
25051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = N->getOperand(0);
25061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = N->getOperand(1);
25071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
25081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(N);
25091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
25101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // How many elements do we have?
25111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned NumElts = 1;
25121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
25131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
2514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
25151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetval:
25161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 1;
25171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
25181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV2:
25191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 2;
25201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
25211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV4:
25221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 4;
25231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
25241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
25251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
25261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Build vector of operands
25271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 6> Ops;
25281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  for (unsigned i = 0; i < NumElts; ++i)
25291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    Ops.push_back(N->getOperand(i + 2));
25301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
25311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
25321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
25331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Determine target opcode
25341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // If we have an i1, use an 8-bit store. The lowering code in
25351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // NVPTXISelLowering will have already emitted an upcast.
25361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opcode = 0;
25371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (NumElts) {
25381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
2539dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
25401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 1:
25411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
25421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2543dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
25441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
25451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI8;
25461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
25481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI8;
25491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
25511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI16;
25521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
25541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI32;
25551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
25571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI64;
25581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
25601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalF32;
25611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
25631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalF64;
25641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
25661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
25671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 2:
25681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
25691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2570dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
25711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
25721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I8;
25731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
25751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I8;
25761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
25781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I16;
25791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
25811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I32;
25821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
25841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I64;
25851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
25871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2F32;
25881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
25901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2F64;
25911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
25921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
25931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
25941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 4:
25951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
25961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2597dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
25981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
25991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I8;
26001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
26021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I8;
26031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
26051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I16;
26061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
26081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I32;
26091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
26111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4F32;
26121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
26141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
26151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
26161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
26181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
26191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
26201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
26211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
26221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
26241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
26251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26261c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreParam(SDNode *N) {
26271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(N);
26281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = N->getOperand(0);
26291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Param = N->getOperand(1);
26301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
26311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = N->getOperand(2);
26321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
26331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(N);
26341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Flag = N->getOperand(N->getNumOperands() - 1);
26351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // How many elements do we have?
26371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned NumElts = 1;
26381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
26391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
2640dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
26411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamU32:
26421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamS32:
26431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParam:
26441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 1;
26451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
26461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV2:
26471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 2;
26481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
26491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV4:
26501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 4;
26511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
26521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
26531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Build vector of operands
26551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 8> Ops;
26561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  for (unsigned i = 0; i < NumElts; ++i)
26571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    Ops.push_back(N->getOperand(i + 3));
26581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(ParamVal, MVT::i32));
26591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
26601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
26611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Flag);
26621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
26631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Determine target opcode
26641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // If we have an i1, use an 8-bit store. The lowering code in
26651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // NVPTXISelLowering will have already emitted an upcast.
26661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opcode = 0;
26671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
26681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
26691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (NumElts) {
26701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
2671dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
26721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 1:
26731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
26741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
2675dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
26761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
26771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI8;
26781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
26801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI8;
26811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
26831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI16;
26841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
26861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI32;
26871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i64:
26891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI64;
26901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
26921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamF32;
26931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f64:
26951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamF64;
26961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
26971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
26981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
26991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 2:
27001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
27011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
2702dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
27031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
27041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I8;
27051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
27071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I8;
27081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
27101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I16;
27111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
27131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I32;
27141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i64:
27161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I64;
27171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
27191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2F32;
27201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f64:
27221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2F64;
27231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
27251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
27261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 4:
27271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
27281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
2729dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
27301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
27311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I8;
27321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
27341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I8;
27351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
27371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I16;
27381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
27401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I32;
27411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
27431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4F32;
27441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
27451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
27461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
27471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
27481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
2749ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // Special case: if we have a sign-extend/zero-extend node, insert the
2750ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // conversion instruction first, and use that as the value operand to
2751ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // the selected StoreParam node.
2752ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  case NVPTXISD::StoreParamU32: {
2753ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Opcode = NVPTX::StoreParamI32;
2754ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2755ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                                MVT::i32);
2756ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
2757ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                         MVT::i32, Ops[0], CvtNone);
2758ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Ops[0] = SDValue(Cvt, 0);
27591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
2760ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  }
2761ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  case NVPTXISD::StoreParamS32: {
2762ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Opcode = NVPTX::StoreParamI32;
2763ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2764ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                                MVT::i32);
2765ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
2766ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                         MVT::i32, Ops[0], CvtNone);
2767ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Ops[0] = SDValue(Cvt, 0);
27681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
27691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
2770ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  }
27711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
2772be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski  SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
27731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
2774be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski      CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
27751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
27761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
27771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
27781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
27791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
27801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
27811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
2782dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDNode *NVPTXDAGToDAGISel::SelectTextureIntrinsic(SDNode *N) {
2783dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue Chain = N->getOperand(0);
2784dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue TexRef = N->getOperand(1);
2785dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue SampRef = N->getOperand(2);
2786dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *Ret = nullptr;
2787dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned Opc = 0;
2788dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallVector<SDValue, 8> Ops;
2789dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2790dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (N->getOpcode()) {
2791dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: return nullptr;
2792dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatI32:
2793dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_F32_I32;
2794dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2795dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloat:
2796dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_F32_F32;
2797dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2798dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloatLevel:
2799dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_F32_F32_LEVEL;
2800dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2801dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DFloatFloatGrad:
2802dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_F32_F32_GRAD;
2803dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2804dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32I32:
2805dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_I32_I32;
2806dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2807dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32Float:
2808dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_I32_F32;
2809dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2810dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32FloatLevel:
2811dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_I32_F32_LEVEL;
2812dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2813dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DI32FloatGrad:
2814dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_I32_F32_GRAD;
2815dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2816dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatI32:
2817dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_F32_I32;
2818dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2819dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloat:
2820dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_F32_F32;
2821dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2822dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloatLevel:
2823dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_F32_F32_LEVEL;
2824dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2825dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayFloatFloatGrad:
2826dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_F32_F32_GRAD;
2827dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2828dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32I32:
2829dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_I32_I32;
2830dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2831dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32Float:
2832dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_I32_F32;
2833dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2834dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32FloatLevel:
2835dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_I32_F32_LEVEL;
2836dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2837dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex1DArrayI32FloatGrad:
2838dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_1D_ARRAY_I32_F32_GRAD;
2839dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2840dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatI32:
2841dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_F32_I32;
2842dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2843dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloat:
2844dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_F32_F32;
2845dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2846dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloatLevel:
2847dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_F32_F32_LEVEL;
2848dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2849dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DFloatFloatGrad:
2850dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_F32_F32_GRAD;
2851dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2852dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32I32:
2853dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_I32_I32;
2854dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2855dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32Float:
2856dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_I32_F32;
2857dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2858dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32FloatLevel:
2859dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_I32_F32_LEVEL;
2860dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2861dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DI32FloatGrad:
2862dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_I32_F32_GRAD;
2863dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2864dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatI32:
2865dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_F32_I32;
2866dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2867dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloat:
2868dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_F32_F32;
2869dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2870dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloatLevel:
2871dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_F32_F32_LEVEL;
2872dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2873dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayFloatFloatGrad:
2874dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_F32_F32_GRAD;
2875dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2876dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32I32:
2877dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_I32_I32;
2878dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2879dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32Float:
2880dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_I32_F32;
2881dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2882dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32FloatLevel:
2883dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_I32_F32_LEVEL;
2884dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2885dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex2DArrayI32FloatGrad:
2886dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_2D_ARRAY_I32_F32_GRAD;
2887dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2888dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatI32:
2889dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_F32_I32;
2890dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2891dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloat:
2892dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_F32_F32;
2893dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2894dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloatLevel:
2895dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_F32_F32_LEVEL;
2896dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2897dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DFloatFloatGrad:
2898dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_F32_F32_GRAD;
2899dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2900dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32I32:
2901dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_I32_I32;
2902dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2903dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32Float:
2904dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_I32_F32;
2905dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2906dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32FloatLevel:
2907dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_I32_F32_LEVEL;
2908dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2909dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Tex3DI32FloatGrad:
2910dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::TEX_3D_I32_F32_GRAD;
2911dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2912dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
2913dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2914dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Ops.push_back(TexRef);
2915dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Ops.push_back(SampRef);
2916dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2917dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Copy over indices
2918dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (unsigned i = 3; i < N->getNumOperands(); ++i) {
2919dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(i));
2920dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
2921dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2922dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Ops.push_back(Chain);
2923dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Ret = CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops);
2924dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Ret;
2925dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
2926dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2927dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDNode *NVPTXDAGToDAGISel::SelectSurfaceIntrinsic(SDNode *N) {
2928dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue Chain = N->getOperand(0);
2929dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDValue TexHandle = N->getOperand(1);
2930dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *Ret = nullptr;
2931dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned Opc = 0;
2932dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallVector<SDValue, 8> Ops;
2933dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (N->getOpcode()) {
2934dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: return nullptr;
2935dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI8Trap:
2936dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_I8_TRAP;
2937dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2938dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2939dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2940dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2941dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI16Trap:
2942dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_I16_TRAP;
2943dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2944dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2945dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2946dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2947dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DI32Trap:
2948dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_I32_TRAP;
2949dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2950dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2951dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2952dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2953dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I8Trap:
2954dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V2I8_TRAP;
2955dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2956dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2957dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2958dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2959dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I16Trap:
2960dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V2I16_TRAP;
2961dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2962dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2963dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2964dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2965dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV2I32Trap:
2966dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V2I32_TRAP;
2967dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2968dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2969dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2970dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2971dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I8Trap:
2972dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V4I8_TRAP;
2973dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2974dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2975dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2976dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2977dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I16Trap:
2978dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V4I16_TRAP;
2979dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2980dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2981dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2982dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2983dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DV4I32Trap:
2984dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_V4I32_TRAP;
2985dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2986dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2987dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2988dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2989dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI8Trap:
2990dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_I8_TRAP;
2991dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2992dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
2993dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
2994dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
2995dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
2996dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI16Trap:
2997dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_I16_TRAP;
2998dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
2999dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3000dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3001dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3002dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3003dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayI32Trap:
3004dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_I32_TRAP;
3005dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3006dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3007dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3008dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3009dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3010dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I8Trap:
3011dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V2I8_TRAP;
3012dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3013dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3014dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3015dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3016dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3017dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I16Trap:
3018dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V2I16_TRAP;
3019dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3020dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3021dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3022dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3023dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3024dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV2I32Trap:
3025dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V2I32_TRAP;
3026dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3027dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3028dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3029dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3030dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3031dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I8Trap:
3032dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V4I8_TRAP;
3033dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3034dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3035dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3036dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3037dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3038dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I16Trap:
3039dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V4I16_TRAP;
3040dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3041dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3042dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3043dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3044dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3045dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld1DArrayV4I32Trap:
3046dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_1D_ARRAY_V4I32_TRAP;
3047dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3048dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3049dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3050dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3051dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3052dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI8Trap:
3053dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_I8_TRAP;
3054dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3055dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3056dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3057dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3058dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3059dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI16Trap:
3060dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_I16_TRAP;
3061dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3062dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3063dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3064dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3065dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3066dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DI32Trap:
3067dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_I32_TRAP;
3068dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3069dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3070dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3071dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3072dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3073dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I8Trap:
3074dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V2I8_TRAP;
3075dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3076dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3077dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3078dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3079dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3080dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I16Trap:
3081dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V2I16_TRAP;
3082dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3083dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3084dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3085dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3086dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3087dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV2I32Trap:
3088dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V2I32_TRAP;
3089dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3090dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3091dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3092dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3093dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3094dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I8Trap:
3095dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V4I8_TRAP;
3096dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3097dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3098dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3099dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I16Trap:
3102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V4I16_TRAP;
3103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DV4I32Trap:
3109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_V4I32_TRAP;
3110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI8Trap:
3116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_I8_TRAP;
3117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI16Trap:
3124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_I16_TRAP;
3125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayI32Trap:
3132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_I32_TRAP;
3133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I8Trap:
3140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V2I8_TRAP;
3141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I16Trap:
3148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V2I16_TRAP;
3149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV2I32Trap:
3156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V2I32_TRAP;
3157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I8Trap:
3164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V4I8_TRAP;
3165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I16Trap:
3172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V4I16_TRAP;
3173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld2DArrayV4I32Trap:
3180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_2D_ARRAY_V4I32_TRAP;
3181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI8Trap:
3188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_I8_TRAP;
3189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI16Trap:
3196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_I16_TRAP;
3197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DI32Trap:
3204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_I32_TRAP;
3205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I8Trap:
3212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V2I8_TRAP;
3213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I16Trap:
3220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V2I16_TRAP;
3221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV2I32Trap:
3228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V2I32_TRAP;
3229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I8Trap:
3236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V4I8_TRAP;
3237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I16Trap:
3244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V4I16_TRAP;
3245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NVPTXISD::Suld3DV4I32Trap:
3252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opc = NVPTX::SULD_3D_V4I32_TRAP;
3253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(TexHandle);
3254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(2));
3255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(3));
3256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(N->getOperand(4));
3257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Ops.push_back(Chain);
3258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
3259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
3260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Ret = CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops);
3261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Ret;
3262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
3263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3264cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// SelectBFE - Look for instruction sequences that can be made more efficient
3265cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// by using the 'bfe' (bit-field extract) PTX instruction
3266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSDNode *NVPTXDAGToDAGISel::SelectBFE(SDNode *N) {
3267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue LHS = N->getOperand(0);
3268cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue RHS = N->getOperand(1);
3269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue Len;
3270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue Start;
3271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue Val;
3272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool IsSigned = false;
3273cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3274cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (N->getOpcode() == ISD::AND) {
3275cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Canonicalize the operands
3276cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // We want 'and %val, %mask'
3277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (isa<ConstantSDNode>(LHS) && !isa<ConstantSDNode>(RHS)) {
3278cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      std::swap(LHS, RHS);
3279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ConstantSDNode *Mask = dyn_cast<ConstantSDNode>(RHS);
3282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (!Mask) {
3283cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // We need a constant mask on the RHS of the AND
3284cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return NULL;
3285cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3287cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Extract the mask bits
3288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    uint64_t MaskVal = Mask->getZExtValue();
3289cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (!isMask_64(MaskVal)) {
3290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // We *could* handle shifted masks here, but doing so would require an
3291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // 'and' operation to fix up the low-order bits so we would trade
3292cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // shr+and for bfe+and, which has the same throughput
3293cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return NULL;
3294cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3295cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3296cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // How many bits are in our mask?
3297cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    uint64_t NumBits = CountTrailingOnes_64(MaskVal);
3298cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Len = CurDAG->getTargetConstant(NumBits, MVT::i32);
3299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (LHS.getOpcode() == ISD::SRL || LHS.getOpcode() == ISD::SRA) {
3301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // We have a 'srl/and' pair, extract the effective start bit and length
3302cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Val = LHS.getNode()->getOperand(0);
3303cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Start = LHS.getNode()->getOperand(1);
3304cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConstantSDNode *StartConst = dyn_cast<ConstantSDNode>(Start);
3305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (StartConst) {
3306cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        uint64_t StartVal = StartConst->getZExtValue();
3307cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // How many "good" bits do we have left?  "good" is defined here as bits
3308cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // that exist in the original value, not shifted in.
3309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        uint64_t GoodBits = Start.getValueType().getSizeInBits() - StartVal;
3310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        if (NumBits > GoodBits) {
3311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          // Do not handle the case where bits have been shifted in. In theory
3312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          // we could handle this, but the cost is likely higher than just
3313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          // emitting the srl/and pair.
3314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          return NULL;
3315cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        }
3316cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        Start = CurDAG->getTargetConstant(StartVal, MVT::i32);
3317cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      } else {
3318cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Do not handle the case where the shift amount (can be zero if no srl
3319cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // was found) is not constant. We could handle this case, but it would
3320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // require run-time logic that would be more expensive than just
3321cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // emitting the srl/and pair.
3322cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3323cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
3325cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // Do not handle the case where the LHS of the and is not a shift. While
3326cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // it would be trivial to handle this case, it would just transform
3327cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // 'and' -> 'bfe', but 'and' has higher-throughput.
3328cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return NULL;
3329cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3330cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else if (N->getOpcode() == ISD::SRL || N->getOpcode() == ISD::SRA) {
3331cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (LHS->getOpcode() == ISD::AND) {
3332cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConstantSDNode *ShiftCnst = dyn_cast<ConstantSDNode>(RHS);
3333cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (!ShiftCnst) {
3334cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Shift amount must be constant
3335cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3336cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3337cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3338cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t ShiftAmt = ShiftCnst->getZExtValue();
3339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      SDValue AndLHS = LHS->getOperand(0);
3341cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      SDValue AndRHS = LHS->getOperand(1);
3342cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // Canonicalize the AND to have the mask on the RHS
3344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (isa<ConstantSDNode>(AndLHS)) {
3345cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        std::swap(AndLHS, AndRHS);
3346cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(AndRHS);
3349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (!MaskCnst) {
3350cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Mask must be constant
3351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3354cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t MaskVal = MaskCnst->getZExtValue();
3355cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t NumZeros;
3356cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t NumBits;
3357cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (isMask_64(MaskVal)) {
3358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        NumZeros = 0;
3359cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // The number of bits in the result bitfield will be the number of
3360cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // trailing ones (the AND) minus the number of bits we shift off
3361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        NumBits = CountTrailingOnes_64(MaskVal) - ShiftAmt;
3362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      } else if (isShiftedMask_64(MaskVal)) {
3363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        NumZeros = countTrailingZeros(MaskVal);
3364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        unsigned NumOnes = CountTrailingOnes_64(MaskVal >> NumZeros);
3365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // The number of bits in the result bitfield will be the number of
3366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // trailing zeros plus the number of set bits in the mask minus the
3367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // number of bits we shift off
3368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        NumBits = NumZeros + NumOnes - ShiftAmt;
3369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      } else {
3370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // This is not a mask we can handle
3371cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3372cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (ShiftAmt < NumZeros) {
3375cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Handling this case would require extra logic that would make this
3376cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // transformation non-profitable
3377cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3379cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Val = AndLHS;
3381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Start = CurDAG->getTargetConstant(ShiftAmt, MVT::i32);
3382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Len = CurDAG->getTargetConstant(NumBits, MVT::i32);
3383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else if (LHS->getOpcode() == ISD::SHL) {
3384cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // Here, we have a pattern like:
3385cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      //
3386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // (sra (shl val, NN), MM)
3387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // or
3388cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // (srl (shl val, NN), MM)
3389cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      //
3390cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // If MM >= NN, we can efficiently optimize this with bfe
3391cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Val = LHS->getOperand(0);
3392cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3393cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      SDValue ShlRHS = LHS->getOperand(1);
3394cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConstantSDNode *ShlCnst = dyn_cast<ConstantSDNode>(ShlRHS);
3395cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (!ShlCnst) {
3396cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Shift amount must be constant
3397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3398cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3399cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t InnerShiftAmt = ShlCnst->getZExtValue();
3400cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3401cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      SDValue ShrRHS = RHS;
3402cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConstantSDNode *ShrCnst = dyn_cast<ConstantSDNode>(ShrRHS);
3403cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (!ShrCnst) {
3404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // Shift amount must be constant
3405cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3406cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3407cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      uint64_t OuterShiftAmt = ShrCnst->getZExtValue();
3408cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3409cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // To avoid extra codegen and be profitable, we need Outer >= Inner
3410cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (OuterShiftAmt < InnerShiftAmt) {
3411cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3412cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3413cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3414cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // If the outer shift is more than the type size, we have no bitfield to
3415cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // extract (since we also check that the inner shift is <= the outer shift
3416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // then this also implies that the inner shift is < the type size)
3417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (OuterShiftAmt >= Val.getValueType().getSizeInBits()) {
3418cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NULL;
3419cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3420cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Start =
3422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        CurDAG->getTargetConstant(OuterShiftAmt - InnerShiftAmt, MVT::i32);
3423cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Len =
3424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        CurDAG->getTargetConstant(Val.getValueType().getSizeInBits() -
3425cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                  OuterShiftAmt, MVT::i32);
3426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (N->getOpcode() == ISD::SRA) {
3428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // If we have a arithmetic right shift, we need to use the signed bfe
3429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        // variant
3430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        IsSigned = true;
3431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
3432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
3433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      // No can do...
3434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return NULL;
3435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else {
3437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // No can do...
3438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return NULL;
3439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
3440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned Opc;
3443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // For the BFE operations we form here from "and" and "srl", always use the
3444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // unsigned variants.
3445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (Val.getValueType() == MVT::i32) {
3446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (IsSigned) {
3447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Opc = NVPTX::BFE_S32rii;
3448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
3449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Opc = NVPTX::BFE_U32rii;
3450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else if (Val.getValueType() == MVT::i64) {
3452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (IsSigned) {
3453cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Opc = NVPTX::BFE_S64rii;
3454cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
3455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Opc = NVPTX::BFE_U64rii;
3456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
3457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else {
3458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // We cannot handle this type
3459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return NULL;
3460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
3461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDValue Ops[] = {
3463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Val, Start, Len
3464cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  };
3465cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3466cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SDNode *Ret =
3467cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops);
3468cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
3469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return Ret;
3470cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
3471cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
347249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// SelectDirectAddr - Match a direct address for DAG.
347349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// A direct address could be a globaladdress or externalsymbol.
347449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
347549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Return true if TGA or ES.
34763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  if (N.getOpcode() == ISD::TargetGlobalAddress ||
34773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N.getOpcode() == ISD::TargetExternalSymbol) {
347849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N;
347949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
348049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
348149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == NVPTXISD::Wrapper) {
348249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N.getOperand(0);
348349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
348449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
348549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
348649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned IID = cast<ConstantSDNode>(N.getOperand(0))->getZExtValue();
348749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (IID == Intrinsic::nvvm_ptr_gen_to_param)
348849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (N.getOperand(1).getOpcode() == NVPTXISD::MoveParam)
348949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return (SelectDirectAddr(N.getOperand(1).getOperand(0), Address));
349049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
349149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
349249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
349349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
349449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
34953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi_imp(
34963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
349749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
349849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
34993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      SDValue base = Addr.getOperand(0);
350049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (SelectDirectAddr(base, Base)) {
350149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
350249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return true;
350349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      }
350449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
350549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
350649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
350749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
350849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
350949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
351049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
351149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
351249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
351349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
351449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
351549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
351649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
351749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
351849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
351949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
352049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
352149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
35223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri_imp(
35233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
352449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
352549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
352649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Offset = CurDAG->getTargetConstant(0, mvt);
352749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
352849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
352949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
353049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Addr.getOpcode() == ISD::TargetGlobalAddress)
35313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return false; // direct calls.
353249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
353349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
353449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
353549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
353649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
353749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
353849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (FrameIndexSDNode *FIN =
35393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski              dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
354049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        // Constant offset from frame ref.
354149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
354249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      else
354349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = Addr.getOperand(0);
354449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
354549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return true;
354649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
354749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
354849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
354949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
355049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
355149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
355249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
355349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
355449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
355549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
355649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
355749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
355849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
355949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
356049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
356149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
356249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
356349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
356449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                                 unsigned int spN) const {
3565dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const Value *Src = nullptr;
356649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Even though MemIntrinsicSDNode is a subclas of MemSDNode,
356749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // the classof() for MemSDNode does not include MemIntrinsicSDNode
356849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // (See SelectionDAGNodes.h). So we need to check for both.
356949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
3570dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (spN == 0 && mN->getMemOperand()->getPseudoValue())
3571dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return true;
3572dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Src = mN->getMemOperand()->getValue();
35733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (MemSDNode *mN = dyn_cast<MemIntrinsicSDNode>(N)) {
3574dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (spN == 0 && mN->getMemOperand()->getPseudoValue())
3575dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return true;
3576dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Src = mN->getMemOperand()->getValue();
357749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
357849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
357949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return false;
358049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType()))
358149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return (PT->getAddressSpace() == spN);
358249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
358349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
358449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
358549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
358649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// inline asm expressions.
35873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
35883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    const SDValue &Op, char ConstraintCode, std::vector<SDValue> &OutOps) {
358949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Op0, Op1;
359049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (ConstraintCode) {
35913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
35923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return true;
35933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case 'm': // memory
359449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Op, Op0)) {
359549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
359649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(CurDAG->getTargetConstant(0, MVT::i32));
359749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
359849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
359949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
360049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
360149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op1);
360249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
360349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
360449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
360549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
360649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return true;
360749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
3608