[PATCH] Add a barrier in the double fma implementation

Aurelien Jarno aurelien@aurel32.net
Wed Feb 15 19:46:00 GMT 2012


Starting with version 4.6, GCC started to reorder instructions in 
the double fma implementation, leading to wrong results in some cases,
at least on MIPS (detected by test-double and test-idouble).

The patch below applies the same strategy than in commit 7c08a05c, 
adding a barrier between the computation and the FP exception test.


2012-02-15  Aurelien Jarno  <aurelien@aurel32.net>

       * sysdeps/ieee754/dbl-64/s_fma.c (__fma): Ensure a1 + u.d
       computation is not scheduled after fetestexcept.

---
 sysdeps/ieee754/dbl-64/s_fma.c |    2 ++
 1 file changed, 2 insertions(+)

--- a/sysdeps/ieee754/dbl-64/s_fma.c
+++ b/sysdeps/ieee754/dbl-64/s_fma.c
@@ -174,6 +174,8 @@
       if ((u.ieee.mantissa1 & 1) == 0)
 	u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0;
       v.d = a1 + u.d;
+      /* Ensure the addition is not scheduled after fetestexcept call.  */
+      asm volatile ("" : : "m" (v));
       int j = libc_fetestexcept (FE_INEXACT) != 0;
       libc_feupdateenv (&env);
       /* Ensure the following computations are performed in default rounding

-- 
Aurelien Jarno	                        GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net



More information about the Libc-alpha mailing list