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