]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/Support/TargetParser.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / Support / TargetParser.h
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/X86 are declared in ARM/AArch64/X86TargetParser.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 AMDGPU {
35
36 /// GPU kinds supported by the AMDGPU target.
37 enum GPUKind : uint32_t {
38   // Not specified processor.
39   GK_NONE = 0,
40
41   // R600-based processors.
42   GK_R600 = 1,
43   GK_R630 = 2,
44   GK_RS880 = 3,
45   GK_RV670 = 4,
46   GK_RV710 = 5,
47   GK_RV730 = 6,
48   GK_RV770 = 7,
49   GK_CEDAR = 8,
50   GK_CYPRESS = 9,
51   GK_JUNIPER = 10,
52   GK_REDWOOD = 11,
53   GK_SUMO = 12,
54   GK_BARTS = 13,
55   GK_CAICOS = 14,
56   GK_CAYMAN = 15,
57   GK_TURKS = 16,
58
59   GK_R600_FIRST = GK_R600,
60   GK_R600_LAST = GK_TURKS,
61
62   // AMDGCN-based processors.
63   GK_GFX600 = 32,
64   GK_GFX601 = 33,
65
66   GK_GFX700 = 40,
67   GK_GFX701 = 41,
68   GK_GFX702 = 42,
69   GK_GFX703 = 43,
70   GK_GFX704 = 44,
71
72   GK_GFX801 = 50,
73   GK_GFX802 = 51,
74   GK_GFX803 = 52,
75   GK_GFX810 = 53,
76
77   GK_GFX900 = 60,
78   GK_GFX902 = 61,
79   GK_GFX904 = 62,
80   GK_GFX906 = 63,
81   GK_GFX908 = 64,
82   GK_GFX909 = 65,
83
84   GK_GFX1010 = 71,
85   GK_GFX1011 = 72,
86   GK_GFX1012 = 73,
87   GK_GFX1030 = 75,
88
89   GK_AMDGCN_FIRST = GK_GFX600,
90   GK_AMDGCN_LAST = GK_GFX1030,
91 };
92
93 /// Instruction set architecture version.
94 struct IsaVersion {
95   unsigned Major;
96   unsigned Minor;
97   unsigned Stepping;
98 };
99
100 // This isn't comprehensive for now, just things that are needed from the
101 // frontend driver.
102 enum ArchFeatureKind : uint32_t {
103   FEATURE_NONE = 0,
104
105   // These features only exist for r600, and are implied true for amdgcn.
106   FEATURE_FMA = 1 << 1,
107   FEATURE_LDEXP = 1 << 2,
108   FEATURE_FP64 = 1 << 3,
109
110   // Common features.
111   FEATURE_FAST_FMA_F32 = 1 << 4,
112   FEATURE_FAST_DENORMAL_F32 = 1 << 5,
113
114   // Wavefront 32 is available.
115   FEATURE_WAVE32 = 1 << 6
116 };
117
118 StringRef getArchNameAMDGCN(GPUKind AK);
119 StringRef getArchNameR600(GPUKind AK);
120 StringRef getCanonicalArchName(StringRef Arch);
121 GPUKind parseArchAMDGCN(StringRef CPU);
122 GPUKind parseArchR600(StringRef CPU);
123 unsigned getArchAttrAMDGCN(GPUKind AK);
124 unsigned getArchAttrR600(GPUKind AK);
125
126 void fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values);
127 void fillValidArchListR600(SmallVectorImpl<StringRef> &Values);
128
129 IsaVersion getIsaVersion(StringRef GPU);
130
131 } // namespace AMDGPU
132
133 namespace RISCV {
134
135 enum CPUKind : unsigned {
136 #define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH) CK_##ENUM,
137 #include "RISCVTargetParser.def"
138 };
139
140 enum FeatureKind : unsigned {
141   FK_INVALID = 0,
142   FK_NONE = 1,
143   FK_STDEXTM = 1 << 2,
144   FK_STDEXTA = 1 << 3,
145   FK_STDEXTF = 1 << 4,
146   FK_STDEXTD = 1 << 5,
147   FK_STDEXTC = 1 << 6,
148   FK_64BIT = 1 << 7,
149 };
150
151 bool checkCPUKind(CPUKind Kind, bool IsRV64);
152 CPUKind parseCPUKind(StringRef CPU);
153 StringRef getMArchFromMcpu(StringRef CPU);
154 void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
155 bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features);
156
157 } // namespace RISCV
158
159 } // namespace llvm
160
161 #endif