Add nextup and nextdown math functions

Message ID 201606011211.u51C9sVN019582@mx0a-001b2d01.pphosted.com
State Superseded
Headers

Commit Message

Rajalakshmi S June 1, 2016, 12:10 p.m. UTC
  On 05/20/2016 05:45 PM, Joseph Myers wrote:
> On Fri, 20 May 2016, Rajalakshmi Srinivasaraghavan wrote:
>
>> This patch adds nextup and nextdown functions from TS 18661-1.
>
Here is an updated patch with comments incorporated.
  

Comments

Paul E. Murphy June 1, 2016, 2:35 p.m. UTC | #1
A few comments from my first walk through of the new patch.

On 06/01/2016 07:10 AM, Rajalakshmi Srinivasaraghavan wrote:
> 
> 
> On 05/20/2016 05:45 PM, Joseph Myers wrote:
>> On Fri, 20 May 2016, Rajalakshmi Srinivasaraghavan wrote:
>>
>>> This patch adds nextup and nextdown functions from TS 18661-1.
>>
> Here is an updated patch with comments incorporated.
> 
> 

+* TS 18661 adds nextup and nextdown functions alongside nextafter to
+  provide support for float128 equivalent to it.  So nextup and nextdown
+  functions are added as preparatory patches before Float128 support. This
+  is currently enabled as a GNU extension.
+

I would reword this.  IEC 60559 replaced the nextAfter operation with
nextUp and nextDown, TS 18661 standardizes them for C, and does not
define them for TS 18661 derived types (i.e _FloatN).

+nextdown(@code{-HUGE_VAL}) is @code{-HUGE_VAL}. It is based on draft
+TS 18661 and currently enabled as a GNU extension.

I believe it is a published extension to C11 now.  Likewise for
nextup.


+#if MANT_DIG == 106
+    TEST_f_f (nextdown, -1.0L, -1.0L-0x1p-105L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 1.0L+0x1p-105L, 1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 1.0L, 1.0L-0x1p-106L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif

It would be proactive to add tests for each format. A similar set of tests should
be made for binary{32,64,128} and the {intel,m68k}96 formats. Likewise for nextup.

+double __nextdown(double x)
+{
+	return -__nextup(-x);
+}

Function declaration should be GNU style.  The return type should be on its own
line.  Likewise, spaces should be placed between identifiers and open parenthesis.
There a number of other similar spacing issues throughout too.
  
Rical Jasan June 2, 2016, 7:52 a.m. UTC | #2
> diff --git a/manual/arith.texi b/manual/arith.texi
> index 72682f0..a869922 100644
> --- a/manual/arith.texi
> +++ b/manual/arith.texi
> @@ -1687,6 +1687,25 @@ This function is defined in @w{IEC 559} (and the appendix with
>  recommended functions in @w{IEEE 754}/@w{IEEE 854}).
>  @end deftypefun
>  
> +
> +@comment math.h
> +@comment GNU
> +@deftypefun double nextdown (double @var{x})
> +@comment math.h
> +@comment GNU
> +@deftypefunx float nextdownf (float @var{x})
> +@comment math.h
> +@comment GNU
> +@deftypefunx {long double} nextdownl (long double @var{x})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +The @code{nextdown} function returns the next representable value
> +less than @var{x}. If @var{x} is the positive number of least
> +magnitude the function returns +0. If @var{x} is zero, the function returns
> +the negative number of least magnitude in the type of @var{x}.

Is +0 not considered a positive number?

The manual is all over the place with this, but there is a strong
tendency to wrap numbers, esp. where they're return values and such, in
@code{}, so "returns @code{+0}."  @math{} is also used for formatting
numbers, but not nearly as widely.

Similar question for -0, and whether it is considered a negative number.
 Also, does zero in "If @var{x} is zero" imply all of -0, 0, and +0?

> +nextdown(@code{-HUGE_VAL}) is @code{-HUGE_VAL}. It is based on draft

I can't recall ever seeing a function call within a paragraph, and
haven't been able to find an example, skimming through the manual.  I
suggest using a similar style to what you've already used (i.e., "If
@var{x} is @code{-HUGE_VAL}, the return value is @code{-HUGE_VAL}.") or
breaking it out into a @smallexample and rearranging/rewording as necessary.

There is a good flow here, though: I found myself asking what happens if
you have the lowest number once the zero case was mentioned, and then
you answered it right away.  :)

I think changing "It" to @code{nextdown} would be nice; it feels like
it's somehow talking about HUGE_VAL, or specifically that aforementioned
outcome.  Also, it will be necessary if you change the subject of the
HUGE_VAL sentence to x or move it to its own paragraph following a
@smallexample.

> +TS 18661 and currently enabled as a GNU extension.
> +@end deftypefun
> +
>  @comment math.h
>  @comment ISO
>  @deftypefun double nexttoward (double @var{x}, long double @var{y})
> @@ -1702,6 +1721,25 @@ These functions are identical to the corresponding versions of

Is there a reason you split these new descriptions apart across
nexttoward? nextafter and nexttoward are related to each other, and
nextup and nextdown are also their own pair.

>  double}.
>  @end deftypefun
>  
> +@comment math.h
> +@comment GNU
> +@deftypefun double nextup (double @var{x})
> +@comment math.h
> +@comment GNU
> +@deftypefunx float nextupf (float @var{x})
> +@comment math.h
> +@comment GNU
> +@deftypefunx {long double} nextupl (long double @var{x})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +
> +The @code{nextup} function returns the next representable value
> +greater than @var{x}. If @var{x} is the negative number of least
> +magnitude the function returns -0. If @var{x} is zero, the function returns
> +the positive number of least magnitude in the type of @var{x}.
> +nextup(@code{HUGE_VAL}) is @code{HUGE_VAL}. It is based on draft
> +TS 18661 and currently enabled as a GNU extension.
> +@end deftypefun
> +
>  @cindex NaN
>  @comment math.h
>  @comment ISO

Same comments/questions on nextup as nextdown.

Thanks for documenting your work on the new stuff!

Rical
  
Joseph Myers June 2, 2016, 11:21 p.m. UTC | #3
On Wed, 1 Jun 2016, Rajalakshmi Srinivasaraghavan wrote:

> This patch adds nextup and nextdown functions from TS 18661-1 before
> enabling float128 support.

I think the description for the commit message should expand more on the 
change and its rationale.

> +* TS 18661 adds nextup and nextdown functions alongside nextafter to
> +  provide support for float128 equivalent to it.  So nextup and nextdown
> +  functions are added as preparatory patches before Float128 support. This
> +  is currently enabled as a GNU extension.

But I don't think this is what a NEWS entry should look like.  The 
rationale for adding these particular functions in isolation is much less 
relevant to the NEWS entry.  Rather, it should say what functions are 
added (six of them, not two), where they come from, what (briefly) they do 
and that they are currently handled as a GNU extension (i.e. require 
_GNU_SOURCE).  Cf. the NEWS entry for the issignaling macro - the 
motivation for adding that in isolation was for use in glibc tests (we 
needed some functionality, there was a defined API for it to it made sense 
to provide that API for use outside glibc), but that motivation is also 
not relevant to people interested in what's new in a glibc version.

> +/* Copyright (C) 2016 Free Software Foundation, Inc.

New files should start with a description of the file *before* the 
copyright notice.

> +/* nextdown(x) returns the least floating-point number in the
> +   format of x less than x.  */

Use the GNU standard formatting for comments on function definitions, 
immediately above the function definition.

> +#include <math_private.h>
> +#include <float.h>

Don't include these where not needed.

> +	    INSERT_WORDS(x,(1&0x80000000),1);    /* return +-minsubnormal */

This "(1&0x80000000)", and similar for other formats, makes no sense.  In 
this case, you simply mean "0".  (The point being that nextup of -0 is the 
least positive subnormal, but that is different from what you'd get by the 
simple integer decrement of the representation that works for all other 
non-NaN inputs where the sign is negative.)

> +	    /* return +-minsubnormal */
> +	    SET_LDOUBLE_WORDS64(x,-1&0x8000000000000000ULL,1);

"-1&0x8000000000000000ULL" in the ldbl-128 version actually seems wrong.

> diff --git a/sysdeps/ieee754/ldbl-96/s_nextupl.c b/sysdeps/ieee754/ldbl-96/s_nextupl.c

> +	        if (hx==0 || (esx == 0 && hx == 0x80000000)) {
> +	            esx += 1;
> +	            hx |= 0x80000000;

I'm not sure the special handling of (esx == 0 && hx == 0x80000000) is 
correct for the m68k variant of ldbl-96 (LDBL_MIN_EXP == -16382); exponent 
0 acts more like a normal exponent there so I think that bit of special 
handling should be disabled in that case.
  
Joseph Myers June 2, 2016, 11:28 p.m. UTC | #4
On Wed, 1 Jun 2016, Paul E. Murphy wrote:

> It would be proactive to add tests for each format. A similar set of 
> tests should be made for binary{32,64,128} and the {intel,m68k}96 
> formats. Likewise for nextup.

Any such new tests should of course be added for nextafter as well.
  
Joseph Myers June 2, 2016, 11:32 p.m. UTC | #5
On Thu, 2 Jun 2016, Rical Jasan wrote:

> I can't recall ever seeing a function call within a paragraph, and
> haven't been able to find an example, skimming through the manual.  I
> suggest using a similar style to what you've already used (i.e., "If
> @var{x} is @code{-HUGE_VAL}, the return value is @code{-HUGE_VAL}.") or
> breaking it out into a @smallexample and rearranging/rewording as necessary.

The basic problem with the documentation in the patch is that it's too 
closely based on the text from the standard.  It needs to be rewritten 
from scratch without being based on the text from the TS.
  

Patch

From 50d9687ec935b7f52d5587f52a3514b53c89025f Mon Sep 17 00:00:00 2001
From: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
Date: Wed, 1 Jun 2016 06:14:20 -0400
Subject: [PATCH] Add nextup and nextdown math functions

This patch adds nextup and nextdown functions from TS 18661-1 before
enabling float128 support.

Tested on powerpc64 and powerpc64le.

2016-06-01  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>

	* NEWS: Mention addition of nextup and nextdown.
	* manual/arith.texi: Document nextup and nextdown.
	* manual/libm-err-tab.pl: Add nextup and nextdown.
	* math/Makefile (libm-calls): Add s_nextdown and s_nextup.
	* math/Versions (libm): Add GLIBC_2.24.
	* math/bits/mathcalls.h: Add nextup and nextdown declaration.
	* math/libm-test.inc (nextup_test_data): Add new test.
	(nextdown_test_data): Likewise.
	* math/s_nextdown.c: New file.
	* math/s_nextdownf.c: Likewise.
	* math/s_nextdownl.c: Likewise.
	* math/s_nextup.c: Likewise.
	* math/test-tgmath.c F(compile_test)): Add nextup and nextdown tests.
	F(nextup): New function.
	F(nextdown): Likewise.
	* math/tgmath.h: Add nextup and nextdown.
	* sysdeps/ieee754/flt-32/s_nextupf.c: New file.
	* sysdeps/ieee754/ldbl-128/s_nextupl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_nextupl.c: Likewise.
	* sysdeps/ieee754/ldbl-64-128/s_nextupl.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_nextupl.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls):
	Add nextup and nextdown.
	(CFLAGS-nldbl-nextup.c): New variable.
	(CFLAGS-nldbl-nextdown.c): Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c: New file.
	* sysdeps/ieee754/ldbl-opt/nldbl-nextup.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/libmvec.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
---
 NEWS                                               |  5 ++
 manual/arith.texi                                  | 38 +++++++++++
 manual/libm-err-tab.pl                             |  6 +-
 math/Makefile                                      |  2 +-
 math/Versions                                      |  4 ++
 math/bits/mathcalls.h                              |  7 ++
 math/libm-test.inc                                 | 53 ++++++++++++++++
 math/s_nextdown.c                                  | 33 ++++++++++
 math/s_nextdownf.c                                 | 29 +++++++++
 math/s_nextdownl.c                                 | 29 +++++++++
 math/s_nextup.c                                    | 57 +++++++++++++++++
 math/test-tgmath.c                                 | 22 ++++++-
 math/tgmath.h                                      |  6 ++
 sysdeps/ieee754/flt-32/s_nextupf.c                 | 43 +++++++++++++
 sysdeps/ieee754/ldbl-128/s_nextupl.c               | 48 ++++++++++++++
 sysdeps/ieee754/ldbl-128ibm/s_nextupl.c            | 74 ++++++++++++++++++++++
 sysdeps/ieee754/ldbl-64-128/s_nextupl.c            |  5 ++
 sysdeps/ieee754/ldbl-96/s_nextupl.c                | 60 ++++++++++++++++++
 sysdeps/ieee754/ldbl-opt/Makefile                  |  5 +-
 sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c          | 24 +++++++
 sysdeps/ieee754/ldbl-opt/nldbl-nextup.c            | 24 +++++++
 sysdeps/nacl/libm.abilist                          |  7 ++
 sysdeps/unix/sysv/linux/aarch64/libm.abilist       |  7 ++
 sysdeps/unix/sysv/linux/alpha/libm.abilist         |  7 ++
 sysdeps/unix/sysv/linux/arm/libm.abilist           |  7 ++
 sysdeps/unix/sysv/linux/hppa/libm.abilist          |  7 ++
 sysdeps/unix/sysv/linux/i386/libm.abilist          |  7 ++
 sysdeps/unix/sysv/linux/ia64/libm.abilist          |  7 ++
 sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist |  7 ++
 sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist   |  7 ++
 sysdeps/unix/sysv/linux/microblaze/libm.abilist    |  7 ++
 sysdeps/unix/sysv/linux/mips/mips32/libm.abilist   |  7 ++
 sysdeps/unix/sysv/linux/mips/mips64/libm.abilist   |  7 ++
 sysdeps/unix/sysv/linux/nios2/libm.abilist         |  7 ++
 .../sysv/linux/powerpc/powerpc32/fpu/libm.abilist  |  7 ++
 .../linux/powerpc/powerpc32/nofpu/libm.abilist     |  7 ++
 .../sysv/linux/powerpc/powerpc64/libm-le.abilist   |  7 ++
 .../unix/sysv/linux/powerpc/powerpc64/libm.abilist |  7 ++
 sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist  |  7 ++
 sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist  |  7 ++
 sysdeps/unix/sysv/linux/sh/libm.abilist            |  7 ++
 sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist |  7 ++
 sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist |  7 ++
 .../sysv/linux/tile/tilegx/tilegx32/libm.abilist   |  7 ++
 .../sysv/linux/tile/tilegx/tilegx64/libm.abilist   |  7 ++
 sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist  |  7 ++
 sysdeps/unix/sysv/linux/x86_64/64/libm.abilist     |  7 ++
 sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist    |  7 ++
 48 files changed, 756 insertions(+), 7 deletions(-)
 create mode 100644 math/s_nextdown.c
 create mode 100644 math/s_nextdownf.c
 create mode 100644 math/s_nextdownl.c
 create mode 100644 math/s_nextup.c
 create mode 100644 sysdeps/ieee754/flt-32/s_nextupf.c
 create mode 100644 sysdeps/ieee754/ldbl-128/s_nextupl.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm/s_nextupl.c
 create mode 100644 sysdeps/ieee754/ldbl-64-128/s_nextupl.c
 create mode 100644 sysdeps/ieee754/ldbl-96/s_nextupl.c
 create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c
 create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-nextup.c

diff --git a/NEWS b/NEWS
index 2341697..da1e068 100644
--- a/NEWS
+++ b/NEWS
@@ -33,6 +33,11 @@  Version 2.24
   group: files [SUCCESS=merge] nis
   Implemented by Stephen Gallagher (Red Hat).
 
+* TS 18661 adds nextup and nextdown functions alongside nextafter to
+  provide support for float128 equivalent to it.  So nextup and nextdown
+  functions are added as preparatory patches before Float128 support. This
+  is currently enabled as a GNU extension.
+
 Security related changes:
 
 * An unnecessary stack copy in _nss_dns_getnetbyname_r was removed.  It
diff --git a/manual/arith.texi b/manual/arith.texi
index 72682f0..a869922 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -1687,6 +1687,25 @@  This function is defined in @w{IEC 559} (and the appendix with
 recommended functions in @w{IEEE 754}/@w{IEEE 854}).
 @end deftypefun
 
+
+@comment math.h
+@comment GNU
+@deftypefun double nextdown (double @var{x})
+@comment math.h
+@comment GNU
+@deftypefunx float nextdownf (float @var{x})
+@comment math.h
+@comment GNU
+@deftypefunx {long double} nextdownl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+The @code{nextdown} function returns the next representable value
+less than @var{x}. If @var{x} is the positive number of least
+magnitude the function returns +0. If @var{x} is zero, the function returns
+the negative number of least magnitude in the type of @var{x}.
+nextdown(@code{-HUGE_VAL}) is @code{-HUGE_VAL}. It is based on draft
+TS 18661 and currently enabled as a GNU extension.
+@end deftypefun
+
 @comment math.h
 @comment ISO
 @deftypefun double nexttoward (double @var{x}, long double @var{y})
@@ -1702,6 +1721,25 @@  These functions are identical to the corresponding versions of
 double}.
 @end deftypefun
 
+@comment math.h
+@comment GNU
+@deftypefun double nextup (double @var{x})
+@comment math.h
+@comment GNU
+@deftypefunx float nextupf (float @var{x})
+@comment math.h
+@comment GNU
+@deftypefunx {long double} nextupl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+
+The @code{nextup} function returns the next representable value
+greater than @var{x}. If @var{x} is the negative number of least
+magnitude the function returns -0. If @var{x} is zero, the function returns
+the positive number of least magnitude in the type of @var{x}.
+nextup(@code{HUGE_VAL}) is @code{HUGE_VAL}. It is based on draft
+TS 18661 and currently enabled as a GNU extension.
+@end deftypefun
+
 @cindex NaN
 @comment math.h
 @comment ISO
diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl
index 3846afc..c2792c5 100755
--- a/manual/libm-err-tab.pl
+++ b/manual/libm-err-tab.pl
@@ -73,9 +73,9 @@  use vars qw (%results @all_floats %suffices @all_functions);
     "fmax", "fmin", "fmod", "frexp", "gamma", "hypot",
     "ilogb", "j0", "j1", "jn", "lgamma", "lrint",
     "llrint", "log", "log10", "log1p", "log2", "logb", "lround",
-    "llround", "modf", "nearbyint", "nextafter", "nexttoward", "pow",
-    "remainder", "remquo", "rint", "round", "scalb", "scalbn", "scalbln",
-    "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma",
+    "llround", "modf", "nearbyint", "nextafter", "nextdown", "nexttoward",
+    "nextup", "pow", "remainder", "remquo", "rint", "round", "scalb",
+    "scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma",
     "trunc", "y0", "y1", "yn" );
 # fpclassify, isnormal, isfinite, isinf, isnan, issignaling, signbit,
 # isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered
diff --git a/math/Makefile b/math/Makefile
index f0265bb..f6c56a8 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -63,7 +63,7 @@  libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod	\
 	     s_fma s_lrint s_llrint s_lround s_llround e_exp10 w_log2	\
 	     s_issignaling $(calls:s_%=m_%) x2y2m1 k_casinh	\
 	     gamma_product k_standard lgamma_neg lgamma_product		\
-	     w_lgamma_compat
+	     w_lgamma_compat s_nextup s_nextdown
 
 dbl-only-routines := branred doasin dosincos halfulp mpa mpatan2	\
 		     mpatan mpexp mplog mpsqrt mptan sincos32 slowexp	\
diff --git a/math/Versions b/math/Versions
index e6a597c..467d7ed 100644
--- a/math/Versions
+++ b/math/Versions
@@ -210,4 +210,8 @@  libm {
     # dynamic symbol for signgam but not __signgam.
     lgamma; lgammaf; lgammal; __signgam;
   }
+  GLIBC_2.24 {
+    nextup; nextupf; nextupl;
+    nextdown; nextdownf; nextdownl;
+  }
 }
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index 9a7b3f0..e2cf49f 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -294,6 +294,13 @@  __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
 __MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__));
 # endif
 
+#ifdef __USE_GNU
+/* Return X - epsilon.  */
+__MATHCALL (nextdown,, (_Mdouble_ __x));
+/* Return X + epsilon.  */
+__MATHCALL (nextup,, (_Mdouble_ __x));
+# endif
+
 /* Return the remainder of integer divison X / Y with infinite precision.  */
 __MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
 
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 8c64c8e..92b03e7 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -9988,6 +9988,57 @@  nextafter_test (void)
   ALL_RM_TEST (nextafter, 1, nextafter_test_data, RUN_TEST_LOOP_ff_f, END);
 }
 
+static const struct test_f_f_data nextup_test_data[] =
+  {
+    TEST_f_f (nextup, minus_zero, min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, 0, min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, plus_zero, min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -min_subnorm_value, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, max_value, plus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, plus_infty, plus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, minus_infty, -max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_f_f (nextup, -snan_value, qnan_value, INVALID_EXCEPTION),
+#if MANT_DIG == 106
+    TEST_f_f (nextup, 1.0L, 1.0L+0x1p-105L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0L-0x1p-105L, -1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0L, -1.0L+0x1p-106L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+  };
+
+static void
+nextup_test (void)
+{
+  ALL_RM_TEST (nextup, 1, nextup_test_data, RUN_TEST_LOOP_f_f, END);
+}
+
+static const struct test_f_f_data nextdown_test_data[] =
+  {
+    TEST_f_f (nextdown, minus_zero, -min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 0, -min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, plus_zero, -min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, min_subnorm_value, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, -max_value, minus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, plus_infty, max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, minus_infty, minus_infty, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_f_f (nextdown, -snan_value, qnan_value, INVALID_EXCEPTION),
+#if MANT_DIG == 106
+    TEST_f_f (nextdown, -1.0L, -1.0L-0x1p-105L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 1.0L+0x1p-105L, 1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 1.0L, 1.0L-0x1p-106L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+  };
+
+static void
+nextdown_test (void)
+{
+  ALL_RM_TEST (nextdown, 1, nextdown_test_data, RUN_TEST_LOOP_f_f, END);
+}
 
 static const struct test_ff_f_data_nexttoward nexttoward_test_data[] =
   {
@@ -12116,6 +12167,8 @@  main (int argc, char **argv)
 
   /* Manipulation functions:  */
   copysign_test ();
+  nextup_test();
+  nextdown_test();
   nextafter_test ();
   nexttoward_test ();
 
diff --git a/math/s_nextdown.c b/math/s_nextdown.c
new file mode 100644
index 0000000..af07fbe
--- /dev/null
+++ b/math/s_nextdown.c
@@ -0,0 +1,33 @@ 
+/* 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/>.  */
+
+/* nextdown(x) returns the least floating-point number in the
+   format of x less than x.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <float.h>
+
+double __nextdown(double x)
+{
+	return -__nextup(-x);
+}
+weak_alias (__nextdown, nextdown)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__nextdown, __nextdownl)
+weak_alias (__nextdown, nextdownl)
+#endif
diff --git a/math/s_nextdownf.c b/math/s_nextdownf.c
new file mode 100644
index 0000000..0dd9d2b
--- /dev/null
+++ b/math/s_nextdownf.c
@@ -0,0 +1,29 @@ 
+/* 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/>.  */
+
+/* nextdown(x) returns the least floating-point number in the
+   format of x less than x.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <float.h>
+
+float __nextdownf(float x)
+{
+	return -__nextupf(-x);
+}
+weak_alias (__nextdownf, nextdownf)
diff --git a/math/s_nextdownl.c b/math/s_nextdownl.c
new file mode 100644
index 0000000..e9f10e7
--- /dev/null
+++ b/math/s_nextdownl.c
@@ -0,0 +1,29 @@ 
+/* 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/>.  */
+
+/* nextdown(x) returns the least floating-point number in the
+   format of x less than x.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <float.h>
+
+long double __nextdownl(long double x)
+{
+	return -__nextupl(-x);
+}
+weak_alias (__nextdownl, nextdownl)
diff --git a/math/s_nextup.c b/math/s_nextup.c
new file mode 100644
index 0000000..b1c2746
--- /dev/null
+++ b/math/s_nextup.c
@@ -0,0 +1,57 @@ 
+/* 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/>.  */
+
+/* nextup(x) returns the least floating-point number in the
+   format of x that compares greater than x.  */
+
+#include <math.h>
+#include <math_private.h>
+#include <float.h>
+
+double __nextup(double x)
+{
+	int32_t hx,ix;
+	u_int32_t lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+	ix = hx&0x7fffffff;
+
+	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0))   /* x is nan */
+	    return x+x;
+	if((ix|lx)==0) {
+	    INSERT_WORDS(x,(1&0x80000000),1);    /* return +-minsubnormal */
+	    return x;
+	}
+	if(hx>=0) {		/* x > 0 */
+	    if (isinf(x))
+	        return x;
+	    lx += 1;
+	    if(lx==0)
+	        hx += 1;
+	} else {		/* x < 0 */
+	    if(lx==0)
+	        hx -= 1;
+	    lx -= 1;
+	}
+	INSERT_WORDS(x,hx,lx);
+	return x;
+}
+weak_alias (__nextup, nextup)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__nextup, __nextupl)
+weak_alias (__nextup, nextupl)
+#endif
diff --git a/math/test-tgmath.c b/math/test-tgmath.c
index 0e978d1..70ab428 100644
--- a/math/test-tgmath.c
+++ b/math/test-tgmath.c
@@ -50,7 +50,7 @@  int count_cdouble;
 int count_cfloat;
 int count_cldouble;
 
-#define NCALLS     115
+#define NCALLS     119
 #define NCALLS_INT 4
 #define NCCALLS    47
 
@@ -274,7 +274,9 @@  F(compile_test) (void)
   b = lgamma (lgamma (a));
   a = rint (rint (x));
   b = nextafter (nextafter (a, b), nextafter (c, x));
-  a = nexttoward (nexttoward (x, a), c);
+  a = nextdown (nextdown (a));
+  b = nexttoward (nexttoward (x, a), c);
+  a = nextup (nextup (a));
   b = remainder (remainder (a, b), remainder (c, x));
   a = scalb (scalb (x, a), (TYPE) (6));
   k = scalbn (a, 7) + scalbln (c, 10l);
@@ -777,6 +779,14 @@  TYPE
 }
 
 TYPE
+(F(nextdown)) (TYPE x)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+TYPE
 (F(nexttoward)) (TYPE x, long double y)
 {
   ++count;
@@ -785,6 +795,14 @@  TYPE
 }
 
 TYPE
+(F(nextup)) (TYPE x)
+{
+  ++count;
+  P ();
+  return x;
+}
+
+TYPE
 (F(remainder)) (TYPE x, TYPE y)
 {
   ++count;
diff --git a/math/tgmath.h b/math/tgmath.h
index ea2b611..42d7c2d 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -391,6 +391,12 @@ 
 /* Return the integer nearest X in the direction of the
    prevailing rounding mode.  */
 #define rint(Val) __TGMATH_UNARY_REAL_ONLY (Val, rint)
+#ifdef __USE_GNU
+/* Return X - epsilon. */
+#define nextdown(Val) __TGMATH_UNARY_REAL_ONLY (Val, nextdown)
+/* Return X + epsilon. */
+#define nextup(Val) __TGMATH_UNARY_REAL_ONLY (Val, nextup)
+#endif
 
 /* Return X + epsilon if X < Y, X - epsilon if X > Y.  */
 #define nextafter(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, nextafter)
diff --git a/sysdeps/ieee754/flt-32/s_nextupf.c b/sysdeps/ieee754/flt-32/s_nextupf.c
new file mode 100644
index 0000000..1ec295d
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_nextupf.c
@@ -0,0 +1,43 @@ 
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+#include <math.h>
+#include <math_private.h>
+#include <float.h>
+
+float __nextupf(float x)
+{
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;			/* |x| */
+	if(ix==0) {
+	    SET_FLOAT_WORD(x,(1&0x80000000)|1);	/* return +-minsubnormal */
+	    return x;
+	}
+	if(ix>0x7f800000)			/* x is nan */
+	    return x+x;
+	if(hx>=0) {				/* x > 0 */
+	    if (isinf (x))
+	        return x;
+	    hx += 1;
+	} else {				/* x < 0 */
+	    hx -= 1;
+	}
+	SET_FLOAT_WORD(x,hx);
+	return x;
+}
+weak_alias (__nextupf, nextupf)
diff --git a/sysdeps/ieee754/ldbl-128/s_nextupl.c b/sysdeps/ieee754/ldbl-128/s_nextupl.c
new file mode 100644
index 0000000..9c4c8eb
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_nextupl.c
@@ -0,0 +1,48 @@ 
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+#include <math.h>
+#include <math_private.h>
+
+long double __nextupl(long double x)
+{
+	int64_t hx,ix;
+	u_int64_t lx;
+
+	GET_LDOUBLE_WORDS64(hx,lx,x);
+	ix = hx&0x7fffffffffffffffLL;		/* |x| */
+
+	/* x is nan */
+	if(((ix>=0x7fff000000000000LL)&&((ix-0x7fff000000000000LL)|lx)!=0))
+	   return x+x;
+	if((ix|lx)==0) {
+	    /* return +-minsubnormal */
+	    SET_LDOUBLE_WORDS64(x,-1&0x8000000000000000ULL,1);
+	    return x;
+	}
+	if(hx>=0) {				/* x > 0 */
+	    if (isinf (x))
+	        return x;
+	    lx++;
+	    if(lx==0) hx++;
+	} else {				/* x < 0 */
+	    if(lx==0) hx--;
+	    lx--;
+	}
+	SET_LDOUBLE_WORDS64(x,hx,lx);
+	return x;
+}
+weak_alias (__nextupl, nextupl)
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nextupl.c b/sysdeps/ieee754/ldbl-128ibm/s_nextupl.c
new file mode 100644
index 0000000..13b6d9b
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_nextupl.c
@@ -0,0 +1,74 @@ 
+/* 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 <float.h>
+#include <math.h>
+#include <math_private.h>
+#include <math_ldbl_opt.h>
+
+long double __nextupl(long double x)
+{
+	int64_t hx, ihx, lx;
+	double xhi, xlo, yhi;
+
+	ldbl_unpack (x, &xhi, &xlo);
+	EXTRACT_WORDS64 (hx, xhi);
+	EXTRACT_WORDS64 (lx, xlo);
+	ihx = hx&0x7fffffffffffffffLL;		/* |hx| */
+
+	if(ihx>0x7ff0000000000000LL)	/* x is nan */
+	    return x+x;	/* signal the nan */
+	if(ihx == 0) {				/* x == 0 */
+	    hx = (1 & 0x8000000000000000ULL) | 1;
+	    INSERT_WORDS64 (xhi, hx);
+	    x = xhi;
+	    return x;
+	}
+
+	long double u;
+	if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) {
+	    return INFINITY;
+	}
+	if ((uint64_t) hx >= 0xfff0000000000000ULL) {
+	    u = -0x1.fffffffffffff7ffffffffffff8p+1023L;
+	    return u;
+	}
+	if(ihx <= 0x0360000000000000LL) {	/* x <= LDBL_MIN */
+	    x += LDBL_TRUE_MIN;
+	    if (x == 0.0L)	/* handle negative LDBL_TRUE_MIN case */
+	        x = -0.0L;
+	    return x;
+	}
+	/* If the high double is an exact power of two and the low
+	   double is the opposite sign, then 1ulp is one less than
+	   what we might determine from the high double.  Similarly
+	   if X is an exact power of two, and negative, because
+	   making it a little larger will result in the exponent
+	   decreasing by one and normalisation of the mantissa.   */
+	if ((hx & 0x000fffffffffffffLL) == 0
+	    && ((lx != 0 && lx != 0x8000000000000000LL && (hx ^ lx) < 0)
+	    || ((lx == 0 || lx == 0x8000000000000000LL) && hx < 0)))
+	    ihx -= 1LL << 52;
+	if (ihx < (106LL << 52)) { /* ulp will denormal */
+	    INSERT_WORDS64 (yhi, ihx & (0x7ffLL<<52));
+	    u = yhi * 0x1p-105;
+	} else {
+	    INSERT_WORDS64 (yhi, (ihx & (0x7ffLL<<52))-(105LL<<52));
+	    u = yhi;
+	}
+	return x + u;
+}
+weak_alias (__nextupl, nextupl)
diff --git a/sysdeps/ieee754/ldbl-64-128/s_nextupl.c b/sysdeps/ieee754/ldbl-64-128/s_nextupl.c
new file mode 100644
index 0000000..4a04bd5
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-64-128/s_nextupl.c
@@ -0,0 +1,5 @@ 
+#include <math_ldbl_opt.h>
+#undef weak_alias
+#define weak_alias(n,a)
+#include <sysdeps/ieee754/ldbl-128/s_nextupl.c>
+long_double_symbol (libm, __nextupl, nextupl);
diff --git a/sysdeps/ieee754/ldbl-96/s_nextupl.c b/sysdeps/ieee754/ldbl-96/s_nextupl.c
new file mode 100644
index 0000000..59901fb
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_nextupl.c
@@ -0,0 +1,60 @@ 
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+#include <math.h>
+#include <math_private.h>
+
+long double __nextupl(long double x)
+{
+	u_int32_t hx,ix;
+	u_int32_t lx;
+	int32_t esx;
+
+	GET_LDOUBLE_WORDS(esx,hx,lx,x);
+	ix = esx&0x7fff;		/* |x| */
+
+	if(((ix==0x7fff)&&(((hx&0x7fffffff)|lx)!=0)))	/* x is nan */
+	    return x+x;
+	if((ix|hx|lx)==0) {			/* x == 0 */
+	    SET_LDOUBLE_WORDS(x,1&0x8000,0,1);/* return +-minsubnormal */
+	    return x;
+	}
+	if(esx>=0) {			/* x > 0 */
+	    if (isinf (x)) return x;
+	    lx += 1;
+	    if(lx==0) {
+	        hx += 1;
+	        if (hx==0 || (esx == 0 && hx == 0x80000000)) {
+	            esx += 1;
+	            hx |= 0x80000000;
+	        }
+	    }
+	} else {			/* x < 0 */
+	    if(lx==0) {
+	        if (hx <= 0x80000000) {
+	            esx -= 1;
+	            hx = hx - 1;
+	            if ((esx&0x7fff) > 0)
+	            hx |= 0x80000000;
+	        } else
+	            hx -= 1;
+	    }
+	    lx -= 1;
+	}
+	SET_LDOUBLE_WORDS(x,esx,hx,lx);
+	return x;
+}
+weak_alias (__nextupl, nextupl)
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index 53091e4..af08209 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -40,7 +40,8 @@  libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \
 		 isoc99_scanf isoc99_fscanf isoc99_sscanf \
 		 isoc99_vscanf isoc99_vfscanf isoc99_vsscanf \
 		 isoc99_wscanf isoc99_fwscanf isoc99_swscanf \
-		 isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf
+		 isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf \
+		 nextup nextdown
 libnldbl-routines = $(libnldbl-calls:%=nldbl-%)
 libnldbl-inhibit-o = $(object-suffixes)
 libnldbl-static-only-routines = $(libnldbl-routines)
@@ -120,8 +121,10 @@  CFLAGS-nldbl-modf.c = -fno-builtin-modfl
 CFLAGS-nldbl-nan.c = -fno-builtin-nanl
 CFLAGS-nldbl-nearbyint.c = -fno-builtin-nearbyintl
 CFLAGS-nldbl-nextafter.c = -fno-builtin-nextafterl
+CFLAGS-nldbl-nextdown.c = -fno-builtin-nextdownl
 CFLAGS-nldbl-nexttoward.c = -fno-builtin-nexttoward -fno-builtin-nexttowardl
 CFLAGS-nldbl-nexttowardf.c = -fno-builtin-nexttowardf
+CFLAGS-nldbl-nextup.c = -fno-builtin-nextupl
 CFLAGS-nldbl-pow.c = -fno-builtin-powl
 CFLAGS-nldbl-pow10.c = -fno-builtin-pow10l
 CFLAGS-nldbl-remainder.c = -fno-builtin-remainderl -fno-builtin-dreml
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c b/sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c
new file mode 100644
index 0000000..c26f524
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c
@@ -0,0 +1,24 @@ 
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+#include "nldbl-compat.h"
+
+double
+attribute_hidden
+nextdownl (double x)
+{
+  return nextdown (x);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-nextup.c b/sysdeps/ieee754/ldbl-opt/nldbl-nextup.c
new file mode 100644
index 0000000..0985026
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-nextup.c
@@ -0,0 +1,24 @@ 
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+#include "nldbl-compat.h"
+
+double
+attribute_hidden
+nextupl (double x)
+{
+  return nextup (x);
+}
diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist
index 055b0b2..838fede 100644
--- a/sysdeps/nacl/libm.abilist
+++ b/sysdeps/nacl/libm.abilist
@@ -372,3 +372,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 2123113..781d2d3 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -403,3 +403,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 611dfe1..f342c6b 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -413,6 +413,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 e65e230..7a02fb1 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -61,6 +61,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 9b7f40a..bf40ddf 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -373,5 +373,12 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 78b542e..92e9402 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -415,4 +415,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 6d4cc72..e2737a2 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -344,4 +344,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 e65e230..7a02fb1 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -61,6 +61,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 2d31935..9af59d7 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -413,4 +413,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 149fd4f..0b1f136 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -372,3 +372,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index e599e82..2e2bb00 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -374,6 +374,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 164ba55..7daa595 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -405,4 +405,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 ad02eff..a36e2f3 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -372,3 +372,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index 5d2f263..abe8c5d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -414,6 +414,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 8b5edb5..1c25f56 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -413,6 +413,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 ee06683..9d19474 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -408,3 +408,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index 6c7fc9b..cedb189 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -89,6 +89,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 039ed5c..9b567c6 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -403,6 +403,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 66c625d..78a82fb 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -401,6 +401,13 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 93b8471..f98ade7 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -373,5 +373,12 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 185ab09..d2e8421 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -406,6 +406,13 @@  GLIBC_2.23 __sqrtl_finite F
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 b56add3..e000221 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -404,4 +404,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 18b8d00..00e82c1 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
@@ -373,3 +373,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
index 18b8d00..00e82c1 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
@@ -373,3 +373,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
index 18b8d00..00e82c1 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
@@ -373,3 +373,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index b911aff..65b4708 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -404,4 +404,11 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl 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 168c0d8..d35e9f0 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -403,3 +403,10 @@  GLIBC_2.23 __signgam D 0x4
 GLIBC_2.23 lgamma F
 GLIBC_2.23 lgammaf F
 GLIBC_2.23 lgammal F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 nextdown F
+GLIBC_2.24 nextdownf F
+GLIBC_2.24 nextdownl F
+GLIBC_2.24 nextup F
+GLIBC_2.24 nextupf F
+GLIBC_2.24 nextupl F
-- 
1.8.3.1