summaryrefslogtreecommitdiffstats
path: root/lib/msun
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2005-03-05 20:34:45 +0000
committerdas <das@FreeBSD.org>2005-03-05 20:34:45 +0000
commit062f662fe278c9446b719d13d73d55acefeb1ff3 (patch)
tree8c2afc0654fec0a65cb52419b675e5d0aac281d3 /lib/msun
parent9f6d0603853138731f15e3874369b807e66f2f16 (diff)
downloadFreeBSD-src-062f662fe278c9446b719d13d73d55acefeb1ff3.zip
FreeBSD-src-062f662fe278c9446b719d13d73d55acefeb1ff3.tar.gz
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.
Diffstat (limited to 'lib/msun')
-rw-r--r--lib/msun/ia64/fenv.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/msun/ia64/fenv.h b/lib/msun/ia64/fenv.h
index f1415f1..98992b1 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)
OpenPOWER on IntegriCloud