]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/i386/driver-i386.c
arm-protos.h: Add and update function protos.
[thirdparty/gcc.git] / gcc / config / i386 / driver-i386.c
CommitLineData
fa959ce4 1/* Subroutines for the gcc driver.
d1e082c2 2 Copyright (C) 2006-2013 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;
129 case 0x2c:
130 level1->sizekb = 32; level1->assoc = 8; level1->line = 64;
131 break;
132 case 0x39:
133 level2->sizekb = 128; level2->assoc = 4; level2->line = 64;
134 break;
135 case 0x3a:
136 level2->sizekb = 192; level2->assoc = 6; level2->line = 64;
137 break;
138 case 0x3b:
139 level2->sizekb = 128; level2->assoc = 2; level2->line = 64;
140 break;
141 case 0x3c:
142 level2->sizekb = 256; level2->assoc = 4; level2->line = 64;
143 break;
144 case 0x3d:
145 level2->sizekb = 384; level2->assoc = 6; level2->line = 64;
146 break;
147 case 0x3e:
148 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
149 break;
150 case 0x41:
151 level2->sizekb = 128; level2->assoc = 4; level2->line = 32;
152 break;
153 case 0x42:
154 level2->sizekb = 256; level2->assoc = 4; level2->line = 32;
155 break;
156 case 0x43:
157 level2->sizekb = 512; level2->assoc = 4; level2->line = 32;
158 break;
159 case 0x44:
160 level2->sizekb = 1024; level2->assoc = 4; level2->line = 32;
161 break;
162 case 0x45:
163 level2->sizekb = 2048; level2->assoc = 4; level2->line = 32;
164 break;
165 case 0x49:
166 if (xeon_mp)
167 break;
168 level2->sizekb = 4096; level2->assoc = 16; level2->line = 64;
169 break;
170 case 0x4e:
171 level2->sizekb = 6144; level2->assoc = 24; level2->line = 64;
172 break;
173 case 0x60:
174 level1->sizekb = 16; level1->assoc = 8; level1->line = 64;
175 break;
176 case 0x66:
177 level1->sizekb = 8; level1->assoc = 4; level1->line = 64;
178 break;
179 case 0x67:
180 level1->sizekb = 16; level1->assoc = 4; level1->line = 64;
181 break;
182 case 0x68:
183 level1->sizekb = 32; level1->assoc = 4; level1->line = 64;
184 break;
185 case 0x78:
186 level2->sizekb = 1024; level2->assoc = 4; level2->line = 64;
187 break;
188 case 0x79:
189 level2->sizekb = 128; level2->assoc = 8; level2->line = 64;
190 break;
191 case 0x7a:
192 level2->sizekb = 256; level2->assoc = 8; level2->line = 64;
193 break;
194 case 0x7b:
195 level2->sizekb = 512; level2->assoc = 8; level2->line = 64;
196 break;
197 case 0x7c:
198 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
199 break;
200 case 0x7d:
201 level2->sizekb = 2048; level2->assoc = 8; level2->line = 64;
202 break;
203 case 0x7f:
204 level2->sizekb = 512; level2->assoc = 2; level2->line = 64;
205 break;
206 case 0x82:
207 level2->sizekb = 256; level2->assoc = 8; level2->line = 32;
208 break;
209 case 0x83:
210 level2->sizekb = 512; level2->assoc = 8; level2->line = 32;
211 break;
212 case 0x84:
213 level2->sizekb = 1024; level2->assoc = 8; level2->line = 32;
214 break;
215 case 0x85:
216 level2->sizekb = 2048; level2->assoc = 8; level2->line = 32;
217 break;
218 case 0x86:
219 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
220 break;
221 case 0x87:
222 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
223
224 default:
225 break;
226 }
227}
2711355f 228
cb0dee88 229/* Detect cache parameters using CPUID function 2. */
2711355f 230
cb0dee88
UB
231static void
232detect_caches_cpuid2 (bool xeon_mp,
233 struct cache_desc *level1, struct cache_desc *level2)
234{
dc8bd8d9
UB
235 unsigned regs[4];
236 int nreps, i;
cb0dee88 237
dc8bd8d9 238 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
cb0dee88 239
dc8bd8d9
UB
240 nreps = regs[0] & 0x0f;
241 regs[0] &= ~0x0f;
cb0dee88
UB
242
243 while (--nreps >= 0)
2711355f 244 {
dc8bd8d9
UB
245 for (i = 0; i < 4; i++)
246 if (regs[i] && !((regs[i] >> 31) & 1))
247 decode_caches_intel (regs[i], xeon_mp, level1, level2);
cb0dee88
UB
248
249 if (nreps)
dc8bd8d9 250 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
cb0dee88
UB
251 }
252}
2711355f 253
cb0dee88
UB
254/* Detect cache parameters using CPUID function 4. This
255 method doesn't require hardcoded tables. */
2711355f 256
cb0dee88
UB
257enum cache_type
258{
259 CACHE_END = 0,
260 CACHE_DATA = 1,
261 CACHE_INST = 2,
262 CACHE_UNIFIED = 3
263};
264
265static void
a0463099
AK
266detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2,
267 struct cache_desc *level3)
cb0dee88
UB
268{
269 struct cache_desc *cache;
270
271 unsigned eax, ebx, ecx, edx;
272 int count;
273
274 for (count = 0;; count++)
275 {
276 __cpuid_count(4, count, eax, ebx, ecx, edx);
277 switch (eax & 0x1f)
278 {
279 case CACHE_END:
280 return;
281 case CACHE_DATA:
282 case CACHE_UNIFIED:
283 {
284 switch ((eax >> 5) & 0x07)
285 {
286 case 1:
287 cache = level1;
288 break;
289 case 2:
290 cache = level2;
291 break;
a0463099
AK
292 case 3:
293 cache = level3;
294 break;
cb0dee88
UB
295 default:
296 cache = NULL;
297 }
298
299 if (cache)
300 {
301 unsigned sets = ecx + 1;
dc8bd8d9 302 unsigned part = ((ebx >> 12) & 0x03ff) + 1;
cb0dee88 303
dc8bd8d9 304 cache->assoc = ((ebx >> 22) & 0x03ff) + 1;
cb0dee88 305 cache->line = (ebx & 0x0fff) + 1;
cb0dee88
UB
306
307 cache->sizekb = (cache->assoc * part
308 * cache->line * sets) / 1024;
a0463099 309 }
cb0dee88 310 }
2711355f
ZD
311 default:
312 break;
313 }
314 }
315}
316
cb0dee88 317/* Returns the description of caches for an Intel processor. */
2711355f 318
d3bfe4de 319static const char *
a0463099
AK
320detect_caches_intel (bool xeon_mp, unsigned max_level,
321 unsigned max_ext_level, unsigned *l2sizekb)
2711355f 322{
a0463099 323 struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}, level3 = {0, 0, 0};
2711355f 324
cb0dee88 325 if (max_level >= 4)
a0463099 326 detect_caches_cpuid4 (&level1, &level2, &level3);
cb0dee88
UB
327 else if (max_level >= 2)
328 detect_caches_cpuid2 (xeon_mp, &level1, &level2);
329 else
d3bfe4de 330 return "";
2711355f 331
cb0dee88 332 if (level1.sizekb == 0)
d3bfe4de 333 return "";
2711355f 334
a0463099
AK
335 /* Let the L3 replace the L2. This assumes inclusive caches
336 and single threaded program for now. */
337 if (level3.sizekb)
338 level2 = level3;
339
cb0dee88
UB
340 /* Intel CPUs are equipped with AMD style L2 cache info. Try this
341 method if other methods fail to provide L2 cache parameters. */
342 if (level2.sizekb == 0 && max_ext_level >= 0x80000006)
343 detect_l2_cache (&level2);
f4a1dd0d 344
a0463099
AK
345 *l2sizekb = level2.sizekb;
346
cb0dee88 347 return describe_cache (level1, level2);
2711355f
ZD
348}
349
fa959ce4
MM
350/* This will be called by the spec parser in gcc.c when it sees
351 a %:local_cpu_detect(args) construct. Currently it will be called
352 with either "arch" or "tune" as argument depending on if -march=native
353 or -mtune=native is to be substituted.
354
355 It returns a string containing new command line parameters to be
356 put at the place of the above two options, depending on what CPU
357 this is executed. E.g. "-march=k8" on an AMD64 machine
358 for -march=native.
359
360 ARGC and ARGV are set depending on the actual arguments given
361 in the spec. */
b3172cab 362
fa959ce4
MM
363const char *host_detect_local_cpu (int argc, const char **argv)
364{
b3172cab
UB
365 enum processor_type processor = PROCESSOR_I386;
366 const char *cpu = "i386";
367
2711355f 368 const char *cache = "";
5be6cb59 369 const char *options = "";
b3172cab 370
cb0dee88 371 unsigned int eax, ebx, ecx, edx;
b3172cab
UB
372
373 unsigned int max_level, ext_level;
cb0dee88 374
fa959ce4 375 unsigned int vendor;
cb0dee88 376 unsigned int model, family;
b3172cab
UB
377
378 unsigned int has_sse3, has_ssse3, has_cmpxchg16b;
379 unsigned int has_cmpxchg8b, has_cmov, has_mmx, has_sse, has_sse2;
380
381 /* Extended features */
382 unsigned int has_lahf_lm = 0, has_sse4a = 0;
383 unsigned int has_longmode = 0, has_3dnowp = 0, has_3dnow = 0;
634fa334 384 unsigned int has_movbe = 0, has_sse4_1 = 0, has_sse4_2 = 0;
7afac110 385 unsigned int has_popcnt = 0, has_aes = 0, has_avx = 0, has_avx2 = 0;
8ad9d49e 386 unsigned int has_pclmul = 0, has_abm = 0, has_lwp = 0;
5eed4f27 387 unsigned int has_fma = 0, has_fma4 = 0, has_xop = 0;
82feeb8d 388 unsigned int has_bmi = 0, has_bmi2 = 0, has_tbm = 0, has_lzcnt = 0;
76a02e42 389 unsigned int has_hle = 0, has_rtm = 0;
d1925759 390 unsigned int has_rdrnd = 0, has_f16c = 0, has_fsgsbase = 0;
d05e383b 391 unsigned int has_rdseed = 0, has_prfchw = 0, has_adx = 0;
3a0d99bb 392 unsigned int has_osxsave = 0, has_fxsr = 0, has_xsave = 0, has_xsaveopt = 0;
b3172cab 393
edccdcb1
L
394 bool arch;
395
a0463099
AK
396 unsigned int l2sizekb = 0;
397
edccdcb1
L
398 if (argc < 1)
399 return NULL;
400
b3172cab
UB
401 arch = !strcmp (argv[0], "arch");
402
edccdcb1 403 if (!arch && strcmp (argv[0], "tune"))
fa959ce4
MM
404 return NULL;
405
b3172cab
UB
406 max_level = __get_cpuid_max (0, &vendor);
407 if (max_level < 1)
fa959ce4 408 goto done;
fa959ce4 409
b3172cab 410 __cpuid (1, eax, ebx, ecx, edx);
fa959ce4 411
cb0dee88 412 model = (eax >> 4) & 0x0f;
b3172cab 413 family = (eax >> 8) & 0x0f;
ef64d158 414 if (vendor == signature_INTEL_ebx)
37c50435
L
415 {
416 unsigned int extended_model, extended_family;
417
418 extended_model = (eax >> 12) & 0xf0;
419 extended_family = (eax >> 20) & 0xff;
420 if (family == 0x0f)
421 {
422 family += extended_family;
423 model += extended_model;
424 }
425 else if (family == 0x06)
426 model += extended_model;
427 }
b3172cab
UB
428
429 has_sse3 = ecx & bit_SSE3;
430 has_ssse3 = ecx & bit_SSSE3;
634fa334
L
431 has_sse4_1 = ecx & bit_SSE4_1;
432 has_sse4_2 = ecx & bit_SSE4_2;
433 has_avx = ecx & bit_AVX;
a91529c4 434 has_osxsave = ecx & bit_OSXSAVE;
b3172cab 435 has_cmpxchg16b = ecx & bit_CMPXCHG16B;
cabf85c3 436 has_movbe = ecx & bit_MOVBE;
634fa334
L
437 has_popcnt = ecx & bit_POPCNT;
438 has_aes = ecx & bit_AES;
439 has_pclmul = ecx & bit_PCLMUL;
5eed4f27 440 has_fma = ecx & bit_FMA;
d1925759
L
441 has_f16c = ecx & bit_F16C;
442 has_rdrnd = ecx & bit_RDRND;
3a0d99bb 443 has_xsave = ecx & bit_XSAVE;
fa959ce4 444
b3172cab
UB
445 has_cmpxchg8b = edx & bit_CMPXCHG8B;
446 has_cmov = edx & bit_CMOV;
447 has_mmx = edx & bit_MMX;
3a0d99bb 448 has_fxsr = edx & bit_FXSAVE;
b3172cab
UB
449 has_sse = edx & bit_SSE;
450 has_sse2 = edx & bit_SSE2;
451
2c9b39ef
L
452 if (max_level >= 7)
453 {
454 __cpuid_count (7, 0, eax, ebx, ecx, edx);
455
456 has_bmi = ebx & bit_BMI;
5dcfdccd 457 has_hle = ebx & bit_HLE;
76a02e42 458 has_rtm = ebx & bit_RTM;
2c9b39ef
L
459 has_avx2 = ebx & bit_AVX2;
460 has_bmi2 = ebx & bit_BMI2;
d1925759 461 has_fsgsbase = ebx & bit_FSGSBASE;
4c340b5d 462 has_rdseed = ebx & bit_RDSEED;
d05e383b 463 has_adx = ebx & bit_ADX;
2c9b39ef
L
464 }
465
3a0d99bb
AI
466 if (max_level >= 13)
467 {
468 __cpuid_count (13, 1, eax, ebx, ecx, edx);
469
470 has_xsaveopt = eax & bit_XSAVEOPT;
471 }
472
a91529c4
L
473 /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv. */
474#define XCR_XFEATURE_ENABLED_MASK 0x0
475#define XSTATE_FP 0x1
476#define XSTATE_SSE 0x2
477#define XSTATE_YMM 0x4
478 if (has_osxsave)
479 asm (".byte 0x0f; .byte 0x01; .byte 0xd0"
480 : "=a" (eax), "=d" (edx)
481 : "c" (XCR_XFEATURE_ENABLED_MASK));
482
483 /* Check if SSE and YMM states are supported. */
953ac966
AN
484 if (!has_osxsave
485 || (eax & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM))
a91529c4
L
486 {
487 has_avx = 0;
488 has_avx2 = 0;
489 has_fma = 0;
490 has_fma4 = 0;
491 has_xop = 0;
3a0d99bb
AI
492 has_xsave = 0;
493 has_xsaveopt = 0;
a91529c4
L
494 }
495
b3172cab
UB
496 /* Check cpuid level of extended features. */
497 __cpuid (0x80000000, ext_level, ebx, ecx, edx);
498
499 if (ext_level > 0x80000000)
fa959ce4 500 {
b3172cab 501 __cpuid (0x80000001, eax, ebx, ecx, edx);
fa959ce4 502
b3172cab
UB
503 has_lahf_lm = ecx & bit_LAHF_LM;
504 has_sse4a = ecx & bit_SSE4a;
c3d34a78 505 has_abm = ecx & bit_ABM;
8ad9d49e 506 has_lwp = ecx & bit_LWP;
1133125e
HJ
507 has_fma4 = ecx & bit_FMA4;
508 has_xop = ecx & bit_XOP;
94d13ad1 509 has_tbm = ecx & bit_TBM;
5fcafa60 510 has_lzcnt = ecx & bit_LZCNT;
9006f7f3 511 has_prfchw = ecx & bit_PRFCHW;
b3172cab
UB
512
513 has_longmode = edx & bit_LM;
514 has_3dnowp = edx & bit_3DNOWP;
515 has_3dnow = edx & bit_3DNOW;
516 }
fa959ce4 517
2711355f
ZD
518 if (!arch)
519 {
19db293a 520 if (vendor == signature_AMD_ebx
af0e415b
UB
521 || vendor == signature_CENTAUR_ebx
522 || vendor == signature_CYRIX_ebx
523 || vendor == signature_NSC_ebx
524 || vendor == signature_TM2_ebx)
2711355f 525 cache = detect_caches_amd (ext_level);
ef64d158 526 else if (vendor == signature_INTEL_ebx)
cb0dee88
UB
527 {
528 bool xeon_mp = (family == 15 && model == 6);
a0463099
AK
529 cache = detect_caches_intel (xeon_mp, max_level,
530 ext_level, &l2sizekb);
cb0dee88 531 }
2711355f
ZD
532 }
533
ef64d158 534 if (vendor == signature_AMD_ebx)
fa959ce4 535 {
fbdf817d 536 unsigned int name;
b3172cab 537
fbdf817d
UB
538 /* Detect geode processor by its processor signature. */
539 if (ext_level > 0x80000001)
540 __cpuid (0x80000002, name, ebx, ecx, edx);
541 else
542 name = 0;
543
ef64d158 544 if (name == signature_NSC_ebx)
fbdf817d 545 processor = PROCESSOR_GEODE;
e32bfc16
VK
546 else if (has_movbe)
547 processor = PROCESSOR_BTVER2;
eb2f2b44
GG
548 else if (has_xsaveopt)
549 processor = PROCESSOR_BDVER3;
4d652a18
HJ
550 else if (has_bmi)
551 processor = PROCESSOR_BDVER2;
1133125e
HJ
552 else if (has_xop)
553 processor = PROCESSOR_BDVER1;
14b52538
CF
554 else if (has_sse4a && has_ssse3)
555 processor = PROCESSOR_BTVER1;
fbdf817d 556 else if (has_sse4a)
35a63f21 557 processor = PROCESSOR_AMDFAM10;
fbdf817d
UB
558 else if (has_sse2 || has_longmode)
559 processor = PROCESSOR_K8;
f7593cb4 560 else if (has_3dnowp && family == 6)
fbdf817d
UB
561 processor = PROCESSOR_ATHLON;
562 else if (has_mmx)
563 processor = PROCESSOR_K6;
564 else
565 processor = PROCESSOR_PENTIUM;
fa959ce4 566 }
19db293a
UB
567 else if (vendor == signature_CENTAUR_ebx)
568 {
569 if (arch)
570 {
af0e415b 571 switch (family)
19db293a 572 {
af0e415b 573 case 6:
19db293a
UB
574 if (model > 9)
575 /* Use the default detection procedure. */
576 processor = PROCESSOR_GENERIC32;
577 else if (model == 9)
578 cpu = "c3-2";
579 else if (model >= 6)
580 cpu = "c3";
581 else
19db293a 582 processor = PROCESSOR_GENERIC32;
af0e415b
UB
583 break;
584 case 5:
585 if (has_3dnow)
586 cpu = "winchip2";
587 else if (has_mmx)
588 cpu = "winchip2-c6";
589 else
590 processor = PROCESSOR_GENERIC32;
591 break;
592 default:
593 /* We have no idea. */
594 processor = PROCESSOR_GENERIC32;
19db293a 595 }
19db293a
UB
596 }
597 }
fa959ce4
MM
598 else
599 {
edccdcb1
L
600 switch (family)
601 {
b3172cab
UB
602 case 4:
603 processor = PROCESSOR_I486;
604 break;
edccdcb1 605 case 5:
b3172cab 606 processor = PROCESSOR_PENTIUM;
edccdcb1
L
607 break;
608 case 6:
609 processor = PROCESSOR_PENTIUMPRO;
610 break;
611 case 15:
612 processor = PROCESSOR_PENTIUM4;
613 break;
614 default:
b3172cab
UB
615 /* We have no idea. */
616 processor = PROCESSOR_GENERIC32;
edccdcb1
L
617 }
618 }
619
620 switch (processor)
621 {
622 case PROCESSOR_I386:
b3172cab 623 /* Default. */
edccdcb1
L
624 break;
625 case PROCESSOR_I486:
626 cpu = "i486";
627 break;
628 case PROCESSOR_PENTIUM:
b3172cab 629 if (arch && has_mmx)
edccdcb1
L
630 cpu = "pentium-mmx";
631 else
632 cpu = "pentium";
633 break;
634 case PROCESSOR_PENTIUMPRO:
44f276c6 635 switch (model)
edccdcb1 636 {
44f276c6
L
637 case 0x1c:
638 case 0x26:
639 /* Atom. */
640 cpu = "atom";
641 break;
642 case 0x1a:
643 case 0x1e:
644 case 0x1f:
645 case 0x2e:
eefe143b
L
646 /* Nehalem. */
647 cpu = "corei7";
44f276c6
L
648 break;
649 case 0x25:
12bbb78f 650 case 0x2c:
44f276c6 651 case 0x2f:
eefe143b
L
652 /* Westmere. */
653 cpu = "corei7";
44f276c6 654 break;
35758e5b 655 case 0x2a:
815cecbe 656 case 0x2d:
35758e5b
L
657 /* Sandy Bridge. */
658 cpu = "corei7-avx";
659 break;
44f276c6
L
660 case 0x17:
661 case 0x1d:
eefe143b 662 /* Penryn. */
44f276c6
L
663 cpu = "core2";
664 break;
665 case 0x0f:
eefe143b 666 /* Merom. */
44f276c6
L
667 cpu = "core2";
668 break;
669 default:
670 if (arch)
671 {
4ffae7ff
L
672 /* This is unknown family 0x6 CPU. */
673 if (has_avx)
674 /* Assume Sandy Bridge. */
675 cpu = "corei7-avx";
676 else if (has_sse4_2)
677 /* Assume Core i7. */
678 cpu = "corei7";
679 else if (has_ssse3)
680 {
681 if (has_movbe)
682 /* Assume Atom. */
683 cpu = "atom";
684 else
685 /* Assume Core 2. */
686 cpu = "core2";
687 }
44f276c6
L
688 else if (has_sse3)
689 /* It is Core Duo. */
690 cpu = "pentium-m";
691 else if (has_sse2)
692 /* It is Pentium M. */
693 cpu = "pentium-m";
694 else if (has_sse)
695 /* It is Pentium III. */
696 cpu = "pentium3";
697 else if (has_mmx)
698 /* It is Pentium II. */
699 cpu = "pentium2";
700 else
701 /* Default to Pentium Pro. */
702 cpu = "pentiumpro";
703 }
b3172cab 704 else
44f276c6
L
705 /* For -mtune, we default to -mtune=generic. */
706 cpu = "generic";
707 break;
fa959ce4 708 }
b3172cab
UB
709 break;
710 case PROCESSOR_PENTIUM4:
711 if (has_sse3)
fa959ce4 712 {
b3172cab
UB
713 if (has_longmode)
714 cpu = "nocona";
fa959ce4 715 else
b3172cab 716 cpu = "prescott";
fa959ce4 717 }
b3172cab
UB
718 else
719 cpu = "pentium4";
edccdcb1
L
720 break;
721 case PROCESSOR_GEODE:
722 cpu = "geode";
723 break;
724 case PROCESSOR_K6:
b3172cab
UB
725 if (arch && has_3dnow)
726 cpu = "k6-3";
edccdcb1
L
727 else
728 cpu = "k6";
729 break;
730 case PROCESSOR_ATHLON:
b3172cab 731 if (arch && has_sse)
edccdcb1
L
732 cpu = "athlon-4";
733 else
734 cpu = "athlon";
735 break;
edccdcb1 736 case PROCESSOR_K8:
b3172cab
UB
737 if (arch && has_sse3)
738 cpu = "k8-sse3";
739 else
740 cpu = "k8";
edccdcb1 741 break;
35a63f21
DR
742 case PROCESSOR_AMDFAM10:
743 cpu = "amdfam10";
744 break;
1133125e
HJ
745 case PROCESSOR_BDVER1:
746 cpu = "bdver1";
747 break;
4d652a18
HJ
748 case PROCESSOR_BDVER2:
749 cpu = "bdver2";
750 break;
eb2f2b44
GG
751 case PROCESSOR_BDVER3:
752 cpu = "bdver3";
753 break;
14b52538
CF
754 case PROCESSOR_BTVER1:
755 cpu = "btver1";
756 break;
e32bfc16
VK
757 case PROCESSOR_BTVER2:
758 cpu = "btver2";
759 break;
b3172cab 760
edccdcb1 761 default:
b3172cab
UB
762 /* Use something reasonable. */
763 if (arch)
764 {
765 if (has_ssse3)
766 cpu = "core2";
767 else if (has_sse3)
768 {
769 if (has_longmode)
770 cpu = "nocona";
771 else
772 cpu = "prescott";
773 }
774 else if (has_sse2)
775 cpu = "pentium4";
776 else if (has_cmov)
777 cpu = "pentiumpro";
778 else if (has_mmx)
779 cpu = "pentium-mmx";
780 else if (has_cmpxchg8b)
781 cpu = "pentium";
782 }
783 else
784 cpu = "generic";
fa959ce4
MM
785 }
786
5be6cb59
UB
787 if (arch)
788 {
11c2aa39
UB
789 const char *mmx = has_mmx ? " -mmmx" : " -mno-mmx";
790 const char *mmx3dnow = has_3dnow ? " -m3dnow" : " -mno-3dnow";
791 const char *sse = has_sse ? " -msse" : " -mno-sse";
792 const char *sse2 = has_sse2 ? " -msse2" : " -mno-sse2";
793 const char *sse3 = has_sse3 ? " -msse3" : " -mno-sse3";
794 const char *ssse3 = has_ssse3 ? " -mssse3" : " -mno-ssse3";
795 const char *sse4a = has_sse4a ? " -msse4a" : " -mno-sse4a";
5eed4f27
L
796 const char *cx16 = has_cmpxchg16b ? " -mcx16" : " -mno-cx16";
797 const char *sahf = has_lahf_lm ? " -msahf" : " -mno-sahf";
798 const char *movbe = has_movbe ? " -mmovbe" : " -mno-movbe";
11c2aa39 799 const char *aes = has_aes ? " -maes" : " -mno-aes";
5eed4f27
L
800 const char *pclmul = has_pclmul ? " -mpclmul" : " -mno-pclmul";
801 const char *popcnt = has_popcnt ? " -mpopcnt" : " -mno-popcnt";
802 const char *abm = has_abm ? " -mabm" : " -mno-abm";
803 const char *lwp = has_lwp ? " -mlwp" : " -mno-lwp";
804 const char *fma = has_fma ? " -mfma" : " -mno-fma";
805 const char *fma4 = has_fma4 ? " -mfma4" : " -mno-fma4";
806 const char *xop = has_xop ? " -mxop" : " -mno-xop";
807 const char *bmi = has_bmi ? " -mbmi" : " -mno-bmi";
82feeb8d 808 const char *bmi2 = has_bmi2 ? " -mbmi2" : " -mno-bmi2";
5eed4f27
L
809 const char *tbm = has_tbm ? " -mtbm" : " -mno-tbm";
810 const char *avx = has_avx ? " -mavx" : " -mno-avx";
7afac110 811 const char *avx2 = has_avx2 ? " -mavx2" : " -mno-avx2";
642a011d 812 const char *sse4_2 = has_sse4_2 ? " -msse4.2" : " -mno-sse4.2";
5eed4f27 813 const char *sse4_1 = has_sse4_1 ? " -msse4.1" : " -mno-sse4.1";
3ed2c643 814 const char *lzcnt = has_lzcnt ? " -mlzcnt" : " -mno-lzcnt";
38d7f26e 815 const char *hle = has_hle ? " -mhle" : " -mno-hle";
76a02e42 816 const char *rtm = has_rtm ? " -mrtm" : " -mno-rtm";
d1925759
L
817 const char *rdrnd = has_rdrnd ? " -mrdrnd" : " -mno-rdrnd";
818 const char *f16c = has_f16c ? " -mf16c" : " -mno-f16c";
819 const char *fsgsbase = has_fsgsbase ? " -mfsgsbase" : " -mno-fsgsbase";
4c340b5d 820 const char *rdseed = has_rdseed ? " -mrdseed" : " -mno-rdseed";
e61c94dd 821 const char *prfchw = has_prfchw ? " -mprfchw" : " -mno-prfchw";
d05e383b 822 const char *adx = has_adx ? " -madx" : " -mno-adx";
3a0d99bb
AI
823 const char *fxsr = has_fxsr ? " -mfxsr" : " -mno-fxsr";
824 const char *xsave = has_xsave ? " -mxsave" : " -mno-xsave";
825 const char *xsaveopt = has_xsaveopt ? " -mxsaveopt" : " -mno-xsaveopt";
5eed4f27 826
11c2aa39
UB
827 options = concat (options, mmx, mmx3dnow, sse, sse2, sse3, ssse3,
828 sse4a, cx16, sahf, movbe, aes, pclmul,
82feeb8d 829 popcnt, abm, lwp, fma, fma4, xop, bmi, bmi2,
76a02e42 830 tbm, avx, avx2, sse4_2, sse4_1, lzcnt, rtm,
3a0d99bb
AI
831 hle, rdrnd, f16c, fsgsbase, rdseed, prfchw, adx,
832 fxsr, xsave, xsaveopt, NULL);
5be6cb59
UB
833 }
834
fa959ce4 835done:
f3afc8a7 836 return concat (cache, "-m", argv[0], "=", cpu, options, NULL);
fa959ce4
MM
837}
838#else
b3172cab 839
f3afc8a7
UB
840/* If we aren't compiling with GCC then the driver will just ignore
841 -march and -mtune "native" target and will leave to the newly
842 built compiler to generate code for its default target. */
b3172cab 843
f3afc8a7
UB
844const char *host_detect_local_cpu (int argc ATTRIBUTE_UNUSED,
845 const char **argv ATTRIBUTE_UNUSED)
fa959ce4 846{
f3afc8a7 847 return NULL;
fa959ce4 848}
a6ecb05c 849#endif /* __GNUC__ */