This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add a barrier in the double fma implementation


On Thu, 16 Feb 2012, Aurelien Jarno wrote:

> 2012-02-16  Aurelien Jarno  <aurelien@aurel32.net>
> 
>        * sysdeps/ieee754/dbl-64/s_fma.c (__fma): Ensure a1 + u.d
>        computation is not scheduled after fetestexcept.

Aurelien, it appears your patch
<http://sourceware.org/ml/libc-alpha/2012-02/msg00323.html> didn't get
reviewed; if a patch isn't reviewed within a week or so you should
ping it, and keep pinging it until reviewed.

I think the change is good and in line with another version of the
code.  I've applied this version that also updates other fma functions
where they appear to have the same issue (arithmetic, followed by
testing exceptions, with the exception test before anything examines
the bits of the result of the arithmetic).

Tested x86_64 and mips64.

2012-06-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/ieee754/dbl-64/s_fmaf.c (__fmaf): Ensure temp + (double)
	z computation is not scheduled after fetestexcept.
	* sysdeps/ieee754/ldbl-128/s_fmal.c: Include <math_private.h>.
	Use math_force_eval instead of asm to ensure calculation scheduled
	before exception test.
	* sysdeps/ieee754/ldbl-96/s_fmal.c: Include <math_private.h>.
	Ensure a1 + u.d computation is not scheduled after fetestexcept.

2012-06-01  Aurelien Jarno  <aurelien@aurel32.net>

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

diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c
index ab20a80..ce3bd36 100644
--- a/sysdeps/ieee754/dbl-64/s_fma.c
+++ b/sysdeps/ieee754/dbl-64/s_fma.c
@@ -1,5 +1,5 @@
 /* Compute x * y + z as ternary operation.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2010.
 
@@ -158,6 +158,8 @@ __fma (double x, double y, double z)
       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.  */
+      math_force_eval (v.d);
     }
 
   /* Reset rounding mode and test for inexact simultaneously.  */
diff --git a/sysdeps/ieee754/dbl-64/s_fmaf.c b/sysdeps/ieee754/dbl-64/s_fmaf.c
index 7a939aa..e7a0650 100644
--- a/sysdeps/ieee754/dbl-64/s_fmaf.c
+++ b/sysdeps/ieee754/dbl-64/s_fmaf.c
@@ -1,5 +1,5 @@
 /* Compute x * y + z as ternary operation.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2010.
 
@@ -40,6 +40,8 @@ __fmaf (float x, float y, float z)
 
   /* Perform addition with round to odd.  */
   u.d = temp + (double) z;
+  /* Ensure the addition is not scheduled after fetestexcept call.  */
+  math_force_eval (u.d);
 
   /* Reset rounding mode and test for inexact simultaneously.  */
   int j = libc_feupdateenv_test (&env, FE_INEXACT) != 0;
diff --git a/sysdeps/ieee754/ldbl-128/s_fmal.c b/sysdeps/ieee754/ldbl-128/s_fmal.c
index 3b85b17..963bbd7 100644
--- a/sysdeps/ieee754/ldbl-128/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-128/s_fmal.c
@@ -1,5 +1,5 @@
 /* Compute x * y + z as ternary operation.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2010.
 
@@ -21,6 +21,7 @@
 #include <math.h>
 #include <fenv.h>
 #include <ieee754.h>
+#include <math_private.h>
 
 /* This implementation uses rounding to odd to avoid problems with
    double rounding.  See a paper by Boldo and Melquiond:
@@ -175,7 +176,7 @@ __fmal (long double x, long double y, long double z)
 	u.ieee.mantissa3 |= fetestexcept (FE_INEXACT) != 0;
       v.d = a1 + u.d;
       /* Ensure the addition is not scheduled after fetestexcept call.  */
-      asm volatile ("" : : "m" (v));
+      math_force_eval (v.d);
       int j = fetestexcept (FE_INEXACT) != 0;
       feupdateenv (&env);
       /* Ensure the following computations are performed in default rounding
diff --git a/sysdeps/ieee754/ldbl-96/s_fmal.c b/sysdeps/ieee754/ldbl-96/s_fmal.c
index 76866fb..ca1e090 100644
--- a/sysdeps/ieee754/ldbl-96/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-96/s_fmal.c
@@ -1,5 +1,5 @@
 /* Compute x * y + z as ternary operation.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2010.
 
@@ -21,6 +21,7 @@
 #include <math.h>
 #include <fenv.h>
 #include <ieee754.h>
+#include <math_private.h>
 
 /* This implementation uses rounding to odd to avoid problems with
    double rounding.  See a paper by Boldo and Melquiond:
@@ -174,6 +175,8 @@ __fmal (long double x, long double y, long double z)
       if ((u.ieee.mantissa1 & 1) == 0)
 	u.ieee.mantissa1 |= fetestexcept (FE_INEXACT) != 0;
       v.d = a1 + u.d;
+      /* Ensure the addition is not scheduled after fetestexcept call.  */
+      math_force_eval (v.d);
       int j = fetestexcept (FE_INEXACT) != 0;
       feupdateenv (&env);
       /* Ensure the following computations are performed in default rounding

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]