re PR target/23360 (-ffast-math startup broken on i686 (maybe Athlon-xp))

2005-08-14  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/23360
	* config/i386/crtfastmath.c (set_fast_math): Check if DAZ is
	available for setting it.

From-SVN: r103078
This commit is contained in:
H.J. Lu 2005-08-14 14:26:51 +00:00 committed by H.J. Lu
parent 1f400bbb8f
commit adb7b76436
2 changed files with 48 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2005-08-14 H.J. Lu <hongjiu.lu@intel.com>
PR target/23360
* config/i386/crtfastmath.c (set_fast_math): Check if DAZ is
available for setting it.
2005-08-14 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/23320

View File

@ -34,11 +34,15 @@
#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)
static void __attribute__((constructor))
set_fast_math (void)
{
#ifndef __x86_64__
/* SSE is the part of 64bit. Only need to check it for 32bit. */
/* 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. */
@ -62,11 +66,45 @@ set_fast_math (void)
: "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
: "0" (1));
if (edx & (1 << 25))
#endif
if (edx & SSE)
{
unsigned int mxcsr = __builtin_ia32_stmxcsr ();
mxcsr |= MXCSR_DAZ | MXCSR_FTZ;
mxcsr |= MXCSR_FTZ;
if (edx & FXSAVE)
{
/* Check if DAZ is available. */
struct
{
unsigned short int cwd;
unsigned short int swd;
unsigned short int twd;
unsigned short int fop;
long int fip;
long int fcs;
long int foo;
long int fos;
long int mxcsr;
long int mxcsr_mask;
long int st_space[32];
long int xmm_space[32];
long int padding[56];
} __attribute__ ((aligned (16))) fxsave;
__builtin_memset (&fxsave, 0, sizeof (fxsave));
asm volatile ("fxsave %0" : : "m" (fxsave));
if (fxsave.mxcsr_mask & MXCSR_DAZ)
mxcsr |= MXCSR_DAZ;
}
__builtin_ia32_ldmxcsr (mxcsr);
}
#else
unsigned int mxcsr = __builtin_ia32_stmxcsr ();
mxcsr |= MXCSR_DAZ | MXCSR_FTZ;
__builtin_ia32_ldmxcsr (mxcsr);
#endif
}