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