149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===// 249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The LLVM Compiler Infrastructure 449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source 649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details. 749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file defines the interfaces that NVPTX uses to lower LLVM code into a 1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// selection DAG. 1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#ifndef NVPTXISELLOWERING_H 1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define NVPTXISELLOWERING_H 1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTX.h" 1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSubtarget.h" 2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/SelectionDAG.h" 2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetLowering.h" 2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm { 2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace NVPTXISD { 2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum NodeType { 2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // Start the numbering from where ISD NodeType finishes. 2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski FIRST_NUMBER = ISD::BUILTIN_OP_END, 2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Wrapper, 2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CALL, 3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RET_FLAG, 3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski LOAD_PARAM, 3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski NVBuiltin, 3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DeclareParam, 3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DeclareScalarParam, 3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DeclareRetParam, 3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DeclareRet, 3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DeclareScalarRet, 3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski LoadParam, 3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StoreParam, 4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StoreParamS32, // to sext and store a <32bit value, not used currently 4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StoreParamU32, // to zext and store a <32bit value, not used currently 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MoveToParam, 4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski PrintCall, 4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski PrintCallUni, 4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallArgBegin, 4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallArg, 4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski LastCallArg, 4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallArgEnd, 4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallVoid, 5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallVal, 5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallSymbol, 5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Prototype, 5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MoveParam, 5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MoveRetval, 5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MoveToRetval, 5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StoreRetval, 5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski PseudoUseParam, 5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RETURN, 5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallSeqBegin, 6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CallSeqEnd, 617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski Dummy, 627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski 637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE, 647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LoadV4, 657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LDGV2, // LDG.v2 667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LDGV4, // LDG.v4 677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LDUV2, // LDU.v2 687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski LDUV4, // LDU.v4 697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski StoreV2, 707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski StoreV4 7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}; 7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===--------------------------------------------------------------------===// 7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// TargetLowering Implementation 7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===--------------------------------------------------------------------===// 7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass NVPTXTargetLowering : public TargetLowering { 7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskipublic: 7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski explicit NVPTXTargetLowering(NVPTXTargetMachine &TM); 8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset, 8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SelectionDAG &DAG) const; 8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual const char *getTargetNodeName(unsigned Opcode) const; 8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski bool isTypeSupportedInIntrinsic(MVT VT) const; 8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski bool getTgtMemIntrinsic(IntrinsicInfo& Info, const CallInst &I, 9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski unsigned Intrinsic) const; 9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// isLegalAddressingMode - Return true if the addressing mode represented 9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// by AM is legal for this target, for a load/store of the specified type 9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// Used to guide target specific optimizations, like loop strength 9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// reduction (LoopStrengthReduce.cpp) and memory optimization for 9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// address mode (CodeGenPrepare.cpp) 9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const; 9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski /// getFunctionAlignment - Return the Log2 alignment of this function. 10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual unsigned getFunctionAlignment(const Function *F) const; 10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual EVT getSetCCResultType(EVT VT) const { 1043d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski if (VT.isVector()) 1053d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements()); 10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return MVT::i1; 10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski ConstraintType getConstraintType(const std::string &Constraint) const; 11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski std::pair<unsigned, const TargetRegisterClass*> 11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const; 11249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual SDValue 11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const SmallVectorImpl<ISD::InputArg> &Ins, DebugLoc dl, 11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SelectionDAG &DAG, 11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SmallVectorImpl<SDValue> &InVals) const; 11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 119d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski virtual SDValue 120d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski LowerCall(CallLoweringInfo &CLI, SmallVectorImpl<SDValue> &InVals) const; 12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski std::string getPrototype(Type *, const ArgListTy &, 12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const SmallVectorImpl<ISD::OutputArg> &, 12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski unsigned retAlignment) const; 12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual SDValue 12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const SmallVectorImpl<ISD::OutputArg> &Outs, 12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const SmallVectorImpl<SDValue> &OutVals, DebugLoc dl, 13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SelectionDAG &DAG) const; 13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint, 13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski std::vector<SDValue> &Ops, 13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SelectionDAG &DAG) const; 13549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski NVPTXTargetMachine *nvTM; 13749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // PTX always uses 32-bit shift amounts 139a6b20ced765b67a85d9219d0c8547fc9c133e14fMichael Liao virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { 14049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return MVT::i32; 14149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 14249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1433d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski virtual bool shouldSplitVectorElementType(EVT VT) const; 1443d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski 14549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiprivate: 14649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const NVPTXSubtarget &nvptxSubtarget; // cache the subtarget here 14749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 14849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx, EVT = 14949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski MVT::i32) const; 15049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT = MVT::i32) const; 15149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx); 15249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 15349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const; 154a20067b5d4ea718a3f0e47adae8b231e4a2db9f6Justin Holewinski 155a20067b5d4ea718a3f0e47adae8b231e4a2db9f6Justin Holewinski SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 1567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const; 1577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski 1587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 1597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const; 1607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const; 1617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski 1627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski virtual void ReplaceNodeResults(SDNode *N, 1637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SmallVectorImpl<SDValue> &Results, 1647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski SelectionDAG &DAG) const; 16549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}; 16649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} // namespace llvm 16749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 16849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#endif // NVPTXISELLOWERING_H 169