Properly detect Atom, Core 2 and Core i7.
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 9 May 2010 14:49:53 +0000 (14:49 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 9 May 2010 14:49:53 +0000 (07:49 -0700)
2010-05-09  H.J. Lu  <hongjiu.lu@intel.com>

PR target/44046
* config/i386/driver-i386.c (host_detect_local_cpu): Properly
detect Atom, Core 2 and Core i7.

From-SVN: r159202

gcc/ChangeLog
gcc/config/i386/driver-i386.c

index bd64d9daec0787d8bc77d082b0380aa13c56e71a..3a9d1f9dd05617b42d2274c14cd83113835c641a 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/44046
+       * config/i386/driver-i386.c (host_detect_local_cpu): Properly
+       detect Atom, Core 2 and Core i7.
+
 2010-05-09  Richard Guenther  <rguenther@suse.de>
 
        * gcc.c (store_arg): Handle temporary file deletion for
index 17694ef37992b4702700a8d53d2a798587d0865d..063279aa629e4e8a9879762732c5cbea817e79f5 100644 (file)
@@ -538,34 +538,61 @@ const char *host_detect_local_cpu (int argc, const char **argv)
        cpu = "pentium";
       break;
     case PROCESSOR_PENTIUMPRO:
-      if (model == 28)
-       cpu = "atom";
-      else if (model >= 28 && l2sizekb < 2048)
-       /* Assume it's a small core if there's less than 2MB cache */
-       cpu = "atom";
-      else if (has_longmode)
-       cpu = "core2";
-      else if (arch)
+      switch (model)
        {
-         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";
+       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)