NVPTXISelDAGToDAG.cpp revision d5c52f1d760cd2f6f347733a02bf666fc1d50662
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
283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic cl::opt<bool> UseFMADInstruction(
293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    "nvptx-mad-enable", cl::ZeroOrMore,
303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::desc("NVPTX Specific: Enable generating FMAD instructions"),
313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::init(false));
3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistatic cl::opt<int>
343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiFMAContractLevel("nvptx-fma-level", cl::ZeroOrMore,
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                 cl::desc("NVPTX Specific: FMA contraction (0: don't do it"
363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                          " 1: do it  2: do it aggressively"),
373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 cl::init(2));
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic cl::opt<int> UsePrecDivF32(
403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    "nvptx-prec-divf32", cl::ZeroOrMore,
413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski             " IEEE Compliant F32 div.rnd if avaiable."),
433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    cl::init(2));
4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
45b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinskistatic cl::opt<bool>
46b9c26dcb2438266567ce94570bf294d00d10cc87Justin HolewinskiUsePrecSqrtF32("nvptx-prec-sqrtf32",
47b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
48b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski          cl::init(true));
49b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski
5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// createNVPTXISelDag - This pass converts a legalized DAG into a
5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// NVPTX-specific DAG, ready for instruction scheduling.
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       llvm::CodeGenOpt::Level OptLevel) {
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return new NVPTXDAGToDAGISel(TM, OptLevel);
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     CodeGenOpt::Level OptLevel)
593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    : SelectionDAGISel(tm, OptLevel),
603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Subtarget(tm.getSubtarget<NVPTXSubtarget>()) {
6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Always do fma.f32 fpcontract if the target supports the instruction.
6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Always do fma.f64 fpcontract if the target supports the instruction.
6349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Do mad.f32 is nvptx-mad-enable is specified and the target does not
6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // support fma.f32.
6549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  doFMADF32 = (OptLevel > 0) && UseFMADInstruction && !Subtarget.hasFMAF32();
673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32 = (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel >= 1);
683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64 = (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel >= 1);
693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF32AGG =
703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF32() && (FMAContractLevel == 2);
713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  doFMAF64AGG =
723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      (OptLevel > 0) && Subtarget.hasFMAF64() && (FMAContractLevel == 2);
7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  allowFMA = (FMAContractLevel >= 1) || UseFMADInstruction;
7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
76af878315192a9fa5b534364e327c24aeb8d73b5aBenjamin Kramer  UseF32FTZ = false;
77af878315192a9fa5b534364e327c24aeb8d73b5aBenjamin Kramer
7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  doMulWide = (OptLevel > 0);
7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Decide how to translate f32 div
8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  do_DIVF32_PREC = UsePrecDivF32;
82b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski  // Decide how to translate f32 sqrt
83b9c26dcb2438266567ce94570bf294d00d10cc87Justin Holewinski  do_SQRTF32_PREC = UsePrecSqrtF32;
8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // sm less than sm_20 does not support div.rnd. Use div.full.
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (do_DIVF32_PREC == 2 && !Subtarget.reqPTX20())
8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    do_DIVF32_PREC = 1;
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// Select - Select instructions not customized! Used for
9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// expanded, promoted and normal instructions.
923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::Select(SDNode *N) {
9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N->isMachineOpcode())
953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL; // Already selected.
9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDNode *ResNode = NULL;
9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (N->getOpcode()) {
9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::LOAD:
10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectLoad(N);
10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case ISD::STORE:
10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ResNode = SelectStore(N);
10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
1057eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV2:
1067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LoadV4:
1077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectLoadVector(N);
1087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV2:
1107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDGV4:
1117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV2:
1127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::LDUV4:
1137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectLDGLDUVector(N);
1147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
1167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
1177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ResNode = SelectStoreVector(N);
1187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
1193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
1203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ResNode)
12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return ResNode;
12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectCode(N);
12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic unsigned int getCodeAddrSpace(MemSDNode *N,
1283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                                     const NVPTXSubtarget &Subtarget) {
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  const Value *Src = N->getSrcValue();
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NVPTX::PTXLdStInstCode::LOCAL;
13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType())) {
13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (PT->getAddressSpace()) {
1353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case llvm::ADDRESS_SPACE_LOCAL:
1363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NVPTX::PTXLdStInstCode::LOCAL;
1373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case llvm::ADDRESS_SPACE_GLOBAL:
1383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NVPTX::PTXLdStInstCode::GLOBAL;
1393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case llvm::ADDRESS_SPACE_SHARED:
1403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NVPTX::PTXLdStInstCode::SHARED;
14149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    case llvm::ADDRESS_SPACE_CONST_NOT_GEN:
14249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return NVPTX::PTXLdStInstCode::CONSTANT;
1433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case llvm::ADDRESS_SPACE_GENERIC:
1443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NVPTX::PTXLdStInstCode::GENERIC;
1453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case llvm::ADDRESS_SPACE_PARAM:
1463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NVPTX::PTXLdStInstCode::PARAM;
14749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    case llvm::ADDRESS_SPACE_CONST:
14849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      // If the arch supports generic address space, translate it to GLOBAL
14949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      // for correctness.
15049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      // If the arch does not support generic address space, then the arch
15149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      // does not really support ADDRESS_SPACE_CONST, translate it to
15249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      // to CONSTANT for better performance.
15349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (Subtarget.hasGenericLdSt())
15449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return NVPTX::PTXLdStInstCode::GLOBAL;
15549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      else
15649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return NVPTX::PTXLdStInstCode::CONSTANT;
1573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
1583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
15949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
16049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
16149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTX::PTXLdStInstCode::LOCAL;
16249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
16349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N) {
165ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
16649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LoadSDNode *LD = cast<LoadSDNode>(N);
16749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT LoadedVT = LD->getMemoryVT();
1683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  SDNode *NVPTXLD = NULL;
16949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
17049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
17149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (LD->isIndexed())
17249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
17349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
17449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!LoadedVT.isSimple())
17549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
17649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
17749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
17849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(LD, Subtarget);
17949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
18049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
18149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
18249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = LD->isVolatile();
18349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
18449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
18549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
18649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
18749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
18849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
18949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
19049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
19149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
19249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
19349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
19449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
19549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
19649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
19749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
19849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return NULL;
19949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
20049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
20149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: fromType + fromTypeWidth
20249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
20349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Sign   : ISD::SEXTLOAD
20449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
20549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //          type is integer
20649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
20749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
208d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
209d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
21049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int fromType;
21149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if ((LD->getExtensionType() == ISD::SEXTLOAD))
21249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Signed;
21349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else if (ScalarVT.isFloatingPoint())
21449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Float;
21549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
21649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    fromType = NVPTX::PTXLdStInstCode::Unsigned;
21749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
21849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
21949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
22049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
22149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
22249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
22349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
22449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT::SimpleValueType TargetVT = LD->getValueType(0).getSimpleVT().SimpleTy;
22549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
22649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N1, Addr)) {
22749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
2283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
2293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_avar;
2303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
2323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_avar;
2333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
2353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_avar;
2363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
2383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_avar;
2393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
2413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_avar;
2423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
2443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_avar;
2453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
2473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
24849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
2493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
2503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
2513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Addr, Chain };
2522a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
2533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
2543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
2553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
25649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (TargetVT) {
2573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
2583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i8_asi;
2593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
2613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i16_asi;
2623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
2643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i32_asi;
2653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
2673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_i64_asi;
2683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
2703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f32_asi;
2713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
2733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::LD_f64_asi;
2743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
2753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
2763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
27749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
2783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
2793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
2803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
2812a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
2823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
2833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
2843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
2857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
2867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
2873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
2883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari_64;
2893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
2903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
2913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari_64;
2923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
2933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
2943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari_64;
2953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
2963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
2973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari_64;
2983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
2993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari_64;
3013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari_64;
3043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
3087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
3097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_ari;
3123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_ari;
3153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_ari;
3183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_ari;
3213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_ari;
3243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_ari;
3273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
33149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
3323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
3333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
3343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), Base, Offset, Chain };
3352a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
3363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else {
3377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
3387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg_64;
3413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg_64;
3443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg_64;
3473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg_64;
3503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg_64;
3533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg_64;
3563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
3607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
3617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (TargetVT) {
3623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
3633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i8_areg;
3643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
3663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i16_areg;
3673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
3693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i32_areg;
3703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
3723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_i64_areg;
3733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
3753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f32_areg;
3763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
3783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LD_f64_areg;
3793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
3803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
3813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
3827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
38349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
3843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
3853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(fromType),
3863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(fromTypeWidth), N1, Chain };
3872a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
38849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
38949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
39049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (NVPTXLD != NULL) {
39149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
39249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
39349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
39449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
39549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
39649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXLD;
39749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
39849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3997eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLoadVector(SDNode *N) {
4007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
4027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
4037eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
4047eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
405ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
4067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
4077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
4087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT LoadedVT = MemSD->getMemoryVT();
4097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (!LoadedVT.isSimple())
4113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
4127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4137eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
4147eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
4157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
4177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
4187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
4197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
4207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
4217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
4227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
4237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Vector Setting
4257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT SimpleVT = LoadedVT.getSimpleVT();
4267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: fromType + fromTypeWidth
4287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //
4297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Sign   : ISD::SEXTLOAD
4307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
4317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  //          type is integer
4327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Float  : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
4337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
434d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  // Read at least 8 bits (predicates are stored as 8-bit values)
435d5c52f1d760cd2f6f347733a02bf666fc1d50662Justin Holewinski  unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
4367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned int FromType;
4377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // The last operand holds the original LoadSDNode::getExtensionType() value
4383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ExtensionType = cast<ConstantSDNode>(
4393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N->getOperand(N->getNumOperands() - 1))->getZExtValue();
4407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ExtensionType == ISD::SEXTLOAD)
4417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Signed;
4427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else if (ScalarVT.isFloatingPoint())
4437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Float;
4447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
4457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    FromType = NVPTX::PTXLdStInstCode::Unsigned;
4467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
4487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
4503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV2:
4513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
4523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
4533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXISD::LoadV4:
4543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
4553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    break;
4563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
4573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
4587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
4597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = N->getValueType(0);
4617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
4627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(Op1, Addr)) {
4637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
4643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
4653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
4667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
4677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
4683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
4693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
4703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
4713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_avar;
4723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
4743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_avar;
4753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
4773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_avar;
4783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
4803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_avar;
4813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
4833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_avar;
4843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
4863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_avar;
4873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
4897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
4907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
4917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
4923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
4933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
4943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
4953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_avar;
4963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
4973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
4983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_avar;
4993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_avar;
5023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_avar;
5053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5067eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
5097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
5103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
5113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
5123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Addr, Chain };
5132a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
5143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
5153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
5163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
5177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
5183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
5193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
5207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV2:
5217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
5223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v2_asi;
5263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v2_asi;
5293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v2_asi;
5323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
5343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i64_v2_asi;
5353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v2_asi;
5383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
5403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f64_v2_asi;
5413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LoadV4:
5457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
5463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
5493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i8_v4_asi;
5503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
5523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i16_v4_asi;
5533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
5553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_i32_v4_asi;
5563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
5583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::LDV_f32_v4_asi;
5593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
5607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
5617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
5627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
5637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
5643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
5653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
5663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
5672a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
5683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
5693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
5703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
5717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
5727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
5733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
5743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
5757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
5767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
5773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
5783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
5793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
5803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari_64;
5813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
5833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari_64;
5843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
5863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari_64;
5873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
5893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari_64;
5903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
5923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari_64;
5933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
5953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari_64;
5963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
5977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
5987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
5997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
6007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari_64;
6053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari_64;
6083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari_64;
6113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari_64;
6143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
6187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
6197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
6203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
6213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
6227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
6237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_ari;
6283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_ari;
6313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_ari;
6343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
6363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_ari;
6373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_ari;
6403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
6423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_ari;
6433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
6477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_ari;
6523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_ari;
6553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_ari;
6583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_ari;
6613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
6637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
6647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
6657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
6667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
6683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
6693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Base, Offset, Chain };
6707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
6712a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
6727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
6737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
6747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
6753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
6763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
6777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
6787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
6793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
6803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
6813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
6823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg_64;
6833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
6853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg_64;
6863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
6883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg_64;
6893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
6913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg_64;
6923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
6943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg_64;
6953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
6973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg_64;
6983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
6997eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
7027eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg_64;
7073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg_64;
7103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg_64;
7133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg_64;
7163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
7217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
7223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
7233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
7247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV2:
7257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v2_areg;
7303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v2_areg;
7333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v2_areg;
7363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
7383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i64_v2_areg;
7393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v2_areg;
7423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
7443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f64_v2_areg;
7453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::LoadV4:
7497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
7503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
7513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
7523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
7533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i8_v4_areg;
7543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
7563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i16_v4_areg;
7573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
7593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_i32_v4_areg;
7603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
7623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::LDV_f32_v4_areg;
7633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
7647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
7657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
7667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
7677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
7687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
7703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(VecType), getI32Imm(FromType),
7713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(FromTypeWidth), Op1, Chain };
7722a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
7737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
7747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
7767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
7777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
7787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
7807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
7817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7827eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectLDGLDUVector(SDNode *N) {
7837eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7847eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
7857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
7867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
787ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
7887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *LD;
7897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7907eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT RetVT = N->getValueType(0);
7917eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
7927eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Select opcode
7937eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (Subtarget.is64Bit()) {
7947eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
7953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
7963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
7977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV2:
7987eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
7993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_64;
8033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_64;
8063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_64;
8093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
8113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_64;
8123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_64;
8153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
8173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_64;
8183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8197eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV4:
8227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
8233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_64;
8273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_64;
8303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_64;
8333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_64;
8363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV2:
8407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
8413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_64;
8453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_64;
8483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_64;
8513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
8533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_64;
8543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_64;
8573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
8593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_64;
8603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV4:
8647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
8653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_64;
8693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_64;
8723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_64;
8753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
8773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_64;
8783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
8807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
8817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
8827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
8837eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
8843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
8853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
8867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV2:
8877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
8883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
8893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
8903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
8913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_32;
8923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
8943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_32;
8953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
8973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_32;
8983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
8993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
9003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_32;
9013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
9033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_32;
9043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
9063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_32;
9073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
9107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDGV4:
9117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
9123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
9133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
9143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
9153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_32;
9163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
9183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_32;
9193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
9213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_32;
9223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
9243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_32;
9253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
9287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV2:
9297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
9303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
9313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
9323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
9333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_32;
9343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
9363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_32;
9373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
9393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_32;
9403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
9423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_32;
9433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
9453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_32;
9463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
9483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_32;
9493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
9527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::LDUV4:
9537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (RetVT.getSimpleVT().SimpleTy) {
9543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
9553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
9563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
9573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_32;
9583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
9603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_32;
9613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
9633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_32;
9643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
9663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_32;
9673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
9687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
9697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
9707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
9717eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
9727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Ops[] = { Op1, Chain };
9742a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao  LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
9757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
9777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
9787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
9797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return LD;
9817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
9827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
9833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStore(SDNode *N) {
984ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
98549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreSDNode *ST = cast<StoreSDNode>(N);
98649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EVT StoreVT = ST->getMemoryVT();
98749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDNode *NVPTXST = NULL;
98849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
98949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // do not support pre/post inc/dec
99049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ST->isIndexed())
99149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
99249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
99349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!StoreVT.isSimple())
99449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return NULL;
99549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
99649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Address Space Setting
99749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int codeAddrSpace = getCodeAddrSpace(ST, Subtarget);
99849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
99949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Volatile Setting
100049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - .volatile is only availalble for .global and .shared
100149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isVolatile = ST->isVolatile();
100249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
100349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
100449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
100549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    isVolatile = false;
100649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
100749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Vector Setting
100849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT SimpleVT = StoreVT.getSimpleVT();
100949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
101049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SimpleVT.isVector()) {
101149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned num = SimpleVT.getVectorNumElements();
101249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (num == 2)
101349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V2;
101449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else if (num == 4)
101549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      vecType = NVPTX::PTXLdStInstCode::V4;
101649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    else
101749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return NULL;
101849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
101949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
102049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Type Setting: toType + toTypeWidth
102149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // - for integer type, always use 'u'
102249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  //
102349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT ScalarVT = SimpleVT.getScalarType();
10243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned toTypeWidth = ScalarVT.getSizeInBits();
102549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned int toType;
102649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (ScalarVT.isFloatingPoint())
102749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Float;
102849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else
102949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    toType = NVPTX::PTXLdStInstCode::Unsigned;
103049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
103149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Create the machine instruction DAG
103249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Chain = N->getOperand(0);
103349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N1 = N->getOperand(1);
103449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue N2 = N->getOperand(2);
103549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Addr;
103649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Offset, Base;
103749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  unsigned Opcode;
103849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MVT::SimpleValueType SourceVT =
103949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      N1.getNode()->getValueType(0).getSimpleVT().SimpleTy;
104049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
104149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (SelectDirectAddr(N2, Addr)) {
104249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
10433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
10443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_avar;
10453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
10473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_avar;
10483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
10503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_avar;
10513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
10533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_avar;
10543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
10563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_avar;
10573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
10593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_avar;
10603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
10623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
106349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
10643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
10653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
10663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Addr, Chain };
10672a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
10683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
10693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
10703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
107149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    switch (SourceVT) {
10723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i8:
10733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i8_asi;
10743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10753639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i16:
10763639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i16_asi;
10773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i32:
10793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i32_asi;
10803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::i64:
10823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_i64_asi;
10833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f32:
10853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f32_asi;
10863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    case MVT::f64:
10883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      Opcode = NVPTX::ST_f64_asi;
10893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      break;
10903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
10913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
109249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
10933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
10943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
10953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
10962a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
10973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
10983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
10993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
11007eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
11017eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
11023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari_64;
11043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari_64;
11073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11093639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari_64;
11103639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
11123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari_64;
11133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari_64;
11163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
11183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari_64;
11193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
11247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
11253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_ari;
11273639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11283639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_ari;
11303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_ari;
11333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
11353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_ari;
11363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_ari;
11393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
11413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_ari;
11423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11457eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
114649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
11473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
11483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
11493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), Base, Offset, Chain };
11502a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
115149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  } else {
11527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
11537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
11543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg_64;
11563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg_64;
11593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg_64;
11623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
11643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg_64;
11653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg_64;
11683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
11703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg_64;
11713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
11757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
11767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (SourceVT) {
11773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
11783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i8_areg;
11793639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
11813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i16_areg;
11823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
11843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i32_areg;
11853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
11873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_i64_areg;
11883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
11903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f32_areg;
11913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
11933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::ST_f64_areg;
11943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
11953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
11963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
11977eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
119849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
11993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
12003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(vecType), getI32Imm(toType),
12013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                      getI32Imm(toTypeWidth), N2, Chain };
12022a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao    NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
120349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
120449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
120549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (NVPTXST != NULL) {
120649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
120749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
120849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
120949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
121049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
121149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return NVPTXST;
121249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
121349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12147eacad03efda36e09ebd96e95d7891cadaaa9087Justin HolewinskiSDNode *NVPTXDAGToDAGISel::SelectStoreVector(SDNode *N) {
12157eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Chain = N->getOperand(0);
12167eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Op1 = N->getOperand(1);
12177eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue Addr, Offset, Base;
12187eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned Opcode;
1219ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(N);
12207eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDNode *ST;
12217eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT EltVT = Op1.getValueType();
12227eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemSDNode *MemSD = cast<MemSDNode>(N);
12237eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  EVT StoreVT = MemSD->getMemoryVT();
12247eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Address Space Setting
12267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned CodeAddrSpace = getCodeAddrSpace(MemSD, Subtarget);
12277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
12297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    report_fatal_error("Cannot store to pointer that points to constant "
12307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski                       "memory space");
12317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
12327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Volatile Setting
12347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - .volatile is only availalble for .global and .shared
12357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  bool IsVolatile = MemSD->isVolatile();
12367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
12377eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
12387eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
12397eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    IsVolatile = false;
12407eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12417eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // Type Setting: toType + toTypeWidth
12427eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  // - for integer type, always use 'u'
12437eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  assert(StoreVT.isSimple() && "Store value is not simple");
12447eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
12453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  unsigned ToTypeWidth = ScalarVT.getSizeInBits();
12467eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned ToType;
12477eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (ScalarVT.isFloatingPoint())
12487eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Float;
12497eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  else
12507eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    ToType = NVPTX::PTXLdStInstCode::Unsigned;
12517eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12527eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SmallVector<SDValue, 12> StOps;
12537eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue N2;
12547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  unsigned VecType;
12557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  switch (N->getOpcode()) {
12577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV2:
12587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V2;
12597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
12607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
12617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(3);
12627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
12637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  case NVPTXISD::StoreV4:
12647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    VecType = NVPTX::PTXLdStInstCode::V4;
12657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(1));
12667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(2));
12677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(3));
12687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N->getOperand(4));
12697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    N2 = N->getOperand(5);
12707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    break;
12713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
12723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return NULL;
12737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
12747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(IsVolatile));
12767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(CodeAddrSpace));
12777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(VecType));
12787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToType));
12797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(getI32Imm(ToTypeWidth));
12807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
12817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  if (SelectDirectAddr(N2, Addr)) {
12827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
12833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
12843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
12857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
12867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
12873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
12883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
12893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
12903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_avar;
12913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
12933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_avar;
12943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
12963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_avar;
12973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
12983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
12993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_avar;
13003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
13023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_avar;
13033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
13053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_avar;
13063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
13087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
13097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
13107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
13113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
13123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
13133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
13143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_avar;
13153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
13173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_avar;
13183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
13203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_avar;
13213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
13233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_avar;
13243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
13267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
13277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
13287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Addr);
13293639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
13303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
13313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
13327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    switch (N->getOpcode()) {
13333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    default:
13343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      return NULL;
13357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV2:
13367eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
13373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
13383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
13393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
13403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v2_asi;
13413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
13433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v2_asi;
13443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
13463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v2_asi;
13473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i64:
13493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i64_v2_asi;
13503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
13523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v2_asi;
13533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f64:
13553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f64_v2_asi;
13563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
13587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
13597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    case NVPTXISD::StoreV4:
13607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (EltVT.getSimpleVT().SimpleTy) {
13613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
13623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
13633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i8:
13643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i8_v4_asi;
13653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i16:
13673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i16_v4_asi;
13683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::i32:
13703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_i32_v4_asi;
13713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      case MVT::f32:
13733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        Opcode = NVPTX::STV_f32_v4_asi;
13743639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        break;
13757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
13767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      break;
13777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
13787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
13797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
13803639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (Subtarget.is64Bit()
13813639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
13823639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski                 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
13837eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
13847eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
13853639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
13863639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
13877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
13887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
13893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
13903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
13913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
13923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari_64;
13933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
13943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
13953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari_64;
13963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
13973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
13983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari_64;
13993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
14013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari_64;
14023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
14043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari_64;
14053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
14073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari_64;
14083639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
14107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
14117eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
14127eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
14143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
14153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
14163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari_64;
14173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
14193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari_64;
14203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
14223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari_64;
14233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
14253639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari_64;
14263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
14287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
14297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
14307eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
14317eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
14323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
14333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
14347eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
14357eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
14373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
14383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
14393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_ari;
14403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
14423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_ari;
14433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
14453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_ari;
14463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
14483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_ari;
14493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
14513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_ari;
14523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
14543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_ari;
14553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
14577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
14587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
14597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
14613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
14623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
14633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_ari;
14643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
14663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_ari;
14673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
14693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_ari;
14703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
14723639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_ari;
14733639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
14757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
14767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
14777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
14787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Base);
14797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(Offset);
14807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  } else {
14817eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    if (Subtarget.is64Bit()) {
14827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
14833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
14843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
14857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
14867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
14873639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
14883639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
14893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
14903639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg_64;
14913639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14923639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
14933639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg_64;
14943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
14963639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg_64;
14973639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
14983639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
14993639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg_64;
15003639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
15023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg_64;
15033639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15043639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
15053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg_64;
15063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15077eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
15087eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
15097eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
15107eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15113639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
15123639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
15133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
15143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg_64;
15153639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
15173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg_64;
15183639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15193639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
15203639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg_64;
15213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15223639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
15233639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg_64;
15243639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15257eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
15267eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
15277eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
15287eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    } else {
15297eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      switch (N->getOpcode()) {
15303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      default:
15313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        return NULL;
15327eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV2:
15337eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
15353639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
15363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
15373639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v2_areg;
15383639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15393639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
15403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v2_areg;
15413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15423639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
15433639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v2_areg;
15443639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15453639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i64:
15463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i64_v2_areg;
15473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
15493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v2_areg;
15503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f64:
15523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f64_v2_areg;
15533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15547eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
15557eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
15567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      case NVPTXISD::StoreV4:
15577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        switch (EltVT.getSimpleVT().SimpleTy) {
15583639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        default:
15593639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          return NULL;
15603639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i8:
15613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i8_v4_areg;
15623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i16:
15643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i16_v4_areg;
15653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15663639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::i32:
15673639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_i32_v4_areg;
15683639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski        case MVT::f32:
15703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          Opcode = NVPTX::STV_f32_v4_areg;
15713639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski          break;
15727eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        }
15737eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski        break;
15747eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski      }
15757eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    }
15767eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski    StOps.push_back(N2);
15777eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  }
15787eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15797eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StOps.push_back(Chain);
15807eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15812a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao  ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
15827eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15837eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
15847eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
15857eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
15867eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
15877eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  return ST;
15887eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski}
15897eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
159049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// SelectDirectAddr - Match a direct address for DAG.
159149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// A direct address could be a globaladdress or externalsymbol.
159249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
159349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Return true if TGA or ES.
15943639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  if (N.getOpcode() == ISD::TargetGlobalAddress ||
15953639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      N.getOpcode() == ISD::TargetExternalSymbol) {
159649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N;
159749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
159849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
159949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == NVPTXISD::Wrapper) {
160049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Address = N.getOperand(0);
160149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
160249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
160349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
160449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned IID = cast<ConstantSDNode>(N.getOperand(0))->getZExtValue();
160549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (IID == Intrinsic::nvvm_ptr_gen_to_param)
160649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (N.getOperand(1).getOpcode() == NVPTXISD::MoveParam)
160749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return (SelectDirectAddr(N.getOperand(1).getOperand(0), Address));
160849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
160949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
161049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
161149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
161249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
16133639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi_imp(
16143639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
161549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
161649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
16173639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski      SDValue base = Addr.getOperand(0);
161849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (SelectDirectAddr(base, Base)) {
161949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
162049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        return true;
162149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      }
162249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
162349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
162449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
162549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
162649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
162749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
162849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
162949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
163049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
163149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
163249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
163349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// symbol+offset
163449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
163549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
163649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
163749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
163849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
163949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
16403639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri_imp(
16413639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
164249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
164349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
164449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Offset = CurDAG->getTargetConstant(0, mvt);
164549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return true;
164649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
164749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
164849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Addr.getOpcode() == ISD::TargetGlobalAddress)
16493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return false; // direct calls.
165049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
165149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (Addr.getOpcode() == ISD::ADD) {
165249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
165349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
165449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
165549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
165649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      if (FrameIndexSDNode *FIN =
16573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski              dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
165849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        // Constant offset from frame ref.
165949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
166049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      else
166149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski        Base = Addr.getOperand(0);
166249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
166349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return true;
166449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
166549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
166649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
166749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
166849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
166949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
167049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
167149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                     SDValue &Base, SDValue &Offset) {
167249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
167349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
167449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
167549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register+offset
167649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
167749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                       SDValue &Base, SDValue &Offset) {
167849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
167949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
168049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
168149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
168249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                                 unsigned int spN) const {
168349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  const Value *Src = NULL;
168449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Even though MemIntrinsicSDNode is a subclas of MemSDNode,
168549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // the classof() for MemSDNode does not include MemIntrinsicSDNode
168649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // (See SelectionDAGNodes.h). So we need to check for both.
168749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
168849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Src = mN->getSrcValue();
16893639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  } else if (MemSDNode *mN = dyn_cast<MemIntrinsicSDNode>(N)) {
169049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Src = mN->getSrcValue();
169149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
169249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (!Src)
169349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return false;
169449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (const PointerType *PT = dyn_cast<PointerType>(Src->getType()))
169549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return (PT->getAddressSpace() == spN);
169649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return false;
169749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
169849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
169949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
170049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// inline asm expressions.
17013639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
17023639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    const SDValue &Op, char ConstraintCode, std::vector<SDValue> &OutOps) {
170349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue Op0, Op1;
170449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (ConstraintCode) {
17053639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  default:
17063639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return true;
17073639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case 'm': // memory
170849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectDirectAddr(Op, Op0)) {
170949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
171049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(CurDAG->getTargetConstant(0, MVT::i32));
171149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
171249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
171349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
171449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op0);
171549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      OutOps.push_back(Op1);
171649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski      return false;
171749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    }
171849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    break;
171949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
172049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return true;
172149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
172249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
172349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Return true if N is a undef or a constant.
172449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// If N was undef, return a (i8imm 0) in Retval
172549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// If N was imm, convert it to i8imm and return in Retval
172649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Note: The convert to i8imm is required, otherwise the
172749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// pattern matcher inserts a bunch of IMOVi8rr to convert
172849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// the imm to i8imm, and this causes instruction selection
172949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// to fail.
17303639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool NVPTXDAGToDAGISel::UndefOrImm(SDValue Op, SDValue N, SDValue &Retval) {
17313639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  if (!(N.getOpcode() == ISD::UNDEF) && !(N.getOpcode() == ISD::Constant))
173249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return false;
173349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
173449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  if (N.getOpcode() == ISD::UNDEF)
173549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Retval = CurDAG->getTargetConstant(0, MVT::i8);
173649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  else {
173749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    ConstantSDNode *cn = cast<ConstantSDNode>(N.getNode());
173849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    unsigned retval = cn->getZExtValue();
173949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Retval = CurDAG->getTargetConstant(retval, MVT::i8);
174049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
174149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return true;
174249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
1743