1*9880d681SAndroid Build Coastguard Worker //===-- NVPTXISelDAGToDAG.cpp - A dag to dag inst selector for NVPTX ------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines an instruction selector for the NVPTX target.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "NVPTXISelDAGToDAG.h"
15*9880d681SAndroid Build Coastguard Worker #include "NVPTXUtilities.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ValueTracking.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetIntrinsicInfo.h"
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker using namespace llvm;
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "nvptx-isel"
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker static cl::opt<int> UsePrecDivF32(
30*9880d681SAndroid Build Coastguard Worker "nvptx-prec-divf32", cl::ZeroOrMore, cl::Hidden,
31*9880d681SAndroid Build Coastguard Worker cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
32*9880d681SAndroid Build Coastguard Worker " IEEE Compliant F32 div.rnd if available."),
33*9880d681SAndroid Build Coastguard Worker cl::init(2));
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
36*9880d681SAndroid Build Coastguard Worker UsePrecSqrtF32("nvptx-prec-sqrtf32", cl::Hidden,
37*9880d681SAndroid Build Coastguard Worker cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
38*9880d681SAndroid Build Coastguard Worker cl::init(true));
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
41*9880d681SAndroid Build Coastguard Worker FtzEnabled("nvptx-f32ftz", cl::ZeroOrMore, cl::Hidden,
42*9880d681SAndroid Build Coastguard Worker cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
43*9880d681SAndroid Build Coastguard Worker cl::init(false));
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker /// createNVPTXISelDag - This pass converts a legalized DAG into a
47*9880d681SAndroid Build Coastguard Worker /// NVPTX-specific DAG, ready for instruction scheduling.
createNVPTXISelDag(NVPTXTargetMachine & TM,llvm::CodeGenOpt::Level OptLevel)48*9880d681SAndroid Build Coastguard Worker FunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
49*9880d681SAndroid Build Coastguard Worker llvm::CodeGenOpt::Level OptLevel) {
50*9880d681SAndroid Build Coastguard Worker return new NVPTXDAGToDAGISel(TM, OptLevel);
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker
NVPTXDAGToDAGISel(NVPTXTargetMachine & tm,CodeGenOpt::Level OptLevel)53*9880d681SAndroid Build Coastguard Worker NVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
54*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel)
55*9880d681SAndroid Build Coastguard Worker : SelectionDAGISel(tm, OptLevel), TM(tm) {
56*9880d681SAndroid Build Coastguard Worker doMulWide = (OptLevel > 0);
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker
runOnMachineFunction(MachineFunction & MF)59*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
60*9880d681SAndroid Build Coastguard Worker Subtarget = &static_cast<const NVPTXSubtarget &>(MF.getSubtarget());
61*9880d681SAndroid Build Coastguard Worker return SelectionDAGISel::runOnMachineFunction(MF);
62*9880d681SAndroid Build Coastguard Worker }
63*9880d681SAndroid Build Coastguard Worker
getDivF32Level() const64*9880d681SAndroid Build Coastguard Worker int NVPTXDAGToDAGISel::getDivF32Level() const {
65*9880d681SAndroid Build Coastguard Worker if (UsePrecDivF32.getNumOccurrences() > 0) {
66*9880d681SAndroid Build Coastguard Worker // If nvptx-prec-div32=N is used on the command-line, always honor it
67*9880d681SAndroid Build Coastguard Worker return UsePrecDivF32;
68*9880d681SAndroid Build Coastguard Worker } else {
69*9880d681SAndroid Build Coastguard Worker // Otherwise, use div.approx if fast math is enabled
70*9880d681SAndroid Build Coastguard Worker if (TM.Options.UnsafeFPMath)
71*9880d681SAndroid Build Coastguard Worker return 0;
72*9880d681SAndroid Build Coastguard Worker else
73*9880d681SAndroid Build Coastguard Worker return 2;
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker }
76*9880d681SAndroid Build Coastguard Worker
usePrecSqrtF32() const77*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
78*9880d681SAndroid Build Coastguard Worker if (UsePrecSqrtF32.getNumOccurrences() > 0) {
79*9880d681SAndroid Build Coastguard Worker // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
80*9880d681SAndroid Build Coastguard Worker return UsePrecSqrtF32;
81*9880d681SAndroid Build Coastguard Worker } else {
82*9880d681SAndroid Build Coastguard Worker // Otherwise, use sqrt.approx if fast math is enabled
83*9880d681SAndroid Build Coastguard Worker return !TM.Options.UnsafeFPMath;
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker }
86*9880d681SAndroid Build Coastguard Worker
useF32FTZ() const87*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::useF32FTZ() const {
88*9880d681SAndroid Build Coastguard Worker if (FtzEnabled.getNumOccurrences() > 0) {
89*9880d681SAndroid Build Coastguard Worker // If nvptx-f32ftz is used on the command-line, always honor it
90*9880d681SAndroid Build Coastguard Worker return FtzEnabled;
91*9880d681SAndroid Build Coastguard Worker } else {
92*9880d681SAndroid Build Coastguard Worker const Function *F = MF->getFunction();
93*9880d681SAndroid Build Coastguard Worker // Otherwise, check for an nvptx-f32ftz attribute on the function
94*9880d681SAndroid Build Coastguard Worker if (F->hasFnAttribute("nvptx-f32ftz"))
95*9880d681SAndroid Build Coastguard Worker return F->getFnAttribute("nvptx-f32ftz").getValueAsString() == "true";
96*9880d681SAndroid Build Coastguard Worker else
97*9880d681SAndroid Build Coastguard Worker return false;
98*9880d681SAndroid Build Coastguard Worker }
99*9880d681SAndroid Build Coastguard Worker }
100*9880d681SAndroid Build Coastguard Worker
allowFMA() const101*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::allowFMA() const {
102*9880d681SAndroid Build Coastguard Worker const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
103*9880d681SAndroid Build Coastguard Worker return TL->allowFMA(*MF, OptLevel);
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker /// Select - Select instructions not customized! Used for
107*9880d681SAndroid Build Coastguard Worker /// expanded, promoted and normal instructions.
Select(SDNode * N)108*9880d681SAndroid Build Coastguard Worker void NVPTXDAGToDAGISel::Select(SDNode *N) {
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker if (N->isMachineOpcode()) {
111*9880d681SAndroid Build Coastguard Worker N->setNodeId(-1);
112*9880d681SAndroid Build Coastguard Worker return; // Already selected.
113*9880d681SAndroid Build Coastguard Worker }
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
116*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
117*9880d681SAndroid Build Coastguard Worker if (tryLoad(N))
118*9880d681SAndroid Build Coastguard Worker return;
119*9880d681SAndroid Build Coastguard Worker break;
120*9880d681SAndroid Build Coastguard Worker case ISD::STORE:
121*9880d681SAndroid Build Coastguard Worker if (tryStore(N))
122*9880d681SAndroid Build Coastguard Worker return;
123*9880d681SAndroid Build Coastguard Worker break;
124*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
125*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
126*9880d681SAndroid Build Coastguard Worker if (tryLoadVector(N))
127*9880d681SAndroid Build Coastguard Worker return;
128*9880d681SAndroid Build Coastguard Worker break;
129*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
130*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
131*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
132*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
133*9880d681SAndroid Build Coastguard Worker if (tryLDGLDU(N))
134*9880d681SAndroid Build Coastguard Worker return;
135*9880d681SAndroid Build Coastguard Worker break;
136*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
137*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
138*9880d681SAndroid Build Coastguard Worker if (tryStoreVector(N))
139*9880d681SAndroid Build Coastguard Worker return;
140*9880d681SAndroid Build Coastguard Worker break;
141*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParam:
142*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV2:
143*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV4:
144*9880d681SAndroid Build Coastguard Worker if (tryLoadParam(N))
145*9880d681SAndroid Build Coastguard Worker return;
146*9880d681SAndroid Build Coastguard Worker break;
147*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetval:
148*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV2:
149*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV4:
150*9880d681SAndroid Build Coastguard Worker if (tryStoreRetval(N))
151*9880d681SAndroid Build Coastguard Worker return;
152*9880d681SAndroid Build Coastguard Worker break;
153*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParam:
154*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV2:
155*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV4:
156*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamS32:
157*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamU32:
158*9880d681SAndroid Build Coastguard Worker if (tryStoreParam(N))
159*9880d681SAndroid Build Coastguard Worker return;
160*9880d681SAndroid Build Coastguard Worker break;
161*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_WO_CHAIN:
162*9880d681SAndroid Build Coastguard Worker if (tryIntrinsicNoChain(N))
163*9880d681SAndroid Build Coastguard Worker return;
164*9880d681SAndroid Build Coastguard Worker break;
165*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
166*9880d681SAndroid Build Coastguard Worker if (tryIntrinsicChain(N))
167*9880d681SAndroid Build Coastguard Worker return;
168*9880d681SAndroid Build Coastguard Worker break;
169*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatS32:
170*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloat:
171*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatLevel:
172*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatGrad:
173*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32S32:
174*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32Float:
175*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatLevel:
176*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatGrad:
177*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32S32:
178*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32Float:
179*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatLevel:
180*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatGrad:
181*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatS32:
182*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloat:
183*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatLevel:
184*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatGrad:
185*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32S32:
186*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32Float:
187*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatLevel:
188*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatGrad:
189*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32S32:
190*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32Float:
191*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatLevel:
192*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatGrad:
193*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatS32:
194*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloat:
195*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatLevel:
196*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatGrad:
197*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32S32:
198*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32Float:
199*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatLevel:
200*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatGrad:
201*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32S32:
202*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32Float:
203*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatLevel:
204*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatGrad:
205*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatS32:
206*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloat:
207*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatLevel:
208*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatGrad:
209*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32S32:
210*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32Float:
211*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatLevel:
212*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatGrad:
213*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32S32:
214*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32Float:
215*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatLevel:
216*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatGrad:
217*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatS32:
218*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloat:
219*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatLevel:
220*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatGrad:
221*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32S32:
222*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32Float:
223*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatLevel:
224*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatGrad:
225*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32S32:
226*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32Float:
227*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatLevel:
228*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatGrad:
229*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloat:
230*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloatLevel:
231*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32Float:
232*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32FloatLevel:
233*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32Float:
234*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32FloatLevel:
235*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloat:
236*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloatLevel:
237*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32Float:
238*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32FloatLevel:
239*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32Float:
240*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32FloatLevel:
241*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DFloatFloat:
242*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DFloatFloat:
243*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DFloatFloat:
244*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DFloatFloat:
245*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DS64Float:
246*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DS64Float:
247*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DS64Float:
248*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DS64Float:
249*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DU64Float:
250*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DU64Float:
251*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DU64Float:
252*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DU64Float:
253*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatS32:
254*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloat:
255*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatLevel:
256*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatGrad:
257*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32S32:
258*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32Float:
259*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatLevel:
260*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatGrad:
261*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32S32:
262*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32Float:
263*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatLevel:
264*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatGrad:
265*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatS32:
266*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloat:
267*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
268*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
269*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32S32:
270*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32Float:
271*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatLevel:
272*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatGrad:
273*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32S32:
274*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32Float:
275*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatLevel:
276*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatGrad:
277*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatS32:
278*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloat:
279*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatLevel:
280*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatGrad:
281*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32S32:
282*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32Float:
283*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatLevel:
284*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatGrad:
285*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32S32:
286*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32Float:
287*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatLevel:
288*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatGrad:
289*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatS32:
290*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloat:
291*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
292*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
293*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32S32:
294*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32Float:
295*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatLevel:
296*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatGrad:
297*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32S32:
298*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32Float:
299*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatLevel:
300*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatGrad:
301*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatS32:
302*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloat:
303*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatLevel:
304*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatGrad:
305*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32S32:
306*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32Float:
307*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatLevel:
308*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatGrad:
309*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32S32:
310*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32Float:
311*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatLevel:
312*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatGrad:
313*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloat:
314*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
315*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32Float:
316*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32FloatLevel:
317*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32Float:
318*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32FloatLevel:
319*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
320*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
321*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32Float:
322*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
323*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32Float:
324*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
325*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DFloatFloat:
326*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DFloatFloat:
327*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DFloatFloat:
328*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DFloatFloat:
329*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DS64Float:
330*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DS64Float:
331*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DS64Float:
332*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DS64Float:
333*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DU64Float:
334*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DU64Float:
335*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DU64Float:
336*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DU64Float:
337*9880d681SAndroid Build Coastguard Worker if (tryTextureIntrinsic(N))
338*9880d681SAndroid Build Coastguard Worker return;
339*9880d681SAndroid Build Coastguard Worker break;
340*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Clamp:
341*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Clamp:
342*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Clamp:
343*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Clamp:
344*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Clamp:
345*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Clamp:
346*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Clamp:
347*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Clamp:
348*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Clamp:
349*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Clamp:
350*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Clamp:
351*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Clamp:
352*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Clamp:
353*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Clamp:
354*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Clamp:
355*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Clamp:
356*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Clamp:
357*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Clamp:
358*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Clamp:
359*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Clamp:
360*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Clamp:
361*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Clamp:
362*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Clamp:
363*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Clamp:
364*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Clamp:
365*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Clamp:
366*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Clamp:
367*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Clamp:
368*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Clamp:
369*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Clamp:
370*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Clamp:
371*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Clamp:
372*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Clamp:
373*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Clamp:
374*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Clamp:
375*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Clamp:
376*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Clamp:
377*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Clamp:
378*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Clamp:
379*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Clamp:
380*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Clamp:
381*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Clamp:
382*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Clamp:
383*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Clamp:
384*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Clamp:
385*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Clamp:
386*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Clamp:
387*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Clamp:
388*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Clamp:
389*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Clamp:
390*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Clamp:
391*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Clamp:
392*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Clamp:
393*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Clamp:
394*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Clamp:
395*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Trap:
396*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Trap:
397*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Trap:
398*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Trap:
399*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Trap:
400*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Trap:
401*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Trap:
402*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Trap:
403*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Trap:
404*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Trap:
405*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Trap:
406*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Trap:
407*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Trap:
408*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Trap:
409*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Trap:
410*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Trap:
411*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Trap:
412*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Trap:
413*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Trap:
414*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Trap:
415*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Trap:
416*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Trap:
417*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Trap:
418*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Trap:
419*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Trap:
420*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Trap:
421*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Trap:
422*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Trap:
423*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Trap:
424*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Trap:
425*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Trap:
426*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Trap:
427*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Trap:
428*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Trap:
429*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Trap:
430*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Trap:
431*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Trap:
432*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Trap:
433*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Trap:
434*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Trap:
435*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Trap:
436*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Trap:
437*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Trap:
438*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Trap:
439*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Trap:
440*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Trap:
441*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Trap:
442*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Trap:
443*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Trap:
444*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Trap:
445*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Trap:
446*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Trap:
447*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Trap:
448*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Trap:
449*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Trap:
450*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Zero:
451*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Zero:
452*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Zero:
453*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Zero:
454*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Zero:
455*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Zero:
456*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Zero:
457*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Zero:
458*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Zero:
459*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Zero:
460*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Zero:
461*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Zero:
462*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Zero:
463*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Zero:
464*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Zero:
465*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Zero:
466*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Zero:
467*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Zero:
468*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Zero:
469*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Zero:
470*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Zero:
471*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Zero:
472*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Zero:
473*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Zero:
474*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Zero:
475*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Zero:
476*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Zero:
477*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Zero:
478*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Zero:
479*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Zero:
480*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Zero:
481*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Zero:
482*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Zero:
483*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Zero:
484*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Zero:
485*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Zero:
486*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Zero:
487*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Zero:
488*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Zero:
489*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Zero:
490*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Zero:
491*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Zero:
492*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Zero:
493*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Zero:
494*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Zero:
495*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Zero:
496*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Zero:
497*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Zero:
498*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Zero:
499*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Zero:
500*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Zero:
501*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Zero:
502*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Zero:
503*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Zero:
504*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Zero:
505*9880d681SAndroid Build Coastguard Worker if (trySurfaceIntrinsic(N))
506*9880d681SAndroid Build Coastguard Worker return;
507*9880d681SAndroid Build Coastguard Worker break;
508*9880d681SAndroid Build Coastguard Worker case ISD::AND:
509*9880d681SAndroid Build Coastguard Worker case ISD::SRA:
510*9880d681SAndroid Build Coastguard Worker case ISD::SRL:
511*9880d681SAndroid Build Coastguard Worker // Try to select BFE
512*9880d681SAndroid Build Coastguard Worker if (tryBFE(N))
513*9880d681SAndroid Build Coastguard Worker return;
514*9880d681SAndroid Build Coastguard Worker break;
515*9880d681SAndroid Build Coastguard Worker case ISD::ADDRSPACECAST:
516*9880d681SAndroid Build Coastguard Worker SelectAddrSpaceCast(N);
517*9880d681SAndroid Build Coastguard Worker return;
518*9880d681SAndroid Build Coastguard Worker default:
519*9880d681SAndroid Build Coastguard Worker break;
520*9880d681SAndroid Build Coastguard Worker }
521*9880d681SAndroid Build Coastguard Worker SelectCode(N);
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker
tryIntrinsicChain(SDNode * N)524*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryIntrinsicChain(SDNode *N) {
525*9880d681SAndroid Build Coastguard Worker unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
526*9880d681SAndroid Build Coastguard Worker switch (IID) {
527*9880d681SAndroid Build Coastguard Worker default:
528*9880d681SAndroid Build Coastguard Worker return false;
529*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
530*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
531*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p:
532*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
533*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
534*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p:
535*9880d681SAndroid Build Coastguard Worker return tryLDGLDU(N);
536*9880d681SAndroid Build Coastguard Worker }
537*9880d681SAndroid Build Coastguard Worker }
538*9880d681SAndroid Build Coastguard Worker
getCodeAddrSpace(MemSDNode * N)539*9880d681SAndroid Build Coastguard Worker static unsigned int getCodeAddrSpace(MemSDNode *N) {
540*9880d681SAndroid Build Coastguard Worker const Value *Src = N->getMemOperand()->getValue();
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Worker if (!Src)
543*9880d681SAndroid Build Coastguard Worker return NVPTX::PTXLdStInstCode::GENERIC;
544*9880d681SAndroid Build Coastguard Worker
545*9880d681SAndroid Build Coastguard Worker if (auto *PT = dyn_cast<PointerType>(Src->getType())) {
546*9880d681SAndroid Build Coastguard Worker switch (PT->getAddressSpace()) {
547*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
548*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
549*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
550*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
551*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
552*9880d681SAndroid Build Coastguard Worker case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
553*9880d681SAndroid Build Coastguard Worker default: break;
554*9880d681SAndroid Build Coastguard Worker }
555*9880d681SAndroid Build Coastguard Worker }
556*9880d681SAndroid Build Coastguard Worker return NVPTX::PTXLdStInstCode::GENERIC;
557*9880d681SAndroid Build Coastguard Worker }
558*9880d681SAndroid Build Coastguard Worker
canLowerToLDG(MemSDNode * N,const NVPTXSubtarget & Subtarget,unsigned CodeAddrSpace,MachineFunction * F)559*9880d681SAndroid Build Coastguard Worker static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget,
560*9880d681SAndroid Build Coastguard Worker unsigned CodeAddrSpace, MachineFunction *F) {
561*9880d681SAndroid Build Coastguard Worker // To use non-coherent caching, the load has to be from global
562*9880d681SAndroid Build Coastguard Worker // memory and we have to prove that the memory area is not written
563*9880d681SAndroid Build Coastguard Worker // to anywhere for the duration of the kernel call, not even after
564*9880d681SAndroid Build Coastguard Worker // the load.
565*9880d681SAndroid Build Coastguard Worker //
566*9880d681SAndroid Build Coastguard Worker // To ensure that there are no writes to the memory, we require the
567*9880d681SAndroid Build Coastguard Worker // underlying pointer to be a noalias (__restrict) kernel parameter
568*9880d681SAndroid Build Coastguard Worker // that is never used for a write. We can only do this for kernel
569*9880d681SAndroid Build Coastguard Worker // functions since from within a device function, we cannot know if
570*9880d681SAndroid Build Coastguard Worker // there were or will be writes to the memory from the caller - or we
571*9880d681SAndroid Build Coastguard Worker // could, but then we would have to do inter-procedural analysis.
572*9880d681SAndroid Build Coastguard Worker if (!Subtarget.hasLDG() || CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL ||
573*9880d681SAndroid Build Coastguard Worker !isKernelFunction(*F->getFunction())) {
574*9880d681SAndroid Build Coastguard Worker return false;
575*9880d681SAndroid Build Coastguard Worker }
576*9880d681SAndroid Build Coastguard Worker
577*9880d681SAndroid Build Coastguard Worker // We use GetUnderlyingObjects() here instead of
578*9880d681SAndroid Build Coastguard Worker // GetUnderlyingObject() mainly because the former looks through phi
579*9880d681SAndroid Build Coastguard Worker // nodes while the latter does not. We need to look through phi
580*9880d681SAndroid Build Coastguard Worker // nodes to handle pointer induction variables.
581*9880d681SAndroid Build Coastguard Worker SmallVector<Value *, 8> Objs;
582*9880d681SAndroid Build Coastguard Worker GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()),
583*9880d681SAndroid Build Coastguard Worker Objs, F->getDataLayout());
584*9880d681SAndroid Build Coastguard Worker for (Value *Obj : Objs) {
585*9880d681SAndroid Build Coastguard Worker auto *A = dyn_cast<const Argument>(Obj);
586*9880d681SAndroid Build Coastguard Worker if (!A || !A->onlyReadsMemory() || !A->hasNoAliasAttr()) return false;
587*9880d681SAndroid Build Coastguard Worker }
588*9880d681SAndroid Build Coastguard Worker
589*9880d681SAndroid Build Coastguard Worker return true;
590*9880d681SAndroid Build Coastguard Worker }
591*9880d681SAndroid Build Coastguard Worker
tryIntrinsicNoChain(SDNode * N)592*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryIntrinsicNoChain(SDNode *N) {
593*9880d681SAndroid Build Coastguard Worker unsigned IID = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
594*9880d681SAndroid Build Coastguard Worker switch (IID) {
595*9880d681SAndroid Build Coastguard Worker default:
596*9880d681SAndroid Build Coastguard Worker return false;
597*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_texsurf_handle_internal:
598*9880d681SAndroid Build Coastguard Worker SelectTexSurfHandle(N);
599*9880d681SAndroid Build Coastguard Worker return true;
600*9880d681SAndroid Build Coastguard Worker }
601*9880d681SAndroid Build Coastguard Worker }
602*9880d681SAndroid Build Coastguard Worker
SelectTexSurfHandle(SDNode * N)603*9880d681SAndroid Build Coastguard Worker void NVPTXDAGToDAGISel::SelectTexSurfHandle(SDNode *N) {
604*9880d681SAndroid Build Coastguard Worker // Op 0 is the intrinsic ID
605*9880d681SAndroid Build Coastguard Worker SDValue Wrapper = N->getOperand(1);
606*9880d681SAndroid Build Coastguard Worker SDValue GlobalVal = Wrapper.getOperand(0);
607*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(NVPTX::texsurf_handles, SDLoc(N),
608*9880d681SAndroid Build Coastguard Worker MVT::i64, GlobalVal));
609*9880d681SAndroid Build Coastguard Worker }
610*9880d681SAndroid Build Coastguard Worker
SelectAddrSpaceCast(SDNode * N)611*9880d681SAndroid Build Coastguard Worker void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
612*9880d681SAndroid Build Coastguard Worker SDValue Src = N->getOperand(0);
613*9880d681SAndroid Build Coastguard Worker AddrSpaceCastSDNode *CastN = cast<AddrSpaceCastSDNode>(N);
614*9880d681SAndroid Build Coastguard Worker unsigned SrcAddrSpace = CastN->getSrcAddressSpace();
615*9880d681SAndroid Build Coastguard Worker unsigned DstAddrSpace = CastN->getDestAddressSpace();
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Worker assert(SrcAddrSpace != DstAddrSpace &&
618*9880d681SAndroid Build Coastguard Worker "addrspacecast must be between different address spaces");
619*9880d681SAndroid Build Coastguard Worker
620*9880d681SAndroid Build Coastguard Worker if (DstAddrSpace == ADDRESS_SPACE_GENERIC) {
621*9880d681SAndroid Build Coastguard Worker // Specific to generic
622*9880d681SAndroid Build Coastguard Worker unsigned Opc;
623*9880d681SAndroid Build Coastguard Worker switch (SrcAddrSpace) {
624*9880d681SAndroid Build Coastguard Worker default: report_fatal_error("Bad address space in addrspacecast");
625*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_GLOBAL:
626*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_global_yes_64 : NVPTX::cvta_global_yes;
627*9880d681SAndroid Build Coastguard Worker break;
628*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_SHARED:
629*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_shared_yes_64 : NVPTX::cvta_shared_yes;
630*9880d681SAndroid Build Coastguard Worker break;
631*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_CONST:
632*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_const_yes_64 : NVPTX::cvta_const_yes;
633*9880d681SAndroid Build Coastguard Worker break;
634*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_LOCAL:
635*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_local_yes_64 : NVPTX::cvta_local_yes;
636*9880d681SAndroid Build Coastguard Worker break;
637*9880d681SAndroid Build Coastguard Worker }
638*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
639*9880d681SAndroid Build Coastguard Worker Src));
640*9880d681SAndroid Build Coastguard Worker return;
641*9880d681SAndroid Build Coastguard Worker } else {
642*9880d681SAndroid Build Coastguard Worker // Generic to specific
643*9880d681SAndroid Build Coastguard Worker if (SrcAddrSpace != 0)
644*9880d681SAndroid Build Coastguard Worker report_fatal_error("Cannot cast between two non-generic address spaces");
645*9880d681SAndroid Build Coastguard Worker unsigned Opc;
646*9880d681SAndroid Build Coastguard Worker switch (DstAddrSpace) {
647*9880d681SAndroid Build Coastguard Worker default: report_fatal_error("Bad address space in addrspacecast");
648*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_GLOBAL:
649*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_to_global_yes_64
650*9880d681SAndroid Build Coastguard Worker : NVPTX::cvta_to_global_yes;
651*9880d681SAndroid Build Coastguard Worker break;
652*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_SHARED:
653*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::cvta_to_shared_yes_64
654*9880d681SAndroid Build Coastguard Worker : NVPTX::cvta_to_shared_yes;
655*9880d681SAndroid Build Coastguard Worker break;
656*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_CONST:
657*9880d681SAndroid Build Coastguard Worker Opc =
658*9880d681SAndroid Build Coastguard Worker TM.is64Bit() ? NVPTX::cvta_to_const_yes_64 : NVPTX::cvta_to_const_yes;
659*9880d681SAndroid Build Coastguard Worker break;
660*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_LOCAL:
661*9880d681SAndroid Build Coastguard Worker Opc =
662*9880d681SAndroid Build Coastguard Worker TM.is64Bit() ? NVPTX::cvta_to_local_yes_64 : NVPTX::cvta_to_local_yes;
663*9880d681SAndroid Build Coastguard Worker break;
664*9880d681SAndroid Build Coastguard Worker case ADDRESS_SPACE_PARAM:
665*9880d681SAndroid Build Coastguard Worker Opc = TM.is64Bit() ? NVPTX::nvvm_ptr_gen_to_param_64
666*9880d681SAndroid Build Coastguard Worker : NVPTX::nvvm_ptr_gen_to_param;
667*9880d681SAndroid Build Coastguard Worker break;
668*9880d681SAndroid Build Coastguard Worker }
669*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
670*9880d681SAndroid Build Coastguard Worker Src));
671*9880d681SAndroid Build Coastguard Worker return;
672*9880d681SAndroid Build Coastguard Worker }
673*9880d681SAndroid Build Coastguard Worker }
674*9880d681SAndroid Build Coastguard Worker
tryLoad(SDNode * N)675*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
676*9880d681SAndroid Build Coastguard Worker SDLoc dl(N);
677*9880d681SAndroid Build Coastguard Worker LoadSDNode *LD = cast<LoadSDNode>(N);
678*9880d681SAndroid Build Coastguard Worker EVT LoadedVT = LD->getMemoryVT();
679*9880d681SAndroid Build Coastguard Worker SDNode *NVPTXLD = nullptr;
680*9880d681SAndroid Build Coastguard Worker
681*9880d681SAndroid Build Coastguard Worker // do not support pre/post inc/dec
682*9880d681SAndroid Build Coastguard Worker if (LD->isIndexed())
683*9880d681SAndroid Build Coastguard Worker return false;
684*9880d681SAndroid Build Coastguard Worker
685*9880d681SAndroid Build Coastguard Worker if (!LoadedVT.isSimple())
686*9880d681SAndroid Build Coastguard Worker return false;
687*9880d681SAndroid Build Coastguard Worker
688*9880d681SAndroid Build Coastguard Worker // Address Space Setting
689*9880d681SAndroid Build Coastguard Worker unsigned int codeAddrSpace = getCodeAddrSpace(LD);
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker if (canLowerToLDG(LD, *Subtarget, codeAddrSpace, MF)) {
692*9880d681SAndroid Build Coastguard Worker return tryLDGLDU(N);
693*9880d681SAndroid Build Coastguard Worker }
694*9880d681SAndroid Build Coastguard Worker
695*9880d681SAndroid Build Coastguard Worker // Volatile Setting
696*9880d681SAndroid Build Coastguard Worker // - .volatile is only availalble for .global and .shared
697*9880d681SAndroid Build Coastguard Worker bool isVolatile = LD->isVolatile();
698*9880d681SAndroid Build Coastguard Worker if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
699*9880d681SAndroid Build Coastguard Worker codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
700*9880d681SAndroid Build Coastguard Worker codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
701*9880d681SAndroid Build Coastguard Worker isVolatile = false;
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Worker // Vector Setting
704*9880d681SAndroid Build Coastguard Worker MVT SimpleVT = LoadedVT.getSimpleVT();
705*9880d681SAndroid Build Coastguard Worker unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
706*9880d681SAndroid Build Coastguard Worker if (SimpleVT.isVector()) {
707*9880d681SAndroid Build Coastguard Worker unsigned num = SimpleVT.getVectorNumElements();
708*9880d681SAndroid Build Coastguard Worker if (num == 2)
709*9880d681SAndroid Build Coastguard Worker vecType = NVPTX::PTXLdStInstCode::V2;
710*9880d681SAndroid Build Coastguard Worker else if (num == 4)
711*9880d681SAndroid Build Coastguard Worker vecType = NVPTX::PTXLdStInstCode::V4;
712*9880d681SAndroid Build Coastguard Worker else
713*9880d681SAndroid Build Coastguard Worker return false;
714*9880d681SAndroid Build Coastguard Worker }
715*9880d681SAndroid Build Coastguard Worker
716*9880d681SAndroid Build Coastguard Worker // Type Setting: fromType + fromTypeWidth
717*9880d681SAndroid Build Coastguard Worker //
718*9880d681SAndroid Build Coastguard Worker // Sign : ISD::SEXTLOAD
719*9880d681SAndroid Build Coastguard Worker // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
720*9880d681SAndroid Build Coastguard Worker // type is integer
721*9880d681SAndroid Build Coastguard Worker // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
722*9880d681SAndroid Build Coastguard Worker MVT ScalarVT = SimpleVT.getScalarType();
723*9880d681SAndroid Build Coastguard Worker // Read at least 8 bits (predicates are stored as 8-bit values)
724*9880d681SAndroid Build Coastguard Worker unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
725*9880d681SAndroid Build Coastguard Worker unsigned int fromType;
726*9880d681SAndroid Build Coastguard Worker if ((LD->getExtensionType() == ISD::SEXTLOAD))
727*9880d681SAndroid Build Coastguard Worker fromType = NVPTX::PTXLdStInstCode::Signed;
728*9880d681SAndroid Build Coastguard Worker else if (ScalarVT.isFloatingPoint())
729*9880d681SAndroid Build Coastguard Worker fromType = NVPTX::PTXLdStInstCode::Float;
730*9880d681SAndroid Build Coastguard Worker else
731*9880d681SAndroid Build Coastguard Worker fromType = NVPTX::PTXLdStInstCode::Unsigned;
732*9880d681SAndroid Build Coastguard Worker
733*9880d681SAndroid Build Coastguard Worker // Create the machine instruction DAG
734*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
735*9880d681SAndroid Build Coastguard Worker SDValue N1 = N->getOperand(1);
736*9880d681SAndroid Build Coastguard Worker SDValue Addr;
737*9880d681SAndroid Build Coastguard Worker SDValue Offset, Base;
738*9880d681SAndroid Build Coastguard Worker unsigned Opcode;
739*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType TargetVT = LD->getSimpleValueType(0).SimpleTy;
740*9880d681SAndroid Build Coastguard Worker
741*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(N1, Addr)) {
742*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
743*9880d681SAndroid Build Coastguard Worker case MVT::i8:
744*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_avar;
745*9880d681SAndroid Build Coastguard Worker break;
746*9880d681SAndroid Build Coastguard Worker case MVT::i16:
747*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_avar;
748*9880d681SAndroid Build Coastguard Worker break;
749*9880d681SAndroid Build Coastguard Worker case MVT::i32:
750*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_avar;
751*9880d681SAndroid Build Coastguard Worker break;
752*9880d681SAndroid Build Coastguard Worker case MVT::i64:
753*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_avar;
754*9880d681SAndroid Build Coastguard Worker break;
755*9880d681SAndroid Build Coastguard Worker case MVT::f32:
756*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_avar;
757*9880d681SAndroid Build Coastguard Worker break;
758*9880d681SAndroid Build Coastguard Worker case MVT::f64:
759*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_avar;
760*9880d681SAndroid Build Coastguard Worker break;
761*9880d681SAndroid Build Coastguard Worker default:
762*9880d681SAndroid Build Coastguard Worker return false;
763*9880d681SAndroid Build Coastguard Worker }
764*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
765*9880d681SAndroid Build Coastguard Worker getI32Imm(vecType, dl), getI32Imm(fromType, dl),
766*9880d681SAndroid Build Coastguard Worker getI32Imm(fromTypeWidth, dl), Addr, Chain };
767*9880d681SAndroid Build Coastguard Worker NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
768*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
769*9880d681SAndroid Build Coastguard Worker : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
770*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
771*9880d681SAndroid Build Coastguard Worker case MVT::i8:
772*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_asi;
773*9880d681SAndroid Build Coastguard Worker break;
774*9880d681SAndroid Build Coastguard Worker case MVT::i16:
775*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_asi;
776*9880d681SAndroid Build Coastguard Worker break;
777*9880d681SAndroid Build Coastguard Worker case MVT::i32:
778*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_asi;
779*9880d681SAndroid Build Coastguard Worker break;
780*9880d681SAndroid Build Coastguard Worker case MVT::i64:
781*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_asi;
782*9880d681SAndroid Build Coastguard Worker break;
783*9880d681SAndroid Build Coastguard Worker case MVT::f32:
784*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_asi;
785*9880d681SAndroid Build Coastguard Worker break;
786*9880d681SAndroid Build Coastguard Worker case MVT::f64:
787*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_asi;
788*9880d681SAndroid Build Coastguard Worker break;
789*9880d681SAndroid Build Coastguard Worker default:
790*9880d681SAndroid Build Coastguard Worker return false;
791*9880d681SAndroid Build Coastguard Worker }
792*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
793*9880d681SAndroid Build Coastguard Worker getI32Imm(vecType, dl), getI32Imm(fromType, dl),
794*9880d681SAndroid Build Coastguard Worker getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
795*9880d681SAndroid Build Coastguard Worker NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
796*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
797*9880d681SAndroid Build Coastguard Worker : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
798*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
799*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
800*9880d681SAndroid Build Coastguard Worker case MVT::i8:
801*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_ari_64;
802*9880d681SAndroid Build Coastguard Worker break;
803*9880d681SAndroid Build Coastguard Worker case MVT::i16:
804*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_ari_64;
805*9880d681SAndroid Build Coastguard Worker break;
806*9880d681SAndroid Build Coastguard Worker case MVT::i32:
807*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_ari_64;
808*9880d681SAndroid Build Coastguard Worker break;
809*9880d681SAndroid Build Coastguard Worker case MVT::i64:
810*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_ari_64;
811*9880d681SAndroid Build Coastguard Worker break;
812*9880d681SAndroid Build Coastguard Worker case MVT::f32:
813*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_ari_64;
814*9880d681SAndroid Build Coastguard Worker break;
815*9880d681SAndroid Build Coastguard Worker case MVT::f64:
816*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_ari_64;
817*9880d681SAndroid Build Coastguard Worker break;
818*9880d681SAndroid Build Coastguard Worker default:
819*9880d681SAndroid Build Coastguard Worker return false;
820*9880d681SAndroid Build Coastguard Worker }
821*9880d681SAndroid Build Coastguard Worker } else {
822*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
823*9880d681SAndroid Build Coastguard Worker case MVT::i8:
824*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_ari;
825*9880d681SAndroid Build Coastguard Worker break;
826*9880d681SAndroid Build Coastguard Worker case MVT::i16:
827*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_ari;
828*9880d681SAndroid Build Coastguard Worker break;
829*9880d681SAndroid Build Coastguard Worker case MVT::i32:
830*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_ari;
831*9880d681SAndroid Build Coastguard Worker break;
832*9880d681SAndroid Build Coastguard Worker case MVT::i64:
833*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_ari;
834*9880d681SAndroid Build Coastguard Worker break;
835*9880d681SAndroid Build Coastguard Worker case MVT::f32:
836*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_ari;
837*9880d681SAndroid Build Coastguard Worker break;
838*9880d681SAndroid Build Coastguard Worker case MVT::f64:
839*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_ari;
840*9880d681SAndroid Build Coastguard Worker break;
841*9880d681SAndroid Build Coastguard Worker default:
842*9880d681SAndroid Build Coastguard Worker return false;
843*9880d681SAndroid Build Coastguard Worker }
844*9880d681SAndroid Build Coastguard Worker }
845*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
846*9880d681SAndroid Build Coastguard Worker getI32Imm(vecType, dl), getI32Imm(fromType, dl),
847*9880d681SAndroid Build Coastguard Worker getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
848*9880d681SAndroid Build Coastguard Worker NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
849*9880d681SAndroid Build Coastguard Worker } else {
850*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
851*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
852*9880d681SAndroid Build Coastguard Worker case MVT::i8:
853*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_areg_64;
854*9880d681SAndroid Build Coastguard Worker break;
855*9880d681SAndroid Build Coastguard Worker case MVT::i16:
856*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_areg_64;
857*9880d681SAndroid Build Coastguard Worker break;
858*9880d681SAndroid Build Coastguard Worker case MVT::i32:
859*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_areg_64;
860*9880d681SAndroid Build Coastguard Worker break;
861*9880d681SAndroid Build Coastguard Worker case MVT::i64:
862*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_areg_64;
863*9880d681SAndroid Build Coastguard Worker break;
864*9880d681SAndroid Build Coastguard Worker case MVT::f32:
865*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_areg_64;
866*9880d681SAndroid Build Coastguard Worker break;
867*9880d681SAndroid Build Coastguard Worker case MVT::f64:
868*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_areg_64;
869*9880d681SAndroid Build Coastguard Worker break;
870*9880d681SAndroid Build Coastguard Worker default:
871*9880d681SAndroid Build Coastguard Worker return false;
872*9880d681SAndroid Build Coastguard Worker }
873*9880d681SAndroid Build Coastguard Worker } else {
874*9880d681SAndroid Build Coastguard Worker switch (TargetVT) {
875*9880d681SAndroid Build Coastguard Worker case MVT::i8:
876*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i8_areg;
877*9880d681SAndroid Build Coastguard Worker break;
878*9880d681SAndroid Build Coastguard Worker case MVT::i16:
879*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i16_areg;
880*9880d681SAndroid Build Coastguard Worker break;
881*9880d681SAndroid Build Coastguard Worker case MVT::i32:
882*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i32_areg;
883*9880d681SAndroid Build Coastguard Worker break;
884*9880d681SAndroid Build Coastguard Worker case MVT::i64:
885*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_i64_areg;
886*9880d681SAndroid Build Coastguard Worker break;
887*9880d681SAndroid Build Coastguard Worker case MVT::f32:
888*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f32_areg;
889*9880d681SAndroid Build Coastguard Worker break;
890*9880d681SAndroid Build Coastguard Worker case MVT::f64:
891*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LD_f64_areg;
892*9880d681SAndroid Build Coastguard Worker break;
893*9880d681SAndroid Build Coastguard Worker default:
894*9880d681SAndroid Build Coastguard Worker return false;
895*9880d681SAndroid Build Coastguard Worker }
896*9880d681SAndroid Build Coastguard Worker }
897*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
898*9880d681SAndroid Build Coastguard Worker getI32Imm(vecType, dl), getI32Imm(fromType, dl),
899*9880d681SAndroid Build Coastguard Worker getI32Imm(fromTypeWidth, dl), N1, Chain };
900*9880d681SAndroid Build Coastguard Worker NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
901*9880d681SAndroid Build Coastguard Worker }
902*9880d681SAndroid Build Coastguard Worker
903*9880d681SAndroid Build Coastguard Worker if (!NVPTXLD)
904*9880d681SAndroid Build Coastguard Worker return false;
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
907*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
908*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
909*9880d681SAndroid Build Coastguard Worker
910*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, NVPTXLD);
911*9880d681SAndroid Build Coastguard Worker return true;
912*9880d681SAndroid Build Coastguard Worker }
913*9880d681SAndroid Build Coastguard Worker
tryLoadVector(SDNode * N)914*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
915*9880d681SAndroid Build Coastguard Worker
916*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
917*9880d681SAndroid Build Coastguard Worker SDValue Op1 = N->getOperand(1);
918*9880d681SAndroid Build Coastguard Worker SDValue Addr, Offset, Base;
919*9880d681SAndroid Build Coastguard Worker unsigned Opcode;
920*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
921*9880d681SAndroid Build Coastguard Worker SDNode *LD;
922*9880d681SAndroid Build Coastguard Worker MemSDNode *MemSD = cast<MemSDNode>(N);
923*9880d681SAndroid Build Coastguard Worker EVT LoadedVT = MemSD->getMemoryVT();
924*9880d681SAndroid Build Coastguard Worker
925*9880d681SAndroid Build Coastguard Worker if (!LoadedVT.isSimple())
926*9880d681SAndroid Build Coastguard Worker return false;
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Worker // Address Space Setting
929*9880d681SAndroid Build Coastguard Worker unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD);
930*9880d681SAndroid Build Coastguard Worker
931*9880d681SAndroid Build Coastguard Worker if (canLowerToLDG(MemSD, *Subtarget, CodeAddrSpace, MF)) {
932*9880d681SAndroid Build Coastguard Worker return tryLDGLDU(N);
933*9880d681SAndroid Build Coastguard Worker }
934*9880d681SAndroid Build Coastguard Worker
935*9880d681SAndroid Build Coastguard Worker // Volatile Setting
936*9880d681SAndroid Build Coastguard Worker // - .volatile is only availalble for .global and .shared
937*9880d681SAndroid Build Coastguard Worker bool IsVolatile = MemSD->isVolatile();
938*9880d681SAndroid Build Coastguard Worker if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
939*9880d681SAndroid Build Coastguard Worker CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
940*9880d681SAndroid Build Coastguard Worker CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
941*9880d681SAndroid Build Coastguard Worker IsVolatile = false;
942*9880d681SAndroid Build Coastguard Worker
943*9880d681SAndroid Build Coastguard Worker // Vector Setting
944*9880d681SAndroid Build Coastguard Worker MVT SimpleVT = LoadedVT.getSimpleVT();
945*9880d681SAndroid Build Coastguard Worker
946*9880d681SAndroid Build Coastguard Worker // Type Setting: fromType + fromTypeWidth
947*9880d681SAndroid Build Coastguard Worker //
948*9880d681SAndroid Build Coastguard Worker // Sign : ISD::SEXTLOAD
949*9880d681SAndroid Build Coastguard Worker // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
950*9880d681SAndroid Build Coastguard Worker // type is integer
951*9880d681SAndroid Build Coastguard Worker // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
952*9880d681SAndroid Build Coastguard Worker MVT ScalarVT = SimpleVT.getScalarType();
953*9880d681SAndroid Build Coastguard Worker // Read at least 8 bits (predicates are stored as 8-bit values)
954*9880d681SAndroid Build Coastguard Worker unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
955*9880d681SAndroid Build Coastguard Worker unsigned int FromType;
956*9880d681SAndroid Build Coastguard Worker // The last operand holds the original LoadSDNode::getExtensionType() value
957*9880d681SAndroid Build Coastguard Worker unsigned ExtensionType = cast<ConstantSDNode>(
958*9880d681SAndroid Build Coastguard Worker N->getOperand(N->getNumOperands() - 1))->getZExtValue();
959*9880d681SAndroid Build Coastguard Worker if (ExtensionType == ISD::SEXTLOAD)
960*9880d681SAndroid Build Coastguard Worker FromType = NVPTX::PTXLdStInstCode::Signed;
961*9880d681SAndroid Build Coastguard Worker else if (ScalarVT.isFloatingPoint())
962*9880d681SAndroid Build Coastguard Worker FromType = NVPTX::PTXLdStInstCode::Float;
963*9880d681SAndroid Build Coastguard Worker else
964*9880d681SAndroid Build Coastguard Worker FromType = NVPTX::PTXLdStInstCode::Unsigned;
965*9880d681SAndroid Build Coastguard Worker
966*9880d681SAndroid Build Coastguard Worker unsigned VecType;
967*9880d681SAndroid Build Coastguard Worker
968*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
969*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
970*9880d681SAndroid Build Coastguard Worker VecType = NVPTX::PTXLdStInstCode::V2;
971*9880d681SAndroid Build Coastguard Worker break;
972*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
973*9880d681SAndroid Build Coastguard Worker VecType = NVPTX::PTXLdStInstCode::V4;
974*9880d681SAndroid Build Coastguard Worker break;
975*9880d681SAndroid Build Coastguard Worker default:
976*9880d681SAndroid Build Coastguard Worker return false;
977*9880d681SAndroid Build Coastguard Worker }
978*9880d681SAndroid Build Coastguard Worker
979*9880d681SAndroid Build Coastguard Worker EVT EltVT = N->getValueType(0);
980*9880d681SAndroid Build Coastguard Worker
981*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(Op1, Addr)) {
982*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
983*9880d681SAndroid Build Coastguard Worker default:
984*9880d681SAndroid Build Coastguard Worker return false;
985*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
986*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
987*9880d681SAndroid Build Coastguard Worker default:
988*9880d681SAndroid Build Coastguard Worker return false;
989*9880d681SAndroid Build Coastguard Worker case MVT::i8:
990*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_avar;
991*9880d681SAndroid Build Coastguard Worker break;
992*9880d681SAndroid Build Coastguard Worker case MVT::i16:
993*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_avar;
994*9880d681SAndroid Build Coastguard Worker break;
995*9880d681SAndroid Build Coastguard Worker case MVT::i32:
996*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_avar;
997*9880d681SAndroid Build Coastguard Worker break;
998*9880d681SAndroid Build Coastguard Worker case MVT::i64:
999*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_avar;
1000*9880d681SAndroid Build Coastguard Worker break;
1001*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1002*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_avar;
1003*9880d681SAndroid Build Coastguard Worker break;
1004*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1005*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_avar;
1006*9880d681SAndroid Build Coastguard Worker break;
1007*9880d681SAndroid Build Coastguard Worker }
1008*9880d681SAndroid Build Coastguard Worker break;
1009*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1010*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1011*9880d681SAndroid Build Coastguard Worker default:
1012*9880d681SAndroid Build Coastguard Worker return false;
1013*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1014*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_avar;
1015*9880d681SAndroid Build Coastguard Worker break;
1016*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1017*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_avar;
1018*9880d681SAndroid Build Coastguard Worker break;
1019*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1020*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_avar;
1021*9880d681SAndroid Build Coastguard Worker break;
1022*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1023*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_avar;
1024*9880d681SAndroid Build Coastguard Worker break;
1025*9880d681SAndroid Build Coastguard Worker }
1026*9880d681SAndroid Build Coastguard Worker break;
1027*9880d681SAndroid Build Coastguard Worker }
1028*9880d681SAndroid Build Coastguard Worker
1029*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1030*9880d681SAndroid Build Coastguard Worker getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1031*9880d681SAndroid Build Coastguard Worker getI32Imm(FromTypeWidth, DL), Addr, Chain };
1032*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
1033*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
1034*9880d681SAndroid Build Coastguard Worker : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
1035*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1036*9880d681SAndroid Build Coastguard Worker default:
1037*9880d681SAndroid Build Coastguard Worker return false;
1038*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1039*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1040*9880d681SAndroid Build Coastguard Worker default:
1041*9880d681SAndroid Build Coastguard Worker return false;
1042*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1043*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_asi;
1044*9880d681SAndroid Build Coastguard Worker break;
1045*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1046*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_asi;
1047*9880d681SAndroid Build Coastguard Worker break;
1048*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1049*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_asi;
1050*9880d681SAndroid Build Coastguard Worker break;
1051*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1052*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_asi;
1053*9880d681SAndroid Build Coastguard Worker break;
1054*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1055*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_asi;
1056*9880d681SAndroid Build Coastguard Worker break;
1057*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1058*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_asi;
1059*9880d681SAndroid Build Coastguard Worker break;
1060*9880d681SAndroid Build Coastguard Worker }
1061*9880d681SAndroid Build Coastguard Worker break;
1062*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1063*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1064*9880d681SAndroid Build Coastguard Worker default:
1065*9880d681SAndroid Build Coastguard Worker return false;
1066*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1067*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_asi;
1068*9880d681SAndroid Build Coastguard Worker break;
1069*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1070*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_asi;
1071*9880d681SAndroid Build Coastguard Worker break;
1072*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1073*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_asi;
1074*9880d681SAndroid Build Coastguard Worker break;
1075*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1076*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_asi;
1077*9880d681SAndroid Build Coastguard Worker break;
1078*9880d681SAndroid Build Coastguard Worker }
1079*9880d681SAndroid Build Coastguard Worker break;
1080*9880d681SAndroid Build Coastguard Worker }
1081*9880d681SAndroid Build Coastguard Worker
1082*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1083*9880d681SAndroid Build Coastguard Worker getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1084*9880d681SAndroid Build Coastguard Worker getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
1085*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
1086*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1087*9880d681SAndroid Build Coastguard Worker : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1088*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
1089*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1090*9880d681SAndroid Build Coastguard Worker default:
1091*9880d681SAndroid Build Coastguard Worker return false;
1092*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1093*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1094*9880d681SAndroid Build Coastguard Worker default:
1095*9880d681SAndroid Build Coastguard Worker return false;
1096*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1097*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_ari_64;
1098*9880d681SAndroid Build Coastguard Worker break;
1099*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1100*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_ari_64;
1101*9880d681SAndroid Build Coastguard Worker break;
1102*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1103*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_ari_64;
1104*9880d681SAndroid Build Coastguard Worker break;
1105*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1106*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_ari_64;
1107*9880d681SAndroid Build Coastguard Worker break;
1108*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1109*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_ari_64;
1110*9880d681SAndroid Build Coastguard Worker break;
1111*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1112*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_ari_64;
1113*9880d681SAndroid Build Coastguard Worker break;
1114*9880d681SAndroid Build Coastguard Worker }
1115*9880d681SAndroid Build Coastguard Worker break;
1116*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1117*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1118*9880d681SAndroid Build Coastguard Worker default:
1119*9880d681SAndroid Build Coastguard Worker return false;
1120*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1121*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_ari_64;
1122*9880d681SAndroid Build Coastguard Worker break;
1123*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1124*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_ari_64;
1125*9880d681SAndroid Build Coastguard Worker break;
1126*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1127*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_ari_64;
1128*9880d681SAndroid Build Coastguard Worker break;
1129*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1130*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_ari_64;
1131*9880d681SAndroid Build Coastguard Worker break;
1132*9880d681SAndroid Build Coastguard Worker }
1133*9880d681SAndroid Build Coastguard Worker break;
1134*9880d681SAndroid Build Coastguard Worker }
1135*9880d681SAndroid Build Coastguard Worker } else {
1136*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1137*9880d681SAndroid Build Coastguard Worker default:
1138*9880d681SAndroid Build Coastguard Worker return false;
1139*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1140*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1141*9880d681SAndroid Build Coastguard Worker default:
1142*9880d681SAndroid Build Coastguard Worker return false;
1143*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1144*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_ari;
1145*9880d681SAndroid Build Coastguard Worker break;
1146*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1147*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_ari;
1148*9880d681SAndroid Build Coastguard Worker break;
1149*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1150*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_ari;
1151*9880d681SAndroid Build Coastguard Worker break;
1152*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1153*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_ari;
1154*9880d681SAndroid Build Coastguard Worker break;
1155*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1156*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_ari;
1157*9880d681SAndroid Build Coastguard Worker break;
1158*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1159*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_ari;
1160*9880d681SAndroid Build Coastguard Worker break;
1161*9880d681SAndroid Build Coastguard Worker }
1162*9880d681SAndroid Build Coastguard Worker break;
1163*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1164*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1165*9880d681SAndroid Build Coastguard Worker default:
1166*9880d681SAndroid Build Coastguard Worker return false;
1167*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1168*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_ari;
1169*9880d681SAndroid Build Coastguard Worker break;
1170*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1171*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_ari;
1172*9880d681SAndroid Build Coastguard Worker break;
1173*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1174*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_ari;
1175*9880d681SAndroid Build Coastguard Worker break;
1176*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1177*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_ari;
1178*9880d681SAndroid Build Coastguard Worker break;
1179*9880d681SAndroid Build Coastguard Worker }
1180*9880d681SAndroid Build Coastguard Worker break;
1181*9880d681SAndroid Build Coastguard Worker }
1182*9880d681SAndroid Build Coastguard Worker }
1183*9880d681SAndroid Build Coastguard Worker
1184*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1185*9880d681SAndroid Build Coastguard Worker getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1186*9880d681SAndroid Build Coastguard Worker getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
1187*9880d681SAndroid Build Coastguard Worker
1188*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
1189*9880d681SAndroid Build Coastguard Worker } else {
1190*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
1191*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1192*9880d681SAndroid Build Coastguard Worker default:
1193*9880d681SAndroid Build Coastguard Worker return false;
1194*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1195*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1196*9880d681SAndroid Build Coastguard Worker default:
1197*9880d681SAndroid Build Coastguard Worker return false;
1198*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1199*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_areg_64;
1200*9880d681SAndroid Build Coastguard Worker break;
1201*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1202*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_areg_64;
1203*9880d681SAndroid Build Coastguard Worker break;
1204*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1205*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_areg_64;
1206*9880d681SAndroid Build Coastguard Worker break;
1207*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1208*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_areg_64;
1209*9880d681SAndroid Build Coastguard Worker break;
1210*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1211*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_areg_64;
1212*9880d681SAndroid Build Coastguard Worker break;
1213*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1214*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_areg_64;
1215*9880d681SAndroid Build Coastguard Worker break;
1216*9880d681SAndroid Build Coastguard Worker }
1217*9880d681SAndroid Build Coastguard Worker break;
1218*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1219*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1220*9880d681SAndroid Build Coastguard Worker default:
1221*9880d681SAndroid Build Coastguard Worker return false;
1222*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1223*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_areg_64;
1224*9880d681SAndroid Build Coastguard Worker break;
1225*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1226*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_areg_64;
1227*9880d681SAndroid Build Coastguard Worker break;
1228*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1229*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_areg_64;
1230*9880d681SAndroid Build Coastguard Worker break;
1231*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1232*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_areg_64;
1233*9880d681SAndroid Build Coastguard Worker break;
1234*9880d681SAndroid Build Coastguard Worker }
1235*9880d681SAndroid Build Coastguard Worker break;
1236*9880d681SAndroid Build Coastguard Worker }
1237*9880d681SAndroid Build Coastguard Worker } else {
1238*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1239*9880d681SAndroid Build Coastguard Worker default:
1240*9880d681SAndroid Build Coastguard Worker return false;
1241*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1242*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1243*9880d681SAndroid Build Coastguard Worker default:
1244*9880d681SAndroid Build Coastguard Worker return false;
1245*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1246*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v2_areg;
1247*9880d681SAndroid Build Coastguard Worker break;
1248*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1249*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v2_areg;
1250*9880d681SAndroid Build Coastguard Worker break;
1251*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1252*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v2_areg;
1253*9880d681SAndroid Build Coastguard Worker break;
1254*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1255*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i64_v2_areg;
1256*9880d681SAndroid Build Coastguard Worker break;
1257*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1258*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v2_areg;
1259*9880d681SAndroid Build Coastguard Worker break;
1260*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1261*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f64_v2_areg;
1262*9880d681SAndroid Build Coastguard Worker break;
1263*9880d681SAndroid Build Coastguard Worker }
1264*9880d681SAndroid Build Coastguard Worker break;
1265*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1266*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1267*9880d681SAndroid Build Coastguard Worker default:
1268*9880d681SAndroid Build Coastguard Worker return false;
1269*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1270*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i8_v4_areg;
1271*9880d681SAndroid Build Coastguard Worker break;
1272*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1273*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i16_v4_areg;
1274*9880d681SAndroid Build Coastguard Worker break;
1275*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1276*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_i32_v4_areg;
1277*9880d681SAndroid Build Coastguard Worker break;
1278*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1279*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::LDV_f32_v4_areg;
1280*9880d681SAndroid Build Coastguard Worker break;
1281*9880d681SAndroid Build Coastguard Worker }
1282*9880d681SAndroid Build Coastguard Worker break;
1283*9880d681SAndroid Build Coastguard Worker }
1284*9880d681SAndroid Build Coastguard Worker }
1285*9880d681SAndroid Build Coastguard Worker
1286*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1287*9880d681SAndroid Build Coastguard Worker getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1288*9880d681SAndroid Build Coastguard Worker getI32Imm(FromTypeWidth, DL), Op1, Chain };
1289*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
1290*9880d681SAndroid Build Coastguard Worker }
1291*9880d681SAndroid Build Coastguard Worker
1292*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1293*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1294*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1295*9880d681SAndroid Build Coastguard Worker
1296*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, LD);
1297*9880d681SAndroid Build Coastguard Worker return true;
1298*9880d681SAndroid Build Coastguard Worker }
1299*9880d681SAndroid Build Coastguard Worker
tryLDGLDU(SDNode * N)1300*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryLDGLDU(SDNode *N) {
1301*9880d681SAndroid Build Coastguard Worker
1302*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
1303*9880d681SAndroid Build Coastguard Worker SDValue Op1;
1304*9880d681SAndroid Build Coastguard Worker MemSDNode *Mem;
1305*9880d681SAndroid Build Coastguard Worker bool IsLDG = true;
1306*9880d681SAndroid Build Coastguard Worker
1307*9880d681SAndroid Build Coastguard Worker // If this is an LDG intrinsic, the address is the third operand. If its an
1308*9880d681SAndroid Build Coastguard Worker // LDG/LDU SD node (from custom vector handling), then its the second operand
1309*9880d681SAndroid Build Coastguard Worker if (N->getOpcode() == ISD::INTRINSIC_W_CHAIN) {
1310*9880d681SAndroid Build Coastguard Worker Op1 = N->getOperand(2);
1311*9880d681SAndroid Build Coastguard Worker Mem = cast<MemIntrinsicSDNode>(N);
1312*9880d681SAndroid Build Coastguard Worker unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
1313*9880d681SAndroid Build Coastguard Worker switch (IID) {
1314*9880d681SAndroid Build Coastguard Worker default:
1315*9880d681SAndroid Build Coastguard Worker return false;
1316*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
1317*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
1318*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p:
1319*9880d681SAndroid Build Coastguard Worker IsLDG = true;
1320*9880d681SAndroid Build Coastguard Worker break;
1321*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
1322*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
1323*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p:
1324*9880d681SAndroid Build Coastguard Worker IsLDG = false;
1325*9880d681SAndroid Build Coastguard Worker break;
1326*9880d681SAndroid Build Coastguard Worker }
1327*9880d681SAndroid Build Coastguard Worker } else {
1328*9880d681SAndroid Build Coastguard Worker Op1 = N->getOperand(1);
1329*9880d681SAndroid Build Coastguard Worker Mem = cast<MemSDNode>(N);
1330*9880d681SAndroid Build Coastguard Worker }
1331*9880d681SAndroid Build Coastguard Worker
1332*9880d681SAndroid Build Coastguard Worker unsigned Opcode;
1333*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
1334*9880d681SAndroid Build Coastguard Worker SDNode *LD;
1335*9880d681SAndroid Build Coastguard Worker SDValue Base, Offset, Addr;
1336*9880d681SAndroid Build Coastguard Worker
1337*9880d681SAndroid Build Coastguard Worker EVT EltVT = Mem->getMemoryVT();
1338*9880d681SAndroid Build Coastguard Worker unsigned NumElts = 1;
1339*9880d681SAndroid Build Coastguard Worker if (EltVT.isVector()) {
1340*9880d681SAndroid Build Coastguard Worker NumElts = EltVT.getVectorNumElements();
1341*9880d681SAndroid Build Coastguard Worker EltVT = EltVT.getVectorElementType();
1342*9880d681SAndroid Build Coastguard Worker }
1343*9880d681SAndroid Build Coastguard Worker
1344*9880d681SAndroid Build Coastguard Worker // Build the "promoted" result VTList for the load. If we are really loading
1345*9880d681SAndroid Build Coastguard Worker // i8s, then the return type will be promoted to i16 since we do not expose
1346*9880d681SAndroid Build Coastguard Worker // 8-bit registers in NVPTX.
1347*9880d681SAndroid Build Coastguard Worker EVT NodeVT = (EltVT == MVT::i8) ? MVT::i16 : EltVT;
1348*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 5> InstVTs;
1349*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != NumElts; ++i) {
1350*9880d681SAndroid Build Coastguard Worker InstVTs.push_back(NodeVT);
1351*9880d681SAndroid Build Coastguard Worker }
1352*9880d681SAndroid Build Coastguard Worker InstVTs.push_back(MVT::Other);
1353*9880d681SAndroid Build Coastguard Worker SDVTList InstVTList = CurDAG->getVTList(InstVTs);
1354*9880d681SAndroid Build Coastguard Worker
1355*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(Op1, Addr)) {
1356*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1357*9880d681SAndroid Build Coastguard Worker default:
1358*9880d681SAndroid Build Coastguard Worker return false;
1359*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1360*9880d681SAndroid Build Coastguard Worker if (IsLDG) {
1361*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1362*9880d681SAndroid Build Coastguard Worker default:
1363*9880d681SAndroid Build Coastguard Worker return false;
1364*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1365*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8avar;
1366*9880d681SAndroid Build Coastguard Worker break;
1367*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1368*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16avar;
1369*9880d681SAndroid Build Coastguard Worker break;
1370*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1371*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32avar;
1372*9880d681SAndroid Build Coastguard Worker break;
1373*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1374*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64avar;
1375*9880d681SAndroid Build Coastguard Worker break;
1376*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1377*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32avar;
1378*9880d681SAndroid Build Coastguard Worker break;
1379*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1380*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64avar;
1381*9880d681SAndroid Build Coastguard Worker break;
1382*9880d681SAndroid Build Coastguard Worker }
1383*9880d681SAndroid Build Coastguard Worker } else {
1384*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1385*9880d681SAndroid Build Coastguard Worker default:
1386*9880d681SAndroid Build Coastguard Worker return false;
1387*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1388*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8avar;
1389*9880d681SAndroid Build Coastguard Worker break;
1390*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1391*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16avar;
1392*9880d681SAndroid Build Coastguard Worker break;
1393*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1394*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32avar;
1395*9880d681SAndroid Build Coastguard Worker break;
1396*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1397*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64avar;
1398*9880d681SAndroid Build Coastguard Worker break;
1399*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1400*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32avar;
1401*9880d681SAndroid Build Coastguard Worker break;
1402*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1403*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64avar;
1404*9880d681SAndroid Build Coastguard Worker break;
1405*9880d681SAndroid Build Coastguard Worker }
1406*9880d681SAndroid Build Coastguard Worker }
1407*9880d681SAndroid Build Coastguard Worker break;
1408*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
1409*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1410*9880d681SAndroid Build Coastguard Worker default:
1411*9880d681SAndroid Build Coastguard Worker return false;
1412*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1413*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
1414*9880d681SAndroid Build Coastguard Worker break;
1415*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1416*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
1417*9880d681SAndroid Build Coastguard Worker break;
1418*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1419*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
1420*9880d681SAndroid Build Coastguard Worker break;
1421*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1422*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
1423*9880d681SAndroid Build Coastguard Worker break;
1424*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1425*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
1426*9880d681SAndroid Build Coastguard Worker break;
1427*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1428*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
1429*9880d681SAndroid Build Coastguard Worker break;
1430*9880d681SAndroid Build Coastguard Worker }
1431*9880d681SAndroid Build Coastguard Worker break;
1432*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
1433*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1434*9880d681SAndroid Build Coastguard Worker default:
1435*9880d681SAndroid Build Coastguard Worker return false;
1436*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1437*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
1438*9880d681SAndroid Build Coastguard Worker break;
1439*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1440*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
1441*9880d681SAndroid Build Coastguard Worker break;
1442*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1443*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
1444*9880d681SAndroid Build Coastguard Worker break;
1445*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1446*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
1447*9880d681SAndroid Build Coastguard Worker break;
1448*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1449*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
1450*9880d681SAndroid Build Coastguard Worker break;
1451*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1452*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
1453*9880d681SAndroid Build Coastguard Worker break;
1454*9880d681SAndroid Build Coastguard Worker }
1455*9880d681SAndroid Build Coastguard Worker break;
1456*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
1457*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1458*9880d681SAndroid Build Coastguard Worker default:
1459*9880d681SAndroid Build Coastguard Worker return false;
1460*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1461*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
1462*9880d681SAndroid Build Coastguard Worker break;
1463*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1464*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
1465*9880d681SAndroid Build Coastguard Worker break;
1466*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1467*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
1468*9880d681SAndroid Build Coastguard Worker break;
1469*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1470*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
1471*9880d681SAndroid Build Coastguard Worker break;
1472*9880d681SAndroid Build Coastguard Worker }
1473*9880d681SAndroid Build Coastguard Worker break;
1474*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
1475*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1476*9880d681SAndroid Build Coastguard Worker default:
1477*9880d681SAndroid Build Coastguard Worker return false;
1478*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1479*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
1480*9880d681SAndroid Build Coastguard Worker break;
1481*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1482*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
1483*9880d681SAndroid Build Coastguard Worker break;
1484*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1485*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
1486*9880d681SAndroid Build Coastguard Worker break;
1487*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1488*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
1489*9880d681SAndroid Build Coastguard Worker break;
1490*9880d681SAndroid Build Coastguard Worker }
1491*9880d681SAndroid Build Coastguard Worker break;
1492*9880d681SAndroid Build Coastguard Worker }
1493*9880d681SAndroid Build Coastguard Worker
1494*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { Addr, Chain };
1495*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
1496*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1497*9880d681SAndroid Build Coastguard Worker : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1498*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
1499*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1500*9880d681SAndroid Build Coastguard Worker default:
1501*9880d681SAndroid Build Coastguard Worker return false;
1502*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
1503*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1504*9880d681SAndroid Build Coastguard Worker if (IsLDG) {
1505*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1506*9880d681SAndroid Build Coastguard Worker default:
1507*9880d681SAndroid Build Coastguard Worker return false;
1508*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1509*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari64;
1510*9880d681SAndroid Build Coastguard Worker break;
1511*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1512*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari64;
1513*9880d681SAndroid Build Coastguard Worker break;
1514*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1515*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari64;
1516*9880d681SAndroid Build Coastguard Worker break;
1517*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1518*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari64;
1519*9880d681SAndroid Build Coastguard Worker break;
1520*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1521*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari64;
1522*9880d681SAndroid Build Coastguard Worker break;
1523*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1524*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari64;
1525*9880d681SAndroid Build Coastguard Worker break;
1526*9880d681SAndroid Build Coastguard Worker }
1527*9880d681SAndroid Build Coastguard Worker } else {
1528*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1529*9880d681SAndroid Build Coastguard Worker default:
1530*9880d681SAndroid Build Coastguard Worker return false;
1531*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1532*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari64;
1533*9880d681SAndroid Build Coastguard Worker break;
1534*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1535*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari64;
1536*9880d681SAndroid Build Coastguard Worker break;
1537*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1538*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari64;
1539*9880d681SAndroid Build Coastguard Worker break;
1540*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1541*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari64;
1542*9880d681SAndroid Build Coastguard Worker break;
1543*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1544*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari64;
1545*9880d681SAndroid Build Coastguard Worker break;
1546*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1547*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari64;
1548*9880d681SAndroid Build Coastguard Worker break;
1549*9880d681SAndroid Build Coastguard Worker }
1550*9880d681SAndroid Build Coastguard Worker }
1551*9880d681SAndroid Build Coastguard Worker break;
1552*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1553*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
1554*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1555*9880d681SAndroid Build Coastguard Worker default:
1556*9880d681SAndroid Build Coastguard Worker return false;
1557*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1558*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
1559*9880d681SAndroid Build Coastguard Worker break;
1560*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1561*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
1562*9880d681SAndroid Build Coastguard Worker break;
1563*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1564*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
1565*9880d681SAndroid Build Coastguard Worker break;
1566*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1567*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
1568*9880d681SAndroid Build Coastguard Worker break;
1569*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1570*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
1571*9880d681SAndroid Build Coastguard Worker break;
1572*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1573*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
1574*9880d681SAndroid Build Coastguard Worker break;
1575*9880d681SAndroid Build Coastguard Worker }
1576*9880d681SAndroid Build Coastguard Worker break;
1577*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
1578*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1579*9880d681SAndroid Build Coastguard Worker default:
1580*9880d681SAndroid Build Coastguard Worker return false;
1581*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1582*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
1583*9880d681SAndroid Build Coastguard Worker break;
1584*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1585*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
1586*9880d681SAndroid Build Coastguard Worker break;
1587*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1588*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
1589*9880d681SAndroid Build Coastguard Worker break;
1590*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1591*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
1592*9880d681SAndroid Build Coastguard Worker break;
1593*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1594*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
1595*9880d681SAndroid Build Coastguard Worker break;
1596*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1597*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
1598*9880d681SAndroid Build Coastguard Worker break;
1599*9880d681SAndroid Build Coastguard Worker }
1600*9880d681SAndroid Build Coastguard Worker break;
1601*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1602*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
1603*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1604*9880d681SAndroid Build Coastguard Worker default:
1605*9880d681SAndroid Build Coastguard Worker return false;
1606*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1607*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
1608*9880d681SAndroid Build Coastguard Worker break;
1609*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1610*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
1611*9880d681SAndroid Build Coastguard Worker break;
1612*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1613*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
1614*9880d681SAndroid Build Coastguard Worker break;
1615*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1616*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
1617*9880d681SAndroid Build Coastguard Worker break;
1618*9880d681SAndroid Build Coastguard Worker }
1619*9880d681SAndroid Build Coastguard Worker break;
1620*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
1621*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1622*9880d681SAndroid Build Coastguard Worker default:
1623*9880d681SAndroid Build Coastguard Worker return false;
1624*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1625*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
1626*9880d681SAndroid Build Coastguard Worker break;
1627*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1628*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
1629*9880d681SAndroid Build Coastguard Worker break;
1630*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1631*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1632*9880d681SAndroid Build Coastguard Worker break;
1633*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1634*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1635*9880d681SAndroid Build Coastguard Worker break;
1636*9880d681SAndroid Build Coastguard Worker }
1637*9880d681SAndroid Build Coastguard Worker break;
1638*9880d681SAndroid Build Coastguard Worker }
1639*9880d681SAndroid Build Coastguard Worker } else {
1640*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1641*9880d681SAndroid Build Coastguard Worker default:
1642*9880d681SAndroid Build Coastguard Worker return false;
1643*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
1644*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1645*9880d681SAndroid Build Coastguard Worker if (IsLDG) {
1646*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1647*9880d681SAndroid Build Coastguard Worker default:
1648*9880d681SAndroid Build Coastguard Worker return false;
1649*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1650*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari;
1651*9880d681SAndroid Build Coastguard Worker break;
1652*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1653*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari;
1654*9880d681SAndroid Build Coastguard Worker break;
1655*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1656*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari;
1657*9880d681SAndroid Build Coastguard Worker break;
1658*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1659*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari;
1660*9880d681SAndroid Build Coastguard Worker break;
1661*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1662*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari;
1663*9880d681SAndroid Build Coastguard Worker break;
1664*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1665*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari;
1666*9880d681SAndroid Build Coastguard Worker break;
1667*9880d681SAndroid Build Coastguard Worker }
1668*9880d681SAndroid Build Coastguard Worker } else {
1669*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1670*9880d681SAndroid Build Coastguard Worker default:
1671*9880d681SAndroid Build Coastguard Worker return false;
1672*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1673*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari;
1674*9880d681SAndroid Build Coastguard Worker break;
1675*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1676*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari;
1677*9880d681SAndroid Build Coastguard Worker break;
1678*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1679*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari;
1680*9880d681SAndroid Build Coastguard Worker break;
1681*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1682*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari;
1683*9880d681SAndroid Build Coastguard Worker break;
1684*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1685*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari;
1686*9880d681SAndroid Build Coastguard Worker break;
1687*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1688*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari;
1689*9880d681SAndroid Build Coastguard Worker break;
1690*9880d681SAndroid Build Coastguard Worker }
1691*9880d681SAndroid Build Coastguard Worker }
1692*9880d681SAndroid Build Coastguard Worker break;
1693*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1694*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
1695*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1696*9880d681SAndroid Build Coastguard Worker default:
1697*9880d681SAndroid Build Coastguard Worker return false;
1698*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1699*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1700*9880d681SAndroid Build Coastguard Worker break;
1701*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1702*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1703*9880d681SAndroid Build Coastguard Worker break;
1704*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1705*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1706*9880d681SAndroid Build Coastguard Worker break;
1707*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1708*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1709*9880d681SAndroid Build Coastguard Worker break;
1710*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1711*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1712*9880d681SAndroid Build Coastguard Worker break;
1713*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1714*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1715*9880d681SAndroid Build Coastguard Worker break;
1716*9880d681SAndroid Build Coastguard Worker }
1717*9880d681SAndroid Build Coastguard Worker break;
1718*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
1719*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1720*9880d681SAndroid Build Coastguard Worker default:
1721*9880d681SAndroid Build Coastguard Worker return false;
1722*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1723*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1724*9880d681SAndroid Build Coastguard Worker break;
1725*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1726*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1727*9880d681SAndroid Build Coastguard Worker break;
1728*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1729*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1730*9880d681SAndroid Build Coastguard Worker break;
1731*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1732*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1733*9880d681SAndroid Build Coastguard Worker break;
1734*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1735*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1736*9880d681SAndroid Build Coastguard Worker break;
1737*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1738*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1739*9880d681SAndroid Build Coastguard Worker break;
1740*9880d681SAndroid Build Coastguard Worker }
1741*9880d681SAndroid Build Coastguard Worker break;
1742*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1743*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
1744*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1745*9880d681SAndroid Build Coastguard Worker default:
1746*9880d681SAndroid Build Coastguard Worker return false;
1747*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1748*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1749*9880d681SAndroid Build Coastguard Worker break;
1750*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1751*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1752*9880d681SAndroid Build Coastguard Worker break;
1753*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1754*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1755*9880d681SAndroid Build Coastguard Worker break;
1756*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1757*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1758*9880d681SAndroid Build Coastguard Worker break;
1759*9880d681SAndroid Build Coastguard Worker }
1760*9880d681SAndroid Build Coastguard Worker break;
1761*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
1762*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1763*9880d681SAndroid Build Coastguard Worker default:
1764*9880d681SAndroid Build Coastguard Worker return false;
1765*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1766*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1767*9880d681SAndroid Build Coastguard Worker break;
1768*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1769*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1770*9880d681SAndroid Build Coastguard Worker break;
1771*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1772*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1773*9880d681SAndroid Build Coastguard Worker break;
1774*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1775*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1776*9880d681SAndroid Build Coastguard Worker break;
1777*9880d681SAndroid Build Coastguard Worker }
1778*9880d681SAndroid Build Coastguard Worker break;
1779*9880d681SAndroid Build Coastguard Worker }
1780*9880d681SAndroid Build Coastguard Worker }
1781*9880d681SAndroid Build Coastguard Worker
1782*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { Base, Offset, Chain };
1783*9880d681SAndroid Build Coastguard Worker
1784*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
1785*9880d681SAndroid Build Coastguard Worker } else {
1786*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
1787*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1788*9880d681SAndroid Build Coastguard Worker default:
1789*9880d681SAndroid Build Coastguard Worker return false;
1790*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
1791*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1792*9880d681SAndroid Build Coastguard Worker if (IsLDG) {
1793*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1794*9880d681SAndroid Build Coastguard Worker default:
1795*9880d681SAndroid Build Coastguard Worker return false;
1796*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1797*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg64;
1798*9880d681SAndroid Build Coastguard Worker break;
1799*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1800*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg64;
1801*9880d681SAndroid Build Coastguard Worker break;
1802*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1803*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg64;
1804*9880d681SAndroid Build Coastguard Worker break;
1805*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1806*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg64;
1807*9880d681SAndroid Build Coastguard Worker break;
1808*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1809*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg64;
1810*9880d681SAndroid Build Coastguard Worker break;
1811*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1812*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg64;
1813*9880d681SAndroid Build Coastguard Worker break;
1814*9880d681SAndroid Build Coastguard Worker }
1815*9880d681SAndroid Build Coastguard Worker } else {
1816*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1817*9880d681SAndroid Build Coastguard Worker default:
1818*9880d681SAndroid Build Coastguard Worker return false;
1819*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1820*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg64;
1821*9880d681SAndroid Build Coastguard Worker break;
1822*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1823*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg64;
1824*9880d681SAndroid Build Coastguard Worker break;
1825*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1826*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg64;
1827*9880d681SAndroid Build Coastguard Worker break;
1828*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1829*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg64;
1830*9880d681SAndroid Build Coastguard Worker break;
1831*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1832*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg64;
1833*9880d681SAndroid Build Coastguard Worker break;
1834*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1835*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg64;
1836*9880d681SAndroid Build Coastguard Worker break;
1837*9880d681SAndroid Build Coastguard Worker }
1838*9880d681SAndroid Build Coastguard Worker }
1839*9880d681SAndroid Build Coastguard Worker break;
1840*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1841*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
1842*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1843*9880d681SAndroid Build Coastguard Worker default:
1844*9880d681SAndroid Build Coastguard Worker return false;
1845*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1846*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1847*9880d681SAndroid Build Coastguard Worker break;
1848*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1849*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1850*9880d681SAndroid Build Coastguard Worker break;
1851*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1852*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1853*9880d681SAndroid Build Coastguard Worker break;
1854*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1855*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1856*9880d681SAndroid Build Coastguard Worker break;
1857*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1858*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1859*9880d681SAndroid Build Coastguard Worker break;
1860*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1861*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1862*9880d681SAndroid Build Coastguard Worker break;
1863*9880d681SAndroid Build Coastguard Worker }
1864*9880d681SAndroid Build Coastguard Worker break;
1865*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
1866*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1867*9880d681SAndroid Build Coastguard Worker default:
1868*9880d681SAndroid Build Coastguard Worker return false;
1869*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1870*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1871*9880d681SAndroid Build Coastguard Worker break;
1872*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1873*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1874*9880d681SAndroid Build Coastguard Worker break;
1875*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1876*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1877*9880d681SAndroid Build Coastguard Worker break;
1878*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1879*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1880*9880d681SAndroid Build Coastguard Worker break;
1881*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1882*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1883*9880d681SAndroid Build Coastguard Worker break;
1884*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1885*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1886*9880d681SAndroid Build Coastguard Worker break;
1887*9880d681SAndroid Build Coastguard Worker }
1888*9880d681SAndroid Build Coastguard Worker break;
1889*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
1890*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
1891*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1892*9880d681SAndroid Build Coastguard Worker default:
1893*9880d681SAndroid Build Coastguard Worker return false;
1894*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1895*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1896*9880d681SAndroid Build Coastguard Worker break;
1897*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1898*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1899*9880d681SAndroid Build Coastguard Worker break;
1900*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1901*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1902*9880d681SAndroid Build Coastguard Worker break;
1903*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1904*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1905*9880d681SAndroid Build Coastguard Worker break;
1906*9880d681SAndroid Build Coastguard Worker }
1907*9880d681SAndroid Build Coastguard Worker break;
1908*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
1909*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1910*9880d681SAndroid Build Coastguard Worker default:
1911*9880d681SAndroid Build Coastguard Worker return false;
1912*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1913*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1914*9880d681SAndroid Build Coastguard Worker break;
1915*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1916*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1917*9880d681SAndroid Build Coastguard Worker break;
1918*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1919*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1920*9880d681SAndroid Build Coastguard Worker break;
1921*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1922*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1923*9880d681SAndroid Build Coastguard Worker break;
1924*9880d681SAndroid Build Coastguard Worker }
1925*9880d681SAndroid Build Coastguard Worker break;
1926*9880d681SAndroid Build Coastguard Worker }
1927*9880d681SAndroid Build Coastguard Worker } else {
1928*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
1929*9880d681SAndroid Build Coastguard Worker default:
1930*9880d681SAndroid Build Coastguard Worker return false;
1931*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
1932*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1933*9880d681SAndroid Build Coastguard Worker if (IsLDG) {
1934*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1935*9880d681SAndroid Build Coastguard Worker default:
1936*9880d681SAndroid Build Coastguard Worker return false;
1937*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1938*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg;
1939*9880d681SAndroid Build Coastguard Worker break;
1940*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1941*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg;
1942*9880d681SAndroid Build Coastguard Worker break;
1943*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1944*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg;
1945*9880d681SAndroid Build Coastguard Worker break;
1946*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1947*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg;
1948*9880d681SAndroid Build Coastguard Worker break;
1949*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1950*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg;
1951*9880d681SAndroid Build Coastguard Worker break;
1952*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1953*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg;
1954*9880d681SAndroid Build Coastguard Worker break;
1955*9880d681SAndroid Build Coastguard Worker }
1956*9880d681SAndroid Build Coastguard Worker } else {
1957*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1958*9880d681SAndroid Build Coastguard Worker default:
1959*9880d681SAndroid Build Coastguard Worker return false;
1960*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1961*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg;
1962*9880d681SAndroid Build Coastguard Worker break;
1963*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1964*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg;
1965*9880d681SAndroid Build Coastguard Worker break;
1966*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1967*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg;
1968*9880d681SAndroid Build Coastguard Worker break;
1969*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1970*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg;
1971*9880d681SAndroid Build Coastguard Worker break;
1972*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1973*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg;
1974*9880d681SAndroid Build Coastguard Worker break;
1975*9880d681SAndroid Build Coastguard Worker case MVT::f64:
1976*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg;
1977*9880d681SAndroid Build Coastguard Worker break;
1978*9880d681SAndroid Build Coastguard Worker }
1979*9880d681SAndroid Build Coastguard Worker }
1980*9880d681SAndroid Build Coastguard Worker break;
1981*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
1982*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
1983*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
1984*9880d681SAndroid Build Coastguard Worker default:
1985*9880d681SAndroid Build Coastguard Worker return false;
1986*9880d681SAndroid Build Coastguard Worker case MVT::i8:
1987*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
1988*9880d681SAndroid Build Coastguard Worker break;
1989*9880d681SAndroid Build Coastguard Worker case MVT::i16:
1990*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
1991*9880d681SAndroid Build Coastguard Worker break;
1992*9880d681SAndroid Build Coastguard Worker case MVT::i32:
1993*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
1994*9880d681SAndroid Build Coastguard Worker break;
1995*9880d681SAndroid Build Coastguard Worker case MVT::i64:
1996*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
1997*9880d681SAndroid Build Coastguard Worker break;
1998*9880d681SAndroid Build Coastguard Worker case MVT::f32:
1999*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
2000*9880d681SAndroid Build Coastguard Worker break;
2001*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2002*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
2003*9880d681SAndroid Build Coastguard Worker break;
2004*9880d681SAndroid Build Coastguard Worker }
2005*9880d681SAndroid Build Coastguard Worker break;
2006*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
2007*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2008*9880d681SAndroid Build Coastguard Worker default:
2009*9880d681SAndroid Build Coastguard Worker return false;
2010*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2011*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
2012*9880d681SAndroid Build Coastguard Worker break;
2013*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2014*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
2015*9880d681SAndroid Build Coastguard Worker break;
2016*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2017*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
2018*9880d681SAndroid Build Coastguard Worker break;
2019*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2020*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
2021*9880d681SAndroid Build Coastguard Worker break;
2022*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2023*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
2024*9880d681SAndroid Build Coastguard Worker break;
2025*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2026*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
2027*9880d681SAndroid Build Coastguard Worker break;
2028*9880d681SAndroid Build Coastguard Worker }
2029*9880d681SAndroid Build Coastguard Worker break;
2030*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
2031*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
2032*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2033*9880d681SAndroid Build Coastguard Worker default:
2034*9880d681SAndroid Build Coastguard Worker return false;
2035*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2036*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
2037*9880d681SAndroid Build Coastguard Worker break;
2038*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2039*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
2040*9880d681SAndroid Build Coastguard Worker break;
2041*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2042*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
2043*9880d681SAndroid Build Coastguard Worker break;
2044*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2045*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
2046*9880d681SAndroid Build Coastguard Worker break;
2047*9880d681SAndroid Build Coastguard Worker }
2048*9880d681SAndroid Build Coastguard Worker break;
2049*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
2050*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2051*9880d681SAndroid Build Coastguard Worker default:
2052*9880d681SAndroid Build Coastguard Worker return false;
2053*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2054*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
2055*9880d681SAndroid Build Coastguard Worker break;
2056*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2057*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
2058*9880d681SAndroid Build Coastguard Worker break;
2059*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2060*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
2061*9880d681SAndroid Build Coastguard Worker break;
2062*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2063*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
2064*9880d681SAndroid Build Coastguard Worker break;
2065*9880d681SAndroid Build Coastguard Worker }
2066*9880d681SAndroid Build Coastguard Worker break;
2067*9880d681SAndroid Build Coastguard Worker }
2068*9880d681SAndroid Build Coastguard Worker }
2069*9880d681SAndroid Build Coastguard Worker
2070*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { Op1, Chain };
2071*9880d681SAndroid Build Coastguard Worker LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
2072*9880d681SAndroid Build Coastguard Worker }
2073*9880d681SAndroid Build Coastguard Worker
2074*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2075*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = Mem->getMemOperand();
2076*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
2077*9880d681SAndroid Build Coastguard Worker
2078*9880d681SAndroid Build Coastguard Worker // For automatic generation of LDG (through SelectLoad[Vector], not the
2079*9880d681SAndroid Build Coastguard Worker // intrinsics), we may have an extending load like:
2080*9880d681SAndroid Build Coastguard Worker //
2081*9880d681SAndroid Build Coastguard Worker // i32,ch = load<LD1[%data1(addrspace=1)], zext from i8> t0, t7, undef:i64
2082*9880d681SAndroid Build Coastguard Worker //
2083*9880d681SAndroid Build Coastguard Worker // In this case, the matching logic above will select a load for the original
2084*9880d681SAndroid Build Coastguard Worker // memory type (in this case, i8) and our types will not match (the node needs
2085*9880d681SAndroid Build Coastguard Worker // to return an i32 in this case). Our LDG/LDU nodes do not support the
2086*9880d681SAndroid Build Coastguard Worker // concept of sign-/zero-extension, so emulate it here by adding an explicit
2087*9880d681SAndroid Build Coastguard Worker // CVT instruction. Ptxas should clean up any redundancies here.
2088*9880d681SAndroid Build Coastguard Worker
2089*9880d681SAndroid Build Coastguard Worker EVT OrigType = N->getValueType(0);
2090*9880d681SAndroid Build Coastguard Worker LoadSDNode *LdNode = dyn_cast<LoadSDNode>(N);
2091*9880d681SAndroid Build Coastguard Worker
2092*9880d681SAndroid Build Coastguard Worker if (OrigType != EltVT && LdNode) {
2093*9880d681SAndroid Build Coastguard Worker // We have an extending-load. The instruction we selected operates on the
2094*9880d681SAndroid Build Coastguard Worker // smaller type, but the SDNode we are replacing has the larger type. We
2095*9880d681SAndroid Build Coastguard Worker // need to emit a CVT to make the types match.
2096*9880d681SAndroid Build Coastguard Worker bool IsSigned = LdNode->getExtensionType() == ISD::SEXTLOAD;
2097*9880d681SAndroid Build Coastguard Worker unsigned CvtOpc = GetConvertOpcode(OrigType.getSimpleVT(),
2098*9880d681SAndroid Build Coastguard Worker EltVT.getSimpleVT(), IsSigned);
2099*9880d681SAndroid Build Coastguard Worker
2100*9880d681SAndroid Build Coastguard Worker // For each output value, apply the manual sign/zero-extension and make sure
2101*9880d681SAndroid Build Coastguard Worker // all users of the load go through that CVT.
2102*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != NumElts; ++i) {
2103*9880d681SAndroid Build Coastguard Worker SDValue Res(LD, i);
2104*9880d681SAndroid Build Coastguard Worker SDValue OrigVal(N, i);
2105*9880d681SAndroid Build Coastguard Worker
2106*9880d681SAndroid Build Coastguard Worker SDNode *CvtNode =
2107*9880d681SAndroid Build Coastguard Worker CurDAG->getMachineNode(CvtOpc, DL, OrigType, Res,
2108*9880d681SAndroid Build Coastguard Worker CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2109*9880d681SAndroid Build Coastguard Worker DL, MVT::i32));
2110*9880d681SAndroid Build Coastguard Worker ReplaceUses(OrigVal, SDValue(CvtNode, 0));
2111*9880d681SAndroid Build Coastguard Worker }
2112*9880d681SAndroid Build Coastguard Worker }
2113*9880d681SAndroid Build Coastguard Worker
2114*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, LD);
2115*9880d681SAndroid Build Coastguard Worker return true;
2116*9880d681SAndroid Build Coastguard Worker }
2117*9880d681SAndroid Build Coastguard Worker
tryStore(SDNode * N)2118*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2119*9880d681SAndroid Build Coastguard Worker SDLoc dl(N);
2120*9880d681SAndroid Build Coastguard Worker StoreSDNode *ST = cast<StoreSDNode>(N);
2121*9880d681SAndroid Build Coastguard Worker EVT StoreVT = ST->getMemoryVT();
2122*9880d681SAndroid Build Coastguard Worker SDNode *NVPTXST = nullptr;
2123*9880d681SAndroid Build Coastguard Worker
2124*9880d681SAndroid Build Coastguard Worker // do not support pre/post inc/dec
2125*9880d681SAndroid Build Coastguard Worker if (ST->isIndexed())
2126*9880d681SAndroid Build Coastguard Worker return false;
2127*9880d681SAndroid Build Coastguard Worker
2128*9880d681SAndroid Build Coastguard Worker if (!StoreVT.isSimple())
2129*9880d681SAndroid Build Coastguard Worker return false;
2130*9880d681SAndroid Build Coastguard Worker
2131*9880d681SAndroid Build Coastguard Worker // Address Space Setting
2132*9880d681SAndroid Build Coastguard Worker unsigned int codeAddrSpace = getCodeAddrSpace(ST);
2133*9880d681SAndroid Build Coastguard Worker
2134*9880d681SAndroid Build Coastguard Worker // Volatile Setting
2135*9880d681SAndroid Build Coastguard Worker // - .volatile is only availalble for .global and .shared
2136*9880d681SAndroid Build Coastguard Worker bool isVolatile = ST->isVolatile();
2137*9880d681SAndroid Build Coastguard Worker if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2138*9880d681SAndroid Build Coastguard Worker codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2139*9880d681SAndroid Build Coastguard Worker codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2140*9880d681SAndroid Build Coastguard Worker isVolatile = false;
2141*9880d681SAndroid Build Coastguard Worker
2142*9880d681SAndroid Build Coastguard Worker // Vector Setting
2143*9880d681SAndroid Build Coastguard Worker MVT SimpleVT = StoreVT.getSimpleVT();
2144*9880d681SAndroid Build Coastguard Worker unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
2145*9880d681SAndroid Build Coastguard Worker if (SimpleVT.isVector()) {
2146*9880d681SAndroid Build Coastguard Worker unsigned num = SimpleVT.getVectorNumElements();
2147*9880d681SAndroid Build Coastguard Worker if (num == 2)
2148*9880d681SAndroid Build Coastguard Worker vecType = NVPTX::PTXLdStInstCode::V2;
2149*9880d681SAndroid Build Coastguard Worker else if (num == 4)
2150*9880d681SAndroid Build Coastguard Worker vecType = NVPTX::PTXLdStInstCode::V4;
2151*9880d681SAndroid Build Coastguard Worker else
2152*9880d681SAndroid Build Coastguard Worker return false;
2153*9880d681SAndroid Build Coastguard Worker }
2154*9880d681SAndroid Build Coastguard Worker
2155*9880d681SAndroid Build Coastguard Worker // Type Setting: toType + toTypeWidth
2156*9880d681SAndroid Build Coastguard Worker // - for integer type, always use 'u'
2157*9880d681SAndroid Build Coastguard Worker //
2158*9880d681SAndroid Build Coastguard Worker MVT ScalarVT = SimpleVT.getScalarType();
2159*9880d681SAndroid Build Coastguard Worker unsigned toTypeWidth = ScalarVT.getSizeInBits();
2160*9880d681SAndroid Build Coastguard Worker unsigned int toType;
2161*9880d681SAndroid Build Coastguard Worker if (ScalarVT.isFloatingPoint())
2162*9880d681SAndroid Build Coastguard Worker toType = NVPTX::PTXLdStInstCode::Float;
2163*9880d681SAndroid Build Coastguard Worker else
2164*9880d681SAndroid Build Coastguard Worker toType = NVPTX::PTXLdStInstCode::Unsigned;
2165*9880d681SAndroid Build Coastguard Worker
2166*9880d681SAndroid Build Coastguard Worker // Create the machine instruction DAG
2167*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
2168*9880d681SAndroid Build Coastguard Worker SDValue N1 = N->getOperand(1);
2169*9880d681SAndroid Build Coastguard Worker SDValue N2 = N->getOperand(2);
2170*9880d681SAndroid Build Coastguard Worker SDValue Addr;
2171*9880d681SAndroid Build Coastguard Worker SDValue Offset, Base;
2172*9880d681SAndroid Build Coastguard Worker unsigned Opcode;
2173*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType SourceVT = N1.getNode()->getSimpleValueType(0).SimpleTy;
2174*9880d681SAndroid Build Coastguard Worker
2175*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(N2, Addr)) {
2176*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2177*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2178*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_avar;
2179*9880d681SAndroid Build Coastguard Worker break;
2180*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2181*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_avar;
2182*9880d681SAndroid Build Coastguard Worker break;
2183*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2184*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_avar;
2185*9880d681SAndroid Build Coastguard Worker break;
2186*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2187*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_avar;
2188*9880d681SAndroid Build Coastguard Worker break;
2189*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2190*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_avar;
2191*9880d681SAndroid Build Coastguard Worker break;
2192*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2193*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_avar;
2194*9880d681SAndroid Build Coastguard Worker break;
2195*9880d681SAndroid Build Coastguard Worker default:
2196*9880d681SAndroid Build Coastguard Worker return false;
2197*9880d681SAndroid Build Coastguard Worker }
2198*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2199*9880d681SAndroid Build Coastguard Worker getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2200*9880d681SAndroid Build Coastguard Worker getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Addr,
2201*9880d681SAndroid Build Coastguard Worker Chain };
2202*9880d681SAndroid Build Coastguard Worker NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
2203*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2204*9880d681SAndroid Build Coastguard Worker : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
2205*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2206*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2207*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_asi;
2208*9880d681SAndroid Build Coastguard Worker break;
2209*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2210*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_asi;
2211*9880d681SAndroid Build Coastguard Worker break;
2212*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2213*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_asi;
2214*9880d681SAndroid Build Coastguard Worker break;
2215*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2216*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_asi;
2217*9880d681SAndroid Build Coastguard Worker break;
2218*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2219*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_asi;
2220*9880d681SAndroid Build Coastguard Worker break;
2221*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2222*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_asi;
2223*9880d681SAndroid Build Coastguard Worker break;
2224*9880d681SAndroid Build Coastguard Worker default:
2225*9880d681SAndroid Build Coastguard Worker return false;
2226*9880d681SAndroid Build Coastguard Worker }
2227*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2228*9880d681SAndroid Build Coastguard Worker getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2229*9880d681SAndroid Build Coastguard Worker getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2230*9880d681SAndroid Build Coastguard Worker Offset, Chain };
2231*9880d681SAndroid Build Coastguard Worker NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
2232*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2233*9880d681SAndroid Build Coastguard Worker : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2234*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
2235*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2236*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2237*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_ari_64;
2238*9880d681SAndroid Build Coastguard Worker break;
2239*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2240*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_ari_64;
2241*9880d681SAndroid Build Coastguard Worker break;
2242*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2243*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_ari_64;
2244*9880d681SAndroid Build Coastguard Worker break;
2245*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2246*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_ari_64;
2247*9880d681SAndroid Build Coastguard Worker break;
2248*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2249*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_ari_64;
2250*9880d681SAndroid Build Coastguard Worker break;
2251*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2252*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_ari_64;
2253*9880d681SAndroid Build Coastguard Worker break;
2254*9880d681SAndroid Build Coastguard Worker default:
2255*9880d681SAndroid Build Coastguard Worker return false;
2256*9880d681SAndroid Build Coastguard Worker }
2257*9880d681SAndroid Build Coastguard Worker } else {
2258*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2259*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2260*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_ari;
2261*9880d681SAndroid Build Coastguard Worker break;
2262*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2263*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_ari;
2264*9880d681SAndroid Build Coastguard Worker break;
2265*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2266*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_ari;
2267*9880d681SAndroid Build Coastguard Worker break;
2268*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2269*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_ari;
2270*9880d681SAndroid Build Coastguard Worker break;
2271*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2272*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_ari;
2273*9880d681SAndroid Build Coastguard Worker break;
2274*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2275*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_ari;
2276*9880d681SAndroid Build Coastguard Worker break;
2277*9880d681SAndroid Build Coastguard Worker default:
2278*9880d681SAndroid Build Coastguard Worker return false;
2279*9880d681SAndroid Build Coastguard Worker }
2280*9880d681SAndroid Build Coastguard Worker }
2281*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2282*9880d681SAndroid Build Coastguard Worker getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2283*9880d681SAndroid Build Coastguard Worker getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2284*9880d681SAndroid Build Coastguard Worker Offset, Chain };
2285*9880d681SAndroid Build Coastguard Worker NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
2286*9880d681SAndroid Build Coastguard Worker } else {
2287*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
2288*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2289*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2290*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_areg_64;
2291*9880d681SAndroid Build Coastguard Worker break;
2292*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2293*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_areg_64;
2294*9880d681SAndroid Build Coastguard Worker break;
2295*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2296*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_areg_64;
2297*9880d681SAndroid Build Coastguard Worker break;
2298*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2299*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_areg_64;
2300*9880d681SAndroid Build Coastguard Worker break;
2301*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2302*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_areg_64;
2303*9880d681SAndroid Build Coastguard Worker break;
2304*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2305*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_areg_64;
2306*9880d681SAndroid Build Coastguard Worker break;
2307*9880d681SAndroid Build Coastguard Worker default:
2308*9880d681SAndroid Build Coastguard Worker return false;
2309*9880d681SAndroid Build Coastguard Worker }
2310*9880d681SAndroid Build Coastguard Worker } else {
2311*9880d681SAndroid Build Coastguard Worker switch (SourceVT) {
2312*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2313*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i8_areg;
2314*9880d681SAndroid Build Coastguard Worker break;
2315*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2316*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i16_areg;
2317*9880d681SAndroid Build Coastguard Worker break;
2318*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2319*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i32_areg;
2320*9880d681SAndroid Build Coastguard Worker break;
2321*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2322*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_i64_areg;
2323*9880d681SAndroid Build Coastguard Worker break;
2324*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2325*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f32_areg;
2326*9880d681SAndroid Build Coastguard Worker break;
2327*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2328*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::ST_f64_areg;
2329*9880d681SAndroid Build Coastguard Worker break;
2330*9880d681SAndroid Build Coastguard Worker default:
2331*9880d681SAndroid Build Coastguard Worker return false;
2332*9880d681SAndroid Build Coastguard Worker }
2333*9880d681SAndroid Build Coastguard Worker }
2334*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2335*9880d681SAndroid Build Coastguard Worker getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2336*9880d681SAndroid Build Coastguard Worker getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), N2,
2337*9880d681SAndroid Build Coastguard Worker Chain };
2338*9880d681SAndroid Build Coastguard Worker NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
2339*9880d681SAndroid Build Coastguard Worker }
2340*9880d681SAndroid Build Coastguard Worker
2341*9880d681SAndroid Build Coastguard Worker if (!NVPTXST)
2342*9880d681SAndroid Build Coastguard Worker return false;
2343*9880d681SAndroid Build Coastguard Worker
2344*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2345*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2346*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2347*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, NVPTXST);
2348*9880d681SAndroid Build Coastguard Worker return true;
2349*9880d681SAndroid Build Coastguard Worker }
2350*9880d681SAndroid Build Coastguard Worker
tryStoreVector(SDNode * N)2351*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
2352*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
2353*9880d681SAndroid Build Coastguard Worker SDValue Op1 = N->getOperand(1);
2354*9880d681SAndroid Build Coastguard Worker SDValue Addr, Offset, Base;
2355*9880d681SAndroid Build Coastguard Worker unsigned Opcode;
2356*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
2357*9880d681SAndroid Build Coastguard Worker SDNode *ST;
2358*9880d681SAndroid Build Coastguard Worker EVT EltVT = Op1.getValueType();
2359*9880d681SAndroid Build Coastguard Worker MemSDNode *MemSD = cast<MemSDNode>(N);
2360*9880d681SAndroid Build Coastguard Worker EVT StoreVT = MemSD->getMemoryVT();
2361*9880d681SAndroid Build Coastguard Worker
2362*9880d681SAndroid Build Coastguard Worker // Address Space Setting
2363*9880d681SAndroid Build Coastguard Worker unsigned CodeAddrSpace = getCodeAddrSpace(MemSD);
2364*9880d681SAndroid Build Coastguard Worker
2365*9880d681SAndroid Build Coastguard Worker if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
2366*9880d681SAndroid Build Coastguard Worker report_fatal_error("Cannot store to pointer that points to constant "
2367*9880d681SAndroid Build Coastguard Worker "memory space");
2368*9880d681SAndroid Build Coastguard Worker }
2369*9880d681SAndroid Build Coastguard Worker
2370*9880d681SAndroid Build Coastguard Worker // Volatile Setting
2371*9880d681SAndroid Build Coastguard Worker // - .volatile is only availalble for .global and .shared
2372*9880d681SAndroid Build Coastguard Worker bool IsVolatile = MemSD->isVolatile();
2373*9880d681SAndroid Build Coastguard Worker if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2374*9880d681SAndroid Build Coastguard Worker CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2375*9880d681SAndroid Build Coastguard Worker CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2376*9880d681SAndroid Build Coastguard Worker IsVolatile = false;
2377*9880d681SAndroid Build Coastguard Worker
2378*9880d681SAndroid Build Coastguard Worker // Type Setting: toType + toTypeWidth
2379*9880d681SAndroid Build Coastguard Worker // - for integer type, always use 'u'
2380*9880d681SAndroid Build Coastguard Worker assert(StoreVT.isSimple() && "Store value is not simple");
2381*9880d681SAndroid Build Coastguard Worker MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
2382*9880d681SAndroid Build Coastguard Worker unsigned ToTypeWidth = ScalarVT.getSizeInBits();
2383*9880d681SAndroid Build Coastguard Worker unsigned ToType;
2384*9880d681SAndroid Build Coastguard Worker if (ScalarVT.isFloatingPoint())
2385*9880d681SAndroid Build Coastguard Worker ToType = NVPTX::PTXLdStInstCode::Float;
2386*9880d681SAndroid Build Coastguard Worker else
2387*9880d681SAndroid Build Coastguard Worker ToType = NVPTX::PTXLdStInstCode::Unsigned;
2388*9880d681SAndroid Build Coastguard Worker
2389*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 12> StOps;
2390*9880d681SAndroid Build Coastguard Worker SDValue N2;
2391*9880d681SAndroid Build Coastguard Worker unsigned VecType;
2392*9880d681SAndroid Build Coastguard Worker
2393*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2394*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2395*9880d681SAndroid Build Coastguard Worker VecType = NVPTX::PTXLdStInstCode::V2;
2396*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(1));
2397*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(2));
2398*9880d681SAndroid Build Coastguard Worker N2 = N->getOperand(3);
2399*9880d681SAndroid Build Coastguard Worker break;
2400*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2401*9880d681SAndroid Build Coastguard Worker VecType = NVPTX::PTXLdStInstCode::V4;
2402*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(1));
2403*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(2));
2404*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(3));
2405*9880d681SAndroid Build Coastguard Worker StOps.push_back(N->getOperand(4));
2406*9880d681SAndroid Build Coastguard Worker N2 = N->getOperand(5);
2407*9880d681SAndroid Build Coastguard Worker break;
2408*9880d681SAndroid Build Coastguard Worker default:
2409*9880d681SAndroid Build Coastguard Worker return false;
2410*9880d681SAndroid Build Coastguard Worker }
2411*9880d681SAndroid Build Coastguard Worker
2412*9880d681SAndroid Build Coastguard Worker StOps.push_back(getI32Imm(IsVolatile, DL));
2413*9880d681SAndroid Build Coastguard Worker StOps.push_back(getI32Imm(CodeAddrSpace, DL));
2414*9880d681SAndroid Build Coastguard Worker StOps.push_back(getI32Imm(VecType, DL));
2415*9880d681SAndroid Build Coastguard Worker StOps.push_back(getI32Imm(ToType, DL));
2416*9880d681SAndroid Build Coastguard Worker StOps.push_back(getI32Imm(ToTypeWidth, DL));
2417*9880d681SAndroid Build Coastguard Worker
2418*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(N2, Addr)) {
2419*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2420*9880d681SAndroid Build Coastguard Worker default:
2421*9880d681SAndroid Build Coastguard Worker return false;
2422*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2423*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2424*9880d681SAndroid Build Coastguard Worker default:
2425*9880d681SAndroid Build Coastguard Worker return false;
2426*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2427*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_avar;
2428*9880d681SAndroid Build Coastguard Worker break;
2429*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2430*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_avar;
2431*9880d681SAndroid Build Coastguard Worker break;
2432*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2433*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_avar;
2434*9880d681SAndroid Build Coastguard Worker break;
2435*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2436*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_avar;
2437*9880d681SAndroid Build Coastguard Worker break;
2438*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2439*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_avar;
2440*9880d681SAndroid Build Coastguard Worker break;
2441*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2442*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_avar;
2443*9880d681SAndroid Build Coastguard Worker break;
2444*9880d681SAndroid Build Coastguard Worker }
2445*9880d681SAndroid Build Coastguard Worker break;
2446*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2447*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2448*9880d681SAndroid Build Coastguard Worker default:
2449*9880d681SAndroid Build Coastguard Worker return false;
2450*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2451*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_avar;
2452*9880d681SAndroid Build Coastguard Worker break;
2453*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2454*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_avar;
2455*9880d681SAndroid Build Coastguard Worker break;
2456*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2457*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_avar;
2458*9880d681SAndroid Build Coastguard Worker break;
2459*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2460*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_avar;
2461*9880d681SAndroid Build Coastguard Worker break;
2462*9880d681SAndroid Build Coastguard Worker }
2463*9880d681SAndroid Build Coastguard Worker break;
2464*9880d681SAndroid Build Coastguard Worker }
2465*9880d681SAndroid Build Coastguard Worker StOps.push_back(Addr);
2466*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2467*9880d681SAndroid Build Coastguard Worker : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
2468*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2469*9880d681SAndroid Build Coastguard Worker default:
2470*9880d681SAndroid Build Coastguard Worker return false;
2471*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2472*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2473*9880d681SAndroid Build Coastguard Worker default:
2474*9880d681SAndroid Build Coastguard Worker return false;
2475*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2476*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_asi;
2477*9880d681SAndroid Build Coastguard Worker break;
2478*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2479*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_asi;
2480*9880d681SAndroid Build Coastguard Worker break;
2481*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2482*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_asi;
2483*9880d681SAndroid Build Coastguard Worker break;
2484*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2485*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_asi;
2486*9880d681SAndroid Build Coastguard Worker break;
2487*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2488*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_asi;
2489*9880d681SAndroid Build Coastguard Worker break;
2490*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2491*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_asi;
2492*9880d681SAndroid Build Coastguard Worker break;
2493*9880d681SAndroid Build Coastguard Worker }
2494*9880d681SAndroid Build Coastguard Worker break;
2495*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2496*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2497*9880d681SAndroid Build Coastguard Worker default:
2498*9880d681SAndroid Build Coastguard Worker return false;
2499*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2500*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_asi;
2501*9880d681SAndroid Build Coastguard Worker break;
2502*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2503*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_asi;
2504*9880d681SAndroid Build Coastguard Worker break;
2505*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2506*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_asi;
2507*9880d681SAndroid Build Coastguard Worker break;
2508*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2509*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_asi;
2510*9880d681SAndroid Build Coastguard Worker break;
2511*9880d681SAndroid Build Coastguard Worker }
2512*9880d681SAndroid Build Coastguard Worker break;
2513*9880d681SAndroid Build Coastguard Worker }
2514*9880d681SAndroid Build Coastguard Worker StOps.push_back(Base);
2515*9880d681SAndroid Build Coastguard Worker StOps.push_back(Offset);
2516*9880d681SAndroid Build Coastguard Worker } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2517*9880d681SAndroid Build Coastguard Worker : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2518*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
2519*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2520*9880d681SAndroid Build Coastguard Worker default:
2521*9880d681SAndroid Build Coastguard Worker return false;
2522*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2523*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2524*9880d681SAndroid Build Coastguard Worker default:
2525*9880d681SAndroid Build Coastguard Worker return false;
2526*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2527*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_ari_64;
2528*9880d681SAndroid Build Coastguard Worker break;
2529*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2530*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_ari_64;
2531*9880d681SAndroid Build Coastguard Worker break;
2532*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2533*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_ari_64;
2534*9880d681SAndroid Build Coastguard Worker break;
2535*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2536*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_ari_64;
2537*9880d681SAndroid Build Coastguard Worker break;
2538*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2539*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_ari_64;
2540*9880d681SAndroid Build Coastguard Worker break;
2541*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2542*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_ari_64;
2543*9880d681SAndroid Build Coastguard Worker break;
2544*9880d681SAndroid Build Coastguard Worker }
2545*9880d681SAndroid Build Coastguard Worker break;
2546*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2547*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2548*9880d681SAndroid Build Coastguard Worker default:
2549*9880d681SAndroid Build Coastguard Worker return false;
2550*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2551*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_ari_64;
2552*9880d681SAndroid Build Coastguard Worker break;
2553*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2554*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_ari_64;
2555*9880d681SAndroid Build Coastguard Worker break;
2556*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2557*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_ari_64;
2558*9880d681SAndroid Build Coastguard Worker break;
2559*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2560*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_ari_64;
2561*9880d681SAndroid Build Coastguard Worker break;
2562*9880d681SAndroid Build Coastguard Worker }
2563*9880d681SAndroid Build Coastguard Worker break;
2564*9880d681SAndroid Build Coastguard Worker }
2565*9880d681SAndroid Build Coastguard Worker } else {
2566*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2567*9880d681SAndroid Build Coastguard Worker default:
2568*9880d681SAndroid Build Coastguard Worker return false;
2569*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2570*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2571*9880d681SAndroid Build Coastguard Worker default:
2572*9880d681SAndroid Build Coastguard Worker return false;
2573*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2574*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_ari;
2575*9880d681SAndroid Build Coastguard Worker break;
2576*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2577*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_ari;
2578*9880d681SAndroid Build Coastguard Worker break;
2579*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2580*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_ari;
2581*9880d681SAndroid Build Coastguard Worker break;
2582*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2583*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_ari;
2584*9880d681SAndroid Build Coastguard Worker break;
2585*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2586*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_ari;
2587*9880d681SAndroid Build Coastguard Worker break;
2588*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2589*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_ari;
2590*9880d681SAndroid Build Coastguard Worker break;
2591*9880d681SAndroid Build Coastguard Worker }
2592*9880d681SAndroid Build Coastguard Worker break;
2593*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2594*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2595*9880d681SAndroid Build Coastguard Worker default:
2596*9880d681SAndroid Build Coastguard Worker return false;
2597*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2598*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_ari;
2599*9880d681SAndroid Build Coastguard Worker break;
2600*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2601*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_ari;
2602*9880d681SAndroid Build Coastguard Worker break;
2603*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2604*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_ari;
2605*9880d681SAndroid Build Coastguard Worker break;
2606*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2607*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_ari;
2608*9880d681SAndroid Build Coastguard Worker break;
2609*9880d681SAndroid Build Coastguard Worker }
2610*9880d681SAndroid Build Coastguard Worker break;
2611*9880d681SAndroid Build Coastguard Worker }
2612*9880d681SAndroid Build Coastguard Worker }
2613*9880d681SAndroid Build Coastguard Worker StOps.push_back(Base);
2614*9880d681SAndroid Build Coastguard Worker StOps.push_back(Offset);
2615*9880d681SAndroid Build Coastguard Worker } else {
2616*9880d681SAndroid Build Coastguard Worker if (TM.is64Bit()) {
2617*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2618*9880d681SAndroid Build Coastguard Worker default:
2619*9880d681SAndroid Build Coastguard Worker return false;
2620*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2621*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2622*9880d681SAndroid Build Coastguard Worker default:
2623*9880d681SAndroid Build Coastguard Worker return false;
2624*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2625*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_areg_64;
2626*9880d681SAndroid Build Coastguard Worker break;
2627*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2628*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_areg_64;
2629*9880d681SAndroid Build Coastguard Worker break;
2630*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2631*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_areg_64;
2632*9880d681SAndroid Build Coastguard Worker break;
2633*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2634*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_areg_64;
2635*9880d681SAndroid Build Coastguard Worker break;
2636*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2637*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_areg_64;
2638*9880d681SAndroid Build Coastguard Worker break;
2639*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2640*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_areg_64;
2641*9880d681SAndroid Build Coastguard Worker break;
2642*9880d681SAndroid Build Coastguard Worker }
2643*9880d681SAndroid Build Coastguard Worker break;
2644*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2645*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2646*9880d681SAndroid Build Coastguard Worker default:
2647*9880d681SAndroid Build Coastguard Worker return false;
2648*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2649*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_areg_64;
2650*9880d681SAndroid Build Coastguard Worker break;
2651*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2652*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_areg_64;
2653*9880d681SAndroid Build Coastguard Worker break;
2654*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2655*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_areg_64;
2656*9880d681SAndroid Build Coastguard Worker break;
2657*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2658*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_areg_64;
2659*9880d681SAndroid Build Coastguard Worker break;
2660*9880d681SAndroid Build Coastguard Worker }
2661*9880d681SAndroid Build Coastguard Worker break;
2662*9880d681SAndroid Build Coastguard Worker }
2663*9880d681SAndroid Build Coastguard Worker } else {
2664*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2665*9880d681SAndroid Build Coastguard Worker default:
2666*9880d681SAndroid Build Coastguard Worker return false;
2667*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
2668*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2669*9880d681SAndroid Build Coastguard Worker default:
2670*9880d681SAndroid Build Coastguard Worker return false;
2671*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2672*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v2_areg;
2673*9880d681SAndroid Build Coastguard Worker break;
2674*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2675*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v2_areg;
2676*9880d681SAndroid Build Coastguard Worker break;
2677*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2678*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v2_areg;
2679*9880d681SAndroid Build Coastguard Worker break;
2680*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2681*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i64_v2_areg;
2682*9880d681SAndroid Build Coastguard Worker break;
2683*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2684*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v2_areg;
2685*9880d681SAndroid Build Coastguard Worker break;
2686*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2687*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f64_v2_areg;
2688*9880d681SAndroid Build Coastguard Worker break;
2689*9880d681SAndroid Build Coastguard Worker }
2690*9880d681SAndroid Build Coastguard Worker break;
2691*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
2692*9880d681SAndroid Build Coastguard Worker switch (EltVT.getSimpleVT().SimpleTy) {
2693*9880d681SAndroid Build Coastguard Worker default:
2694*9880d681SAndroid Build Coastguard Worker return false;
2695*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2696*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i8_v4_areg;
2697*9880d681SAndroid Build Coastguard Worker break;
2698*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2699*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i16_v4_areg;
2700*9880d681SAndroid Build Coastguard Worker break;
2701*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2702*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_i32_v4_areg;
2703*9880d681SAndroid Build Coastguard Worker break;
2704*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2705*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::STV_f32_v4_areg;
2706*9880d681SAndroid Build Coastguard Worker break;
2707*9880d681SAndroid Build Coastguard Worker }
2708*9880d681SAndroid Build Coastguard Worker break;
2709*9880d681SAndroid Build Coastguard Worker }
2710*9880d681SAndroid Build Coastguard Worker }
2711*9880d681SAndroid Build Coastguard Worker StOps.push_back(N2);
2712*9880d681SAndroid Build Coastguard Worker }
2713*9880d681SAndroid Build Coastguard Worker
2714*9880d681SAndroid Build Coastguard Worker StOps.push_back(Chain);
2715*9880d681SAndroid Build Coastguard Worker
2716*9880d681SAndroid Build Coastguard Worker ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
2717*9880d681SAndroid Build Coastguard Worker
2718*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2719*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2720*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2721*9880d681SAndroid Build Coastguard Worker
2722*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, ST);
2723*9880d681SAndroid Build Coastguard Worker return true;
2724*9880d681SAndroid Build Coastguard Worker }
2725*9880d681SAndroid Build Coastguard Worker
tryLoadParam(SDNode * Node)2726*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryLoadParam(SDNode *Node) {
2727*9880d681SAndroid Build Coastguard Worker SDValue Chain = Node->getOperand(0);
2728*9880d681SAndroid Build Coastguard Worker SDValue Offset = Node->getOperand(2);
2729*9880d681SAndroid Build Coastguard Worker SDValue Flag = Node->getOperand(3);
2730*9880d681SAndroid Build Coastguard Worker SDLoc DL(Node);
2731*9880d681SAndroid Build Coastguard Worker MemSDNode *Mem = cast<MemSDNode>(Node);
2732*9880d681SAndroid Build Coastguard Worker
2733*9880d681SAndroid Build Coastguard Worker unsigned VecSize;
2734*9880d681SAndroid Build Coastguard Worker switch (Node->getOpcode()) {
2735*9880d681SAndroid Build Coastguard Worker default:
2736*9880d681SAndroid Build Coastguard Worker return false;
2737*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParam:
2738*9880d681SAndroid Build Coastguard Worker VecSize = 1;
2739*9880d681SAndroid Build Coastguard Worker break;
2740*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV2:
2741*9880d681SAndroid Build Coastguard Worker VecSize = 2;
2742*9880d681SAndroid Build Coastguard Worker break;
2743*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV4:
2744*9880d681SAndroid Build Coastguard Worker VecSize = 4;
2745*9880d681SAndroid Build Coastguard Worker break;
2746*9880d681SAndroid Build Coastguard Worker }
2747*9880d681SAndroid Build Coastguard Worker
2748*9880d681SAndroid Build Coastguard Worker EVT EltVT = Node->getValueType(0);
2749*9880d681SAndroid Build Coastguard Worker EVT MemVT = Mem->getMemoryVT();
2750*9880d681SAndroid Build Coastguard Worker
2751*9880d681SAndroid Build Coastguard Worker unsigned Opc = 0;
2752*9880d681SAndroid Build Coastguard Worker
2753*9880d681SAndroid Build Coastguard Worker switch (VecSize) {
2754*9880d681SAndroid Build Coastguard Worker default:
2755*9880d681SAndroid Build Coastguard Worker return false;
2756*9880d681SAndroid Build Coastguard Worker case 1:
2757*9880d681SAndroid Build Coastguard Worker switch (MemVT.getSimpleVT().SimpleTy) {
2758*9880d681SAndroid Build Coastguard Worker default:
2759*9880d681SAndroid Build Coastguard Worker return false;
2760*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2761*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemI8;
2762*9880d681SAndroid Build Coastguard Worker break;
2763*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2764*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemI8;
2765*9880d681SAndroid Build Coastguard Worker break;
2766*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2767*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemI16;
2768*9880d681SAndroid Build Coastguard Worker break;
2769*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2770*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemI32;
2771*9880d681SAndroid Build Coastguard Worker break;
2772*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2773*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemI64;
2774*9880d681SAndroid Build Coastguard Worker break;
2775*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2776*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemF32;
2777*9880d681SAndroid Build Coastguard Worker break;
2778*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2779*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemF64;
2780*9880d681SAndroid Build Coastguard Worker break;
2781*9880d681SAndroid Build Coastguard Worker }
2782*9880d681SAndroid Build Coastguard Worker break;
2783*9880d681SAndroid Build Coastguard Worker case 2:
2784*9880d681SAndroid Build Coastguard Worker switch (MemVT.getSimpleVT().SimpleTy) {
2785*9880d681SAndroid Build Coastguard Worker default:
2786*9880d681SAndroid Build Coastguard Worker return false;
2787*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2788*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2I8;
2789*9880d681SAndroid Build Coastguard Worker break;
2790*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2791*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2I8;
2792*9880d681SAndroid Build Coastguard Worker break;
2793*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2794*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2I16;
2795*9880d681SAndroid Build Coastguard Worker break;
2796*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2797*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2I32;
2798*9880d681SAndroid Build Coastguard Worker break;
2799*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2800*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2I64;
2801*9880d681SAndroid Build Coastguard Worker break;
2802*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2803*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2F32;
2804*9880d681SAndroid Build Coastguard Worker break;
2805*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2806*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV2F64;
2807*9880d681SAndroid Build Coastguard Worker break;
2808*9880d681SAndroid Build Coastguard Worker }
2809*9880d681SAndroid Build Coastguard Worker break;
2810*9880d681SAndroid Build Coastguard Worker case 4:
2811*9880d681SAndroid Build Coastguard Worker switch (MemVT.getSimpleVT().SimpleTy) {
2812*9880d681SAndroid Build Coastguard Worker default:
2813*9880d681SAndroid Build Coastguard Worker return false;
2814*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2815*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV4I8;
2816*9880d681SAndroid Build Coastguard Worker break;
2817*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2818*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV4I8;
2819*9880d681SAndroid Build Coastguard Worker break;
2820*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2821*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV4I16;
2822*9880d681SAndroid Build Coastguard Worker break;
2823*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2824*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV4I32;
2825*9880d681SAndroid Build Coastguard Worker break;
2826*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2827*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::LoadParamMemV4F32;
2828*9880d681SAndroid Build Coastguard Worker break;
2829*9880d681SAndroid Build Coastguard Worker }
2830*9880d681SAndroid Build Coastguard Worker break;
2831*9880d681SAndroid Build Coastguard Worker }
2832*9880d681SAndroid Build Coastguard Worker
2833*9880d681SAndroid Build Coastguard Worker SDVTList VTs;
2834*9880d681SAndroid Build Coastguard Worker if (VecSize == 1) {
2835*9880d681SAndroid Build Coastguard Worker VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2836*9880d681SAndroid Build Coastguard Worker } else if (VecSize == 2) {
2837*9880d681SAndroid Build Coastguard Worker VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2838*9880d681SAndroid Build Coastguard Worker } else {
2839*9880d681SAndroid Build Coastguard Worker EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
2840*9880d681SAndroid Build Coastguard Worker VTs = CurDAG->getVTList(EVTs);
2841*9880d681SAndroid Build Coastguard Worker }
2842*9880d681SAndroid Build Coastguard Worker
2843*9880d681SAndroid Build Coastguard Worker unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2844*9880d681SAndroid Build Coastguard Worker
2845*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 2> Ops;
2846*9880d681SAndroid Build Coastguard Worker Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
2847*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
2848*9880d681SAndroid Build Coastguard Worker Ops.push_back(Flag);
2849*9880d681SAndroid Build Coastguard Worker
2850*9880d681SAndroid Build Coastguard Worker ReplaceNode(Node, CurDAG->getMachineNode(Opc, DL, VTs, Ops));
2851*9880d681SAndroid Build Coastguard Worker return true;
2852*9880d681SAndroid Build Coastguard Worker }
2853*9880d681SAndroid Build Coastguard Worker
tryStoreRetval(SDNode * N)2854*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryStoreRetval(SDNode *N) {
2855*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
2856*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
2857*9880d681SAndroid Build Coastguard Worker SDValue Offset = N->getOperand(1);
2858*9880d681SAndroid Build Coastguard Worker unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2859*9880d681SAndroid Build Coastguard Worker MemSDNode *Mem = cast<MemSDNode>(N);
2860*9880d681SAndroid Build Coastguard Worker
2861*9880d681SAndroid Build Coastguard Worker // How many elements do we have?
2862*9880d681SAndroid Build Coastguard Worker unsigned NumElts = 1;
2863*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2864*9880d681SAndroid Build Coastguard Worker default:
2865*9880d681SAndroid Build Coastguard Worker return false;
2866*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetval:
2867*9880d681SAndroid Build Coastguard Worker NumElts = 1;
2868*9880d681SAndroid Build Coastguard Worker break;
2869*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV2:
2870*9880d681SAndroid Build Coastguard Worker NumElts = 2;
2871*9880d681SAndroid Build Coastguard Worker break;
2872*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV4:
2873*9880d681SAndroid Build Coastguard Worker NumElts = 4;
2874*9880d681SAndroid Build Coastguard Worker break;
2875*9880d681SAndroid Build Coastguard Worker }
2876*9880d681SAndroid Build Coastguard Worker
2877*9880d681SAndroid Build Coastguard Worker // Build vector of operands
2878*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 6> Ops;
2879*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; ++i)
2880*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(i + 2));
2881*9880d681SAndroid Build Coastguard Worker Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
2882*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
2883*9880d681SAndroid Build Coastguard Worker
2884*9880d681SAndroid Build Coastguard Worker // Determine target opcode
2885*9880d681SAndroid Build Coastguard Worker // If we have an i1, use an 8-bit store. The lowering code in
2886*9880d681SAndroid Build Coastguard Worker // NVPTXISelLowering will have already emitted an upcast.
2887*9880d681SAndroid Build Coastguard Worker unsigned Opcode = 0;
2888*9880d681SAndroid Build Coastguard Worker switch (NumElts) {
2889*9880d681SAndroid Build Coastguard Worker default:
2890*9880d681SAndroid Build Coastguard Worker return false;
2891*9880d681SAndroid Build Coastguard Worker case 1:
2892*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2893*9880d681SAndroid Build Coastguard Worker default:
2894*9880d681SAndroid Build Coastguard Worker return false;
2895*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2896*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalI8;
2897*9880d681SAndroid Build Coastguard Worker break;
2898*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2899*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalI8;
2900*9880d681SAndroid Build Coastguard Worker break;
2901*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2902*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalI16;
2903*9880d681SAndroid Build Coastguard Worker break;
2904*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2905*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalI32;
2906*9880d681SAndroid Build Coastguard Worker break;
2907*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2908*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalI64;
2909*9880d681SAndroid Build Coastguard Worker break;
2910*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2911*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalF32;
2912*9880d681SAndroid Build Coastguard Worker break;
2913*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2914*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalF64;
2915*9880d681SAndroid Build Coastguard Worker break;
2916*9880d681SAndroid Build Coastguard Worker }
2917*9880d681SAndroid Build Coastguard Worker break;
2918*9880d681SAndroid Build Coastguard Worker case 2:
2919*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2920*9880d681SAndroid Build Coastguard Worker default:
2921*9880d681SAndroid Build Coastguard Worker return false;
2922*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2923*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2I8;
2924*9880d681SAndroid Build Coastguard Worker break;
2925*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2926*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2I8;
2927*9880d681SAndroid Build Coastguard Worker break;
2928*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2929*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2I16;
2930*9880d681SAndroid Build Coastguard Worker break;
2931*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2932*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2I32;
2933*9880d681SAndroid Build Coastguard Worker break;
2934*9880d681SAndroid Build Coastguard Worker case MVT::i64:
2935*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2I64;
2936*9880d681SAndroid Build Coastguard Worker break;
2937*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2938*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2F32;
2939*9880d681SAndroid Build Coastguard Worker break;
2940*9880d681SAndroid Build Coastguard Worker case MVT::f64:
2941*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV2F64;
2942*9880d681SAndroid Build Coastguard Worker break;
2943*9880d681SAndroid Build Coastguard Worker }
2944*9880d681SAndroid Build Coastguard Worker break;
2945*9880d681SAndroid Build Coastguard Worker case 4:
2946*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2947*9880d681SAndroid Build Coastguard Worker default:
2948*9880d681SAndroid Build Coastguard Worker return false;
2949*9880d681SAndroid Build Coastguard Worker case MVT::i1:
2950*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV4I8;
2951*9880d681SAndroid Build Coastguard Worker break;
2952*9880d681SAndroid Build Coastguard Worker case MVT::i8:
2953*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV4I8;
2954*9880d681SAndroid Build Coastguard Worker break;
2955*9880d681SAndroid Build Coastguard Worker case MVT::i16:
2956*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV4I16;
2957*9880d681SAndroid Build Coastguard Worker break;
2958*9880d681SAndroid Build Coastguard Worker case MVT::i32:
2959*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV4I32;
2960*9880d681SAndroid Build Coastguard Worker break;
2961*9880d681SAndroid Build Coastguard Worker case MVT::f32:
2962*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreRetvalV4F32;
2963*9880d681SAndroid Build Coastguard Worker break;
2964*9880d681SAndroid Build Coastguard Worker }
2965*9880d681SAndroid Build Coastguard Worker break;
2966*9880d681SAndroid Build Coastguard Worker }
2967*9880d681SAndroid Build Coastguard Worker
2968*9880d681SAndroid Build Coastguard Worker SDNode *Ret =
2969*9880d681SAndroid Build Coastguard Worker CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
2970*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2971*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2972*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2973*9880d681SAndroid Build Coastguard Worker
2974*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, Ret);
2975*9880d681SAndroid Build Coastguard Worker return true;
2976*9880d681SAndroid Build Coastguard Worker }
2977*9880d681SAndroid Build Coastguard Worker
tryStoreParam(SDNode * N)2978*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryStoreParam(SDNode *N) {
2979*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
2980*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
2981*9880d681SAndroid Build Coastguard Worker SDValue Param = N->getOperand(1);
2982*9880d681SAndroid Build Coastguard Worker unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
2983*9880d681SAndroid Build Coastguard Worker SDValue Offset = N->getOperand(2);
2984*9880d681SAndroid Build Coastguard Worker unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2985*9880d681SAndroid Build Coastguard Worker MemSDNode *Mem = cast<MemSDNode>(N);
2986*9880d681SAndroid Build Coastguard Worker SDValue Flag = N->getOperand(N->getNumOperands() - 1);
2987*9880d681SAndroid Build Coastguard Worker
2988*9880d681SAndroid Build Coastguard Worker // How many elements do we have?
2989*9880d681SAndroid Build Coastguard Worker unsigned NumElts = 1;
2990*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
2991*9880d681SAndroid Build Coastguard Worker default:
2992*9880d681SAndroid Build Coastguard Worker return false;
2993*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamU32:
2994*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamS32:
2995*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParam:
2996*9880d681SAndroid Build Coastguard Worker NumElts = 1;
2997*9880d681SAndroid Build Coastguard Worker break;
2998*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV2:
2999*9880d681SAndroid Build Coastguard Worker NumElts = 2;
3000*9880d681SAndroid Build Coastguard Worker break;
3001*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV4:
3002*9880d681SAndroid Build Coastguard Worker NumElts = 4;
3003*9880d681SAndroid Build Coastguard Worker break;
3004*9880d681SAndroid Build Coastguard Worker }
3005*9880d681SAndroid Build Coastguard Worker
3006*9880d681SAndroid Build Coastguard Worker // Build vector of operands
3007*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
3008*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; ++i)
3009*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(i + 3));
3010*9880d681SAndroid Build Coastguard Worker Ops.push_back(CurDAG->getTargetConstant(ParamVal, DL, MVT::i32));
3011*9880d681SAndroid Build Coastguard Worker Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
3012*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3013*9880d681SAndroid Build Coastguard Worker Ops.push_back(Flag);
3014*9880d681SAndroid Build Coastguard Worker
3015*9880d681SAndroid Build Coastguard Worker // Determine target opcode
3016*9880d681SAndroid Build Coastguard Worker // If we have an i1, use an 8-bit store. The lowering code in
3017*9880d681SAndroid Build Coastguard Worker // NVPTXISelLowering will have already emitted an upcast.
3018*9880d681SAndroid Build Coastguard Worker unsigned Opcode = 0;
3019*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
3020*9880d681SAndroid Build Coastguard Worker default:
3021*9880d681SAndroid Build Coastguard Worker switch (NumElts) {
3022*9880d681SAndroid Build Coastguard Worker default:
3023*9880d681SAndroid Build Coastguard Worker return false;
3024*9880d681SAndroid Build Coastguard Worker case 1:
3025*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3026*9880d681SAndroid Build Coastguard Worker default:
3027*9880d681SAndroid Build Coastguard Worker return false;
3028*9880d681SAndroid Build Coastguard Worker case MVT::i1:
3029*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI8;
3030*9880d681SAndroid Build Coastguard Worker break;
3031*9880d681SAndroid Build Coastguard Worker case MVT::i8:
3032*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI8;
3033*9880d681SAndroid Build Coastguard Worker break;
3034*9880d681SAndroid Build Coastguard Worker case MVT::i16:
3035*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI16;
3036*9880d681SAndroid Build Coastguard Worker break;
3037*9880d681SAndroid Build Coastguard Worker case MVT::i32:
3038*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI32;
3039*9880d681SAndroid Build Coastguard Worker break;
3040*9880d681SAndroid Build Coastguard Worker case MVT::i64:
3041*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI64;
3042*9880d681SAndroid Build Coastguard Worker break;
3043*9880d681SAndroid Build Coastguard Worker case MVT::f32:
3044*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamF32;
3045*9880d681SAndroid Build Coastguard Worker break;
3046*9880d681SAndroid Build Coastguard Worker case MVT::f64:
3047*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamF64;
3048*9880d681SAndroid Build Coastguard Worker break;
3049*9880d681SAndroid Build Coastguard Worker }
3050*9880d681SAndroid Build Coastguard Worker break;
3051*9880d681SAndroid Build Coastguard Worker case 2:
3052*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3053*9880d681SAndroid Build Coastguard Worker default:
3054*9880d681SAndroid Build Coastguard Worker return false;
3055*9880d681SAndroid Build Coastguard Worker case MVT::i1:
3056*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2I8;
3057*9880d681SAndroid Build Coastguard Worker break;
3058*9880d681SAndroid Build Coastguard Worker case MVT::i8:
3059*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2I8;
3060*9880d681SAndroid Build Coastguard Worker break;
3061*9880d681SAndroid Build Coastguard Worker case MVT::i16:
3062*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2I16;
3063*9880d681SAndroid Build Coastguard Worker break;
3064*9880d681SAndroid Build Coastguard Worker case MVT::i32:
3065*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2I32;
3066*9880d681SAndroid Build Coastguard Worker break;
3067*9880d681SAndroid Build Coastguard Worker case MVT::i64:
3068*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2I64;
3069*9880d681SAndroid Build Coastguard Worker break;
3070*9880d681SAndroid Build Coastguard Worker case MVT::f32:
3071*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2F32;
3072*9880d681SAndroid Build Coastguard Worker break;
3073*9880d681SAndroid Build Coastguard Worker case MVT::f64:
3074*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV2F64;
3075*9880d681SAndroid Build Coastguard Worker break;
3076*9880d681SAndroid Build Coastguard Worker }
3077*9880d681SAndroid Build Coastguard Worker break;
3078*9880d681SAndroid Build Coastguard Worker case 4:
3079*9880d681SAndroid Build Coastguard Worker switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3080*9880d681SAndroid Build Coastguard Worker default:
3081*9880d681SAndroid Build Coastguard Worker return false;
3082*9880d681SAndroid Build Coastguard Worker case MVT::i1:
3083*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV4I8;
3084*9880d681SAndroid Build Coastguard Worker break;
3085*9880d681SAndroid Build Coastguard Worker case MVT::i8:
3086*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV4I8;
3087*9880d681SAndroid Build Coastguard Worker break;
3088*9880d681SAndroid Build Coastguard Worker case MVT::i16:
3089*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV4I16;
3090*9880d681SAndroid Build Coastguard Worker break;
3091*9880d681SAndroid Build Coastguard Worker case MVT::i32:
3092*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV4I32;
3093*9880d681SAndroid Build Coastguard Worker break;
3094*9880d681SAndroid Build Coastguard Worker case MVT::f32:
3095*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamV4F32;
3096*9880d681SAndroid Build Coastguard Worker break;
3097*9880d681SAndroid Build Coastguard Worker }
3098*9880d681SAndroid Build Coastguard Worker break;
3099*9880d681SAndroid Build Coastguard Worker }
3100*9880d681SAndroid Build Coastguard Worker break;
3101*9880d681SAndroid Build Coastguard Worker // Special case: if we have a sign-extend/zero-extend node, insert the
3102*9880d681SAndroid Build Coastguard Worker // conversion instruction first, and use that as the value operand to
3103*9880d681SAndroid Build Coastguard Worker // the selected StoreParam node.
3104*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamU32: {
3105*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI32;
3106*9880d681SAndroid Build Coastguard Worker SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
3107*9880d681SAndroid Build Coastguard Worker MVT::i32);
3108*9880d681SAndroid Build Coastguard Worker SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
3109*9880d681SAndroid Build Coastguard Worker MVT::i32, Ops[0], CvtNone);
3110*9880d681SAndroid Build Coastguard Worker Ops[0] = SDValue(Cvt, 0);
3111*9880d681SAndroid Build Coastguard Worker break;
3112*9880d681SAndroid Build Coastguard Worker }
3113*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamS32: {
3114*9880d681SAndroid Build Coastguard Worker Opcode = NVPTX::StoreParamI32;
3115*9880d681SAndroid Build Coastguard Worker SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
3116*9880d681SAndroid Build Coastguard Worker MVT::i32);
3117*9880d681SAndroid Build Coastguard Worker SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
3118*9880d681SAndroid Build Coastguard Worker MVT::i32, Ops[0], CvtNone);
3119*9880d681SAndroid Build Coastguard Worker Ops[0] = SDValue(Cvt, 0);
3120*9880d681SAndroid Build Coastguard Worker break;
3121*9880d681SAndroid Build Coastguard Worker }
3122*9880d681SAndroid Build Coastguard Worker }
3123*9880d681SAndroid Build Coastguard Worker
3124*9880d681SAndroid Build Coastguard Worker SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
3125*9880d681SAndroid Build Coastguard Worker SDNode *Ret =
3126*9880d681SAndroid Build Coastguard Worker CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
3127*9880d681SAndroid Build Coastguard Worker MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3128*9880d681SAndroid Build Coastguard Worker MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3129*9880d681SAndroid Build Coastguard Worker cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3130*9880d681SAndroid Build Coastguard Worker
3131*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, Ret);
3132*9880d681SAndroid Build Coastguard Worker return true;
3133*9880d681SAndroid Build Coastguard Worker }
3134*9880d681SAndroid Build Coastguard Worker
tryTextureIntrinsic(SDNode * N)3135*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryTextureIntrinsic(SDNode *N) {
3136*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
3137*9880d681SAndroid Build Coastguard Worker unsigned Opc = 0;
3138*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
3139*9880d681SAndroid Build Coastguard Worker
3140*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
3141*9880d681SAndroid Build Coastguard Worker default: return false;
3142*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatS32:
3143*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_F32_S32;
3144*9880d681SAndroid Build Coastguard Worker break;
3145*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloat:
3146*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_F32_F32;
3147*9880d681SAndroid Build Coastguard Worker break;
3148*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatLevel:
3149*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_F32_F32_LEVEL;
3150*9880d681SAndroid Build Coastguard Worker break;
3151*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatGrad:
3152*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_F32_F32_GRAD;
3153*9880d681SAndroid Build Coastguard Worker break;
3154*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32S32:
3155*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_S32_S32;
3156*9880d681SAndroid Build Coastguard Worker break;
3157*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32Float:
3158*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_S32_F32;
3159*9880d681SAndroid Build Coastguard Worker break;
3160*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatLevel:
3161*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_S32_F32_LEVEL;
3162*9880d681SAndroid Build Coastguard Worker break;
3163*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatGrad:
3164*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_S32_F32_GRAD;
3165*9880d681SAndroid Build Coastguard Worker break;
3166*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32S32:
3167*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_U32_S32;
3168*9880d681SAndroid Build Coastguard Worker break;
3169*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32Float:
3170*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_U32_F32;
3171*9880d681SAndroid Build Coastguard Worker break;
3172*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatLevel:
3173*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_U32_F32_LEVEL;
3174*9880d681SAndroid Build Coastguard Worker break;
3175*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatGrad:
3176*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_U32_F32_GRAD;
3177*9880d681SAndroid Build Coastguard Worker break;
3178*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatS32:
3179*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_F32_S32;
3180*9880d681SAndroid Build Coastguard Worker break;
3181*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloat:
3182*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_F32_F32;
3183*9880d681SAndroid Build Coastguard Worker break;
3184*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatLevel:
3185*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_F32_F32_LEVEL;
3186*9880d681SAndroid Build Coastguard Worker break;
3187*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatGrad:
3188*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_F32_F32_GRAD;
3189*9880d681SAndroid Build Coastguard Worker break;
3190*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32S32:
3191*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_S32_S32;
3192*9880d681SAndroid Build Coastguard Worker break;
3193*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32Float:
3194*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_S32_F32;
3195*9880d681SAndroid Build Coastguard Worker break;
3196*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatLevel:
3197*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_S32_F32_LEVEL;
3198*9880d681SAndroid Build Coastguard Worker break;
3199*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatGrad:
3200*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_S32_F32_GRAD;
3201*9880d681SAndroid Build Coastguard Worker break;
3202*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32S32:
3203*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_U32_S32;
3204*9880d681SAndroid Build Coastguard Worker break;
3205*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32Float:
3206*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_U32_F32;
3207*9880d681SAndroid Build Coastguard Worker break;
3208*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatLevel:
3209*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_U32_F32_LEVEL;
3210*9880d681SAndroid Build Coastguard Worker break;
3211*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatGrad:
3212*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_1D_ARRAY_U32_F32_GRAD;
3213*9880d681SAndroid Build Coastguard Worker break;
3214*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatS32:
3215*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_F32_S32;
3216*9880d681SAndroid Build Coastguard Worker break;
3217*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloat:
3218*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_F32_F32;
3219*9880d681SAndroid Build Coastguard Worker break;
3220*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatLevel:
3221*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_F32_F32_LEVEL;
3222*9880d681SAndroid Build Coastguard Worker break;
3223*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatGrad:
3224*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_F32_F32_GRAD;
3225*9880d681SAndroid Build Coastguard Worker break;
3226*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32S32:
3227*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_S32_S32;
3228*9880d681SAndroid Build Coastguard Worker break;
3229*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32Float:
3230*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_S32_F32;
3231*9880d681SAndroid Build Coastguard Worker break;
3232*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatLevel:
3233*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_S32_F32_LEVEL;
3234*9880d681SAndroid Build Coastguard Worker break;
3235*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatGrad:
3236*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_S32_F32_GRAD;
3237*9880d681SAndroid Build Coastguard Worker break;
3238*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32S32:
3239*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_U32_S32;
3240*9880d681SAndroid Build Coastguard Worker break;
3241*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32Float:
3242*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_U32_F32;
3243*9880d681SAndroid Build Coastguard Worker break;
3244*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatLevel:
3245*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_U32_F32_LEVEL;
3246*9880d681SAndroid Build Coastguard Worker break;
3247*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatGrad:
3248*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_U32_F32_GRAD;
3249*9880d681SAndroid Build Coastguard Worker break;
3250*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatS32:
3251*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_F32_S32;
3252*9880d681SAndroid Build Coastguard Worker break;
3253*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloat:
3254*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_F32_F32;
3255*9880d681SAndroid Build Coastguard Worker break;
3256*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatLevel:
3257*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_F32_F32_LEVEL;
3258*9880d681SAndroid Build Coastguard Worker break;
3259*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatGrad:
3260*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_F32_F32_GRAD;
3261*9880d681SAndroid Build Coastguard Worker break;
3262*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32S32:
3263*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_S32_S32;
3264*9880d681SAndroid Build Coastguard Worker break;
3265*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32Float:
3266*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_S32_F32;
3267*9880d681SAndroid Build Coastguard Worker break;
3268*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatLevel:
3269*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_S32_F32_LEVEL;
3270*9880d681SAndroid Build Coastguard Worker break;
3271*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatGrad:
3272*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_S32_F32_GRAD;
3273*9880d681SAndroid Build Coastguard Worker break;
3274*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32S32:
3275*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_U32_S32;
3276*9880d681SAndroid Build Coastguard Worker break;
3277*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32Float:
3278*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_U32_F32;
3279*9880d681SAndroid Build Coastguard Worker break;
3280*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatLevel:
3281*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_U32_F32_LEVEL;
3282*9880d681SAndroid Build Coastguard Worker break;
3283*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatGrad:
3284*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_2D_ARRAY_U32_F32_GRAD;
3285*9880d681SAndroid Build Coastguard Worker break;
3286*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatS32:
3287*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_F32_S32;
3288*9880d681SAndroid Build Coastguard Worker break;
3289*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloat:
3290*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_F32_F32;
3291*9880d681SAndroid Build Coastguard Worker break;
3292*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatLevel:
3293*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_F32_F32_LEVEL;
3294*9880d681SAndroid Build Coastguard Worker break;
3295*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatGrad:
3296*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_F32_F32_GRAD;
3297*9880d681SAndroid Build Coastguard Worker break;
3298*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32S32:
3299*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_S32_S32;
3300*9880d681SAndroid Build Coastguard Worker break;
3301*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32Float:
3302*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_S32_F32;
3303*9880d681SAndroid Build Coastguard Worker break;
3304*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatLevel:
3305*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_S32_F32_LEVEL;
3306*9880d681SAndroid Build Coastguard Worker break;
3307*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatGrad:
3308*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_S32_F32_GRAD;
3309*9880d681SAndroid Build Coastguard Worker break;
3310*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32S32:
3311*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_U32_S32;
3312*9880d681SAndroid Build Coastguard Worker break;
3313*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32Float:
3314*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_U32_F32;
3315*9880d681SAndroid Build Coastguard Worker break;
3316*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatLevel:
3317*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_U32_F32_LEVEL;
3318*9880d681SAndroid Build Coastguard Worker break;
3319*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatGrad:
3320*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_3D_U32_F32_GRAD;
3321*9880d681SAndroid Build Coastguard Worker break;
3322*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloat:
3323*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_F32_F32;
3324*9880d681SAndroid Build Coastguard Worker break;
3325*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloatLevel:
3326*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_F32_F32_LEVEL;
3327*9880d681SAndroid Build Coastguard Worker break;
3328*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32Float:
3329*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_S32_F32;
3330*9880d681SAndroid Build Coastguard Worker break;
3331*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32FloatLevel:
3332*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_S32_F32_LEVEL;
3333*9880d681SAndroid Build Coastguard Worker break;
3334*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32Float:
3335*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_U32_F32;
3336*9880d681SAndroid Build Coastguard Worker break;
3337*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32FloatLevel:
3338*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_U32_F32_LEVEL;
3339*9880d681SAndroid Build Coastguard Worker break;
3340*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloat:
3341*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32;
3342*9880d681SAndroid Build Coastguard Worker break;
3343*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloatLevel:
3344*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32_LEVEL;
3345*9880d681SAndroid Build Coastguard Worker break;
3346*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32Float:
3347*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32;
3348*9880d681SAndroid Build Coastguard Worker break;
3349*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32FloatLevel:
3350*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32_LEVEL;
3351*9880d681SAndroid Build Coastguard Worker break;
3352*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32Float:
3353*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32;
3354*9880d681SAndroid Build Coastguard Worker break;
3355*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32FloatLevel:
3356*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32_LEVEL;
3357*9880d681SAndroid Build Coastguard Worker break;
3358*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DFloatFloat:
3359*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_R_2D_F32_F32;
3360*9880d681SAndroid Build Coastguard Worker break;
3361*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DFloatFloat:
3362*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_G_2D_F32_F32;
3363*9880d681SAndroid Build Coastguard Worker break;
3364*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DFloatFloat:
3365*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_B_2D_F32_F32;
3366*9880d681SAndroid Build Coastguard Worker break;
3367*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DFloatFloat:
3368*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_A_2D_F32_F32;
3369*9880d681SAndroid Build Coastguard Worker break;
3370*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DS64Float:
3371*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_R_2D_S32_F32;
3372*9880d681SAndroid Build Coastguard Worker break;
3373*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DS64Float:
3374*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_G_2D_S32_F32;
3375*9880d681SAndroid Build Coastguard Worker break;
3376*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DS64Float:
3377*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_B_2D_S32_F32;
3378*9880d681SAndroid Build Coastguard Worker break;
3379*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DS64Float:
3380*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_A_2D_S32_F32;
3381*9880d681SAndroid Build Coastguard Worker break;
3382*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DU64Float:
3383*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_R_2D_U32_F32;
3384*9880d681SAndroid Build Coastguard Worker break;
3385*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DU64Float:
3386*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_G_2D_U32_F32;
3387*9880d681SAndroid Build Coastguard Worker break;
3388*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DU64Float:
3389*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_B_2D_U32_F32;
3390*9880d681SAndroid Build Coastguard Worker break;
3391*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DU64Float:
3392*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_A_2D_U32_F32;
3393*9880d681SAndroid Build Coastguard Worker break;
3394*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatS32:
3395*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_F32_S32;
3396*9880d681SAndroid Build Coastguard Worker break;
3397*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloat:
3398*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_F32_F32;
3399*9880d681SAndroid Build Coastguard Worker break;
3400*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatLevel:
3401*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_LEVEL;
3402*9880d681SAndroid Build Coastguard Worker break;
3403*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatGrad:
3404*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_GRAD;
3405*9880d681SAndroid Build Coastguard Worker break;
3406*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32S32:
3407*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_S32_S32;
3408*9880d681SAndroid Build Coastguard Worker break;
3409*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32Float:
3410*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_S32_F32;
3411*9880d681SAndroid Build Coastguard Worker break;
3412*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatLevel:
3413*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_LEVEL;
3414*9880d681SAndroid Build Coastguard Worker break;
3415*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatGrad:
3416*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_GRAD;
3417*9880d681SAndroid Build Coastguard Worker break;
3418*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32S32:
3419*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_U32_S32;
3420*9880d681SAndroid Build Coastguard Worker break;
3421*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32Float:
3422*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_U32_F32;
3423*9880d681SAndroid Build Coastguard Worker break;
3424*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatLevel:
3425*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_LEVEL;
3426*9880d681SAndroid Build Coastguard Worker break;
3427*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatGrad:
3428*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_GRAD;
3429*9880d681SAndroid Build Coastguard Worker break;
3430*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatS32:
3431*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_S32;
3432*9880d681SAndroid Build Coastguard Worker break;
3433*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloat:
3434*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32;
3435*9880d681SAndroid Build Coastguard Worker break;
3436*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
3437*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_LEVEL;
3438*9880d681SAndroid Build Coastguard Worker break;
3439*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
3440*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_GRAD;
3441*9880d681SAndroid Build Coastguard Worker break;
3442*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32S32:
3443*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_S32;
3444*9880d681SAndroid Build Coastguard Worker break;
3445*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32Float:
3446*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32;
3447*9880d681SAndroid Build Coastguard Worker break;
3448*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatLevel:
3449*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_LEVEL;
3450*9880d681SAndroid Build Coastguard Worker break;
3451*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatGrad:
3452*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_GRAD;
3453*9880d681SAndroid Build Coastguard Worker break;
3454*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32S32:
3455*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_S32;
3456*9880d681SAndroid Build Coastguard Worker break;
3457*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32Float:
3458*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32;
3459*9880d681SAndroid Build Coastguard Worker break;
3460*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatLevel:
3461*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_LEVEL;
3462*9880d681SAndroid Build Coastguard Worker break;
3463*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatGrad:
3464*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_GRAD;
3465*9880d681SAndroid Build Coastguard Worker break;
3466*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatS32:
3467*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_F32_S32;
3468*9880d681SAndroid Build Coastguard Worker break;
3469*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloat:
3470*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_F32_F32;
3471*9880d681SAndroid Build Coastguard Worker break;
3472*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatLevel:
3473*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_LEVEL;
3474*9880d681SAndroid Build Coastguard Worker break;
3475*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatGrad:
3476*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_GRAD;
3477*9880d681SAndroid Build Coastguard Worker break;
3478*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32S32:
3479*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_S32_S32;
3480*9880d681SAndroid Build Coastguard Worker break;
3481*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32Float:
3482*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_S32_F32;
3483*9880d681SAndroid Build Coastguard Worker break;
3484*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatLevel:
3485*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_LEVEL;
3486*9880d681SAndroid Build Coastguard Worker break;
3487*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatGrad:
3488*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_GRAD;
3489*9880d681SAndroid Build Coastguard Worker break;
3490*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32S32:
3491*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_U32_S32;
3492*9880d681SAndroid Build Coastguard Worker break;
3493*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32Float:
3494*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_U32_F32;
3495*9880d681SAndroid Build Coastguard Worker break;
3496*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatLevel:
3497*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_LEVEL;
3498*9880d681SAndroid Build Coastguard Worker break;
3499*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatGrad:
3500*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_GRAD;
3501*9880d681SAndroid Build Coastguard Worker break;
3502*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatS32:
3503*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_S32;
3504*9880d681SAndroid Build Coastguard Worker break;
3505*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloat:
3506*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32;
3507*9880d681SAndroid Build Coastguard Worker break;
3508*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
3509*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_LEVEL;
3510*9880d681SAndroid Build Coastguard Worker break;
3511*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
3512*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_GRAD;
3513*9880d681SAndroid Build Coastguard Worker break;
3514*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32S32:
3515*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_S32;
3516*9880d681SAndroid Build Coastguard Worker break;
3517*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32Float:
3518*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32;
3519*9880d681SAndroid Build Coastguard Worker break;
3520*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatLevel:
3521*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_LEVEL;
3522*9880d681SAndroid Build Coastguard Worker break;
3523*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatGrad:
3524*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_GRAD;
3525*9880d681SAndroid Build Coastguard Worker break;
3526*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32S32:
3527*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_S32;
3528*9880d681SAndroid Build Coastguard Worker break;
3529*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32Float:
3530*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32;
3531*9880d681SAndroid Build Coastguard Worker break;
3532*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatLevel:
3533*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_LEVEL;
3534*9880d681SAndroid Build Coastguard Worker break;
3535*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatGrad:
3536*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_GRAD;
3537*9880d681SAndroid Build Coastguard Worker break;
3538*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatS32:
3539*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_F32_S32;
3540*9880d681SAndroid Build Coastguard Worker break;
3541*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloat:
3542*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_F32_F32;
3543*9880d681SAndroid Build Coastguard Worker break;
3544*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatLevel:
3545*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_LEVEL;
3546*9880d681SAndroid Build Coastguard Worker break;
3547*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatGrad:
3548*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_GRAD;
3549*9880d681SAndroid Build Coastguard Worker break;
3550*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32S32:
3551*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_S32_S32;
3552*9880d681SAndroid Build Coastguard Worker break;
3553*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32Float:
3554*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_S32_F32;
3555*9880d681SAndroid Build Coastguard Worker break;
3556*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatLevel:
3557*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_LEVEL;
3558*9880d681SAndroid Build Coastguard Worker break;
3559*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatGrad:
3560*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_GRAD;
3561*9880d681SAndroid Build Coastguard Worker break;
3562*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32S32:
3563*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_U32_S32;
3564*9880d681SAndroid Build Coastguard Worker break;
3565*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32Float:
3566*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_U32_F32;
3567*9880d681SAndroid Build Coastguard Worker break;
3568*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatLevel:
3569*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_LEVEL;
3570*9880d681SAndroid Build Coastguard Worker break;
3571*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatGrad:
3572*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_GRAD;
3573*9880d681SAndroid Build Coastguard Worker break;
3574*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloat:
3575*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32;
3576*9880d681SAndroid Build Coastguard Worker break;
3577*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
3578*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32_LEVEL;
3579*9880d681SAndroid Build Coastguard Worker break;
3580*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32Float:
3581*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32;
3582*9880d681SAndroid Build Coastguard Worker break;
3583*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32FloatLevel:
3584*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32_LEVEL;
3585*9880d681SAndroid Build Coastguard Worker break;
3586*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32Float:
3587*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32;
3588*9880d681SAndroid Build Coastguard Worker break;
3589*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32FloatLevel:
3590*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32_LEVEL;
3591*9880d681SAndroid Build Coastguard Worker break;
3592*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
3593*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32;
3594*9880d681SAndroid Build Coastguard Worker break;
3595*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
3596*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32_LEVEL;
3597*9880d681SAndroid Build Coastguard Worker break;
3598*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32Float:
3599*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32;
3600*9880d681SAndroid Build Coastguard Worker break;
3601*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
3602*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32_LEVEL;
3603*9880d681SAndroid Build Coastguard Worker break;
3604*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32Float:
3605*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32;
3606*9880d681SAndroid Build Coastguard Worker break;
3607*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
3608*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32_LEVEL;
3609*9880d681SAndroid Build Coastguard Worker break;
3610*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DFloatFloat:
3611*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_R_2D_F32_F32;
3612*9880d681SAndroid Build Coastguard Worker break;
3613*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DFloatFloat:
3614*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_G_2D_F32_F32;
3615*9880d681SAndroid Build Coastguard Worker break;
3616*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DFloatFloat:
3617*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_B_2D_F32_F32;
3618*9880d681SAndroid Build Coastguard Worker break;
3619*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DFloatFloat:
3620*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_A_2D_F32_F32;
3621*9880d681SAndroid Build Coastguard Worker break;
3622*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DS64Float:
3623*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_R_2D_S32_F32;
3624*9880d681SAndroid Build Coastguard Worker break;
3625*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DS64Float:
3626*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_G_2D_S32_F32;
3627*9880d681SAndroid Build Coastguard Worker break;
3628*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DS64Float:
3629*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_B_2D_S32_F32;
3630*9880d681SAndroid Build Coastguard Worker break;
3631*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DS64Float:
3632*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_A_2D_S32_F32;
3633*9880d681SAndroid Build Coastguard Worker break;
3634*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DU64Float:
3635*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_R_2D_U32_F32;
3636*9880d681SAndroid Build Coastguard Worker break;
3637*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DU64Float:
3638*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_G_2D_U32_F32;
3639*9880d681SAndroid Build Coastguard Worker break;
3640*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DU64Float:
3641*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_B_2D_U32_F32;
3642*9880d681SAndroid Build Coastguard Worker break;
3643*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DU64Float:
3644*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::TLD4_UNIFIED_A_2D_U32_F32;
3645*9880d681SAndroid Build Coastguard Worker break;
3646*9880d681SAndroid Build Coastguard Worker }
3647*9880d681SAndroid Build Coastguard Worker
3648*9880d681SAndroid Build Coastguard Worker // Copy over operands
3649*9880d681SAndroid Build Coastguard Worker for (unsigned i = 1; i < N->getNumOperands(); ++i) {
3650*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(i));
3651*9880d681SAndroid Build Coastguard Worker }
3652*9880d681SAndroid Build Coastguard Worker
3653*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3654*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
3655*9880d681SAndroid Build Coastguard Worker return true;
3656*9880d681SAndroid Build Coastguard Worker }
3657*9880d681SAndroid Build Coastguard Worker
trySurfaceIntrinsic(SDNode * N)3658*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::trySurfaceIntrinsic(SDNode *N) {
3659*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
3660*9880d681SAndroid Build Coastguard Worker SDValue TexHandle = N->getOperand(1);
3661*9880d681SAndroid Build Coastguard Worker unsigned Opc = 0;
3662*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
3663*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
3664*9880d681SAndroid Build Coastguard Worker default: return false;
3665*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Clamp:
3666*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I8_CLAMP;
3667*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3668*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3669*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3670*9880d681SAndroid Build Coastguard Worker break;
3671*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Clamp:
3672*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I16_CLAMP;
3673*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3674*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3675*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3676*9880d681SAndroid Build Coastguard Worker break;
3677*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Clamp:
3678*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I32_CLAMP;
3679*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3680*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3681*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3682*9880d681SAndroid Build Coastguard Worker break;
3683*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Clamp:
3684*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I64_CLAMP;
3685*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3686*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3687*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3688*9880d681SAndroid Build Coastguard Worker break;
3689*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Clamp:
3690*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I8_CLAMP;
3691*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3692*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3693*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3694*9880d681SAndroid Build Coastguard Worker break;
3695*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Clamp:
3696*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I16_CLAMP;
3697*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3698*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3699*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3700*9880d681SAndroid Build Coastguard Worker break;
3701*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Clamp:
3702*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I32_CLAMP;
3703*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3704*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3705*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3706*9880d681SAndroid Build Coastguard Worker break;
3707*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Clamp:
3708*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I64_CLAMP;
3709*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3710*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3711*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3712*9880d681SAndroid Build Coastguard Worker break;
3713*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Clamp:
3714*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I8_CLAMP;
3715*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3716*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3717*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3718*9880d681SAndroid Build Coastguard Worker break;
3719*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Clamp:
3720*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I16_CLAMP;
3721*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3722*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3723*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3724*9880d681SAndroid Build Coastguard Worker break;
3725*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Clamp:
3726*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I32_CLAMP;
3727*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3728*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3729*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3730*9880d681SAndroid Build Coastguard Worker break;
3731*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Clamp:
3732*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I8_CLAMP;
3733*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3734*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3735*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3736*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3737*9880d681SAndroid Build Coastguard Worker break;
3738*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Clamp:
3739*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I16_CLAMP;
3740*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3741*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3742*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3743*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3744*9880d681SAndroid Build Coastguard Worker break;
3745*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Clamp:
3746*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I32_CLAMP;
3747*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3748*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3749*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3750*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3751*9880d681SAndroid Build Coastguard Worker break;
3752*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Clamp:
3753*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I64_CLAMP;
3754*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3755*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3756*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3757*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3758*9880d681SAndroid Build Coastguard Worker break;
3759*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Clamp:
3760*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I8_CLAMP;
3761*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3762*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3763*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3764*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3765*9880d681SAndroid Build Coastguard Worker break;
3766*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Clamp:
3767*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I16_CLAMP;
3768*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3769*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3770*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3771*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3772*9880d681SAndroid Build Coastguard Worker break;
3773*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Clamp:
3774*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I32_CLAMP;
3775*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3776*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3777*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3778*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3779*9880d681SAndroid Build Coastguard Worker break;
3780*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Clamp:
3781*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I64_CLAMP;
3782*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3783*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3784*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3785*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3786*9880d681SAndroid Build Coastguard Worker break;
3787*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Clamp:
3788*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I8_CLAMP;
3789*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3790*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3791*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3792*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3793*9880d681SAndroid Build Coastguard Worker break;
3794*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Clamp:
3795*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I16_CLAMP;
3796*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3797*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3798*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3799*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3800*9880d681SAndroid Build Coastguard Worker break;
3801*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Clamp:
3802*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I32_CLAMP;
3803*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3804*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3805*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3806*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3807*9880d681SAndroid Build Coastguard Worker break;
3808*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Clamp:
3809*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I8_CLAMP;
3810*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3811*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3812*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3813*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3814*9880d681SAndroid Build Coastguard Worker break;
3815*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Clamp:
3816*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I16_CLAMP;
3817*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3818*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3819*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3820*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3821*9880d681SAndroid Build Coastguard Worker break;
3822*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Clamp:
3823*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I32_CLAMP;
3824*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3825*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3826*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3827*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3828*9880d681SAndroid Build Coastguard Worker break;
3829*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Clamp:
3830*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I64_CLAMP;
3831*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3832*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3833*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3834*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3835*9880d681SAndroid Build Coastguard Worker break;
3836*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Clamp:
3837*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I8_CLAMP;
3838*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3839*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3840*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3841*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3842*9880d681SAndroid Build Coastguard Worker break;
3843*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Clamp:
3844*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I16_CLAMP;
3845*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3846*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3847*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3848*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3849*9880d681SAndroid Build Coastguard Worker break;
3850*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Clamp:
3851*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I32_CLAMP;
3852*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3853*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3854*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3855*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3856*9880d681SAndroid Build Coastguard Worker break;
3857*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Clamp:
3858*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I64_CLAMP;
3859*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3860*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3861*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3862*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3863*9880d681SAndroid Build Coastguard Worker break;
3864*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Clamp:
3865*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I8_CLAMP;
3866*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3867*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3868*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3869*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3870*9880d681SAndroid Build Coastguard Worker break;
3871*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Clamp:
3872*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I16_CLAMP;
3873*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3874*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3875*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3876*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3877*9880d681SAndroid Build Coastguard Worker break;
3878*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Clamp:
3879*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I32_CLAMP;
3880*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3881*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3882*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3883*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3884*9880d681SAndroid Build Coastguard Worker break;
3885*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Clamp:
3886*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I8_CLAMP;
3887*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3888*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3889*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3890*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3891*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3892*9880d681SAndroid Build Coastguard Worker break;
3893*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Clamp:
3894*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I16_CLAMP;
3895*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3896*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3897*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3898*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3899*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3900*9880d681SAndroid Build Coastguard Worker break;
3901*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Clamp:
3902*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I32_CLAMP;
3903*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3904*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3905*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3906*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3907*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3908*9880d681SAndroid Build Coastguard Worker break;
3909*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Clamp:
3910*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I64_CLAMP;
3911*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3912*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3913*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3914*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3915*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3916*9880d681SAndroid Build Coastguard Worker break;
3917*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Clamp:
3918*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I8_CLAMP;
3919*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3920*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3921*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3922*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3923*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3924*9880d681SAndroid Build Coastguard Worker break;
3925*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Clamp:
3926*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I16_CLAMP;
3927*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3928*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3929*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3930*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3931*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3932*9880d681SAndroid Build Coastguard Worker break;
3933*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Clamp:
3934*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I32_CLAMP;
3935*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3936*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3937*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3938*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3939*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3940*9880d681SAndroid Build Coastguard Worker break;
3941*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Clamp:
3942*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I64_CLAMP;
3943*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3944*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3945*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3946*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3947*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3948*9880d681SAndroid Build Coastguard Worker break;
3949*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Clamp:
3950*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I8_CLAMP;
3951*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3952*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3953*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3954*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3955*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3956*9880d681SAndroid Build Coastguard Worker break;
3957*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Clamp:
3958*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I16_CLAMP;
3959*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3960*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3961*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3962*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3963*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3964*9880d681SAndroid Build Coastguard Worker break;
3965*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Clamp:
3966*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I32_CLAMP;
3967*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3968*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3969*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3970*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3971*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3972*9880d681SAndroid Build Coastguard Worker break;
3973*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Clamp:
3974*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I8_CLAMP;
3975*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3976*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3977*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3978*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3979*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3980*9880d681SAndroid Build Coastguard Worker break;
3981*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Clamp:
3982*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I16_CLAMP;
3983*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3984*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3985*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3986*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3987*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3988*9880d681SAndroid Build Coastguard Worker break;
3989*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Clamp:
3990*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I32_CLAMP;
3991*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
3992*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
3993*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
3994*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
3995*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
3996*9880d681SAndroid Build Coastguard Worker break;
3997*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Clamp:
3998*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I64_CLAMP;
3999*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4000*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4001*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4002*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4003*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4004*9880d681SAndroid Build Coastguard Worker break;
4005*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Clamp:
4006*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I8_CLAMP;
4007*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4008*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4009*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4010*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4011*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4012*9880d681SAndroid Build Coastguard Worker break;
4013*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Clamp:
4014*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I16_CLAMP;
4015*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4016*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4017*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4018*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4019*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4020*9880d681SAndroid Build Coastguard Worker break;
4021*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Clamp:
4022*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I32_CLAMP;
4023*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4024*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4025*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4026*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4027*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4028*9880d681SAndroid Build Coastguard Worker break;
4029*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Clamp:
4030*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I64_CLAMP;
4031*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4032*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4033*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4034*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4035*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4036*9880d681SAndroid Build Coastguard Worker break;
4037*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Clamp:
4038*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I8_CLAMP;
4039*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4040*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4041*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4042*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4043*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4044*9880d681SAndroid Build Coastguard Worker break;
4045*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Clamp:
4046*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I16_CLAMP;
4047*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4048*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4049*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4050*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4051*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4052*9880d681SAndroid Build Coastguard Worker break;
4053*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Clamp:
4054*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I32_CLAMP;
4055*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4056*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4057*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4058*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4059*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4060*9880d681SAndroid Build Coastguard Worker break;
4061*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Trap:
4062*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I8_TRAP;
4063*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4064*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4065*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4066*9880d681SAndroid Build Coastguard Worker break;
4067*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Trap:
4068*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I16_TRAP;
4069*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4070*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4071*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4072*9880d681SAndroid Build Coastguard Worker break;
4073*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Trap:
4074*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I32_TRAP;
4075*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4076*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4077*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4078*9880d681SAndroid Build Coastguard Worker break;
4079*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Trap:
4080*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I64_TRAP;
4081*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4082*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4083*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4084*9880d681SAndroid Build Coastguard Worker break;
4085*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Trap:
4086*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I8_TRAP;
4087*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4088*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4089*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4090*9880d681SAndroid Build Coastguard Worker break;
4091*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Trap:
4092*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I16_TRAP;
4093*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4094*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4095*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4096*9880d681SAndroid Build Coastguard Worker break;
4097*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Trap:
4098*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I32_TRAP;
4099*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4100*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4101*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4102*9880d681SAndroid Build Coastguard Worker break;
4103*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Trap:
4104*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I64_TRAP;
4105*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4106*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4107*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4108*9880d681SAndroid Build Coastguard Worker break;
4109*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Trap:
4110*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I8_TRAP;
4111*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4112*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4113*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4114*9880d681SAndroid Build Coastguard Worker break;
4115*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Trap:
4116*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I16_TRAP;
4117*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4118*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4119*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4120*9880d681SAndroid Build Coastguard Worker break;
4121*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Trap:
4122*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I32_TRAP;
4123*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4124*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4125*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4126*9880d681SAndroid Build Coastguard Worker break;
4127*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Trap:
4128*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I8_TRAP;
4129*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4130*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4131*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4132*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4133*9880d681SAndroid Build Coastguard Worker break;
4134*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Trap:
4135*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I16_TRAP;
4136*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4137*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4138*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4139*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4140*9880d681SAndroid Build Coastguard Worker break;
4141*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Trap:
4142*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I32_TRAP;
4143*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4144*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4145*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4146*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4147*9880d681SAndroid Build Coastguard Worker break;
4148*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Trap:
4149*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I64_TRAP;
4150*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4151*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4152*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4153*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4154*9880d681SAndroid Build Coastguard Worker break;
4155*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Trap:
4156*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I8_TRAP;
4157*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4158*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4159*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4160*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4161*9880d681SAndroid Build Coastguard Worker break;
4162*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Trap:
4163*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I16_TRAP;
4164*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4165*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4166*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4167*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4168*9880d681SAndroid Build Coastguard Worker break;
4169*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Trap:
4170*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I32_TRAP;
4171*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4172*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4173*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4174*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4175*9880d681SAndroid Build Coastguard Worker break;
4176*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Trap:
4177*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I64_TRAP;
4178*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4179*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4180*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4181*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4182*9880d681SAndroid Build Coastguard Worker break;
4183*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Trap:
4184*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I8_TRAP;
4185*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4186*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4187*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4188*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4189*9880d681SAndroid Build Coastguard Worker break;
4190*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Trap:
4191*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I16_TRAP;
4192*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4193*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4194*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4195*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4196*9880d681SAndroid Build Coastguard Worker break;
4197*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Trap:
4198*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I32_TRAP;
4199*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4200*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4201*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4202*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4203*9880d681SAndroid Build Coastguard Worker break;
4204*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Trap:
4205*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I8_TRAP;
4206*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4207*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4208*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4209*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4210*9880d681SAndroid Build Coastguard Worker break;
4211*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Trap:
4212*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I16_TRAP;
4213*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4214*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4215*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4216*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4217*9880d681SAndroid Build Coastguard Worker break;
4218*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Trap:
4219*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I32_TRAP;
4220*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4221*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4222*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4223*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4224*9880d681SAndroid Build Coastguard Worker break;
4225*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Trap:
4226*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I64_TRAP;
4227*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4228*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4229*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4230*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4231*9880d681SAndroid Build Coastguard Worker break;
4232*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Trap:
4233*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I8_TRAP;
4234*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4235*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4236*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4237*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4238*9880d681SAndroid Build Coastguard Worker break;
4239*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Trap:
4240*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I16_TRAP;
4241*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4242*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4243*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4244*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4245*9880d681SAndroid Build Coastguard Worker break;
4246*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Trap:
4247*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I32_TRAP;
4248*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4249*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4250*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4251*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4252*9880d681SAndroid Build Coastguard Worker break;
4253*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Trap:
4254*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I64_TRAP;
4255*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4256*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4257*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4258*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4259*9880d681SAndroid Build Coastguard Worker break;
4260*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Trap:
4261*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I8_TRAP;
4262*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4263*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4264*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4265*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4266*9880d681SAndroid Build Coastguard Worker break;
4267*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Trap:
4268*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I16_TRAP;
4269*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4270*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4271*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4272*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4273*9880d681SAndroid Build Coastguard Worker break;
4274*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Trap:
4275*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I32_TRAP;
4276*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4277*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4278*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4279*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4280*9880d681SAndroid Build Coastguard Worker break;
4281*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Trap:
4282*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I8_TRAP;
4283*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4284*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4285*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4286*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4287*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4288*9880d681SAndroid Build Coastguard Worker break;
4289*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Trap:
4290*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I16_TRAP;
4291*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4292*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4293*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4294*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4295*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4296*9880d681SAndroid Build Coastguard Worker break;
4297*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Trap:
4298*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I32_TRAP;
4299*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4300*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4301*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4302*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4303*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4304*9880d681SAndroid Build Coastguard Worker break;
4305*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Trap:
4306*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I64_TRAP;
4307*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4308*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4309*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4310*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4311*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4312*9880d681SAndroid Build Coastguard Worker break;
4313*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Trap:
4314*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I8_TRAP;
4315*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4316*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4317*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4318*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4319*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4320*9880d681SAndroid Build Coastguard Worker break;
4321*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Trap:
4322*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I16_TRAP;
4323*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4324*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4325*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4326*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4327*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4328*9880d681SAndroid Build Coastguard Worker break;
4329*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Trap:
4330*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I32_TRAP;
4331*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4332*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4333*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4334*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4335*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4336*9880d681SAndroid Build Coastguard Worker break;
4337*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Trap:
4338*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I64_TRAP;
4339*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4340*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4341*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4342*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4343*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4344*9880d681SAndroid Build Coastguard Worker break;
4345*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Trap:
4346*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I8_TRAP;
4347*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4348*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4349*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4350*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4351*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4352*9880d681SAndroid Build Coastguard Worker break;
4353*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Trap:
4354*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I16_TRAP;
4355*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4356*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4357*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4358*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4359*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4360*9880d681SAndroid Build Coastguard Worker break;
4361*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Trap:
4362*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I32_TRAP;
4363*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4364*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4365*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4366*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4367*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4368*9880d681SAndroid Build Coastguard Worker break;
4369*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Trap:
4370*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I8_TRAP;
4371*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4372*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4373*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4374*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4375*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4376*9880d681SAndroid Build Coastguard Worker break;
4377*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Trap:
4378*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I16_TRAP;
4379*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4380*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4381*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4382*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4383*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4384*9880d681SAndroid Build Coastguard Worker break;
4385*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Trap:
4386*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I32_TRAP;
4387*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4388*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4389*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4390*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4391*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4392*9880d681SAndroid Build Coastguard Worker break;
4393*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Trap:
4394*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I64_TRAP;
4395*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4396*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4397*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4398*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4399*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4400*9880d681SAndroid Build Coastguard Worker break;
4401*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Trap:
4402*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I8_TRAP;
4403*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4404*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4405*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4406*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4407*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4408*9880d681SAndroid Build Coastguard Worker break;
4409*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Trap:
4410*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I16_TRAP;
4411*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4412*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4413*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4414*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4415*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4416*9880d681SAndroid Build Coastguard Worker break;
4417*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Trap:
4418*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I32_TRAP;
4419*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4420*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4421*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4422*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4423*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4424*9880d681SAndroid Build Coastguard Worker break;
4425*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Trap:
4426*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I64_TRAP;
4427*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4428*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4429*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4430*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4431*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4432*9880d681SAndroid Build Coastguard Worker break;
4433*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Trap:
4434*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I8_TRAP;
4435*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4436*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4437*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4438*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4439*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4440*9880d681SAndroid Build Coastguard Worker break;
4441*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Trap:
4442*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I16_TRAP;
4443*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4444*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4445*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4446*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4447*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4448*9880d681SAndroid Build Coastguard Worker break;
4449*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Trap:
4450*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I32_TRAP;
4451*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4452*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4453*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4454*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4455*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4456*9880d681SAndroid Build Coastguard Worker break;
4457*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Zero:
4458*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I8_ZERO;
4459*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4460*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4461*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4462*9880d681SAndroid Build Coastguard Worker break;
4463*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Zero:
4464*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I16_ZERO;
4465*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4466*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4467*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4468*9880d681SAndroid Build Coastguard Worker break;
4469*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Zero:
4470*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I32_ZERO;
4471*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4472*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4473*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4474*9880d681SAndroid Build Coastguard Worker break;
4475*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Zero:
4476*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_I64_ZERO;
4477*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4478*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4479*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4480*9880d681SAndroid Build Coastguard Worker break;
4481*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Zero:
4482*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I8_ZERO;
4483*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4484*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4485*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4486*9880d681SAndroid Build Coastguard Worker break;
4487*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Zero:
4488*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I16_ZERO;
4489*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4490*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4491*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4492*9880d681SAndroid Build Coastguard Worker break;
4493*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Zero:
4494*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I32_ZERO;
4495*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4496*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4497*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4498*9880d681SAndroid Build Coastguard Worker break;
4499*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Zero:
4500*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V2I64_ZERO;
4501*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4502*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4503*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4504*9880d681SAndroid Build Coastguard Worker break;
4505*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Zero:
4506*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I8_ZERO;
4507*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4508*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4509*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4510*9880d681SAndroid Build Coastguard Worker break;
4511*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Zero:
4512*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I16_ZERO;
4513*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4514*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4515*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4516*9880d681SAndroid Build Coastguard Worker break;
4517*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Zero:
4518*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_V4I32_ZERO;
4519*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4520*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4521*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4522*9880d681SAndroid Build Coastguard Worker break;
4523*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Zero:
4524*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I8_ZERO;
4525*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4526*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4527*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4528*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4529*9880d681SAndroid Build Coastguard Worker break;
4530*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Zero:
4531*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I16_ZERO;
4532*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4533*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4534*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4535*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4536*9880d681SAndroid Build Coastguard Worker break;
4537*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Zero:
4538*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I32_ZERO;
4539*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4540*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4541*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4542*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4543*9880d681SAndroid Build Coastguard Worker break;
4544*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Zero:
4545*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_I64_ZERO;
4546*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4547*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4548*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4549*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4550*9880d681SAndroid Build Coastguard Worker break;
4551*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Zero:
4552*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I8_ZERO;
4553*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4554*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4555*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4556*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4557*9880d681SAndroid Build Coastguard Worker break;
4558*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Zero:
4559*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I16_ZERO;
4560*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4561*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4562*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4563*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4564*9880d681SAndroid Build Coastguard Worker break;
4565*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Zero:
4566*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I32_ZERO;
4567*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4568*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4569*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4570*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4571*9880d681SAndroid Build Coastguard Worker break;
4572*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Zero:
4573*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V2I64_ZERO;
4574*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4575*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4576*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4577*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4578*9880d681SAndroid Build Coastguard Worker break;
4579*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Zero:
4580*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I8_ZERO;
4581*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4582*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4583*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4584*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4585*9880d681SAndroid Build Coastguard Worker break;
4586*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Zero:
4587*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I16_ZERO;
4588*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4589*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4590*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4591*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4592*9880d681SAndroid Build Coastguard Worker break;
4593*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Zero:
4594*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_1D_ARRAY_V4I32_ZERO;
4595*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4596*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4597*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4598*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4599*9880d681SAndroid Build Coastguard Worker break;
4600*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Zero:
4601*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I8_ZERO;
4602*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4603*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4604*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4605*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4606*9880d681SAndroid Build Coastguard Worker break;
4607*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Zero:
4608*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I16_ZERO;
4609*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4610*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4611*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4612*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4613*9880d681SAndroid Build Coastguard Worker break;
4614*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Zero:
4615*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I32_ZERO;
4616*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4617*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4618*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4619*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4620*9880d681SAndroid Build Coastguard Worker break;
4621*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Zero:
4622*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_I64_ZERO;
4623*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4624*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4625*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4626*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4627*9880d681SAndroid Build Coastguard Worker break;
4628*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Zero:
4629*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I8_ZERO;
4630*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4631*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4632*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4633*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4634*9880d681SAndroid Build Coastguard Worker break;
4635*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Zero:
4636*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I16_ZERO;
4637*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4638*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4639*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4640*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4641*9880d681SAndroid Build Coastguard Worker break;
4642*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Zero:
4643*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I32_ZERO;
4644*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4645*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4646*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4647*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4648*9880d681SAndroid Build Coastguard Worker break;
4649*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Zero:
4650*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V2I64_ZERO;
4651*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4652*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4653*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4654*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4655*9880d681SAndroid Build Coastguard Worker break;
4656*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Zero:
4657*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I8_ZERO;
4658*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4659*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4660*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4661*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4662*9880d681SAndroid Build Coastguard Worker break;
4663*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Zero:
4664*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I16_ZERO;
4665*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4666*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4667*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4668*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4669*9880d681SAndroid Build Coastguard Worker break;
4670*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Zero:
4671*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_V4I32_ZERO;
4672*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4673*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4674*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4675*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4676*9880d681SAndroid Build Coastguard Worker break;
4677*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Zero:
4678*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I8_ZERO;
4679*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4680*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4681*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4682*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4683*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4684*9880d681SAndroid Build Coastguard Worker break;
4685*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Zero:
4686*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I16_ZERO;
4687*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4688*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4689*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4690*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4691*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4692*9880d681SAndroid Build Coastguard Worker break;
4693*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Zero:
4694*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I32_ZERO;
4695*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4696*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4697*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4698*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4699*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4700*9880d681SAndroid Build Coastguard Worker break;
4701*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Zero:
4702*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_I64_ZERO;
4703*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4704*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4705*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4706*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4707*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4708*9880d681SAndroid Build Coastguard Worker break;
4709*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Zero:
4710*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I8_ZERO;
4711*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4712*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4713*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4714*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4715*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4716*9880d681SAndroid Build Coastguard Worker break;
4717*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Zero:
4718*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I16_ZERO;
4719*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4720*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4721*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4722*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4723*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4724*9880d681SAndroid Build Coastguard Worker break;
4725*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Zero:
4726*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I32_ZERO;
4727*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4728*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4729*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4730*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4731*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4732*9880d681SAndroid Build Coastguard Worker break;
4733*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Zero:
4734*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V2I64_ZERO;
4735*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4736*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4737*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4738*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4739*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4740*9880d681SAndroid Build Coastguard Worker break;
4741*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Zero:
4742*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I8_ZERO;
4743*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4744*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4745*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4746*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4747*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4748*9880d681SAndroid Build Coastguard Worker break;
4749*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Zero:
4750*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I16_ZERO;
4751*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4752*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4753*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4754*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4755*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4756*9880d681SAndroid Build Coastguard Worker break;
4757*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Zero:
4758*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_2D_ARRAY_V4I32_ZERO;
4759*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4760*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4761*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4762*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4763*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4764*9880d681SAndroid Build Coastguard Worker break;
4765*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Zero:
4766*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I8_ZERO;
4767*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4768*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4769*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4770*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4771*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4772*9880d681SAndroid Build Coastguard Worker break;
4773*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Zero:
4774*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I16_ZERO;
4775*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4776*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4777*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4778*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4779*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4780*9880d681SAndroid Build Coastguard Worker break;
4781*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Zero:
4782*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I32_ZERO;
4783*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4784*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4785*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4786*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4787*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4788*9880d681SAndroid Build Coastguard Worker break;
4789*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Zero:
4790*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_I64_ZERO;
4791*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4792*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4793*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4794*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4795*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4796*9880d681SAndroid Build Coastguard Worker break;
4797*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Zero:
4798*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I8_ZERO;
4799*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4800*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4801*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4802*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4803*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4804*9880d681SAndroid Build Coastguard Worker break;
4805*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Zero:
4806*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I16_ZERO;
4807*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4808*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4809*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4810*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4811*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4812*9880d681SAndroid Build Coastguard Worker break;
4813*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Zero:
4814*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I32_ZERO;
4815*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4816*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4817*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4818*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4819*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4820*9880d681SAndroid Build Coastguard Worker break;
4821*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Zero:
4822*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V2I64_ZERO;
4823*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4824*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4825*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4826*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4827*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4828*9880d681SAndroid Build Coastguard Worker break;
4829*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Zero:
4830*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I8_ZERO;
4831*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4832*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4833*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4834*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4835*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4836*9880d681SAndroid Build Coastguard Worker break;
4837*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Zero:
4838*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I16_ZERO;
4839*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4840*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4841*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4842*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4843*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4844*9880d681SAndroid Build Coastguard Worker break;
4845*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Zero:
4846*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::SULD_3D_V4I32_ZERO;
4847*9880d681SAndroid Build Coastguard Worker Ops.push_back(TexHandle);
4848*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(2));
4849*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(3));
4850*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(4));
4851*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
4852*9880d681SAndroid Build Coastguard Worker break;
4853*9880d681SAndroid Build Coastguard Worker }
4854*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
4855*9880d681SAndroid Build Coastguard Worker return true;
4856*9880d681SAndroid Build Coastguard Worker }
4857*9880d681SAndroid Build Coastguard Worker
4858*9880d681SAndroid Build Coastguard Worker
4859*9880d681SAndroid Build Coastguard Worker /// SelectBFE - Look for instruction sequences that can be made more efficient
4860*9880d681SAndroid Build Coastguard Worker /// by using the 'bfe' (bit-field extract) PTX instruction
tryBFE(SDNode * N)4861*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::tryBFE(SDNode *N) {
4862*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
4863*9880d681SAndroid Build Coastguard Worker SDValue LHS = N->getOperand(0);
4864*9880d681SAndroid Build Coastguard Worker SDValue RHS = N->getOperand(1);
4865*9880d681SAndroid Build Coastguard Worker SDValue Len;
4866*9880d681SAndroid Build Coastguard Worker SDValue Start;
4867*9880d681SAndroid Build Coastguard Worker SDValue Val;
4868*9880d681SAndroid Build Coastguard Worker bool IsSigned = false;
4869*9880d681SAndroid Build Coastguard Worker
4870*9880d681SAndroid Build Coastguard Worker if (N->getOpcode() == ISD::AND) {
4871*9880d681SAndroid Build Coastguard Worker // Canonicalize the operands
4872*9880d681SAndroid Build Coastguard Worker // We want 'and %val, %mask'
4873*9880d681SAndroid Build Coastguard Worker if (isa<ConstantSDNode>(LHS) && !isa<ConstantSDNode>(RHS)) {
4874*9880d681SAndroid Build Coastguard Worker std::swap(LHS, RHS);
4875*9880d681SAndroid Build Coastguard Worker }
4876*9880d681SAndroid Build Coastguard Worker
4877*9880d681SAndroid Build Coastguard Worker ConstantSDNode *Mask = dyn_cast<ConstantSDNode>(RHS);
4878*9880d681SAndroid Build Coastguard Worker if (!Mask) {
4879*9880d681SAndroid Build Coastguard Worker // We need a constant mask on the RHS of the AND
4880*9880d681SAndroid Build Coastguard Worker return false;
4881*9880d681SAndroid Build Coastguard Worker }
4882*9880d681SAndroid Build Coastguard Worker
4883*9880d681SAndroid Build Coastguard Worker // Extract the mask bits
4884*9880d681SAndroid Build Coastguard Worker uint64_t MaskVal = Mask->getZExtValue();
4885*9880d681SAndroid Build Coastguard Worker if (!isMask_64(MaskVal)) {
4886*9880d681SAndroid Build Coastguard Worker // We *could* handle shifted masks here, but doing so would require an
4887*9880d681SAndroid Build Coastguard Worker // 'and' operation to fix up the low-order bits so we would trade
4888*9880d681SAndroid Build Coastguard Worker // shr+and for bfe+and, which has the same throughput
4889*9880d681SAndroid Build Coastguard Worker return false;
4890*9880d681SAndroid Build Coastguard Worker }
4891*9880d681SAndroid Build Coastguard Worker
4892*9880d681SAndroid Build Coastguard Worker // How many bits are in our mask?
4893*9880d681SAndroid Build Coastguard Worker uint64_t NumBits = countTrailingOnes(MaskVal);
4894*9880d681SAndroid Build Coastguard Worker Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
4895*9880d681SAndroid Build Coastguard Worker
4896*9880d681SAndroid Build Coastguard Worker if (LHS.getOpcode() == ISD::SRL || LHS.getOpcode() == ISD::SRA) {
4897*9880d681SAndroid Build Coastguard Worker // We have a 'srl/and' pair, extract the effective start bit and length
4898*9880d681SAndroid Build Coastguard Worker Val = LHS.getNode()->getOperand(0);
4899*9880d681SAndroid Build Coastguard Worker Start = LHS.getNode()->getOperand(1);
4900*9880d681SAndroid Build Coastguard Worker ConstantSDNode *StartConst = dyn_cast<ConstantSDNode>(Start);
4901*9880d681SAndroid Build Coastguard Worker if (StartConst) {
4902*9880d681SAndroid Build Coastguard Worker uint64_t StartVal = StartConst->getZExtValue();
4903*9880d681SAndroid Build Coastguard Worker // How many "good" bits do we have left? "good" is defined here as bits
4904*9880d681SAndroid Build Coastguard Worker // that exist in the original value, not shifted in.
4905*9880d681SAndroid Build Coastguard Worker uint64_t GoodBits = Start.getValueType().getSizeInBits() - StartVal;
4906*9880d681SAndroid Build Coastguard Worker if (NumBits > GoodBits) {
4907*9880d681SAndroid Build Coastguard Worker // Do not handle the case where bits have been shifted in. In theory
4908*9880d681SAndroid Build Coastguard Worker // we could handle this, but the cost is likely higher than just
4909*9880d681SAndroid Build Coastguard Worker // emitting the srl/and pair.
4910*9880d681SAndroid Build Coastguard Worker return false;
4911*9880d681SAndroid Build Coastguard Worker }
4912*9880d681SAndroid Build Coastguard Worker Start = CurDAG->getTargetConstant(StartVal, DL, MVT::i32);
4913*9880d681SAndroid Build Coastguard Worker } else {
4914*9880d681SAndroid Build Coastguard Worker // Do not handle the case where the shift amount (can be zero if no srl
4915*9880d681SAndroid Build Coastguard Worker // was found) is not constant. We could handle this case, but it would
4916*9880d681SAndroid Build Coastguard Worker // require run-time logic that would be more expensive than just
4917*9880d681SAndroid Build Coastguard Worker // emitting the srl/and pair.
4918*9880d681SAndroid Build Coastguard Worker return false;
4919*9880d681SAndroid Build Coastguard Worker }
4920*9880d681SAndroid Build Coastguard Worker } else {
4921*9880d681SAndroid Build Coastguard Worker // Do not handle the case where the LHS of the and is not a shift. While
4922*9880d681SAndroid Build Coastguard Worker // it would be trivial to handle this case, it would just transform
4923*9880d681SAndroid Build Coastguard Worker // 'and' -> 'bfe', but 'and' has higher-throughput.
4924*9880d681SAndroid Build Coastguard Worker return false;
4925*9880d681SAndroid Build Coastguard Worker }
4926*9880d681SAndroid Build Coastguard Worker } else if (N->getOpcode() == ISD::SRL || N->getOpcode() == ISD::SRA) {
4927*9880d681SAndroid Build Coastguard Worker if (LHS->getOpcode() == ISD::AND) {
4928*9880d681SAndroid Build Coastguard Worker ConstantSDNode *ShiftCnst = dyn_cast<ConstantSDNode>(RHS);
4929*9880d681SAndroid Build Coastguard Worker if (!ShiftCnst) {
4930*9880d681SAndroid Build Coastguard Worker // Shift amount must be constant
4931*9880d681SAndroid Build Coastguard Worker return false;
4932*9880d681SAndroid Build Coastguard Worker }
4933*9880d681SAndroid Build Coastguard Worker
4934*9880d681SAndroid Build Coastguard Worker uint64_t ShiftAmt = ShiftCnst->getZExtValue();
4935*9880d681SAndroid Build Coastguard Worker
4936*9880d681SAndroid Build Coastguard Worker SDValue AndLHS = LHS->getOperand(0);
4937*9880d681SAndroid Build Coastguard Worker SDValue AndRHS = LHS->getOperand(1);
4938*9880d681SAndroid Build Coastguard Worker
4939*9880d681SAndroid Build Coastguard Worker // Canonicalize the AND to have the mask on the RHS
4940*9880d681SAndroid Build Coastguard Worker if (isa<ConstantSDNode>(AndLHS)) {
4941*9880d681SAndroid Build Coastguard Worker std::swap(AndLHS, AndRHS);
4942*9880d681SAndroid Build Coastguard Worker }
4943*9880d681SAndroid Build Coastguard Worker
4944*9880d681SAndroid Build Coastguard Worker ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(AndRHS);
4945*9880d681SAndroid Build Coastguard Worker if (!MaskCnst) {
4946*9880d681SAndroid Build Coastguard Worker // Mask must be constant
4947*9880d681SAndroid Build Coastguard Worker return false;
4948*9880d681SAndroid Build Coastguard Worker }
4949*9880d681SAndroid Build Coastguard Worker
4950*9880d681SAndroid Build Coastguard Worker uint64_t MaskVal = MaskCnst->getZExtValue();
4951*9880d681SAndroid Build Coastguard Worker uint64_t NumZeros;
4952*9880d681SAndroid Build Coastguard Worker uint64_t NumBits;
4953*9880d681SAndroid Build Coastguard Worker if (isMask_64(MaskVal)) {
4954*9880d681SAndroid Build Coastguard Worker NumZeros = 0;
4955*9880d681SAndroid Build Coastguard Worker // The number of bits in the result bitfield will be the number of
4956*9880d681SAndroid Build Coastguard Worker // trailing ones (the AND) minus the number of bits we shift off
4957*9880d681SAndroid Build Coastguard Worker NumBits = countTrailingOnes(MaskVal) - ShiftAmt;
4958*9880d681SAndroid Build Coastguard Worker } else if (isShiftedMask_64(MaskVal)) {
4959*9880d681SAndroid Build Coastguard Worker NumZeros = countTrailingZeros(MaskVal);
4960*9880d681SAndroid Build Coastguard Worker unsigned NumOnes = countTrailingOnes(MaskVal >> NumZeros);
4961*9880d681SAndroid Build Coastguard Worker // The number of bits in the result bitfield will be the number of
4962*9880d681SAndroid Build Coastguard Worker // trailing zeros plus the number of set bits in the mask minus the
4963*9880d681SAndroid Build Coastguard Worker // number of bits we shift off
4964*9880d681SAndroid Build Coastguard Worker NumBits = NumZeros + NumOnes - ShiftAmt;
4965*9880d681SAndroid Build Coastguard Worker } else {
4966*9880d681SAndroid Build Coastguard Worker // This is not a mask we can handle
4967*9880d681SAndroid Build Coastguard Worker return false;
4968*9880d681SAndroid Build Coastguard Worker }
4969*9880d681SAndroid Build Coastguard Worker
4970*9880d681SAndroid Build Coastguard Worker if (ShiftAmt < NumZeros) {
4971*9880d681SAndroid Build Coastguard Worker // Handling this case would require extra logic that would make this
4972*9880d681SAndroid Build Coastguard Worker // transformation non-profitable
4973*9880d681SAndroid Build Coastguard Worker return false;
4974*9880d681SAndroid Build Coastguard Worker }
4975*9880d681SAndroid Build Coastguard Worker
4976*9880d681SAndroid Build Coastguard Worker Val = AndLHS;
4977*9880d681SAndroid Build Coastguard Worker Start = CurDAG->getTargetConstant(ShiftAmt, DL, MVT::i32);
4978*9880d681SAndroid Build Coastguard Worker Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
4979*9880d681SAndroid Build Coastguard Worker } else if (LHS->getOpcode() == ISD::SHL) {
4980*9880d681SAndroid Build Coastguard Worker // Here, we have a pattern like:
4981*9880d681SAndroid Build Coastguard Worker //
4982*9880d681SAndroid Build Coastguard Worker // (sra (shl val, NN), MM)
4983*9880d681SAndroid Build Coastguard Worker // or
4984*9880d681SAndroid Build Coastguard Worker // (srl (shl val, NN), MM)
4985*9880d681SAndroid Build Coastguard Worker //
4986*9880d681SAndroid Build Coastguard Worker // If MM >= NN, we can efficiently optimize this with bfe
4987*9880d681SAndroid Build Coastguard Worker Val = LHS->getOperand(0);
4988*9880d681SAndroid Build Coastguard Worker
4989*9880d681SAndroid Build Coastguard Worker SDValue ShlRHS = LHS->getOperand(1);
4990*9880d681SAndroid Build Coastguard Worker ConstantSDNode *ShlCnst = dyn_cast<ConstantSDNode>(ShlRHS);
4991*9880d681SAndroid Build Coastguard Worker if (!ShlCnst) {
4992*9880d681SAndroid Build Coastguard Worker // Shift amount must be constant
4993*9880d681SAndroid Build Coastguard Worker return false;
4994*9880d681SAndroid Build Coastguard Worker }
4995*9880d681SAndroid Build Coastguard Worker uint64_t InnerShiftAmt = ShlCnst->getZExtValue();
4996*9880d681SAndroid Build Coastguard Worker
4997*9880d681SAndroid Build Coastguard Worker SDValue ShrRHS = RHS;
4998*9880d681SAndroid Build Coastguard Worker ConstantSDNode *ShrCnst = dyn_cast<ConstantSDNode>(ShrRHS);
4999*9880d681SAndroid Build Coastguard Worker if (!ShrCnst) {
5000*9880d681SAndroid Build Coastguard Worker // Shift amount must be constant
5001*9880d681SAndroid Build Coastguard Worker return false;
5002*9880d681SAndroid Build Coastguard Worker }
5003*9880d681SAndroid Build Coastguard Worker uint64_t OuterShiftAmt = ShrCnst->getZExtValue();
5004*9880d681SAndroid Build Coastguard Worker
5005*9880d681SAndroid Build Coastguard Worker // To avoid extra codegen and be profitable, we need Outer >= Inner
5006*9880d681SAndroid Build Coastguard Worker if (OuterShiftAmt < InnerShiftAmt) {
5007*9880d681SAndroid Build Coastguard Worker return false;
5008*9880d681SAndroid Build Coastguard Worker }
5009*9880d681SAndroid Build Coastguard Worker
5010*9880d681SAndroid Build Coastguard Worker // If the outer shift is more than the type size, we have no bitfield to
5011*9880d681SAndroid Build Coastguard Worker // extract (since we also check that the inner shift is <= the outer shift
5012*9880d681SAndroid Build Coastguard Worker // then this also implies that the inner shift is < the type size)
5013*9880d681SAndroid Build Coastguard Worker if (OuterShiftAmt >= Val.getValueType().getSizeInBits()) {
5014*9880d681SAndroid Build Coastguard Worker return false;
5015*9880d681SAndroid Build Coastguard Worker }
5016*9880d681SAndroid Build Coastguard Worker
5017*9880d681SAndroid Build Coastguard Worker Start =
5018*9880d681SAndroid Build Coastguard Worker CurDAG->getTargetConstant(OuterShiftAmt - InnerShiftAmt, DL, MVT::i32);
5019*9880d681SAndroid Build Coastguard Worker Len =
5020*9880d681SAndroid Build Coastguard Worker CurDAG->getTargetConstant(Val.getValueType().getSizeInBits() -
5021*9880d681SAndroid Build Coastguard Worker OuterShiftAmt, DL, MVT::i32);
5022*9880d681SAndroid Build Coastguard Worker
5023*9880d681SAndroid Build Coastguard Worker if (N->getOpcode() == ISD::SRA) {
5024*9880d681SAndroid Build Coastguard Worker // If we have a arithmetic right shift, we need to use the signed bfe
5025*9880d681SAndroid Build Coastguard Worker // variant
5026*9880d681SAndroid Build Coastguard Worker IsSigned = true;
5027*9880d681SAndroid Build Coastguard Worker }
5028*9880d681SAndroid Build Coastguard Worker } else {
5029*9880d681SAndroid Build Coastguard Worker // No can do...
5030*9880d681SAndroid Build Coastguard Worker return false;
5031*9880d681SAndroid Build Coastguard Worker }
5032*9880d681SAndroid Build Coastguard Worker } else {
5033*9880d681SAndroid Build Coastguard Worker // No can do...
5034*9880d681SAndroid Build Coastguard Worker return false;
5035*9880d681SAndroid Build Coastguard Worker }
5036*9880d681SAndroid Build Coastguard Worker
5037*9880d681SAndroid Build Coastguard Worker
5038*9880d681SAndroid Build Coastguard Worker unsigned Opc;
5039*9880d681SAndroid Build Coastguard Worker // For the BFE operations we form here from "and" and "srl", always use the
5040*9880d681SAndroid Build Coastguard Worker // unsigned variants.
5041*9880d681SAndroid Build Coastguard Worker if (Val.getValueType() == MVT::i32) {
5042*9880d681SAndroid Build Coastguard Worker if (IsSigned) {
5043*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::BFE_S32rii;
5044*9880d681SAndroid Build Coastguard Worker } else {
5045*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::BFE_U32rii;
5046*9880d681SAndroid Build Coastguard Worker }
5047*9880d681SAndroid Build Coastguard Worker } else if (Val.getValueType() == MVT::i64) {
5048*9880d681SAndroid Build Coastguard Worker if (IsSigned) {
5049*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::BFE_S64rii;
5050*9880d681SAndroid Build Coastguard Worker } else {
5051*9880d681SAndroid Build Coastguard Worker Opc = NVPTX::BFE_U64rii;
5052*9880d681SAndroid Build Coastguard Worker }
5053*9880d681SAndroid Build Coastguard Worker } else {
5054*9880d681SAndroid Build Coastguard Worker // We cannot handle this type
5055*9880d681SAndroid Build Coastguard Worker return false;
5056*9880d681SAndroid Build Coastguard Worker }
5057*9880d681SAndroid Build Coastguard Worker
5058*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = {
5059*9880d681SAndroid Build Coastguard Worker Val, Start, Len
5060*9880d681SAndroid Build Coastguard Worker };
5061*9880d681SAndroid Build Coastguard Worker
5062*9880d681SAndroid Build Coastguard Worker ReplaceNode(N, CurDAG->getMachineNode(Opc, DL, N->getVTList(), Ops));
5063*9880d681SAndroid Build Coastguard Worker return true;
5064*9880d681SAndroid Build Coastguard Worker }
5065*9880d681SAndroid Build Coastguard Worker
5066*9880d681SAndroid Build Coastguard Worker // SelectDirectAddr - Match a direct address for DAG.
5067*9880d681SAndroid Build Coastguard Worker // A direct address could be a globaladdress or externalsymbol.
SelectDirectAddr(SDValue N,SDValue & Address)5068*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
5069*9880d681SAndroid Build Coastguard Worker // Return true if TGA or ES.
5070*9880d681SAndroid Build Coastguard Worker if (N.getOpcode() == ISD::TargetGlobalAddress ||
5071*9880d681SAndroid Build Coastguard Worker N.getOpcode() == ISD::TargetExternalSymbol) {
5072*9880d681SAndroid Build Coastguard Worker Address = N;
5073*9880d681SAndroid Build Coastguard Worker return true;
5074*9880d681SAndroid Build Coastguard Worker }
5075*9880d681SAndroid Build Coastguard Worker if (N.getOpcode() == NVPTXISD::Wrapper) {
5076*9880d681SAndroid Build Coastguard Worker Address = N.getOperand(0);
5077*9880d681SAndroid Build Coastguard Worker return true;
5078*9880d681SAndroid Build Coastguard Worker }
5079*9880d681SAndroid Build Coastguard Worker if (N.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
5080*9880d681SAndroid Build Coastguard Worker unsigned IID = cast<ConstantSDNode>(N.getOperand(0))->getZExtValue();
5081*9880d681SAndroid Build Coastguard Worker if (IID == Intrinsic::nvvm_ptr_gen_to_param)
5082*9880d681SAndroid Build Coastguard Worker if (N.getOperand(1).getOpcode() == NVPTXISD::MoveParam)
5083*9880d681SAndroid Build Coastguard Worker return (SelectDirectAddr(N.getOperand(1).getOperand(0), Address));
5084*9880d681SAndroid Build Coastguard Worker }
5085*9880d681SAndroid Build Coastguard Worker return false;
5086*9880d681SAndroid Build Coastguard Worker }
5087*9880d681SAndroid Build Coastguard Worker
5088*9880d681SAndroid Build Coastguard Worker // symbol+offset
SelectADDRsi_imp(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset,MVT mvt)5089*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
5090*9880d681SAndroid Build Coastguard Worker SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
5091*9880d681SAndroid Build Coastguard Worker if (Addr.getOpcode() == ISD::ADD) {
5092*9880d681SAndroid Build Coastguard Worker if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
5093*9880d681SAndroid Build Coastguard Worker SDValue base = Addr.getOperand(0);
5094*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(base, Base)) {
5095*9880d681SAndroid Build Coastguard Worker Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5096*9880d681SAndroid Build Coastguard Worker mvt);
5097*9880d681SAndroid Build Coastguard Worker return true;
5098*9880d681SAndroid Build Coastguard Worker }
5099*9880d681SAndroid Build Coastguard Worker }
5100*9880d681SAndroid Build Coastguard Worker }
5101*9880d681SAndroid Build Coastguard Worker return false;
5102*9880d681SAndroid Build Coastguard Worker }
5103*9880d681SAndroid Build Coastguard Worker
5104*9880d681SAndroid Build Coastguard Worker // symbol+offset
SelectADDRsi(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset)5105*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
5106*9880d681SAndroid Build Coastguard Worker SDValue &Base, SDValue &Offset) {
5107*9880d681SAndroid Build Coastguard Worker return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
5108*9880d681SAndroid Build Coastguard Worker }
5109*9880d681SAndroid Build Coastguard Worker
5110*9880d681SAndroid Build Coastguard Worker // symbol+offset
SelectADDRsi64(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset)5111*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
5112*9880d681SAndroid Build Coastguard Worker SDValue &Base, SDValue &Offset) {
5113*9880d681SAndroid Build Coastguard Worker return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
5114*9880d681SAndroid Build Coastguard Worker }
5115*9880d681SAndroid Build Coastguard Worker
5116*9880d681SAndroid Build Coastguard Worker // register+offset
SelectADDRri_imp(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset,MVT mvt)5117*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRri_imp(
5118*9880d681SAndroid Build Coastguard Worker SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
5119*9880d681SAndroid Build Coastguard Worker if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
5120*9880d681SAndroid Build Coastguard Worker Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
5121*9880d681SAndroid Build Coastguard Worker Offset = CurDAG->getTargetConstant(0, SDLoc(OpNode), mvt);
5122*9880d681SAndroid Build Coastguard Worker return true;
5123*9880d681SAndroid Build Coastguard Worker }
5124*9880d681SAndroid Build Coastguard Worker if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
5125*9880d681SAndroid Build Coastguard Worker Addr.getOpcode() == ISD::TargetGlobalAddress)
5126*9880d681SAndroid Build Coastguard Worker return false; // direct calls.
5127*9880d681SAndroid Build Coastguard Worker
5128*9880d681SAndroid Build Coastguard Worker if (Addr.getOpcode() == ISD::ADD) {
5129*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
5130*9880d681SAndroid Build Coastguard Worker return false;
5131*9880d681SAndroid Build Coastguard Worker }
5132*9880d681SAndroid Build Coastguard Worker if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
5133*9880d681SAndroid Build Coastguard Worker if (FrameIndexSDNode *FIN =
5134*9880d681SAndroid Build Coastguard Worker dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
5135*9880d681SAndroid Build Coastguard Worker // Constant offset from frame ref.
5136*9880d681SAndroid Build Coastguard Worker Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
5137*9880d681SAndroid Build Coastguard Worker else
5138*9880d681SAndroid Build Coastguard Worker Base = Addr.getOperand(0);
5139*9880d681SAndroid Build Coastguard Worker Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5140*9880d681SAndroid Build Coastguard Worker mvt);
5141*9880d681SAndroid Build Coastguard Worker return true;
5142*9880d681SAndroid Build Coastguard Worker }
5143*9880d681SAndroid Build Coastguard Worker }
5144*9880d681SAndroid Build Coastguard Worker return false;
5145*9880d681SAndroid Build Coastguard Worker }
5146*9880d681SAndroid Build Coastguard Worker
5147*9880d681SAndroid Build Coastguard Worker // register+offset
SelectADDRri(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset)5148*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
5149*9880d681SAndroid Build Coastguard Worker SDValue &Base, SDValue &Offset) {
5150*9880d681SAndroid Build Coastguard Worker return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
5151*9880d681SAndroid Build Coastguard Worker }
5152*9880d681SAndroid Build Coastguard Worker
5153*9880d681SAndroid Build Coastguard Worker // register+offset
SelectADDRri64(SDNode * OpNode,SDValue Addr,SDValue & Base,SDValue & Offset)5154*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
5155*9880d681SAndroid Build Coastguard Worker SDValue &Base, SDValue &Offset) {
5156*9880d681SAndroid Build Coastguard Worker return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
5157*9880d681SAndroid Build Coastguard Worker }
5158*9880d681SAndroid Build Coastguard Worker
ChkMemSDNodeAddressSpace(SDNode * N,unsigned int spN) const5159*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
5160*9880d681SAndroid Build Coastguard Worker unsigned int spN) const {
5161*9880d681SAndroid Build Coastguard Worker const Value *Src = nullptr;
5162*9880d681SAndroid Build Coastguard Worker if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
5163*9880d681SAndroid Build Coastguard Worker if (spN == 0 && mN->getMemOperand()->getPseudoValue())
5164*9880d681SAndroid Build Coastguard Worker return true;
5165*9880d681SAndroid Build Coastguard Worker Src = mN->getMemOperand()->getValue();
5166*9880d681SAndroid Build Coastguard Worker }
5167*9880d681SAndroid Build Coastguard Worker if (!Src)
5168*9880d681SAndroid Build Coastguard Worker return false;
5169*9880d681SAndroid Build Coastguard Worker if (auto *PT = dyn_cast<PointerType>(Src->getType()))
5170*9880d681SAndroid Build Coastguard Worker return (PT->getAddressSpace() == spN);
5171*9880d681SAndroid Build Coastguard Worker return false;
5172*9880d681SAndroid Build Coastguard Worker }
5173*9880d681SAndroid Build Coastguard Worker
5174*9880d681SAndroid Build Coastguard Worker /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
5175*9880d681SAndroid Build Coastguard Worker /// inline asm expressions.
SelectInlineAsmMemoryOperand(const SDValue & Op,unsigned ConstraintID,std::vector<SDValue> & OutOps)5176*9880d681SAndroid Build Coastguard Worker bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
5177*9880d681SAndroid Build Coastguard Worker const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
5178*9880d681SAndroid Build Coastguard Worker SDValue Op0, Op1;
5179*9880d681SAndroid Build Coastguard Worker switch (ConstraintID) {
5180*9880d681SAndroid Build Coastguard Worker default:
5181*9880d681SAndroid Build Coastguard Worker return true;
5182*9880d681SAndroid Build Coastguard Worker case InlineAsm::Constraint_m: // memory
5183*9880d681SAndroid Build Coastguard Worker if (SelectDirectAddr(Op, Op0)) {
5184*9880d681SAndroid Build Coastguard Worker OutOps.push_back(Op0);
5185*9880d681SAndroid Build Coastguard Worker OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
5186*9880d681SAndroid Build Coastguard Worker return false;
5187*9880d681SAndroid Build Coastguard Worker }
5188*9880d681SAndroid Build Coastguard Worker if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
5189*9880d681SAndroid Build Coastguard Worker OutOps.push_back(Op0);
5190*9880d681SAndroid Build Coastguard Worker OutOps.push_back(Op1);
5191*9880d681SAndroid Build Coastguard Worker return false;
5192*9880d681SAndroid Build Coastguard Worker }
5193*9880d681SAndroid Build Coastguard Worker break;
5194*9880d681SAndroid Build Coastguard Worker }
5195*9880d681SAndroid Build Coastguard Worker return true;
5196*9880d681SAndroid Build Coastguard Worker }
5197*9880d681SAndroid Build Coastguard Worker
5198*9880d681SAndroid Build Coastguard Worker /// GetConvertOpcode - Returns the CVT_ instruction opcode that implements a
5199*9880d681SAndroid Build Coastguard Worker /// conversion from \p SrcTy to \p DestTy.
GetConvertOpcode(MVT DestTy,MVT SrcTy,bool IsSigned)5200*9880d681SAndroid Build Coastguard Worker unsigned NVPTXDAGToDAGISel::GetConvertOpcode(MVT DestTy, MVT SrcTy,
5201*9880d681SAndroid Build Coastguard Worker bool IsSigned) {
5202*9880d681SAndroid Build Coastguard Worker switch (SrcTy.SimpleTy) {
5203*9880d681SAndroid Build Coastguard Worker default:
5204*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled source type");
5205*9880d681SAndroid Build Coastguard Worker case MVT::i8:
5206*9880d681SAndroid Build Coastguard Worker switch (DestTy.SimpleTy) {
5207*9880d681SAndroid Build Coastguard Worker default:
5208*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled dest type");
5209*9880d681SAndroid Build Coastguard Worker case MVT::i16:
5210*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s16_s8 : NVPTX::CVT_u16_u8;
5211*9880d681SAndroid Build Coastguard Worker case MVT::i32:
5212*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s32_s8 : NVPTX::CVT_u32_u8;
5213*9880d681SAndroid Build Coastguard Worker case MVT::i64:
5214*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s64_s8 : NVPTX::CVT_u64_u8;
5215*9880d681SAndroid Build Coastguard Worker }
5216*9880d681SAndroid Build Coastguard Worker case MVT::i16:
5217*9880d681SAndroid Build Coastguard Worker switch (DestTy.SimpleTy) {
5218*9880d681SAndroid Build Coastguard Worker default:
5219*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled dest type");
5220*9880d681SAndroid Build Coastguard Worker case MVT::i8:
5221*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s8_s16 : NVPTX::CVT_u8_u16;
5222*9880d681SAndroid Build Coastguard Worker case MVT::i32:
5223*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s32_s16 : NVPTX::CVT_u32_u16;
5224*9880d681SAndroid Build Coastguard Worker case MVT::i64:
5225*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s64_s16 : NVPTX::CVT_u64_u16;
5226*9880d681SAndroid Build Coastguard Worker }
5227*9880d681SAndroid Build Coastguard Worker case MVT::i32:
5228*9880d681SAndroid Build Coastguard Worker switch (DestTy.SimpleTy) {
5229*9880d681SAndroid Build Coastguard Worker default:
5230*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled dest type");
5231*9880d681SAndroid Build Coastguard Worker case MVT::i8:
5232*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s8_s32 : NVPTX::CVT_u8_u32;
5233*9880d681SAndroid Build Coastguard Worker case MVT::i16:
5234*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s16_s32 : NVPTX::CVT_u16_u32;
5235*9880d681SAndroid Build Coastguard Worker case MVT::i64:
5236*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s64_s32 : NVPTX::CVT_u64_u32;
5237*9880d681SAndroid Build Coastguard Worker }
5238*9880d681SAndroid Build Coastguard Worker case MVT::i64:
5239*9880d681SAndroid Build Coastguard Worker switch (DestTy.SimpleTy) {
5240*9880d681SAndroid Build Coastguard Worker default:
5241*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled dest type");
5242*9880d681SAndroid Build Coastguard Worker case MVT::i8:
5243*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s8_s64 : NVPTX::CVT_u8_u64;
5244*9880d681SAndroid Build Coastguard Worker case MVT::i16:
5245*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s16_s64 : NVPTX::CVT_u16_u64;
5246*9880d681SAndroid Build Coastguard Worker case MVT::i32:
5247*9880d681SAndroid Build Coastguard Worker return IsSigned ? NVPTX::CVT_s32_s64 : NVPTX::CVT_u32_u64;
5248*9880d681SAndroid Build Coastguard Worker }
5249*9880d681SAndroid Build Coastguard Worker }
5250*9880d681SAndroid Build Coastguard Worker }
5251