Line data Source code
1 : /* Get CPU type and Features for x86 processors.
2 : Copyright (C) 2012-2026 Free Software Foundation, Inc.
3 : Contributed by Sriraman Tallam (tmsriram@google.com)
4 :
5 : This file is part of GCC.
6 :
7 : GCC is free software; you can redistribute it and/or modify it under
8 : the terms of the GNU General Public License as published by the Free
9 : Software Foundation; either version 3, or (at your option) any later
10 : version.
11 :
12 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : for more details.
16 :
17 : Under Section 7 of GPL version 3, you are granted additional
18 : permissions described in the GCC Runtime Library Exception, version
19 : 3.1, as published by the Free Software Foundation.
20 :
21 : You should have received a copy of the GNU General Public License and
22 : a copy of the GCC Runtime Library Exception along with this program;
23 : see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 : <http://www.gnu.org/licenses/>. */
25 :
26 : /* Processor Vendor and Models. */
27 :
28 : enum processor_vendor
29 : {
30 : VENDOR_INTEL = 1,
31 : VENDOR_AMD,
32 : VENDOR_ZHAOXIN,
33 : VENDOR_HYGON,
34 : VENDOR_OTHER,
35 : VENDOR_CENTAUR,
36 : VENDOR_CYRIX,
37 : VENDOR_NSC,
38 :
39 : /* Maximum values must be at the end of this enum. */
40 : VENDOR_MAX,
41 : BUILTIN_VENDOR_MAX = VENDOR_OTHER
42 : };
43 :
44 : /* Any new types or subtypes have to be inserted at the end. */
45 :
46 : enum processor_types
47 : {
48 : INTEL_BONNELL = 1,
49 : INTEL_CORE2,
50 : INTEL_COREI7,
51 : AMDFAM10H,
52 : AMDFAM15H,
53 : INTEL_SILVERMONT,
54 : AMD_BTVER1 = 8,
55 : AMD_BTVER2,
56 : AMDFAM17H,
57 : INTEL_GOLDMONT = 12,
58 : INTEL_GOLDMONT_PLUS,
59 : INTEL_TREMONT,
60 : AMDFAM19H,
61 : ZHAOXIN_FAM7H,
62 : INTEL_SIERRAFOREST,
63 : INTEL_GRANDRIDGE,
64 : INTEL_CLEARWATERFOREST,
65 : AMDFAM1AH,
66 : HYGONFAM18H,
67 : CPU_TYPE_MAX,
68 : BUILTIN_CPU_TYPE_MAX = CPU_TYPE_MAX
69 : };
70 :
71 : enum 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 : ZHAOXIN_FAM7H_SHIJIDADAO,
110 : INTEL_COREI7_DIAMONDRAPIDS,
111 : INTEL_COREI7_NOVALAKE,
112 : AMDFAM1AH_ZNVER6,
113 : HYGONFAM18H_C86_4G_M4,
114 : HYGONFAM18H_C86_4G_M6,
115 : HYGONFAM18H_C86_4G_M7,
116 : HYGONFAM18H_C86_4G_M8,
117 : CPU_SUBTYPE_MAX
118 : };
119 :
120 : /* Priority of i386 features, greater value is higher priority. This is
121 : used to decide the order in which function dispatch must happen. For
122 : instance, a version specialized for SSE4.2 should be checked for dispatch
123 : before a version for SSE3. */
124 : enum feature_priority
125 : {
126 : P_NONE = 0,
127 : P_MMX,
128 : P_SSE,
129 : P_SSE2,
130 : P_X86_64_BASELINE,
131 : P_SSE3,
132 : P_SSSE3,
133 : P_PROC_SSSE3,
134 : P_SSE4_A,
135 : P_PROC_SSE4_A,
136 : P_SSE4_1,
137 : P_SSE4_2,
138 : P_PROC_SSE4_2,
139 : P_POPCNT,
140 : P_X86_64_V2,
141 : P_AES,
142 : P_PCLMUL,
143 : P_AVX,
144 : P_PROC_AVX,
145 : P_BMI,
146 : P_PROC_BMI,
147 : P_FMA4,
148 : P_XOP,
149 : P_PROC_XOP,
150 : P_FMA,
151 : P_PROC_FMA,
152 : P_BMI2,
153 : P_AVX2,
154 : P_PROC_AVX2,
155 : P_X86_64_V3,
156 : P_AVX512F,
157 : P_PROC_AVX512F,
158 : P_X86_64_V4,
159 : P_AVX10_1 = 34,
160 : P_PROC_AVX10_1,
161 : P_AVX10_2,
162 : P_APX_F,
163 : P_PROC_AVX10_2,
164 : P_PROC_DYNAMIC
165 : };
166 :
167 : /* ISA Features supported. New features have to be inserted at the end. */
168 :
169 : enum processor_features
170 : {
171 : FEATURE_CMOV = 0,
172 : FEATURE_MMX,
173 : FEATURE_POPCNT,
174 : FEATURE_SSE,
175 : FEATURE_SSE2,
176 : FEATURE_SSE3,
177 : FEATURE_SSSE3,
178 : FEATURE_SSE4_1,
179 : FEATURE_SSE4_2,
180 : FEATURE_AVX,
181 : FEATURE_AVX2,
182 : FEATURE_SSE4_A,
183 : FEATURE_FMA4,
184 : FEATURE_XOP,
185 : FEATURE_FMA,
186 : FEATURE_AVX512F,
187 : FEATURE_BMI,
188 : FEATURE_BMI2,
189 : FEATURE_AES,
190 : FEATURE_PCLMUL,
191 : FEATURE_AVX512VL,
192 : FEATURE_AVX512BW,
193 : FEATURE_AVX512DQ,
194 : FEATURE_AVX512CD,
195 : FEATURE_AVX512VBMI = 26,
196 : FEATURE_AVX512IFMA,
197 : FEATURE_AVX512VPOPCNTDQ = 30,
198 : FEATURE_AVX512VBMI2,
199 : FEATURE_GFNI,
200 : FEATURE_VPCLMULQDQ,
201 : FEATURE_AVX512VNNI,
202 : FEATURE_AVX512BITALG,
203 : FEATURE_AVX512BF16,
204 : FEATURE_AVX512VP2INTERSECT,
205 : FEATURE_3DNOW,
206 : FEATURE_3DNOWP,
207 : FEATURE_ADX,
208 : FEATURE_ABM,
209 : FEATURE_CLDEMOTE,
210 : FEATURE_CLFLUSHOPT,
211 : FEATURE_CLWB,
212 : FEATURE_CLZERO,
213 : FEATURE_CMPXCHG16B,
214 : FEATURE_CMPXCHG8B,
215 : FEATURE_ENQCMD,
216 : FEATURE_F16C,
217 : FEATURE_FSGSBASE,
218 : FEATURE_FXSAVE,
219 : FEATURE_HLE,
220 : FEATURE_IBT,
221 : FEATURE_LAHF_LM,
222 : FEATURE_LM,
223 : FEATURE_LWP,
224 : FEATURE_LZCNT,
225 : FEATURE_MOVBE,
226 : FEATURE_MOVDIR64B,
227 : FEATURE_MOVDIRI,
228 : FEATURE_MWAITX,
229 : FEATURE_OSXSAVE,
230 : FEATURE_PCONFIG,
231 : FEATURE_PKU,
232 : FEATURE_PRFCHW = 66,
233 : FEATURE_PTWRITE,
234 : FEATURE_RDPID,
235 : FEATURE_RDRND,
236 : FEATURE_RDSEED,
237 : FEATURE_RTM,
238 : FEATURE_SERIALIZE,
239 : FEATURE_SGX,
240 : FEATURE_SHA,
241 : FEATURE_SHSTK,
242 : FEATURE_TBM,
243 : FEATURE_TSXLDTRK,
244 : FEATURE_VAES,
245 : FEATURE_WAITPKG,
246 : FEATURE_WBNOINVD,
247 : FEATURE_XSAVE,
248 : FEATURE_XSAVEC,
249 : FEATURE_XSAVEOPT,
250 : FEATURE_XSAVES,
251 : FEATURE_AMX_TILE,
252 : FEATURE_AMX_INT8,
253 : FEATURE_AMX_BF16,
254 : FEATURE_UINTR,
255 : FEATURE_HRESET,
256 : FEATURE_KL,
257 : FEATURE_AESKLE,
258 : FEATURE_WIDEKL,
259 : FEATURE_AVXVNNI,
260 : FEATURE_AVX512FP16,
261 : FEATURE_X86_64_BASELINE,
262 : FEATURE_X86_64_V2,
263 : FEATURE_X86_64_V3,
264 : FEATURE_X86_64_V4,
265 : FEATURE_AVXIFMA,
266 : FEATURE_AVXVNNIINT8,
267 : FEATURE_AVXNECONVERT,
268 : FEATURE_CMPCCXADD,
269 : FEATURE_AMX_FP16,
270 : FEATURE_PREFETCHI,
271 : FEATURE_RAOINT,
272 : FEATURE_AMX_COMPLEX,
273 : FEATURE_AVXVNNIINT16,
274 : FEATURE_SM3,
275 : FEATURE_SHA512,
276 : FEATURE_SM4,
277 : FEATURE_APX_F,
278 : FEATURE_USER_MSR,
279 : FEATURE_AVX10_1 = 114,
280 : FEATURE_AVX10_2 = 116,
281 : FEATURE_AMX_AVX512,
282 : FEATURE_AMX_FP8 = 120,
283 : FEATURE_MOVRS,
284 : FEATURE_AMX_MOVRS,
285 : FEATURE_AVX512BMM,
286 : FEATURE_AVX10V2AUX,
287 : CPU_FEATURE_MAX
288 : };
289 :
290 : /* Size of __cpu_features2 array in libgcc/config/i386/cpuinfo.c. */
291 : #define SIZE_OF_CPU_FEATURES ((CPU_FEATURE_MAX - 1) / 32)
292 :
293 : /* These are the values for vendor types, cpu types and subtypes. Cpu
294 : types and subtypes should be subtracted by the corresponding start
295 : value. */
296 :
297 : #define M_CPU_TYPE_START (BUILTIN_VENDOR_MAX)
298 : #define M_CPU_SUBTYPE_START \
299 : (M_CPU_TYPE_START + int (BUILTIN_CPU_TYPE_MAX))
300 : #define M_VENDOR(a) (a)
301 : #define M_CPU_TYPE(a) (M_CPU_TYPE_START + int (a))
302 : #define M_CPU_SUBTYPE(a) (M_CPU_SUBTYPE_START + a)
303 :
304 : #ifdef __cplusplus
305 : /* Extract processor VENDOR, TYPE and SUBTYPE from MODEL. */
306 :
307 : static inline void
308 50460991 : ix86_decode_cpu_info (int model, processor_vendor &vendor,
309 : processor_types &type,
310 : processor_subtypes &subtype)
311 : {
312 50460991 : if (model > M_CPU_SUBTYPE_START)
313 : {
314 321233 : subtype = (processor_subtypes) (model - M_CPU_SUBTYPE_START);
315 321233 : if (subtype <= INTEL_COREI7_SANDYBRIDGE
316 : || (subtype >= INTEL_COREI7_IVYBRIDGE
317 320893 : && subtype <= INTEL_COREI7_ICELAKE_SERVER)
318 : || (subtype >= INTEL_COREI7_CASCADELAKE
319 : && subtype <= INTEL_COREI7_ALDERLAKE)
320 : || subtype == INTEL_COREI7_ROCKETLAKE
321 : || (subtype >= INTEL_COREI7_GRANITERAPIDS
322 : && subtype <= INTEL_COREI7_PANTHERLAKE)
323 : || subtype == INTEL_COREI7_DIAMONDRAPIDS
324 : || subtype == INTEL_COREI7_NOVALAKE)
325 : {
326 315592 : vendor = VENDOR_INTEL;
327 315592 : type = INTEL_COREI7;
328 : }
329 : else if (subtype >= AMDFAM10H_BARCELONA
330 : && subtype <= AMDFAM10H_ISTANBUL)
331 : {
332 3 : vendor = VENDOR_AMD;
333 3 : type = AMDFAM10H;
334 : }
335 : else if (subtype >= AMDFAM15H_BDVER1
336 : && subtype <= AMDFAM15H_BDVER4)
337 : {
338 681 : vendor = VENDOR_AMD;
339 681 : type = AMDFAM15H;
340 : }
341 : else if (subtype == AMDFAM17H_ZNVER1
342 : || subtype == AMDFAM17H_ZNVER2)
343 : {
344 137 : vendor = VENDOR_AMD;
345 137 : type = AMDFAM17H;
346 : }
347 : else if (subtype == AMDFAM19H_ZNVER3
348 : || subtype == AMDFAM19H_ZNVER4)
349 : {
350 4533 : vendor = VENDOR_AMD;
351 4533 : type = AMDFAM19H;
352 : }
353 : else if (subtype == AMDFAM1AH_ZNVER5
354 : || subtype == AMDFAM1AH_ZNVER6)
355 : {
356 108 : vendor = VENDOR_AMD;
357 108 : type = AMDFAM1AH;
358 : }
359 : else if (subtype == ZHAOXIN_FAM7H_LUJIAZUI
360 : || subtype == ZHAOXIN_FAM7H_YONGFENG
361 : || subtype == ZHAOXIN_FAM7H_SHIJIDADAO)
362 : {
363 68 : vendor = VENDOR_ZHAOXIN;
364 68 : type = ZHAOXIN_FAM7H;
365 : }
366 : else if (subtype >= HYGONFAM18H_C86_4G_M4
367 : && subtype <= HYGONFAM18H_C86_4G_M8)
368 : {
369 111 : vendor = VENDOR_HYGON;
370 111 : type = HYGONFAM18H;
371 : }
372 : else
373 : {
374 : /* Set VENDOR to VENDOR_OTHER and TYPE to CPU_TYPE_MAX for
375 : unsupported SUBTYPE. */
376 0 : vendor = VENDOR_OTHER;
377 0 : type = CPU_TYPE_MAX;
378 : }
379 : }
380 50139758 : else if (model > M_CPU_TYPE_START)
381 : {
382 56335 : type = (processor_types) (model - M_CPU_TYPE_START);
383 56335 : if ((type >= INTEL_BONNELL && type <= INTEL_COREI7)
384 : || type == INTEL_SILVERMONT
385 : || (type >= INTEL_GOLDMONT && type <= INTEL_TREMONT)
386 : || (type >= INTEL_SIERRAFOREST
387 : && type <= INTEL_CLEARWATERFOREST))
388 : {
389 56192 : vendor = VENDOR_INTEL;
390 56192 : subtype = CPU_SUBTYPE_MAX;
391 : }
392 : else if (type == AMDFAM10H
393 : || type == AMDFAM15H
394 : || (type >= AMD_BTVER1 && type <= AMDFAM17H)
395 : || type == AMDFAM19H
396 : || type == AMDFAM1AH)
397 : {
398 143 : vendor = VENDOR_AMD;
399 143 : subtype = CPU_SUBTYPE_MAX;
400 : }
401 : else if (type == ZHAOXIN_FAM7H)
402 : {
403 0 : vendor = VENDOR_ZHAOXIN;
404 0 : subtype = CPU_SUBTYPE_MAX;
405 : }
406 : else if (type == HYGONFAM18H)
407 : {
408 0 : vendor = VENDOR_HYGON;
409 0 : subtype = CPU_SUBTYPE_MAX;
410 : }
411 : else
412 : {
413 : /* Set VENDOR to VENDOR_OTHER and SUBTYPE to CPU_SUBTYPE_MAX
414 : for unsupported TYPE. */
415 0 : vendor = VENDOR_OTHER;
416 0 : subtype = CPU_SUBTYPE_MAX;
417 : }
418 : }
419 : else
420 : {
421 50083423 : vendor = (processor_vendor) model;
422 : /* Set TYPE to CPU_TYPE_MAX and SUBTYPE to CPU_SUBTYPE_MAX for
423 : unknown TYPE and SUBTYPE. */
424 50083423 : type = CPU_TYPE_MAX;
425 50083423 : subtype = CPU_SUBTYPE_MAX;
426 : }
427 50460991 : }
428 : #endif
|