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