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