blob: 7ab15ee94cf0ef6ac880c32b5b5ee0efdbd41d23 [file] [log] [blame]
Justin Holewinskiae556d32012-05-04 20:18:50 +00001//===-- NVPTXISelDAGToDAG.cpp - A dag to dag inst selector for NVPTX ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines an instruction selector for the NVPTX target.
11//
12//===----------------------------------------------------------------------===//
13
Justin Holewinskiae556d32012-05-04 20:18:50 +000014#include "NVPTXISelDAGToDAG.h"
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +000015#include "NVPTXUtilities.h"
Jingyue Wu48a9bdc2015-07-20 21:28:54 +000016#include "llvm/Analysis/ValueTracking.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000017#include "llvm/IR/GlobalValue.h"
18#include "llvm/IR/Instructions.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/Support/CommandLine.h"
Justin Holewinskiae556d32012-05-04 20:18:50 +000020#include "llvm/Support/Debug.h"
21#include "llvm/Support/ErrorHandling.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000022#include "llvm/Support/raw_ostream.h"
Justin Holewinskiae556d32012-05-04 20:18:50 +000023#include "llvm/Target/TargetIntrinsicInfo.h"
Justin Holewinskiae556d32012-05-04 20:18:50 +000024
Justin Holewinskiae556d32012-05-04 20:18:50 +000025using namespace llvm;
26
Chandler Carruth84e68b22014-04-22 02:41:26 +000027#define DEBUG_TYPE "nvptx-isel"
28
Justin Holewinski0497ab12013-03-30 14:29:21 +000029static cl::opt<int> UsePrecDivF32(
Nadav Rotem7f27e0b2013-10-18 23:38:13 +000030 "nvptx-prec-divf32", cl::ZeroOrMore, cl::Hidden,
Justin Holewinski0497ab12013-03-30 14:29:21 +000031 cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
Sylvestre Ledru469de192014-08-11 18:04:46 +000032 " IEEE Compliant F32 div.rnd if available."),
Justin Holewinski0497ab12013-03-30 14:29:21 +000033 cl::init(2));
Justin Holewinskiae556d32012-05-04 20:18:50 +000034
Justin Holewinski48f4ad32013-05-21 16:51:30 +000035static cl::opt<bool>
Nadav Rotem7f27e0b2013-10-18 23:38:13 +000036UsePrecSqrtF32("nvptx-prec-sqrtf32", cl::Hidden,
Justin Holewinski48f4ad32013-05-21 16:51:30 +000037 cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
38 cl::init(true));
39
Justin Holewinskicd069e62013-07-22 12:18:04 +000040static cl::opt<bool>
Nadav Rotem7f27e0b2013-10-18 23:38:13 +000041FtzEnabled("nvptx-f32ftz", cl::ZeroOrMore, cl::Hidden,
Justin Holewinskicd069e62013-07-22 12:18:04 +000042 cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
43 cl::init(false));
44
45
Justin Holewinskiae556d32012-05-04 20:18:50 +000046/// createNVPTXISelDag - This pass converts a legalized DAG into a
47/// NVPTX-specific DAG, ready for instruction scheduling.
48FunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
49 llvm::CodeGenOpt::Level OptLevel) {
50 return new NVPTXDAGToDAGISel(TM, OptLevel);
51}
52
Justin Holewinskiae556d32012-05-04 20:18:50 +000053NVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
54 CodeGenOpt::Level OptLevel)
Eric Christopher02389e32015-02-19 00:08:27 +000055 : SelectionDAGISel(tm, OptLevel), TM(tm) {
Justin Holewinskiae556d32012-05-04 20:18:50 +000056 doMulWide = (OptLevel > 0);
Justin Holewinskicd069e62013-07-22 12:18:04 +000057}
Justin Holewinskiae556d32012-05-04 20:18:50 +000058
Eric Christopher147bba22015-01-30 01:40:59 +000059bool NVPTXDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
60 Subtarget = &static_cast<const NVPTXSubtarget &>(MF.getSubtarget());
61 return SelectionDAGISel::runOnMachineFunction(MF);
62}
63
Justin Holewinskicd069e62013-07-22 12:18:04 +000064int NVPTXDAGToDAGISel::getDivF32Level() const {
65 if (UsePrecDivF32.getNumOccurrences() > 0) {
66 // If nvptx-prec-div32=N is used on the command-line, always honor it
67 return UsePrecDivF32;
68 } else {
69 // Otherwise, use div.approx if fast math is enabled
70 if (TM.Options.UnsafeFPMath)
71 return 0;
72 else
73 return 2;
74 }
75}
Justin Holewinskiae556d32012-05-04 20:18:50 +000076
Justin Holewinskicd069e62013-07-22 12:18:04 +000077bool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
78 if (UsePrecSqrtF32.getNumOccurrences() > 0) {
79 // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
80 return UsePrecSqrtF32;
81 } else {
82 // Otherwise, use sqrt.approx if fast math is enabled
Eli Bendersky3e840192015-03-23 16:26:23 +000083 return !TM.Options.UnsafeFPMath;
Justin Holewinskicd069e62013-07-22 12:18:04 +000084 }
85}
86
87bool NVPTXDAGToDAGISel::useF32FTZ() const {
88 if (FtzEnabled.getNumOccurrences() > 0) {
89 // If nvptx-f32ftz is used on the command-line, always honor it
90 return FtzEnabled;
91 } else {
92 const Function *F = MF->getFunction();
93 // Otherwise, check for an nvptx-f32ftz attribute on the function
94 if (F->hasFnAttribute("nvptx-f32ftz"))
Duncan P. N. Exon Smithb5054332015-02-14 15:35:43 +000095 return F->getFnAttribute("nvptx-f32ftz").getValueAsString() == "true";
Justin Holewinskicd069e62013-07-22 12:18:04 +000096 else
97 return false;
98 }
Justin Holewinskiae556d32012-05-04 20:18:50 +000099}
100
Justin Holewinski428cf0e2014-07-17 18:10:09 +0000101bool NVPTXDAGToDAGISel::allowFMA() const {
Eric Christopher147bba22015-01-30 01:40:59 +0000102 const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
Justin Holewinski428cf0e2014-07-17 18:10:09 +0000103 return TL->allowFMA(*MF, OptLevel);
104}
105
Justin Holewinskiae556d32012-05-04 20:18:50 +0000106/// Select - Select instructions not customized! Used for
107/// expanded, promoted and normal instructions.
Justin Bogner8d83fb62016-05-13 21:12:53 +0000108void NVPTXDAGToDAGISel::Select(SDNode *N) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000109
Tim Northover31d093c2013-09-22 08:21:56 +0000110 if (N->isMachineOpcode()) {
111 N->setNodeId(-1);
Justin Bogner8d83fb62016-05-13 21:12:53 +0000112 return; // Already selected.
Tim Northover31d093c2013-09-22 08:21:56 +0000113 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000114
Justin Holewinskiae556d32012-05-04 20:18:50 +0000115 switch (N->getOpcode()) {
116 case ISD::LOAD:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000117 if (tryLoad(N))
118 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000119 break;
120 case ISD::STORE:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000121 if (tryStore(N))
122 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000123 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000124 case NVPTXISD::LoadV2:
125 case NVPTXISD::LoadV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000126 if (tryLoadVector(N))
127 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000128 break;
129 case NVPTXISD::LDGV2:
130 case NVPTXISD::LDGV4:
131 case NVPTXISD::LDUV2:
132 case NVPTXISD::LDUV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000133 if (tryLDGLDU(N))
134 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000135 break;
136 case NVPTXISD::StoreV2:
137 case NVPTXISD::StoreV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000138 if (tryStoreVector(N))
139 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000140 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000141 case NVPTXISD::LoadParam:
142 case NVPTXISD::LoadParamV2:
143 case NVPTXISD::LoadParamV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000144 if (tryLoadParam(N))
145 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000146 break;
147 case NVPTXISD::StoreRetval:
148 case NVPTXISD::StoreRetvalV2:
149 case NVPTXISD::StoreRetvalV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000150 if (tryStoreRetval(N))
151 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000152 break;
153 case NVPTXISD::StoreParam:
154 case NVPTXISD::StoreParamV2:
155 case NVPTXISD::StoreParamV4:
156 case NVPTXISD::StoreParamS32:
157 case NVPTXISD::StoreParamU32:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000158 if (tryStoreParam(N))
159 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000160 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000161 case ISD::INTRINSIC_WO_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000162 if (tryIntrinsicNoChain(N))
163 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000164 break;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000165 case ISD::INTRINSIC_W_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000166 if (tryIntrinsicChain(N))
167 return;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000168 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000169 case NVPTXISD::Tex1DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000170 case NVPTXISD::Tex1DFloatFloat:
171 case NVPTXISD::Tex1DFloatFloatLevel:
172 case NVPTXISD::Tex1DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000173 case NVPTXISD::Tex1DS32S32:
174 case NVPTXISD::Tex1DS32Float:
175 case NVPTXISD::Tex1DS32FloatLevel:
176 case NVPTXISD::Tex1DS32FloatGrad:
177 case NVPTXISD::Tex1DU32S32:
178 case NVPTXISD::Tex1DU32Float:
179 case NVPTXISD::Tex1DU32FloatLevel:
180 case NVPTXISD::Tex1DU32FloatGrad:
181 case NVPTXISD::Tex1DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000182 case NVPTXISD::Tex1DArrayFloatFloat:
183 case NVPTXISD::Tex1DArrayFloatFloatLevel:
184 case NVPTXISD::Tex1DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000185 case NVPTXISD::Tex1DArrayS32S32:
186 case NVPTXISD::Tex1DArrayS32Float:
187 case NVPTXISD::Tex1DArrayS32FloatLevel:
188 case NVPTXISD::Tex1DArrayS32FloatGrad:
189 case NVPTXISD::Tex1DArrayU32S32:
190 case NVPTXISD::Tex1DArrayU32Float:
191 case NVPTXISD::Tex1DArrayU32FloatLevel:
192 case NVPTXISD::Tex1DArrayU32FloatGrad:
193 case NVPTXISD::Tex2DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000194 case NVPTXISD::Tex2DFloatFloat:
195 case NVPTXISD::Tex2DFloatFloatLevel:
196 case NVPTXISD::Tex2DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000197 case NVPTXISD::Tex2DS32S32:
198 case NVPTXISD::Tex2DS32Float:
199 case NVPTXISD::Tex2DS32FloatLevel:
200 case NVPTXISD::Tex2DS32FloatGrad:
201 case NVPTXISD::Tex2DU32S32:
202 case NVPTXISD::Tex2DU32Float:
203 case NVPTXISD::Tex2DU32FloatLevel:
204 case NVPTXISD::Tex2DU32FloatGrad:
205 case NVPTXISD::Tex2DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000206 case NVPTXISD::Tex2DArrayFloatFloat:
207 case NVPTXISD::Tex2DArrayFloatFloatLevel:
208 case NVPTXISD::Tex2DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000209 case NVPTXISD::Tex2DArrayS32S32:
210 case NVPTXISD::Tex2DArrayS32Float:
211 case NVPTXISD::Tex2DArrayS32FloatLevel:
212 case NVPTXISD::Tex2DArrayS32FloatGrad:
213 case NVPTXISD::Tex2DArrayU32S32:
214 case NVPTXISD::Tex2DArrayU32Float:
215 case NVPTXISD::Tex2DArrayU32FloatLevel:
216 case NVPTXISD::Tex2DArrayU32FloatGrad:
217 case NVPTXISD::Tex3DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000218 case NVPTXISD::Tex3DFloatFloat:
219 case NVPTXISD::Tex3DFloatFloatLevel:
220 case NVPTXISD::Tex3DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000221 case NVPTXISD::Tex3DS32S32:
222 case NVPTXISD::Tex3DS32Float:
223 case NVPTXISD::Tex3DS32FloatLevel:
224 case NVPTXISD::Tex3DS32FloatGrad:
225 case NVPTXISD::Tex3DU32S32:
226 case NVPTXISD::Tex3DU32Float:
227 case NVPTXISD::Tex3DU32FloatLevel:
228 case NVPTXISD::Tex3DU32FloatGrad:
229 case NVPTXISD::TexCubeFloatFloat:
230 case NVPTXISD::TexCubeFloatFloatLevel:
231 case NVPTXISD::TexCubeS32Float:
232 case NVPTXISD::TexCubeS32FloatLevel:
233 case NVPTXISD::TexCubeU32Float:
234 case NVPTXISD::TexCubeU32FloatLevel:
235 case NVPTXISD::TexCubeArrayFloatFloat:
236 case NVPTXISD::TexCubeArrayFloatFloatLevel:
237 case NVPTXISD::TexCubeArrayS32Float:
238 case NVPTXISD::TexCubeArrayS32FloatLevel:
239 case NVPTXISD::TexCubeArrayU32Float:
240 case NVPTXISD::TexCubeArrayU32FloatLevel:
241 case NVPTXISD::Tld4R2DFloatFloat:
242 case NVPTXISD::Tld4G2DFloatFloat:
243 case NVPTXISD::Tld4B2DFloatFloat:
244 case NVPTXISD::Tld4A2DFloatFloat:
245 case NVPTXISD::Tld4R2DS64Float:
246 case NVPTXISD::Tld4G2DS64Float:
247 case NVPTXISD::Tld4B2DS64Float:
248 case NVPTXISD::Tld4A2DS64Float:
249 case NVPTXISD::Tld4R2DU64Float:
250 case NVPTXISD::Tld4G2DU64Float:
251 case NVPTXISD::Tld4B2DU64Float:
252 case NVPTXISD::Tld4A2DU64Float:
253 case NVPTXISD::TexUnified1DFloatS32:
254 case NVPTXISD::TexUnified1DFloatFloat:
255 case NVPTXISD::TexUnified1DFloatFloatLevel:
256 case NVPTXISD::TexUnified1DFloatFloatGrad:
257 case NVPTXISD::TexUnified1DS32S32:
258 case NVPTXISD::TexUnified1DS32Float:
259 case NVPTXISD::TexUnified1DS32FloatLevel:
260 case NVPTXISD::TexUnified1DS32FloatGrad:
261 case NVPTXISD::TexUnified1DU32S32:
262 case NVPTXISD::TexUnified1DU32Float:
263 case NVPTXISD::TexUnified1DU32FloatLevel:
264 case NVPTXISD::TexUnified1DU32FloatGrad:
265 case NVPTXISD::TexUnified1DArrayFloatS32:
266 case NVPTXISD::TexUnified1DArrayFloatFloat:
267 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
268 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
269 case NVPTXISD::TexUnified1DArrayS32S32:
270 case NVPTXISD::TexUnified1DArrayS32Float:
271 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
272 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
273 case NVPTXISD::TexUnified1DArrayU32S32:
274 case NVPTXISD::TexUnified1DArrayU32Float:
275 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
276 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
277 case NVPTXISD::TexUnified2DFloatS32:
278 case NVPTXISD::TexUnified2DFloatFloat:
279 case NVPTXISD::TexUnified2DFloatFloatLevel:
280 case NVPTXISD::TexUnified2DFloatFloatGrad:
281 case NVPTXISD::TexUnified2DS32S32:
282 case NVPTXISD::TexUnified2DS32Float:
283 case NVPTXISD::TexUnified2DS32FloatLevel:
284 case NVPTXISD::TexUnified2DS32FloatGrad:
285 case NVPTXISD::TexUnified2DU32S32:
286 case NVPTXISD::TexUnified2DU32Float:
287 case NVPTXISD::TexUnified2DU32FloatLevel:
288 case NVPTXISD::TexUnified2DU32FloatGrad:
289 case NVPTXISD::TexUnified2DArrayFloatS32:
290 case NVPTXISD::TexUnified2DArrayFloatFloat:
291 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
292 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
293 case NVPTXISD::TexUnified2DArrayS32S32:
294 case NVPTXISD::TexUnified2DArrayS32Float:
295 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
296 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
297 case NVPTXISD::TexUnified2DArrayU32S32:
298 case NVPTXISD::TexUnified2DArrayU32Float:
299 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
300 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
301 case NVPTXISD::TexUnified3DFloatS32:
302 case NVPTXISD::TexUnified3DFloatFloat:
303 case NVPTXISD::TexUnified3DFloatFloatLevel:
304 case NVPTXISD::TexUnified3DFloatFloatGrad:
305 case NVPTXISD::TexUnified3DS32S32:
306 case NVPTXISD::TexUnified3DS32Float:
307 case NVPTXISD::TexUnified3DS32FloatLevel:
308 case NVPTXISD::TexUnified3DS32FloatGrad:
309 case NVPTXISD::TexUnified3DU32S32:
310 case NVPTXISD::TexUnified3DU32Float:
311 case NVPTXISD::TexUnified3DU32FloatLevel:
312 case NVPTXISD::TexUnified3DU32FloatGrad:
313 case NVPTXISD::TexUnifiedCubeFloatFloat:
314 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
315 case NVPTXISD::TexUnifiedCubeS32Float:
316 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
317 case NVPTXISD::TexUnifiedCubeU32Float:
318 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
319 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
320 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
321 case NVPTXISD::TexUnifiedCubeArrayS32Float:
322 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
323 case NVPTXISD::TexUnifiedCubeArrayU32Float:
324 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
325 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
326 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
327 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
328 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
329 case NVPTXISD::Tld4UnifiedR2DS64Float:
330 case NVPTXISD::Tld4UnifiedG2DS64Float:
331 case NVPTXISD::Tld4UnifiedB2DS64Float:
332 case NVPTXISD::Tld4UnifiedA2DS64Float:
333 case NVPTXISD::Tld4UnifiedR2DU64Float:
334 case NVPTXISD::Tld4UnifiedG2DU64Float:
335 case NVPTXISD::Tld4UnifiedB2DU64Float:
336 case NVPTXISD::Tld4UnifiedA2DU64Float:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000337 if (tryTextureIntrinsic(N))
338 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000339 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000340 case NVPTXISD::Suld1DI8Clamp:
341 case NVPTXISD::Suld1DI16Clamp:
342 case NVPTXISD::Suld1DI32Clamp:
343 case NVPTXISD::Suld1DI64Clamp:
344 case NVPTXISD::Suld1DV2I8Clamp:
345 case NVPTXISD::Suld1DV2I16Clamp:
346 case NVPTXISD::Suld1DV2I32Clamp:
347 case NVPTXISD::Suld1DV2I64Clamp:
348 case NVPTXISD::Suld1DV4I8Clamp:
349 case NVPTXISD::Suld1DV4I16Clamp:
350 case NVPTXISD::Suld1DV4I32Clamp:
351 case NVPTXISD::Suld1DArrayI8Clamp:
352 case NVPTXISD::Suld1DArrayI16Clamp:
353 case NVPTXISD::Suld1DArrayI32Clamp:
354 case NVPTXISD::Suld1DArrayI64Clamp:
355 case NVPTXISD::Suld1DArrayV2I8Clamp:
356 case NVPTXISD::Suld1DArrayV2I16Clamp:
357 case NVPTXISD::Suld1DArrayV2I32Clamp:
358 case NVPTXISD::Suld1DArrayV2I64Clamp:
359 case NVPTXISD::Suld1DArrayV4I8Clamp:
360 case NVPTXISD::Suld1DArrayV4I16Clamp:
361 case NVPTXISD::Suld1DArrayV4I32Clamp:
362 case NVPTXISD::Suld2DI8Clamp:
363 case NVPTXISD::Suld2DI16Clamp:
364 case NVPTXISD::Suld2DI32Clamp:
365 case NVPTXISD::Suld2DI64Clamp:
366 case NVPTXISD::Suld2DV2I8Clamp:
367 case NVPTXISD::Suld2DV2I16Clamp:
368 case NVPTXISD::Suld2DV2I32Clamp:
369 case NVPTXISD::Suld2DV2I64Clamp:
370 case NVPTXISD::Suld2DV4I8Clamp:
371 case NVPTXISD::Suld2DV4I16Clamp:
372 case NVPTXISD::Suld2DV4I32Clamp:
373 case NVPTXISD::Suld2DArrayI8Clamp:
374 case NVPTXISD::Suld2DArrayI16Clamp:
375 case NVPTXISD::Suld2DArrayI32Clamp:
376 case NVPTXISD::Suld2DArrayI64Clamp:
377 case NVPTXISD::Suld2DArrayV2I8Clamp:
378 case NVPTXISD::Suld2DArrayV2I16Clamp:
379 case NVPTXISD::Suld2DArrayV2I32Clamp:
380 case NVPTXISD::Suld2DArrayV2I64Clamp:
381 case NVPTXISD::Suld2DArrayV4I8Clamp:
382 case NVPTXISD::Suld2DArrayV4I16Clamp:
383 case NVPTXISD::Suld2DArrayV4I32Clamp:
384 case NVPTXISD::Suld3DI8Clamp:
385 case NVPTXISD::Suld3DI16Clamp:
386 case NVPTXISD::Suld3DI32Clamp:
387 case NVPTXISD::Suld3DI64Clamp:
388 case NVPTXISD::Suld3DV2I8Clamp:
389 case NVPTXISD::Suld3DV2I16Clamp:
390 case NVPTXISD::Suld3DV2I32Clamp:
391 case NVPTXISD::Suld3DV2I64Clamp:
392 case NVPTXISD::Suld3DV4I8Clamp:
393 case NVPTXISD::Suld3DV4I16Clamp:
394 case NVPTXISD::Suld3DV4I32Clamp:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000395 case NVPTXISD::Suld1DI8Trap:
396 case NVPTXISD::Suld1DI16Trap:
397 case NVPTXISD::Suld1DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000398 case NVPTXISD::Suld1DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000399 case NVPTXISD::Suld1DV2I8Trap:
400 case NVPTXISD::Suld1DV2I16Trap:
401 case NVPTXISD::Suld1DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000402 case NVPTXISD::Suld1DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000403 case NVPTXISD::Suld1DV4I8Trap:
404 case NVPTXISD::Suld1DV4I16Trap:
405 case NVPTXISD::Suld1DV4I32Trap:
406 case NVPTXISD::Suld1DArrayI8Trap:
407 case NVPTXISD::Suld1DArrayI16Trap:
408 case NVPTXISD::Suld1DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000409 case NVPTXISD::Suld1DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000410 case NVPTXISD::Suld1DArrayV2I8Trap:
411 case NVPTXISD::Suld1DArrayV2I16Trap:
412 case NVPTXISD::Suld1DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000413 case NVPTXISD::Suld1DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000414 case NVPTXISD::Suld1DArrayV4I8Trap:
415 case NVPTXISD::Suld1DArrayV4I16Trap:
416 case NVPTXISD::Suld1DArrayV4I32Trap:
417 case NVPTXISD::Suld2DI8Trap:
418 case NVPTXISD::Suld2DI16Trap:
419 case NVPTXISD::Suld2DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000420 case NVPTXISD::Suld2DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000421 case NVPTXISD::Suld2DV2I8Trap:
422 case NVPTXISD::Suld2DV2I16Trap:
423 case NVPTXISD::Suld2DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000424 case NVPTXISD::Suld2DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000425 case NVPTXISD::Suld2DV4I8Trap:
426 case NVPTXISD::Suld2DV4I16Trap:
427 case NVPTXISD::Suld2DV4I32Trap:
428 case NVPTXISD::Suld2DArrayI8Trap:
429 case NVPTXISD::Suld2DArrayI16Trap:
430 case NVPTXISD::Suld2DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000431 case NVPTXISD::Suld2DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000432 case NVPTXISD::Suld2DArrayV2I8Trap:
433 case NVPTXISD::Suld2DArrayV2I16Trap:
434 case NVPTXISD::Suld2DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000435 case NVPTXISD::Suld2DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000436 case NVPTXISD::Suld2DArrayV4I8Trap:
437 case NVPTXISD::Suld2DArrayV4I16Trap:
438 case NVPTXISD::Suld2DArrayV4I32Trap:
439 case NVPTXISD::Suld3DI8Trap:
440 case NVPTXISD::Suld3DI16Trap:
441 case NVPTXISD::Suld3DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000442 case NVPTXISD::Suld3DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000443 case NVPTXISD::Suld3DV2I8Trap:
444 case NVPTXISD::Suld3DV2I16Trap:
445 case NVPTXISD::Suld3DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000446 case NVPTXISD::Suld3DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000447 case NVPTXISD::Suld3DV4I8Trap:
448 case NVPTXISD::Suld3DV4I16Trap:
449 case NVPTXISD::Suld3DV4I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000450 case NVPTXISD::Suld1DI8Zero:
451 case NVPTXISD::Suld1DI16Zero:
452 case NVPTXISD::Suld1DI32Zero:
453 case NVPTXISD::Suld1DI64Zero:
454 case NVPTXISD::Suld1DV2I8Zero:
455 case NVPTXISD::Suld1DV2I16Zero:
456 case NVPTXISD::Suld1DV2I32Zero:
457 case NVPTXISD::Suld1DV2I64Zero:
458 case NVPTXISD::Suld1DV4I8Zero:
459 case NVPTXISD::Suld1DV4I16Zero:
460 case NVPTXISD::Suld1DV4I32Zero:
461 case NVPTXISD::Suld1DArrayI8Zero:
462 case NVPTXISD::Suld1DArrayI16Zero:
463 case NVPTXISD::Suld1DArrayI32Zero:
464 case NVPTXISD::Suld1DArrayI64Zero:
465 case NVPTXISD::Suld1DArrayV2I8Zero:
466 case NVPTXISD::Suld1DArrayV2I16Zero:
467 case NVPTXISD::Suld1DArrayV2I32Zero:
468 case NVPTXISD::Suld1DArrayV2I64Zero:
469 case NVPTXISD::Suld1DArrayV4I8Zero:
470 case NVPTXISD::Suld1DArrayV4I16Zero:
471 case NVPTXISD::Suld1DArrayV4I32Zero:
472 case NVPTXISD::Suld2DI8Zero:
473 case NVPTXISD::Suld2DI16Zero:
474 case NVPTXISD::Suld2DI32Zero:
475 case NVPTXISD::Suld2DI64Zero:
476 case NVPTXISD::Suld2DV2I8Zero:
477 case NVPTXISD::Suld2DV2I16Zero:
478 case NVPTXISD::Suld2DV2I32Zero:
479 case NVPTXISD::Suld2DV2I64Zero:
480 case NVPTXISD::Suld2DV4I8Zero:
481 case NVPTXISD::Suld2DV4I16Zero:
482 case NVPTXISD::Suld2DV4I32Zero:
483 case NVPTXISD::Suld2DArrayI8Zero:
484 case NVPTXISD::Suld2DArrayI16Zero:
485 case NVPTXISD::Suld2DArrayI32Zero:
486 case NVPTXISD::Suld2DArrayI64Zero:
487 case NVPTXISD::Suld2DArrayV2I8Zero:
488 case NVPTXISD::Suld2DArrayV2I16Zero:
489 case NVPTXISD::Suld2DArrayV2I32Zero:
490 case NVPTXISD::Suld2DArrayV2I64Zero:
491 case NVPTXISD::Suld2DArrayV4I8Zero:
492 case NVPTXISD::Suld2DArrayV4I16Zero:
493 case NVPTXISD::Suld2DArrayV4I32Zero:
494 case NVPTXISD::Suld3DI8Zero:
495 case NVPTXISD::Suld3DI16Zero:
496 case NVPTXISD::Suld3DI32Zero:
497 case NVPTXISD::Suld3DI64Zero:
498 case NVPTXISD::Suld3DV2I8Zero:
499 case NVPTXISD::Suld3DV2I16Zero:
500 case NVPTXISD::Suld3DV2I32Zero:
501 case NVPTXISD::Suld3DV2I64Zero:
502 case NVPTXISD::Suld3DV4I8Zero:
503 case NVPTXISD::Suld3DV4I16Zero:
504 case NVPTXISD::Suld3DV4I32Zero:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000505 if (trySurfaceIntrinsic(N))
506 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000507 break;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000508 case ISD::AND:
509 case ISD::SRA:
510 case ISD::SRL:
511 // Try to select BFE
Justin Bogner8d83fb62016-05-13 21:12:53 +0000512 if (tryBFE(N))
513 return;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000514 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000515 case ISD::ADDRSPACECAST:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000516 SelectAddrSpaceCast(N);
517 return;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000518 default:
519 break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000520 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000521 SelectCode(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000522}
523
Justin Bogner8d83fb62016-05-13 21:12:53 +0000524bool NVPTXDAGToDAGISel::tryIntrinsicChain(SDNode *N) {
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000525 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
526 switch (IID) {
527 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000528 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000529 case Intrinsic::nvvm_ldg_global_f:
530 case Intrinsic::nvvm_ldg_global_i:
531 case Intrinsic::nvvm_ldg_global_p:
532 case Intrinsic::nvvm_ldu_global_f:
533 case Intrinsic::nvvm_ldu_global_i:
534 case Intrinsic::nvvm_ldu_global_p:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000535 return tryLDGLDU(N);
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000536 }
537}
538
Eric Christopher9745b3a2015-01-30 01:41:01 +0000539static unsigned int getCodeAddrSpace(MemSDNode *N) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +0000540 const Value *Src = N->getMemOperand()->getValue();
Justin Holewinskib96d1392013-06-10 13:29:47 +0000541
Justin Holewinskiae556d32012-05-04 20:18:50 +0000542 if (!Src)
Justin Holewinskib96d1392013-06-10 13:29:47 +0000543 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000544
Craig Toppere3dcce92015-08-01 22:20:21 +0000545 if (auto *PT = dyn_cast<PointerType>(Src->getType())) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000546 switch (PT->getAddressSpace()) {
Justin Holewinskib96d1392013-06-10 13:29:47 +0000547 case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
548 case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
549 case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
550 case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
551 case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
552 case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
553 default: break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000554 }
555 }
Justin Holewinskib96d1392013-06-10 13:29:47 +0000556 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000557}
558
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000559static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget,
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000560 unsigned CodeAddrSpace, MachineFunction *F) {
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000561 // We use ldg (i.e. ld.global.nc) for invariant loads from the global address
562 // space.
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000563 //
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000564 // We have two ways of identifying invariant loads: Loads may be explicitly
565 // marked as invariant, or we may infer them to be invariant.
566 //
567 // We currently infer invariance only for kernel function pointer params that
568 // are noalias (i.e. __restrict) and never written to.
569 //
570 // TODO: Perform a more powerful invariance analysis (ideally IPO, and ideally
571 // not during the SelectionDAG phase).
572 //
573 // TODO: Infer invariance only at -O2. We still want to use ldg at -O0 for
574 // explicitly invariant loads because these are how clang tells us to use ldg
575 // when the user uses a builtin.
576 if (!Subtarget.hasLDG() || CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL)
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000577 return false;
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000578
579 if (N->isInvariant())
580 return true;
581
582 // Load wasn't explicitly invariant. Attempt to infer invariance.
583 if (!isKernelFunction(*F->getFunction()))
584 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000585
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000586 // We use GetUnderlyingObjects() here instead of
587 // GetUnderlyingObject() mainly because the former looks through phi
588 // nodes while the latter does not. We need to look through phi
589 // nodes to handle pointer induction variables.
590 SmallVector<Value *, 8> Objs;
591 GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()),
592 Objs, F->getDataLayout());
593 for (Value *Obj : Objs) {
594 auto *A = dyn_cast<const Argument>(Obj);
595 if (!A || !A->onlyReadsMemory() || !A->hasNoAliasAttr()) return false;
596 }
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000597
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000598 return true;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000599}
600
Justin Bogner8d83fb62016-05-13 21:12:53 +0000601bool NVPTXDAGToDAGISel::tryIntrinsicNoChain(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000602 unsigned IID = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
603 switch (IID) {
604 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000605 return false;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000606 case Intrinsic::nvvm_texsurf_handle_internal:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000607 SelectTexSurfHandle(N);
608 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000609 }
610}
611
Justin Bogner8d83fb62016-05-13 21:12:53 +0000612void NVPTXDAGToDAGISel::SelectTexSurfHandle(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000613 // Op 0 is the intrinsic ID
614 SDValue Wrapper = N->getOperand(1);
615 SDValue GlobalVal = Wrapper.getOperand(0);
Justin Bogner8d83fb62016-05-13 21:12:53 +0000616 ReplaceNode(N, CurDAG->getMachineNode(NVPTX::texsurf_handles, SDLoc(N),
617 MVT::i64, GlobalVal));
Justin Holewinski30d56a72014-04-09 15:39:15 +0000618}
619
Justin Bogner8d83fb62016-05-13 21:12:53 +0000620void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000621 SDValue Src = N->getOperand(0);
622 AddrSpaceCastSDNode *CastN = cast<AddrSpaceCastSDNode>(N);
623 unsigned SrcAddrSpace = CastN->getSrcAddressSpace();
624 unsigned DstAddrSpace = CastN->getDestAddressSpace();
625
626 assert(SrcAddrSpace != DstAddrSpace &&
627 "addrspacecast must be between different address spaces");
628
629 if (DstAddrSpace == ADDRESS_SPACE_GENERIC) {
630 // Specific to generic
631 unsigned Opc;
632 switch (SrcAddrSpace) {
633 default: report_fatal_error("Bad address space in addrspacecast");
634 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000635 Opc = TM.is64Bit() ? NVPTX::cvta_global_yes_64 : NVPTX::cvta_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000636 break;
637 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000638 Opc = TM.is64Bit() ? NVPTX::cvta_shared_yes_64 : NVPTX::cvta_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000639 break;
640 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000641 Opc = TM.is64Bit() ? NVPTX::cvta_const_yes_64 : NVPTX::cvta_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000642 break;
643 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000644 Opc = TM.is64Bit() ? NVPTX::cvta_local_yes_64 : NVPTX::cvta_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000645 break;
646 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000647 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
648 Src));
649 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000650 } else {
651 // Generic to specific
652 if (SrcAddrSpace != 0)
653 report_fatal_error("Cannot cast between two non-generic address spaces");
654 unsigned Opc;
655 switch (DstAddrSpace) {
656 default: report_fatal_error("Bad address space in addrspacecast");
657 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000658 Opc = TM.is64Bit() ? NVPTX::cvta_to_global_yes_64
659 : NVPTX::cvta_to_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000660 break;
661 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000662 Opc = TM.is64Bit() ? NVPTX::cvta_to_shared_yes_64
663 : NVPTX::cvta_to_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000664 break;
665 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000666 Opc =
667 TM.is64Bit() ? NVPTX::cvta_to_const_yes_64 : NVPTX::cvta_to_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000668 break;
669 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000670 Opc =
671 TM.is64Bit() ? NVPTX::cvta_to_local_yes_64 : NVPTX::cvta_to_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000672 break;
Jingyue Wua2f60272015-06-04 21:28:26 +0000673 case ADDRESS_SPACE_PARAM:
674 Opc = TM.is64Bit() ? NVPTX::nvvm_ptr_gen_to_param_64
675 : NVPTX::nvvm_ptr_gen_to_param;
676 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000677 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000678 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
679 Src));
680 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000681 }
682}
683
Justin Bogner8d83fb62016-05-13 21:12:53 +0000684bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +0000685 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000686 LoadSDNode *LD = cast<LoadSDNode>(N);
687 EVT LoadedVT = LD->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +0000688 SDNode *NVPTXLD = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000689
690 // do not support pre/post inc/dec
691 if (LD->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000692 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000693
694 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000695 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000696
697 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000698 unsigned int codeAddrSpace = getCodeAddrSpace(LD);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000699
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000700 if (canLowerToLDG(LD, *Subtarget, codeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000701 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000702 }
703
Justin Holewinskiae556d32012-05-04 20:18:50 +0000704 // Volatile Setting
705 // - .volatile is only availalble for .global and .shared
706 bool isVolatile = LD->isVolatile();
707 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
708 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
709 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
710 isVolatile = false;
711
712 // Vector Setting
713 MVT SimpleVT = LoadedVT.getSimpleVT();
714 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
715 if (SimpleVT.isVector()) {
716 unsigned num = SimpleVT.getVectorNumElements();
717 if (num == 2)
718 vecType = NVPTX::PTXLdStInstCode::V2;
719 else if (num == 4)
720 vecType = NVPTX::PTXLdStInstCode::V4;
721 else
Justin Bogner8d83fb62016-05-13 21:12:53 +0000722 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000723 }
724
725 // Type Setting: fromType + fromTypeWidth
726 //
727 // Sign : ISD::SEXTLOAD
728 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
729 // type is integer
730 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
731 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +0000732 // Read at least 8 bits (predicates are stored as 8-bit values)
733 unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskiae556d32012-05-04 20:18:50 +0000734 unsigned int fromType;
735 if ((LD->getExtensionType() == ISD::SEXTLOAD))
736 fromType = NVPTX::PTXLdStInstCode::Signed;
737 else if (ScalarVT.isFloatingPoint())
738 fromType = NVPTX::PTXLdStInstCode::Float;
739 else
740 fromType = NVPTX::PTXLdStInstCode::Unsigned;
741
742 // Create the machine instruction DAG
743 SDValue Chain = N->getOperand(0);
744 SDValue N1 = N->getOperand(1);
745 SDValue Addr;
746 SDValue Offset, Base;
747 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +0000748 MVT::SimpleValueType TargetVT = LD->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000749
750 if (SelectDirectAddr(N1, Addr)) {
751 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000752 case MVT::i8:
753 Opcode = NVPTX::LD_i8_avar;
754 break;
755 case MVT::i16:
756 Opcode = NVPTX::LD_i16_avar;
757 break;
758 case MVT::i32:
759 Opcode = NVPTX::LD_i32_avar;
760 break;
761 case MVT::i64:
762 Opcode = NVPTX::LD_i64_avar;
763 break;
764 case MVT::f32:
765 Opcode = NVPTX::LD_f32_avar;
766 break;
767 case MVT::f64:
768 Opcode = NVPTX::LD_f64_avar;
769 break;
770 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000771 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000772 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000773 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
774 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
775 getI32Imm(fromTypeWidth, dl), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000776 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000777 } else if (TM.is64Bit() ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
778 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000779 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000780 case MVT::i8:
781 Opcode = NVPTX::LD_i8_asi;
782 break;
783 case MVT::i16:
784 Opcode = NVPTX::LD_i16_asi;
785 break;
786 case MVT::i32:
787 Opcode = NVPTX::LD_i32_asi;
788 break;
789 case MVT::i64:
790 Opcode = NVPTX::LD_i64_asi;
791 break;
792 case MVT::f32:
793 Opcode = NVPTX::LD_f32_asi;
794 break;
795 case MVT::f64:
796 Opcode = NVPTX::LD_f64_asi;
797 break;
798 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000799 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000800 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000801 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
802 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
803 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000804 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000805 } else if (TM.is64Bit() ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
806 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
807 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000808 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000809 case MVT::i8:
810 Opcode = NVPTX::LD_i8_ari_64;
811 break;
812 case MVT::i16:
813 Opcode = NVPTX::LD_i16_ari_64;
814 break;
815 case MVT::i32:
816 Opcode = NVPTX::LD_i32_ari_64;
817 break;
818 case MVT::i64:
819 Opcode = NVPTX::LD_i64_ari_64;
820 break;
821 case MVT::f32:
822 Opcode = NVPTX::LD_f32_ari_64;
823 break;
824 case MVT::f64:
825 Opcode = NVPTX::LD_f64_ari_64;
826 break;
827 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000828 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000829 }
830 } else {
831 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000832 case MVT::i8:
833 Opcode = NVPTX::LD_i8_ari;
834 break;
835 case MVT::i16:
836 Opcode = NVPTX::LD_i16_ari;
837 break;
838 case MVT::i32:
839 Opcode = NVPTX::LD_i32_ari;
840 break;
841 case MVT::i64:
842 Opcode = NVPTX::LD_i64_ari;
843 break;
844 case MVT::f32:
845 Opcode = NVPTX::LD_f32_ari;
846 break;
847 case MVT::f64:
848 Opcode = NVPTX::LD_f64_ari;
849 break;
850 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000851 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000852 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000853 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000854 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
855 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
856 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000857 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinski0497ab12013-03-30 14:29:21 +0000858 } else {
Eric Christopher02389e32015-02-19 00:08:27 +0000859 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000860 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000861 case MVT::i8:
862 Opcode = NVPTX::LD_i8_areg_64;
863 break;
864 case MVT::i16:
865 Opcode = NVPTX::LD_i16_areg_64;
866 break;
867 case MVT::i32:
868 Opcode = NVPTX::LD_i32_areg_64;
869 break;
870 case MVT::i64:
871 Opcode = NVPTX::LD_i64_areg_64;
872 break;
873 case MVT::f32:
874 Opcode = NVPTX::LD_f32_areg_64;
875 break;
876 case MVT::f64:
877 Opcode = NVPTX::LD_f64_areg_64;
878 break;
879 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000880 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000881 }
882 } else {
883 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000884 case MVT::i8:
885 Opcode = NVPTX::LD_i8_areg;
886 break;
887 case MVT::i16:
888 Opcode = NVPTX::LD_i16_areg;
889 break;
890 case MVT::i32:
891 Opcode = NVPTX::LD_i32_areg;
892 break;
893 case MVT::i64:
894 Opcode = NVPTX::LD_i64_areg;
895 break;
896 case MVT::f32:
897 Opcode = NVPTX::LD_f32_areg;
898 break;
899 case MVT::f64:
900 Opcode = NVPTX::LD_f64_areg;
901 break;
902 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000903 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000904 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000905 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000906 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
907 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
908 getI32Imm(fromTypeWidth, dl), N1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000909 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000910 }
911
Justin Bogner8d83fb62016-05-13 21:12:53 +0000912 if (!NVPTXLD)
913 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000914
Justin Bogner8d83fb62016-05-13 21:12:53 +0000915 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
916 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
917 cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
918
919 ReplaceNode(N, NVPTXLD);
920 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000921}
922
Justin Bogner8d83fb62016-05-13 21:12:53 +0000923bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000924
925 SDValue Chain = N->getOperand(0);
926 SDValue Op1 = N->getOperand(1);
927 SDValue Addr, Offset, Base;
928 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +0000929 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000930 SDNode *LD;
931 MemSDNode *MemSD = cast<MemSDNode>(N);
932 EVT LoadedVT = MemSD->getMemoryVT();
933
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000934 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000935 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000936
937 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000938 unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000939
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000940 if (canLowerToLDG(MemSD, *Subtarget, CodeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000941 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000942 }
943
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000944 // Volatile Setting
945 // - .volatile is only availalble for .global and .shared
946 bool IsVolatile = MemSD->isVolatile();
947 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
948 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
949 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
950 IsVolatile = false;
951
952 // Vector Setting
953 MVT SimpleVT = LoadedVT.getSimpleVT();
954
955 // Type Setting: fromType + fromTypeWidth
956 //
957 // Sign : ISD::SEXTLOAD
958 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
959 // type is integer
960 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
961 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +0000962 // Read at least 8 bits (predicates are stored as 8-bit values)
963 unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000964 unsigned int FromType;
965 // The last operand holds the original LoadSDNode::getExtensionType() value
Justin Holewinski0497ab12013-03-30 14:29:21 +0000966 unsigned ExtensionType = cast<ConstantSDNode>(
967 N->getOperand(N->getNumOperands() - 1))->getZExtValue();
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000968 if (ExtensionType == ISD::SEXTLOAD)
969 FromType = NVPTX::PTXLdStInstCode::Signed;
970 else if (ScalarVT.isFloatingPoint())
971 FromType = NVPTX::PTXLdStInstCode::Float;
972 else
973 FromType = NVPTX::PTXLdStInstCode::Unsigned;
974
975 unsigned VecType;
976
977 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000978 case NVPTXISD::LoadV2:
979 VecType = NVPTX::PTXLdStInstCode::V2;
980 break;
981 case NVPTXISD::LoadV4:
982 VecType = NVPTX::PTXLdStInstCode::V4;
983 break;
984 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000985 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000986 }
987
988 EVT EltVT = N->getValueType(0);
989
990 if (SelectDirectAddr(Op1, Addr)) {
991 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000992 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000993 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000994 case NVPTXISD::LoadV2:
995 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000996 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000997 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000998 case MVT::i8:
999 Opcode = NVPTX::LDV_i8_v2_avar;
1000 break;
1001 case MVT::i16:
1002 Opcode = NVPTX::LDV_i16_v2_avar;
1003 break;
1004 case MVT::i32:
1005 Opcode = NVPTX::LDV_i32_v2_avar;
1006 break;
1007 case MVT::i64:
1008 Opcode = NVPTX::LDV_i64_v2_avar;
1009 break;
1010 case MVT::f32:
1011 Opcode = NVPTX::LDV_f32_v2_avar;
1012 break;
1013 case MVT::f64:
1014 Opcode = NVPTX::LDV_f64_v2_avar;
1015 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001016 }
1017 break;
1018 case NVPTXISD::LoadV4:
1019 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001020 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001021 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001022 case MVT::i8:
1023 Opcode = NVPTX::LDV_i8_v4_avar;
1024 break;
1025 case MVT::i16:
1026 Opcode = NVPTX::LDV_i16_v4_avar;
1027 break;
1028 case MVT::i32:
1029 Opcode = NVPTX::LDV_i32_v4_avar;
1030 break;
1031 case MVT::f32:
1032 Opcode = NVPTX::LDV_f32_v4_avar;
1033 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001034 }
1035 break;
1036 }
1037
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001038 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1039 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1040 getI32Imm(FromTypeWidth, DL), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001041 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001042 } else if (TM.is64Bit() ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
1043 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001044 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001045 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001046 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001047 case NVPTXISD::LoadV2:
1048 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001049 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001050 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001051 case MVT::i8:
1052 Opcode = NVPTX::LDV_i8_v2_asi;
1053 break;
1054 case MVT::i16:
1055 Opcode = NVPTX::LDV_i16_v2_asi;
1056 break;
1057 case MVT::i32:
1058 Opcode = NVPTX::LDV_i32_v2_asi;
1059 break;
1060 case MVT::i64:
1061 Opcode = NVPTX::LDV_i64_v2_asi;
1062 break;
1063 case MVT::f32:
1064 Opcode = NVPTX::LDV_f32_v2_asi;
1065 break;
1066 case MVT::f64:
1067 Opcode = NVPTX::LDV_f64_v2_asi;
1068 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001069 }
1070 break;
1071 case NVPTXISD::LoadV4:
1072 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001073 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001074 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001075 case MVT::i8:
1076 Opcode = NVPTX::LDV_i8_v4_asi;
1077 break;
1078 case MVT::i16:
1079 Opcode = NVPTX::LDV_i16_v4_asi;
1080 break;
1081 case MVT::i32:
1082 Opcode = NVPTX::LDV_i32_v4_asi;
1083 break;
1084 case MVT::f32:
1085 Opcode = NVPTX::LDV_f32_v4_asi;
1086 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001087 }
1088 break;
1089 }
1090
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001091 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1092 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1093 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001094 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001095 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1096 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1097 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001098 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001099 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001100 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001101 case NVPTXISD::LoadV2:
1102 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001103 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001104 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001105 case MVT::i8:
1106 Opcode = NVPTX::LDV_i8_v2_ari_64;
1107 break;
1108 case MVT::i16:
1109 Opcode = NVPTX::LDV_i16_v2_ari_64;
1110 break;
1111 case MVT::i32:
1112 Opcode = NVPTX::LDV_i32_v2_ari_64;
1113 break;
1114 case MVT::i64:
1115 Opcode = NVPTX::LDV_i64_v2_ari_64;
1116 break;
1117 case MVT::f32:
1118 Opcode = NVPTX::LDV_f32_v2_ari_64;
1119 break;
1120 case MVT::f64:
1121 Opcode = NVPTX::LDV_f64_v2_ari_64;
1122 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001123 }
1124 break;
1125 case NVPTXISD::LoadV4:
1126 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001127 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001128 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001129 case MVT::i8:
1130 Opcode = NVPTX::LDV_i8_v4_ari_64;
1131 break;
1132 case MVT::i16:
1133 Opcode = NVPTX::LDV_i16_v4_ari_64;
1134 break;
1135 case MVT::i32:
1136 Opcode = NVPTX::LDV_i32_v4_ari_64;
1137 break;
1138 case MVT::f32:
1139 Opcode = NVPTX::LDV_f32_v4_ari_64;
1140 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001141 }
1142 break;
1143 }
1144 } else {
1145 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001146 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001147 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001148 case NVPTXISD::LoadV2:
1149 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001150 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001151 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001152 case MVT::i8:
1153 Opcode = NVPTX::LDV_i8_v2_ari;
1154 break;
1155 case MVT::i16:
1156 Opcode = NVPTX::LDV_i16_v2_ari;
1157 break;
1158 case MVT::i32:
1159 Opcode = NVPTX::LDV_i32_v2_ari;
1160 break;
1161 case MVT::i64:
1162 Opcode = NVPTX::LDV_i64_v2_ari;
1163 break;
1164 case MVT::f32:
1165 Opcode = NVPTX::LDV_f32_v2_ari;
1166 break;
1167 case MVT::f64:
1168 Opcode = NVPTX::LDV_f64_v2_ari;
1169 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001170 }
1171 break;
1172 case NVPTXISD::LoadV4:
1173 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001174 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001175 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001176 case MVT::i8:
1177 Opcode = NVPTX::LDV_i8_v4_ari;
1178 break;
1179 case MVT::i16:
1180 Opcode = NVPTX::LDV_i16_v4_ari;
1181 break;
1182 case MVT::i32:
1183 Opcode = NVPTX::LDV_i32_v4_ari;
1184 break;
1185 case MVT::f32:
1186 Opcode = NVPTX::LDV_f32_v4_ari;
1187 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001188 }
1189 break;
1190 }
1191 }
1192
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001193 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1194 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1195 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001196
Michael Liaob53d8962013-04-19 22:22:57 +00001197 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001198 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001199 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001200 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001201 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001202 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001203 case NVPTXISD::LoadV2:
1204 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001205 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001206 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001207 case MVT::i8:
1208 Opcode = NVPTX::LDV_i8_v2_areg_64;
1209 break;
1210 case MVT::i16:
1211 Opcode = NVPTX::LDV_i16_v2_areg_64;
1212 break;
1213 case MVT::i32:
1214 Opcode = NVPTX::LDV_i32_v2_areg_64;
1215 break;
1216 case MVT::i64:
1217 Opcode = NVPTX::LDV_i64_v2_areg_64;
1218 break;
1219 case MVT::f32:
1220 Opcode = NVPTX::LDV_f32_v2_areg_64;
1221 break;
1222 case MVT::f64:
1223 Opcode = NVPTX::LDV_f64_v2_areg_64;
1224 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001225 }
1226 break;
1227 case NVPTXISD::LoadV4:
1228 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001229 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001230 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001231 case MVT::i8:
1232 Opcode = NVPTX::LDV_i8_v4_areg_64;
1233 break;
1234 case MVT::i16:
1235 Opcode = NVPTX::LDV_i16_v4_areg_64;
1236 break;
1237 case MVT::i32:
1238 Opcode = NVPTX::LDV_i32_v4_areg_64;
1239 break;
1240 case MVT::f32:
1241 Opcode = NVPTX::LDV_f32_v4_areg_64;
1242 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001243 }
1244 break;
1245 }
1246 } else {
1247 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001248 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001249 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001250 case NVPTXISD::LoadV2:
1251 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001252 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001253 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001254 case MVT::i8:
1255 Opcode = NVPTX::LDV_i8_v2_areg;
1256 break;
1257 case MVT::i16:
1258 Opcode = NVPTX::LDV_i16_v2_areg;
1259 break;
1260 case MVT::i32:
1261 Opcode = NVPTX::LDV_i32_v2_areg;
1262 break;
1263 case MVT::i64:
1264 Opcode = NVPTX::LDV_i64_v2_areg;
1265 break;
1266 case MVT::f32:
1267 Opcode = NVPTX::LDV_f32_v2_areg;
1268 break;
1269 case MVT::f64:
1270 Opcode = NVPTX::LDV_f64_v2_areg;
1271 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001272 }
1273 break;
1274 case NVPTXISD::LoadV4:
1275 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001276 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001277 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001278 case MVT::i8:
1279 Opcode = NVPTX::LDV_i8_v4_areg;
1280 break;
1281 case MVT::i16:
1282 Opcode = NVPTX::LDV_i16_v4_areg;
1283 break;
1284 case MVT::i32:
1285 Opcode = NVPTX::LDV_i32_v4_areg;
1286 break;
1287 case MVT::f32:
1288 Opcode = NVPTX::LDV_f32_v4_areg;
1289 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001290 }
1291 break;
1292 }
1293 }
1294
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001295 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1296 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1297 getI32Imm(FromTypeWidth, DL), Op1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001298 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001299 }
1300
1301 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1302 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1303 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1304
Justin Bogner8d83fb62016-05-13 21:12:53 +00001305 ReplaceNode(N, LD);
1306 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001307}
1308
Justin Bogner8d83fb62016-05-13 21:12:53 +00001309bool NVPTXDAGToDAGISel::tryLDGLDU(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001310
1311 SDValue Chain = N->getOperand(0);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001312 SDValue Op1;
1313 MemSDNode *Mem;
1314 bool IsLDG = true;
1315
Justin Holewinskic7997922016-04-05 12:38:01 +00001316 // If this is an LDG intrinsic, the address is the third operand. If its an
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001317 // LDG/LDU SD node (from custom vector handling), then its the second operand
1318 if (N->getOpcode() == ISD::INTRINSIC_W_CHAIN) {
1319 Op1 = N->getOperand(2);
1320 Mem = cast<MemIntrinsicSDNode>(N);
1321 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
1322 switch (IID) {
1323 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001324 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001325 case Intrinsic::nvvm_ldg_global_f:
1326 case Intrinsic::nvvm_ldg_global_i:
1327 case Intrinsic::nvvm_ldg_global_p:
1328 IsLDG = true;
1329 break;
1330 case Intrinsic::nvvm_ldu_global_f:
1331 case Intrinsic::nvvm_ldu_global_i:
1332 case Intrinsic::nvvm_ldu_global_p:
1333 IsLDG = false;
1334 break;
1335 }
1336 } else {
1337 Op1 = N->getOperand(1);
1338 Mem = cast<MemSDNode>(N);
1339 }
1340
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001341 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00001342 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001343 SDNode *LD;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001344 SDValue Base, Offset, Addr;
Justin Holewinskif8f70912013-06-28 17:57:59 +00001345
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001346 EVT EltVT = Mem->getMemoryVT();
Justin Holewinskic7997922016-04-05 12:38:01 +00001347 unsigned NumElts = 1;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001348 if (EltVT.isVector()) {
Justin Holewinskic7997922016-04-05 12:38:01 +00001349 NumElts = EltVT.getVectorNumElements();
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001350 EltVT = EltVT.getVectorElementType();
1351 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001352
Justin Holewinskic7997922016-04-05 12:38:01 +00001353 // Build the "promoted" result VTList for the load. If we are really loading
1354 // i8s, then the return type will be promoted to i16 since we do not expose
1355 // 8-bit registers in NVPTX.
1356 EVT NodeVT = (EltVT == MVT::i8) ? MVT::i16 : EltVT;
1357 SmallVector<EVT, 5> InstVTs;
1358 for (unsigned i = 0; i != NumElts; ++i) {
1359 InstVTs.push_back(NodeVT);
1360 }
1361 InstVTs.push_back(MVT::Other);
1362 SDVTList InstVTList = CurDAG->getVTList(InstVTs);
1363
Justin Holewinskie40e9292013-07-01 12:58:52 +00001364 if (SelectDirectAddr(Op1, Addr)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001365 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001366 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001367 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001368 case ISD::INTRINSIC_W_CHAIN:
1369 if (IsLDG) {
1370 switch (EltVT.getSimpleVT().SimpleTy) {
1371 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001372 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001373 case MVT::i8:
1374 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8avar;
1375 break;
1376 case MVT::i16:
1377 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16avar;
1378 break;
1379 case MVT::i32:
1380 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32avar;
1381 break;
1382 case MVT::i64:
1383 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64avar;
1384 break;
1385 case MVT::f32:
1386 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32avar;
1387 break;
1388 case MVT::f64:
1389 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64avar;
1390 break;
1391 }
1392 } else {
1393 switch (EltVT.getSimpleVT().SimpleTy) {
1394 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001395 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001396 case MVT::i8:
1397 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8avar;
1398 break;
1399 case MVT::i16:
1400 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16avar;
1401 break;
1402 case MVT::i32:
1403 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32avar;
1404 break;
1405 case MVT::i64:
1406 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64avar;
1407 break;
1408 case MVT::f32:
1409 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32avar;
1410 break;
1411 case MVT::f64:
1412 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64avar;
1413 break;
1414 }
1415 }
1416 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001417 case NVPTXISD::LDGV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001418 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001419 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001420 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001421 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001422 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001423 break;
1424 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001425 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001426 break;
1427 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001428 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001429 break;
1430 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001431 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001432 break;
1433 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001434 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001435 break;
1436 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001437 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001438 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001439 }
1440 break;
1441 case NVPTXISD::LDUV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001442 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001443 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001444 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001445 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001446 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001447 break;
1448 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001449 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001450 break;
1451 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001452 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001453 break;
1454 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001455 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001456 break;
1457 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001458 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001459 break;
1460 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001461 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
1462 break;
1463 }
1464 break;
1465 case NVPTXISD::LDGV4:
1466 switch (EltVT.getSimpleVT().SimpleTy) {
1467 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001468 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001469 case MVT::i8:
1470 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
1471 break;
1472 case MVT::i16:
1473 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
1474 break;
1475 case MVT::i32:
1476 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
1477 break;
1478 case MVT::f32:
1479 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001480 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001481 }
1482 break;
1483 case NVPTXISD::LDUV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001484 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001485 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001486 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001487 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001488 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001489 break;
1490 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001491 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001492 break;
1493 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001494 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001495 break;
1496 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001497 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001498 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001499 }
1500 break;
1501 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001502
1503 SDValue Ops[] = { Addr, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00001504 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001505 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1506 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1507 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001508 switch (N->getOpcode()) {
1509 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001510 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001511 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001512 case ISD::INTRINSIC_W_CHAIN:
1513 if (IsLDG) {
1514 switch (EltVT.getSimpleVT().SimpleTy) {
1515 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001516 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001517 case MVT::i8:
1518 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari64;
1519 break;
1520 case MVT::i16:
1521 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari64;
1522 break;
1523 case MVT::i32:
1524 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari64;
1525 break;
1526 case MVT::i64:
1527 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari64;
1528 break;
1529 case MVT::f32:
1530 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari64;
1531 break;
1532 case MVT::f64:
1533 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari64;
1534 break;
1535 }
1536 } else {
1537 switch (EltVT.getSimpleVT().SimpleTy) {
1538 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001539 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001540 case MVT::i8:
1541 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari64;
1542 break;
1543 case MVT::i16:
1544 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari64;
1545 break;
1546 case MVT::i32:
1547 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari64;
1548 break;
1549 case MVT::i64:
1550 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari64;
1551 break;
1552 case MVT::f32:
1553 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari64;
1554 break;
1555 case MVT::f64:
1556 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari64;
1557 break;
1558 }
1559 }
1560 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001561 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001562 case NVPTXISD::LDGV2:
1563 switch (EltVT.getSimpleVT().SimpleTy) {
1564 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001565 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001566 case MVT::i8:
1567 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
1568 break;
1569 case MVT::i16:
1570 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
1571 break;
1572 case MVT::i32:
1573 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
1574 break;
1575 case MVT::i64:
1576 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
1577 break;
1578 case MVT::f32:
1579 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
1580 break;
1581 case MVT::f64:
1582 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
1583 break;
1584 }
1585 break;
1586 case NVPTXISD::LDUV2:
1587 switch (EltVT.getSimpleVT().SimpleTy) {
1588 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001589 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001590 case MVT::i8:
1591 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
1592 break;
1593 case MVT::i16:
1594 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
1595 break;
1596 case MVT::i32:
1597 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
1598 break;
1599 case MVT::i64:
1600 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
1601 break;
1602 case MVT::f32:
1603 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
1604 break;
1605 case MVT::f64:
1606 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
1607 break;
1608 }
1609 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001610 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001611 case NVPTXISD::LDGV4:
1612 switch (EltVT.getSimpleVT().SimpleTy) {
1613 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001614 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001615 case MVT::i8:
1616 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
1617 break;
1618 case MVT::i16:
1619 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
1620 break;
1621 case MVT::i32:
1622 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
1623 break;
1624 case MVT::f32:
1625 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
1626 break;
1627 }
1628 break;
1629 case NVPTXISD::LDUV4:
1630 switch (EltVT.getSimpleVT().SimpleTy) {
1631 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001632 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001633 case MVT::i8:
1634 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
1635 break;
1636 case MVT::i16:
1637 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
1638 break;
1639 case MVT::i32:
1640 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1641 break;
1642 case MVT::f32:
1643 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1644 break;
1645 }
1646 break;
1647 }
1648 } else {
1649 switch (N->getOpcode()) {
1650 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001651 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001652 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001653 case ISD::INTRINSIC_W_CHAIN:
1654 if (IsLDG) {
1655 switch (EltVT.getSimpleVT().SimpleTy) {
1656 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001657 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001658 case MVT::i8:
1659 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari;
1660 break;
1661 case MVT::i16:
1662 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari;
1663 break;
1664 case MVT::i32:
1665 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari;
1666 break;
1667 case MVT::i64:
1668 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari;
1669 break;
1670 case MVT::f32:
1671 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari;
1672 break;
1673 case MVT::f64:
1674 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari;
1675 break;
1676 }
1677 } else {
1678 switch (EltVT.getSimpleVT().SimpleTy) {
1679 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001680 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001681 case MVT::i8:
1682 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari;
1683 break;
1684 case MVT::i16:
1685 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari;
1686 break;
1687 case MVT::i32:
1688 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari;
1689 break;
1690 case MVT::i64:
1691 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari;
1692 break;
1693 case MVT::f32:
1694 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari;
1695 break;
1696 case MVT::f64:
1697 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari;
1698 break;
1699 }
1700 }
1701 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001702 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001703 case NVPTXISD::LDGV2:
1704 switch (EltVT.getSimpleVT().SimpleTy) {
1705 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001706 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001707 case MVT::i8:
1708 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1709 break;
1710 case MVT::i16:
1711 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1712 break;
1713 case MVT::i32:
1714 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1715 break;
1716 case MVT::i64:
1717 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1718 break;
1719 case MVT::f32:
1720 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1721 break;
1722 case MVT::f64:
1723 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1724 break;
1725 }
1726 break;
1727 case NVPTXISD::LDUV2:
1728 switch (EltVT.getSimpleVT().SimpleTy) {
1729 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001730 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001731 case MVT::i8:
1732 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1733 break;
1734 case MVT::i16:
1735 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1736 break;
1737 case MVT::i32:
1738 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1739 break;
1740 case MVT::i64:
1741 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1742 break;
1743 case MVT::f32:
1744 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1745 break;
1746 case MVT::f64:
1747 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1748 break;
1749 }
1750 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001751 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001752 case NVPTXISD::LDGV4:
1753 switch (EltVT.getSimpleVT().SimpleTy) {
1754 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001755 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001756 case MVT::i8:
1757 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1758 break;
1759 case MVT::i16:
1760 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1761 break;
1762 case MVT::i32:
1763 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1764 break;
1765 case MVT::f32:
1766 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1767 break;
1768 }
1769 break;
1770 case NVPTXISD::LDUV4:
1771 switch (EltVT.getSimpleVT().SimpleTy) {
1772 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001773 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001774 case MVT::i8:
1775 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1776 break;
1777 case MVT::i16:
1778 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1779 break;
1780 case MVT::i32:
1781 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1782 break;
1783 case MVT::f32:
1784 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1785 break;
1786 }
1787 break;
1788 }
1789 }
1790
1791 SDValue Ops[] = { Base, Offset, Chain };
1792
Justin Holewinskic7997922016-04-05 12:38:01 +00001793 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001794 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001795 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001796 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001797 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001798 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001799 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001800 case ISD::INTRINSIC_W_CHAIN:
1801 if (IsLDG) {
1802 switch (EltVT.getSimpleVT().SimpleTy) {
1803 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001804 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001805 case MVT::i8:
1806 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg64;
1807 break;
1808 case MVT::i16:
1809 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg64;
1810 break;
1811 case MVT::i32:
1812 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg64;
1813 break;
1814 case MVT::i64:
1815 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg64;
1816 break;
1817 case MVT::f32:
1818 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg64;
1819 break;
1820 case MVT::f64:
1821 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg64;
1822 break;
1823 }
1824 } else {
1825 switch (EltVT.getSimpleVT().SimpleTy) {
1826 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001827 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001828 case MVT::i8:
1829 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg64;
1830 break;
1831 case MVT::i16:
1832 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg64;
1833 break;
1834 case MVT::i32:
1835 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg64;
1836 break;
1837 case MVT::i64:
1838 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg64;
1839 break;
1840 case MVT::f32:
1841 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg64;
1842 break;
1843 case MVT::f64:
1844 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg64;
1845 break;
1846 }
1847 }
1848 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001849 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001850 case NVPTXISD::LDGV2:
1851 switch (EltVT.getSimpleVT().SimpleTy) {
1852 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001853 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001854 case MVT::i8:
1855 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1856 break;
1857 case MVT::i16:
1858 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1859 break;
1860 case MVT::i32:
1861 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1862 break;
1863 case MVT::i64:
1864 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1865 break;
1866 case MVT::f32:
1867 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1868 break;
1869 case MVT::f64:
1870 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1871 break;
1872 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001873 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001874 case NVPTXISD::LDUV2:
1875 switch (EltVT.getSimpleVT().SimpleTy) {
1876 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001877 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001878 case MVT::i8:
1879 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1880 break;
1881 case MVT::i16:
1882 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1883 break;
1884 case MVT::i32:
1885 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1886 break;
1887 case MVT::i64:
1888 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1889 break;
1890 case MVT::f32:
1891 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1892 break;
1893 case MVT::f64:
1894 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1895 break;
1896 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001897 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001898 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001899 case NVPTXISD::LDGV4:
1900 switch (EltVT.getSimpleVT().SimpleTy) {
1901 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001902 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001903 case MVT::i8:
1904 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1905 break;
1906 case MVT::i16:
1907 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1908 break;
1909 case MVT::i32:
1910 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1911 break;
1912 case MVT::f32:
1913 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1914 break;
1915 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001916 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001917 case NVPTXISD::LDUV4:
1918 switch (EltVT.getSimpleVT().SimpleTy) {
1919 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001920 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001921 case MVT::i8:
1922 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1923 break;
1924 case MVT::i16:
1925 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1926 break;
1927 case MVT::i32:
1928 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1929 break;
1930 case MVT::f32:
1931 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1932 break;
1933 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001934 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001935 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001936 } else {
1937 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001938 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001939 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001940 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001941 case ISD::INTRINSIC_W_CHAIN:
1942 if (IsLDG) {
1943 switch (EltVT.getSimpleVT().SimpleTy) {
1944 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001945 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001946 case MVT::i8:
1947 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg;
1948 break;
1949 case MVT::i16:
1950 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg;
1951 break;
1952 case MVT::i32:
1953 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg;
1954 break;
1955 case MVT::i64:
1956 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg;
1957 break;
1958 case MVT::f32:
1959 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg;
1960 break;
1961 case MVT::f64:
1962 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg;
1963 break;
1964 }
1965 } else {
1966 switch (EltVT.getSimpleVT().SimpleTy) {
1967 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001968 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001969 case MVT::i8:
1970 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg;
1971 break;
1972 case MVT::i16:
1973 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg;
1974 break;
1975 case MVT::i32:
1976 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg;
1977 break;
1978 case MVT::i64:
1979 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg;
1980 break;
1981 case MVT::f32:
1982 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg;
1983 break;
1984 case MVT::f64:
1985 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg;
1986 break;
1987 }
1988 }
1989 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001990 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001991 case NVPTXISD::LDGV2:
1992 switch (EltVT.getSimpleVT().SimpleTy) {
1993 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001994 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001995 case MVT::i8:
1996 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
1997 break;
1998 case MVT::i16:
1999 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
2000 break;
2001 case MVT::i32:
2002 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
2003 break;
2004 case MVT::i64:
2005 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
2006 break;
2007 case MVT::f32:
2008 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
2009 break;
2010 case MVT::f64:
2011 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
2012 break;
2013 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002014 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002015 case NVPTXISD::LDUV2:
2016 switch (EltVT.getSimpleVT().SimpleTy) {
2017 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002018 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002019 case MVT::i8:
2020 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
2021 break;
2022 case MVT::i16:
2023 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
2024 break;
2025 case MVT::i32:
2026 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
2027 break;
2028 case MVT::i64:
2029 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
2030 break;
2031 case MVT::f32:
2032 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
2033 break;
2034 case MVT::f64:
2035 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
2036 break;
2037 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002038 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00002039 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00002040 case NVPTXISD::LDGV4:
2041 switch (EltVT.getSimpleVT().SimpleTy) {
2042 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002043 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002044 case MVT::i8:
2045 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
2046 break;
2047 case MVT::i16:
2048 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
2049 break;
2050 case MVT::i32:
2051 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
2052 break;
2053 case MVT::f32:
2054 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
2055 break;
2056 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002057 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002058 case NVPTXISD::LDUV4:
2059 switch (EltVT.getSimpleVT().SimpleTy) {
2060 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002061 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002062 case MVT::i8:
2063 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
2064 break;
2065 case MVT::i16:
2066 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
2067 break;
2068 case MVT::i32:
2069 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
2070 break;
2071 case MVT::f32:
2072 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
2073 break;
2074 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002075 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002076 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002077 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002078
Justin Holewinskie40e9292013-07-01 12:58:52 +00002079 SDValue Ops[] = { Op1, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00002080 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskie40e9292013-07-01 12:58:52 +00002081 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002082
2083 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00002084 MemRefs0[0] = Mem->getMemOperand();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002085 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
2086
Justin Holewinskic7997922016-04-05 12:38:01 +00002087 // For automatic generation of LDG (through SelectLoad[Vector], not the
2088 // intrinsics), we may have an extending load like:
2089 //
2090 // i32,ch = load<LD1[%data1(addrspace=1)], zext from i8> t0, t7, undef:i64
2091 //
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002092 // In this case, the matching logic above will select a load for the original
2093 // memory type (in this case, i8) and our types will not match (the node needs
2094 // to return an i32 in this case). Our LDG/LDU nodes do not support the
2095 // concept of sign-/zero-extension, so emulate it here by adding an explicit
2096 // CVT instruction. Ptxas should clean up any redundancies here.
2097
Justin Holewinskic7997922016-04-05 12:38:01 +00002098 EVT OrigType = N->getValueType(0);
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002099 LoadSDNode *LdNode = dyn_cast<LoadSDNode>(N);
Justin Holewinskic7997922016-04-05 12:38:01 +00002100
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002101 if (OrigType != EltVT && LdNode) {
2102 // We have an extending-load. The instruction we selected operates on the
2103 // smaller type, but the SDNode we are replacing has the larger type. We
2104 // need to emit a CVT to make the types match.
2105 bool IsSigned = LdNode->getExtensionType() == ISD::SEXTLOAD;
2106 unsigned CvtOpc = GetConvertOpcode(OrigType.getSimpleVT(),
2107 EltVT.getSimpleVT(), IsSigned);
Justin Holewinskic7997922016-04-05 12:38:01 +00002108
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002109 // For each output value, apply the manual sign/zero-extension and make sure
2110 // all users of the load go through that CVT.
Justin Holewinskic7997922016-04-05 12:38:01 +00002111 for (unsigned i = 0; i != NumElts; ++i) {
2112 SDValue Res(LD, i);
2113 SDValue OrigVal(N, i);
2114
2115 SDNode *CvtNode =
2116 CurDAG->getMachineNode(CvtOpc, DL, OrigType, Res,
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002117 CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2118 DL, MVT::i32));
Justin Holewinskic7997922016-04-05 12:38:01 +00002119 ReplaceUses(OrigVal, SDValue(CvtNode, 0));
2120 }
2121 }
2122
Justin Bogner8d83fb62016-05-13 21:12:53 +00002123 ReplaceNode(N, LD);
2124 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002125}
2126
Justin Bogner8d83fb62016-05-13 21:12:53 +00002127bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +00002128 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002129 StoreSDNode *ST = cast<StoreSDNode>(N);
2130 EVT StoreVT = ST->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +00002131 SDNode *NVPTXST = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002132
2133 // do not support pre/post inc/dec
2134 if (ST->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002135 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002136
2137 if (!StoreVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002138 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002139
2140 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002141 unsigned int codeAddrSpace = getCodeAddrSpace(ST);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002142
2143 // Volatile Setting
2144 // - .volatile is only availalble for .global and .shared
2145 bool isVolatile = ST->isVolatile();
2146 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2147 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2148 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2149 isVolatile = false;
2150
2151 // Vector Setting
2152 MVT SimpleVT = StoreVT.getSimpleVT();
2153 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
2154 if (SimpleVT.isVector()) {
2155 unsigned num = SimpleVT.getVectorNumElements();
2156 if (num == 2)
2157 vecType = NVPTX::PTXLdStInstCode::V2;
2158 else if (num == 4)
2159 vecType = NVPTX::PTXLdStInstCode::V4;
2160 else
Justin Bogner8d83fb62016-05-13 21:12:53 +00002161 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002162 }
2163
2164 // Type Setting: toType + toTypeWidth
2165 // - for integer type, always use 'u'
2166 //
2167 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002168 unsigned toTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskiae556d32012-05-04 20:18:50 +00002169 unsigned int toType;
2170 if (ScalarVT.isFloatingPoint())
2171 toType = NVPTX::PTXLdStInstCode::Float;
2172 else
2173 toType = NVPTX::PTXLdStInstCode::Unsigned;
2174
2175 // Create the machine instruction DAG
2176 SDValue Chain = N->getOperand(0);
2177 SDValue N1 = N->getOperand(1);
2178 SDValue N2 = N->getOperand(2);
2179 SDValue Addr;
2180 SDValue Offset, Base;
2181 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +00002182 MVT::SimpleValueType SourceVT = N1.getNode()->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002183
2184 if (SelectDirectAddr(N2, Addr)) {
2185 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002186 case MVT::i8:
2187 Opcode = NVPTX::ST_i8_avar;
2188 break;
2189 case MVT::i16:
2190 Opcode = NVPTX::ST_i16_avar;
2191 break;
2192 case MVT::i32:
2193 Opcode = NVPTX::ST_i32_avar;
2194 break;
2195 case MVT::i64:
2196 Opcode = NVPTX::ST_i64_avar;
2197 break;
2198 case MVT::f32:
2199 Opcode = NVPTX::ST_f32_avar;
2200 break;
2201 case MVT::f64:
2202 Opcode = NVPTX::ST_f64_avar;
2203 break;
2204 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002205 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002206 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002207 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2208 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2209 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Addr,
2210 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002211 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002212 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2213 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00002214 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002215 case MVT::i8:
2216 Opcode = NVPTX::ST_i8_asi;
2217 break;
2218 case MVT::i16:
2219 Opcode = NVPTX::ST_i16_asi;
2220 break;
2221 case MVT::i32:
2222 Opcode = NVPTX::ST_i32_asi;
2223 break;
2224 case MVT::i64:
2225 Opcode = NVPTX::ST_i64_asi;
2226 break;
2227 case MVT::f32:
2228 Opcode = NVPTX::ST_f32_asi;
2229 break;
2230 case MVT::f64:
2231 Opcode = NVPTX::ST_f64_asi;
2232 break;
2233 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002234 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002235 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002236 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2237 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2238 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2239 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002240 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002241 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2242 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2243 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002244 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002245 case MVT::i8:
2246 Opcode = NVPTX::ST_i8_ari_64;
2247 break;
2248 case MVT::i16:
2249 Opcode = NVPTX::ST_i16_ari_64;
2250 break;
2251 case MVT::i32:
2252 Opcode = NVPTX::ST_i32_ari_64;
2253 break;
2254 case MVT::i64:
2255 Opcode = NVPTX::ST_i64_ari_64;
2256 break;
2257 case MVT::f32:
2258 Opcode = NVPTX::ST_f32_ari_64;
2259 break;
2260 case MVT::f64:
2261 Opcode = NVPTX::ST_f64_ari_64;
2262 break;
2263 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002264 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002265 }
2266 } else {
2267 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002268 case MVT::i8:
2269 Opcode = NVPTX::ST_i8_ari;
2270 break;
2271 case MVT::i16:
2272 Opcode = NVPTX::ST_i16_ari;
2273 break;
2274 case MVT::i32:
2275 Opcode = NVPTX::ST_i32_ari;
2276 break;
2277 case MVT::i64:
2278 Opcode = NVPTX::ST_i64_ari;
2279 break;
2280 case MVT::f32:
2281 Opcode = NVPTX::ST_f32_ari;
2282 break;
2283 case MVT::f64:
2284 Opcode = NVPTX::ST_f64_ari;
2285 break;
2286 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002287 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002288 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002289 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002290 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2291 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2292 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2293 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002294 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002295 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002296 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002297 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002298 case MVT::i8:
2299 Opcode = NVPTX::ST_i8_areg_64;
2300 break;
2301 case MVT::i16:
2302 Opcode = NVPTX::ST_i16_areg_64;
2303 break;
2304 case MVT::i32:
2305 Opcode = NVPTX::ST_i32_areg_64;
2306 break;
2307 case MVT::i64:
2308 Opcode = NVPTX::ST_i64_areg_64;
2309 break;
2310 case MVT::f32:
2311 Opcode = NVPTX::ST_f32_areg_64;
2312 break;
2313 case MVT::f64:
2314 Opcode = NVPTX::ST_f64_areg_64;
2315 break;
2316 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002317 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002318 }
2319 } else {
2320 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002321 case MVT::i8:
2322 Opcode = NVPTX::ST_i8_areg;
2323 break;
2324 case MVT::i16:
2325 Opcode = NVPTX::ST_i16_areg;
2326 break;
2327 case MVT::i32:
2328 Opcode = NVPTX::ST_i32_areg;
2329 break;
2330 case MVT::i64:
2331 Opcode = NVPTX::ST_i64_areg;
2332 break;
2333 case MVT::f32:
2334 Opcode = NVPTX::ST_f32_areg;
2335 break;
2336 case MVT::f64:
2337 Opcode = NVPTX::ST_f64_areg;
2338 break;
2339 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002340 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002341 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002342 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002343 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2344 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2345 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), N2,
2346 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002347 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002348 }
2349
Justin Bogner8d83fb62016-05-13 21:12:53 +00002350 if (!NVPTXST)
2351 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002352
Justin Bogner8d83fb62016-05-13 21:12:53 +00002353 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2354 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2355 cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2356 ReplaceNode(N, NVPTXST);
2357 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002358}
2359
Justin Bogner8d83fb62016-05-13 21:12:53 +00002360bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002361 SDValue Chain = N->getOperand(0);
2362 SDValue Op1 = N->getOperand(1);
2363 SDValue Addr, Offset, Base;
2364 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00002365 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002366 SDNode *ST;
2367 EVT EltVT = Op1.getValueType();
2368 MemSDNode *MemSD = cast<MemSDNode>(N);
2369 EVT StoreVT = MemSD->getMemoryVT();
2370
2371 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002372 unsigned CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002373
2374 if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
2375 report_fatal_error("Cannot store to pointer that points to constant "
2376 "memory space");
2377 }
2378
2379 // Volatile Setting
2380 // - .volatile is only availalble for .global and .shared
2381 bool IsVolatile = MemSD->isVolatile();
2382 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2383 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2384 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2385 IsVolatile = false;
2386
2387 // Type Setting: toType + toTypeWidth
2388 // - for integer type, always use 'u'
2389 assert(StoreVT.isSimple() && "Store value is not simple");
2390 MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002391 unsigned ToTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002392 unsigned ToType;
2393 if (ScalarVT.isFloatingPoint())
2394 ToType = NVPTX::PTXLdStInstCode::Float;
2395 else
2396 ToType = NVPTX::PTXLdStInstCode::Unsigned;
2397
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002398 SmallVector<SDValue, 12> StOps;
2399 SDValue N2;
2400 unsigned VecType;
2401
2402 switch (N->getOpcode()) {
2403 case NVPTXISD::StoreV2:
2404 VecType = NVPTX::PTXLdStInstCode::V2;
2405 StOps.push_back(N->getOperand(1));
2406 StOps.push_back(N->getOperand(2));
2407 N2 = N->getOperand(3);
2408 break;
2409 case NVPTXISD::StoreV4:
2410 VecType = NVPTX::PTXLdStInstCode::V4;
2411 StOps.push_back(N->getOperand(1));
2412 StOps.push_back(N->getOperand(2));
2413 StOps.push_back(N->getOperand(3));
2414 StOps.push_back(N->getOperand(4));
2415 N2 = N->getOperand(5);
2416 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002417 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002418 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002419 }
2420
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002421 StOps.push_back(getI32Imm(IsVolatile, DL));
2422 StOps.push_back(getI32Imm(CodeAddrSpace, DL));
2423 StOps.push_back(getI32Imm(VecType, DL));
2424 StOps.push_back(getI32Imm(ToType, DL));
2425 StOps.push_back(getI32Imm(ToTypeWidth, DL));
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002426
2427 if (SelectDirectAddr(N2, Addr)) {
2428 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002429 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002430 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002431 case NVPTXISD::StoreV2:
2432 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002433 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002434 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002435 case MVT::i8:
2436 Opcode = NVPTX::STV_i8_v2_avar;
2437 break;
2438 case MVT::i16:
2439 Opcode = NVPTX::STV_i16_v2_avar;
2440 break;
2441 case MVT::i32:
2442 Opcode = NVPTX::STV_i32_v2_avar;
2443 break;
2444 case MVT::i64:
2445 Opcode = NVPTX::STV_i64_v2_avar;
2446 break;
2447 case MVT::f32:
2448 Opcode = NVPTX::STV_f32_v2_avar;
2449 break;
2450 case MVT::f64:
2451 Opcode = NVPTX::STV_f64_v2_avar;
2452 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002453 }
2454 break;
2455 case NVPTXISD::StoreV4:
2456 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002457 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002458 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002459 case MVT::i8:
2460 Opcode = NVPTX::STV_i8_v4_avar;
2461 break;
2462 case MVT::i16:
2463 Opcode = NVPTX::STV_i16_v4_avar;
2464 break;
2465 case MVT::i32:
2466 Opcode = NVPTX::STV_i32_v4_avar;
2467 break;
2468 case MVT::f32:
2469 Opcode = NVPTX::STV_f32_v4_avar;
2470 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002471 }
2472 break;
2473 }
2474 StOps.push_back(Addr);
Eric Christopher02389e32015-02-19 00:08:27 +00002475 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2476 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002477 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002478 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002479 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002480 case NVPTXISD::StoreV2:
2481 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002482 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002483 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002484 case MVT::i8:
2485 Opcode = NVPTX::STV_i8_v2_asi;
2486 break;
2487 case MVT::i16:
2488 Opcode = NVPTX::STV_i16_v2_asi;
2489 break;
2490 case MVT::i32:
2491 Opcode = NVPTX::STV_i32_v2_asi;
2492 break;
2493 case MVT::i64:
2494 Opcode = NVPTX::STV_i64_v2_asi;
2495 break;
2496 case MVT::f32:
2497 Opcode = NVPTX::STV_f32_v2_asi;
2498 break;
2499 case MVT::f64:
2500 Opcode = NVPTX::STV_f64_v2_asi;
2501 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002502 }
2503 break;
2504 case NVPTXISD::StoreV4:
2505 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002506 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002507 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002508 case MVT::i8:
2509 Opcode = NVPTX::STV_i8_v4_asi;
2510 break;
2511 case MVT::i16:
2512 Opcode = NVPTX::STV_i16_v4_asi;
2513 break;
2514 case MVT::i32:
2515 Opcode = NVPTX::STV_i32_v4_asi;
2516 break;
2517 case MVT::f32:
2518 Opcode = NVPTX::STV_f32_v4_asi;
2519 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002520 }
2521 break;
2522 }
2523 StOps.push_back(Base);
2524 StOps.push_back(Offset);
Eric Christopher02389e32015-02-19 00:08:27 +00002525 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2526 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2527 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002528 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002529 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002530 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002531 case NVPTXISD::StoreV2:
2532 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002533 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002534 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002535 case MVT::i8:
2536 Opcode = NVPTX::STV_i8_v2_ari_64;
2537 break;
2538 case MVT::i16:
2539 Opcode = NVPTX::STV_i16_v2_ari_64;
2540 break;
2541 case MVT::i32:
2542 Opcode = NVPTX::STV_i32_v2_ari_64;
2543 break;
2544 case MVT::i64:
2545 Opcode = NVPTX::STV_i64_v2_ari_64;
2546 break;
2547 case MVT::f32:
2548 Opcode = NVPTX::STV_f32_v2_ari_64;
2549 break;
2550 case MVT::f64:
2551 Opcode = NVPTX::STV_f64_v2_ari_64;
2552 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002553 }
2554 break;
2555 case NVPTXISD::StoreV4:
2556 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002557 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002558 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002559 case MVT::i8:
2560 Opcode = NVPTX::STV_i8_v4_ari_64;
2561 break;
2562 case MVT::i16:
2563 Opcode = NVPTX::STV_i16_v4_ari_64;
2564 break;
2565 case MVT::i32:
2566 Opcode = NVPTX::STV_i32_v4_ari_64;
2567 break;
2568 case MVT::f32:
2569 Opcode = NVPTX::STV_f32_v4_ari_64;
2570 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002571 }
2572 break;
2573 }
2574 } else {
2575 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002576 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002577 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002578 case NVPTXISD::StoreV2:
2579 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002580 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002581 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002582 case MVT::i8:
2583 Opcode = NVPTX::STV_i8_v2_ari;
2584 break;
2585 case MVT::i16:
2586 Opcode = NVPTX::STV_i16_v2_ari;
2587 break;
2588 case MVT::i32:
2589 Opcode = NVPTX::STV_i32_v2_ari;
2590 break;
2591 case MVT::i64:
2592 Opcode = NVPTX::STV_i64_v2_ari;
2593 break;
2594 case MVT::f32:
2595 Opcode = NVPTX::STV_f32_v2_ari;
2596 break;
2597 case MVT::f64:
2598 Opcode = NVPTX::STV_f64_v2_ari;
2599 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002600 }
2601 break;
2602 case NVPTXISD::StoreV4:
2603 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002604 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002605 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002606 case MVT::i8:
2607 Opcode = NVPTX::STV_i8_v4_ari;
2608 break;
2609 case MVT::i16:
2610 Opcode = NVPTX::STV_i16_v4_ari;
2611 break;
2612 case MVT::i32:
2613 Opcode = NVPTX::STV_i32_v4_ari;
2614 break;
2615 case MVT::f32:
2616 Opcode = NVPTX::STV_f32_v4_ari;
2617 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002618 }
2619 break;
2620 }
2621 }
2622 StOps.push_back(Base);
2623 StOps.push_back(Offset);
2624 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002625 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002626 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002627 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002628 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002629 case NVPTXISD::StoreV2:
2630 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002631 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002632 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002633 case MVT::i8:
2634 Opcode = NVPTX::STV_i8_v2_areg_64;
2635 break;
2636 case MVT::i16:
2637 Opcode = NVPTX::STV_i16_v2_areg_64;
2638 break;
2639 case MVT::i32:
2640 Opcode = NVPTX::STV_i32_v2_areg_64;
2641 break;
2642 case MVT::i64:
2643 Opcode = NVPTX::STV_i64_v2_areg_64;
2644 break;
2645 case MVT::f32:
2646 Opcode = NVPTX::STV_f32_v2_areg_64;
2647 break;
2648 case MVT::f64:
2649 Opcode = NVPTX::STV_f64_v2_areg_64;
2650 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002651 }
2652 break;
2653 case NVPTXISD::StoreV4:
2654 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002655 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002656 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002657 case MVT::i8:
2658 Opcode = NVPTX::STV_i8_v4_areg_64;
2659 break;
2660 case MVT::i16:
2661 Opcode = NVPTX::STV_i16_v4_areg_64;
2662 break;
2663 case MVT::i32:
2664 Opcode = NVPTX::STV_i32_v4_areg_64;
2665 break;
2666 case MVT::f32:
2667 Opcode = NVPTX::STV_f32_v4_areg_64;
2668 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002669 }
2670 break;
2671 }
2672 } else {
2673 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002674 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002675 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002676 case NVPTXISD::StoreV2:
2677 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002678 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002679 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002680 case MVT::i8:
2681 Opcode = NVPTX::STV_i8_v2_areg;
2682 break;
2683 case MVT::i16:
2684 Opcode = NVPTX::STV_i16_v2_areg;
2685 break;
2686 case MVT::i32:
2687 Opcode = NVPTX::STV_i32_v2_areg;
2688 break;
2689 case MVT::i64:
2690 Opcode = NVPTX::STV_i64_v2_areg;
2691 break;
2692 case MVT::f32:
2693 Opcode = NVPTX::STV_f32_v2_areg;
2694 break;
2695 case MVT::f64:
2696 Opcode = NVPTX::STV_f64_v2_areg;
2697 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002698 }
2699 break;
2700 case NVPTXISD::StoreV4:
2701 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002702 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002703 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002704 case MVT::i8:
2705 Opcode = NVPTX::STV_i8_v4_areg;
2706 break;
2707 case MVT::i16:
2708 Opcode = NVPTX::STV_i16_v4_areg;
2709 break;
2710 case MVT::i32:
2711 Opcode = NVPTX::STV_i32_v4_areg;
2712 break;
2713 case MVT::f32:
2714 Opcode = NVPTX::STV_f32_v4_areg;
2715 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002716 }
2717 break;
2718 }
2719 }
2720 StOps.push_back(N2);
2721 }
2722
2723 StOps.push_back(Chain);
2724
Michael Liaob53d8962013-04-19 22:22:57 +00002725 ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002726
2727 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2728 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2729 cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2730
Justin Bogner8d83fb62016-05-13 21:12:53 +00002731 ReplaceNode(N, ST);
2732 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002733}
2734
Justin Bogner8d83fb62016-05-13 21:12:53 +00002735bool NVPTXDAGToDAGISel::tryLoadParam(SDNode *Node) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002736 SDValue Chain = Node->getOperand(0);
2737 SDValue Offset = Node->getOperand(2);
2738 SDValue Flag = Node->getOperand(3);
2739 SDLoc DL(Node);
2740 MemSDNode *Mem = cast<MemSDNode>(Node);
2741
2742 unsigned VecSize;
2743 switch (Node->getOpcode()) {
2744 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002745 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002746 case NVPTXISD::LoadParam:
2747 VecSize = 1;
2748 break;
2749 case NVPTXISD::LoadParamV2:
2750 VecSize = 2;
2751 break;
2752 case NVPTXISD::LoadParamV4:
2753 VecSize = 4;
2754 break;
2755 }
2756
2757 EVT EltVT = Node->getValueType(0);
2758 EVT MemVT = Mem->getMemoryVT();
2759
2760 unsigned Opc = 0;
2761
2762 switch (VecSize) {
2763 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002764 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002765 case 1:
2766 switch (MemVT.getSimpleVT().SimpleTy) {
2767 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002768 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002769 case MVT::i1:
2770 Opc = NVPTX::LoadParamMemI8;
2771 break;
2772 case MVT::i8:
2773 Opc = NVPTX::LoadParamMemI8;
2774 break;
2775 case MVT::i16:
2776 Opc = NVPTX::LoadParamMemI16;
2777 break;
2778 case MVT::i32:
2779 Opc = NVPTX::LoadParamMemI32;
2780 break;
2781 case MVT::i64:
2782 Opc = NVPTX::LoadParamMemI64;
2783 break;
2784 case MVT::f32:
2785 Opc = NVPTX::LoadParamMemF32;
2786 break;
2787 case MVT::f64:
2788 Opc = NVPTX::LoadParamMemF64;
2789 break;
2790 }
2791 break;
2792 case 2:
2793 switch (MemVT.getSimpleVT().SimpleTy) {
2794 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002795 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002796 case MVT::i1:
2797 Opc = NVPTX::LoadParamMemV2I8;
2798 break;
2799 case MVT::i8:
2800 Opc = NVPTX::LoadParamMemV2I8;
2801 break;
2802 case MVT::i16:
2803 Opc = NVPTX::LoadParamMemV2I16;
2804 break;
2805 case MVT::i32:
2806 Opc = NVPTX::LoadParamMemV2I32;
2807 break;
2808 case MVT::i64:
2809 Opc = NVPTX::LoadParamMemV2I64;
2810 break;
2811 case MVT::f32:
2812 Opc = NVPTX::LoadParamMemV2F32;
2813 break;
2814 case MVT::f64:
2815 Opc = NVPTX::LoadParamMemV2F64;
2816 break;
2817 }
2818 break;
2819 case 4:
2820 switch (MemVT.getSimpleVT().SimpleTy) {
2821 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002822 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002823 case MVT::i1:
2824 Opc = NVPTX::LoadParamMemV4I8;
2825 break;
2826 case MVT::i8:
2827 Opc = NVPTX::LoadParamMemV4I8;
2828 break;
2829 case MVT::i16:
2830 Opc = NVPTX::LoadParamMemV4I16;
2831 break;
2832 case MVT::i32:
2833 Opc = NVPTX::LoadParamMemV4I32;
2834 break;
2835 case MVT::f32:
2836 Opc = NVPTX::LoadParamMemV4F32;
2837 break;
2838 }
2839 break;
2840 }
2841
2842 SDVTList VTs;
2843 if (VecSize == 1) {
2844 VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2845 } else if (VecSize == 2) {
2846 VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2847 } else {
2848 EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
Craig Topperabb4ac72014-04-16 06:10:51 +00002849 VTs = CurDAG->getVTList(EVTs);
Justin Holewinskif8f70912013-06-28 17:57:59 +00002850 }
2851
2852 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2853
2854 SmallVector<SDValue, 2> Ops;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002855 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002856 Ops.push_back(Chain);
2857 Ops.push_back(Flag);
2858
Justin Bogner8d83fb62016-05-13 21:12:53 +00002859 ReplaceNode(Node, CurDAG->getMachineNode(Opc, DL, VTs, Ops));
2860 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002861}
2862
Justin Bogner8d83fb62016-05-13 21:12:53 +00002863bool NVPTXDAGToDAGISel::tryStoreRetval(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002864 SDLoc DL(N);
2865 SDValue Chain = N->getOperand(0);
2866 SDValue Offset = N->getOperand(1);
2867 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2868 MemSDNode *Mem = cast<MemSDNode>(N);
2869
2870 // How many elements do we have?
2871 unsigned NumElts = 1;
2872 switch (N->getOpcode()) {
2873 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002874 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002875 case NVPTXISD::StoreRetval:
2876 NumElts = 1;
2877 break;
2878 case NVPTXISD::StoreRetvalV2:
2879 NumElts = 2;
2880 break;
2881 case NVPTXISD::StoreRetvalV4:
2882 NumElts = 4;
2883 break;
2884 }
2885
2886 // Build vector of operands
2887 SmallVector<SDValue, 6> Ops;
2888 for (unsigned i = 0; i < NumElts; ++i)
2889 Ops.push_back(N->getOperand(i + 2));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002890 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002891 Ops.push_back(Chain);
2892
2893 // Determine target opcode
2894 // If we have an i1, use an 8-bit store. The lowering code in
2895 // NVPTXISelLowering will have already emitted an upcast.
2896 unsigned Opcode = 0;
2897 switch (NumElts) {
2898 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002899 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002900 case 1:
2901 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2902 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002903 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002904 case MVT::i1:
2905 Opcode = NVPTX::StoreRetvalI8;
2906 break;
2907 case MVT::i8:
2908 Opcode = NVPTX::StoreRetvalI8;
2909 break;
2910 case MVT::i16:
2911 Opcode = NVPTX::StoreRetvalI16;
2912 break;
2913 case MVT::i32:
2914 Opcode = NVPTX::StoreRetvalI32;
2915 break;
2916 case MVT::i64:
2917 Opcode = NVPTX::StoreRetvalI64;
2918 break;
2919 case MVT::f32:
2920 Opcode = NVPTX::StoreRetvalF32;
2921 break;
2922 case MVT::f64:
2923 Opcode = NVPTX::StoreRetvalF64;
2924 break;
2925 }
2926 break;
2927 case 2:
2928 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2929 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002930 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002931 case MVT::i1:
2932 Opcode = NVPTX::StoreRetvalV2I8;
2933 break;
2934 case MVT::i8:
2935 Opcode = NVPTX::StoreRetvalV2I8;
2936 break;
2937 case MVT::i16:
2938 Opcode = NVPTX::StoreRetvalV2I16;
2939 break;
2940 case MVT::i32:
2941 Opcode = NVPTX::StoreRetvalV2I32;
2942 break;
2943 case MVT::i64:
2944 Opcode = NVPTX::StoreRetvalV2I64;
2945 break;
2946 case MVT::f32:
2947 Opcode = NVPTX::StoreRetvalV2F32;
2948 break;
2949 case MVT::f64:
2950 Opcode = NVPTX::StoreRetvalV2F64;
2951 break;
2952 }
2953 break;
2954 case 4:
2955 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2956 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002957 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002958 case MVT::i1:
2959 Opcode = NVPTX::StoreRetvalV4I8;
2960 break;
2961 case MVT::i8:
2962 Opcode = NVPTX::StoreRetvalV4I8;
2963 break;
2964 case MVT::i16:
2965 Opcode = NVPTX::StoreRetvalV4I16;
2966 break;
2967 case MVT::i32:
2968 Opcode = NVPTX::StoreRetvalV4I32;
2969 break;
2970 case MVT::f32:
2971 Opcode = NVPTX::StoreRetvalV4F32;
2972 break;
2973 }
2974 break;
2975 }
2976
2977 SDNode *Ret =
2978 CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
2979 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2980 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2981 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2982
Justin Bogner8d83fb62016-05-13 21:12:53 +00002983 ReplaceNode(N, Ret);
2984 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002985}
2986
Justin Bogner8d83fb62016-05-13 21:12:53 +00002987bool NVPTXDAGToDAGISel::tryStoreParam(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002988 SDLoc DL(N);
2989 SDValue Chain = N->getOperand(0);
2990 SDValue Param = N->getOperand(1);
2991 unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
2992 SDValue Offset = N->getOperand(2);
2993 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2994 MemSDNode *Mem = cast<MemSDNode>(N);
2995 SDValue Flag = N->getOperand(N->getNumOperands() - 1);
2996
2997 // How many elements do we have?
2998 unsigned NumElts = 1;
2999 switch (N->getOpcode()) {
3000 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003001 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003002 case NVPTXISD::StoreParamU32:
3003 case NVPTXISD::StoreParamS32:
3004 case NVPTXISD::StoreParam:
3005 NumElts = 1;
3006 break;
3007 case NVPTXISD::StoreParamV2:
3008 NumElts = 2;
3009 break;
3010 case NVPTXISD::StoreParamV4:
3011 NumElts = 4;
3012 break;
3013 }
3014
3015 // Build vector of operands
3016 SmallVector<SDValue, 8> Ops;
3017 for (unsigned i = 0; i < NumElts; ++i)
3018 Ops.push_back(N->getOperand(i + 3));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003019 Ops.push_back(CurDAG->getTargetConstant(ParamVal, DL, MVT::i32));
3020 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00003021 Ops.push_back(Chain);
3022 Ops.push_back(Flag);
3023
3024 // Determine target opcode
3025 // If we have an i1, use an 8-bit store. The lowering code in
3026 // NVPTXISelLowering will have already emitted an upcast.
3027 unsigned Opcode = 0;
3028 switch (N->getOpcode()) {
3029 default:
3030 switch (NumElts) {
3031 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003032 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003033 case 1:
3034 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3035 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003036 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003037 case MVT::i1:
3038 Opcode = NVPTX::StoreParamI8;
3039 break;
3040 case MVT::i8:
3041 Opcode = NVPTX::StoreParamI8;
3042 break;
3043 case MVT::i16:
3044 Opcode = NVPTX::StoreParamI16;
3045 break;
3046 case MVT::i32:
3047 Opcode = NVPTX::StoreParamI32;
3048 break;
3049 case MVT::i64:
3050 Opcode = NVPTX::StoreParamI64;
3051 break;
3052 case MVT::f32:
3053 Opcode = NVPTX::StoreParamF32;
3054 break;
3055 case MVT::f64:
3056 Opcode = NVPTX::StoreParamF64;
3057 break;
3058 }
3059 break;
3060 case 2:
3061 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3062 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003063 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003064 case MVT::i1:
3065 Opcode = NVPTX::StoreParamV2I8;
3066 break;
3067 case MVT::i8:
3068 Opcode = NVPTX::StoreParamV2I8;
3069 break;
3070 case MVT::i16:
3071 Opcode = NVPTX::StoreParamV2I16;
3072 break;
3073 case MVT::i32:
3074 Opcode = NVPTX::StoreParamV2I32;
3075 break;
3076 case MVT::i64:
3077 Opcode = NVPTX::StoreParamV2I64;
3078 break;
3079 case MVT::f32:
3080 Opcode = NVPTX::StoreParamV2F32;
3081 break;
3082 case MVT::f64:
3083 Opcode = NVPTX::StoreParamV2F64;
3084 break;
3085 }
3086 break;
3087 case 4:
3088 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3089 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003090 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003091 case MVT::i1:
3092 Opcode = NVPTX::StoreParamV4I8;
3093 break;
3094 case MVT::i8:
3095 Opcode = NVPTX::StoreParamV4I8;
3096 break;
3097 case MVT::i16:
3098 Opcode = NVPTX::StoreParamV4I16;
3099 break;
3100 case MVT::i32:
3101 Opcode = NVPTX::StoreParamV4I32;
3102 break;
3103 case MVT::f32:
3104 Opcode = NVPTX::StoreParamV4F32;
3105 break;
3106 }
3107 break;
3108 }
3109 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003110 // Special case: if we have a sign-extend/zero-extend node, insert the
3111 // conversion instruction first, and use that as the value operand to
3112 // the selected StoreParam node.
3113 case NVPTXISD::StoreParamU32: {
3114 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003115 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003116 MVT::i32);
3117 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
3118 MVT::i32, Ops[0], CvtNone);
3119 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003120 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003121 }
3122 case NVPTXISD::StoreParamS32: {
3123 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003124 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003125 MVT::i32);
3126 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
3127 MVT::i32, Ops[0], CvtNone);
3128 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003129 break;
3130 }
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003131 }
Justin Holewinskif8f70912013-06-28 17:57:59 +00003132
Justin Holewinskidff28d22013-07-01 12:59:01 +00003133 SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003134 SDNode *Ret =
Justin Holewinskidff28d22013-07-01 12:59:01 +00003135 CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003136 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3137 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3138 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3139
Justin Bogner8d83fb62016-05-13 21:12:53 +00003140 ReplaceNode(N, Ret);
3141 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003142}
3143
Justin Bogner8d83fb62016-05-13 21:12:53 +00003144bool NVPTXDAGToDAGISel::tryTextureIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003145 SDValue Chain = N->getOperand(0);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003146 unsigned Opc = 0;
3147 SmallVector<SDValue, 8> Ops;
3148
3149 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003150 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003151 case NVPTXISD::Tex1DFloatS32:
3152 Opc = NVPTX::TEX_1D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003153 break;
3154 case NVPTXISD::Tex1DFloatFloat:
3155 Opc = NVPTX::TEX_1D_F32_F32;
3156 break;
3157 case NVPTXISD::Tex1DFloatFloatLevel:
3158 Opc = NVPTX::TEX_1D_F32_F32_LEVEL;
3159 break;
3160 case NVPTXISD::Tex1DFloatFloatGrad:
3161 Opc = NVPTX::TEX_1D_F32_F32_GRAD;
3162 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003163 case NVPTXISD::Tex1DS32S32:
3164 Opc = NVPTX::TEX_1D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003165 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003166 case NVPTXISD::Tex1DS32Float:
3167 Opc = NVPTX::TEX_1D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003168 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003169 case NVPTXISD::Tex1DS32FloatLevel:
3170 Opc = NVPTX::TEX_1D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003171 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003172 case NVPTXISD::Tex1DS32FloatGrad:
3173 Opc = NVPTX::TEX_1D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003174 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003175 case NVPTXISD::Tex1DU32S32:
3176 Opc = NVPTX::TEX_1D_U32_S32;
3177 break;
3178 case NVPTXISD::Tex1DU32Float:
3179 Opc = NVPTX::TEX_1D_U32_F32;
3180 break;
3181 case NVPTXISD::Tex1DU32FloatLevel:
3182 Opc = NVPTX::TEX_1D_U32_F32_LEVEL;
3183 break;
3184 case NVPTXISD::Tex1DU32FloatGrad:
3185 Opc = NVPTX::TEX_1D_U32_F32_GRAD;
3186 break;
3187 case NVPTXISD::Tex1DArrayFloatS32:
3188 Opc = NVPTX::TEX_1D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003189 break;
3190 case NVPTXISD::Tex1DArrayFloatFloat:
3191 Opc = NVPTX::TEX_1D_ARRAY_F32_F32;
3192 break;
3193 case NVPTXISD::Tex1DArrayFloatFloatLevel:
3194 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_LEVEL;
3195 break;
3196 case NVPTXISD::Tex1DArrayFloatFloatGrad:
3197 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_GRAD;
3198 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003199 case NVPTXISD::Tex1DArrayS32S32:
3200 Opc = NVPTX::TEX_1D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003201 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003202 case NVPTXISD::Tex1DArrayS32Float:
3203 Opc = NVPTX::TEX_1D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003204 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003205 case NVPTXISD::Tex1DArrayS32FloatLevel:
3206 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003207 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003208 case NVPTXISD::Tex1DArrayS32FloatGrad:
3209 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003210 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003211 case NVPTXISD::Tex1DArrayU32S32:
3212 Opc = NVPTX::TEX_1D_ARRAY_U32_S32;
3213 break;
3214 case NVPTXISD::Tex1DArrayU32Float:
3215 Opc = NVPTX::TEX_1D_ARRAY_U32_F32;
3216 break;
3217 case NVPTXISD::Tex1DArrayU32FloatLevel:
3218 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_LEVEL;
3219 break;
3220 case NVPTXISD::Tex1DArrayU32FloatGrad:
3221 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_GRAD;
3222 break;
3223 case NVPTXISD::Tex2DFloatS32:
3224 Opc = NVPTX::TEX_2D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003225 break;
3226 case NVPTXISD::Tex2DFloatFloat:
3227 Opc = NVPTX::TEX_2D_F32_F32;
3228 break;
3229 case NVPTXISD::Tex2DFloatFloatLevel:
3230 Opc = NVPTX::TEX_2D_F32_F32_LEVEL;
3231 break;
3232 case NVPTXISD::Tex2DFloatFloatGrad:
3233 Opc = NVPTX::TEX_2D_F32_F32_GRAD;
3234 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003235 case NVPTXISD::Tex2DS32S32:
3236 Opc = NVPTX::TEX_2D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003237 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003238 case NVPTXISD::Tex2DS32Float:
3239 Opc = NVPTX::TEX_2D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003240 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003241 case NVPTXISD::Tex2DS32FloatLevel:
3242 Opc = NVPTX::TEX_2D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003243 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003244 case NVPTXISD::Tex2DS32FloatGrad:
3245 Opc = NVPTX::TEX_2D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003246 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003247 case NVPTXISD::Tex2DU32S32:
3248 Opc = NVPTX::TEX_2D_U32_S32;
3249 break;
3250 case NVPTXISD::Tex2DU32Float:
3251 Opc = NVPTX::TEX_2D_U32_F32;
3252 break;
3253 case NVPTXISD::Tex2DU32FloatLevel:
3254 Opc = NVPTX::TEX_2D_U32_F32_LEVEL;
3255 break;
3256 case NVPTXISD::Tex2DU32FloatGrad:
3257 Opc = NVPTX::TEX_2D_U32_F32_GRAD;
3258 break;
3259 case NVPTXISD::Tex2DArrayFloatS32:
3260 Opc = NVPTX::TEX_2D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003261 break;
3262 case NVPTXISD::Tex2DArrayFloatFloat:
3263 Opc = NVPTX::TEX_2D_ARRAY_F32_F32;
3264 break;
3265 case NVPTXISD::Tex2DArrayFloatFloatLevel:
3266 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_LEVEL;
3267 break;
3268 case NVPTXISD::Tex2DArrayFloatFloatGrad:
3269 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_GRAD;
3270 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003271 case NVPTXISD::Tex2DArrayS32S32:
3272 Opc = NVPTX::TEX_2D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003273 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003274 case NVPTXISD::Tex2DArrayS32Float:
3275 Opc = NVPTX::TEX_2D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003276 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003277 case NVPTXISD::Tex2DArrayS32FloatLevel:
3278 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003279 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003280 case NVPTXISD::Tex2DArrayS32FloatGrad:
3281 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003282 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003283 case NVPTXISD::Tex2DArrayU32S32:
3284 Opc = NVPTX::TEX_2D_ARRAY_U32_S32;
3285 break;
3286 case NVPTXISD::Tex2DArrayU32Float:
3287 Opc = NVPTX::TEX_2D_ARRAY_U32_F32;
3288 break;
3289 case NVPTXISD::Tex2DArrayU32FloatLevel:
3290 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_LEVEL;
3291 break;
3292 case NVPTXISD::Tex2DArrayU32FloatGrad:
3293 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_GRAD;
3294 break;
3295 case NVPTXISD::Tex3DFloatS32:
3296 Opc = NVPTX::TEX_3D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003297 break;
3298 case NVPTXISD::Tex3DFloatFloat:
3299 Opc = NVPTX::TEX_3D_F32_F32;
3300 break;
3301 case NVPTXISD::Tex3DFloatFloatLevel:
3302 Opc = NVPTX::TEX_3D_F32_F32_LEVEL;
3303 break;
3304 case NVPTXISD::Tex3DFloatFloatGrad:
3305 Opc = NVPTX::TEX_3D_F32_F32_GRAD;
3306 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003307 case NVPTXISD::Tex3DS32S32:
3308 Opc = NVPTX::TEX_3D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003309 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003310 case NVPTXISD::Tex3DS32Float:
3311 Opc = NVPTX::TEX_3D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003312 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003313 case NVPTXISD::Tex3DS32FloatLevel:
3314 Opc = NVPTX::TEX_3D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003315 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003316 case NVPTXISD::Tex3DS32FloatGrad:
3317 Opc = NVPTX::TEX_3D_S32_F32_GRAD;
3318 break;
3319 case NVPTXISD::Tex3DU32S32:
3320 Opc = NVPTX::TEX_3D_U32_S32;
3321 break;
3322 case NVPTXISD::Tex3DU32Float:
3323 Opc = NVPTX::TEX_3D_U32_F32;
3324 break;
3325 case NVPTXISD::Tex3DU32FloatLevel:
3326 Opc = NVPTX::TEX_3D_U32_F32_LEVEL;
3327 break;
3328 case NVPTXISD::Tex3DU32FloatGrad:
3329 Opc = NVPTX::TEX_3D_U32_F32_GRAD;
3330 break;
3331 case NVPTXISD::TexCubeFloatFloat:
3332 Opc = NVPTX::TEX_CUBE_F32_F32;
3333 break;
3334 case NVPTXISD::TexCubeFloatFloatLevel:
3335 Opc = NVPTX::TEX_CUBE_F32_F32_LEVEL;
3336 break;
3337 case NVPTXISD::TexCubeS32Float:
3338 Opc = NVPTX::TEX_CUBE_S32_F32;
3339 break;
3340 case NVPTXISD::TexCubeS32FloatLevel:
3341 Opc = NVPTX::TEX_CUBE_S32_F32_LEVEL;
3342 break;
3343 case NVPTXISD::TexCubeU32Float:
3344 Opc = NVPTX::TEX_CUBE_U32_F32;
3345 break;
3346 case NVPTXISD::TexCubeU32FloatLevel:
3347 Opc = NVPTX::TEX_CUBE_U32_F32_LEVEL;
3348 break;
3349 case NVPTXISD::TexCubeArrayFloatFloat:
3350 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32;
3351 break;
3352 case NVPTXISD::TexCubeArrayFloatFloatLevel:
3353 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32_LEVEL;
3354 break;
3355 case NVPTXISD::TexCubeArrayS32Float:
3356 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32;
3357 break;
3358 case NVPTXISD::TexCubeArrayS32FloatLevel:
3359 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32_LEVEL;
3360 break;
3361 case NVPTXISD::TexCubeArrayU32Float:
3362 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32;
3363 break;
3364 case NVPTXISD::TexCubeArrayU32FloatLevel:
3365 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32_LEVEL;
3366 break;
3367 case NVPTXISD::Tld4R2DFloatFloat:
3368 Opc = NVPTX::TLD4_R_2D_F32_F32;
3369 break;
3370 case NVPTXISD::Tld4G2DFloatFloat:
3371 Opc = NVPTX::TLD4_G_2D_F32_F32;
3372 break;
3373 case NVPTXISD::Tld4B2DFloatFloat:
3374 Opc = NVPTX::TLD4_B_2D_F32_F32;
3375 break;
3376 case NVPTXISD::Tld4A2DFloatFloat:
3377 Opc = NVPTX::TLD4_A_2D_F32_F32;
3378 break;
3379 case NVPTXISD::Tld4R2DS64Float:
3380 Opc = NVPTX::TLD4_R_2D_S32_F32;
3381 break;
3382 case NVPTXISD::Tld4G2DS64Float:
3383 Opc = NVPTX::TLD4_G_2D_S32_F32;
3384 break;
3385 case NVPTXISD::Tld4B2DS64Float:
3386 Opc = NVPTX::TLD4_B_2D_S32_F32;
3387 break;
3388 case NVPTXISD::Tld4A2DS64Float:
3389 Opc = NVPTX::TLD4_A_2D_S32_F32;
3390 break;
3391 case NVPTXISD::Tld4R2DU64Float:
3392 Opc = NVPTX::TLD4_R_2D_U32_F32;
3393 break;
3394 case NVPTXISD::Tld4G2DU64Float:
3395 Opc = NVPTX::TLD4_G_2D_U32_F32;
3396 break;
3397 case NVPTXISD::Tld4B2DU64Float:
3398 Opc = NVPTX::TLD4_B_2D_U32_F32;
3399 break;
3400 case NVPTXISD::Tld4A2DU64Float:
3401 Opc = NVPTX::TLD4_A_2D_U32_F32;
3402 break;
3403 case NVPTXISD::TexUnified1DFloatS32:
3404 Opc = NVPTX::TEX_UNIFIED_1D_F32_S32;
3405 break;
3406 case NVPTXISD::TexUnified1DFloatFloat:
3407 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32;
3408 break;
3409 case NVPTXISD::TexUnified1DFloatFloatLevel:
3410 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_LEVEL;
3411 break;
3412 case NVPTXISD::TexUnified1DFloatFloatGrad:
3413 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_GRAD;
3414 break;
3415 case NVPTXISD::TexUnified1DS32S32:
3416 Opc = NVPTX::TEX_UNIFIED_1D_S32_S32;
3417 break;
3418 case NVPTXISD::TexUnified1DS32Float:
3419 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32;
3420 break;
3421 case NVPTXISD::TexUnified1DS32FloatLevel:
3422 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_LEVEL;
3423 break;
3424 case NVPTXISD::TexUnified1DS32FloatGrad:
3425 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_GRAD;
3426 break;
3427 case NVPTXISD::TexUnified1DU32S32:
3428 Opc = NVPTX::TEX_UNIFIED_1D_U32_S32;
3429 break;
3430 case NVPTXISD::TexUnified1DU32Float:
3431 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32;
3432 break;
3433 case NVPTXISD::TexUnified1DU32FloatLevel:
3434 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_LEVEL;
3435 break;
3436 case NVPTXISD::TexUnified1DU32FloatGrad:
3437 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_GRAD;
3438 break;
3439 case NVPTXISD::TexUnified1DArrayFloatS32:
3440 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_S32;
3441 break;
3442 case NVPTXISD::TexUnified1DArrayFloatFloat:
3443 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32;
3444 break;
3445 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
3446 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_LEVEL;
3447 break;
3448 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
3449 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_GRAD;
3450 break;
3451 case NVPTXISD::TexUnified1DArrayS32S32:
3452 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_S32;
3453 break;
3454 case NVPTXISD::TexUnified1DArrayS32Float:
3455 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32;
3456 break;
3457 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
3458 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_LEVEL;
3459 break;
3460 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
3461 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_GRAD;
3462 break;
3463 case NVPTXISD::TexUnified1DArrayU32S32:
3464 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_S32;
3465 break;
3466 case NVPTXISD::TexUnified1DArrayU32Float:
3467 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32;
3468 break;
3469 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
3470 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_LEVEL;
3471 break;
3472 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
3473 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_GRAD;
3474 break;
3475 case NVPTXISD::TexUnified2DFloatS32:
3476 Opc = NVPTX::TEX_UNIFIED_2D_F32_S32;
3477 break;
3478 case NVPTXISD::TexUnified2DFloatFloat:
3479 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32;
3480 break;
3481 case NVPTXISD::TexUnified2DFloatFloatLevel:
3482 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_LEVEL;
3483 break;
3484 case NVPTXISD::TexUnified2DFloatFloatGrad:
3485 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_GRAD;
3486 break;
3487 case NVPTXISD::TexUnified2DS32S32:
3488 Opc = NVPTX::TEX_UNIFIED_2D_S32_S32;
3489 break;
3490 case NVPTXISD::TexUnified2DS32Float:
3491 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32;
3492 break;
3493 case NVPTXISD::TexUnified2DS32FloatLevel:
3494 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_LEVEL;
3495 break;
3496 case NVPTXISD::TexUnified2DS32FloatGrad:
3497 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_GRAD;
3498 break;
3499 case NVPTXISD::TexUnified2DU32S32:
3500 Opc = NVPTX::TEX_UNIFIED_2D_U32_S32;
3501 break;
3502 case NVPTXISD::TexUnified2DU32Float:
3503 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32;
3504 break;
3505 case NVPTXISD::TexUnified2DU32FloatLevel:
3506 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_LEVEL;
3507 break;
3508 case NVPTXISD::TexUnified2DU32FloatGrad:
3509 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_GRAD;
3510 break;
3511 case NVPTXISD::TexUnified2DArrayFloatS32:
3512 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_S32;
3513 break;
3514 case NVPTXISD::TexUnified2DArrayFloatFloat:
3515 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32;
3516 break;
3517 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
3518 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_LEVEL;
3519 break;
3520 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
3521 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_GRAD;
3522 break;
3523 case NVPTXISD::TexUnified2DArrayS32S32:
3524 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_S32;
3525 break;
3526 case NVPTXISD::TexUnified2DArrayS32Float:
3527 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32;
3528 break;
3529 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
3530 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_LEVEL;
3531 break;
3532 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
3533 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_GRAD;
3534 break;
3535 case NVPTXISD::TexUnified2DArrayU32S32:
3536 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_S32;
3537 break;
3538 case NVPTXISD::TexUnified2DArrayU32Float:
3539 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32;
3540 break;
3541 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
3542 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_LEVEL;
3543 break;
3544 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
3545 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_GRAD;
3546 break;
3547 case NVPTXISD::TexUnified3DFloatS32:
3548 Opc = NVPTX::TEX_UNIFIED_3D_F32_S32;
3549 break;
3550 case NVPTXISD::TexUnified3DFloatFloat:
3551 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32;
3552 break;
3553 case NVPTXISD::TexUnified3DFloatFloatLevel:
3554 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_LEVEL;
3555 break;
3556 case NVPTXISD::TexUnified3DFloatFloatGrad:
3557 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_GRAD;
3558 break;
3559 case NVPTXISD::TexUnified3DS32S32:
3560 Opc = NVPTX::TEX_UNIFIED_3D_S32_S32;
3561 break;
3562 case NVPTXISD::TexUnified3DS32Float:
3563 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32;
3564 break;
3565 case NVPTXISD::TexUnified3DS32FloatLevel:
3566 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_LEVEL;
3567 break;
3568 case NVPTXISD::TexUnified3DS32FloatGrad:
3569 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_GRAD;
3570 break;
3571 case NVPTXISD::TexUnified3DU32S32:
3572 Opc = NVPTX::TEX_UNIFIED_3D_U32_S32;
3573 break;
3574 case NVPTXISD::TexUnified3DU32Float:
3575 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32;
3576 break;
3577 case NVPTXISD::TexUnified3DU32FloatLevel:
3578 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_LEVEL;
3579 break;
3580 case NVPTXISD::TexUnified3DU32FloatGrad:
3581 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_GRAD;
3582 break;
3583 case NVPTXISD::TexUnifiedCubeFloatFloat:
3584 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32;
3585 break;
3586 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
3587 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32_LEVEL;
3588 break;
3589 case NVPTXISD::TexUnifiedCubeS32Float:
3590 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32;
3591 break;
3592 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
3593 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32_LEVEL;
3594 break;
3595 case NVPTXISD::TexUnifiedCubeU32Float:
3596 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32;
3597 break;
3598 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
3599 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32_LEVEL;
3600 break;
3601 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
3602 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32;
3603 break;
3604 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
3605 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32_LEVEL;
3606 break;
3607 case NVPTXISD::TexUnifiedCubeArrayS32Float:
3608 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32;
3609 break;
3610 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
3611 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32_LEVEL;
3612 break;
3613 case NVPTXISD::TexUnifiedCubeArrayU32Float:
3614 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32;
3615 break;
3616 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
3617 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32_LEVEL;
3618 break;
3619 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
3620 Opc = NVPTX::TLD4_UNIFIED_R_2D_F32_F32;
3621 break;
3622 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
3623 Opc = NVPTX::TLD4_UNIFIED_G_2D_F32_F32;
3624 break;
3625 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
3626 Opc = NVPTX::TLD4_UNIFIED_B_2D_F32_F32;
3627 break;
3628 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
3629 Opc = NVPTX::TLD4_UNIFIED_A_2D_F32_F32;
3630 break;
3631 case NVPTXISD::Tld4UnifiedR2DS64Float:
3632 Opc = NVPTX::TLD4_UNIFIED_R_2D_S32_F32;
3633 break;
3634 case NVPTXISD::Tld4UnifiedG2DS64Float:
3635 Opc = NVPTX::TLD4_UNIFIED_G_2D_S32_F32;
3636 break;
3637 case NVPTXISD::Tld4UnifiedB2DS64Float:
3638 Opc = NVPTX::TLD4_UNIFIED_B_2D_S32_F32;
3639 break;
3640 case NVPTXISD::Tld4UnifiedA2DS64Float:
3641 Opc = NVPTX::TLD4_UNIFIED_A_2D_S32_F32;
3642 break;
3643 case NVPTXISD::Tld4UnifiedR2DU64Float:
3644 Opc = NVPTX::TLD4_UNIFIED_R_2D_U32_F32;
3645 break;
3646 case NVPTXISD::Tld4UnifiedG2DU64Float:
3647 Opc = NVPTX::TLD4_UNIFIED_G_2D_U32_F32;
3648 break;
3649 case NVPTXISD::Tld4UnifiedB2DU64Float:
3650 Opc = NVPTX::TLD4_UNIFIED_B_2D_U32_F32;
3651 break;
3652 case NVPTXISD::Tld4UnifiedA2DU64Float:
3653 Opc = NVPTX::TLD4_UNIFIED_A_2D_U32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003654 break;
3655 }
3656
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003657 // Copy over operands
3658 for (unsigned i = 1; i < N->getNumOperands(); ++i) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003659 Ops.push_back(N->getOperand(i));
3660 }
3661
3662 Ops.push_back(Chain);
Justin Bogner8d83fb62016-05-13 21:12:53 +00003663 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
3664 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003665}
3666
Justin Bogner8d83fb62016-05-13 21:12:53 +00003667bool NVPTXDAGToDAGISel::trySurfaceIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003668 SDValue Chain = N->getOperand(0);
3669 SDValue TexHandle = N->getOperand(1);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003670 unsigned Opc = 0;
3671 SmallVector<SDValue, 8> Ops;
3672 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003673 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003674 case NVPTXISD::Suld1DI8Clamp:
3675 Opc = NVPTX::SULD_1D_I8_CLAMP;
3676 Ops.push_back(TexHandle);
3677 Ops.push_back(N->getOperand(2));
3678 Ops.push_back(Chain);
3679 break;
3680 case NVPTXISD::Suld1DI16Clamp:
3681 Opc = NVPTX::SULD_1D_I16_CLAMP;
3682 Ops.push_back(TexHandle);
3683 Ops.push_back(N->getOperand(2));
3684 Ops.push_back(Chain);
3685 break;
3686 case NVPTXISD::Suld1DI32Clamp:
3687 Opc = NVPTX::SULD_1D_I32_CLAMP;
3688 Ops.push_back(TexHandle);
3689 Ops.push_back(N->getOperand(2));
3690 Ops.push_back(Chain);
3691 break;
3692 case NVPTXISD::Suld1DI64Clamp:
3693 Opc = NVPTX::SULD_1D_I64_CLAMP;
3694 Ops.push_back(TexHandle);
3695 Ops.push_back(N->getOperand(2));
3696 Ops.push_back(Chain);
3697 break;
3698 case NVPTXISD::Suld1DV2I8Clamp:
3699 Opc = NVPTX::SULD_1D_V2I8_CLAMP;
3700 Ops.push_back(TexHandle);
3701 Ops.push_back(N->getOperand(2));
3702 Ops.push_back(Chain);
3703 break;
3704 case NVPTXISD::Suld1DV2I16Clamp:
3705 Opc = NVPTX::SULD_1D_V2I16_CLAMP;
3706 Ops.push_back(TexHandle);
3707 Ops.push_back(N->getOperand(2));
3708 Ops.push_back(Chain);
3709 break;
3710 case NVPTXISD::Suld1DV2I32Clamp:
3711 Opc = NVPTX::SULD_1D_V2I32_CLAMP;
3712 Ops.push_back(TexHandle);
3713 Ops.push_back(N->getOperand(2));
3714 Ops.push_back(Chain);
3715 break;
3716 case NVPTXISD::Suld1DV2I64Clamp:
3717 Opc = NVPTX::SULD_1D_V2I64_CLAMP;
3718 Ops.push_back(TexHandle);
3719 Ops.push_back(N->getOperand(2));
3720 Ops.push_back(Chain);
3721 break;
3722 case NVPTXISD::Suld1DV4I8Clamp:
3723 Opc = NVPTX::SULD_1D_V4I8_CLAMP;
3724 Ops.push_back(TexHandle);
3725 Ops.push_back(N->getOperand(2));
3726 Ops.push_back(Chain);
3727 break;
3728 case NVPTXISD::Suld1DV4I16Clamp:
3729 Opc = NVPTX::SULD_1D_V4I16_CLAMP;
3730 Ops.push_back(TexHandle);
3731 Ops.push_back(N->getOperand(2));
3732 Ops.push_back(Chain);
3733 break;
3734 case NVPTXISD::Suld1DV4I32Clamp:
3735 Opc = NVPTX::SULD_1D_V4I32_CLAMP;
3736 Ops.push_back(TexHandle);
3737 Ops.push_back(N->getOperand(2));
3738 Ops.push_back(Chain);
3739 break;
3740 case NVPTXISD::Suld1DArrayI8Clamp:
3741 Opc = NVPTX::SULD_1D_ARRAY_I8_CLAMP;
3742 Ops.push_back(TexHandle);
3743 Ops.push_back(N->getOperand(2));
3744 Ops.push_back(N->getOperand(3));
3745 Ops.push_back(Chain);
3746 break;
3747 case NVPTXISD::Suld1DArrayI16Clamp:
3748 Opc = NVPTX::SULD_1D_ARRAY_I16_CLAMP;
3749 Ops.push_back(TexHandle);
3750 Ops.push_back(N->getOperand(2));
3751 Ops.push_back(N->getOperand(3));
3752 Ops.push_back(Chain);
3753 break;
3754 case NVPTXISD::Suld1DArrayI32Clamp:
3755 Opc = NVPTX::SULD_1D_ARRAY_I32_CLAMP;
3756 Ops.push_back(TexHandle);
3757 Ops.push_back(N->getOperand(2));
3758 Ops.push_back(N->getOperand(3));
3759 Ops.push_back(Chain);
3760 break;
3761 case NVPTXISD::Suld1DArrayI64Clamp:
3762 Opc = NVPTX::SULD_1D_ARRAY_I64_CLAMP;
3763 Ops.push_back(TexHandle);
3764 Ops.push_back(N->getOperand(2));
3765 Ops.push_back(N->getOperand(3));
3766 Ops.push_back(Chain);
3767 break;
3768 case NVPTXISD::Suld1DArrayV2I8Clamp:
3769 Opc = NVPTX::SULD_1D_ARRAY_V2I8_CLAMP;
3770 Ops.push_back(TexHandle);
3771 Ops.push_back(N->getOperand(2));
3772 Ops.push_back(N->getOperand(3));
3773 Ops.push_back(Chain);
3774 break;
3775 case NVPTXISD::Suld1DArrayV2I16Clamp:
3776 Opc = NVPTX::SULD_1D_ARRAY_V2I16_CLAMP;
3777 Ops.push_back(TexHandle);
3778 Ops.push_back(N->getOperand(2));
3779 Ops.push_back(N->getOperand(3));
3780 Ops.push_back(Chain);
3781 break;
3782 case NVPTXISD::Suld1DArrayV2I32Clamp:
3783 Opc = NVPTX::SULD_1D_ARRAY_V2I32_CLAMP;
3784 Ops.push_back(TexHandle);
3785 Ops.push_back(N->getOperand(2));
3786 Ops.push_back(N->getOperand(3));
3787 Ops.push_back(Chain);
3788 break;
3789 case NVPTXISD::Suld1DArrayV2I64Clamp:
3790 Opc = NVPTX::SULD_1D_ARRAY_V2I64_CLAMP;
3791 Ops.push_back(TexHandle);
3792 Ops.push_back(N->getOperand(2));
3793 Ops.push_back(N->getOperand(3));
3794 Ops.push_back(Chain);
3795 break;
3796 case NVPTXISD::Suld1DArrayV4I8Clamp:
3797 Opc = NVPTX::SULD_1D_ARRAY_V4I8_CLAMP;
3798 Ops.push_back(TexHandle);
3799 Ops.push_back(N->getOperand(2));
3800 Ops.push_back(N->getOperand(3));
3801 Ops.push_back(Chain);
3802 break;
3803 case NVPTXISD::Suld1DArrayV4I16Clamp:
3804 Opc = NVPTX::SULD_1D_ARRAY_V4I16_CLAMP;
3805 Ops.push_back(TexHandle);
3806 Ops.push_back(N->getOperand(2));
3807 Ops.push_back(N->getOperand(3));
3808 Ops.push_back(Chain);
3809 break;
3810 case NVPTXISD::Suld1DArrayV4I32Clamp:
3811 Opc = NVPTX::SULD_1D_ARRAY_V4I32_CLAMP;
3812 Ops.push_back(TexHandle);
3813 Ops.push_back(N->getOperand(2));
3814 Ops.push_back(N->getOperand(3));
3815 Ops.push_back(Chain);
3816 break;
3817 case NVPTXISD::Suld2DI8Clamp:
3818 Opc = NVPTX::SULD_2D_I8_CLAMP;
3819 Ops.push_back(TexHandle);
3820 Ops.push_back(N->getOperand(2));
3821 Ops.push_back(N->getOperand(3));
3822 Ops.push_back(Chain);
3823 break;
3824 case NVPTXISD::Suld2DI16Clamp:
3825 Opc = NVPTX::SULD_2D_I16_CLAMP;
3826 Ops.push_back(TexHandle);
3827 Ops.push_back(N->getOperand(2));
3828 Ops.push_back(N->getOperand(3));
3829 Ops.push_back(Chain);
3830 break;
3831 case NVPTXISD::Suld2DI32Clamp:
3832 Opc = NVPTX::SULD_2D_I32_CLAMP;
3833 Ops.push_back(TexHandle);
3834 Ops.push_back(N->getOperand(2));
3835 Ops.push_back(N->getOperand(3));
3836 Ops.push_back(Chain);
3837 break;
3838 case NVPTXISD::Suld2DI64Clamp:
3839 Opc = NVPTX::SULD_2D_I64_CLAMP;
3840 Ops.push_back(TexHandle);
3841 Ops.push_back(N->getOperand(2));
3842 Ops.push_back(N->getOperand(3));
3843 Ops.push_back(Chain);
3844 break;
3845 case NVPTXISD::Suld2DV2I8Clamp:
3846 Opc = NVPTX::SULD_2D_V2I8_CLAMP;
3847 Ops.push_back(TexHandle);
3848 Ops.push_back(N->getOperand(2));
3849 Ops.push_back(N->getOperand(3));
3850 Ops.push_back(Chain);
3851 break;
3852 case NVPTXISD::Suld2DV2I16Clamp:
3853 Opc = NVPTX::SULD_2D_V2I16_CLAMP;
3854 Ops.push_back(TexHandle);
3855 Ops.push_back(N->getOperand(2));
3856 Ops.push_back(N->getOperand(3));
3857 Ops.push_back(Chain);
3858 break;
3859 case NVPTXISD::Suld2DV2I32Clamp:
3860 Opc = NVPTX::SULD_2D_V2I32_CLAMP;
3861 Ops.push_back(TexHandle);
3862 Ops.push_back(N->getOperand(2));
3863 Ops.push_back(N->getOperand(3));
3864 Ops.push_back(Chain);
3865 break;
3866 case NVPTXISD::Suld2DV2I64Clamp:
3867 Opc = NVPTX::SULD_2D_V2I64_CLAMP;
3868 Ops.push_back(TexHandle);
3869 Ops.push_back(N->getOperand(2));
3870 Ops.push_back(N->getOperand(3));
3871 Ops.push_back(Chain);
3872 break;
3873 case NVPTXISD::Suld2DV4I8Clamp:
3874 Opc = NVPTX::SULD_2D_V4I8_CLAMP;
3875 Ops.push_back(TexHandle);
3876 Ops.push_back(N->getOperand(2));
3877 Ops.push_back(N->getOperand(3));
3878 Ops.push_back(Chain);
3879 break;
3880 case NVPTXISD::Suld2DV4I16Clamp:
3881 Opc = NVPTX::SULD_2D_V4I16_CLAMP;
3882 Ops.push_back(TexHandle);
3883 Ops.push_back(N->getOperand(2));
3884 Ops.push_back(N->getOperand(3));
3885 Ops.push_back(Chain);
3886 break;
3887 case NVPTXISD::Suld2DV4I32Clamp:
3888 Opc = NVPTX::SULD_2D_V4I32_CLAMP;
3889 Ops.push_back(TexHandle);
3890 Ops.push_back(N->getOperand(2));
3891 Ops.push_back(N->getOperand(3));
3892 Ops.push_back(Chain);
3893 break;
3894 case NVPTXISD::Suld2DArrayI8Clamp:
3895 Opc = NVPTX::SULD_2D_ARRAY_I8_CLAMP;
3896 Ops.push_back(TexHandle);
3897 Ops.push_back(N->getOperand(2));
3898 Ops.push_back(N->getOperand(3));
3899 Ops.push_back(N->getOperand(4));
3900 Ops.push_back(Chain);
3901 break;
3902 case NVPTXISD::Suld2DArrayI16Clamp:
3903 Opc = NVPTX::SULD_2D_ARRAY_I16_CLAMP;
3904 Ops.push_back(TexHandle);
3905 Ops.push_back(N->getOperand(2));
3906 Ops.push_back(N->getOperand(3));
3907 Ops.push_back(N->getOperand(4));
3908 Ops.push_back(Chain);
3909 break;
3910 case NVPTXISD::Suld2DArrayI32Clamp:
3911 Opc = NVPTX::SULD_2D_ARRAY_I32_CLAMP;
3912 Ops.push_back(TexHandle);
3913 Ops.push_back(N->getOperand(2));
3914 Ops.push_back(N->getOperand(3));
3915 Ops.push_back(N->getOperand(4));
3916 Ops.push_back(Chain);
3917 break;
3918 case NVPTXISD::Suld2DArrayI64Clamp:
3919 Opc = NVPTX::SULD_2D_ARRAY_I64_CLAMP;
3920 Ops.push_back(TexHandle);
3921 Ops.push_back(N->getOperand(2));
3922 Ops.push_back(N->getOperand(3));
3923 Ops.push_back(N->getOperand(4));
3924 Ops.push_back(Chain);
3925 break;
3926 case NVPTXISD::Suld2DArrayV2I8Clamp:
3927 Opc = NVPTX::SULD_2D_ARRAY_V2I8_CLAMP;
3928 Ops.push_back(TexHandle);
3929 Ops.push_back(N->getOperand(2));
3930 Ops.push_back(N->getOperand(3));
3931 Ops.push_back(N->getOperand(4));
3932 Ops.push_back(Chain);
3933 break;
3934 case NVPTXISD::Suld2DArrayV2I16Clamp:
3935 Opc = NVPTX::SULD_2D_ARRAY_V2I16_CLAMP;
3936 Ops.push_back(TexHandle);
3937 Ops.push_back(N->getOperand(2));
3938 Ops.push_back(N->getOperand(3));
3939 Ops.push_back(N->getOperand(4));
3940 Ops.push_back(Chain);
3941 break;
3942 case NVPTXISD::Suld2DArrayV2I32Clamp:
3943 Opc = NVPTX::SULD_2D_ARRAY_V2I32_CLAMP;
3944 Ops.push_back(TexHandle);
3945 Ops.push_back(N->getOperand(2));
3946 Ops.push_back(N->getOperand(3));
3947 Ops.push_back(N->getOperand(4));
3948 Ops.push_back(Chain);
3949 break;
3950 case NVPTXISD::Suld2DArrayV2I64Clamp:
3951 Opc = NVPTX::SULD_2D_ARRAY_V2I64_CLAMP;
3952 Ops.push_back(TexHandle);
3953 Ops.push_back(N->getOperand(2));
3954 Ops.push_back(N->getOperand(3));
3955 Ops.push_back(N->getOperand(4));
3956 Ops.push_back(Chain);
3957 break;
3958 case NVPTXISD::Suld2DArrayV4I8Clamp:
3959 Opc = NVPTX::SULD_2D_ARRAY_V4I8_CLAMP;
3960 Ops.push_back(TexHandle);
3961 Ops.push_back(N->getOperand(2));
3962 Ops.push_back(N->getOperand(3));
3963 Ops.push_back(N->getOperand(4));
3964 Ops.push_back(Chain);
3965 break;
3966 case NVPTXISD::Suld2DArrayV4I16Clamp:
3967 Opc = NVPTX::SULD_2D_ARRAY_V4I16_CLAMP;
3968 Ops.push_back(TexHandle);
3969 Ops.push_back(N->getOperand(2));
3970 Ops.push_back(N->getOperand(3));
3971 Ops.push_back(N->getOperand(4));
3972 Ops.push_back(Chain);
3973 break;
3974 case NVPTXISD::Suld2DArrayV4I32Clamp:
3975 Opc = NVPTX::SULD_2D_ARRAY_V4I32_CLAMP;
3976 Ops.push_back(TexHandle);
3977 Ops.push_back(N->getOperand(2));
3978 Ops.push_back(N->getOperand(3));
3979 Ops.push_back(N->getOperand(4));
3980 Ops.push_back(Chain);
3981 break;
3982 case NVPTXISD::Suld3DI8Clamp:
3983 Opc = NVPTX::SULD_3D_I8_CLAMP;
3984 Ops.push_back(TexHandle);
3985 Ops.push_back(N->getOperand(2));
3986 Ops.push_back(N->getOperand(3));
3987 Ops.push_back(N->getOperand(4));
3988 Ops.push_back(Chain);
3989 break;
3990 case NVPTXISD::Suld3DI16Clamp:
3991 Opc = NVPTX::SULD_3D_I16_CLAMP;
3992 Ops.push_back(TexHandle);
3993 Ops.push_back(N->getOperand(2));
3994 Ops.push_back(N->getOperand(3));
3995 Ops.push_back(N->getOperand(4));
3996 Ops.push_back(Chain);
3997 break;
3998 case NVPTXISD::Suld3DI32Clamp:
3999 Opc = NVPTX::SULD_3D_I32_CLAMP;
4000 Ops.push_back(TexHandle);
4001 Ops.push_back(N->getOperand(2));
4002 Ops.push_back(N->getOperand(3));
4003 Ops.push_back(N->getOperand(4));
4004 Ops.push_back(Chain);
4005 break;
4006 case NVPTXISD::Suld3DI64Clamp:
4007 Opc = NVPTX::SULD_3D_I64_CLAMP;
4008 Ops.push_back(TexHandle);
4009 Ops.push_back(N->getOperand(2));
4010 Ops.push_back(N->getOperand(3));
4011 Ops.push_back(N->getOperand(4));
4012 Ops.push_back(Chain);
4013 break;
4014 case NVPTXISD::Suld3DV2I8Clamp:
4015 Opc = NVPTX::SULD_3D_V2I8_CLAMP;
4016 Ops.push_back(TexHandle);
4017 Ops.push_back(N->getOperand(2));
4018 Ops.push_back(N->getOperand(3));
4019 Ops.push_back(N->getOperand(4));
4020 Ops.push_back(Chain);
4021 break;
4022 case NVPTXISD::Suld3DV2I16Clamp:
4023 Opc = NVPTX::SULD_3D_V2I16_CLAMP;
4024 Ops.push_back(TexHandle);
4025 Ops.push_back(N->getOperand(2));
4026 Ops.push_back(N->getOperand(3));
4027 Ops.push_back(N->getOperand(4));
4028 Ops.push_back(Chain);
4029 break;
4030 case NVPTXISD::Suld3DV2I32Clamp:
4031 Opc = NVPTX::SULD_3D_V2I32_CLAMP;
4032 Ops.push_back(TexHandle);
4033 Ops.push_back(N->getOperand(2));
4034 Ops.push_back(N->getOperand(3));
4035 Ops.push_back(N->getOperand(4));
4036 Ops.push_back(Chain);
4037 break;
4038 case NVPTXISD::Suld3DV2I64Clamp:
4039 Opc = NVPTX::SULD_3D_V2I64_CLAMP;
4040 Ops.push_back(TexHandle);
4041 Ops.push_back(N->getOperand(2));
4042 Ops.push_back(N->getOperand(3));
4043 Ops.push_back(N->getOperand(4));
4044 Ops.push_back(Chain);
4045 break;
4046 case NVPTXISD::Suld3DV4I8Clamp:
4047 Opc = NVPTX::SULD_3D_V4I8_CLAMP;
4048 Ops.push_back(TexHandle);
4049 Ops.push_back(N->getOperand(2));
4050 Ops.push_back(N->getOperand(3));
4051 Ops.push_back(N->getOperand(4));
4052 Ops.push_back(Chain);
4053 break;
4054 case NVPTXISD::Suld3DV4I16Clamp:
4055 Opc = NVPTX::SULD_3D_V4I16_CLAMP;
4056 Ops.push_back(TexHandle);
4057 Ops.push_back(N->getOperand(2));
4058 Ops.push_back(N->getOperand(3));
4059 Ops.push_back(N->getOperand(4));
4060 Ops.push_back(Chain);
4061 break;
4062 case NVPTXISD::Suld3DV4I32Clamp:
4063 Opc = NVPTX::SULD_3D_V4I32_CLAMP;
4064 Ops.push_back(TexHandle);
4065 Ops.push_back(N->getOperand(2));
4066 Ops.push_back(N->getOperand(3));
4067 Ops.push_back(N->getOperand(4));
4068 Ops.push_back(Chain);
4069 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004070 case NVPTXISD::Suld1DI8Trap:
4071 Opc = NVPTX::SULD_1D_I8_TRAP;
4072 Ops.push_back(TexHandle);
4073 Ops.push_back(N->getOperand(2));
4074 Ops.push_back(Chain);
4075 break;
4076 case NVPTXISD::Suld1DI16Trap:
4077 Opc = NVPTX::SULD_1D_I16_TRAP;
4078 Ops.push_back(TexHandle);
4079 Ops.push_back(N->getOperand(2));
4080 Ops.push_back(Chain);
4081 break;
4082 case NVPTXISD::Suld1DI32Trap:
4083 Opc = NVPTX::SULD_1D_I32_TRAP;
4084 Ops.push_back(TexHandle);
4085 Ops.push_back(N->getOperand(2));
4086 Ops.push_back(Chain);
4087 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004088 case NVPTXISD::Suld1DI64Trap:
4089 Opc = NVPTX::SULD_1D_I64_TRAP;
4090 Ops.push_back(TexHandle);
4091 Ops.push_back(N->getOperand(2));
4092 Ops.push_back(Chain);
4093 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004094 case NVPTXISD::Suld1DV2I8Trap:
4095 Opc = NVPTX::SULD_1D_V2I8_TRAP;
4096 Ops.push_back(TexHandle);
4097 Ops.push_back(N->getOperand(2));
4098 Ops.push_back(Chain);
4099 break;
4100 case NVPTXISD::Suld1DV2I16Trap:
4101 Opc = NVPTX::SULD_1D_V2I16_TRAP;
4102 Ops.push_back(TexHandle);
4103 Ops.push_back(N->getOperand(2));
4104 Ops.push_back(Chain);
4105 break;
4106 case NVPTXISD::Suld1DV2I32Trap:
4107 Opc = NVPTX::SULD_1D_V2I32_TRAP;
4108 Ops.push_back(TexHandle);
4109 Ops.push_back(N->getOperand(2));
4110 Ops.push_back(Chain);
4111 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004112 case NVPTXISD::Suld1DV2I64Trap:
4113 Opc = NVPTX::SULD_1D_V2I64_TRAP;
4114 Ops.push_back(TexHandle);
4115 Ops.push_back(N->getOperand(2));
4116 Ops.push_back(Chain);
4117 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004118 case NVPTXISD::Suld1DV4I8Trap:
4119 Opc = NVPTX::SULD_1D_V4I8_TRAP;
4120 Ops.push_back(TexHandle);
4121 Ops.push_back(N->getOperand(2));
4122 Ops.push_back(Chain);
4123 break;
4124 case NVPTXISD::Suld1DV4I16Trap:
4125 Opc = NVPTX::SULD_1D_V4I16_TRAP;
4126 Ops.push_back(TexHandle);
4127 Ops.push_back(N->getOperand(2));
4128 Ops.push_back(Chain);
4129 break;
4130 case NVPTXISD::Suld1DV4I32Trap:
4131 Opc = NVPTX::SULD_1D_V4I32_TRAP;
4132 Ops.push_back(TexHandle);
4133 Ops.push_back(N->getOperand(2));
4134 Ops.push_back(Chain);
4135 break;
4136 case NVPTXISD::Suld1DArrayI8Trap:
4137 Opc = NVPTX::SULD_1D_ARRAY_I8_TRAP;
4138 Ops.push_back(TexHandle);
4139 Ops.push_back(N->getOperand(2));
4140 Ops.push_back(N->getOperand(3));
4141 Ops.push_back(Chain);
4142 break;
4143 case NVPTXISD::Suld1DArrayI16Trap:
4144 Opc = NVPTX::SULD_1D_ARRAY_I16_TRAP;
4145 Ops.push_back(TexHandle);
4146 Ops.push_back(N->getOperand(2));
4147 Ops.push_back(N->getOperand(3));
4148 Ops.push_back(Chain);
4149 break;
4150 case NVPTXISD::Suld1DArrayI32Trap:
4151 Opc = NVPTX::SULD_1D_ARRAY_I32_TRAP;
4152 Ops.push_back(TexHandle);
4153 Ops.push_back(N->getOperand(2));
4154 Ops.push_back(N->getOperand(3));
4155 Ops.push_back(Chain);
4156 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004157 case NVPTXISD::Suld1DArrayI64Trap:
4158 Opc = NVPTX::SULD_1D_ARRAY_I64_TRAP;
4159 Ops.push_back(TexHandle);
4160 Ops.push_back(N->getOperand(2));
4161 Ops.push_back(N->getOperand(3));
4162 Ops.push_back(Chain);
4163 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004164 case NVPTXISD::Suld1DArrayV2I8Trap:
4165 Opc = NVPTX::SULD_1D_ARRAY_V2I8_TRAP;
4166 Ops.push_back(TexHandle);
4167 Ops.push_back(N->getOperand(2));
4168 Ops.push_back(N->getOperand(3));
4169 Ops.push_back(Chain);
4170 break;
4171 case NVPTXISD::Suld1DArrayV2I16Trap:
4172 Opc = NVPTX::SULD_1D_ARRAY_V2I16_TRAP;
4173 Ops.push_back(TexHandle);
4174 Ops.push_back(N->getOperand(2));
4175 Ops.push_back(N->getOperand(3));
4176 Ops.push_back(Chain);
4177 break;
4178 case NVPTXISD::Suld1DArrayV2I32Trap:
4179 Opc = NVPTX::SULD_1D_ARRAY_V2I32_TRAP;
4180 Ops.push_back(TexHandle);
4181 Ops.push_back(N->getOperand(2));
4182 Ops.push_back(N->getOperand(3));
4183 Ops.push_back(Chain);
4184 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004185 case NVPTXISD::Suld1DArrayV2I64Trap:
4186 Opc = NVPTX::SULD_1D_ARRAY_V2I64_TRAP;
4187 Ops.push_back(TexHandle);
4188 Ops.push_back(N->getOperand(2));
4189 Ops.push_back(N->getOperand(3));
4190 Ops.push_back(Chain);
4191 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004192 case NVPTXISD::Suld1DArrayV4I8Trap:
4193 Opc = NVPTX::SULD_1D_ARRAY_V4I8_TRAP;
4194 Ops.push_back(TexHandle);
4195 Ops.push_back(N->getOperand(2));
4196 Ops.push_back(N->getOperand(3));
4197 Ops.push_back(Chain);
4198 break;
4199 case NVPTXISD::Suld1DArrayV4I16Trap:
4200 Opc = NVPTX::SULD_1D_ARRAY_V4I16_TRAP;
4201 Ops.push_back(TexHandle);
4202 Ops.push_back(N->getOperand(2));
4203 Ops.push_back(N->getOperand(3));
4204 Ops.push_back(Chain);
4205 break;
4206 case NVPTXISD::Suld1DArrayV4I32Trap:
4207 Opc = NVPTX::SULD_1D_ARRAY_V4I32_TRAP;
4208 Ops.push_back(TexHandle);
4209 Ops.push_back(N->getOperand(2));
4210 Ops.push_back(N->getOperand(3));
4211 Ops.push_back(Chain);
4212 break;
4213 case NVPTXISD::Suld2DI8Trap:
4214 Opc = NVPTX::SULD_2D_I8_TRAP;
4215 Ops.push_back(TexHandle);
4216 Ops.push_back(N->getOperand(2));
4217 Ops.push_back(N->getOperand(3));
4218 Ops.push_back(Chain);
4219 break;
4220 case NVPTXISD::Suld2DI16Trap:
4221 Opc = NVPTX::SULD_2D_I16_TRAP;
4222 Ops.push_back(TexHandle);
4223 Ops.push_back(N->getOperand(2));
4224 Ops.push_back(N->getOperand(3));
4225 Ops.push_back(Chain);
4226 break;
4227 case NVPTXISD::Suld2DI32Trap:
4228 Opc = NVPTX::SULD_2D_I32_TRAP;
4229 Ops.push_back(TexHandle);
4230 Ops.push_back(N->getOperand(2));
4231 Ops.push_back(N->getOperand(3));
4232 Ops.push_back(Chain);
4233 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004234 case NVPTXISD::Suld2DI64Trap:
4235 Opc = NVPTX::SULD_2D_I64_TRAP;
4236 Ops.push_back(TexHandle);
4237 Ops.push_back(N->getOperand(2));
4238 Ops.push_back(N->getOperand(3));
4239 Ops.push_back(Chain);
4240 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004241 case NVPTXISD::Suld2DV2I8Trap:
4242 Opc = NVPTX::SULD_2D_V2I8_TRAP;
4243 Ops.push_back(TexHandle);
4244 Ops.push_back(N->getOperand(2));
4245 Ops.push_back(N->getOperand(3));
4246 Ops.push_back(Chain);
4247 break;
4248 case NVPTXISD::Suld2DV2I16Trap:
4249 Opc = NVPTX::SULD_2D_V2I16_TRAP;
4250 Ops.push_back(TexHandle);
4251 Ops.push_back(N->getOperand(2));
4252 Ops.push_back(N->getOperand(3));
4253 Ops.push_back(Chain);
4254 break;
4255 case NVPTXISD::Suld2DV2I32Trap:
4256 Opc = NVPTX::SULD_2D_V2I32_TRAP;
4257 Ops.push_back(TexHandle);
4258 Ops.push_back(N->getOperand(2));
4259 Ops.push_back(N->getOperand(3));
4260 Ops.push_back(Chain);
4261 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004262 case NVPTXISD::Suld2DV2I64Trap:
4263 Opc = NVPTX::SULD_2D_V2I64_TRAP;
4264 Ops.push_back(TexHandle);
4265 Ops.push_back(N->getOperand(2));
4266 Ops.push_back(N->getOperand(3));
4267 Ops.push_back(Chain);
4268 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004269 case NVPTXISD::Suld2DV4I8Trap:
4270 Opc = NVPTX::SULD_2D_V4I8_TRAP;
4271 Ops.push_back(TexHandle);
4272 Ops.push_back(N->getOperand(2));
4273 Ops.push_back(N->getOperand(3));
4274 Ops.push_back(Chain);
4275 break;
4276 case NVPTXISD::Suld2DV4I16Trap:
4277 Opc = NVPTX::SULD_2D_V4I16_TRAP;
4278 Ops.push_back(TexHandle);
4279 Ops.push_back(N->getOperand(2));
4280 Ops.push_back(N->getOperand(3));
4281 Ops.push_back(Chain);
4282 break;
4283 case NVPTXISD::Suld2DV4I32Trap:
4284 Opc = NVPTX::SULD_2D_V4I32_TRAP;
4285 Ops.push_back(TexHandle);
4286 Ops.push_back(N->getOperand(2));
4287 Ops.push_back(N->getOperand(3));
4288 Ops.push_back(Chain);
4289 break;
4290 case NVPTXISD::Suld2DArrayI8Trap:
4291 Opc = NVPTX::SULD_2D_ARRAY_I8_TRAP;
4292 Ops.push_back(TexHandle);
4293 Ops.push_back(N->getOperand(2));
4294 Ops.push_back(N->getOperand(3));
4295 Ops.push_back(N->getOperand(4));
4296 Ops.push_back(Chain);
4297 break;
4298 case NVPTXISD::Suld2DArrayI16Trap:
4299 Opc = NVPTX::SULD_2D_ARRAY_I16_TRAP;
4300 Ops.push_back(TexHandle);
4301 Ops.push_back(N->getOperand(2));
4302 Ops.push_back(N->getOperand(3));
4303 Ops.push_back(N->getOperand(4));
4304 Ops.push_back(Chain);
4305 break;
4306 case NVPTXISD::Suld2DArrayI32Trap:
4307 Opc = NVPTX::SULD_2D_ARRAY_I32_TRAP;
4308 Ops.push_back(TexHandle);
4309 Ops.push_back(N->getOperand(2));
4310 Ops.push_back(N->getOperand(3));
4311 Ops.push_back(N->getOperand(4));
4312 Ops.push_back(Chain);
4313 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004314 case NVPTXISD::Suld2DArrayI64Trap:
4315 Opc = NVPTX::SULD_2D_ARRAY_I64_TRAP;
4316 Ops.push_back(TexHandle);
4317 Ops.push_back(N->getOperand(2));
4318 Ops.push_back(N->getOperand(3));
4319 Ops.push_back(N->getOperand(4));
4320 Ops.push_back(Chain);
4321 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004322 case NVPTXISD::Suld2DArrayV2I8Trap:
4323 Opc = NVPTX::SULD_2D_ARRAY_V2I8_TRAP;
4324 Ops.push_back(TexHandle);
4325 Ops.push_back(N->getOperand(2));
4326 Ops.push_back(N->getOperand(3));
4327 Ops.push_back(N->getOperand(4));
4328 Ops.push_back(Chain);
4329 break;
4330 case NVPTXISD::Suld2DArrayV2I16Trap:
4331 Opc = NVPTX::SULD_2D_ARRAY_V2I16_TRAP;
4332 Ops.push_back(TexHandle);
4333 Ops.push_back(N->getOperand(2));
4334 Ops.push_back(N->getOperand(3));
4335 Ops.push_back(N->getOperand(4));
4336 Ops.push_back(Chain);
4337 break;
4338 case NVPTXISD::Suld2DArrayV2I32Trap:
4339 Opc = NVPTX::SULD_2D_ARRAY_V2I32_TRAP;
4340 Ops.push_back(TexHandle);
4341 Ops.push_back(N->getOperand(2));
4342 Ops.push_back(N->getOperand(3));
4343 Ops.push_back(N->getOperand(4));
4344 Ops.push_back(Chain);
4345 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004346 case NVPTXISD::Suld2DArrayV2I64Trap:
4347 Opc = NVPTX::SULD_2D_ARRAY_V2I64_TRAP;
4348 Ops.push_back(TexHandle);
4349 Ops.push_back(N->getOperand(2));
4350 Ops.push_back(N->getOperand(3));
4351 Ops.push_back(N->getOperand(4));
4352 Ops.push_back(Chain);
4353 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004354 case NVPTXISD::Suld2DArrayV4I8Trap:
4355 Opc = NVPTX::SULD_2D_ARRAY_V4I8_TRAP;
4356 Ops.push_back(TexHandle);
4357 Ops.push_back(N->getOperand(2));
4358 Ops.push_back(N->getOperand(3));
4359 Ops.push_back(N->getOperand(4));
4360 Ops.push_back(Chain);
4361 break;
4362 case NVPTXISD::Suld2DArrayV4I16Trap:
4363 Opc = NVPTX::SULD_2D_ARRAY_V4I16_TRAP;
4364 Ops.push_back(TexHandle);
4365 Ops.push_back(N->getOperand(2));
4366 Ops.push_back(N->getOperand(3));
4367 Ops.push_back(N->getOperand(4));
4368 Ops.push_back(Chain);
4369 break;
4370 case NVPTXISD::Suld2DArrayV4I32Trap:
4371 Opc = NVPTX::SULD_2D_ARRAY_V4I32_TRAP;
4372 Ops.push_back(TexHandle);
4373 Ops.push_back(N->getOperand(2));
4374 Ops.push_back(N->getOperand(3));
4375 Ops.push_back(N->getOperand(4));
4376 Ops.push_back(Chain);
4377 break;
4378 case NVPTXISD::Suld3DI8Trap:
4379 Opc = NVPTX::SULD_3D_I8_TRAP;
4380 Ops.push_back(TexHandle);
4381 Ops.push_back(N->getOperand(2));
4382 Ops.push_back(N->getOperand(3));
4383 Ops.push_back(N->getOperand(4));
4384 Ops.push_back(Chain);
4385 break;
4386 case NVPTXISD::Suld3DI16Trap:
4387 Opc = NVPTX::SULD_3D_I16_TRAP;
4388 Ops.push_back(TexHandle);
4389 Ops.push_back(N->getOperand(2));
4390 Ops.push_back(N->getOperand(3));
4391 Ops.push_back(N->getOperand(4));
4392 Ops.push_back(Chain);
4393 break;
4394 case NVPTXISD::Suld3DI32Trap:
4395 Opc = NVPTX::SULD_3D_I32_TRAP;
4396 Ops.push_back(TexHandle);
4397 Ops.push_back(N->getOperand(2));
4398 Ops.push_back(N->getOperand(3));
4399 Ops.push_back(N->getOperand(4));
4400 Ops.push_back(Chain);
4401 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004402 case NVPTXISD::Suld3DI64Trap:
4403 Opc = NVPTX::SULD_3D_I64_TRAP;
4404 Ops.push_back(TexHandle);
4405 Ops.push_back(N->getOperand(2));
4406 Ops.push_back(N->getOperand(3));
4407 Ops.push_back(N->getOperand(4));
4408 Ops.push_back(Chain);
4409 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004410 case NVPTXISD::Suld3DV2I8Trap:
4411 Opc = NVPTX::SULD_3D_V2I8_TRAP;
4412 Ops.push_back(TexHandle);
4413 Ops.push_back(N->getOperand(2));
4414 Ops.push_back(N->getOperand(3));
4415 Ops.push_back(N->getOperand(4));
4416 Ops.push_back(Chain);
4417 break;
4418 case NVPTXISD::Suld3DV2I16Trap:
4419 Opc = NVPTX::SULD_3D_V2I16_TRAP;
4420 Ops.push_back(TexHandle);
4421 Ops.push_back(N->getOperand(2));
4422 Ops.push_back(N->getOperand(3));
4423 Ops.push_back(N->getOperand(4));
4424 Ops.push_back(Chain);
4425 break;
4426 case NVPTXISD::Suld3DV2I32Trap:
4427 Opc = NVPTX::SULD_3D_V2I32_TRAP;
4428 Ops.push_back(TexHandle);
4429 Ops.push_back(N->getOperand(2));
4430 Ops.push_back(N->getOperand(3));
4431 Ops.push_back(N->getOperand(4));
4432 Ops.push_back(Chain);
4433 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004434 case NVPTXISD::Suld3DV2I64Trap:
4435 Opc = NVPTX::SULD_3D_V2I64_TRAP;
4436 Ops.push_back(TexHandle);
4437 Ops.push_back(N->getOperand(2));
4438 Ops.push_back(N->getOperand(3));
4439 Ops.push_back(N->getOperand(4));
4440 Ops.push_back(Chain);
4441 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004442 case NVPTXISD::Suld3DV4I8Trap:
4443 Opc = NVPTX::SULD_3D_V4I8_TRAP;
4444 Ops.push_back(TexHandle);
4445 Ops.push_back(N->getOperand(2));
4446 Ops.push_back(N->getOperand(3));
4447 Ops.push_back(N->getOperand(4));
4448 Ops.push_back(Chain);
4449 break;
4450 case NVPTXISD::Suld3DV4I16Trap:
4451 Opc = NVPTX::SULD_3D_V4I16_TRAP;
4452 Ops.push_back(TexHandle);
4453 Ops.push_back(N->getOperand(2));
4454 Ops.push_back(N->getOperand(3));
4455 Ops.push_back(N->getOperand(4));
4456 Ops.push_back(Chain);
4457 break;
4458 case NVPTXISD::Suld3DV4I32Trap:
4459 Opc = NVPTX::SULD_3D_V4I32_TRAP;
4460 Ops.push_back(TexHandle);
4461 Ops.push_back(N->getOperand(2));
4462 Ops.push_back(N->getOperand(3));
4463 Ops.push_back(N->getOperand(4));
4464 Ops.push_back(Chain);
4465 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004466 case NVPTXISD::Suld1DI8Zero:
4467 Opc = NVPTX::SULD_1D_I8_ZERO;
4468 Ops.push_back(TexHandle);
4469 Ops.push_back(N->getOperand(2));
4470 Ops.push_back(Chain);
4471 break;
4472 case NVPTXISD::Suld1DI16Zero:
4473 Opc = NVPTX::SULD_1D_I16_ZERO;
4474 Ops.push_back(TexHandle);
4475 Ops.push_back(N->getOperand(2));
4476 Ops.push_back(Chain);
4477 break;
4478 case NVPTXISD::Suld1DI32Zero:
4479 Opc = NVPTX::SULD_1D_I32_ZERO;
4480 Ops.push_back(TexHandle);
4481 Ops.push_back(N->getOperand(2));
4482 Ops.push_back(Chain);
4483 break;
4484 case NVPTXISD::Suld1DI64Zero:
4485 Opc = NVPTX::SULD_1D_I64_ZERO;
4486 Ops.push_back(TexHandle);
4487 Ops.push_back(N->getOperand(2));
4488 Ops.push_back(Chain);
4489 break;
4490 case NVPTXISD::Suld1DV2I8Zero:
4491 Opc = NVPTX::SULD_1D_V2I8_ZERO;
4492 Ops.push_back(TexHandle);
4493 Ops.push_back(N->getOperand(2));
4494 Ops.push_back(Chain);
4495 break;
4496 case NVPTXISD::Suld1DV2I16Zero:
4497 Opc = NVPTX::SULD_1D_V2I16_ZERO;
4498 Ops.push_back(TexHandle);
4499 Ops.push_back(N->getOperand(2));
4500 Ops.push_back(Chain);
4501 break;
4502 case NVPTXISD::Suld1DV2I32Zero:
4503 Opc = NVPTX::SULD_1D_V2I32_ZERO;
4504 Ops.push_back(TexHandle);
4505 Ops.push_back(N->getOperand(2));
4506 Ops.push_back(Chain);
4507 break;
4508 case NVPTXISD::Suld1DV2I64Zero:
4509 Opc = NVPTX::SULD_1D_V2I64_ZERO;
4510 Ops.push_back(TexHandle);
4511 Ops.push_back(N->getOperand(2));
4512 Ops.push_back(Chain);
4513 break;
4514 case NVPTXISD::Suld1DV4I8Zero:
4515 Opc = NVPTX::SULD_1D_V4I8_ZERO;
4516 Ops.push_back(TexHandle);
4517 Ops.push_back(N->getOperand(2));
4518 Ops.push_back(Chain);
4519 break;
4520 case NVPTXISD::Suld1DV4I16Zero:
4521 Opc = NVPTX::SULD_1D_V4I16_ZERO;
4522 Ops.push_back(TexHandle);
4523 Ops.push_back(N->getOperand(2));
4524 Ops.push_back(Chain);
4525 break;
4526 case NVPTXISD::Suld1DV4I32Zero:
4527 Opc = NVPTX::SULD_1D_V4I32_ZERO;
4528 Ops.push_back(TexHandle);
4529 Ops.push_back(N->getOperand(2));
4530 Ops.push_back(Chain);
4531 break;
4532 case NVPTXISD::Suld1DArrayI8Zero:
4533 Opc = NVPTX::SULD_1D_ARRAY_I8_ZERO;
4534 Ops.push_back(TexHandle);
4535 Ops.push_back(N->getOperand(2));
4536 Ops.push_back(N->getOperand(3));
4537 Ops.push_back(Chain);
4538 break;
4539 case NVPTXISD::Suld1DArrayI16Zero:
4540 Opc = NVPTX::SULD_1D_ARRAY_I16_ZERO;
4541 Ops.push_back(TexHandle);
4542 Ops.push_back(N->getOperand(2));
4543 Ops.push_back(N->getOperand(3));
4544 Ops.push_back(Chain);
4545 break;
4546 case NVPTXISD::Suld1DArrayI32Zero:
4547 Opc = NVPTX::SULD_1D_ARRAY_I32_ZERO;
4548 Ops.push_back(TexHandle);
4549 Ops.push_back(N->getOperand(2));
4550 Ops.push_back(N->getOperand(3));
4551 Ops.push_back(Chain);
4552 break;
4553 case NVPTXISD::Suld1DArrayI64Zero:
4554 Opc = NVPTX::SULD_1D_ARRAY_I64_ZERO;
4555 Ops.push_back(TexHandle);
4556 Ops.push_back(N->getOperand(2));
4557 Ops.push_back(N->getOperand(3));
4558 Ops.push_back(Chain);
4559 break;
4560 case NVPTXISD::Suld1DArrayV2I8Zero:
4561 Opc = NVPTX::SULD_1D_ARRAY_V2I8_ZERO;
4562 Ops.push_back(TexHandle);
4563 Ops.push_back(N->getOperand(2));
4564 Ops.push_back(N->getOperand(3));
4565 Ops.push_back(Chain);
4566 break;
4567 case NVPTXISD::Suld1DArrayV2I16Zero:
4568 Opc = NVPTX::SULD_1D_ARRAY_V2I16_ZERO;
4569 Ops.push_back(TexHandle);
4570 Ops.push_back(N->getOperand(2));
4571 Ops.push_back(N->getOperand(3));
4572 Ops.push_back(Chain);
4573 break;
4574 case NVPTXISD::Suld1DArrayV2I32Zero:
4575 Opc = NVPTX::SULD_1D_ARRAY_V2I32_ZERO;
4576 Ops.push_back(TexHandle);
4577 Ops.push_back(N->getOperand(2));
4578 Ops.push_back(N->getOperand(3));
4579 Ops.push_back(Chain);
4580 break;
4581 case NVPTXISD::Suld1DArrayV2I64Zero:
4582 Opc = NVPTX::SULD_1D_ARRAY_V2I64_ZERO;
4583 Ops.push_back(TexHandle);
4584 Ops.push_back(N->getOperand(2));
4585 Ops.push_back(N->getOperand(3));
4586 Ops.push_back(Chain);
4587 break;
4588 case NVPTXISD::Suld1DArrayV4I8Zero:
4589 Opc = NVPTX::SULD_1D_ARRAY_V4I8_ZERO;
4590 Ops.push_back(TexHandle);
4591 Ops.push_back(N->getOperand(2));
4592 Ops.push_back(N->getOperand(3));
4593 Ops.push_back(Chain);
4594 break;
4595 case NVPTXISD::Suld1DArrayV4I16Zero:
4596 Opc = NVPTX::SULD_1D_ARRAY_V4I16_ZERO;
4597 Ops.push_back(TexHandle);
4598 Ops.push_back(N->getOperand(2));
4599 Ops.push_back(N->getOperand(3));
4600 Ops.push_back(Chain);
4601 break;
4602 case NVPTXISD::Suld1DArrayV4I32Zero:
4603 Opc = NVPTX::SULD_1D_ARRAY_V4I32_ZERO;
4604 Ops.push_back(TexHandle);
4605 Ops.push_back(N->getOperand(2));
4606 Ops.push_back(N->getOperand(3));
4607 Ops.push_back(Chain);
4608 break;
4609 case NVPTXISD::Suld2DI8Zero:
4610 Opc = NVPTX::SULD_2D_I8_ZERO;
4611 Ops.push_back(TexHandle);
4612 Ops.push_back(N->getOperand(2));
4613 Ops.push_back(N->getOperand(3));
4614 Ops.push_back(Chain);
4615 break;
4616 case NVPTXISD::Suld2DI16Zero:
4617 Opc = NVPTX::SULD_2D_I16_ZERO;
4618 Ops.push_back(TexHandle);
4619 Ops.push_back(N->getOperand(2));
4620 Ops.push_back(N->getOperand(3));
4621 Ops.push_back(Chain);
4622 break;
4623 case NVPTXISD::Suld2DI32Zero:
4624 Opc = NVPTX::SULD_2D_I32_ZERO;
4625 Ops.push_back(TexHandle);
4626 Ops.push_back(N->getOperand(2));
4627 Ops.push_back(N->getOperand(3));
4628 Ops.push_back(Chain);
4629 break;
4630 case NVPTXISD::Suld2DI64Zero:
4631 Opc = NVPTX::SULD_2D_I64_ZERO;
4632 Ops.push_back(TexHandle);
4633 Ops.push_back(N->getOperand(2));
4634 Ops.push_back(N->getOperand(3));
4635 Ops.push_back(Chain);
4636 break;
4637 case NVPTXISD::Suld2DV2I8Zero:
4638 Opc = NVPTX::SULD_2D_V2I8_ZERO;
4639 Ops.push_back(TexHandle);
4640 Ops.push_back(N->getOperand(2));
4641 Ops.push_back(N->getOperand(3));
4642 Ops.push_back(Chain);
4643 break;
4644 case NVPTXISD::Suld2DV2I16Zero:
4645 Opc = NVPTX::SULD_2D_V2I16_ZERO;
4646 Ops.push_back(TexHandle);
4647 Ops.push_back(N->getOperand(2));
4648 Ops.push_back(N->getOperand(3));
4649 Ops.push_back(Chain);
4650 break;
4651 case NVPTXISD::Suld2DV2I32Zero:
4652 Opc = NVPTX::SULD_2D_V2I32_ZERO;
4653 Ops.push_back(TexHandle);
4654 Ops.push_back(N->getOperand(2));
4655 Ops.push_back(N->getOperand(3));
4656 Ops.push_back(Chain);
4657 break;
4658 case NVPTXISD::Suld2DV2I64Zero:
4659 Opc = NVPTX::SULD_2D_V2I64_ZERO;
4660 Ops.push_back(TexHandle);
4661 Ops.push_back(N->getOperand(2));
4662 Ops.push_back(N->getOperand(3));
4663 Ops.push_back(Chain);
4664 break;
4665 case NVPTXISD::Suld2DV4I8Zero:
4666 Opc = NVPTX::SULD_2D_V4I8_ZERO;
4667 Ops.push_back(TexHandle);
4668 Ops.push_back(N->getOperand(2));
4669 Ops.push_back(N->getOperand(3));
4670 Ops.push_back(Chain);
4671 break;
4672 case NVPTXISD::Suld2DV4I16Zero:
4673 Opc = NVPTX::SULD_2D_V4I16_ZERO;
4674 Ops.push_back(TexHandle);
4675 Ops.push_back(N->getOperand(2));
4676 Ops.push_back(N->getOperand(3));
4677 Ops.push_back(Chain);
4678 break;
4679 case NVPTXISD::Suld2DV4I32Zero:
4680 Opc = NVPTX::SULD_2D_V4I32_ZERO;
4681 Ops.push_back(TexHandle);
4682 Ops.push_back(N->getOperand(2));
4683 Ops.push_back(N->getOperand(3));
4684 Ops.push_back(Chain);
4685 break;
4686 case NVPTXISD::Suld2DArrayI8Zero:
4687 Opc = NVPTX::SULD_2D_ARRAY_I8_ZERO;
4688 Ops.push_back(TexHandle);
4689 Ops.push_back(N->getOperand(2));
4690 Ops.push_back(N->getOperand(3));
4691 Ops.push_back(N->getOperand(4));
4692 Ops.push_back(Chain);
4693 break;
4694 case NVPTXISD::Suld2DArrayI16Zero:
4695 Opc = NVPTX::SULD_2D_ARRAY_I16_ZERO;
4696 Ops.push_back(TexHandle);
4697 Ops.push_back(N->getOperand(2));
4698 Ops.push_back(N->getOperand(3));
4699 Ops.push_back(N->getOperand(4));
4700 Ops.push_back(Chain);
4701 break;
4702 case NVPTXISD::Suld2DArrayI32Zero:
4703 Opc = NVPTX::SULD_2D_ARRAY_I32_ZERO;
4704 Ops.push_back(TexHandle);
4705 Ops.push_back(N->getOperand(2));
4706 Ops.push_back(N->getOperand(3));
4707 Ops.push_back(N->getOperand(4));
4708 Ops.push_back(Chain);
4709 break;
4710 case NVPTXISD::Suld2DArrayI64Zero:
4711 Opc = NVPTX::SULD_2D_ARRAY_I64_ZERO;
4712 Ops.push_back(TexHandle);
4713 Ops.push_back(N->getOperand(2));
4714 Ops.push_back(N->getOperand(3));
4715 Ops.push_back(N->getOperand(4));
4716 Ops.push_back(Chain);
4717 break;
4718 case NVPTXISD::Suld2DArrayV2I8Zero:
4719 Opc = NVPTX::SULD_2D_ARRAY_V2I8_ZERO;
4720 Ops.push_back(TexHandle);
4721 Ops.push_back(N->getOperand(2));
4722 Ops.push_back(N->getOperand(3));
4723 Ops.push_back(N->getOperand(4));
4724 Ops.push_back(Chain);
4725 break;
4726 case NVPTXISD::Suld2DArrayV2I16Zero:
4727 Opc = NVPTX::SULD_2D_ARRAY_V2I16_ZERO;
4728 Ops.push_back(TexHandle);
4729 Ops.push_back(N->getOperand(2));
4730 Ops.push_back(N->getOperand(3));
4731 Ops.push_back(N->getOperand(4));
4732 Ops.push_back(Chain);
4733 break;
4734 case NVPTXISD::Suld2DArrayV2I32Zero:
4735 Opc = NVPTX::SULD_2D_ARRAY_V2I32_ZERO;
4736 Ops.push_back(TexHandle);
4737 Ops.push_back(N->getOperand(2));
4738 Ops.push_back(N->getOperand(3));
4739 Ops.push_back(N->getOperand(4));
4740 Ops.push_back(Chain);
4741 break;
4742 case NVPTXISD::Suld2DArrayV2I64Zero:
4743 Opc = NVPTX::SULD_2D_ARRAY_V2I64_ZERO;
4744 Ops.push_back(TexHandle);
4745 Ops.push_back(N->getOperand(2));
4746 Ops.push_back(N->getOperand(3));
4747 Ops.push_back(N->getOperand(4));
4748 Ops.push_back(Chain);
4749 break;
4750 case NVPTXISD::Suld2DArrayV4I8Zero:
4751 Opc = NVPTX::SULD_2D_ARRAY_V4I8_ZERO;
4752 Ops.push_back(TexHandle);
4753 Ops.push_back(N->getOperand(2));
4754 Ops.push_back(N->getOperand(3));
4755 Ops.push_back(N->getOperand(4));
4756 Ops.push_back(Chain);
4757 break;
4758 case NVPTXISD::Suld2DArrayV4I16Zero:
4759 Opc = NVPTX::SULD_2D_ARRAY_V4I16_ZERO;
4760 Ops.push_back(TexHandle);
4761 Ops.push_back(N->getOperand(2));
4762 Ops.push_back(N->getOperand(3));
4763 Ops.push_back(N->getOperand(4));
4764 Ops.push_back(Chain);
4765 break;
4766 case NVPTXISD::Suld2DArrayV4I32Zero:
4767 Opc = NVPTX::SULD_2D_ARRAY_V4I32_ZERO;
4768 Ops.push_back(TexHandle);
4769 Ops.push_back(N->getOperand(2));
4770 Ops.push_back(N->getOperand(3));
4771 Ops.push_back(N->getOperand(4));
4772 Ops.push_back(Chain);
4773 break;
4774 case NVPTXISD::Suld3DI8Zero:
4775 Opc = NVPTX::SULD_3D_I8_ZERO;
4776 Ops.push_back(TexHandle);
4777 Ops.push_back(N->getOperand(2));
4778 Ops.push_back(N->getOperand(3));
4779 Ops.push_back(N->getOperand(4));
4780 Ops.push_back(Chain);
4781 break;
4782 case NVPTXISD::Suld3DI16Zero:
4783 Opc = NVPTX::SULD_3D_I16_ZERO;
4784 Ops.push_back(TexHandle);
4785 Ops.push_back(N->getOperand(2));
4786 Ops.push_back(N->getOperand(3));
4787 Ops.push_back(N->getOperand(4));
4788 Ops.push_back(Chain);
4789 break;
4790 case NVPTXISD::Suld3DI32Zero:
4791 Opc = NVPTX::SULD_3D_I32_ZERO;
4792 Ops.push_back(TexHandle);
4793 Ops.push_back(N->getOperand(2));
4794 Ops.push_back(N->getOperand(3));
4795 Ops.push_back(N->getOperand(4));
4796 Ops.push_back(Chain);
4797 break;
4798 case NVPTXISD::Suld3DI64Zero:
4799 Opc = NVPTX::SULD_3D_I64_ZERO;
4800 Ops.push_back(TexHandle);
4801 Ops.push_back(N->getOperand(2));
4802 Ops.push_back(N->getOperand(3));
4803 Ops.push_back(N->getOperand(4));
4804 Ops.push_back(Chain);
4805 break;
4806 case NVPTXISD::Suld3DV2I8Zero:
4807 Opc = NVPTX::SULD_3D_V2I8_ZERO;
4808 Ops.push_back(TexHandle);
4809 Ops.push_back(N->getOperand(2));
4810 Ops.push_back(N->getOperand(3));
4811 Ops.push_back(N->getOperand(4));
4812 Ops.push_back(Chain);
4813 break;
4814 case NVPTXISD::Suld3DV2I16Zero:
4815 Opc = NVPTX::SULD_3D_V2I16_ZERO;
4816 Ops.push_back(TexHandle);
4817 Ops.push_back(N->getOperand(2));
4818 Ops.push_back(N->getOperand(3));
4819 Ops.push_back(N->getOperand(4));
4820 Ops.push_back(Chain);
4821 break;
4822 case NVPTXISD::Suld3DV2I32Zero:
4823 Opc = NVPTX::SULD_3D_V2I32_ZERO;
4824 Ops.push_back(TexHandle);
4825 Ops.push_back(N->getOperand(2));
4826 Ops.push_back(N->getOperand(3));
4827 Ops.push_back(N->getOperand(4));
4828 Ops.push_back(Chain);
4829 break;
4830 case NVPTXISD::Suld3DV2I64Zero:
4831 Opc = NVPTX::SULD_3D_V2I64_ZERO;
4832 Ops.push_back(TexHandle);
4833 Ops.push_back(N->getOperand(2));
4834 Ops.push_back(N->getOperand(3));
4835 Ops.push_back(N->getOperand(4));
4836 Ops.push_back(Chain);
4837 break;
4838 case NVPTXISD::Suld3DV4I8Zero:
4839 Opc = NVPTX::SULD_3D_V4I8_ZERO;
4840 Ops.push_back(TexHandle);
4841 Ops.push_back(N->getOperand(2));
4842 Ops.push_back(N->getOperand(3));
4843 Ops.push_back(N->getOperand(4));
4844 Ops.push_back(Chain);
4845 break;
4846 case NVPTXISD::Suld3DV4I16Zero:
4847 Opc = NVPTX::SULD_3D_V4I16_ZERO;
4848 Ops.push_back(TexHandle);
4849 Ops.push_back(N->getOperand(2));
4850 Ops.push_back(N->getOperand(3));
4851 Ops.push_back(N->getOperand(4));
4852 Ops.push_back(Chain);
4853 break;
4854 case NVPTXISD::Suld3DV4I32Zero:
4855 Opc = NVPTX::SULD_3D_V4I32_ZERO;
4856 Ops.push_back(TexHandle);
4857 Ops.push_back(N->getOperand(2));
4858 Ops.push_back(N->getOperand(3));
4859 Ops.push_back(N->getOperand(4));
4860 Ops.push_back(Chain);
4861 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004862 }
Justin Bogner8d83fb62016-05-13 21:12:53 +00004863 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
4864 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004865}
4866
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004867
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004868/// SelectBFE - Look for instruction sequences that can be made more efficient
4869/// by using the 'bfe' (bit-field extract) PTX instruction
Justin Bogner8d83fb62016-05-13 21:12:53 +00004870bool NVPTXDAGToDAGISel::tryBFE(SDNode *N) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004871 SDLoc DL(N);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004872 SDValue LHS = N->getOperand(0);
4873 SDValue RHS = N->getOperand(1);
4874 SDValue Len;
4875 SDValue Start;
4876 SDValue Val;
4877 bool IsSigned = false;
4878
4879 if (N->getOpcode() == ISD::AND) {
4880 // Canonicalize the operands
4881 // We want 'and %val, %mask'
4882 if (isa<ConstantSDNode>(LHS) && !isa<ConstantSDNode>(RHS)) {
4883 std::swap(LHS, RHS);
4884 }
4885
4886 ConstantSDNode *Mask = dyn_cast<ConstantSDNode>(RHS);
4887 if (!Mask) {
4888 // We need a constant mask on the RHS of the AND
Justin Bogner8d83fb62016-05-13 21:12:53 +00004889 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004890 }
4891
4892 // Extract the mask bits
4893 uint64_t MaskVal = Mask->getZExtValue();
4894 if (!isMask_64(MaskVal)) {
4895 // We *could* handle shifted masks here, but doing so would require an
4896 // 'and' operation to fix up the low-order bits so we would trade
4897 // shr+and for bfe+and, which has the same throughput
Justin Bogner8d83fb62016-05-13 21:12:53 +00004898 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004899 }
4900
4901 // How many bits are in our mask?
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004902 uint64_t NumBits = countTrailingOnes(MaskVal);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004903 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004904
4905 if (LHS.getOpcode() == ISD::SRL || LHS.getOpcode() == ISD::SRA) {
4906 // We have a 'srl/and' pair, extract the effective start bit and length
4907 Val = LHS.getNode()->getOperand(0);
4908 Start = LHS.getNode()->getOperand(1);
4909 ConstantSDNode *StartConst = dyn_cast<ConstantSDNode>(Start);
4910 if (StartConst) {
4911 uint64_t StartVal = StartConst->getZExtValue();
4912 // How many "good" bits do we have left? "good" is defined here as bits
4913 // that exist in the original value, not shifted in.
4914 uint64_t GoodBits = Start.getValueType().getSizeInBits() - StartVal;
4915 if (NumBits > GoodBits) {
4916 // Do not handle the case where bits have been shifted in. In theory
4917 // we could handle this, but the cost is likely higher than just
4918 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004919 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004920 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004921 Start = CurDAG->getTargetConstant(StartVal, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004922 } else {
4923 // Do not handle the case where the shift amount (can be zero if no srl
4924 // was found) is not constant. We could handle this case, but it would
4925 // require run-time logic that would be more expensive than just
4926 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004927 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004928 }
4929 } else {
4930 // Do not handle the case where the LHS of the and is not a shift. While
4931 // it would be trivial to handle this case, it would just transform
4932 // 'and' -> 'bfe', but 'and' has higher-throughput.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004933 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004934 }
4935 } else if (N->getOpcode() == ISD::SRL || N->getOpcode() == ISD::SRA) {
4936 if (LHS->getOpcode() == ISD::AND) {
4937 ConstantSDNode *ShiftCnst = dyn_cast<ConstantSDNode>(RHS);
4938 if (!ShiftCnst) {
4939 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00004940 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004941 }
4942
4943 uint64_t ShiftAmt = ShiftCnst->getZExtValue();
4944
4945 SDValue AndLHS = LHS->getOperand(0);
4946 SDValue AndRHS = LHS->getOperand(1);
4947
4948 // Canonicalize the AND to have the mask on the RHS
4949 if (isa<ConstantSDNode>(AndLHS)) {
4950 std::swap(AndLHS, AndRHS);
4951 }
4952
4953 ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(AndRHS);
4954 if (!MaskCnst) {
4955 // Mask must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00004956 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004957 }
4958
4959 uint64_t MaskVal = MaskCnst->getZExtValue();
4960 uint64_t NumZeros;
4961 uint64_t NumBits;
4962 if (isMask_64(MaskVal)) {
4963 NumZeros = 0;
4964 // The number of bits in the result bitfield will be the number of
4965 // trailing ones (the AND) minus the number of bits we shift off
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004966 NumBits = countTrailingOnes(MaskVal) - ShiftAmt;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004967 } else if (isShiftedMask_64(MaskVal)) {
4968 NumZeros = countTrailingZeros(MaskVal);
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004969 unsigned NumOnes = countTrailingOnes(MaskVal >> NumZeros);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004970 // The number of bits in the result bitfield will be the number of
4971 // trailing zeros plus the number of set bits in the mask minus the
4972 // number of bits we shift off
4973 NumBits = NumZeros + NumOnes - ShiftAmt;
4974 } else {
4975 // This is not a mask we can handle
Justin Bogner8d83fb62016-05-13 21:12:53 +00004976 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004977 }
4978
4979 if (ShiftAmt < NumZeros) {
4980 // Handling this case would require extra logic that would make this
4981 // transformation non-profitable
Justin Bogner8d83fb62016-05-13 21:12:53 +00004982 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004983 }
4984
4985 Val = AndLHS;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004986 Start = CurDAG->getTargetConstant(ShiftAmt, DL, MVT::i32);
4987 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004988 } else if (LHS->getOpcode() == ISD::SHL) {
4989 // Here, we have a pattern like:
4990 //
4991 // (sra (shl val, NN), MM)
4992 // or
4993 // (srl (shl val, NN), MM)
4994 //
4995 // If MM >= NN, we can efficiently optimize this with bfe
4996 Val = LHS->getOperand(0);
4997
4998 SDValue ShlRHS = LHS->getOperand(1);
4999 ConstantSDNode *ShlCnst = dyn_cast<ConstantSDNode>(ShlRHS);
5000 if (!ShlCnst) {
5001 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005002 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005003 }
5004 uint64_t InnerShiftAmt = ShlCnst->getZExtValue();
5005
5006 SDValue ShrRHS = RHS;
5007 ConstantSDNode *ShrCnst = dyn_cast<ConstantSDNode>(ShrRHS);
5008 if (!ShrCnst) {
5009 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005010 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005011 }
5012 uint64_t OuterShiftAmt = ShrCnst->getZExtValue();
5013
5014 // To avoid extra codegen and be profitable, we need Outer >= Inner
5015 if (OuterShiftAmt < InnerShiftAmt) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005016 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005017 }
5018
5019 // If the outer shift is more than the type size, we have no bitfield to
5020 // extract (since we also check that the inner shift is <= the outer shift
5021 // then this also implies that the inner shift is < the type size)
5022 if (OuterShiftAmt >= Val.getValueType().getSizeInBits()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005023 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005024 }
5025
5026 Start =
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005027 CurDAG->getTargetConstant(OuterShiftAmt - InnerShiftAmt, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005028 Len =
5029 CurDAG->getTargetConstant(Val.getValueType().getSizeInBits() -
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005030 OuterShiftAmt, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005031
5032 if (N->getOpcode() == ISD::SRA) {
5033 // If we have a arithmetic right shift, we need to use the signed bfe
5034 // variant
5035 IsSigned = true;
5036 }
5037 } else {
5038 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005039 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005040 }
5041 } else {
5042 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005043 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005044 }
5045
5046
5047 unsigned Opc;
5048 // For the BFE operations we form here from "and" and "srl", always use the
5049 // unsigned variants.
5050 if (Val.getValueType() == MVT::i32) {
5051 if (IsSigned) {
5052 Opc = NVPTX::BFE_S32rii;
5053 } else {
5054 Opc = NVPTX::BFE_U32rii;
5055 }
5056 } else if (Val.getValueType() == MVT::i64) {
5057 if (IsSigned) {
5058 Opc = NVPTX::BFE_S64rii;
5059 } else {
5060 Opc = NVPTX::BFE_U64rii;
5061 }
5062 } else {
5063 // We cannot handle this type
Justin Bogner8d83fb62016-05-13 21:12:53 +00005064 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005065 }
5066
5067 SDValue Ops[] = {
5068 Val, Start, Len
5069 };
5070
Justin Bogner8d83fb62016-05-13 21:12:53 +00005071 ReplaceNode(N, CurDAG->getMachineNode(Opc, DL, N->getVTList(), Ops));
5072 return true;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005073}
5074
Justin Holewinskiae556d32012-05-04 20:18:50 +00005075// SelectDirectAddr - Match a direct address for DAG.
5076// A direct address could be a globaladdress or externalsymbol.
5077bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
5078 // Return true if TGA or ES.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005079 if (N.getOpcode() == ISD::TargetGlobalAddress ||
5080 N.getOpcode() == ISD::TargetExternalSymbol) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005081 Address = N;
5082 return true;
5083 }
5084 if (N.getOpcode() == NVPTXISD::Wrapper) {
5085 Address = N.getOperand(0);
5086 return true;
5087 }
Artem Belevichb2e76a52016-07-20 18:39:47 +00005088 // addrspacecast(MoveParam(arg_symbol) to addrspace(PARAM)) -> arg_symbol
5089 if (AddrSpaceCastSDNode *CastN = dyn_cast<AddrSpaceCastSDNode>(N)) {
5090 if (CastN->getSrcAddressSpace() == ADDRESS_SPACE_GENERIC &&
5091 CastN->getDestAddressSpace() == ADDRESS_SPACE_PARAM &&
5092 CastN->getOperand(0).getOpcode() == NVPTXISD::MoveParam)
5093 return SelectDirectAddr(CastN->getOperand(0).getOperand(0), Address);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005094 }
5095 return false;
5096}
5097
5098// symbol+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005099bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
5100 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005101 if (Addr.getOpcode() == ISD::ADD) {
5102 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005103 SDValue base = Addr.getOperand(0);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005104 if (SelectDirectAddr(base, Base)) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005105 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5106 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005107 return true;
5108 }
5109 }
5110 }
5111 return false;
5112}
5113
5114// symbol+offset
5115bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
5116 SDValue &Base, SDValue &Offset) {
5117 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
5118}
5119
5120// symbol+offset
5121bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
5122 SDValue &Base, SDValue &Offset) {
5123 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
5124}
5125
5126// register+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005127bool NVPTXDAGToDAGISel::SelectADDRri_imp(
5128 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005129 if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
5130 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005131 Offset = CurDAG->getTargetConstant(0, SDLoc(OpNode), mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005132 return true;
5133 }
5134 if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
5135 Addr.getOpcode() == ISD::TargetGlobalAddress)
Justin Holewinski0497ab12013-03-30 14:29:21 +00005136 return false; // direct calls.
Justin Holewinskiae556d32012-05-04 20:18:50 +00005137
5138 if (Addr.getOpcode() == ISD::ADD) {
5139 if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
5140 return false;
5141 }
5142 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
5143 if (FrameIndexSDNode *FIN =
Justin Holewinski0497ab12013-03-30 14:29:21 +00005144 dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005145 // Constant offset from frame ref.
5146 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
5147 else
5148 Base = Addr.getOperand(0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005149 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5150 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005151 return true;
5152 }
5153 }
5154 return false;
5155}
5156
5157// register+offset
5158bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
5159 SDValue &Base, SDValue &Offset) {
5160 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
5161}
5162
5163// register+offset
5164bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
5165 SDValue &Base, SDValue &Offset) {
5166 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
5167}
5168
5169bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
5170 unsigned int spN) const {
Craig Topper062a2ba2014-04-25 05:30:21 +00005171 const Value *Src = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00005172 if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +00005173 if (spN == 0 && mN->getMemOperand()->getPseudoValue())
5174 return true;
5175 Src = mN->getMemOperand()->getValue();
Justin Holewinskiae556d32012-05-04 20:18:50 +00005176 }
5177 if (!Src)
5178 return false;
Craig Toppere3dcce92015-08-01 22:20:21 +00005179 if (auto *PT = dyn_cast<PointerType>(Src->getType()))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005180 return (PT->getAddressSpace() == spN);
5181 return false;
5182}
5183
5184/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
5185/// inline asm expressions.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005186bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
Daniel Sanders60f1db02015-03-13 12:45:09 +00005187 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005188 SDValue Op0, Op1;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005189 switch (ConstraintID) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005190 default:
5191 return true;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005192 case InlineAsm::Constraint_m: // memory
Justin Holewinskiae556d32012-05-04 20:18:50 +00005193 if (SelectDirectAddr(Op, Op0)) {
5194 OutOps.push_back(Op0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005195 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
Justin Holewinskiae556d32012-05-04 20:18:50 +00005196 return false;
5197 }
5198 if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
5199 OutOps.push_back(Op0);
5200 OutOps.push_back(Op1);
5201 return false;
5202 }
5203 break;
5204 }
5205 return true;
5206}
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00005207
5208/// GetConvertOpcode - Returns the CVT_ instruction opcode that implements a
5209/// conversion from \p SrcTy to \p DestTy.
5210unsigned NVPTXDAGToDAGISel::GetConvertOpcode(MVT DestTy, MVT SrcTy,
5211 bool IsSigned) {
5212 switch (SrcTy.SimpleTy) {
5213 default:
5214 llvm_unreachable("Unhandled source type");
5215 case MVT::i8:
5216 switch (DestTy.SimpleTy) {
5217 default:
5218 llvm_unreachable("Unhandled dest type");
5219 case MVT::i16:
5220 return IsSigned ? NVPTX::CVT_s16_s8 : NVPTX::CVT_u16_u8;
5221 case MVT::i32:
5222 return IsSigned ? NVPTX::CVT_s32_s8 : NVPTX::CVT_u32_u8;
5223 case MVT::i64:
5224 return IsSigned ? NVPTX::CVT_s64_s8 : NVPTX::CVT_u64_u8;
5225 }
5226 case MVT::i16:
5227 switch (DestTy.SimpleTy) {
5228 default:
5229 llvm_unreachable("Unhandled dest type");
5230 case MVT::i8:
5231 return IsSigned ? NVPTX::CVT_s8_s16 : NVPTX::CVT_u8_u16;
5232 case MVT::i32:
5233 return IsSigned ? NVPTX::CVT_s32_s16 : NVPTX::CVT_u32_u16;
5234 case MVT::i64:
5235 return IsSigned ? NVPTX::CVT_s64_s16 : NVPTX::CVT_u64_u16;
5236 }
5237 case MVT::i32:
5238 switch (DestTy.SimpleTy) {
5239 default:
5240 llvm_unreachable("Unhandled dest type");
5241 case MVT::i8:
5242 return IsSigned ? NVPTX::CVT_s8_s32 : NVPTX::CVT_u8_u32;
5243 case MVT::i16:
5244 return IsSigned ? NVPTX::CVT_s16_s32 : NVPTX::CVT_u16_u32;
5245 case MVT::i64:
5246 return IsSigned ? NVPTX::CVT_s64_s32 : NVPTX::CVT_u64_u32;
5247 }
5248 case MVT::i64:
5249 switch (DestTy.SimpleTy) {
5250 default:
5251 llvm_unreachable("Unhandled dest type");
5252 case MVT::i8:
5253 return IsSigned ? NVPTX::CVT_s8_s64 : NVPTX::CVT_u8_u64;
5254 case MVT::i16:
5255 return IsSigned ? NVPTX::CVT_s16_s64 : NVPTX::CVT_u16_u64;
5256 case MVT::i32:
5257 return IsSigned ? NVPTX::CVT_s32_s64 : NVPTX::CVT_u32_u64;
5258 }
5259 }
5260}