OSDN Git Service

* configure.ac (i[34567]86-*-*): Handle Solaris 2/x86 TLS support
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / crtfastmath.c
index 08ddaff..1c1ce2c 100644 (file)
@@ -1,45 +1,38 @@
 /*
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005, 2007, 2009 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
- * Free Software Foundation; either version 2, or (at your option) any
+ * Free Software Foundation; either version 3, or (at your option) any
  * later version.
  * 
- * In addition to the permissions in the GNU General Public License, the
- * Free Software Foundation gives you unlimited permission to link the
- * compiled version of this file with other programs, and to distribute
- * those programs without any restriction coming from the use of this
- * file.  (The General Public License restrictions do apply in other
- * respects; for example, they cover modification of the file, and
- * distribution when not linked into another program.)
- * 
  * This file is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- * 
- *    As a special exception, if you link this library with files
- *    compiled with GCC to produce an executable, this does not cause
- *    the resulting executable to be covered by the GNU General Public License.
- *    This exception does not however invalidate any other reasons why
- *    the executable file might be covered by the GNU General Public License.
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
  */
 
 #define MXCSR_DAZ (1 << 6)     /* Enable denormals are zero mode */
 #define MXCSR_FTZ (1 << 15)    /* Enable flush to zero mode */
 
-#define FXSAVE (1 << 24)
-#define SSE    (1 << 25)
+#ifndef __x86_64__
+/* All 64-bit targets have SSE and DAZ;
+   only check them explicitly for 32-bit ones. */
+#include "cpuid.h"
+#endif
 
 static void __attribute__((constructor))
 #ifndef __x86_64__
-/* The i386 ABI only requires 4-byte stack alignment, so this is neccessary
+/* The i386 ABI only requires 4-byte stack alignment, so this is necessary
    to make sure the fxsave struct gets correct alignment.
    See PR27537 and PR28621.  */
 __attribute__ ((force_align_arg_pointer))
@@ -47,38 +40,18 @@ __attribute__ ((force_align_arg_pointer))
 set_fast_math (void)
 {
 #ifndef __x86_64__
-  /* All 64-bit targets have SSE and DAZ; only check them explicitly
-     for 32-bit ones. */
   unsigned int eax, ebx, ecx, edx;
 
-  /* See if we can use cpuid.  */
-  asm volatile ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;"
-               "pushl %0; popfl; pushfl; popl %0; popfl"
-               : "=&r" (eax), "=&r" (ebx)
-               : "i" (0x00200000));
-
-  if (((eax ^ ebx) & 0x00200000) == 0)
+  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
     return;
 
-  /* Check the highest input value for eax.  */
-  asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
-               : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
-               : "0" (0));
-
-  if (eax == 0)
-    return;
-
-  asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
-               : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
-               : "0" (1));
-
-  if (edx & SSE)
+  if (edx & bit_SSE)
     {
       unsigned int mxcsr = __builtin_ia32_stmxcsr ();
   
       mxcsr |= MXCSR_FTZ;
 
-      if (edx & FXSAVE)
+      if (edx & bit_FXSAVE)
        {
          /* Check if DAZ is available.  */
          struct