diff options
author | David Schultz <das@FreeBSD.org> | 2005-03-05 20:34:45 +0000 |
---|---|---|
committer | David Schultz <das@FreeBSD.org> | 2005-03-05 20:34:45 +0000 |
commit | f4a564300518cf7a60557c4b7e680ab9a086a83b (patch) | |
tree | 8c2afc0654fec0a65cb52419b675e5d0aac281d3 | |
parent | 494f3ca1827d04ed83305a44a506f31ffddd5179 (diff) |
Work around a gcc bug. This fixes feholdexcept() et al. at -O1.
Symptoms of the problem included assembler warnings and
nondeterministic runtime behavior when a fe*() call that affects the
fpsr is closely followed by a float point op.
The bug (at least, I think it's a bug) is that gcc does not insert a
break between a volatile asm and a dependent instruction if the
volatile asm came from an inlined function. Volatile asms seem to be
fine in other circumstances, even without -mvolatile-asm-stop, so
perhaps the compiler adds the stop bits before inlining takes place.
The problem does not occur at -O0 because inlining is disabled, and it
doesn't happen at -O2 because -fschedule-insns2 knows better.
Notes
Notes:
svn path=/head/; revision=143165
-rw-r--r-- | lib/msun/ia64/fenv.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/msun/ia64/fenv.h b/lib/msun/ia64/fenv.h index f1415f1bf7f9..98992b189176 100644 --- a/lib/msun/ia64/fenv.h +++ b/lib/msun/ia64/fenv.h @@ -61,7 +61,7 @@ extern const fenv_t __fe_dfl_env; #define _FPUSW_SHIFT 13 #define __stfpsr(__r) __asm __volatile("mov %0=ar.fpsr" : "=r" (*(__r))) -#define __ldfpsr(__r) __asm __volatile("mov ar.fpsr=%0" : : "r" (__r)) +#define __ldfpsr(__r) __asm __volatile("mov ar.fpsr=%0;;" : : "r" (__r)) static __inline int feclearexcept(int __excepts) |