glibc/sysdeps/ieee754/dbl-64
Joseph Myers 41c67149b9 Add roundeven, roundevenf, roundevenl.
TS 18661-1 defines roundeven functions that round a floating-point
number to the nearest integer, in that floating-point type, with ties
rounding to even (whereas the round functions round ties away from
zero).  As with other such functions, they raise no exceptions apart
from "invalid" for signaling NaNs.  There was a previous user request
for this functionality in glibc in
<https://sourceware.org/ml/libc-help/2015-02/msg00005.html>.

This patch implements these functions for glibc.  The implementations
use integer bit-manipulation (or roundeven on the high and low parts,
in the IBM long double case).  It's possible that there may be faster
approaches on some architectures (in particular, on AArch64 the frintn
instruction should do exactly what's required); I'll leave it to
architecture maintainers or others interested to implement such
architecture-specific versions if desired.  (Where architectures have
instructions to round to nearest integer in the current rounding mode,
implementations saving and restoring the rounding mode - and dealing
with exceptions if those instructions generate "inexact" - are also
possible, though their performance depends on the cost of manipulating
exceptions / rounding mode state.)

Tested for x86_64, x86, mips64 and powerpc.

	* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
	(roundeven): New declaration.
	* math/tgmath.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (roundeven): New
	macro.
	* math/Versions (roundeven): New libm symbol at version
	GLIBC_2.25.
	(roundevenf): Likewise.
	(roundevenl): Likewise.
	* math/Makefile (libm-calls): Add s_roundevenF.
	* math/libm-test.inc (roundeven_test_data): New array.
	(roundeven_test): New function.
	(main): Call roundeven_test.
	* math/test-tgmath.c (NCALLS): Increase to 134.
	(F(compile_test)): Call roundeven.
	(F(roundeven)): New function.
	* manual/arith.texi (Rounding Functions): Document roundeven,
	roundevenf and roundevenl.
	* manual/libm-err-tab.pl (@all_functions): Add roundeven.
	* include/math.h (roundeven): Use libm_hidden_proto.
	* sysdeps/ieee754/dbl-64/s_roundeven.c: New file.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_roundeven.c: Likewise.
	* sysdeps/ieee754/flt-32/s_roundevenf.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_roundevenl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_roundevenl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_roundevenl.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add
	roundeven.
	(CFLAGS-nldbl-roundeven.c): New variable.
	* sysdeps/ieee754/ldbl-opt/nldbl-roundeven.c: New file.
	* sysdeps/nacl/libm.abilist: Update.
	* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2016-12-21 01:48:27 +00:00
..
wordsize-64 Add roundeven, roundevenf, roundevenl. 2016-12-21 01:48:27 +00:00
asincos.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
atnat2.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
atnat.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
branred.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
branred.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
dbl2mpn.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
dla.h Use __builtin_fma more in dbl-64 code. 2016-09-30 15:49:51 +00:00
doasin.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
doasin.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
dosincos.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
dosincos.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_acos.c
e_acosh.c
e_asin.c Fix dbl-64 asin (sNaN) (bug 20213). 2016-06-06 22:21:11 +00:00
e_atan2.c Fix dbl-64 atan2 (sNaN, qNaN) (bug 20252). 2016-06-13 21:43:22 +00:00
e_atanh.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_cosh.c Avoid excess range overflowing results from cosh, sinh, lgamma (bug 18980). 2015-09-18 20:00:48 +00:00
e_exp2.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_exp10.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_exp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_fmod.c
e_gamma_r.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_hypot.c Fix hypot sNaN handling (bug 20940). 2016-12-07 01:16:36 +00:00
e_ilogb.c
e_j0.c Avoid uninitialized warnings in Bessel functions. 2015-02-26 21:49:19 +00:00
e_j1.c Fix j1, jn missing errno setting on underflow (bug 18611). 2015-10-23 21:37:33 +00:00
e_jn.c Fix j1, jn missing errno setting on underflow (bug 18611). 2015-10-23 21:37:33 +00:00
e_lgamma_r.c Remove GCC version conditionals on -Wmaybe-uninitialized pragmas. 2015-10-27 23:42:20 +00:00
e_log2.c Work around powerpc32 integer 0 converting to -0 (bug 887, bug 19049, bug 19050). 2015-10-05 17:46:50 +00:00
e_log10.c Work around powerpc32 integer 0 converting to -0 (bug 887, bug 19049, bug 19050). 2015-10-05 17:46:50 +00:00
e_log.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_pow.c Fix sysdeps/ieee754 pow handling of sNaN arguments (bug 20916). 2016-12-02 23:21:15 +00:00
e_rem_pio2.c
e_remainder.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
e_sinh.c Refactor code forcing underflow exceptions. 2015-09-23 22:42:30 +00:00
e_sqrt.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
gamma_product.c Merge common usage of mul_split function 2016-08-19 11:29:43 -05:00
gamma_productf.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
halfulp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
k_cos.c
k_rem_pio2.c Get rid of array-bounds warning in __kernel_rem_pio2[f] with gcc 6.1 -O3. 2016-08-18 12:20:35 +02:00
k_sin.c
k_tan.c
lgamma_neg.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
lgamma_product.c Merge common usage of mul_split function 2016-08-19 11:29:43 -05:00
Makefile powerpc: Fix incorrect results for pow when using FMA 2015-03-10 09:38:54 -04:00
MathLib.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpa-arch.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpa.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpa.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpatan2.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpatan.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpatan.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpexp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mplog.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpn2dbl.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpsqrt.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mpsqrt.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mptan.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
mydefs.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
powtwo.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
root.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_asinh.c Refactor code forcing underflow exceptions. 2015-09-23 22:42:30 +00:00
s_atan.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_cbrt.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_ceil.c Do not raise "inexact" from generic ceil (bug 15479). 2016-05-24 17:42:10 +00:00
s_copysign.c
s_cos.c
s_erf.c Work around powerpc32 integer 0 converting to -0 (bug 887, bug 19049, bug 19050). 2015-10-05 17:46:50 +00:00
s_expm1.c Refactor code forcing underflow exceptions. 2015-09-23 22:42:30 +00:00
s_fabs.c 2015-05-28 Wilco Dijkstra <wdijkstr@arm.com> 2015-05-28 11:42:55 +01:00
s_finite.c Fix __finitel libm compat symbol version. 2016-01-20 19:04:43 +00:00
s_floor.c Do not raise "inexact" from generic floor (bug 15479). 2016-05-24 17:44:46 +00:00
s_fma.c Call math_opt_barrier inside if 2016-01-15 05:23:20 -08:00
s_fmaf.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_fpclassify.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_frexp.c Fix frexp (NaN) (bug 20250). 2016-06-13 17:27:19 +00:00
s_getpayload.c Add getpayload, getpayloadf, getpayloadl. 2016-10-19 01:49:09 +00:00
s_isinf.c math: add LDBL_CLASSIFY_COMPAT support 2015-12-03 13:00:46 -05:00
s_isnan.c math: add LDBL_CLASSIFY_COMPAT support 2015-12-03 13:00:46 -05:00
s_issignaling.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_llrint.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_llround.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_log1p.c Refactor code forcing underflow exceptions. 2015-09-23 22:42:30 +00:00
s_logb.c Work around powerpc32 integer 0 converting to -0 (bug 887, bug 19049, bug 19050). 2015-10-05 17:46:50 +00:00
s_lrint.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_lround.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_modf.c
s_nearbyint.c
s_nexttoward.c
s_nextup.c Add nextup and nextdown math functions 2016-06-16 21:37:45 +05:30
s_remquo.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_rint.c
s_round.c Do not raise "inexact" from generic round (bug 15479). 2016-05-24 17:46:55 +00:00
s_roundeven.c Add roundeven, roundevenf, roundevenl. 2016-12-21 01:48:27 +00:00
s_scalbln.c
s_scalbn.c Make scalbn set errno (bug 6803). 2015-09-16 21:11:00 +00:00
s_setpayload_main.c Add setpayload, setpayloadf, setpayloadl. 2016-11-19 00:16:28 +00:00
s_setpayload.c Add setpayload, setpayloadf, setpayloadl. 2016-11-19 00:16:28 +00:00
s_setpayloadsig.c Add setpayloadsig, setpayloadsigf, setpayloadsigl. 2016-11-24 23:56:48 +00:00
s_signbit.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_sin.c Update comments for some functions in s_sin.c 2016-10-06 13:09:02 +05:30
s_sincos.c Adjust calls to do_sincos_1 and do_sincos_2 in s_sincos.c 2016-10-06 12:57:07 +05:30
s_tan.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
s_tanh.c Refactor code forcing underflow exceptions. 2015-09-23 22:42:30 +00:00
s_totalorder.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_totalordermag.c Define HIGH_ORDER_BIT_IS_SET_FOR_SNAN to 0 or 1. 2016-10-17 22:48:51 +00:00
s_trunc.c sparc64: add a VIS3 version of ceil, floor and trunc 2016-08-03 13:35:22 +02:00
sincos32.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
sincos32.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
sincostab.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
slowexp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
slowpow.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
t_exp2.h
t_exp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
uasncs.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
uatan.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
uexp.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
uexp.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
ulog.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
ulog.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
upow.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
upow.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
urem.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
usncs.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
utan.h Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
utan.tbl Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
w_exp.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00
x2y2m1.c Merge common usage of mul_split function 2016-08-19 11:29:43 -05:00
x2y2m1f.c Update copyright dates with scripts/update-copyrights. 2016-01-04 16:05:18 +00:00