[4/5,v4] Do not wrap expf and exp2f
Commit Message
v4:
- ifdefs for multiarch support.
- add w_expf.c for power8, tested with --disable-multi-arch --with-cpu=power8.
Comments
OK. I'd strongly encourage powerpc people to see whether there is any
advantage to the power8 e_expf.S, or whether, possibly after tuning
TOINT_* (and potentially any other details of the expf implementation that
can be tuned for different architectures at the C level), it's at least as
good just to build the C version for power8.
From 7dc9a7c1aa60966df497d6405aab3bdfab5c6083 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Tue, 12 Sep 2017 12:44:18 +0100
Subject: [PATCH 4/5] Do not wrap expf and exp2f
The new generic expf and exp2f code don't need wrappers any more, they
set errno inline, so only use the wrappers on targets that need it.
(If the wrapper is needed, then the top level wrapper code is included,
otherwise empty w_exp*f.c is used to suppress the wrapper.)
A powerpc64 expf implementation includes the expf c code directly which
needed some changes.
2017-09-25 Szabolcs Nagy <szabolcs.nagy@arm.com>
H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/ieee754/flt-32/e_exp2f.c (__exp2f): Define without wrapper.
* sysdeps/ieee754/flt-32/e_expf.c (__expf): Likewise
* sysdeps/ieee754/flt-32/w_exp2f.c: New file.
* sysdeps/ieee754/flt-32/w_expf.c: New file.
* sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c: Update for
the new expf code.
* sysdeps/powerpc/powerpc64/fpu/multiarch/w_expf.c: New file.
* sysdeps/powerpc/powerpc64/power8/fpu/w_expf.c: New file.
* sysdeps/m68k/m680x0/fpu/w_exp2f.c: New file.
* sysdeps/m68k/m680x0/fpu/w_expf.c: New file.
* sysdeps/i386/fpu/w_exp2f.c: New file.
* sysdeps/i386/fpu/w_expf.c: New file.
* sysdeps/i386/i686/fpu/multiarch/w_expf.c: New file.
* sysdeps/x86_64/fpu/w_expf.c: New file.
---
sysdeps/i386/fpu/w_exp2f.c | 1 +
sysdeps/i386/fpu/w_expf.c | 1 +
sysdeps/i386/i686/fpu/multiarch/w_expf.c | 1 +
sysdeps/ieee754/flt-32/e_exp2f.c | 9 +++++++--
sysdeps/ieee754/flt-32/e_expf.c | 16 ++++++++++++++--
sysdeps/ieee754/flt-32/w_exp2f.c | 1 +
sysdeps/ieee754/flt-32/w_expf.c | 1 +
sysdeps/m68k/m680x0/fpu/w_exp2f.c | 1 +
sysdeps/m68k/m680x0/fpu/w_expf.c | 1 +
sysdeps/powerpc/powerpc64/fpu/multiarch/e_expf-ppc64.c | 5 +----
sysdeps/powerpc/powerpc64/fpu/multiarch/w_expf.c | 1 +
sysdeps/powerpc/powerpc64/power8/fpu/w_expf.c | 1 +
sysdeps/x86_64/fpu/w_expf.c | 1 +
13 files changed, 32 insertions(+), 8 deletions(-)
create mode 100644 sysdeps/i386/fpu/w_exp2f.c
create mode 100644 sysdeps/i386/fpu/w_expf.c
create mode 100644 sysdeps/i386/i686/fpu/multiarch/w_expf.c
create mode 100644 sysdeps/ieee754/flt-32/w_exp2f.c
create mode 100644 sysdeps/ieee754/flt-32/w_expf.c
create mode 100644 sysdeps/m68k/m680x0/fpu/w_exp2f.c
create mode 100644 sysdeps/m68k/m680x0/fpu/w_expf.c
create mode 100644 sysdeps/powerpc/powerpc64/fpu/multiarch/w_expf.c
create mode 100644 sysdeps/powerpc/powerpc64/power8/fpu/w_expf.c
create mode 100644 sysdeps/x86_64/fpu/w_expf.c
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_exp2f.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
@@ -18,6 +18,7 @@
#include <math.h>
#include <stdint.h>
+#include <shlib-compat.h>
#include "math_config.h"
/*
@@ -42,7 +43,7 @@ top12 (float x)
}
float
-__ieee754_exp2f (float x)
+__exp2f (float x)
{
uint32_t abstop;
uint64_t ki, t;
@@ -85,4 +86,8 @@ __ieee754_exp2f (float x)
y = y * s;
return (float) y;
}
-strong_alias (__ieee754_exp2f, __exp2f_finite)
+#ifndef __exp2f
+strong_alias (__exp2f, __ieee754_exp2f)
+strong_alias (__exp2f, __exp2f_finite)
+versioned_symbol (libm, __exp2f, exp2f, GLIBC_2_27);
+#endif
@@ -16,8 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#ifdef __expf
+# undef libm_hidden_proto
+# define libm_hidden_proto(ignored)
+#endif
+
#include <math.h>
#include <stdint.h>
+#include <shlib-compat.h>
#include "math_config.h"
/*
@@ -42,7 +48,7 @@ top12 (float x)
}
float
-__ieee754_expf (float x)
+__expf (float x)
{
uint32_t abstop;
uint64_t ki, t;
@@ -99,4 +105,10 @@ __ieee754_expf (float x)
y = y * s;
return (float) y;
}
-strong_alias (__ieee754_expf, __expf_finite)
+
+#ifndef __expf
+hidden_def (__expf)
+strong_alias (__expf, __ieee754_expf)
+strong_alias (__expf, __expf_finite)
+versioned_symbol (libm, __expf, expf, GLIBC_2_27);
+#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_exp2f.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
@@ -16,9 +16,6 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#undef strong_alias
-#define strong_alias(a, b)
-
-#define __ieee754_expf __ieee754_expf_ppc64
+#define __expf __ieee754_expf_ppc64
#include <sysdeps/ieee754/flt-32/e_expf.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_expf.c>
--
2.11.0