149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===//
249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//                     The LLVM Compiler Infrastructure
449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source
649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details.
749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file defines the interfaces that NVPTX uses to lower LLVM code into a
1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// selection DAG.
1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#ifndef NVPTXISELLOWERING_H
1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define NVPTXISELLOWERING_H
1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTX.h"
1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSubtarget.h"
2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/SelectionDAG.h"
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetLowering.h"
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm {
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace NVPTXISD {
2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum NodeType {
2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // Start the numbering from where ISD NodeType finishes.
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  FIRST_NUMBER = ISD::BUILTIN_OP_END,
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Wrapper,
2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CALL,
3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  RET_FLAG,
3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LOAD_PARAM,
3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NVBuiltin,
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  DeclareParam,
3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  DeclareScalarParam,
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  DeclareRetParam,
3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  DeclareRet,
3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  DeclareScalarRet,
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LoadParam,
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreParam,
4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreParamS32, // to sext and store a <32bit value, not used currently
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreParamU32, // to zext and store a <32bit value, not used currently
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MoveToParam,
4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  PrintCall,
4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  PrintCallUni,
4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallArgBegin,
4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallArg,
4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LastCallArg,
4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallArgEnd,
4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallVoid,
5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallVal,
5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallSymbol,
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Prototype,
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MoveParam,
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MoveRetval,
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  MoveToRetval,
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  StoreRetval,
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  PseudoUseParam,
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  RETURN,
5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallSeqBegin,
6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CallSeqEnd,
617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  Dummy,
627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LoadV4,
657eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LDGV2, // LDG.v2
667eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LDGV4, // LDG.v4
677eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LDUV2, // LDU.v2
687eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  LDUV4, // LDU.v4
697eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StoreV2,
707eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  StoreV4
7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===--------------------------------------------------------------------===//
7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// TargetLowering Implementation
7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===--------------------------------------------------------------------===//
7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass NVPTXTargetLowering : public TargetLowering {
7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskipublic:
7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  explicit NVPTXTargetLowering(NVPTXTargetMachine &TM);
8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset,
8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                             SelectionDAG &DAG) const;
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual const char *getTargetNodeName(unsigned Opcode) const;
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool isTypeSupportedInIntrinsic(MVT VT) const;
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  bool getTgtMemIntrinsic(IntrinsicInfo& Info, const CallInst &I,
9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                          unsigned Intrinsic) const;
9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// isLegalAddressingMode - Return true if the addressing mode represented
9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// by AM is legal for this target, for a load/store of the specified type
9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// Used to guide target specific optimizations, like loop strength
9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// reduction (LoopStrengthReduce.cpp) and memory optimization for
9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// address mode (CodeGenPrepare.cpp)
9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  /// getFunctionAlignment - Return the Log2 alignment of this function.
10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual unsigned getFunctionAlignment(const Function *F) const;
10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual EVT getSetCCResultType(EVT VT) const {
1043d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski    if (VT.isVector())
1053d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski      return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements());
10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return MVT::i1;
10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  ConstraintType getConstraintType(const std::string &Constraint) const;
11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  std::pair<unsigned, const TargetRegisterClass*>
11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
11249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual SDValue
11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                       const SmallVectorImpl<ISD::InputArg> &Ins, DebugLoc dl,
11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                       SelectionDAG &DAG,
11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                       SmallVectorImpl<SDValue> &InVals) const;
11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
119d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski  virtual SDValue
120d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski  LowerCall(CallLoweringInfo &CLI, SmallVectorImpl<SDValue> &InVals) const;
12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  std::string getPrototype(Type *, const ArgListTy &,
12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                           const SmallVectorImpl<ISD::OutputArg> &,
12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                           unsigned retAlignment) const;
12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual SDValue
12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski              const SmallVectorImpl<ISD::OutputArg> &Outs,
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski              const SmallVectorImpl<SDValue> &OutVals, DebugLoc dl,
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski              SelectionDAG &DAG) const;
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                            std::vector<SDValue> &Ops,
13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                            SelectionDAG &DAG) const;
13549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NVPTXTargetMachine *nvTM;
13749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  // PTX always uses 32-bit shift amounts
139a6b20ced765b67a85d9219d0c8547fc9c133e14fMichael Liao  virtual MVT getScalarShiftAmountTy(EVT LHSTy) const {
14049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    return MVT::i32;
14149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
14249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1433d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski  virtual bool shouldSplitVectorElementType(EVT VT) const;
1443d200255d5b93344c1ab0a5ba4b47a52cfa5893eJustin Holewinski
14549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiprivate:
14649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  const NVPTXSubtarget &nvptxSubtarget;  // cache the subtarget here
14749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
14849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx, EVT =
14949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                         MVT::i32) const;
15049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT = MVT::i32) const;
15149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx);
15249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
15349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
154a20067b5d4ea718a3f0e47adae8b231e4a2db9f6Justin Holewinski
155a20067b5d4ea718a3f0e47adae8b231e4a2db9f6Justin Holewinski  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
1567eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
1577eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
1587eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
1597eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
1607eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
1617eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski
1627eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski  virtual void ReplaceNodeResults(SDNode *N,
1637eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski                                  SmallVectorImpl<SDValue> &Results,
1647eacad03efda36e09ebd96e95d7891cadaaa9087Justin Holewinski                                  SelectionDAG &DAG) const;
16549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
16649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} // namespace llvm
16749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
16849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#endif // NVPTXISELLOWERING_H
169