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