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