On Fri, Jun 20, 2014 at 2:42 PM, Jakub Jelinek <[email protected]> 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 <[email protected]>
>
> 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,