[NVPTX] Add infrastructure for vector loads/stores of parameters
[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 "NVPTXSubtarget.h"
20 #include "llvm/CodeGen/SelectionDAG.h"
21 #include "llvm/Target/TargetLowering.h"
22
23 namespace llvm {
24 namespace NVPTXISD {
25 enum NodeType {
26   // Start the numbering from where ISD NodeType finishes.
27   FIRST_NUMBER = ISD::BUILTIN_OP_END,
28   Wrapper,
29   CALL,
30   RET_FLAG,
31   LOAD_PARAM,
32   NVBuiltin,
33   DeclareParam,
34   DeclareScalarParam,
35   DeclareRetParam,
36   DeclareRet,
37   DeclareScalarRet,
38   LoadParam,
39   LoadParamV2,
40   LoadParamV4,
41   StoreParam,
42   StoreParamV2,
43   StoreParamV4,
44   StoreParamS32, // to sext and store a <32bit value, not used currently
45   StoreParamU32, // to zext and store a <32bit value, not used currently
46   MoveToParam,
47   PrintCall,
48   PrintCallUni,
49   CallArgBegin,
50   CallArg,
51   LastCallArg,
52   CallArgEnd,
53   CallVoid,
54   CallVal,
55   CallSymbol,
56   Prototype,
57   MoveParam,
58   MoveRetval,
59   MoveToRetval,
60   StoreRetval,
61   StoreRetvalV2,
62   StoreRetvalV4,
63   PseudoUseParam,
64   RETURN,
65   CallSeqBegin,
66   CallSeqEnd,
67   Dummy,
68
69   LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
70   LoadV4,
71   LDGV2, // LDG.v2
72   LDGV4, // LDG.v4
73   LDUV2, // LDU.v2
74   LDUV4, // LDU.v4
75   StoreV2,
76   StoreV4
77 };
78 }
79
80 //===--------------------------------------------------------------------===//
81 // TargetLowering Implementation
82 //===--------------------------------------------------------------------===//
83 class NVPTXTargetLowering : public TargetLowering {
84 public:
85   explicit NVPTXTargetLowering(NVPTXTargetMachine &TM);
86   virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
87
88   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
89   SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset,
90                              SelectionDAG &DAG) const;
91
92   virtual const char *getTargetNodeName(unsigned Opcode) const;
93
94   bool isTypeSupportedInIntrinsic(MVT VT) const;
95
96   bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
97                           unsigned Intrinsic) const;
98
99   /// isLegalAddressingMode - Return true if the addressing mode represented
100   /// by AM is legal for this target, for a load/store of the specified type
101   /// Used to guide target specific optimizations, like loop strength
102   /// reduction (LoopStrengthReduce.cpp) and memory optimization for
103   /// address mode (CodeGenPrepare.cpp)
104   virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
105
106   /// getFunctionAlignment - Return the Log2 alignment of this function.
107   virtual unsigned getFunctionAlignment(const Function *F) const;
108
109   virtual EVT getSetCCResultType(LLVMContext &, EVT VT) const {
110     if (VT.isVector())
111       return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements());
112     return MVT::i1;
113   }
114
115   ConstraintType getConstraintType(const std::string &Constraint) const;
116   std::pair<unsigned, const TargetRegisterClass *>
117   getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const;
118
119   virtual SDValue LowerFormalArguments(
120       SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
121       const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc dl, SelectionDAG &DAG,
122       SmallVectorImpl<SDValue> &InVals) const;
123
124   virtual SDValue
125   LowerCall(CallLoweringInfo &CLI, SmallVectorImpl<SDValue> &InVals) const;
126
127   std::string getPrototype(Type *, const ArgListTy &,
128                            const SmallVectorImpl<ISD::OutputArg> &,
129                            unsigned retAlignment) const;
130
131   virtual SDValue
132   LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
133               const SmallVectorImpl<ISD::OutputArg> &Outs,
134               const SmallVectorImpl<SDValue> &OutVals, SDLoc dl,
135               SelectionDAG &DAG) const;
136
137   virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
138                                             std::vector<SDValue> &Ops,
139                                             SelectionDAG &DAG) const;
140
141   NVPTXTargetMachine *nvTM;
142
143   // PTX always uses 32-bit shift amounts
144   virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i32; }
145
146   virtual bool shouldSplitVectorElementType(EVT VT) const;
147
148 private:
149   const NVPTXSubtarget &nvptxSubtarget; // cache the subtarget here
150
151   SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx,
152                      EVT = MVT::i32) const;
153   SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
154   SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx);
155
156   SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
157
158   SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
159   SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
160
161   SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
162   SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
163   SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
164
165   virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
166                                   SelectionDAG &DAG) const;
167 };
168 } // namespace llvm
169
170 #endif // NVPTXISELLOWERING_H