]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/i386/driver-i386.c
add hash_map class
[thirdparty/gcc.git] / gcc / config / i386 / driver-i386.c
CommitLineData
fa959ce4 1/* Subroutines for the gcc driver.
23a5b65a 2 Copyright (C) 2006-2014 Free Software Foundation, Inc.
fa959ce4
MM
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
2f83c7d6 8the Free Software Foundation; either version 3, or (at your option)
fa959ce4
MM
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
2f83c7d6
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
fa959ce4
MM
19
20#include "config.h"
21#include "system.h"
edccdcb1
L
22#include "coretypes.h"
23#include "tm.h"
fa959ce4 24
895016f6
UB
25const char *host_detect_local_cpu (int argc, const char **argv);
26
a6ecb05c 27#ifdef __GNUC__
b3172cab 28#include "cpuid.h"
fa959ce4 29
cb0dee88
UB
30struct cache_desc
31{
32 unsigned sizekb;
33 unsigned assoc;
34 unsigned line;
35};
36
37/* Returns command line parameters that describe size and
38 cache line size of the processor caches. */
2711355f
ZD
39
40static char *
cb0dee88 41describe_cache (struct cache_desc level1, struct cache_desc level2)
2711355f 42{
f4a1dd0d 43 char size[100], line[100], size2[100];
2711355f 44
cb0dee88
UB
45 /* At the moment, gcc does not use the information
46 about the associativity of the cache. */
47
f3afc8a7
UB
48 snprintf (size, sizeof (size),
49 "--param l1-cache-size=%u ", level1.sizekb);
50 snprintf (line, sizeof (line),
51 "--param l1-cache-line-size=%u ", level1.line);
2711355f 52
f3afc8a7
UB
53 snprintf (size2, sizeof (size2),
54 "--param l2-cache-size=%u ", level2.sizekb);
2711355f 55
f3afc8a7 56 return concat (size, line, size2, NULL);
f4a1dd0d
ZM
57}
58
cb0dee88
UB
59/* Detect L2 cache parameters using CPUID extended function 0x80000006. */
60
f4a1dd0d 61static void
cb0dee88 62detect_l2_cache (struct cache_desc *level2)
f4a1dd0d 63{
cb0dee88
UB
64 unsigned eax, ebx, ecx, edx;
65 unsigned assoc;
f4a1dd0d
ZM
66
67 __cpuid (0x80000006, eax, ebx, ecx, edx);
68
cb0dee88
UB
69 level2->sizekb = (ecx >> 16) & 0xffff;
70 level2->line = ecx & 0xff;
71
f4a1dd0d
ZM
72 assoc = (ecx >> 12) & 0xf;
73 if (assoc == 6)
74 assoc = 8;
75 else if (assoc == 8)
76 assoc = 16;
77 else if (assoc >= 0xa && assoc <= 0xc)
78 assoc = 32 + (assoc - 0xa) * 16;
79 else if (assoc >= 0xd && assoc <= 0xe)
80 assoc = 96 + (assoc - 0xd) * 32;
cb0dee88
UB
81
82 level2->assoc = assoc;
2711355f
ZD
83}
84
85/* Returns the description of caches for an AMD processor. */
86
d3bfe4de 87static const char *
2711355f
ZD
88detect_caches_amd (unsigned max_ext_level)
89{
90 unsigned eax, ebx, ecx, edx;
cb0dee88
UB
91
92 struct cache_desc level1, level2 = {0, 0, 0};
2711355f
ZD
93
94 if (max_ext_level < 0x80000005)
d3bfe4de 95 return "";
2711355f 96
b3172cab 97 __cpuid (0x80000005, eax, ebx, ecx, edx);
2711355f 98
cb0dee88
UB
99 level1.sizekb = (ecx >> 24) & 0xff;
100 level1.assoc = (ecx >> 16) & 0xff;
101 level1.line = ecx & 0xff;
2711355f 102
f4a1dd0d 103 if (max_ext_level >= 0x80000006)
cb0dee88 104 detect_l2_cache (&level2);
f4a1dd0d 105
cb0dee88 106 return describe_cache (level1, level2);
2711355f
ZD
107}
108
cb0dee88
UB
109/* Decodes the size, the associativity and the cache line size of
110 L1/L2 caches of an Intel processor. Values are based on
111 "Intel Processor Identification and the CPUID Instruction"
112 [Application Note 485], revision -032, December 2007. */
2711355f
ZD
113
114static void
cb0dee88
UB
115decode_caches_intel (unsigned reg, bool xeon_mp,
116 struct cache_desc *level1, struct cache_desc *level2)
2711355f 117{
cb0dee88
UB
118 int i;
119
120 for (i = 24; i >= 0; i -= 8)
121 switch ((reg >> i) & 0xff)
122 {
123 case 0x0a:
124 level1->sizekb = 8; level1->assoc = 2; level1->line = 32;
125 break;
126 case 0x0c:
127 level1->sizekb = 16; level1->assoc = 4; level1->line = 32;
128 break;
f313cce5
UB
129 case 0x0d:
130 level1->sizekb = 16; level1->assoc = 4; level1->line = 64;
131 break;
132 case 0x0e:
133 level1->sizekb = 24; level1->assoc = 6; level1->line = 64;
134 break;
135 case 0x21:
136 level2->sizekb = 256; level2->assoc = 8; level2->line = 64;
137 break;
138 case 0x24:
139 level2->sizekb = 1024; level2->assoc = 16; level2->line = 64;
140 break;
cb0dee88
UB
141 case 0x2c:
142 level1->sizekb = 32; level1->assoc = 8; level1->line = 64;
143 break;
144 case 0x39:
145 level2->sizekb = 128; level2->assoc = 4; level2->line = 64;
146 break;
147 case 0x3a:
148 level2->sizekb = 192; level2->assoc = 6; level2->line = 64;
149 break;
150 case 0x3b:
151 level2->sizekb = 128; level2->assoc = 2; level2->line = 64;
152 break;
153 case 0x3c:
154 level2->sizekb = 256; level2->assoc = 4; level2->line = 64;
155 break;
156 case 0x3d:
157 level2->sizekb = 384; level2->assoc = 6; level2->line = 64;
158 break;
159 case 0x3e:
160 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
161 break;
162 case 0x41:
163 level2->sizekb = 128; level2->assoc = 4; level2->line = 32;
164 break;
165 case 0x42:
166 level2->sizekb = 256; level2->assoc = 4; level2->line = 32;
167 break;
168 case 0x43:
169 level2->sizekb = 512; level2->assoc = 4; level2->line = 32;
170 break;
171 case 0x44:
172 level2->sizekb = 1024; level2->assoc = 4; level2->line = 32;
173 break;
174 case 0x45:
175 level2->sizekb = 2048; level2->assoc = 4; level2->line = 32;
176 break;
f313cce5
UB
177 case 0x48:
178 level2->sizekb = 3072; level2->assoc = 12; level2->line = 64;
179 break;
cb0dee88
UB
180 case 0x49:
181 if (xeon_mp)
182 break;
183 level2->sizekb = 4096; level2->assoc = 16; level2->line = 64;
184 break;
185 case 0x4e:
186 level2->sizekb = 6144; level2->assoc = 24; level2->line = 64;
187 break;
188 case 0x60:
189 level1->sizekb = 16; level1->assoc = 8; level1->line = 64;
190 break;
191 case 0x66:
192 level1->sizekb = 8; level1->assoc = 4; level1->line = 64;
193 break;
194 case 0x67:
195 level1->sizekb = 16; level1->assoc = 4; level1->line = 64;
196 break;
197 case 0x68:
198 level1->sizekb = 32; level1->assoc = 4; level1->line = 64;
199 break;
200 case 0x78:
201 level2->sizekb = 1024; level2->assoc = 4; level2->line = 64;
202 break;
203 case 0x79:
204 level2->sizekb = 128; level2->assoc = 8; level2->line = 64;
205 break;
206 case 0x7a:
207 level2->sizekb = 256; level2->assoc = 8; level2->line = 64;
208 break;
209 case 0x7b:
210 level2->sizekb = 512; level2->assoc = 8; level2->line = 64;
211 break;
212 case 0x7c:
213 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
214 break;
215 case 0x7d:
216 level2->sizekb = 2048; level2->assoc = 8; level2->line = 64;
217 break;
218 case 0x7f:
219 level2->sizekb = 512; level2->assoc = 2; level2->line = 64;
220 break;
f313cce5
UB
221 case 0x80:
222 level2->sizekb = 512; level2->assoc = 8; level2->line = 64;
223 break;
cb0dee88
UB
224 case 0x82:
225 level2->sizekb = 256; level2->assoc = 8; level2->line = 32;
226 break;
227 case 0x83:
228 level2->sizekb = 512; level2->assoc = 8; level2->line = 32;
229 break;
230 case 0x84:
231 level2->sizekb = 1024; level2->assoc = 8; level2->line = 32;
232 break;
233 case 0x85:
234 level2->sizekb = 2048; level2->assoc = 8; level2->line = 32;
235 break;
236 case 0x86:
237 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
238 break;
239 case 0x87:
240 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
241
242 default:
243 break;
244 }
245}
2711355f 246
cb0dee88 247/* Detect cache parameters using CPUID function 2. */
2711355f 248
cb0dee88
UB
249static void
250detect_caches_cpuid2 (bool xeon_mp,
251 struct cache_desc *level1, struct cache_desc *level2)
252{
dc8bd8d9
UB
253 unsigned regs[4];
254 int nreps, i;
cb0dee88 255
dc8bd8d9 256 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
cb0dee88 257
dc8bd8d9
UB
258 nreps = regs[0] & 0x0f;
259 regs[0] &= ~0x0f;
cb0dee88
UB
260
261 while (--nreps >= 0)
2711355f 262 {
dc8bd8d9
UB
263 for (i = 0; i < 4; i++)
264 if (regs[i] && !((regs[i] >> 31) & 1))
265 decode_caches_intel (regs[i], xeon_mp, level1, level2);
cb0dee88
UB
266
267 if (nreps)
dc8bd8d9 268 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
cb0dee88
UB
269 }
270}
2711355f 271
cb0dee88
UB
272/* Detect cache parameters using CPUID function 4. This
273 method doesn't require hardcoded tables. */
2711355f 274
cb0dee88
UB
275enum cache_type
276{
277 CACHE_END = 0,
278 CACHE_DATA = 1,
279 CACHE_INST = 2,
280 CACHE_UNIFIED = 3
281};
282
283static void
a0463099
AK
284detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2,
285 struct cache_desc *level3)
cb0dee88
UB
286{
287 struct cache_desc *cache;
288
289 unsigned eax, ebx, ecx, edx;
290 int count;
291
292 for (count = 0;; count++)
293 {
294 __cpuid_count(4, count, eax, ebx, ecx, edx);
295 switch (eax & 0x1f)
296 {
297 case CACHE_END:
298 return;
299 case CACHE_DATA:
300 case CACHE_UNIFIED:
301 {
302 switch ((eax >> 5) & 0x07)
303 {
304 case 1:
305 cache = level1;
306 break;
307 case 2:
308 cache = level2;
309 break;
a0463099
AK
310 case 3:
311 cache = level3;
312 break;
cb0dee88
UB
313 default:
314 cache = NULL;
315 }
316
317 if (cache)
318 {
319 unsigned sets = ecx + 1;
dc8bd8d9 320 unsigned part = ((ebx >> 12) & 0x03ff) + 1;
cb0dee88 321
dc8bd8d9 322 cache->assoc = ((ebx >> 22) & 0x03ff) + 1;
cb0dee88 323 cache->line = (ebx & 0x0fff) + 1;
cb0dee88
UB
324
325 cache->sizekb = (cache->assoc * part
326 * cache->line * sets) / 1024;
a0463099 327 }
cb0dee88 328 }
2711355f
ZD
329 default:
330 break;
331 }
332 }
333}
334
cb0dee88 335/* Returns the description of caches for an Intel processor. */
2711355f 336
d3bfe4de 337static const char *
a0463099
AK
338detect_caches_intel (bool xeon_mp, unsigned max_level,
339 unsigned max_ext_level, unsigned *l2sizekb)
2711355f 340{
a0463099 341 struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}, level3 = {0, 0, 0};
2711355f 342
cb0dee88 343 if (max_level >= 4)
a0463099 344 detect_caches_cpuid4 (&level1, &level2, &level3);
cb0dee88
UB
345 else if (max_level >= 2)
346 detect_caches_cpuid2 (xeon_mp, &level1, &level2);
347 else
d3bfe4de 348 return "";
2711355f 349
cb0dee88 350 if (level1.sizekb == 0)
d3bfe4de 351 return "";
2711355f 352
a0463099
AK
353 /* Let the L3 replace the L2. This assumes inclusive caches
354 and single threaded program for now. */
355 if (level3.sizekb)
356 level2 = level3;
357
cb0dee88
UB
358 /* Intel CPUs are equipped with AMD style L2 cache info. Try this
359 method if other methods fail to provide L2 cache parameters. */
360 if (level2.sizekb == 0 && max_ext_level >= 0x80000006)
361 detect_l2_cache (&level2);
f4a1dd0d 362
a0463099
AK
363 *l2sizekb = level2.sizekb;
364
cb0dee88 365 return describe_cache (level1, level2);
2711355f
ZD
366}
367
fa959ce4
MM
368/* This will be called by the spec parser in gcc.c when it sees
369 a %:local_cpu_detect(args) construct. Currently it will be called
370 with either "arch" or "tune" as argument depending on if -march=native
371 or -mtune=native is to be substituted.
372
373 It returns a string containing new command line parameters to be
374 put at the place of the above two options, depending on what CPU
375 this is executed. E.g. "-march=k8" on an AMD64 machine
376 for -march=native.
377
378 ARGC and ARGV are set depending on the actual arguments given
379 in the spec. */
b3172cab 380
fa959ce4
MM
381const char *host_detect_local_cpu (int argc, const char **argv)
382{
b3172cab
UB
383 enum processor_type processor = PROCESSOR_I386;
384 const char *cpu = "i386";
385
2711355f 386 const char *cache = "";
5be6cb59 387 const char *options = "";
b3172cab 388
cb0dee88 389 unsigned int eax, ebx, ecx, edx;
b3172cab
UB
390
391 unsigned int max_level, ext_level;
cb0dee88 392
fa959ce4 393 unsigned int vendor;
cb0dee88 394 unsigned int model, family;
b3172cab
UB
395
396 unsigned int has_sse3, has_ssse3, has_cmpxchg16b;
397 unsigned int has_cmpxchg8b, has_cmov, has_mmx, has_sse, has_sse2;
398
399 /* Extended features */
400 unsigned int has_lahf_lm = 0, has_sse4a = 0;
401 unsigned int has_longmode = 0, has_3dnowp = 0, has_3dnow = 0;
634fa334 402 unsigned int has_movbe = 0, has_sse4_1 = 0, has_sse4_2 = 0;
7afac110 403 unsigned int has_popcnt = 0, has_aes = 0, has_avx = 0, has_avx2 = 0;
8ad9d49e 404 unsigned int has_pclmul = 0, has_abm = 0, has_lwp = 0;
5eed4f27 405 unsigned int has_fma = 0, has_fma4 = 0, has_xop = 0;
82feeb8d 406 unsigned int has_bmi = 0, has_bmi2 = 0, has_tbm = 0, has_lzcnt = 0;
76a02e42 407 unsigned int has_hle = 0, has_rtm = 0;
d1925759 408 unsigned int has_rdrnd = 0, has_f16c = 0, has_fsgsbase = 0;
d05e383b 409 unsigned int has_rdseed = 0, has_prfchw = 0, has_adx = 0;
3a0d99bb 410 unsigned int has_osxsave = 0, has_fxsr = 0, has_xsave = 0, has_xsaveopt = 0;
3f97cb0b 411 unsigned int has_avx512er = 0, has_avx512pf = 0, has_avx512cd = 0;
43b3f52f 412 unsigned int has_avx512f = 0, has_sha = 0, has_prefetchwt1 = 0;
9cdea277 413 unsigned int has_clflushopt = 0, has_xsavec = 0, has_xsaves = 0;
b3172cab 414
edccdcb1
L
415 bool arch;
416
a0463099 417 unsigned int l2sizekb = 0;
228e5d2b 418 unsigned int arch_64bit = 1;
a0463099 419
edccdcb1
L
420 if (argc < 1)
421 return NULL;
422
b3172cab
UB
423 arch = !strcmp (argv[0], "arch");
424
edccdcb1 425 if (!arch && strcmp (argv[0], "tune"))
fa959ce4
MM
426 return NULL;
427
b3172cab
UB
428 max_level = __get_cpuid_max (0, &vendor);
429 if (max_level < 1)
fa959ce4 430 goto done;
fa959ce4 431
b3172cab 432 __cpuid (1, eax, ebx, ecx, edx);
fa959ce4 433
cb0dee88 434 model = (eax >> 4) & 0x0f;
b3172cab 435 family = (eax >> 8) & 0x0f;
ef64d158 436 if (vendor == signature_INTEL_ebx)
37c50435
L
437 {
438 unsigned int extended_model, extended_family;
439
440 extended_model = (eax >> 12) & 0xf0;
441 extended_family = (eax >> 20) & 0xff;
442 if (family == 0x0f)
443 {
444 family += extended_family;
445 model += extended_model;
446 }
447 else if (family == 0x06)
448 model += extended_model;
449 }
b3172cab
UB
450
451 has_sse3 = ecx & bit_SSE3;
452 has_ssse3 = ecx & bit_SSSE3;
634fa334
L
453 has_sse4_1 = ecx & bit_SSE4_1;
454 has_sse4_2 = ecx & bit_SSE4_2;
455 has_avx = ecx & bit_AVX;
a91529c4 456 has_osxsave = ecx & bit_OSXSAVE;
b3172cab 457 has_cmpxchg16b = ecx & bit_CMPXCHG16B;
cabf85c3 458 has_movbe = ecx & bit_MOVBE;
634fa334
L
459 has_popcnt = ecx & bit_POPCNT;
460 has_aes = ecx & bit_AES;
461 has_pclmul = ecx & bit_PCLMUL;
5eed4f27 462 has_fma = ecx & bit_FMA;
d1925759
L
463 has_f16c = ecx & bit_F16C;
464 has_rdrnd = ecx & bit_RDRND;
3a0d99bb 465 has_xsave = ecx & bit_XSAVE;
fa959ce4 466
b3172cab
UB
467 has_cmpxchg8b = edx & bit_CMPXCHG8B;
468 has_cmov = edx & bit_CMOV;
469 has_mmx = edx & bit_MMX;
3a0d99bb 470 has_fxsr = edx & bit_FXSAVE;
b3172cab
UB
471 has_sse = edx & bit_SSE;
472 has_sse2 = edx & bit_SSE2;
473
2c9b39ef
L
474 if (max_level >= 7)
475 {
476 __cpuid_count (7, 0, eax, ebx, ecx, edx);
477
478 has_bmi = ebx & bit_BMI;
5dcfdccd 479 has_hle = ebx & bit_HLE;
76a02e42 480 has_rtm = ebx & bit_RTM;
2c9b39ef
L
481 has_avx2 = ebx & bit_AVX2;
482 has_bmi2 = ebx & bit_BMI2;
d1925759 483 has_fsgsbase = ebx & bit_FSGSBASE;
4c340b5d 484 has_rdseed = ebx & bit_RDSEED;
d05e383b 485 has_adx = ebx & bit_ADX;
3f97cb0b
AI
486 has_avx512f = ebx & bit_AVX512F;
487 has_avx512er = ebx & bit_AVX512ER;
488 has_avx512pf = ebx & bit_AVX512PF;
489 has_avx512cd = ebx & bit_AVX512CD;
c1618f82 490 has_sha = ebx & bit_SHA;
9cdea277 491 has_clflushopt = ebx & bit_CLFLUSHOPT;
43b3f52f
IT
492
493 has_prefetchwt1 = ecx & bit_PREFETCHWT1;
2c9b39ef
L
494 }
495
3a0d99bb
AI
496 if (max_level >= 13)
497 {
498 __cpuid_count (13, 1, eax, ebx, ecx, edx);
499
500 has_xsaveopt = eax & bit_XSAVEOPT;
9cdea277
IT
501 has_xsavec = eax & bit_XSAVEC;
502 has_xsaves = eax & bit_XSAVES;
3a0d99bb
AI
503 }
504
d0b50387
JJ
505 /* Check cpuid level of extended features. */
506 __cpuid (0x80000000, ext_level, ebx, ecx, edx);
507
508 if (ext_level > 0x80000000)
509 {
510 __cpuid (0x80000001, eax, ebx, ecx, edx);
511
512 has_lahf_lm = ecx & bit_LAHF_LM;
513 has_sse4a = ecx & bit_SSE4a;
514 has_abm = ecx & bit_ABM;
515 has_lwp = ecx & bit_LWP;
516 has_fma4 = ecx & bit_FMA4;
517 has_xop = ecx & bit_XOP;
518 has_tbm = ecx & bit_TBM;
519 has_lzcnt = ecx & bit_LZCNT;
520 has_prfchw = ecx & bit_PRFCHW;
521
522 has_longmode = edx & bit_LM;
523 has_3dnowp = edx & bit_3DNOWP;
524 has_3dnow = edx & bit_3DNOW;
525 }
526
a91529c4
L
527 /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv. */
528#define XCR_XFEATURE_ENABLED_MASK 0x0
529#define XSTATE_FP 0x1
530#define XSTATE_SSE 0x2
531#define XSTATE_YMM 0x4
532 if (has_osxsave)
533 asm (".byte 0x0f; .byte 0x01; .byte 0xd0"
534 : "=a" (eax), "=d" (edx)
535 : "c" (XCR_XFEATURE_ENABLED_MASK));
536
537 /* Check if SSE and YMM states are supported. */
953ac966
AN
538 if (!has_osxsave
539 || (eax & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM))
a91529c4
L
540 {
541 has_avx = 0;
542 has_avx2 = 0;
543 has_fma = 0;
544 has_fma4 = 0;
d0b50387 545 has_f16c = 0;
a91529c4 546 has_xop = 0;
3a0d99bb
AI
547 has_xsave = 0;
548 has_xsaveopt = 0;
9cdea277
IT
549 has_xsaves = 0;
550 has_xsavec = 0;
a91529c4
L
551 }
552
2711355f
ZD
553 if (!arch)
554 {
19db293a 555 if (vendor == signature_AMD_ebx
af0e415b
UB
556 || vendor == signature_CENTAUR_ebx
557 || vendor == signature_CYRIX_ebx
7b9d1bd8 558 || vendor == signature_NSC_ebx)
2711355f 559 cache = detect_caches_amd (ext_level);
ef64d158 560 else if (vendor == signature_INTEL_ebx)
cb0dee88
UB
561 {
562 bool xeon_mp = (family == 15 && model == 6);
a0463099
AK
563 cache = detect_caches_intel (xeon_mp, max_level,
564 ext_level, &l2sizekb);
cb0dee88 565 }
2711355f
ZD
566 }
567
ef64d158 568 if (vendor == signature_AMD_ebx)
fa959ce4 569 {
fbdf817d 570 unsigned int name;
b3172cab 571
fbdf817d
UB
572 /* Detect geode processor by its processor signature. */
573 if (ext_level > 0x80000001)
574 __cpuid (0x80000002, name, ebx, ecx, edx);
575 else
576 name = 0;
577
ef64d158 578 if (name == signature_NSC_ebx)
fbdf817d 579 processor = PROCESSOR_GEODE;
e32bfc16
VK
580 else if (has_movbe)
581 processor = PROCESSOR_BTVER2;
ed97ad47
GG
582 else if (has_avx2)
583 processor = PROCESSOR_BDVER4;
eb2f2b44
GG
584 else if (has_xsaveopt)
585 processor = PROCESSOR_BDVER3;
4d652a18
HJ
586 else if (has_bmi)
587 processor = PROCESSOR_BDVER2;
1133125e
HJ
588 else if (has_xop)
589 processor = PROCESSOR_BDVER1;
14b52538
CF
590 else if (has_sse4a && has_ssse3)
591 processor = PROCESSOR_BTVER1;
fbdf817d 592 else if (has_sse4a)
35a63f21 593 processor = PROCESSOR_AMDFAM10;
fbdf817d
UB
594 else if (has_sse2 || has_longmode)
595 processor = PROCESSOR_K8;
f7593cb4 596 else if (has_3dnowp && family == 6)
fbdf817d
UB
597 processor = PROCESSOR_ATHLON;
598 else if (has_mmx)
599 processor = PROCESSOR_K6;
600 else
601 processor = PROCESSOR_PENTIUM;
fa959ce4 602 }
19db293a
UB
603 else if (vendor == signature_CENTAUR_ebx)
604 {
605 if (arch)
606 {
af0e415b 607 switch (family)
19db293a 608 {
af0e415b 609 case 6:
19db293a
UB
610 if (model > 9)
611 /* Use the default detection procedure. */
9d532162 612 processor = PROCESSOR_GENERIC;
19db293a
UB
613 else if (model == 9)
614 cpu = "c3-2";
615 else if (model >= 6)
616 cpu = "c3";
617 else
9d532162 618 processor = PROCESSOR_GENERIC;
af0e415b
UB
619 break;
620 case 5:
621 if (has_3dnow)
622 cpu = "winchip2";
623 else if (has_mmx)
624 cpu = "winchip2-c6";
625 else
9d532162 626 processor = PROCESSOR_GENERIC;
af0e415b
UB
627 break;
628 default:
629 /* We have no idea. */
9d532162 630 processor = PROCESSOR_GENERIC;
19db293a 631 }
19db293a
UB
632 }
633 }
fa959ce4
MM
634 else
635 {
edccdcb1
L
636 switch (family)
637 {
b3172cab
UB
638 case 4:
639 processor = PROCESSOR_I486;
640 break;
edccdcb1 641 case 5:
b3172cab 642 processor = PROCESSOR_PENTIUM;
edccdcb1
L
643 break;
644 case 6:
645 processor = PROCESSOR_PENTIUMPRO;
646 break;
647 case 15:
648 processor = PROCESSOR_PENTIUM4;
649 break;
650 default:
b3172cab 651 /* We have no idea. */
9d532162 652 processor = PROCESSOR_GENERIC;
edccdcb1
L
653 }
654 }
655
656 switch (processor)
657 {
658 case PROCESSOR_I386:
b3172cab 659 /* Default. */
228e5d2b 660 arch_64bit = 0;
edccdcb1
L
661 break;
662 case PROCESSOR_I486:
228e5d2b 663 arch_64bit = 0;
edccdcb1
L
664 cpu = "i486";
665 break;
666 case PROCESSOR_PENTIUM:
228e5d2b 667 arch_64bit = 0;
b3172cab 668 if (arch && has_mmx)
edccdcb1
L
669 cpu = "pentium-mmx";
670 else
671 cpu = "pentium";
672 break;
673 case PROCESSOR_PENTIUMPRO:
44f276c6 674 switch (model)
edccdcb1 675 {
44f276c6
L
676 case 0x1c:
677 case 0x26:
d3c11974
L
678 /* Bonnell. */
679 cpu = "bonnell";
44f276c6 680 break;
e5287671
YR
681 case 0x37:
682 case 0x4d:
683 /* Silvermont. */
d3c11974 684 cpu = "silvermont";
e5287671 685 break;
992592ec
CW
686 case 0x0f:
687 /* Merom. */
688 case 0x17:
689 case 0x1d:
690 /* Penryn. */
691 cpu = "core2";
692 break;
44f276c6
L
693 case 0x1a:
694 case 0x1e:
695 case 0x1f:
696 case 0x2e:
eefe143b 697 /* Nehalem. */
d3c11974
L
698 cpu = "nehalem";
699 break;
44f276c6 700 case 0x25:
12bbb78f 701 case 0x2c:
44f276c6 702 case 0x2f:
eefe143b 703 /* Westmere. */
d3c11974 704 cpu = "westmere";
44f276c6 705 break;
35758e5b 706 case 0x2a:
815cecbe 707 case 0x2d:
35758e5b 708 /* Sandy Bridge. */
d3c11974 709 cpu = "sandybridge";
35758e5b 710 break;
992592ec
CW
711 case 0x3a:
712 case 0x3e:
713 /* Ivy Bridge. */
d3c11974 714 cpu = "ivybridge";
44f276c6 715 break;
992592ec 716 case 0x3c:
d0cf4e84
L
717 case 0x45:
718 case 0x46:
992592ec 719 /* Haswell. */
d3c11974 720 cpu = "haswell";
44f276c6
L
721 break;
722 default:
723 if (arch)
724 {
4ffae7ff 725 /* This is unknown family 0x6 CPU. */
19ac6899
TI
726 if (has_adx)
727 cpu = "broadwell";
728 else if (has_avx2)
992592ec 729 /* Assume Haswell. */
d3c11974 730 cpu = "haswell";
992592ec 731 else if (has_avx)
4ffae7ff 732 /* Assume Sandy Bridge. */
d3c11974 733 cpu = "sandybridge";
4ffae7ff 734 else if (has_sse4_2)
0b871ccf
YR
735 {
736 if (has_movbe)
d3c11974
L
737 /* Assume Silvermont. */
738 cpu = "silvermont";
0b871ccf 739 else
d3c11974
L
740 /* Assume Nehalem. */
741 cpu = "nehalem";
0b871ccf 742 }
4ffae7ff
L
743 else if (has_ssse3)
744 {
745 if (has_movbe)
d3c11974
L
746 /* Assume Bonnell. */
747 cpu = "bonnell";
4ffae7ff
L
748 else
749 /* Assume Core 2. */
750 cpu = "core2";
751 }
44f276c6 752 else
228e5d2b
L
753 {
754 arch_64bit = 0;
755 if (has_sse3)
756 /* It is Core Duo. */
757 cpu = "pentium-m";
758 else if (has_sse2)
759 /* It is Pentium M. */
760 cpu = "pentium-m";
761 else if (has_sse)
762 /* It is Pentium III. */
763 cpu = "pentium3";
764 else if (has_mmx)
765 /* It is Pentium II. */
766 cpu = "pentium2";
767 else
768 /* Default to Pentium Pro. */
769 cpu = "pentiumpro";
770 }
44f276c6 771 }
b3172cab 772 else
44f276c6
L
773 /* For -mtune, we default to -mtune=generic. */
774 cpu = "generic";
775 break;
fa959ce4 776 }
b3172cab
UB
777 break;
778 case PROCESSOR_PENTIUM4:
779 if (has_sse3)
fa959ce4 780 {
b3172cab
UB
781 if (has_longmode)
782 cpu = "nocona";
fa959ce4 783 else
228e5d2b
L
784 {
785 cpu = "prescott";
786 arch_64bit = 0;
787 }
fa959ce4 788 }
b3172cab 789 else
228e5d2b
L
790 {
791 cpu = "pentium4";
792 arch_64bit = 0;
793 }
edccdcb1
L
794 break;
795 case PROCESSOR_GEODE:
228e5d2b 796 arch_64bit = 0;
edccdcb1
L
797 cpu = "geode";
798 break;
799 case PROCESSOR_K6:
228e5d2b 800 arch_64bit = 0;
b3172cab
UB
801 if (arch && has_3dnow)
802 cpu = "k6-3";
edccdcb1
L
803 else
804 cpu = "k6";
805 break;
806 case PROCESSOR_ATHLON:
228e5d2b 807 arch_64bit = 0;
b3172cab 808 if (arch && has_sse)
edccdcb1
L
809 cpu = "athlon-4";
810 else
811 cpu = "athlon";
812 break;
edccdcb1 813 case PROCESSOR_K8:
b3172cab
UB
814 if (arch && has_sse3)
815 cpu = "k8-sse3";
816 else
817 cpu = "k8";
edccdcb1 818 break;
35a63f21
DR
819 case PROCESSOR_AMDFAM10:
820 cpu = "amdfam10";
821 break;
1133125e
HJ
822 case PROCESSOR_BDVER1:
823 cpu = "bdver1";
824 break;
4d652a18
HJ
825 case PROCESSOR_BDVER2:
826 cpu = "bdver2";
827 break;
eb2f2b44
GG
828 case PROCESSOR_BDVER3:
829 cpu = "bdver3";
830 break;
ed97ad47
GG
831 case PROCESSOR_BDVER4:
832 cpu = "bdver4";
833 break;
14b52538
CF
834 case PROCESSOR_BTVER1:
835 cpu = "btver1";
836 break;
e32bfc16
VK
837 case PROCESSOR_BTVER2:
838 cpu = "btver2";
839 break;
b3172cab 840
edccdcb1 841 default:
b3172cab
UB
842 /* Use something reasonable. */
843 if (arch)
844 {
845 if (has_ssse3)
846 cpu = "core2";
847 else if (has_sse3)
848 {
849 if (has_longmode)
850 cpu = "nocona";
851 else
852 cpu = "prescott";
853 }
854 else if (has_sse2)
855 cpu = "pentium4";
856 else if (has_cmov)
857 cpu = "pentiumpro";
858 else if (has_mmx)
859 cpu = "pentium-mmx";
860 else if (has_cmpxchg8b)
861 cpu = "pentium";
862 }
863 else
864 cpu = "generic";
fa959ce4
MM
865 }
866
5be6cb59
UB
867 if (arch)
868 {
11c2aa39
UB
869 const char *mmx = has_mmx ? " -mmmx" : " -mno-mmx";
870 const char *mmx3dnow = has_3dnow ? " -m3dnow" : " -mno-3dnow";
871 const char *sse = has_sse ? " -msse" : " -mno-sse";
872 const char *sse2 = has_sse2 ? " -msse2" : " -mno-sse2";
873 const char *sse3 = has_sse3 ? " -msse3" : " -mno-sse3";
874 const char *ssse3 = has_ssse3 ? " -mssse3" : " -mno-ssse3";
875 const char *sse4a = has_sse4a ? " -msse4a" : " -mno-sse4a";
5eed4f27
L
876 const char *cx16 = has_cmpxchg16b ? " -mcx16" : " -mno-cx16";
877 const char *sahf = has_lahf_lm ? " -msahf" : " -mno-sahf";
878 const char *movbe = has_movbe ? " -mmovbe" : " -mno-movbe";
11c2aa39 879 const char *aes = has_aes ? " -maes" : " -mno-aes";
c1618f82 880 const char *sha = has_sha ? " -msha" : " -mno-sha";
5eed4f27
L
881 const char *pclmul = has_pclmul ? " -mpclmul" : " -mno-pclmul";
882 const char *popcnt = has_popcnt ? " -mpopcnt" : " -mno-popcnt";
883 const char *abm = has_abm ? " -mabm" : " -mno-abm";
884 const char *lwp = has_lwp ? " -mlwp" : " -mno-lwp";
885 const char *fma = has_fma ? " -mfma" : " -mno-fma";
886 const char *fma4 = has_fma4 ? " -mfma4" : " -mno-fma4";
887 const char *xop = has_xop ? " -mxop" : " -mno-xop";
888 const char *bmi = has_bmi ? " -mbmi" : " -mno-bmi";
82feeb8d 889 const char *bmi2 = has_bmi2 ? " -mbmi2" : " -mno-bmi2";
5eed4f27
L
890 const char *tbm = has_tbm ? " -mtbm" : " -mno-tbm";
891 const char *avx = has_avx ? " -mavx" : " -mno-avx";
7afac110 892 const char *avx2 = has_avx2 ? " -mavx2" : " -mno-avx2";
642a011d 893 const char *sse4_2 = has_sse4_2 ? " -msse4.2" : " -mno-sse4.2";
5eed4f27 894 const char *sse4_1 = has_sse4_1 ? " -msse4.1" : " -mno-sse4.1";
3ed2c643 895 const char *lzcnt = has_lzcnt ? " -mlzcnt" : " -mno-lzcnt";
38d7f26e 896 const char *hle = has_hle ? " -mhle" : " -mno-hle";
76a02e42 897 const char *rtm = has_rtm ? " -mrtm" : " -mno-rtm";
d1925759
L
898 const char *rdrnd = has_rdrnd ? " -mrdrnd" : " -mno-rdrnd";
899 const char *f16c = has_f16c ? " -mf16c" : " -mno-f16c";
900 const char *fsgsbase = has_fsgsbase ? " -mfsgsbase" : " -mno-fsgsbase";
4c340b5d 901 const char *rdseed = has_rdseed ? " -mrdseed" : " -mno-rdseed";
e61c94dd 902 const char *prfchw = has_prfchw ? " -mprfchw" : " -mno-prfchw";
d05e383b 903 const char *adx = has_adx ? " -madx" : " -mno-adx";
3a0d99bb
AI
904 const char *fxsr = has_fxsr ? " -mfxsr" : " -mno-fxsr";
905 const char *xsave = has_xsave ? " -mxsave" : " -mno-xsave";
906 const char *xsaveopt = has_xsaveopt ? " -mxsaveopt" : " -mno-xsaveopt";
3f97cb0b
AI
907 const char *avx512f = has_avx512f ? " -mavx512f" : " -mno-avx512f";
908 const char *avx512er = has_avx512er ? " -mavx512er" : " -mno-avx512er";
909 const char *avx512cd = has_avx512cd ? " -mavx512cd" : " -mno-avx512cd";
910 const char *avx512pf = has_avx512pf ? " -mavx512pf" : " -mno-avx512pf";
43b3f52f 911 const char *prefetchwt1 = has_prefetchwt1 ? " -mprefetchwt1" : " -mno-prefetchwt1";
9cdea277
IT
912 const char *clflushopt = has_clflushopt ? " -mclflushopt" : " -mno-clflushopt";
913 const char *xsavec = has_xsavec ? " -mxsavec" : " -mno-xsavec";
914 const char *xsaves = has_xsaves ? " -mxsaves" : " -mno-xsaves";
5eed4f27 915
228e5d2b
L
916 /* Assume x86-64 if a 32-bit processor supports SSE2 and 64-bit. */
917 if (arch_64bit == 0 && has_sse2 && has_longmode)
918 cpu = "x86-64";
919
11c2aa39 920 options = concat (options, mmx, mmx3dnow, sse, sse2, sse3, ssse3,
c1618f82 921 sse4a, cx16, sahf, movbe, aes, sha, pclmul,
82feeb8d 922 popcnt, abm, lwp, fma, fma4, xop, bmi, bmi2,
76a02e42 923 tbm, avx, avx2, sse4_2, sse4_1, lzcnt, rtm,
3a0d99bb 924 hle, rdrnd, f16c, fsgsbase, rdseed, prfchw, adx,
3f97cb0b 925 fxsr, xsave, xsaveopt, avx512f, avx512er,
9cdea277
IT
926 avx512cd, avx512pf, prefetchwt1, clflushopt,
927 xsavec, xsaves, NULL);
5be6cb59
UB
928 }
929
fa959ce4 930done:
f3afc8a7 931 return concat (cache, "-m", argv[0], "=", cpu, options, NULL);
fa959ce4
MM
932}
933#else
b3172cab 934
f3afc8a7
UB
935/* If we aren't compiling with GCC then the driver will just ignore
936 -march and -mtune "native" target and will leave to the newly
937 built compiler to generate code for its default target. */
b3172cab 938
f3afc8a7
UB
939const char *host_detect_local_cpu (int argc ATTRIBUTE_UNUSED,
940 const char **argv ATTRIBUTE_UNUSED)
fa959ce4 941{
f3afc8a7 942 return NULL;
fa959ce4 943}
a6ecb05c 944#endif /* __GNUC__ */