This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Add fromfp functions [committed]


TS 18661-1 defines fromfp functions (fromfp, fromfpx, ufromfp,
ufromfpx, and float and long double variants) to convert from
floating-point to an integer type with any signedness and any given
width up to that of intmax_t, in any of the five IEEE rounding modes
(the usual four for binary floating point, plus rounding to nearest
with ties rounding away from zero), with control of whether in-range
non-integer values should result in the "inexact" exception being
raised.  This patch implements these functions for glibc.

These implementations are (apart from raising exceptions) pure integer
implementations; it's entirely possible optimized versions could be
devised for some architectures.  A common math/fromfp.h header
provides various common helper code that can readily be shared between
the implementations for different types.  For each type, the bulk of
the implementation is also shared between the four functions, with
wrappers that define UNSIGNED and INEXACT macros appropriately before
including the main implementation.

As the functions return intmax_t and uintmax_t without math.h being
allowed to expose those typedef names, they are declared using
__intmax_t and __uintmax_t as obtained from <bits/types.h>.

The FP_INT_* rounding direction macros are defined as ascending
integers in the order the names are listed in the TS; I see no
significant value in allowing architectures to vary the values of
them.

The libm-test machinery is duly adapted to handle unsigned int
arguments, and intmax_t and uintmax_t results.  Because each test
input is generally tested for four functions, five rounding modes and
several different widths, the libm-test.inc additions are very large.
Thus, the diffs in the body of this message exclude the libm-test.inc
changes, with the full patch being attached gzipped.  The bulk of the
new tests were generated (expanded from a test input plus rounding
results and information about where it lies in the relevant interval
between integers, to libm-test tests for all relevant combinations of
function, rounding direction and width) by a script that's included in
the patch as math/gen-fromfp-tests.py (input data
math/gen-fromfp-tests-inputs); as an ad hoc script that's not really
expected to be rerun, it's not very polished, but it's at least
plausibly useful for adding any further tests for these functions in
future.  I may split the libm-test tests up by function in future (so
both libm-test.inc and auto-libm-test-out are split into separate
files, and the tests for each function are also built and run
separately), but not for 2.25.

For no obvious reason, adding tgmath tests for the new functions
resulted in -Wuninitialized errors from test-tgmath.c about the
variable i being used uninitialized.  Those errors were correct - the
variable is read by the frexp version in test-tgmath.c (where real
frexp would write through that pointer instead of reading it) - but I
don't know why this patch would result in the pre-existing issue being
newly detected.  The patch initializes the variable to avoid those
errors.

With these changes, glibc 2.25 should have all the library features
from TS 18661-1 other than the functions that round result to narrower
type (and constant rounding directions, but I'm considering those
mainly a compiler feature not a library one).

Tested for x86_64, x86, mips64 and powerpc.  Committed.

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

	* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
	(fromfp): New declaration.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (fromfpx): Likewise.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (ufromfp): Likewise.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (ufromfpx): Likewise.
	* math/tgmath.h (__TGMATH_TERNARY_FIRST_REAL_RET_ONLY): New macro.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (fromfp): Likewise.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (ufromfp): Likewise.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (fromfpx): Likewise.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (ufromfpx): Likewise.
	* math/math.h: Include <bits/types.h>.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (FP_INT_UPWARD): New enum
	constant and macro.
	(FP_INT_DOWNWARD): Likewise.
	(FP_INT_TOWARDZERO): Likewise.
	(FP_INT_TONEARESTFROMZERO): Likewise.
	(FP_INT_TONEAREST): Likewise.
	* math/Versions (fromfp): New libm symbol at version GLIBC_2.25.
	(fromfpf): Likewise.
	(fromfpl): Likewise.
	(ufromfp): Likewise.
	(ufromfpf): Likewise.
	(ufromfpl): Likewise.
	(fromfpx): Likewise.
	(fromfpxf): Likewise.
	(fromfpxl): Likewise.
	(ufromfpx): Likewise.
	(ufromfpxf): Likewise.
	(ufromfpxl): Likewise.
	* math/Makefile (libm-calls): Add s_fromfpF, s_ufromfpF,
	s_fromfpxF and s_ufromfpxF.
	* math/gen-fromfp-tests.py: New file.
	* math/gen-fromfp-tests-inputs: Likewise.
	* math/libm-test.inc: Include <stdint.h>
	(check_intmax_t): New function.
	(check_uintmax_t): Likewise.
	(struct test_fiu_M_data): New type.
	(struct test_fiu_U_data): Likewise.
	(RUN_TEST_fiu_M): New macro.
	(RUN_TEST_LOOP_fiu_M): Likewise.
	(RUN_TEST_fiu_U): Likewise.
	(RUN_TEST_LOOP_fiu_U): Likewise.
	(fromfp_test_data): New array.
	(fromfp_test): New function.
	(fromfpx_test_data): New array.
	(fromfpx_test): New function.
	(ufromfp_test_data): New array.
	(ufromfp_test): New function.
	(ufromfpx_test_data): New array.
	(ufromfpx_test): New function.
	(main): Call fromfp_test, fromfpx_test, ufromfp_test and
	ufromfpx_test.
	* math/gen-libm-test.pl (parse_args): Handle u, M and U descriptor
	characters.
	* math/test-tgmath-ret.c: Include <stdint.h>.
	(rm): New variable.
	(width): Likewise.
	(CHECK_RET_CONST_TYPE): Take extra arguments and pass them to
	called function.
	(CHECK_RET_CONST_FLOAT): Take extra arguments and pass them to
	CHECK_RET_CONST_TYPE.
	(CHECK_RET_CONST_DOUBLE): Likewise.
	(CHECK_RET_CONST_LDOUBLE): Likewise.
	(CHECK_RET_CONST): Take extra arguments and pass them to calls
	macros.
	(fromfp): New CHECK_RET_CONST call.
	(ufromfp): Likewise.
	(fromfpx): Likewise.
	(ufromfpx): Likewise.
	(do_test): Call check_return_fromfp, check_return_ufromfp,
	check_return_fromfpx and check_return_ufromfpx.
	* math/test-tgmath.c: Include <stdint.h>
	(NCALLS): Increase to 138.
	(F(compile_test)): Initialize i.  Call fromfp functions.
	(F(fromfp)): New function.
	(F(fromfpx)): Likewise.
	(F(ufromfp)): Likewise.
	(F(ufromfpx)): Likewise.
	* manual/arith.texi (Rounding Functions): Document FP_INT_UPWARD,
	FP_INT_DOWNWARD, FP_INT_TOWARDZERO, FP_INT_TONEARESTFROMZERO,
	FP_INT_TONEAREST, fromfp, fromfpf, fromfpl, ufromfp, ufromfpf,
	ufromfpl, fromfpx, fromfpxf, fromfpxl, ufromfpx, ufromfpxf and
	ufromfpxl.
	* manual/libm-err-tab.pl (@all_functions): Add fromfp, fromfpx,
	ufromfp and ufromfpx.
	* math/fromfp.h: New file.
	* sysdeps/ieee754/dbl-64/s_fromfp.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_fromfp_main.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_fromfpx.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_ufromfp.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_ufromfpx.c: Likewise.
	* sysdeps/ieee754/flt-32/s_fromfpf.c: Likewise.
	* sysdeps/ieee754/flt-32/s_fromfpf_main.c: Likewise.
	* sysdeps/ieee754/flt-32/s_fromfpxf.c: Likewise.
	* sysdeps/ieee754/flt-32/s_ufromfpf.c: Likewise.
	* sysdeps/ieee754/flt-32/s_ufromfpxf.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_fromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_fromfpl_main.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_fromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_ufromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_ufromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_fromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_fromfpl_main.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_fromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_ufromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_ufromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_fromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_fromfpl_main.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_fromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_ufromfpl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_ufromfpxl.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add fromfp,
	ufromfp, fromfpx and ufromfpx.
	(CFLAGS-nldbl-fromfp.c): New variable.
	(CFLAGS-nldbl-fromfpx.c): Likewise.
	(CFLAGS-nldbl-ufromfp.c): Likewise.
	(CFLAGS-nldbl-ufromfpx.c): Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-compat.h: Include <stdint.h>.
	* sysdeps/ieee754/ldbl-opt/nldbl-fromfp.c: New file.
	* sysdeps/ieee754/ldbl-opt/nldbl-fromfpx.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-ufromfp.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-ufromfpx.c: Likewise.
	* 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 --git a/NEWS b/NEWS
index 77b1a0c..1c855cc 100644
--- a/NEWS
+++ b/NEWS
@@ -66,7 +66,9 @@ Version 2.25
 
   - Signaling NaN macros: SNANF, SNAN, SNANL.
 
-  - Nearest integer functions: roundeven, roundevenf, roundevenl.
+  - Nearest integer functions: roundeven, roundevenf, roundevenl, fromfp,
+    fromfpf, fromfpl, ufromfp, ufromfpf, ufromfpl, fromfpx, fromfpxf,
+    fromfpxl, ufromfpx, ufromfpxf, ufromfpxl.
 
   - llogb functions: the llogb, llogbf and llogbl functions, and the
     FP_LLOGB0 and FP_LLOGBNAN macros.
diff --git a/manual/arith.texi b/manual/arith.texi
index f35c3cd..dec12a0 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -1495,6 +1495,37 @@ result can actually be represented as an @code{int}---for very large
 numbers, this is impossible.  The functions listed here return the
 result as a @code{double} instead to get around this problem.
 
+The @code{fromfp} functions use the following macros, from TS
+18661-1:2014, to specify the direction of rounding.  These correspond
+to the rounding directions defined in IEEE 754-2008.
+
+@vtable @code
+@comment math.h
+@comment ISO
+@item FP_INT_UPWARD
+Round toward @math{+@infinity{}}.
+
+@comment math.h
+@comment ISO
+@item FP_INT_DOWNWARD
+Round toward @math{-@infinity{}}.
+
+@comment math.h
+@comment ISO
+@item FP_INT_TOWARDZERO
+Round toward zero.
+
+@comment math.h
+@comment ISO
+@item FP_INT_TONEARESTFROMZERO
+Round to nearest, ties round away from zero.
+
+@comment math.h
+@comment ISO
+@item FP_INT_TONEAREST
+Round to nearest, ties round to even.
+@end vtable
+
 @comment math.h
 @comment ISO
 @deftypefun double ceil (double @var{x})
@@ -1660,6 +1691,56 @@ These functions are just like @code{round}, but they return a
 @code{long long int} instead of a floating-point number.
 @end deftypefun
 
+@comment math.h
+@comment ISO
+@deftypefun intmax_t fromfp (double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx intmax_t fromfpf (float @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx intmax_t fromfpl (long double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfp (double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfpf (float @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfpl (long double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx intmax_t fromfpx (double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx intmax_t fromfpxf (float @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx intmax_t fromfpxl (long double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfpx (double @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfpxf (float @var{x}, int @var{round}, unsigned int @var{width})
+@comment math.h
+@comment ISO
+@deftypefunx uintmax_t ufromfpxl (long double @var{x}, int @var{round}, unsigned int @var{width})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+These functions, from TS 18661-1:2014, convert a floating-point number
+to an integer according to the rounding direction @var{round} (one of
+the @code{FP_INT_*} macros).  If the integer is outside the range of a
+signed or unsigned (depending on the return type of the function) type
+of width @var{width} bits (or outside the range of the return type, if
+@var{width} is larger), or if @var{x} is infinite or NaN, or if
+@var{width} is zero, a domain error occurs and an unspecified value is
+returned.  The functions with an @samp{x} in their names raise the
+inexact exception when a domain error does not occur and the argument
+is not an integer; the other functions do not raise the inexact
+exception.
+@end deftypefun
+
 
 @comment math.h
 @comment ISO
diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl
index 9b8aa66..fc6fd30 100755
--- a/manual/libm-err-tab.pl
+++ b/manual/libm-err-tab.pl
@@ -57,13 +57,14 @@ use vars qw (%results @all_floats %suffices @all_functions);
     "clog", "clog10", "conj", "copysign", "cos", "cosh", "cpow", "cproj",
     "creal", "csin", "csinh", "csqrt", "ctan", "ctanh", "erf", "erfc",
     "exp", "exp10", "exp2", "expm1", "fabs", "fdim", "floor", "fma",
-    "fmax", "fmaxmag", "fmin", "fminmag", "fmod", "frexp", "gamma", "hypot",
+    "fmax", "fmaxmag", "fmin", "fminmag", "fmod", "frexp", "fromfp", "fromfpx",
+    "gamma", "hypot",
     "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", "roundeven",
     "scalb", "scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh",
-    "tgamma", "trunc", "y0", "y1", "yn" );
+    "tgamma", "trunc", "ufromfp", "ufromfpx", "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 7b2eb5a..d0b2e0c 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -75,7 +75,8 @@ 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 s_roundevenF $(gen-libm-calls)
+	s_setpayloadF s_setpayloadsigF s_roundevenF s_fromfpF s_ufromfpF  \
+	s_fromfpxF s_ufromfpxF $(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 b6a4fa3..e409de0 100644
--- a/math/Versions
+++ b/math/Versions
@@ -226,5 +226,7 @@ libm {
     llogb; llogbf; llogbl;
     fmaxmag; fmaxmagf; fmaxmagl; fminmag; fminmagf; fminmagl;
     roundeven; roundevenf; roundevenl;
+    fromfp; fromfpf; fromfpl; ufromfp; ufromfpf; ufromfpl;
+    fromfpx; fromfpxf; fromfpxl; ufromfpx; ufromfpxf; ufromfpxl;
   }
 }
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index 4fd8bab..3c6491b 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -388,6 +388,28 @@ __END_NAMESPACE_C99
 /* Round X to nearest integer value, rounding halfway cases to even.  */
 __MATHCALLX (roundeven,, (_Mdouble_ __x), (__const__));
 
+/* Round X to nearest signed integer value, not raising inexact, with
+   control of rounding direction and width of result.  */
+__MATHDECL (__intmax_t, fromfp,, (_Mdouble_ __x, int __round,
+				  unsigned int __width));
+
+/* Round X to nearest unsigned integer value, not raising inexact,
+   with control of rounding direction and width of result.  */
+__MATHDECL (__uintmax_t, ufromfp,, (_Mdouble_ __x, int __round,
+				    unsigned int __width));
+
+/* Round X to nearest signed integer value, raising inexact for
+   non-integers, with control of rounding direction and width of
+   result.  */
+__MATHDECL (__intmax_t, fromfpx,, (_Mdouble_ __x, int __round,
+				   unsigned int __width));
+
+/* Round X to nearest unsigned integer value, raising inexact for
+   non-integers, with control of rounding direction and width of
+   result.  */
+__MATHDECL (__uintmax_t, ufromfpx,, (_Mdouble_ __x, int __round,
+				     unsigned int __width));
+
 /* Return value with maximum magnitude.  */
 __MATHCALLX (fmaxmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
 
diff --git a/math/fromfp.h b/math/fromfp.h
new file mode 100644
index 0000000..5d68123
--- /dev/null
+++ b/math/fromfp.h
@@ -0,0 +1,174 @@
+/* Round to integer type.  Common helper functions.
+   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 <errno.h>
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+/* The including file should have defined UNSIGNED to 0 (signed return
+   type) or 1 (unsigned return type), INEXACT to 0 (no inexact
+   exceptions) or 1 (raise inexact exceptions) and RET_TYPE to the
+   return type (intmax_t or uintmax_t).  */
+
+/* Return the maximum unbiased exponent for an argument (negative if
+   NEGATIVE is set) that might be in range for a call to a fromfp
+   function with width WIDTH (greater than 0, and not exceeding that
+   of intmax_t).  The truncated argument may still be out of range in
+   the case of negative arguments, and if not out of range it may
+   become out of range as a result of rounding.  */
+
+static int
+fromfp_max_exponent (bool negative, int width)
+{
+  if (UNSIGNED)
+    return negative ? -1 : width - 1;
+  else
+    return negative ? width - 1 : width - 2;
+}
+
+/* Return the result of rounding an integer value X (passed as the
+   absolute value; NEGATIVE is true if the value is negative), where
+   HALF_BIT is true if the bit with value 0.5 is set and MORE_BITS is
+   true if any lower bits are set, in the rounding direction
+   ROUND.  */
+
+static uintmax_t
+fromfp_round (bool negative, uintmax_t x, bool half_bit, bool more_bits,
+	      int round)
+{
+  switch (round)
+    {
+    case FP_INT_UPWARD:
+      return x + (!negative && (half_bit || more_bits));
+
+    case FP_INT_DOWNWARD:
+      return x + (negative && (half_bit || more_bits));
+
+    case FP_INT_TOWARDZERO:
+    default:
+      /* Unknown rounding directions are defined to mean unspecified
+	 rounding; treat this as truncation.  */
+      return x;
+
+    case FP_INT_TONEARESTFROMZERO:
+      return x + half_bit;
+
+    case FP_INT_TONEAREST:
+      return x + (half_bit && ((x & 1) || more_bits));
+    }
+}
+
+/* Integer rounding, of a value whose exponent EXPONENT did not exceed
+   the maximum exponent MAX_EXPONENT and so did not necessarily
+   overflow, has produced X (possibly wrapping to 0); the sign is
+   negative if NEGATIVE is true.  Return whether this overflowed the
+   allowed width.  */
+
+static bool
+fromfp_overflowed (bool negative, uintmax_t x, int exponent, int max_exponent)
+{
+  if (UNSIGNED)
+    {
+      if (negative)
+	return x != 0;
+      else if (max_exponent == INTMAX_WIDTH - 1)
+	return exponent == INTMAX_WIDTH - 1 && x == 0;
+      else
+	return x == (1ULL << (max_exponent + 1));
+    }
+  else
+    {
+      if (negative)
+	return exponent == max_exponent && x != (1ULL << max_exponent);
+      else
+	return x == (1ULL << (max_exponent + 1));
+    }
+}
+
+/* Handle a domain error for a call to a fromfp function with an
+   argument which is negative if NEGATIVE is set, and specified width
+   (not exceeding that of intmax_t) WIDTH.  The return value is
+   unspecified (with it being unclear if the result needs to fit
+   within WIDTH bits in this case); we choose to saturate to the given
+   number of bits (treating NaNs like any other value).  */
+
+static RET_TYPE
+fromfp_domain_error (bool negative, unsigned int width)
+{
+  feraiseexcept (FE_INVALID);
+  __set_errno (EDOM);
+  /* The return value is unspecified; we choose to saturate to the
+     given number of bits (treating NaNs like any other value).  */
+  if (UNSIGNED)
+    {
+      if (negative)
+	return 0;
+      else if (width == INTMAX_WIDTH)
+	return -1;
+      else
+	return (1ULL << width) - 1;
+    }
+  else
+    {
+      if (width == 0)
+	return 0;
+      else if (negative)
+	return -(1ULL << (width - 1));
+      else
+	return (1ULL << (width - 1)) - 1;
+    }
+}
+
+/* Given X, the absolute value of a floating-point number (negative if
+   NEGATIVE is set) truncated towards zero, where HALF_BIT is true if
+   the bit with value 0.5 is set and MORE_BITS is true if any lower
+   bits are set, round it in the rounding direction ROUND, handle
+   errors and exceptions and return the appropriate return value for a
+   fromfp function.  X originally had floating-point exponent
+   EXPONENT, which does not exceed MAX_EXPONENT, the return value from
+   fromfp_max_exponent with width WIDTH.  */
+
+static RET_TYPE
+fromfp_round_and_return (bool negative, uintmax_t x, bool half_bit,
+			 bool more_bits, int round, int exponent,
+			 int max_exponent, unsigned int width)
+{
+  uintmax_t uret = fromfp_round (negative, x, half_bit, more_bits, round);
+  if (fromfp_overflowed (negative, uret, exponent, max_exponent))
+    return fromfp_domain_error (negative, width);
+
+  if (INEXACT && (half_bit || more_bits))
+    {
+      /* There is no need for this to use the specific floating-point
+	 type for which this header is included, and there is no need
+	 for this header to know that type at all, so just use float
+	 here.  */
+      float force_inexact = 1.0f + FLT_MIN;
+      math_force_eval (force_inexact);
+    }
+  if (UNSIGNED)
+    /* A negative argument not rounding to zero will already have
+       produced a domain error.  */
+    return uret;
+  else
+    return negative ? -uret : uret;
+}
diff --git a/math/gen-fromfp-tests-inputs b/math/gen-fromfp-tests-inputs
new file mode 100644
index 0000000..ea0f305
--- /dev/null
+++ b/math/gen-fromfp-tests-inputs
@@ -0,0 +1,426 @@
+    /* Integer inputs within range of uintmax_t.  */
+i 1:1
+i -1:1
+i 2:2
+i -2:2
+i 3:2
+i -3:3
+i 4:3
+i -4:3
+i 5:3
+i -5:4
+i 6:3
+i -6:4
+i 7:3
+i -7:4
+i 8:4
+i -8:4
+i 9:4
+i -9:5
+i 15:4
+i -15:5
+i 16:5
+i -16:5
+i 17:5
+i -17:6
+i 0x3fffff:22
+i -0x3fffff:23
+i 0x400000:23
+i -0x400000:23
+i 0x400001:23
+i -0x400001:24
+i 0x7fffff:23
+i -0x7fffff:24
+i 0x800000:24
+i -0x800000:24
+i 0x800001:24
+i -0x800001:25
+i 0xffffff:24
+i -0xffffff:25
+i 0x1000000:25
+i -0x1000000:25
+#if MANT_DIG >= 53
+i 0x1000001:25
+i -0x1000001:26
+i 0x7ffffffffffffLL:51
+i -0x7ffffffffffffLL:52
+#endif
+i 0x8000000000000LL:52
+i -0x8000000000000LL:52
+#if MANT_DIG >= 53
+i 0x8000000000001LL:52
+i -0x8000000000001LL:53
+i 0xfffffffffffffLL:52
+i -0xfffffffffffffLL:53
+#endif
+i 0x10000000000000LL:53
+i -0x10000000000000LL:53
+#if MANT_DIG >= 53
+i 0x10000000000001LL:53
+i -0x10000000000001LL:54
+i 0x1fffffffffffffLL:53
+i -0x1fffffffffffffLL:54
+#endif
+i 0x20000000000000LL:54
+i -0x20000000000000LL:54
+#if MANT_DIG >= 64
+i 0x20000000000001LL:54
+i -0x20000000000001LL:55
+i 0x3fffffffffffffffLL:62
+i -0x3fffffffffffffffLL:63
+#endif
+i 0x4000000000000000LL:63
+i -0x4000000000000000LL:63
+#if MANT_DIG >= 64
+i 0x4000000000000001LL:63
+i -0x4000000000000001LL:64
+i 0x7fffffffffffffffLL:63
+i -0x7fffffffffffffffLL:64
+#endif
+i 0x8000000000000000ULL:64
+i -INT64_MAX-1:64
+#if MANT_DIG >= 64
+i 0x8000000000000001ULL:64
+i 0xffffffffffffffffULL:64
+#endif
+i 0x7fffff8000000000LL:63
+i -0x7fffff8000000000LL:64
+i 0x8000010000000000ULL:64
+i 0xffffff0000000000ULL:64
+#if MANT_DIG >= 53
+i 0x7ffffffffffffc00LL:63
+i -0x7ffffffffffffc00LL:64
+i 0x8000000000000800ULL:64
+i 0xfffffffffffff800ULL:64
+#endif
+
+    /* Inputs with absolute value between 0 and 1.  */
+t min_subnorm_value a 0:1 1:1
+t -min_subnorm_value a 0:1 -1:1
+t min_value a 0:1 1:1
+t -min_value a 0:1 -1:1
+t 0.1 a 0:1 1:1
+t -0.1 a 0:1 -1:1
+t 0.25 a 0:1 1:1
+t -0.25 a 0:1 -1:1
+t 0.499 a 0:1 1:1
+t -0.499 a 0:1 -1:1
+t 0x0.ffffffp-1 a 0:1 1:1
+t -0x0.ffffffp-1 a 0:1 -1:1
+#if MANT_DIG >= 53
+t 0x0.fffffffffffff8p-1 a 0:1 1:1
+t -0x0.fffffffffffff8p-1 a 0:1 -1:1
+#endif
+#if MANT_DIG >= 64
+t 0x0.ffffffffffffffffp-1 a 0:1 1:1
+t -0x0.ffffffffffffffffp-1 a 0:1 -1:1
+#endif
+#if MANT_DIG >= 106
+t 0x0.ffffffffffffffffffffffffffcp-1 a 0:1 1:1
+t -0x0.ffffffffffffffffffffffffffcp-1 a 0:1 -1:1
+#endif
+#if MANT_DIG >= 113
+t 0x0.ffffffffffffffffffffffffffff8p-1 a 0:1 1:1
+t -0x0.ffffffffffffffffffffffffffff8p-1 a 0:1 -1:1
+#endif
+t 0.5 be 0:1 1:1
+t -0.5 be 0:1 -1:1
+t 0x1.000002p-1 c 0:1 1:1
+t -0x1.000002p-1 c 0:1 -1:1
+#if MANT_DIG >= 53
+t 0x1.0000000000001p-1 c 0:1 1:1
+t -0x1.0000000000001p-1 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 64
+t 0x1.0000000000000002p-1 c 0:1 1:1
+t -0x1.0000000000000002p-1 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 106
+t 0x1.000000000000000000000000008p-1 c 0:1 1:1
+t -0x1.000000000000000000000000008p-1 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 113
+t 0x1.0000000000000000000000000001p-1 c 0:1 1:1
+t -0x1.0000000000000000000000000001p-1 c 0:1 -1:1
+#endif
+t 0.501 c 0:1 1:1
+t -0.501 c 0:1 -1:1
+t 0.75 c 0:1 1:1
+t -0.75 c 0:1 -1:1
+t 0.9 c 0:1 1:1
+t -0.9 c 0:1 -1:1
+t 0x0.ffffffp0 c 0:1 1:1
+t -0x0.ffffffp0 c 0:1 -1:1
+#if MANT_DIG >= 53
+t 0x0.fffffffffffff8p0 c 0:1 1:1
+t -0x0.fffffffffffff8p0 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 64
+t 0x0.ffffffffffffffffp0 c 0:1 1:1
+t -0x0.ffffffffffffffffp0 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 106
+t 0x0.ffffffffffffffffffffffffffcp0 c 0:1 1:1
+t -0x0.ffffffffffffffffffffffffffcp0 c 0:1 -1:1
+#endif
+#if MANT_DIG >= 113
+t 0x0.ffffffffffffffffffffffffffff8p0 c 0:1 1:1
+t -0x0.ffffffffffffffffffffffffffff8p0 c 0:1 -1:1
+#endif
+
+    /* Various non-integer inputs.  */
+t 1.25 a 1:1 2:2
+t -1.25 a -1:1 -2:2
+t 1.5 bo 1:1 2:2
+t -1.5 bo -1:1 -2:2
+t 1.75 c 1:1 2:2
+t -1.75 c -1:1 -2:2
+t 2.25 a 2:2 3:2
+t -2.25 a -2:2 -3:3
+t 2.5 be 2:2 3:2
+t -2.5 be -2:2 -3:3
+t 2.75 c 2:2 3:2
+t -2.75 c -2:2 -3:3
+t 3.25 a 3:2 4:3
+t -3.25 a -3:3 -4:3
+t 3.5 bo 3:2 4:3
+t -3.5 bo -3:3 -4:3
+t 3.75 c 3:2 4:3
+t -3.75 c -3:3 -4:3
+t 4.25 a 4:3 5:3
+t -4.25 a -4:3 -5:4
+t 4.5 be 4:3 5:3
+t -4.5 be -4:3 -5:4
+t 4.75 c 4:3 5:3
+t -4.75 c -4:3 -5:4
+t 5.25 a 5:3 6:3
+t -5.25 a -5:4 -6:4
+t 5.5 bo 5:3 6:3
+t -5.5 bo -5:4 -6:4
+t 5.75 c 5:3 6:3
+t -5.75 c -5:4 -6:4
+
+    /* 1, 1.5, 2, 2.5, 3, 3.5 +/- 1ulp.  */
+t 0x1.000002p0 a 1:1 2:2
+t -0x1.000002p0 a -1:1 -2:2
+t 0x2.fffffcp-1 a 1:1 2:2
+t -0x2.fffffcp-1 a -1:1 -2:2
+t 0x3.000004p-1 c 1:1 2:2
+t -0x3.000004p-1 c -1:1 -2:2
+t 0x0.ffffffp1 c 1:1 2:2
+t -0x0.ffffffp1 c -1:1 -2:2
+t 0x1.000002p1 a 2:2 3:2
+t -0x1.000002p1 a -2:2 -3:3
+t 0x4.fffff8p-1 a 2:2 3:2
+t -0x4.fffff8p-1 a -2:2 -3:3
+t 0x5.000008p-1 c 2:2 3:2
+t -0x5.000008p-1 c -2:2 -3:3
+t 0x2.fffffcp0 c 2:2 3:2
+t -0x2.fffffcp0 c -2:2 -3:3
+t 0x3.000004p0 a 3:2 4:3
+t -0x3.000004p0 a -3:3 -4:3
+t 0x6.fffff8p-1 a 3:2 4:3
+t -0x6.fffff8p-1 a -3:3 -4:3
+t 0x7.000008p-1 c 3:2 4:3
+t -0x7.000008p-1 c -3:3 -4:3
+#if MANT_DIG >= 53
+t 0x1.0000000000001p0 a 1:1 2:2
+t -0x1.0000000000001p0 a -1:1 -2:2
+t 0x2.ffffffffffffep-1 a 1:1 2:2
+t -0x2.ffffffffffffep-1 a -1:1 -2:2
+t 0x3.0000000000002p-1 c 1:1 2:2
+t -0x3.0000000000002p-1 c -1:1 -2:2
+t 0x0.fffffffffffff8p1 c 1:1 2:2
+t -0x0.fffffffffffff8p1 c -1:1 -2:2
+t 0x1.0000000000001p1 a 2:2 3:2
+t -0x1.0000000000001p1 a -2:2 -3:3
+t 0x4.ffffffffffffcp-1 a 2:2 3:2
+t -0x4.ffffffffffffcp-1 a -2:2 -3:3
+t 0x5.0000000000004p-1 c 2:2 3:2
+t -0x5.0000000000004p-1 c -2:2 -3:3
+t 0x2.ffffffffffffep0 c 2:2 3:2
+t -0x2.ffffffffffffep0 c -2:2 -3:3
+t 0x3.0000000000002p0 a 3:2 4:3
+t -0x3.0000000000002p0 a -3:3 -4:3
+t 0x6.ffffffffffffcp-1 a 3:2 4:3
+t -0x6.ffffffffffffcp-1 a -3:3 -4:3
+t 0x7.0000000000004p-1 c 3:2 4:3
+t -0x7.0000000000004p-1 c -3:3 -4:3
+#endif
+#if MANT_DIG >= 64
+t 0x1.0000000000000002p0 a 1:1 2:2
+t -0x1.0000000000000002p0 a -1:1 -2:2
+t 0x2.fffffffffffffffcp-1 a 1:1 2:2
+t -0x2.fffffffffffffffcp-1 a -1:1 -2:2
+t 0x3.0000000000000004p-1 c 1:1 2:2
+t -0x3.0000000000000004p-1 c -1:1 -2:2
+t 0x0.ffffffffffffffffp1 c 1:1 2:2
+t -0x0.ffffffffffffffffp1 c -1:1 -2:2
+t 0x1.0000000000000002p1 a 2:2 3:2
+t -0x1.0000000000000002p1 a -2:2 -3:3
+t 0x4.fffffffffffffff8p-1 a 2:2 3:2
+t -0x4.fffffffffffffff8p-1 a -2:2 -3:3
+t 0x5.0000000000000008p-1 c 2:2 3:2
+t -0x5.0000000000000008p-1 c -2:2 -3:3
+t 0x2.fffffffffffffffcp0 c 2:2 3:2
+t -0x2.fffffffffffffffcp0 c -2:2 -3:3
+t 0x3.0000000000000004p0 a 3:2 4:3
+t -0x3.0000000000000004p0 a -3:3 -4:3
+t 0x6.fffffffffffffff8p-1 a 3:2 4:3
+t -0x6.fffffffffffffff8p-1 a -3:3 -4:3
+t 0x7.0000000000000008p-1 c 3:2 4:3
+t -0x7.0000000000000008p-1 c -3:3 -4:3
+#endif
+#if MANT_DIG >= 106
+t 0x1.000000000000000000000000008p0 a 1:1 2:2
+t -0x1.000000000000000000000000008p0 a -1:1 -2:2
+t 0x2.ffffffffffffffffffffffffffp-1 a 1:1 2:2
+t -0x2.ffffffffffffffffffffffffffp-1 a -1:1 -2:2
+t 0x3.00000000000000000000000001p-1 c 1:1 2:2
+t -0x3.00000000000000000000000001p-1 c -1:1 -2:2
+t 0x0.ffffffffffffffffffffffffffcp1 c 1:1 2:2
+t -0x0.ffffffffffffffffffffffffffcp1 c -1:1 -2:2
+t 0x1.000000000000000000000000008p1 a 2:2 3:2
+t -0x1.000000000000000000000000008p1 a -2:2 -3:3
+t 0x4.fffffffffffffffffffffffffep-1 a 2:2 3:2
+t -0x4.fffffffffffffffffffffffffep-1 a -2:2 -3:3
+t 0x5.00000000000000000000000002p-1 c 2:2 3:2
+t -0x5.00000000000000000000000002p-1 c -2:2 -3:3
+t 0x2.ffffffffffffffffffffffffffp0 c 2:2 3:2
+t -0x2.ffffffffffffffffffffffffffp0 c -2:2 -3:3
+t 0x3.00000000000000000000000001p0 a 3:2 4:3
+t -0x3.00000000000000000000000001p0 a -3:3 -4:3
+t 0x6.fffffffffffffffffffffffffep-1 a 3:2 4:3
+t -0x6.fffffffffffffffffffffffffep-1 a -3:3 -4:3
+t 0x7.00000000000000000000000002p-1 c 3:2 4:3
+t -0x7.00000000000000000000000002p-1 c -3:3 -4:3
+#endif
+#if MANT_DIG >= 113
+t 0x1.0000000000000000000000000001p0 a 1:1 2:2
+t -0x1.0000000000000000000000000001p0 a -1:1 -2:2
+t 0x2.fffffffffffffffffffffffffffep-1 a 1:1 2:2
+t -0x2.fffffffffffffffffffffffffffep-1 a -1:1 -2:2
+t 0x3.0000000000000000000000000002p-1 c 1:1 2:2
+t -0x3.0000000000000000000000000002p-1 c -1:1 -2:2
+t 0x0.ffffffffffffffffffffffffffff8p1 c 1:1 2:2
+t -0x0.ffffffffffffffffffffffffffff8p1 c -1:1 -2:2
+t 0x1.0000000000000000000000000001p1 a 2:2 3:2
+t -0x1.0000000000000000000000000001p1 a -2:2 -3:3
+t 0x4.fffffffffffffffffffffffffffcp-1 a 2:2 3:2
+t -0x4.fffffffffffffffffffffffffffcp-1 a -2:2 -3:3
+t 0x5.0000000000000000000000000004p-1 c 2:2 3:2
+t -0x5.0000000000000000000000000004p-1 c -2:2 -3:3
+t 0x2.fffffffffffffffffffffffffffep0 c 2:2 3:2
+t -0x2.fffffffffffffffffffffffffffep0 c -2:2 -3:3
+t 0x3.0000000000000000000000000002p0 a 3:2 4:3
+t -0x3.0000000000000000000000000002p0 a -3:3 -4:3
+t 0x6.fffffffffffffffffffffffffffcp-1 a 3:2 4:3
+t -0x6.fffffffffffffffffffffffffffcp-1 a -3:3 -4:3
+t 0x7.0000000000000000000000000004p-1 c 3:2 4:3
+t -0x7.0000000000000000000000000004p-1 c -3:3 -4:3
+#endif
+
+    /* 31, 32, 33 fractional bits.  */
+#if MANT_DIG >= 53
+t 0x200000.7ffffffep0 a 0x200000:22 0x200001:22
+t -0x200000.7ffffffep0 a -0x200000:22 -0x200001:23
+t 0x200000.8p0 be 0x200000:22 0x200001:22
+t -0x200000.8p0 be -0x200000:22 -0x200001:23
+t 0x200000.80000002p0 c 0x200000:22 0x200001:22
+t -0x200000.80000002p0 c -0x200000:22 -0x200001:23
+t 0x200001.7ffffffep0 a 0x200001:22 0x200002:22
+t -0x200001.7ffffffep0 a -0x200001:23 -0x200002:23
+t 0x200001.8p0 bo 0x200001:22 0x200002:22
+t -0x200001.8p0 bo -0x200001:23 -0x200002:23
+t 0x200001.80000002p0 c 0x200001:22 0x200002:22
+t -0x200001.80000002p0 c -0x200001:23 -0x200002:23
+t 0x3fffff.fffffffep0 c 0x3fffff:22 0x400000:23
+t -0x3fffff.fffffffep0 c -0x3fffff:23 -0x400000:23
+t 0x100000.7fffffffp0 a 0x100000:21 0x100001:21
+t -0x100000.7fffffffp0 a -0x100000:21 -0x100001:22
+t 0x100000.8p0 be 0x100000:21 0x100001:21
+t -0x100000.8p0 be -0x100000:21 -0x100001:22
+t 0x100000.80000001p0 c 0x100000:21 0x100001:21
+t -0x100000.80000001p0 c -0x100000:21 -0x100001:22
+t 0x100001.7fffffffp0 a 0x100001:21 0x100002:21
+t -0x100001.7fffffffp0 a -0x100001:22 -0x100002:22
+t 0x100001.8p0 bo 0x100001:21 0x100002:21
+t -0x100001.8p0 bo -0x100001:22 -0x100002:22
+t 0x100001.80000001p0 c 0x100001:21 0x100002:21
+t -0x100001.80000001p0 c -0x100001:22 -0x100002:22
+t 0x1fffff.ffffffffp0 c 0x1fffff:21 0x200000:22
+t -0x1fffff.ffffffffp0 c -0x1fffff:22 -0x200000:22
+t 0x80000.7fffffff8p0 a 0x80000:20 0x80001:20
+t -0x80000.7fffffff8p0 a -0x80000:20 -0x80001:21
+t 0x80000.8p0 be 0x80000:20 0x80001:20
+t -0x80000.8p0 be -0x80000:20 -0x80001:21
+t 0x80000.800000008p0 c 0x80000:20 0x80001:20
+t -0x80000.800000008p0 c -0x80000:20 -0x80001:21
+t 0x80001.7fffffff8p0 a 0x80001:20 0x80002:20
+t -0x80001.7fffffff8p0 a -0x80001:21 -0x80002:21
+t 0x80001.8p0 bo 0x80001:20 0x80002:20
+t -0x80001.8p0 bo -0x80001:21 -0x80002:21
+t 0x80001.800000008p0 c 0x80001:20 0x80002:20
+t -0x80001.800000008p0 c -0x80001:21 -0x80002:21
+t 0xfffff.ffffffff8p0 c 0xfffff:20 0x100000:21
+t -0xfffff.ffffffff8p0 c -0xfffff:21 -0x100000:21
+#endif
+#if MANT_DIG >= 64
+t 0x100000000.7ffffffep0 a 0x100000000LL:33 0x100000001LL:33
+t -0x100000000.7ffffffep0 a -0x100000000LL:33 -0x100000001LL:34
+t 0x100000000.8p0 be 0x100000000LL:33 0x100000001LL:33
+t -0x100000000.8p0 be -0x100000000LL:33 -0x100000001LL:34
+t 0x100000000.80000002p0 c 0x100000000LL:33 0x100000001LL:33
+t -0x100000000.80000002p0 c -0x100000000LL:33 -0x100000001LL:34
+t 0x100000001.7ffffffep0 a 0x100000001LL:33 0x100000002LL:33
+t -0x100000001.7ffffffep0 a -0x100000001LL:34 -0x100000002LL:34
+t 0x100000001.8p0 bo 0x100000001LL:33 0x100000002LL:33
+t -0x100000001.8p0 bo -0x100000001LL:34 -0x100000002LL:34
+t 0x100000001.80000002p0 c 0x100000001LL:33 0x100000002LL:33
+t -0x100000001.80000002p0 c -0x100000001LL:34 -0x100000002LL:34
+t 0x1ffffffff.fffffffep0 c 0x1ffffffffLL:33 0x200000000LL:34
+t -0x1ffffffff.fffffffep0 c -0x1ffffffffLL:34 -0x200000000LL:34
+t 0x80000000.7fffffffp0 a 0x80000000LL:32 0x80000001LL:32
+t -0x80000000.7fffffffp0 a -0x80000000LL:32 -0x80000001LL:33
+t 0x80000000.8p0 be 0x80000000LL:32 0x80000001LL:32
+t -0x80000000.8p0 be -0x80000000LL:32 -0x80000001LL:33
+t 0x80000000.80000001p0 c 0x80000000LL:32 0x80000001LL:32
+t -0x80000000.80000001p0 c -0x80000000LL:32 -0x80000001LL:33
+t 0x80000001.7fffffffp0 a 0x80000001LL:32 0x80000002LL:32
+t -0x80000001.7fffffffp0 a -0x80000001LL:33 -0x80000002LL:33
+t 0x80000001.8p0 bo 0x80000001LL:32 0x80000002LL:32
+t -0x80000001.8p0 bo -0x80000001LL:33 -0x80000002LL:33
+t 0x80000001.80000001p0 c 0x80000001LL:32 0x80000002LL:32
+t -0x80000001.80000001p0 c -0x80000001LL:33 -0x80000002LL:33
+t 0xffffffff.ffffffffp0 c 0xffffffffLL:32 0x100000000LL:33
+t -0xffffffff.ffffffffp0 c -0xffffffffLL:33 -0x100000000LL:33
+t 0x40000000.7fffffff8p0 a 0x40000000LL:31 0x40000001LL:31
+t -0x40000000.7fffffff8p0 a -0x40000000LL:31 -0x40000001LL:32
+t 0x40000000.8p0 be 0x40000000LL:31 0x40000001LL:31
+t -0x40000000.8p0 be -0x40000000LL:31 -0x40000001LL:32
+t 0x40000000.800000008p0 c 0x40000000LL:31 0x40000001LL:31
+t -0x40000000.800000008p0 c -0x40000000LL:31 -0x40000001LL:32
+t 0x40000001.7fffffff8p0 a 0x40000001LL:31 0x40000002LL:31
+t -0x40000001.7fffffff8p0 a -0x40000001LL:32 -0x40000002LL:32
+t 0x40000001.8p0 bo 0x40000001LL:31 0x40000002LL:31
+t -0x40000001.8p0 bo -0x40000001LL:32 -0x40000002LL:32
+t 0x40000001.800000008p0 c 0x40000001LL:31 0x40000002LL:31
+t -0x40000001.800000008p0 c -0x40000001LL:32 -0x40000002LL:32
+t 0x7fffffff.ffffffff8p0 c 0x7fffffffLL:31 0x80000000LL:32
+t -0x7fffffff.ffffffff8p0 c -0x7fffffffLL:32 -0x80000000LL:32
+#endif
+
+    /* Tests where overflow depends on the rounding mode.  */
+#if MANT_DIG >= 64
+t 0x7fffffffffffffff.8p0 bo 0x7fffffffffffffffLL:63 0x8000000000000000ULL:64
+#endif
+#if MANT_DIG >= 72
+t 0x7fffffffffffffff.7fp0 a 0x7fffffffffffffffLL:63 0x8000000000000000ULL:64
+t 0x7fffffffffffffff.81p0 c 0x7fffffffffffffffLL:63 0x8000000000000000ULL:64
+t 0xffffffffffffffff.7fp0 a 0xffffffffffffffffULL:64 0x10000000000000000ULL:65
+t 0xffffffffffffffff.8p0 bo 0xffffffffffffffffULL:64 0x10000000000000000ULL:65
+t 0xffffffffffffffff.81p0 c 0xffffffffffffffffULL:64 0x10000000000000000ULL:65
+t -0x8000000000000000.7fp0 a -INT64_MAX-1:64 -0x8000000000000001LL:65
+t -0x8000000000000000.8p0 be -INT64_MAX-1:64 -0x8000000000000001LL:65
+t -0x8000000000000000.81p0 c -INT64_MAX-1:64 -0x8000000000000001LL:65
+#endif
diff --git a/math/gen-fromfp-tests.py b/math/gen-fromfp-tests.py
new file mode 100755
index 0000000..603961c
--- /dev/null
+++ b/math/gen-fromfp-tests.py
@@ -0,0 +1,143 @@
+#!/usr/bin/python3
+# Expand test inputs for fromfp functions into text to edit into libm-test.inc.
+# 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/>.
+
+# Take test inputs on stdin, in format:
+#
+# i <value>:width [int-value]
+#
+# for integer inputs, or
+#
+# t <value> <pos> <z> <a>
+#
+# for noninteger inputs, where <pos> is "a" for fractional part
+# between 0 and 0.5, "be" for 0.5 with even integer part, "bo" for 0.5
+# with odd integer part and "c" for between 0.5 and 1; <z> is the
+# value truncated towards zero, <a> is the value rounded away from
+# zero, both being in the form <value>:<width>.  Width values are for
+# the smallest type that can hold the value; for positive values, this
+# is an unsigned type.
+#
+# Command-line argument is function to generate tests for.  Any input
+# lines not of the above form are just passed through unchanged.
+#
+# Note that the output of this script forms the largest part of the
+# tests for the fromfp functions, but not the whole of those tests.
+
+import sys
+
+func = sys.argv[1]
+
+invalid_res = 'IGNORE, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM'
+exact_res = 'NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED'
+if func == 'fromfpx' or func == 'ufromfpx':
+    inexact_res = 'INEXACT_EXCEPTION|ERRNO_UNCHANGED'
+else:
+    inexact_res = exact_res
+unsigned = func.startswith('ufromfp')
+rm_list = ['FP_INT_UPWARD', 'FP_INT_DOWNWARD', 'FP_INT_TOWARDZERO',
+           'FP_INT_TONEARESTFROMZERO', 'FP_INT_TONEAREST']
+rm_away_pos = {'FP_INT_UPWARD': 'a',
+               'FP_INT_DOWNWARD': 'z',
+               'FP_INT_TOWARDZERO': 'z',
+               'FP_INT_TONEARESTFROMZERO': 'be',
+               'FP_INT_TONEAREST': 'bo'}
+rm_away_neg = {'FP_INT_UPWARD': 'z',
+               'FP_INT_DOWNWARD': 'a',
+               'FP_INT_TOWARDZERO': 'z',
+               'FP_INT_TONEARESTFROMZERO': 'be',
+               'FP_INT_TONEAREST': 'bo'}
+if unsigned:
+    test_macro = 'TEST_fiu_U'
+else:
+    test_macro = 'TEST_fiu_M'
+
+for line in sys.stdin:
+    if line.startswith('i'):
+        data = line.split()
+        val_width = data[1]
+        val, width = val_width.split(':')
+        negative = val.startswith('-')
+        if unsigned and negative:
+            continue
+        width = int(width)
+        if not unsigned and not negative:
+            width += 1
+        width_list = [0, 1]
+        if width > 2:
+            width_list.append(width - 1)
+        if width > 1 and width <= 64:
+            width_list.append(width)
+        if width < 64:
+            width_list.append(width + 1)
+        if width < 63:
+            width_list.append(64)
+        width_list = [(w, str(w)) for w in width_list]
+        width_list.append((64, 'UINT_MAX'))
+        for rm in rm_list:
+            for we in width_list:
+                w, ws = we
+                if w < width:
+                    print('    %s (%s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, invalid_res))
+                else:
+                    print('    %s (%s, %s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, val, exact_res))
+    elif line.startswith('t'):
+        data = line.split()
+        val = data[1]
+        pos = data[2]
+        z, z_width = data[3].split(':')
+        z_width = int(z_width)
+        a, a_width = data[4].split(':')
+        a_width = int(a_width)
+        if unsigned and z.startswith('-'):
+            continue
+        negative = val.startswith('-')
+        if negative:
+            rm_away = rm_away_neg
+        else:
+            rm_away = rm_away_pos
+        for rm in rm_list:
+            if pos >= rm_away[rm]:
+                res, width = a, a_width
+            else:
+                res, width = z, z_width
+            if not unsigned and not negative and res != '0':
+                width += 1
+            width_list = [0, 1]
+            if width > 2:
+                width_list.append(width - 1)
+            if width > 1 and width <= 64:
+                width_list.append(width)
+            if width < 64:
+                width_list.append(width + 1)
+            if width < 63:
+                width_list.append(64)
+            width_list = [(w, str(w)) for w in width_list]
+            width_list.append((64, 'UINT_MAX'))
+            for we in width_list:
+                w, ws = we
+                if w < width or (unsigned and res.startswith('-')):
+                    print('    %s (%s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, invalid_res))
+                else:
+                    print('    %s (%s, %s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, res, inexact_res))
+    else:
+        print(line.rstrip())
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 25e69a8..8836b95 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -223,8 +223,8 @@ sub parse_args {
     if ($current_arg > 1) {
       $comma = ', ';
     }
-    # FLOAT, int, long int, long long int
-    if ($descr[$i] =~ /f|j|i|l|L/) {
+    # FLOAT, long double, int, unsigned int, long int, long long int
+    if ($descr[$i] =~ /f|j|i|u|l|L/) {
       $call_args .= $comma . &beautify ($args[$current_arg]);
       ++$current_arg;
       next;
@@ -252,7 +252,7 @@ sub parse_args {
   $num_res = 0;
   @descr = split //,$descr_res;
   foreach (@descr) {
-    if ($_ =~ /f|i|l|L/) {
+    if ($_ =~ /f|i|l|L|M|U/) {
       ++$num_res;
     } elsif ($_ eq 'c') {
       $num_res += 2;
@@ -289,7 +289,7 @@ sub parse_args {
   @descr = split //,$descr_args;
   for ($i=0; $i <= $#descr; $i++) {
     # FLOAT, int, long int, long long int
-    if ($descr[$i] =~ /f|j|i|l|L/) {
+    if ($descr[$i] =~ /f|j|i|u|l|L/) {
       if ($descr[$i] eq "f") {
         $cline .= ", " . &apply_lit ($args[$current_arg]);
       } else {
@@ -327,7 +327,7 @@ sub parse_args {
     $cline_res = "";
     @special = ();
     foreach (@descr) {
-      if ($_ =~ /b|f|j|i|l|L/ ) {
+      if ($_ =~ /b|f|j|i|l|L|M|U/ ) {
 	my ($result) = $args_res[$current_arg];
 	if ($result eq "IGNORE") {
 	  $ignore_result_any = 1;
diff --git a/math/math.h b/math/math.h
index 1dca146..55cb46f 100644
--- a/math/math.h
+++ b/math/math.h
@@ -28,6 +28,9 @@
 
 __BEGIN_DECLS
 
+/* Get definitions of __intmax_t and __uintmax_t.  */
+#include <bits/types.h>
+
 /* Get machine-dependent vector math functions declarations.  */
 #include <bits/math-vector.h>
 
@@ -152,6 +155,28 @@ typedef _Float128x double_t;
 
 #include <bits/fp-fast.h>
 
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Rounding direction macros for fromfp functions.  */
+enum
+  {
+    FP_INT_UPWARD =
+# define FP_INT_UPWARD 0
+      FP_INT_UPWARD,
+    FP_INT_DOWNWARD =
+# define FP_INT_DOWNWARD 1
+      FP_INT_DOWNWARD,
+    FP_INT_TOWARDZERO =
+# define FP_INT_TOWARDZERO 2
+      FP_INT_TOWARDZERO,
+    FP_INT_TONEARESTFROMZERO =
+# define FP_INT_TONEARESTFROMZERO 3
+      FP_INT_TONEARESTFROMZERO,
+    FP_INT_TONEAREST =
+# define FP_INT_TONEAREST 4
+      FP_INT_TONEAREST,
+  };
+#endif
+
 /* The file <bits/mathcalls.h> contains the prototypes for all the
    actual math functions.  These macros are used for those prototypes,
    so we can easily declare each function as both `name' and `__name',
diff --git a/math/test-tgmath-ret.c b/math/test-tgmath-ret.c
index d7bcb5c..8ab7180 100644
--- a/math/test-tgmath-ret.c
+++ b/math/test-tgmath-ret.c
@@ -20,11 +20,14 @@
 #include <math.h>
 #include <complex.h>
 #include <tgmath.h>
+#include <stdint.h>
 #include <stdio.h>
 
 static float fx;
 static double dx;
 static long double lx;
+static int rm = FP_INT_UPWARD;
+static unsigned int width = 64;
 static int errors = 0;
 
 static void
@@ -36,28 +39,28 @@ our_error (const char *c)
 
 /* First function where the return type is constant.  */
 
-#define CHECK_RET_CONST_TYPE(func, rettype, arg, name) \
-  if (sizeof (func (arg)) != sizeof (rettype))				      \
+#define CHECK_RET_CONST_TYPE(func, rettype, arg, name, ...)		\
+  if (sizeof (func (arg, ## __VA_ARGS__)) != sizeof (rettype))		\
     our_error ("Return size of " #func " is wrong with " #name " argument");
 
-#define CHECK_RET_CONST_FLOAT(func, rettype) \
-  CHECK_RET_CONST_TYPE (func, rettype, fx, float)
-#define CHECK_RET_CONST_DOUBLE(func, rettype) \
-  CHECK_RET_CONST_TYPE (func, rettype, dx, double)
+#define CHECK_RET_CONST_FLOAT(func, rettype, ...)			\
+  CHECK_RET_CONST_TYPE (func, rettype, fx, float, ## __VA_ARGS__)
+#define CHECK_RET_CONST_DOUBLE(func, rettype, ...)			\
+  CHECK_RET_CONST_TYPE (func, rettype, dx, double, ## __VA_ARGS__)
 #ifdef NO_LONG_DOUBLE
-# define CHECK_RET_CONST_LDOUBLE(func, rettype)
+# define CHECK_RET_CONST_LDOUBLE(func, rettype, ...)
 #else
-# define CHECK_RET_CONST_LDOUBLE(func, rettype) \
-  CHECK_RET_CONST_TYPE (func, rettype, lx, long double)
+# define CHECK_RET_CONST_LDOUBLE(func, rettype, ...)			\
+  CHECK_RET_CONST_TYPE (func, rettype, lx, long double, ## __VA_ARGS__)
 #endif
 
-#define CHECK_RET_CONST(func, rettype) \
-static void								      \
-check_return_ ##func (void)						      \
-{									      \
-  CHECK_RET_CONST_FLOAT (func, rettype)					      \
-  CHECK_RET_CONST_DOUBLE (func, rettype)				      \
-  CHECK_RET_CONST_LDOUBLE (func, rettype)				      \
+#define CHECK_RET_CONST(func, rettype, ...)			\
+static void							\
+check_return_ ##func (void)					\
+{								\
+  CHECK_RET_CONST_FLOAT (func, rettype, ## __VA_ARGS__)		\
+  CHECK_RET_CONST_DOUBLE (func, rettype, ## __VA_ARGS__)	\
+  CHECK_RET_CONST_LDOUBLE (func, rettype, ## __VA_ARGS__)	\
 }
 
 CHECK_RET_CONST(ilogb, int)
@@ -66,6 +69,10 @@ CHECK_RET_CONST(lrint, long)
 CHECK_RET_CONST(lround, long)
 CHECK_RET_CONST(llrint, long long)
 CHECK_RET_CONST(llround, long long)
+CHECK_RET_CONST(fromfp, intmax_t, rm, width)
+CHECK_RET_CONST(ufromfp, uintmax_t, rm, width)
+CHECK_RET_CONST(fromfpx, intmax_t, rm, width)
+CHECK_RET_CONST(ufromfpx, uintmax_t, rm, width)
 
 static int
 do_test (void)
@@ -76,6 +83,10 @@ do_test (void)
   check_return_lround ();
   check_return_llrint ();
   check_return_llround ();
+  check_return_fromfp ();
+  check_return_ufromfp ();
+  check_return_fromfpx ();
+  check_return_ufromfpx ();
 
   printf ("%Zd\n", sizeof(carg (lx)));
 
diff --git a/math/test-tgmath.c b/math/test-tgmath.c
index 7a58d99..de9073d 100644
--- a/math/test-tgmath.c
+++ b/math/test-tgmath.c
@@ -22,6 +22,7 @@
 #undef __NO_MATH_INLINES
 #define __NO_MATH_INLINES 1
 #include <math.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <tgmath.h>
 
@@ -50,7 +51,7 @@ int count_cdouble;
 int count_cfloat;
 int count_cldouble;
 
-#define NCALLS     134
+#define NCALLS     138
 #define NCALLS_INT 4
 #define NCCALLS    47
 
@@ -226,10 +227,12 @@ F(compile_test) (void)
 {
   TYPE a, b, c = 1.0;
   complex TYPE d;
-  int i;
+  int i = 2;
   int saved_count;
   long int j;
   long long int k;
+  intmax_t m;
+  uintmax_t um;
 
   a = cos (cos (x));
   b = acos (acos (a));
@@ -269,6 +272,8 @@ F(compile_test) (void)
   b = remquo (remquo (a, b, &i), remquo (c, x, &i), &i);
   j = lrint (x) + lround (a);
   k = llrint (b) + llround (c);
+  m = fromfp (a, FP_INT_UPWARD, 2) + fromfpx (b, FP_INT_DOWNWARD, 3);
+  um = ufromfp (c, FP_INT_TONEAREST, 4) + ufromfpx (a, FP_INT_TOWARDZERO, 5);
   a = erf (erf (x));
   b = erfc (erfc (a));
   a = tgamma (tgamma (x));
@@ -298,7 +303,7 @@ F(compile_test) (void)
   c = fma (i, b, i);
   a = pow (i, c);
 #endif
-  x = a + b + c + i + j + k;
+  x = a + b + c + i + j + k + m + um;
 
   saved_count = count;
   if (ccount != 0)
@@ -373,6 +378,9 @@ F(compile_test) (void)
       a = remquo (y, y, &i);
       j = lrint (y) + lround (y);
       k = llrint (y) + llround (y);
+      m = fromfp (y, FP_INT_UPWARD, 6) + fromfpx (y, FP_INT_DOWNWARD, 7);
+      um = (ufromfp (y, FP_INT_TONEAREST, 8)
+	    + ufromfpx (y, FP_INT_TOWARDZERO, 9));
       a = erf (y);
       a = erfc (y);
       a = tgamma (y);
@@ -750,6 +758,38 @@ long long int
   return x;
 }
 
+intmax_t
+(F(fromfp)) (TYPE x, int round, unsigned int width)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+intmax_t
+(F(fromfpx)) (TYPE x, int round, unsigned int width)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+uintmax_t
+(F(ufromfp)) (TYPE x, int round, unsigned int width)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+uintmax_t
+(F(ufromfpx)) (TYPE x, int round, unsigned int width)
+{
+  ++count;
+  P ();
+  return x;
+}
+
 TYPE
 (F(erf)) (TYPE x)
 {
diff --git a/math/tgmath.h b/math/tgmath.h
index 433a348..d296027 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -155,6 +155,14 @@
 				   + (__tgmath_real_type (Val3)) 0))	      \
 		       Fct##f (Val1, Val2, Val3)))
 
+# define __TGMATH_TERNARY_FIRST_REAL_RET_ONLY(Val1, Val2, Val3, RetType, Fct) \
+     (__extension__ ((sizeof (Val1) == sizeof (double)			\
+		      || __builtin_classify_type (Val1) != 8)		\
+		     ? (RetType) Fct (Val1, Val2, Val3)			\
+		     : (sizeof (Val1) == sizeof (float))		\
+		     ? (RetType) Fct##f (Val1, Val2, Val3)		\
+		     : (RetType) __tgml(Fct) (Val1, Val2, Val3)))
+
 /* XXX This definition has to be changed as soon as the compiler understands
    the imaginary keyword.  */
 # define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
@@ -441,6 +449,18 @@
 /* Round X to nearest integer value, rounding halfway cases to even.  */
 # define roundeven(Val) __TGMATH_UNARY_REAL_ONLY (Val, roundeven)
 
+# define fromfp(Val1, Val2, Val3)					\
+  __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, __intmax_t, fromfp)
+
+# define ufromfp(Val1, Val2, Val3)					\
+  __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, __uintmax_t, ufromfp)
+
+# define fromfpx(Val1, Val2, Val3)					\
+  __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, __intmax_t, fromfpx)
+
+# define ufromfpx(Val1, Val2, Val3)					\
+  __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, __uintmax_t, ufromfpx)
+
 /* 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_fromfp.c b/sysdeps/ieee754/dbl-64/s_fromfp.c
new file mode 100644
index 0000000..92fbe0c
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_fromfp.c
@@ -0,0 +1,7 @@
+#define UNSIGNED 0
+#define INEXACT 0
+#define FUNC fromfp
+#include <s_fromfp_main.c>
+#ifdef NO_LONG_DOUBLE
+weak_alias (fromfp, fromfpl)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/s_fromfp_main.c b/sysdeps/ieee754/dbl-64/s_fromfp_main.c
new file mode 100644
index 0000000..c0cd271
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_fromfp_main.c
@@ -0,0 +1,82 @@
+/* Round to integer type.  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 <errno.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#define BIAS 0x3ff
+#define MANT_DIG 53
+
+#if UNSIGNED
+# define RET_TYPE uintmax_t
+#else
+# define RET_TYPE intmax_t
+#endif
+
+#include <fromfp.h>
+
+RET_TYPE
+FUNC (double x, int round, unsigned int width)
+{
+  if (width > INTMAX_WIDTH)
+    width = INTMAX_WIDTH;
+  uint64_t ix;
+  EXTRACT_WORDS64 (ix, x);
+  bool negative = (ix & 0x8000000000000000ULL) != 0;
+  if (width == 0)
+    return fromfp_domain_error (negative, width);
+  ix &= 0x7fffffffffffffffULL;
+  if (ix == 0)
+    return 0;
+  int exponent = ix >> (MANT_DIG - 1);
+  exponent -= BIAS;
+  int max_exponent = fromfp_max_exponent (negative, width);
+  if (exponent > max_exponent)
+    return fromfp_domain_error (negative, width);
+
+  ix &= ((1ULL << (MANT_DIG - 1)) - 1);
+  ix |= 1ULL << (MANT_DIG - 1);
+  uintmax_t uret;
+  bool half_bit, more_bits;
+  if (exponent >= MANT_DIG - 1)
+    {
+      uret = ix;
+      uret <<= exponent - (MANT_DIG - 1);
+      half_bit = false;
+      more_bits = false;
+    }
+  else if (exponent >= -1)
+    {
+      uint64_t h = 1ULL << (MANT_DIG - 2 - exponent);
+      half_bit = (ix & h) != 0;
+      more_bits = (ix & (h - 1)) != 0;
+      uret = ix >> (MANT_DIG - 1 - exponent);
+    }
+  else
+    {
+      uret = 0;
+      half_bit = false;
+      more_bits = true;
+    }
+  return fromfp_round_and_return (negative, uret, half_bit, more_bits, round,
+				  exponent, max_exponent, width);
+}
diff --git a/sysdeps/ieee754/dbl-64/s_fromfpx.c b/sysdeps/ieee754/dbl-64/s_fromfpx.c
new file mode 100644
index 0000000..bbfb969
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_fromfpx.c
@@ -0,0 +1,7 @@
+#define UNSIGNED 0
+#define INEXACT 1
+#define FUNC fromfpx
+#include <s_fromfp_main.c>
+#ifdef NO_LONG_DOUBLE
+weak_alias (fromfpx, fromfpxl)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/s_ufromfp.c b/sysdeps/ieee754/dbl-64/s_ufromfp.c
new file mode 100644
index 0000000..c3d9047
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_ufromfp.c
@@ -0,0 +1,7 @@
+#define UNSIGNED 1
+#define INEXACT 0
+#define FUNC ufromfp
+#include <s_fromfp_main.c>
+#ifdef NO_LONG_DOUBLE
+weak_alias (ufromfp, ufromfpl)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/s_ufromfpx.c b/sysdeps/ieee754/dbl-64/s_ufromfpx.c
new file mode 100644
index 0000000..dee607f
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_ufromfpx.c
@@ -0,0 +1,7 @@
+#define UNSIGNED 1
+#define INEXACT 1
+#define FUNC ufromfpx
+#include <s_fromfp_main.c>
+#ifdef NO_LONG_DOUBLE
+weak_alias (ufromfpx, ufromfpxl)
+#endif
diff --git a/sysdeps/ieee754/flt-32/s_fromfpf.c b/sysdeps/ieee754/flt-32/s_fromfpf.c
new file mode 100644
index 0000000..68d4c80
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_fromfpf.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 0
+#define FUNC fromfpf
+#include <s_fromfpf_main.c>
diff --git a/sysdeps/ieee754/flt-32/s_fromfpf_main.c b/sysdeps/ieee754/flt-32/s_fromfpf_main.c
new file mode 100644
index 0000000..e1205ed
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_fromfpf_main.c
@@ -0,0 +1,82 @@
+/* Round to integer type.  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 <errno.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#define BIAS 0x7f
+#define MANT_DIG 24
+
+#if UNSIGNED
+# define RET_TYPE uintmax_t
+#else
+# define RET_TYPE intmax_t
+#endif
+
+#include <fromfp.h>
+
+RET_TYPE
+FUNC (float x, int round, unsigned int width)
+{
+  if (width > INTMAX_WIDTH)
+    width = INTMAX_WIDTH;
+  uint32_t ix;
+  GET_FLOAT_WORD (ix, x);
+  bool negative = (ix & 0x80000000) != 0;
+  if (width == 0)
+    return fromfp_domain_error (negative, width);
+  ix &= 0x7fffffff;
+  if (ix == 0)
+    return 0;
+  int exponent = ix >> (MANT_DIG - 1);
+  exponent -= BIAS;
+  int max_exponent = fromfp_max_exponent (negative, width);
+  if (exponent > max_exponent)
+    return fromfp_domain_error (negative, width);
+
+  ix &= ((1U << (MANT_DIG - 1)) - 1);
+  ix |= 1U << (MANT_DIG - 1);
+  uintmax_t uret;
+  bool half_bit, more_bits;
+  if (exponent >= MANT_DIG - 1)
+    {
+      uret = ix;
+      uret <<= exponent - (MANT_DIG - 1);
+      half_bit = false;
+      more_bits = false;
+    }
+  else if (exponent >= -1)
+    {
+      uint32_t h = 1U << (MANT_DIG - 2 - exponent);
+      half_bit = (ix & h) != 0;
+      more_bits = (ix & (h - 1)) != 0;
+      uret = ix >> (MANT_DIG - 1 - exponent);
+    }
+  else
+    {
+      uret = 0;
+      half_bit = false;
+      more_bits = true;
+    }
+  return fromfp_round_and_return (negative, uret, half_bit, more_bits, round,
+				  exponent, max_exponent, width);
+}
diff --git a/sysdeps/ieee754/flt-32/s_fromfpxf.c b/sysdeps/ieee754/flt-32/s_fromfpxf.c
new file mode 100644
index 0000000..9d0fcbc
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_fromfpxf.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 1
+#define FUNC fromfpxf
+#include <s_fromfpf_main.c>
diff --git a/sysdeps/ieee754/flt-32/s_ufromfpf.c b/sysdeps/ieee754/flt-32/s_ufromfpf.c
new file mode 100644
index 0000000..e6ffdf3
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_ufromfpf.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 0
+#define FUNC ufromfpf
+#include <s_fromfpf_main.c>
diff --git a/sysdeps/ieee754/flt-32/s_ufromfpxf.c b/sysdeps/ieee754/flt-32/s_ufromfpxf.c
new file mode 100644
index 0000000..97aa689
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_ufromfpxf.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 1
+#define FUNC ufromfpxf
+#include <s_fromfpf_main.c>
diff --git a/sysdeps/ieee754/ldbl-128/s_fromfpl.c b/sysdeps/ieee754/ldbl-128/s_fromfpl.c
new file mode 100644
index 0000000..e323b4c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_fromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 0
+#define FUNC fromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128/s_fromfpl_main.c b/sysdeps/ieee754/ldbl-128/s_fromfpl_main.c
new file mode 100644
index 0000000..cfff2c6
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_fromfpl_main.c
@@ -0,0 +1,90 @@
+/* Round to integer type.  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 <errno.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#define BIAS 0x3fff
+#define MANT_DIG 113
+
+#if UNSIGNED
+# define RET_TYPE uintmax_t
+#else
+# define RET_TYPE intmax_t
+#endif
+
+#include <fromfp.h>
+
+RET_TYPE
+FUNC (_Float128 x, int round, unsigned int width)
+{
+  if (width > INTMAX_WIDTH)
+    width = INTMAX_WIDTH;
+  uint64_t hx, lx;
+  GET_LDOUBLE_WORDS64 (hx, lx, x);
+  bool negative = (hx & 0x8000000000000000ULL) != 0;
+  if (width == 0)
+    return fromfp_domain_error (negative, width);
+  hx &= 0x7fffffffffffffffULL;
+  if ((hx | lx) == 0)
+    return 0;
+  int exponent = hx >> (MANT_DIG - 1 - 64);
+  exponent -= BIAS;
+  int max_exponent = fromfp_max_exponent (negative, width);
+  if (exponent > max_exponent)
+    return fromfp_domain_error (negative, width);
+
+  hx &= ((1ULL << (MANT_DIG - 1 - 64)) - 1);
+  hx |= 1ULL << (MANT_DIG - 1 - 64);
+  uintmax_t uret;
+  bool half_bit, more_bits;
+  /* The exponent is at most 63, so we are shifting right by at least
+     49 bits.  */
+  if (exponent >= -1)
+    {
+      int shift = MANT_DIG - 1 - exponent;
+      if (shift <= 64)
+	{
+	  uint64_t h = 1ULL << (shift - 1);
+	  half_bit = (lx & h) != 0;
+	  more_bits = (lx & (h - 1)) != 0;
+	  uret = hx << (64 - shift);
+	  if (shift != 64)
+	    uret |= lx >> shift;
+	}
+      else
+	{
+	  uint64_t h = 1ULL << (shift - 1 - 64);
+	  half_bit = (hx & h) != 0;
+	  more_bits = ((hx & (h - 1)) | lx) != 0;
+	  uret = hx >> (shift - 64);
+	}
+    }
+  else
+    {
+      uret = 0;
+      half_bit = false;
+      more_bits = true;
+    }
+  return fromfp_round_and_return (negative, uret, half_bit, more_bits, round,
+				  exponent, max_exponent, width);
+}
diff --git a/sysdeps/ieee754/ldbl-128/s_fromfpxl.c b/sysdeps/ieee754/ldbl-128/s_fromfpxl.c
new file mode 100644
index 0000000..2f3189d
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_fromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 1
+#define FUNC fromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128/s_ufromfpl.c b/sysdeps/ieee754/ldbl-128/s_ufromfpl.c
new file mode 100644
index 0000000..c686daa
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_ufromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 0
+#define FUNC ufromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128/s_ufromfpxl.c b/sysdeps/ieee754/ldbl-128/s_ufromfpxl.c
new file mode 100644
index 0000000..906066c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_ufromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 1
+#define FUNC ufromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fromfpl.c b/sysdeps/ieee754/ldbl-128ibm/s_fromfpl.c
new file mode 100644
index 0000000..e323b4c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 0
+#define FUNC fromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fromfpl_main.c b/sysdeps/ieee754/ldbl-128ibm/s_fromfpl_main.c
new file mode 100644
index 0000000..99c5882
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fromfpl_main.c
@@ -0,0 +1,147 @@
+/* Round to integer type.  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 <errno.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#define BIAS 0x3ff
+#define MANT_DIG 53
+
+#if UNSIGNED
+# define RET_TYPE uintmax_t
+#else
+# define RET_TYPE intmax_t
+#endif
+
+#include <fromfp.h>
+
+RET_TYPE
+FUNC (long double x, int round, unsigned int width)
+{
+  double hi, lo;
+  if (width > INTMAX_WIDTH)
+    width = INTMAX_WIDTH;
+  uint64_t hx, lx;
+  ldbl_unpack (x, &hi, &lo);
+  EXTRACT_WORDS64 (hx, hi);
+  EXTRACT_WORDS64 (lx, lo);
+  bool negative = (hx & 0x8000000000000000ULL) != 0;
+  bool lo_negative = (lx & 0x8000000000000000ULL) != 0;
+  if (width == 0)
+    return fromfp_domain_error (negative, width);
+  hx &= 0x7fffffffffffffffULL;
+  lx &= 0x7fffffffffffffffULL;
+  if ((hx | lx) == 0)
+    return 0;
+  int hi_exponent = hx >> (MANT_DIG - 1);
+  hi_exponent -= BIAS;
+  int exponent = hi_exponent;
+  hx &= ((1ULL << (MANT_DIG - 1)) - 1);
+  if (hx == 0 && lx != 0 && lo_negative != negative)
+    exponent--;
+  int max_exponent = fromfp_max_exponent (negative, width);
+  if (exponent > max_exponent)
+    return fromfp_domain_error (negative, width);
+  int lo_exponent = lx >> (MANT_DIG - 1);
+  lo_exponent -= BIAS;
+
+  /* Convert the high part to integer.  */
+  hx |= 1ULL << (MANT_DIG - 1);
+  uintmax_t uret;
+  bool half_bit, more_bits;
+  if (hi_exponent >= MANT_DIG - 1)
+    {
+      uret = hx;
+      uret <<= hi_exponent - (MANT_DIG - 1);
+      half_bit = false;
+      more_bits = false;
+    }
+  else if (hi_exponent >= -1)
+    {
+      uint64_t h = 1ULL << (MANT_DIG - 2 - hi_exponent);
+      half_bit = (hx & h) != 0;
+      more_bits = (hx & (h - 1)) != 0;
+      uret = hx >> (MANT_DIG - 1 - hi_exponent);
+    }
+  else
+    {
+      uret = 0;
+      half_bit = false;
+      more_bits = true;
+    }
+
+  /* Likewise, the low part.  */
+  if (lx != 0)
+    {
+      uintmax_t lo_uret;
+      bool lo_half_bit, lo_more_bits;
+      lx &= ((1ULL << (MANT_DIG - 1)) - 1);
+      lx |= 1ULL << (MANT_DIG - 1);
+      /* The high part exponent is at most 64, so the low part
+	 exponent is at most 11.  */
+      if (lo_exponent >= -1)
+	{
+	  uint64_t h = 1ULL << (MANT_DIG - 2 - lo_exponent);
+	  lo_half_bit = (lx & h) != 0;
+	  lo_more_bits = (lx & (h - 1)) != 0;
+	  lo_uret = lx >> (MANT_DIG - 1 - lo_exponent);
+	}
+      else
+	{
+	  lo_uret = 0;
+	  lo_half_bit = false;
+	  lo_more_bits = true;
+	}
+      if (lo_negative == negative)
+	{
+	  uret += lo_uret;
+	  half_bit |= lo_half_bit;
+	  more_bits |= lo_more_bits;
+	}
+      else
+	{
+	  uret -= lo_uret;
+	  if (lo_half_bit)
+	    {
+	      uret--;
+	      half_bit = true;
+	    }
+	  if (lo_more_bits && !more_bits)
+	    {
+	      if (half_bit)
+		{
+		  half_bit = false;
+		  more_bits = true;
+		}
+	      else
+		{
+		  uret--;
+		  half_bit = true;
+		  more_bits = true;
+		}
+	    }
+	}
+    }
+
+  return fromfp_round_and_return (negative, uret, half_bit, more_bits, round,
+				  exponent, max_exponent, width);
+}
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fromfpxl.c b/sysdeps/ieee754/ldbl-128ibm/s_fromfpxl.c
new file mode 100644
index 0000000..2f3189d
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 1
+#define FUNC fromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_ufromfpl.c b/sysdeps/ieee754/ldbl-128ibm/s_ufromfpl.c
new file mode 100644
index 0000000..c686daa
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_ufromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 0
+#define FUNC ufromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_ufromfpxl.c b/sysdeps/ieee754/ldbl-128ibm/s_ufromfpxl.c
new file mode 100644
index 0000000..906066c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_ufromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 1
+#define FUNC ufromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-96/s_fromfpl.c b/sysdeps/ieee754/ldbl-96/s_fromfpl.c
new file mode 100644
index 0000000..e323b4c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_fromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 0
+#define FUNC fromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-96/s_fromfpl_main.c b/sysdeps/ieee754/ldbl-96/s_fromfpl_main.c
new file mode 100644
index 0000000..4ae6c81
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_fromfpl_main.c
@@ -0,0 +1,84 @@
+/* Round to integer type.  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 <errno.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_private.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#define BIAS 0x3fff
+#define MANT_DIG 64
+
+#if UNSIGNED
+# define RET_TYPE uintmax_t
+#else
+# define RET_TYPE intmax_t
+#endif
+
+#include <fromfp.h>
+
+RET_TYPE
+FUNC (long double x, int round, unsigned int width)
+{
+  if (width > INTMAX_WIDTH)
+    width = INTMAX_WIDTH;
+  uint16_t se;
+  uint32_t hx, lx;
+  GET_LDOUBLE_WORDS (se, hx, lx, x);
+  bool negative = (se & 0x8000) != 0;
+  if (width == 0)
+    return fromfp_domain_error (negative, width);
+  if ((hx | lx) == 0)
+    return 0;
+  int exponent = se & 0x7fff;
+  exponent -= BIAS;
+  int max_exponent = fromfp_max_exponent (negative, width);
+  if (exponent > max_exponent)
+    return fromfp_domain_error (negative, width);
+
+  uint64_t ix = (((uint64_t) hx) << 32) | lx;
+  uintmax_t uret;
+  bool half_bit, more_bits;
+  if (exponent >= MANT_DIG - 1)
+    {
+      uret = ix;
+      /* Exponent 63; no shifting required.  */
+      half_bit = false;
+      more_bits = false;
+    }
+  else if (exponent >= -1)
+    {
+      uint64_t h = 1ULL << (MANT_DIG - 2 - exponent);
+      half_bit = (ix & h) != 0;
+      more_bits = (ix & (h - 1)) != 0;
+      if (exponent == -1)
+	uret = 0;
+      else
+	uret = ix >> (MANT_DIG - 1 - exponent);
+    }
+  else
+    {
+      uret = 0;
+      half_bit = false;
+      more_bits = true;
+    }
+  return fromfp_round_and_return (negative, uret, half_bit, more_bits, round,
+				  exponent, max_exponent, width);
+}
diff --git a/sysdeps/ieee754/ldbl-96/s_fromfpxl.c b/sysdeps/ieee754/ldbl-96/s_fromfpxl.c
new file mode 100644
index 0000000..2f3189d
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_fromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 0
+#define INEXACT 1
+#define FUNC fromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-96/s_ufromfpl.c b/sysdeps/ieee754/ldbl-96/s_ufromfpl.c
new file mode 100644
index 0000000..c686daa
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_ufromfpl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 0
+#define FUNC ufromfpl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-96/s_ufromfpxl.c b/sysdeps/ieee754/ldbl-96/s_ufromfpxl.c
new file mode 100644
index 0000000..906066c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_ufromfpxl.c
@@ -0,0 +1,4 @@
+#define UNSIGNED 1
+#define INEXACT 1
+#define FUNC ufromfpxl
+#include <s_fromfpl_main.c>
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index 006d0d5..81429d0 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -44,7 +44,7 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \
 		 isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf \
 		 nextup nextdown totalorder totalordermag getpayload \
 		 canonicalize setpayload setpayloadsig llogb fmaxmag fminmag \
-		 roundeven
+		 roundeven fromfp ufromfp fromfpx ufromfpx
 libnldbl-routines = $(libnldbl-calls:%=nldbl-%)
 libnldbl-inhibit-o = $(object-suffixes)
 libnldbl-static-only-routines = $(libnldbl-routines)
@@ -103,6 +103,8 @@ CFLAGS-nldbl-fmin.c = -fno-builtin-fminl
 CFLAGS-nldbl-fminmag.c = -fno-builtin-fminmagl
 CFLAGS-nldbl-fmod.c = -fno-builtin-fmodl
 CFLAGS-nldbl-frexp.c = -fno-builtin-frexpl
+CFLAGS-nldbl-fromfp.c = -fno-builtin-fromfpl
+CFLAGS-nldbl-fromfpx.c = -fno-builtin-fromfpxl
 CFLAGS-nldbl-gamma.c = -fno-builtin-gammal
 CFLAGS-nldbl-getpayload.c = -fno-builtin-getpayloadl
 CFLAGS-nldbl-hypot.c = -fno-builtin-hypotl
@@ -156,6 +158,8 @@ CFLAGS-nldbl-tgamma.c = -fno-builtin-tgammal
 CFLAGS-nldbl-totalorder.c = -fno-builtin-totalorderl
 CFLAGS-nldbl-totalordermag.c = -fno-builtin-totalordermagl
 CFLAGS-nldbl-trunc.c = -fno-builtin-truncl
+CFLAGS-nldbl-ufromfp.c = -fno-builtin-ufromfpl
+CFLAGS-nldbl-ufromfpx.c = -fno-builtin-ufromfpxl
 CFLAGS-nldbl-y0.c = -fno-builtin-y0l
 CFLAGS-nldbl-y1.c = -fno-builtin-y1l
 CFLAGS-nldbl-yn.c = -fno-builtin-ynl
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
index 0c3c5ad..b6cd299 100644
--- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
@@ -24,6 +24,7 @@
 #define __NO_LONG_DOUBLE_MATH	1
 #include <stdarg.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <printf.h>
 #include <wchar.h>
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fromfp.c b/sysdeps/ieee754/ldbl-opt/nldbl-fromfp.c
new file mode 100644
index 0000000..a05f1b3
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-fromfp.c
@@ -0,0 +1,26 @@
+/* Compatibility routine for IEEE double as long double for fromfp.
+   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"
+
+intmax_t
+attribute_hidden
+fromfpl (double x, int round, unsigned int width)
+{
+  return fromfp (x, round, width);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fromfpx.c b/sysdeps/ieee754/ldbl-opt/nldbl-fromfpx.c
new file mode 100644
index 0000000..198e120
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-fromfpx.c
@@ -0,0 +1,26 @@
+/* Compatibility routine for IEEE double as long double for fromfpx.
+   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"
+
+intmax_t
+attribute_hidden
+fromfpxl (double x, int round, unsigned int width)
+{
+  return fromfpx (x, round, width);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-ufromfp.c b/sysdeps/ieee754/ldbl-opt/nldbl-ufromfp.c
new file mode 100644
index 0000000..b20a972
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-ufromfp.c
@@ -0,0 +1,26 @@
+/* Compatibility routine for IEEE double as long double for ufromfp.
+   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"
+
+uintmax_t
+attribute_hidden
+ufromfpl (double x, int round, unsigned int width)
+{
+  return ufromfp (x, round, width);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-ufromfpx.c b/sysdeps/ieee754/ldbl-opt/nldbl-ufromfpx.c
new file mode 100644
index 0000000..e1b4cea
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-ufromfpx.c
@@ -0,0 +1,26 @@
+/* Compatibility routine for IEEE double as long double for ufromfpx.
+   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"
+
+uintmax_t
+attribute_hidden
+ufromfpxl (double x, int round, unsigned int width)
+{
+  return ufromfpx (x, round, width);
+}
diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist
index 48483c5..82bdf2c 100644
--- a/sysdeps/nacl/libm.abilist
+++ b/sysdeps/nacl/libm.abilist
@@ -395,6 +395,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -416,3 +422,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 8059e40..6266864 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -427,6 +427,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -448,3 +454,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 4128493..0dc44af 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -437,6 +437,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -458,6 +464,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.3.4 GLIBC_2.3.4 A
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index 7af2ea0..d0c33d2 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -84,6 +84,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -105,6 +111,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index 14670bd..80fd4ad 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -396,6 +396,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -417,5 +423,11 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index ab94e90..761e442 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -440,6 +440,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -461,4 +467,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index ad89d24..d7d8006 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -369,6 +369,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -390,4 +396,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 7af2ea0..d0c33d2 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -84,6 +84,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -105,6 +111,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index f09e2c2..f3de018 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -438,6 +438,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -459,4 +465,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index 652fa4a..bb872f2 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -395,6 +395,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -416,3 +422,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 3b34a14..000c011 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -397,6 +397,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -418,6 +424,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
 _gp_disp _gp_disp A
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index bec1e69..b9599fe 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -429,6 +429,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -450,4 +456,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index 3af5069..c858ed5 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -395,6 +395,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -416,3 +422,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index b365e15..13ea493 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -440,6 +440,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -461,6 +467,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index f486c2f..ff6dc7a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -439,6 +439,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -460,6 +466,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index eeb5236..9658ded 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -434,6 +434,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -455,3 +461,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index f719800..afd3817 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -115,6 +115,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -136,6 +142,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index e720f35..604dff1 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -427,6 +427,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -448,6 +454,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 36bab6a..b56701e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -425,6 +425,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -446,6 +452,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index 0dcfb78..6b24852 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -396,6 +396,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -417,5 +423,11 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 676d035..f73af6f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -430,6 +430,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -451,6 +457,12 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 3589368..d071835 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -428,6 +428,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -449,4 +455,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
index 8323ccf..0059c27 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
@@ -396,6 +396,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -417,3 +423,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
index 8323ccf..0059c27 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
@@ -396,6 +396,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -417,3 +423,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
index 8323ccf..0059c27 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
@@ -396,6 +396,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -417,3 +423,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 34ece25..fc68ef6 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -429,6 +429,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -450,4 +456,10 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index d23a83d..a24ff7e 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -428,6 +428,12 @@ GLIBC_2.25 fmaxmagl F
 GLIBC_2.25 fminmag F
 GLIBC_2.25 fminmagf F
 GLIBC_2.25 fminmagl F
+GLIBC_2.25 fromfp F
+GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpl F
+GLIBC_2.25 fromfpx F
+GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxl F
 GLIBC_2.25 getpayload F
 GLIBC_2.25 getpayloadf F
 GLIBC_2.25 getpayloadl F
@@ -449,3 +455,9 @@ GLIBC_2.25 totalorderl F
 GLIBC_2.25 totalordermag F
 GLIBC_2.25 totalordermagf F
 GLIBC_2.25 totalordermagl F
+GLIBC_2.25 ufromfp F
+GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpl F
+GLIBC_2.25 ufromfpx F
+GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxl F

-- 
Joseph S. Myers
joseph@codesourcery.com

Attachment: glibc-fromfp.gz
Description: application/gzip


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]