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