about summary refs log tree commit diff
path: root/sysdeps/i386/i686
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-22 07:58:54 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-22 08:00:18 -0700
commit7eda65f69e0e4533b76ca4614fe516de03fe2b3a (patch)
tree0b81497d81ea5be20c8a130f92c62f245a4e2089 /sysdeps/i386/i686
parent5d15c9697577d2c342b5ade820bfd7b84a736b23 (diff)
downloadglibc-7eda65f69e0e4533b76ca4614fe516de03fe2b3a.tar.gz
glibc-7eda65f69e0e4533b76ca4614fe516de03fe2b3a.tar.xz
glibc-7eda65f69e0e4533b76ca4614fe516de03fe2b3a.zip
i386: Replace assembly versions of e_exp2f with generic e_exp2f.c
This patch replaces i386 assembly versions of e_exp2f with generic
e_exp2f.c.  For workload-spec2017.wrf, on Nehalem, it improves
performance by:

                           Before            After     Improvement
reciprocal-throughput      112.996          40.0454       182%
latency                    126.581          54.4479       132%

On Skylake, it improves performance by:

                           Before            After     Improvement
reciprocal-throughput      113.14           39.447        186%
latency                    136.068          55.684        144%

On IvyBridge with --disable-multi-arch, it improves performance by:

                           Before            After     Improvement
reciprocal-throughput      132.521          40.3759       228%
latency                    145.791          58.4587       149%

	* sysdeps/i386/fpu/e_exp2f.S: Removed.
	* sysdeps/i386/fpu/w_exp2f.c: Likewise.
	* sysdeps/i386/fpu/libm-test-ulps: Updated for generic e_exp2f.c.
	* sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Likewise.
	* sysdeps/i386/i686/fpu/multiarch/Makefile (libm-sysdep_routines):
	Add e_exp2f-sse2.
	(CFLAGS-e_exp2f-sse2.c): New.
	* sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c: New file.
	* sysdeps/i386/i686/fpu/multiarch/e_exp2f.c: Likewise.
Diffstat (limited to 'sysdeps/i386/i686')
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/Makefile3
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c3
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/e_exp2f.c37
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/libm-test-ulps2
4 files changed, 44 insertions, 1 deletions
diff --git a/sysdeps/i386/i686/fpu/multiarch/Makefile b/sysdeps/i386/i686/fpu/multiarch/Makefile
index c5e8cfd689..2723f570af 100644
--- a/sysdeps/i386/i686/fpu/multiarch/Makefile
+++ b/sysdeps/i386/i686/fpu/multiarch/Makefile
@@ -1,6 +1,7 @@
 ifeq ($(subdir),math)
-libm-sysdep_routines += e_expf-sse2 s_sinf-sse2 s_cosf-sse2 \
+libm-sysdep_routines += e_exp2f-sse2 e_expf-sse2 s_sinf-sse2 s_cosf-sse2 \
                         s_sincosf-sse2
 
+CFLAGS-e_exp2f-sse2.c = -msse2 -mfpmath=sse
 CFLAGS-e_expf-sse2.c = -msse2 -mfpmath=sse
 endif
diff --git a/sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c b/sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c
new file mode 100644
index 0000000000..dc3138dc24
--- /dev/null
+++ b/sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c
@@ -0,0 +1,3 @@
+#define __exp2f __exp2f_sse2
+
+#include <sysdeps/ieee754/flt-32/e_exp2f.c>
diff --git a/sysdeps/i386/i686/fpu/multiarch/e_exp2f.c b/sysdeps/i386/i686/fpu/multiarch/e_exp2f.c
new file mode 100644
index 0000000000..0a5727f7de
--- /dev/null
+++ b/sysdeps/i386/i686/fpu/multiarch/e_exp2f.c
@@ -0,0 +1,37 @@
+/* Multiple versions of exp2f.
+   Copyright (C) 2017 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/>.  */
+
+extern float __redirect_exp2f (float);
+
+#define SYMBOL_NAME exp2f
+#include "ifunc-sse2.h"
+
+libc_ifunc_redirected (__redirect_exp2f, __exp2f, IFUNC_SELECTOR ());
+
+#ifdef SHARED
+# include <shlib-compat.h>
+versioned_symbol (libm, __exp2f, exp2f, GLIBC_2_27);
+#else
+weak_alias (__exp2f, exp2f)
+#endif
+
+strong_alias (__exp2f, __ieee754_exp2f)
+strong_alias (__exp2f, __exp2f_finite)
+
+#define __exp2f __exp2f_ia32
+#include <sysdeps/ieee754/flt-32/e_exp2f.c>
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index 5ff641f848..2d056a9260 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1921,7 +1921,9 @@ ildouble: 1
 ldouble: 1
 
 Function: "exp2_upward":
+float: 1
 float128: 2
+ifloat: 1
 ifloat128: 2
 ildouble: 1
 ldouble: 1