NVPTXISelLowering.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===// 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// The LLVM Compiler Infrastructure 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This file is distributed under the University of Illinois Open Source 6fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski// License. See LICENSE.TXT for details. 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//===----------------------------------------------------------------------===// 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This file defines the interfaces that NVPTX uses to lower LLVM code into a 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// selection DAG. 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//===----------------------------------------------------------------------===// 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef NVPTXISELLOWERING_H 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define NVPTXISELLOWERING_H 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "NVPTX.h" 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "NVPTXSubtarget.h" 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "llvm/CodeGen/SelectionDAG.h" 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "llvm/Target/TargetLowering.h" 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace llvm { 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace NVPTXISD { 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum NodeType { 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Start the numbering from where ISD NodeType finishes. 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski FIRST_NUMBER = ISD::BUILTIN_OP_END, 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Wrapper, 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CALL, 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski RET_FLAG, 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LOAD_PARAM, 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DeclareParam, 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DeclareScalarParam, 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DeclareRetParam, 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DeclareRet, 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DeclareScalarRet, 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PrintCall, 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PrintCallUni, 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallArgBegin, 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallArg, 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LastCallArg, 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallArgEnd, 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallVoid, 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallVal, 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallSymbol, 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Prototype, 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski MoveParam, 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PseudoUseParam, 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski RETURN, 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallSeqBegin, 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallSeqEnd, 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CallPrototype, 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Dummy, 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE, 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadV4, 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LDGV2, // LDG.v2 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LDGV4, // LDG.v4 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LDUV2, // LDU.v2 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LDUV4, // LDU.v4 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreV2, 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreV4, 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadParam, 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadParamV2, 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadParamV4, 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreParam, 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreParamV2, 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreParamV4, 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreParamS32, // to sext and store a <32bit value, not used currently 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreParamU32, // to zext and store a <32bit value, not used currently 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreRetval, 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreRetvalV2, 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StoreRetvalV4 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//===--------------------------------------------------------------------===// 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// TargetLowering Implementation 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//===--------------------------------------------------------------------===// 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass NVPTXTargetLowering : public TargetLowering { 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski explicit NVPTXTargetLowering(NVPTXTargetMachine &TM); 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset, 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SelectionDAG &DAG) const; 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual const char *getTargetNodeName(unsigned Opcode) const; 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool isTypeSupportedInIntrinsic(MVT VT) const; 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I, 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned Intrinsic) const; 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// isLegalAddressingMode - Return true if the addressing mode represented 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// by AM is legal for this target, for a load/store of the specified type 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// Used to guide target specific optimizations, like loop strength 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// reduction (LoopStrengthReduce.cpp) and memory optimization for 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// address mode (CodeGenPrepare.cpp) 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const; 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /// getFunctionAlignment - Return the Log2 alignment of this function. 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual unsigned getFunctionAlignment(const Function *F) const; 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual EVT getSetCCResultType(LLVMContext &, EVT VT) const { 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (VT.isVector()) 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements()); 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return MVT::i1; 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ConstraintType getConstraintType(const std::string &Constraint) const; 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski std::pair<unsigned, const TargetRegisterClass *> 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const; 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual SDValue LowerFormalArguments( 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc dl, SelectionDAG &DAG, 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SmallVectorImpl<SDValue> &InVals) const; 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual SDValue 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LowerCall(CallLoweringInfo &CLI, SmallVectorImpl<SDValue> &InVals) const; 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski std::string getPrototype(Type *, const ArgListTy &, 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SmallVectorImpl<ISD::OutputArg> &, 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned retAlignment, 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ImmutableCallSite *CS) const; 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual SDValue 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SmallVectorImpl<ISD::OutputArg> &Outs, 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SmallVectorImpl<SDValue> &OutVals, SDLoc dl, 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SelectionDAG &DAG) const; 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint, 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski std::vector<SDValue> &Ops, 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SelectionDAG &DAG) const; 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NVPTXTargetMachine *nvTM; 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // PTX always uses 32-bit shift amounts 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i32; } 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool shouldSplitVectorType(EVT VT) const override; 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const NVPTXSubtarget &nvptxSubtarget; // cache the subtarget here 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx, 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski EVT = MVT::i32) const; 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const; 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx); 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const; 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const; 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const; 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const; 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results, 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SelectionDAG &DAG) const; 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS, 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Type *Ty, unsigned Idx) const; 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} // namespace llvm 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // NVPTXISELLOWERING_H 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski