blob: 6548dad1d586516f66ba8110253a8441e4c880c3 [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
Justin Holewinskiae556d32012-05-04 20:18:50 +000045/// createNVPTXISelDag - This pass converts a legalized DAG into a
46/// NVPTX-specific DAG, ready for instruction scheduling.
47FunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
48 llvm::CodeGenOpt::Level OptLevel) {
49 return new NVPTXDAGToDAGISel(TM, OptLevel);
50}
51
Justin Holewinskiae556d32012-05-04 20:18:50 +000052NVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
53 CodeGenOpt::Level OptLevel)
Eric Christopher02389e32015-02-19 00:08:27 +000054 : SelectionDAGISel(tm, OptLevel), TM(tm) {
Justin Holewinskiae556d32012-05-04 20:18:50 +000055 doMulWide = (OptLevel > 0);
Justin Holewinskicd069e62013-07-22 12:18:04 +000056}
Justin Holewinskiae556d32012-05-04 20:18:50 +000057
Eric Christopher147bba22015-01-30 01:40:59 +000058bool NVPTXDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
59 Subtarget = &static_cast<const NVPTXSubtarget &>(MF.getSubtarget());
60 return SelectionDAGISel::runOnMachineFunction(MF);
61}
62
Justin Holewinskicd069e62013-07-22 12:18:04 +000063int NVPTXDAGToDAGISel::getDivF32Level() const {
64 if (UsePrecDivF32.getNumOccurrences() > 0) {
65 // If nvptx-prec-div32=N is used on the command-line, always honor it
66 return UsePrecDivF32;
67 } else {
68 // Otherwise, use div.approx if fast math is enabled
69 if (TM.Options.UnsafeFPMath)
70 return 0;
71 else
72 return 2;
73 }
74}
Justin Holewinskiae556d32012-05-04 20:18:50 +000075
Justin Holewinskicd069e62013-07-22 12:18:04 +000076bool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
77 if (UsePrecSqrtF32.getNumOccurrences() > 0) {
78 // If nvptx-prec-sqrtf32 is used on the command-line, always honor it
79 return UsePrecSqrtF32;
80 } else {
81 // Otherwise, use sqrt.approx if fast math is enabled
Eli Bendersky3e840192015-03-23 16:26:23 +000082 return !TM.Options.UnsafeFPMath;
Justin Holewinskicd069e62013-07-22 12:18:04 +000083 }
84}
85
86bool NVPTXDAGToDAGISel::useF32FTZ() const {
87 if (FtzEnabled.getNumOccurrences() > 0) {
88 // If nvptx-f32ftz is used on the command-line, always honor it
89 return FtzEnabled;
90 } else {
91 const Function *F = MF->getFunction();
92 // Otherwise, check for an nvptx-f32ftz attribute on the function
93 if (F->hasFnAttribute("nvptx-f32ftz"))
Duncan P. N. Exon Smithb5054332015-02-14 15:35:43 +000094 return F->getFnAttribute("nvptx-f32ftz").getValueAsString() == "true";
Justin Holewinskicd069e62013-07-22 12:18:04 +000095 else
96 return false;
97 }
Justin Holewinskiae556d32012-05-04 20:18:50 +000098}
99
Justin Holewinski428cf0e2014-07-17 18:10:09 +0000100bool NVPTXDAGToDAGISel::allowFMA() const {
Eric Christopher147bba22015-01-30 01:40:59 +0000101 const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
Justin Holewinski428cf0e2014-07-17 18:10:09 +0000102 return TL->allowFMA(*MF, OptLevel);
103}
104
Artem Belevichd109f462017-01-13 18:48:13 +0000105bool NVPTXDAGToDAGISel::allowUnsafeFPMath() const {
106 const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
107 return TL->allowUnsafeFPMath(*MF);
108}
109
Justin Holewinskiae556d32012-05-04 20:18:50 +0000110/// Select - Select instructions not customized! Used for
111/// expanded, promoted and normal instructions.
Justin Bogner8d83fb62016-05-13 21:12:53 +0000112void NVPTXDAGToDAGISel::Select(SDNode *N) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000113
Tim Northover31d093c2013-09-22 08:21:56 +0000114 if (N->isMachineOpcode()) {
115 N->setNodeId(-1);
Justin Bogner8d83fb62016-05-13 21:12:53 +0000116 return; // Already selected.
Tim Northover31d093c2013-09-22 08:21:56 +0000117 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000118
Justin Holewinskiae556d32012-05-04 20:18:50 +0000119 switch (N->getOpcode()) {
120 case ISD::LOAD:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000121 if (tryLoad(N))
122 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000123 break;
124 case ISD::STORE:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000125 if (tryStore(N))
126 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000127 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000128 case NVPTXISD::LoadV2:
129 case NVPTXISD::LoadV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000130 if (tryLoadVector(N))
131 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000132 break;
133 case NVPTXISD::LDGV2:
134 case NVPTXISD::LDGV4:
135 case NVPTXISD::LDUV2:
136 case NVPTXISD::LDUV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000137 if (tryLDGLDU(N))
138 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000139 break;
140 case NVPTXISD::StoreV2:
141 case NVPTXISD::StoreV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000142 if (tryStoreVector(N))
143 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000144 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000145 case NVPTXISD::LoadParam:
146 case NVPTXISD::LoadParamV2:
147 case NVPTXISD::LoadParamV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000148 if (tryLoadParam(N))
149 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000150 break;
151 case NVPTXISD::StoreRetval:
152 case NVPTXISD::StoreRetvalV2:
153 case NVPTXISD::StoreRetvalV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000154 if (tryStoreRetval(N))
155 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000156 break;
157 case NVPTXISD::StoreParam:
158 case NVPTXISD::StoreParamV2:
159 case NVPTXISD::StoreParamV4:
160 case NVPTXISD::StoreParamS32:
161 case NVPTXISD::StoreParamU32:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000162 if (tryStoreParam(N))
163 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000164 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000165 case ISD::INTRINSIC_WO_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000166 if (tryIntrinsicNoChain(N))
167 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000168 break;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000169 case ISD::INTRINSIC_W_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000170 if (tryIntrinsicChain(N))
171 return;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000172 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000173 case NVPTXISD::Tex1DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000174 case NVPTXISD::Tex1DFloatFloat:
175 case NVPTXISD::Tex1DFloatFloatLevel:
176 case NVPTXISD::Tex1DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000177 case NVPTXISD::Tex1DS32S32:
178 case NVPTXISD::Tex1DS32Float:
179 case NVPTXISD::Tex1DS32FloatLevel:
180 case NVPTXISD::Tex1DS32FloatGrad:
181 case NVPTXISD::Tex1DU32S32:
182 case NVPTXISD::Tex1DU32Float:
183 case NVPTXISD::Tex1DU32FloatLevel:
184 case NVPTXISD::Tex1DU32FloatGrad:
185 case NVPTXISD::Tex1DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000186 case NVPTXISD::Tex1DArrayFloatFloat:
187 case NVPTXISD::Tex1DArrayFloatFloatLevel:
188 case NVPTXISD::Tex1DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000189 case NVPTXISD::Tex1DArrayS32S32:
190 case NVPTXISD::Tex1DArrayS32Float:
191 case NVPTXISD::Tex1DArrayS32FloatLevel:
192 case NVPTXISD::Tex1DArrayS32FloatGrad:
193 case NVPTXISD::Tex1DArrayU32S32:
194 case NVPTXISD::Tex1DArrayU32Float:
195 case NVPTXISD::Tex1DArrayU32FloatLevel:
196 case NVPTXISD::Tex1DArrayU32FloatGrad:
197 case NVPTXISD::Tex2DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000198 case NVPTXISD::Tex2DFloatFloat:
199 case NVPTXISD::Tex2DFloatFloatLevel:
200 case NVPTXISD::Tex2DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000201 case NVPTXISD::Tex2DS32S32:
202 case NVPTXISD::Tex2DS32Float:
203 case NVPTXISD::Tex2DS32FloatLevel:
204 case NVPTXISD::Tex2DS32FloatGrad:
205 case NVPTXISD::Tex2DU32S32:
206 case NVPTXISD::Tex2DU32Float:
207 case NVPTXISD::Tex2DU32FloatLevel:
208 case NVPTXISD::Tex2DU32FloatGrad:
209 case NVPTXISD::Tex2DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000210 case NVPTXISD::Tex2DArrayFloatFloat:
211 case NVPTXISD::Tex2DArrayFloatFloatLevel:
212 case NVPTXISD::Tex2DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000213 case NVPTXISD::Tex2DArrayS32S32:
214 case NVPTXISD::Tex2DArrayS32Float:
215 case NVPTXISD::Tex2DArrayS32FloatLevel:
216 case NVPTXISD::Tex2DArrayS32FloatGrad:
217 case NVPTXISD::Tex2DArrayU32S32:
218 case NVPTXISD::Tex2DArrayU32Float:
219 case NVPTXISD::Tex2DArrayU32FloatLevel:
220 case NVPTXISD::Tex2DArrayU32FloatGrad:
221 case NVPTXISD::Tex3DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000222 case NVPTXISD::Tex3DFloatFloat:
223 case NVPTXISD::Tex3DFloatFloatLevel:
224 case NVPTXISD::Tex3DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000225 case NVPTXISD::Tex3DS32S32:
226 case NVPTXISD::Tex3DS32Float:
227 case NVPTXISD::Tex3DS32FloatLevel:
228 case NVPTXISD::Tex3DS32FloatGrad:
229 case NVPTXISD::Tex3DU32S32:
230 case NVPTXISD::Tex3DU32Float:
231 case NVPTXISD::Tex3DU32FloatLevel:
232 case NVPTXISD::Tex3DU32FloatGrad:
233 case NVPTXISD::TexCubeFloatFloat:
234 case NVPTXISD::TexCubeFloatFloatLevel:
235 case NVPTXISD::TexCubeS32Float:
236 case NVPTXISD::TexCubeS32FloatLevel:
237 case NVPTXISD::TexCubeU32Float:
238 case NVPTXISD::TexCubeU32FloatLevel:
239 case NVPTXISD::TexCubeArrayFloatFloat:
240 case NVPTXISD::TexCubeArrayFloatFloatLevel:
241 case NVPTXISD::TexCubeArrayS32Float:
242 case NVPTXISD::TexCubeArrayS32FloatLevel:
243 case NVPTXISD::TexCubeArrayU32Float:
244 case NVPTXISD::TexCubeArrayU32FloatLevel:
245 case NVPTXISD::Tld4R2DFloatFloat:
246 case NVPTXISD::Tld4G2DFloatFloat:
247 case NVPTXISD::Tld4B2DFloatFloat:
248 case NVPTXISD::Tld4A2DFloatFloat:
249 case NVPTXISD::Tld4R2DS64Float:
250 case NVPTXISD::Tld4G2DS64Float:
251 case NVPTXISD::Tld4B2DS64Float:
252 case NVPTXISD::Tld4A2DS64Float:
253 case NVPTXISD::Tld4R2DU64Float:
254 case NVPTXISD::Tld4G2DU64Float:
255 case NVPTXISD::Tld4B2DU64Float:
256 case NVPTXISD::Tld4A2DU64Float:
257 case NVPTXISD::TexUnified1DFloatS32:
258 case NVPTXISD::TexUnified1DFloatFloat:
259 case NVPTXISD::TexUnified1DFloatFloatLevel:
260 case NVPTXISD::TexUnified1DFloatFloatGrad:
261 case NVPTXISD::TexUnified1DS32S32:
262 case NVPTXISD::TexUnified1DS32Float:
263 case NVPTXISD::TexUnified1DS32FloatLevel:
264 case NVPTXISD::TexUnified1DS32FloatGrad:
265 case NVPTXISD::TexUnified1DU32S32:
266 case NVPTXISD::TexUnified1DU32Float:
267 case NVPTXISD::TexUnified1DU32FloatLevel:
268 case NVPTXISD::TexUnified1DU32FloatGrad:
269 case NVPTXISD::TexUnified1DArrayFloatS32:
270 case NVPTXISD::TexUnified1DArrayFloatFloat:
271 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
272 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
273 case NVPTXISD::TexUnified1DArrayS32S32:
274 case NVPTXISD::TexUnified1DArrayS32Float:
275 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
276 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
277 case NVPTXISD::TexUnified1DArrayU32S32:
278 case NVPTXISD::TexUnified1DArrayU32Float:
279 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
280 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
281 case NVPTXISD::TexUnified2DFloatS32:
282 case NVPTXISD::TexUnified2DFloatFloat:
283 case NVPTXISD::TexUnified2DFloatFloatLevel:
284 case NVPTXISD::TexUnified2DFloatFloatGrad:
285 case NVPTXISD::TexUnified2DS32S32:
286 case NVPTXISD::TexUnified2DS32Float:
287 case NVPTXISD::TexUnified2DS32FloatLevel:
288 case NVPTXISD::TexUnified2DS32FloatGrad:
289 case NVPTXISD::TexUnified2DU32S32:
290 case NVPTXISD::TexUnified2DU32Float:
291 case NVPTXISD::TexUnified2DU32FloatLevel:
292 case NVPTXISD::TexUnified2DU32FloatGrad:
293 case NVPTXISD::TexUnified2DArrayFloatS32:
294 case NVPTXISD::TexUnified2DArrayFloatFloat:
295 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
296 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
297 case NVPTXISD::TexUnified2DArrayS32S32:
298 case NVPTXISD::TexUnified2DArrayS32Float:
299 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
300 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
301 case NVPTXISD::TexUnified2DArrayU32S32:
302 case NVPTXISD::TexUnified2DArrayU32Float:
303 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
304 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
305 case NVPTXISD::TexUnified3DFloatS32:
306 case NVPTXISD::TexUnified3DFloatFloat:
307 case NVPTXISD::TexUnified3DFloatFloatLevel:
308 case NVPTXISD::TexUnified3DFloatFloatGrad:
309 case NVPTXISD::TexUnified3DS32S32:
310 case NVPTXISD::TexUnified3DS32Float:
311 case NVPTXISD::TexUnified3DS32FloatLevel:
312 case NVPTXISD::TexUnified3DS32FloatGrad:
313 case NVPTXISD::TexUnified3DU32S32:
314 case NVPTXISD::TexUnified3DU32Float:
315 case NVPTXISD::TexUnified3DU32FloatLevel:
316 case NVPTXISD::TexUnified3DU32FloatGrad:
317 case NVPTXISD::TexUnifiedCubeFloatFloat:
318 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
319 case NVPTXISD::TexUnifiedCubeS32Float:
320 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
321 case NVPTXISD::TexUnifiedCubeU32Float:
322 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
323 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
324 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
325 case NVPTXISD::TexUnifiedCubeArrayS32Float:
326 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
327 case NVPTXISD::TexUnifiedCubeArrayU32Float:
328 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
329 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
330 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
331 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
332 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
333 case NVPTXISD::Tld4UnifiedR2DS64Float:
334 case NVPTXISD::Tld4UnifiedG2DS64Float:
335 case NVPTXISD::Tld4UnifiedB2DS64Float:
336 case NVPTXISD::Tld4UnifiedA2DS64Float:
337 case NVPTXISD::Tld4UnifiedR2DU64Float:
338 case NVPTXISD::Tld4UnifiedG2DU64Float:
339 case NVPTXISD::Tld4UnifiedB2DU64Float:
340 case NVPTXISD::Tld4UnifiedA2DU64Float:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000341 if (tryTextureIntrinsic(N))
342 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000343 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000344 case NVPTXISD::Suld1DI8Clamp:
345 case NVPTXISD::Suld1DI16Clamp:
346 case NVPTXISD::Suld1DI32Clamp:
347 case NVPTXISD::Suld1DI64Clamp:
348 case NVPTXISD::Suld1DV2I8Clamp:
349 case NVPTXISD::Suld1DV2I16Clamp:
350 case NVPTXISD::Suld1DV2I32Clamp:
351 case NVPTXISD::Suld1DV2I64Clamp:
352 case NVPTXISD::Suld1DV4I8Clamp:
353 case NVPTXISD::Suld1DV4I16Clamp:
354 case NVPTXISD::Suld1DV4I32Clamp:
355 case NVPTXISD::Suld1DArrayI8Clamp:
356 case NVPTXISD::Suld1DArrayI16Clamp:
357 case NVPTXISD::Suld1DArrayI32Clamp:
358 case NVPTXISD::Suld1DArrayI64Clamp:
359 case NVPTXISD::Suld1DArrayV2I8Clamp:
360 case NVPTXISD::Suld1DArrayV2I16Clamp:
361 case NVPTXISD::Suld1DArrayV2I32Clamp:
362 case NVPTXISD::Suld1DArrayV2I64Clamp:
363 case NVPTXISD::Suld1DArrayV4I8Clamp:
364 case NVPTXISD::Suld1DArrayV4I16Clamp:
365 case NVPTXISD::Suld1DArrayV4I32Clamp:
366 case NVPTXISD::Suld2DI8Clamp:
367 case NVPTXISD::Suld2DI16Clamp:
368 case NVPTXISD::Suld2DI32Clamp:
369 case NVPTXISD::Suld2DI64Clamp:
370 case NVPTXISD::Suld2DV2I8Clamp:
371 case NVPTXISD::Suld2DV2I16Clamp:
372 case NVPTXISD::Suld2DV2I32Clamp:
373 case NVPTXISD::Suld2DV2I64Clamp:
374 case NVPTXISD::Suld2DV4I8Clamp:
375 case NVPTXISD::Suld2DV4I16Clamp:
376 case NVPTXISD::Suld2DV4I32Clamp:
377 case NVPTXISD::Suld2DArrayI8Clamp:
378 case NVPTXISD::Suld2DArrayI16Clamp:
379 case NVPTXISD::Suld2DArrayI32Clamp:
380 case NVPTXISD::Suld2DArrayI64Clamp:
381 case NVPTXISD::Suld2DArrayV2I8Clamp:
382 case NVPTXISD::Suld2DArrayV2I16Clamp:
383 case NVPTXISD::Suld2DArrayV2I32Clamp:
384 case NVPTXISD::Suld2DArrayV2I64Clamp:
385 case NVPTXISD::Suld2DArrayV4I8Clamp:
386 case NVPTXISD::Suld2DArrayV4I16Clamp:
387 case NVPTXISD::Suld2DArrayV4I32Clamp:
388 case NVPTXISD::Suld3DI8Clamp:
389 case NVPTXISD::Suld3DI16Clamp:
390 case NVPTXISD::Suld3DI32Clamp:
391 case NVPTXISD::Suld3DI64Clamp:
392 case NVPTXISD::Suld3DV2I8Clamp:
393 case NVPTXISD::Suld3DV2I16Clamp:
394 case NVPTXISD::Suld3DV2I32Clamp:
395 case NVPTXISD::Suld3DV2I64Clamp:
396 case NVPTXISD::Suld3DV4I8Clamp:
397 case NVPTXISD::Suld3DV4I16Clamp:
398 case NVPTXISD::Suld3DV4I32Clamp:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000399 case NVPTXISD::Suld1DI8Trap:
400 case NVPTXISD::Suld1DI16Trap:
401 case NVPTXISD::Suld1DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000402 case NVPTXISD::Suld1DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000403 case NVPTXISD::Suld1DV2I8Trap:
404 case NVPTXISD::Suld1DV2I16Trap:
405 case NVPTXISD::Suld1DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000406 case NVPTXISD::Suld1DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000407 case NVPTXISD::Suld1DV4I8Trap:
408 case NVPTXISD::Suld1DV4I16Trap:
409 case NVPTXISD::Suld1DV4I32Trap:
410 case NVPTXISD::Suld1DArrayI8Trap:
411 case NVPTXISD::Suld1DArrayI16Trap:
412 case NVPTXISD::Suld1DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000413 case NVPTXISD::Suld1DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000414 case NVPTXISD::Suld1DArrayV2I8Trap:
415 case NVPTXISD::Suld1DArrayV2I16Trap:
416 case NVPTXISD::Suld1DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000417 case NVPTXISD::Suld1DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000418 case NVPTXISD::Suld1DArrayV4I8Trap:
419 case NVPTXISD::Suld1DArrayV4I16Trap:
420 case NVPTXISD::Suld1DArrayV4I32Trap:
421 case NVPTXISD::Suld2DI8Trap:
422 case NVPTXISD::Suld2DI16Trap:
423 case NVPTXISD::Suld2DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000424 case NVPTXISD::Suld2DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000425 case NVPTXISD::Suld2DV2I8Trap:
426 case NVPTXISD::Suld2DV2I16Trap:
427 case NVPTXISD::Suld2DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000428 case NVPTXISD::Suld2DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000429 case NVPTXISD::Suld2DV4I8Trap:
430 case NVPTXISD::Suld2DV4I16Trap:
431 case NVPTXISD::Suld2DV4I32Trap:
432 case NVPTXISD::Suld2DArrayI8Trap:
433 case NVPTXISD::Suld2DArrayI16Trap:
434 case NVPTXISD::Suld2DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000435 case NVPTXISD::Suld2DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000436 case NVPTXISD::Suld2DArrayV2I8Trap:
437 case NVPTXISD::Suld2DArrayV2I16Trap:
438 case NVPTXISD::Suld2DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000439 case NVPTXISD::Suld2DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000440 case NVPTXISD::Suld2DArrayV4I8Trap:
441 case NVPTXISD::Suld2DArrayV4I16Trap:
442 case NVPTXISD::Suld2DArrayV4I32Trap:
443 case NVPTXISD::Suld3DI8Trap:
444 case NVPTXISD::Suld3DI16Trap:
445 case NVPTXISD::Suld3DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000446 case NVPTXISD::Suld3DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000447 case NVPTXISD::Suld3DV2I8Trap:
448 case NVPTXISD::Suld3DV2I16Trap:
449 case NVPTXISD::Suld3DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000450 case NVPTXISD::Suld3DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000451 case NVPTXISD::Suld3DV4I8Trap:
452 case NVPTXISD::Suld3DV4I16Trap:
453 case NVPTXISD::Suld3DV4I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000454 case NVPTXISD::Suld1DI8Zero:
455 case NVPTXISD::Suld1DI16Zero:
456 case NVPTXISD::Suld1DI32Zero:
457 case NVPTXISD::Suld1DI64Zero:
458 case NVPTXISD::Suld1DV2I8Zero:
459 case NVPTXISD::Suld1DV2I16Zero:
460 case NVPTXISD::Suld1DV2I32Zero:
461 case NVPTXISD::Suld1DV2I64Zero:
462 case NVPTXISD::Suld1DV4I8Zero:
463 case NVPTXISD::Suld1DV4I16Zero:
464 case NVPTXISD::Suld1DV4I32Zero:
465 case NVPTXISD::Suld1DArrayI8Zero:
466 case NVPTXISD::Suld1DArrayI16Zero:
467 case NVPTXISD::Suld1DArrayI32Zero:
468 case NVPTXISD::Suld1DArrayI64Zero:
469 case NVPTXISD::Suld1DArrayV2I8Zero:
470 case NVPTXISD::Suld1DArrayV2I16Zero:
471 case NVPTXISD::Suld1DArrayV2I32Zero:
472 case NVPTXISD::Suld1DArrayV2I64Zero:
473 case NVPTXISD::Suld1DArrayV4I8Zero:
474 case NVPTXISD::Suld1DArrayV4I16Zero:
475 case NVPTXISD::Suld1DArrayV4I32Zero:
476 case NVPTXISD::Suld2DI8Zero:
477 case NVPTXISD::Suld2DI16Zero:
478 case NVPTXISD::Suld2DI32Zero:
479 case NVPTXISD::Suld2DI64Zero:
480 case NVPTXISD::Suld2DV2I8Zero:
481 case NVPTXISD::Suld2DV2I16Zero:
482 case NVPTXISD::Suld2DV2I32Zero:
483 case NVPTXISD::Suld2DV2I64Zero:
484 case NVPTXISD::Suld2DV4I8Zero:
485 case NVPTXISD::Suld2DV4I16Zero:
486 case NVPTXISD::Suld2DV4I32Zero:
487 case NVPTXISD::Suld2DArrayI8Zero:
488 case NVPTXISD::Suld2DArrayI16Zero:
489 case NVPTXISD::Suld2DArrayI32Zero:
490 case NVPTXISD::Suld2DArrayI64Zero:
491 case NVPTXISD::Suld2DArrayV2I8Zero:
492 case NVPTXISD::Suld2DArrayV2I16Zero:
493 case NVPTXISD::Suld2DArrayV2I32Zero:
494 case NVPTXISD::Suld2DArrayV2I64Zero:
495 case NVPTXISD::Suld2DArrayV4I8Zero:
496 case NVPTXISD::Suld2DArrayV4I16Zero:
497 case NVPTXISD::Suld2DArrayV4I32Zero:
498 case NVPTXISD::Suld3DI8Zero:
499 case NVPTXISD::Suld3DI16Zero:
500 case NVPTXISD::Suld3DI32Zero:
501 case NVPTXISD::Suld3DI64Zero:
502 case NVPTXISD::Suld3DV2I8Zero:
503 case NVPTXISD::Suld3DV2I16Zero:
504 case NVPTXISD::Suld3DV2I32Zero:
505 case NVPTXISD::Suld3DV2I64Zero:
506 case NVPTXISD::Suld3DV4I8Zero:
507 case NVPTXISD::Suld3DV4I16Zero:
508 case NVPTXISD::Suld3DV4I32Zero:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000509 if (trySurfaceIntrinsic(N))
510 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000511 break;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000512 case ISD::AND:
513 case ISD::SRA:
514 case ISD::SRL:
515 // Try to select BFE
Justin Bogner8d83fb62016-05-13 21:12:53 +0000516 if (tryBFE(N))
517 return;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000518 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000519 case ISD::ADDRSPACECAST:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000520 SelectAddrSpaceCast(N);
521 return;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000522 case ISD::ConstantFP:
523 if (tryConstantFP16(N))
524 return;
525 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000526 default:
527 break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000528 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000529 SelectCode(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000530}
531
Justin Bogner8d83fb62016-05-13 21:12:53 +0000532bool NVPTXDAGToDAGISel::tryIntrinsicChain(SDNode *N) {
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000533 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
534 switch (IID) {
535 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000536 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000537 case Intrinsic::nvvm_ldg_global_f:
538 case Intrinsic::nvvm_ldg_global_i:
539 case Intrinsic::nvvm_ldg_global_p:
540 case Intrinsic::nvvm_ldu_global_f:
541 case Intrinsic::nvvm_ldu_global_i:
542 case Intrinsic::nvvm_ldu_global_p:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000543 return tryLDGLDU(N);
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000544 }
545}
546
Artem Belevich64dc9be2017-01-13 20:56:17 +0000547// There's no way to specify FP16 immediates in .f16 ops, so we have to
548// load them into an .f16 register first.
549bool NVPTXDAGToDAGISel::tryConstantFP16(SDNode *N) {
550 if (N->getValueType(0) != MVT::f16)
551 return false;
552 SDValue Val = CurDAG->getTargetConstantFP(
553 cast<ConstantFPSDNode>(N)->getValueAPF(), SDLoc(N), MVT::f16);
554 SDNode *LoadConstF16 =
555 CurDAG->getMachineNode(NVPTX::LOAD_CONST_F16, SDLoc(N), MVT::f16, Val);
556 ReplaceNode(N, LoadConstF16);
557 return true;
558}
559
Eric Christopher9745b3a2015-01-30 01:41:01 +0000560static unsigned int getCodeAddrSpace(MemSDNode *N) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +0000561 const Value *Src = N->getMemOperand()->getValue();
Justin Holewinskib96d1392013-06-10 13:29:47 +0000562
Justin Holewinskiae556d32012-05-04 20:18:50 +0000563 if (!Src)
Justin Holewinskib96d1392013-06-10 13:29:47 +0000564 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000565
Craig Toppere3dcce92015-08-01 22:20:21 +0000566 if (auto *PT = dyn_cast<PointerType>(Src->getType())) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000567 switch (PT->getAddressSpace()) {
Justin Holewinskib96d1392013-06-10 13:29:47 +0000568 case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
569 case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
570 case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
571 case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
572 case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
573 case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
574 default: break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000575 }
576 }
Justin Holewinskib96d1392013-06-10 13:29:47 +0000577 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000578}
579
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000580static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget,
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000581 unsigned CodeAddrSpace, MachineFunction *F) {
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000582 // We use ldg (i.e. ld.global.nc) for invariant loads from the global address
583 // space.
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000584 //
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000585 // We have two ways of identifying invariant loads: Loads may be explicitly
586 // marked as invariant, or we may infer them to be invariant.
587 //
588 // We currently infer invariance only for kernel function pointer params that
589 // are noalias (i.e. __restrict) and never written to.
590 //
591 // TODO: Perform a more powerful invariance analysis (ideally IPO, and ideally
592 // not during the SelectionDAG phase).
593 //
594 // TODO: Infer invariance only at -O2. We still want to use ldg at -O0 for
595 // explicitly invariant loads because these are how clang tells us to use ldg
596 // when the user uses a builtin.
597 if (!Subtarget.hasLDG() || CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL)
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000598 return false;
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000599
600 if (N->isInvariant())
601 return true;
602
603 // Load wasn't explicitly invariant. Attempt to infer invariance.
604 if (!isKernelFunction(*F->getFunction()))
605 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000606
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000607 // We use GetUnderlyingObjects() here instead of
608 // GetUnderlyingObject() mainly because the former looks through phi
609 // nodes while the latter does not. We need to look through phi
610 // nodes to handle pointer induction variables.
611 SmallVector<Value *, 8> Objs;
612 GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()),
613 Objs, F->getDataLayout());
614 for (Value *Obj : Objs) {
615 auto *A = dyn_cast<const Argument>(Obj);
616 if (!A || !A->onlyReadsMemory() || !A->hasNoAliasAttr()) return false;
617 }
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000618
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000619 return true;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000620}
621
Justin Bogner8d83fb62016-05-13 21:12:53 +0000622bool NVPTXDAGToDAGISel::tryIntrinsicNoChain(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000623 unsigned IID = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
624 switch (IID) {
625 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000626 return false;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000627 case Intrinsic::nvvm_texsurf_handle_internal:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000628 SelectTexSurfHandle(N);
629 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000630 }
631}
632
Justin Bogner8d83fb62016-05-13 21:12:53 +0000633void NVPTXDAGToDAGISel::SelectTexSurfHandle(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000634 // Op 0 is the intrinsic ID
635 SDValue Wrapper = N->getOperand(1);
636 SDValue GlobalVal = Wrapper.getOperand(0);
Justin Bogner8d83fb62016-05-13 21:12:53 +0000637 ReplaceNode(N, CurDAG->getMachineNode(NVPTX::texsurf_handles, SDLoc(N),
638 MVT::i64, GlobalVal));
Justin Holewinski30d56a72014-04-09 15:39:15 +0000639}
640
Justin Bogner8d83fb62016-05-13 21:12:53 +0000641void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000642 SDValue Src = N->getOperand(0);
643 AddrSpaceCastSDNode *CastN = cast<AddrSpaceCastSDNode>(N);
644 unsigned SrcAddrSpace = CastN->getSrcAddressSpace();
645 unsigned DstAddrSpace = CastN->getDestAddressSpace();
646
647 assert(SrcAddrSpace != DstAddrSpace &&
648 "addrspacecast must be between different address spaces");
649
650 if (DstAddrSpace == ADDRESS_SPACE_GENERIC) {
651 // Specific to generic
652 unsigned Opc;
653 switch (SrcAddrSpace) {
654 default: report_fatal_error("Bad address space in addrspacecast");
655 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000656 Opc = TM.is64Bit() ? NVPTX::cvta_global_yes_64 : NVPTX::cvta_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000657 break;
658 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000659 Opc = TM.is64Bit() ? NVPTX::cvta_shared_yes_64 : NVPTX::cvta_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000660 break;
661 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000662 Opc = TM.is64Bit() ? NVPTX::cvta_const_yes_64 : NVPTX::cvta_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000663 break;
664 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000665 Opc = TM.is64Bit() ? NVPTX::cvta_local_yes_64 : NVPTX::cvta_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000666 break;
667 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000668 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
669 Src));
670 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000671 } else {
672 // Generic to specific
673 if (SrcAddrSpace != 0)
674 report_fatal_error("Cannot cast between two non-generic address spaces");
675 unsigned Opc;
676 switch (DstAddrSpace) {
677 default: report_fatal_error("Bad address space in addrspacecast");
678 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000679 Opc = TM.is64Bit() ? NVPTX::cvta_to_global_yes_64
680 : NVPTX::cvta_to_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000681 break;
682 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000683 Opc = TM.is64Bit() ? NVPTX::cvta_to_shared_yes_64
684 : NVPTX::cvta_to_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000685 break;
686 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000687 Opc =
688 TM.is64Bit() ? NVPTX::cvta_to_const_yes_64 : NVPTX::cvta_to_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000689 break;
690 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000691 Opc =
692 TM.is64Bit() ? NVPTX::cvta_to_local_yes_64 : NVPTX::cvta_to_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000693 break;
Jingyue Wua2f60272015-06-04 21:28:26 +0000694 case ADDRESS_SPACE_PARAM:
695 Opc = TM.is64Bit() ? NVPTX::nvvm_ptr_gen_to_param_64
696 : NVPTX::nvvm_ptr_gen_to_param;
697 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000698 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000699 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
700 Src));
701 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000702 }
703}
704
Justin Bogner8d83fb62016-05-13 21:12:53 +0000705bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +0000706 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000707 LoadSDNode *LD = cast<LoadSDNode>(N);
708 EVT LoadedVT = LD->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +0000709 SDNode *NVPTXLD = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000710
711 // do not support pre/post inc/dec
712 if (LD->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000713 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000714
715 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000716 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000717
718 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000719 unsigned int codeAddrSpace = getCodeAddrSpace(LD);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000720
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000721 if (canLowerToLDG(LD, *Subtarget, codeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000722 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000723 }
724
Justin Holewinskiae556d32012-05-04 20:18:50 +0000725 // Volatile Setting
726 // - .volatile is only availalble for .global and .shared
727 bool isVolatile = LD->isVolatile();
728 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
729 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
730 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
731 isVolatile = false;
732
733 // Vector Setting
734 MVT SimpleVT = LoadedVT.getSimpleVT();
735 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
736 if (SimpleVT.isVector()) {
737 unsigned num = SimpleVT.getVectorNumElements();
738 if (num == 2)
739 vecType = NVPTX::PTXLdStInstCode::V2;
740 else if (num == 4)
741 vecType = NVPTX::PTXLdStInstCode::V4;
742 else
Justin Bogner8d83fb62016-05-13 21:12:53 +0000743 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000744 }
745
746 // Type Setting: fromType + fromTypeWidth
747 //
748 // Sign : ISD::SEXTLOAD
749 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
750 // type is integer
751 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
752 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +0000753 // Read at least 8 bits (predicates are stored as 8-bit values)
754 unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskiae556d32012-05-04 20:18:50 +0000755 unsigned int fromType;
756 if ((LD->getExtensionType() == ISD::SEXTLOAD))
757 fromType = NVPTX::PTXLdStInstCode::Signed;
758 else if (ScalarVT.isFloatingPoint())
Artem Belevich64dc9be2017-01-13 20:56:17 +0000759 // f16 uses .b16 as its storage type.
760 fromType = ScalarVT.SimpleTy == MVT::f16 ? NVPTX::PTXLdStInstCode::Untyped
761 : NVPTX::PTXLdStInstCode::Float;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000762 else
763 fromType = NVPTX::PTXLdStInstCode::Unsigned;
764
765 // Create the machine instruction DAG
766 SDValue Chain = N->getOperand(0);
767 SDValue N1 = N->getOperand(1);
768 SDValue Addr;
769 SDValue Offset, Base;
770 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +0000771 MVT::SimpleValueType TargetVT = LD->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000772
773 if (SelectDirectAddr(N1, Addr)) {
774 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000775 case MVT::i8:
776 Opcode = NVPTX::LD_i8_avar;
777 break;
778 case MVT::i16:
779 Opcode = NVPTX::LD_i16_avar;
780 break;
781 case MVT::i32:
782 Opcode = NVPTX::LD_i32_avar;
783 break;
784 case MVT::i64:
785 Opcode = NVPTX::LD_i64_avar;
786 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000787 case MVT::f16:
788 Opcode = NVPTX::LD_f16_avar;
789 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000790 case MVT::f32:
791 Opcode = NVPTX::LD_f32_avar;
792 break;
793 case MVT::f64:
794 Opcode = NVPTX::LD_f64_avar;
795 break;
796 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000797 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000798 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000799 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
800 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
801 getI32Imm(fromTypeWidth, dl), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000802 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000803 } else if (TM.is64Bit() ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
804 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000805 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000806 case MVT::i8:
807 Opcode = NVPTX::LD_i8_asi;
808 break;
809 case MVT::i16:
810 Opcode = NVPTX::LD_i16_asi;
811 break;
812 case MVT::i32:
813 Opcode = NVPTX::LD_i32_asi;
814 break;
815 case MVT::i64:
816 Opcode = NVPTX::LD_i64_asi;
817 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000818 case MVT::f16:
819 Opcode = NVPTX::LD_f16_asi;
820 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000821 case MVT::f32:
822 Opcode = NVPTX::LD_f32_asi;
823 break;
824 case MVT::f64:
825 Opcode = NVPTX::LD_f64_asi;
826 break;
827 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000828 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000829 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000830 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
831 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
832 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000833 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000834 } else if (TM.is64Bit() ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
835 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
836 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000837 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000838 case MVT::i8:
839 Opcode = NVPTX::LD_i8_ari_64;
840 break;
841 case MVT::i16:
842 Opcode = NVPTX::LD_i16_ari_64;
843 break;
844 case MVT::i32:
845 Opcode = NVPTX::LD_i32_ari_64;
846 break;
847 case MVT::i64:
848 Opcode = NVPTX::LD_i64_ari_64;
849 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000850 case MVT::f16:
851 Opcode = NVPTX::LD_f16_ari_64;
852 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000853 case MVT::f32:
854 Opcode = NVPTX::LD_f32_ari_64;
855 break;
856 case MVT::f64:
857 Opcode = NVPTX::LD_f64_ari_64;
858 break;
859 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000860 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000861 }
862 } else {
863 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000864 case MVT::i8:
865 Opcode = NVPTX::LD_i8_ari;
866 break;
867 case MVT::i16:
868 Opcode = NVPTX::LD_i16_ari;
869 break;
870 case MVT::i32:
871 Opcode = NVPTX::LD_i32_ari;
872 break;
873 case MVT::i64:
874 Opcode = NVPTX::LD_i64_ari;
875 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000876 case MVT::f16:
877 Opcode = NVPTX::LD_f16_ari;
878 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000879 case MVT::f32:
880 Opcode = NVPTX::LD_f32_ari;
881 break;
882 case MVT::f64:
883 Opcode = NVPTX::LD_f64_ari;
884 break;
885 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000886 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000887 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000888 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000889 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
890 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
891 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000892 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinski0497ab12013-03-30 14:29:21 +0000893 } else {
Eric Christopher02389e32015-02-19 00:08:27 +0000894 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000895 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000896 case MVT::i8:
897 Opcode = NVPTX::LD_i8_areg_64;
898 break;
899 case MVT::i16:
900 Opcode = NVPTX::LD_i16_areg_64;
901 break;
902 case MVT::i32:
903 Opcode = NVPTX::LD_i32_areg_64;
904 break;
905 case MVT::i64:
906 Opcode = NVPTX::LD_i64_areg_64;
907 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000908 case MVT::f16:
909 Opcode = NVPTX::LD_f16_areg_64;
910 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000911 case MVT::f32:
912 Opcode = NVPTX::LD_f32_areg_64;
913 break;
914 case MVT::f64:
915 Opcode = NVPTX::LD_f64_areg_64;
916 break;
917 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000918 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000919 }
920 } else {
921 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000922 case MVT::i8:
923 Opcode = NVPTX::LD_i8_areg;
924 break;
925 case MVT::i16:
926 Opcode = NVPTX::LD_i16_areg;
927 break;
928 case MVT::i32:
929 Opcode = NVPTX::LD_i32_areg;
930 break;
931 case MVT::i64:
932 Opcode = NVPTX::LD_i64_areg;
933 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000934 case MVT::f16:
935 Opcode = NVPTX::LD_f16_areg;
936 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000937 case MVT::f32:
938 Opcode = NVPTX::LD_f32_areg;
939 break;
940 case MVT::f64:
941 Opcode = NVPTX::LD_f64_areg;
942 break;
943 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000944 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000945 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000946 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000947 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
948 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
949 getI32Imm(fromTypeWidth, dl), N1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000950 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000951 }
952
Justin Bogner8d83fb62016-05-13 21:12:53 +0000953 if (!NVPTXLD)
954 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000955
Justin Bogner8d83fb62016-05-13 21:12:53 +0000956 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
957 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
958 cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
959
960 ReplaceNode(N, NVPTXLD);
961 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000962}
963
Justin Bogner8d83fb62016-05-13 21:12:53 +0000964bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000965
966 SDValue Chain = N->getOperand(0);
967 SDValue Op1 = N->getOperand(1);
968 SDValue Addr, Offset, Base;
969 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +0000970 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000971 SDNode *LD;
972 MemSDNode *MemSD = cast<MemSDNode>(N);
973 EVT LoadedVT = MemSD->getMemoryVT();
974
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000975 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000976 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000977
978 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000979 unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000980
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000981 if (canLowerToLDG(MemSD, *Subtarget, CodeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000982 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000983 }
984
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000985 // Volatile Setting
986 // - .volatile is only availalble for .global and .shared
987 bool IsVolatile = MemSD->isVolatile();
988 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
989 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
990 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
991 IsVolatile = false;
992
993 // Vector Setting
994 MVT SimpleVT = LoadedVT.getSimpleVT();
995
996 // Type Setting: fromType + fromTypeWidth
997 //
998 // Sign : ISD::SEXTLOAD
999 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
1000 // type is integer
1001 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
1002 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +00001003 // Read at least 8 bits (predicates are stored as 8-bit values)
1004 unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001005 unsigned int FromType;
1006 // The last operand holds the original LoadSDNode::getExtensionType() value
Justin Holewinski0497ab12013-03-30 14:29:21 +00001007 unsigned ExtensionType = cast<ConstantSDNode>(
1008 N->getOperand(N->getNumOperands() - 1))->getZExtValue();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001009 if (ExtensionType == ISD::SEXTLOAD)
1010 FromType = NVPTX::PTXLdStInstCode::Signed;
1011 else if (ScalarVT.isFloatingPoint())
1012 FromType = NVPTX::PTXLdStInstCode::Float;
1013 else
1014 FromType = NVPTX::PTXLdStInstCode::Unsigned;
1015
1016 unsigned VecType;
1017
1018 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001019 case NVPTXISD::LoadV2:
1020 VecType = NVPTX::PTXLdStInstCode::V2;
1021 break;
1022 case NVPTXISD::LoadV4:
1023 VecType = NVPTX::PTXLdStInstCode::V4;
1024 break;
1025 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001026 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001027 }
1028
1029 EVT EltVT = N->getValueType(0);
1030
1031 if (SelectDirectAddr(Op1, Addr)) {
1032 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001033 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001034 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001035 case NVPTXISD::LoadV2:
1036 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001037 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001038 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001039 case MVT::i8:
1040 Opcode = NVPTX::LDV_i8_v2_avar;
1041 break;
1042 case MVT::i16:
1043 Opcode = NVPTX::LDV_i16_v2_avar;
1044 break;
1045 case MVT::i32:
1046 Opcode = NVPTX::LDV_i32_v2_avar;
1047 break;
1048 case MVT::i64:
1049 Opcode = NVPTX::LDV_i64_v2_avar;
1050 break;
1051 case MVT::f32:
1052 Opcode = NVPTX::LDV_f32_v2_avar;
1053 break;
1054 case MVT::f64:
1055 Opcode = NVPTX::LDV_f64_v2_avar;
1056 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001057 }
1058 break;
1059 case NVPTXISD::LoadV4:
1060 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001061 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001062 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001063 case MVT::i8:
1064 Opcode = NVPTX::LDV_i8_v4_avar;
1065 break;
1066 case MVT::i16:
1067 Opcode = NVPTX::LDV_i16_v4_avar;
1068 break;
1069 case MVT::i32:
1070 Opcode = NVPTX::LDV_i32_v4_avar;
1071 break;
1072 case MVT::f32:
1073 Opcode = NVPTX::LDV_f32_v4_avar;
1074 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001075 }
1076 break;
1077 }
1078
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001079 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1080 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1081 getI32Imm(FromTypeWidth, DL), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001082 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001083 } else if (TM.is64Bit() ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
1084 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001085 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001086 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001087 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001088 case NVPTXISD::LoadV2:
1089 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001090 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001091 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001092 case MVT::i8:
1093 Opcode = NVPTX::LDV_i8_v2_asi;
1094 break;
1095 case MVT::i16:
1096 Opcode = NVPTX::LDV_i16_v2_asi;
1097 break;
1098 case MVT::i32:
1099 Opcode = NVPTX::LDV_i32_v2_asi;
1100 break;
1101 case MVT::i64:
1102 Opcode = NVPTX::LDV_i64_v2_asi;
1103 break;
1104 case MVT::f32:
1105 Opcode = NVPTX::LDV_f32_v2_asi;
1106 break;
1107 case MVT::f64:
1108 Opcode = NVPTX::LDV_f64_v2_asi;
1109 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001110 }
1111 break;
1112 case NVPTXISD::LoadV4:
1113 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001114 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001115 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001116 case MVT::i8:
1117 Opcode = NVPTX::LDV_i8_v4_asi;
1118 break;
1119 case MVT::i16:
1120 Opcode = NVPTX::LDV_i16_v4_asi;
1121 break;
1122 case MVT::i32:
1123 Opcode = NVPTX::LDV_i32_v4_asi;
1124 break;
1125 case MVT::f32:
1126 Opcode = NVPTX::LDV_f32_v4_asi;
1127 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001128 }
1129 break;
1130 }
1131
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001132 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1133 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1134 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001135 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001136 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1137 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1138 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001139 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001140 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001141 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001142 case NVPTXISD::LoadV2:
1143 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001144 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001145 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001146 case MVT::i8:
1147 Opcode = NVPTX::LDV_i8_v2_ari_64;
1148 break;
1149 case MVT::i16:
1150 Opcode = NVPTX::LDV_i16_v2_ari_64;
1151 break;
1152 case MVT::i32:
1153 Opcode = NVPTX::LDV_i32_v2_ari_64;
1154 break;
1155 case MVT::i64:
1156 Opcode = NVPTX::LDV_i64_v2_ari_64;
1157 break;
1158 case MVT::f32:
1159 Opcode = NVPTX::LDV_f32_v2_ari_64;
1160 break;
1161 case MVT::f64:
1162 Opcode = NVPTX::LDV_f64_v2_ari_64;
1163 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001164 }
1165 break;
1166 case NVPTXISD::LoadV4:
1167 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001168 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001169 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001170 case MVT::i8:
1171 Opcode = NVPTX::LDV_i8_v4_ari_64;
1172 break;
1173 case MVT::i16:
1174 Opcode = NVPTX::LDV_i16_v4_ari_64;
1175 break;
1176 case MVT::i32:
1177 Opcode = NVPTX::LDV_i32_v4_ari_64;
1178 break;
1179 case MVT::f32:
1180 Opcode = NVPTX::LDV_f32_v4_ari_64;
1181 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001182 }
1183 break;
1184 }
1185 } else {
1186 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001187 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001188 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001189 case NVPTXISD::LoadV2:
1190 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001191 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001192 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001193 case MVT::i8:
1194 Opcode = NVPTX::LDV_i8_v2_ari;
1195 break;
1196 case MVT::i16:
1197 Opcode = NVPTX::LDV_i16_v2_ari;
1198 break;
1199 case MVT::i32:
1200 Opcode = NVPTX::LDV_i32_v2_ari;
1201 break;
1202 case MVT::i64:
1203 Opcode = NVPTX::LDV_i64_v2_ari;
1204 break;
1205 case MVT::f32:
1206 Opcode = NVPTX::LDV_f32_v2_ari;
1207 break;
1208 case MVT::f64:
1209 Opcode = NVPTX::LDV_f64_v2_ari;
1210 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001211 }
1212 break;
1213 case NVPTXISD::LoadV4:
1214 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001215 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001216 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001217 case MVT::i8:
1218 Opcode = NVPTX::LDV_i8_v4_ari;
1219 break;
1220 case MVT::i16:
1221 Opcode = NVPTX::LDV_i16_v4_ari;
1222 break;
1223 case MVT::i32:
1224 Opcode = NVPTX::LDV_i32_v4_ari;
1225 break;
1226 case MVT::f32:
1227 Opcode = NVPTX::LDV_f32_v4_ari;
1228 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001229 }
1230 break;
1231 }
1232 }
1233
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001234 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1235 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1236 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001237
Michael Liaob53d8962013-04-19 22:22:57 +00001238 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001239 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001240 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001241 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001242 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001243 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001244 case NVPTXISD::LoadV2:
1245 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001246 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001247 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001248 case MVT::i8:
1249 Opcode = NVPTX::LDV_i8_v2_areg_64;
1250 break;
1251 case MVT::i16:
1252 Opcode = NVPTX::LDV_i16_v2_areg_64;
1253 break;
1254 case MVT::i32:
1255 Opcode = NVPTX::LDV_i32_v2_areg_64;
1256 break;
1257 case MVT::i64:
1258 Opcode = NVPTX::LDV_i64_v2_areg_64;
1259 break;
1260 case MVT::f32:
1261 Opcode = NVPTX::LDV_f32_v2_areg_64;
1262 break;
1263 case MVT::f64:
1264 Opcode = NVPTX::LDV_f64_v2_areg_64;
1265 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001266 }
1267 break;
1268 case NVPTXISD::LoadV4:
1269 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001270 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001271 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001272 case MVT::i8:
1273 Opcode = NVPTX::LDV_i8_v4_areg_64;
1274 break;
1275 case MVT::i16:
1276 Opcode = NVPTX::LDV_i16_v4_areg_64;
1277 break;
1278 case MVT::i32:
1279 Opcode = NVPTX::LDV_i32_v4_areg_64;
1280 break;
1281 case MVT::f32:
1282 Opcode = NVPTX::LDV_f32_v4_areg_64;
1283 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001284 }
1285 break;
1286 }
1287 } else {
1288 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001289 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001290 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001291 case NVPTXISD::LoadV2:
1292 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001293 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001294 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001295 case MVT::i8:
1296 Opcode = NVPTX::LDV_i8_v2_areg;
1297 break;
1298 case MVT::i16:
1299 Opcode = NVPTX::LDV_i16_v2_areg;
1300 break;
1301 case MVT::i32:
1302 Opcode = NVPTX::LDV_i32_v2_areg;
1303 break;
1304 case MVT::i64:
1305 Opcode = NVPTX::LDV_i64_v2_areg;
1306 break;
1307 case MVT::f32:
1308 Opcode = NVPTX::LDV_f32_v2_areg;
1309 break;
1310 case MVT::f64:
1311 Opcode = NVPTX::LDV_f64_v2_areg;
1312 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001313 }
1314 break;
1315 case NVPTXISD::LoadV4:
1316 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001317 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001318 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001319 case MVT::i8:
1320 Opcode = NVPTX::LDV_i8_v4_areg;
1321 break;
1322 case MVT::i16:
1323 Opcode = NVPTX::LDV_i16_v4_areg;
1324 break;
1325 case MVT::i32:
1326 Opcode = NVPTX::LDV_i32_v4_areg;
1327 break;
1328 case MVT::f32:
1329 Opcode = NVPTX::LDV_f32_v4_areg;
1330 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001331 }
1332 break;
1333 }
1334 }
1335
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001336 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1337 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1338 getI32Imm(FromTypeWidth, DL), Op1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001339 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001340 }
1341
1342 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1343 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1344 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1345
Justin Bogner8d83fb62016-05-13 21:12:53 +00001346 ReplaceNode(N, LD);
1347 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001348}
1349
Justin Bogner8d83fb62016-05-13 21:12:53 +00001350bool NVPTXDAGToDAGISel::tryLDGLDU(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001351
1352 SDValue Chain = N->getOperand(0);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001353 SDValue Op1;
1354 MemSDNode *Mem;
1355 bool IsLDG = true;
1356
Justin Holewinskic7997922016-04-05 12:38:01 +00001357 // If this is an LDG intrinsic, the address is the third operand. If its an
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001358 // LDG/LDU SD node (from custom vector handling), then its the second operand
1359 if (N->getOpcode() == ISD::INTRINSIC_W_CHAIN) {
1360 Op1 = N->getOperand(2);
1361 Mem = cast<MemIntrinsicSDNode>(N);
1362 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
1363 switch (IID) {
1364 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001365 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001366 case Intrinsic::nvvm_ldg_global_f:
1367 case Intrinsic::nvvm_ldg_global_i:
1368 case Intrinsic::nvvm_ldg_global_p:
1369 IsLDG = true;
1370 break;
1371 case Intrinsic::nvvm_ldu_global_f:
1372 case Intrinsic::nvvm_ldu_global_i:
1373 case Intrinsic::nvvm_ldu_global_p:
1374 IsLDG = false;
1375 break;
1376 }
1377 } else {
1378 Op1 = N->getOperand(1);
1379 Mem = cast<MemSDNode>(N);
1380 }
1381
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001382 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00001383 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001384 SDNode *LD;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001385 SDValue Base, Offset, Addr;
Justin Holewinskif8f70912013-06-28 17:57:59 +00001386
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001387 EVT EltVT = Mem->getMemoryVT();
Justin Holewinskic7997922016-04-05 12:38:01 +00001388 unsigned NumElts = 1;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001389 if (EltVT.isVector()) {
Justin Holewinskic7997922016-04-05 12:38:01 +00001390 NumElts = EltVT.getVectorNumElements();
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001391 EltVT = EltVT.getVectorElementType();
1392 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001393
Justin Holewinskic7997922016-04-05 12:38:01 +00001394 // Build the "promoted" result VTList for the load. If we are really loading
1395 // i8s, then the return type will be promoted to i16 since we do not expose
1396 // 8-bit registers in NVPTX.
1397 EVT NodeVT = (EltVT == MVT::i8) ? MVT::i16 : EltVT;
1398 SmallVector<EVT, 5> InstVTs;
1399 for (unsigned i = 0; i != NumElts; ++i) {
1400 InstVTs.push_back(NodeVT);
1401 }
1402 InstVTs.push_back(MVT::Other);
1403 SDVTList InstVTList = CurDAG->getVTList(InstVTs);
1404
Justin Holewinskie40e9292013-07-01 12:58:52 +00001405 if (SelectDirectAddr(Op1, Addr)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001406 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001407 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001408 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001409 case ISD::INTRINSIC_W_CHAIN:
1410 if (IsLDG) {
1411 switch (EltVT.getSimpleVT().SimpleTy) {
1412 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001413 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001414 case MVT::i8:
1415 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8avar;
1416 break;
1417 case MVT::i16:
1418 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16avar;
1419 break;
1420 case MVT::i32:
1421 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32avar;
1422 break;
1423 case MVT::i64:
1424 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64avar;
1425 break;
1426 case MVT::f32:
1427 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32avar;
1428 break;
1429 case MVT::f64:
1430 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64avar;
1431 break;
1432 }
1433 } else {
1434 switch (EltVT.getSimpleVT().SimpleTy) {
1435 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001436 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001437 case MVT::i8:
1438 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8avar;
1439 break;
1440 case MVT::i16:
1441 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16avar;
1442 break;
1443 case MVT::i32:
1444 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32avar;
1445 break;
1446 case MVT::i64:
1447 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64avar;
1448 break;
1449 case MVT::f32:
1450 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32avar;
1451 break;
1452 case MVT::f64:
1453 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64avar;
1454 break;
1455 }
1456 }
1457 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001458 case NVPTXISD::LDGV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001459 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001460 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001461 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001462 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001463 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001464 break;
1465 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001466 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001467 break;
1468 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001469 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001470 break;
1471 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001472 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001473 break;
1474 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001475 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001476 break;
1477 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001478 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001479 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001480 }
1481 break;
1482 case NVPTXISD::LDUV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001483 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001484 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001485 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001486 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001487 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001488 break;
1489 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001490 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001491 break;
1492 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001493 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001494 break;
1495 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001496 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001497 break;
1498 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001499 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001500 break;
1501 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001502 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
1503 break;
1504 }
1505 break;
1506 case NVPTXISD::LDGV4:
1507 switch (EltVT.getSimpleVT().SimpleTy) {
1508 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001509 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001510 case MVT::i8:
1511 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
1512 break;
1513 case MVT::i16:
1514 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
1515 break;
1516 case MVT::i32:
1517 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
1518 break;
1519 case MVT::f32:
1520 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001521 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001522 }
1523 break;
1524 case NVPTXISD::LDUV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001525 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001526 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001527 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001528 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001529 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001530 break;
1531 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001532 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001533 break;
1534 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001535 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001536 break;
1537 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001538 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001539 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001540 }
1541 break;
1542 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001543
1544 SDValue Ops[] = { Addr, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00001545 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001546 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1547 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1548 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001549 switch (N->getOpcode()) {
1550 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001551 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001552 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001553 case ISD::INTRINSIC_W_CHAIN:
1554 if (IsLDG) {
1555 switch (EltVT.getSimpleVT().SimpleTy) {
1556 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001557 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001558 case MVT::i8:
1559 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari64;
1560 break;
1561 case MVT::i16:
1562 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari64;
1563 break;
1564 case MVT::i32:
1565 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari64;
1566 break;
1567 case MVT::i64:
1568 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari64;
1569 break;
1570 case MVT::f32:
1571 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari64;
1572 break;
1573 case MVT::f64:
1574 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari64;
1575 break;
1576 }
1577 } else {
1578 switch (EltVT.getSimpleVT().SimpleTy) {
1579 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001580 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001581 case MVT::i8:
1582 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari64;
1583 break;
1584 case MVT::i16:
1585 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari64;
1586 break;
1587 case MVT::i32:
1588 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari64;
1589 break;
1590 case MVT::i64:
1591 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari64;
1592 break;
1593 case MVT::f32:
1594 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari64;
1595 break;
1596 case MVT::f64:
1597 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari64;
1598 break;
1599 }
1600 }
1601 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001602 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001603 case NVPTXISD::LDGV2:
1604 switch (EltVT.getSimpleVT().SimpleTy) {
1605 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001606 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001607 case MVT::i8:
1608 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
1609 break;
1610 case MVT::i16:
1611 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
1612 break;
1613 case MVT::i32:
1614 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
1615 break;
1616 case MVT::i64:
1617 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
1618 break;
1619 case MVT::f32:
1620 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
1621 break;
1622 case MVT::f64:
1623 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
1624 break;
1625 }
1626 break;
1627 case NVPTXISD::LDUV2:
1628 switch (EltVT.getSimpleVT().SimpleTy) {
1629 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001630 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001631 case MVT::i8:
1632 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
1633 break;
1634 case MVT::i16:
1635 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
1636 break;
1637 case MVT::i32:
1638 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
1639 break;
1640 case MVT::i64:
1641 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
1642 break;
1643 case MVT::f32:
1644 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
1645 break;
1646 case MVT::f64:
1647 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
1648 break;
1649 }
1650 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001651 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001652 case NVPTXISD::LDGV4:
1653 switch (EltVT.getSimpleVT().SimpleTy) {
1654 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001655 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001656 case MVT::i8:
1657 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
1658 break;
1659 case MVT::i16:
1660 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
1661 break;
1662 case MVT::i32:
1663 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
1664 break;
1665 case MVT::f32:
1666 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
1667 break;
1668 }
1669 break;
1670 case NVPTXISD::LDUV4:
1671 switch (EltVT.getSimpleVT().SimpleTy) {
1672 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001673 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001674 case MVT::i8:
1675 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
1676 break;
1677 case MVT::i16:
1678 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
1679 break;
1680 case MVT::i32:
1681 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1682 break;
1683 case MVT::f32:
1684 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1685 break;
1686 }
1687 break;
1688 }
1689 } else {
1690 switch (N->getOpcode()) {
1691 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001692 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001693 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001694 case ISD::INTRINSIC_W_CHAIN:
1695 if (IsLDG) {
1696 switch (EltVT.getSimpleVT().SimpleTy) {
1697 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001698 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001699 case MVT::i8:
1700 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari;
1701 break;
1702 case MVT::i16:
1703 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari;
1704 break;
1705 case MVT::i32:
1706 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari;
1707 break;
1708 case MVT::i64:
1709 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari;
1710 break;
1711 case MVT::f32:
1712 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari;
1713 break;
1714 case MVT::f64:
1715 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari;
1716 break;
1717 }
1718 } else {
1719 switch (EltVT.getSimpleVT().SimpleTy) {
1720 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001721 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001722 case MVT::i8:
1723 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari;
1724 break;
1725 case MVT::i16:
1726 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari;
1727 break;
1728 case MVT::i32:
1729 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari;
1730 break;
1731 case MVT::i64:
1732 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari;
1733 break;
1734 case MVT::f32:
1735 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari;
1736 break;
1737 case MVT::f64:
1738 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari;
1739 break;
1740 }
1741 }
1742 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001743 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001744 case NVPTXISD::LDGV2:
1745 switch (EltVT.getSimpleVT().SimpleTy) {
1746 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001747 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001748 case MVT::i8:
1749 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1750 break;
1751 case MVT::i16:
1752 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1753 break;
1754 case MVT::i32:
1755 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1756 break;
1757 case MVT::i64:
1758 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1759 break;
1760 case MVT::f32:
1761 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1762 break;
1763 case MVT::f64:
1764 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1765 break;
1766 }
1767 break;
1768 case NVPTXISD::LDUV2:
1769 switch (EltVT.getSimpleVT().SimpleTy) {
1770 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001771 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001772 case MVT::i8:
1773 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1774 break;
1775 case MVT::i16:
1776 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1777 break;
1778 case MVT::i32:
1779 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1780 break;
1781 case MVT::i64:
1782 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1783 break;
1784 case MVT::f32:
1785 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1786 break;
1787 case MVT::f64:
1788 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1789 break;
1790 }
1791 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001792 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001793 case NVPTXISD::LDGV4:
1794 switch (EltVT.getSimpleVT().SimpleTy) {
1795 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001796 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001797 case MVT::i8:
1798 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1799 break;
1800 case MVT::i16:
1801 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1802 break;
1803 case MVT::i32:
1804 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1805 break;
1806 case MVT::f32:
1807 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1808 break;
1809 }
1810 break;
1811 case NVPTXISD::LDUV4:
1812 switch (EltVT.getSimpleVT().SimpleTy) {
1813 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001814 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001815 case MVT::i8:
1816 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1817 break;
1818 case MVT::i16:
1819 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1820 break;
1821 case MVT::i32:
1822 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1823 break;
1824 case MVT::f32:
1825 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1826 break;
1827 }
1828 break;
1829 }
1830 }
1831
1832 SDValue Ops[] = { Base, Offset, Chain };
1833
Justin Holewinskic7997922016-04-05 12:38:01 +00001834 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001835 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001836 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001837 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001838 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001839 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001840 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001841 case ISD::INTRINSIC_W_CHAIN:
1842 if (IsLDG) {
1843 switch (EltVT.getSimpleVT().SimpleTy) {
1844 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001845 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001846 case MVT::i8:
1847 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg64;
1848 break;
1849 case MVT::i16:
1850 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg64;
1851 break;
1852 case MVT::i32:
1853 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg64;
1854 break;
1855 case MVT::i64:
1856 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg64;
1857 break;
1858 case MVT::f32:
1859 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg64;
1860 break;
1861 case MVT::f64:
1862 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg64;
1863 break;
1864 }
1865 } else {
1866 switch (EltVT.getSimpleVT().SimpleTy) {
1867 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001868 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001869 case MVT::i8:
1870 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg64;
1871 break;
1872 case MVT::i16:
1873 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg64;
1874 break;
1875 case MVT::i32:
1876 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg64;
1877 break;
1878 case MVT::i64:
1879 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg64;
1880 break;
1881 case MVT::f32:
1882 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg64;
1883 break;
1884 case MVT::f64:
1885 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg64;
1886 break;
1887 }
1888 }
1889 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001890 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001891 case NVPTXISD::LDGV2:
1892 switch (EltVT.getSimpleVT().SimpleTy) {
1893 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001894 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001895 case MVT::i8:
1896 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1897 break;
1898 case MVT::i16:
1899 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1900 break;
1901 case MVT::i32:
1902 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1903 break;
1904 case MVT::i64:
1905 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1906 break;
1907 case MVT::f32:
1908 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1909 break;
1910 case MVT::f64:
1911 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1912 break;
1913 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001914 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001915 case NVPTXISD::LDUV2:
1916 switch (EltVT.getSimpleVT().SimpleTy) {
1917 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001918 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001919 case MVT::i8:
1920 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1921 break;
1922 case MVT::i16:
1923 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1924 break;
1925 case MVT::i32:
1926 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1927 break;
1928 case MVT::i64:
1929 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1930 break;
1931 case MVT::f32:
1932 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1933 break;
1934 case MVT::f64:
1935 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1936 break;
1937 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001938 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001939 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001940 case NVPTXISD::LDGV4:
1941 switch (EltVT.getSimpleVT().SimpleTy) {
1942 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001943 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001944 case MVT::i8:
1945 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1946 break;
1947 case MVT::i16:
1948 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1949 break;
1950 case MVT::i32:
1951 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1952 break;
1953 case MVT::f32:
1954 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1955 break;
1956 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001957 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001958 case NVPTXISD::LDUV4:
1959 switch (EltVT.getSimpleVT().SimpleTy) {
1960 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001961 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001962 case MVT::i8:
1963 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1964 break;
1965 case MVT::i16:
1966 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1967 break;
1968 case MVT::i32:
1969 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1970 break;
1971 case MVT::f32:
1972 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1973 break;
1974 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001975 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001976 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001977 } else {
1978 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001979 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001980 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001981 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001982 case ISD::INTRINSIC_W_CHAIN:
1983 if (IsLDG) {
1984 switch (EltVT.getSimpleVT().SimpleTy) {
1985 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001986 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001987 case MVT::i8:
1988 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg;
1989 break;
1990 case MVT::i16:
1991 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg;
1992 break;
1993 case MVT::i32:
1994 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg;
1995 break;
1996 case MVT::i64:
1997 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg;
1998 break;
1999 case MVT::f32:
2000 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg;
2001 break;
2002 case MVT::f64:
2003 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg;
2004 break;
2005 }
2006 } else {
2007 switch (EltVT.getSimpleVT().SimpleTy) {
2008 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002009 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00002010 case MVT::i8:
2011 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg;
2012 break;
2013 case MVT::i16:
2014 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg;
2015 break;
2016 case MVT::i32:
2017 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg;
2018 break;
2019 case MVT::i64:
2020 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg;
2021 break;
2022 case MVT::f32:
2023 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg;
2024 break;
2025 case MVT::f64:
2026 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg;
2027 break;
2028 }
2029 }
2030 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00002031 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00002032 case NVPTXISD::LDGV2:
2033 switch (EltVT.getSimpleVT().SimpleTy) {
2034 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002035 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002036 case MVT::i8:
2037 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
2038 break;
2039 case MVT::i16:
2040 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
2041 break;
2042 case MVT::i32:
2043 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
2044 break;
2045 case MVT::i64:
2046 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
2047 break;
2048 case MVT::f32:
2049 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
2050 break;
2051 case MVT::f64:
2052 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
2053 break;
2054 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002055 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002056 case NVPTXISD::LDUV2:
2057 switch (EltVT.getSimpleVT().SimpleTy) {
2058 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002059 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002060 case MVT::i8:
2061 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
2062 break;
2063 case MVT::i16:
2064 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
2065 break;
2066 case MVT::i32:
2067 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
2068 break;
2069 case MVT::i64:
2070 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
2071 break;
2072 case MVT::f32:
2073 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
2074 break;
2075 case MVT::f64:
2076 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
2077 break;
2078 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002079 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00002080 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00002081 case NVPTXISD::LDGV4:
2082 switch (EltVT.getSimpleVT().SimpleTy) {
2083 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002084 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002085 case MVT::i8:
2086 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
2087 break;
2088 case MVT::i16:
2089 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
2090 break;
2091 case MVT::i32:
2092 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
2093 break;
2094 case MVT::f32:
2095 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
2096 break;
2097 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002098 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002099 case NVPTXISD::LDUV4:
2100 switch (EltVT.getSimpleVT().SimpleTy) {
2101 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002102 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002103 case MVT::i8:
2104 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
2105 break;
2106 case MVT::i16:
2107 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
2108 break;
2109 case MVT::i32:
2110 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
2111 break;
2112 case MVT::f32:
2113 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
2114 break;
2115 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002116 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002117 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002118 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002119
Justin Holewinskie40e9292013-07-01 12:58:52 +00002120 SDValue Ops[] = { Op1, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00002121 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskie40e9292013-07-01 12:58:52 +00002122 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002123
2124 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00002125 MemRefs0[0] = Mem->getMemOperand();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002126 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
2127
Justin Holewinskic7997922016-04-05 12:38:01 +00002128 // For automatic generation of LDG (through SelectLoad[Vector], not the
2129 // intrinsics), we may have an extending load like:
2130 //
2131 // i32,ch = load<LD1[%data1(addrspace=1)], zext from i8> t0, t7, undef:i64
2132 //
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002133 // In this case, the matching logic above will select a load for the original
2134 // memory type (in this case, i8) and our types will not match (the node needs
2135 // to return an i32 in this case). Our LDG/LDU nodes do not support the
2136 // concept of sign-/zero-extension, so emulate it here by adding an explicit
2137 // CVT instruction. Ptxas should clean up any redundancies here.
2138
Justin Holewinskic7997922016-04-05 12:38:01 +00002139 EVT OrigType = N->getValueType(0);
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002140 LoadSDNode *LdNode = dyn_cast<LoadSDNode>(N);
Justin Holewinskic7997922016-04-05 12:38:01 +00002141
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002142 if (OrigType != EltVT && LdNode) {
2143 // We have an extending-load. The instruction we selected operates on the
2144 // smaller type, but the SDNode we are replacing has the larger type. We
2145 // need to emit a CVT to make the types match.
2146 bool IsSigned = LdNode->getExtensionType() == ISD::SEXTLOAD;
2147 unsigned CvtOpc = GetConvertOpcode(OrigType.getSimpleVT(),
2148 EltVT.getSimpleVT(), IsSigned);
Justin Holewinskic7997922016-04-05 12:38:01 +00002149
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002150 // For each output value, apply the manual sign/zero-extension and make sure
2151 // all users of the load go through that CVT.
Justin Holewinskic7997922016-04-05 12:38:01 +00002152 for (unsigned i = 0; i != NumElts; ++i) {
2153 SDValue Res(LD, i);
2154 SDValue OrigVal(N, i);
2155
2156 SDNode *CvtNode =
2157 CurDAG->getMachineNode(CvtOpc, DL, OrigType, Res,
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002158 CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2159 DL, MVT::i32));
Justin Holewinskic7997922016-04-05 12:38:01 +00002160 ReplaceUses(OrigVal, SDValue(CvtNode, 0));
2161 }
2162 }
2163
Justin Bogner8d83fb62016-05-13 21:12:53 +00002164 ReplaceNode(N, LD);
2165 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002166}
2167
Justin Bogner8d83fb62016-05-13 21:12:53 +00002168bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +00002169 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002170 StoreSDNode *ST = cast<StoreSDNode>(N);
2171 EVT StoreVT = ST->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +00002172 SDNode *NVPTXST = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002173
2174 // do not support pre/post inc/dec
2175 if (ST->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002176 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002177
2178 if (!StoreVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002179 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002180
2181 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002182 unsigned int codeAddrSpace = getCodeAddrSpace(ST);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002183
2184 // Volatile Setting
2185 // - .volatile is only availalble for .global and .shared
2186 bool isVolatile = ST->isVolatile();
2187 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2188 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2189 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2190 isVolatile = false;
2191
2192 // Vector Setting
2193 MVT SimpleVT = StoreVT.getSimpleVT();
2194 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
2195 if (SimpleVT.isVector()) {
2196 unsigned num = SimpleVT.getVectorNumElements();
2197 if (num == 2)
2198 vecType = NVPTX::PTXLdStInstCode::V2;
2199 else if (num == 4)
2200 vecType = NVPTX::PTXLdStInstCode::V4;
2201 else
Justin Bogner8d83fb62016-05-13 21:12:53 +00002202 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002203 }
2204
2205 // Type Setting: toType + toTypeWidth
2206 // - for integer type, always use 'u'
2207 //
2208 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002209 unsigned toTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskiae556d32012-05-04 20:18:50 +00002210 unsigned int toType;
2211 if (ScalarVT.isFloatingPoint())
Artem Belevich64dc9be2017-01-13 20:56:17 +00002212 // f16 uses .b16 as its storage type.
2213 toType = ScalarVT.SimpleTy == MVT::f16 ? NVPTX::PTXLdStInstCode::Untyped
2214 : NVPTX::PTXLdStInstCode::Float;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002215 else
2216 toType = NVPTX::PTXLdStInstCode::Unsigned;
2217
2218 // Create the machine instruction DAG
2219 SDValue Chain = N->getOperand(0);
2220 SDValue N1 = N->getOperand(1);
2221 SDValue N2 = N->getOperand(2);
2222 SDValue Addr;
2223 SDValue Offset, Base;
2224 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +00002225 MVT::SimpleValueType SourceVT = N1.getNode()->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002226
2227 if (SelectDirectAddr(N2, Addr)) {
2228 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002229 case MVT::i8:
2230 Opcode = NVPTX::ST_i8_avar;
2231 break;
2232 case MVT::i16:
2233 Opcode = NVPTX::ST_i16_avar;
2234 break;
2235 case MVT::i32:
2236 Opcode = NVPTX::ST_i32_avar;
2237 break;
2238 case MVT::i64:
2239 Opcode = NVPTX::ST_i64_avar;
2240 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002241 case MVT::f16:
2242 Opcode = NVPTX::ST_f16_avar;
2243 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002244 case MVT::f32:
2245 Opcode = NVPTX::ST_f32_avar;
2246 break;
2247 case MVT::f64:
2248 Opcode = NVPTX::ST_f64_avar;
2249 break;
2250 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002251 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002252 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002253 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2254 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2255 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Addr,
2256 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002257 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002258 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2259 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00002260 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002261 case MVT::i8:
2262 Opcode = NVPTX::ST_i8_asi;
2263 break;
2264 case MVT::i16:
2265 Opcode = NVPTX::ST_i16_asi;
2266 break;
2267 case MVT::i32:
2268 Opcode = NVPTX::ST_i32_asi;
2269 break;
2270 case MVT::i64:
2271 Opcode = NVPTX::ST_i64_asi;
2272 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002273 case MVT::f16:
2274 Opcode = NVPTX::ST_f16_asi;
2275 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002276 case MVT::f32:
2277 Opcode = NVPTX::ST_f32_asi;
2278 break;
2279 case MVT::f64:
2280 Opcode = NVPTX::ST_f64_asi;
2281 break;
2282 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002283 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002284 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002285 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2286 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2287 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2288 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002289 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002290 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2291 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2292 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002293 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002294 case MVT::i8:
2295 Opcode = NVPTX::ST_i8_ari_64;
2296 break;
2297 case MVT::i16:
2298 Opcode = NVPTX::ST_i16_ari_64;
2299 break;
2300 case MVT::i32:
2301 Opcode = NVPTX::ST_i32_ari_64;
2302 break;
2303 case MVT::i64:
2304 Opcode = NVPTX::ST_i64_ari_64;
2305 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002306 case MVT::f16:
2307 Opcode = NVPTX::ST_f16_ari_64;
2308 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002309 case MVT::f32:
2310 Opcode = NVPTX::ST_f32_ari_64;
2311 break;
2312 case MVT::f64:
2313 Opcode = NVPTX::ST_f64_ari_64;
2314 break;
2315 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002316 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002317 }
2318 } else {
2319 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002320 case MVT::i8:
2321 Opcode = NVPTX::ST_i8_ari;
2322 break;
2323 case MVT::i16:
2324 Opcode = NVPTX::ST_i16_ari;
2325 break;
2326 case MVT::i32:
2327 Opcode = NVPTX::ST_i32_ari;
2328 break;
2329 case MVT::i64:
2330 Opcode = NVPTX::ST_i64_ari;
2331 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002332 case MVT::f16:
2333 Opcode = NVPTX::ST_f16_ari;
2334 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002335 case MVT::f32:
2336 Opcode = NVPTX::ST_f32_ari;
2337 break;
2338 case MVT::f64:
2339 Opcode = NVPTX::ST_f64_ari;
2340 break;
2341 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002342 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002343 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002344 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002345 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2346 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2347 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2348 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002349 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002350 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002351 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002352 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002353 case MVT::i8:
2354 Opcode = NVPTX::ST_i8_areg_64;
2355 break;
2356 case MVT::i16:
2357 Opcode = NVPTX::ST_i16_areg_64;
2358 break;
2359 case MVT::i32:
2360 Opcode = NVPTX::ST_i32_areg_64;
2361 break;
2362 case MVT::i64:
2363 Opcode = NVPTX::ST_i64_areg_64;
2364 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002365 case MVT::f16:
2366 Opcode = NVPTX::ST_f16_areg_64;
2367 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002368 case MVT::f32:
2369 Opcode = NVPTX::ST_f32_areg_64;
2370 break;
2371 case MVT::f64:
2372 Opcode = NVPTX::ST_f64_areg_64;
2373 break;
2374 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002375 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002376 }
2377 } else {
2378 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002379 case MVT::i8:
2380 Opcode = NVPTX::ST_i8_areg;
2381 break;
2382 case MVT::i16:
2383 Opcode = NVPTX::ST_i16_areg;
2384 break;
2385 case MVT::i32:
2386 Opcode = NVPTX::ST_i32_areg;
2387 break;
2388 case MVT::i64:
2389 Opcode = NVPTX::ST_i64_areg;
2390 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002391 case MVT::f16:
2392 Opcode = NVPTX::ST_f16_areg;
2393 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002394 case MVT::f32:
2395 Opcode = NVPTX::ST_f32_areg;
2396 break;
2397 case MVT::f64:
2398 Opcode = NVPTX::ST_f64_areg;
2399 break;
2400 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002401 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002402 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002403 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002404 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2405 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2406 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), N2,
2407 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002408 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002409 }
2410
Justin Bogner8d83fb62016-05-13 21:12:53 +00002411 if (!NVPTXST)
2412 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002413
Justin Bogner8d83fb62016-05-13 21:12:53 +00002414 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2415 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2416 cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2417 ReplaceNode(N, NVPTXST);
2418 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002419}
2420
Justin Bogner8d83fb62016-05-13 21:12:53 +00002421bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002422 SDValue Chain = N->getOperand(0);
2423 SDValue Op1 = N->getOperand(1);
2424 SDValue Addr, Offset, Base;
2425 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00002426 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002427 SDNode *ST;
2428 EVT EltVT = Op1.getValueType();
2429 MemSDNode *MemSD = cast<MemSDNode>(N);
2430 EVT StoreVT = MemSD->getMemoryVT();
2431
2432 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002433 unsigned CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002434
2435 if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
2436 report_fatal_error("Cannot store to pointer that points to constant "
2437 "memory space");
2438 }
2439
2440 // Volatile Setting
2441 // - .volatile is only availalble for .global and .shared
2442 bool IsVolatile = MemSD->isVolatile();
2443 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2444 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2445 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2446 IsVolatile = false;
2447
2448 // Type Setting: toType + toTypeWidth
2449 // - for integer type, always use 'u'
2450 assert(StoreVT.isSimple() && "Store value is not simple");
2451 MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002452 unsigned ToTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002453 unsigned ToType;
2454 if (ScalarVT.isFloatingPoint())
2455 ToType = NVPTX::PTXLdStInstCode::Float;
2456 else
2457 ToType = NVPTX::PTXLdStInstCode::Unsigned;
2458
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002459 SmallVector<SDValue, 12> StOps;
2460 SDValue N2;
2461 unsigned VecType;
2462
2463 switch (N->getOpcode()) {
2464 case NVPTXISD::StoreV2:
2465 VecType = NVPTX::PTXLdStInstCode::V2;
2466 StOps.push_back(N->getOperand(1));
2467 StOps.push_back(N->getOperand(2));
2468 N2 = N->getOperand(3);
2469 break;
2470 case NVPTXISD::StoreV4:
2471 VecType = NVPTX::PTXLdStInstCode::V4;
2472 StOps.push_back(N->getOperand(1));
2473 StOps.push_back(N->getOperand(2));
2474 StOps.push_back(N->getOperand(3));
2475 StOps.push_back(N->getOperand(4));
2476 N2 = N->getOperand(5);
2477 break;
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 }
2481
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002482 StOps.push_back(getI32Imm(IsVolatile, DL));
2483 StOps.push_back(getI32Imm(CodeAddrSpace, DL));
2484 StOps.push_back(getI32Imm(VecType, DL));
2485 StOps.push_back(getI32Imm(ToType, DL));
2486 StOps.push_back(getI32Imm(ToTypeWidth, DL));
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002487
2488 if (SelectDirectAddr(N2, Addr)) {
2489 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002490 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002491 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002492 case NVPTXISD::StoreV2:
2493 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002494 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002495 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002496 case MVT::i8:
2497 Opcode = NVPTX::STV_i8_v2_avar;
2498 break;
2499 case MVT::i16:
2500 Opcode = NVPTX::STV_i16_v2_avar;
2501 break;
2502 case MVT::i32:
2503 Opcode = NVPTX::STV_i32_v2_avar;
2504 break;
2505 case MVT::i64:
2506 Opcode = NVPTX::STV_i64_v2_avar;
2507 break;
2508 case MVT::f32:
2509 Opcode = NVPTX::STV_f32_v2_avar;
2510 break;
2511 case MVT::f64:
2512 Opcode = NVPTX::STV_f64_v2_avar;
2513 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002514 }
2515 break;
2516 case NVPTXISD::StoreV4:
2517 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002518 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002519 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002520 case MVT::i8:
2521 Opcode = NVPTX::STV_i8_v4_avar;
2522 break;
2523 case MVT::i16:
2524 Opcode = NVPTX::STV_i16_v4_avar;
2525 break;
2526 case MVT::i32:
2527 Opcode = NVPTX::STV_i32_v4_avar;
2528 break;
2529 case MVT::f32:
2530 Opcode = NVPTX::STV_f32_v4_avar;
2531 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002532 }
2533 break;
2534 }
2535 StOps.push_back(Addr);
Eric Christopher02389e32015-02-19 00:08:27 +00002536 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2537 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002538 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002539 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002540 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002541 case NVPTXISD::StoreV2:
2542 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002543 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002544 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002545 case MVT::i8:
2546 Opcode = NVPTX::STV_i8_v2_asi;
2547 break;
2548 case MVT::i16:
2549 Opcode = NVPTX::STV_i16_v2_asi;
2550 break;
2551 case MVT::i32:
2552 Opcode = NVPTX::STV_i32_v2_asi;
2553 break;
2554 case MVT::i64:
2555 Opcode = NVPTX::STV_i64_v2_asi;
2556 break;
2557 case MVT::f32:
2558 Opcode = NVPTX::STV_f32_v2_asi;
2559 break;
2560 case MVT::f64:
2561 Opcode = NVPTX::STV_f64_v2_asi;
2562 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002563 }
2564 break;
2565 case NVPTXISD::StoreV4:
2566 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002567 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002568 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002569 case MVT::i8:
2570 Opcode = NVPTX::STV_i8_v4_asi;
2571 break;
2572 case MVT::i16:
2573 Opcode = NVPTX::STV_i16_v4_asi;
2574 break;
2575 case MVT::i32:
2576 Opcode = NVPTX::STV_i32_v4_asi;
2577 break;
2578 case MVT::f32:
2579 Opcode = NVPTX::STV_f32_v4_asi;
2580 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002581 }
2582 break;
2583 }
2584 StOps.push_back(Base);
2585 StOps.push_back(Offset);
Eric Christopher02389e32015-02-19 00:08:27 +00002586 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2587 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2588 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002589 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002590 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002591 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002592 case NVPTXISD::StoreV2:
2593 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002594 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002595 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002596 case MVT::i8:
2597 Opcode = NVPTX::STV_i8_v2_ari_64;
2598 break;
2599 case MVT::i16:
2600 Opcode = NVPTX::STV_i16_v2_ari_64;
2601 break;
2602 case MVT::i32:
2603 Opcode = NVPTX::STV_i32_v2_ari_64;
2604 break;
2605 case MVT::i64:
2606 Opcode = NVPTX::STV_i64_v2_ari_64;
2607 break;
2608 case MVT::f32:
2609 Opcode = NVPTX::STV_f32_v2_ari_64;
2610 break;
2611 case MVT::f64:
2612 Opcode = NVPTX::STV_f64_v2_ari_64;
2613 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002614 }
2615 break;
2616 case NVPTXISD::StoreV4:
2617 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002618 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002619 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002620 case MVT::i8:
2621 Opcode = NVPTX::STV_i8_v4_ari_64;
2622 break;
2623 case MVT::i16:
2624 Opcode = NVPTX::STV_i16_v4_ari_64;
2625 break;
2626 case MVT::i32:
2627 Opcode = NVPTX::STV_i32_v4_ari_64;
2628 break;
2629 case MVT::f32:
2630 Opcode = NVPTX::STV_f32_v4_ari_64;
2631 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002632 }
2633 break;
2634 }
2635 } else {
2636 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002637 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002638 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002639 case NVPTXISD::StoreV2:
2640 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002641 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002642 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002643 case MVT::i8:
2644 Opcode = NVPTX::STV_i8_v2_ari;
2645 break;
2646 case MVT::i16:
2647 Opcode = NVPTX::STV_i16_v2_ari;
2648 break;
2649 case MVT::i32:
2650 Opcode = NVPTX::STV_i32_v2_ari;
2651 break;
2652 case MVT::i64:
2653 Opcode = NVPTX::STV_i64_v2_ari;
2654 break;
2655 case MVT::f32:
2656 Opcode = NVPTX::STV_f32_v2_ari;
2657 break;
2658 case MVT::f64:
2659 Opcode = NVPTX::STV_f64_v2_ari;
2660 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002661 }
2662 break;
2663 case NVPTXISD::StoreV4:
2664 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002665 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002666 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002667 case MVT::i8:
2668 Opcode = NVPTX::STV_i8_v4_ari;
2669 break;
2670 case MVT::i16:
2671 Opcode = NVPTX::STV_i16_v4_ari;
2672 break;
2673 case MVT::i32:
2674 Opcode = NVPTX::STV_i32_v4_ari;
2675 break;
2676 case MVT::f32:
2677 Opcode = NVPTX::STV_f32_v4_ari;
2678 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002679 }
2680 break;
2681 }
2682 }
2683 StOps.push_back(Base);
2684 StOps.push_back(Offset);
2685 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002686 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002687 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002688 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002689 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002690 case NVPTXISD::StoreV2:
2691 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002692 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002693 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002694 case MVT::i8:
2695 Opcode = NVPTX::STV_i8_v2_areg_64;
2696 break;
2697 case MVT::i16:
2698 Opcode = NVPTX::STV_i16_v2_areg_64;
2699 break;
2700 case MVT::i32:
2701 Opcode = NVPTX::STV_i32_v2_areg_64;
2702 break;
2703 case MVT::i64:
2704 Opcode = NVPTX::STV_i64_v2_areg_64;
2705 break;
2706 case MVT::f32:
2707 Opcode = NVPTX::STV_f32_v2_areg_64;
2708 break;
2709 case MVT::f64:
2710 Opcode = NVPTX::STV_f64_v2_areg_64;
2711 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002712 }
2713 break;
2714 case NVPTXISD::StoreV4:
2715 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002716 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002717 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002718 case MVT::i8:
2719 Opcode = NVPTX::STV_i8_v4_areg_64;
2720 break;
2721 case MVT::i16:
2722 Opcode = NVPTX::STV_i16_v4_areg_64;
2723 break;
2724 case MVT::i32:
2725 Opcode = NVPTX::STV_i32_v4_areg_64;
2726 break;
2727 case MVT::f32:
2728 Opcode = NVPTX::STV_f32_v4_areg_64;
2729 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002730 }
2731 break;
2732 }
2733 } else {
2734 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002735 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002736 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002737 case NVPTXISD::StoreV2:
2738 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002739 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002740 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002741 case MVT::i8:
2742 Opcode = NVPTX::STV_i8_v2_areg;
2743 break;
2744 case MVT::i16:
2745 Opcode = NVPTX::STV_i16_v2_areg;
2746 break;
2747 case MVT::i32:
2748 Opcode = NVPTX::STV_i32_v2_areg;
2749 break;
2750 case MVT::i64:
2751 Opcode = NVPTX::STV_i64_v2_areg;
2752 break;
2753 case MVT::f32:
2754 Opcode = NVPTX::STV_f32_v2_areg;
2755 break;
2756 case MVT::f64:
2757 Opcode = NVPTX::STV_f64_v2_areg;
2758 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002759 }
2760 break;
2761 case NVPTXISD::StoreV4:
2762 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002763 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002764 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002765 case MVT::i8:
2766 Opcode = NVPTX::STV_i8_v4_areg;
2767 break;
2768 case MVT::i16:
2769 Opcode = NVPTX::STV_i16_v4_areg;
2770 break;
2771 case MVT::i32:
2772 Opcode = NVPTX::STV_i32_v4_areg;
2773 break;
2774 case MVT::f32:
2775 Opcode = NVPTX::STV_f32_v4_areg;
2776 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002777 }
2778 break;
2779 }
2780 }
2781 StOps.push_back(N2);
2782 }
2783
2784 StOps.push_back(Chain);
2785
Michael Liaob53d8962013-04-19 22:22:57 +00002786 ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002787
2788 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2789 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2790 cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2791
Justin Bogner8d83fb62016-05-13 21:12:53 +00002792 ReplaceNode(N, ST);
2793 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002794}
2795
Justin Bogner8d83fb62016-05-13 21:12:53 +00002796bool NVPTXDAGToDAGISel::tryLoadParam(SDNode *Node) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002797 SDValue Chain = Node->getOperand(0);
2798 SDValue Offset = Node->getOperand(2);
2799 SDValue Flag = Node->getOperand(3);
2800 SDLoc DL(Node);
2801 MemSDNode *Mem = cast<MemSDNode>(Node);
2802
2803 unsigned VecSize;
2804 switch (Node->getOpcode()) {
2805 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002806 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002807 case NVPTXISD::LoadParam:
2808 VecSize = 1;
2809 break;
2810 case NVPTXISD::LoadParamV2:
2811 VecSize = 2;
2812 break;
2813 case NVPTXISD::LoadParamV4:
2814 VecSize = 4;
2815 break;
2816 }
2817
2818 EVT EltVT = Node->getValueType(0);
2819 EVT MemVT = Mem->getMemoryVT();
2820
2821 unsigned Opc = 0;
2822
2823 switch (VecSize) {
2824 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002825 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002826 case 1:
2827 switch (MemVT.getSimpleVT().SimpleTy) {
2828 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002829 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002830 case MVT::i1:
2831 Opc = NVPTX::LoadParamMemI8;
2832 break;
2833 case MVT::i8:
2834 Opc = NVPTX::LoadParamMemI8;
2835 break;
2836 case MVT::i16:
2837 Opc = NVPTX::LoadParamMemI16;
2838 break;
2839 case MVT::i32:
2840 Opc = NVPTX::LoadParamMemI32;
2841 break;
2842 case MVT::i64:
2843 Opc = NVPTX::LoadParamMemI64;
2844 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002845 case MVT::f16:
2846 Opc = NVPTX::LoadParamMemF16;
2847 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002848 case MVT::f32:
2849 Opc = NVPTX::LoadParamMemF32;
2850 break;
2851 case MVT::f64:
2852 Opc = NVPTX::LoadParamMemF64;
2853 break;
2854 }
2855 break;
2856 case 2:
2857 switch (MemVT.getSimpleVT().SimpleTy) {
2858 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002859 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002860 case MVT::i1:
2861 Opc = NVPTX::LoadParamMemV2I8;
2862 break;
2863 case MVT::i8:
2864 Opc = NVPTX::LoadParamMemV2I8;
2865 break;
2866 case MVT::i16:
2867 Opc = NVPTX::LoadParamMemV2I16;
2868 break;
2869 case MVT::i32:
2870 Opc = NVPTX::LoadParamMemV2I32;
2871 break;
2872 case MVT::i64:
2873 Opc = NVPTX::LoadParamMemV2I64;
2874 break;
2875 case MVT::f32:
2876 Opc = NVPTX::LoadParamMemV2F32;
2877 break;
2878 case MVT::f64:
2879 Opc = NVPTX::LoadParamMemV2F64;
2880 break;
2881 }
2882 break;
2883 case 4:
2884 switch (MemVT.getSimpleVT().SimpleTy) {
2885 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002886 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002887 case MVT::i1:
2888 Opc = NVPTX::LoadParamMemV4I8;
2889 break;
2890 case MVT::i8:
2891 Opc = NVPTX::LoadParamMemV4I8;
2892 break;
2893 case MVT::i16:
2894 Opc = NVPTX::LoadParamMemV4I16;
2895 break;
2896 case MVT::i32:
2897 Opc = NVPTX::LoadParamMemV4I32;
2898 break;
2899 case MVT::f32:
2900 Opc = NVPTX::LoadParamMemV4F32;
2901 break;
2902 }
2903 break;
2904 }
2905
2906 SDVTList VTs;
2907 if (VecSize == 1) {
2908 VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2909 } else if (VecSize == 2) {
2910 VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2911 } else {
2912 EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
Craig Topperabb4ac72014-04-16 06:10:51 +00002913 VTs = CurDAG->getVTList(EVTs);
Justin Holewinskif8f70912013-06-28 17:57:59 +00002914 }
2915
2916 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2917
2918 SmallVector<SDValue, 2> Ops;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002919 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002920 Ops.push_back(Chain);
2921 Ops.push_back(Flag);
2922
Justin Bogner8d83fb62016-05-13 21:12:53 +00002923 ReplaceNode(Node, CurDAG->getMachineNode(Opc, DL, VTs, Ops));
2924 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002925}
2926
Justin Bogner8d83fb62016-05-13 21:12:53 +00002927bool NVPTXDAGToDAGISel::tryStoreRetval(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002928 SDLoc DL(N);
2929 SDValue Chain = N->getOperand(0);
2930 SDValue Offset = N->getOperand(1);
2931 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2932 MemSDNode *Mem = cast<MemSDNode>(N);
2933
2934 // How many elements do we have?
2935 unsigned NumElts = 1;
2936 switch (N->getOpcode()) {
2937 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002938 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002939 case NVPTXISD::StoreRetval:
2940 NumElts = 1;
2941 break;
2942 case NVPTXISD::StoreRetvalV2:
2943 NumElts = 2;
2944 break;
2945 case NVPTXISD::StoreRetvalV4:
2946 NumElts = 4;
2947 break;
2948 }
2949
2950 // Build vector of operands
2951 SmallVector<SDValue, 6> Ops;
2952 for (unsigned i = 0; i < NumElts; ++i)
2953 Ops.push_back(N->getOperand(i + 2));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002954 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002955 Ops.push_back(Chain);
2956
2957 // Determine target opcode
2958 // If we have an i1, use an 8-bit store. The lowering code in
2959 // NVPTXISelLowering will have already emitted an upcast.
2960 unsigned Opcode = 0;
2961 switch (NumElts) {
2962 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002963 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002964 case 1:
2965 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2966 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002967 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002968 case MVT::i1:
2969 Opcode = NVPTX::StoreRetvalI8;
2970 break;
2971 case MVT::i8:
2972 Opcode = NVPTX::StoreRetvalI8;
2973 break;
2974 case MVT::i16:
2975 Opcode = NVPTX::StoreRetvalI16;
2976 break;
2977 case MVT::i32:
2978 Opcode = NVPTX::StoreRetvalI32;
2979 break;
2980 case MVT::i64:
2981 Opcode = NVPTX::StoreRetvalI64;
2982 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002983 case MVT::f16:
2984 Opcode = NVPTX::StoreRetvalF16;
2985 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002986 case MVT::f32:
2987 Opcode = NVPTX::StoreRetvalF32;
2988 break;
2989 case MVT::f64:
2990 Opcode = NVPTX::StoreRetvalF64;
2991 break;
2992 }
2993 break;
2994 case 2:
2995 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2996 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002997 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002998 case MVT::i1:
2999 Opcode = NVPTX::StoreRetvalV2I8;
3000 break;
3001 case MVT::i8:
3002 Opcode = NVPTX::StoreRetvalV2I8;
3003 break;
3004 case MVT::i16:
3005 Opcode = NVPTX::StoreRetvalV2I16;
3006 break;
3007 case MVT::i32:
3008 Opcode = NVPTX::StoreRetvalV2I32;
3009 break;
3010 case MVT::i64:
3011 Opcode = NVPTX::StoreRetvalV2I64;
3012 break;
3013 case MVT::f32:
3014 Opcode = NVPTX::StoreRetvalV2F32;
3015 break;
3016 case MVT::f64:
3017 Opcode = NVPTX::StoreRetvalV2F64;
3018 break;
3019 }
3020 break;
3021 case 4:
3022 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3023 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003024 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003025 case MVT::i1:
3026 Opcode = NVPTX::StoreRetvalV4I8;
3027 break;
3028 case MVT::i8:
3029 Opcode = NVPTX::StoreRetvalV4I8;
3030 break;
3031 case MVT::i16:
3032 Opcode = NVPTX::StoreRetvalV4I16;
3033 break;
3034 case MVT::i32:
3035 Opcode = NVPTX::StoreRetvalV4I32;
3036 break;
3037 case MVT::f32:
3038 Opcode = NVPTX::StoreRetvalV4F32;
3039 break;
3040 }
3041 break;
3042 }
3043
3044 SDNode *Ret =
3045 CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
3046 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3047 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3048 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3049
Justin Bogner8d83fb62016-05-13 21:12:53 +00003050 ReplaceNode(N, Ret);
3051 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003052}
3053
Justin Bogner8d83fb62016-05-13 21:12:53 +00003054bool NVPTXDAGToDAGISel::tryStoreParam(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00003055 SDLoc DL(N);
3056 SDValue Chain = N->getOperand(0);
3057 SDValue Param = N->getOperand(1);
3058 unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
3059 SDValue Offset = N->getOperand(2);
3060 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
3061 MemSDNode *Mem = cast<MemSDNode>(N);
3062 SDValue Flag = N->getOperand(N->getNumOperands() - 1);
3063
3064 // How many elements do we have?
3065 unsigned NumElts = 1;
3066 switch (N->getOpcode()) {
3067 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003068 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003069 case NVPTXISD::StoreParamU32:
3070 case NVPTXISD::StoreParamS32:
3071 case NVPTXISD::StoreParam:
3072 NumElts = 1;
3073 break;
3074 case NVPTXISD::StoreParamV2:
3075 NumElts = 2;
3076 break;
3077 case NVPTXISD::StoreParamV4:
3078 NumElts = 4;
3079 break;
3080 }
3081
3082 // Build vector of operands
3083 SmallVector<SDValue, 8> Ops;
3084 for (unsigned i = 0; i < NumElts; ++i)
3085 Ops.push_back(N->getOperand(i + 3));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003086 Ops.push_back(CurDAG->getTargetConstant(ParamVal, DL, MVT::i32));
3087 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00003088 Ops.push_back(Chain);
3089 Ops.push_back(Flag);
3090
3091 // Determine target opcode
3092 // If we have an i1, use an 8-bit store. The lowering code in
3093 // NVPTXISelLowering will have already emitted an upcast.
3094 unsigned Opcode = 0;
3095 switch (N->getOpcode()) {
3096 default:
3097 switch (NumElts) {
3098 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003099 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003100 case 1:
3101 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3102 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003103 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003104 case MVT::i1:
3105 Opcode = NVPTX::StoreParamI8;
3106 break;
3107 case MVT::i8:
3108 Opcode = NVPTX::StoreParamI8;
3109 break;
3110 case MVT::i16:
3111 Opcode = NVPTX::StoreParamI16;
3112 break;
3113 case MVT::i32:
3114 Opcode = NVPTX::StoreParamI32;
3115 break;
3116 case MVT::i64:
3117 Opcode = NVPTX::StoreParamI64;
3118 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00003119 case MVT::f16:
3120 Opcode = NVPTX::StoreParamF16;
3121 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003122 case MVT::f32:
3123 Opcode = NVPTX::StoreParamF32;
3124 break;
3125 case MVT::f64:
3126 Opcode = NVPTX::StoreParamF64;
3127 break;
3128 }
3129 break;
3130 case 2:
3131 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3132 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003133 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003134 case MVT::i1:
3135 Opcode = NVPTX::StoreParamV2I8;
3136 break;
3137 case MVT::i8:
3138 Opcode = NVPTX::StoreParamV2I8;
3139 break;
3140 case MVT::i16:
3141 Opcode = NVPTX::StoreParamV2I16;
3142 break;
3143 case MVT::i32:
3144 Opcode = NVPTX::StoreParamV2I32;
3145 break;
3146 case MVT::i64:
3147 Opcode = NVPTX::StoreParamV2I64;
3148 break;
3149 case MVT::f32:
3150 Opcode = NVPTX::StoreParamV2F32;
3151 break;
3152 case MVT::f64:
3153 Opcode = NVPTX::StoreParamV2F64;
3154 break;
3155 }
3156 break;
3157 case 4:
3158 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3159 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003160 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003161 case MVT::i1:
3162 Opcode = NVPTX::StoreParamV4I8;
3163 break;
3164 case MVT::i8:
3165 Opcode = NVPTX::StoreParamV4I8;
3166 break;
3167 case MVT::i16:
3168 Opcode = NVPTX::StoreParamV4I16;
3169 break;
3170 case MVT::i32:
3171 Opcode = NVPTX::StoreParamV4I32;
3172 break;
3173 case MVT::f32:
3174 Opcode = NVPTX::StoreParamV4F32;
3175 break;
3176 }
3177 break;
3178 }
3179 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003180 // Special case: if we have a sign-extend/zero-extend node, insert the
3181 // conversion instruction first, and use that as the value operand to
3182 // the selected StoreParam node.
3183 case NVPTXISD::StoreParamU32: {
3184 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003185 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003186 MVT::i32);
3187 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
3188 MVT::i32, Ops[0], CvtNone);
3189 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003190 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003191 }
3192 case NVPTXISD::StoreParamS32: {
3193 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003194 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003195 MVT::i32);
3196 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
3197 MVT::i32, Ops[0], CvtNone);
3198 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003199 break;
3200 }
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003201 }
Justin Holewinskif8f70912013-06-28 17:57:59 +00003202
Justin Holewinskidff28d22013-07-01 12:59:01 +00003203 SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003204 SDNode *Ret =
Justin Holewinskidff28d22013-07-01 12:59:01 +00003205 CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003206 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3207 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3208 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3209
Justin Bogner8d83fb62016-05-13 21:12:53 +00003210 ReplaceNode(N, Ret);
3211 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003212}
3213
Justin Bogner8d83fb62016-05-13 21:12:53 +00003214bool NVPTXDAGToDAGISel::tryTextureIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003215 SDValue Chain = N->getOperand(0);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003216 unsigned Opc = 0;
3217 SmallVector<SDValue, 8> Ops;
3218
3219 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003220 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003221 case NVPTXISD::Tex1DFloatS32:
3222 Opc = NVPTX::TEX_1D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003223 break;
3224 case NVPTXISD::Tex1DFloatFloat:
3225 Opc = NVPTX::TEX_1D_F32_F32;
3226 break;
3227 case NVPTXISD::Tex1DFloatFloatLevel:
3228 Opc = NVPTX::TEX_1D_F32_F32_LEVEL;
3229 break;
3230 case NVPTXISD::Tex1DFloatFloatGrad:
3231 Opc = NVPTX::TEX_1D_F32_F32_GRAD;
3232 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003233 case NVPTXISD::Tex1DS32S32:
3234 Opc = NVPTX::TEX_1D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003235 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003236 case NVPTXISD::Tex1DS32Float:
3237 Opc = NVPTX::TEX_1D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003238 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003239 case NVPTXISD::Tex1DS32FloatLevel:
3240 Opc = NVPTX::TEX_1D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003241 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003242 case NVPTXISD::Tex1DS32FloatGrad:
3243 Opc = NVPTX::TEX_1D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003244 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003245 case NVPTXISD::Tex1DU32S32:
3246 Opc = NVPTX::TEX_1D_U32_S32;
3247 break;
3248 case NVPTXISD::Tex1DU32Float:
3249 Opc = NVPTX::TEX_1D_U32_F32;
3250 break;
3251 case NVPTXISD::Tex1DU32FloatLevel:
3252 Opc = NVPTX::TEX_1D_U32_F32_LEVEL;
3253 break;
3254 case NVPTXISD::Tex1DU32FloatGrad:
3255 Opc = NVPTX::TEX_1D_U32_F32_GRAD;
3256 break;
3257 case NVPTXISD::Tex1DArrayFloatS32:
3258 Opc = NVPTX::TEX_1D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003259 break;
3260 case NVPTXISD::Tex1DArrayFloatFloat:
3261 Opc = NVPTX::TEX_1D_ARRAY_F32_F32;
3262 break;
3263 case NVPTXISD::Tex1DArrayFloatFloatLevel:
3264 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_LEVEL;
3265 break;
3266 case NVPTXISD::Tex1DArrayFloatFloatGrad:
3267 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_GRAD;
3268 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003269 case NVPTXISD::Tex1DArrayS32S32:
3270 Opc = NVPTX::TEX_1D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003271 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003272 case NVPTXISD::Tex1DArrayS32Float:
3273 Opc = NVPTX::TEX_1D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003274 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003275 case NVPTXISD::Tex1DArrayS32FloatLevel:
3276 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003277 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003278 case NVPTXISD::Tex1DArrayS32FloatGrad:
3279 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003280 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003281 case NVPTXISD::Tex1DArrayU32S32:
3282 Opc = NVPTX::TEX_1D_ARRAY_U32_S32;
3283 break;
3284 case NVPTXISD::Tex1DArrayU32Float:
3285 Opc = NVPTX::TEX_1D_ARRAY_U32_F32;
3286 break;
3287 case NVPTXISD::Tex1DArrayU32FloatLevel:
3288 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_LEVEL;
3289 break;
3290 case NVPTXISD::Tex1DArrayU32FloatGrad:
3291 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_GRAD;
3292 break;
3293 case NVPTXISD::Tex2DFloatS32:
3294 Opc = NVPTX::TEX_2D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003295 break;
3296 case NVPTXISD::Tex2DFloatFloat:
3297 Opc = NVPTX::TEX_2D_F32_F32;
3298 break;
3299 case NVPTXISD::Tex2DFloatFloatLevel:
3300 Opc = NVPTX::TEX_2D_F32_F32_LEVEL;
3301 break;
3302 case NVPTXISD::Tex2DFloatFloatGrad:
3303 Opc = NVPTX::TEX_2D_F32_F32_GRAD;
3304 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003305 case NVPTXISD::Tex2DS32S32:
3306 Opc = NVPTX::TEX_2D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003307 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003308 case NVPTXISD::Tex2DS32Float:
3309 Opc = NVPTX::TEX_2D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003310 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003311 case NVPTXISD::Tex2DS32FloatLevel:
3312 Opc = NVPTX::TEX_2D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003313 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003314 case NVPTXISD::Tex2DS32FloatGrad:
3315 Opc = NVPTX::TEX_2D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003316 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003317 case NVPTXISD::Tex2DU32S32:
3318 Opc = NVPTX::TEX_2D_U32_S32;
3319 break;
3320 case NVPTXISD::Tex2DU32Float:
3321 Opc = NVPTX::TEX_2D_U32_F32;
3322 break;
3323 case NVPTXISD::Tex2DU32FloatLevel:
3324 Opc = NVPTX::TEX_2D_U32_F32_LEVEL;
3325 break;
3326 case NVPTXISD::Tex2DU32FloatGrad:
3327 Opc = NVPTX::TEX_2D_U32_F32_GRAD;
3328 break;
3329 case NVPTXISD::Tex2DArrayFloatS32:
3330 Opc = NVPTX::TEX_2D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003331 break;
3332 case NVPTXISD::Tex2DArrayFloatFloat:
3333 Opc = NVPTX::TEX_2D_ARRAY_F32_F32;
3334 break;
3335 case NVPTXISD::Tex2DArrayFloatFloatLevel:
3336 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_LEVEL;
3337 break;
3338 case NVPTXISD::Tex2DArrayFloatFloatGrad:
3339 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_GRAD;
3340 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003341 case NVPTXISD::Tex2DArrayS32S32:
3342 Opc = NVPTX::TEX_2D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003343 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003344 case NVPTXISD::Tex2DArrayS32Float:
3345 Opc = NVPTX::TEX_2D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003346 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003347 case NVPTXISD::Tex2DArrayS32FloatLevel:
3348 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003349 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003350 case NVPTXISD::Tex2DArrayS32FloatGrad:
3351 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003352 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003353 case NVPTXISD::Tex2DArrayU32S32:
3354 Opc = NVPTX::TEX_2D_ARRAY_U32_S32;
3355 break;
3356 case NVPTXISD::Tex2DArrayU32Float:
3357 Opc = NVPTX::TEX_2D_ARRAY_U32_F32;
3358 break;
3359 case NVPTXISD::Tex2DArrayU32FloatLevel:
3360 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_LEVEL;
3361 break;
3362 case NVPTXISD::Tex2DArrayU32FloatGrad:
3363 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_GRAD;
3364 break;
3365 case NVPTXISD::Tex3DFloatS32:
3366 Opc = NVPTX::TEX_3D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003367 break;
3368 case NVPTXISD::Tex3DFloatFloat:
3369 Opc = NVPTX::TEX_3D_F32_F32;
3370 break;
3371 case NVPTXISD::Tex3DFloatFloatLevel:
3372 Opc = NVPTX::TEX_3D_F32_F32_LEVEL;
3373 break;
3374 case NVPTXISD::Tex3DFloatFloatGrad:
3375 Opc = NVPTX::TEX_3D_F32_F32_GRAD;
3376 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003377 case NVPTXISD::Tex3DS32S32:
3378 Opc = NVPTX::TEX_3D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003379 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003380 case NVPTXISD::Tex3DS32Float:
3381 Opc = NVPTX::TEX_3D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003382 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003383 case NVPTXISD::Tex3DS32FloatLevel:
3384 Opc = NVPTX::TEX_3D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003385 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003386 case NVPTXISD::Tex3DS32FloatGrad:
3387 Opc = NVPTX::TEX_3D_S32_F32_GRAD;
3388 break;
3389 case NVPTXISD::Tex3DU32S32:
3390 Opc = NVPTX::TEX_3D_U32_S32;
3391 break;
3392 case NVPTXISD::Tex3DU32Float:
3393 Opc = NVPTX::TEX_3D_U32_F32;
3394 break;
3395 case NVPTXISD::Tex3DU32FloatLevel:
3396 Opc = NVPTX::TEX_3D_U32_F32_LEVEL;
3397 break;
3398 case NVPTXISD::Tex3DU32FloatGrad:
3399 Opc = NVPTX::TEX_3D_U32_F32_GRAD;
3400 break;
3401 case NVPTXISD::TexCubeFloatFloat:
3402 Opc = NVPTX::TEX_CUBE_F32_F32;
3403 break;
3404 case NVPTXISD::TexCubeFloatFloatLevel:
3405 Opc = NVPTX::TEX_CUBE_F32_F32_LEVEL;
3406 break;
3407 case NVPTXISD::TexCubeS32Float:
3408 Opc = NVPTX::TEX_CUBE_S32_F32;
3409 break;
3410 case NVPTXISD::TexCubeS32FloatLevel:
3411 Opc = NVPTX::TEX_CUBE_S32_F32_LEVEL;
3412 break;
3413 case NVPTXISD::TexCubeU32Float:
3414 Opc = NVPTX::TEX_CUBE_U32_F32;
3415 break;
3416 case NVPTXISD::TexCubeU32FloatLevel:
3417 Opc = NVPTX::TEX_CUBE_U32_F32_LEVEL;
3418 break;
3419 case NVPTXISD::TexCubeArrayFloatFloat:
3420 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32;
3421 break;
3422 case NVPTXISD::TexCubeArrayFloatFloatLevel:
3423 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32_LEVEL;
3424 break;
3425 case NVPTXISD::TexCubeArrayS32Float:
3426 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32;
3427 break;
3428 case NVPTXISD::TexCubeArrayS32FloatLevel:
3429 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32_LEVEL;
3430 break;
3431 case NVPTXISD::TexCubeArrayU32Float:
3432 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32;
3433 break;
3434 case NVPTXISD::TexCubeArrayU32FloatLevel:
3435 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32_LEVEL;
3436 break;
3437 case NVPTXISD::Tld4R2DFloatFloat:
3438 Opc = NVPTX::TLD4_R_2D_F32_F32;
3439 break;
3440 case NVPTXISD::Tld4G2DFloatFloat:
3441 Opc = NVPTX::TLD4_G_2D_F32_F32;
3442 break;
3443 case NVPTXISD::Tld4B2DFloatFloat:
3444 Opc = NVPTX::TLD4_B_2D_F32_F32;
3445 break;
3446 case NVPTXISD::Tld4A2DFloatFloat:
3447 Opc = NVPTX::TLD4_A_2D_F32_F32;
3448 break;
3449 case NVPTXISD::Tld4R2DS64Float:
3450 Opc = NVPTX::TLD4_R_2D_S32_F32;
3451 break;
3452 case NVPTXISD::Tld4G2DS64Float:
3453 Opc = NVPTX::TLD4_G_2D_S32_F32;
3454 break;
3455 case NVPTXISD::Tld4B2DS64Float:
3456 Opc = NVPTX::TLD4_B_2D_S32_F32;
3457 break;
3458 case NVPTXISD::Tld4A2DS64Float:
3459 Opc = NVPTX::TLD4_A_2D_S32_F32;
3460 break;
3461 case NVPTXISD::Tld4R2DU64Float:
3462 Opc = NVPTX::TLD4_R_2D_U32_F32;
3463 break;
3464 case NVPTXISD::Tld4G2DU64Float:
3465 Opc = NVPTX::TLD4_G_2D_U32_F32;
3466 break;
3467 case NVPTXISD::Tld4B2DU64Float:
3468 Opc = NVPTX::TLD4_B_2D_U32_F32;
3469 break;
3470 case NVPTXISD::Tld4A2DU64Float:
3471 Opc = NVPTX::TLD4_A_2D_U32_F32;
3472 break;
3473 case NVPTXISD::TexUnified1DFloatS32:
3474 Opc = NVPTX::TEX_UNIFIED_1D_F32_S32;
3475 break;
3476 case NVPTXISD::TexUnified1DFloatFloat:
3477 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32;
3478 break;
3479 case NVPTXISD::TexUnified1DFloatFloatLevel:
3480 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_LEVEL;
3481 break;
3482 case NVPTXISD::TexUnified1DFloatFloatGrad:
3483 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_GRAD;
3484 break;
3485 case NVPTXISD::TexUnified1DS32S32:
3486 Opc = NVPTX::TEX_UNIFIED_1D_S32_S32;
3487 break;
3488 case NVPTXISD::TexUnified1DS32Float:
3489 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32;
3490 break;
3491 case NVPTXISD::TexUnified1DS32FloatLevel:
3492 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_LEVEL;
3493 break;
3494 case NVPTXISD::TexUnified1DS32FloatGrad:
3495 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_GRAD;
3496 break;
3497 case NVPTXISD::TexUnified1DU32S32:
3498 Opc = NVPTX::TEX_UNIFIED_1D_U32_S32;
3499 break;
3500 case NVPTXISD::TexUnified1DU32Float:
3501 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32;
3502 break;
3503 case NVPTXISD::TexUnified1DU32FloatLevel:
3504 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_LEVEL;
3505 break;
3506 case NVPTXISD::TexUnified1DU32FloatGrad:
3507 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_GRAD;
3508 break;
3509 case NVPTXISD::TexUnified1DArrayFloatS32:
3510 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_S32;
3511 break;
3512 case NVPTXISD::TexUnified1DArrayFloatFloat:
3513 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32;
3514 break;
3515 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
3516 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_LEVEL;
3517 break;
3518 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
3519 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_GRAD;
3520 break;
3521 case NVPTXISD::TexUnified1DArrayS32S32:
3522 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_S32;
3523 break;
3524 case NVPTXISD::TexUnified1DArrayS32Float:
3525 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32;
3526 break;
3527 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
3528 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_LEVEL;
3529 break;
3530 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
3531 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_GRAD;
3532 break;
3533 case NVPTXISD::TexUnified1DArrayU32S32:
3534 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_S32;
3535 break;
3536 case NVPTXISD::TexUnified1DArrayU32Float:
3537 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32;
3538 break;
3539 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
3540 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_LEVEL;
3541 break;
3542 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
3543 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_GRAD;
3544 break;
3545 case NVPTXISD::TexUnified2DFloatS32:
3546 Opc = NVPTX::TEX_UNIFIED_2D_F32_S32;
3547 break;
3548 case NVPTXISD::TexUnified2DFloatFloat:
3549 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32;
3550 break;
3551 case NVPTXISD::TexUnified2DFloatFloatLevel:
3552 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_LEVEL;
3553 break;
3554 case NVPTXISD::TexUnified2DFloatFloatGrad:
3555 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_GRAD;
3556 break;
3557 case NVPTXISD::TexUnified2DS32S32:
3558 Opc = NVPTX::TEX_UNIFIED_2D_S32_S32;
3559 break;
3560 case NVPTXISD::TexUnified2DS32Float:
3561 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32;
3562 break;
3563 case NVPTXISD::TexUnified2DS32FloatLevel:
3564 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_LEVEL;
3565 break;
3566 case NVPTXISD::TexUnified2DS32FloatGrad:
3567 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_GRAD;
3568 break;
3569 case NVPTXISD::TexUnified2DU32S32:
3570 Opc = NVPTX::TEX_UNIFIED_2D_U32_S32;
3571 break;
3572 case NVPTXISD::TexUnified2DU32Float:
3573 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32;
3574 break;
3575 case NVPTXISD::TexUnified2DU32FloatLevel:
3576 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_LEVEL;
3577 break;
3578 case NVPTXISD::TexUnified2DU32FloatGrad:
3579 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_GRAD;
3580 break;
3581 case NVPTXISD::TexUnified2DArrayFloatS32:
3582 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_S32;
3583 break;
3584 case NVPTXISD::TexUnified2DArrayFloatFloat:
3585 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32;
3586 break;
3587 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
3588 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_LEVEL;
3589 break;
3590 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
3591 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_GRAD;
3592 break;
3593 case NVPTXISD::TexUnified2DArrayS32S32:
3594 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_S32;
3595 break;
3596 case NVPTXISD::TexUnified2DArrayS32Float:
3597 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32;
3598 break;
3599 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
3600 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_LEVEL;
3601 break;
3602 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
3603 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_GRAD;
3604 break;
3605 case NVPTXISD::TexUnified2DArrayU32S32:
3606 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_S32;
3607 break;
3608 case NVPTXISD::TexUnified2DArrayU32Float:
3609 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32;
3610 break;
3611 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
3612 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_LEVEL;
3613 break;
3614 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
3615 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_GRAD;
3616 break;
3617 case NVPTXISD::TexUnified3DFloatS32:
3618 Opc = NVPTX::TEX_UNIFIED_3D_F32_S32;
3619 break;
3620 case NVPTXISD::TexUnified3DFloatFloat:
3621 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32;
3622 break;
3623 case NVPTXISD::TexUnified3DFloatFloatLevel:
3624 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_LEVEL;
3625 break;
3626 case NVPTXISD::TexUnified3DFloatFloatGrad:
3627 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_GRAD;
3628 break;
3629 case NVPTXISD::TexUnified3DS32S32:
3630 Opc = NVPTX::TEX_UNIFIED_3D_S32_S32;
3631 break;
3632 case NVPTXISD::TexUnified3DS32Float:
3633 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32;
3634 break;
3635 case NVPTXISD::TexUnified3DS32FloatLevel:
3636 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_LEVEL;
3637 break;
3638 case NVPTXISD::TexUnified3DS32FloatGrad:
3639 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_GRAD;
3640 break;
3641 case NVPTXISD::TexUnified3DU32S32:
3642 Opc = NVPTX::TEX_UNIFIED_3D_U32_S32;
3643 break;
3644 case NVPTXISD::TexUnified3DU32Float:
3645 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32;
3646 break;
3647 case NVPTXISD::TexUnified3DU32FloatLevel:
3648 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_LEVEL;
3649 break;
3650 case NVPTXISD::TexUnified3DU32FloatGrad:
3651 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_GRAD;
3652 break;
3653 case NVPTXISD::TexUnifiedCubeFloatFloat:
3654 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32;
3655 break;
3656 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
3657 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32_LEVEL;
3658 break;
3659 case NVPTXISD::TexUnifiedCubeS32Float:
3660 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32;
3661 break;
3662 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
3663 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32_LEVEL;
3664 break;
3665 case NVPTXISD::TexUnifiedCubeU32Float:
3666 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32;
3667 break;
3668 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
3669 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32_LEVEL;
3670 break;
3671 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
3672 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32;
3673 break;
3674 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
3675 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32_LEVEL;
3676 break;
3677 case NVPTXISD::TexUnifiedCubeArrayS32Float:
3678 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32;
3679 break;
3680 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
3681 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32_LEVEL;
3682 break;
3683 case NVPTXISD::TexUnifiedCubeArrayU32Float:
3684 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32;
3685 break;
3686 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
3687 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32_LEVEL;
3688 break;
3689 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
3690 Opc = NVPTX::TLD4_UNIFIED_R_2D_F32_F32;
3691 break;
3692 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
3693 Opc = NVPTX::TLD4_UNIFIED_G_2D_F32_F32;
3694 break;
3695 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
3696 Opc = NVPTX::TLD4_UNIFIED_B_2D_F32_F32;
3697 break;
3698 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
3699 Opc = NVPTX::TLD4_UNIFIED_A_2D_F32_F32;
3700 break;
3701 case NVPTXISD::Tld4UnifiedR2DS64Float:
3702 Opc = NVPTX::TLD4_UNIFIED_R_2D_S32_F32;
3703 break;
3704 case NVPTXISD::Tld4UnifiedG2DS64Float:
3705 Opc = NVPTX::TLD4_UNIFIED_G_2D_S32_F32;
3706 break;
3707 case NVPTXISD::Tld4UnifiedB2DS64Float:
3708 Opc = NVPTX::TLD4_UNIFIED_B_2D_S32_F32;
3709 break;
3710 case NVPTXISD::Tld4UnifiedA2DS64Float:
3711 Opc = NVPTX::TLD4_UNIFIED_A_2D_S32_F32;
3712 break;
3713 case NVPTXISD::Tld4UnifiedR2DU64Float:
3714 Opc = NVPTX::TLD4_UNIFIED_R_2D_U32_F32;
3715 break;
3716 case NVPTXISD::Tld4UnifiedG2DU64Float:
3717 Opc = NVPTX::TLD4_UNIFIED_G_2D_U32_F32;
3718 break;
3719 case NVPTXISD::Tld4UnifiedB2DU64Float:
3720 Opc = NVPTX::TLD4_UNIFIED_B_2D_U32_F32;
3721 break;
3722 case NVPTXISD::Tld4UnifiedA2DU64Float:
3723 Opc = NVPTX::TLD4_UNIFIED_A_2D_U32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003724 break;
3725 }
3726
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003727 // Copy over operands
3728 for (unsigned i = 1; i < N->getNumOperands(); ++i) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003729 Ops.push_back(N->getOperand(i));
3730 }
3731
3732 Ops.push_back(Chain);
Justin Bogner8d83fb62016-05-13 21:12:53 +00003733 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
3734 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003735}
3736
Justin Bogner8d83fb62016-05-13 21:12:53 +00003737bool NVPTXDAGToDAGISel::trySurfaceIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003738 SDValue Chain = N->getOperand(0);
3739 SDValue TexHandle = N->getOperand(1);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003740 unsigned Opc = 0;
3741 SmallVector<SDValue, 8> Ops;
3742 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003743 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003744 case NVPTXISD::Suld1DI8Clamp:
3745 Opc = NVPTX::SULD_1D_I8_CLAMP;
3746 Ops.push_back(TexHandle);
3747 Ops.push_back(N->getOperand(2));
3748 Ops.push_back(Chain);
3749 break;
3750 case NVPTXISD::Suld1DI16Clamp:
3751 Opc = NVPTX::SULD_1D_I16_CLAMP;
3752 Ops.push_back(TexHandle);
3753 Ops.push_back(N->getOperand(2));
3754 Ops.push_back(Chain);
3755 break;
3756 case NVPTXISD::Suld1DI32Clamp:
3757 Opc = NVPTX::SULD_1D_I32_CLAMP;
3758 Ops.push_back(TexHandle);
3759 Ops.push_back(N->getOperand(2));
3760 Ops.push_back(Chain);
3761 break;
3762 case NVPTXISD::Suld1DI64Clamp:
3763 Opc = NVPTX::SULD_1D_I64_CLAMP;
3764 Ops.push_back(TexHandle);
3765 Ops.push_back(N->getOperand(2));
3766 Ops.push_back(Chain);
3767 break;
3768 case NVPTXISD::Suld1DV2I8Clamp:
3769 Opc = NVPTX::SULD_1D_V2I8_CLAMP;
3770 Ops.push_back(TexHandle);
3771 Ops.push_back(N->getOperand(2));
3772 Ops.push_back(Chain);
3773 break;
3774 case NVPTXISD::Suld1DV2I16Clamp:
3775 Opc = NVPTX::SULD_1D_V2I16_CLAMP;
3776 Ops.push_back(TexHandle);
3777 Ops.push_back(N->getOperand(2));
3778 Ops.push_back(Chain);
3779 break;
3780 case NVPTXISD::Suld1DV2I32Clamp:
3781 Opc = NVPTX::SULD_1D_V2I32_CLAMP;
3782 Ops.push_back(TexHandle);
3783 Ops.push_back(N->getOperand(2));
3784 Ops.push_back(Chain);
3785 break;
3786 case NVPTXISD::Suld1DV2I64Clamp:
3787 Opc = NVPTX::SULD_1D_V2I64_CLAMP;
3788 Ops.push_back(TexHandle);
3789 Ops.push_back(N->getOperand(2));
3790 Ops.push_back(Chain);
3791 break;
3792 case NVPTXISD::Suld1DV4I8Clamp:
3793 Opc = NVPTX::SULD_1D_V4I8_CLAMP;
3794 Ops.push_back(TexHandle);
3795 Ops.push_back(N->getOperand(2));
3796 Ops.push_back(Chain);
3797 break;
3798 case NVPTXISD::Suld1DV4I16Clamp:
3799 Opc = NVPTX::SULD_1D_V4I16_CLAMP;
3800 Ops.push_back(TexHandle);
3801 Ops.push_back(N->getOperand(2));
3802 Ops.push_back(Chain);
3803 break;
3804 case NVPTXISD::Suld1DV4I32Clamp:
3805 Opc = NVPTX::SULD_1D_V4I32_CLAMP;
3806 Ops.push_back(TexHandle);
3807 Ops.push_back(N->getOperand(2));
3808 Ops.push_back(Chain);
3809 break;
3810 case NVPTXISD::Suld1DArrayI8Clamp:
3811 Opc = NVPTX::SULD_1D_ARRAY_I8_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::Suld1DArrayI16Clamp:
3818 Opc = NVPTX::SULD_1D_ARRAY_I16_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::Suld1DArrayI32Clamp:
3825 Opc = NVPTX::SULD_1D_ARRAY_I32_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::Suld1DArrayI64Clamp:
3832 Opc = NVPTX::SULD_1D_ARRAY_I64_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::Suld1DArrayV2I8Clamp:
3839 Opc = NVPTX::SULD_1D_ARRAY_V2I8_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::Suld1DArrayV2I16Clamp:
3846 Opc = NVPTX::SULD_1D_ARRAY_V2I16_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::Suld1DArrayV2I32Clamp:
3853 Opc = NVPTX::SULD_1D_ARRAY_V2I32_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::Suld1DArrayV2I64Clamp:
3860 Opc = NVPTX::SULD_1D_ARRAY_V2I64_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::Suld1DArrayV4I8Clamp:
3867 Opc = NVPTX::SULD_1D_ARRAY_V4I8_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::Suld1DArrayV4I16Clamp:
3874 Opc = NVPTX::SULD_1D_ARRAY_V4I16_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::Suld1DArrayV4I32Clamp:
3881 Opc = NVPTX::SULD_1D_ARRAY_V4I32_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::Suld2DI8Clamp:
3888 Opc = NVPTX::SULD_2D_I8_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::Suld2DI16Clamp:
3895 Opc = NVPTX::SULD_2D_I16_CLAMP;
3896 Ops.push_back(TexHandle);
3897 Ops.push_back(N->getOperand(2));
3898 Ops.push_back(N->getOperand(3));
3899 Ops.push_back(Chain);
3900 break;
3901 case NVPTXISD::Suld2DI32Clamp:
3902 Opc = NVPTX::SULD_2D_I32_CLAMP;
3903 Ops.push_back(TexHandle);
3904 Ops.push_back(N->getOperand(2));
3905 Ops.push_back(N->getOperand(3));
3906 Ops.push_back(Chain);
3907 break;
3908 case NVPTXISD::Suld2DI64Clamp:
3909 Opc = NVPTX::SULD_2D_I64_CLAMP;
3910 Ops.push_back(TexHandle);
3911 Ops.push_back(N->getOperand(2));
3912 Ops.push_back(N->getOperand(3));
3913 Ops.push_back(Chain);
3914 break;
3915 case NVPTXISD::Suld2DV2I8Clamp:
3916 Opc = NVPTX::SULD_2D_V2I8_CLAMP;
3917 Ops.push_back(TexHandle);
3918 Ops.push_back(N->getOperand(2));
3919 Ops.push_back(N->getOperand(3));
3920 Ops.push_back(Chain);
3921 break;
3922 case NVPTXISD::Suld2DV2I16Clamp:
3923 Opc = NVPTX::SULD_2D_V2I16_CLAMP;
3924 Ops.push_back(TexHandle);
3925 Ops.push_back(N->getOperand(2));
3926 Ops.push_back(N->getOperand(3));
3927 Ops.push_back(Chain);
3928 break;
3929 case NVPTXISD::Suld2DV2I32Clamp:
3930 Opc = NVPTX::SULD_2D_V2I32_CLAMP;
3931 Ops.push_back(TexHandle);
3932 Ops.push_back(N->getOperand(2));
3933 Ops.push_back(N->getOperand(3));
3934 Ops.push_back(Chain);
3935 break;
3936 case NVPTXISD::Suld2DV2I64Clamp:
3937 Opc = NVPTX::SULD_2D_V2I64_CLAMP;
3938 Ops.push_back(TexHandle);
3939 Ops.push_back(N->getOperand(2));
3940 Ops.push_back(N->getOperand(3));
3941 Ops.push_back(Chain);
3942 break;
3943 case NVPTXISD::Suld2DV4I8Clamp:
3944 Opc = NVPTX::SULD_2D_V4I8_CLAMP;
3945 Ops.push_back(TexHandle);
3946 Ops.push_back(N->getOperand(2));
3947 Ops.push_back(N->getOperand(3));
3948 Ops.push_back(Chain);
3949 break;
3950 case NVPTXISD::Suld2DV4I16Clamp:
3951 Opc = NVPTX::SULD_2D_V4I16_CLAMP;
3952 Ops.push_back(TexHandle);
3953 Ops.push_back(N->getOperand(2));
3954 Ops.push_back(N->getOperand(3));
3955 Ops.push_back(Chain);
3956 break;
3957 case NVPTXISD::Suld2DV4I32Clamp:
3958 Opc = NVPTX::SULD_2D_V4I32_CLAMP;
3959 Ops.push_back(TexHandle);
3960 Ops.push_back(N->getOperand(2));
3961 Ops.push_back(N->getOperand(3));
3962 Ops.push_back(Chain);
3963 break;
3964 case NVPTXISD::Suld2DArrayI8Clamp:
3965 Opc = NVPTX::SULD_2D_ARRAY_I8_CLAMP;
3966 Ops.push_back(TexHandle);
3967 Ops.push_back(N->getOperand(2));
3968 Ops.push_back(N->getOperand(3));
3969 Ops.push_back(N->getOperand(4));
3970 Ops.push_back(Chain);
3971 break;
3972 case NVPTXISD::Suld2DArrayI16Clamp:
3973 Opc = NVPTX::SULD_2D_ARRAY_I16_CLAMP;
3974 Ops.push_back(TexHandle);
3975 Ops.push_back(N->getOperand(2));
3976 Ops.push_back(N->getOperand(3));
3977 Ops.push_back(N->getOperand(4));
3978 Ops.push_back(Chain);
3979 break;
3980 case NVPTXISD::Suld2DArrayI32Clamp:
3981 Opc = NVPTX::SULD_2D_ARRAY_I32_CLAMP;
3982 Ops.push_back(TexHandle);
3983 Ops.push_back(N->getOperand(2));
3984 Ops.push_back(N->getOperand(3));
3985 Ops.push_back(N->getOperand(4));
3986 Ops.push_back(Chain);
3987 break;
3988 case NVPTXISD::Suld2DArrayI64Clamp:
3989 Opc = NVPTX::SULD_2D_ARRAY_I64_CLAMP;
3990 Ops.push_back(TexHandle);
3991 Ops.push_back(N->getOperand(2));
3992 Ops.push_back(N->getOperand(3));
3993 Ops.push_back(N->getOperand(4));
3994 Ops.push_back(Chain);
3995 break;
3996 case NVPTXISD::Suld2DArrayV2I8Clamp:
3997 Opc = NVPTX::SULD_2D_ARRAY_V2I8_CLAMP;
3998 Ops.push_back(TexHandle);
3999 Ops.push_back(N->getOperand(2));
4000 Ops.push_back(N->getOperand(3));
4001 Ops.push_back(N->getOperand(4));
4002 Ops.push_back(Chain);
4003 break;
4004 case NVPTXISD::Suld2DArrayV2I16Clamp:
4005 Opc = NVPTX::SULD_2D_ARRAY_V2I16_CLAMP;
4006 Ops.push_back(TexHandle);
4007 Ops.push_back(N->getOperand(2));
4008 Ops.push_back(N->getOperand(3));
4009 Ops.push_back(N->getOperand(4));
4010 Ops.push_back(Chain);
4011 break;
4012 case NVPTXISD::Suld2DArrayV2I32Clamp:
4013 Opc = NVPTX::SULD_2D_ARRAY_V2I32_CLAMP;
4014 Ops.push_back(TexHandle);
4015 Ops.push_back(N->getOperand(2));
4016 Ops.push_back(N->getOperand(3));
4017 Ops.push_back(N->getOperand(4));
4018 Ops.push_back(Chain);
4019 break;
4020 case NVPTXISD::Suld2DArrayV2I64Clamp:
4021 Opc = NVPTX::SULD_2D_ARRAY_V2I64_CLAMP;
4022 Ops.push_back(TexHandle);
4023 Ops.push_back(N->getOperand(2));
4024 Ops.push_back(N->getOperand(3));
4025 Ops.push_back(N->getOperand(4));
4026 Ops.push_back(Chain);
4027 break;
4028 case NVPTXISD::Suld2DArrayV4I8Clamp:
4029 Opc = NVPTX::SULD_2D_ARRAY_V4I8_CLAMP;
4030 Ops.push_back(TexHandle);
4031 Ops.push_back(N->getOperand(2));
4032 Ops.push_back(N->getOperand(3));
4033 Ops.push_back(N->getOperand(4));
4034 Ops.push_back(Chain);
4035 break;
4036 case NVPTXISD::Suld2DArrayV4I16Clamp:
4037 Opc = NVPTX::SULD_2D_ARRAY_V4I16_CLAMP;
4038 Ops.push_back(TexHandle);
4039 Ops.push_back(N->getOperand(2));
4040 Ops.push_back(N->getOperand(3));
4041 Ops.push_back(N->getOperand(4));
4042 Ops.push_back(Chain);
4043 break;
4044 case NVPTXISD::Suld2DArrayV4I32Clamp:
4045 Opc = NVPTX::SULD_2D_ARRAY_V4I32_CLAMP;
4046 Ops.push_back(TexHandle);
4047 Ops.push_back(N->getOperand(2));
4048 Ops.push_back(N->getOperand(3));
4049 Ops.push_back(N->getOperand(4));
4050 Ops.push_back(Chain);
4051 break;
4052 case NVPTXISD::Suld3DI8Clamp:
4053 Opc = NVPTX::SULD_3D_I8_CLAMP;
4054 Ops.push_back(TexHandle);
4055 Ops.push_back(N->getOperand(2));
4056 Ops.push_back(N->getOperand(3));
4057 Ops.push_back(N->getOperand(4));
4058 Ops.push_back(Chain);
4059 break;
4060 case NVPTXISD::Suld3DI16Clamp:
4061 Opc = NVPTX::SULD_3D_I16_CLAMP;
4062 Ops.push_back(TexHandle);
4063 Ops.push_back(N->getOperand(2));
4064 Ops.push_back(N->getOperand(3));
4065 Ops.push_back(N->getOperand(4));
4066 Ops.push_back(Chain);
4067 break;
4068 case NVPTXISD::Suld3DI32Clamp:
4069 Opc = NVPTX::SULD_3D_I32_CLAMP;
4070 Ops.push_back(TexHandle);
4071 Ops.push_back(N->getOperand(2));
4072 Ops.push_back(N->getOperand(3));
4073 Ops.push_back(N->getOperand(4));
4074 Ops.push_back(Chain);
4075 break;
4076 case NVPTXISD::Suld3DI64Clamp:
4077 Opc = NVPTX::SULD_3D_I64_CLAMP;
4078 Ops.push_back(TexHandle);
4079 Ops.push_back(N->getOperand(2));
4080 Ops.push_back(N->getOperand(3));
4081 Ops.push_back(N->getOperand(4));
4082 Ops.push_back(Chain);
4083 break;
4084 case NVPTXISD::Suld3DV2I8Clamp:
4085 Opc = NVPTX::SULD_3D_V2I8_CLAMP;
4086 Ops.push_back(TexHandle);
4087 Ops.push_back(N->getOperand(2));
4088 Ops.push_back(N->getOperand(3));
4089 Ops.push_back(N->getOperand(4));
4090 Ops.push_back(Chain);
4091 break;
4092 case NVPTXISD::Suld3DV2I16Clamp:
4093 Opc = NVPTX::SULD_3D_V2I16_CLAMP;
4094 Ops.push_back(TexHandle);
4095 Ops.push_back(N->getOperand(2));
4096 Ops.push_back(N->getOperand(3));
4097 Ops.push_back(N->getOperand(4));
4098 Ops.push_back(Chain);
4099 break;
4100 case NVPTXISD::Suld3DV2I32Clamp:
4101 Opc = NVPTX::SULD_3D_V2I32_CLAMP;
4102 Ops.push_back(TexHandle);
4103 Ops.push_back(N->getOperand(2));
4104 Ops.push_back(N->getOperand(3));
4105 Ops.push_back(N->getOperand(4));
4106 Ops.push_back(Chain);
4107 break;
4108 case NVPTXISD::Suld3DV2I64Clamp:
4109 Opc = NVPTX::SULD_3D_V2I64_CLAMP;
4110 Ops.push_back(TexHandle);
4111 Ops.push_back(N->getOperand(2));
4112 Ops.push_back(N->getOperand(3));
4113 Ops.push_back(N->getOperand(4));
4114 Ops.push_back(Chain);
4115 break;
4116 case NVPTXISD::Suld3DV4I8Clamp:
4117 Opc = NVPTX::SULD_3D_V4I8_CLAMP;
4118 Ops.push_back(TexHandle);
4119 Ops.push_back(N->getOperand(2));
4120 Ops.push_back(N->getOperand(3));
4121 Ops.push_back(N->getOperand(4));
4122 Ops.push_back(Chain);
4123 break;
4124 case NVPTXISD::Suld3DV4I16Clamp:
4125 Opc = NVPTX::SULD_3D_V4I16_CLAMP;
4126 Ops.push_back(TexHandle);
4127 Ops.push_back(N->getOperand(2));
4128 Ops.push_back(N->getOperand(3));
4129 Ops.push_back(N->getOperand(4));
4130 Ops.push_back(Chain);
4131 break;
4132 case NVPTXISD::Suld3DV4I32Clamp:
4133 Opc = NVPTX::SULD_3D_V4I32_CLAMP;
4134 Ops.push_back(TexHandle);
4135 Ops.push_back(N->getOperand(2));
4136 Ops.push_back(N->getOperand(3));
4137 Ops.push_back(N->getOperand(4));
4138 Ops.push_back(Chain);
4139 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004140 case NVPTXISD::Suld1DI8Trap:
4141 Opc = NVPTX::SULD_1D_I8_TRAP;
4142 Ops.push_back(TexHandle);
4143 Ops.push_back(N->getOperand(2));
4144 Ops.push_back(Chain);
4145 break;
4146 case NVPTXISD::Suld1DI16Trap:
4147 Opc = NVPTX::SULD_1D_I16_TRAP;
4148 Ops.push_back(TexHandle);
4149 Ops.push_back(N->getOperand(2));
4150 Ops.push_back(Chain);
4151 break;
4152 case NVPTXISD::Suld1DI32Trap:
4153 Opc = NVPTX::SULD_1D_I32_TRAP;
4154 Ops.push_back(TexHandle);
4155 Ops.push_back(N->getOperand(2));
4156 Ops.push_back(Chain);
4157 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004158 case NVPTXISD::Suld1DI64Trap:
4159 Opc = NVPTX::SULD_1D_I64_TRAP;
4160 Ops.push_back(TexHandle);
4161 Ops.push_back(N->getOperand(2));
4162 Ops.push_back(Chain);
4163 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004164 case NVPTXISD::Suld1DV2I8Trap:
4165 Opc = NVPTX::SULD_1D_V2I8_TRAP;
4166 Ops.push_back(TexHandle);
4167 Ops.push_back(N->getOperand(2));
4168 Ops.push_back(Chain);
4169 break;
4170 case NVPTXISD::Suld1DV2I16Trap:
4171 Opc = NVPTX::SULD_1D_V2I16_TRAP;
4172 Ops.push_back(TexHandle);
4173 Ops.push_back(N->getOperand(2));
4174 Ops.push_back(Chain);
4175 break;
4176 case NVPTXISD::Suld1DV2I32Trap:
4177 Opc = NVPTX::SULD_1D_V2I32_TRAP;
4178 Ops.push_back(TexHandle);
4179 Ops.push_back(N->getOperand(2));
4180 Ops.push_back(Chain);
4181 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004182 case NVPTXISD::Suld1DV2I64Trap:
4183 Opc = NVPTX::SULD_1D_V2I64_TRAP;
4184 Ops.push_back(TexHandle);
4185 Ops.push_back(N->getOperand(2));
4186 Ops.push_back(Chain);
4187 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004188 case NVPTXISD::Suld1DV4I8Trap:
4189 Opc = NVPTX::SULD_1D_V4I8_TRAP;
4190 Ops.push_back(TexHandle);
4191 Ops.push_back(N->getOperand(2));
4192 Ops.push_back(Chain);
4193 break;
4194 case NVPTXISD::Suld1DV4I16Trap:
4195 Opc = NVPTX::SULD_1D_V4I16_TRAP;
4196 Ops.push_back(TexHandle);
4197 Ops.push_back(N->getOperand(2));
4198 Ops.push_back(Chain);
4199 break;
4200 case NVPTXISD::Suld1DV4I32Trap:
4201 Opc = NVPTX::SULD_1D_V4I32_TRAP;
4202 Ops.push_back(TexHandle);
4203 Ops.push_back(N->getOperand(2));
4204 Ops.push_back(Chain);
4205 break;
4206 case NVPTXISD::Suld1DArrayI8Trap:
4207 Opc = NVPTX::SULD_1D_ARRAY_I8_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::Suld1DArrayI16Trap:
4214 Opc = NVPTX::SULD_1D_ARRAY_I16_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::Suld1DArrayI32Trap:
4221 Opc = NVPTX::SULD_1D_ARRAY_I32_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;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004227 case NVPTXISD::Suld1DArrayI64Trap:
4228 Opc = NVPTX::SULD_1D_ARRAY_I64_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 Holewinski30d56a72014-04-09 15:39:15 +00004234 case NVPTXISD::Suld1DArrayV2I8Trap:
4235 Opc = NVPTX::SULD_1D_ARRAY_V2I8_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;
4241 case NVPTXISD::Suld1DArrayV2I16Trap:
4242 Opc = NVPTX::SULD_1D_ARRAY_V2I16_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::Suld1DArrayV2I32Trap:
4249 Opc = NVPTX::SULD_1D_ARRAY_V2I32_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;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004255 case NVPTXISD::Suld1DArrayV2I64Trap:
4256 Opc = NVPTX::SULD_1D_ARRAY_V2I64_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 Holewinski30d56a72014-04-09 15:39:15 +00004262 case NVPTXISD::Suld1DArrayV4I8Trap:
4263 Opc = NVPTX::SULD_1D_ARRAY_V4I8_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;
4269 case NVPTXISD::Suld1DArrayV4I16Trap:
4270 Opc = NVPTX::SULD_1D_ARRAY_V4I16_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::Suld1DArrayV4I32Trap:
4277 Opc = NVPTX::SULD_1D_ARRAY_V4I32_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::Suld2DI8Trap:
4284 Opc = NVPTX::SULD_2D_I8_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::Suld2DI16Trap:
4291 Opc = NVPTX::SULD_2D_I16_TRAP;
4292 Ops.push_back(TexHandle);
4293 Ops.push_back(N->getOperand(2));
4294 Ops.push_back(N->getOperand(3));
4295 Ops.push_back(Chain);
4296 break;
4297 case NVPTXISD::Suld2DI32Trap:
4298 Opc = NVPTX::SULD_2D_I32_TRAP;
4299 Ops.push_back(TexHandle);
4300 Ops.push_back(N->getOperand(2));
4301 Ops.push_back(N->getOperand(3));
4302 Ops.push_back(Chain);
4303 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004304 case NVPTXISD::Suld2DI64Trap:
4305 Opc = NVPTX::SULD_2D_I64_TRAP;
4306 Ops.push_back(TexHandle);
4307 Ops.push_back(N->getOperand(2));
4308 Ops.push_back(N->getOperand(3));
4309 Ops.push_back(Chain);
4310 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004311 case NVPTXISD::Suld2DV2I8Trap:
4312 Opc = NVPTX::SULD_2D_V2I8_TRAP;
4313 Ops.push_back(TexHandle);
4314 Ops.push_back(N->getOperand(2));
4315 Ops.push_back(N->getOperand(3));
4316 Ops.push_back(Chain);
4317 break;
4318 case NVPTXISD::Suld2DV2I16Trap:
4319 Opc = NVPTX::SULD_2D_V2I16_TRAP;
4320 Ops.push_back(TexHandle);
4321 Ops.push_back(N->getOperand(2));
4322 Ops.push_back(N->getOperand(3));
4323 Ops.push_back(Chain);
4324 break;
4325 case NVPTXISD::Suld2DV2I32Trap:
4326 Opc = NVPTX::SULD_2D_V2I32_TRAP;
4327 Ops.push_back(TexHandle);
4328 Ops.push_back(N->getOperand(2));
4329 Ops.push_back(N->getOperand(3));
4330 Ops.push_back(Chain);
4331 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004332 case NVPTXISD::Suld2DV2I64Trap:
4333 Opc = NVPTX::SULD_2D_V2I64_TRAP;
4334 Ops.push_back(TexHandle);
4335 Ops.push_back(N->getOperand(2));
4336 Ops.push_back(N->getOperand(3));
4337 Ops.push_back(Chain);
4338 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004339 case NVPTXISD::Suld2DV4I8Trap:
4340 Opc = NVPTX::SULD_2D_V4I8_TRAP;
4341 Ops.push_back(TexHandle);
4342 Ops.push_back(N->getOperand(2));
4343 Ops.push_back(N->getOperand(3));
4344 Ops.push_back(Chain);
4345 break;
4346 case NVPTXISD::Suld2DV4I16Trap:
4347 Opc = NVPTX::SULD_2D_V4I16_TRAP;
4348 Ops.push_back(TexHandle);
4349 Ops.push_back(N->getOperand(2));
4350 Ops.push_back(N->getOperand(3));
4351 Ops.push_back(Chain);
4352 break;
4353 case NVPTXISD::Suld2DV4I32Trap:
4354 Opc = NVPTX::SULD_2D_V4I32_TRAP;
4355 Ops.push_back(TexHandle);
4356 Ops.push_back(N->getOperand(2));
4357 Ops.push_back(N->getOperand(3));
4358 Ops.push_back(Chain);
4359 break;
4360 case NVPTXISD::Suld2DArrayI8Trap:
4361 Opc = NVPTX::SULD_2D_ARRAY_I8_TRAP;
4362 Ops.push_back(TexHandle);
4363 Ops.push_back(N->getOperand(2));
4364 Ops.push_back(N->getOperand(3));
4365 Ops.push_back(N->getOperand(4));
4366 Ops.push_back(Chain);
4367 break;
4368 case NVPTXISD::Suld2DArrayI16Trap:
4369 Opc = NVPTX::SULD_2D_ARRAY_I16_TRAP;
4370 Ops.push_back(TexHandle);
4371 Ops.push_back(N->getOperand(2));
4372 Ops.push_back(N->getOperand(3));
4373 Ops.push_back(N->getOperand(4));
4374 Ops.push_back(Chain);
4375 break;
4376 case NVPTXISD::Suld2DArrayI32Trap:
4377 Opc = NVPTX::SULD_2D_ARRAY_I32_TRAP;
4378 Ops.push_back(TexHandle);
4379 Ops.push_back(N->getOperand(2));
4380 Ops.push_back(N->getOperand(3));
4381 Ops.push_back(N->getOperand(4));
4382 Ops.push_back(Chain);
4383 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004384 case NVPTXISD::Suld2DArrayI64Trap:
4385 Opc = NVPTX::SULD_2D_ARRAY_I64_TRAP;
4386 Ops.push_back(TexHandle);
4387 Ops.push_back(N->getOperand(2));
4388 Ops.push_back(N->getOperand(3));
4389 Ops.push_back(N->getOperand(4));
4390 Ops.push_back(Chain);
4391 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004392 case NVPTXISD::Suld2DArrayV2I8Trap:
4393 Opc = NVPTX::SULD_2D_ARRAY_V2I8_TRAP;
4394 Ops.push_back(TexHandle);
4395 Ops.push_back(N->getOperand(2));
4396 Ops.push_back(N->getOperand(3));
4397 Ops.push_back(N->getOperand(4));
4398 Ops.push_back(Chain);
4399 break;
4400 case NVPTXISD::Suld2DArrayV2I16Trap:
4401 Opc = NVPTX::SULD_2D_ARRAY_V2I16_TRAP;
4402 Ops.push_back(TexHandle);
4403 Ops.push_back(N->getOperand(2));
4404 Ops.push_back(N->getOperand(3));
4405 Ops.push_back(N->getOperand(4));
4406 Ops.push_back(Chain);
4407 break;
4408 case NVPTXISD::Suld2DArrayV2I32Trap:
4409 Opc = NVPTX::SULD_2D_ARRAY_V2I32_TRAP;
4410 Ops.push_back(TexHandle);
4411 Ops.push_back(N->getOperand(2));
4412 Ops.push_back(N->getOperand(3));
4413 Ops.push_back(N->getOperand(4));
4414 Ops.push_back(Chain);
4415 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004416 case NVPTXISD::Suld2DArrayV2I64Trap:
4417 Opc = NVPTX::SULD_2D_ARRAY_V2I64_TRAP;
4418 Ops.push_back(TexHandle);
4419 Ops.push_back(N->getOperand(2));
4420 Ops.push_back(N->getOperand(3));
4421 Ops.push_back(N->getOperand(4));
4422 Ops.push_back(Chain);
4423 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004424 case NVPTXISD::Suld2DArrayV4I8Trap:
4425 Opc = NVPTX::SULD_2D_ARRAY_V4I8_TRAP;
4426 Ops.push_back(TexHandle);
4427 Ops.push_back(N->getOperand(2));
4428 Ops.push_back(N->getOperand(3));
4429 Ops.push_back(N->getOperand(4));
4430 Ops.push_back(Chain);
4431 break;
4432 case NVPTXISD::Suld2DArrayV4I16Trap:
4433 Opc = NVPTX::SULD_2D_ARRAY_V4I16_TRAP;
4434 Ops.push_back(TexHandle);
4435 Ops.push_back(N->getOperand(2));
4436 Ops.push_back(N->getOperand(3));
4437 Ops.push_back(N->getOperand(4));
4438 Ops.push_back(Chain);
4439 break;
4440 case NVPTXISD::Suld2DArrayV4I32Trap:
4441 Opc = NVPTX::SULD_2D_ARRAY_V4I32_TRAP;
4442 Ops.push_back(TexHandle);
4443 Ops.push_back(N->getOperand(2));
4444 Ops.push_back(N->getOperand(3));
4445 Ops.push_back(N->getOperand(4));
4446 Ops.push_back(Chain);
4447 break;
4448 case NVPTXISD::Suld3DI8Trap:
4449 Opc = NVPTX::SULD_3D_I8_TRAP;
4450 Ops.push_back(TexHandle);
4451 Ops.push_back(N->getOperand(2));
4452 Ops.push_back(N->getOperand(3));
4453 Ops.push_back(N->getOperand(4));
4454 Ops.push_back(Chain);
4455 break;
4456 case NVPTXISD::Suld3DI16Trap:
4457 Opc = NVPTX::SULD_3D_I16_TRAP;
4458 Ops.push_back(TexHandle);
4459 Ops.push_back(N->getOperand(2));
4460 Ops.push_back(N->getOperand(3));
4461 Ops.push_back(N->getOperand(4));
4462 Ops.push_back(Chain);
4463 break;
4464 case NVPTXISD::Suld3DI32Trap:
4465 Opc = NVPTX::SULD_3D_I32_TRAP;
4466 Ops.push_back(TexHandle);
4467 Ops.push_back(N->getOperand(2));
4468 Ops.push_back(N->getOperand(3));
4469 Ops.push_back(N->getOperand(4));
4470 Ops.push_back(Chain);
4471 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004472 case NVPTXISD::Suld3DI64Trap:
4473 Opc = NVPTX::SULD_3D_I64_TRAP;
4474 Ops.push_back(TexHandle);
4475 Ops.push_back(N->getOperand(2));
4476 Ops.push_back(N->getOperand(3));
4477 Ops.push_back(N->getOperand(4));
4478 Ops.push_back(Chain);
4479 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004480 case NVPTXISD::Suld3DV2I8Trap:
4481 Opc = NVPTX::SULD_3D_V2I8_TRAP;
4482 Ops.push_back(TexHandle);
4483 Ops.push_back(N->getOperand(2));
4484 Ops.push_back(N->getOperand(3));
4485 Ops.push_back(N->getOperand(4));
4486 Ops.push_back(Chain);
4487 break;
4488 case NVPTXISD::Suld3DV2I16Trap:
4489 Opc = NVPTX::SULD_3D_V2I16_TRAP;
4490 Ops.push_back(TexHandle);
4491 Ops.push_back(N->getOperand(2));
4492 Ops.push_back(N->getOperand(3));
4493 Ops.push_back(N->getOperand(4));
4494 Ops.push_back(Chain);
4495 break;
4496 case NVPTXISD::Suld3DV2I32Trap:
4497 Opc = NVPTX::SULD_3D_V2I32_TRAP;
4498 Ops.push_back(TexHandle);
4499 Ops.push_back(N->getOperand(2));
4500 Ops.push_back(N->getOperand(3));
4501 Ops.push_back(N->getOperand(4));
4502 Ops.push_back(Chain);
4503 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004504 case NVPTXISD::Suld3DV2I64Trap:
4505 Opc = NVPTX::SULD_3D_V2I64_TRAP;
4506 Ops.push_back(TexHandle);
4507 Ops.push_back(N->getOperand(2));
4508 Ops.push_back(N->getOperand(3));
4509 Ops.push_back(N->getOperand(4));
4510 Ops.push_back(Chain);
4511 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004512 case NVPTXISD::Suld3DV4I8Trap:
4513 Opc = NVPTX::SULD_3D_V4I8_TRAP;
4514 Ops.push_back(TexHandle);
4515 Ops.push_back(N->getOperand(2));
4516 Ops.push_back(N->getOperand(3));
4517 Ops.push_back(N->getOperand(4));
4518 Ops.push_back(Chain);
4519 break;
4520 case NVPTXISD::Suld3DV4I16Trap:
4521 Opc = NVPTX::SULD_3D_V4I16_TRAP;
4522 Ops.push_back(TexHandle);
4523 Ops.push_back(N->getOperand(2));
4524 Ops.push_back(N->getOperand(3));
4525 Ops.push_back(N->getOperand(4));
4526 Ops.push_back(Chain);
4527 break;
4528 case NVPTXISD::Suld3DV4I32Trap:
4529 Opc = NVPTX::SULD_3D_V4I32_TRAP;
4530 Ops.push_back(TexHandle);
4531 Ops.push_back(N->getOperand(2));
4532 Ops.push_back(N->getOperand(3));
4533 Ops.push_back(N->getOperand(4));
4534 Ops.push_back(Chain);
4535 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004536 case NVPTXISD::Suld1DI8Zero:
4537 Opc = NVPTX::SULD_1D_I8_ZERO;
4538 Ops.push_back(TexHandle);
4539 Ops.push_back(N->getOperand(2));
4540 Ops.push_back(Chain);
4541 break;
4542 case NVPTXISD::Suld1DI16Zero:
4543 Opc = NVPTX::SULD_1D_I16_ZERO;
4544 Ops.push_back(TexHandle);
4545 Ops.push_back(N->getOperand(2));
4546 Ops.push_back(Chain);
4547 break;
4548 case NVPTXISD::Suld1DI32Zero:
4549 Opc = NVPTX::SULD_1D_I32_ZERO;
4550 Ops.push_back(TexHandle);
4551 Ops.push_back(N->getOperand(2));
4552 Ops.push_back(Chain);
4553 break;
4554 case NVPTXISD::Suld1DI64Zero:
4555 Opc = NVPTX::SULD_1D_I64_ZERO;
4556 Ops.push_back(TexHandle);
4557 Ops.push_back(N->getOperand(2));
4558 Ops.push_back(Chain);
4559 break;
4560 case NVPTXISD::Suld1DV2I8Zero:
4561 Opc = NVPTX::SULD_1D_V2I8_ZERO;
4562 Ops.push_back(TexHandle);
4563 Ops.push_back(N->getOperand(2));
4564 Ops.push_back(Chain);
4565 break;
4566 case NVPTXISD::Suld1DV2I16Zero:
4567 Opc = NVPTX::SULD_1D_V2I16_ZERO;
4568 Ops.push_back(TexHandle);
4569 Ops.push_back(N->getOperand(2));
4570 Ops.push_back(Chain);
4571 break;
4572 case NVPTXISD::Suld1DV2I32Zero:
4573 Opc = NVPTX::SULD_1D_V2I32_ZERO;
4574 Ops.push_back(TexHandle);
4575 Ops.push_back(N->getOperand(2));
4576 Ops.push_back(Chain);
4577 break;
4578 case NVPTXISD::Suld1DV2I64Zero:
4579 Opc = NVPTX::SULD_1D_V2I64_ZERO;
4580 Ops.push_back(TexHandle);
4581 Ops.push_back(N->getOperand(2));
4582 Ops.push_back(Chain);
4583 break;
4584 case NVPTXISD::Suld1DV4I8Zero:
4585 Opc = NVPTX::SULD_1D_V4I8_ZERO;
4586 Ops.push_back(TexHandle);
4587 Ops.push_back(N->getOperand(2));
4588 Ops.push_back(Chain);
4589 break;
4590 case NVPTXISD::Suld1DV4I16Zero:
4591 Opc = NVPTX::SULD_1D_V4I16_ZERO;
4592 Ops.push_back(TexHandle);
4593 Ops.push_back(N->getOperand(2));
4594 Ops.push_back(Chain);
4595 break;
4596 case NVPTXISD::Suld1DV4I32Zero:
4597 Opc = NVPTX::SULD_1D_V4I32_ZERO;
4598 Ops.push_back(TexHandle);
4599 Ops.push_back(N->getOperand(2));
4600 Ops.push_back(Chain);
4601 break;
4602 case NVPTXISD::Suld1DArrayI8Zero:
4603 Opc = NVPTX::SULD_1D_ARRAY_I8_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::Suld1DArrayI16Zero:
4610 Opc = NVPTX::SULD_1D_ARRAY_I16_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::Suld1DArrayI32Zero:
4617 Opc = NVPTX::SULD_1D_ARRAY_I32_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::Suld1DArrayI64Zero:
4624 Opc = NVPTX::SULD_1D_ARRAY_I64_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::Suld1DArrayV2I8Zero:
4631 Opc = NVPTX::SULD_1D_ARRAY_V2I8_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::Suld1DArrayV2I16Zero:
4638 Opc = NVPTX::SULD_1D_ARRAY_V2I16_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::Suld1DArrayV2I32Zero:
4645 Opc = NVPTX::SULD_1D_ARRAY_V2I32_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::Suld1DArrayV2I64Zero:
4652 Opc = NVPTX::SULD_1D_ARRAY_V2I64_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::Suld1DArrayV4I8Zero:
4659 Opc = NVPTX::SULD_1D_ARRAY_V4I8_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::Suld1DArrayV4I16Zero:
4666 Opc = NVPTX::SULD_1D_ARRAY_V4I16_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::Suld1DArrayV4I32Zero:
4673 Opc = NVPTX::SULD_1D_ARRAY_V4I32_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::Suld2DI8Zero:
4680 Opc = NVPTX::SULD_2D_I8_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::Suld2DI16Zero:
4687 Opc = NVPTX::SULD_2D_I16_ZERO;
4688 Ops.push_back(TexHandle);
4689 Ops.push_back(N->getOperand(2));
4690 Ops.push_back(N->getOperand(3));
4691 Ops.push_back(Chain);
4692 break;
4693 case NVPTXISD::Suld2DI32Zero:
4694 Opc = NVPTX::SULD_2D_I32_ZERO;
4695 Ops.push_back(TexHandle);
4696 Ops.push_back(N->getOperand(2));
4697 Ops.push_back(N->getOperand(3));
4698 Ops.push_back(Chain);
4699 break;
4700 case NVPTXISD::Suld2DI64Zero:
4701 Opc = NVPTX::SULD_2D_I64_ZERO;
4702 Ops.push_back(TexHandle);
4703 Ops.push_back(N->getOperand(2));
4704 Ops.push_back(N->getOperand(3));
4705 Ops.push_back(Chain);
4706 break;
4707 case NVPTXISD::Suld2DV2I8Zero:
4708 Opc = NVPTX::SULD_2D_V2I8_ZERO;
4709 Ops.push_back(TexHandle);
4710 Ops.push_back(N->getOperand(2));
4711 Ops.push_back(N->getOperand(3));
4712 Ops.push_back(Chain);
4713 break;
4714 case NVPTXISD::Suld2DV2I16Zero:
4715 Opc = NVPTX::SULD_2D_V2I16_ZERO;
4716 Ops.push_back(TexHandle);
4717 Ops.push_back(N->getOperand(2));
4718 Ops.push_back(N->getOperand(3));
4719 Ops.push_back(Chain);
4720 break;
4721 case NVPTXISD::Suld2DV2I32Zero:
4722 Opc = NVPTX::SULD_2D_V2I32_ZERO;
4723 Ops.push_back(TexHandle);
4724 Ops.push_back(N->getOperand(2));
4725 Ops.push_back(N->getOperand(3));
4726 Ops.push_back(Chain);
4727 break;
4728 case NVPTXISD::Suld2DV2I64Zero:
4729 Opc = NVPTX::SULD_2D_V2I64_ZERO;
4730 Ops.push_back(TexHandle);
4731 Ops.push_back(N->getOperand(2));
4732 Ops.push_back(N->getOperand(3));
4733 Ops.push_back(Chain);
4734 break;
4735 case NVPTXISD::Suld2DV4I8Zero:
4736 Opc = NVPTX::SULD_2D_V4I8_ZERO;
4737 Ops.push_back(TexHandle);
4738 Ops.push_back(N->getOperand(2));
4739 Ops.push_back(N->getOperand(3));
4740 Ops.push_back(Chain);
4741 break;
4742 case NVPTXISD::Suld2DV4I16Zero:
4743 Opc = NVPTX::SULD_2D_V4I16_ZERO;
4744 Ops.push_back(TexHandle);
4745 Ops.push_back(N->getOperand(2));
4746 Ops.push_back(N->getOperand(3));
4747 Ops.push_back(Chain);
4748 break;
4749 case NVPTXISD::Suld2DV4I32Zero:
4750 Opc = NVPTX::SULD_2D_V4I32_ZERO;
4751 Ops.push_back(TexHandle);
4752 Ops.push_back(N->getOperand(2));
4753 Ops.push_back(N->getOperand(3));
4754 Ops.push_back(Chain);
4755 break;
4756 case NVPTXISD::Suld2DArrayI8Zero:
4757 Opc = NVPTX::SULD_2D_ARRAY_I8_ZERO;
4758 Ops.push_back(TexHandle);
4759 Ops.push_back(N->getOperand(2));
4760 Ops.push_back(N->getOperand(3));
4761 Ops.push_back(N->getOperand(4));
4762 Ops.push_back(Chain);
4763 break;
4764 case NVPTXISD::Suld2DArrayI16Zero:
4765 Opc = NVPTX::SULD_2D_ARRAY_I16_ZERO;
4766 Ops.push_back(TexHandle);
4767 Ops.push_back(N->getOperand(2));
4768 Ops.push_back(N->getOperand(3));
4769 Ops.push_back(N->getOperand(4));
4770 Ops.push_back(Chain);
4771 break;
4772 case NVPTXISD::Suld2DArrayI32Zero:
4773 Opc = NVPTX::SULD_2D_ARRAY_I32_ZERO;
4774 Ops.push_back(TexHandle);
4775 Ops.push_back(N->getOperand(2));
4776 Ops.push_back(N->getOperand(3));
4777 Ops.push_back(N->getOperand(4));
4778 Ops.push_back(Chain);
4779 break;
4780 case NVPTXISD::Suld2DArrayI64Zero:
4781 Opc = NVPTX::SULD_2D_ARRAY_I64_ZERO;
4782 Ops.push_back(TexHandle);
4783 Ops.push_back(N->getOperand(2));
4784 Ops.push_back(N->getOperand(3));
4785 Ops.push_back(N->getOperand(4));
4786 Ops.push_back(Chain);
4787 break;
4788 case NVPTXISD::Suld2DArrayV2I8Zero:
4789 Opc = NVPTX::SULD_2D_ARRAY_V2I8_ZERO;
4790 Ops.push_back(TexHandle);
4791 Ops.push_back(N->getOperand(2));
4792 Ops.push_back(N->getOperand(3));
4793 Ops.push_back(N->getOperand(4));
4794 Ops.push_back(Chain);
4795 break;
4796 case NVPTXISD::Suld2DArrayV2I16Zero:
4797 Opc = NVPTX::SULD_2D_ARRAY_V2I16_ZERO;
4798 Ops.push_back(TexHandle);
4799 Ops.push_back(N->getOperand(2));
4800 Ops.push_back(N->getOperand(3));
4801 Ops.push_back(N->getOperand(4));
4802 Ops.push_back(Chain);
4803 break;
4804 case NVPTXISD::Suld2DArrayV2I32Zero:
4805 Opc = NVPTX::SULD_2D_ARRAY_V2I32_ZERO;
4806 Ops.push_back(TexHandle);
4807 Ops.push_back(N->getOperand(2));
4808 Ops.push_back(N->getOperand(3));
4809 Ops.push_back(N->getOperand(4));
4810 Ops.push_back(Chain);
4811 break;
4812 case NVPTXISD::Suld2DArrayV2I64Zero:
4813 Opc = NVPTX::SULD_2D_ARRAY_V2I64_ZERO;
4814 Ops.push_back(TexHandle);
4815 Ops.push_back(N->getOperand(2));
4816 Ops.push_back(N->getOperand(3));
4817 Ops.push_back(N->getOperand(4));
4818 Ops.push_back(Chain);
4819 break;
4820 case NVPTXISD::Suld2DArrayV4I8Zero:
4821 Opc = NVPTX::SULD_2D_ARRAY_V4I8_ZERO;
4822 Ops.push_back(TexHandle);
4823 Ops.push_back(N->getOperand(2));
4824 Ops.push_back(N->getOperand(3));
4825 Ops.push_back(N->getOperand(4));
4826 Ops.push_back(Chain);
4827 break;
4828 case NVPTXISD::Suld2DArrayV4I16Zero:
4829 Opc = NVPTX::SULD_2D_ARRAY_V4I16_ZERO;
4830 Ops.push_back(TexHandle);
4831 Ops.push_back(N->getOperand(2));
4832 Ops.push_back(N->getOperand(3));
4833 Ops.push_back(N->getOperand(4));
4834 Ops.push_back(Chain);
4835 break;
4836 case NVPTXISD::Suld2DArrayV4I32Zero:
4837 Opc = NVPTX::SULD_2D_ARRAY_V4I32_ZERO;
4838 Ops.push_back(TexHandle);
4839 Ops.push_back(N->getOperand(2));
4840 Ops.push_back(N->getOperand(3));
4841 Ops.push_back(N->getOperand(4));
4842 Ops.push_back(Chain);
4843 break;
4844 case NVPTXISD::Suld3DI8Zero:
4845 Opc = NVPTX::SULD_3D_I8_ZERO;
4846 Ops.push_back(TexHandle);
4847 Ops.push_back(N->getOperand(2));
4848 Ops.push_back(N->getOperand(3));
4849 Ops.push_back(N->getOperand(4));
4850 Ops.push_back(Chain);
4851 break;
4852 case NVPTXISD::Suld3DI16Zero:
4853 Opc = NVPTX::SULD_3D_I16_ZERO;
4854 Ops.push_back(TexHandle);
4855 Ops.push_back(N->getOperand(2));
4856 Ops.push_back(N->getOperand(3));
4857 Ops.push_back(N->getOperand(4));
4858 Ops.push_back(Chain);
4859 break;
4860 case NVPTXISD::Suld3DI32Zero:
4861 Opc = NVPTX::SULD_3D_I32_ZERO;
4862 Ops.push_back(TexHandle);
4863 Ops.push_back(N->getOperand(2));
4864 Ops.push_back(N->getOperand(3));
4865 Ops.push_back(N->getOperand(4));
4866 Ops.push_back(Chain);
4867 break;
4868 case NVPTXISD::Suld3DI64Zero:
4869 Opc = NVPTX::SULD_3D_I64_ZERO;
4870 Ops.push_back(TexHandle);
4871 Ops.push_back(N->getOperand(2));
4872 Ops.push_back(N->getOperand(3));
4873 Ops.push_back(N->getOperand(4));
4874 Ops.push_back(Chain);
4875 break;
4876 case NVPTXISD::Suld3DV2I8Zero:
4877 Opc = NVPTX::SULD_3D_V2I8_ZERO;
4878 Ops.push_back(TexHandle);
4879 Ops.push_back(N->getOperand(2));
4880 Ops.push_back(N->getOperand(3));
4881 Ops.push_back(N->getOperand(4));
4882 Ops.push_back(Chain);
4883 break;
4884 case NVPTXISD::Suld3DV2I16Zero:
4885 Opc = NVPTX::SULD_3D_V2I16_ZERO;
4886 Ops.push_back(TexHandle);
4887 Ops.push_back(N->getOperand(2));
4888 Ops.push_back(N->getOperand(3));
4889 Ops.push_back(N->getOperand(4));
4890 Ops.push_back(Chain);
4891 break;
4892 case NVPTXISD::Suld3DV2I32Zero:
4893 Opc = NVPTX::SULD_3D_V2I32_ZERO;
4894 Ops.push_back(TexHandle);
4895 Ops.push_back(N->getOperand(2));
4896 Ops.push_back(N->getOperand(3));
4897 Ops.push_back(N->getOperand(4));
4898 Ops.push_back(Chain);
4899 break;
4900 case NVPTXISD::Suld3DV2I64Zero:
4901 Opc = NVPTX::SULD_3D_V2I64_ZERO;
4902 Ops.push_back(TexHandle);
4903 Ops.push_back(N->getOperand(2));
4904 Ops.push_back(N->getOperand(3));
4905 Ops.push_back(N->getOperand(4));
4906 Ops.push_back(Chain);
4907 break;
4908 case NVPTXISD::Suld3DV4I8Zero:
4909 Opc = NVPTX::SULD_3D_V4I8_ZERO;
4910 Ops.push_back(TexHandle);
4911 Ops.push_back(N->getOperand(2));
4912 Ops.push_back(N->getOperand(3));
4913 Ops.push_back(N->getOperand(4));
4914 Ops.push_back(Chain);
4915 break;
4916 case NVPTXISD::Suld3DV4I16Zero:
4917 Opc = NVPTX::SULD_3D_V4I16_ZERO;
4918 Ops.push_back(TexHandle);
4919 Ops.push_back(N->getOperand(2));
4920 Ops.push_back(N->getOperand(3));
4921 Ops.push_back(N->getOperand(4));
4922 Ops.push_back(Chain);
4923 break;
4924 case NVPTXISD::Suld3DV4I32Zero:
4925 Opc = NVPTX::SULD_3D_V4I32_ZERO;
4926 Ops.push_back(TexHandle);
4927 Ops.push_back(N->getOperand(2));
4928 Ops.push_back(N->getOperand(3));
4929 Ops.push_back(N->getOperand(4));
4930 Ops.push_back(Chain);
4931 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004932 }
Justin Bogner8d83fb62016-05-13 21:12:53 +00004933 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
4934 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004935}
4936
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004937
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004938/// SelectBFE - Look for instruction sequences that can be made more efficient
4939/// by using the 'bfe' (bit-field extract) PTX instruction
Justin Bogner8d83fb62016-05-13 21:12:53 +00004940bool NVPTXDAGToDAGISel::tryBFE(SDNode *N) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004941 SDLoc DL(N);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004942 SDValue LHS = N->getOperand(0);
4943 SDValue RHS = N->getOperand(1);
4944 SDValue Len;
4945 SDValue Start;
4946 SDValue Val;
4947 bool IsSigned = false;
4948
4949 if (N->getOpcode() == ISD::AND) {
4950 // Canonicalize the operands
4951 // We want 'and %val, %mask'
4952 if (isa<ConstantSDNode>(LHS) && !isa<ConstantSDNode>(RHS)) {
4953 std::swap(LHS, RHS);
4954 }
4955
4956 ConstantSDNode *Mask = dyn_cast<ConstantSDNode>(RHS);
4957 if (!Mask) {
4958 // We need a constant mask on the RHS of the AND
Justin Bogner8d83fb62016-05-13 21:12:53 +00004959 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004960 }
4961
4962 // Extract the mask bits
4963 uint64_t MaskVal = Mask->getZExtValue();
4964 if (!isMask_64(MaskVal)) {
4965 // We *could* handle shifted masks here, but doing so would require an
4966 // 'and' operation to fix up the low-order bits so we would trade
4967 // shr+and for bfe+and, which has the same throughput
Justin Bogner8d83fb62016-05-13 21:12:53 +00004968 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004969 }
4970
4971 // How many bits are in our mask?
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004972 uint64_t NumBits = countTrailingOnes(MaskVal);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004973 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004974
4975 if (LHS.getOpcode() == ISD::SRL || LHS.getOpcode() == ISD::SRA) {
4976 // We have a 'srl/and' pair, extract the effective start bit and length
4977 Val = LHS.getNode()->getOperand(0);
4978 Start = LHS.getNode()->getOperand(1);
4979 ConstantSDNode *StartConst = dyn_cast<ConstantSDNode>(Start);
4980 if (StartConst) {
4981 uint64_t StartVal = StartConst->getZExtValue();
4982 // How many "good" bits do we have left? "good" is defined here as bits
4983 // that exist in the original value, not shifted in.
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00004984 uint64_t GoodBits = Start.getValueSizeInBits() - StartVal;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004985 if (NumBits > GoodBits) {
4986 // Do not handle the case where bits have been shifted in. In theory
4987 // we could handle this, but the cost is likely higher than just
4988 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004989 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004990 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004991 Start = CurDAG->getTargetConstant(StartVal, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004992 } else {
4993 // Do not handle the case where the shift amount (can be zero if no srl
4994 // was found) is not constant. We could handle this case, but it would
4995 // require run-time logic that would be more expensive than just
4996 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004997 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004998 }
4999 } else {
5000 // Do not handle the case where the LHS of the and is not a shift. While
5001 // it would be trivial to handle this case, it would just transform
5002 // 'and' -> 'bfe', but 'and' has higher-throughput.
Justin Bogner8d83fb62016-05-13 21:12:53 +00005003 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005004 }
5005 } else if (N->getOpcode() == ISD::SRL || N->getOpcode() == ISD::SRA) {
5006 if (LHS->getOpcode() == ISD::AND) {
5007 ConstantSDNode *ShiftCnst = dyn_cast<ConstantSDNode>(RHS);
5008 if (!ShiftCnst) {
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
5013 uint64_t ShiftAmt = ShiftCnst->getZExtValue();
5014
5015 SDValue AndLHS = LHS->getOperand(0);
5016 SDValue AndRHS = LHS->getOperand(1);
5017
5018 // Canonicalize the AND to have the mask on the RHS
5019 if (isa<ConstantSDNode>(AndLHS)) {
5020 std::swap(AndLHS, AndRHS);
5021 }
5022
5023 ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(AndRHS);
5024 if (!MaskCnst) {
5025 // Mask must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005026 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005027 }
5028
5029 uint64_t MaskVal = MaskCnst->getZExtValue();
5030 uint64_t NumZeros;
5031 uint64_t NumBits;
5032 if (isMask_64(MaskVal)) {
5033 NumZeros = 0;
5034 // The number of bits in the result bitfield will be the number of
5035 // trailing ones (the AND) minus the number of bits we shift off
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00005036 NumBits = countTrailingOnes(MaskVal) - ShiftAmt;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005037 } else if (isShiftedMask_64(MaskVal)) {
5038 NumZeros = countTrailingZeros(MaskVal);
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00005039 unsigned NumOnes = countTrailingOnes(MaskVal >> NumZeros);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005040 // The number of bits in the result bitfield will be the number of
5041 // trailing zeros plus the number of set bits in the mask minus the
5042 // number of bits we shift off
5043 NumBits = NumZeros + NumOnes - ShiftAmt;
5044 } else {
5045 // This is not a mask we can handle
Justin Bogner8d83fb62016-05-13 21:12:53 +00005046 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005047 }
5048
5049 if (ShiftAmt < NumZeros) {
5050 // Handling this case would require extra logic that would make this
5051 // transformation non-profitable
Justin Bogner8d83fb62016-05-13 21:12:53 +00005052 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005053 }
5054
5055 Val = AndLHS;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005056 Start = CurDAG->getTargetConstant(ShiftAmt, DL, MVT::i32);
5057 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005058 } else if (LHS->getOpcode() == ISD::SHL) {
5059 // Here, we have a pattern like:
5060 //
5061 // (sra (shl val, NN), MM)
5062 // or
5063 // (srl (shl val, NN), MM)
5064 //
5065 // If MM >= NN, we can efficiently optimize this with bfe
5066 Val = LHS->getOperand(0);
5067
5068 SDValue ShlRHS = LHS->getOperand(1);
5069 ConstantSDNode *ShlCnst = dyn_cast<ConstantSDNode>(ShlRHS);
5070 if (!ShlCnst) {
5071 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005072 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005073 }
5074 uint64_t InnerShiftAmt = ShlCnst->getZExtValue();
5075
5076 SDValue ShrRHS = RHS;
5077 ConstantSDNode *ShrCnst = dyn_cast<ConstantSDNode>(ShrRHS);
5078 if (!ShrCnst) {
5079 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005080 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005081 }
5082 uint64_t OuterShiftAmt = ShrCnst->getZExtValue();
5083
5084 // To avoid extra codegen and be profitable, we need Outer >= Inner
5085 if (OuterShiftAmt < InnerShiftAmt) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005086 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005087 }
5088
5089 // If the outer shift is more than the type size, we have no bitfield to
5090 // extract (since we also check that the inner shift is <= the outer shift
5091 // then this also implies that the inner shift is < the type size)
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00005092 if (OuterShiftAmt >= Val.getValueSizeInBits()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005093 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005094 }
5095
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00005096 Start = CurDAG->getTargetConstant(OuterShiftAmt - InnerShiftAmt, DL,
5097 MVT::i32);
5098 Len = CurDAG->getTargetConstant(Val.getValueSizeInBits() - OuterShiftAmt,
5099 DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005100
5101 if (N->getOpcode() == ISD::SRA) {
5102 // If we have a arithmetic right shift, we need to use the signed bfe
5103 // variant
5104 IsSigned = true;
5105 }
5106 } else {
5107 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005108 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005109 }
5110 } else {
5111 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005112 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005113 }
5114
5115
5116 unsigned Opc;
5117 // For the BFE operations we form here from "and" and "srl", always use the
5118 // unsigned variants.
5119 if (Val.getValueType() == MVT::i32) {
5120 if (IsSigned) {
5121 Opc = NVPTX::BFE_S32rii;
5122 } else {
5123 Opc = NVPTX::BFE_U32rii;
5124 }
5125 } else if (Val.getValueType() == MVT::i64) {
5126 if (IsSigned) {
5127 Opc = NVPTX::BFE_S64rii;
5128 } else {
5129 Opc = NVPTX::BFE_U64rii;
5130 }
5131 } else {
5132 // We cannot handle this type
Justin Bogner8d83fb62016-05-13 21:12:53 +00005133 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005134 }
5135
5136 SDValue Ops[] = {
5137 Val, Start, Len
5138 };
5139
Justin Bogner8d83fb62016-05-13 21:12:53 +00005140 ReplaceNode(N, CurDAG->getMachineNode(Opc, DL, N->getVTList(), Ops));
5141 return true;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005142}
5143
Justin Holewinskiae556d32012-05-04 20:18:50 +00005144// SelectDirectAddr - Match a direct address for DAG.
5145// A direct address could be a globaladdress or externalsymbol.
5146bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
5147 // Return true if TGA or ES.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005148 if (N.getOpcode() == ISD::TargetGlobalAddress ||
5149 N.getOpcode() == ISD::TargetExternalSymbol) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005150 Address = N;
5151 return true;
5152 }
5153 if (N.getOpcode() == NVPTXISD::Wrapper) {
5154 Address = N.getOperand(0);
5155 return true;
5156 }
Artem Belevichb2e76a52016-07-20 18:39:47 +00005157 // addrspacecast(MoveParam(arg_symbol) to addrspace(PARAM)) -> arg_symbol
5158 if (AddrSpaceCastSDNode *CastN = dyn_cast<AddrSpaceCastSDNode>(N)) {
5159 if (CastN->getSrcAddressSpace() == ADDRESS_SPACE_GENERIC &&
5160 CastN->getDestAddressSpace() == ADDRESS_SPACE_PARAM &&
5161 CastN->getOperand(0).getOpcode() == NVPTXISD::MoveParam)
5162 return SelectDirectAddr(CastN->getOperand(0).getOperand(0), Address);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005163 }
5164 return false;
5165}
5166
5167// symbol+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005168bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
5169 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005170 if (Addr.getOpcode() == ISD::ADD) {
5171 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005172 SDValue base = Addr.getOperand(0);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005173 if (SelectDirectAddr(base, Base)) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005174 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5175 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005176 return true;
5177 }
5178 }
5179 }
5180 return false;
5181}
5182
5183// symbol+offset
5184bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
5185 SDValue &Base, SDValue &Offset) {
5186 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
5187}
5188
5189// symbol+offset
5190bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
5191 SDValue &Base, SDValue &Offset) {
5192 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
5193}
5194
5195// register+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005196bool NVPTXDAGToDAGISel::SelectADDRri_imp(
5197 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005198 if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
5199 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005200 Offset = CurDAG->getTargetConstant(0, SDLoc(OpNode), mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005201 return true;
5202 }
5203 if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
5204 Addr.getOpcode() == ISD::TargetGlobalAddress)
Justin Holewinski0497ab12013-03-30 14:29:21 +00005205 return false; // direct calls.
Justin Holewinskiae556d32012-05-04 20:18:50 +00005206
5207 if (Addr.getOpcode() == ISD::ADD) {
5208 if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
5209 return false;
5210 }
5211 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
5212 if (FrameIndexSDNode *FIN =
Justin Holewinski0497ab12013-03-30 14:29:21 +00005213 dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005214 // Constant offset from frame ref.
5215 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
5216 else
5217 Base = Addr.getOperand(0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005218 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5219 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005220 return true;
5221 }
5222 }
5223 return false;
5224}
5225
5226// register+offset
5227bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
5228 SDValue &Base, SDValue &Offset) {
5229 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
5230}
5231
5232// register+offset
5233bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
5234 SDValue &Base, SDValue &Offset) {
5235 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
5236}
5237
5238bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
5239 unsigned int spN) const {
Craig Topper062a2ba2014-04-25 05:30:21 +00005240 const Value *Src = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00005241 if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +00005242 if (spN == 0 && mN->getMemOperand()->getPseudoValue())
5243 return true;
5244 Src = mN->getMemOperand()->getValue();
Justin Holewinskiae556d32012-05-04 20:18:50 +00005245 }
5246 if (!Src)
5247 return false;
Craig Toppere3dcce92015-08-01 22:20:21 +00005248 if (auto *PT = dyn_cast<PointerType>(Src->getType()))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005249 return (PT->getAddressSpace() == spN);
5250 return false;
5251}
5252
5253/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
5254/// inline asm expressions.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005255bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
Daniel Sanders60f1db02015-03-13 12:45:09 +00005256 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005257 SDValue Op0, Op1;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005258 switch (ConstraintID) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005259 default:
5260 return true;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005261 case InlineAsm::Constraint_m: // memory
Justin Holewinskiae556d32012-05-04 20:18:50 +00005262 if (SelectDirectAddr(Op, Op0)) {
5263 OutOps.push_back(Op0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005264 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
Justin Holewinskiae556d32012-05-04 20:18:50 +00005265 return false;
5266 }
5267 if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
5268 OutOps.push_back(Op0);
5269 OutOps.push_back(Op1);
5270 return false;
5271 }
5272 break;
5273 }
5274 return true;
5275}
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00005276
5277/// GetConvertOpcode - Returns the CVT_ instruction opcode that implements a
5278/// conversion from \p SrcTy to \p DestTy.
5279unsigned NVPTXDAGToDAGISel::GetConvertOpcode(MVT DestTy, MVT SrcTy,
5280 bool IsSigned) {
5281 switch (SrcTy.SimpleTy) {
5282 default:
5283 llvm_unreachable("Unhandled source type");
5284 case MVT::i8:
5285 switch (DestTy.SimpleTy) {
5286 default:
5287 llvm_unreachable("Unhandled dest type");
5288 case MVT::i16:
5289 return IsSigned ? NVPTX::CVT_s16_s8 : NVPTX::CVT_u16_u8;
5290 case MVT::i32:
5291 return IsSigned ? NVPTX::CVT_s32_s8 : NVPTX::CVT_u32_u8;
5292 case MVT::i64:
5293 return IsSigned ? NVPTX::CVT_s64_s8 : NVPTX::CVT_u64_u8;
5294 }
5295 case MVT::i16:
5296 switch (DestTy.SimpleTy) {
5297 default:
5298 llvm_unreachable("Unhandled dest type");
5299 case MVT::i8:
5300 return IsSigned ? NVPTX::CVT_s8_s16 : NVPTX::CVT_u8_u16;
5301 case MVT::i32:
5302 return IsSigned ? NVPTX::CVT_s32_s16 : NVPTX::CVT_u32_u16;
5303 case MVT::i64:
5304 return IsSigned ? NVPTX::CVT_s64_s16 : NVPTX::CVT_u64_u16;
5305 }
5306 case MVT::i32:
5307 switch (DestTy.SimpleTy) {
5308 default:
5309 llvm_unreachable("Unhandled dest type");
5310 case MVT::i8:
5311 return IsSigned ? NVPTX::CVT_s8_s32 : NVPTX::CVT_u8_u32;
5312 case MVT::i16:
5313 return IsSigned ? NVPTX::CVT_s16_s32 : NVPTX::CVT_u16_u32;
5314 case MVT::i64:
5315 return IsSigned ? NVPTX::CVT_s64_s32 : NVPTX::CVT_u64_u32;
5316 }
5317 case MVT::i64:
5318 switch (DestTy.SimpleTy) {
5319 default:
5320 llvm_unreachable("Unhandled dest type");
5321 case MVT::i8:
5322 return IsSigned ? NVPTX::CVT_s8_s64 : NVPTX::CVT_u8_u64;
5323 case MVT::i16:
5324 return IsSigned ? NVPTX::CVT_s16_s64 : NVPTX::CVT_u16_u64;
5325 case MVT::i32:
5326 return IsSigned ? NVPTX::CVT_s32_s64 : NVPTX::CVT_u32_u64;
5327 }
5328 }
5329}