• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a target parser to recognise hardware features such as
10 // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_SUPPORT_TARGETPARSER_H
15 #define LLVM_SUPPORT_TARGETPARSER_H
16 
17 // FIXME: vector is used because that's what clang uses for subtarget feature
18 // lists, but SmallVector would probably be better
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Support/ARMTargetParser.h"
21 #include "llvm/Support/AArch64TargetParser.h"
22 #include <vector>
23 
24 namespace llvm {
25 class StringRef;
26 
27 // Target specific information in their own namespaces.
28 // (ARM/AArch64 are declared in ARM/AArch64TargetParser.h)
29 // These should be generated from TableGen because the information is already
30 // there, and there is where new information about targets will be added.
31 // FIXME: To TableGen this we need to make some table generated files available
32 // even if the back-end is not compiled with LLVM, plus we need to create a new
33 // back-end to TableGen to create these clean tables.
34 namespace X86 {
35 
36 // This should be kept in sync with libcc/compiler-rt as its included by clang
37 // as a proxy for what's in libgcc/compiler-rt.
38 enum ProcessorVendors : unsigned {
39   VENDOR_DUMMY,
40 #define X86_VENDOR(ENUM, STRING) \
41   ENUM,
42 #include "llvm/Support/X86TargetParser.def"
43   VENDOR_OTHER
44 };
45 
46 // This should be kept in sync with libcc/compiler-rt as its included by clang
47 // as a proxy for what's in libgcc/compiler-rt.
48 enum ProcessorTypes : unsigned {
49   CPU_TYPE_DUMMY,
50 #define X86_CPU_TYPE(ARCHNAME, ENUM) \
51   ENUM,
52 #include "llvm/Support/X86TargetParser.def"
53   CPU_TYPE_MAX
54 };
55 
56 // This should be kept in sync with libcc/compiler-rt as its included by clang
57 // as a proxy for what's in libgcc/compiler-rt.
58 enum ProcessorSubtypes : unsigned {
59   CPU_SUBTYPE_DUMMY,
60 #define X86_CPU_SUBTYPE(ARCHNAME, ENUM) \
61   ENUM,
62 #include "llvm/Support/X86TargetParser.def"
63   CPU_SUBTYPE_MAX
64 };
65 
66 // This should be kept in sync with libcc/compiler-rt as it should be used
67 // by clang as a proxy for what's in libgcc/compiler-rt.
68 enum ProcessorFeatures {
69 #define X86_FEATURE(VAL, ENUM) \
70   ENUM = VAL,
71 #include "llvm/Support/X86TargetParser.def"
72 
73 };
74 
75 } // namespace X86
76 
77 namespace AMDGPU {
78 
79 /// GPU kinds supported by the AMDGPU target.
80 enum GPUKind : uint32_t {
81   // Not specified processor.
82   GK_NONE = 0,
83 
84   // R600-based processors.
85   GK_R600 = 1,
86   GK_R630 = 2,
87   GK_RS880 = 3,
88   GK_RV670 = 4,
89   GK_RV710 = 5,
90   GK_RV730 = 6,
91   GK_RV770 = 7,
92   GK_CEDAR = 8,
93   GK_CYPRESS = 9,
94   GK_JUNIPER = 10,
95   GK_REDWOOD = 11,
96   GK_SUMO = 12,
97   GK_BARTS = 13,
98   GK_CAICOS = 14,
99   GK_CAYMAN = 15,
100   GK_TURKS = 16,
101 
102   GK_R600_FIRST = GK_R600,
103   GK_R600_LAST = GK_TURKS,
104 
105   // AMDGCN-based processors.
106   GK_GFX600 = 32,
107   GK_GFX601 = 33,
108 
109   GK_GFX700 = 40,
110   GK_GFX701 = 41,
111   GK_GFX702 = 42,
112   GK_GFX703 = 43,
113   GK_GFX704 = 44,
114 
115   GK_GFX801 = 50,
116   GK_GFX802 = 51,
117   GK_GFX803 = 52,
118   GK_GFX810 = 53,
119 
120   GK_GFX900 = 60,
121   GK_GFX902 = 61,
122   GK_GFX904 = 62,
123   GK_GFX906 = 63,
124   GK_GFX908 = 64,
125   GK_GFX909 = 65,
126 
127   GK_GFX1010 = 71,
128   GK_GFX1011 = 72,
129   GK_GFX1012 = 73,
130 
131   GK_AMDGCN_FIRST = GK_GFX600,
132   GK_AMDGCN_LAST = GK_GFX1012,
133 };
134 
135 /// Instruction set architecture version.
136 struct IsaVersion {
137   unsigned Major;
138   unsigned Minor;
139   unsigned Stepping;
140 };
141 
142 // This isn't comprehensive for now, just things that are needed from the
143 // frontend driver.
144 enum ArchFeatureKind : uint32_t {
145   FEATURE_NONE = 0,
146 
147   // These features only exist for r600, and are implied true for amdgcn.
148   FEATURE_FMA = 1 << 1,
149   FEATURE_LDEXP = 1 << 2,
150   FEATURE_FP64 = 1 << 3,
151 
152   // Common features.
153   FEATURE_FAST_FMA_F32 = 1 << 4,
154   FEATURE_FAST_DENORMAL_F32 = 1 << 5
155 };
156 
157 StringRef getArchNameAMDGCN(GPUKind AK);
158 StringRef getArchNameR600(GPUKind AK);
159 StringRef getCanonicalArchName(StringRef Arch);
160 GPUKind parseArchAMDGCN(StringRef CPU);
161 GPUKind parseArchR600(StringRef CPU);
162 unsigned getArchAttrAMDGCN(GPUKind AK);
163 unsigned getArchAttrR600(GPUKind AK);
164 
165 void fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values);
166 void fillValidArchListR600(SmallVectorImpl<StringRef> &Values);
167 
168 IsaVersion getIsaVersion(StringRef GPU);
169 
170 } // namespace AMDGPU
171 
172 } // namespace llvm
173 
174 #endif
175