This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix build of driver-i386.o with GCC <= 2.95.x host compiler (PR target/35239)


Hi!

As has been discussed already, the following patch duplicates __cpuid
and __get_cpuid_max 32-bit inline asm for host GCC < 3.  Haven't managed to
fully bootstrap with egcs 1.1.2 as bootstrap compiler, it segfaulted on
something in glibc headers, so just verified that driver-i386.o alone can't
be compiled with egcs 1.1.2 without the patch, can be with the patch,
it properly detects the CPU with -march=native resp. -mtune=native (in
-fverbose-asm comments) and that when recent gcc is used to compile
driver-i386.c, the same assembly is generated for -m32 -O2 and -m32 -O2 -U__GNUC__ -D__GNUC__=2
and similarly for -m32 -fpic -O2 and -m32 -fpic -O2 -U__GNUC__ -D__GNUC__=2

Ok for trunk/4.3?

2008-02-19  Jakub Jelinek  <jakub@redhat.com>

	PR target/35239
	* config/i386/cpuid.h (__cpuid, __get_cpuid_max): Use special
	32-bit inline asm without asm alternatives for host GCC < 3.0.

--- gcc/config/i386/cpuid.h.jj	2008-02-18 23:45:48.000000000 +0100
+++ gcc/config/i386/cpuid.h	2008-02-19 13:43:57.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Free Software Foundation, Inc.
+ * Copyright (C) 2007, 2008 Free Software Foundation, Inc.
  *
  * This file is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -61,6 +61,7 @@
 
 #if defined(__i386__) && defined(__PIC__)
 /* %ebx may be the PIC register.  */
+#if __GNUC__ >= 3
 #define __cpuid(level, a, b, c, d)			\
   __asm__ ("xchg{l}\t{%%}ebx, %1\n\t"			\
 	   "cpuid\n\t"					\
@@ -68,6 +69,16 @@
 	   : "=a" (a), "=r" (b), "=c" (c), "=d" (d)	\
 	   : "0" (level))
 #else
+/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
+   nor alternatives in i386 code.  */
+#define __cpuid(level, a, b, c, d)			\
+  __asm__ ("xchgl\t%%ebx, %1\n\t"			\
+	   "cpuid\n\t"					\
+	   "xchgl\t%%ebx, %1\n\t"			\
+	   : "=a" (a), "=r" (b), "=c" (c), "=d" (d)	\
+	   : "0" (level))
+#endif
+#else
 #define __cpuid(level, a, b, c, d)			\
   __asm__ ("cpuid\n\t"					\
 	   : "=a" (a), "=b" (b), "=c" (c), "=d" (d)	\
@@ -87,6 +98,7 @@ __get_cpuid_max (unsigned int __ext, uns
   unsigned int __eax, __ebx, __ecx, __edx;
 
 #ifndef __x86_64__
+#if __GNUC__ >= 3
   /* See if we can use cpuid.  On AMD64 we always can.  */
   __asm__ ("pushf{l|d}\n\t"
 	   "pushf{l|d}\n\t"
@@ -100,6 +112,22 @@ __get_cpuid_max (unsigned int __ext, uns
 	   "popf{l|d}\n\t"
 	   : "=&r" (__eax), "=&r" (__ebx)
 	   : "i" (0x00200000));
+#else
+/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
+   nor alternatives in i386 code.  */
+  __asm__ ("pushfl\n\t"
+	   "pushfl\n\t"
+	   "popl\t%0\n\t"
+	   "movl\t%0, %1\n\t"
+	   "xorl\t%2, %0\n\t"
+	   "pushl\t%0\n\t"
+	   "popfl\n\t"
+	   "pushfl\n\t"
+	   "popl\t%0\n\t"
+	   "popfl\n\t"
+	   : "=&r" (__eax), "=&r" (__ebx)
+	   : "i" (0x00200000));
+#endif
 
   if (!((__eax ^ __ebx) & 0x00200000))
     return 0;

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]