106f32e7eSjoerg //===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // This file defines the interfaces that NVPTX uses to lower LLVM code into a
1006f32e7eSjoerg // selection DAG.
1106f32e7eSjoerg //
1206f32e7eSjoerg //===----------------------------------------------------------------------===//
1306f32e7eSjoerg 
1406f32e7eSjoerg #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
1506f32e7eSjoerg #define LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
1606f32e7eSjoerg 
1706f32e7eSjoerg #include "NVPTX.h"
1806f32e7eSjoerg #include "llvm/CodeGen/SelectionDAG.h"
1906f32e7eSjoerg #include "llvm/CodeGen/TargetLowering.h"
2006f32e7eSjoerg 
2106f32e7eSjoerg namespace llvm {
2206f32e7eSjoerg namespace NVPTXISD {
2306f32e7eSjoerg enum NodeType : unsigned {
2406f32e7eSjoerg   // Start the numbering from where ISD NodeType finishes.
2506f32e7eSjoerg   FIRST_NUMBER = ISD::BUILTIN_OP_END,
2606f32e7eSjoerg   Wrapper,
2706f32e7eSjoerg   CALL,
2806f32e7eSjoerg   RET_FLAG,
2906f32e7eSjoerg   LOAD_PARAM,
3006f32e7eSjoerg   DeclareParam,
3106f32e7eSjoerg   DeclareScalarParam,
3206f32e7eSjoerg   DeclareRetParam,
3306f32e7eSjoerg   DeclareRet,
3406f32e7eSjoerg   DeclareScalarRet,
3506f32e7eSjoerg   PrintCall,
3606f32e7eSjoerg   PrintConvergentCall,
3706f32e7eSjoerg   PrintCallUni,
3806f32e7eSjoerg   PrintConvergentCallUni,
3906f32e7eSjoerg   CallArgBegin,
4006f32e7eSjoerg   CallArg,
4106f32e7eSjoerg   LastCallArg,
4206f32e7eSjoerg   CallArgEnd,
4306f32e7eSjoerg   CallVoid,
4406f32e7eSjoerg   CallVal,
4506f32e7eSjoerg   CallSymbol,
4606f32e7eSjoerg   Prototype,
4706f32e7eSjoerg   MoveParam,
4806f32e7eSjoerg   PseudoUseParam,
4906f32e7eSjoerg   RETURN,
5006f32e7eSjoerg   CallSeqBegin,
5106f32e7eSjoerg   CallSeqEnd,
5206f32e7eSjoerg   CallPrototype,
5306f32e7eSjoerg   ProxyReg,
5406f32e7eSjoerg   FUN_SHFL_CLAMP,
5506f32e7eSjoerg   FUN_SHFR_CLAMP,
5606f32e7eSjoerg   MUL_WIDE_SIGNED,
5706f32e7eSjoerg   MUL_WIDE_UNSIGNED,
5806f32e7eSjoerg   IMAD,
5906f32e7eSjoerg   SETP_F16X2,
6006f32e7eSjoerg   Dummy,
6106f32e7eSjoerg 
6206f32e7eSjoerg   LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
6306f32e7eSjoerg   LoadV4,
6406f32e7eSjoerg   LDGV2, // LDG.v2
6506f32e7eSjoerg   LDGV4, // LDG.v4
6606f32e7eSjoerg   LDUV2, // LDU.v2
6706f32e7eSjoerg   LDUV4, // LDU.v4
6806f32e7eSjoerg   StoreV2,
6906f32e7eSjoerg   StoreV4,
7006f32e7eSjoerg   LoadParam,
7106f32e7eSjoerg   LoadParamV2,
7206f32e7eSjoerg   LoadParamV4,
7306f32e7eSjoerg   StoreParam,
7406f32e7eSjoerg   StoreParamV2,
7506f32e7eSjoerg   StoreParamV4,
7606f32e7eSjoerg   StoreParamS32, // to sext and store a <32bit value, not used currently
7706f32e7eSjoerg   StoreParamU32, // to zext and store a <32bit value, not used currently
7806f32e7eSjoerg   StoreRetval,
7906f32e7eSjoerg   StoreRetvalV2,
8006f32e7eSjoerg   StoreRetvalV4,
8106f32e7eSjoerg 
8206f32e7eSjoerg   // Texture intrinsics
8306f32e7eSjoerg   Tex1DFloatS32,
8406f32e7eSjoerg   Tex1DFloatFloat,
8506f32e7eSjoerg   Tex1DFloatFloatLevel,
8606f32e7eSjoerg   Tex1DFloatFloatGrad,
8706f32e7eSjoerg   Tex1DS32S32,
8806f32e7eSjoerg   Tex1DS32Float,
8906f32e7eSjoerg   Tex1DS32FloatLevel,
9006f32e7eSjoerg   Tex1DS32FloatGrad,
9106f32e7eSjoerg   Tex1DU32S32,
9206f32e7eSjoerg   Tex1DU32Float,
9306f32e7eSjoerg   Tex1DU32FloatLevel,
9406f32e7eSjoerg   Tex1DU32FloatGrad,
9506f32e7eSjoerg   Tex1DArrayFloatS32,
9606f32e7eSjoerg   Tex1DArrayFloatFloat,
9706f32e7eSjoerg   Tex1DArrayFloatFloatLevel,
9806f32e7eSjoerg   Tex1DArrayFloatFloatGrad,
9906f32e7eSjoerg   Tex1DArrayS32S32,
10006f32e7eSjoerg   Tex1DArrayS32Float,
10106f32e7eSjoerg   Tex1DArrayS32FloatLevel,
10206f32e7eSjoerg   Tex1DArrayS32FloatGrad,
10306f32e7eSjoerg   Tex1DArrayU32S32,
10406f32e7eSjoerg   Tex1DArrayU32Float,
10506f32e7eSjoerg   Tex1DArrayU32FloatLevel,
10606f32e7eSjoerg   Tex1DArrayU32FloatGrad,
10706f32e7eSjoerg   Tex2DFloatS32,
10806f32e7eSjoerg   Tex2DFloatFloat,
10906f32e7eSjoerg   Tex2DFloatFloatLevel,
11006f32e7eSjoerg   Tex2DFloatFloatGrad,
11106f32e7eSjoerg   Tex2DS32S32,
11206f32e7eSjoerg   Tex2DS32Float,
11306f32e7eSjoerg   Tex2DS32FloatLevel,
11406f32e7eSjoerg   Tex2DS32FloatGrad,
11506f32e7eSjoerg   Tex2DU32S32,
11606f32e7eSjoerg   Tex2DU32Float,
11706f32e7eSjoerg   Tex2DU32FloatLevel,
11806f32e7eSjoerg   Tex2DU32FloatGrad,
11906f32e7eSjoerg   Tex2DArrayFloatS32,
12006f32e7eSjoerg   Tex2DArrayFloatFloat,
12106f32e7eSjoerg   Tex2DArrayFloatFloatLevel,
12206f32e7eSjoerg   Tex2DArrayFloatFloatGrad,
12306f32e7eSjoerg   Tex2DArrayS32S32,
12406f32e7eSjoerg   Tex2DArrayS32Float,
12506f32e7eSjoerg   Tex2DArrayS32FloatLevel,
12606f32e7eSjoerg   Tex2DArrayS32FloatGrad,
12706f32e7eSjoerg   Tex2DArrayU32S32,
12806f32e7eSjoerg   Tex2DArrayU32Float,
12906f32e7eSjoerg   Tex2DArrayU32FloatLevel,
13006f32e7eSjoerg   Tex2DArrayU32FloatGrad,
13106f32e7eSjoerg   Tex3DFloatS32,
13206f32e7eSjoerg   Tex3DFloatFloat,
13306f32e7eSjoerg   Tex3DFloatFloatLevel,
13406f32e7eSjoerg   Tex3DFloatFloatGrad,
13506f32e7eSjoerg   Tex3DS32S32,
13606f32e7eSjoerg   Tex3DS32Float,
13706f32e7eSjoerg   Tex3DS32FloatLevel,
13806f32e7eSjoerg   Tex3DS32FloatGrad,
13906f32e7eSjoerg   Tex3DU32S32,
14006f32e7eSjoerg   Tex3DU32Float,
14106f32e7eSjoerg   Tex3DU32FloatLevel,
14206f32e7eSjoerg   Tex3DU32FloatGrad,
14306f32e7eSjoerg   TexCubeFloatFloat,
14406f32e7eSjoerg   TexCubeFloatFloatLevel,
14506f32e7eSjoerg   TexCubeS32Float,
14606f32e7eSjoerg   TexCubeS32FloatLevel,
14706f32e7eSjoerg   TexCubeU32Float,
14806f32e7eSjoerg   TexCubeU32FloatLevel,
14906f32e7eSjoerg   TexCubeArrayFloatFloat,
15006f32e7eSjoerg   TexCubeArrayFloatFloatLevel,
15106f32e7eSjoerg   TexCubeArrayS32Float,
15206f32e7eSjoerg   TexCubeArrayS32FloatLevel,
15306f32e7eSjoerg   TexCubeArrayU32Float,
15406f32e7eSjoerg   TexCubeArrayU32FloatLevel,
15506f32e7eSjoerg   Tld4R2DFloatFloat,
15606f32e7eSjoerg   Tld4G2DFloatFloat,
15706f32e7eSjoerg   Tld4B2DFloatFloat,
15806f32e7eSjoerg   Tld4A2DFloatFloat,
15906f32e7eSjoerg   Tld4R2DS64Float,
16006f32e7eSjoerg   Tld4G2DS64Float,
16106f32e7eSjoerg   Tld4B2DS64Float,
16206f32e7eSjoerg   Tld4A2DS64Float,
16306f32e7eSjoerg   Tld4R2DU64Float,
16406f32e7eSjoerg   Tld4G2DU64Float,
16506f32e7eSjoerg   Tld4B2DU64Float,
16606f32e7eSjoerg   Tld4A2DU64Float,
16706f32e7eSjoerg   TexUnified1DFloatS32,
16806f32e7eSjoerg   TexUnified1DFloatFloat,
16906f32e7eSjoerg   TexUnified1DFloatFloatLevel,
17006f32e7eSjoerg   TexUnified1DFloatFloatGrad,
17106f32e7eSjoerg   TexUnified1DS32S32,
17206f32e7eSjoerg   TexUnified1DS32Float,
17306f32e7eSjoerg   TexUnified1DS32FloatLevel,
17406f32e7eSjoerg   TexUnified1DS32FloatGrad,
17506f32e7eSjoerg   TexUnified1DU32S32,
17606f32e7eSjoerg   TexUnified1DU32Float,
17706f32e7eSjoerg   TexUnified1DU32FloatLevel,
17806f32e7eSjoerg   TexUnified1DU32FloatGrad,
17906f32e7eSjoerg   TexUnified1DArrayFloatS32,
18006f32e7eSjoerg   TexUnified1DArrayFloatFloat,
18106f32e7eSjoerg   TexUnified1DArrayFloatFloatLevel,
18206f32e7eSjoerg   TexUnified1DArrayFloatFloatGrad,
18306f32e7eSjoerg   TexUnified1DArrayS32S32,
18406f32e7eSjoerg   TexUnified1DArrayS32Float,
18506f32e7eSjoerg   TexUnified1DArrayS32FloatLevel,
18606f32e7eSjoerg   TexUnified1DArrayS32FloatGrad,
18706f32e7eSjoerg   TexUnified1DArrayU32S32,
18806f32e7eSjoerg   TexUnified1DArrayU32Float,
18906f32e7eSjoerg   TexUnified1DArrayU32FloatLevel,
19006f32e7eSjoerg   TexUnified1DArrayU32FloatGrad,
19106f32e7eSjoerg   TexUnified2DFloatS32,
19206f32e7eSjoerg   TexUnified2DFloatFloat,
19306f32e7eSjoerg   TexUnified2DFloatFloatLevel,
19406f32e7eSjoerg   TexUnified2DFloatFloatGrad,
19506f32e7eSjoerg   TexUnified2DS32S32,
19606f32e7eSjoerg   TexUnified2DS32Float,
19706f32e7eSjoerg   TexUnified2DS32FloatLevel,
19806f32e7eSjoerg   TexUnified2DS32FloatGrad,
19906f32e7eSjoerg   TexUnified2DU32S32,
20006f32e7eSjoerg   TexUnified2DU32Float,
20106f32e7eSjoerg   TexUnified2DU32FloatLevel,
20206f32e7eSjoerg   TexUnified2DU32FloatGrad,
20306f32e7eSjoerg   TexUnified2DArrayFloatS32,
20406f32e7eSjoerg   TexUnified2DArrayFloatFloat,
20506f32e7eSjoerg   TexUnified2DArrayFloatFloatLevel,
20606f32e7eSjoerg   TexUnified2DArrayFloatFloatGrad,
20706f32e7eSjoerg   TexUnified2DArrayS32S32,
20806f32e7eSjoerg   TexUnified2DArrayS32Float,
20906f32e7eSjoerg   TexUnified2DArrayS32FloatLevel,
21006f32e7eSjoerg   TexUnified2DArrayS32FloatGrad,
21106f32e7eSjoerg   TexUnified2DArrayU32S32,
21206f32e7eSjoerg   TexUnified2DArrayU32Float,
21306f32e7eSjoerg   TexUnified2DArrayU32FloatLevel,
21406f32e7eSjoerg   TexUnified2DArrayU32FloatGrad,
21506f32e7eSjoerg   TexUnified3DFloatS32,
21606f32e7eSjoerg   TexUnified3DFloatFloat,
21706f32e7eSjoerg   TexUnified3DFloatFloatLevel,
21806f32e7eSjoerg   TexUnified3DFloatFloatGrad,
21906f32e7eSjoerg   TexUnified3DS32S32,
22006f32e7eSjoerg   TexUnified3DS32Float,
22106f32e7eSjoerg   TexUnified3DS32FloatLevel,
22206f32e7eSjoerg   TexUnified3DS32FloatGrad,
22306f32e7eSjoerg   TexUnified3DU32S32,
22406f32e7eSjoerg   TexUnified3DU32Float,
22506f32e7eSjoerg   TexUnified3DU32FloatLevel,
22606f32e7eSjoerg   TexUnified3DU32FloatGrad,
22706f32e7eSjoerg   TexUnifiedCubeFloatFloat,
22806f32e7eSjoerg   TexUnifiedCubeFloatFloatLevel,
22906f32e7eSjoerg   TexUnifiedCubeS32Float,
23006f32e7eSjoerg   TexUnifiedCubeS32FloatLevel,
23106f32e7eSjoerg   TexUnifiedCubeU32Float,
23206f32e7eSjoerg   TexUnifiedCubeU32FloatLevel,
23306f32e7eSjoerg   TexUnifiedCubeArrayFloatFloat,
23406f32e7eSjoerg   TexUnifiedCubeArrayFloatFloatLevel,
23506f32e7eSjoerg   TexUnifiedCubeArrayS32Float,
23606f32e7eSjoerg   TexUnifiedCubeArrayS32FloatLevel,
23706f32e7eSjoerg   TexUnifiedCubeArrayU32Float,
23806f32e7eSjoerg   TexUnifiedCubeArrayU32FloatLevel,
23906f32e7eSjoerg   Tld4UnifiedR2DFloatFloat,
24006f32e7eSjoerg   Tld4UnifiedG2DFloatFloat,
24106f32e7eSjoerg   Tld4UnifiedB2DFloatFloat,
24206f32e7eSjoerg   Tld4UnifiedA2DFloatFloat,
24306f32e7eSjoerg   Tld4UnifiedR2DS64Float,
24406f32e7eSjoerg   Tld4UnifiedG2DS64Float,
24506f32e7eSjoerg   Tld4UnifiedB2DS64Float,
24606f32e7eSjoerg   Tld4UnifiedA2DS64Float,
24706f32e7eSjoerg   Tld4UnifiedR2DU64Float,
24806f32e7eSjoerg   Tld4UnifiedG2DU64Float,
24906f32e7eSjoerg   Tld4UnifiedB2DU64Float,
25006f32e7eSjoerg   Tld4UnifiedA2DU64Float,
25106f32e7eSjoerg 
25206f32e7eSjoerg   // Surface intrinsics
25306f32e7eSjoerg   Suld1DI8Clamp,
25406f32e7eSjoerg   Suld1DI16Clamp,
25506f32e7eSjoerg   Suld1DI32Clamp,
25606f32e7eSjoerg   Suld1DI64Clamp,
25706f32e7eSjoerg   Suld1DV2I8Clamp,
25806f32e7eSjoerg   Suld1DV2I16Clamp,
25906f32e7eSjoerg   Suld1DV2I32Clamp,
26006f32e7eSjoerg   Suld1DV2I64Clamp,
26106f32e7eSjoerg   Suld1DV4I8Clamp,
26206f32e7eSjoerg   Suld1DV4I16Clamp,
26306f32e7eSjoerg   Suld1DV4I32Clamp,
26406f32e7eSjoerg 
26506f32e7eSjoerg   Suld1DArrayI8Clamp,
26606f32e7eSjoerg   Suld1DArrayI16Clamp,
26706f32e7eSjoerg   Suld1DArrayI32Clamp,
26806f32e7eSjoerg   Suld1DArrayI64Clamp,
26906f32e7eSjoerg   Suld1DArrayV2I8Clamp,
27006f32e7eSjoerg   Suld1DArrayV2I16Clamp,
27106f32e7eSjoerg   Suld1DArrayV2I32Clamp,
27206f32e7eSjoerg   Suld1DArrayV2I64Clamp,
27306f32e7eSjoerg   Suld1DArrayV4I8Clamp,
27406f32e7eSjoerg   Suld1DArrayV4I16Clamp,
27506f32e7eSjoerg   Suld1DArrayV4I32Clamp,
27606f32e7eSjoerg 
27706f32e7eSjoerg   Suld2DI8Clamp,
27806f32e7eSjoerg   Suld2DI16Clamp,
27906f32e7eSjoerg   Suld2DI32Clamp,
28006f32e7eSjoerg   Suld2DI64Clamp,
28106f32e7eSjoerg   Suld2DV2I8Clamp,
28206f32e7eSjoerg   Suld2DV2I16Clamp,
28306f32e7eSjoerg   Suld2DV2I32Clamp,
28406f32e7eSjoerg   Suld2DV2I64Clamp,
28506f32e7eSjoerg   Suld2DV4I8Clamp,
28606f32e7eSjoerg   Suld2DV4I16Clamp,
28706f32e7eSjoerg   Suld2DV4I32Clamp,
28806f32e7eSjoerg 
28906f32e7eSjoerg   Suld2DArrayI8Clamp,
29006f32e7eSjoerg   Suld2DArrayI16Clamp,
29106f32e7eSjoerg   Suld2DArrayI32Clamp,
29206f32e7eSjoerg   Suld2DArrayI64Clamp,
29306f32e7eSjoerg   Suld2DArrayV2I8Clamp,
29406f32e7eSjoerg   Suld2DArrayV2I16Clamp,
29506f32e7eSjoerg   Suld2DArrayV2I32Clamp,
29606f32e7eSjoerg   Suld2DArrayV2I64Clamp,
29706f32e7eSjoerg   Suld2DArrayV4I8Clamp,
29806f32e7eSjoerg   Suld2DArrayV4I16Clamp,
29906f32e7eSjoerg   Suld2DArrayV4I32Clamp,
30006f32e7eSjoerg 
30106f32e7eSjoerg   Suld3DI8Clamp,
30206f32e7eSjoerg   Suld3DI16Clamp,
30306f32e7eSjoerg   Suld3DI32Clamp,
30406f32e7eSjoerg   Suld3DI64Clamp,
30506f32e7eSjoerg   Suld3DV2I8Clamp,
30606f32e7eSjoerg   Suld3DV2I16Clamp,
30706f32e7eSjoerg   Suld3DV2I32Clamp,
30806f32e7eSjoerg   Suld3DV2I64Clamp,
30906f32e7eSjoerg   Suld3DV4I8Clamp,
31006f32e7eSjoerg   Suld3DV4I16Clamp,
31106f32e7eSjoerg   Suld3DV4I32Clamp,
31206f32e7eSjoerg 
31306f32e7eSjoerg   Suld1DI8Trap,
31406f32e7eSjoerg   Suld1DI16Trap,
31506f32e7eSjoerg   Suld1DI32Trap,
31606f32e7eSjoerg   Suld1DI64Trap,
31706f32e7eSjoerg   Suld1DV2I8Trap,
31806f32e7eSjoerg   Suld1DV2I16Trap,
31906f32e7eSjoerg   Suld1DV2I32Trap,
32006f32e7eSjoerg   Suld1DV2I64Trap,
32106f32e7eSjoerg   Suld1DV4I8Trap,
32206f32e7eSjoerg   Suld1DV4I16Trap,
32306f32e7eSjoerg   Suld1DV4I32Trap,
32406f32e7eSjoerg 
32506f32e7eSjoerg   Suld1DArrayI8Trap,
32606f32e7eSjoerg   Suld1DArrayI16Trap,
32706f32e7eSjoerg   Suld1DArrayI32Trap,
32806f32e7eSjoerg   Suld1DArrayI64Trap,
32906f32e7eSjoerg   Suld1DArrayV2I8Trap,
33006f32e7eSjoerg   Suld1DArrayV2I16Trap,
33106f32e7eSjoerg   Suld1DArrayV2I32Trap,
33206f32e7eSjoerg   Suld1DArrayV2I64Trap,
33306f32e7eSjoerg   Suld1DArrayV4I8Trap,
33406f32e7eSjoerg   Suld1DArrayV4I16Trap,
33506f32e7eSjoerg   Suld1DArrayV4I32Trap,
33606f32e7eSjoerg 
33706f32e7eSjoerg   Suld2DI8Trap,
33806f32e7eSjoerg   Suld2DI16Trap,
33906f32e7eSjoerg   Suld2DI32Trap,
34006f32e7eSjoerg   Suld2DI64Trap,
34106f32e7eSjoerg   Suld2DV2I8Trap,
34206f32e7eSjoerg   Suld2DV2I16Trap,
34306f32e7eSjoerg   Suld2DV2I32Trap,
34406f32e7eSjoerg   Suld2DV2I64Trap,
34506f32e7eSjoerg   Suld2DV4I8Trap,
34606f32e7eSjoerg   Suld2DV4I16Trap,
34706f32e7eSjoerg   Suld2DV4I32Trap,
34806f32e7eSjoerg 
34906f32e7eSjoerg   Suld2DArrayI8Trap,
35006f32e7eSjoerg   Suld2DArrayI16Trap,
35106f32e7eSjoerg   Suld2DArrayI32Trap,
35206f32e7eSjoerg   Suld2DArrayI64Trap,
35306f32e7eSjoerg   Suld2DArrayV2I8Trap,
35406f32e7eSjoerg   Suld2DArrayV2I16Trap,
35506f32e7eSjoerg   Suld2DArrayV2I32Trap,
35606f32e7eSjoerg   Suld2DArrayV2I64Trap,
35706f32e7eSjoerg   Suld2DArrayV4I8Trap,
35806f32e7eSjoerg   Suld2DArrayV4I16Trap,
35906f32e7eSjoerg   Suld2DArrayV4I32Trap,
36006f32e7eSjoerg 
36106f32e7eSjoerg   Suld3DI8Trap,
36206f32e7eSjoerg   Suld3DI16Trap,
36306f32e7eSjoerg   Suld3DI32Trap,
36406f32e7eSjoerg   Suld3DI64Trap,
36506f32e7eSjoerg   Suld3DV2I8Trap,
36606f32e7eSjoerg   Suld3DV2I16Trap,
36706f32e7eSjoerg   Suld3DV2I32Trap,
36806f32e7eSjoerg   Suld3DV2I64Trap,
36906f32e7eSjoerg   Suld3DV4I8Trap,
37006f32e7eSjoerg   Suld3DV4I16Trap,
37106f32e7eSjoerg   Suld3DV4I32Trap,
37206f32e7eSjoerg 
37306f32e7eSjoerg   Suld1DI8Zero,
37406f32e7eSjoerg   Suld1DI16Zero,
37506f32e7eSjoerg   Suld1DI32Zero,
37606f32e7eSjoerg   Suld1DI64Zero,
37706f32e7eSjoerg   Suld1DV2I8Zero,
37806f32e7eSjoerg   Suld1DV2I16Zero,
37906f32e7eSjoerg   Suld1DV2I32Zero,
38006f32e7eSjoerg   Suld1DV2I64Zero,
38106f32e7eSjoerg   Suld1DV4I8Zero,
38206f32e7eSjoerg   Suld1DV4I16Zero,
38306f32e7eSjoerg   Suld1DV4I32Zero,
38406f32e7eSjoerg 
38506f32e7eSjoerg   Suld1DArrayI8Zero,
38606f32e7eSjoerg   Suld1DArrayI16Zero,
38706f32e7eSjoerg   Suld1DArrayI32Zero,
38806f32e7eSjoerg   Suld1DArrayI64Zero,
38906f32e7eSjoerg   Suld1DArrayV2I8Zero,
39006f32e7eSjoerg   Suld1DArrayV2I16Zero,
39106f32e7eSjoerg   Suld1DArrayV2I32Zero,
39206f32e7eSjoerg   Suld1DArrayV2I64Zero,
39306f32e7eSjoerg   Suld1DArrayV4I8Zero,
39406f32e7eSjoerg   Suld1DArrayV4I16Zero,
39506f32e7eSjoerg   Suld1DArrayV4I32Zero,
39606f32e7eSjoerg 
39706f32e7eSjoerg   Suld2DI8Zero,
39806f32e7eSjoerg   Suld2DI16Zero,
39906f32e7eSjoerg   Suld2DI32Zero,
40006f32e7eSjoerg   Suld2DI64Zero,
40106f32e7eSjoerg   Suld2DV2I8Zero,
40206f32e7eSjoerg   Suld2DV2I16Zero,
40306f32e7eSjoerg   Suld2DV2I32Zero,
40406f32e7eSjoerg   Suld2DV2I64Zero,
40506f32e7eSjoerg   Suld2DV4I8Zero,
40606f32e7eSjoerg   Suld2DV4I16Zero,
40706f32e7eSjoerg   Suld2DV4I32Zero,
40806f32e7eSjoerg 
40906f32e7eSjoerg   Suld2DArrayI8Zero,
41006f32e7eSjoerg   Suld2DArrayI16Zero,
41106f32e7eSjoerg   Suld2DArrayI32Zero,
41206f32e7eSjoerg   Suld2DArrayI64Zero,
41306f32e7eSjoerg   Suld2DArrayV2I8Zero,
41406f32e7eSjoerg   Suld2DArrayV2I16Zero,
41506f32e7eSjoerg   Suld2DArrayV2I32Zero,
41606f32e7eSjoerg   Suld2DArrayV2I64Zero,
41706f32e7eSjoerg   Suld2DArrayV4I8Zero,
41806f32e7eSjoerg   Suld2DArrayV4I16Zero,
41906f32e7eSjoerg   Suld2DArrayV4I32Zero,
42006f32e7eSjoerg 
42106f32e7eSjoerg   Suld3DI8Zero,
42206f32e7eSjoerg   Suld3DI16Zero,
42306f32e7eSjoerg   Suld3DI32Zero,
42406f32e7eSjoerg   Suld3DI64Zero,
42506f32e7eSjoerg   Suld3DV2I8Zero,
42606f32e7eSjoerg   Suld3DV2I16Zero,
42706f32e7eSjoerg   Suld3DV2I32Zero,
42806f32e7eSjoerg   Suld3DV2I64Zero,
42906f32e7eSjoerg   Suld3DV4I8Zero,
43006f32e7eSjoerg   Suld3DV4I16Zero,
43106f32e7eSjoerg   Suld3DV4I32Zero
43206f32e7eSjoerg };
43306f32e7eSjoerg }
43406f32e7eSjoerg 
43506f32e7eSjoerg class NVPTXSubtarget;
43606f32e7eSjoerg 
43706f32e7eSjoerg //===--------------------------------------------------------------------===//
43806f32e7eSjoerg // TargetLowering Implementation
43906f32e7eSjoerg //===--------------------------------------------------------------------===//
44006f32e7eSjoerg class NVPTXTargetLowering : public TargetLowering {
44106f32e7eSjoerg public:
44206f32e7eSjoerg   explicit NVPTXTargetLowering(const NVPTXTargetMachine &TM,
44306f32e7eSjoerg                                const NVPTXSubtarget &STI);
44406f32e7eSjoerg   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
44506f32e7eSjoerg 
44606f32e7eSjoerg   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
44706f32e7eSjoerg 
44806f32e7eSjoerg   const char *getTargetNodeName(unsigned Opcode) const override;
44906f32e7eSjoerg 
45006f32e7eSjoerg   bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
45106f32e7eSjoerg                           MachineFunction &MF,
45206f32e7eSjoerg                           unsigned Intrinsic) const override;
45306f32e7eSjoerg 
45406f32e7eSjoerg   /// isLegalAddressingMode - Return true if the addressing mode represented
45506f32e7eSjoerg   /// by AM is legal for this target, for a load/store of the specified type
45606f32e7eSjoerg   /// Used to guide target specific optimizations, like loop strength
45706f32e7eSjoerg   /// reduction (LoopStrengthReduce.cpp) and memory optimization for
45806f32e7eSjoerg   /// address mode (CodeGenPrepare.cpp)
45906f32e7eSjoerg   bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
46006f32e7eSjoerg                              unsigned AS,
46106f32e7eSjoerg                              Instruction *I = nullptr) const override;
46206f32e7eSjoerg 
isTruncateFree(Type * SrcTy,Type * DstTy)46306f32e7eSjoerg   bool isTruncateFree(Type *SrcTy, Type *DstTy) const override {
46406f32e7eSjoerg     // Truncating 64-bit to 32-bit is free in SASS.
46506f32e7eSjoerg     if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy())
46606f32e7eSjoerg       return false;
46706f32e7eSjoerg     return SrcTy->getPrimitiveSizeInBits() == 64 &&
46806f32e7eSjoerg            DstTy->getPrimitiveSizeInBits() == 32;
46906f32e7eSjoerg   }
47006f32e7eSjoerg 
getSetCCResultType(const DataLayout & DL,LLVMContext & Ctx,EVT VT)47106f32e7eSjoerg   EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
47206f32e7eSjoerg                          EVT VT) const override {
47306f32e7eSjoerg     if (VT.isVector())
47406f32e7eSjoerg       return EVT::getVectorVT(Ctx, MVT::i1, VT.getVectorNumElements());
47506f32e7eSjoerg     return MVT::i1;
47606f32e7eSjoerg   }
47706f32e7eSjoerg 
47806f32e7eSjoerg   ConstraintType getConstraintType(StringRef Constraint) const override;
47906f32e7eSjoerg   std::pair<unsigned, const TargetRegisterClass *>
48006f32e7eSjoerg   getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
48106f32e7eSjoerg                                StringRef Constraint, MVT VT) const override;
48206f32e7eSjoerg 
48306f32e7eSjoerg   SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
48406f32e7eSjoerg                                bool isVarArg,
48506f32e7eSjoerg                                const SmallVectorImpl<ISD::InputArg> &Ins,
48606f32e7eSjoerg                                const SDLoc &dl, SelectionDAG &DAG,
48706f32e7eSjoerg                                SmallVectorImpl<SDValue> &InVals) const override;
48806f32e7eSjoerg 
48906f32e7eSjoerg   SDValue LowerCall(CallLoweringInfo &CLI,
49006f32e7eSjoerg                     SmallVectorImpl<SDValue> &InVals) const override;
49106f32e7eSjoerg 
49206f32e7eSjoerg   std::string getPrototype(const DataLayout &DL, Type *, const ArgListTy &,
49306f32e7eSjoerg                            const SmallVectorImpl<ISD::OutputArg> &,
494*da58b97aSjoerg                            MaybeAlign retAlignment, const CallBase &CB,
495*da58b97aSjoerg                            unsigned UniqueCallSite) const;
49606f32e7eSjoerg 
49706f32e7eSjoerg   SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
49806f32e7eSjoerg                       const SmallVectorImpl<ISD::OutputArg> &Outs,
49906f32e7eSjoerg                       const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
50006f32e7eSjoerg                       SelectionDAG &DAG) const override;
50106f32e7eSjoerg 
50206f32e7eSjoerg   void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
50306f32e7eSjoerg                                     std::vector<SDValue> &Ops,
50406f32e7eSjoerg                                     SelectionDAG &DAG) const override;
50506f32e7eSjoerg 
50606f32e7eSjoerg   const NVPTXTargetMachine *nvTM;
50706f32e7eSjoerg 
50806f32e7eSjoerg   // PTX always uses 32-bit shift amounts
getScalarShiftAmountTy(const DataLayout &,EVT)50906f32e7eSjoerg   MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
51006f32e7eSjoerg     return MVT::i32;
51106f32e7eSjoerg   }
51206f32e7eSjoerg 
51306f32e7eSjoerg   TargetLoweringBase::LegalizeTypeAction
51406f32e7eSjoerg   getPreferredVectorAction(MVT VT) const override;
51506f32e7eSjoerg 
51606f32e7eSjoerg   // Get the degree of precision we want from 32-bit floating point division
51706f32e7eSjoerg   // operations.
51806f32e7eSjoerg   //
51906f32e7eSjoerg   //  0 - Use ptx div.approx
52006f32e7eSjoerg   //  1 - Use ptx.div.full (approximate, but less so than div.approx)
52106f32e7eSjoerg   //  2 - Use IEEE-compliant div instructions, if available.
52206f32e7eSjoerg   int getDivF32Level() const;
52306f32e7eSjoerg 
52406f32e7eSjoerg   // Get whether we should use a precise or approximate 32-bit floating point
52506f32e7eSjoerg   // sqrt instruction.
52606f32e7eSjoerg   bool usePrecSqrtF32() const;
52706f32e7eSjoerg 
52806f32e7eSjoerg   // Get whether we should use instructions that flush floating-point denormals
52906f32e7eSjoerg   // to sign-preserving zero.
53006f32e7eSjoerg   bool useF32FTZ(const MachineFunction &MF) const;
53106f32e7eSjoerg 
53206f32e7eSjoerg   SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
53306f32e7eSjoerg                           int &ExtraSteps, bool &UseOneConst,
53406f32e7eSjoerg                           bool Reciprocal) const override;
53506f32e7eSjoerg 
combineRepeatedFPDivisors()53606f32e7eSjoerg   unsigned combineRepeatedFPDivisors() const override { return 2; }
53706f32e7eSjoerg 
53806f32e7eSjoerg   bool allowFMA(MachineFunction &MF, CodeGenOpt::Level OptLevel) const;
53906f32e7eSjoerg   bool allowUnsafeFPMath(MachineFunction &MF) const;
54006f32e7eSjoerg 
isFMAFasterThanFMulAndFAdd(const MachineFunction & MF,EVT)541*da58b97aSjoerg   bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
542*da58b97aSjoerg                                   EVT) const override {
543*da58b97aSjoerg     return true;
544*da58b97aSjoerg   }
54506f32e7eSjoerg 
enableAggressiveFMAFusion(EVT VT)54606f32e7eSjoerg   bool enableAggressiveFMAFusion(EVT VT) const override { return true; }
54706f32e7eSjoerg 
54806f32e7eSjoerg   // The default is to transform llvm.ctlz(x, false) (where false indicates that
54906f32e7eSjoerg   // x == 0 is not undefined behavior) into a branch that checks whether x is 0
55006f32e7eSjoerg   // and avoids calling ctlz in that case.  We have a dedicated ctlz
55106f32e7eSjoerg   // instruction, so we say that ctlz is cheap to speculate.
isCheapToSpeculateCtlz()55206f32e7eSjoerg   bool isCheapToSpeculateCtlz() const override { return true; }
55306f32e7eSjoerg 
55406f32e7eSjoerg private:
55506f32e7eSjoerg   const NVPTXSubtarget &STI; // cache the subtarget here
55606f32e7eSjoerg   SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
55706f32e7eSjoerg 
55806f32e7eSjoerg   SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
55906f32e7eSjoerg   SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
56006f32e7eSjoerg   SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
56106f32e7eSjoerg 
56206f32e7eSjoerg   SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
56306f32e7eSjoerg   SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const;
56406f32e7eSjoerg   SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
56506f32e7eSjoerg 
56606f32e7eSjoerg   SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
56706f32e7eSjoerg   SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
56806f32e7eSjoerg 
56906f32e7eSjoerg   SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
57006f32e7eSjoerg   SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
57106f32e7eSjoerg   SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
57206f32e7eSjoerg 
57306f32e7eSjoerg   SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
57406f32e7eSjoerg   SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
57506f32e7eSjoerg 
57606f32e7eSjoerg   SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
57706f32e7eSjoerg 
57806f32e7eSjoerg   void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
57906f32e7eSjoerg                           SelectionDAG &DAG) const override;
58006f32e7eSjoerg   SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
58106f32e7eSjoerg 
582*da58b97aSjoerg   Align getArgumentAlignment(SDValue Callee, const CallBase *CB, Type *Ty,
58306f32e7eSjoerg                              unsigned Idx, const DataLayout &DL) const;
58406f32e7eSjoerg };
58506f32e7eSjoerg } // namespace llvm
58606f32e7eSjoerg 
58706f32e7eSjoerg #endif
588