]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix i386 acosh (-qNaN) spurious "invalid" exception.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 30 Sep 2015 21:44:42 +0000 (21:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 30 Sep 2015 21:44:42 +0000 (21:44 +0000)
The i386 versions of acoshf and acosh raise a spurious "invalid"
exception for an argument that is a quiet NaN with the sign bit set.
The integer arithmetic to detect arguments < 1 also detects -NaN, and
then the computation 0 / 0 in that case raises the exception.  This
patch fixes this by using (x - x) / (x - x) as the computation in that
case instead, which will always raise the exception for non-NaN
arguments reaching that code, but not for quiet NaN arguments.

Tested for x86_64 and x86.

[BZ #19032]
* sysdeps/i386/fpu/e_acosh.S (__ieee754_acosh): For arguments < 1,
compute result as (x - x) / (x - x) not as 0 / 0.
* sysdeps/i386/fpu/e_acoshf.S (__ieee754_acoshf): Likewise.
* math/libm-test.inc (acosh_test_data): Add another test of acosh.

ChangeLog
NEWS
math/libm-test.inc
sysdeps/i386/fpu/e_acosh.S
sysdeps/i386/fpu/e_acoshf.S

index ea038f764f37c933f1d97a1d8c1bb26cfbf57f74..958b4a3a9d4be6914714aefb370915b03f15b4c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2015-09-30  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #19032]
+       * sysdeps/i386/fpu/e_acosh.S (__ieee754_acosh): For arguments < 1,
+       compute result as (x - x) / (x - x) not as 0 / 0.
+       * sysdeps/i386/fpu/e_acoshf.S (__ieee754_acoshf): Likewise.
+       * math/libm-test.inc (acosh_test_data): Add another test of acosh.
+
        * math/auto-libm-test-in: Add more tests of acos, acosh, asin,
        atan, atan2, atanh, cbrt, cos, cosh, erf, erfc, exp, exp10, exp2
        and expm1.
diff --git a/NEWS b/NEWS
index ea64dc7c40bfb83bcf58a21e8e7ea94e07324804..e7e11bf987c1082a123cc2759e298cab38e07e65 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,7 +17,7 @@ Version 2.23
   18789, 18790, 18795, 18796, 18803, 18820, 18823, 18824, 18825, 18857,
   18863, 18870, 18872, 18873, 18875, 18887, 18921, 18951, 18952, 18956,
   18961, 18966, 18967, 18969, 18970, 18977, 18980, 18981, 18985, 19003,
-  19016.
+  19016, 19032.
 
 * The obsolete header <regexp.h> has been removed.  Programs that require
   this header must be updated to use <regex.h> instead.
index 744c66dbb155a2429b44f4708bcf4f2dab4f3c48..86159576003b56d0482accb82b2cf999b1be1ca7 100644 (file)
@@ -1790,6 +1790,7 @@ static const struct test_f_f_data acosh_test_data[] =
     TEST_f_f (acosh, plus_infty, plus_infty, ERRNO_UNCHANGED),
     TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (acosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (acosh, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
     /* x < 1:  */
     TEST_f_f (acosh, 0.75L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
index c5cd4474ecdfa1eb3a352a5a488165bb20110a50..263c01a4ed114f6ce903d8e3afc9f846a32b39c2 100644 (file)
@@ -91,9 +91,10 @@ ENTRY(__ieee754_acosh)
        fyl2x                           // log(2*x+1/(x+sqrt(x^2-1)))
        ret
 
-       // x < 1 => NaN
+       // x < 1 (or -NaN) => NaN
        .align ALIGNARG(4)
-5:     fldz
+5:     fldl    4(%esp)
+       fsub    %st
        fdiv    %st, %st(0)
        ret
 END(__ieee754_acosh)
index 710267b11ed9baba8464d18a120410d0a91670cb..779a02cfab181e5f64bdd1f116ad1f71fae6802a 100644 (file)
@@ -91,9 +91,10 @@ ENTRY(__ieee754_acoshf)
        fyl2x                           // log(2*x+1/(x+sqrt(x^2-1)))
        ret
 
-       // x < 1 => NaN
+       // x < 1 (or -NaN) => NaN
        .align ALIGNARG(4)
-5:     fldz
+5:     flds    4(%esp)
+       fsub    %st
        fdiv    %st, %st(0)
        ret
 END(__ieee754_acoshf)