From: Joseph Myers Date: Fri, 27 May 2016 13:59:24 +0000 (+0000) Subject: Fix ldbl-128ibm ceill, rintl etc. for sNaN arguments (bug 20156). X-Git-Tag: glibc-2.24~187 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bba14195895fa612a8ef484e9856127a1be4f80f;p=thirdparty%2Fglibc.git Fix ldbl-128ibm ceill, rintl etc. for sNaN arguments (bug 20156). The ldbl-128ibm implementations of ceill, floorl, roundl, truncl, rintl and nearbyintl wrongly return an sNaN when given an sNaN argument. This patch fixes them to add such an argument to itself to turn it into a quiet NaN. (The code structure means this "else" case applies to any argument which is zero or not finite; it's OK to do this in all such cases.) Tested for powerpc. [BZ #20156] * sysdeps/ieee754/ldbl-128ibm/s_ceill.c (__ceill): Add high part to itself when zero or not finite. * sysdeps/ieee754/ldbl-128ibm/s_floorl.c (__floorl): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_rintl.c (__rintl): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_roundl.c (__roundl): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise. --- diff --git a/ChangeLog b/ChangeLog index 2516304de39..1cf86d74196 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2016-05-27 Joseph Myers + + [BZ #20156] + * sysdeps/ieee754/ldbl-128ibm/s_ceill.c (__ceill): Add high part + to itself when zero or not finite. + * sysdeps/ieee754/ldbl-128ibm/s_floorl.c (__floorl): Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_rintl.c (__rintl): Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_roundl.c (__roundl): Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise. + 2016-05-26 Joseph Myers [BZ #20153] diff --git a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c index 635fddc6332..71f56233f99 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c @@ -52,6 +52,9 @@ __ceill (long double x) ldbl_canonicalize_int (&xh, &xl); } } + else + /* Quiet signaling NaN arguments. */ + xh += xh; return ldbl_pack (xh, xl); } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c index a1469646b04..61ac568c60a 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c @@ -52,6 +52,9 @@ __floorl (long double x) ldbl_canonicalize_int (&xh, &xl); } } + else + /* Quiet signaling NaN arguments. */ + xh += xh; return ldbl_pack (xh, xl); } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c index e4af01c9a0f..f7ff673cebd 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c @@ -119,6 +119,9 @@ __rintl (long double x) fesetround (save_round); #endif } + else + /* Quiet signaling NaN arguments. */ + xh += xh; return ldbl_pack (xh, xl); } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c index b01510fef3b..2d75eb0ca81 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c @@ -77,6 +77,9 @@ __roundl (long double x) ldbl_canonicalize_int (&xh, &xl); } } + else + /* Quiet signaling NaN arguments. */ + xh += xh; return ldbl_pack (xh, xl); } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c index b7d4bb59567..a2c60a89f42 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c @@ -52,6 +52,9 @@ __truncl (long double x) ldbl_canonicalize_int (&xh, &xl); } } + else + /* Quiet signaling NaN arguments. */ + xh += xh; return ldbl_pack (xh, xl); }