From 009223c61e461e0feeeadce85d87b0eb3910f38d Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 14 Jan 2016 12:49:13 -0800
Subject: [PATCH] Call math_opt_barrier inside if
Since floating-point operation may trigger floating-point exceptions,
we call math_opt_barrier inside if to prevent code motion.
[BZ #19465]
* sysdeps/ieee754/dbl-64/s_fma.c (__fma): Call math_opt_barrier
inside if.
* sysdeps/ieee754/ldbl-128/s_fmal.c (__fmal): Likewise.
* sysdeps/ieee754/ldbl-96/s_fma.c (__fma): Likewise.
* sysdeps/ieee754/ldbl-96/s_fmal.c (__fmal): Likewise.
---
sysdeps/ieee754/dbl-64/s_fma.c | 5 ++++-
sysdeps/ieee754/ldbl-128/s_fmal.c | 5 ++++-
sysdeps/ieee754/ldbl-96/s_fma.c | 5 ++++-
sysdeps/ieee754/ldbl-96/s_fmal.c | 5 ++++-
4 files changed, 16 insertions(+), 4 deletions(-)
@@ -175,7 +175,10 @@ __fma (double x, double y, double z)
/* Ensure correct sign of exact 0 + 0. */
if (__glibc_unlikely ((x == 0 || y == 0) && z == 0))
- return x * y + z;
+ {
+ x = math_opt_barrier (x);
+ return x * y + z;
+ }
fenv_t env;
libc_feholdexcept_setround (&env, FE_TONEAREST);
@@ -179,7 +179,10 @@ __fmal (long double x, long double y, long double z)
/* Ensure correct sign of exact 0 + 0. */
if (__glibc_unlikely ((x == 0 || y == 0) && z == 0))
- return x * y + z;
+ {
+ x = math_opt_barrier (x);
+ return x * y + z;
+ }
fenv_t env;
feholdexcept (&env);
@@ -41,7 +41,10 @@ __fma (double x, double y, double z)
/* Ensure correct sign of exact 0 + 0. */
if (__glibc_unlikely ((x == 0 || y == 0) && z == 0))
- return x * y + z;
+ {
+ x = math_opt_barrier (x);
+ return x * y + z;
+ }
fenv_t env;
feholdexcept (&env);
@@ -177,7 +177,10 @@ __fmal (long double x, long double y, long double z)
/* Ensure correct sign of exact 0 + 0. */
if (__glibc_unlikely ((x == 0 || y == 0) && z == 0))
- return x * y + z;
+ {
+ x = math_opt_barrier (x);
+ return x * y + z;
+ }
fenv_t env;
feholdexcept (&env);
--
2.5.0