]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add nextup and nextdown math functions
authorRajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
Thu, 16 Jun 2016 15:51:26 +0000 (21:21 +0530)
committerRajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
Thu, 16 Jun 2016 16:07:45 +0000 (21:37 +0530)
TS 18661 adds nextup and nextdown functions alongside nextafter to provide
support for float128 equivalent to it.  This patch adds nextupl, nextup,
nextupf, nextdownl, nextdown and nextdownf to libm before float128 support.

The nextup functions return the next representable value in the direction of
positive infinity and the nextdown functions return the next representable
value in the direction of negative infinity.  These are currently enabled
as GNU extensions.

48 files changed:
ChangeLog
NEWS
manual/arith.texi
manual/libm-err-tab.pl
math/Makefile
math/Versions
math/bits/mathcalls.h
math/libm-test.inc
math/s_nextdown.c [new file with mode: 0644]
math/s_nextdownf.c [new file with mode: 0644]
math/s_nextdownl.c [new file with mode: 0644]
math/test-tgmath.c
math/tgmath.h
sysdeps/ieee754/dbl-64/s_nextup.c [new file with mode: 0644]
sysdeps/ieee754/flt-32/s_nextupf.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-128/s_nextupl.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-128ibm/s_nextupl.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-96/s_nextupl.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-opt/Makefile
sysdeps/ieee754/ldbl-opt/nldbl-nextdown.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-opt/nldbl-nextup.c [new file with mode: 0644]
sysdeps/nacl/libm.abilist
sysdeps/unix/sysv/linux/aarch64/libm.abilist
sysdeps/unix/sysv/linux/alpha/libm.abilist
sysdeps/unix/sysv/linux/arm/libm.abilist
sysdeps/unix/sysv/linux/hppa/libm.abilist
sysdeps/unix/sysv/linux/i386/libm.abilist
sysdeps/unix/sysv/linux/ia64/libm.abilist
sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
sysdeps/unix/sysv/linux/microblaze/libm.abilist
sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
sysdeps/unix/sysv/linux/nios2/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
sysdeps/unix/sysv/linux/sh/libm.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist

index 86a079c1ca4bab92c241c5af61c6dbb2822b9697..e72ffb84309b522080a8a7429233f200b5d8c213 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,67 @@
+2016-06-16  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 (nextafter_test_data) [TEST_COND_intel96]:
+       Add new test.
+       (nextafter_test_data) [TEST_COND_binary32]: Likewise.
+       (nextafter_test_data) [TEST_COND_m68k96]: Likewise.
+       (nextafter_test_data) [TEST_COND_binary64]: Likewise.
+       (nextafter_test_data) [TEST_COND_binary128]: Likewise.
+       (nextup_test_data): Likewise.
+       (nextdown_test_data): Likewise.
+       * math/s_nextdown.c: New file.
+       * math/s_nextdownf.c: Likewise.
+       * math/s_nextdownl.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/dbl-64/s_nextup.c: Likewise.
+       * sysdeps/ieee754/ldbl-128/s_nextupl.c: Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/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.
+
 2016-06-16  Rical Jasan  <ricaljasan@pacific.net>
 
        * manual/pattern.texi: Fix typos & grammar errors.
diff --git a/NEWS b/NEWS
index 9b5d9fe8e0f798fe7f0899ce8ff78b07af30adfe..e2737d5f47a23a51319d0095f41185719d712374 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,13 @@ Version 2.24
   done anything in over 16 years.  Scripts using this option can safely
   drop it.
 
+* nextupl, nextup, nextupf, nextdownl, nextdown and nextdownf are added to
+  libm.  They are defined by TS 18661 and IEEE754-2008.  The nextup functions
+  return the next representable value in the direction of positive infinity
+  and the nextdown functions return the next representable value in the
+  direction of negative infinity.  These are currently enabled as GNU
+  extensions.
+
 Security related changes:
 
 * An unnecessary stack copy in _nss_dns_getnetbyname_r was removed.  It
index 72682f0c996e0835cadc7216861f131bbb08e094..f54b1ec7df411abecf43f538baa412a576fe216e 100644 (file)
@@ -1702,6 +1702,46 @@ 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 neighbor of @var{x}
+in the direction of positive infinity.  If @var{x} is the smallest negative
+subnormal number in the type of @var{x} the function returns @code{-0}.  If
+@math{@var{x} = @code{0}} the function returns the smallest positive subnormal
+number in the type of @var{x}.  If @var{x} is NaN, NaN is returned.
+If @var{x} is @math{+@infinity{}}, @math{+@infinity{}} is returned.
+@code{nextup} is based on TS 18661 and currently enabled as a GNU extension.
+@code{nextup} never raises an exception except for signaling NaNs.
+@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 neighbor of @var{x}
+in the direction of negative infinity.  If @var{x} is the smallest positive
+subnormal number in the type of @var{x} the function returns @code{+0}.  If
+@math{@var{x} = @code{0}} the function returns the smallest negative subnormal
+number in the type of @var{x}.  If @var{x} is NaN, NaN is returned.
+If @var{x} is @math{-@infinity{}}, @math{-@infinity{}} is returned.
+@code{nextdown} is based on TS 18661 and currently enabled as a GNU extension.
+@code{nextdown} never raises an exception except for signaling NaNs.
+@end deftypefun
+
 @cindex NaN
 @comment math.h
 @comment ISO
index 3846afcb2ad7d743318c40384406e9384f0a048f..c2792c50d847132ee86d88761648119fe0e9db10 100755 (executable)
@@ -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
index 6cd3cf1f65564c7c29d1caec0e4338b747d9e946..4f141812ba6a561434169604b3605f51958153b8 100644 (file)
@@ -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   \
index e6a597cf237a90c8db3740c0d4336a0105493793..467d7ed3b519bd19f849555bfb26b8243673d532 100644 (file)
@@ -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;
+  }
 }
index 9a7b3f0f18c38fef5cae494014a5e7489e813309..e2cf49f6271d0d838150c7b1b068f1b40f7b13d9 100644 (file)
@@ -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));
 
index d6cad6634c8729f04d407c897c88e04c2f60c3f2..17d65b40fd8747af310ab706f190ec019068d7f3 100644 (file)
@@ -10177,11 +10177,28 @@ static const struct test_ff_f_data nextafter_test_data[] =
     TEST_ff_f (nextafter, -0x0.fffffffep-16382L, 0.0L, -0x0.fffffffdfffffffep-16382L, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
 #endif
 
-#if MANT_DIG >= 64
-    // XXX Enable once gcc is fixed.
-    //TEST_ff_f (nextafter, 0x0.00000040000000000000p-16385L, -0.1L, 0x0.0000003ffffffff00000p-16385L),
+#if TEST_COND_binary32
+    TEST_ff_f (nextafter, 1.0, 2.0, 0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, 1.0, 0.9, 0x0.ffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0, -2.0, -0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0, 2.0, -0x0.ffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_binary64
+    TEST_ff_f (nextafter, 1.0, 2.0, 0x1.0000000000001p+0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, 1.0, 0.9, 0x1.fffffffffffffp-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0, -2.0, -0x1.0000000000001p+0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0, 2.0, -0x1.fffffffffffffp-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96 || TEST_COND_intel96
+    TEST_ff_f (nextafter, 1.0L, 2.0L, 0x8.0000000000000010p-3L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, 1.0L, -2.0L, 0xf.fffffffffffffff0p-4L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0L, -2.0L, -0x8.0000000000000010p-3L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0L, 2.0L, -0xf.fffffffffffffff0p-4L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96
+    TEST_ff_f (nextafter, -0x0.fffffffep-16383L, 0.0L, -0x0.fffffffdfffffffep-16383L, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
 #endif
-#if MANT_DIG == 106
+#if TEST_COND_ibm128
     TEST_ff_f (nextafter, 1.0L, -10.0L, 1.0L-0x1p-106L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (nextafter, 1.0L, 10.0L, 1.0L+0x1p-105L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (nextafter, 1.0L-0x1p-106L, 10.0L, 1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -10189,6 +10206,12 @@ static const struct test_ff_f_data nextafter_test_data[] =
     TEST_ff_f (nextafter, -1.0L, 10.0L, -1.0L+0x1p-106L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (nextafter, -1.0L+0x1p-106L, -10.0L, -1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #endif
+#if TEST_COND_binary128
+    TEST_ff_f (nextafter, 1.0L, 10.0L, 0x1.0000000000000000000000000001p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, 1.0L, -10.0L, 0x1.ffffffffffffffffffffffffffffp-1L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0L, 10.0L, -0x1.ffffffffffffffffffffffffffffp-1L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (nextafter, -1.0L, -10.0L, -0x1.0000000000000000000000000001p+0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
 
     /* XXX We need the hexadecimal FP number representation here for further
        tests.  */
@@ -10199,6 +10222,100 @@ 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, -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, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+    TEST_f_f (nextup, -snan_value, qnan_value, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+#if TEST_COND_binary32
+    TEST_f_f (nextup, 1.0, 0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0, -0x0.ffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_binary64
+    TEST_f_f (nextup, 1.0, 0x1.0000000000001p+0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0, -0x1.fffffffffffffp-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96 || TEST_COND_intel96
+    TEST_f_f (nextup, 1.0L, 0x8.0000000000000010p-3L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0L, -0xf.fffffffffffffff0p-4L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, 0xf.fffffffffffffff0p-4L, 1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_intel96
+    TEST_f_f (nextup, -0x0.fffffffep-16382L, -0x0.fffffffdfffffffep-16382L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96
+    TEST_f_f (nextup, -0x0.fffffffep-16383L, -0x0.fffffffdfffffffep-16383L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_ibm128
+    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
+#if TEST_COND_binary128
+    TEST_f_f (nextup, 1.0L, 0x1.0000000000000000000000000001p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextup, -1.0L, -0x1.ffffffffffffffffffffffffffffp-1L, 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, 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, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+    TEST_f_f (nextdown, -snan_value, qnan_value, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION),
+#if TEST_COND_binary32
+    TEST_f_f (nextdown, 1.0, 0x0.ffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, -1.0, -0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_binary64
+    TEST_f_f (nextdown, 1.0, 0x1.fffffffffffffp-1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, -1.0, -0x1.0000000000001p+0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96 || TEST_COND_intel96
+    TEST_f_f (nextdown, -1.0L, -0x8.0000000000000010p-3L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 1.0L, 0xf.fffffffffffffff0p-4L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, 0x8.0000000000000010p-3L, 1.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_intel96
+    TEST_f_f (nextdown, -0x0.fffffffdfffffffep-16382L, -0x0.fffffffep-16382L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_m68k96
+    TEST_f_f (nextdown, -0x0.fffffffdfffffffep-16383L, -0x0.fffffffep-16383L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
+#if TEST_COND_ibm128
+    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
+#if TEST_COND_binary128
+    TEST_f_f (nextdown, 1.0L, 0x1.ffffffffffffffffffffffffffffp-1L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (nextdown, -1.0L, -0x1.0000000000000000000000000001p+0L, 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);
+}
 
 
 /* Note, the second argument is always typed as long double.  The j type
@@ -12335,6 +12452,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 (file)
index 0000000..06fd1c9
--- /dev/null
@@ -0,0 +1,33 @@
+/* Return the greatest floating-point number less than X.
+   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>
+
+/* Return the greatest floating-point number less than X.  */
+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 (file)
index 0000000..c0d4585
--- /dev/null
@@ -0,0 +1,29 @@
+/* Return the greatest floating-point number less than X.
+   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>
+
+/* Return the greatest floating-point number less than X.  */
+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 (file)
index 0000000..e7607f5
--- /dev/null
@@ -0,0 +1,29 @@
+/* Return the greatest floating-point number less than X.
+   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>
+
+/* Return the greatest floating-point number less than X.  */
+long double
+__nextdownl (long double x)
+{
+  return -__nextupl (-x);
+}
+
+weak_alias (__nextdownl, nextdownl)
index 0e978d17c4d0a326d20fdbdef0192a60ca7d6a20..70ab42881a44ccd1e2885eb240dbe5bab67dcd9b 100644 (file)
@@ -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);
@@ -776,6 +778,14 @@ TYPE
   return x + y;
 }
 
+TYPE
+(F(nextdown)) (TYPE x)
+{
+  ++count;
+  P ();
+  return x;
+}
+
 TYPE
 (F(nexttoward)) (TYPE x, long double y)
 {
@@ -784,6 +794,14 @@ TYPE
   return x + y;
 }
 
+TYPE
+(F(nextup)) (TYPE x)
+{
+  ++count;
+  P ();
+  return x;
+}
+
 TYPE
 (F(remainder)) (TYPE x, TYPE y)
 {
index ea2b611f1515c5dd10757ef67d9243b85d058189..8916fbe39c3b1f7a118cc9e8d2f38334d50867b0 100644 (file)
    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)
 #define nexttoward(Val1, Val2) \
diff --git a/sysdeps/ieee754/dbl-64/s_nextup.c b/sysdeps/ieee754/dbl-64/s_nextup.c
new file mode 100644 (file)
index 0000000..d2432b5
--- /dev/null
@@ -0,0 +1,58 @@
+/* Return the least floating-point number greater than X.
+   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>
+
+/* Return the least floating-point number greater than X.  */
+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)
+    return DBL_TRUE_MIN;
+  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/sysdeps/ieee754/flt-32/s_nextupf.c b/sysdeps/ieee754/flt-32/s_nextupf.c
new file mode 100644 (file)
index 0000000..9f3398e
--- /dev/null
@@ -0,0 +1,46 @@
+/* Return the least floating-point number greater than X.
+   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>
+
+/* Return the least floating-point number greater than X.  */
+float
+__nextupf (float x)
+{
+  int32_t hx, ix;
+
+  GET_FLOAT_WORD (hx, x);
+  ix = hx & 0x7fffffff;
+  if (ix == 0)
+    return FLT_TRUE_MIN;
+  if (ix > 0x7f800000)         /* x is nan.  */
+    return x + x;
+  if (hx >= 0)
+    {                          /* x > 0.  */
+      if (isinf (x))
+        return x;
+      hx += 1;
+    }
+  else
+    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 (file)
index 0000000..3ee47d8
--- /dev/null
@@ -0,0 +1,56 @@
+/* Return the least floating-point number greater than X.
+   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>
+
+/* Return the least floating-point number greater than X.  */
+long double
+__nextupl (long double x)
+{
+  int64_t hx, ix;
+  u_int64_t lx;
+
+  GET_LDOUBLE_WORDS64 (hx, lx, x);
+  ix = hx & 0x7fffffffffffffffLL;
+
+  /* x is nan.  */
+  if (((ix >= 0x7fff000000000000LL)
+       && ((ix - 0x7fff000000000000LL) | lx) != 0))
+    return x + x;
+  if ((ix | lx) == 0)
+    return LDBL_TRUE_MIN;
+  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 (file)
index 0000000..2a4fae7
--- /dev/null
@@ -0,0 +1,78 @@
+/* Return the least floating-point number greater than X.
+   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 <math_ldbl_opt.h>
+
+/* Return the least floating-point number greater than X.  */
+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;
+
+  if (ihx > 0x7ff0000000000000LL)      /* x is nan.  */
+    return x + x;              /* Signal the nan.  */
+  if (ihx == 0)
+    return LDBL_TRUE_MIN;
+
+  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-96/s_nextupl.c b/sysdeps/ieee754/ldbl-96/s_nextupl.c
new file mode 100644 (file)
index 0000000..701842d
--- /dev/null
@@ -0,0 +1,84 @@
+/* Return the least floating-point number greater than X.
+   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>
+
+/* Return the least floating-point number greater than X.  */
+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;
+
+  if (((ix == 0x7fff) && (((hx & 0x7fffffff) | lx) != 0)))  /* x is nan.  */
+    return x + x;
+  if ((ix | hx | lx) == 0)
+    return LDBL_TRUE_MIN;
+  if (esx >= 0)
+    {                          /* x > 0.  */
+      if (isinf (x))
+        return x;
+      lx += 1;
+      if (lx == 0)
+        {
+          hx += 1;
+#if LDBL_MIN_EXP == -16381
+          if (hx == 0 || (esx == 0 && hx == 0x80000000))
+#else
+          if (hx == 0)
+#endif
+          {
+            esx += 1;
+            hx |= 0x80000000;
+          }
+        }
+    }
+  else
+    {                          /* x < 0.  */
+      if (lx == 0)
+        {
+#if LDBL_MIN_EXP == -16381
+          if (hx <= 0x80000000 && esx != 0xffff8000)
+            {
+              esx -= 1;
+              hx = hx - 1;
+              if ((esx & 0x7fff) > 0)
+                hx |= 0x80000000;
+            }
+          else
+            hx -= 1;
+#else
+          if (ix != 0 && hx == 0x80000000)
+            hx = 0;
+          if (hx == 0)
+            esx -= 1;
+          hx -= 1;
+#endif
+        }
+      lx -= 1;
+    }
+  SET_LDOUBLE_WORDS (x, esx, hx, lx);
+  return x;
+}
+
+weak_alias (__nextupl, nextupl)
index 53091e410c16faeecafacdf1d8423d6c0b00c425..af08209570b3af528981ed240553ee35055df91c 100644 (file)
@@ -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 (file)
index 0000000..3b0047c
--- /dev/null
@@ -0,0 +1,27 @@
+/* Compatibility routine for IEEE double as long double for nextdown.
+   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"
+
+/* Return the greatest floating-point number less than X.  */
+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 (file)
index 0000000..b557edf
--- /dev/null
@@ -0,0 +1,27 @@
+/* Compatibility routine for IEEE double as long double for nextup.
+   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"
+
+/* Return the least floating-point number greater than X.  */
+double
+attribute_hidden
+nextupl (double x)
+{
+  return nextup (x);
+}
index 055b0b25ba6cdba7099ff007f29b6a6bab0edc51..838fedeacf8ac10966519da9d59dbf808cdd36d3 100644 (file)
@@ -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
index 2123113e254a18c243e1ad4a2560873473aa76ff..781d2d35716a593e1d1209a9f5ac3a54ed8755fc 100644 (file)
@@ -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
index 611dfe1aa50b85af57edc76e90d5251dbef81539..f342c6b1dadb5eda7d254d5d7a584d5fdd9770ac 100644 (file)
@@ -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
index e65e2309cd7f0418770ad055c23a291578220057..7a02fb1726e5bad1a0423668f6db6a2331cbba1f 100644 (file)
@@ -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
index 9b7f40a4c9a4364525ccb02d93f4c7fc3f4dcb03..bf40ddf929aa58b07dc8f980ab29f48c2a217073 100644 (file)
@@ -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
index 78b542e935a7a4f7da44c8ca711046015ecab522..92e94022c716c22711c0370bd75f05b7fd03a647 100644 (file)
@@ -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
index 6d4cc72e0ee22896d534ec3f7d6367dafda1bca4..e2737a2ba96d630b0b3b1f74496514ed21588e5e 100644 (file)
@@ -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
index e65e2309cd7f0418770ad055c23a291578220057..7a02fb1726e5bad1a0423668f6db6a2331cbba1f 100644 (file)
@@ -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
index 2d319359162ab3743d802647e8921663641d6993..9af59d7d905f7a40b96d35e74885f26f185c9243 100644 (file)
@@ -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
index 149fd4f2be4fc6c6b6a553dc81fe06c015eb95ab..0b1f1360e0cf12f07cf836c96838eeeeb1a75f8c 100644 (file)
@@ -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
index e599e82d6ec68795b5c5930637882d93b9903da4..2e2bb00738594a1d9081972332cfbd86c97d9d6f 100644 (file)
@@ -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
index 164ba55263b266ae510afe2ba758f1df099231d7..7daa5952822d3705382ac136063671ee54a76cfd 100644 (file)
@@ -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
index ad02eff997e8a2a0c1290d772c01c34a40087bff..a36e2f32fc561a4f081493282725060d1e7b5181 100644 (file)
@@ -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
index 5d2f2636450600db80b3fe26cd419d8cfd4129f1..abe8c5d8a8be9240f050e2b2d3d78206de6d7517 100644 (file)
@@ -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
index 8b5edb52a0034598a59762f4d21a07c24b80494a..1c25f56c4ca47c3382294a11c1dd9a4a69de0cb7 100644 (file)
@@ -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
index ee066837af87302517aa3004c5e4f0e0ccf0345d..9d19474c34e6e6f259c3ca11479d79ecdc41fe03 100644 (file)
@@ -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
index 6c7fc9b4fc586b605163de25375ab47bde544326..cedb18945cba69ea4667fa5ed36b37910d62bccf 100644 (file)
@@ -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
index 039ed5c5218d89bd6cea477a4b8a11be41af414b..9b567c6356bd028b49433fa770d02963ebc1c2c6 100644 (file)
@@ -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
index 66c625daeb833086dea37bde7ca63e12879ae18d..78a82fbd715f914a92d792364dbfb63e77624320 100644 (file)
@@ -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
index 93b84713d88d101b4f1ea76bf820131121443954..f98ade7642d116da645c3024274bd1b3439ec68c 100644 (file)
@@ -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
index 185ab0917a164707fc7d2d1b1df742af1f834ef5..d2e842196781cc5e4f57d3f365da2572c5047984 100644 (file)
@@ -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
index b56add357b5e1da3f22498fd32a6fd40ad49be54..e00022143214fa590a4e7b08da7f45aadd1bb241 100644 (file)
@@ -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
index 18b8d00becc6a30a2da4b924809b9f1548bedb60..00e82c142507612f9db7fdbf7de70efaa782d714 100644 (file)
@@ -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
index 18b8d00becc6a30a2da4b924809b9f1548bedb60..00e82c142507612f9db7fdbf7de70efaa782d714 100644 (file)
@@ -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
index 18b8d00becc6a30a2da4b924809b9f1548bedb60..00e82c142507612f9db7fdbf7de70efaa782d714 100644 (file)
@@ -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
index b911aff114ad1bf28524578b84ded9eeb656ffe9..65b470817c6f3e590d502ebd231983e716f8c8ac 100644 (file)
@@ -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
index 168c0d87cfa1c30b3dce15246ce8d16f29005f5a..d35e9f02078b761380e64da0dd1c810cadd81df1 100644 (file)
@@ -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