diff mbox

Add roundeven, roundevenf, roundevenl [committed]

Message ID alpine.DEB.2.20.1612210148590.2967@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Dec. 21, 2016, 1:49 a.m. UTC
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.  Committed.

2016-12-21  Joseph Myers  <joseph@codesourcery.com>

	* 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.
diff mbox

Patch

diff --git a/NEWS b/NEWS
index d77b8ab..87950ed 100644
--- a/NEWS
+++ b/NEWS
@@ -66,6 +66,8 @@  Version 2.25
 
   - Signaling NaN macros: SNANF, SNAN, SNANL.
 
+  - Nearest integer functions: roundeven, roundevenf, roundevenl.
+
   - llogb functions: the llogb, llogbf and llogbl functions, and the
     FP_LLOGB0 and FP_LLOGBNAN macros.
 
diff --git a/include/math.h b/include/math.h
index ba7bba0..a4f5562 100644
--- a/include/math.h
+++ b/include/math.h
@@ -29,6 +29,7 @@  libm_hidden_proto (__issignaling)
 libm_hidden_proto (__issignalingf)
 libm_hidden_proto (__exp)
 libm_hidden_proto (__expf)
+libm_hidden_proto (roundeven)
 
 # ifndef __NO_LONG_DOUBLE_MATH
 libm_hidden_proto (__fpclassifyl)
diff --git a/manual/arith.texi b/manual/arith.texi
index f90ef26..b0464e1 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -1596,6 +1596,20 @@  current rounding mode).
 
 @comment math.h
 @comment ISO
+@deftypefun double roundeven (double @var{x})
+@comment math.h
+@comment ISO
+@deftypefunx float roundevenf (float @var{x})
+@comment math.h
+@comment ISO
+@deftypefunx {long double} roundevenl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+These functions, from TS 18661-1:2014, are similar to @code{round},
+but they round halfway cases to even instead of away from zero.
+@end deftypefun
+
+@comment math.h
+@comment ISO
 @deftypefun {long int} lrint (double @var{x})
 @comment math.h
 @comment ISO
diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl
index cc51f0b..9b8aa66 100755
--- a/manual/libm-err-tab.pl
+++ b/manual/libm-err-tab.pl
@@ -61,9 +61,9 @@  use vars qw (%results @all_floats %suffices @all_functions);
     "ilogb", "j0", "j1", "jn", "lgamma", "llogb", "lrint",
     "llrint", "log", "log10", "log1p", "log2", "logb", "lround",
     "llround", "modf", "nearbyint", "nextafter", "nextdown", "nexttoward",
-    "nextup", "pow", "remainder", "remquo", "rint", "round", "scalb",
-    "scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma",
-    "trunc", "y0", "y1", "yn" );
+    "nextup", "pow", "remainder", "remquo", "rint", "round", "roundeven",
+    "scalb", "scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh",
+    "tgamma", "trunc", "y0", "y1", "yn" );
 # canonicalize, fpclassify, getpayload, iscanonical, isnormal,
 # isfinite, isinf, isnan, issignaling, issubnormal, iszero, signbit,
 # iseqsig, isgreater, isgreaterequal, isless, islessequal,
diff --git a/math/Makefile b/math/Makefile
index ed1c4c9..7b2eb5a 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -75,7 +75,7 @@  libm-calls =								  \
 	s_issignalingF $(calls:s_%=m_%) x2y2m1F				  \
 	gamma_productF lgamma_negF lgamma_productF			  \
 	s_nextupF s_totalorderF s_totalordermagF s_getpayloadF		  \
-	s_setpayloadF s_setpayloadsigF $(gen-libm-calls)
+	s_setpayloadF s_setpayloadsigF s_roundevenF $(gen-libm-calls)
 
 libm-compat-calls-ldouble-yes = w_lgamma_compatl k_standardl
 libm-compat-calls = w_lgamma_compatf w_lgamma_compat k_standard k_standardf \
diff --git a/math/Versions b/math/Versions
index eebfac3..b6a4fa3 100644
--- a/math/Versions
+++ b/math/Versions
@@ -225,5 +225,6 @@  libm {
     setpayloadsig; setpayloadsigf; setpayloadsigl;
     llogb; llogbf; llogbl;
     fmaxmag; fmaxmagf; fmaxmagl; fminmag; fminmagf; fminmagl;
+    roundeven; roundevenf; roundevenl;
   }
 }
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index 824f95b..4fd8bab 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -385,6 +385,9 @@  __END_NAMESPACE_C99
 #endif
 
 #if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Round X to nearest integer value, rounding halfway cases to even.  */
+__MATHCALLX (roundeven,, (_Mdouble_ __x), (__const__));
+
 /* Return value with maximum magnitude.  */
 __MATHCALLX (fmaxmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
 
diff --git a/math/libm-test.inc b/math/libm-test.inc
index e482293..e096e21 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -47,7 +47,7 @@ 
    ldexp, lgamma, llogb, log, log10, log1p, log2, logb,
    modf, nearbyint, nextafter, nexttoward,
    pow, pow10, remainder, remquo, rint, lrint, llrint,
-   round, lround, llround,
+   round, roundeven, lround, llround,
    scalb, scalbn, scalbln, setpayload, setpayloadsig, signbit,
    sin, sincos, sinh, sqrt,
    tan, tanh, tgamma, totalorder, totalordermag, trunc,
@@ -12460,6 +12460,609 @@  round_test (void)
 }
 
 
+static const struct test_f_f_data roundeven_test_data[] =
+  {
+    TEST_f_f (roundeven, plus_zero, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, plus_infty, plus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, minus_infty, minus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, snan_value, qnan_value, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+    TEST_f_f (roundeven, -snan_value, qnan_value, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+
+    TEST_f_f (roundeven, min_subnorm_value, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, min_value, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2, 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3, 3, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4, 4, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5, 5, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p23, 0x1p23, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p24, 0x1p24, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p25, 0x1p25, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p52, 0x1p52, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p53, 0x1p53, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p54, 0x1p54, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p63, 0x1p63, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p64, 0x1p64, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p65, 0x1p65, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p105, 0x1p105, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p106, 0x1p106, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p107, 0x1p107, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p112, 0x1p112, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p113, 0x1p113, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1p114, 0x1p114, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, max_value, max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -min_subnorm_value, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -min_value, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1, -1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2, -2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3, -3, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4, -4, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5, -5, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p23, -0x1p23, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p24, -0x1p24, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p25, -0x1p25, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p52, -0x1p52, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p53, -0x1p53, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p54, -0x1p54, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p63, -0x1p63, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p64, -0x1p64, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p65, -0x1p65, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p105, -0x1p105, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p106, -0x1p106, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p107, -0x1p107, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p112, -0x1p112, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p113, -0x1p113, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1p114, -0x1p114, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -max_value, -max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+
+    TEST_f_f (roundeven, 0.1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.2, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.2, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.25, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.25, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.499, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.499, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.5, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.5, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.501, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.501, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.625, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.625, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.75, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.75, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0.8, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0.8, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1.25, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1.25, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1.499, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1.499, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1.5, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1.5, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1.501, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1.501, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 1.75, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -1.75, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2.25, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2.25, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2.499, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2.499, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2.5, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2.5, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2.501, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2.501, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 2.75, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -2.75, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3.25, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3.25, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3.499, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3.499, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3.5, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3.5, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3.501, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3.501, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 3.75, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -3.75, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4.25, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4.25, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4.499, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4.499, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4.5, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4.5, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4.501, 5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4.501, -5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 4.75, 5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -4.75, -5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5.25, 5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5.25, -5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5.499, 5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5.499, -5.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5.5, 6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5.5, -6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5.501, 6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5.501, -6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 5.75, 6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -5.75, -6.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+
+    /* 0.5, 1.5, 2.5, 3.5 +/- 1ulp.  */
+    TEST_f_f (roundeven, 0x0.ffffffp-1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x0.ffffffp-1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1.000002p-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1.000002p-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2.fffffcp-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2.fffffcp-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3.000004p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3.000004p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4.fffff8p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4.fffff8p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x5.000008p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x5.000008p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x6.fffff8p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x6.fffff8p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7.000008p-1, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7.000008p-1, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#if MANT_DIG >= 53
+    TEST_f_f (roundeven, 0x0.fffffffffffff8p-1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x0.fffffffffffff8p-1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1.0000000000001p-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1.0000000000001p-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2.ffffffffffffep-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2.ffffffffffffep-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3.0000000000002p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3.0000000000002p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4.ffffffffffffcp-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4.ffffffffffffcp-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x5.0000000000004p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x5.0000000000004p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x6.ffffffffffffcp-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x6.ffffffffffffcp-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7.0000000000004p-1, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7.0000000000004p-1, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 64
+    TEST_f_f (roundeven, 0x0.ffffffffffffffffp-1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x0.ffffffffffffffffp-1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1.0000000000000002p-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1.0000000000000002p-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2.fffffffffffffffcp-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2.fffffffffffffffcp-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3.0000000000000004p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3.0000000000000004p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4.fffffffffffffff8p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4.fffffffffffffff8p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x5.0000000000000008p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x5.0000000000000008p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x6.fffffffffffffff8p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x6.fffffffffffffff8p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7.0000000000000008p-1, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7.0000000000000008p-1, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 106
+    TEST_f_f (roundeven, 0x0.ffffffffffffffffffffffffffcp-1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x0.ffffffffffffffffffffffffffcp-1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1.000000000000000000000000008p-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1.000000000000000000000000008p-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2.ffffffffffffffffffffffffffp-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2.ffffffffffffffffffffffffffp-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3.00000000000000000000000001p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3.00000000000000000000000001p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4.fffffffffffffffffffffffffep-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4.fffffffffffffffffffffffffep-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x5.00000000000000000000000002p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x5.00000000000000000000000002p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x6.fffffffffffffffffffffffffep-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x6.fffffffffffffffffffffffffep-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7.00000000000000000000000002p-1, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7.00000000000000000000000002p-1, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 113
+    TEST_f_f (roundeven, 0x0.ffffffffffffffffffffffffffff8p-1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x0.ffffffffffffffffffffffffffff8p-1, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1.0000000000000000000000000001p-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1.0000000000000000000000000001p-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2.fffffffffffffffffffffffffffep-1, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2.fffffffffffffffffffffffffffep-1, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3.0000000000000000000000000002p-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3.0000000000000000000000000002p-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4.fffffffffffffffffffffffffffcp-1, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4.fffffffffffffffffffffffffffcp-1, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x5.0000000000000000000000000004p-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x5.0000000000000000000000000004p-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x6.fffffffffffffffffffffffffffcp-1, 3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x6.fffffffffffffffffffffffffffcp-1, -3.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7.0000000000000000000000000004p-1, 4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7.0000000000000000000000000004p-1, -4.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+
+    /* 31, 32, 33 fractional bits.  */
+#if MANT_DIG >= 53
+    TEST_f_f (roundeven, 0x200000.7ffffffep0, 0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000.7ffffffep0, -0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000.8p0, 0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000.8p0, -0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000.80000002p0, 0x200001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000.80000002p0, -0x200001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200001.7ffffffep0, 0x200001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200001.7ffffffep0, -0x200001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200001.8p0, 0x200002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200001.8p0, -0x200002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200001.80000002p0, 0x200002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200001.80000002p0, -0x200002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3fffff.fffffffep0, 0x400000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3fffff.fffffffep0, -0x400000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000.7fffffffp0, 0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000.7fffffffp0, -0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000.8p0, 0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000.8p0, -0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000.80000001p0, 0x100001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000.80000001p0, -0x100001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100001.7fffffffp0, 0x100001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100001.7fffffffp0, -0x100001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100001.8p0, 0x100002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100001.8p0, -0x100002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100001.80000001p0, 0x100002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100001.80000001p0, -0x100002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1fffff.ffffffffp0, 0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1fffff.ffffffffp0, -0x200000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000.7fffffff8p0, 0x80000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000.7fffffff8p0, -0x80000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000.8p0, 0x80000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000.8p0, -0x80000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000.800000008p0, 0x80001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000.800000008p0, -0x80001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80001.7fffffff8p0, 0x80001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80001.7fffffff8p0, -0x80001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80001.8p0, 0x80002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80001.8p0, -0x80002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80001.800000008p0, 0x80002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80001.800000008p0, -0x80002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xfffff.ffffffff8p0, 0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xfffff.ffffffff8p0, -0x100000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 64
+    TEST_f_f (roundeven, 0x100000000.7ffffffep0, 0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000.7ffffffep0, -0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000.8p0, 0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000.8p0, -0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000.80000002p0, 0x100000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000.80000002p0, -0x100000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000001.7ffffffep0, 0x100000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000001.7ffffffep0, -0x100000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000001.8p0, 0x100000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000001.8p0, -0x100000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000001.80000002p0, 0x100000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000001.80000002p0, -0x100000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffff.fffffffep0, 0x200000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffff.fffffffep0, -0x200000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000.7fffffffp0, 0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000.7fffffffp0, -0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000.8p0, 0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000.8p0, -0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000.80000001p0, 0x80000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000.80000001p0, -0x80000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000001.7fffffffp0, 0x80000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000001.7fffffffp0, -0x80000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000001.8p0, 0x80000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000001.8p0, -0x80000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000001.80000001p0, 0x80000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000001.80000001p0, -0x80000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xffffffff.ffffffffp0, 0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xffffffff.ffffffffp0, -0x100000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000.7fffffff8p0, 0x40000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000.7fffffff8p0, -0x40000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000.8p0, 0x40000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000.8p0, -0x40000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000.800000008p0, 0x40000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000.800000008p0, -0x40000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000001.7fffffff8p0, 0x40000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000001.7fffffff8p0, -0x40000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000001.8p0, 0x40000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000001.8p0, -0x40000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000001.800000008p0, 0x40000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000001.800000008p0, -0x40000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7fffffff.ffffffff8p0, 0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7fffffff.ffffffff8p0, -0x80000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 106
+    TEST_f_f (roundeven, 0x4000000000000000000.7ffffffep0, 0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000000.7ffffffep0, -0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4000000000000000000.8p0, 0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000000.8p0, -0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4000000000000000000.80000002p0, 0x4000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000000.80000002p0, -0x4000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4000000000000000001.7ffffffep0, 0x4000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000001.7ffffffep0, -0x4000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4000000000000000001.8p0, 0x4000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000001.8p0, -0x4000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x4000000000000000001.80000002p0, 0x4000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x4000000000000000001.80000002p0, -0x4000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7ffffffffffffffffff.fffffffep0, 0x8000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7ffffffffffffffffff.fffffffep0, -0x8000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000000.7fffffffp0, 0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000000.7fffffffp0, -0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000000.8p0, 0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000000.8p0, -0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000000.80000001p0, 0x2000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000000.80000001p0, -0x2000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000001.7fffffffp0, 0x2000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000001.7fffffffp0, -0x2000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000001.8p0, 0x2000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000001.8p0, -0x2000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000000001.80000001p0, 0x2000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000000001.80000001p0, -0x2000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3ffffffffffffffffff.ffffffffp0, 0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3ffffffffffffffffff.ffffffffp0, -0x4000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000000.7fffffff8p0, 0x1000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000000.7fffffff8p0, -0x1000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000000.8p0, 0x1000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000000.8p0, -0x1000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000000.800000008p0, 0x1000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000000.800000008p0, -0x1000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000001.7fffffff8p0, 0x1000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000001.7fffffff8p0, -0x1000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000001.8p0, 0x1000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000001.8p0, -0x1000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000000001.800000008p0, 0x1000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000000001.800000008p0, -0x1000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffffffffffffff.ffffffff8p0, 0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffffffffffffff.ffffffff8p0, -0x2000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 113
+    TEST_f_f (roundeven, 0x200000000000000000000.7ffffffep0, 0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000.7ffffffep0, -0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000.8p0, 0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000.8p0, -0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000.80000002p0, 0x200000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000.80000002p0, -0x200000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000001.7ffffffep0, 0x200000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000001.7ffffffep0, -0x200000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000001.8p0, 0x200000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000001.8p0, -0x200000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000001.80000002p0, 0x200000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000001.80000002p0, -0x200000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3ffffffffffffffffffff.fffffffep0, 0x400000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3ffffffffffffffffffff.fffffffep0, -0x400000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000000.7fffffffp0, 0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000000.7fffffffp0, -0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000000.8p0, 0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000000.8p0, -0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000000.80000001p0, 0x100000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000000.80000001p0, -0x100000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000001.7fffffffp0, 0x100000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000001.7fffffffp0, -0x100000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000001.8p0, 0x100000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000001.8p0, -0x100000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x100000000000000000001.80000001p0, 0x100000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x100000000000000000001.80000001p0, -0x100000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffffffffffffffff.ffffffffp0, 0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffffffffffffffff.ffffffffp0, -0x200000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000000.7fffffff8p0, 0x80000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000000.7fffffff8p0, -0x80000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000000.8p0, 0x80000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000000.8p0, -0x80000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000000.800000008p0, 0x80000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000000.800000008p0, -0x80000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000001.7fffffff8p0, 0x80000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000001.7fffffff8p0, -0x80000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000001.8p0, 0x80000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000001.8p0, -0x80000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x80000000000000000001.800000008p0, 0x80000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x80000000000000000001.800000008p0, -0x80000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xffffffffffffffffffff.ffffffff8p0, 0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xffffffffffffffffffff.ffffffff8p0, -0x100000000000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+
+    /* 63, 64, 65 fractional bits.  */
+#if MANT_DIG >= 106
+    TEST_f_f (roundeven, 0x40000000000.7ffffffffffffffep0, 0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000000.7ffffffffffffffep0, -0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000000.8p0, 0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000000.8p0, -0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000000.8000000000000002p0, 0x40000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000000.8000000000000002p0, -0x40000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000001.7ffffffffffffffep0, 0x40000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000001.7ffffffffffffffep0, -0x40000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000001.8p0, 0x40000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000001.8p0, -0x40000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x40000000001.8000000000000002p0, 0x40000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x40000000001.8000000000000002p0, -0x40000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x7ffffffffff.fffffffffffffffep0, 0x80000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x7ffffffffff.fffffffffffffffep0, -0x80000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000000.7fffffffffffffffp0, 0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000000.7fffffffffffffffp0, -0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000000.8p0, 0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000000.8p0, -0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000000.8000000000000001p0, 0x20000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000000.8000000000000001p0, -0x20000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000001.7fffffffffffffffp0, 0x20000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000001.7fffffffffffffffp0, -0x20000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000001.8p0, 0x20000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000001.8p0, -0x20000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x20000000001.8000000000000001p0, 0x20000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x20000000001.8000000000000001p0, -0x20000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3ffffffffff.ffffffffffffffffp0, 0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3ffffffffff.ffffffffffffffffp0, -0x40000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000.7fffffffffffffff8p0, 0x10000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000.7fffffffffffffff8p0, -0x10000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000.8p0, 0x10000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000.8p0, -0x10000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000.80000000000000008p0, 0x10000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000.80000000000000008p0, -0x10000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000001.7fffffffffffffff8p0, 0x10000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000001.7fffffffffffffff8p0, -0x10000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000001.8p0, 0x10000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000001.8p0, -0x10000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000001.80000000000000008p0, 0x10000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000001.80000000000000008p0, -0x10000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffffff.ffffffffffffffff8p0, 0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffffff.ffffffffffffffff8p0, -0x20000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 113
+    TEST_f_f (roundeven, 0x2000000000000.7ffffffffffffffep0, 0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000.7ffffffffffffffep0, -0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000.8p0, 0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000.8p0, -0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000000.8000000000000002p0, 0x2000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000000.8000000000000002p0, -0x2000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000001.7ffffffffffffffep0, 0x2000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000001.7ffffffffffffffep0, -0x2000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000001.8p0, 0x2000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000001.8p0, -0x2000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x2000000000001.8000000000000002p0, 0x2000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x2000000000001.8000000000000002p0, -0x2000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3ffffffffffff.fffffffffffffffep0, 0x4000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3ffffffffffff.fffffffffffffffep0, -0x4000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000.7fffffffffffffffp0, 0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000.7fffffffffffffffp0, -0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000.8p0, 0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000.8p0, -0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000000.8000000000000001p0, 0x1000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000000.8000000000000001p0, -0x1000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000001.7fffffffffffffffp0, 0x1000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000001.7fffffffffffffffp0, -0x1000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000001.8p0, 0x1000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000001.8p0, -0x1000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1000000000001.8000000000000001p0, 0x1000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1000000000001.8000000000000001p0, -0x1000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffffffff.ffffffffffffffffp0, 0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffffffff.ffffffffffffffffp0, -0x2000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000000.7fffffffffffffff8p0, 0x800000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000000.7fffffffffffffff8p0, -0x800000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000000.8p0, 0x800000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000000.8p0, -0x800000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000000.80000000000000008p0, 0x800000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000000.80000000000000008p0, -0x800000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000001.7fffffffffffffff8p0, 0x800000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000001.7fffffffffffffff8p0, -0x800000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000001.8p0, 0x800000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000001.8p0, -0x800000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800000000001.80000000000000008p0, 0x800000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800000000001.80000000000000008p0, -0x800000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xffffffffffff.ffffffffffffffff8p0, 0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xffffffffffff.ffffffffffffffff8p0, -0x1000000000000p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+
+    /* Maximum exponent for noninteger values.  */
+    TEST_f_f (roundeven, 0x800001p-1, 0x800000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800001p-1, -0x800000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800002p-1, 0x800002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800002p-1, -0x800002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800003p-1, 0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800003p-1, -0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800004p-1, 0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800004p-1, -0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800005p-1, 0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800005p-1, -0x800004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xffffffp-1, 0x1000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xffffffp-1, -0x1000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#if MANT_DIG >= 53
+    TEST_f_f (roundeven, 0x10000000000001p-1, 0x10000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000001p-1, -0x10000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000002p-1, 0x10000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000002p-1, -0x10000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000003p-1, 0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000003p-1, -0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000004p-1, 0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000004p-1, -0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000005p-1, 0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000005p-1, -0x10000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1fffffffffffffp-1, 0x20000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1fffffffffffffp-1, -0x20000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 64
+    TEST_f_f (roundeven, 0x8000000000000001p-1, 0x8000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000001p-1, -0x8000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000002p-1, 0x8000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000002p-1, -0x8000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000003p-1, 0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000003p-1, -0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000004p-1, 0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000004p-1, -0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000005p-1, 0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000005p-1, -0x8000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0xffffffffffffffffp-1, 0x10000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0xffffffffffffffffp-1, -0x10000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 106
+    TEST_f_f (roundeven, 0x200000000000000000000000001p-1, 0x200000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000001p-1, -0x200000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000002p-1, 0x200000000000000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000002p-1, -0x200000000000000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000003p-1, 0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000003p-1, -0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000004p-1, 0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000004p-1, -0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000005p-1, 0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000005p-1, -0x200000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x3ffffffffffffffffffffffffffp-1, 0x400000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x3ffffffffffffffffffffffffffp-1, -0x400000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 113
+    TEST_f_f (roundeven, 0x10000000000000000000000000001p-1, 0x10000000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000001p-1, -0x10000000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000002p-1, 0x10000000000000000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000002p-1, -0x10000000000000000000000000002p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000003p-1, 0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000003p-1, -0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000004p-1, 0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000004p-1, -0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000005p-1, 0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000005p-1, -0x10000000000000000000000000004p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x1ffffffffffffffffffffffffffffp-1, 0x20000000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x1ffffffffffffffffffffffffffffp-1, -0x20000000000000000000000000000p-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+
+    /* Minimum exponent forcing integer values.  */
+    TEST_f_f (roundeven, 0x800001p0, 0x800001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800001p0, -0x800001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800002p0, 0x800002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800002p0, -0x800002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x800003p0, 0x800003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x800003p0, -0x800003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#if MANT_DIG >= 53
+    TEST_f_f (roundeven, 0x10000000000001p0, 0x10000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000001p0, -0x10000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000002p0, 0x10000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000002p0, -0x10000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000003p0, 0x10000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000003p0, -0x10000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 64
+    TEST_f_f (roundeven, 0x8000000000000001p0, 0x8000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000001p0, -0x8000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000002p0, 0x8000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000002p0, -0x8000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x8000000000000003p0, 0x8000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x8000000000000003p0, -0x8000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 106
+    TEST_f_f (roundeven, 0x200000000000000000000000001p0, 0x200000000000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000001p0, -0x200000000000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000002p0, 0x200000000000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000002p0, -0x200000000000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x200000000000000000000000003p0, 0x200000000000000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x200000000000000000000000003p0, -0x200000000000000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if MANT_DIG >= 113
+    TEST_f_f (roundeven, 0x10000000000000000000000000001p0, 0x10000000000000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000001p0, -0x10000000000000000000000000001p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000002p0, 0x10000000000000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000002p0, -0x10000000000000000000000000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, 0x10000000000000000000000000003p0, 0x10000000000000000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (roundeven, -0x10000000000000000000000000003p0, -0x10000000000000000000000000003p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+  };
+
+static void
+roundeven_test (void)
+{
+  ALL_RM_TEST (roundeven, 1, roundeven_test_data, RUN_TEST_LOOP_f_f, END);
+}
+
+
 static const struct test_ff_f_data scalb_test_data[] =
   {
     /* Results in this case are unspecified by POSIX, so, for an
@@ -14266,6 +14869,7 @@  main (int argc, char **argv)
   lrint_test ();
   llrint_test ();
   round_test ();
+  roundeven_test ();
   lround_test ();
   llround_test ();
   trunc_test ();
diff --git a/math/test-tgmath.c b/math/test-tgmath.c
index b909527..7a58d99 100644
--- a/math/test-tgmath.c
+++ b/math/test-tgmath.c
@@ -50,7 +50,7 @@  int count_cdouble;
 int count_cfloat;
 int count_cldouble;
 
-#define NCALLS     132
+#define NCALLS     134
 #define NCALLS_INT 4
 #define NCCALLS    47
 
@@ -264,6 +264,7 @@  F(compile_test) (void)
   b = fmod (fmod (a, b), fmod (c, x));
   a = nearbyint (nearbyint (x));
   b = round (round (a));
+  c = roundeven (roundeven (a));
   a = trunc (trunc (x));
   b = remquo (remquo (a, b, &i), remquo (c, x, &i), &i);
   j = lrint (x) + lround (a);
@@ -367,6 +368,7 @@  F(compile_test) (void)
       a = fmod (y, y);
       a = nearbyint (y);
       a = round (y);
+      a = roundeven (y);
       a = trunc (y);
       a = remquo (y, y, &i);
       j = lrint (y) + lround (y);
@@ -693,6 +695,14 @@  TYPE
 }
 
 TYPE
+(F(roundeven)) (TYPE x)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+TYPE
 (F(trunc)) (TYPE x)
 {
   ++count;
diff --git a/math/tgmath.h b/math/tgmath.h
index 8a895a5..433a348 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -438,6 +438,9 @@ 
      __TGMATH_TERNARY_REAL_ONLY (Val1, Val2, Val3, fma)
 
 #if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Round X to nearest integer value, rounding halfway cases to even.  */
+# define roundeven(Val) __TGMATH_UNARY_REAL_ONLY (Val, roundeven)
+
 /* Like ilogb, but returning long int.  */
 # define llogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long int, llogb)
 
diff --git a/sysdeps/ieee754/dbl-64/s_roundeven.c b/sysdeps/ieee754/dbl-64/s_roundeven.c
new file mode 100644
index 0000000..27e15e3
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_roundeven.c
@@ -0,0 +1,106 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   dbl-64 version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <stdint.h>
+
+#define BIAS 0x3ff
+#define MANT_DIG 53
+#define MAX_EXP (2 * BIAS + 1)
+
+double
+roundeven (double x)
+{
+  uint32_t hx, lx, uhx;
+  EXTRACT_WORDS (hx, lx, x);
+  uhx = hx & 0x7fffffff;
+  int exponent = uhx >> (MANT_DIG - 1 - 32);
+  if (exponent >= BIAS + MANT_DIG - 1)
+    {
+      /* Integer, infinity or NaN.  */
+      if (exponent == MAX_EXP)
+	/* Infinity or NaN; quiet signaling NaNs.  */
+	return x + x;
+      else
+	return x;
+    }
+  else if (exponent >= BIAS + MANT_DIG - 32)
+    {
+      /* Not necessarily an integer; integer bit is in low word.
+	 Locate the bits with exponents 0 and -1.  */
+      int int_pos = (BIAS + MANT_DIG - 1) - exponent;
+      int half_pos = int_pos - 1;
+      uint32_t half_bit = 1U << half_pos;
+      uint32_t int_bit = 1U << int_pos;
+      if ((lx & (int_bit | (half_bit - 1))) != 0)
+	{
+	  /* Carry into the exponent works correctly.  No need to test
+	     whether HALF_BIT is set.  */
+	  lx += half_bit;
+	  hx += lx < half_bit;
+	}
+      lx &= ~(int_bit - 1);
+    }
+  else if (exponent == BIAS + MANT_DIG - 33)
+    {
+      /* Not necessarily an integer; integer bit is bottom of high
+	 word, half bit is top of low word.  */
+      if (((hx & 1) | (lx & 0x7fffffff)) != 0)
+	{
+	  lx += 0x80000000;
+	  hx += lx < 0x80000000;
+	}
+      lx = 0;
+    }
+  else if (exponent >= BIAS)
+    {
+      /* At least 1; not necessarily an integer, integer bit and half
+	 bit are in the high word.  Locate the bits with exponents 0
+	 and -1 (when the unbiased exponent is 0, the bit with
+	 exponent 0 is implicit, but as the bias is odd it is OK to
+	 take it from the low bit of the exponent).  */
+      int int_pos = (BIAS + MANT_DIG - 33) - exponent;
+      int half_pos = int_pos - 1;
+      uint32_t half_bit = 1U << half_pos;
+      uint32_t int_bit = 1U << int_pos;
+      if (((hx & (int_bit | (half_bit - 1))) | lx) != 0)
+	hx += half_bit;
+      hx &= ~(int_bit - 1);
+      lx = 0;
+    }
+  else if (exponent == BIAS - 1 && (uhx > 0x3fe00000 || lx != 0))
+    {
+      /* Interval (0.5, 1).  */
+      hx = (hx & 0x80000000) | 0x3ff00000;
+      lx = 0;
+    }
+  else
+    {
+      /* Rounds to 0.  */
+      hx &= 0x80000000;
+      lx = 0;
+    }
+  INSERT_WORDS (x, hx, lx);
+  return x;
+}
+hidden_def (roundeven)
+#ifdef NO_LONG_DOUBLE
+weak_alias (roundeven, roundevenl)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_roundeven.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_roundeven.c
new file mode 100644
index 0000000..1fa3ef3
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_roundeven.c
@@ -0,0 +1,72 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   dbl-64/wordsize-64 version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <stdint.h>
+
+#define BIAS 0x3ff
+#define MANT_DIG 53
+#define MAX_EXP (2 * BIAS + 1)
+
+double
+roundeven (double x)
+{
+  uint64_t ix, ux;
+  EXTRACT_WORDS64 (ix, x);
+  ux = ix & 0x7fffffffffffffffULL;
+  int exponent = ux >> (MANT_DIG - 1);
+  if (exponent >= BIAS + MANT_DIG - 1)
+    {
+      /* Integer, infinity or NaN.  */
+      if (exponent == MAX_EXP)
+	/* Infinity or NaN; quiet signaling NaNs.  */
+	return x + x;
+      else
+	return x;
+    }
+  else if (exponent >= BIAS)
+    {
+      /* At least 1; not necessarily an integer.  Locate the bits with
+	 exponents 0 and -1 (when the unbiased exponent is 0, the bit
+	 with exponent 0 is implicit, but as the bias is odd it is OK
+	 to take it from the low bit of the exponent).  */
+      int int_pos = (BIAS + MANT_DIG - 1) - exponent;
+      int half_pos = int_pos - 1;
+      uint64_t half_bit = 1ULL << half_pos;
+      uint64_t int_bit = 1ULL << int_pos;
+      if ((ix & (int_bit | (half_bit - 1))) != 0)
+	/* Carry into the exponent works correctly.  No need to test
+	   whether HALF_BIT is set.  */
+	ix += half_bit;
+      ix &= ~(int_bit - 1);
+    }
+  else if (exponent == BIAS - 1 && ux > 0x3fe0000000000000ULL)
+    /* Interval (0.5, 1).  */
+    ix = (ix & 0x8000000000000000ULL) | 0x3ff0000000000000ULL;
+  else
+    /* Rounds to 0.  */
+    ix &= 0x8000000000000000ULL;
+  INSERT_WORDS64 (x, ix);
+  return x;
+}
+hidden_def (roundeven)
+#ifdef NO_LONG_DOUBLE
+weak_alias (roundeven, roundevenl)
+#endif
diff --git a/sysdeps/ieee754/flt-32/s_roundevenf.c b/sysdeps/ieee754/flt-32/s_roundevenf.c
new file mode 100644
index 0000000..db2e048
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_roundevenf.c
@@ -0,0 +1,68 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   flt-32 version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <stdint.h>
+
+#define BIAS 0x7f
+#define MANT_DIG 24
+#define MAX_EXP (2 * BIAS + 1)
+
+float
+roundevenf (float x)
+{
+  uint32_t ix, ux;
+  GET_FLOAT_WORD (ix, x);
+  ux = ix & 0x7fffffff;
+  int exponent = ux >> (MANT_DIG - 1);
+  if (exponent >= BIAS + MANT_DIG - 1)
+    {
+      /* Integer, infinity or NaN.  */
+      if (exponent == MAX_EXP)
+	/* Infinity or NaN; quiet signaling NaNs.  */
+	return x + x;
+      else
+	return x;
+    }
+  else if (exponent >= BIAS)
+    {
+      /* At least 1; not necessarily an integer.  Locate the bits with
+	 exponents 0 and -1 (when the unbiased exponent is 0, the bit
+	 with exponent 0 is implicit, but as the bias is odd it is OK
+	 to take it from the low bit of the exponent).  */
+      int int_pos = (BIAS + MANT_DIG - 1) - exponent;
+      int half_pos = int_pos - 1;
+      uint32_t half_bit = 1U << half_pos;
+      uint32_t int_bit = 1U << int_pos;
+      if ((ix & (int_bit | (half_bit - 1))) != 0)
+	/* Carry into the exponent works correctly.  No need to test
+	   whether HALF_BIT is set.  */
+	ix += half_bit;
+      ix &= ~(int_bit - 1);
+    }
+  else if (exponent == BIAS - 1 && ux > 0x3f000000)
+    /* Interval (0.5, 1).  */
+    ix = (ix & 0x80000000) | 0x3f800000;
+  else
+    /* Rounds to 0.  */
+    ix &= 0x80000000;
+  SET_FLOAT_WORD (x, ix);
+  return x;
+}
diff --git a/sysdeps/ieee754/ldbl-128/s_roundevenl.c b/sysdeps/ieee754/ldbl-128/s_roundevenl.c
new file mode 100644
index 0000000..de042ac
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_roundevenl.c
@@ -0,0 +1,102 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   ldbl-128 version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <stdint.h>
+
+#define BIAS 0x3fff
+#define MANT_DIG 113
+#define MAX_EXP (2 * BIAS + 1)
+
+_Float128
+roundevenl (_Float128 x)
+{
+  uint64_t hx, lx, uhx;
+  GET_LDOUBLE_WORDS64 (hx, lx, x);
+  uhx = hx & 0x7fffffffffffffffULL;
+  int exponent = uhx >> (MANT_DIG - 1 - 64);
+  if (exponent >= BIAS + MANT_DIG - 1)
+    {
+      /* Integer, infinity or NaN.  */
+      if (exponent == MAX_EXP)
+	/* Infinity or NaN; quiet signaling NaNs.  */
+	return x + x;
+      else
+	return x;
+    }
+  else if (exponent >= BIAS + MANT_DIG - 64)
+    {
+      /* Not necessarily an integer; integer bit is in low word.
+	 Locate the bits with exponents 0 and -1.  */
+      int int_pos = (BIAS + MANT_DIG - 1) - exponent;
+      int half_pos = int_pos - 1;
+      uint64_t half_bit = 1ULL << half_pos;
+      uint64_t int_bit = 1ULL << int_pos;
+      if ((lx & (int_bit | (half_bit - 1))) != 0)
+	{
+	  /* Carry into the exponent works correctly.  No need to test
+	     whether HALF_BIT is set.  */
+	  lx += half_bit;
+	  hx += lx < half_bit;
+	}
+      lx &= ~(int_bit - 1);
+    }
+  else if (exponent == BIAS + MANT_DIG - 65)
+    {
+      /* Not necessarily an integer; integer bit is bottom of high
+	 word, half bit is top of low word.  */
+      if (((hx & 1) | (lx & 0x7fffffffffffffffULL)) != 0)
+	{
+	  lx += 0x8000000000000000ULL;
+	  hx += lx < 0x8000000000000000ULL;
+	}
+      lx = 0;
+    }
+  else if (exponent >= BIAS)
+    {
+      /* At least 1; not necessarily an integer, integer bit and half
+	 bit are in the high word.  Locate the bits with exponents 0
+	 and -1 (when the unbiased exponent is 0, the bit with
+	 exponent 0 is implicit, but as the bias is odd it is OK to
+	 take it from the low bit of the exponent).  */
+      int int_pos = (BIAS + MANT_DIG - 65) - exponent;
+      int half_pos = int_pos - 1;
+      uint64_t half_bit = 1ULL << half_pos;
+      uint64_t int_bit = 1ULL << int_pos;
+      if (((hx & (int_bit | (half_bit - 1))) | lx) != 0)
+	hx += half_bit;
+      hx &= ~(int_bit - 1);
+      lx = 0;
+    }
+  else if (exponent == BIAS - 1 && (uhx > 0x3ffe000000000000ULL || lx != 0))
+    {
+      /* Interval (0.5, 1).  */
+      hx = (hx & 0x8000000000000000ULL) | 0x3fff000000000000ULL;
+      lx = 0;
+    }
+  else
+    {
+      /* Rounds to 0.  */
+      hx &= 0x8000000000000000ULL;
+      lx = 0;
+    }
+  SET_LDOUBLE_WORDS64 (x, hx, lx);
+  return x;
+}
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_roundevenl.c b/sysdeps/ieee754/ldbl-128ibm/s_roundevenl.c
new file mode 100644
index 0000000..cd91d39
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_roundevenl.c
@@ -0,0 +1,69 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   ldbl-128ibm version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+
+long double
+roundevenl (long double x)
+{
+  double xh, xl, hi;
+
+  ldbl_unpack (x, &xh, &xl);
+
+  if (xh != 0 && isfinite (xh))
+    {
+      hi = roundeven (xh);
+      if (hi != xh)
+	{
+	  /* The high part is not an integer; the low part only
+	     affects the result if the high part is exactly half way
+	     between two integers and the low part is nonzero in the
+	     opposite direction to the rounding of the high part.  */
+	  double diff = hi - xh;
+	  if (fabs (diff) == 0.5)
+	    {
+	      if (xl < 0 && diff > 0)
+		xh = hi - 1;
+	      else if (xl > 0 && diff < 0)
+		xh = hi + 1;
+	      else
+		xh = hi;
+	    }
+	  else
+	    xh = hi;
+	  xl = 0;
+	}
+      else
+	{
+	  /* The high part is a nonzero integer.  Rounding the low
+	     part to nearest, ties round to even, is always correct,
+	     as a high part that is an odd integer together with a low
+	     part with magnitude 0.5 is not a valid long double.  */
+	  xl = roundeven (xl);
+	  xh = hi;
+	  ldbl_canonicalize_int (&xh, &xl);
+	}
+    }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
+
+  return ldbl_pack (xh, xl);
+}
diff --git a/sysdeps/ieee754/ldbl-96/s_roundevenl.c b/sysdeps/ieee754/ldbl-96/s_roundevenl.c
new file mode 100644
index 0000000..f635b1f
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_roundevenl.c
@@ -0,0 +1,124 @@ 
+/* Round to nearest integer value, rounding halfway cases to even.
+   ldbl-96 version.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <stdint.h>
+
+#define BIAS 0x3fff
+#define MANT_DIG 64
+#define MAX_EXP (2 * BIAS + 1)
+
+long double
+roundevenl (long double x)
+{
+  uint16_t se;
+  uint32_t hx, lx;
+  GET_LDOUBLE_WORDS (se, hx, lx, x);
+  int exponent = se & 0x7fff;
+  if (exponent >= BIAS + MANT_DIG - 1)
+    {
+      /* Integer, infinity or NaN.  */
+      if (exponent == MAX_EXP)
+	/* Infinity or NaN; quiet signaling NaNs.  */
+	return x + x;
+      else
+	return x;
+    }
+  else if (exponent >= BIAS + MANT_DIG - 32)
+    {
+      /* Not necessarily an integer; integer bit is in low word.
+	 Locate the bits with exponents 0 and -1.  */
+      int int_pos = (BIAS + MANT_DIG - 1) - exponent;
+      int half_pos = int_pos - 1;
+      uint32_t half_bit = 1U << half_pos;
+      uint32_t int_bit = 1U << int_pos;
+      if ((lx & (int_bit | (half_bit - 1))) != 0)
+	{
+	  /* No need to test whether HALF_BIT is set.  */
+	  lx += half_bit;
+	  if (lx < half_bit)
+	    {
+	      hx++;
+	      if (hx == 0)
+		{
+		  hx = 0x80000000;
+		  se++;
+		}
+	    }
+	}
+      lx &= ~(int_bit - 1);
+    }
+  else if (exponent == BIAS + MANT_DIG - 33)
+    {
+      /* Not necessarily an integer; integer bit is bottom of high
+	 word, half bit is top of low word.  */
+      if (((hx & 1) | (lx & 0x7fffffff)) != 0)
+	{
+	  lx += 0x80000000;
+	  if (lx < 0x80000000)
+	    {
+	      hx++;
+	      if (hx == 0)
+		{
+		  hx = 0x80000000;
+		  se++;
+		}
+	    }
+	}
+      lx = 0;
+    }
+  else if (exponent >= BIAS)
+    {
+      /* At least 1; not necessarily an integer, integer bit and half
+	 bit are in the high word.  Locate the bits with exponents 0
+	 and -1.  */
+      int int_pos = (BIAS + MANT_DIG - 33) - exponent;
+      int half_pos = int_pos - 1;
+      uint32_t half_bit = 1U << half_pos;
+      uint32_t int_bit = 1U << int_pos;
+      if (((hx & (int_bit | (half_bit - 1))) | lx) != 0)
+	{
+	  hx += half_bit;
+	  if (hx < half_bit)
+	    {
+	      hx = 0x80000000;
+	      se++;
+	    }
+	}
+      hx &= ~(int_bit - 1);
+      lx = 0;
+    }
+  else if (exponent == BIAS - 1 && (hx > 0x80000000 || lx != 0))
+    {
+      /* Interval (0.5, 1).  */
+      se = (se & 0x8000) | 0x3fff;
+      hx = 0x80000000;
+      lx = 0;
+    }
+  else
+    {
+      /* Rounds to 0.  */
+      se &= 0x8000;
+      hx = 0;
+      lx = 0;
+    }
+  SET_LDOUBLE_WORDS (x, se, hx, lx);
+  return x;
+}
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index 99aa6c6..006d0d5 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -43,7 +43,8 @@  libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \
 		 isoc99_wscanf isoc99_fwscanf isoc99_swscanf \
 		 isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf \
 		 nextup nextdown totalorder totalordermag getpayload \
-		 canonicalize setpayload setpayloadsig llogb fmaxmag fminmag
+		 canonicalize setpayload setpayloadsig llogb fmaxmag fminmag \
+		 roundeven
 libnldbl-routines = $(libnldbl-calls:%=nldbl-%)
 libnldbl-inhibit-o = $(object-suffixes)
 libnldbl-static-only-routines = $(libnldbl-routines)
@@ -138,6 +139,7 @@  CFLAGS-nldbl-remainder.c = -fno-builtin-remainderl -fno-builtin-dreml
 CFLAGS-nldbl-remquo.c = -fno-builtin-remquol
 CFLAGS-nldbl-rint.c = -fno-builtin-rintl
 CFLAGS-nldbl-round.c = -fno-builtin-roundl
+CFLAGS-nldbl-roundeven.c = -fno-builtin-roundevenl
 CFLAGS-nldbl-scalb.c = -fno-builtin-scalbl
 CFLAGS-nldbl-scalbln.c = -fno-builtin-scalblnl
 CFLAGS-nldbl-scalbn.c = -fno-builtin-scalbnl
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-roundeven.c b/sysdeps/ieee754/ldbl-opt/nldbl-roundeven.c
new file mode 100644
index 0000000..cd52e73
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-roundeven.c
@@ -0,0 +1,26 @@ 
+/* Compatibility routine for IEEE double as long double for roundeven.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "nldbl-compat.h"
+
+double
+attribute_hidden
+roundevenl (double x)
+{
+  return roundeven (x);
+}
diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist
index 36fe57c..48483c5 100644
--- a/sysdeps/nacl/libm.abilist
+++ b/sysdeps/nacl/libm.abilist
@@ -401,6 +401,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 3afa24c..8059e40 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -433,6 +433,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 0d9823c..4128493 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -443,6 +443,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index c2acd83..7af2ea0 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -90,6 +90,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index dabaa17..14670bd 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -402,6 +402,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 929a8b0..ab94e90 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -446,6 +446,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index 7b21f78..ad89d24 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -375,6 +375,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index c2acd83..7af2ea0 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -90,6 +90,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index dd072f2..f09e2c2 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -444,6 +444,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index 2b9bcdb..652fa4a 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -401,6 +401,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 4894b34..3b34a14 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -403,6 +403,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 0f0798e..bec1e69 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -435,6 +435,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index 4ac5f07..3af5069 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -401,6 +401,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index 0b57578..b365e15 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -446,6 +446,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 1365d0c..f486c2f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -445,6 +445,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index 6f930d8..eeb5236 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -440,6 +440,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index 4407cbb..f719800 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -121,6 +121,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index 645106c..e720f35 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -433,6 +433,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 228724a..36bab6a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -431,6 +431,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index d234659..0dcfb78 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -402,6 +402,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 789ccd3..676d035 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -436,6 +436,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 2377bb2..3589368 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -434,6 +434,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
index bd57079..8323ccf 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
@@ -402,6 +402,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
index bd57079..8323ccf 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
@@ -402,6 +402,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
index bd57079..8323ccf 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
@@ -402,6 +402,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 801da8a..34ece25 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -435,6 +435,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 3c7082e..d23a83d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -434,6 +434,9 @@  GLIBC_2.25 getpayloadl F
 GLIBC_2.25 llogb F
 GLIBC_2.25 llogbf F
 GLIBC_2.25 llogbl F
+GLIBC_2.25 roundeven F
+GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenl F
 GLIBC_2.25 setpayload F
 GLIBC_2.25 setpayloadf F
 GLIBC_2.25 setpayloadl F