blob: 2aef67b9caf7b009a804046f525260377737313b [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 Holewinskiae556d32012-05-04 20:18:50 +000029/// createNVPTXISelDag - This pass converts a legalized DAG into a
30/// NVPTX-specific DAG, ready for instruction scheduling.
31FunctionPass *llvm::createNVPTXISelDag(NVPTXTargetMachine &TM,
32 llvm::CodeGenOpt::Level OptLevel) {
33 return new NVPTXDAGToDAGISel(TM, OptLevel);
34}
35
Justin Holewinskiae556d32012-05-04 20:18:50 +000036NVPTXDAGToDAGISel::NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
37 CodeGenOpt::Level OptLevel)
Eric Christopher02389e32015-02-19 00:08:27 +000038 : SelectionDAGISel(tm, OptLevel), TM(tm) {
Justin Holewinskiae556d32012-05-04 20:18:50 +000039 doMulWide = (OptLevel > 0);
Justin Holewinskicd069e62013-07-22 12:18:04 +000040}
Justin Holewinskiae556d32012-05-04 20:18:50 +000041
Eric Christopher147bba22015-01-30 01:40:59 +000042bool NVPTXDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
Justin Lebar077f8fb2017-01-21 01:00:14 +000043 Subtarget = &static_cast<const NVPTXSubtarget &>(MF.getSubtarget());
44 return SelectionDAGISel::runOnMachineFunction(MF);
Eric Christopher147bba22015-01-30 01:40:59 +000045}
46
Justin Holewinskicd069e62013-07-22 12:18:04 +000047int NVPTXDAGToDAGISel::getDivF32Level() const {
Justin Lebar077f8fb2017-01-21 01:00:14 +000048 return Subtarget->getTargetLowering()->getDivF32Level();
Justin Holewinskicd069e62013-07-22 12:18:04 +000049}
Justin Holewinskiae556d32012-05-04 20:18:50 +000050
Justin Holewinskicd069e62013-07-22 12:18:04 +000051bool NVPTXDAGToDAGISel::usePrecSqrtF32() const {
Justin Lebar077f8fb2017-01-21 01:00:14 +000052 return Subtarget->getTargetLowering()->usePrecSqrtF32();
Justin Holewinskicd069e62013-07-22 12:18:04 +000053}
54
55bool NVPTXDAGToDAGISel::useF32FTZ() const {
Justin Lebar077f8fb2017-01-21 01:00:14 +000056 return Subtarget->getTargetLowering()->useF32FTZ(*MF);
Justin Holewinskiae556d32012-05-04 20:18:50 +000057}
58
Justin Holewinski428cf0e2014-07-17 18:10:09 +000059bool NVPTXDAGToDAGISel::allowFMA() const {
Eric Christopher147bba22015-01-30 01:40:59 +000060 const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
Justin Holewinski428cf0e2014-07-17 18:10:09 +000061 return TL->allowFMA(*MF, OptLevel);
62}
63
Artem Belevichd109f462017-01-13 18:48:13 +000064bool NVPTXDAGToDAGISel::allowUnsafeFPMath() const {
65 const NVPTXTargetLowering *TL = Subtarget->getTargetLowering();
66 return TL->allowUnsafeFPMath(*MF);
67}
68
Justin Holewinskiae556d32012-05-04 20:18:50 +000069/// Select - Select instructions not customized! Used for
70/// expanded, promoted and normal instructions.
Justin Bogner8d83fb62016-05-13 21:12:53 +000071void NVPTXDAGToDAGISel::Select(SDNode *N) {
Justin Holewinskiae556d32012-05-04 20:18:50 +000072
Tim Northover31d093c2013-09-22 08:21:56 +000073 if (N->isMachineOpcode()) {
74 N->setNodeId(-1);
Justin Bogner8d83fb62016-05-13 21:12:53 +000075 return; // Already selected.
Tim Northover31d093c2013-09-22 08:21:56 +000076 }
Justin Holewinskiae556d32012-05-04 20:18:50 +000077
Justin Holewinskiae556d32012-05-04 20:18:50 +000078 switch (N->getOpcode()) {
79 case ISD::LOAD:
Justin Bogner8d83fb62016-05-13 21:12:53 +000080 if (tryLoad(N))
81 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +000082 break;
83 case ISD::STORE:
Justin Bogner8d83fb62016-05-13 21:12:53 +000084 if (tryStore(N))
85 return;
Justin Holewinskiae556d32012-05-04 20:18:50 +000086 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +000087 case NVPTXISD::LoadV2:
88 case NVPTXISD::LoadV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +000089 if (tryLoadVector(N))
90 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +000091 break;
92 case NVPTXISD::LDGV2:
93 case NVPTXISD::LDGV4:
94 case NVPTXISD::LDUV2:
95 case NVPTXISD::LDUV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +000096 if (tryLDGLDU(N))
97 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +000098 break;
99 case NVPTXISD::StoreV2:
100 case NVPTXISD::StoreV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000101 if (tryStoreVector(N))
102 return;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000103 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000104 case NVPTXISD::LoadParam:
105 case NVPTXISD::LoadParamV2:
106 case NVPTXISD::LoadParamV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000107 if (tryLoadParam(N))
108 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000109 break;
110 case NVPTXISD::StoreRetval:
111 case NVPTXISD::StoreRetvalV2:
112 case NVPTXISD::StoreRetvalV4:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000113 if (tryStoreRetval(N))
114 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000115 break;
116 case NVPTXISD::StoreParam:
117 case NVPTXISD::StoreParamV2:
118 case NVPTXISD::StoreParamV4:
119 case NVPTXISD::StoreParamS32:
120 case NVPTXISD::StoreParamU32:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000121 if (tryStoreParam(N))
122 return;
Justin Holewinskif8f70912013-06-28 17:57:59 +0000123 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000124 case ISD::INTRINSIC_WO_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000125 if (tryIntrinsicNoChain(N))
126 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000127 break;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000128 case ISD::INTRINSIC_W_CHAIN:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000129 if (tryIntrinsicChain(N))
130 return;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000131 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000132 case NVPTXISD::Tex1DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000133 case NVPTXISD::Tex1DFloatFloat:
134 case NVPTXISD::Tex1DFloatFloatLevel:
135 case NVPTXISD::Tex1DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000136 case NVPTXISD::Tex1DS32S32:
137 case NVPTXISD::Tex1DS32Float:
138 case NVPTXISD::Tex1DS32FloatLevel:
139 case NVPTXISD::Tex1DS32FloatGrad:
140 case NVPTXISD::Tex1DU32S32:
141 case NVPTXISD::Tex1DU32Float:
142 case NVPTXISD::Tex1DU32FloatLevel:
143 case NVPTXISD::Tex1DU32FloatGrad:
144 case NVPTXISD::Tex1DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000145 case NVPTXISD::Tex1DArrayFloatFloat:
146 case NVPTXISD::Tex1DArrayFloatFloatLevel:
147 case NVPTXISD::Tex1DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000148 case NVPTXISD::Tex1DArrayS32S32:
149 case NVPTXISD::Tex1DArrayS32Float:
150 case NVPTXISD::Tex1DArrayS32FloatLevel:
151 case NVPTXISD::Tex1DArrayS32FloatGrad:
152 case NVPTXISD::Tex1DArrayU32S32:
153 case NVPTXISD::Tex1DArrayU32Float:
154 case NVPTXISD::Tex1DArrayU32FloatLevel:
155 case NVPTXISD::Tex1DArrayU32FloatGrad:
156 case NVPTXISD::Tex2DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000157 case NVPTXISD::Tex2DFloatFloat:
158 case NVPTXISD::Tex2DFloatFloatLevel:
159 case NVPTXISD::Tex2DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000160 case NVPTXISD::Tex2DS32S32:
161 case NVPTXISD::Tex2DS32Float:
162 case NVPTXISD::Tex2DS32FloatLevel:
163 case NVPTXISD::Tex2DS32FloatGrad:
164 case NVPTXISD::Tex2DU32S32:
165 case NVPTXISD::Tex2DU32Float:
166 case NVPTXISD::Tex2DU32FloatLevel:
167 case NVPTXISD::Tex2DU32FloatGrad:
168 case NVPTXISD::Tex2DArrayFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000169 case NVPTXISD::Tex2DArrayFloatFloat:
170 case NVPTXISD::Tex2DArrayFloatFloatLevel:
171 case NVPTXISD::Tex2DArrayFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000172 case NVPTXISD::Tex2DArrayS32S32:
173 case NVPTXISD::Tex2DArrayS32Float:
174 case NVPTXISD::Tex2DArrayS32FloatLevel:
175 case NVPTXISD::Tex2DArrayS32FloatGrad:
176 case NVPTXISD::Tex2DArrayU32S32:
177 case NVPTXISD::Tex2DArrayU32Float:
178 case NVPTXISD::Tex2DArrayU32FloatLevel:
179 case NVPTXISD::Tex2DArrayU32FloatGrad:
180 case NVPTXISD::Tex3DFloatS32:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000181 case NVPTXISD::Tex3DFloatFloat:
182 case NVPTXISD::Tex3DFloatFloatLevel:
183 case NVPTXISD::Tex3DFloatFloatGrad:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000184 case NVPTXISD::Tex3DS32S32:
185 case NVPTXISD::Tex3DS32Float:
186 case NVPTXISD::Tex3DS32FloatLevel:
187 case NVPTXISD::Tex3DS32FloatGrad:
188 case NVPTXISD::Tex3DU32S32:
189 case NVPTXISD::Tex3DU32Float:
190 case NVPTXISD::Tex3DU32FloatLevel:
191 case NVPTXISD::Tex3DU32FloatGrad:
192 case NVPTXISD::TexCubeFloatFloat:
193 case NVPTXISD::TexCubeFloatFloatLevel:
194 case NVPTXISD::TexCubeS32Float:
195 case NVPTXISD::TexCubeS32FloatLevel:
196 case NVPTXISD::TexCubeU32Float:
197 case NVPTXISD::TexCubeU32FloatLevel:
198 case NVPTXISD::TexCubeArrayFloatFloat:
199 case NVPTXISD::TexCubeArrayFloatFloatLevel:
200 case NVPTXISD::TexCubeArrayS32Float:
201 case NVPTXISD::TexCubeArrayS32FloatLevel:
202 case NVPTXISD::TexCubeArrayU32Float:
203 case NVPTXISD::TexCubeArrayU32FloatLevel:
204 case NVPTXISD::Tld4R2DFloatFloat:
205 case NVPTXISD::Tld4G2DFloatFloat:
206 case NVPTXISD::Tld4B2DFloatFloat:
207 case NVPTXISD::Tld4A2DFloatFloat:
208 case NVPTXISD::Tld4R2DS64Float:
209 case NVPTXISD::Tld4G2DS64Float:
210 case NVPTXISD::Tld4B2DS64Float:
211 case NVPTXISD::Tld4A2DS64Float:
212 case NVPTXISD::Tld4R2DU64Float:
213 case NVPTXISD::Tld4G2DU64Float:
214 case NVPTXISD::Tld4B2DU64Float:
215 case NVPTXISD::Tld4A2DU64Float:
216 case NVPTXISD::TexUnified1DFloatS32:
217 case NVPTXISD::TexUnified1DFloatFloat:
218 case NVPTXISD::TexUnified1DFloatFloatLevel:
219 case NVPTXISD::TexUnified1DFloatFloatGrad:
220 case NVPTXISD::TexUnified1DS32S32:
221 case NVPTXISD::TexUnified1DS32Float:
222 case NVPTXISD::TexUnified1DS32FloatLevel:
223 case NVPTXISD::TexUnified1DS32FloatGrad:
224 case NVPTXISD::TexUnified1DU32S32:
225 case NVPTXISD::TexUnified1DU32Float:
226 case NVPTXISD::TexUnified1DU32FloatLevel:
227 case NVPTXISD::TexUnified1DU32FloatGrad:
228 case NVPTXISD::TexUnified1DArrayFloatS32:
229 case NVPTXISD::TexUnified1DArrayFloatFloat:
230 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
231 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
232 case NVPTXISD::TexUnified1DArrayS32S32:
233 case NVPTXISD::TexUnified1DArrayS32Float:
234 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
235 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
236 case NVPTXISD::TexUnified1DArrayU32S32:
237 case NVPTXISD::TexUnified1DArrayU32Float:
238 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
239 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
240 case NVPTXISD::TexUnified2DFloatS32:
241 case NVPTXISD::TexUnified2DFloatFloat:
242 case NVPTXISD::TexUnified2DFloatFloatLevel:
243 case NVPTXISD::TexUnified2DFloatFloatGrad:
244 case NVPTXISD::TexUnified2DS32S32:
245 case NVPTXISD::TexUnified2DS32Float:
246 case NVPTXISD::TexUnified2DS32FloatLevel:
247 case NVPTXISD::TexUnified2DS32FloatGrad:
248 case NVPTXISD::TexUnified2DU32S32:
249 case NVPTXISD::TexUnified2DU32Float:
250 case NVPTXISD::TexUnified2DU32FloatLevel:
251 case NVPTXISD::TexUnified2DU32FloatGrad:
252 case NVPTXISD::TexUnified2DArrayFloatS32:
253 case NVPTXISD::TexUnified2DArrayFloatFloat:
254 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
255 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
256 case NVPTXISD::TexUnified2DArrayS32S32:
257 case NVPTXISD::TexUnified2DArrayS32Float:
258 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
259 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
260 case NVPTXISD::TexUnified2DArrayU32S32:
261 case NVPTXISD::TexUnified2DArrayU32Float:
262 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
263 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
264 case NVPTXISD::TexUnified3DFloatS32:
265 case NVPTXISD::TexUnified3DFloatFloat:
266 case NVPTXISD::TexUnified3DFloatFloatLevel:
267 case NVPTXISD::TexUnified3DFloatFloatGrad:
268 case NVPTXISD::TexUnified3DS32S32:
269 case NVPTXISD::TexUnified3DS32Float:
270 case NVPTXISD::TexUnified3DS32FloatLevel:
271 case NVPTXISD::TexUnified3DS32FloatGrad:
272 case NVPTXISD::TexUnified3DU32S32:
273 case NVPTXISD::TexUnified3DU32Float:
274 case NVPTXISD::TexUnified3DU32FloatLevel:
275 case NVPTXISD::TexUnified3DU32FloatGrad:
276 case NVPTXISD::TexUnifiedCubeFloatFloat:
277 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
278 case NVPTXISD::TexUnifiedCubeS32Float:
279 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
280 case NVPTXISD::TexUnifiedCubeU32Float:
281 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
282 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
283 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
284 case NVPTXISD::TexUnifiedCubeArrayS32Float:
285 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
286 case NVPTXISD::TexUnifiedCubeArrayU32Float:
287 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
288 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
289 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
290 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
291 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
292 case NVPTXISD::Tld4UnifiedR2DS64Float:
293 case NVPTXISD::Tld4UnifiedG2DS64Float:
294 case NVPTXISD::Tld4UnifiedB2DS64Float:
295 case NVPTXISD::Tld4UnifiedA2DS64Float:
296 case NVPTXISD::Tld4UnifiedR2DU64Float:
297 case NVPTXISD::Tld4UnifiedG2DU64Float:
298 case NVPTXISD::Tld4UnifiedB2DU64Float:
299 case NVPTXISD::Tld4UnifiedA2DU64Float:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000300 if (tryTextureIntrinsic(N))
301 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000302 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000303 case NVPTXISD::Suld1DI8Clamp:
304 case NVPTXISD::Suld1DI16Clamp:
305 case NVPTXISD::Suld1DI32Clamp:
306 case NVPTXISD::Suld1DI64Clamp:
307 case NVPTXISD::Suld1DV2I8Clamp:
308 case NVPTXISD::Suld1DV2I16Clamp:
309 case NVPTXISD::Suld1DV2I32Clamp:
310 case NVPTXISD::Suld1DV2I64Clamp:
311 case NVPTXISD::Suld1DV4I8Clamp:
312 case NVPTXISD::Suld1DV4I16Clamp:
313 case NVPTXISD::Suld1DV4I32Clamp:
314 case NVPTXISD::Suld1DArrayI8Clamp:
315 case NVPTXISD::Suld1DArrayI16Clamp:
316 case NVPTXISD::Suld1DArrayI32Clamp:
317 case NVPTXISD::Suld1DArrayI64Clamp:
318 case NVPTXISD::Suld1DArrayV2I8Clamp:
319 case NVPTXISD::Suld1DArrayV2I16Clamp:
320 case NVPTXISD::Suld1DArrayV2I32Clamp:
321 case NVPTXISD::Suld1DArrayV2I64Clamp:
322 case NVPTXISD::Suld1DArrayV4I8Clamp:
323 case NVPTXISD::Suld1DArrayV4I16Clamp:
324 case NVPTXISD::Suld1DArrayV4I32Clamp:
325 case NVPTXISD::Suld2DI8Clamp:
326 case NVPTXISD::Suld2DI16Clamp:
327 case NVPTXISD::Suld2DI32Clamp:
328 case NVPTXISD::Suld2DI64Clamp:
329 case NVPTXISD::Suld2DV2I8Clamp:
330 case NVPTXISD::Suld2DV2I16Clamp:
331 case NVPTXISD::Suld2DV2I32Clamp:
332 case NVPTXISD::Suld2DV2I64Clamp:
333 case NVPTXISD::Suld2DV4I8Clamp:
334 case NVPTXISD::Suld2DV4I16Clamp:
335 case NVPTXISD::Suld2DV4I32Clamp:
336 case NVPTXISD::Suld2DArrayI8Clamp:
337 case NVPTXISD::Suld2DArrayI16Clamp:
338 case NVPTXISD::Suld2DArrayI32Clamp:
339 case NVPTXISD::Suld2DArrayI64Clamp:
340 case NVPTXISD::Suld2DArrayV2I8Clamp:
341 case NVPTXISD::Suld2DArrayV2I16Clamp:
342 case NVPTXISD::Suld2DArrayV2I32Clamp:
343 case NVPTXISD::Suld2DArrayV2I64Clamp:
344 case NVPTXISD::Suld2DArrayV4I8Clamp:
345 case NVPTXISD::Suld2DArrayV4I16Clamp:
346 case NVPTXISD::Suld2DArrayV4I32Clamp:
347 case NVPTXISD::Suld3DI8Clamp:
348 case NVPTXISD::Suld3DI16Clamp:
349 case NVPTXISD::Suld3DI32Clamp:
350 case NVPTXISD::Suld3DI64Clamp:
351 case NVPTXISD::Suld3DV2I8Clamp:
352 case NVPTXISD::Suld3DV2I16Clamp:
353 case NVPTXISD::Suld3DV2I32Clamp:
354 case NVPTXISD::Suld3DV2I64Clamp:
355 case NVPTXISD::Suld3DV4I8Clamp:
356 case NVPTXISD::Suld3DV4I16Clamp:
357 case NVPTXISD::Suld3DV4I32Clamp:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000358 case NVPTXISD::Suld1DI8Trap:
359 case NVPTXISD::Suld1DI16Trap:
360 case NVPTXISD::Suld1DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000361 case NVPTXISD::Suld1DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000362 case NVPTXISD::Suld1DV2I8Trap:
363 case NVPTXISD::Suld1DV2I16Trap:
364 case NVPTXISD::Suld1DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000365 case NVPTXISD::Suld1DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000366 case NVPTXISD::Suld1DV4I8Trap:
367 case NVPTXISD::Suld1DV4I16Trap:
368 case NVPTXISD::Suld1DV4I32Trap:
369 case NVPTXISD::Suld1DArrayI8Trap:
370 case NVPTXISD::Suld1DArrayI16Trap:
371 case NVPTXISD::Suld1DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000372 case NVPTXISD::Suld1DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000373 case NVPTXISD::Suld1DArrayV2I8Trap:
374 case NVPTXISD::Suld1DArrayV2I16Trap:
375 case NVPTXISD::Suld1DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000376 case NVPTXISD::Suld1DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000377 case NVPTXISD::Suld1DArrayV4I8Trap:
378 case NVPTXISD::Suld1DArrayV4I16Trap:
379 case NVPTXISD::Suld1DArrayV4I32Trap:
380 case NVPTXISD::Suld2DI8Trap:
381 case NVPTXISD::Suld2DI16Trap:
382 case NVPTXISD::Suld2DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000383 case NVPTXISD::Suld2DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000384 case NVPTXISD::Suld2DV2I8Trap:
385 case NVPTXISD::Suld2DV2I16Trap:
386 case NVPTXISD::Suld2DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000387 case NVPTXISD::Suld2DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000388 case NVPTXISD::Suld2DV4I8Trap:
389 case NVPTXISD::Suld2DV4I16Trap:
390 case NVPTXISD::Suld2DV4I32Trap:
391 case NVPTXISD::Suld2DArrayI8Trap:
392 case NVPTXISD::Suld2DArrayI16Trap:
393 case NVPTXISD::Suld2DArrayI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000394 case NVPTXISD::Suld2DArrayI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000395 case NVPTXISD::Suld2DArrayV2I8Trap:
396 case NVPTXISD::Suld2DArrayV2I16Trap:
397 case NVPTXISD::Suld2DArrayV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000398 case NVPTXISD::Suld2DArrayV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000399 case NVPTXISD::Suld2DArrayV4I8Trap:
400 case NVPTXISD::Suld2DArrayV4I16Trap:
401 case NVPTXISD::Suld2DArrayV4I32Trap:
402 case NVPTXISD::Suld3DI8Trap:
403 case NVPTXISD::Suld3DI16Trap:
404 case NVPTXISD::Suld3DI32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000405 case NVPTXISD::Suld3DI64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000406 case NVPTXISD::Suld3DV2I8Trap:
407 case NVPTXISD::Suld3DV2I16Trap:
408 case NVPTXISD::Suld3DV2I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000409 case NVPTXISD::Suld3DV2I64Trap:
Justin Holewinski30d56a72014-04-09 15:39:15 +0000410 case NVPTXISD::Suld3DV4I8Trap:
411 case NVPTXISD::Suld3DV4I16Trap:
412 case NVPTXISD::Suld3DV4I32Trap:
Justin Holewinski9a2350e2014-07-17 11:59:04 +0000413 case NVPTXISD::Suld1DI8Zero:
414 case NVPTXISD::Suld1DI16Zero:
415 case NVPTXISD::Suld1DI32Zero:
416 case NVPTXISD::Suld1DI64Zero:
417 case NVPTXISD::Suld1DV2I8Zero:
418 case NVPTXISD::Suld1DV2I16Zero:
419 case NVPTXISD::Suld1DV2I32Zero:
420 case NVPTXISD::Suld1DV2I64Zero:
421 case NVPTXISD::Suld1DV4I8Zero:
422 case NVPTXISD::Suld1DV4I16Zero:
423 case NVPTXISD::Suld1DV4I32Zero:
424 case NVPTXISD::Suld1DArrayI8Zero:
425 case NVPTXISD::Suld1DArrayI16Zero:
426 case NVPTXISD::Suld1DArrayI32Zero:
427 case NVPTXISD::Suld1DArrayI64Zero:
428 case NVPTXISD::Suld1DArrayV2I8Zero:
429 case NVPTXISD::Suld1DArrayV2I16Zero:
430 case NVPTXISD::Suld1DArrayV2I32Zero:
431 case NVPTXISD::Suld1DArrayV2I64Zero:
432 case NVPTXISD::Suld1DArrayV4I8Zero:
433 case NVPTXISD::Suld1DArrayV4I16Zero:
434 case NVPTXISD::Suld1DArrayV4I32Zero:
435 case NVPTXISD::Suld2DI8Zero:
436 case NVPTXISD::Suld2DI16Zero:
437 case NVPTXISD::Suld2DI32Zero:
438 case NVPTXISD::Suld2DI64Zero:
439 case NVPTXISD::Suld2DV2I8Zero:
440 case NVPTXISD::Suld2DV2I16Zero:
441 case NVPTXISD::Suld2DV2I32Zero:
442 case NVPTXISD::Suld2DV2I64Zero:
443 case NVPTXISD::Suld2DV4I8Zero:
444 case NVPTXISD::Suld2DV4I16Zero:
445 case NVPTXISD::Suld2DV4I32Zero:
446 case NVPTXISD::Suld2DArrayI8Zero:
447 case NVPTXISD::Suld2DArrayI16Zero:
448 case NVPTXISD::Suld2DArrayI32Zero:
449 case NVPTXISD::Suld2DArrayI64Zero:
450 case NVPTXISD::Suld2DArrayV2I8Zero:
451 case NVPTXISD::Suld2DArrayV2I16Zero:
452 case NVPTXISD::Suld2DArrayV2I32Zero:
453 case NVPTXISD::Suld2DArrayV2I64Zero:
454 case NVPTXISD::Suld2DArrayV4I8Zero:
455 case NVPTXISD::Suld2DArrayV4I16Zero:
456 case NVPTXISD::Suld2DArrayV4I32Zero:
457 case NVPTXISD::Suld3DI8Zero:
458 case NVPTXISD::Suld3DI16Zero:
459 case NVPTXISD::Suld3DI32Zero:
460 case NVPTXISD::Suld3DI64Zero:
461 case NVPTXISD::Suld3DV2I8Zero:
462 case NVPTXISD::Suld3DV2I16Zero:
463 case NVPTXISD::Suld3DV2I32Zero:
464 case NVPTXISD::Suld3DV2I64Zero:
465 case NVPTXISD::Suld3DV4I8Zero:
466 case NVPTXISD::Suld3DV4I16Zero:
467 case NVPTXISD::Suld3DV4I32Zero:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000468 if (trySurfaceIntrinsic(N))
469 return;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000470 break;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000471 case ISD::AND:
472 case ISD::SRA:
473 case ISD::SRL:
474 // Try to select BFE
Justin Bogner8d83fb62016-05-13 21:12:53 +0000475 if (tryBFE(N))
476 return;
Justin Holewinskica7a4f12014-06-27 18:35:27 +0000477 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000478 case ISD::ADDRSPACECAST:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000479 SelectAddrSpaceCast(N);
480 return;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000481 case ISD::ConstantFP:
482 if (tryConstantFP16(N))
483 return;
484 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000485 default:
486 break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000487 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000488 SelectCode(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000489}
490
Justin Bogner8d83fb62016-05-13 21:12:53 +0000491bool NVPTXDAGToDAGISel::tryIntrinsicChain(SDNode *N) {
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000492 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
493 switch (IID) {
494 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000495 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000496 case Intrinsic::nvvm_ldg_global_f:
497 case Intrinsic::nvvm_ldg_global_i:
498 case Intrinsic::nvvm_ldg_global_p:
499 case Intrinsic::nvvm_ldu_global_f:
500 case Intrinsic::nvvm_ldu_global_i:
501 case Intrinsic::nvvm_ldu_global_p:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000502 return tryLDGLDU(N);
Justin Holewinskib926d9d2014-06-27 18:35:51 +0000503 }
504}
505
Artem Belevich64dc9be2017-01-13 20:56:17 +0000506// There's no way to specify FP16 immediates in .f16 ops, so we have to
507// load them into an .f16 register first.
508bool NVPTXDAGToDAGISel::tryConstantFP16(SDNode *N) {
509 if (N->getValueType(0) != MVT::f16)
510 return false;
511 SDValue Val = CurDAG->getTargetConstantFP(
512 cast<ConstantFPSDNode>(N)->getValueAPF(), SDLoc(N), MVT::f16);
513 SDNode *LoadConstF16 =
514 CurDAG->getMachineNode(NVPTX::LOAD_CONST_F16, SDLoc(N), MVT::f16, Val);
515 ReplaceNode(N, LoadConstF16);
516 return true;
517}
518
Eric Christopher9745b3a2015-01-30 01:41:01 +0000519static unsigned int getCodeAddrSpace(MemSDNode *N) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +0000520 const Value *Src = N->getMemOperand()->getValue();
Justin Holewinskib96d1392013-06-10 13:29:47 +0000521
Justin Holewinskiae556d32012-05-04 20:18:50 +0000522 if (!Src)
Justin Holewinskib96d1392013-06-10 13:29:47 +0000523 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000524
Craig Toppere3dcce92015-08-01 22:20:21 +0000525 if (auto *PT = dyn_cast<PointerType>(Src->getType())) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000526 switch (PT->getAddressSpace()) {
Justin Holewinskib96d1392013-06-10 13:29:47 +0000527 case llvm::ADDRESS_SPACE_LOCAL: return NVPTX::PTXLdStInstCode::LOCAL;
528 case llvm::ADDRESS_SPACE_GLOBAL: return NVPTX::PTXLdStInstCode::GLOBAL;
529 case llvm::ADDRESS_SPACE_SHARED: return NVPTX::PTXLdStInstCode::SHARED;
530 case llvm::ADDRESS_SPACE_GENERIC: return NVPTX::PTXLdStInstCode::GENERIC;
531 case llvm::ADDRESS_SPACE_PARAM: return NVPTX::PTXLdStInstCode::PARAM;
532 case llvm::ADDRESS_SPACE_CONST: return NVPTX::PTXLdStInstCode::CONSTANT;
533 default: break;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000534 }
535 }
Justin Holewinskib96d1392013-06-10 13:29:47 +0000536 return NVPTX::PTXLdStInstCode::GENERIC;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000537}
538
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000539static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget,
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000540 unsigned CodeAddrSpace, MachineFunction *F) {
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000541 // We use ldg (i.e. ld.global.nc) for invariant loads from the global address
542 // space.
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000543 //
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000544 // We have two ways of identifying invariant loads: Loads may be explicitly
545 // marked as invariant, or we may infer them to be invariant.
546 //
547 // We currently infer invariance only for kernel function pointer params that
548 // are noalias (i.e. __restrict) and never written to.
549 //
550 // TODO: Perform a more powerful invariance analysis (ideally IPO, and ideally
551 // not during the SelectionDAG phase).
552 //
553 // TODO: Infer invariance only at -O2. We still want to use ldg at -O0 for
554 // explicitly invariant loads because these are how clang tells us to use ldg
555 // when the user uses a builtin.
556 if (!Subtarget.hasLDG() || CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL)
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000557 return false;
Justin Lebar6d6b11a2016-09-11 01:39:04 +0000558
559 if (N->isInvariant())
560 return true;
561
562 // Load wasn't explicitly invariant. Attempt to infer invariance.
563 if (!isKernelFunction(*F->getFunction()))
564 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000565
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000566 // We use GetUnderlyingObjects() here instead of
567 // GetUnderlyingObject() mainly because the former looks through phi
568 // nodes while the latter does not. We need to look through phi
569 // nodes to handle pointer induction variables.
570 SmallVector<Value *, 8> Objs;
571 GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()),
572 Objs, F->getDataLayout());
573 for (Value *Obj : Objs) {
574 auto *A = dyn_cast<const Argument>(Obj);
575 if (!A || !A->onlyReadsMemory() || !A->hasNoAliasAttr()) return false;
576 }
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000577
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000578 return true;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000579}
580
Justin Bogner8d83fb62016-05-13 21:12:53 +0000581bool NVPTXDAGToDAGISel::tryIntrinsicNoChain(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000582 unsigned IID = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
583 switch (IID) {
584 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000585 return false;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000586 case Intrinsic::nvvm_texsurf_handle_internal:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000587 SelectTexSurfHandle(N);
588 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +0000589 }
590}
591
Justin Bogner8d83fb62016-05-13 21:12:53 +0000592void NVPTXDAGToDAGISel::SelectTexSurfHandle(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +0000593 // Op 0 is the intrinsic ID
594 SDValue Wrapper = N->getOperand(1);
595 SDValue GlobalVal = Wrapper.getOperand(0);
Justin Bogner8d83fb62016-05-13 21:12:53 +0000596 ReplaceNode(N, CurDAG->getMachineNode(NVPTX::texsurf_handles, SDLoc(N),
597 MVT::i64, GlobalVal));
Justin Holewinski30d56a72014-04-09 15:39:15 +0000598}
599
Justin Bogner8d83fb62016-05-13 21:12:53 +0000600void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000601 SDValue Src = N->getOperand(0);
602 AddrSpaceCastSDNode *CastN = cast<AddrSpaceCastSDNode>(N);
603 unsigned SrcAddrSpace = CastN->getSrcAddressSpace();
604 unsigned DstAddrSpace = CastN->getDestAddressSpace();
605
606 assert(SrcAddrSpace != DstAddrSpace &&
607 "addrspacecast must be between different address spaces");
608
609 if (DstAddrSpace == ADDRESS_SPACE_GENERIC) {
610 // Specific to generic
611 unsigned Opc;
612 switch (SrcAddrSpace) {
613 default: report_fatal_error("Bad address space in addrspacecast");
614 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000615 Opc = TM.is64Bit() ? NVPTX::cvta_global_yes_64 : NVPTX::cvta_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000616 break;
617 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000618 Opc = TM.is64Bit() ? NVPTX::cvta_shared_yes_64 : NVPTX::cvta_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000619 break;
620 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000621 Opc = TM.is64Bit() ? NVPTX::cvta_const_yes_64 : NVPTX::cvta_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000622 break;
623 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000624 Opc = TM.is64Bit() ? NVPTX::cvta_local_yes_64 : NVPTX::cvta_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000625 break;
626 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000627 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
628 Src));
629 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000630 } else {
631 // Generic to specific
632 if (SrcAddrSpace != 0)
633 report_fatal_error("Cannot cast between two non-generic address spaces");
634 unsigned Opc;
635 switch (DstAddrSpace) {
636 default: report_fatal_error("Bad address space in addrspacecast");
637 case ADDRESS_SPACE_GLOBAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000638 Opc = TM.is64Bit() ? NVPTX::cvta_to_global_yes_64
639 : NVPTX::cvta_to_global_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000640 break;
641 case ADDRESS_SPACE_SHARED:
Eric Christopher02389e32015-02-19 00:08:27 +0000642 Opc = TM.is64Bit() ? NVPTX::cvta_to_shared_yes_64
643 : NVPTX::cvta_to_shared_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000644 break;
645 case ADDRESS_SPACE_CONST:
Eric Christopher02389e32015-02-19 00:08:27 +0000646 Opc =
647 TM.is64Bit() ? NVPTX::cvta_to_const_yes_64 : NVPTX::cvta_to_const_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000648 break;
649 case ADDRESS_SPACE_LOCAL:
Eric Christopher02389e32015-02-19 00:08:27 +0000650 Opc =
651 TM.is64Bit() ? NVPTX::cvta_to_local_yes_64 : NVPTX::cvta_to_local_yes;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000652 break;
Jingyue Wua2f60272015-06-04 21:28:26 +0000653 case ADDRESS_SPACE_PARAM:
654 Opc = TM.is64Bit() ? NVPTX::nvvm_ptr_gen_to_param_64
655 : NVPTX::nvvm_ptr_gen_to_param;
656 break;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000657 }
Justin Bogner8d83fb62016-05-13 21:12:53 +0000658 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
659 Src));
660 return;
Justin Holewinskiba2fa6d2014-03-24 11:17:53 +0000661 }
662}
663
Justin Bogner8d83fb62016-05-13 21:12:53 +0000664bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +0000665 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000666 LoadSDNode *LD = cast<LoadSDNode>(N);
667 EVT LoadedVT = LD->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +0000668 SDNode *NVPTXLD = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000669
670 // do not support pre/post inc/dec
671 if (LD->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000672 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000673
674 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000675 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000676
677 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000678 unsigned int codeAddrSpace = getCodeAddrSpace(LD);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000679
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000680 if (canLowerToLDG(LD, *Subtarget, codeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000681 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000682 }
683
Justin Holewinskiae556d32012-05-04 20:18:50 +0000684 // Volatile Setting
685 // - .volatile is only availalble for .global and .shared
686 bool isVolatile = LD->isVolatile();
687 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
688 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
689 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
690 isVolatile = false;
691
692 // Vector Setting
693 MVT SimpleVT = LoadedVT.getSimpleVT();
694 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
695 if (SimpleVT.isVector()) {
696 unsigned num = SimpleVT.getVectorNumElements();
697 if (num == 2)
698 vecType = NVPTX::PTXLdStInstCode::V2;
699 else if (num == 4)
700 vecType = NVPTX::PTXLdStInstCode::V4;
701 else
Justin Bogner8d83fb62016-05-13 21:12:53 +0000702 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000703 }
704
705 // Type Setting: fromType + fromTypeWidth
706 //
707 // Sign : ISD::SEXTLOAD
708 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
709 // type is integer
710 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
711 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +0000712 // Read at least 8 bits (predicates are stored as 8-bit values)
713 unsigned fromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskiae556d32012-05-04 20:18:50 +0000714 unsigned int fromType;
715 if ((LD->getExtensionType() == ISD::SEXTLOAD))
716 fromType = NVPTX::PTXLdStInstCode::Signed;
717 else if (ScalarVT.isFloatingPoint())
Artem Belevich64dc9be2017-01-13 20:56:17 +0000718 // f16 uses .b16 as its storage type.
719 fromType = ScalarVT.SimpleTy == MVT::f16 ? NVPTX::PTXLdStInstCode::Untyped
720 : NVPTX::PTXLdStInstCode::Float;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000721 else
722 fromType = NVPTX::PTXLdStInstCode::Unsigned;
723
724 // Create the machine instruction DAG
725 SDValue Chain = N->getOperand(0);
726 SDValue N1 = N->getOperand(1);
727 SDValue Addr;
728 SDValue Offset, Base;
729 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +0000730 MVT::SimpleValueType TargetVT = LD->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000731
732 if (SelectDirectAddr(N1, Addr)) {
733 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000734 case MVT::i8:
735 Opcode = NVPTX::LD_i8_avar;
736 break;
737 case MVT::i16:
738 Opcode = NVPTX::LD_i16_avar;
739 break;
740 case MVT::i32:
741 Opcode = NVPTX::LD_i32_avar;
742 break;
743 case MVT::i64:
744 Opcode = NVPTX::LD_i64_avar;
745 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000746 case MVT::f16:
747 Opcode = NVPTX::LD_f16_avar;
748 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000749 case MVT::f32:
750 Opcode = NVPTX::LD_f32_avar;
751 break;
752 case MVT::f64:
753 Opcode = NVPTX::LD_f64_avar;
754 break;
755 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000756 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000757 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000758 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
759 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
760 getI32Imm(fromTypeWidth, dl), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000761 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000762 } else if (TM.is64Bit() ? SelectADDRsi64(N1.getNode(), N1, Base, Offset)
763 : SelectADDRsi(N1.getNode(), N1, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000764 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000765 case MVT::i8:
766 Opcode = NVPTX::LD_i8_asi;
767 break;
768 case MVT::i16:
769 Opcode = NVPTX::LD_i16_asi;
770 break;
771 case MVT::i32:
772 Opcode = NVPTX::LD_i32_asi;
773 break;
774 case MVT::i64:
775 Opcode = NVPTX::LD_i64_asi;
776 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000777 case MVT::f16:
778 Opcode = NVPTX::LD_f16_asi;
779 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000780 case MVT::f32:
781 Opcode = NVPTX::LD_f32_asi;
782 break;
783 case MVT::f64:
784 Opcode = NVPTX::LD_f64_asi;
785 break;
786 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000787 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000788 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000789 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
790 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
791 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000792 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +0000793 } else if (TM.is64Bit() ? SelectADDRri64(N1.getNode(), N1, Base, Offset)
794 : SelectADDRri(N1.getNode(), N1, Base, Offset)) {
795 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000796 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000797 case MVT::i8:
798 Opcode = NVPTX::LD_i8_ari_64;
799 break;
800 case MVT::i16:
801 Opcode = NVPTX::LD_i16_ari_64;
802 break;
803 case MVT::i32:
804 Opcode = NVPTX::LD_i32_ari_64;
805 break;
806 case MVT::i64:
807 Opcode = NVPTX::LD_i64_ari_64;
808 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000809 case MVT::f16:
810 Opcode = NVPTX::LD_f16_ari_64;
811 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000812 case MVT::f32:
813 Opcode = NVPTX::LD_f32_ari_64;
814 break;
815 case MVT::f64:
816 Opcode = NVPTX::LD_f64_ari_64;
817 break;
818 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000819 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000820 }
821 } else {
822 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000823 case MVT::i8:
824 Opcode = NVPTX::LD_i8_ari;
825 break;
826 case MVT::i16:
827 Opcode = NVPTX::LD_i16_ari;
828 break;
829 case MVT::i32:
830 Opcode = NVPTX::LD_i32_ari;
831 break;
832 case MVT::i64:
833 Opcode = NVPTX::LD_i64_ari;
834 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000835 case MVT::f16:
836 Opcode = NVPTX::LD_f16_ari;
837 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000838 case MVT::f32:
839 Opcode = NVPTX::LD_f32_ari;
840 break;
841 case MVT::f64:
842 Opcode = NVPTX::LD_f64_ari;
843 break;
844 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000845 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000846 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000847 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000848 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
849 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
850 getI32Imm(fromTypeWidth, dl), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000851 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinski0497ab12013-03-30 14:29:21 +0000852 } else {
Eric Christopher02389e32015-02-19 00:08:27 +0000853 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000854 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000855 case MVT::i8:
856 Opcode = NVPTX::LD_i8_areg_64;
857 break;
858 case MVT::i16:
859 Opcode = NVPTX::LD_i16_areg_64;
860 break;
861 case MVT::i32:
862 Opcode = NVPTX::LD_i32_areg_64;
863 break;
864 case MVT::i64:
865 Opcode = NVPTX::LD_i64_areg_64;
866 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000867 case MVT::f16:
868 Opcode = NVPTX::LD_f16_areg_64;
869 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000870 case MVT::f32:
871 Opcode = NVPTX::LD_f32_areg_64;
872 break;
873 case MVT::f64:
874 Opcode = NVPTX::LD_f64_areg_64;
875 break;
876 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000877 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000878 }
879 } else {
880 switch (TargetVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000881 case MVT::i8:
882 Opcode = NVPTX::LD_i8_areg;
883 break;
884 case MVT::i16:
885 Opcode = NVPTX::LD_i16_areg;
886 break;
887 case MVT::i32:
888 Opcode = NVPTX::LD_i32_areg;
889 break;
890 case MVT::i64:
891 Opcode = NVPTX::LD_i64_areg;
892 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +0000893 case MVT::f16:
894 Opcode = NVPTX::LD_f16_areg;
895 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000896 case MVT::f32:
897 Opcode = NVPTX::LD_f32_areg;
898 break;
899 case MVT::f64:
900 Opcode = NVPTX::LD_f64_areg;
901 break;
902 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000903 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000904 }
Justin Holewinskiae556d32012-05-04 20:18:50 +0000905 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000906 SDValue Ops[] = { getI32Imm(isVolatile, dl), getI32Imm(codeAddrSpace, dl),
907 getI32Imm(vecType, dl), getI32Imm(fromType, dl),
908 getI32Imm(fromTypeWidth, dl), N1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +0000909 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +0000910 }
911
Justin Bogner8d83fb62016-05-13 21:12:53 +0000912 if (!NVPTXLD)
913 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000914
Justin Bogner8d83fb62016-05-13 21:12:53 +0000915 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
916 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
917 cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
918
919 ReplaceNode(N, NVPTXLD);
920 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000921}
922
Justin Bogner8d83fb62016-05-13 21:12:53 +0000923bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000924
925 SDValue Chain = N->getOperand(0);
926 SDValue Op1 = N->getOperand(1);
927 SDValue Addr, Offset, Base;
928 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +0000929 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000930 SDNode *LD;
931 MemSDNode *MemSD = cast<MemSDNode>(N);
932 EVT LoadedVT = MemSD->getMemoryVT();
933
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000934 if (!LoadedVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +0000935 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000936
937 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +0000938 unsigned int CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000939
Bjarke Hammersholt Roune5cbc7d22015-08-05 23:11:57 +0000940 if (canLowerToLDG(MemSD, *Subtarget, CodeAddrSpace, MF)) {
Justin Bogner8d83fb62016-05-13 21:12:53 +0000941 return tryLDGLDU(N);
Jingyue Wu48a9bdc2015-07-20 21:28:54 +0000942 }
943
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000944 // Volatile Setting
945 // - .volatile is only availalble for .global and .shared
946 bool IsVolatile = MemSD->isVolatile();
947 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
948 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
949 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
950 IsVolatile = false;
951
952 // Vector Setting
953 MVT SimpleVT = LoadedVT.getSimpleVT();
954
955 // Type Setting: fromType + fromTypeWidth
956 //
957 // Sign : ISD::SEXTLOAD
958 // Unsign : ISD::ZEXTLOAD, ISD::NON_EXTLOAD or ISD::EXTLOAD and the
959 // type is integer
960 // Float : ISD::NON_EXTLOAD or ISD::EXTLOAD and the type is float
961 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski994d66a2013-05-30 12:22:39 +0000962 // Read at least 8 bits (predicates are stored as 8-bit values)
963 unsigned FromTypeWidth = std::max(8U, ScalarVT.getSizeInBits());
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000964 unsigned int FromType;
965 // The last operand holds the original LoadSDNode::getExtensionType() value
Justin Holewinski0497ab12013-03-30 14:29:21 +0000966 unsigned ExtensionType = cast<ConstantSDNode>(
967 N->getOperand(N->getNumOperands() - 1))->getZExtValue();
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000968 if (ExtensionType == ISD::SEXTLOAD)
969 FromType = NVPTX::PTXLdStInstCode::Signed;
970 else if (ScalarVT.isFloatingPoint())
971 FromType = NVPTX::PTXLdStInstCode::Float;
972 else
973 FromType = NVPTX::PTXLdStInstCode::Unsigned;
974
975 unsigned VecType;
976
977 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000978 case NVPTXISD::LoadV2:
979 VecType = NVPTX::PTXLdStInstCode::V2;
980 break;
981 case NVPTXISD::LoadV4:
982 VecType = NVPTX::PTXLdStInstCode::V4;
983 break;
984 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000985 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000986 }
987
988 EVT EltVT = N->getValueType(0);
989
990 if (SelectDirectAddr(Op1, Addr)) {
991 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000992 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000993 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +0000994 case NVPTXISD::LoadV2:
995 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000996 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +0000997 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +0000998 case MVT::i8:
999 Opcode = NVPTX::LDV_i8_v2_avar;
1000 break;
1001 case MVT::i16:
1002 Opcode = NVPTX::LDV_i16_v2_avar;
1003 break;
1004 case MVT::i32:
1005 Opcode = NVPTX::LDV_i32_v2_avar;
1006 break;
1007 case MVT::i64:
1008 Opcode = NVPTX::LDV_i64_v2_avar;
1009 break;
1010 case MVT::f32:
1011 Opcode = NVPTX::LDV_f32_v2_avar;
1012 break;
1013 case MVT::f64:
1014 Opcode = NVPTX::LDV_f64_v2_avar;
1015 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001016 }
1017 break;
1018 case NVPTXISD::LoadV4:
1019 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001020 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001021 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001022 case MVT::i8:
1023 Opcode = NVPTX::LDV_i8_v4_avar;
1024 break;
1025 case MVT::i16:
1026 Opcode = NVPTX::LDV_i16_v4_avar;
1027 break;
1028 case MVT::i32:
1029 Opcode = NVPTX::LDV_i32_v4_avar;
1030 break;
1031 case MVT::f32:
1032 Opcode = NVPTX::LDV_f32_v4_avar;
1033 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001034 }
1035 break;
1036 }
1037
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001038 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1039 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1040 getI32Imm(FromTypeWidth, DL), Addr, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001041 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001042 } else if (TM.is64Bit() ? SelectADDRsi64(Op1.getNode(), Op1, Base, Offset)
1043 : SelectADDRsi(Op1.getNode(), Op1, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001044 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001045 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001046 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001047 case NVPTXISD::LoadV2:
1048 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001049 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001050 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001051 case MVT::i8:
1052 Opcode = NVPTX::LDV_i8_v2_asi;
1053 break;
1054 case MVT::i16:
1055 Opcode = NVPTX::LDV_i16_v2_asi;
1056 break;
1057 case MVT::i32:
1058 Opcode = NVPTX::LDV_i32_v2_asi;
1059 break;
1060 case MVT::i64:
1061 Opcode = NVPTX::LDV_i64_v2_asi;
1062 break;
1063 case MVT::f32:
1064 Opcode = NVPTX::LDV_f32_v2_asi;
1065 break;
1066 case MVT::f64:
1067 Opcode = NVPTX::LDV_f64_v2_asi;
1068 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001069 }
1070 break;
1071 case NVPTXISD::LoadV4:
1072 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001073 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001074 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001075 case MVT::i8:
1076 Opcode = NVPTX::LDV_i8_v4_asi;
1077 break;
1078 case MVT::i16:
1079 Opcode = NVPTX::LDV_i16_v4_asi;
1080 break;
1081 case MVT::i32:
1082 Opcode = NVPTX::LDV_i32_v4_asi;
1083 break;
1084 case MVT::f32:
1085 Opcode = NVPTX::LDV_f32_v4_asi;
1086 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001087 }
1088 break;
1089 }
1090
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001091 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1092 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1093 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001094 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001095 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1096 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1097 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001098 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001099 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001100 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001101 case NVPTXISD::LoadV2:
1102 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001103 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001104 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001105 case MVT::i8:
1106 Opcode = NVPTX::LDV_i8_v2_ari_64;
1107 break;
1108 case MVT::i16:
1109 Opcode = NVPTX::LDV_i16_v2_ari_64;
1110 break;
1111 case MVT::i32:
1112 Opcode = NVPTX::LDV_i32_v2_ari_64;
1113 break;
1114 case MVT::i64:
1115 Opcode = NVPTX::LDV_i64_v2_ari_64;
1116 break;
1117 case MVT::f32:
1118 Opcode = NVPTX::LDV_f32_v2_ari_64;
1119 break;
1120 case MVT::f64:
1121 Opcode = NVPTX::LDV_f64_v2_ari_64;
1122 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001123 }
1124 break;
1125 case NVPTXISD::LoadV4:
1126 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001127 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001128 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001129 case MVT::i8:
1130 Opcode = NVPTX::LDV_i8_v4_ari_64;
1131 break;
1132 case MVT::i16:
1133 Opcode = NVPTX::LDV_i16_v4_ari_64;
1134 break;
1135 case MVT::i32:
1136 Opcode = NVPTX::LDV_i32_v4_ari_64;
1137 break;
1138 case MVT::f32:
1139 Opcode = NVPTX::LDV_f32_v4_ari_64;
1140 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001141 }
1142 break;
1143 }
1144 } else {
1145 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001146 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001147 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001148 case NVPTXISD::LoadV2:
1149 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001150 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001151 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001152 case MVT::i8:
1153 Opcode = NVPTX::LDV_i8_v2_ari;
1154 break;
1155 case MVT::i16:
1156 Opcode = NVPTX::LDV_i16_v2_ari;
1157 break;
1158 case MVT::i32:
1159 Opcode = NVPTX::LDV_i32_v2_ari;
1160 break;
1161 case MVT::i64:
1162 Opcode = NVPTX::LDV_i64_v2_ari;
1163 break;
1164 case MVT::f32:
1165 Opcode = NVPTX::LDV_f32_v2_ari;
1166 break;
1167 case MVT::f64:
1168 Opcode = NVPTX::LDV_f64_v2_ari;
1169 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001170 }
1171 break;
1172 case NVPTXISD::LoadV4:
1173 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001174 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001175 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001176 case MVT::i8:
1177 Opcode = NVPTX::LDV_i8_v4_ari;
1178 break;
1179 case MVT::i16:
1180 Opcode = NVPTX::LDV_i16_v4_ari;
1181 break;
1182 case MVT::i32:
1183 Opcode = NVPTX::LDV_i32_v4_ari;
1184 break;
1185 case MVT::f32:
1186 Opcode = NVPTX::LDV_f32_v4_ari;
1187 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001188 }
1189 break;
1190 }
1191 }
1192
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001193 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1194 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1195 getI32Imm(FromTypeWidth, DL), Base, Offset, Chain };
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001196
Michael Liaob53d8962013-04-19 22:22:57 +00001197 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001198 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001199 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001200 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001201 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001202 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001203 case NVPTXISD::LoadV2:
1204 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001205 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001206 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001207 case MVT::i8:
1208 Opcode = NVPTX::LDV_i8_v2_areg_64;
1209 break;
1210 case MVT::i16:
1211 Opcode = NVPTX::LDV_i16_v2_areg_64;
1212 break;
1213 case MVT::i32:
1214 Opcode = NVPTX::LDV_i32_v2_areg_64;
1215 break;
1216 case MVT::i64:
1217 Opcode = NVPTX::LDV_i64_v2_areg_64;
1218 break;
1219 case MVT::f32:
1220 Opcode = NVPTX::LDV_f32_v2_areg_64;
1221 break;
1222 case MVT::f64:
1223 Opcode = NVPTX::LDV_f64_v2_areg_64;
1224 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001225 }
1226 break;
1227 case NVPTXISD::LoadV4:
1228 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001229 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001230 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001231 case MVT::i8:
1232 Opcode = NVPTX::LDV_i8_v4_areg_64;
1233 break;
1234 case MVT::i16:
1235 Opcode = NVPTX::LDV_i16_v4_areg_64;
1236 break;
1237 case MVT::i32:
1238 Opcode = NVPTX::LDV_i32_v4_areg_64;
1239 break;
1240 case MVT::f32:
1241 Opcode = NVPTX::LDV_f32_v4_areg_64;
1242 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001243 }
1244 break;
1245 }
1246 } else {
1247 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001248 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001249 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001250 case NVPTXISD::LoadV2:
1251 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001252 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001253 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001254 case MVT::i8:
1255 Opcode = NVPTX::LDV_i8_v2_areg;
1256 break;
1257 case MVT::i16:
1258 Opcode = NVPTX::LDV_i16_v2_areg;
1259 break;
1260 case MVT::i32:
1261 Opcode = NVPTX::LDV_i32_v2_areg;
1262 break;
1263 case MVT::i64:
1264 Opcode = NVPTX::LDV_i64_v2_areg;
1265 break;
1266 case MVT::f32:
1267 Opcode = NVPTX::LDV_f32_v2_areg;
1268 break;
1269 case MVT::f64:
1270 Opcode = NVPTX::LDV_f64_v2_areg;
1271 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001272 }
1273 break;
1274 case NVPTXISD::LoadV4:
1275 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001276 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001277 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001278 case MVT::i8:
1279 Opcode = NVPTX::LDV_i8_v4_areg;
1280 break;
1281 case MVT::i16:
1282 Opcode = NVPTX::LDV_i16_v4_areg;
1283 break;
1284 case MVT::i32:
1285 Opcode = NVPTX::LDV_i32_v4_areg;
1286 break;
1287 case MVT::f32:
1288 Opcode = NVPTX::LDV_f32_v4_areg;
1289 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001290 }
1291 break;
1292 }
1293 }
1294
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00001295 SDValue Ops[] = { getI32Imm(IsVolatile, DL), getI32Imm(CodeAddrSpace, DL),
1296 getI32Imm(VecType, DL), getI32Imm(FromType, DL),
1297 getI32Imm(FromTypeWidth, DL), Op1, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00001298 LD = CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001299 }
1300
1301 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
1302 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
1303 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1304
Justin Bogner8d83fb62016-05-13 21:12:53 +00001305 ReplaceNode(N, LD);
1306 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001307}
1308
Justin Bogner8d83fb62016-05-13 21:12:53 +00001309bool NVPTXDAGToDAGISel::tryLDGLDU(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001310
1311 SDValue Chain = N->getOperand(0);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001312 SDValue Op1;
1313 MemSDNode *Mem;
1314 bool IsLDG = true;
1315
Justin Holewinskic7997922016-04-05 12:38:01 +00001316 // If this is an LDG intrinsic, the address is the third operand. If its an
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001317 // LDG/LDU SD node (from custom vector handling), then its the second operand
1318 if (N->getOpcode() == ISD::INTRINSIC_W_CHAIN) {
1319 Op1 = N->getOperand(2);
1320 Mem = cast<MemIntrinsicSDNode>(N);
1321 unsigned IID = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
1322 switch (IID) {
1323 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001324 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001325 case Intrinsic::nvvm_ldg_global_f:
1326 case Intrinsic::nvvm_ldg_global_i:
1327 case Intrinsic::nvvm_ldg_global_p:
1328 IsLDG = true;
1329 break;
1330 case Intrinsic::nvvm_ldu_global_f:
1331 case Intrinsic::nvvm_ldu_global_i:
1332 case Intrinsic::nvvm_ldu_global_p:
1333 IsLDG = false;
1334 break;
1335 }
1336 } else {
1337 Op1 = N->getOperand(1);
1338 Mem = cast<MemSDNode>(N);
1339 }
1340
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001341 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00001342 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001343 SDNode *LD;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001344 SDValue Base, Offset, Addr;
Justin Holewinskif8f70912013-06-28 17:57:59 +00001345
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001346 EVT EltVT = Mem->getMemoryVT();
Justin Holewinskic7997922016-04-05 12:38:01 +00001347 unsigned NumElts = 1;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001348 if (EltVT.isVector()) {
Justin Holewinskic7997922016-04-05 12:38:01 +00001349 NumElts = EltVT.getVectorNumElements();
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001350 EltVT = EltVT.getVectorElementType();
1351 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001352
Justin Holewinskic7997922016-04-05 12:38:01 +00001353 // Build the "promoted" result VTList for the load. If we are really loading
1354 // i8s, then the return type will be promoted to i16 since we do not expose
1355 // 8-bit registers in NVPTX.
1356 EVT NodeVT = (EltVT == MVT::i8) ? MVT::i16 : EltVT;
1357 SmallVector<EVT, 5> InstVTs;
1358 for (unsigned i = 0; i != NumElts; ++i) {
1359 InstVTs.push_back(NodeVT);
1360 }
1361 InstVTs.push_back(MVT::Other);
1362 SDVTList InstVTList = CurDAG->getVTList(InstVTs);
1363
Justin Holewinskie40e9292013-07-01 12:58:52 +00001364 if (SelectDirectAddr(Op1, Addr)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001365 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001366 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001367 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001368 case ISD::INTRINSIC_W_CHAIN:
1369 if (IsLDG) {
1370 switch (EltVT.getSimpleVT().SimpleTy) {
1371 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001372 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001373 case MVT::i8:
1374 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8avar;
1375 break;
1376 case MVT::i16:
1377 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16avar;
1378 break;
1379 case MVT::i32:
1380 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32avar;
1381 break;
1382 case MVT::i64:
1383 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64avar;
1384 break;
1385 case MVT::f32:
1386 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32avar;
1387 break;
1388 case MVT::f64:
1389 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64avar;
1390 break;
1391 }
1392 } else {
1393 switch (EltVT.getSimpleVT().SimpleTy) {
1394 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001395 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001396 case MVT::i8:
1397 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8avar;
1398 break;
1399 case MVT::i16:
1400 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16avar;
1401 break;
1402 case MVT::i32:
1403 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32avar;
1404 break;
1405 case MVT::i64:
1406 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64avar;
1407 break;
1408 case MVT::f32:
1409 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32avar;
1410 break;
1411 case MVT::f64:
1412 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64avar;
1413 break;
1414 }
1415 }
1416 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001417 case NVPTXISD::LDGV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001418 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001419 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001420 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001421 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001422 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001423 break;
1424 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001425 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001426 break;
1427 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001428 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001429 break;
1430 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001431 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001432 break;
1433 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001434 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001435 break;
1436 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001437 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001438 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001439 }
1440 break;
1441 case NVPTXISD::LDUV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001442 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001443 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001444 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001445 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001446 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001447 break;
1448 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001449 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001450 break;
1451 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001452 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001453 break;
1454 case MVT::i64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001455 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001456 break;
1457 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001458 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001459 break;
1460 case MVT::f64:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001461 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
1462 break;
1463 }
1464 break;
1465 case NVPTXISD::LDGV4:
1466 switch (EltVT.getSimpleVT().SimpleTy) {
1467 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001468 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001469 case MVT::i8:
1470 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
1471 break;
1472 case MVT::i16:
1473 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
1474 break;
1475 case MVT::i32:
1476 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
1477 break;
1478 case MVT::f32:
1479 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001480 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001481 }
1482 break;
1483 case NVPTXISD::LDUV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001484 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001485 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001486 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001487 case MVT::i8:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001488 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001489 break;
1490 case MVT::i16:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001491 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001492 break;
1493 case MVT::i32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001494 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001495 break;
1496 case MVT::f32:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001497 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
Justin Holewinski0497ab12013-03-30 14:29:21 +00001498 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001499 }
1500 break;
1501 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001502
1503 SDValue Ops[] = { Addr, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00001504 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00001505 } else if (TM.is64Bit() ? SelectADDRri64(Op1.getNode(), Op1, Base, Offset)
1506 : SelectADDRri(Op1.getNode(), Op1, Base, Offset)) {
1507 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001508 switch (N->getOpcode()) {
1509 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001510 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001511 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001512 case ISD::INTRINSIC_W_CHAIN:
1513 if (IsLDG) {
1514 switch (EltVT.getSimpleVT().SimpleTy) {
1515 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001516 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001517 case MVT::i8:
1518 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari64;
1519 break;
1520 case MVT::i16:
1521 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari64;
1522 break;
1523 case MVT::i32:
1524 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari64;
1525 break;
1526 case MVT::i64:
1527 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari64;
1528 break;
1529 case MVT::f32:
1530 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari64;
1531 break;
1532 case MVT::f64:
1533 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari64;
1534 break;
1535 }
1536 } else {
1537 switch (EltVT.getSimpleVT().SimpleTy) {
1538 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001539 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001540 case MVT::i8:
1541 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari64;
1542 break;
1543 case MVT::i16:
1544 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari64;
1545 break;
1546 case MVT::i32:
1547 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari64;
1548 break;
1549 case MVT::i64:
1550 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari64;
1551 break;
1552 case MVT::f32:
1553 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari64;
1554 break;
1555 case MVT::f64:
1556 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari64;
1557 break;
1558 }
1559 }
1560 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001561 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001562 case NVPTXISD::LDGV2:
1563 switch (EltVT.getSimpleVT().SimpleTy) {
1564 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001565 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001566 case MVT::i8:
1567 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
1568 break;
1569 case MVT::i16:
1570 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
1571 break;
1572 case MVT::i32:
1573 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
1574 break;
1575 case MVT::i64:
1576 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
1577 break;
1578 case MVT::f32:
1579 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
1580 break;
1581 case MVT::f64:
1582 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
1583 break;
1584 }
1585 break;
1586 case NVPTXISD::LDUV2:
1587 switch (EltVT.getSimpleVT().SimpleTy) {
1588 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001589 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001590 case MVT::i8:
1591 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
1592 break;
1593 case MVT::i16:
1594 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
1595 break;
1596 case MVT::i32:
1597 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
1598 break;
1599 case MVT::i64:
1600 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
1601 break;
1602 case MVT::f32:
1603 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
1604 break;
1605 case MVT::f64:
1606 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
1607 break;
1608 }
1609 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001610 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001611 case NVPTXISD::LDGV4:
1612 switch (EltVT.getSimpleVT().SimpleTy) {
1613 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001614 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001615 case MVT::i8:
1616 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
1617 break;
1618 case MVT::i16:
1619 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
1620 break;
1621 case MVT::i32:
1622 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
1623 break;
1624 case MVT::f32:
1625 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
1626 break;
1627 }
1628 break;
1629 case NVPTXISD::LDUV4:
1630 switch (EltVT.getSimpleVT().SimpleTy) {
1631 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001632 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001633 case MVT::i8:
1634 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
1635 break;
1636 case MVT::i16:
1637 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
1638 break;
1639 case MVT::i32:
1640 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1641 break;
1642 case MVT::f32:
1643 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1644 break;
1645 }
1646 break;
1647 }
1648 } else {
1649 switch (N->getOpcode()) {
1650 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001651 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001652 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001653 case ISD::INTRINSIC_W_CHAIN:
1654 if (IsLDG) {
1655 switch (EltVT.getSimpleVT().SimpleTy) {
1656 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001657 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001658 case MVT::i8:
1659 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8ari;
1660 break;
1661 case MVT::i16:
1662 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16ari;
1663 break;
1664 case MVT::i32:
1665 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32ari;
1666 break;
1667 case MVT::i64:
1668 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64ari;
1669 break;
1670 case MVT::f32:
1671 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32ari;
1672 break;
1673 case MVT::f64:
1674 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64ari;
1675 break;
1676 }
1677 } else {
1678 switch (EltVT.getSimpleVT().SimpleTy) {
1679 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001680 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001681 case MVT::i8:
1682 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8ari;
1683 break;
1684 case MVT::i16:
1685 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16ari;
1686 break;
1687 case MVT::i32:
1688 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32ari;
1689 break;
1690 case MVT::i64:
1691 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64ari;
1692 break;
1693 case MVT::f32:
1694 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32ari;
1695 break;
1696 case MVT::f64:
1697 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64ari;
1698 break;
1699 }
1700 }
1701 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001702 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001703 case NVPTXISD::LDGV2:
1704 switch (EltVT.getSimpleVT().SimpleTy) {
1705 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001706 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001707 case MVT::i8:
1708 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1709 break;
1710 case MVT::i16:
1711 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1712 break;
1713 case MVT::i32:
1714 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1715 break;
1716 case MVT::i64:
1717 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1718 break;
1719 case MVT::f32:
1720 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1721 break;
1722 case MVT::f64:
1723 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1724 break;
1725 }
1726 break;
1727 case NVPTXISD::LDUV2:
1728 switch (EltVT.getSimpleVT().SimpleTy) {
1729 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001730 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001731 case MVT::i8:
1732 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1733 break;
1734 case MVT::i16:
1735 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1736 break;
1737 case MVT::i32:
1738 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1739 break;
1740 case MVT::i64:
1741 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1742 break;
1743 case MVT::f32:
1744 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1745 break;
1746 case MVT::f64:
1747 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1748 break;
1749 }
1750 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001751 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001752 case NVPTXISD::LDGV4:
1753 switch (EltVT.getSimpleVT().SimpleTy) {
1754 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001755 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001756 case MVT::i8:
1757 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1758 break;
1759 case MVT::i16:
1760 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1761 break;
1762 case MVT::i32:
1763 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1764 break;
1765 case MVT::f32:
1766 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1767 break;
1768 }
1769 break;
1770 case NVPTXISD::LDUV4:
1771 switch (EltVT.getSimpleVT().SimpleTy) {
1772 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001773 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001774 case MVT::i8:
1775 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1776 break;
1777 case MVT::i16:
1778 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1779 break;
1780 case MVT::i32:
1781 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1782 break;
1783 case MVT::f32:
1784 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1785 break;
1786 }
1787 break;
1788 }
1789 }
1790
1791 SDValue Ops[] = { Base, Offset, Chain };
1792
Justin Holewinskic7997922016-04-05 12:38:01 +00001793 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001794 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00001795 if (TM.is64Bit()) {
Justin Holewinskie40e9292013-07-01 12:58:52 +00001796 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001797 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001798 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001799 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001800 case ISD::INTRINSIC_W_CHAIN:
1801 if (IsLDG) {
1802 switch (EltVT.getSimpleVT().SimpleTy) {
1803 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001804 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001805 case MVT::i8:
1806 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg64;
1807 break;
1808 case MVT::i16:
1809 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg64;
1810 break;
1811 case MVT::i32:
1812 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg64;
1813 break;
1814 case MVT::i64:
1815 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg64;
1816 break;
1817 case MVT::f32:
1818 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg64;
1819 break;
1820 case MVT::f64:
1821 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg64;
1822 break;
1823 }
1824 } else {
1825 switch (EltVT.getSimpleVT().SimpleTy) {
1826 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001827 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001828 case MVT::i8:
1829 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg64;
1830 break;
1831 case MVT::i16:
1832 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg64;
1833 break;
1834 case MVT::i32:
1835 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg64;
1836 break;
1837 case MVT::i64:
1838 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg64;
1839 break;
1840 case MVT::f32:
1841 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg64;
1842 break;
1843 case MVT::f64:
1844 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg64;
1845 break;
1846 }
1847 }
1848 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001849 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001850 case NVPTXISD::LDGV2:
1851 switch (EltVT.getSimpleVT().SimpleTy) {
1852 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001853 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001854 case MVT::i8:
1855 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1856 break;
1857 case MVT::i16:
1858 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1859 break;
1860 case MVT::i32:
1861 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1862 break;
1863 case MVT::i64:
1864 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1865 break;
1866 case MVT::f32:
1867 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1868 break;
1869 case MVT::f64:
1870 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1871 break;
1872 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001873 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001874 case NVPTXISD::LDUV2:
1875 switch (EltVT.getSimpleVT().SimpleTy) {
1876 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001877 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001878 case MVT::i8:
1879 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1880 break;
1881 case MVT::i16:
1882 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1883 break;
1884 case MVT::i32:
1885 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1886 break;
1887 case MVT::i64:
1888 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1889 break;
1890 case MVT::f32:
1891 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1892 break;
1893 case MVT::f64:
1894 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1895 break;
1896 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001897 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001898 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001899 case NVPTXISD::LDGV4:
1900 switch (EltVT.getSimpleVT().SimpleTy) {
1901 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001902 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001903 case MVT::i8:
1904 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1905 break;
1906 case MVT::i16:
1907 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1908 break;
1909 case MVT::i32:
1910 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1911 break;
1912 case MVT::f32:
1913 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1914 break;
1915 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001916 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001917 case NVPTXISD::LDUV4:
1918 switch (EltVT.getSimpleVT().SimpleTy) {
1919 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001920 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001921 case MVT::i8:
1922 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1923 break;
1924 case MVT::i16:
1925 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1926 break;
1927 case MVT::i32:
1928 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1929 break;
1930 case MVT::f32:
1931 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1932 break;
1933 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00001934 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00001935 }
Justin Holewinskie40e9292013-07-01 12:58:52 +00001936 } else {
1937 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00001938 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001939 return false;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001940 case ISD::LOAD:
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001941 case ISD::INTRINSIC_W_CHAIN:
1942 if (IsLDG) {
1943 switch (EltVT.getSimpleVT().SimpleTy) {
1944 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001945 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001946 case MVT::i8:
1947 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i8areg;
1948 break;
1949 case MVT::i16:
1950 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i16areg;
1951 break;
1952 case MVT::i32:
1953 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i32areg;
1954 break;
1955 case MVT::i64:
1956 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_i64areg;
1957 break;
1958 case MVT::f32:
1959 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f32areg;
1960 break;
1961 case MVT::f64:
1962 Opcode = NVPTX::INT_PTX_LDG_GLOBAL_f64areg;
1963 break;
1964 }
1965 } else {
1966 switch (EltVT.getSimpleVT().SimpleTy) {
1967 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001968 return false;
Justin Holewinskib926d9d2014-06-27 18:35:51 +00001969 case MVT::i8:
1970 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i8areg;
1971 break;
1972 case MVT::i16:
1973 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i16areg;
1974 break;
1975 case MVT::i32:
1976 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i32areg;
1977 break;
1978 case MVT::i64:
1979 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_i64areg;
1980 break;
1981 case MVT::f32:
1982 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f32areg;
1983 break;
1984 case MVT::f64:
1985 Opcode = NVPTX::INT_PTX_LDU_GLOBAL_f64areg;
1986 break;
1987 }
1988 }
1989 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00001990 case NVPTXISD::LoadV2:
Justin Holewinskie40e9292013-07-01 12:58:52 +00001991 case NVPTXISD::LDGV2:
1992 switch (EltVT.getSimpleVT().SimpleTy) {
1993 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00001994 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00001995 case MVT::i8:
1996 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
1997 break;
1998 case MVT::i16:
1999 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
2000 break;
2001 case MVT::i32:
2002 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
2003 break;
2004 case MVT::i64:
2005 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
2006 break;
2007 case MVT::f32:
2008 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
2009 break;
2010 case MVT::f64:
2011 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
2012 break;
2013 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002014 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002015 case NVPTXISD::LDUV2:
2016 switch (EltVT.getSimpleVT().SimpleTy) {
2017 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002018 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002019 case MVT::i8:
2020 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
2021 break;
2022 case MVT::i16:
2023 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
2024 break;
2025 case MVT::i32:
2026 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
2027 break;
2028 case MVT::i64:
2029 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
2030 break;
2031 case MVT::f32:
2032 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
2033 break;
2034 case MVT::f64:
2035 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
2036 break;
2037 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002038 break;
Jingyue Wu48a9bdc2015-07-20 21:28:54 +00002039 case NVPTXISD::LoadV4:
Justin Holewinskie40e9292013-07-01 12:58:52 +00002040 case NVPTXISD::LDGV4:
2041 switch (EltVT.getSimpleVT().SimpleTy) {
2042 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002043 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002044 case MVT::i8:
2045 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
2046 break;
2047 case MVT::i16:
2048 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
2049 break;
2050 case MVT::i32:
2051 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
2052 break;
2053 case MVT::f32:
2054 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
2055 break;
2056 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002057 break;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002058 case NVPTXISD::LDUV4:
2059 switch (EltVT.getSimpleVT().SimpleTy) {
2060 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002061 return false;
Justin Holewinskie40e9292013-07-01 12:58:52 +00002062 case MVT::i8:
2063 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
2064 break;
2065 case MVT::i16:
2066 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
2067 break;
2068 case MVT::i32:
2069 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
2070 break;
2071 case MVT::f32:
2072 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
2073 break;
2074 }
Justin Holewinski0497ab12013-03-30 14:29:21 +00002075 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002076 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002077 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002078
Justin Holewinskie40e9292013-07-01 12:58:52 +00002079 SDValue Ops[] = { Op1, Chain };
Justin Holewinskic7997922016-04-05 12:38:01 +00002080 LD = CurDAG->getMachineNode(Opcode, DL, InstVTList, Ops);
Justin Holewinskie40e9292013-07-01 12:58:52 +00002081 }
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002082
2083 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
Justin Holewinskib926d9d2014-06-27 18:35:51 +00002084 MemRefs0[0] = Mem->getMemOperand();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002085 cast<MachineSDNode>(LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
2086
Justin Holewinskic7997922016-04-05 12:38:01 +00002087 // For automatic generation of LDG (through SelectLoad[Vector], not the
2088 // intrinsics), we may have an extending load like:
2089 //
2090 // i32,ch = load<LD1[%data1(addrspace=1)], zext from i8> t0, t7, undef:i64
2091 //
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002092 // In this case, the matching logic above will select a load for the original
2093 // memory type (in this case, i8) and our types will not match (the node needs
2094 // to return an i32 in this case). Our LDG/LDU nodes do not support the
2095 // concept of sign-/zero-extension, so emulate it here by adding an explicit
2096 // CVT instruction. Ptxas should clean up any redundancies here.
2097
Justin Holewinskic7997922016-04-05 12:38:01 +00002098 EVT OrigType = N->getValueType(0);
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002099 LoadSDNode *LdNode = dyn_cast<LoadSDNode>(N);
Justin Holewinskic7997922016-04-05 12:38:01 +00002100
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002101 if (OrigType != EltVT && LdNode) {
2102 // We have an extending-load. The instruction we selected operates on the
2103 // smaller type, but the SDNode we are replacing has the larger type. We
2104 // need to emit a CVT to make the types match.
2105 bool IsSigned = LdNode->getExtensionType() == ISD::SEXTLOAD;
2106 unsigned CvtOpc = GetConvertOpcode(OrigType.getSimpleVT(),
2107 EltVT.getSimpleVT(), IsSigned);
Justin Holewinskic7997922016-04-05 12:38:01 +00002108
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002109 // For each output value, apply the manual sign/zero-extension and make sure
2110 // all users of the load go through that CVT.
Justin Holewinskic7997922016-04-05 12:38:01 +00002111 for (unsigned i = 0; i != NumElts; ++i) {
2112 SDValue Res(LD, i);
2113 SDValue OrigVal(N, i);
2114
2115 SDNode *CvtNode =
2116 CurDAG->getMachineNode(CvtOpc, DL, OrigType, Res,
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00002117 CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
2118 DL, MVT::i32));
Justin Holewinskic7997922016-04-05 12:38:01 +00002119 ReplaceUses(OrigVal, SDValue(CvtNode, 0));
2120 }
2121 }
2122
Justin Bogner8d83fb62016-05-13 21:12:53 +00002123 ReplaceNode(N, LD);
2124 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002125}
2126
Justin Bogner8d83fb62016-05-13 21:12:53 +00002127bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
Andrew Trickef9de2a2013-05-25 02:42:55 +00002128 SDLoc dl(N);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002129 StoreSDNode *ST = cast<StoreSDNode>(N);
2130 EVT StoreVT = ST->getMemoryVT();
Craig Topper062a2ba2014-04-25 05:30:21 +00002131 SDNode *NVPTXST = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002132
2133 // do not support pre/post inc/dec
2134 if (ST->isIndexed())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002135 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002136
2137 if (!StoreVT.isSimple())
Justin Bogner8d83fb62016-05-13 21:12:53 +00002138 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002139
2140 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002141 unsigned int codeAddrSpace = getCodeAddrSpace(ST);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002142
2143 // Volatile Setting
2144 // - .volatile is only availalble for .global and .shared
2145 bool isVolatile = ST->isVolatile();
2146 if (codeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2147 codeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2148 codeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2149 isVolatile = false;
2150
2151 // Vector Setting
2152 MVT SimpleVT = StoreVT.getSimpleVT();
2153 unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
2154 if (SimpleVT.isVector()) {
2155 unsigned num = SimpleVT.getVectorNumElements();
2156 if (num == 2)
2157 vecType = NVPTX::PTXLdStInstCode::V2;
2158 else if (num == 4)
2159 vecType = NVPTX::PTXLdStInstCode::V4;
2160 else
Justin Bogner8d83fb62016-05-13 21:12:53 +00002161 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002162 }
2163
2164 // Type Setting: toType + toTypeWidth
2165 // - for integer type, always use 'u'
2166 //
2167 MVT ScalarVT = SimpleVT.getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002168 unsigned toTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskiae556d32012-05-04 20:18:50 +00002169 unsigned int toType;
2170 if (ScalarVT.isFloatingPoint())
Artem Belevich64dc9be2017-01-13 20:56:17 +00002171 // f16 uses .b16 as its storage type.
2172 toType = ScalarVT.SimpleTy == MVT::f16 ? NVPTX::PTXLdStInstCode::Untyped
2173 : NVPTX::PTXLdStInstCode::Float;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002174 else
2175 toType = NVPTX::PTXLdStInstCode::Unsigned;
2176
2177 // Create the machine instruction DAG
2178 SDValue Chain = N->getOperand(0);
2179 SDValue N1 = N->getOperand(1);
2180 SDValue N2 = N->getOperand(2);
2181 SDValue Addr;
2182 SDValue Offset, Base;
2183 unsigned Opcode;
Craig Topperd9c27832013-08-15 02:44:19 +00002184 MVT::SimpleValueType SourceVT = N1.getNode()->getSimpleValueType(0).SimpleTy;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002185
2186 if (SelectDirectAddr(N2, Addr)) {
2187 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002188 case MVT::i8:
2189 Opcode = NVPTX::ST_i8_avar;
2190 break;
2191 case MVT::i16:
2192 Opcode = NVPTX::ST_i16_avar;
2193 break;
2194 case MVT::i32:
2195 Opcode = NVPTX::ST_i32_avar;
2196 break;
2197 case MVT::i64:
2198 Opcode = NVPTX::ST_i64_avar;
2199 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002200 case MVT::f16:
2201 Opcode = NVPTX::ST_f16_avar;
2202 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002203 case MVT::f32:
2204 Opcode = NVPTX::ST_f32_avar;
2205 break;
2206 case MVT::f64:
2207 Opcode = NVPTX::ST_f64_avar;
2208 break;
2209 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002210 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002211 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002212 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2213 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2214 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Addr,
2215 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002216 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002217 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2218 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00002219 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002220 case MVT::i8:
2221 Opcode = NVPTX::ST_i8_asi;
2222 break;
2223 case MVT::i16:
2224 Opcode = NVPTX::ST_i16_asi;
2225 break;
2226 case MVT::i32:
2227 Opcode = NVPTX::ST_i32_asi;
2228 break;
2229 case MVT::i64:
2230 Opcode = NVPTX::ST_i64_asi;
2231 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002232 case MVT::f16:
2233 Opcode = NVPTX::ST_f16_asi;
2234 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002235 case MVT::f32:
2236 Opcode = NVPTX::ST_f32_asi;
2237 break;
2238 case MVT::f64:
2239 Opcode = NVPTX::ST_f64_asi;
2240 break;
2241 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002242 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002243 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002244 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2245 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2246 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2247 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002248 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Eric Christopher02389e32015-02-19 00:08:27 +00002249 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2250 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2251 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002252 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002253 case MVT::i8:
2254 Opcode = NVPTX::ST_i8_ari_64;
2255 break;
2256 case MVT::i16:
2257 Opcode = NVPTX::ST_i16_ari_64;
2258 break;
2259 case MVT::i32:
2260 Opcode = NVPTX::ST_i32_ari_64;
2261 break;
2262 case MVT::i64:
2263 Opcode = NVPTX::ST_i64_ari_64;
2264 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002265 case MVT::f16:
2266 Opcode = NVPTX::ST_f16_ari_64;
2267 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002268 case MVT::f32:
2269 Opcode = NVPTX::ST_f32_ari_64;
2270 break;
2271 case MVT::f64:
2272 Opcode = NVPTX::ST_f64_ari_64;
2273 break;
2274 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002275 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002276 }
2277 } else {
2278 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002279 case MVT::i8:
2280 Opcode = NVPTX::ST_i8_ari;
2281 break;
2282 case MVT::i16:
2283 Opcode = NVPTX::ST_i16_ari;
2284 break;
2285 case MVT::i32:
2286 Opcode = NVPTX::ST_i32_ari;
2287 break;
2288 case MVT::i64:
2289 Opcode = NVPTX::ST_i64_ari;
2290 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002291 case MVT::f16:
2292 Opcode = NVPTX::ST_f16_ari;
2293 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002294 case MVT::f32:
2295 Opcode = NVPTX::ST_f32_ari;
2296 break;
2297 case MVT::f64:
2298 Opcode = NVPTX::ST_f64_ari;
2299 break;
2300 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002301 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002302 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002303 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002304 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2305 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2306 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), Base,
2307 Offset, Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002308 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002309 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002310 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002311 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002312 case MVT::i8:
2313 Opcode = NVPTX::ST_i8_areg_64;
2314 break;
2315 case MVT::i16:
2316 Opcode = NVPTX::ST_i16_areg_64;
2317 break;
2318 case MVT::i32:
2319 Opcode = NVPTX::ST_i32_areg_64;
2320 break;
2321 case MVT::i64:
2322 Opcode = NVPTX::ST_i64_areg_64;
2323 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002324 case MVT::f16:
2325 Opcode = NVPTX::ST_f16_areg_64;
2326 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002327 case MVT::f32:
2328 Opcode = NVPTX::ST_f32_areg_64;
2329 break;
2330 case MVT::f64:
2331 Opcode = NVPTX::ST_f64_areg_64;
2332 break;
2333 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002334 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002335 }
2336 } else {
2337 switch (SourceVT) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002338 case MVT::i8:
2339 Opcode = NVPTX::ST_i8_areg;
2340 break;
2341 case MVT::i16:
2342 Opcode = NVPTX::ST_i16_areg;
2343 break;
2344 case MVT::i32:
2345 Opcode = NVPTX::ST_i32_areg;
2346 break;
2347 case MVT::i64:
2348 Opcode = NVPTX::ST_i64_areg;
2349 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002350 case MVT::f16:
2351 Opcode = NVPTX::ST_f16_areg;
2352 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002353 case MVT::f32:
2354 Opcode = NVPTX::ST_f32_areg;
2355 break;
2356 case MVT::f64:
2357 Opcode = NVPTX::ST_f64_areg;
2358 break;
2359 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002360 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002361 }
Justin Holewinskiae556d32012-05-04 20:18:50 +00002362 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002363 SDValue Ops[] = { N1, getI32Imm(isVolatile, dl),
2364 getI32Imm(codeAddrSpace, dl), getI32Imm(vecType, dl),
2365 getI32Imm(toType, dl), getI32Imm(toTypeWidth, dl), N2,
2366 Chain };
Michael Liaob53d8962013-04-19 22:22:57 +00002367 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
Justin Holewinskiae556d32012-05-04 20:18:50 +00002368 }
2369
Justin Bogner8d83fb62016-05-13 21:12:53 +00002370 if (!NVPTXST)
2371 return false;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002372
Justin Bogner8d83fb62016-05-13 21:12:53 +00002373 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2374 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2375 cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2376 ReplaceNode(N, NVPTXST);
2377 return true;
Justin Holewinskiae556d32012-05-04 20:18:50 +00002378}
2379
Justin Bogner8d83fb62016-05-13 21:12:53 +00002380bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002381 SDValue Chain = N->getOperand(0);
2382 SDValue Op1 = N->getOperand(1);
2383 SDValue Addr, Offset, Base;
2384 unsigned Opcode;
Andrew Trickef9de2a2013-05-25 02:42:55 +00002385 SDLoc DL(N);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002386 SDNode *ST;
2387 EVT EltVT = Op1.getValueType();
2388 MemSDNode *MemSD = cast<MemSDNode>(N);
2389 EVT StoreVT = MemSD->getMemoryVT();
2390
2391 // Address Space Setting
Eric Christopher9745b3a2015-01-30 01:41:01 +00002392 unsigned CodeAddrSpace = getCodeAddrSpace(MemSD);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002393
2394 if (CodeAddrSpace == NVPTX::PTXLdStInstCode::CONSTANT) {
2395 report_fatal_error("Cannot store to pointer that points to constant "
2396 "memory space");
2397 }
2398
2399 // Volatile Setting
2400 // - .volatile is only availalble for .global and .shared
2401 bool IsVolatile = MemSD->isVolatile();
2402 if (CodeAddrSpace != NVPTX::PTXLdStInstCode::GLOBAL &&
2403 CodeAddrSpace != NVPTX::PTXLdStInstCode::SHARED &&
2404 CodeAddrSpace != NVPTX::PTXLdStInstCode::GENERIC)
2405 IsVolatile = false;
2406
2407 // Type Setting: toType + toTypeWidth
2408 // - for integer type, always use 'u'
2409 assert(StoreVT.isSimple() && "Store value is not simple");
2410 MVT ScalarVT = StoreVT.getSimpleVT().getScalarType();
Justin Holewinski0497ab12013-03-30 14:29:21 +00002411 unsigned ToTypeWidth = ScalarVT.getSizeInBits();
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002412 unsigned ToType;
2413 if (ScalarVT.isFloatingPoint())
2414 ToType = NVPTX::PTXLdStInstCode::Float;
2415 else
2416 ToType = NVPTX::PTXLdStInstCode::Unsigned;
2417
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002418 SmallVector<SDValue, 12> StOps;
2419 SDValue N2;
2420 unsigned VecType;
2421
2422 switch (N->getOpcode()) {
2423 case NVPTXISD::StoreV2:
2424 VecType = NVPTX::PTXLdStInstCode::V2;
2425 StOps.push_back(N->getOperand(1));
2426 StOps.push_back(N->getOperand(2));
2427 N2 = N->getOperand(3);
2428 break;
2429 case NVPTXISD::StoreV4:
2430 VecType = NVPTX::PTXLdStInstCode::V4;
2431 StOps.push_back(N->getOperand(1));
2432 StOps.push_back(N->getOperand(2));
2433 StOps.push_back(N->getOperand(3));
2434 StOps.push_back(N->getOperand(4));
2435 N2 = N->getOperand(5);
2436 break;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002437 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002438 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002439 }
2440
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002441 StOps.push_back(getI32Imm(IsVolatile, DL));
2442 StOps.push_back(getI32Imm(CodeAddrSpace, DL));
2443 StOps.push_back(getI32Imm(VecType, DL));
2444 StOps.push_back(getI32Imm(ToType, DL));
2445 StOps.push_back(getI32Imm(ToTypeWidth, DL));
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002446
2447 if (SelectDirectAddr(N2, Addr)) {
2448 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002449 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002450 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002451 case NVPTXISD::StoreV2:
2452 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002453 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002454 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002455 case MVT::i8:
2456 Opcode = NVPTX::STV_i8_v2_avar;
2457 break;
2458 case MVT::i16:
2459 Opcode = NVPTX::STV_i16_v2_avar;
2460 break;
2461 case MVT::i32:
2462 Opcode = NVPTX::STV_i32_v2_avar;
2463 break;
2464 case MVT::i64:
2465 Opcode = NVPTX::STV_i64_v2_avar;
2466 break;
2467 case MVT::f32:
2468 Opcode = NVPTX::STV_f32_v2_avar;
2469 break;
2470 case MVT::f64:
2471 Opcode = NVPTX::STV_f64_v2_avar;
2472 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002473 }
2474 break;
2475 case NVPTXISD::StoreV4:
2476 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002477 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002478 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002479 case MVT::i8:
2480 Opcode = NVPTX::STV_i8_v4_avar;
2481 break;
2482 case MVT::i16:
2483 Opcode = NVPTX::STV_i16_v4_avar;
2484 break;
2485 case MVT::i32:
2486 Opcode = NVPTX::STV_i32_v4_avar;
2487 break;
2488 case MVT::f32:
2489 Opcode = NVPTX::STV_f32_v4_avar;
2490 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002491 }
2492 break;
2493 }
2494 StOps.push_back(Addr);
Eric Christopher02389e32015-02-19 00:08:27 +00002495 } else if (TM.is64Bit() ? SelectADDRsi64(N2.getNode(), N2, Base, Offset)
2496 : SelectADDRsi(N2.getNode(), N2, Base, Offset)) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002497 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002498 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002499 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002500 case NVPTXISD::StoreV2:
2501 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002502 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002503 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002504 case MVT::i8:
2505 Opcode = NVPTX::STV_i8_v2_asi;
2506 break;
2507 case MVT::i16:
2508 Opcode = NVPTX::STV_i16_v2_asi;
2509 break;
2510 case MVT::i32:
2511 Opcode = NVPTX::STV_i32_v2_asi;
2512 break;
2513 case MVT::i64:
2514 Opcode = NVPTX::STV_i64_v2_asi;
2515 break;
2516 case MVT::f32:
2517 Opcode = NVPTX::STV_f32_v2_asi;
2518 break;
2519 case MVT::f64:
2520 Opcode = NVPTX::STV_f64_v2_asi;
2521 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002522 }
2523 break;
2524 case NVPTXISD::StoreV4:
2525 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002526 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002527 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002528 case MVT::i8:
2529 Opcode = NVPTX::STV_i8_v4_asi;
2530 break;
2531 case MVT::i16:
2532 Opcode = NVPTX::STV_i16_v4_asi;
2533 break;
2534 case MVT::i32:
2535 Opcode = NVPTX::STV_i32_v4_asi;
2536 break;
2537 case MVT::f32:
2538 Opcode = NVPTX::STV_f32_v4_asi;
2539 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002540 }
2541 break;
2542 }
2543 StOps.push_back(Base);
2544 StOps.push_back(Offset);
Eric Christopher02389e32015-02-19 00:08:27 +00002545 } else if (TM.is64Bit() ? SelectADDRri64(N2.getNode(), N2, Base, Offset)
2546 : SelectADDRri(N2.getNode(), N2, Base, Offset)) {
2547 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002548 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002549 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002550 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002551 case NVPTXISD::StoreV2:
2552 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002553 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002554 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002555 case MVT::i8:
2556 Opcode = NVPTX::STV_i8_v2_ari_64;
2557 break;
2558 case MVT::i16:
2559 Opcode = NVPTX::STV_i16_v2_ari_64;
2560 break;
2561 case MVT::i32:
2562 Opcode = NVPTX::STV_i32_v2_ari_64;
2563 break;
2564 case MVT::i64:
2565 Opcode = NVPTX::STV_i64_v2_ari_64;
2566 break;
2567 case MVT::f32:
2568 Opcode = NVPTX::STV_f32_v2_ari_64;
2569 break;
2570 case MVT::f64:
2571 Opcode = NVPTX::STV_f64_v2_ari_64;
2572 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002573 }
2574 break;
2575 case NVPTXISD::StoreV4:
2576 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002577 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002578 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002579 case MVT::i8:
2580 Opcode = NVPTX::STV_i8_v4_ari_64;
2581 break;
2582 case MVT::i16:
2583 Opcode = NVPTX::STV_i16_v4_ari_64;
2584 break;
2585 case MVT::i32:
2586 Opcode = NVPTX::STV_i32_v4_ari_64;
2587 break;
2588 case MVT::f32:
2589 Opcode = NVPTX::STV_f32_v4_ari_64;
2590 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002591 }
2592 break;
2593 }
2594 } else {
2595 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002596 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002597 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002598 case NVPTXISD::StoreV2:
2599 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002600 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002601 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002602 case MVT::i8:
2603 Opcode = NVPTX::STV_i8_v2_ari;
2604 break;
2605 case MVT::i16:
2606 Opcode = NVPTX::STV_i16_v2_ari;
2607 break;
2608 case MVT::i32:
2609 Opcode = NVPTX::STV_i32_v2_ari;
2610 break;
2611 case MVT::i64:
2612 Opcode = NVPTX::STV_i64_v2_ari;
2613 break;
2614 case MVT::f32:
2615 Opcode = NVPTX::STV_f32_v2_ari;
2616 break;
2617 case MVT::f64:
2618 Opcode = NVPTX::STV_f64_v2_ari;
2619 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002620 }
2621 break;
2622 case NVPTXISD::StoreV4:
2623 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002624 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002625 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002626 case MVT::i8:
2627 Opcode = NVPTX::STV_i8_v4_ari;
2628 break;
2629 case MVT::i16:
2630 Opcode = NVPTX::STV_i16_v4_ari;
2631 break;
2632 case MVT::i32:
2633 Opcode = NVPTX::STV_i32_v4_ari;
2634 break;
2635 case MVT::f32:
2636 Opcode = NVPTX::STV_f32_v4_ari;
2637 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002638 }
2639 break;
2640 }
2641 }
2642 StOps.push_back(Base);
2643 StOps.push_back(Offset);
2644 } else {
Eric Christopher02389e32015-02-19 00:08:27 +00002645 if (TM.is64Bit()) {
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002646 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002647 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002648 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002649 case NVPTXISD::StoreV2:
2650 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002651 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002652 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002653 case MVT::i8:
2654 Opcode = NVPTX::STV_i8_v2_areg_64;
2655 break;
2656 case MVT::i16:
2657 Opcode = NVPTX::STV_i16_v2_areg_64;
2658 break;
2659 case MVT::i32:
2660 Opcode = NVPTX::STV_i32_v2_areg_64;
2661 break;
2662 case MVT::i64:
2663 Opcode = NVPTX::STV_i64_v2_areg_64;
2664 break;
2665 case MVT::f32:
2666 Opcode = NVPTX::STV_f32_v2_areg_64;
2667 break;
2668 case MVT::f64:
2669 Opcode = NVPTX::STV_f64_v2_areg_64;
2670 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002671 }
2672 break;
2673 case NVPTXISD::StoreV4:
2674 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002675 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002676 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002677 case MVT::i8:
2678 Opcode = NVPTX::STV_i8_v4_areg_64;
2679 break;
2680 case MVT::i16:
2681 Opcode = NVPTX::STV_i16_v4_areg_64;
2682 break;
2683 case MVT::i32:
2684 Opcode = NVPTX::STV_i32_v4_areg_64;
2685 break;
2686 case MVT::f32:
2687 Opcode = NVPTX::STV_f32_v4_areg_64;
2688 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002689 }
2690 break;
2691 }
2692 } else {
2693 switch (N->getOpcode()) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002694 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002695 return false;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002696 case NVPTXISD::StoreV2:
2697 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002698 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002699 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002700 case MVT::i8:
2701 Opcode = NVPTX::STV_i8_v2_areg;
2702 break;
2703 case MVT::i16:
2704 Opcode = NVPTX::STV_i16_v2_areg;
2705 break;
2706 case MVT::i32:
2707 Opcode = NVPTX::STV_i32_v2_areg;
2708 break;
2709 case MVT::i64:
2710 Opcode = NVPTX::STV_i64_v2_areg;
2711 break;
2712 case MVT::f32:
2713 Opcode = NVPTX::STV_f32_v2_areg;
2714 break;
2715 case MVT::f64:
2716 Opcode = NVPTX::STV_f64_v2_areg;
2717 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002718 }
2719 break;
2720 case NVPTXISD::StoreV4:
2721 switch (EltVT.getSimpleVT().SimpleTy) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00002722 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002723 return false;
Justin Holewinski0497ab12013-03-30 14:29:21 +00002724 case MVT::i8:
2725 Opcode = NVPTX::STV_i8_v4_areg;
2726 break;
2727 case MVT::i16:
2728 Opcode = NVPTX::STV_i16_v4_areg;
2729 break;
2730 case MVT::i32:
2731 Opcode = NVPTX::STV_i32_v4_areg;
2732 break;
2733 case MVT::f32:
2734 Opcode = NVPTX::STV_f32_v4_areg;
2735 break;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002736 }
2737 break;
2738 }
2739 }
2740 StOps.push_back(N2);
2741 }
2742
2743 StOps.push_back(Chain);
2744
Michael Liaob53d8962013-04-19 22:22:57 +00002745 ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002746
2747 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
2748 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
2749 cast<MachineSDNode>(ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
2750
Justin Bogner8d83fb62016-05-13 21:12:53 +00002751 ReplaceNode(N, ST);
2752 return true;
Justin Holewinskibe8dc642013-02-12 14:18:49 +00002753}
2754
Justin Bogner8d83fb62016-05-13 21:12:53 +00002755bool NVPTXDAGToDAGISel::tryLoadParam(SDNode *Node) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002756 SDValue Chain = Node->getOperand(0);
2757 SDValue Offset = Node->getOperand(2);
2758 SDValue Flag = Node->getOperand(3);
2759 SDLoc DL(Node);
2760 MemSDNode *Mem = cast<MemSDNode>(Node);
2761
2762 unsigned VecSize;
2763 switch (Node->getOpcode()) {
2764 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002765 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002766 case NVPTXISD::LoadParam:
2767 VecSize = 1;
2768 break;
2769 case NVPTXISD::LoadParamV2:
2770 VecSize = 2;
2771 break;
2772 case NVPTXISD::LoadParamV4:
2773 VecSize = 4;
2774 break;
2775 }
2776
2777 EVT EltVT = Node->getValueType(0);
2778 EVT MemVT = Mem->getMemoryVT();
2779
2780 unsigned Opc = 0;
2781
2782 switch (VecSize) {
2783 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002784 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002785 case 1:
2786 switch (MemVT.getSimpleVT().SimpleTy) {
2787 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002788 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002789 case MVT::i1:
2790 Opc = NVPTX::LoadParamMemI8;
2791 break;
2792 case MVT::i8:
2793 Opc = NVPTX::LoadParamMemI8;
2794 break;
2795 case MVT::i16:
2796 Opc = NVPTX::LoadParamMemI16;
2797 break;
2798 case MVT::i32:
2799 Opc = NVPTX::LoadParamMemI32;
2800 break;
2801 case MVT::i64:
2802 Opc = NVPTX::LoadParamMemI64;
2803 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002804 case MVT::f16:
2805 Opc = NVPTX::LoadParamMemF16;
2806 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002807 case MVT::f32:
2808 Opc = NVPTX::LoadParamMemF32;
2809 break;
2810 case MVT::f64:
2811 Opc = NVPTX::LoadParamMemF64;
2812 break;
2813 }
2814 break;
2815 case 2:
2816 switch (MemVT.getSimpleVT().SimpleTy) {
2817 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002818 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002819 case MVT::i1:
2820 Opc = NVPTX::LoadParamMemV2I8;
2821 break;
2822 case MVT::i8:
2823 Opc = NVPTX::LoadParamMemV2I8;
2824 break;
2825 case MVT::i16:
2826 Opc = NVPTX::LoadParamMemV2I16;
2827 break;
2828 case MVT::i32:
2829 Opc = NVPTX::LoadParamMemV2I32;
2830 break;
2831 case MVT::i64:
2832 Opc = NVPTX::LoadParamMemV2I64;
2833 break;
2834 case MVT::f32:
2835 Opc = NVPTX::LoadParamMemV2F32;
2836 break;
2837 case MVT::f64:
2838 Opc = NVPTX::LoadParamMemV2F64;
2839 break;
2840 }
2841 break;
2842 case 4:
2843 switch (MemVT.getSimpleVT().SimpleTy) {
2844 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002845 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002846 case MVT::i1:
2847 Opc = NVPTX::LoadParamMemV4I8;
2848 break;
2849 case MVT::i8:
2850 Opc = NVPTX::LoadParamMemV4I8;
2851 break;
2852 case MVT::i16:
2853 Opc = NVPTX::LoadParamMemV4I16;
2854 break;
2855 case MVT::i32:
2856 Opc = NVPTX::LoadParamMemV4I32;
2857 break;
2858 case MVT::f32:
2859 Opc = NVPTX::LoadParamMemV4F32;
2860 break;
2861 }
2862 break;
2863 }
2864
2865 SDVTList VTs;
2866 if (VecSize == 1) {
2867 VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2868 } else if (VecSize == 2) {
2869 VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2870 } else {
2871 EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
Craig Topperabb4ac72014-04-16 06:10:51 +00002872 VTs = CurDAG->getVTList(EVTs);
Justin Holewinskif8f70912013-06-28 17:57:59 +00002873 }
2874
2875 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2876
2877 SmallVector<SDValue, 2> Ops;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002878 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002879 Ops.push_back(Chain);
2880 Ops.push_back(Flag);
2881
Justin Bogner8d83fb62016-05-13 21:12:53 +00002882 ReplaceNode(Node, CurDAG->getMachineNode(Opc, DL, VTs, Ops));
2883 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002884}
2885
Justin Bogner8d83fb62016-05-13 21:12:53 +00002886bool NVPTXDAGToDAGISel::tryStoreRetval(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00002887 SDLoc DL(N);
2888 SDValue Chain = N->getOperand(0);
2889 SDValue Offset = N->getOperand(1);
2890 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2891 MemSDNode *Mem = cast<MemSDNode>(N);
2892
2893 // How many elements do we have?
2894 unsigned NumElts = 1;
2895 switch (N->getOpcode()) {
2896 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002897 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002898 case NVPTXISD::StoreRetval:
2899 NumElts = 1;
2900 break;
2901 case NVPTXISD::StoreRetvalV2:
2902 NumElts = 2;
2903 break;
2904 case NVPTXISD::StoreRetvalV4:
2905 NumElts = 4;
2906 break;
2907 }
2908
2909 // Build vector of operands
2910 SmallVector<SDValue, 6> Ops;
2911 for (unsigned i = 0; i < NumElts; ++i)
2912 Ops.push_back(N->getOperand(i + 2));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00002913 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00002914 Ops.push_back(Chain);
2915
2916 // Determine target opcode
2917 // If we have an i1, use an 8-bit store. The lowering code in
2918 // NVPTXISelLowering will have already emitted an upcast.
2919 unsigned Opcode = 0;
2920 switch (NumElts) {
2921 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002922 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002923 case 1:
2924 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2925 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002926 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002927 case MVT::i1:
2928 Opcode = NVPTX::StoreRetvalI8;
2929 break;
2930 case MVT::i8:
2931 Opcode = NVPTX::StoreRetvalI8;
2932 break;
2933 case MVT::i16:
2934 Opcode = NVPTX::StoreRetvalI16;
2935 break;
2936 case MVT::i32:
2937 Opcode = NVPTX::StoreRetvalI32;
2938 break;
2939 case MVT::i64:
2940 Opcode = NVPTX::StoreRetvalI64;
2941 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00002942 case MVT::f16:
2943 Opcode = NVPTX::StoreRetvalF16;
2944 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002945 case MVT::f32:
2946 Opcode = NVPTX::StoreRetvalF32;
2947 break;
2948 case MVT::f64:
2949 Opcode = NVPTX::StoreRetvalF64;
2950 break;
2951 }
2952 break;
2953 case 2:
2954 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2955 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002956 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002957 case MVT::i1:
2958 Opcode = NVPTX::StoreRetvalV2I8;
2959 break;
2960 case MVT::i8:
2961 Opcode = NVPTX::StoreRetvalV2I8;
2962 break;
2963 case MVT::i16:
2964 Opcode = NVPTX::StoreRetvalV2I16;
2965 break;
2966 case MVT::i32:
2967 Opcode = NVPTX::StoreRetvalV2I32;
2968 break;
2969 case MVT::i64:
2970 Opcode = NVPTX::StoreRetvalV2I64;
2971 break;
2972 case MVT::f32:
2973 Opcode = NVPTX::StoreRetvalV2F32;
2974 break;
2975 case MVT::f64:
2976 Opcode = NVPTX::StoreRetvalV2F64;
2977 break;
2978 }
2979 break;
2980 case 4:
2981 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
2982 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00002983 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00002984 case MVT::i1:
2985 Opcode = NVPTX::StoreRetvalV4I8;
2986 break;
2987 case MVT::i8:
2988 Opcode = NVPTX::StoreRetvalV4I8;
2989 break;
2990 case MVT::i16:
2991 Opcode = NVPTX::StoreRetvalV4I16;
2992 break;
2993 case MVT::i32:
2994 Opcode = NVPTX::StoreRetvalV4I32;
2995 break;
2996 case MVT::f32:
2997 Opcode = NVPTX::StoreRetvalV4F32;
2998 break;
2999 }
3000 break;
3001 }
3002
3003 SDNode *Ret =
3004 CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
3005 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3006 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3007 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3008
Justin Bogner8d83fb62016-05-13 21:12:53 +00003009 ReplaceNode(N, Ret);
3010 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003011}
3012
Justin Bogner8d83fb62016-05-13 21:12:53 +00003013bool NVPTXDAGToDAGISel::tryStoreParam(SDNode *N) {
Justin Holewinskif8f70912013-06-28 17:57:59 +00003014 SDLoc DL(N);
3015 SDValue Chain = N->getOperand(0);
3016 SDValue Param = N->getOperand(1);
3017 unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
3018 SDValue Offset = N->getOperand(2);
3019 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
3020 MemSDNode *Mem = cast<MemSDNode>(N);
3021 SDValue Flag = N->getOperand(N->getNumOperands() - 1);
3022
3023 // How many elements do we have?
3024 unsigned NumElts = 1;
3025 switch (N->getOpcode()) {
3026 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003027 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003028 case NVPTXISD::StoreParamU32:
3029 case NVPTXISD::StoreParamS32:
3030 case NVPTXISD::StoreParam:
3031 NumElts = 1;
3032 break;
3033 case NVPTXISD::StoreParamV2:
3034 NumElts = 2;
3035 break;
3036 case NVPTXISD::StoreParamV4:
3037 NumElts = 4;
3038 break;
3039 }
3040
3041 // Build vector of operands
3042 SmallVector<SDValue, 8> Ops;
3043 for (unsigned i = 0; i < NumElts; ++i)
3044 Ops.push_back(N->getOperand(i + 3));
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003045 Ops.push_back(CurDAG->getTargetConstant(ParamVal, DL, MVT::i32));
3046 Ops.push_back(CurDAG->getTargetConstant(OffsetVal, DL, MVT::i32));
Justin Holewinskif8f70912013-06-28 17:57:59 +00003047 Ops.push_back(Chain);
3048 Ops.push_back(Flag);
3049
3050 // Determine target opcode
3051 // If we have an i1, use an 8-bit store. The lowering code in
3052 // NVPTXISelLowering will have already emitted an upcast.
3053 unsigned Opcode = 0;
3054 switch (N->getOpcode()) {
3055 default:
3056 switch (NumElts) {
3057 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003058 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003059 case 1:
3060 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3061 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003062 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003063 case MVT::i1:
3064 Opcode = NVPTX::StoreParamI8;
3065 break;
3066 case MVT::i8:
3067 Opcode = NVPTX::StoreParamI8;
3068 break;
3069 case MVT::i16:
3070 Opcode = NVPTX::StoreParamI16;
3071 break;
3072 case MVT::i32:
3073 Opcode = NVPTX::StoreParamI32;
3074 break;
3075 case MVT::i64:
3076 Opcode = NVPTX::StoreParamI64;
3077 break;
Artem Belevich64dc9be2017-01-13 20:56:17 +00003078 case MVT::f16:
3079 Opcode = NVPTX::StoreParamF16;
3080 break;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003081 case MVT::f32:
3082 Opcode = NVPTX::StoreParamF32;
3083 break;
3084 case MVT::f64:
3085 Opcode = NVPTX::StoreParamF64;
3086 break;
3087 }
3088 break;
3089 case 2:
3090 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3091 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003092 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003093 case MVT::i1:
3094 Opcode = NVPTX::StoreParamV2I8;
3095 break;
3096 case MVT::i8:
3097 Opcode = NVPTX::StoreParamV2I8;
3098 break;
3099 case MVT::i16:
3100 Opcode = NVPTX::StoreParamV2I16;
3101 break;
3102 case MVT::i32:
3103 Opcode = NVPTX::StoreParamV2I32;
3104 break;
3105 case MVT::i64:
3106 Opcode = NVPTX::StoreParamV2I64;
3107 break;
3108 case MVT::f32:
3109 Opcode = NVPTX::StoreParamV2F32;
3110 break;
3111 case MVT::f64:
3112 Opcode = NVPTX::StoreParamV2F64;
3113 break;
3114 }
3115 break;
3116 case 4:
3117 switch (Mem->getMemoryVT().getSimpleVT().SimpleTy) {
3118 default:
Justin Bogner8d83fb62016-05-13 21:12:53 +00003119 return false;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003120 case MVT::i1:
3121 Opcode = NVPTX::StoreParamV4I8;
3122 break;
3123 case MVT::i8:
3124 Opcode = NVPTX::StoreParamV4I8;
3125 break;
3126 case MVT::i16:
3127 Opcode = NVPTX::StoreParamV4I16;
3128 break;
3129 case MVT::i32:
3130 Opcode = NVPTX::StoreParamV4I32;
3131 break;
3132 case MVT::f32:
3133 Opcode = NVPTX::StoreParamV4F32;
3134 break;
3135 }
3136 break;
3137 }
3138 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003139 // Special case: if we have a sign-extend/zero-extend node, insert the
3140 // conversion instruction first, and use that as the value operand to
3141 // the selected StoreParam node.
3142 case NVPTXISD::StoreParamU32: {
3143 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003144 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003145 MVT::i32);
3146 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
3147 MVT::i32, Ops[0], CvtNone);
3148 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003149 break;
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003150 }
3151 case NVPTXISD::StoreParamS32: {
3152 Opcode = NVPTX::StoreParamI32;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00003153 SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE, DL,
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003154 MVT::i32);
3155 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
3156 MVT::i32, Ops[0], CvtNone);
3157 Ops[0] = SDValue(Cvt, 0);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003158 break;
3159 }
Justin Holewinskidc5e3b62013-06-28 17:58:04 +00003160 }
Justin Holewinskif8f70912013-06-28 17:57:59 +00003161
Justin Holewinskidff28d22013-07-01 12:59:01 +00003162 SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003163 SDNode *Ret =
Justin Holewinskidff28d22013-07-01 12:59:01 +00003164 CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
Justin Holewinskif8f70912013-06-28 17:57:59 +00003165 MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1);
3166 MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand();
3167 cast<MachineSDNode>(Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
3168
Justin Bogner8d83fb62016-05-13 21:12:53 +00003169 ReplaceNode(N, Ret);
3170 return true;
Justin Holewinskif8f70912013-06-28 17:57:59 +00003171}
3172
Justin Bogner8d83fb62016-05-13 21:12:53 +00003173bool NVPTXDAGToDAGISel::tryTextureIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003174 SDValue Chain = N->getOperand(0);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003175 unsigned Opc = 0;
3176 SmallVector<SDValue, 8> Ops;
3177
3178 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003179 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003180 case NVPTXISD::Tex1DFloatS32:
3181 Opc = NVPTX::TEX_1D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003182 break;
3183 case NVPTXISD::Tex1DFloatFloat:
3184 Opc = NVPTX::TEX_1D_F32_F32;
3185 break;
3186 case NVPTXISD::Tex1DFloatFloatLevel:
3187 Opc = NVPTX::TEX_1D_F32_F32_LEVEL;
3188 break;
3189 case NVPTXISD::Tex1DFloatFloatGrad:
3190 Opc = NVPTX::TEX_1D_F32_F32_GRAD;
3191 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003192 case NVPTXISD::Tex1DS32S32:
3193 Opc = NVPTX::TEX_1D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003194 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003195 case NVPTXISD::Tex1DS32Float:
3196 Opc = NVPTX::TEX_1D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003197 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003198 case NVPTXISD::Tex1DS32FloatLevel:
3199 Opc = NVPTX::TEX_1D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003200 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003201 case NVPTXISD::Tex1DS32FloatGrad:
3202 Opc = NVPTX::TEX_1D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003203 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003204 case NVPTXISD::Tex1DU32S32:
3205 Opc = NVPTX::TEX_1D_U32_S32;
3206 break;
3207 case NVPTXISD::Tex1DU32Float:
3208 Opc = NVPTX::TEX_1D_U32_F32;
3209 break;
3210 case NVPTXISD::Tex1DU32FloatLevel:
3211 Opc = NVPTX::TEX_1D_U32_F32_LEVEL;
3212 break;
3213 case NVPTXISD::Tex1DU32FloatGrad:
3214 Opc = NVPTX::TEX_1D_U32_F32_GRAD;
3215 break;
3216 case NVPTXISD::Tex1DArrayFloatS32:
3217 Opc = NVPTX::TEX_1D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003218 break;
3219 case NVPTXISD::Tex1DArrayFloatFloat:
3220 Opc = NVPTX::TEX_1D_ARRAY_F32_F32;
3221 break;
3222 case NVPTXISD::Tex1DArrayFloatFloatLevel:
3223 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_LEVEL;
3224 break;
3225 case NVPTXISD::Tex1DArrayFloatFloatGrad:
3226 Opc = NVPTX::TEX_1D_ARRAY_F32_F32_GRAD;
3227 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003228 case NVPTXISD::Tex1DArrayS32S32:
3229 Opc = NVPTX::TEX_1D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003230 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003231 case NVPTXISD::Tex1DArrayS32Float:
3232 Opc = NVPTX::TEX_1D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003233 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003234 case NVPTXISD::Tex1DArrayS32FloatLevel:
3235 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003236 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003237 case NVPTXISD::Tex1DArrayS32FloatGrad:
3238 Opc = NVPTX::TEX_1D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003239 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003240 case NVPTXISD::Tex1DArrayU32S32:
3241 Opc = NVPTX::TEX_1D_ARRAY_U32_S32;
3242 break;
3243 case NVPTXISD::Tex1DArrayU32Float:
3244 Opc = NVPTX::TEX_1D_ARRAY_U32_F32;
3245 break;
3246 case NVPTXISD::Tex1DArrayU32FloatLevel:
3247 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_LEVEL;
3248 break;
3249 case NVPTXISD::Tex1DArrayU32FloatGrad:
3250 Opc = NVPTX::TEX_1D_ARRAY_U32_F32_GRAD;
3251 break;
3252 case NVPTXISD::Tex2DFloatS32:
3253 Opc = NVPTX::TEX_2D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003254 break;
3255 case NVPTXISD::Tex2DFloatFloat:
3256 Opc = NVPTX::TEX_2D_F32_F32;
3257 break;
3258 case NVPTXISD::Tex2DFloatFloatLevel:
3259 Opc = NVPTX::TEX_2D_F32_F32_LEVEL;
3260 break;
3261 case NVPTXISD::Tex2DFloatFloatGrad:
3262 Opc = NVPTX::TEX_2D_F32_F32_GRAD;
3263 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003264 case NVPTXISD::Tex2DS32S32:
3265 Opc = NVPTX::TEX_2D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003266 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003267 case NVPTXISD::Tex2DS32Float:
3268 Opc = NVPTX::TEX_2D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003269 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003270 case NVPTXISD::Tex2DS32FloatLevel:
3271 Opc = NVPTX::TEX_2D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003272 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003273 case NVPTXISD::Tex2DS32FloatGrad:
3274 Opc = NVPTX::TEX_2D_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003275 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003276 case NVPTXISD::Tex2DU32S32:
3277 Opc = NVPTX::TEX_2D_U32_S32;
3278 break;
3279 case NVPTXISD::Tex2DU32Float:
3280 Opc = NVPTX::TEX_2D_U32_F32;
3281 break;
3282 case NVPTXISD::Tex2DU32FloatLevel:
3283 Opc = NVPTX::TEX_2D_U32_F32_LEVEL;
3284 break;
3285 case NVPTXISD::Tex2DU32FloatGrad:
3286 Opc = NVPTX::TEX_2D_U32_F32_GRAD;
3287 break;
3288 case NVPTXISD::Tex2DArrayFloatS32:
3289 Opc = NVPTX::TEX_2D_ARRAY_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003290 break;
3291 case NVPTXISD::Tex2DArrayFloatFloat:
3292 Opc = NVPTX::TEX_2D_ARRAY_F32_F32;
3293 break;
3294 case NVPTXISD::Tex2DArrayFloatFloatLevel:
3295 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_LEVEL;
3296 break;
3297 case NVPTXISD::Tex2DArrayFloatFloatGrad:
3298 Opc = NVPTX::TEX_2D_ARRAY_F32_F32_GRAD;
3299 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003300 case NVPTXISD::Tex2DArrayS32S32:
3301 Opc = NVPTX::TEX_2D_ARRAY_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003302 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003303 case NVPTXISD::Tex2DArrayS32Float:
3304 Opc = NVPTX::TEX_2D_ARRAY_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003305 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003306 case NVPTXISD::Tex2DArrayS32FloatLevel:
3307 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003308 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003309 case NVPTXISD::Tex2DArrayS32FloatGrad:
3310 Opc = NVPTX::TEX_2D_ARRAY_S32_F32_GRAD;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003311 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003312 case NVPTXISD::Tex2DArrayU32S32:
3313 Opc = NVPTX::TEX_2D_ARRAY_U32_S32;
3314 break;
3315 case NVPTXISD::Tex2DArrayU32Float:
3316 Opc = NVPTX::TEX_2D_ARRAY_U32_F32;
3317 break;
3318 case NVPTXISD::Tex2DArrayU32FloatLevel:
3319 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_LEVEL;
3320 break;
3321 case NVPTXISD::Tex2DArrayU32FloatGrad:
3322 Opc = NVPTX::TEX_2D_ARRAY_U32_F32_GRAD;
3323 break;
3324 case NVPTXISD::Tex3DFloatS32:
3325 Opc = NVPTX::TEX_3D_F32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003326 break;
3327 case NVPTXISD::Tex3DFloatFloat:
3328 Opc = NVPTX::TEX_3D_F32_F32;
3329 break;
3330 case NVPTXISD::Tex3DFloatFloatLevel:
3331 Opc = NVPTX::TEX_3D_F32_F32_LEVEL;
3332 break;
3333 case NVPTXISD::Tex3DFloatFloatGrad:
3334 Opc = NVPTX::TEX_3D_F32_F32_GRAD;
3335 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003336 case NVPTXISD::Tex3DS32S32:
3337 Opc = NVPTX::TEX_3D_S32_S32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003338 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003339 case NVPTXISD::Tex3DS32Float:
3340 Opc = NVPTX::TEX_3D_S32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003341 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003342 case NVPTXISD::Tex3DS32FloatLevel:
3343 Opc = NVPTX::TEX_3D_S32_F32_LEVEL;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003344 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003345 case NVPTXISD::Tex3DS32FloatGrad:
3346 Opc = NVPTX::TEX_3D_S32_F32_GRAD;
3347 break;
3348 case NVPTXISD::Tex3DU32S32:
3349 Opc = NVPTX::TEX_3D_U32_S32;
3350 break;
3351 case NVPTXISD::Tex3DU32Float:
3352 Opc = NVPTX::TEX_3D_U32_F32;
3353 break;
3354 case NVPTXISD::Tex3DU32FloatLevel:
3355 Opc = NVPTX::TEX_3D_U32_F32_LEVEL;
3356 break;
3357 case NVPTXISD::Tex3DU32FloatGrad:
3358 Opc = NVPTX::TEX_3D_U32_F32_GRAD;
3359 break;
3360 case NVPTXISD::TexCubeFloatFloat:
3361 Opc = NVPTX::TEX_CUBE_F32_F32;
3362 break;
3363 case NVPTXISD::TexCubeFloatFloatLevel:
3364 Opc = NVPTX::TEX_CUBE_F32_F32_LEVEL;
3365 break;
3366 case NVPTXISD::TexCubeS32Float:
3367 Opc = NVPTX::TEX_CUBE_S32_F32;
3368 break;
3369 case NVPTXISD::TexCubeS32FloatLevel:
3370 Opc = NVPTX::TEX_CUBE_S32_F32_LEVEL;
3371 break;
3372 case NVPTXISD::TexCubeU32Float:
3373 Opc = NVPTX::TEX_CUBE_U32_F32;
3374 break;
3375 case NVPTXISD::TexCubeU32FloatLevel:
3376 Opc = NVPTX::TEX_CUBE_U32_F32_LEVEL;
3377 break;
3378 case NVPTXISD::TexCubeArrayFloatFloat:
3379 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32;
3380 break;
3381 case NVPTXISD::TexCubeArrayFloatFloatLevel:
3382 Opc = NVPTX::TEX_CUBE_ARRAY_F32_F32_LEVEL;
3383 break;
3384 case NVPTXISD::TexCubeArrayS32Float:
3385 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32;
3386 break;
3387 case NVPTXISD::TexCubeArrayS32FloatLevel:
3388 Opc = NVPTX::TEX_CUBE_ARRAY_S32_F32_LEVEL;
3389 break;
3390 case NVPTXISD::TexCubeArrayU32Float:
3391 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32;
3392 break;
3393 case NVPTXISD::TexCubeArrayU32FloatLevel:
3394 Opc = NVPTX::TEX_CUBE_ARRAY_U32_F32_LEVEL;
3395 break;
3396 case NVPTXISD::Tld4R2DFloatFloat:
3397 Opc = NVPTX::TLD4_R_2D_F32_F32;
3398 break;
3399 case NVPTXISD::Tld4G2DFloatFloat:
3400 Opc = NVPTX::TLD4_G_2D_F32_F32;
3401 break;
3402 case NVPTXISD::Tld4B2DFloatFloat:
3403 Opc = NVPTX::TLD4_B_2D_F32_F32;
3404 break;
3405 case NVPTXISD::Tld4A2DFloatFloat:
3406 Opc = NVPTX::TLD4_A_2D_F32_F32;
3407 break;
3408 case NVPTXISD::Tld4R2DS64Float:
3409 Opc = NVPTX::TLD4_R_2D_S32_F32;
3410 break;
3411 case NVPTXISD::Tld4G2DS64Float:
3412 Opc = NVPTX::TLD4_G_2D_S32_F32;
3413 break;
3414 case NVPTXISD::Tld4B2DS64Float:
3415 Opc = NVPTX::TLD4_B_2D_S32_F32;
3416 break;
3417 case NVPTXISD::Tld4A2DS64Float:
3418 Opc = NVPTX::TLD4_A_2D_S32_F32;
3419 break;
3420 case NVPTXISD::Tld4R2DU64Float:
3421 Opc = NVPTX::TLD4_R_2D_U32_F32;
3422 break;
3423 case NVPTXISD::Tld4G2DU64Float:
3424 Opc = NVPTX::TLD4_G_2D_U32_F32;
3425 break;
3426 case NVPTXISD::Tld4B2DU64Float:
3427 Opc = NVPTX::TLD4_B_2D_U32_F32;
3428 break;
3429 case NVPTXISD::Tld4A2DU64Float:
3430 Opc = NVPTX::TLD4_A_2D_U32_F32;
3431 break;
3432 case NVPTXISD::TexUnified1DFloatS32:
3433 Opc = NVPTX::TEX_UNIFIED_1D_F32_S32;
3434 break;
3435 case NVPTXISD::TexUnified1DFloatFloat:
3436 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32;
3437 break;
3438 case NVPTXISD::TexUnified1DFloatFloatLevel:
3439 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_LEVEL;
3440 break;
3441 case NVPTXISD::TexUnified1DFloatFloatGrad:
3442 Opc = NVPTX::TEX_UNIFIED_1D_F32_F32_GRAD;
3443 break;
3444 case NVPTXISD::TexUnified1DS32S32:
3445 Opc = NVPTX::TEX_UNIFIED_1D_S32_S32;
3446 break;
3447 case NVPTXISD::TexUnified1DS32Float:
3448 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32;
3449 break;
3450 case NVPTXISD::TexUnified1DS32FloatLevel:
3451 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_LEVEL;
3452 break;
3453 case NVPTXISD::TexUnified1DS32FloatGrad:
3454 Opc = NVPTX::TEX_UNIFIED_1D_S32_F32_GRAD;
3455 break;
3456 case NVPTXISD::TexUnified1DU32S32:
3457 Opc = NVPTX::TEX_UNIFIED_1D_U32_S32;
3458 break;
3459 case NVPTXISD::TexUnified1DU32Float:
3460 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32;
3461 break;
3462 case NVPTXISD::TexUnified1DU32FloatLevel:
3463 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_LEVEL;
3464 break;
3465 case NVPTXISD::TexUnified1DU32FloatGrad:
3466 Opc = NVPTX::TEX_UNIFIED_1D_U32_F32_GRAD;
3467 break;
3468 case NVPTXISD::TexUnified1DArrayFloatS32:
3469 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_S32;
3470 break;
3471 case NVPTXISD::TexUnified1DArrayFloatFloat:
3472 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32;
3473 break;
3474 case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
3475 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_LEVEL;
3476 break;
3477 case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
3478 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_F32_F32_GRAD;
3479 break;
3480 case NVPTXISD::TexUnified1DArrayS32S32:
3481 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_S32;
3482 break;
3483 case NVPTXISD::TexUnified1DArrayS32Float:
3484 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32;
3485 break;
3486 case NVPTXISD::TexUnified1DArrayS32FloatLevel:
3487 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_LEVEL;
3488 break;
3489 case NVPTXISD::TexUnified1DArrayS32FloatGrad:
3490 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_S32_F32_GRAD;
3491 break;
3492 case NVPTXISD::TexUnified1DArrayU32S32:
3493 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_S32;
3494 break;
3495 case NVPTXISD::TexUnified1DArrayU32Float:
3496 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32;
3497 break;
3498 case NVPTXISD::TexUnified1DArrayU32FloatLevel:
3499 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_LEVEL;
3500 break;
3501 case NVPTXISD::TexUnified1DArrayU32FloatGrad:
3502 Opc = NVPTX::TEX_UNIFIED_1D_ARRAY_U32_F32_GRAD;
3503 break;
3504 case NVPTXISD::TexUnified2DFloatS32:
3505 Opc = NVPTX::TEX_UNIFIED_2D_F32_S32;
3506 break;
3507 case NVPTXISD::TexUnified2DFloatFloat:
3508 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32;
3509 break;
3510 case NVPTXISD::TexUnified2DFloatFloatLevel:
3511 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_LEVEL;
3512 break;
3513 case NVPTXISD::TexUnified2DFloatFloatGrad:
3514 Opc = NVPTX::TEX_UNIFIED_2D_F32_F32_GRAD;
3515 break;
3516 case NVPTXISD::TexUnified2DS32S32:
3517 Opc = NVPTX::TEX_UNIFIED_2D_S32_S32;
3518 break;
3519 case NVPTXISD::TexUnified2DS32Float:
3520 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32;
3521 break;
3522 case NVPTXISD::TexUnified2DS32FloatLevel:
3523 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_LEVEL;
3524 break;
3525 case NVPTXISD::TexUnified2DS32FloatGrad:
3526 Opc = NVPTX::TEX_UNIFIED_2D_S32_F32_GRAD;
3527 break;
3528 case NVPTXISD::TexUnified2DU32S32:
3529 Opc = NVPTX::TEX_UNIFIED_2D_U32_S32;
3530 break;
3531 case NVPTXISD::TexUnified2DU32Float:
3532 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32;
3533 break;
3534 case NVPTXISD::TexUnified2DU32FloatLevel:
3535 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_LEVEL;
3536 break;
3537 case NVPTXISD::TexUnified2DU32FloatGrad:
3538 Opc = NVPTX::TEX_UNIFIED_2D_U32_F32_GRAD;
3539 break;
3540 case NVPTXISD::TexUnified2DArrayFloatS32:
3541 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_S32;
3542 break;
3543 case NVPTXISD::TexUnified2DArrayFloatFloat:
3544 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32;
3545 break;
3546 case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
3547 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_LEVEL;
3548 break;
3549 case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
3550 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_F32_F32_GRAD;
3551 break;
3552 case NVPTXISD::TexUnified2DArrayS32S32:
3553 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_S32;
3554 break;
3555 case NVPTXISD::TexUnified2DArrayS32Float:
3556 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32;
3557 break;
3558 case NVPTXISD::TexUnified2DArrayS32FloatLevel:
3559 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_LEVEL;
3560 break;
3561 case NVPTXISD::TexUnified2DArrayS32FloatGrad:
3562 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_S32_F32_GRAD;
3563 break;
3564 case NVPTXISD::TexUnified2DArrayU32S32:
3565 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_S32;
3566 break;
3567 case NVPTXISD::TexUnified2DArrayU32Float:
3568 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32;
3569 break;
3570 case NVPTXISD::TexUnified2DArrayU32FloatLevel:
3571 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_LEVEL;
3572 break;
3573 case NVPTXISD::TexUnified2DArrayU32FloatGrad:
3574 Opc = NVPTX::TEX_UNIFIED_2D_ARRAY_U32_F32_GRAD;
3575 break;
3576 case NVPTXISD::TexUnified3DFloatS32:
3577 Opc = NVPTX::TEX_UNIFIED_3D_F32_S32;
3578 break;
3579 case NVPTXISD::TexUnified3DFloatFloat:
3580 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32;
3581 break;
3582 case NVPTXISD::TexUnified3DFloatFloatLevel:
3583 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_LEVEL;
3584 break;
3585 case NVPTXISD::TexUnified3DFloatFloatGrad:
3586 Opc = NVPTX::TEX_UNIFIED_3D_F32_F32_GRAD;
3587 break;
3588 case NVPTXISD::TexUnified3DS32S32:
3589 Opc = NVPTX::TEX_UNIFIED_3D_S32_S32;
3590 break;
3591 case NVPTXISD::TexUnified3DS32Float:
3592 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32;
3593 break;
3594 case NVPTXISD::TexUnified3DS32FloatLevel:
3595 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_LEVEL;
3596 break;
3597 case NVPTXISD::TexUnified3DS32FloatGrad:
3598 Opc = NVPTX::TEX_UNIFIED_3D_S32_F32_GRAD;
3599 break;
3600 case NVPTXISD::TexUnified3DU32S32:
3601 Opc = NVPTX::TEX_UNIFIED_3D_U32_S32;
3602 break;
3603 case NVPTXISD::TexUnified3DU32Float:
3604 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32;
3605 break;
3606 case NVPTXISD::TexUnified3DU32FloatLevel:
3607 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_LEVEL;
3608 break;
3609 case NVPTXISD::TexUnified3DU32FloatGrad:
3610 Opc = NVPTX::TEX_UNIFIED_3D_U32_F32_GRAD;
3611 break;
3612 case NVPTXISD::TexUnifiedCubeFloatFloat:
3613 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32;
3614 break;
3615 case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
3616 Opc = NVPTX::TEX_UNIFIED_CUBE_F32_F32_LEVEL;
3617 break;
3618 case NVPTXISD::TexUnifiedCubeS32Float:
3619 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32;
3620 break;
3621 case NVPTXISD::TexUnifiedCubeS32FloatLevel:
3622 Opc = NVPTX::TEX_UNIFIED_CUBE_S32_F32_LEVEL;
3623 break;
3624 case NVPTXISD::TexUnifiedCubeU32Float:
3625 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32;
3626 break;
3627 case NVPTXISD::TexUnifiedCubeU32FloatLevel:
3628 Opc = NVPTX::TEX_UNIFIED_CUBE_U32_F32_LEVEL;
3629 break;
3630 case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
3631 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32;
3632 break;
3633 case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
3634 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_F32_F32_LEVEL;
3635 break;
3636 case NVPTXISD::TexUnifiedCubeArrayS32Float:
3637 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32;
3638 break;
3639 case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
3640 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_S32_F32_LEVEL;
3641 break;
3642 case NVPTXISD::TexUnifiedCubeArrayU32Float:
3643 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32;
3644 break;
3645 case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
3646 Opc = NVPTX::TEX_UNIFIED_CUBE_ARRAY_U32_F32_LEVEL;
3647 break;
3648 case NVPTXISD::Tld4UnifiedR2DFloatFloat:
3649 Opc = NVPTX::TLD4_UNIFIED_R_2D_F32_F32;
3650 break;
3651 case NVPTXISD::Tld4UnifiedG2DFloatFloat:
3652 Opc = NVPTX::TLD4_UNIFIED_G_2D_F32_F32;
3653 break;
3654 case NVPTXISD::Tld4UnifiedB2DFloatFloat:
3655 Opc = NVPTX::TLD4_UNIFIED_B_2D_F32_F32;
3656 break;
3657 case NVPTXISD::Tld4UnifiedA2DFloatFloat:
3658 Opc = NVPTX::TLD4_UNIFIED_A_2D_F32_F32;
3659 break;
3660 case NVPTXISD::Tld4UnifiedR2DS64Float:
3661 Opc = NVPTX::TLD4_UNIFIED_R_2D_S32_F32;
3662 break;
3663 case NVPTXISD::Tld4UnifiedG2DS64Float:
3664 Opc = NVPTX::TLD4_UNIFIED_G_2D_S32_F32;
3665 break;
3666 case NVPTXISD::Tld4UnifiedB2DS64Float:
3667 Opc = NVPTX::TLD4_UNIFIED_B_2D_S32_F32;
3668 break;
3669 case NVPTXISD::Tld4UnifiedA2DS64Float:
3670 Opc = NVPTX::TLD4_UNIFIED_A_2D_S32_F32;
3671 break;
3672 case NVPTXISD::Tld4UnifiedR2DU64Float:
3673 Opc = NVPTX::TLD4_UNIFIED_R_2D_U32_F32;
3674 break;
3675 case NVPTXISD::Tld4UnifiedG2DU64Float:
3676 Opc = NVPTX::TLD4_UNIFIED_G_2D_U32_F32;
3677 break;
3678 case NVPTXISD::Tld4UnifiedB2DU64Float:
3679 Opc = NVPTX::TLD4_UNIFIED_B_2D_U32_F32;
3680 break;
3681 case NVPTXISD::Tld4UnifiedA2DU64Float:
3682 Opc = NVPTX::TLD4_UNIFIED_A_2D_U32_F32;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003683 break;
3684 }
3685
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003686 // Copy over operands
3687 for (unsigned i = 1; i < N->getNumOperands(); ++i) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003688 Ops.push_back(N->getOperand(i));
3689 }
3690
3691 Ops.push_back(Chain);
Justin Bogner8d83fb62016-05-13 21:12:53 +00003692 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
3693 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00003694}
3695
Justin Bogner8d83fb62016-05-13 21:12:53 +00003696bool NVPTXDAGToDAGISel::trySurfaceIntrinsic(SDNode *N) {
Justin Holewinski30d56a72014-04-09 15:39:15 +00003697 SDValue Chain = N->getOperand(0);
3698 SDValue TexHandle = N->getOperand(1);
Justin Holewinski30d56a72014-04-09 15:39:15 +00003699 unsigned Opc = 0;
3700 SmallVector<SDValue, 8> Ops;
3701 switch (N->getOpcode()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00003702 default: return false;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00003703 case NVPTXISD::Suld1DI8Clamp:
3704 Opc = NVPTX::SULD_1D_I8_CLAMP;
3705 Ops.push_back(TexHandle);
3706 Ops.push_back(N->getOperand(2));
3707 Ops.push_back(Chain);
3708 break;
3709 case NVPTXISD::Suld1DI16Clamp:
3710 Opc = NVPTX::SULD_1D_I16_CLAMP;
3711 Ops.push_back(TexHandle);
3712 Ops.push_back(N->getOperand(2));
3713 Ops.push_back(Chain);
3714 break;
3715 case NVPTXISD::Suld1DI32Clamp:
3716 Opc = NVPTX::SULD_1D_I32_CLAMP;
3717 Ops.push_back(TexHandle);
3718 Ops.push_back(N->getOperand(2));
3719 Ops.push_back(Chain);
3720 break;
3721 case NVPTXISD::Suld1DI64Clamp:
3722 Opc = NVPTX::SULD_1D_I64_CLAMP;
3723 Ops.push_back(TexHandle);
3724 Ops.push_back(N->getOperand(2));
3725 Ops.push_back(Chain);
3726 break;
3727 case NVPTXISD::Suld1DV2I8Clamp:
3728 Opc = NVPTX::SULD_1D_V2I8_CLAMP;
3729 Ops.push_back(TexHandle);
3730 Ops.push_back(N->getOperand(2));
3731 Ops.push_back(Chain);
3732 break;
3733 case NVPTXISD::Suld1DV2I16Clamp:
3734 Opc = NVPTX::SULD_1D_V2I16_CLAMP;
3735 Ops.push_back(TexHandle);
3736 Ops.push_back(N->getOperand(2));
3737 Ops.push_back(Chain);
3738 break;
3739 case NVPTXISD::Suld1DV2I32Clamp:
3740 Opc = NVPTX::SULD_1D_V2I32_CLAMP;
3741 Ops.push_back(TexHandle);
3742 Ops.push_back(N->getOperand(2));
3743 Ops.push_back(Chain);
3744 break;
3745 case NVPTXISD::Suld1DV2I64Clamp:
3746 Opc = NVPTX::SULD_1D_V2I64_CLAMP;
3747 Ops.push_back(TexHandle);
3748 Ops.push_back(N->getOperand(2));
3749 Ops.push_back(Chain);
3750 break;
3751 case NVPTXISD::Suld1DV4I8Clamp:
3752 Opc = NVPTX::SULD_1D_V4I8_CLAMP;
3753 Ops.push_back(TexHandle);
3754 Ops.push_back(N->getOperand(2));
3755 Ops.push_back(Chain);
3756 break;
3757 case NVPTXISD::Suld1DV4I16Clamp:
3758 Opc = NVPTX::SULD_1D_V4I16_CLAMP;
3759 Ops.push_back(TexHandle);
3760 Ops.push_back(N->getOperand(2));
3761 Ops.push_back(Chain);
3762 break;
3763 case NVPTXISD::Suld1DV4I32Clamp:
3764 Opc = NVPTX::SULD_1D_V4I32_CLAMP;
3765 Ops.push_back(TexHandle);
3766 Ops.push_back(N->getOperand(2));
3767 Ops.push_back(Chain);
3768 break;
3769 case NVPTXISD::Suld1DArrayI8Clamp:
3770 Opc = NVPTX::SULD_1D_ARRAY_I8_CLAMP;
3771 Ops.push_back(TexHandle);
3772 Ops.push_back(N->getOperand(2));
3773 Ops.push_back(N->getOperand(3));
3774 Ops.push_back(Chain);
3775 break;
3776 case NVPTXISD::Suld1DArrayI16Clamp:
3777 Opc = NVPTX::SULD_1D_ARRAY_I16_CLAMP;
3778 Ops.push_back(TexHandle);
3779 Ops.push_back(N->getOperand(2));
3780 Ops.push_back(N->getOperand(3));
3781 Ops.push_back(Chain);
3782 break;
3783 case NVPTXISD::Suld1DArrayI32Clamp:
3784 Opc = NVPTX::SULD_1D_ARRAY_I32_CLAMP;
3785 Ops.push_back(TexHandle);
3786 Ops.push_back(N->getOperand(2));
3787 Ops.push_back(N->getOperand(3));
3788 Ops.push_back(Chain);
3789 break;
3790 case NVPTXISD::Suld1DArrayI64Clamp:
3791 Opc = NVPTX::SULD_1D_ARRAY_I64_CLAMP;
3792 Ops.push_back(TexHandle);
3793 Ops.push_back(N->getOperand(2));
3794 Ops.push_back(N->getOperand(3));
3795 Ops.push_back(Chain);
3796 break;
3797 case NVPTXISD::Suld1DArrayV2I8Clamp:
3798 Opc = NVPTX::SULD_1D_ARRAY_V2I8_CLAMP;
3799 Ops.push_back(TexHandle);
3800 Ops.push_back(N->getOperand(2));
3801 Ops.push_back(N->getOperand(3));
3802 Ops.push_back(Chain);
3803 break;
3804 case NVPTXISD::Suld1DArrayV2I16Clamp:
3805 Opc = NVPTX::SULD_1D_ARRAY_V2I16_CLAMP;
3806 Ops.push_back(TexHandle);
3807 Ops.push_back(N->getOperand(2));
3808 Ops.push_back(N->getOperand(3));
3809 Ops.push_back(Chain);
3810 break;
3811 case NVPTXISD::Suld1DArrayV2I32Clamp:
3812 Opc = NVPTX::SULD_1D_ARRAY_V2I32_CLAMP;
3813 Ops.push_back(TexHandle);
3814 Ops.push_back(N->getOperand(2));
3815 Ops.push_back(N->getOperand(3));
3816 Ops.push_back(Chain);
3817 break;
3818 case NVPTXISD::Suld1DArrayV2I64Clamp:
3819 Opc = NVPTX::SULD_1D_ARRAY_V2I64_CLAMP;
3820 Ops.push_back(TexHandle);
3821 Ops.push_back(N->getOperand(2));
3822 Ops.push_back(N->getOperand(3));
3823 Ops.push_back(Chain);
3824 break;
3825 case NVPTXISD::Suld1DArrayV4I8Clamp:
3826 Opc = NVPTX::SULD_1D_ARRAY_V4I8_CLAMP;
3827 Ops.push_back(TexHandle);
3828 Ops.push_back(N->getOperand(2));
3829 Ops.push_back(N->getOperand(3));
3830 Ops.push_back(Chain);
3831 break;
3832 case NVPTXISD::Suld1DArrayV4I16Clamp:
3833 Opc = NVPTX::SULD_1D_ARRAY_V4I16_CLAMP;
3834 Ops.push_back(TexHandle);
3835 Ops.push_back(N->getOperand(2));
3836 Ops.push_back(N->getOperand(3));
3837 Ops.push_back(Chain);
3838 break;
3839 case NVPTXISD::Suld1DArrayV4I32Clamp:
3840 Opc = NVPTX::SULD_1D_ARRAY_V4I32_CLAMP;
3841 Ops.push_back(TexHandle);
3842 Ops.push_back(N->getOperand(2));
3843 Ops.push_back(N->getOperand(3));
3844 Ops.push_back(Chain);
3845 break;
3846 case NVPTXISD::Suld2DI8Clamp:
3847 Opc = NVPTX::SULD_2D_I8_CLAMP;
3848 Ops.push_back(TexHandle);
3849 Ops.push_back(N->getOperand(2));
3850 Ops.push_back(N->getOperand(3));
3851 Ops.push_back(Chain);
3852 break;
3853 case NVPTXISD::Suld2DI16Clamp:
3854 Opc = NVPTX::SULD_2D_I16_CLAMP;
3855 Ops.push_back(TexHandle);
3856 Ops.push_back(N->getOperand(2));
3857 Ops.push_back(N->getOperand(3));
3858 Ops.push_back(Chain);
3859 break;
3860 case NVPTXISD::Suld2DI32Clamp:
3861 Opc = NVPTX::SULD_2D_I32_CLAMP;
3862 Ops.push_back(TexHandle);
3863 Ops.push_back(N->getOperand(2));
3864 Ops.push_back(N->getOperand(3));
3865 Ops.push_back(Chain);
3866 break;
3867 case NVPTXISD::Suld2DI64Clamp:
3868 Opc = NVPTX::SULD_2D_I64_CLAMP;
3869 Ops.push_back(TexHandle);
3870 Ops.push_back(N->getOperand(2));
3871 Ops.push_back(N->getOperand(3));
3872 Ops.push_back(Chain);
3873 break;
3874 case NVPTXISD::Suld2DV2I8Clamp:
3875 Opc = NVPTX::SULD_2D_V2I8_CLAMP;
3876 Ops.push_back(TexHandle);
3877 Ops.push_back(N->getOperand(2));
3878 Ops.push_back(N->getOperand(3));
3879 Ops.push_back(Chain);
3880 break;
3881 case NVPTXISD::Suld2DV2I16Clamp:
3882 Opc = NVPTX::SULD_2D_V2I16_CLAMP;
3883 Ops.push_back(TexHandle);
3884 Ops.push_back(N->getOperand(2));
3885 Ops.push_back(N->getOperand(3));
3886 Ops.push_back(Chain);
3887 break;
3888 case NVPTXISD::Suld2DV2I32Clamp:
3889 Opc = NVPTX::SULD_2D_V2I32_CLAMP;
3890 Ops.push_back(TexHandle);
3891 Ops.push_back(N->getOperand(2));
3892 Ops.push_back(N->getOperand(3));
3893 Ops.push_back(Chain);
3894 break;
3895 case NVPTXISD::Suld2DV2I64Clamp:
3896 Opc = NVPTX::SULD_2D_V2I64_CLAMP;
3897 Ops.push_back(TexHandle);
3898 Ops.push_back(N->getOperand(2));
3899 Ops.push_back(N->getOperand(3));
3900 Ops.push_back(Chain);
3901 break;
3902 case NVPTXISD::Suld2DV4I8Clamp:
3903 Opc = NVPTX::SULD_2D_V4I8_CLAMP;
3904 Ops.push_back(TexHandle);
3905 Ops.push_back(N->getOperand(2));
3906 Ops.push_back(N->getOperand(3));
3907 Ops.push_back(Chain);
3908 break;
3909 case NVPTXISD::Suld2DV4I16Clamp:
3910 Opc = NVPTX::SULD_2D_V4I16_CLAMP;
3911 Ops.push_back(TexHandle);
3912 Ops.push_back(N->getOperand(2));
3913 Ops.push_back(N->getOperand(3));
3914 Ops.push_back(Chain);
3915 break;
3916 case NVPTXISD::Suld2DV4I32Clamp:
3917 Opc = NVPTX::SULD_2D_V4I32_CLAMP;
3918 Ops.push_back(TexHandle);
3919 Ops.push_back(N->getOperand(2));
3920 Ops.push_back(N->getOperand(3));
3921 Ops.push_back(Chain);
3922 break;
3923 case NVPTXISD::Suld2DArrayI8Clamp:
3924 Opc = NVPTX::SULD_2D_ARRAY_I8_CLAMP;
3925 Ops.push_back(TexHandle);
3926 Ops.push_back(N->getOperand(2));
3927 Ops.push_back(N->getOperand(3));
3928 Ops.push_back(N->getOperand(4));
3929 Ops.push_back(Chain);
3930 break;
3931 case NVPTXISD::Suld2DArrayI16Clamp:
3932 Opc = NVPTX::SULD_2D_ARRAY_I16_CLAMP;
3933 Ops.push_back(TexHandle);
3934 Ops.push_back(N->getOperand(2));
3935 Ops.push_back(N->getOperand(3));
3936 Ops.push_back(N->getOperand(4));
3937 Ops.push_back(Chain);
3938 break;
3939 case NVPTXISD::Suld2DArrayI32Clamp:
3940 Opc = NVPTX::SULD_2D_ARRAY_I32_CLAMP;
3941 Ops.push_back(TexHandle);
3942 Ops.push_back(N->getOperand(2));
3943 Ops.push_back(N->getOperand(3));
3944 Ops.push_back(N->getOperand(4));
3945 Ops.push_back(Chain);
3946 break;
3947 case NVPTXISD::Suld2DArrayI64Clamp:
3948 Opc = NVPTX::SULD_2D_ARRAY_I64_CLAMP;
3949 Ops.push_back(TexHandle);
3950 Ops.push_back(N->getOperand(2));
3951 Ops.push_back(N->getOperand(3));
3952 Ops.push_back(N->getOperand(4));
3953 Ops.push_back(Chain);
3954 break;
3955 case NVPTXISD::Suld2DArrayV2I8Clamp:
3956 Opc = NVPTX::SULD_2D_ARRAY_V2I8_CLAMP;
3957 Ops.push_back(TexHandle);
3958 Ops.push_back(N->getOperand(2));
3959 Ops.push_back(N->getOperand(3));
3960 Ops.push_back(N->getOperand(4));
3961 Ops.push_back(Chain);
3962 break;
3963 case NVPTXISD::Suld2DArrayV2I16Clamp:
3964 Opc = NVPTX::SULD_2D_ARRAY_V2I16_CLAMP;
3965 Ops.push_back(TexHandle);
3966 Ops.push_back(N->getOperand(2));
3967 Ops.push_back(N->getOperand(3));
3968 Ops.push_back(N->getOperand(4));
3969 Ops.push_back(Chain);
3970 break;
3971 case NVPTXISD::Suld2DArrayV2I32Clamp:
3972 Opc = NVPTX::SULD_2D_ARRAY_V2I32_CLAMP;
3973 Ops.push_back(TexHandle);
3974 Ops.push_back(N->getOperand(2));
3975 Ops.push_back(N->getOperand(3));
3976 Ops.push_back(N->getOperand(4));
3977 Ops.push_back(Chain);
3978 break;
3979 case NVPTXISD::Suld2DArrayV2I64Clamp:
3980 Opc = NVPTX::SULD_2D_ARRAY_V2I64_CLAMP;
3981 Ops.push_back(TexHandle);
3982 Ops.push_back(N->getOperand(2));
3983 Ops.push_back(N->getOperand(3));
3984 Ops.push_back(N->getOperand(4));
3985 Ops.push_back(Chain);
3986 break;
3987 case NVPTXISD::Suld2DArrayV4I8Clamp:
3988 Opc = NVPTX::SULD_2D_ARRAY_V4I8_CLAMP;
3989 Ops.push_back(TexHandle);
3990 Ops.push_back(N->getOperand(2));
3991 Ops.push_back(N->getOperand(3));
3992 Ops.push_back(N->getOperand(4));
3993 Ops.push_back(Chain);
3994 break;
3995 case NVPTXISD::Suld2DArrayV4I16Clamp:
3996 Opc = NVPTX::SULD_2D_ARRAY_V4I16_CLAMP;
3997 Ops.push_back(TexHandle);
3998 Ops.push_back(N->getOperand(2));
3999 Ops.push_back(N->getOperand(3));
4000 Ops.push_back(N->getOperand(4));
4001 Ops.push_back(Chain);
4002 break;
4003 case NVPTXISD::Suld2DArrayV4I32Clamp:
4004 Opc = NVPTX::SULD_2D_ARRAY_V4I32_CLAMP;
4005 Ops.push_back(TexHandle);
4006 Ops.push_back(N->getOperand(2));
4007 Ops.push_back(N->getOperand(3));
4008 Ops.push_back(N->getOperand(4));
4009 Ops.push_back(Chain);
4010 break;
4011 case NVPTXISD::Suld3DI8Clamp:
4012 Opc = NVPTX::SULD_3D_I8_CLAMP;
4013 Ops.push_back(TexHandle);
4014 Ops.push_back(N->getOperand(2));
4015 Ops.push_back(N->getOperand(3));
4016 Ops.push_back(N->getOperand(4));
4017 Ops.push_back(Chain);
4018 break;
4019 case NVPTXISD::Suld3DI16Clamp:
4020 Opc = NVPTX::SULD_3D_I16_CLAMP;
4021 Ops.push_back(TexHandle);
4022 Ops.push_back(N->getOperand(2));
4023 Ops.push_back(N->getOperand(3));
4024 Ops.push_back(N->getOperand(4));
4025 Ops.push_back(Chain);
4026 break;
4027 case NVPTXISD::Suld3DI32Clamp:
4028 Opc = NVPTX::SULD_3D_I32_CLAMP;
4029 Ops.push_back(TexHandle);
4030 Ops.push_back(N->getOperand(2));
4031 Ops.push_back(N->getOperand(3));
4032 Ops.push_back(N->getOperand(4));
4033 Ops.push_back(Chain);
4034 break;
4035 case NVPTXISD::Suld3DI64Clamp:
4036 Opc = NVPTX::SULD_3D_I64_CLAMP;
4037 Ops.push_back(TexHandle);
4038 Ops.push_back(N->getOperand(2));
4039 Ops.push_back(N->getOperand(3));
4040 Ops.push_back(N->getOperand(4));
4041 Ops.push_back(Chain);
4042 break;
4043 case NVPTXISD::Suld3DV2I8Clamp:
4044 Opc = NVPTX::SULD_3D_V2I8_CLAMP;
4045 Ops.push_back(TexHandle);
4046 Ops.push_back(N->getOperand(2));
4047 Ops.push_back(N->getOperand(3));
4048 Ops.push_back(N->getOperand(4));
4049 Ops.push_back(Chain);
4050 break;
4051 case NVPTXISD::Suld3DV2I16Clamp:
4052 Opc = NVPTX::SULD_3D_V2I16_CLAMP;
4053 Ops.push_back(TexHandle);
4054 Ops.push_back(N->getOperand(2));
4055 Ops.push_back(N->getOperand(3));
4056 Ops.push_back(N->getOperand(4));
4057 Ops.push_back(Chain);
4058 break;
4059 case NVPTXISD::Suld3DV2I32Clamp:
4060 Opc = NVPTX::SULD_3D_V2I32_CLAMP;
4061 Ops.push_back(TexHandle);
4062 Ops.push_back(N->getOperand(2));
4063 Ops.push_back(N->getOperand(3));
4064 Ops.push_back(N->getOperand(4));
4065 Ops.push_back(Chain);
4066 break;
4067 case NVPTXISD::Suld3DV2I64Clamp:
4068 Opc = NVPTX::SULD_3D_V2I64_CLAMP;
4069 Ops.push_back(TexHandle);
4070 Ops.push_back(N->getOperand(2));
4071 Ops.push_back(N->getOperand(3));
4072 Ops.push_back(N->getOperand(4));
4073 Ops.push_back(Chain);
4074 break;
4075 case NVPTXISD::Suld3DV4I8Clamp:
4076 Opc = NVPTX::SULD_3D_V4I8_CLAMP;
4077 Ops.push_back(TexHandle);
4078 Ops.push_back(N->getOperand(2));
4079 Ops.push_back(N->getOperand(3));
4080 Ops.push_back(N->getOperand(4));
4081 Ops.push_back(Chain);
4082 break;
4083 case NVPTXISD::Suld3DV4I16Clamp:
4084 Opc = NVPTX::SULD_3D_V4I16_CLAMP;
4085 Ops.push_back(TexHandle);
4086 Ops.push_back(N->getOperand(2));
4087 Ops.push_back(N->getOperand(3));
4088 Ops.push_back(N->getOperand(4));
4089 Ops.push_back(Chain);
4090 break;
4091 case NVPTXISD::Suld3DV4I32Clamp:
4092 Opc = NVPTX::SULD_3D_V4I32_CLAMP;
4093 Ops.push_back(TexHandle);
4094 Ops.push_back(N->getOperand(2));
4095 Ops.push_back(N->getOperand(3));
4096 Ops.push_back(N->getOperand(4));
4097 Ops.push_back(Chain);
4098 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004099 case NVPTXISD::Suld1DI8Trap:
4100 Opc = NVPTX::SULD_1D_I8_TRAP;
4101 Ops.push_back(TexHandle);
4102 Ops.push_back(N->getOperand(2));
4103 Ops.push_back(Chain);
4104 break;
4105 case NVPTXISD::Suld1DI16Trap:
4106 Opc = NVPTX::SULD_1D_I16_TRAP;
4107 Ops.push_back(TexHandle);
4108 Ops.push_back(N->getOperand(2));
4109 Ops.push_back(Chain);
4110 break;
4111 case NVPTXISD::Suld1DI32Trap:
4112 Opc = NVPTX::SULD_1D_I32_TRAP;
4113 Ops.push_back(TexHandle);
4114 Ops.push_back(N->getOperand(2));
4115 Ops.push_back(Chain);
4116 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004117 case NVPTXISD::Suld1DI64Trap:
4118 Opc = NVPTX::SULD_1D_I64_TRAP;
4119 Ops.push_back(TexHandle);
4120 Ops.push_back(N->getOperand(2));
4121 Ops.push_back(Chain);
4122 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004123 case NVPTXISD::Suld1DV2I8Trap:
4124 Opc = NVPTX::SULD_1D_V2I8_TRAP;
4125 Ops.push_back(TexHandle);
4126 Ops.push_back(N->getOperand(2));
4127 Ops.push_back(Chain);
4128 break;
4129 case NVPTXISD::Suld1DV2I16Trap:
4130 Opc = NVPTX::SULD_1D_V2I16_TRAP;
4131 Ops.push_back(TexHandle);
4132 Ops.push_back(N->getOperand(2));
4133 Ops.push_back(Chain);
4134 break;
4135 case NVPTXISD::Suld1DV2I32Trap:
4136 Opc = NVPTX::SULD_1D_V2I32_TRAP;
4137 Ops.push_back(TexHandle);
4138 Ops.push_back(N->getOperand(2));
4139 Ops.push_back(Chain);
4140 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004141 case NVPTXISD::Suld1DV2I64Trap:
4142 Opc = NVPTX::SULD_1D_V2I64_TRAP;
4143 Ops.push_back(TexHandle);
4144 Ops.push_back(N->getOperand(2));
4145 Ops.push_back(Chain);
4146 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004147 case NVPTXISD::Suld1DV4I8Trap:
4148 Opc = NVPTX::SULD_1D_V4I8_TRAP;
4149 Ops.push_back(TexHandle);
4150 Ops.push_back(N->getOperand(2));
4151 Ops.push_back(Chain);
4152 break;
4153 case NVPTXISD::Suld1DV4I16Trap:
4154 Opc = NVPTX::SULD_1D_V4I16_TRAP;
4155 Ops.push_back(TexHandle);
4156 Ops.push_back(N->getOperand(2));
4157 Ops.push_back(Chain);
4158 break;
4159 case NVPTXISD::Suld1DV4I32Trap:
4160 Opc = NVPTX::SULD_1D_V4I32_TRAP;
4161 Ops.push_back(TexHandle);
4162 Ops.push_back(N->getOperand(2));
4163 Ops.push_back(Chain);
4164 break;
4165 case NVPTXISD::Suld1DArrayI8Trap:
4166 Opc = NVPTX::SULD_1D_ARRAY_I8_TRAP;
4167 Ops.push_back(TexHandle);
4168 Ops.push_back(N->getOperand(2));
4169 Ops.push_back(N->getOperand(3));
4170 Ops.push_back(Chain);
4171 break;
4172 case NVPTXISD::Suld1DArrayI16Trap:
4173 Opc = NVPTX::SULD_1D_ARRAY_I16_TRAP;
4174 Ops.push_back(TexHandle);
4175 Ops.push_back(N->getOperand(2));
4176 Ops.push_back(N->getOperand(3));
4177 Ops.push_back(Chain);
4178 break;
4179 case NVPTXISD::Suld1DArrayI32Trap:
4180 Opc = NVPTX::SULD_1D_ARRAY_I32_TRAP;
4181 Ops.push_back(TexHandle);
4182 Ops.push_back(N->getOperand(2));
4183 Ops.push_back(N->getOperand(3));
4184 Ops.push_back(Chain);
4185 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004186 case NVPTXISD::Suld1DArrayI64Trap:
4187 Opc = NVPTX::SULD_1D_ARRAY_I64_TRAP;
4188 Ops.push_back(TexHandle);
4189 Ops.push_back(N->getOperand(2));
4190 Ops.push_back(N->getOperand(3));
4191 Ops.push_back(Chain);
4192 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004193 case NVPTXISD::Suld1DArrayV2I8Trap:
4194 Opc = NVPTX::SULD_1D_ARRAY_V2I8_TRAP;
4195 Ops.push_back(TexHandle);
4196 Ops.push_back(N->getOperand(2));
4197 Ops.push_back(N->getOperand(3));
4198 Ops.push_back(Chain);
4199 break;
4200 case NVPTXISD::Suld1DArrayV2I16Trap:
4201 Opc = NVPTX::SULD_1D_ARRAY_V2I16_TRAP;
4202 Ops.push_back(TexHandle);
4203 Ops.push_back(N->getOperand(2));
4204 Ops.push_back(N->getOperand(3));
4205 Ops.push_back(Chain);
4206 break;
4207 case NVPTXISD::Suld1DArrayV2I32Trap:
4208 Opc = NVPTX::SULD_1D_ARRAY_V2I32_TRAP;
4209 Ops.push_back(TexHandle);
4210 Ops.push_back(N->getOperand(2));
4211 Ops.push_back(N->getOperand(3));
4212 Ops.push_back(Chain);
4213 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004214 case NVPTXISD::Suld1DArrayV2I64Trap:
4215 Opc = NVPTX::SULD_1D_ARRAY_V2I64_TRAP;
4216 Ops.push_back(TexHandle);
4217 Ops.push_back(N->getOperand(2));
4218 Ops.push_back(N->getOperand(3));
4219 Ops.push_back(Chain);
4220 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004221 case NVPTXISD::Suld1DArrayV4I8Trap:
4222 Opc = NVPTX::SULD_1D_ARRAY_V4I8_TRAP;
4223 Ops.push_back(TexHandle);
4224 Ops.push_back(N->getOperand(2));
4225 Ops.push_back(N->getOperand(3));
4226 Ops.push_back(Chain);
4227 break;
4228 case NVPTXISD::Suld1DArrayV4I16Trap:
4229 Opc = NVPTX::SULD_1D_ARRAY_V4I16_TRAP;
4230 Ops.push_back(TexHandle);
4231 Ops.push_back(N->getOperand(2));
4232 Ops.push_back(N->getOperand(3));
4233 Ops.push_back(Chain);
4234 break;
4235 case NVPTXISD::Suld1DArrayV4I32Trap:
4236 Opc = NVPTX::SULD_1D_ARRAY_V4I32_TRAP;
4237 Ops.push_back(TexHandle);
4238 Ops.push_back(N->getOperand(2));
4239 Ops.push_back(N->getOperand(3));
4240 Ops.push_back(Chain);
4241 break;
4242 case NVPTXISD::Suld2DI8Trap:
4243 Opc = NVPTX::SULD_2D_I8_TRAP;
4244 Ops.push_back(TexHandle);
4245 Ops.push_back(N->getOperand(2));
4246 Ops.push_back(N->getOperand(3));
4247 Ops.push_back(Chain);
4248 break;
4249 case NVPTXISD::Suld2DI16Trap:
4250 Opc = NVPTX::SULD_2D_I16_TRAP;
4251 Ops.push_back(TexHandle);
4252 Ops.push_back(N->getOperand(2));
4253 Ops.push_back(N->getOperand(3));
4254 Ops.push_back(Chain);
4255 break;
4256 case NVPTXISD::Suld2DI32Trap:
4257 Opc = NVPTX::SULD_2D_I32_TRAP;
4258 Ops.push_back(TexHandle);
4259 Ops.push_back(N->getOperand(2));
4260 Ops.push_back(N->getOperand(3));
4261 Ops.push_back(Chain);
4262 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004263 case NVPTXISD::Suld2DI64Trap:
4264 Opc = NVPTX::SULD_2D_I64_TRAP;
4265 Ops.push_back(TexHandle);
4266 Ops.push_back(N->getOperand(2));
4267 Ops.push_back(N->getOperand(3));
4268 Ops.push_back(Chain);
4269 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004270 case NVPTXISD::Suld2DV2I8Trap:
4271 Opc = NVPTX::SULD_2D_V2I8_TRAP;
4272 Ops.push_back(TexHandle);
4273 Ops.push_back(N->getOperand(2));
4274 Ops.push_back(N->getOperand(3));
4275 Ops.push_back(Chain);
4276 break;
4277 case NVPTXISD::Suld2DV2I16Trap:
4278 Opc = NVPTX::SULD_2D_V2I16_TRAP;
4279 Ops.push_back(TexHandle);
4280 Ops.push_back(N->getOperand(2));
4281 Ops.push_back(N->getOperand(3));
4282 Ops.push_back(Chain);
4283 break;
4284 case NVPTXISD::Suld2DV2I32Trap:
4285 Opc = NVPTX::SULD_2D_V2I32_TRAP;
4286 Ops.push_back(TexHandle);
4287 Ops.push_back(N->getOperand(2));
4288 Ops.push_back(N->getOperand(3));
4289 Ops.push_back(Chain);
4290 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004291 case NVPTXISD::Suld2DV2I64Trap:
4292 Opc = NVPTX::SULD_2D_V2I64_TRAP;
4293 Ops.push_back(TexHandle);
4294 Ops.push_back(N->getOperand(2));
4295 Ops.push_back(N->getOperand(3));
4296 Ops.push_back(Chain);
4297 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004298 case NVPTXISD::Suld2DV4I8Trap:
4299 Opc = NVPTX::SULD_2D_V4I8_TRAP;
4300 Ops.push_back(TexHandle);
4301 Ops.push_back(N->getOperand(2));
4302 Ops.push_back(N->getOperand(3));
4303 Ops.push_back(Chain);
4304 break;
4305 case NVPTXISD::Suld2DV4I16Trap:
4306 Opc = NVPTX::SULD_2D_V4I16_TRAP;
4307 Ops.push_back(TexHandle);
4308 Ops.push_back(N->getOperand(2));
4309 Ops.push_back(N->getOperand(3));
4310 Ops.push_back(Chain);
4311 break;
4312 case NVPTXISD::Suld2DV4I32Trap:
4313 Opc = NVPTX::SULD_2D_V4I32_TRAP;
4314 Ops.push_back(TexHandle);
4315 Ops.push_back(N->getOperand(2));
4316 Ops.push_back(N->getOperand(3));
4317 Ops.push_back(Chain);
4318 break;
4319 case NVPTXISD::Suld2DArrayI8Trap:
4320 Opc = NVPTX::SULD_2D_ARRAY_I8_TRAP;
4321 Ops.push_back(TexHandle);
4322 Ops.push_back(N->getOperand(2));
4323 Ops.push_back(N->getOperand(3));
4324 Ops.push_back(N->getOperand(4));
4325 Ops.push_back(Chain);
4326 break;
4327 case NVPTXISD::Suld2DArrayI16Trap:
4328 Opc = NVPTX::SULD_2D_ARRAY_I16_TRAP;
4329 Ops.push_back(TexHandle);
4330 Ops.push_back(N->getOperand(2));
4331 Ops.push_back(N->getOperand(3));
4332 Ops.push_back(N->getOperand(4));
4333 Ops.push_back(Chain);
4334 break;
4335 case NVPTXISD::Suld2DArrayI32Trap:
4336 Opc = NVPTX::SULD_2D_ARRAY_I32_TRAP;
4337 Ops.push_back(TexHandle);
4338 Ops.push_back(N->getOperand(2));
4339 Ops.push_back(N->getOperand(3));
4340 Ops.push_back(N->getOperand(4));
4341 Ops.push_back(Chain);
4342 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004343 case NVPTXISD::Suld2DArrayI64Trap:
4344 Opc = NVPTX::SULD_2D_ARRAY_I64_TRAP;
4345 Ops.push_back(TexHandle);
4346 Ops.push_back(N->getOperand(2));
4347 Ops.push_back(N->getOperand(3));
4348 Ops.push_back(N->getOperand(4));
4349 Ops.push_back(Chain);
4350 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004351 case NVPTXISD::Suld2DArrayV2I8Trap:
4352 Opc = NVPTX::SULD_2D_ARRAY_V2I8_TRAP;
4353 Ops.push_back(TexHandle);
4354 Ops.push_back(N->getOperand(2));
4355 Ops.push_back(N->getOperand(3));
4356 Ops.push_back(N->getOperand(4));
4357 Ops.push_back(Chain);
4358 break;
4359 case NVPTXISD::Suld2DArrayV2I16Trap:
4360 Opc = NVPTX::SULD_2D_ARRAY_V2I16_TRAP;
4361 Ops.push_back(TexHandle);
4362 Ops.push_back(N->getOperand(2));
4363 Ops.push_back(N->getOperand(3));
4364 Ops.push_back(N->getOperand(4));
4365 Ops.push_back(Chain);
4366 break;
4367 case NVPTXISD::Suld2DArrayV2I32Trap:
4368 Opc = NVPTX::SULD_2D_ARRAY_V2I32_TRAP;
4369 Ops.push_back(TexHandle);
4370 Ops.push_back(N->getOperand(2));
4371 Ops.push_back(N->getOperand(3));
4372 Ops.push_back(N->getOperand(4));
4373 Ops.push_back(Chain);
4374 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004375 case NVPTXISD::Suld2DArrayV2I64Trap:
4376 Opc = NVPTX::SULD_2D_ARRAY_V2I64_TRAP;
4377 Ops.push_back(TexHandle);
4378 Ops.push_back(N->getOperand(2));
4379 Ops.push_back(N->getOperand(3));
4380 Ops.push_back(N->getOperand(4));
4381 Ops.push_back(Chain);
4382 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004383 case NVPTXISD::Suld2DArrayV4I8Trap:
4384 Opc = NVPTX::SULD_2D_ARRAY_V4I8_TRAP;
4385 Ops.push_back(TexHandle);
4386 Ops.push_back(N->getOperand(2));
4387 Ops.push_back(N->getOperand(3));
4388 Ops.push_back(N->getOperand(4));
4389 Ops.push_back(Chain);
4390 break;
4391 case NVPTXISD::Suld2DArrayV4I16Trap:
4392 Opc = NVPTX::SULD_2D_ARRAY_V4I16_TRAP;
4393 Ops.push_back(TexHandle);
4394 Ops.push_back(N->getOperand(2));
4395 Ops.push_back(N->getOperand(3));
4396 Ops.push_back(N->getOperand(4));
4397 Ops.push_back(Chain);
4398 break;
4399 case NVPTXISD::Suld2DArrayV4I32Trap:
4400 Opc = NVPTX::SULD_2D_ARRAY_V4I32_TRAP;
4401 Ops.push_back(TexHandle);
4402 Ops.push_back(N->getOperand(2));
4403 Ops.push_back(N->getOperand(3));
4404 Ops.push_back(N->getOperand(4));
4405 Ops.push_back(Chain);
4406 break;
4407 case NVPTXISD::Suld3DI8Trap:
4408 Opc = NVPTX::SULD_3D_I8_TRAP;
4409 Ops.push_back(TexHandle);
4410 Ops.push_back(N->getOperand(2));
4411 Ops.push_back(N->getOperand(3));
4412 Ops.push_back(N->getOperand(4));
4413 Ops.push_back(Chain);
4414 break;
4415 case NVPTXISD::Suld3DI16Trap:
4416 Opc = NVPTX::SULD_3D_I16_TRAP;
4417 Ops.push_back(TexHandle);
4418 Ops.push_back(N->getOperand(2));
4419 Ops.push_back(N->getOperand(3));
4420 Ops.push_back(N->getOperand(4));
4421 Ops.push_back(Chain);
4422 break;
4423 case NVPTXISD::Suld3DI32Trap:
4424 Opc = NVPTX::SULD_3D_I32_TRAP;
4425 Ops.push_back(TexHandle);
4426 Ops.push_back(N->getOperand(2));
4427 Ops.push_back(N->getOperand(3));
4428 Ops.push_back(N->getOperand(4));
4429 Ops.push_back(Chain);
4430 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004431 case NVPTXISD::Suld3DI64Trap:
4432 Opc = NVPTX::SULD_3D_I64_TRAP;
4433 Ops.push_back(TexHandle);
4434 Ops.push_back(N->getOperand(2));
4435 Ops.push_back(N->getOperand(3));
4436 Ops.push_back(N->getOperand(4));
4437 Ops.push_back(Chain);
4438 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004439 case NVPTXISD::Suld3DV2I8Trap:
4440 Opc = NVPTX::SULD_3D_V2I8_TRAP;
4441 Ops.push_back(TexHandle);
4442 Ops.push_back(N->getOperand(2));
4443 Ops.push_back(N->getOperand(3));
4444 Ops.push_back(N->getOperand(4));
4445 Ops.push_back(Chain);
4446 break;
4447 case NVPTXISD::Suld3DV2I16Trap:
4448 Opc = NVPTX::SULD_3D_V2I16_TRAP;
4449 Ops.push_back(TexHandle);
4450 Ops.push_back(N->getOperand(2));
4451 Ops.push_back(N->getOperand(3));
4452 Ops.push_back(N->getOperand(4));
4453 Ops.push_back(Chain);
4454 break;
4455 case NVPTXISD::Suld3DV2I32Trap:
4456 Opc = NVPTX::SULD_3D_V2I32_TRAP;
4457 Ops.push_back(TexHandle);
4458 Ops.push_back(N->getOperand(2));
4459 Ops.push_back(N->getOperand(3));
4460 Ops.push_back(N->getOperand(4));
4461 Ops.push_back(Chain);
4462 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004463 case NVPTXISD::Suld3DV2I64Trap:
4464 Opc = NVPTX::SULD_3D_V2I64_TRAP;
4465 Ops.push_back(TexHandle);
4466 Ops.push_back(N->getOperand(2));
4467 Ops.push_back(N->getOperand(3));
4468 Ops.push_back(N->getOperand(4));
4469 Ops.push_back(Chain);
4470 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004471 case NVPTXISD::Suld3DV4I8Trap:
4472 Opc = NVPTX::SULD_3D_V4I8_TRAP;
4473 Ops.push_back(TexHandle);
4474 Ops.push_back(N->getOperand(2));
4475 Ops.push_back(N->getOperand(3));
4476 Ops.push_back(N->getOperand(4));
4477 Ops.push_back(Chain);
4478 break;
4479 case NVPTXISD::Suld3DV4I16Trap:
4480 Opc = NVPTX::SULD_3D_V4I16_TRAP;
4481 Ops.push_back(TexHandle);
4482 Ops.push_back(N->getOperand(2));
4483 Ops.push_back(N->getOperand(3));
4484 Ops.push_back(N->getOperand(4));
4485 Ops.push_back(Chain);
4486 break;
4487 case NVPTXISD::Suld3DV4I32Trap:
4488 Opc = NVPTX::SULD_3D_V4I32_TRAP;
4489 Ops.push_back(TexHandle);
4490 Ops.push_back(N->getOperand(2));
4491 Ops.push_back(N->getOperand(3));
4492 Ops.push_back(N->getOperand(4));
4493 Ops.push_back(Chain);
4494 break;
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004495 case NVPTXISD::Suld1DI8Zero:
4496 Opc = NVPTX::SULD_1D_I8_ZERO;
4497 Ops.push_back(TexHandle);
4498 Ops.push_back(N->getOperand(2));
4499 Ops.push_back(Chain);
4500 break;
4501 case NVPTXISD::Suld1DI16Zero:
4502 Opc = NVPTX::SULD_1D_I16_ZERO;
4503 Ops.push_back(TexHandle);
4504 Ops.push_back(N->getOperand(2));
4505 Ops.push_back(Chain);
4506 break;
4507 case NVPTXISD::Suld1DI32Zero:
4508 Opc = NVPTX::SULD_1D_I32_ZERO;
4509 Ops.push_back(TexHandle);
4510 Ops.push_back(N->getOperand(2));
4511 Ops.push_back(Chain);
4512 break;
4513 case NVPTXISD::Suld1DI64Zero:
4514 Opc = NVPTX::SULD_1D_I64_ZERO;
4515 Ops.push_back(TexHandle);
4516 Ops.push_back(N->getOperand(2));
4517 Ops.push_back(Chain);
4518 break;
4519 case NVPTXISD::Suld1DV2I8Zero:
4520 Opc = NVPTX::SULD_1D_V2I8_ZERO;
4521 Ops.push_back(TexHandle);
4522 Ops.push_back(N->getOperand(2));
4523 Ops.push_back(Chain);
4524 break;
4525 case NVPTXISD::Suld1DV2I16Zero:
4526 Opc = NVPTX::SULD_1D_V2I16_ZERO;
4527 Ops.push_back(TexHandle);
4528 Ops.push_back(N->getOperand(2));
4529 Ops.push_back(Chain);
4530 break;
4531 case NVPTXISD::Suld1DV2I32Zero:
4532 Opc = NVPTX::SULD_1D_V2I32_ZERO;
4533 Ops.push_back(TexHandle);
4534 Ops.push_back(N->getOperand(2));
4535 Ops.push_back(Chain);
4536 break;
4537 case NVPTXISD::Suld1DV2I64Zero:
4538 Opc = NVPTX::SULD_1D_V2I64_ZERO;
4539 Ops.push_back(TexHandle);
4540 Ops.push_back(N->getOperand(2));
4541 Ops.push_back(Chain);
4542 break;
4543 case NVPTXISD::Suld1DV4I8Zero:
4544 Opc = NVPTX::SULD_1D_V4I8_ZERO;
4545 Ops.push_back(TexHandle);
4546 Ops.push_back(N->getOperand(2));
4547 Ops.push_back(Chain);
4548 break;
4549 case NVPTXISD::Suld1DV4I16Zero:
4550 Opc = NVPTX::SULD_1D_V4I16_ZERO;
4551 Ops.push_back(TexHandle);
4552 Ops.push_back(N->getOperand(2));
4553 Ops.push_back(Chain);
4554 break;
4555 case NVPTXISD::Suld1DV4I32Zero:
4556 Opc = NVPTX::SULD_1D_V4I32_ZERO;
4557 Ops.push_back(TexHandle);
4558 Ops.push_back(N->getOperand(2));
4559 Ops.push_back(Chain);
4560 break;
4561 case NVPTXISD::Suld1DArrayI8Zero:
4562 Opc = NVPTX::SULD_1D_ARRAY_I8_ZERO;
4563 Ops.push_back(TexHandle);
4564 Ops.push_back(N->getOperand(2));
4565 Ops.push_back(N->getOperand(3));
4566 Ops.push_back(Chain);
4567 break;
4568 case NVPTXISD::Suld1DArrayI16Zero:
4569 Opc = NVPTX::SULD_1D_ARRAY_I16_ZERO;
4570 Ops.push_back(TexHandle);
4571 Ops.push_back(N->getOperand(2));
4572 Ops.push_back(N->getOperand(3));
4573 Ops.push_back(Chain);
4574 break;
4575 case NVPTXISD::Suld1DArrayI32Zero:
4576 Opc = NVPTX::SULD_1D_ARRAY_I32_ZERO;
4577 Ops.push_back(TexHandle);
4578 Ops.push_back(N->getOperand(2));
4579 Ops.push_back(N->getOperand(3));
4580 Ops.push_back(Chain);
4581 break;
4582 case NVPTXISD::Suld1DArrayI64Zero:
4583 Opc = NVPTX::SULD_1D_ARRAY_I64_ZERO;
4584 Ops.push_back(TexHandle);
4585 Ops.push_back(N->getOperand(2));
4586 Ops.push_back(N->getOperand(3));
4587 Ops.push_back(Chain);
4588 break;
4589 case NVPTXISD::Suld1DArrayV2I8Zero:
4590 Opc = NVPTX::SULD_1D_ARRAY_V2I8_ZERO;
4591 Ops.push_back(TexHandle);
4592 Ops.push_back(N->getOperand(2));
4593 Ops.push_back(N->getOperand(3));
4594 Ops.push_back(Chain);
4595 break;
4596 case NVPTXISD::Suld1DArrayV2I16Zero:
4597 Opc = NVPTX::SULD_1D_ARRAY_V2I16_ZERO;
4598 Ops.push_back(TexHandle);
4599 Ops.push_back(N->getOperand(2));
4600 Ops.push_back(N->getOperand(3));
4601 Ops.push_back(Chain);
4602 break;
4603 case NVPTXISD::Suld1DArrayV2I32Zero:
4604 Opc = NVPTX::SULD_1D_ARRAY_V2I32_ZERO;
4605 Ops.push_back(TexHandle);
4606 Ops.push_back(N->getOperand(2));
4607 Ops.push_back(N->getOperand(3));
4608 Ops.push_back(Chain);
4609 break;
4610 case NVPTXISD::Suld1DArrayV2I64Zero:
4611 Opc = NVPTX::SULD_1D_ARRAY_V2I64_ZERO;
4612 Ops.push_back(TexHandle);
4613 Ops.push_back(N->getOperand(2));
4614 Ops.push_back(N->getOperand(3));
4615 Ops.push_back(Chain);
4616 break;
4617 case NVPTXISD::Suld1DArrayV4I8Zero:
4618 Opc = NVPTX::SULD_1D_ARRAY_V4I8_ZERO;
4619 Ops.push_back(TexHandle);
4620 Ops.push_back(N->getOperand(2));
4621 Ops.push_back(N->getOperand(3));
4622 Ops.push_back(Chain);
4623 break;
4624 case NVPTXISD::Suld1DArrayV4I16Zero:
4625 Opc = NVPTX::SULD_1D_ARRAY_V4I16_ZERO;
4626 Ops.push_back(TexHandle);
4627 Ops.push_back(N->getOperand(2));
4628 Ops.push_back(N->getOperand(3));
4629 Ops.push_back(Chain);
4630 break;
4631 case NVPTXISD::Suld1DArrayV4I32Zero:
4632 Opc = NVPTX::SULD_1D_ARRAY_V4I32_ZERO;
4633 Ops.push_back(TexHandle);
4634 Ops.push_back(N->getOperand(2));
4635 Ops.push_back(N->getOperand(3));
4636 Ops.push_back(Chain);
4637 break;
4638 case NVPTXISD::Suld2DI8Zero:
4639 Opc = NVPTX::SULD_2D_I8_ZERO;
4640 Ops.push_back(TexHandle);
4641 Ops.push_back(N->getOperand(2));
4642 Ops.push_back(N->getOperand(3));
4643 Ops.push_back(Chain);
4644 break;
4645 case NVPTXISD::Suld2DI16Zero:
4646 Opc = NVPTX::SULD_2D_I16_ZERO;
4647 Ops.push_back(TexHandle);
4648 Ops.push_back(N->getOperand(2));
4649 Ops.push_back(N->getOperand(3));
4650 Ops.push_back(Chain);
4651 break;
4652 case NVPTXISD::Suld2DI32Zero:
4653 Opc = NVPTX::SULD_2D_I32_ZERO;
4654 Ops.push_back(TexHandle);
4655 Ops.push_back(N->getOperand(2));
4656 Ops.push_back(N->getOperand(3));
4657 Ops.push_back(Chain);
4658 break;
4659 case NVPTXISD::Suld2DI64Zero:
4660 Opc = NVPTX::SULD_2D_I64_ZERO;
4661 Ops.push_back(TexHandle);
4662 Ops.push_back(N->getOperand(2));
4663 Ops.push_back(N->getOperand(3));
4664 Ops.push_back(Chain);
4665 break;
4666 case NVPTXISD::Suld2DV2I8Zero:
4667 Opc = NVPTX::SULD_2D_V2I8_ZERO;
4668 Ops.push_back(TexHandle);
4669 Ops.push_back(N->getOperand(2));
4670 Ops.push_back(N->getOperand(3));
4671 Ops.push_back(Chain);
4672 break;
4673 case NVPTXISD::Suld2DV2I16Zero:
4674 Opc = NVPTX::SULD_2D_V2I16_ZERO;
4675 Ops.push_back(TexHandle);
4676 Ops.push_back(N->getOperand(2));
4677 Ops.push_back(N->getOperand(3));
4678 Ops.push_back(Chain);
4679 break;
4680 case NVPTXISD::Suld2DV2I32Zero:
4681 Opc = NVPTX::SULD_2D_V2I32_ZERO;
4682 Ops.push_back(TexHandle);
4683 Ops.push_back(N->getOperand(2));
4684 Ops.push_back(N->getOperand(3));
4685 Ops.push_back(Chain);
4686 break;
4687 case NVPTXISD::Suld2DV2I64Zero:
4688 Opc = NVPTX::SULD_2D_V2I64_ZERO;
4689 Ops.push_back(TexHandle);
4690 Ops.push_back(N->getOperand(2));
4691 Ops.push_back(N->getOperand(3));
4692 Ops.push_back(Chain);
4693 break;
4694 case NVPTXISD::Suld2DV4I8Zero:
4695 Opc = NVPTX::SULD_2D_V4I8_ZERO;
4696 Ops.push_back(TexHandle);
4697 Ops.push_back(N->getOperand(2));
4698 Ops.push_back(N->getOperand(3));
4699 Ops.push_back(Chain);
4700 break;
4701 case NVPTXISD::Suld2DV4I16Zero:
4702 Opc = NVPTX::SULD_2D_V4I16_ZERO;
4703 Ops.push_back(TexHandle);
4704 Ops.push_back(N->getOperand(2));
4705 Ops.push_back(N->getOperand(3));
4706 Ops.push_back(Chain);
4707 break;
4708 case NVPTXISD::Suld2DV4I32Zero:
4709 Opc = NVPTX::SULD_2D_V4I32_ZERO;
4710 Ops.push_back(TexHandle);
4711 Ops.push_back(N->getOperand(2));
4712 Ops.push_back(N->getOperand(3));
4713 Ops.push_back(Chain);
4714 break;
4715 case NVPTXISD::Suld2DArrayI8Zero:
4716 Opc = NVPTX::SULD_2D_ARRAY_I8_ZERO;
4717 Ops.push_back(TexHandle);
4718 Ops.push_back(N->getOperand(2));
4719 Ops.push_back(N->getOperand(3));
4720 Ops.push_back(N->getOperand(4));
4721 Ops.push_back(Chain);
4722 break;
4723 case NVPTXISD::Suld2DArrayI16Zero:
4724 Opc = NVPTX::SULD_2D_ARRAY_I16_ZERO;
4725 Ops.push_back(TexHandle);
4726 Ops.push_back(N->getOperand(2));
4727 Ops.push_back(N->getOperand(3));
4728 Ops.push_back(N->getOperand(4));
4729 Ops.push_back(Chain);
4730 break;
4731 case NVPTXISD::Suld2DArrayI32Zero:
4732 Opc = NVPTX::SULD_2D_ARRAY_I32_ZERO;
4733 Ops.push_back(TexHandle);
4734 Ops.push_back(N->getOperand(2));
4735 Ops.push_back(N->getOperand(3));
4736 Ops.push_back(N->getOperand(4));
4737 Ops.push_back(Chain);
4738 break;
4739 case NVPTXISD::Suld2DArrayI64Zero:
4740 Opc = NVPTX::SULD_2D_ARRAY_I64_ZERO;
4741 Ops.push_back(TexHandle);
4742 Ops.push_back(N->getOperand(2));
4743 Ops.push_back(N->getOperand(3));
4744 Ops.push_back(N->getOperand(4));
4745 Ops.push_back(Chain);
4746 break;
4747 case NVPTXISD::Suld2DArrayV2I8Zero:
4748 Opc = NVPTX::SULD_2D_ARRAY_V2I8_ZERO;
4749 Ops.push_back(TexHandle);
4750 Ops.push_back(N->getOperand(2));
4751 Ops.push_back(N->getOperand(3));
4752 Ops.push_back(N->getOperand(4));
4753 Ops.push_back(Chain);
4754 break;
4755 case NVPTXISD::Suld2DArrayV2I16Zero:
4756 Opc = NVPTX::SULD_2D_ARRAY_V2I16_ZERO;
4757 Ops.push_back(TexHandle);
4758 Ops.push_back(N->getOperand(2));
4759 Ops.push_back(N->getOperand(3));
4760 Ops.push_back(N->getOperand(4));
4761 Ops.push_back(Chain);
4762 break;
4763 case NVPTXISD::Suld2DArrayV2I32Zero:
4764 Opc = NVPTX::SULD_2D_ARRAY_V2I32_ZERO;
4765 Ops.push_back(TexHandle);
4766 Ops.push_back(N->getOperand(2));
4767 Ops.push_back(N->getOperand(3));
4768 Ops.push_back(N->getOperand(4));
4769 Ops.push_back(Chain);
4770 break;
4771 case NVPTXISD::Suld2DArrayV2I64Zero:
4772 Opc = NVPTX::SULD_2D_ARRAY_V2I64_ZERO;
4773 Ops.push_back(TexHandle);
4774 Ops.push_back(N->getOperand(2));
4775 Ops.push_back(N->getOperand(3));
4776 Ops.push_back(N->getOperand(4));
4777 Ops.push_back(Chain);
4778 break;
4779 case NVPTXISD::Suld2DArrayV4I8Zero:
4780 Opc = NVPTX::SULD_2D_ARRAY_V4I8_ZERO;
4781 Ops.push_back(TexHandle);
4782 Ops.push_back(N->getOperand(2));
4783 Ops.push_back(N->getOperand(3));
4784 Ops.push_back(N->getOperand(4));
4785 Ops.push_back(Chain);
4786 break;
4787 case NVPTXISD::Suld2DArrayV4I16Zero:
4788 Opc = NVPTX::SULD_2D_ARRAY_V4I16_ZERO;
4789 Ops.push_back(TexHandle);
4790 Ops.push_back(N->getOperand(2));
4791 Ops.push_back(N->getOperand(3));
4792 Ops.push_back(N->getOperand(4));
4793 Ops.push_back(Chain);
4794 break;
4795 case NVPTXISD::Suld2DArrayV4I32Zero:
4796 Opc = NVPTX::SULD_2D_ARRAY_V4I32_ZERO;
4797 Ops.push_back(TexHandle);
4798 Ops.push_back(N->getOperand(2));
4799 Ops.push_back(N->getOperand(3));
4800 Ops.push_back(N->getOperand(4));
4801 Ops.push_back(Chain);
4802 break;
4803 case NVPTXISD::Suld3DI8Zero:
4804 Opc = NVPTX::SULD_3D_I8_ZERO;
4805 Ops.push_back(TexHandle);
4806 Ops.push_back(N->getOperand(2));
4807 Ops.push_back(N->getOperand(3));
4808 Ops.push_back(N->getOperand(4));
4809 Ops.push_back(Chain);
4810 break;
4811 case NVPTXISD::Suld3DI16Zero:
4812 Opc = NVPTX::SULD_3D_I16_ZERO;
4813 Ops.push_back(TexHandle);
4814 Ops.push_back(N->getOperand(2));
4815 Ops.push_back(N->getOperand(3));
4816 Ops.push_back(N->getOperand(4));
4817 Ops.push_back(Chain);
4818 break;
4819 case NVPTXISD::Suld3DI32Zero:
4820 Opc = NVPTX::SULD_3D_I32_ZERO;
4821 Ops.push_back(TexHandle);
4822 Ops.push_back(N->getOperand(2));
4823 Ops.push_back(N->getOperand(3));
4824 Ops.push_back(N->getOperand(4));
4825 Ops.push_back(Chain);
4826 break;
4827 case NVPTXISD::Suld3DI64Zero:
4828 Opc = NVPTX::SULD_3D_I64_ZERO;
4829 Ops.push_back(TexHandle);
4830 Ops.push_back(N->getOperand(2));
4831 Ops.push_back(N->getOperand(3));
4832 Ops.push_back(N->getOperand(4));
4833 Ops.push_back(Chain);
4834 break;
4835 case NVPTXISD::Suld3DV2I8Zero:
4836 Opc = NVPTX::SULD_3D_V2I8_ZERO;
4837 Ops.push_back(TexHandle);
4838 Ops.push_back(N->getOperand(2));
4839 Ops.push_back(N->getOperand(3));
4840 Ops.push_back(N->getOperand(4));
4841 Ops.push_back(Chain);
4842 break;
4843 case NVPTXISD::Suld3DV2I16Zero:
4844 Opc = NVPTX::SULD_3D_V2I16_ZERO;
4845 Ops.push_back(TexHandle);
4846 Ops.push_back(N->getOperand(2));
4847 Ops.push_back(N->getOperand(3));
4848 Ops.push_back(N->getOperand(4));
4849 Ops.push_back(Chain);
4850 break;
4851 case NVPTXISD::Suld3DV2I32Zero:
4852 Opc = NVPTX::SULD_3D_V2I32_ZERO;
4853 Ops.push_back(TexHandle);
4854 Ops.push_back(N->getOperand(2));
4855 Ops.push_back(N->getOperand(3));
4856 Ops.push_back(N->getOperand(4));
4857 Ops.push_back(Chain);
4858 break;
4859 case NVPTXISD::Suld3DV2I64Zero:
4860 Opc = NVPTX::SULD_3D_V2I64_ZERO;
4861 Ops.push_back(TexHandle);
4862 Ops.push_back(N->getOperand(2));
4863 Ops.push_back(N->getOperand(3));
4864 Ops.push_back(N->getOperand(4));
4865 Ops.push_back(Chain);
4866 break;
4867 case NVPTXISD::Suld3DV4I8Zero:
4868 Opc = NVPTX::SULD_3D_V4I8_ZERO;
4869 Ops.push_back(TexHandle);
4870 Ops.push_back(N->getOperand(2));
4871 Ops.push_back(N->getOperand(3));
4872 Ops.push_back(N->getOperand(4));
4873 Ops.push_back(Chain);
4874 break;
4875 case NVPTXISD::Suld3DV4I16Zero:
4876 Opc = NVPTX::SULD_3D_V4I16_ZERO;
4877 Ops.push_back(TexHandle);
4878 Ops.push_back(N->getOperand(2));
4879 Ops.push_back(N->getOperand(3));
4880 Ops.push_back(N->getOperand(4));
4881 Ops.push_back(Chain);
4882 break;
4883 case NVPTXISD::Suld3DV4I32Zero:
4884 Opc = NVPTX::SULD_3D_V4I32_ZERO;
4885 Ops.push_back(TexHandle);
4886 Ops.push_back(N->getOperand(2));
4887 Ops.push_back(N->getOperand(3));
4888 Ops.push_back(N->getOperand(4));
4889 Ops.push_back(Chain);
4890 break;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004891 }
Justin Bogner8d83fb62016-05-13 21:12:53 +00004892 ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getVTList(), Ops));
4893 return true;
Justin Holewinski30d56a72014-04-09 15:39:15 +00004894}
4895
Justin Holewinski9a2350e2014-07-17 11:59:04 +00004896
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004897/// SelectBFE - Look for instruction sequences that can be made more efficient
4898/// by using the 'bfe' (bit-field extract) PTX instruction
Justin Bogner8d83fb62016-05-13 21:12:53 +00004899bool NVPTXDAGToDAGISel::tryBFE(SDNode *N) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004900 SDLoc DL(N);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004901 SDValue LHS = N->getOperand(0);
4902 SDValue RHS = N->getOperand(1);
4903 SDValue Len;
4904 SDValue Start;
4905 SDValue Val;
4906 bool IsSigned = false;
4907
4908 if (N->getOpcode() == ISD::AND) {
4909 // Canonicalize the operands
4910 // We want 'and %val, %mask'
4911 if (isa<ConstantSDNode>(LHS) && !isa<ConstantSDNode>(RHS)) {
4912 std::swap(LHS, RHS);
4913 }
4914
4915 ConstantSDNode *Mask = dyn_cast<ConstantSDNode>(RHS);
4916 if (!Mask) {
4917 // We need a constant mask on the RHS of the AND
Justin Bogner8d83fb62016-05-13 21:12:53 +00004918 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004919 }
4920
4921 // Extract the mask bits
4922 uint64_t MaskVal = Mask->getZExtValue();
4923 if (!isMask_64(MaskVal)) {
4924 // We *could* handle shifted masks here, but doing so would require an
4925 // 'and' operation to fix up the low-order bits so we would trade
4926 // shr+and for bfe+and, which has the same throughput
Justin Bogner8d83fb62016-05-13 21:12:53 +00004927 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004928 }
4929
4930 // How many bits are in our mask?
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004931 uint64_t NumBits = countTrailingOnes(MaskVal);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004932 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004933
4934 if (LHS.getOpcode() == ISD::SRL || LHS.getOpcode() == ISD::SRA) {
4935 // We have a 'srl/and' pair, extract the effective start bit and length
4936 Val = LHS.getNode()->getOperand(0);
4937 Start = LHS.getNode()->getOperand(1);
4938 ConstantSDNode *StartConst = dyn_cast<ConstantSDNode>(Start);
4939 if (StartConst) {
4940 uint64_t StartVal = StartConst->getZExtValue();
4941 // How many "good" bits do we have left? "good" is defined here as bits
4942 // that exist in the original value, not shifted in.
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00004943 uint64_t GoodBits = Start.getValueSizeInBits() - StartVal;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004944 if (NumBits > GoodBits) {
4945 // Do not handle the case where bits have been shifted in. In theory
4946 // we could handle this, but the cost is likely higher than just
4947 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004948 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004949 }
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00004950 Start = CurDAG->getTargetConstant(StartVal, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004951 } else {
4952 // Do not handle the case where the shift amount (can be zero if no srl
4953 // was found) is not constant. We could handle this case, but it would
4954 // require run-time logic that would be more expensive than just
4955 // emitting the srl/and pair.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004956 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004957 }
4958 } else {
4959 // Do not handle the case where the LHS of the and is not a shift. While
4960 // it would be trivial to handle this case, it would just transform
4961 // 'and' -> 'bfe', but 'and' has higher-throughput.
Justin Bogner8d83fb62016-05-13 21:12:53 +00004962 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004963 }
4964 } else if (N->getOpcode() == ISD::SRL || N->getOpcode() == ISD::SRA) {
4965 if (LHS->getOpcode() == ISD::AND) {
4966 ConstantSDNode *ShiftCnst = dyn_cast<ConstantSDNode>(RHS);
4967 if (!ShiftCnst) {
4968 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00004969 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004970 }
4971
4972 uint64_t ShiftAmt = ShiftCnst->getZExtValue();
4973
4974 SDValue AndLHS = LHS->getOperand(0);
4975 SDValue AndRHS = LHS->getOperand(1);
4976
4977 // Canonicalize the AND to have the mask on the RHS
4978 if (isa<ConstantSDNode>(AndLHS)) {
4979 std::swap(AndLHS, AndRHS);
4980 }
4981
4982 ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(AndRHS);
4983 if (!MaskCnst) {
4984 // Mask must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00004985 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004986 }
4987
4988 uint64_t MaskVal = MaskCnst->getZExtValue();
4989 uint64_t NumZeros;
4990 uint64_t NumBits;
4991 if (isMask_64(MaskVal)) {
4992 NumZeros = 0;
4993 // The number of bits in the result bitfield will be the number of
4994 // trailing ones (the AND) minus the number of bits we shift off
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004995 NumBits = countTrailingOnes(MaskVal) - ShiftAmt;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004996 } else if (isShiftedMask_64(MaskVal)) {
4997 NumZeros = countTrailingZeros(MaskVal);
Benjamin Kramer5f6a9072015-02-12 15:35:40 +00004998 unsigned NumOnes = countTrailingOnes(MaskVal >> NumZeros);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00004999 // The number of bits in the result bitfield will be the number of
5000 // trailing zeros plus the number of set bits in the mask minus the
5001 // number of bits we shift off
5002 NumBits = NumZeros + NumOnes - ShiftAmt;
5003 } else {
5004 // This is not a mask we can handle
Justin Bogner8d83fb62016-05-13 21:12:53 +00005005 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005006 }
5007
5008 if (ShiftAmt < NumZeros) {
5009 // Handling this case would require extra logic that would make this
5010 // transformation non-profitable
Justin Bogner8d83fb62016-05-13 21:12:53 +00005011 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005012 }
5013
5014 Val = AndLHS;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005015 Start = CurDAG->getTargetConstant(ShiftAmt, DL, MVT::i32);
5016 Len = CurDAG->getTargetConstant(NumBits, DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005017 } else if (LHS->getOpcode() == ISD::SHL) {
5018 // Here, we have a pattern like:
5019 //
5020 // (sra (shl val, NN), MM)
5021 // or
5022 // (srl (shl val, NN), MM)
5023 //
5024 // If MM >= NN, we can efficiently optimize this with bfe
5025 Val = LHS->getOperand(0);
5026
5027 SDValue ShlRHS = LHS->getOperand(1);
5028 ConstantSDNode *ShlCnst = dyn_cast<ConstantSDNode>(ShlRHS);
5029 if (!ShlCnst) {
5030 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005031 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005032 }
5033 uint64_t InnerShiftAmt = ShlCnst->getZExtValue();
5034
5035 SDValue ShrRHS = RHS;
5036 ConstantSDNode *ShrCnst = dyn_cast<ConstantSDNode>(ShrRHS);
5037 if (!ShrCnst) {
5038 // Shift amount must be constant
Justin Bogner8d83fb62016-05-13 21:12:53 +00005039 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005040 }
5041 uint64_t OuterShiftAmt = ShrCnst->getZExtValue();
5042
5043 // To avoid extra codegen and be profitable, we need Outer >= Inner
5044 if (OuterShiftAmt < InnerShiftAmt) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005045 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005046 }
5047
5048 // If the outer shift is more than the type size, we have no bitfield to
5049 // extract (since we also check that the inner shift is <= the outer shift
5050 // then this also implies that the inner shift is < the type size)
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00005051 if (OuterShiftAmt >= Val.getValueSizeInBits()) {
Justin Bogner8d83fb62016-05-13 21:12:53 +00005052 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005053 }
5054
Sanjay Patelb1f0a0f2016-09-14 16:05:51 +00005055 Start = CurDAG->getTargetConstant(OuterShiftAmt - InnerShiftAmt, DL,
5056 MVT::i32);
5057 Len = CurDAG->getTargetConstant(Val.getValueSizeInBits() - OuterShiftAmt,
5058 DL, MVT::i32);
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005059
5060 if (N->getOpcode() == ISD::SRA) {
5061 // If we have a arithmetic right shift, we need to use the signed bfe
5062 // variant
5063 IsSigned = true;
5064 }
5065 } else {
5066 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005067 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005068 }
5069 } else {
5070 // No can do...
Justin Bogner8d83fb62016-05-13 21:12:53 +00005071 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005072 }
5073
5074
5075 unsigned Opc;
5076 // For the BFE operations we form here from "and" and "srl", always use the
5077 // unsigned variants.
5078 if (Val.getValueType() == MVT::i32) {
5079 if (IsSigned) {
5080 Opc = NVPTX::BFE_S32rii;
5081 } else {
5082 Opc = NVPTX::BFE_U32rii;
5083 }
5084 } else if (Val.getValueType() == MVT::i64) {
5085 if (IsSigned) {
5086 Opc = NVPTX::BFE_S64rii;
5087 } else {
5088 Opc = NVPTX::BFE_U64rii;
5089 }
5090 } else {
5091 // We cannot handle this type
Justin Bogner8d83fb62016-05-13 21:12:53 +00005092 return false;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005093 }
5094
5095 SDValue Ops[] = {
5096 Val, Start, Len
5097 };
5098
Justin Bogner8d83fb62016-05-13 21:12:53 +00005099 ReplaceNode(N, CurDAG->getMachineNode(Opc, DL, N->getVTList(), Ops));
5100 return true;
Justin Holewinskica7a4f12014-06-27 18:35:27 +00005101}
5102
Justin Holewinskiae556d32012-05-04 20:18:50 +00005103// SelectDirectAddr - Match a direct address for DAG.
5104// A direct address could be a globaladdress or externalsymbol.
5105bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
5106 // Return true if TGA or ES.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005107 if (N.getOpcode() == ISD::TargetGlobalAddress ||
5108 N.getOpcode() == ISD::TargetExternalSymbol) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005109 Address = N;
5110 return true;
5111 }
5112 if (N.getOpcode() == NVPTXISD::Wrapper) {
5113 Address = N.getOperand(0);
5114 return true;
5115 }
Artem Belevichb2e76a52016-07-20 18:39:47 +00005116 // addrspacecast(MoveParam(arg_symbol) to addrspace(PARAM)) -> arg_symbol
5117 if (AddrSpaceCastSDNode *CastN = dyn_cast<AddrSpaceCastSDNode>(N)) {
5118 if (CastN->getSrcAddressSpace() == ADDRESS_SPACE_GENERIC &&
5119 CastN->getDestAddressSpace() == ADDRESS_SPACE_PARAM &&
5120 CastN->getOperand(0).getOpcode() == NVPTXISD::MoveParam)
5121 return SelectDirectAddr(CastN->getOperand(0).getOperand(0), Address);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005122 }
5123 return false;
5124}
5125
5126// symbol+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005127bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
5128 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005129 if (Addr.getOpcode() == ISD::ADD) {
5130 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005131 SDValue base = Addr.getOperand(0);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005132 if (SelectDirectAddr(base, Base)) {
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005133 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5134 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005135 return true;
5136 }
5137 }
5138 }
5139 return false;
5140}
5141
5142// symbol+offset
5143bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
5144 SDValue &Base, SDValue &Offset) {
5145 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
5146}
5147
5148// symbol+offset
5149bool NVPTXDAGToDAGISel::SelectADDRsi64(SDNode *OpNode, SDValue Addr,
5150 SDValue &Base, SDValue &Offset) {
5151 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
5152}
5153
5154// register+offset
Justin Holewinski0497ab12013-03-30 14:29:21 +00005155bool NVPTXDAGToDAGISel::SelectADDRri_imp(
5156 SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005157 if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
5158 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005159 Offset = CurDAG->getTargetConstant(0, SDLoc(OpNode), mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005160 return true;
5161 }
5162 if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
5163 Addr.getOpcode() == ISD::TargetGlobalAddress)
Justin Holewinski0497ab12013-03-30 14:29:21 +00005164 return false; // direct calls.
Justin Holewinskiae556d32012-05-04 20:18:50 +00005165
5166 if (Addr.getOpcode() == ISD::ADD) {
5167 if (SelectDirectAddr(Addr.getOperand(0), Addr)) {
5168 return false;
5169 }
5170 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
5171 if (FrameIndexSDNode *FIN =
Justin Holewinski0497ab12013-03-30 14:29:21 +00005172 dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005173 // Constant offset from frame ref.
5174 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
5175 else
5176 Base = Addr.getOperand(0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005177 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
5178 mvt);
Justin Holewinskiae556d32012-05-04 20:18:50 +00005179 return true;
5180 }
5181 }
5182 return false;
5183}
5184
5185// register+offset
5186bool NVPTXDAGToDAGISel::SelectADDRri(SDNode *OpNode, SDValue Addr,
5187 SDValue &Base, SDValue &Offset) {
5188 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
5189}
5190
5191// register+offset
5192bool NVPTXDAGToDAGISel::SelectADDRri64(SDNode *OpNode, SDValue Addr,
5193 SDValue &Base, SDValue &Offset) {
5194 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
5195}
5196
5197bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(SDNode *N,
5198 unsigned int spN) const {
Craig Topper062a2ba2014-04-25 05:30:21 +00005199 const Value *Src = nullptr;
Justin Holewinskiae556d32012-05-04 20:18:50 +00005200 if (MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
Nick Lewyckyaad475b2014-04-15 07:22:52 +00005201 if (spN == 0 && mN->getMemOperand()->getPseudoValue())
5202 return true;
5203 Src = mN->getMemOperand()->getValue();
Justin Holewinskiae556d32012-05-04 20:18:50 +00005204 }
5205 if (!Src)
5206 return false;
Craig Toppere3dcce92015-08-01 22:20:21 +00005207 if (auto *PT = dyn_cast<PointerType>(Src->getType()))
Justin Holewinskiae556d32012-05-04 20:18:50 +00005208 return (PT->getAddressSpace() == spN);
5209 return false;
5210}
5211
5212/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
5213/// inline asm expressions.
Justin Holewinski0497ab12013-03-30 14:29:21 +00005214bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
Daniel Sanders60f1db02015-03-13 12:45:09 +00005215 const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
Justin Holewinskiae556d32012-05-04 20:18:50 +00005216 SDValue Op0, Op1;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005217 switch (ConstraintID) {
Justin Holewinski0497ab12013-03-30 14:29:21 +00005218 default:
5219 return true;
Daniel Sanders60f1db02015-03-13 12:45:09 +00005220 case InlineAsm::Constraint_m: // memory
Justin Holewinskiae556d32012-05-04 20:18:50 +00005221 if (SelectDirectAddr(Op, Op0)) {
5222 OutOps.push_back(Op0);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +00005223 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
Justin Holewinskiae556d32012-05-04 20:18:50 +00005224 return false;
5225 }
5226 if (SelectADDRri(Op.getNode(), Op, Op0, Op1)) {
5227 OutOps.push_back(Op0);
5228 OutOps.push_back(Op1);
5229 return false;
5230 }
5231 break;
5232 }
5233 return true;
5234}
Justin Holewinski9a6ea2c2016-05-02 18:12:02 +00005235
5236/// GetConvertOpcode - Returns the CVT_ instruction opcode that implements a
5237/// conversion from \p SrcTy to \p DestTy.
5238unsigned NVPTXDAGToDAGISel::GetConvertOpcode(MVT DestTy, MVT SrcTy,
5239 bool IsSigned) {
5240 switch (SrcTy.SimpleTy) {
5241 default:
5242 llvm_unreachable("Unhandled source type");
5243 case MVT::i8:
5244 switch (DestTy.SimpleTy) {
5245 default:
5246 llvm_unreachable("Unhandled dest type");
5247 case MVT::i16:
5248 return IsSigned ? NVPTX::CVT_s16_s8 : NVPTX::CVT_u16_u8;
5249 case MVT::i32:
5250 return IsSigned ? NVPTX::CVT_s32_s8 : NVPTX::CVT_u32_u8;
5251 case MVT::i64:
5252 return IsSigned ? NVPTX::CVT_s64_s8 : NVPTX::CVT_u64_u8;
5253 }
5254 case MVT::i16:
5255 switch (DestTy.SimpleTy) {
5256 default:
5257 llvm_unreachable("Unhandled dest type");
5258 case MVT::i8:
5259 return IsSigned ? NVPTX::CVT_s8_s16 : NVPTX::CVT_u8_u16;
5260 case MVT::i32:
5261 return IsSigned ? NVPTX::CVT_s32_s16 : NVPTX::CVT_u32_u16;
5262 case MVT::i64:
5263 return IsSigned ? NVPTX::CVT_s64_s16 : NVPTX::CVT_u64_u16;
5264 }
5265 case MVT::i32:
5266 switch (DestTy.SimpleTy) {
5267 default:
5268 llvm_unreachable("Unhandled dest type");
5269 case MVT::i8:
5270 return IsSigned ? NVPTX::CVT_s8_s32 : NVPTX::CVT_u8_u32;
5271 case MVT::i16:
5272 return IsSigned ? NVPTX::CVT_s16_s32 : NVPTX::CVT_u16_u32;
5273 case MVT::i64:
5274 return IsSigned ? NVPTX::CVT_s64_s32 : NVPTX::CVT_u64_u32;
5275 }
5276 case MVT::i64:
5277 switch (DestTy.SimpleTy) {
5278 default:
5279 llvm_unreachable("Unhandled dest type");
5280 case MVT::i8:
5281 return IsSigned ? NVPTX::CVT_s8_s64 : NVPTX::CVT_u8_u64;
5282 case MVT::i16:
5283 return IsSigned ? NVPTX::CVT_s16_s64 : NVPTX::CVT_u16_u64;
5284 case MVT::i32:
5285 return IsSigned ? NVPTX::CVT_s32_s64 : NVPTX::CVT_u32_u64;
5286 }
5287 }
5288}