1/* Get CPU type and Features for x86 processors.
2 Copyright (C) 2012-2024 Free Software Foundation, Inc.
3 Contributed by Sriraman Tallam (tmsriram@google.com)
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
25
26/* Processor Vendor and Models. */
27
28enum processor_vendor
29{
30 VENDOR_INTEL = 1,
31 VENDOR_AMD,
32 VENDOR_ZHAOXIN,
33 VENDOR_OTHER,
34 VENDOR_CENTAUR,
35 VENDOR_CYRIX,
36 VENDOR_NSC,
37
38 /* Maximum values must be at the end of this enum. */
39 VENDOR_MAX,
40 BUILTIN_VENDOR_MAX = VENDOR_OTHER
41};
42
43/* Any new types or subtypes have to be inserted at the end. */
44
45enum processor_types
46{
47 INTEL_BONNELL = 1,
48 INTEL_CORE2,
49 INTEL_COREI7,
50 AMDFAM10H,
51 AMDFAM15H,
52 INTEL_SILVERMONT,
53 INTEL_KNL,
54 AMD_BTVER1,
55 AMD_BTVER2,
56 AMDFAM17H,
57 INTEL_KNM,
58 INTEL_GOLDMONT,
59 INTEL_GOLDMONT_PLUS,
60 INTEL_TREMONT,
61 AMDFAM19H,
62 ZHAOXIN_FAM7H,
63 INTEL_SIERRAFOREST,
64 INTEL_GRANDRIDGE,
65 INTEL_CLEARWATERFOREST,
66 AMDFAM1AH,
67 CPU_TYPE_MAX,
68 BUILTIN_CPU_TYPE_MAX = CPU_TYPE_MAX
69};
70
71enum processor_subtypes
72{
73 INTEL_COREI7_NEHALEM = 1,
74 INTEL_COREI7_WESTMERE,
75 INTEL_COREI7_SANDYBRIDGE,
76 AMDFAM10H_BARCELONA,
77 AMDFAM10H_SHANGHAI,
78 AMDFAM10H_ISTANBUL,
79 AMDFAM15H_BDVER1,
80 AMDFAM15H_BDVER2,
81 AMDFAM15H_BDVER3,
82 AMDFAM15H_BDVER4,
83 AMDFAM17H_ZNVER1,
84 INTEL_COREI7_IVYBRIDGE,
85 INTEL_COREI7_HASWELL,
86 INTEL_COREI7_BROADWELL,
87 INTEL_COREI7_SKYLAKE,
88 INTEL_COREI7_SKYLAKE_AVX512,
89 INTEL_COREI7_CANNONLAKE,
90 INTEL_COREI7_ICELAKE_CLIENT,
91 INTEL_COREI7_ICELAKE_SERVER,
92 AMDFAM17H_ZNVER2,
93 INTEL_COREI7_CASCADELAKE,
94 INTEL_COREI7_TIGERLAKE,
95 INTEL_COREI7_COOPERLAKE,
96 INTEL_COREI7_SAPPHIRERAPIDS,
97 INTEL_COREI7_ALDERLAKE,
98 AMDFAM19H_ZNVER3,
99 INTEL_COREI7_ROCKETLAKE,
100 ZHAOXIN_FAM7H_LUJIAZUI,
101 AMDFAM19H_ZNVER4,
102 INTEL_COREI7_GRANITERAPIDS,
103 INTEL_COREI7_GRANITERAPIDS_D,
104 INTEL_COREI7_ARROWLAKE,
105 INTEL_COREI7_ARROWLAKE_S,
106 INTEL_COREI7_PANTHERLAKE,
107 ZHAOXIN_FAM7H_YONGFENG,
108 AMDFAM1AH_ZNVER5,
109 CPU_SUBTYPE_MAX
110};
111
112/* Priority of i386 features, greater value is higher priority. This is
113 used to decide the order in which function dispatch must happen. For
114 instance, a version specialized for SSE4.2 should be checked for dispatch
115 before a version for SSE3, as SSE4.2 implies SSE3. */
116enum feature_priority
117{
118 P_NONE = 0,
119 P_MMX,
120 P_SSE,
121 P_SSE2,
122 P_X86_64_BASELINE,
123 P_SSE3,
124 P_SSSE3,
125 P_PROC_SSSE3,
126 P_SSE4_A,
127 P_PROC_SSE4_A,
128 P_SSE4_1,
129 P_SSE4_2,
130 P_PROC_SSE4_2,
131 P_POPCNT,
132 P_X86_64_V2,
133 P_AES,
134 P_PCLMUL,
135 P_AVX,
136 P_PROC_AVX,
137 P_BMI,
138 P_PROC_BMI,
139 P_FMA4,
140 P_XOP,
141 P_PROC_XOP,
142 P_FMA,
143 P_PROC_FMA,
144 P_BMI2,
145 P_AVX2,
146 P_PROC_AVX2,
147 P_X86_64_V3,
148 P_AVX512F,
149 P_PROC_AVX512F,
150 P_X86_64_V4,
151 P_PROC_DYNAMIC
152};
153
154/* ISA Features supported. New features have to be inserted at the end. */
155
156enum processor_features
157{
158 FEATURE_CMOV = 0,
159 FEATURE_MMX,
160 FEATURE_POPCNT,
161 FEATURE_SSE,
162 FEATURE_SSE2,
163 FEATURE_SSE3,
164 FEATURE_SSSE3,
165 FEATURE_SSE4_1,
166 FEATURE_SSE4_2,
167 FEATURE_AVX,
168 FEATURE_AVX2,
169 FEATURE_SSE4_A,
170 FEATURE_FMA4,
171 FEATURE_XOP,
172 FEATURE_FMA,
173 FEATURE_AVX512F,
174 FEATURE_BMI,
175 FEATURE_BMI2,
176 FEATURE_AES,
177 FEATURE_PCLMUL,
178 FEATURE_AVX512VL,
179 FEATURE_AVX512BW,
180 FEATURE_AVX512DQ,
181 FEATURE_AVX512CD,
182 FEATURE_AVX512ER,
183 FEATURE_AVX512PF,
184 FEATURE_AVX512VBMI,
185 FEATURE_AVX512IFMA,
186 FEATURE_AVX5124VNNIW,
187 FEATURE_AVX5124FMAPS,
188 FEATURE_AVX512VPOPCNTDQ,
189 FEATURE_AVX512VBMI2,
190 FEATURE_GFNI,
191 FEATURE_VPCLMULQDQ,
192 FEATURE_AVX512VNNI,
193 FEATURE_AVX512BITALG,
194 FEATURE_AVX512BF16,
195 FEATURE_AVX512VP2INTERSECT,
196 FEATURE_3DNOW,
197 FEATURE_3DNOWP,
198 FEATURE_ADX,
199 FEATURE_ABM,
200 FEATURE_CLDEMOTE,
201 FEATURE_CLFLUSHOPT,
202 FEATURE_CLWB,
203 FEATURE_CLZERO,
204 FEATURE_CMPXCHG16B,
205 FEATURE_CMPXCHG8B,
206 FEATURE_ENQCMD,
207 FEATURE_F16C,
208 FEATURE_FSGSBASE,
209 FEATURE_FXSAVE,
210 FEATURE_HLE,
211 FEATURE_IBT,
212 FEATURE_LAHF_LM,
213 FEATURE_LM,
214 FEATURE_LWP,
215 FEATURE_LZCNT,
216 FEATURE_MOVBE,
217 FEATURE_MOVDIR64B,
218 FEATURE_MOVDIRI,
219 FEATURE_MWAITX,
220 FEATURE_OSXSAVE,
221 FEATURE_PCONFIG,
222 FEATURE_PKU,
223 FEATURE_PREFETCHWT1,
224 FEATURE_PRFCHW,
225 FEATURE_PTWRITE,
226 FEATURE_RDPID,
227 FEATURE_RDRND,
228 FEATURE_RDSEED,
229 FEATURE_RTM,
230 FEATURE_SERIALIZE,
231 FEATURE_SGX,
232 FEATURE_SHA,
233 FEATURE_SHSTK,
234 FEATURE_TBM,
235 FEATURE_TSXLDTRK,
236 FEATURE_VAES,
237 FEATURE_WAITPKG,
238 FEATURE_WBNOINVD,
239 FEATURE_XSAVE,
240 FEATURE_XSAVEC,
241 FEATURE_XSAVEOPT,
242 FEATURE_XSAVES,
243 FEATURE_AMX_TILE,
244 FEATURE_AMX_INT8,
245 FEATURE_AMX_BF16,
246 FEATURE_UINTR,
247 FEATURE_HRESET,
248 FEATURE_KL,
249 FEATURE_AESKLE,
250 FEATURE_WIDEKL,
251 FEATURE_AVXVNNI,
252 FEATURE_AVX512FP16,
253 FEATURE_X86_64_BASELINE,
254 FEATURE_X86_64_V2,
255 FEATURE_X86_64_V3,
256 FEATURE_X86_64_V4,
257 FEATURE_AVXIFMA,
258 FEATURE_AVXVNNIINT8,
259 FEATURE_AVXNECONVERT,
260 FEATURE_CMPCCXADD,
261 FEATURE_AMX_FP16,
262 FEATURE_PREFETCHI,
263 FEATURE_RAOINT,
264 FEATURE_AMX_COMPLEX,
265 FEATURE_AVXVNNIINT16,
266 FEATURE_SM3,
267 FEATURE_SHA512,
268 FEATURE_SM4,
269 FEATURE_APX_F,
270 FEATURE_USER_MSR,
271 FEATURE_AVX10_1_256,
272 FEATURE_AVX10_1_512,
273 CPU_FEATURE_MAX
274};
275
276/* Size of __cpu_features2 array in libgcc/config/i386/cpuinfo.c. */
277#define SIZE_OF_CPU_FEATURES ((CPU_FEATURE_MAX - 1) / 32)
278
279/* These are the values for vendor types, cpu types and subtypes. Cpu
280 types and subtypes should be subtracted by the corresponding start
281 value. */
282
283#define M_CPU_TYPE_START (BUILTIN_VENDOR_MAX)
284#define M_CPU_SUBTYPE_START \
285 (M_CPU_TYPE_START + BUILTIN_CPU_TYPE_MAX)
286#define M_VENDOR(a) (a)
287#define M_CPU_TYPE(a) (M_CPU_TYPE_START + a)
288#define M_CPU_SUBTYPE(a) (M_CPU_SUBTYPE_START + a)
289

source code of gcc/common/config/i386/i386-cpuinfo.h