1239310Sdim//===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===//
2239310Sdim//
3239310Sdim//                     The LLVM Compiler Infrastructure
4239310Sdim//
5239310Sdim// This file is distributed under the University of Illinois Open Source
6239310Sdim// License. See LICENSE.TXT for details.
7239310Sdim//
8239310Sdim//===----------------------------------------------------------------------===//
9239310Sdim//
10239310Sdim// This file defines the interfaces that NVPTX uses to lower LLVM code into a
11239310Sdim// selection DAG.
12239310Sdim//
13239310Sdim//===----------------------------------------------------------------------===//
14239310Sdim
15280031Sdim#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
16280031Sdim#define LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
17239310Sdim
18239310Sdim#include "NVPTX.h"
19239310Sdim#include "llvm/CodeGen/SelectionDAG.h"
20239310Sdim#include "llvm/Target/TargetLowering.h"
21239310Sdim
22239310Sdimnamespace llvm {
23239310Sdimnamespace NVPTXISD {
24288943Sdimenum NodeType : unsigned {
25239310Sdim  // Start the numbering from where ISD NodeType finishes.
26239310Sdim  FIRST_NUMBER = ISD::BUILTIN_OP_END,
27239310Sdim  Wrapper,
28239310Sdim  CALL,
29239310Sdim  RET_FLAG,
30239310Sdim  LOAD_PARAM,
31239310Sdim  DeclareParam,
32239310Sdim  DeclareScalarParam,
33239310Sdim  DeclareRetParam,
34239310Sdim  DeclareRet,
35239310Sdim  DeclareScalarRet,
36239310Sdim  PrintCall,
37239310Sdim  PrintCallUni,
38239310Sdim  CallArgBegin,
39239310Sdim  CallArg,
40239310Sdim  LastCallArg,
41239310Sdim  CallArgEnd,
42239310Sdim  CallVoid,
43239310Sdim  CallVal,
44239310Sdim  CallSymbol,
45239310Sdim  Prototype,
46239310Sdim  MoveParam,
47239310Sdim  PseudoUseParam,
48239310Sdim  RETURN,
49239310Sdim  CallSeqBegin,
50239310Sdim  CallSeqEnd,
51261991Sdim  CallPrototype,
52276479Sdim  FUN_SHFL_CLAMP,
53276479Sdim  FUN_SHFR_CLAMP,
54276479Sdim  MUL_WIDE_SIGNED,
55276479Sdim  MUL_WIDE_UNSIGNED,
56276479Sdim  IMAD,
57249423Sdim  Dummy,
58249423Sdim
59249423Sdim  LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
60249423Sdim  LoadV4,
61249423Sdim  LDGV2, // LDG.v2
62249423Sdim  LDGV4, // LDG.v4
63249423Sdim  LDUV2, // LDU.v2
64249423Sdim  LDUV4, // LDU.v4
65249423Sdim  StoreV2,
66261991Sdim  StoreV4,
67261991Sdim  LoadParam,
68261991Sdim  LoadParamV2,
69261991Sdim  LoadParamV4,
70261991Sdim  StoreParam,
71261991Sdim  StoreParamV2,
72261991Sdim  StoreParamV4,
73261991Sdim  StoreParamS32, // to sext and store a <32bit value, not used currently
74261991Sdim  StoreParamU32, // to zext and store a <32bit value, not used currently
75261991Sdim  StoreRetval,
76261991Sdim  StoreRetvalV2,
77276479Sdim  StoreRetvalV4,
78276479Sdim
79276479Sdim  // Texture intrinsics
80276479Sdim  Tex1DFloatS32,
81276479Sdim  Tex1DFloatFloat,
82276479Sdim  Tex1DFloatFloatLevel,
83276479Sdim  Tex1DFloatFloatGrad,
84276479Sdim  Tex1DS32S32,
85276479Sdim  Tex1DS32Float,
86276479Sdim  Tex1DS32FloatLevel,
87276479Sdim  Tex1DS32FloatGrad,
88276479Sdim  Tex1DU32S32,
89276479Sdim  Tex1DU32Float,
90276479Sdim  Tex1DU32FloatLevel,
91276479Sdim  Tex1DU32FloatGrad,
92276479Sdim  Tex1DArrayFloatS32,
93276479Sdim  Tex1DArrayFloatFloat,
94276479Sdim  Tex1DArrayFloatFloatLevel,
95276479Sdim  Tex1DArrayFloatFloatGrad,
96276479Sdim  Tex1DArrayS32S32,
97276479Sdim  Tex1DArrayS32Float,
98276479Sdim  Tex1DArrayS32FloatLevel,
99276479Sdim  Tex1DArrayS32FloatGrad,
100276479Sdim  Tex1DArrayU32S32,
101276479Sdim  Tex1DArrayU32Float,
102276479Sdim  Tex1DArrayU32FloatLevel,
103276479Sdim  Tex1DArrayU32FloatGrad,
104276479Sdim  Tex2DFloatS32,
105276479Sdim  Tex2DFloatFloat,
106276479Sdim  Tex2DFloatFloatLevel,
107276479Sdim  Tex2DFloatFloatGrad,
108276479Sdim  Tex2DS32S32,
109276479Sdim  Tex2DS32Float,
110276479Sdim  Tex2DS32FloatLevel,
111276479Sdim  Tex2DS32FloatGrad,
112276479Sdim  Tex2DU32S32,
113276479Sdim  Tex2DU32Float,
114276479Sdim  Tex2DU32FloatLevel,
115276479Sdim  Tex2DU32FloatGrad,
116276479Sdim  Tex2DArrayFloatS32,
117276479Sdim  Tex2DArrayFloatFloat,
118276479Sdim  Tex2DArrayFloatFloatLevel,
119276479Sdim  Tex2DArrayFloatFloatGrad,
120276479Sdim  Tex2DArrayS32S32,
121276479Sdim  Tex2DArrayS32Float,
122276479Sdim  Tex2DArrayS32FloatLevel,
123276479Sdim  Tex2DArrayS32FloatGrad,
124276479Sdim  Tex2DArrayU32S32,
125276479Sdim  Tex2DArrayU32Float,
126276479Sdim  Tex2DArrayU32FloatLevel,
127276479Sdim  Tex2DArrayU32FloatGrad,
128276479Sdim  Tex3DFloatS32,
129276479Sdim  Tex3DFloatFloat,
130276479Sdim  Tex3DFloatFloatLevel,
131276479Sdim  Tex3DFloatFloatGrad,
132276479Sdim  Tex3DS32S32,
133276479Sdim  Tex3DS32Float,
134276479Sdim  Tex3DS32FloatLevel,
135276479Sdim  Tex3DS32FloatGrad,
136276479Sdim  Tex3DU32S32,
137276479Sdim  Tex3DU32Float,
138276479Sdim  Tex3DU32FloatLevel,
139276479Sdim  Tex3DU32FloatGrad,
140276479Sdim  TexCubeFloatFloat,
141276479Sdim  TexCubeFloatFloatLevel,
142276479Sdim  TexCubeS32Float,
143276479Sdim  TexCubeS32FloatLevel,
144276479Sdim  TexCubeU32Float,
145276479Sdim  TexCubeU32FloatLevel,
146276479Sdim  TexCubeArrayFloatFloat,
147276479Sdim  TexCubeArrayFloatFloatLevel,
148276479Sdim  TexCubeArrayS32Float,
149276479Sdim  TexCubeArrayS32FloatLevel,
150276479Sdim  TexCubeArrayU32Float,
151276479Sdim  TexCubeArrayU32FloatLevel,
152276479Sdim  Tld4R2DFloatFloat,
153276479Sdim  Tld4G2DFloatFloat,
154276479Sdim  Tld4B2DFloatFloat,
155276479Sdim  Tld4A2DFloatFloat,
156276479Sdim  Tld4R2DS64Float,
157276479Sdim  Tld4G2DS64Float,
158276479Sdim  Tld4B2DS64Float,
159276479Sdim  Tld4A2DS64Float,
160276479Sdim  Tld4R2DU64Float,
161276479Sdim  Tld4G2DU64Float,
162276479Sdim  Tld4B2DU64Float,
163276479Sdim  Tld4A2DU64Float,
164276479Sdim  TexUnified1DFloatS32,
165276479Sdim  TexUnified1DFloatFloat,
166276479Sdim  TexUnified1DFloatFloatLevel,
167276479Sdim  TexUnified1DFloatFloatGrad,
168276479Sdim  TexUnified1DS32S32,
169276479Sdim  TexUnified1DS32Float,
170276479Sdim  TexUnified1DS32FloatLevel,
171276479Sdim  TexUnified1DS32FloatGrad,
172276479Sdim  TexUnified1DU32S32,
173276479Sdim  TexUnified1DU32Float,
174276479Sdim  TexUnified1DU32FloatLevel,
175276479Sdim  TexUnified1DU32FloatGrad,
176276479Sdim  TexUnified1DArrayFloatS32,
177276479Sdim  TexUnified1DArrayFloatFloat,
178276479Sdim  TexUnified1DArrayFloatFloatLevel,
179276479Sdim  TexUnified1DArrayFloatFloatGrad,
180276479Sdim  TexUnified1DArrayS32S32,
181276479Sdim  TexUnified1DArrayS32Float,
182276479Sdim  TexUnified1DArrayS32FloatLevel,
183276479Sdim  TexUnified1DArrayS32FloatGrad,
184276479Sdim  TexUnified1DArrayU32S32,
185276479Sdim  TexUnified1DArrayU32Float,
186276479Sdim  TexUnified1DArrayU32FloatLevel,
187276479Sdim  TexUnified1DArrayU32FloatGrad,
188276479Sdim  TexUnified2DFloatS32,
189276479Sdim  TexUnified2DFloatFloat,
190276479Sdim  TexUnified2DFloatFloatLevel,
191276479Sdim  TexUnified2DFloatFloatGrad,
192276479Sdim  TexUnified2DS32S32,
193276479Sdim  TexUnified2DS32Float,
194276479Sdim  TexUnified2DS32FloatLevel,
195276479Sdim  TexUnified2DS32FloatGrad,
196276479Sdim  TexUnified2DU32S32,
197276479Sdim  TexUnified2DU32Float,
198276479Sdim  TexUnified2DU32FloatLevel,
199276479Sdim  TexUnified2DU32FloatGrad,
200276479Sdim  TexUnified2DArrayFloatS32,
201276479Sdim  TexUnified2DArrayFloatFloat,
202276479Sdim  TexUnified2DArrayFloatFloatLevel,
203276479Sdim  TexUnified2DArrayFloatFloatGrad,
204276479Sdim  TexUnified2DArrayS32S32,
205276479Sdim  TexUnified2DArrayS32Float,
206276479Sdim  TexUnified2DArrayS32FloatLevel,
207276479Sdim  TexUnified2DArrayS32FloatGrad,
208276479Sdim  TexUnified2DArrayU32S32,
209276479Sdim  TexUnified2DArrayU32Float,
210276479Sdim  TexUnified2DArrayU32FloatLevel,
211276479Sdim  TexUnified2DArrayU32FloatGrad,
212276479Sdim  TexUnified3DFloatS32,
213276479Sdim  TexUnified3DFloatFloat,
214276479Sdim  TexUnified3DFloatFloatLevel,
215276479Sdim  TexUnified3DFloatFloatGrad,
216276479Sdim  TexUnified3DS32S32,
217276479Sdim  TexUnified3DS32Float,
218276479Sdim  TexUnified3DS32FloatLevel,
219276479Sdim  TexUnified3DS32FloatGrad,
220276479Sdim  TexUnified3DU32S32,
221276479Sdim  TexUnified3DU32Float,
222276479Sdim  TexUnified3DU32FloatLevel,
223276479Sdim  TexUnified3DU32FloatGrad,
224276479Sdim  TexUnifiedCubeFloatFloat,
225276479Sdim  TexUnifiedCubeFloatFloatLevel,
226276479Sdim  TexUnifiedCubeS32Float,
227276479Sdim  TexUnifiedCubeS32FloatLevel,
228276479Sdim  TexUnifiedCubeU32Float,
229276479Sdim  TexUnifiedCubeU32FloatLevel,
230276479Sdim  TexUnifiedCubeArrayFloatFloat,
231276479Sdim  TexUnifiedCubeArrayFloatFloatLevel,
232276479Sdim  TexUnifiedCubeArrayS32Float,
233276479Sdim  TexUnifiedCubeArrayS32FloatLevel,
234276479Sdim  TexUnifiedCubeArrayU32Float,
235276479Sdim  TexUnifiedCubeArrayU32FloatLevel,
236276479Sdim  Tld4UnifiedR2DFloatFloat,
237276479Sdim  Tld4UnifiedG2DFloatFloat,
238276479Sdim  Tld4UnifiedB2DFloatFloat,
239276479Sdim  Tld4UnifiedA2DFloatFloat,
240276479Sdim  Tld4UnifiedR2DS64Float,
241276479Sdim  Tld4UnifiedG2DS64Float,
242276479Sdim  Tld4UnifiedB2DS64Float,
243276479Sdim  Tld4UnifiedA2DS64Float,
244276479Sdim  Tld4UnifiedR2DU64Float,
245276479Sdim  Tld4UnifiedG2DU64Float,
246276479Sdim  Tld4UnifiedB2DU64Float,
247276479Sdim  Tld4UnifiedA2DU64Float,
248276479Sdim
249276479Sdim  // Surface intrinsics
250276479Sdim  Suld1DI8Clamp,
251276479Sdim  Suld1DI16Clamp,
252276479Sdim  Suld1DI32Clamp,
253276479Sdim  Suld1DI64Clamp,
254276479Sdim  Suld1DV2I8Clamp,
255276479Sdim  Suld1DV2I16Clamp,
256276479Sdim  Suld1DV2I32Clamp,
257276479Sdim  Suld1DV2I64Clamp,
258276479Sdim  Suld1DV4I8Clamp,
259276479Sdim  Suld1DV4I16Clamp,
260276479Sdim  Suld1DV4I32Clamp,
261276479Sdim
262276479Sdim  Suld1DArrayI8Clamp,
263276479Sdim  Suld1DArrayI16Clamp,
264276479Sdim  Suld1DArrayI32Clamp,
265276479Sdim  Suld1DArrayI64Clamp,
266276479Sdim  Suld1DArrayV2I8Clamp,
267276479Sdim  Suld1DArrayV2I16Clamp,
268276479Sdim  Suld1DArrayV2I32Clamp,
269276479Sdim  Suld1DArrayV2I64Clamp,
270276479Sdim  Suld1DArrayV4I8Clamp,
271276479Sdim  Suld1DArrayV4I16Clamp,
272276479Sdim  Suld1DArrayV4I32Clamp,
273276479Sdim
274276479Sdim  Suld2DI8Clamp,
275276479Sdim  Suld2DI16Clamp,
276276479Sdim  Suld2DI32Clamp,
277276479Sdim  Suld2DI64Clamp,
278276479Sdim  Suld2DV2I8Clamp,
279276479Sdim  Suld2DV2I16Clamp,
280276479Sdim  Suld2DV2I32Clamp,
281276479Sdim  Suld2DV2I64Clamp,
282276479Sdim  Suld2DV4I8Clamp,
283276479Sdim  Suld2DV4I16Clamp,
284276479Sdim  Suld2DV4I32Clamp,
285276479Sdim
286276479Sdim  Suld2DArrayI8Clamp,
287276479Sdim  Suld2DArrayI16Clamp,
288276479Sdim  Suld2DArrayI32Clamp,
289276479Sdim  Suld2DArrayI64Clamp,
290276479Sdim  Suld2DArrayV2I8Clamp,
291276479Sdim  Suld2DArrayV2I16Clamp,
292276479Sdim  Suld2DArrayV2I32Clamp,
293276479Sdim  Suld2DArrayV2I64Clamp,
294276479Sdim  Suld2DArrayV4I8Clamp,
295276479Sdim  Suld2DArrayV4I16Clamp,
296276479Sdim  Suld2DArrayV4I32Clamp,
297276479Sdim
298276479Sdim  Suld3DI8Clamp,
299276479Sdim  Suld3DI16Clamp,
300276479Sdim  Suld3DI32Clamp,
301276479Sdim  Suld3DI64Clamp,
302276479Sdim  Suld3DV2I8Clamp,
303276479Sdim  Suld3DV2I16Clamp,
304276479Sdim  Suld3DV2I32Clamp,
305276479Sdim  Suld3DV2I64Clamp,
306276479Sdim  Suld3DV4I8Clamp,
307276479Sdim  Suld3DV4I16Clamp,
308276479Sdim  Suld3DV4I32Clamp,
309276479Sdim
310276479Sdim  Suld1DI8Trap,
311276479Sdim  Suld1DI16Trap,
312276479Sdim  Suld1DI32Trap,
313276479Sdim  Suld1DI64Trap,
314276479Sdim  Suld1DV2I8Trap,
315276479Sdim  Suld1DV2I16Trap,
316276479Sdim  Suld1DV2I32Trap,
317276479Sdim  Suld1DV2I64Trap,
318276479Sdim  Suld1DV4I8Trap,
319276479Sdim  Suld1DV4I16Trap,
320276479Sdim  Suld1DV4I32Trap,
321276479Sdim
322276479Sdim  Suld1DArrayI8Trap,
323276479Sdim  Suld1DArrayI16Trap,
324276479Sdim  Suld1DArrayI32Trap,
325276479Sdim  Suld1DArrayI64Trap,
326276479Sdim  Suld1DArrayV2I8Trap,
327276479Sdim  Suld1DArrayV2I16Trap,
328276479Sdim  Suld1DArrayV2I32Trap,
329276479Sdim  Suld1DArrayV2I64Trap,
330276479Sdim  Suld1DArrayV4I8Trap,
331276479Sdim  Suld1DArrayV4I16Trap,
332276479Sdim  Suld1DArrayV4I32Trap,
333276479Sdim
334276479Sdim  Suld2DI8Trap,
335276479Sdim  Suld2DI16Trap,
336276479Sdim  Suld2DI32Trap,
337276479Sdim  Suld2DI64Trap,
338276479Sdim  Suld2DV2I8Trap,
339276479Sdim  Suld2DV2I16Trap,
340276479Sdim  Suld2DV2I32Trap,
341276479Sdim  Suld2DV2I64Trap,
342276479Sdim  Suld2DV4I8Trap,
343276479Sdim  Suld2DV4I16Trap,
344276479Sdim  Suld2DV4I32Trap,
345276479Sdim
346276479Sdim  Suld2DArrayI8Trap,
347276479Sdim  Suld2DArrayI16Trap,
348276479Sdim  Suld2DArrayI32Trap,
349276479Sdim  Suld2DArrayI64Trap,
350276479Sdim  Suld2DArrayV2I8Trap,
351276479Sdim  Suld2DArrayV2I16Trap,
352276479Sdim  Suld2DArrayV2I32Trap,
353276479Sdim  Suld2DArrayV2I64Trap,
354276479Sdim  Suld2DArrayV4I8Trap,
355276479Sdim  Suld2DArrayV4I16Trap,
356276479Sdim  Suld2DArrayV4I32Trap,
357276479Sdim
358276479Sdim  Suld3DI8Trap,
359276479Sdim  Suld3DI16Trap,
360276479Sdim  Suld3DI32Trap,
361276479Sdim  Suld3DI64Trap,
362276479Sdim  Suld3DV2I8Trap,
363276479Sdim  Suld3DV2I16Trap,
364276479Sdim  Suld3DV2I32Trap,
365276479Sdim  Suld3DV2I64Trap,
366276479Sdim  Suld3DV4I8Trap,
367276479Sdim  Suld3DV4I16Trap,
368276479Sdim  Suld3DV4I32Trap,
369276479Sdim
370276479Sdim  Suld1DI8Zero,
371276479Sdim  Suld1DI16Zero,
372276479Sdim  Suld1DI32Zero,
373276479Sdim  Suld1DI64Zero,
374276479Sdim  Suld1DV2I8Zero,
375276479Sdim  Suld1DV2I16Zero,
376276479Sdim  Suld1DV2I32Zero,
377276479Sdim  Suld1DV2I64Zero,
378276479Sdim  Suld1DV4I8Zero,
379276479Sdim  Suld1DV4I16Zero,
380276479Sdim  Suld1DV4I32Zero,
381276479Sdim
382276479Sdim  Suld1DArrayI8Zero,
383276479Sdim  Suld1DArrayI16Zero,
384276479Sdim  Suld1DArrayI32Zero,
385276479Sdim  Suld1DArrayI64Zero,
386276479Sdim  Suld1DArrayV2I8Zero,
387276479Sdim  Suld1DArrayV2I16Zero,
388276479Sdim  Suld1DArrayV2I32Zero,
389276479Sdim  Suld1DArrayV2I64Zero,
390276479Sdim  Suld1DArrayV4I8Zero,
391276479Sdim  Suld1DArrayV4I16Zero,
392276479Sdim  Suld1DArrayV4I32Zero,
393276479Sdim
394276479Sdim  Suld2DI8Zero,
395276479Sdim  Suld2DI16Zero,
396276479Sdim  Suld2DI32Zero,
397276479Sdim  Suld2DI64Zero,
398276479Sdim  Suld2DV2I8Zero,
399276479Sdim  Suld2DV2I16Zero,
400276479Sdim  Suld2DV2I32Zero,
401276479Sdim  Suld2DV2I64Zero,
402276479Sdim  Suld2DV4I8Zero,
403276479Sdim  Suld2DV4I16Zero,
404276479Sdim  Suld2DV4I32Zero,
405276479Sdim
406276479Sdim  Suld2DArrayI8Zero,
407276479Sdim  Suld2DArrayI16Zero,
408276479Sdim  Suld2DArrayI32Zero,
409276479Sdim  Suld2DArrayI64Zero,
410276479Sdim  Suld2DArrayV2I8Zero,
411276479Sdim  Suld2DArrayV2I16Zero,
412276479Sdim  Suld2DArrayV2I32Zero,
413276479Sdim  Suld2DArrayV2I64Zero,
414276479Sdim  Suld2DArrayV4I8Zero,
415276479Sdim  Suld2DArrayV4I16Zero,
416276479Sdim  Suld2DArrayV4I32Zero,
417276479Sdim
418276479Sdim  Suld3DI8Zero,
419276479Sdim  Suld3DI16Zero,
420276479Sdim  Suld3DI32Zero,
421276479Sdim  Suld3DI64Zero,
422276479Sdim  Suld3DV2I8Zero,
423276479Sdim  Suld3DV2I16Zero,
424276479Sdim  Suld3DV2I32Zero,
425276479Sdim  Suld3DV2I64Zero,
426276479Sdim  Suld3DV4I8Zero,
427276479Sdim  Suld3DV4I16Zero,
428276479Sdim  Suld3DV4I32Zero
429239310Sdim};
430239310Sdim}
431239310Sdim
432276479Sdimclass NVPTXSubtarget;
433276479Sdim
434239310Sdim//===--------------------------------------------------------------------===//
435239310Sdim// TargetLowering Implementation
436239310Sdim//===--------------------------------------------------------------------===//
437239310Sdimclass NVPTXTargetLowering : public TargetLowering {
438239310Sdimpublic:
439288943Sdim  explicit NVPTXTargetLowering(const NVPTXTargetMachine &TM,
440288943Sdim                               const NVPTXSubtarget &STI);
441276479Sdim  SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
442239310Sdim
443239310Sdim  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
444239310Sdim
445276479Sdim  const char *getTargetNodeName(unsigned Opcode) const override;
446239310Sdim
447249423Sdim  bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
448276479Sdim                          unsigned Intrinsic) const override;
449239310Sdim
450239310Sdim  /// isLegalAddressingMode - Return true if the addressing mode represented
451239310Sdim  /// by AM is legal for this target, for a load/store of the specified type
452239310Sdim  /// Used to guide target specific optimizations, like loop strength
453239310Sdim  /// reduction (LoopStrengthReduce.cpp) and memory optimization for
454239310Sdim  /// address mode (CodeGenPrepare.cpp)
455288943Sdim  bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
456288943Sdim                             unsigned AS) const override;
457239310Sdim
458296417Sdim  bool isTruncateFree(Type *SrcTy, Type *DstTy) const override {
459296417Sdim    // Truncating 64-bit to 32-bit is free in SASS.
460296417Sdim    if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy())
461296417Sdim      return false;
462296417Sdim    return SrcTy->getPrimitiveSizeInBits() == 64 &&
463296417Sdim           DstTy->getPrimitiveSizeInBits() == 32;
464296417Sdim  }
465239310Sdim
466288943Sdim  EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
467288943Sdim                         EVT VT) const override {
468249423Sdim    if (VT.isVector())
469276479Sdim      return EVT::getVectorVT(Ctx, MVT::i1, VT.getVectorNumElements());
470239310Sdim    return MVT::i1;
471239310Sdim  }
472239310Sdim
473288943Sdim  ConstraintType getConstraintType(StringRef Constraint) const override;
474249423Sdim  std::pair<unsigned, const TargetRegisterClass *>
475288943Sdim  getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
476288943Sdim                               StringRef Constraint, MVT VT) const override;
477239310Sdim
478276479Sdim  SDValue LowerFormalArguments(
479249423Sdim      SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
480261991Sdim      const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc dl, SelectionDAG &DAG,
481276479Sdim      SmallVectorImpl<SDValue> &InVals) const override;
482239310Sdim
483276479Sdim  SDValue LowerCall(CallLoweringInfo &CLI,
484276479Sdim                    SmallVectorImpl<SDValue> &InVals) const override;
485239310Sdim
486288943Sdim  std::string getPrototype(const DataLayout &DL, Type *, const ArgListTy &,
487239310Sdim                           const SmallVectorImpl<ISD::OutputArg> &,
488261991Sdim                           unsigned retAlignment,
489261991Sdim                           const ImmutableCallSite *CS) const;
490239310Sdim
491276479Sdim  SDValue
492239310Sdim  LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
493239310Sdim              const SmallVectorImpl<ISD::OutputArg> &Outs,
494261991Sdim              const SmallVectorImpl<SDValue> &OutVals, SDLoc dl,
495276479Sdim              SelectionDAG &DAG) const override;
496239310Sdim
497276479Sdim  void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
498276479Sdim                                    std::vector<SDValue> &Ops,
499276479Sdim                                    SelectionDAG &DAG) const override;
500239310Sdim
501280031Sdim  const NVPTXTargetMachine *nvTM;
502239310Sdim
503239310Sdim  // PTX always uses 32-bit shift amounts
504288943Sdim  MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
505288943Sdim    return MVT::i32;
506288943Sdim  }
507239310Sdim
508276479Sdim  TargetLoweringBase::LegalizeTypeAction
509276479Sdim  getPreferredVectorAction(EVT VT) const override;
510249423Sdim
511276479Sdim  bool allowFMA(MachineFunction &MF, CodeGenOpt::Level OptLevel) const;
512276479Sdim
513280031Sdim  bool isFMAFasterThanFMulAndFAdd(EVT) const override { return true; }
514276479Sdim
515280031Sdim  bool enableAggressiveFMAFusion(EVT VT) const override { return true; }
516280031Sdim
517239310Sdimprivate:
518288943Sdim  const NVPTXSubtarget &STI; // cache the subtarget here
519261991Sdim  SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
520239310Sdim
521239310Sdim  SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
522243830Sdim
523249423Sdim  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
524249423Sdim  SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
525249423Sdim
526243830Sdim  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
527249423Sdim  SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
528249423Sdim  SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
529249423Sdim
530276479Sdim  SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
531276479Sdim  SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
532261991Sdim
533288943Sdim  SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
534288943Sdim
535276479Sdim  void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
536276479Sdim                          SelectionDAG &DAG) const override;
537276479Sdim  SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
538276479Sdim
539261991Sdim  unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS,
540261991Sdim                                Type *Ty, unsigned Idx) const;
541239310Sdim};
542239310Sdim} // namespace llvm
543239310Sdim
544280031Sdim#endif
545