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 Holewinski#undef DEBUG_TYPE
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define DEBUG_TYPE "nvptx-isel"
2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm;
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistatic cl::opt<int>
293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiFMAContractLevel("nvptx-fma-level", cl::ZeroOrMore,
3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                 cl::desc("NVPTX Specific: FMA contraction (0: don't do it"
313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                          " 1: do it  2: do it aggressively"),
323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 cl::init(2));
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic cl::opt<int> UsePrecDivF32(
353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    "nvptx-prec-divf32", cl::ZeroOrMore,
363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski             " IEEE Compliant F32 div.rnd if avaiable."),
383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::init(2));
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
40b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinskistatic cl::opt<bool>
41b9c26dcb2438266567ce94570bf294d00d10cc87Justin HolewinskiUsePrecSqrtF32("nvptx-prec-sqrtf32",
42b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
43b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::init(true));
44b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski
453a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskistatic cl::opt<bool>
463a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin HolewinskiFtzEnabled("nvptx-f32ftz", cl::ZeroOrMore,
473a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski           cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
483a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski           cl::init(false));
493a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
503a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// createNVPTXISelDag - This pass converts a legalized DAG into a
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// NVPTX-specific DAG, ready for instruction scheduling.
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       llvm::CodeGenOpt::Level OptLevel) {
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return new NVPTXDAGToDAGISel(TM, OptLevel);
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     CodeGenOpt::Level OptLevel)
603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    : SelectionDAGISel(tm, OptLevel),
613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Subtarget(tm.getSubtarget<NVPTXSubtarget>()) {
6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32 = (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel >= 1);
643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64 = (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel >= 1);
653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32AGG =
663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel == 2);
673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64AGG =
683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel == 2);
6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
703a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  allowFMA = (FMAContractLevel >= 1);
71af878315192a9fa5b534364e327c24aeb8d73b5aBenjamin Kramer
7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  doMulWide = (OptLevel > 0);
733a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
743a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski
753a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskiint NVPTXDAGToDAGISel::getDivF32Level() const {
763a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (UsePrecDivF32.getNumOccurrences() > 0) {
773a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-prec-div32=N is used on the command-line, always honor it
783a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return UsePrecDivF32;
793a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
803a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, use div.approx if fast math is enabled
813a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (TM.Options.UnsafeFPMath)
823a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return 0;
833a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
843a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return 2;
853a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
863a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
883a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskibool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
893a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (UsePrecSqrtF32.getNumOccurrences() > 0) {
903a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
913a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return UsePrecSqrtF32;
923a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
933a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, use sqrt.approx if fast math is enabled
943a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (TM.Options.UnsafeFPMath)
953a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return false;
963a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
973a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return true;
983a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
993a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski}
10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1013a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinskibool NVPTXDAGToDAGISel::useF32FTZ() const {
1023a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  if (FtzEnabled.getNumOccurrences() > 0) {
1033a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // If nvptx-f32ftz is used on the command-line, always honor it
1043a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    return FtzEnabled;
1053a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  } else {
1063a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    const Function *F = MF->getFunction();
1073a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    // Otherwise, check for an nvptx-f32ftz attribute on the function
1083a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    if (F->hasFnAttribute("nvptx-f32ftz"))
1093a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return (F->getAttributes().getAttribute(AttributeSet::FunctionIndex,
1103a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski                                              "nvptx-f32ftz")
1113a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski                                              .getValueAsString() == "true");
1123a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski    else
1133a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski      return false;
1143a8ee4ffd783bd0cf2d83089edb43ec546b49d0dJustin Holewinski  }
11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// Select - Select instructions not customized! Used for
11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// expanded, promoted and normal instructions.
1193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::Select(SDNode *N) {
12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N->isMachineOpcode())
1223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL; // Already selected.
12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDNode *ResNode = NULL;
12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (N->getOpcode()) {
12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::LOAD:
12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectLoad(N);
12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::STORE:
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectStore(N);
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
1327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV2:
1337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV4:
1347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectLoadVector(N);
1357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV2:
1377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV4:
1387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV2:
1397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV4:
1407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectLDGLDUVector(N);
1417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
1437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
1447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectStoreVector(N);
1457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParam:
1471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV2:
1481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV4:
1491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectLoadParam(N);
1501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
1511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetval:
1521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV2:
1531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV4:
1541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectStoreRetval(N);
1551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
1561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParam:
1571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV2:
1581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV4:
1591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamS32:
1601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamU32:
1611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    ResNode = SelectStoreParam(N);
1621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
1633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
1643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
16549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
16649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ResNode)
16749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return ResNode;
16849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectCode(N);
16949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
17049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic unsigned int getCodeAddrSpace(MemSDNode *N,
1723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                                     const NVPTXSubtarget &Subtarget) {
17349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  const Value *Src = N->getSrcValue();
1747c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski
17549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
1767c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    return NVPTX::PTXLdStInstCode::GENERIC;
17749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
17849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType())) {
17949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (PT->getAddressSpace()) {
1807c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
1817c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
1827c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
1837c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
1847c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
1857c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
1867c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski    default: break;
18749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
18849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
1897c32502a7f81dfaddb79c9c8e5b1acc759e19af9Justin Holewinski  return NVPTX::PTXLdStInstCode::GENERIC;
19049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
19149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N) {
193ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
19449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LoadSDNode *LD = cast<LoadSDNode>(N);
19549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT LoadedVT = LD->getMemoryVT();
1963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  SDNode *NVPTXLD = NULL;
19749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
19849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
19949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (LD->isIndexed())
20049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
20149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
20249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!LoadedVT.isSimple())
20349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
20449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
20549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
20649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(LD, Subtarget);
20749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
20849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
20949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
21049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = LD->isVolatile();
21149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
21249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
21349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
21449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
21549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
21649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
21749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
21849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
21949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
22049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
22149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
22249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
22349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
22449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
22549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
22649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return NULL;
22749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
22849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
22949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: fromType + fromTypeWidth
23049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
23149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Sign   : ISD::SEXTLOAD
23249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
23349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //          type is integer
23449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
23549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
236d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
237d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
23849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int fromType;
23949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if ((LD->getExtensionType() == ISD::SEXTLOAD))
24049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Signed;
24149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else if (ScalarVT.isFloatingPoint())
24249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Float;
24349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
24449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Unsigned;
24549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
24649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
24749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
24849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
24949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
25049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
25149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
25249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT::SimpleValueType TargetVT = LD->getValueType(0).getSimpleVT().SimpleTy;
25349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
25449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N1, Addr)) {
25549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
2563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
2573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_avar;
2583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
2603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_avar;
2613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
2633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_avar;
2643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
2663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_avar;
2673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
2693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_avar;
2703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
2723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_avar;
2733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
2753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
27649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
2773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
2783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
2793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Addr, Chain };
2802a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
2813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
2823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
2833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
28449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
2853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
2863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_asi;
2873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
2893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_asi;
2903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
2923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_asi;
2933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
2953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_asi;
2963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
2983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_asi;
2993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
3003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
3013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_asi;
3023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
3033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
3043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
30549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
3063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
3073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
3083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
3092a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
3103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
3113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
3123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
3137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
3147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari_64;
3173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari_64;
3203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari_64;
3233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari_64;
3263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari_64;
3293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari_64;
3323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
3367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
3377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari;
3403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari;
3433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari;
3463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari;
3493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari;
3523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari;
3553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
35949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
3603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
3613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
3623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
3632a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
3643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else {
3657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
3667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg_64;
3693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg_64;
3723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg_64;
3753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg_64;
3783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg_64;
3813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg_64;
3843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
3887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
3897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg;
3923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg;
3953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg;
3983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
4003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg;
4013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
4033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg;
4043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
4063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg;
4073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
4093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
4107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
41149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
4123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
4133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
4143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), N1, Chain };
4152a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
41649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
41749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
41849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (NVPTXLD != NULL) {
41949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
42049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
42149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
42249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
42349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
42449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXLD;
42549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
42649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4277eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoadVector(SDNode *N) {
4287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
4307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
4317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
4327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
433ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
4347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
4357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
4367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT LoadedVT = MemSD->getMemoryVT();
4377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (!LoadedVT.isSimple())
4393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
4407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
4427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
4437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
4457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
4467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
4477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
4487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
4497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
4507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
4517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Vector Setting
4537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
4547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: fromType + fromTypeWidth
4567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //
4577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Sign   : ISD::SEXTLOAD
4587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
4597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //          type is integer
4607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
4617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
462d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
463d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
4647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int FromType;
4657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // The last operand holds the original LoadSDNode::getExtensionType() value
4663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ExtensionType = cast<ConstantSDNode>(
4673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N->getOperand(N->getNumOperands() - 1))->getZExtValue();
4687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ExtensionType == ISD::SEXTLOAD)
4697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Signed;
4707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else if (ScalarVT.isFloatingPoint())
4717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Float;
4727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
4737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Unsigned;
4747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
4767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
4783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV2:
4793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
4803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
4813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV4:
4823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
4833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
4843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
4853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
4867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
4877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = N->getValueType(0);
4897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(Op1, Addr)) {
4917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
4923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
4933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
4947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
4957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
4963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
4973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
4983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
4993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_avar;
5003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_avar;
5033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_avar;
5063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_avar;
5093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_avar;
5123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_avar;
5153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
5197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
5203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_avar;
5243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_avar;
5273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_avar;
5303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_avar;
5333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
5377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
5383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
5393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
5403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Addr, Chain };
5412a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
5423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
5433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
5443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
5457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
5463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
5473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
5487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
5497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
5503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_asi;
5543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_asi;
5573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_asi;
5603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_asi;
5633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_asi;
5663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_asi;
5693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
5737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
5743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_asi;
5783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_asi;
5813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_asi;
5843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_asi;
5873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
5917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
5923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
5933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
5943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
5952a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
5963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
5973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
5983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
5997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
6007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
6013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
6023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
6037eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
6047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari_64;
6093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari_64;
6123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari_64;
6153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
6173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari_64;
6183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari_64;
6213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
6233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari_64;
6243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
6287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari_64;
6333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari_64;
6363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari_64;
6393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari_64;
6423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
6467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
6477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
6483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
6493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
6507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
6517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari;
6563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari;
6593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari;
6623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
6643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari;
6653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari;
6683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
6703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari;
6713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
6757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari;
6803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari;
6833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari;
6863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari;
6893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
6937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
6947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
6963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
6973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
6987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6992a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
7007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
7017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
7027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
7033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
7043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
7057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
7067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg_64;
7113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg_64;
7143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg_64;
7173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
7193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg_64;
7203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg_64;
7233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
7253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg_64;
7263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
7307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg_64;
7353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg_64;
7383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg_64;
7413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg_64;
7443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
7497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
7503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
7513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
7527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
7537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg;
7583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg;
7613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg;
7643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
7663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg;
7673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg;
7703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
7723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg;
7733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
7777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg;
7823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg;
7853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg;
7883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg;
7913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
7967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
7983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
7993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Op1, Chain };
8002a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
8017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
8027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8037eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
8047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
8057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
8067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
8087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
8097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8107eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLDGLDUVector(SDNode *N) {
8117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
8137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
8147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
815ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
8167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
8171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(N);
8189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  SDValue Base, Offset, Addr;
8191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
8209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  EVT EltVT = Mem->getMemoryVT().getVectorElementType();
8217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
8229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  if (SelectDirectAddr(Op1, Addr)) {
8237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
8243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
8253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
8267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV2:
8279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
8283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
8323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
8353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
8383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
8409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
8413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
8443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
8469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
8473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    case NVPTXISD::LDUV2:
8519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
8523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
8563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
8593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
8629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        break;
8639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case MVT::i64:
8649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
8653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
8689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        break;
8699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case MVT::f64:
8709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
8713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    case NVPTXISD::LDGV4:
8759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
8763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
8803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
8833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
8863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
8893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV4:
8939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
8943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
8983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
9009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
9013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
9039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
9043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
9069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
9073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
9107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
9119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
9129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Addr, Chain };
9139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
9149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                                ArrayRef<SDValue>(Ops, 2));
9159bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  } else if (Subtarget.is64Bit()
9169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                 ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
9179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
9189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    if (Subtarget.is64Bit()) {
9199bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
9203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
9213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
9229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
9239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
9259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
9269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
9279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
9289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
9309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
9319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
9339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
9349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
9369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
9379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
9399bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
9409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
9429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
9439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
9453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
9479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
9499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
9509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
9519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
9529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
9549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
9559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
9579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
9589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
9609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
9619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
9639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
9649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
9669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
9679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
9693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
9719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
9739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
9749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
9759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
9769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
9789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
9799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
9819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
9829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
9849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
9859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
9873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
9899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
9909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
9919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
9929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
9939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
9949bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9959bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
9969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
9979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
9989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
9999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
10009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10019bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
10029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
10039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
10053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
10067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
10079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    } else {
10089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
10093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
10103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
10119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
10129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
10139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
10149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
10159bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
10169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
10179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
10199bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
10209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10219bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
10229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
10239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
10259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
10269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
10289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
10299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
10319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
10329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
10343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
10359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
10369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
10379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
10389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
10399bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
10409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
10419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
10439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
10449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
10469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
10479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
10499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
10509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
10529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
10539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
10559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
10569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
10583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
10599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
10609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
10619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
10629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
10639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
10649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
10659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
10679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
10689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
10709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
10719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
10739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
10749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
10763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
10779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
10789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
10799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
10809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
10819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
10829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
10839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
10859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
10869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10879bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
10889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
10899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10909bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
10919bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
10929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
10939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
10943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
10957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
10969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    }
10979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
10989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Base, Offset, Chain };
10999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski
11009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
11019bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                                ArrayRef<SDValue>(Ops, 3));
11029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  } else {
11039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    if (Subtarget.is64Bit()) {
11049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
11053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
11089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
11099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
11109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
11119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
11129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
11139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
11159bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
11169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
11189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
11199bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
11219bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
11229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
11249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
11259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
11279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
11289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
11303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
11329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
11339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
11349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
11359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
11369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
11379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
11399bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
11409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
11429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
11439bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
11459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
11469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
11489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
11499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
11519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
11529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
11543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
11569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
11579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
11589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
11599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
11609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
11619bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
11639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
11649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
11669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
11679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
11699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
11709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
11723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
11749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
11759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
11769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
11779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
11789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
11799bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11809bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
11819bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
11829bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
11849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
11859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
11879bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
11889bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
11899bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
11903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11929bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    } else {
11939bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      switch (N->getOpcode()) {
11943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11969bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV2:
11979bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
11989bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
11999bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
12009bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12019bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
12029bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12039bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12049bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
12059bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12069bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12079bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
12089bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12099bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
12109bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
12119bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12129bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12139bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
12149bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12159bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
12169bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
12179bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12189bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12209bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV2:
12219bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
12229bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
12239bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
12249bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12259bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
12269bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12279bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12289bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
12299bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12309bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12319bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
12329bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12339bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i64:
12349bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
12359bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12369bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12379bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
12389bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12399bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f64:
12409bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
12419bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12429bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12449bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDGV4:
12459bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
12469bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
12479bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
12489bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12499bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
12509bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12519bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12529bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
12539bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12549bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12559bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
12569bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12579bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12589bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
12599bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12609bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12629bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski      case NVPTXISD::LDUV4:
12639bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
12649bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        default:
12659bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          return NULL;
12669bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i8:
12679bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
12689bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12699bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i16:
12709bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
12719bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12729bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::i32:
12739bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
12749bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12759bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        case MVT::f32:
12769bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
12779bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski          break;
12789bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski        }
12793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
12817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
12827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12839bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    SDValue Ops[] = { Op1, Chain };
12849bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(),
12859bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski                                ArrayRef<SDValue>(Ops, 2));
12869bc8feeb4fd15883949900194c93fd1704c404b4Justin Holewinski  }
12877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
12897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
12907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
12917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
12937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
12947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStore(SDNode *N) {
1296ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
129749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreSDNode *ST = cast<StoreSDNode>(N);
129849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT StoreVT = ST->getMemoryVT();
129949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDNode *NVPTXST = NULL;
130049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
130149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
130249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ST->isIndexed())
130349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
130449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
130549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!StoreVT.isSimple())
130649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
130749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
130849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
130949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(ST, Subtarget);
131049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
131149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
131249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
131349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = ST->isVolatile();
131449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
131549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
131649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
131749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
131849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
131949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
132049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = StoreVT.getSimpleVT();
132149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
132249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
132349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
132449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
132549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
132649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
132749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
132849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
132949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return NULL;
133049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
133149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
133249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: toType + toTypeWidth
133349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - for integer type, always use 'u'
133449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
133549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
13363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned toTypeWidth = ScalarVT.getSizeInBits();
133749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int toType;
133849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ScalarVT.isFloatingPoint())
133949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Float;
134049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
134149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Unsigned;
134249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
134349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
134449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
134549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
134649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N2 = N->getOperand(2);
134749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
134849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
134949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
135049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT::SimpleValueType SourceVT =
135149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      N1.getNode()->getValueType(0).getSimpleVT().SimpleTy;
135249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
135349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N2, Addr)) {
135449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
13553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
13563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_avar;
13573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
13593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_avar;
13603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
13623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_avar;
13633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
13653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_avar;
13663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
13683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_avar;
13693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
13713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_avar;
13723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
13743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
137549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
13763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
13773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
13783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Addr, Chain };
13792a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
13803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
13813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
13823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
138349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
13843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
13853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_asi;
13863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
13883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_asi;
13893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
13913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_asi;
13923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
13943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_asi;
13953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
13973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_asi;
13983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
13993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
14003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_asi;
14013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
14023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
14033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
140449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
14053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
14063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
14073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
14082a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
14093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
14103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
14113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
14127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
14137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
14143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
14153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari_64;
14163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
14183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari_64;
14193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
14213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari_64;
14223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
14243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari_64;
14253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
14273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari_64;
14283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
14303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari_64;
14313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
14333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
14347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
14357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
14367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
14373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
14383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari;
14393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
14413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari;
14423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
14443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari;
14453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
14473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari;
14483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
14503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari;
14513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
14533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari;
14543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
14563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
14577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
145849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
14593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
14603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
14613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
14622a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
146349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  } else {
14647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
14657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
14663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
14673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg_64;
14683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
14703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg_64;
14713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
14733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg_64;
14743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
14763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg_64;
14773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
14793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg_64;
14803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
14823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg_64;
14833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
14853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
14867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
14877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
14887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
14893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
14903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg;
14913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
14933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg;
14943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
14963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg;
14973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
14983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
14993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg;
15003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
15023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg;
15033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
15053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg;
15063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
15073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
15083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
15097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
151049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
15113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
15123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
15133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), N2, Chain };
15142a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
151549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
151649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
151749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (NVPTXST != NULL) {
151849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
151949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
152049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
152149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
152249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
152349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXST;
152449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
152549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
15267eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreVector(SDNode *N) {
15277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
15287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
15297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
15307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
1531ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
15327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *ST;
15337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = Op1.getValueType();
15347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
15357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT StoreVT = MemSD->getMemoryVT();
15367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
15387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
15397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
15417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    report_fatal_error("Cannot store to pointer that points to constant "
15427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski                       "memory space");
15437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
15447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
15467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
15477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
15487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
15497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
15507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
15517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
15527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: toType + toTypeWidth
15547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - for integer type, always use 'u'
15557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  assert(StoreVT.isSimple() && "Store value is not simple");
15567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
15573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ToTypeWidth = ScalarVT.getSizeInBits();
15587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned ToType;
15597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ScalarVT.isFloatingPoint())
15607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Float;
15617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
15627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Unsigned;
15637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SmallVector<SDValue, 12> StOps;
15657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue N2;
15667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
15677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
15697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
15707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
15717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
15727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
15737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(3);
15747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
15757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
15767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
15777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
15787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
15797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(3));
15807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(4));
15817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(5);
15827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
15833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
15843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
15857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
15867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(IsVolatile));
15887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(CodeAddrSpace));
15897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(VecType));
15907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToType));
15917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToTypeWidth));
15927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(N2, Addr)) {
15947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
15953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
15963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
15977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
15987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
15993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
16003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
16013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
16023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_avar;
16033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
16053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_avar;
16063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
16083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_avar;
16093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
16113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_avar;
16123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
16143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_avar;
16153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
16173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_avar;
16183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
16207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
16217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
16227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
16233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
16243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
16253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
16263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_avar;
16273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
16293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_avar;
16303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
16323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_avar;
16333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
16353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_avar;
16363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
16387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
16397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
16407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Addr);
16413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
16423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
16433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
16447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
16453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
16463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
16477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
16487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
16493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
16503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
16513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
16523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_asi;
16533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
16553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_asi;
16563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
16583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_asi;
16593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
16613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_asi;
16623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
16643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_asi;
16653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
16673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_asi;
16683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
16707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
16717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
16727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
16733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
16743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
16753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
16763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_asi;
16773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
16793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_asi;
16803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
16823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_asi;
16833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
16853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_asi;
16863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
16877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
16887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
16897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
16907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
16917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
16923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
16933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
16943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
16957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
16967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
16973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
16983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
16997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
17007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
17023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
17033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
17043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari_64;
17053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
17073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari_64;
17083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
17103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari_64;
17113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
17133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari_64;
17143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
17163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari_64;
17173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
17193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari_64;
17203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
17227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
17237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
17247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
17263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
17273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
17283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari_64;
17293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
17313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari_64;
17323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
17343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari_64;
17353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
17373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari_64;
17383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
17407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
17417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
17427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
17437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
17443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
17453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
17467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
17477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
17493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
17503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
17513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari;
17523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
17543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari;
17553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
17573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari;
17583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
17603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari;
17613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
17633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari;
17643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
17663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari;
17673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
17697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
17707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
17717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
17733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
17743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
17753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari;
17763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
17783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari;
17793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
17813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari;
17823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
17843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari;
17853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
17867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
17877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
17887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
17897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
17907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
17917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
17927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
17937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
17947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
17953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
17963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
17977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
17987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
17993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
18003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
18013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
18023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg_64;
18033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
18053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg_64;
18063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
18083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg_64;
18093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
18113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg_64;
18123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
18143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg_64;
18153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
18173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg_64;
18183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
18207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
18217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
18227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
18233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
18243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
18253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
18263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg_64;
18273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
18293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg_64;
18303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
18323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg_64;
18333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
18353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg_64;
18363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
18387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
18397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
18407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
18417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
18423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
18433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
18447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
18457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
18463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
18473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
18483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
18493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg;
18503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
18523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg;
18533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
18553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg;
18563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
18583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg;
18593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
18613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg;
18623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
18643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg;
18653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
18677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
18687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
18697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
18703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
18713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
18723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
18733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg;
18743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
18763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg;
18773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
18793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg;
18803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
18823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg;
18833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
18847eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
18857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
18867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
18877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
18887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N2);
18897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
18907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
18917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(Chain);
18927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
18932a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao  ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
18947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
18957eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
18967eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
18977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
18987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
18997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return ST;
19007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
19017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
19021c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoadParam(SDNode *Node) {
19031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = Node->getOperand(0);
19041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = Node->getOperand(2);
19051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Flag = Node->getOperand(3);
19061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(Node);
19071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(Node);
19081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
19091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned VecSize;
19101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (Node->getOpcode()) {
19111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
19121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    return NULL;
19131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParam:
19141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 1;
19151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
19161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV2:
19171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 2;
19181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
19191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::LoadParamV4:
19201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VecSize = 4;
19211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
19221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
19231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
19241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  EVT EltVT = Node->getValueType(0);
19251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  EVT MemVT = Mem->getMemoryVT();
19261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
19271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opc = 0;
19281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
19291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (VecSize) {
19301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
19311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    return NULL;
19321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 1:
19331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
19341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
19351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
19361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
19371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI8;
19381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
19401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI8;
19411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
19431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI16;
19441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
19461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI32;
19471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
19491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemI64;
19501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
19521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemF32;
19531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
19551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemF64;
19561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
19581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
19591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 2:
19601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
19611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
19621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
19631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
19641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I8;
19651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
19671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I8;
19681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
19701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I16;
19711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
19731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I32;
19741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
19761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2I64;
19771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
19791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2F32;
19801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
19821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV2F64;
19831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
19851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
19861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 4:
19871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (MemVT.getSimpleVT().SimpleTy) {
19881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
19891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
19901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
19911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I8;
19921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
19941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I8;
19951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
19971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I16;
19981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
19991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
20001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4I32;
20011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
20031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opc = NVPTX::LoadParamMemV4F32;
20041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
20061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
20071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
20081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDVTList VTs;
20101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  if (VecSize == 1) {
20111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
20121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  } else if (VecSize == 2) {
20131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
20141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  } else {
20151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
20161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    VTs = CurDAG->getVTList(&EVTs[0], 5);
20171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
20181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
20201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 2> Ops;
20221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
20231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
20241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Flag);
20251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
2027be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski      CurDAG->getMachineNode(Opc, DL, VTs, Ops);
20281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
20291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
20301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20311c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreRetval(SDNode *N) {
20321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(N);
20331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = N->getOperand(0);
20341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = N->getOperand(1);
20351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
20361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(N);
20371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // How many elements do we have?
20391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned NumElts = 1;
20401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
20411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
20421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    return NULL;
20431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetval:
20441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 1;
20451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
20461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV2:
20471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 2;
20481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
20491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreRetvalV4:
20501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 4;
20511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
20521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
20531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Build vector of operands
20551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 6> Ops;
20561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  for (unsigned i = 0; i < NumElts; ++i)
20571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    Ops.push_back(N->getOperand(i + 2));
20581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
20591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
20601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
20611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Determine target opcode
20621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // If we have an i1, use an 8-bit store. The lowering code in
20631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // NVPTXISelLowering will have already emitted an upcast.
20641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opcode = 0;
20651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (NumElts) {
20661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
20671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    return NULL;
20681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 1:
20691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
20701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
20711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
20721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
20731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI8;
20741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
20761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI8;
20771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
20791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI16;
20801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
20821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI32;
20831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
20851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalI64;
20861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
20881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalF32;
20891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
20911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalF64;
20921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
20931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
20941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
20951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 2:
20961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
20971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
20981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
20991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
21001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I8;
21011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
21031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I8;
21041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
21061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I16;
21071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
21091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I32;
21101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i64:
21121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2I64;
21131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
21151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2F32;
21161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f64:
21181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV2F64;
21191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
21211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
21221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case 4:
21231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
21241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
21251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
21261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i1:
21271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I8;
21281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i8:
21301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I8;
21311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i16:
21331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I16;
21341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::i32:
21361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4I32;
21371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case MVT::f32:
21391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      Opcode = NVPTX::StoreRetvalV4F32;
21401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
21411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
21421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
21431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
21441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
21461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
21471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
21481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
21491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
21501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
21521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
21531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21541c07dae9fcd04469779edf7b86fef37fecc9466cJustin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreParam(SDNode *N) {
21551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDLoc DL(N);
21561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Chain = N->getOperand(0);
21571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Param = N->getOperand(1);
21581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
21591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Offset = N->getOperand(2);
21601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
21611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemSDNode *Mem = cast<MemSDNode>(N);
21621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDValue Flag = N->getOperand(N->getNumOperands() - 1);
21631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // How many elements do we have?
21651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned NumElts = 1;
21661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
21671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
21681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    return NULL;
21691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamU32:
21701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamS32:
21711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParam:
21721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 1;
21731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
21741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV2:
21751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 2;
21761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
21771c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  case NVPTXISD::StoreParamV4:
21781c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    NumElts = 4;
21791c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
21801c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
21811c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21821c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Build vector of operands
21831c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SmallVector<SDValue, 8> Ops;
21841c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  for (unsigned i = 0; i < NumElts; ++i)
21851c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    Ops.push_back(N->getOperand(i + 3));
21861c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(ParamVal, MVT::i32));
21871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
21881c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Chain);
21891c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  Ops.push_back(Flag);
21901c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
21911c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // Determine target opcode
21921c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // If we have an i1, use an 8-bit store. The lowering code in
21931c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  // NVPTXISelLowering will have already emitted an upcast.
21941c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  unsigned Opcode = 0;
21951c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  switch (N->getOpcode()) {
21961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  default:
21971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    switch (NumElts) {
21981c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    default:
21991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      return NULL;
22001c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 1:
22011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
22021c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
22031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        return NULL;
22041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
22051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI8;
22061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
22081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI8;
22091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22101c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
22111c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI16;
22121c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22131c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
22141c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI32;
22151c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22161c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i64:
22171c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamI64;
22181c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22191c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
22201c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamF32;
22211c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22221c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f64:
22231c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamF64;
22241c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22251c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
22261c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
22271c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 2:
22281c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
22291c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
22301c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        return NULL;
22311c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
22321c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I8;
22331c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22341c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
22351c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I8;
22361c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22371c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
22381c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I16;
22391c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22401c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
22411c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I32;
22421c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22431c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i64:
22441c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2I64;
22451c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22461c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
22471c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2F32;
22481c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22491c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f64:
22501c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV2F64;
22511c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22521c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
22531c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
22541c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    case 4:
22551c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
22561c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      default:
22571c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        return NULL;
22581c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i1:
22591c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I8;
22601c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22611c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i8:
22621c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I8;
22631c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22641c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i16:
22651c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I16;
22661c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22671c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::i32:
22681c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4I32;
22691c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22701c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      case MVT::f32:
22711c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        Opcode = NVPTX::StoreParamV4F32;
22721c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski        break;
22731c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      }
22741c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski      break;
22751c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    }
22761c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
2277ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // Special case: if we have a sign-extend/zero-extend node, insert the
2278ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // conversion instruction first, and use that as the value operand to
2279ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // the selected StoreParam node.
2280ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  case NVPTXISD::StoreParamU32: {
2281ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Opcode = NVPTX::StoreParamI32;
2282ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2283ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                                MVT::i32);
2284ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
2285ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                         MVT::i32, Ops[0], CvtNone);
2286ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Ops[0] = SDValue(Cvt, 0);
22871c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
2288ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  }
2289ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  case NVPTXISD::StoreParamS32: {
2290ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Opcode = NVPTX::StoreParamI32;
2291ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2292ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                                MVT::i32);
2293ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
2294ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski                                         MVT::i32, Ops[0], CvtNone);
2295ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski    Ops[0] = SDValue(Cvt, 0);
22961c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski    break;
22971c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  }
2298ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  }
22991c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
2300be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski  SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
23011c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  SDNode *Ret =
2302be08c60533d27f2714a4a88ba91125bcede32a1eJustin Holewinski      CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
23031c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
23041c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
23051c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
23061c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
23071c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski  return Ret;
23081c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski}
23091c07dae9fcd04469779edf7b86fef37fecc9466cJustin Holewinski
231049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// SelectDirectAddr - Match a direct address for DAG.
231149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// A direct address could be a globaladdress or externalsymbol.
231249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
231349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Return true if TGA or ES.
23143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  if (N.getOpcode() == ISD::TargetGlobalAddress ||
23153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N.getOpcode() == ISD::TargetExternalSymbol) {
231649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N;
231749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
231849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
231949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == NVPTXISD::Wrapper) {
232049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N.getOperand(0);
232149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
232249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
232349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
232449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned IID = cast<ConstantSDNode>(N.getOperand(0))->getZExtValue();
232549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (IID == Intrinsic::nvvm_ptr_gen_to_param)
232649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (N.getOperand(1).getOpcode() == NVPTXISD::MoveParam)
232749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return (SelectDirectAddr(N.getOperand(1).getOperand(0), Address));
232849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
232949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
233049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
233149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
233249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
23333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi_imp(
23343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
233549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
233649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
23373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      SDValue base = Addr.getOperand(0);
233849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (SelectDirectAddr(base, Base)) {
233949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
234049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return true;
234149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      }
234249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
234349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
234449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
234549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
234649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
234749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
234849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
234949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
235049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
235149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
235249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
235349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
235449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
235549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
235649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
235749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
235849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
235949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
23603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri_imp(
23613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
236249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
236349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
236449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Offset = CurDAG->getTargetConstant(0, mvt);
236549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
236649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
236749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
236849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Addr.getOpcode() == ISD::TargetGlobalAddress)
23693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return false; // direct calls.
237049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
237149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
237249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
237349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
237449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
237549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
237649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (FrameIndexSDNode *FIN =
23773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski              dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
237849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        // Constant offset from frame ref.
237949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
238049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      else
238149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = Addr.getOperand(0);
238249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
238349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return true;
238449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
238549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
238649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
238749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
238849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
238949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
239049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
239149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
239249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
239349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
239449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
239549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
239649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
239749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
239849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
239949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
240049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
240149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
240249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                                 unsigned int spN) const {
240349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  const Value *Src = NULL;
240449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Even though MemIntrinsicSDNode is a subclas of MemSDNode,
240549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // the classof() for MemSDNode does not include MemIntrinsicSDNode
240649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // (See SelectionDAGNodes.h). So we need to check for both.
240749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
240849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Src = mN->getSrcValue();
24093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (MemSDNode *mN = dyn_cast<MemIntrinsicSDNode>(N)) {
241049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Src = mN->getSrcValue();
241149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
241249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
241349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return false;
241449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType()))
241549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return (PT->getAddressSpace() == spN);
241649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
241749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
241849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
241949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
242049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// inline asm expressions.
24213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
24223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    const SDValue &Op, char ConstraintCode, std::vector<SDValue> &OutOps) {
242349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Op0, Op1;
242449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (ConstraintCode) {
24253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
24263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return true;
24273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case 'm': // memory
242849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Op, Op0)) {
242949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
243049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(CurDAG->getTargetConstant(0, MVT::i32));
243149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
243249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
243349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
243449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
243549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op1);
243649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
243749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
243849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
243949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
244049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return true;
244149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
244249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
244349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Return true if N is a undef or a constant.
244449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// If N was undef, return a (i8imm 0) in Retval
244549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// If N was imm, convert it to i8imm and return in Retval
244649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Note: The convert to i8imm is required, otherwise the
244749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// pattern matcher inserts a bunch of IMOVi8rr to convert
244849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// the imm to i8imm, and this causes instruction selection
244949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// to fail.
24503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::UndefOrImm(SDValue Op, SDValue N, SDValue &Retval) {
24513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  if (!(N.getOpcode() == ISD::UNDEF) && !(N.getOpcode() == ISD::Constant))
245249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return false;
245349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
245449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == ISD::UNDEF)
245549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Retval = CurDAG->getTargetConstant(0, MVT::i8);
245649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else {
245749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ConstantSDNode *cn = cast<ConstantSDNode>(N.getNode());
245849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned retval = cn->getZExtValue();
245949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Retval = CurDAG->getTargetConstant(retval, MVT::i8);
246049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
246149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return true;
246249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
2463