OSDN Git Service

Update LLVM for rebase to r212749.
[android-x86/external-llvm.git] / lib / Target / R600 / AMDGPUSubtarget.h
1 //=====-- AMDGPUSubtarget.h - Define Subtarget for the AMDIL ---*- 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 /// \file
11 /// \brief AMDGPU specific subclass of TargetSubtarget.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef AMDGPUSUBTARGET_H
16 #define AMDGPUSUBTARGET_H
17 #include "AMDGPU.h"
18 #include "AMDGPUInstrInfo.h"
19 #include "llvm/ADT/StringExtras.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Target/TargetSubtargetInfo.h"
22
23 #define GET_SUBTARGETINFO_HEADER
24 #include "AMDGPUGenSubtargetInfo.inc"
25
26 #define MAX_CB_SIZE (1 << 16)
27
28 namespace llvm {
29
30 class AMDGPUSubtarget : public AMDGPUGenSubtargetInfo {
31
32   std::unique_ptr<AMDGPUInstrInfo> InstrInfo;
33
34 public:
35   enum Generation {
36     R600 = 0,
37     R700,
38     EVERGREEN,
39     NORTHERN_ISLANDS,
40     SOUTHERN_ISLANDS,
41     SEA_ISLANDS
42   };
43
44 private:
45   std::string DevName;
46   bool Is64bit;
47   bool DumpCode;
48   bool R600ALUInst;
49   bool HasVertexCache;
50   short TexVTXClauseSize;
51   Generation Gen;
52   bool FP64;
53   bool CaymanISA;
54   bool EnableIRStructurizer;
55   bool EnableIfCvt;
56   unsigned WavefrontSize;
57   bool CFALUBug;
58   int LocalMemorySize;
59
60   InstrItineraryData InstrItins;
61
62 public:
63   AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef FS);
64
65   const AMDGPUInstrInfo *getInstrInfo() const {
66     return InstrInfo.get();
67   }
68
69   const InstrItineraryData &getInstrItineraryData() const {
70     return InstrItins;
71   }
72
73   void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
74
75   bool is64bit() const {
76     return Is64bit;
77   }
78
79   bool hasVertexCache() const {
80     return HasVertexCache;
81   }
82
83   short getTexVTXClauseSize() const {
84       return TexVTXClauseSize;
85   }
86
87   Generation getGeneration() const {
88     return Gen;
89   }
90
91   bool hasHWFP64() const {
92     return FP64;
93   }
94
95   bool hasCaymanISA() const {
96     return CaymanISA;
97   }
98
99   bool hasBFE() const {
100     return (getGeneration() >= EVERGREEN);
101   }
102
103   bool hasBFI() const {
104     return (getGeneration() >= EVERGREEN);
105   }
106
107   bool hasBFM() const {
108     return hasBFE();
109   }
110
111   bool hasBCNT(unsigned Size) const {
112     if (Size == 32)
113       return (getGeneration() >= EVERGREEN);
114
115     assert(Size == 64);
116     return (getGeneration() >= SOUTHERN_ISLANDS);
117   }
118
119   bool hasMulU24() const {
120     return (getGeneration() >= EVERGREEN);
121   }
122
123   bool hasMulI24() const {
124     return (getGeneration() >= SOUTHERN_ISLANDS ||
125             hasCaymanISA());
126   }
127
128   bool IsIRStructurizerEnabled() const {
129     return EnableIRStructurizer;
130   }
131
132   bool isIfCvtEnabled() const {
133     return EnableIfCvt;
134   }
135
136   unsigned getWavefrontSize() const {
137     return WavefrontSize;
138   }
139
140   unsigned getStackEntrySize() const;
141
142   bool hasCFAluBug() const {
143     assert(getGeneration() <= NORTHERN_ISLANDS);
144     return CFALUBug;
145   }
146
147   int getLocalMemorySize() const {
148     return LocalMemorySize;
149   }
150
151   bool enableMachineScheduler() const override {
152     return getGeneration() <= NORTHERN_ISLANDS;
153   }
154
155   // Helper functions to simplify if statements
156   bool isTargetELF() const {
157     return false;
158   }
159
160   StringRef getDeviceName() const {
161     return DevName;
162   }
163
164   bool dumpCode() const {
165     return DumpCode;
166   }
167   bool r600ALUEncoding() const {
168     return R600ALUInst;
169   }
170 };
171
172 } // End namespace llvm
173
174 #endif // AMDGPUSUBTARGET_H