[4/4] i386: Replace assembly versions of e_exp2f with generic e_exp2f.c
Commit Message
This patch replaces i386 assembly versions of e_exp2f with generic
e_exp2f.c.
* sysdeps/i386/fpu/e_exp2f.S: Removed.
* 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.
---
sysdeps/i386/fpu/e_exp2f.S | 52 --------------------------
sysdeps/i386/fpu/libm-test-ulps | 2 +
sysdeps/i386/i686/fpu/multiarch/Makefile | 3 +-
sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c | 6 +++
sysdeps/i386/i686/fpu/multiarch/e_exp2f.c | 33 ++++++++++++++++
sysdeps/i386/i686/fpu/multiarch/libm-test-ulps | 2 +
6 files changed, 45 insertions(+), 53 deletions(-)
delete mode 100644 sysdeps/i386/fpu/e_exp2f.S
create mode 100644 sysdeps/i386/i686/fpu/multiarch/e_exp2f-sse2.c
create mode 100644 sysdeps/i386/i686/fpu/multiarch/e_exp2f.c
Comments
Please indicate the performance difference (SSE2 and generic).
deleted file mode 100644
@@ -1,52 +0,0 @@
-/*
- * Written by J.T. Conklin <jtc@netbsd.org>.
- * Adapted for exp2 by Ulrich Drepper <drepper@cygnus.com>.
- * Public domain.
- */
-
-#include <machine/asm.h>
-#include <i386-math-asm.h>
-
-DEFINE_FLT_MIN
-
-#ifdef PIC
-# define MO(op) op##@GOTOFF(%ecx)
-#else
-# define MO(op) op
-#endif
-
- .text
-ENTRY(__ieee754_exp2f)
-#ifdef PIC
- LOAD_PIC_REG (cx)
-#endif
- flds 4(%esp)
-/* I added the following ugly construct because exp(+-Inf) resulted
- in NaN. The ugliness results from the bright minds at Intel.
- For the i686 the code can be written better.
- -- drepper@cygnus.com. */
- fxam /* Is NaN or +-Inf? */
- fstsw %ax
- movb $0x45, %dh
- andb %ah, %dh
- cmpb $0x05, %dh
- je 1f /* Is +-Inf, jump. */
- fld %st
- frndint /* int(x) */
- fsubr %st,%st(1) /* fract(x) */
- fxch
- f2xm1 /* 2^(fract(x)) - 1 */
- fld1
- faddp /* 2^(fract(x)) */
- fscale /* e^x */
- fstp %st(1)
- FLT_NARROW_EVAL_UFLOW_NONNEG_NAN
- ret
-
-1: testl $0x200, %eax /* Test sign. */
- jz 2f /* If positive, jump. */
- fstp %st
- fldz /* Set result to 0. */
-2: ret
-END (__ieee754_exp2f)
-strong_alias (__ieee754_exp2f, __exp2f_finite)
@@ -1921,7 +1921,9 @@ ildouble: 1
ldouble: 1
Function: "exp2_upward":
+float: 1
float128: 2
+ifloat: 1
ifloat128: 2
ildouble: 1
ldouble: 1
@@ -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
new file mode 100644
@@ -0,0 +1,6 @@
+#undef strong_alias
+#define strong_alias(ignored1, ignored2)
+
+#define __ieee754_exp2f __ieee754_exp2f_sse2
+
+#include <sysdeps/ieee754/flt-32/e_exp2f.c>
new file mode 100644
@@ -0,0 +1,33 @@
+/* Multiple versions of IEEE 754 exp2f.
+ Copyright (C) 2012-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_ieee754_exp2f (float);
+
+#define SYMBOL_NAME ieee754_exp2f
+#include "ifunc-sse2.h"
+
+libc_ifunc_redirected (__redirect_ieee754_exp2f, __ieee754_exp2f,
+ IFUNC_SELECTOR ());
+strong_alias (__ieee754_exp2f, __exp2f_finite)
+
+#undef strong_alias
+#define strong_alias(ignored1, ignored2)
+
+#define __ieee754_exp2f __ieee754_exp2f_ia32
+
+#include <sysdeps/ieee754/flt-32/e_exp2f.c>
@@ -1921,7 +1921,9 @@ ildouble: 1
ldouble: 1
Function: "exp2_upward":
+float: 1
float128: 2
+ifloat: 1
ifloat128: 2
ildouble: 1
ldouble: 1