aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--math/Versions4
-rw-r--r--math/w_fmod_compat.c13
-rw-r--r--math/w_fmodf_compat.c6
-rw-r--r--sysdeps/i386/fpu/w_fmod_compat.c14
-rw-r--r--sysdeps/i386/fpu/w_fmodf_compat.c14
-rw-r--r--sysdeps/ieee754/dbl-64/e_fmod.c22
-rw-r--r--sysdeps/ieee754/dbl-64/math_config.h3
-rw-r--r--sysdeps/ieee754/dbl-64/math_err.c6
-rw-r--r--sysdeps/ieee754/dbl-64/w_fmod.c1
-rw-r--r--sysdeps/ieee754/flt-32/e_fmodf.c20
-rw-r--r--sysdeps/ieee754/flt-32/math_config.h1
-rw-r--r--sysdeps/ieee754/flt-32/math_errf.c6
-rw-r--r--sysdeps/ieee754/flt-32/w_fmodf.c1
-rw-r--r--sysdeps/m68k/m680x0/fpu/w_fmod_compat.c14
-rw-r--r--sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c14
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/arm/be/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/arm/le/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/be/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/le/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/sh/be/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/sh/le/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist2
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist2
38 files changed, 172 insertions, 13 deletions
diff --git a/math/Versions b/math/Versions
index fef7a08c3b..759b5fac7f 100644
--- a/math/Versions
+++ b/math/Versions
@@ -631,4 +631,8 @@ libm {
# No SVID compatible error handling.
hypotf; hypot;
}
+ GLIBC_2.38 {
+ # No SVID compatible error handling.
+ fmod; fmodf;
+ }
}
diff --git a/math/w_fmod_compat.c b/math/w_fmod_compat.c
index c6947f3042..aef98885a3 100644
--- a/math/w_fmod_compat.c
+++ b/math/w_fmod_compat.c
@@ -20,10 +20,10 @@
#include <math-svid-compat.h>
#include <libm-alias-double.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_38)
/* wrapper fmod */
double
-__fmod (double x, double y)
+__fmod_compat (double x, double y)
{
if (__builtin_expect (isinf (x) || y == 0.0, 0)
&& _LIB_VERSION != _IEEE_ && !isnan (y) && !isnan (x))
@@ -32,5 +32,12 @@ __fmod (double x, double y)
return __ieee754_fmod (x, y);
}
-libm_alias_double (__fmod, fmod)
+compat_symbol (libm, __fmod_compat, fmod, GLIBC_2_0);
+# ifdef NO_LONG_DOUBLE
+weak_alias (__fmod_compat, fmodl)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+LONG_DOUBLE_COMPAT_CHOOSE_libm_fmodl (
+ compat_symbol (libm, __fmod_compat, fmodl, FIRST_VERSION_libm_fmodl), );
+# endif
#endif
diff --git a/math/w_fmodf_compat.c b/math/w_fmodf_compat.c
index 5025b06684..55823961f4 100644
--- a/math/w_fmodf_compat.c
+++ b/math/w_fmodf_compat.c
@@ -20,10 +20,10 @@
#include <math-svid-compat.h>
#include <libm-alias-float.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_38)
/* wrapper fmodf */
float
-__fmodf (float x, float y)
+__fmod_compatf (float x, float y)
{
if (__builtin_expect (isinf (x) || y == 0.0f, 0)
&& _LIB_VERSION != _IEEE_ && !isnan (y) && !isnan (x))
@@ -32,5 +32,5 @@ __fmodf (float x, float y)
return __ieee754_fmodf (x, y);
}
-libm_alias_float (__fmod, fmod)
+compat_symbol (libm, __fmod_compatf, fmodf, GLIBC_2_0);
#endif
diff --git a/sysdeps/i386/fpu/w_fmod_compat.c b/sysdeps/i386/fpu/w_fmod_compat.c
new file mode 100644
index 0000000000..5ac9995ffd
--- /dev/null
+++ b/sysdeps/i386/fpu/w_fmod_compat.c
@@ -0,0 +1,14 @@
+/* i386 provides an optimized __ieee752_fmod. */
+#include <math-svid-compat.h>
+#ifdef SHARED
+# undef SHLIB_COMPAT
+# define SHLIB_COMPAT(a, b, c) 1
+# undef LIBM_SVID_COMPAT
+# define LIBM_SVID_COMPAT 1
+# undef compat_symbol
+# define compat_symbol(a, b, c, d)
+#endif
+#include <math/w_fmod_compat.c>
+#ifdef SHARED
+libm_alias_double (__fmod_compat, fmod)
+#endif
diff --git a/sysdeps/i386/fpu/w_fmodf_compat.c b/sysdeps/i386/fpu/w_fmodf_compat.c
new file mode 100644
index 0000000000..cc417e07d3
--- /dev/null
+++ b/sysdeps/i386/fpu/w_fmodf_compat.c
@@ -0,0 +1,14 @@
+/* i386 provides an optimized __ieee752_fmodf. */
+#include <math-svid-compat.h>
+#ifdef SHARED
+# undef SHLIB_COMPAT
+# define SHLIB_COMPAT(a, b, c) 1
+# undef LIBM_SVID_COMPAT
+# define LIBM_SVID_COMPAT 1
+# undef compat_symbol
+# define compat_symbol(a, b, c, d)
+#endif
+#include <math/w_fmodf_compat.c>
+#ifdef SHARED
+libm_alias_float (__fmod_compat, fmod)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/e_fmod.c b/sysdeps/ieee754/dbl-64/e_fmod.c
index e661ca1ff8..caae4e47e2 100644
--- a/sysdeps/ieee754/dbl-64/e_fmod.c
+++ b/sysdeps/ieee754/dbl-64/e_fmod.c
@@ -16,7 +16,9 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
+#include <libm-alias-double.h>
#include <libm-alias-finite.h>
+#include <math-svid-compat.h>
#include <math.h>
#include "math_config.h"
@@ -55,7 +57,7 @@
} */
double
-__ieee754_fmod (double x, double y)
+__fmod (double x, double y)
{
uint64_t hx = asuint64 (x);
uint64_t hy = asuint64 (y);
@@ -67,11 +69,16 @@ __ieee754_fmod (double x, double y)
/* Special cases:
- If x or y is a Nan, NaN is returned.
- - If x is an inifinity, a NaN is returned.
+ - If x is an inifinity, a NaN is returned and EDOM is set.
- If y is zero, Nan is returned.
- If x is +0/-0, and y is not zero, +0/-0 is returned. */
- if (__glibc_unlikely (hy == 0 || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
- return (x * y) / (x * y);
+ if (__glibc_unlikely (hy == 0
+ || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
+ {
+ if (is_nan (hx) || is_nan (hy))
+ return (x * y) / (x * y);
+ return __math_edom ((x * y) / (x * y));
+ }
if (__glibc_unlikely (hx <= hy))
{
@@ -153,4 +160,11 @@ __ieee754_fmod (double x, double y)
return make_double (mx, ey, sx);
}
+strong_alias (__fmod, __ieee754_fmod)
libm_alias_finite (__ieee754_fmod, __fmod)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __fmod, fmod, GLIBC_2_38);
+libm_alias_double_other (__fmod, fmod)
+#else
+libm_alias_double (__fmod, fmod)
+#endif
diff --git a/sysdeps/ieee754/dbl-64/math_config.h b/sysdeps/ieee754/dbl-64/math_config.h
index 2049cea3f7..499ca7591b 100644
--- a/sysdeps/ieee754/dbl-64/math_config.h
+++ b/sysdeps/ieee754/dbl-64/math_config.h
@@ -170,6 +170,9 @@ attribute_hidden double __math_invalid (double);
/* Error handling using output checking, only for errno setting. */
+/* Check if the result generated a demain error. */
+attribute_hidden double __math_edom (double x);
+
/* Check if the result overflowed to infinity. */
attribute_hidden double __math_check_oflow (double);
/* Check if the result underflowed to 0. */
diff --git a/sysdeps/ieee754/dbl-64/math_err.c b/sysdeps/ieee754/dbl-64/math_err.c
index 5f5f965d3e..377a4caad2 100644
--- a/sysdeps/ieee754/dbl-64/math_err.c
+++ b/sysdeps/ieee754/dbl-64/math_err.c
@@ -33,6 +33,12 @@ with_errno (double y, int e)
#define with_errno(x, e) (x)
#endif
+attribute_hidden double
+__math_edom (double y)
+{
+ return with_errno (y, EDOM);
+}
+
/* NOINLINE reduces code size. */
NOINLINE static double
xflow (uint32_t sign, double y)
diff --git a/sysdeps/ieee754/dbl-64/w_fmod.c b/sysdeps/ieee754/dbl-64/w_fmod.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/w_fmod.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/sysdeps/ieee754/flt-32/e_fmodf.c b/sysdeps/ieee754/flt-32/e_fmodf.c
index 4482b8c0ac..763900efda 100644
--- a/sysdeps/ieee754/flt-32/e_fmodf.c
+++ b/sysdeps/ieee754/flt-32/e_fmodf.c
@@ -17,6 +17,8 @@
<https://www.gnu.org/licenses/>. */
#include <libm-alias-finite.h>
+#include <libm-alias-float.h>
+#include <math-svid-compat.h>
#include <math.h>
#include "math_config.h"
@@ -55,7 +57,7 @@
} */
float
-__ieee754_fmodf (float x, float y)
+__fmodf (float x, float y)
{
uint32_t hx = asuint (x);
uint32_t hy = asuint (y);
@@ -70,8 +72,13 @@ __ieee754_fmodf (float x, float y)
- If x is an inifinity, a NaN is returned.
- If y is zero, Nan is returned.
- If x is +0/-0, and y is not zero, +0/-0 is returned. */
- if (__glibc_unlikely (hy == 0 || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
- return (x * y) / (x * y);
+ if (__glibc_unlikely (hy == 0
+ || hx >= EXPONENT_MASK || hy > EXPONENT_MASK))
+ {
+ if (is_nan (hx) || is_nan (hy))
+ return (x * y) / (x * y);
+ return __math_edomf ((x * y) / (x * y));
+ }
if (__glibc_unlikely (hx <= hy))
{
@@ -152,4 +159,11 @@ __ieee754_fmodf (float x, float y)
return make_float (mx, ey, sx);
}
+strong_alias (__fmodf, __ieee754_fmodf)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __fmodf, fmodf, GLIBC_2_38);
+libm_alias_float_other (__fmod, fmod)
+#else
+libm_alias_float (__fmod, fmod)
+#endif
libm_alias_finite (__ieee754_fmodf, __fmodf)
diff --git a/sysdeps/ieee754/flt-32/math_config.h b/sysdeps/ieee754/flt-32/math_config.h
index 829430ea28..a7fb332767 100644
--- a/sysdeps/ieee754/flt-32/math_config.h
+++ b/sysdeps/ieee754/flt-32/math_config.h
@@ -158,6 +158,7 @@ attribute_hidden float __math_uflowf (uint32_t);
attribute_hidden float __math_may_uflowf (uint32_t);
attribute_hidden float __math_divzerof (uint32_t);
attribute_hidden float __math_invalidf (float);
+attribute_hidden float __math_edomf (float x);
/* Shared between expf, exp2f, exp10f, and powf. */
#define EXP2F_TABLE_BITS 5
diff --git a/sysdeps/ieee754/flt-32/math_errf.c b/sysdeps/ieee754/flt-32/math_errf.c
index 0389ce0a81..7245ab8d96 100644
--- a/sysdeps/ieee754/flt-32/math_errf.c
+++ b/sysdeps/ieee754/flt-32/math_errf.c
@@ -31,6 +31,12 @@ with_errnof (float y, int e)
# define with_errnof(x, e) (x)
#endif
+attribute_hidden float
+__math_edomf (float y)
+{
+ return with_errnof (y, EDOM);
+}
+
/* NOINLINE prevents fenv semantics breaking optimizations. */
NOINLINE static float
xflowf (uint32_t sign, float y)
diff --git a/sysdeps/ieee754/flt-32/w_fmodf.c b/sysdeps/ieee754/flt-32/w_fmodf.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/w_fmodf.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c b/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c
new file mode 100644
index 0000000000..527d4fbed2
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_fmod_compat.c
@@ -0,0 +1,14 @@
+/* m68k provides an optimized __ieee752_fmod. */
+#include <math-svid-compat.h>
+#ifdef SHARED
+# undef SHLIB_COMPAT
+# define SHLIB_COMPAT(a, b, c) 1
+# undef LIBM_SVID_COMPAT
+# define LIBM_SVID_COMPAT 1
+# undef compat_symbol
+# define compat_symbol(a, b, c, d)
+#endif
+#include <math/w_fmod_compat.c>
+#ifdef SHARED
+libm_alias_double (__fmod_compat, fmod)
+#endif
diff --git a/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c b/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c
new file mode 100644
index 0000000000..5043586b91
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_fmodf_compat.c
@@ -0,0 +1,14 @@
+/* m68k provides an optimized __ieee752_fmodf. */
+#include <math-svid-compat.h>
+#ifdef SHARED
+# undef SHLIB_COMPAT
+# define SHLIB_COMPAT(a, b, c) 1
+# undef LIBM_SVID_COMPAT
+# define LIBM_SVID_COMPAT 1
+# undef compat_symbol
+# define compat_symbol(a, b, c, d)
+#endif
+#include <math/w_fmodf_compat.c>
+#ifdef SHARED
+libm_alias_float (__fmod_compat, fmod)
+#endif
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index c2e3c6453e..e3924c3499 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1146,3 +1146,5 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 4f85b6180f..066dd1a6b3 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1203,6 +1203,8 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
index 36190add84..4adfed072b 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
@@ -533,6 +533,8 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
index 36190add84..4adfed072b 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
@@ -533,6 +533,8 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index b5dd4e851f..5c3f47caef 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -844,4 +844,6 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 36190add84..4adfed072b 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -533,6 +533,8 @@ GLIBC_2.35 fsqrt F
GLIBC_2.35 fsqrtl F
GLIBC_2.35 hypot F
GLIBC_2.35 hypotf F
+GLIBC_2.38 fmod F
+GLIBC_2.38 fmodf F
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
index 274ecff630..ea0dbd4b72 100644
--- a/