On Fri, Jun 20, 2014 at 2:42 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> As mentioned in the PR, some? KVM versions disable some CPU flags,
> supposedly so that it can be migrated to any other x86-64 hw.
> Thus, it announces only sse2 and lm, but already not sse3, ssse3
> nor 3dnow, and (unfortunately) identifies itself as GenuineIntel
> family 6 model 13.  There is no 64-bit CPU that actually is the lowest
> common denominator of x86-64 CPUs (AMDs had 3dNOW etc., Intel first
> x86-64 CPUs had already SSSE3).
>
> This patch just makes sure we can use -march=native -m64 on such hosts,
> without that gcc complains that the selected CPU doesn't support 64-bit
> mode, because -march=native gives -march=pentium-m.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk/4.9?
>
> 2014-06-20  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/61570
>         * config/i386/driver-i386.c (host_detect_local_cpu): For unknown
>         model family 6 CPU with has_longmode never use a CPU without
>         64-bit support.
>
> --- gcc/config/i386/driver-i386.c.jj    2014-05-14 14:45:54.000000000 +0200
> +++ gcc/config/i386/driver-i386.c       2014-06-20 18:59:57.805006358 +0200
> @@ -745,6 +745,11 @@ const char *host_detect_local_cpu (int a
>                     /* Assume Core 2.  */
>                     cpu = "core2";
>                 }
> +             else if (has_longmode)
> +               /* Perhaps some emulator?  Assume x86-64, otherwise gcc
> +                  -march=native would be unusable for 64-bit compilations,
> +                  as all the CPUs below are 32-bit only.  */
> +               cpu = "x86-64";
>               else if (has_sse3)
>                 /* It is Core Duo.  */
>                 cpu = "pentium-m";
>
>         Jakub

host_detect_local_cpu guesses the cpu based on the real processors.
It doesn't work with emulators due to some conflicts.  This isn't the
only only place which has the same issue.   I prefer something like
this.

-- 
H.J.
---
diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index 3e8a995..2aada71 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -415,6 +415,7 @@ const char *host_detect_local_cpu (int argc, const
char **argv)
   bool arch;

   unsigned int l2sizekb = 0;
+  unsigned int arch_64bit = 1;

   if (argc < 1)
     return NULL;
@@ -656,11 +657,14 @@ const char *host_detect_local_cpu (int argc,
const char **argv)
     {
     case PROCESSOR_I386:
       /* Default.  */
+      arch_64bit = 0;
       break;
     case PROCESSOR_I486:
+      arch_64bit = 0;
       cpu = "i486";
       break;
     case PROCESSOR_PENTIUM:
+      arch_64bit = 0;
       if (arch && has_mmx)
  cpu = "pentium-mmx";
       else
@@ -745,21 +749,25 @@ const char *host_detect_local_cpu (int argc,
const char **argv)
     /* 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";
+ {
+  arch_64bit = 0;
+  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
     /* For -mtune, we default to -mtune=generic.  */
@@ -773,21 +781,30 @@ const char *host_detect_local_cpu (int argc,
const char **argv)
   if (has_longmode)
     cpu = "nocona";
   else
-    cpu = "prescott";
+    {
+      cpu = "prescott";
+      arch_64bit = 0;
+    }
  }
       else
- cpu = "pentium4";
+ {
+  cpu = "pentium4";
+  arch_64bit = 0;
+ }
       break;
     case PROCESSOR_GEODE:
+      arch_64bit = 0;
       cpu = "geode";
       break;
     case PROCESSOR_K6:
+      arch_64bit = 0;
       if (arch && has_3dnow)
  cpu = "k6-3";
       else
  cpu = "k6";
       break;
     case PROCESSOR_ATHLON:
+      arch_64bit = 0;
       if (arch && has_sse)
  cpu = "athlon-4";
       else
@@ -896,6 +913,9 @@ const char *host_detect_local_cpu (int argc, const
char **argv)
       const char *xsavec = has_xsavec ? " -mxsavec" : " -mno-xsavec";
       const char *xsaves = has_xsaves ? " -mxsaves" : " -mno-xsaves";

+      if (arch_64bit == 0 && has_sse2 && has_longmode)
+ cpu = "x86-64";
+
       options = concat (options, mmx, mmx3dnow, sse, sse2, sse3, ssse3,
  sse4a, cx16, sahf, movbe, aes, sha, pclmul,
  popcnt, abm, lwp, fma, fma4, xop, bmi, bmi2,

Reply via email to