Rename XXXGenSubtarget.inc to XXXGenSubtargetInfo.inc for consistency.
[oota-llvm.git] / lib / Target / PTX / PTXSubtarget.h
1 //====-- PTXSubtarget.h - Define Subtarget for the PTX ---------*- 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 PTX specific subclass of TargetSubtargetInfo.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef PTX_SUBTARGET_H
15 #define PTX_SUBTARGET_H
16
17 #include "llvm/Target/TargetSubtargetInfo.h"
18
19 #define GET_SUBTARGETINFO_HEADER
20 #include "PTXGenSubtargetInfo.inc"
21
22 namespace llvm {
23   class PTXSubtarget : public PTXGenSubtargetInfo {
24     public:
25
26       /**
27        * Enumeration of Shader Models supported by the back-end.
28        */
29       enum PTXTargetEnum {
30         PTX_COMPUTE_1_0, /*< Compute Compatibility 1.0 */
31         PTX_COMPUTE_1_1, /*< Compute Compatibility 1.1 */
32         PTX_COMPUTE_1_2, /*< Compute Compatibility 1.2 */
33         PTX_COMPUTE_1_3, /*< Compute Compatibility 1.3 */
34         PTX_COMPUTE_2_0, /*< Compute Compatibility 2.0 */
35         PTX_LAST_COMPUTE,
36
37         PTX_SM_1_0, /*< Shader Model 1.0 */
38         PTX_SM_1_1, /*< Shader Model 1.1 */
39         PTX_SM_1_2, /*< Shader Model 1.2 */
40         PTX_SM_1_3, /*< Shader Model 1.3 */
41         PTX_SM_2_0, /*< Shader Model 2.0 */
42         PTX_SM_2_1, /*< Shader Model 2.1 */
43         PTX_SM_2_2, /*< Shader Model 2.2 */
44         PTX_SM_2_3, /*< Shader Model 2.3 */
45         PTX_LAST_SM
46       };
47
48       /**
49        * Enumeration of PTX versions supported by the back-end.
50        *
51        * Currently, PTX 2.0 is the minimum supported version.
52        */
53       enum PTXVersionEnum {
54         PTX_VERSION_2_0,  /*< PTX Version 2.0 */
55         PTX_VERSION_2_1,  /*< PTX Version 2.1 */
56         PTX_VERSION_2_2,  /*< PTX Version 2.2 */
57         PTX_VERSION_2_3   /*< PTX Version 2.3 */
58       };
59
60   private:
61
62       /// Shader Model supported on the target GPU.
63       PTXTargetEnum PTXTarget;
64
65       /// PTX Language Version.
66       PTXVersionEnum PTXVersion;
67
68       // The native .f64 type is supported on the hardware.
69       bool SupportsDouble;
70
71       // Support the fused-multiply add (FMA) and multiply-add (MAD)
72       // instructions
73       bool SupportsFMA;
74
75       // Use .u64 instead of .u32 for addresses.
76       bool Is64Bit;
77
78     public:
79
80       PTXSubtarget(const std::string &TT, const std::string &CPU,
81                    const std::string &FS, bool is64Bit);
82
83       // Target architecture accessors
84       std::string getTargetString() const;
85
86       std::string getPTXVersionString() const;
87
88       bool supportsDouble() const { return SupportsDouble; }
89
90       bool is64Bit() const { return Is64Bit; }
91
92       bool supportsFMA() const { return SupportsFMA; }
93
94       bool supportsPTX21() const { return PTXVersion >= PTX_VERSION_2_1; }
95
96       bool supportsPTX22() const { return PTXVersion >= PTX_VERSION_2_2; }
97
98       bool supportsPTX23() const { return PTXVersion >= PTX_VERSION_2_3; }
99
100       bool fdivNeedsRoundingMode() const {
101         return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) ||
102                (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE);
103       }
104
105       bool fmadNeedsRoundingMode() const {
106         return (PTXTarget >= PTX_SM_1_3 && PTXTarget < PTX_LAST_SM) ||
107                (PTXTarget >= PTX_COMPUTE_1_3 && PTXTarget < PTX_LAST_COMPUTE);
108       }
109
110       bool useParamSpaceForDeviceArgs() const {
111         return (PTXTarget >= PTX_SM_2_0 && PTXTarget < PTX_LAST_SM) ||
112                (PTXTarget >= PTX_COMPUTE_2_0 && PTXTarget < PTX_LAST_COMPUTE);
113       }
114
115       void ParseSubtargetFeatures(const std::string &FS,
116                                   const std::string &CPU);
117   }; // class PTXSubtarget
118 } // namespace llvm
119
120 #endif // PTX_SUBTARGET_H