Mercurial > hg > CbC > CbC_gcc
diff gcc/config/i386/driver-i386.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/config/i386/driver-i386.c Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/config/i386/driver-i386.c Mon May 24 12:47:05 2010 +0900 @@ -264,7 +264,8 @@ }; static void -detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2) +detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2, + struct cache_desc *level3) { struct cache_desc *cache; @@ -289,6 +290,9 @@ case 2: cache = level2; break; + case 3: + cache = level3; + break; default: cache = NULL; } @@ -303,7 +307,7 @@ cache->sizekb = (cache->assoc * part * cache->line * sets) / 1024; - } + } } default: break; @@ -314,12 +318,13 @@ /* Returns the description of caches for an Intel processor. */ static const char * -detect_caches_intel (bool xeon_mp, unsigned max_level, unsigned max_ext_level) +detect_caches_intel (bool xeon_mp, unsigned max_level, + unsigned max_ext_level, unsigned *l2sizekb) { - struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}; + struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}, level3 = {0, 0, 0}; if (max_level >= 4) - detect_caches_cpuid4 (&level1, &level2); + detect_caches_cpuid4 (&level1, &level2, &level3); else if (max_level >= 2) detect_caches_cpuid2 (xeon_mp, &level1, &level2); else @@ -328,11 +333,18 @@ if (level1.sizekb == 0) return ""; + /* Let the L3 replace the L2. This assumes inclusive caches + and single threaded program for now. */ + if (level3.sizekb) + level2 = level3; + /* Intel CPUs are equipped with AMD style L2 cache info. Try this method if other methods fail to provide L2 cache parameters. */ if (level2.sizekb == 0 && max_ext_level >= 0x80000006) detect_l2_cache (&level2); + *l2sizekb = level2.sizekb; + return describe_cache (level1, level2); } @@ -384,9 +396,12 @@ unsigned int has_movbe = 0, has_sse4_1 = 0, has_sse4_2 = 0; unsigned int has_popcnt = 0, has_aes = 0, has_avx = 0; unsigned int has_pclmul = 0, has_abm = 0, has_lwp = 0; + unsigned int has_fma4 = 0, has_xop = 0; bool arch; + unsigned int l2sizekb = 0; + if (argc < 1) return NULL; @@ -446,6 +461,8 @@ has_sse4a = ecx & bit_SSE4a; has_abm = ecx & bit_ABM; has_lwp = ecx & bit_LWP; + has_fma4 = ecx & bit_FMA4; + has_xop = ecx & bit_XOP; has_longmode = edx & bit_LM; has_3dnowp = edx & bit_3DNOWP; @@ -459,7 +476,8 @@ else if (vendor == SIG_INTEL) { bool xeon_mp = (family == 15 && model == 6); - cache = detect_caches_intel (xeon_mp, max_level, ext_level); + cache = detect_caches_intel (xeon_mp, max_level, + ext_level, &l2sizekb); } } @@ -475,6 +493,8 @@ if (name == SIG_GEODE) processor = PROCESSOR_GEODE; + else if (has_xop) + processor = PROCESSOR_BDVER1; else if (has_sse4a) processor = PROCESSOR_AMDFAM10; else if (has_sse2 || has_longmode) @@ -523,30 +543,61 @@ cpu = "pentium"; break; case PROCESSOR_PENTIUMPRO: - if (has_longmode) - /* It is Core 2 or Atom. */ - cpu = (model == 28) ? "atom" : "core2"; - else if (arch) + switch (model) { - if (has_sse3) - /* It is Core Duo. */ - cpu = "prescott"; - else if (has_sse2) - /* It is Pentium M. */ - cpu = "pentium-m"; - else if (has_sse) - /* It is Pentium III. */ - cpu = "pentium3"; - else if (has_mmx) - /* It is Pentium II. */ - cpu = "pentium2"; + case 0x1c: + case 0x26: + /* Atom. */ + cpu = "atom"; + break; + case 0x1a: + case 0x1e: + case 0x1f: + case 0x2e: + /* FIXME: Optimize for Nehalem. */ + cpu = "core2"; + break; + case 0x25: + case 0x2f: + /* FIXME: Optimize for Westmere. */ + cpu = "core2"; + break; + case 0x17: + case 0x1d: + /* Penryn. FIXME: -mtune=core2 is slower than -mtune=generic */ + cpu = "core2"; + break; + case 0x0f: + /* Merom. FIXME: -mtune=core2 is slower than -mtune=generic */ + cpu = "core2"; + break; + default: + if (arch) + { + if (has_ssse3) + /* If it is an unknown CPU with SSSE3, assume Core 2. */ + cpu = "core2"; + else if (has_sse3) + /* It is Core Duo. */ + cpu = "pentium-m"; + else if (has_sse2) + /* It is Pentium M. */ + cpu = "pentium-m"; + else if (has_sse) + /* It is Pentium III. */ + cpu = "pentium3"; + else if (has_mmx) + /* It is Pentium II. */ + cpu = "pentium2"; + else + /* Default to Pentium Pro. */ + cpu = "pentiumpro"; + } else - /* Default to Pentium Pro. */ - cpu = "pentiumpro"; + /* For -mtune, we default to -mtune=generic. */ + cpu = "generic"; + break; } - else - /* For -mtune, we default to -mtune=generic. */ - cpu = "generic"; break; case PROCESSOR_PENTIUM4: if (has_sse3) @@ -583,6 +634,9 @@ case PROCESSOR_AMDFAM10: cpu = "amdfam10"; break; + case PROCESSOR_BDVER1: + cpu = "bdver1"; + break; default: /* Use something reasonable. */ @@ -628,6 +682,10 @@ options = concat (options, " -mabm", NULL); if (has_lwp) options = concat (options, " -mlwp", NULL); + if (has_fma4) + options = concat (options, " -mfma4", NULL); + if (has_xop) + options = concat (options, " -mxop", NULL); if (has_avx) options = concat (options, " -mavx", NULL);