glibc/sysdeps/ieee754/ldbl-128
Joseph Myers 90ab295a9e Fix sysdeps/ieee754 pow handling of sNaN arguments (bug 20916).
Various pow function implementations mishandle sNaN arguments in
various ways.  This includes returning sNaN instead of qNaN for sNaN
arguments.  For arguments (1, sNaN) and (sNaN, 0), TS 18661-1
semantics are also that the result should be qNaN, whereas with a qNaN
argument there the result should be 1, but for the dbl-64
implementation of pow there are issues with sNaN arguments beyond not
implementing the TS 18661-1 semantics in those special cases.

This patch makes the implementations in sysdeps/ieee754 follow the TS
18661-1 semantics consistently.  Because x86 / x86_64 implementations
still need fixing, testcases are not included with this patch; they
will be included with the fix for the x86 / x86_64 versions.

Tested for x86_64, x86, mips64 and powerpc (with such testcases, which
pass in the mips64 and powerpc cases).

	[BZ #20916]
	* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Do not return 1
	for arguments (sNaN, 0) or (1, sNaN).  Do arithmetic on NaN
	arguments to compute result.
	* sysdeps/ieee754/flt-32/e_powf.c (__ieee754_powf): Do not return
	1 for arguments (sNaN, 0) or (1, sNaN).
	* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
2016-12-02 23:21:15 +00:00
..
e_acoshl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_acosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_asinl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_atan2l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_atanhl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_coshl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_exp10l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_expl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_fmodl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
e_gammal_r.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_hypotl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_ilogbl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
e_j0l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_j1l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_jnl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_lgammal_r.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_log2l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_log10l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_logl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_powl.c Fix sysdeps/ieee754 pow handling of sNaN arguments (bug 20916). 2016-12-02 23:21:15 +00:00
e_rem_pio2l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_remainderl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
e_sinhl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
gamma_productl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
ieee754.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
k_cosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
k_sincosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
k_sinl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
k_tanl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
ldbl2mpn.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
lgamma_negl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
lgamma_productl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
Makefile * sysdeps/ieee754/ldbl-128/Makefile: New file. 2007-03-14 17:36:18 +00:00
math_ldbl.h ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
mpn2ldbl.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
printf_fphex.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_asinhl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_atanl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_cbrtl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_ceill.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_copysignl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_cosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_erfl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_expm1l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_fabsl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_finitel.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_floorl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_fma.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_fmal.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_fpclassifyl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_frexpl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_getpayloadl.c Make ldbl-128 getpayload, setpayload functions use _Float128. 2016-12-01 23:23:51 +00:00
s_isinfl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_isnanl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_issignalingl.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_llrintl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_llroundl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_log1pl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_logbl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_lrintl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_lroundl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_modfl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_nearbyintl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_nextafterl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_nexttoward.c Make nextafter, nexttoward set errno (bug 6799). 2015-11-02 18:54:19 +00:00
s_nexttowardf.c Make nextafter, nexttoward set errno (bug 6799). 2015-11-02 18:54:19 +00:00
s_nextupl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_remquol.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_rintl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_roundl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_scalblnl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_scalbnl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_setpayloadl_main.c Make ldbl-128 getpayload, setpayload functions use _Float128. 2016-12-01 23:23:51 +00:00
s_setpayloadl.c Add setpayload, setpayloadf, setpayloadl. 2016-11-19 00:16:28 +00:00
s_setpayloadsigl.c Add setpayloadsig, setpayloadsigf, setpayloadsigl. 2016-11-24 23:56:48 +00:00
s_signbitl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
s_sincosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_sinl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_tanhl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_tanl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
s_totalorderl.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_totalordermagl.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_truncl.c ldbl-128: Rename 'long double' to '_Float128' 2016-08-31 10:38:11 -05:00
strtod_nan_ldouble.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
strtold_l.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
t_expl.h ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
t_sincosl.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00
w_expl.c This patch renames all uses of __isinf*, __isnan*, __finite* and __signbit* to use standard C99 macros. This has no effect on generated code. 2015-06-03 15:41:36 +01:00
x2y2m1l.c ldbl-128: Use L(x) macro for long double constants 2016-09-13 15:33:59 -05:00