This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.14-357-g38ad40c
- From: drepper at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 15 Oct 2011 03:42:09 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.14-357-g38ad40c
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 38ad40ceca8ba35761e79cfce4aaef0d0f7583e6 (commit)
from 396a21b1d016c52e011f8921e0728aa62a1e9df0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=38ad40ceca8ba35761e79cfce4aaef0d0f7583e6
commit 38ad40ceca8ba35761e79cfce4aaef0d0f7583e6
Author: Ulrich Drepper <drepper@gmail.com>
Date: Fri Oct 14 23:41:47 2011 -0400
Optimize x86-32 log
diff --git a/ChangeLog b/ChangeLog
index 499050b..e2d6f38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2011-10-14 Ulrich Drepper <drepper@gmail.com>
+ * sysdeps/i386/fpu/e_log.S: Add real definition of __log_finite.
+ * sysdeps/i386/fpu/e_logf.S: Add real definition of __logf_finite.
+ * sysdeps/i386/fpu/e_logl.S: Add real definition of __logl_finite.
+ * sysdeps/i386/i686/fpu/e_log.S: New file.
+ * sysdeps/i386/i686/fpu/e_logf.S: New file.
+ * sysdeps/i386/i686/fpu/e_logl.S: New file.
+
* ctype/ctype.h: Add support for inlined isXXX functions when
compiling C++ code.
diff --git a/sysdeps/i386/fpu/e_log.S b/sysdeps/i386/fpu/e_log.S
index 8110a84..a2e4d89 100644
--- a/sysdeps/i386/fpu/e_log.S
+++ b/sysdeps/i386/fpu/e_log.S
@@ -62,4 +62,22 @@ ENTRY(__ieee754_log)
fstp %st(1)
ret
END (__ieee754_log)
-strong_alias (__ieee754_log, __log_finite)
+
+ENTRY(__log_finite)
+ fldln2 // log(2)
+ fldl 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fcompl MO(limit) // x-1 : x : log(2)
+ fnstsw // x-1 : x : log(2)
+ andb $0x45, %ah
+ jz 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__log_finite)
diff --git a/sysdeps/i386/fpu/e_logf.S b/sysdeps/i386/fpu/e_logf.S
index b683e13..1992cc2 100644
--- a/sysdeps/i386/fpu/e_logf.S
+++ b/sysdeps/i386/fpu/e_logf.S
@@ -63,4 +63,22 @@ ENTRY(__ieee754_logf)
fstp %st(1)
ret
END (__ieee754_logf)
-strong_alias (__ieee754_logf, __logf_finite)
+
+ENTRY(__logf_finite)
+ fldln2 // log(2)
+ flds 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fcompl MO(limit) // x-1 : x : log(2)
+ fnstsw // x-1 : x : log(2)
+ andb $0x45, %ah
+ jz 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__logf_finite)
diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/fpu/e_logl.S
index ee1fb16..bfb72a3 100644
--- a/sysdeps/i386/fpu/e_logl.S
+++ b/sysdeps/i386/fpu/e_logl.S
@@ -63,4 +63,22 @@ ENTRY(__ieee754_logl)
fstp %st(1)
ret
END (__ieee754_logl)
-strong_alias (__ieee754_logl, __logl_finite)
+
+ENTRY(__logl_finite)
+ fldln2 // log(2)
+ fldt 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fcompl MO(limit) // x-1 : x : log(2)
+ fnstsw // x-1 : x : log(2)
+ andb $0x45, %ah
+ jz 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__logl_finite)
diff --git a/sysdeps/i386/fpu/e_log.S b/sysdeps/i386/i686/fpu/e_log.S
similarity index 59%
copy from sysdeps/i386/fpu/e_log.S
copy to sysdeps/i386/i686/fpu/e_log.S
index 8110a84..c6524b1 100644
--- a/sysdeps/i386/fpu/e_log.S
+++ b/sysdeps/i386/i686/fpu/e_log.S
@@ -3,6 +3,7 @@
* Public domain.
*
* Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
+ * Adapted for i686 instructions.
*/
#include <machine/asm.h>
@@ -34,21 +35,19 @@ limit: .double 0.29
ENTRY(__ieee754_log)
fldln2 // log(2)
fldl 4(%esp) // x : log(2)
- fxam
- fnstsw
+ fucomi %st
+ jp 3f
#ifdef PIC
LOAD_PIC_REG (dx)
#endif
fld %st // x : x : log(2)
- sahf
- jc 3f // in case x is NaN or +-Inf
-4: fsubl MO(one) // x-1 : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
- fcompl MO(limit) // x-1 : x : log(2)
- fnstsw // x-1 : x : log(2)
- andb $0x45, %ah
- jz 2f
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2f
fstp %st(1) // x-1 : log(2)
fyl2xp1 // log(x)
ret
@@ -57,9 +56,25 @@ ENTRY(__ieee754_log)
fyl2x // log(x)
ret
-3: jp 4b // in case x is +-Inf
- fstp %st(1)
- fstp %st(1)
+3: fstp %st(1)
ret
END (__ieee754_log)
-strong_alias (__ieee754_log, __log_finite)
+
+ENTRY(__log_finite)
+ fldln2 // log(2)
+ fldl 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__log_finite)
diff --git a/sysdeps/i386/fpu/e_logf.S b/sysdeps/i386/i686/fpu/e_logf.S
similarity index 60%
copy from sysdeps/i386/fpu/e_logf.S
copy to sysdeps/i386/i686/fpu/e_logf.S
index b683e13..64f8807 100644
--- a/sysdeps/i386/fpu/e_logf.S
+++ b/sysdeps/i386/i686/fpu/e_logf.S
@@ -4,6 +4,7 @@
* Adapted for float by Ulrich Drepper <drepper@cygnus.com>.
*
* Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
+ * Adapted for i686 instructions.
*/
#include <machine/asm.h>
@@ -35,21 +36,19 @@ limit: .double 0.29
ENTRY(__ieee754_logf)
fldln2 // log(2)
flds 4(%esp) // x : log(2)
- fxam
- fnstsw
+ fucomi %st
+ jp 3f
#ifdef PIC
LOAD_PIC_REG (dx)
#endif
fld %st // x : x : log(2)
- sahf
- jc 3f // in case x is NaN or +-Inf
-4: fsubl MO(one) // x-1 : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
- fcompl MO(limit) // x-1 : x : log(2)
- fnstsw // x-1 : x : log(2)
- andb $0x45, %ah
- jz 2f
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2f
fstp %st(1) // x-1 : log(2)
fyl2xp1 // log(x)
ret
@@ -58,9 +57,25 @@ ENTRY(__ieee754_logf)
fyl2x // log(x)
ret
-3: jp 4b // in case x is +-Inf
- fstp %st(1)
- fstp %st(1)
+3: fstp %st(1)
ret
END (__ieee754_logf)
-strong_alias (__ieee754_logf, __logf_finite)
+
+ENTRY(__logf_finite)
+ fldln2 // log(2)
+ flds 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__logf_finite)
diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/i686/fpu/e_logl.S
similarity index 57%
copy from sysdeps/i386/fpu/e_logl.S
copy to sysdeps/i386/i686/fpu/e_logl.S
index ee1fb16..4e79a5a 100644
--- a/sysdeps/i386/fpu/e_logl.S
+++ b/sysdeps/i386/i686/fpu/e_logl.S
@@ -3,11 +3,12 @@
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ * Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
+ * Adapted for i686 instructions.
*/
#include <machine/asm.h>
-
#ifdef __ELF__
.section .rodata.cst8,"aM",@progbits,8
#else
@@ -35,21 +36,19 @@ limit: .double 0.29
ENTRY(__ieee754_logl)
fldln2 // log(2)
fldt 4(%esp) // x : log(2)
- fxam
- fnstsw
+ fucomi %st
+ jp 3f
#ifdef PIC
LOAD_PIC_REG (dx)
#endif
fld %st // x : x : log(2)
- sahf
- jc 3f // in case x is NaN or +-Inf
-4: fsubl MO(one) // x-1 : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
- fcompl MO(limit) // x-1 : x : log(2)
- fnstsw // x-1 : x : log(2)
- andb $0x45, %ah
- jz 2f
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2f
fstp %st(1) // x-1 : log(2)
fyl2xp1 // log(x)
ret
@@ -58,9 +57,25 @@ ENTRY(__ieee754_logl)
fyl2x // log(x)
ret
-3: jp 4b // in case x is +-Inf
- fstp %st(1)
- fstp %st(1)
+3: fstp %st(1)
ret
END (__ieee754_logl)
-strong_alias (__ieee754_logl, __logl_finite)
+
+ENTRY(__logl_finite)
+ fldln2 // log(2)
+ fldt 4(%esp) // x : log(2)
+#ifdef PIC
+ LOAD_PIC_REG (dx)
+#endif
+ fld %st // x : x : log(2)
+ fsubl MO(one) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
+ fcomip %st(1) // |x-1| : x-1 : x : log(2)
+ fstp %st(0) // x-1 : x : log(2)
+ jc 2b
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+END(__logl_finite)
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 7 +++
sysdeps/i386/fpu/e_log.S | 20 +++++++-
sysdeps/i386/fpu/e_logf.S | 20 +++++++-
sysdeps/i386/fpu/e_logl.S | 20 +++++++-
.../{x86_64/fpu/e_logl.S => i386/i686/fpu/e_log.S} | 55 ++++++++++----------
sysdeps/i386/{ => i686}/fpu/e_logf.S | 41 ++++++++++-----
sysdeps/{x86_64 => i386/i686}/fpu/e_logl.S | 48 +++++++++---------
7 files changed, 143 insertions(+), 68 deletions(-)
copy sysdeps/{x86_64/fpu/e_logl.S => i386/i686/fpu/e_log.S} (59%)
copy sysdeps/i386/{ => i686}/fpu/e_logf.S (60%)
copy sysdeps/{x86_64 => i386/i686}/fpu/e_logl.S (64%)
hooks/post-receive
--
GNU C Library master sources