[1/4] Remove the error handling wrapper from exp and exp2
Commit Message
Introduce new exp and exp2 symbol version that don't do SVID compatible
error handling. The standard errno and fp exception based error handling
is inline in the new code and does not have significant overhead.
The double precision wrappers are disabled for sysdeps/ieee754/dbl-64
by using empty w_exp.c and w_exp2.c files, the math/w_exp.c and
math/w_exp2.c files use the wrapper template and can be included by
targets that have their own exp and exp2 implementations or use ifunc
on the glibc internal __ieee754_exp symbol.
The compatibility symbol versions still use the wrapper with SVID error
handling around the new code. There is no new symbol version nor
compatibility code on !LIBM_SVID_COMPAT targets (e.g. riscv).
On targets where previously expl and exp2l were aliases of exp and exp2,
now they point to the compatibility symbols with the wrapper, because
they still need the SVID compatible error handling. This affects
NO_LONG_DOUBLE (e.g arm) and LONG_DOUBLE_COMPAT (e.g. alpha) targets
as well.
The _finite symbols are now aliases of the standard symbols (they have
no performance advantage anymore). Both the standard symbols and
_finite symbols set errno and thus not const functions.
The ia64 asm is changed so the compat and new symbol versions map to the
same address.
On x86_64 #include <math.h> was added before macro definitions that may
affect that header (the new macro name is __exp instead of __ieee754_exp
which breaks some math.h macros).
Tested with build-many-glibcs.py.
2018-10-26 Szabolcs Nagy <szabolcs.nagy@arm.com>
* math/Versions (GLIBC_2.29): Add exp and exp2.
* math/w_exp2_compat.c (__exp2_compat): Change to versioned compat
symbol, handle NO_LONG_DOUBLE and LONG_DOUBLE_COMPAT explicitly.
* math/w_exp_compat.c (__exp_compat): Likewise.
* math/w_exp.c: New file.
* math/w_exp2.c: New file.
* sysdeps/i386/fpu/w_exp.c: New file.
* sysdeps/i386/fpu/w_exp2.c: New file.
* sysdeps/ia64/fpu/e_exp.S: Add versioned symbols.
* sysdeps/ia64/fpu/e_exp2.S: Likewise.
* sysdeps/ieee754/dbl-64/e_exp.c (__ieee754_exp): Rename to __exp
and add necessary aliases.
* sysdeps/ieee754/dbl-64/e_exp2.c (__ieee754_exp2): Rename to __exp2
and add necessary aliases.
* sysdeps/ieee754/dbl-64/w_exp.c: New file.
* sysdeps/ieee754/dbl-64/w_exp2.c: New file.
* sysdeps/m68k/m680x0/fpu/w_exp.c: New file.
* sysdeps/m68k/m680x0/fpu/w_exp2.c: New file.
* sysdeps/mach/hurd/i386/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Update.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Update.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Update.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Update.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Update.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Update.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Update.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Update.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Update.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist: Update.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist: Update.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Update.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Update.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Update.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Update.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Update.
* sysdeps/x86_64/fpu/multiarch/e_exp-avx.c (__exp1): Remove.
(__ieee754_exp): Rename to __exp.
* sysdeps/x86_64/fpu/multiarch/e_exp-fma.c (__exp1): Remove.
(__ieee754_exp): Rename to __exp.
* sysdeps/x86_64/fpu/multiarch/e_exp-fma4.c (__exp1): Remove.
(__ieee754_exp): Rename to __exp.
* sysdeps/x86_64/fpu/multiarch/e_exp.c (__ieee754_exp): Rename to
__exp.
* sysdeps/x86_64/fpu/multiarch/w_exp.c: New file.
Comments
Hi, Szabolcs.
On Fri, 26 Oct 2018, Szabolcs Nagy wrote:
>
>+/* Work around gas bug "multiple versions for symbol". */
>+weak_alias (__exp_compat, __exp_compat_alias)
If I understood it correctly, you were getting the "multiple versions for
symbol" error, because there were two symbols trying to be compat symbols
for __exp_compat.
>+# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_29)
>+compat_symbol (libm, __exp_compat, exp, GLIBC_2_0);
>+# endif
Here.
>+LONG_DOUBLE_COMPAT_CHOOSE_libm_expl (
>+ compat_symbol (libm, __exp_compat_alias, expl, FIRST_VERSION_libm_expl), );
>+# endif
And here, when you were using __exp_compat, instead of __exp_compat_alias.
Right?
I have seen this before, and I have also used a weak_alias to work around
it, but I didn't know it was a bug in gas. Is there a bugzilla item about
this, which I could follow?
On 26/10/18 21:55, Gabriel F. T. Gomes wrote:
> Hi, Szabolcs.
>
> On Fri, 26 Oct 2018, Szabolcs Nagy wrote:
>>
>> +/* Work around gas bug "multiple versions for symbol". */
>> +weak_alias (__exp_compat, __exp_compat_alias)
>
> If I understood it correctly, you were getting the "multiple versions for
> symbol" error, because there were two symbols trying to be compat symbols
> for __exp_compat.
>
>> +# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_29)
>> +compat_symbol (libm, __exp_compat, exp, GLIBC_2_0);
>> +# endif
>
> Here.
>
>> +LONG_DOUBLE_COMPAT_CHOOSE_libm_expl (
>> + compat_symbol (libm, __exp_compat_alias, expl, FIRST_VERSION_libm_expl), );
>> +# endif
>
> And here, when you were using __exp_compat, instead of __exp_compat_alias.
>
> Right?
>
> I have seen this before, and I have also used a weak_alias to work around
> it, but I didn't know it was a bug in gas. Is there a bugzilla item about
> this, which I could follow?
>
yeah i can't find this in bugzilla, but it is a bug as far
as i can tell: for a symbol version only the location
matters where it points to, not what expression you used
for the location, and there is no reason to disallow
multiple symbol versions to point to the same location.
On Mon, 29 Oct 2018, Szabolcs Nagy wrote:
>
>yeah i can't find this in bugzilla, but it is a bug as far
>as i can tell: for a symbol version only the location
>matters where it points to, not what expression you used
>for the location, and there is no reason to disallow
>multiple symbol versions to point to the same location.
I also don't understand why it should be forbidden. Do you have plans to
report it? You could then mention the bug number in your patch, and we
could clean it up (comment and aliases) when glibc requires a new enough
version of binutils.
On 29/10/18 12:12, Gabriel F. T. Gomes wrote:
> On Mon, 29 Oct 2018, Szabolcs Nagy wrote:
>>
>> yeah i can't find this in bugzilla, but it is a bug as far
>> as i can tell: for a symbol version only the location
>> matters where it points to, not what expression you used
>> for the location, and there is no reason to disallow
>> multiple symbol versions to point to the same location.
>
> I also don't understand why it should be forbidden. Do you have plans to
> report it? You could then mention the bug number in your patch, and we
> could clean it up (comment and aliases) when glibc requires a new enough
> version of binutils.
>
i opened
https://sourceware.org/bugzilla/show_bug.cgi?id=23840
On Mon, 29 Oct 2018, Gabriel F. T. Gomes wrote:
> On Mon, 29 Oct 2018, Szabolcs Nagy wrote:
> >
> >yeah i can't find this in bugzilla, but it is a bug as far
> >as i can tell: for a symbol version only the location
> >matters where it points to, not what expression you used
> >for the location, and there is no reason to disallow
> >multiple symbol versions to point to the same location.
>
> I also don't understand why it should be forbidden. Do you have plans to
> report it? You could then mention the bug number in your patch, and we
> could clean it up (comment and aliases) when glibc requires a new enough
> version of binutils.
There are lots of existing places that create aliases in order to set
symbol versions; a comment on just one of those places wouldn't be
particularly helpful. If cleaning this up, I think you'd need to somehow
locate existing places that create aliases just for setting symbol
versions (probably by examining uses of the symbol versioning macros),
replace the alias creation in each place with use of a common macro that
deals with creating an alias automatically along with setting the symbol
version (e.g. redefine versioned_symbol to create an alias using
__COUNTER__ to define its name before doing the versioning), and then once
all the aliases are created in a single central place, that would be the
place to put such a comment (and to simplify once aliases aren't required
by any binutils version supported for building glibc).
(You could do that incrementally if the new alias-creating macros have
different names from the existing versioned_symbol etc. ones, so uses of
the existing ones remain needing review, but on the whole I think the
existing macros have the right names, just ought not to need manual alias
creation.)
ping.
https://sourceware.org/ml/libc-alpha/2018-10/msg00575.html
the only feedback so far was about the comment/* Work around gas bug "multiple versions for symbol". */i can change/remove those.
These four patches are OK.
To confirm, since you didn't mention it in the commit message: whenever
the ieee754/dbl-64 implementations with integrated error handling are
used, the *f32x and *f64 names point directly to those after these
patches, not to any wrappers, since those names never supported SVID error
handling (were deliberately only added as aliases after _LIB_VERSION and
matherr were made into compat symbols).
On 20/11/18 17:30, Joseph Myers wrote:
> These four patches are OK.
>
> To confirm, since you didn't mention it in the commit message: whenever
> the ieee754/dbl-64 implementations with integrated error handling are
> used, the *f32x and *f64 names point directly to those after these
> patches, not to any wrappers, since those names never supported SVID error
> handling (were deliberately only added as aliases after _LIB_VERSION and
> matherr were made into compat symbols).
>
yes those names should always point to code without SVID error handling,
on x86_64 there is ifunc on __ieee754_exp so there is still a wrapper
when calling exp (which may be possible to remove if the ifunc is on
exp itself instead), but the wrapper does not do SVID compat error
handling for the new exp@@GLIBC_2.29 where expf32x and expf64 point to.
e.g. x86_64 libm.so has:
000000000000f3a0 t __exp_compat
000000000000f3a0 T exp@GLIBC_2.2.5
0000000000026940 i __exp_finite
0000000000026940 i __ieee754_exp
0000000000026940 t __ieee754_exp_ifunc
000000000003e000 t __exp
000000000003e000 W expf32x
000000000003e000 W expf64
000000000003e000 T exp@@GLIBC_2.29
000000000003e000 t __GI___exp
note that on riscv64 i did not introduce a new symbol version because
exp never did SVID compat errno handling, not sure if that's the right
design or if it's preferred to have an exp@@GLIBC_2.29 there too, just
pointing to the existing exp code.
e.g. riscv64 libm.so has:
0000000000027306 W exp
0000000000027306 t __exp
0000000000027306 W expf32x
0000000000027306 W expf64
0000000000027306 T __exp_finite
0000000000027306 t __GI___exp
0000000000027306 t __ieee754_exp
e.g. aarch64 libm.so has:
000000000000ee28 t __exp_compat
000000000000ee28 T exp@GLIBC_2.17
0000000000032f80 t __exp
0000000000032f80 T __exp_finite
0000000000032f80 T exp@@GLIBC_2.29
0000000000032f80 t __GI___exp
0000000000032f80 t __ieee754_exp
0000000000032f80 W expf32x
0000000000032f80 W expf64
On Tue, 20 Nov 2018, Szabolcs Nagy wrote:
> note that on riscv64 i did not introduce a new symbol version because
> exp never did SVID compat errno handling, not sure if that's the right
> design or if it's preferred to have an exp@@GLIBC_2.29 there too, just
> pointing to the existing exp code.
I think it's fine not to have a new version there. On architectures with
architecture-specific exp versions or IFUNCs the new version serves a
purpose even as an alias for a wrapper (it means that if in future those
architectures change to avoid the need for wrappers, any binaries built
since the new version was released will automatically benefit without
needing to be rebuilt), but I don't see any such purpose when the
architecture postdated SVID error handling support.
@@ -575,4 +575,8 @@ libm {
f32xsubf64x; f32xsubf128; f64subf64x; f64subf128;
f64xsubf128;
}
+ GLIBC_2.29 {
+ # No SVID compatible error handling.
+ exp; exp2;
+ }
}
new file mode 100644
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_exp_template.c>
+versioned_symbol (libm, __exp, exp, GLIBC_2_29);
+libm_alias_double_other (__exp, exp)
new file mode 100644
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_exp2_template.c>
+versioned_symbol (libm, __exp2, exp2, GLIBC_2_29);
+libm_alias_double_other (__exp2, exp2)
@@ -7,9 +7,11 @@
#include <math-svid-compat.h>
#include <libm-alias-double.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && (SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29) \
+ || defined NO_LONG_DOUBLE \
+ || defined LONG_DOUBLE_COMPAT)
double
-__exp2 (double x)
+__exp2_compat (double x)
{
double z = __ieee754_exp2 (x);
if (__builtin_expect (!isfinite (z) || z == 0, 0)
@@ -19,5 +21,17 @@ __exp2 (double x)
return z;
}
-libm_alias_double (__exp2, exp2)
+# if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29)
+compat_symbol (libm, __exp2_compat, exp2, GLIBC_2_1);
+# endif
+# ifdef NO_LONG_DOUBLE
+weak_alias (__exp2_compat, exp2l)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+/* Work around gas bug "multiple versions for symbol". */
+weak_alias (__exp2_compat, __exp2_compat_alias)
+
+LONG_DOUBLE_COMPAT_CHOOSE_libm_exp2l (
+ compat_symbol (libm, __exp2_compat_alias, exp2l, FIRST_VERSION_libm_exp2l), );
+# endif
#endif
@@ -21,10 +21,12 @@
#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_29) \
+ || defined NO_LONG_DOUBLE \
+ || defined LONG_DOUBLE_COMPAT)
/* wrapper exp */
double
-__exp (double x)
+__exp_compat (double x)
{
double z = __ieee754_exp (x);
if (__builtin_expect (!isfinite (z) || z == 0, 0)
@@ -33,6 +35,17 @@ __exp (double x)
return z;
}
-libm_hidden_def (__exp)
-libm_alias_double (__exp, exp)
+# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_29)
+compat_symbol (libm, __exp_compat, exp, GLIBC_2_0);
+# endif
+# ifdef NO_LONG_DOUBLE
+weak_alias (__exp_compat, expl)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+/* Work around gas bug "multiple versions for symbol". */
+weak_alias (__exp_compat, __exp_compat_alias)
+
+LONG_DOUBLE_COMPAT_CHOOSE_libm_expl (
+ compat_symbol (libm, __exp_compat_alias, expl, FIRST_VERSION_libm_expl), );
+# endif
#endif
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp2.c>
@@ -739,6 +739,12 @@ EXP_UNDERFLOW_ZERO:
GLOBAL_IEEE754_END(exp)
libm_alias_double_other (__exp, exp)
+#ifdef SHARED
+.symver exp,exp@@GLIBC_2.29
+.weak __exp_compat
+.set __exp_compat,__exp
+.symver __exp_compat,exp@GLIBC_2.2
+#endif
LOCAL_LIBM_ENTRY(__libm_error_region)
@@ -227,7 +227,7 @@ LOCAL_OBJECT_END(T_table)
.section .text
-GLOBAL_LIBM_ENTRY(exp2)
+WEAK_LIBM_ENTRY(exp2)
{.mfi
@@ -493,8 +493,14 @@ OUT_RANGE_exp2:
}
;;
-GLOBAL_LIBM_END(exp2)
-libm_alias_double_other (exp2, exp2)
+WEAK_LIBM_END(exp2)
+libm_alias_double_other (__exp2, exp2)
+#ifdef SHARED
+.symver exp2,exp2@@GLIBC_2.29
+.weak __exp2_compat
+.set __exp2_compat,__exp2
+.symver __exp2_compat,exp2@GLIBC_2.2
+#endif
LOCAL_LIBM_ENTRY(__libm_error_region)
@@ -20,6 +20,9 @@
#include <stdint.h>
#include <math-barriers.h>
#include <math-narrow-eval.h>
+#include <math-svid-compat.h>
+#include <shlib-compat.h>
+#include <libm-alias-double.h>
#include "math_config.h"
#define N (1 << EXP_TABLE_BITS)
@@ -91,7 +94,7 @@ top12 (double x)
double
SECTION
-__ieee754_exp (double x)
+__exp (double x)
{
uint32_t abstop;
uint64_t ki, idx, top, sbits;
@@ -153,6 +156,14 @@ __ieee754_exp (double x)
is no spurious underflow here even without fma. */
return scale + scale * tmp;
}
-#ifndef __ieee754_exp
-strong_alias (__ieee754_exp, __exp_finite)
+#ifndef __exp
+hidden_def (__exp)
+strong_alias (__exp, __ieee754_exp)
+strong_alias (__exp, __exp_finite)
+# if LIBM_SVID_COMPAT
+versioned_symbol (libm, __exp, exp, GLIBC_2_29);
+libm_alias_double_other (__exp, exp)
+# else
+libm_alias_double (__exp, exp)
+# endif
#endif
@@ -20,6 +20,9 @@
#include <stdint.h>
#include <math-barriers.h>
#include <math-narrow-eval.h>
+#include <math-svid-compat.h>
+#include <shlib-compat.h>
+#include <libm-alias-double.h>
#include "math_config.h"
#define N (1 << EXP_TABLE_BITS)
@@ -84,7 +87,7 @@ top12 (double x)
}
double
-__ieee754_exp2 (double x)
+__exp2 (double x)
{
uint32_t abstop;
uint64_t ki, idx, top, sbits;
@@ -140,6 +143,13 @@ __ieee754_exp2 (double x)
is no spurious underflow here even without fma. */
return scale + scale * tmp;
}
-#ifndef __ieee754_exp2
-strong_alias (__ieee754_exp2, __exp2_finite)
+#ifndef __exp2
+strong_alias (__exp2, __ieee754_exp2)
+strong_alias (__exp2, __exp2_finite)
+# if LIBM_SVID_COMPAT
+versioned_symbol (libm, __exp2, exp2, GLIBC_2_29);
+libm_alias_double_other (__exp2, exp2)
+# else
+libm_alias_double (__exp2, exp2)
+# endif
#endif
new file mode 100644
@@ -0,0 +1 @@
+/* Not needed. */
new file mode 100644
@@ -0,0 +1 @@
+/* Not needed. */
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp2.c>
@@ -1068,3 +1068,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1032,3 +1032,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1043,6 +1043,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.3.4 __c1_cabsf F
GLIBC_2.3.4 __c1_cacosf F
GLIBC_2.3.4 __c1_cacoshf F
@@ -453,6 +453,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.4 __clog10f F
@@ -764,4 +764,6 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 exp2l F
@@ -1075,3 +1075,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1005,3 +1005,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -453,6 +453,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.4 __clog10f F
@@ -804,3 +804,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -765,3 +765,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -764,4 +764,6 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 exp2l F
@@ -1032,3 +1032,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -765,3 +765,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -810,6 +810,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
@@ -809,6 +809,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
@@ -1076,3 +1076,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -488,6 +488,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.3 _LIB_VERSION D 0x4
GLIBC_2.3 __clog10 F
GLIBC_2.3 __clog10f F
@@ -1033,6 +1033,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
@@ -1033,6 +1033,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
@@ -764,4 +764,6 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 exp2l F
@@ -1040,6 +1040,8 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.4 __fpclassifyl F
@@ -1032,3 +1032,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1066,3 +1066,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1066,3 +1066,5 @@ GLIBC_2.28 fmul F
GLIBC_2.28 fmull F
GLIBC_2.28 fsub F
GLIBC_2.28 fsubl F
+GLIBC_2.29 exp F
+GLIBC_2.29 exp2 F
@@ -1,5 +1,5 @@
-#define __ieee754_exp __ieee754_exp_avx
-#define __exp1 __exp1_avx
+#include <math.h>
+#define __exp __ieee754_exp_avx
#define SECTION __attribute__ ((section (".text.avx")))
#include <sysdeps/ieee754/dbl-64/e_exp.c>
@@ -1,5 +1,5 @@
-#define __ieee754_exp __ieee754_exp_fma
-#define __exp1 __exp1_fma
+#include <math.h>
+#define __exp __ieee754_exp_fma
#define SECTION __attribute__ ((section (".text.fma")))
#include <sysdeps/ieee754/dbl-64/e_exp.c>
@@ -1,5 +1,5 @@
-#define __ieee754_exp __ieee754_exp_fma4
-#define __exp1 __exp1_fma4
+#include <math.h>
+#define __exp __ieee754_exp_fma4
#define SECTION __attribute__ ((section (".text.fma4")))
#include <sysdeps/ieee754/dbl-64/e_exp.c>
@@ -16,6 +16,8 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <math.h>
+
extern double __redirect_ieee754_exp (double);
#define SYMBOL_NAME ieee754_exp
@@ -25,5 +27,5 @@ libc_ifunc_redirected (__redirect_ieee754_exp, __ieee754_exp,
IFUNC_SELECTOR ());
strong_alias (__ieee754_exp, __exp_finite)
-#define __ieee754_exp __ieee754_exp_sse2
+#define __exp __ieee754_exp_sse2
#include <sysdeps/ieee754/dbl-64/e_exp.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp.c>