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