[NVPTX] Just use getTypeAllocSize() when computing return value size for structures...
[oota-llvm.git] / lib / Target / NVPTX / NVPTXISelLowering.h
1 //===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the interfaces that NVPTX uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef NVPTXISELLOWERING_H
16 #define NVPTXISELLOWERING_H
17
18 #include "NVPTX.h"
19 #include "llvm/CodeGen/SelectionDAG.h"
20 #include "llvm/Target/TargetLowering.h"
21
22 namespace llvm {
23 namespace NVPTXISD {
24 enum NodeType {
25   // Start the numbering from where ISD NodeType finishes.
26   FIRST_NUMBER = ISD::BUILTIN_OP_END,
27   Wrapper,
28   CALL,
29   RET_FLAG,
30   LOAD_PARAM,
31   DeclareParam,
32   DeclareScalarParam,
33   DeclareRetParam,
34   DeclareRet,
35   DeclareScalarRet,
36   PrintCall,
37   PrintCallUni,
38   CallArgBegin,
39   CallArg,
40   LastCallArg,
41   CallArgEnd,
42   CallVoid,
43   CallVal,
44   CallSymbol,
45   Prototype,
46   MoveParam,
47   PseudoUseParam,
48   RETURN,
49   CallSeqBegin,
50   CallSeqEnd,
51   CallPrototype,
52   Dummy,
53
54   LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
55   LoadV4,
56   LDGV2, // LDG.v2
57   LDGV4, // LDG.v4
58   LDUV2, // LDU.v2
59   LDUV4, // LDU.v4
60   StoreV2,
61   StoreV4,
62   LoadParam,
63   LoadParamV2,
64   LoadParamV4,
65   StoreParam,
66   StoreParamV2,
67   StoreParamV4,
68   StoreParamS32, // to sext and store a <32bit value, not used currently
69   StoreParamU32, // to zext and store a <32bit value, not used currently 
70   StoreRetval,
71   StoreRetvalV2,
72   StoreRetvalV4,
73
74   // Texture intrinsics
75   Tex1DFloatI32,
76   Tex1DFloatFloat,
77   Tex1DFloatFloatLevel,
78   Tex1DFloatFloatGrad,
79   Tex1DI32I32,
80   Tex1DI32Float,
81   Tex1DI32FloatLevel,
82   Tex1DI32FloatGrad,
83   Tex1DArrayFloatI32,
84   Tex1DArrayFloatFloat,
85   Tex1DArrayFloatFloatLevel,
86   Tex1DArrayFloatFloatGrad,
87   Tex1DArrayI32I32,
88   Tex1DArrayI32Float,
89   Tex1DArrayI32FloatLevel,
90   Tex1DArrayI32FloatGrad,
91   Tex2DFloatI32,
92   Tex2DFloatFloat,
93   Tex2DFloatFloatLevel,
94   Tex2DFloatFloatGrad,
95   Tex2DI32I32,
96   Tex2DI32Float,
97   Tex2DI32FloatLevel,
98   Tex2DI32FloatGrad,
99   Tex2DArrayFloatI32,
100   Tex2DArrayFloatFloat,
101   Tex2DArrayFloatFloatLevel,
102   Tex2DArrayFloatFloatGrad,
103   Tex2DArrayI32I32,
104   Tex2DArrayI32Float,
105   Tex2DArrayI32FloatLevel,
106   Tex2DArrayI32FloatGrad,
107   Tex3DFloatI32,
108   Tex3DFloatFloat,
109   Tex3DFloatFloatLevel,
110   Tex3DFloatFloatGrad,
111   Tex3DI32I32,
112   Tex3DI32Float,
113   Tex3DI32FloatLevel,
114   Tex3DI32FloatGrad,
115
116   // Surface intrinsics
117   Suld1DI8Trap,
118   Suld1DI16Trap,
119   Suld1DI32Trap,
120   Suld1DV2I8Trap,
121   Suld1DV2I16Trap,
122   Suld1DV2I32Trap,
123   Suld1DV4I8Trap,
124   Suld1DV4I16Trap,
125   Suld1DV4I32Trap,
126
127   Suld1DArrayI8Trap,
128   Suld1DArrayI16Trap,
129   Suld1DArrayI32Trap,
130   Suld1DArrayV2I8Trap,
131   Suld1DArrayV2I16Trap,
132   Suld1DArrayV2I32Trap,
133   Suld1DArrayV4I8Trap,
134   Suld1DArrayV4I16Trap,
135   Suld1DArrayV4I32Trap,
136
137   Suld2DI8Trap,
138   Suld2DI16Trap,
139   Suld2DI32Trap,
140   Suld2DV2I8Trap,
141   Suld2DV2I16Trap,
142   Suld2DV2I32Trap,
143   Suld2DV4I8Trap,
144   Suld2DV4I16Trap,
145   Suld2DV4I32Trap,
146
147   Suld2DArrayI8Trap,
148   Suld2DArrayI16Trap,
149   Suld2DArrayI32Trap,
150   Suld2DArrayV2I8Trap,
151   Suld2DArrayV2I16Trap,
152   Suld2DArrayV2I32Trap,
153   Suld2DArrayV4I8Trap,
154   Suld2DArrayV4I16Trap,
155   Suld2DArrayV4I32Trap,
156
157   Suld3DI8Trap,
158   Suld3DI16Trap,
159   Suld3DI32Trap,
160   Suld3DV2I8Trap,
161   Suld3DV2I16Trap,
162   Suld3DV2I32Trap,
163   Suld3DV4I8Trap,
164   Suld3DV4I16Trap,
165   Suld3DV4I32Trap
166 };
167 }
168
169 class NVPTXSubtarget;
170
171 //===--------------------------------------------------------------------===//
172 // TargetLowering Implementation
173 //===--------------------------------------------------------------------===//
174 class NVPTXTargetLowering : public TargetLowering {
175 public:
176   explicit NVPTXTargetLowering(NVPTXTargetMachine &TM);
177   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
178
179   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
180   SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset,
181                              SelectionDAG &DAG) const;
182
183   const char *getTargetNodeName(unsigned Opcode) const override;
184
185   bool isTypeSupportedInIntrinsic(MVT VT) const;
186
187   bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
188                           unsigned Intrinsic) const override;
189
190   /// isLegalAddressingMode - Return true if the addressing mode represented
191   /// by AM is legal for this target, for a load/store of the specified type
192   /// Used to guide target specific optimizations, like loop strength
193   /// reduction (LoopStrengthReduce.cpp) and memory optimization for
194   /// address mode (CodeGenPrepare.cpp)
195   bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
196
197   /// getFunctionAlignment - Return the Log2 alignment of this function.
198   unsigned getFunctionAlignment(const Function *F) const;
199
200   EVT getSetCCResultType(LLVMContext &, EVT VT) const override {
201     if (VT.isVector())
202       return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements());
203     return MVT::i1;
204   }
205
206   ConstraintType
207   getConstraintType(const std::string &Constraint) const override;
208   std::pair<unsigned, const TargetRegisterClass *>
209   getRegForInlineAsmConstraint(const std::string &Constraint,
210                                MVT VT) const override;
211
212   SDValue LowerFormalArguments(
213       SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
214       const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc dl, SelectionDAG &DAG,
215       SmallVectorImpl<SDValue> &InVals) const override;
216
217   SDValue LowerCall(CallLoweringInfo &CLI,
218                     SmallVectorImpl<SDValue> &InVals) const override;
219
220   std::string getPrototype(Type *, const ArgListTy &,
221                            const SmallVectorImpl<ISD::OutputArg> &,
222                            unsigned retAlignment,
223                            const ImmutableCallSite *CS) const;
224
225   SDValue
226   LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
227               const SmallVectorImpl<ISD::OutputArg> &Outs,
228               const SmallVectorImpl<SDValue> &OutVals, SDLoc dl,
229               SelectionDAG &DAG) const override;
230
231   void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
232                                     std::vector<SDValue> &Ops,
233                                     SelectionDAG &DAG) const override;
234
235   NVPTXTargetMachine *nvTM;
236
237   // PTX always uses 32-bit shift amounts
238   MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; }
239
240   bool shouldSplitVectorType(EVT VT) const override;
241
242 private:
243   const NVPTXSubtarget &nvptxSubtarget; // cache the subtarget here
244
245   SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx,
246                      EVT = MVT::i32) const;
247   SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
248   SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx);
249
250   SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
251
252   SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
253   SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
254
255   SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
256   SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
257   SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
258
259   void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
260                           SelectionDAG &DAG) const override;
261
262   unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS,
263                                 Type *Ty, unsigned Idx) const;
264 };
265 } // namespace llvm
266
267 #endif // NVPTXISELLOWERING_H