1//=====-- NVPTXSubtarget.h - Define Subtarget for the NVPTX ---*- 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 declares the NVPTX specific subclass of TargetSubtarget.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef NVPTXSUBTARGET_H
15#define NVPTXSUBTARGET_H
16
17#include "NVPTX.h"
18#include "NVPTXFrameLowering.h"
19#include "NVPTXISelLowering.h"
20#include "NVPTXInstrInfo.h"
21#include "NVPTXRegisterInfo.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/Target/TargetSelectionDAGInfo.h"
24#include "llvm/Target/TargetSubtargetInfo.h"
25#include <string>
26
27#define GET_SUBTARGETINFO_HEADER
28#include "NVPTXGenSubtargetInfo.inc"
29
30namespace llvm {
31
32class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
33  virtual void anchor();
34  std::string TargetName;
35  NVPTX::DrvInterface drvInterface;
36  bool Is64Bit;
37
38  // PTX version x.y is represented as 10*x+y, e.g. 3.1 == 31
39  unsigned PTXVersion;
40
41  // SM version x.y is represented as 10*x+y, e.g. 3.1 == 31
42  unsigned int SmVersion;
43
44  const DataLayout DL; // Calculates type size & alignment
45  NVPTXInstrInfo InstrInfo;
46  NVPTXTargetLowering TLInfo;
47  TargetSelectionDAGInfo TSInfo;
48
49  // NVPTX does not have any call stack frame, but need a NVPTX specific
50  // FrameLowering class because TargetFrameLowering is abstract.
51  NVPTXFrameLowering FrameLowering;
52
53public:
54  /// This constructor initializes the data members to match that
55  /// of the specified module.
56  ///
57  NVPTXSubtarget(const std::string &TT, const std::string &CPU,
58                 const std::string &FS, const TargetMachine &TM, bool is64Bit);
59
60  const TargetFrameLowering *getFrameLowering() const { return &FrameLowering; }
61  const NVPTXInstrInfo *getInstrInfo() const { return &InstrInfo; }
62  const DataLayout *getDataLayout() const { return &DL; }
63  const NVPTXRegisterInfo *getRegisterInfo() const {
64    return &InstrInfo.getRegisterInfo();
65  }
66  const NVPTXTargetLowering *getTargetLowering() const { return &TLInfo; }
67  const TargetSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; }
68
69  bool hasBrkPt() const { return SmVersion >= 11; }
70  bool hasAtomRedG32() const { return SmVersion >= 11; }
71  bool hasAtomRedS32() const { return SmVersion >= 12; }
72  bool hasAtomRedG64() const { return SmVersion >= 12; }
73  bool hasAtomRedS64() const { return SmVersion >= 20; }
74  bool hasAtomRedGen32() const { return SmVersion >= 20; }
75  bool hasAtomRedGen64() const { return SmVersion >= 20; }
76  bool hasAtomAddF32() const { return SmVersion >= 20; }
77  bool hasVote() const { return SmVersion >= 12; }
78  bool hasDouble() const { return SmVersion >= 13; }
79  bool reqPTX20() const { return SmVersion >= 20; }
80  bool hasF32FTZ() const { return SmVersion >= 20; }
81  bool hasFMAF32() const { return SmVersion >= 20; }
82  bool hasFMAF64() const { return SmVersion >= 13; }
83  bool hasLDG() const { return SmVersion >= 32; }
84  bool hasLDU() const { return ((SmVersion >= 20) && (SmVersion < 30)); }
85  bool hasGenericLdSt() const { return SmVersion >= 20; }
86  inline bool hasHWROT32() const { return SmVersion >= 32; }
87  inline bool hasSWROT32() const {
88    return ((SmVersion >= 20) && (SmVersion < 32));
89  }
90  inline bool hasROT32() const { return hasHWROT32() || hasSWROT32(); }
91  inline bool hasROT64() const { return SmVersion >= 20; }
92
93  bool hasImageHandles() const {
94    // Currently disabled
95    return false;
96  }
97  bool is64Bit() const { return Is64Bit; }
98
99  unsigned int getSmVersion() const { return SmVersion; }
100  NVPTX::DrvInterface getDrvInterface() const { return drvInterface; }
101  std::string getTargetName() const { return TargetName; }
102
103  unsigned getPTXVersion() const { return PTXVersion; }
104
105  NVPTXSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
106  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
107};
108
109} // End llvm namespace
110
111#endif // NVPTXSUBTARGET_H
112