From: Adhemerval Zanella Date: Tue, 4 Nov 2025 16:20:00 +0000 (-0300) Subject: math: Remove the SVID error handling from atan2f X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ec8eb567639b6cfd2a8f3d267bdc6dd47c32d3e;p=thirdparty%2Fglibc.git math: Remove the SVID error handling from atan2f It improves latency for about 3-6% and throughput for about 5-12%. Tested on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Wilco Dijkstra --- diff --git a/math/Versions b/math/Versions index 272f3f3a74..bf57cc9176 100644 --- a/math/Versions +++ b/math/Versions @@ -691,6 +691,7 @@ libm { acosf; acoshf; asinf; + atan2f; atanhf; coshf; j0f; diff --git a/math/w_atan2f_compat.c b/math/w_atan2f_compat.c index 047f853f2c..f199fa66e3 100644 --- a/math/w_atan2f_compat.c +++ b/math/w_atan2f_compat.c @@ -26,9 +26,9 @@ #include -#if LIBM_SVID_COMPAT +#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_43) float -__atan2f (float y, float x) +__atan2_compatf (float y, float x) { float z; @@ -40,5 +40,10 @@ __atan2f (float y, float x) __set_errno (ERANGE); return z; } -libm_alias_float (__atan2, atan2) +# ifdef NO_COMPAT_NEEDED +strong_alias (__atan2_compatf, __atan2f) +libm_alias_float (__atan2_compat, atan2) +# else +compat_symbol (libm, __atan2_compatf, atan2f, GLIBC_2_0); +# endif #endif diff --git a/sysdeps/ieee754/flt-32/e_atan2f.c b/sysdeps/ieee754/flt-32/e_atan2f.c index 1c72845c7c..03070e017d 100644 --- a/sysdeps/ieee754/flt-32/e_atan2f.c +++ b/sysdeps/ieee754/flt-32/e_atan2f.c @@ -3,7 +3,7 @@ Copyright (c) 2022-2024 Alexei Sibidanov and Paul Zimmermann. The original version of this file was copied from the CORE-MATH -project (file src/binary32/atan2/atan2f.c, revision 7835c5d). +project (file src/binary32/atan2/atan2f.c, revision 9b28a4a). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28,6 +28,8 @@ SOFTWARE. #include #include #include +#include +#include #include "math_config.h" static inline double @@ -85,11 +87,15 @@ cr_atan2f_tiny (float y, float x) else t -= 1; } - return asdouble (t); + double r = asdouble (t); + float rf = r; + if (__glibc_unlikely (rf == 0.0f)) + return __math_uflowf (t >> 63); + return rf; } float -__ieee754_atan2f (float y, float x) +__atan2f (float y, float x) { static const double cn[] = { @@ -269,6 +275,16 @@ __ieee754_atan2f (float y, float x) } r = th + tm; } - return r; + float rf = r; + if (__glibc_unlikely (rf == 0.0f)) + return __math_uflowf (asuint (rf) >> 1); + return rf; } +strong_alias (__atan2f, __ieee754_atan2f) +#if LIBM_SVID_COMPAT +versioned_symbol (libm, __atan2f, atan2f, GLIBC_2_43); +libm_alias_float_other (__atan2, atan2) +#else +libm_alias_float (__atan2, atan2) +#endif libm_alias_finite (__ieee754_atan2f, __atan2f) diff --git a/sysdeps/ieee754/flt-32/w_atan2f.c b/sysdeps/ieee754/flt-32/w_atan2f.c new file mode 100644 index 0000000000..1cc8931700 --- /dev/null +++ b/sysdeps/ieee754/flt-32/w_atan2f.c @@ -0,0 +1 @@ +/* Not needed. */ diff --git a/sysdeps/m68k/m680x0/fpu/w_atan2f_compat.c b/sysdeps/m68k/m680x0/fpu/w_atan2f_compat.c new file mode 100644 index 0000000000..ebc8035961 --- /dev/null +++ b/sysdeps/m68k/m680x0/fpu/w_atan2f_compat.c @@ -0,0 +1,8 @@ +/* m68k provides an optimized __ieee754_atan2f. */ +#ifdef SHARED +# define NO_COMPAT_NEEDED 1 +# include +#else +# include +# include +#endif diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist index 275b733d02..024bc15fe5 100644 --- a/sysdeps/mach/hurd/i386/libm.abilist +++ b/sysdeps/mach/hurd/i386/libm.abilist @@ -1320,6 +1320,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 fmod F diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist index d374f57923..9e803a74ac 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist @@ -1288,6 +1288,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist index dcc203d56d..dbbad3c8fb 100644 --- a/sysdeps/unix/sysv/linux/alpha/libm.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist @@ -1447,6 +1447,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist index 0a31a7f35a..b819f6d8d0 100644 --- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist index 0a31a7f35a..b819f6d8d0 100644 --- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist index 5b1ad5c484..0091839d73 100644 --- a/sysdeps/unix/sysv/linux/hppa/libm.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist index da5e21bd0a..6fc86a9230 100644 --- a/sysdeps/unix/sysv/linux/i386/libm.abilist +++ b/sysdeps/unix/sysv/linux/i386/libm.abilist @@ -1327,6 +1327,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 fmod F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist index 0a31a7f35a..b819f6d8d0 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist index c13265d579..2f6ac7784d 100644 --- a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist index c13265d579..2f6ac7784d 100644 --- a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist index b2bbf3438c..92eaa36b8d 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist index ce012e3a24..13f0831083 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist @@ -1288,6 +1288,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist index 1815b30461..80a5aaf8b8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist @@ -1100,6 +1100,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist index 83c85cc5b4..2a876cae98 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist @@ -1099,6 +1099,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist index fff8c29909..4cbec9212f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist @@ -1093,6 +1093,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist index 89fb06eace..55b3fa1906 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist @@ -1477,6 +1477,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist index 7f5d342987..61cc0a5ba1 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist @@ -1391,6 +1391,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist index 7b97344582..1b4db358a4 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist @@ -1391,6 +1391,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/sh/be/libm.abilist b/sysdeps/unix/sysv/linux/sh/be/libm.abilist index 9cea7f87a5..32857b8b54 100644 --- a/sysdeps/unix/sysv/linux/sh/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/be/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/sh/le/libm.abilist b/sysdeps/unix/sysv/linux/sh/le/libm.abilist index 9cea7f87a5..32857b8b54 100644 --- a/sysdeps/unix/sysv/linux/sh/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/le/libm.abilist @@ -953,6 +953,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist index edd6cce226..364f51b035 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist @@ -1398,6 +1398,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist index 201004c62c..49e898d5eb 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist @@ -1288,6 +1288,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist index 4d9e27cb15..73b55ae4dd 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist @@ -1321,6 +1321,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist index a411d376ea..a138d3e070 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist @@ -1321,6 +1321,7 @@ GLIBC_2.42 rsqrtl F GLIBC_2.43 acosf F GLIBC_2.43 acoshf F GLIBC_2.43 asinf F +GLIBC_2.43 atan2f F GLIBC_2.43 atanhf F GLIBC_2.43 coshf F GLIBC_2.43 j0f F