summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2005-01-13 18:58:25 +0000
committerdas <das@FreeBSD.org>2005-01-13 18:58:25 +0000
commit20067523affa6535f5dd33cfec8b3d14c30fb812 (patch)
tree04a0605ee5b79977a033aa99669d833d7fc9395e /lib
parent97f02113039b27b597708c06ddc73a16de123e80 (diff)
downloadFreeBSD-src-20067523affa6535f5dd33cfec8b3d14c30fb812.zip
FreeBSD-src-20067523affa6535f5dd33cfec8b3d14c30fb812.tar.gz
Import the subset of J.T. Conklin's single-precision x86-optimized
math routines that appear to be (a) correct and (b) faster than their MI counterparts on my Pentium 4. Obtained from: NetBSD
Diffstat (limited to 'lib')
-rw-r--r--lib/msun/Makefile6
-rw-r--r--lib/msun/i387/e_atan2f.S15
-rw-r--r--lib/msun/i387/e_log10f.S15
-rw-r--r--lib/msun/i387/e_logf.S15
-rw-r--r--lib/msun/i387/e_remainderf.S19
-rw-r--r--lib/msun/i387/e_scalbf.S15
-rw-r--r--lib/msun/i387/e_sqrtf.S14
-rw-r--r--lib/msun/i387/s_ceilf.S29
-rw-r--r--lib/msun/i387/s_copysignf.S19
-rw-r--r--lib/msun/i387/s_cosf.S15
-rw-r--r--lib/msun/i387/s_floorf.S29
-rw-r--r--lib/msun/i387/s_logbf.S15
-rw-r--r--lib/msun/i387/s_rintf.S14
-rw-r--r--lib/msun/i387/s_scalbnf.S16
-rw-r--r--lib/msun/i387/s_significandf.S15
-rw-r--r--lib/msun/i387/s_sinf.S15
-rw-r--r--lib/msun/i387/s_tanf.S16
17 files changed, 280 insertions, 2 deletions
diff --git a/lib/msun/Makefile b/lib/msun/Makefile
index 07078af..d7d3e52 100644
--- a/lib/msun/Makefile
+++ b/lib/msun/Makefile
@@ -54,8 +54,10 @@ ARCH_SRCS = e_acos.S e_asin.S e_atan2.S e_exp.S e_fmod.S e_log.S e_log10.S \
e_remainder.S e_scalb.S e_sqrt.S s_atan.S s_ceil.S s_copysign.S \
s_cos.S s_finite.S s_floor.S s_llrint.S s_logb.S s_lrint.S \
s_rint.S s_scalbn.S s_significand.S s_sin.S s_tan.S
-# Broken:
-# ARCH_SRCS+= s_log1p.S
+# float counterparts
+ARCH_SRCS+= e_atan2f.S e_log10f.S e_logf.S e_remainderf.S e_scalbf.S \
+ e_sqrtf.S s_ceilf.S s_copysignf.S s_cosf.S s_floorf.S s_logbf.S \
+ s_rintf.S s_scalbnf.S s_significandf.S s_sinf.S s_tanf.S
.endif
ARCH_SUBDIR?= ${MACHINE_ARCH}
diff --git a/lib/msun/i387/e_atan2f.S b/lib/msun/i387/e_atan2f.S
new file mode 100644
index 0000000..ca5c79c
--- /dev/null
+++ b/lib/msun/i387/e_atan2f.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_atan2f.S,v 1.1 1995/05/08 23:35:10 jtc Exp $") */
+
+ENTRY(__ieee754_atan2f)
+ flds 4(%esp)
+ flds 8(%esp)
+ fpatan
+ ret
diff --git a/lib/msun/i387/e_log10f.S b/lib/msun/i387/e_log10f.S
new file mode 100644
index 0000000..7623938
--- /dev/null
+++ b/lib/msun/i387/e_log10f.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_log10f.S,v 1.1 1996/07/03 16:50:22 jtc Exp $") */
+
+ENTRY(__ieee754_log10f)
+ fldlg2
+ flds 4(%esp)
+ fyl2x
+ ret
diff --git a/lib/msun/i387/e_logf.S b/lib/msun/i387/e_logf.S
new file mode 100644
index 0000000..a8bf1f6
--- /dev/null
+++ b/lib/msun/i387/e_logf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_logf.S,v 1.2 1996/07/06 00:15:45 jtc Exp $") */
+
+ENTRY(__ieee754_logf)
+ fldln2
+ flds 4(%esp)
+ fyl2x
+ ret
diff --git a/lib/msun/i387/e_remainderf.S b/lib/msun/i387/e_remainderf.S
new file mode 100644
index 0000000..24857fa
--- /dev/null
+++ b/lib/msun/i387/e_remainderf.S
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_remainderf.S,v 1.2 1995/05/08 23:49:47 jtc Exp $") */
+
+ENTRY(__ieee754_remainderf)
+ flds 8(%esp)
+ flds 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ ret
diff --git a/lib/msun/i387/e_scalbf.S b/lib/msun/i387/e_scalbf.S
new file mode 100644
index 0000000..a3911d7
--- /dev/null
+++ b/lib/msun/i387/e_scalbf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_scalbf.S,v 1.1 1996/07/03 16:50:24 jtc Exp $") */
+
+ENTRY(__ieee754_scalbf)
+ flds 8(%esp)
+ flds 4(%esp)
+ fscale
+ ret
diff --git a/lib/msun/i387/e_sqrtf.S b/lib/msun/i387/e_sqrtf.S
new file mode 100644
index 0000000..4c92e0f
--- /dev/null
+++ b/lib/msun/i387/e_sqrtf.S
@@ -0,0 +1,14 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: e_sqrtf.S,v 1.2 1995/05/08 23:50:14 jtc Exp $") */
+
+ENTRY(__ieee754_sqrtf)
+ flds 4(%esp)
+ fsqrt
+ ret
diff --git a/lib/msun/i387/s_ceilf.S b/lib/msun/i387/s_ceilf.S
new file mode 100644
index 0000000..0b15a1f
--- /dev/null
+++ b/lib/msun/i387/s_ceilf.S
@@ -0,0 +1,29 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_ceilf.S,v 1.3 1995/05/08 23:52:44 jtc Exp $") */
+
+ENTRY(ceilf)
+ pushl %ebp
+ movl %esp,%ebp
+ subl $8,%esp
+
+ fstcw -12(%ebp) /* store fpu control word */
+ movw -12(%ebp),%dx
+ orw $0x0800,%dx /* round towards +oo */
+ andw $0xfbff,%dx
+ movw %dx,-16(%ebp)
+ fldcw -16(%ebp) /* load modfied control word */
+
+ flds 8(%ebp); /* round */
+ frndint
+
+ fldcw -12(%ebp) /* restore original control word */
+
+ leave
+ ret
diff --git a/lib/msun/i387/s_copysignf.S b/lib/msun/i387/s_copysignf.S
new file mode 100644
index 0000000..e78ad24
--- /dev/null
+++ b/lib/msun/i387/s_copysignf.S
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_copysignf.S,v 1.3 1995/05/08 23:53:25 jtc Exp $") */
+
+ENTRY(copysignf)
+ movl 8(%esp),%edx
+ andl $0x80000000,%edx
+ movl 4(%esp),%eax
+ andl $0x7fffffff,%eax
+ orl %edx,%eax
+ movl %eax,4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/lib/msun/i387/s_cosf.S b/lib/msun/i387/s_cosf.S
new file mode 100644
index 0000000..67bb6ba
--- /dev/null
+++ b/lib/msun/i387/s_cosf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_cosf.S,v 1.4 1999/07/02 15:37:34 simonb Exp $") */
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(cosf)
+ flds 4(%esp)
+ fcos
+ ret
diff --git a/lib/msun/i387/s_floorf.S b/lib/msun/i387/s_floorf.S
new file mode 100644
index 0000000..64a1031
--- /dev/null
+++ b/lib/msun/i387/s_floorf.S
@@ -0,0 +1,29 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_floorf.S,v 1.3 1995/05/09 00:04:32 jtc Exp $") */
+
+ENTRY(floorf)
+ pushl %ebp
+ movl %esp,%ebp
+ subl $8,%esp
+
+ fstcw -12(%ebp) /* store fpu control word */
+ movw -12(%ebp),%dx
+ orw $0x0400,%dx /* round towards -oo */
+ andw $0xf7ff,%dx
+ movw %dx,-16(%ebp)
+ fldcw -16(%ebp) /* load modfied control word */
+
+ flds 8(%ebp); /* round */
+ frndint
+
+ fldcw -12(%ebp) /* restore original control word */
+
+ leave
+ ret
diff --git a/lib/msun/i387/s_logbf.S b/lib/msun/i387/s_logbf.S
new file mode 100644
index 0000000..4cfa02b
--- /dev/null
+++ b/lib/msun/i387/s_logbf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_logbf.S,v 1.3 1995/05/09 00:15:12 jtc Exp $") */
+
+ENTRY(logbf)
+ flds 4(%esp)
+ fxtract
+ fstp %st
+ ret
diff --git a/lib/msun/i387/s_rintf.S b/lib/msun/i387/s_rintf.S
new file mode 100644
index 0000000..646dcb5
--- /dev/null
+++ b/lib/msun/i387/s_rintf.S
@@ -0,0 +1,14 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_rintf.S,v 1.3 1995/05/09 00:17:22 jtc Exp $") */
+
+ENTRY(rintf)
+ flds 4(%esp)
+ frndint
+ ret
diff --git a/lib/msun/i387/s_scalbnf.S b/lib/msun/i387/s_scalbnf.S
new file mode 100644
index 0000000..bdf0292
--- /dev/null
+++ b/lib/msun/i387/s_scalbnf.S
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_scalbnf.S,v 1.4 1999/01/02 05:15:40 kristerw Exp $") */
+
+ENTRY(scalbnf)
+ fildl 8(%esp)
+ flds 4(%esp)
+ fscale
+ fstp %st(1) /* bug fix for fp stack overflow */
+ ret
diff --git a/lib/msun/i387/s_significandf.S b/lib/msun/i387/s_significandf.S
new file mode 100644
index 0000000..9929981
--- /dev/null
+++ b/lib/msun/i387/s_significandf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_significandf.S,v 1.3 1995/05/09 00:24:07 jtc Exp $") */
+
+ENTRY(significandf)
+ flds 4(%esp)
+ fxtract
+ fstp %st(1)
+ ret
diff --git a/lib/msun/i387/s_sinf.S b/lib/msun/i387/s_sinf.S
new file mode 100644
index 0000000..ba6ffbc
--- /dev/null
+++ b/lib/msun/i387/s_sinf.S
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_sinf.S,v 1.3 1995/05/09 00:27:53 jtc Exp $") */
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(sinf)
+ flds 4(%esp)
+ fsin
+ ret
diff --git a/lib/msun/i387/s_tanf.S b/lib/msun/i387/s_tanf.S
new file mode 100644
index 0000000..9be9c6d
--- /dev/null
+++ b/lib/msun/i387/s_tanf.S
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+/* RCSID("$NetBSD: s_tanf.S,v 1.3 1995/05/09 00:31:09 jtc Exp $") */
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(tanf)
+ flds 4(%esp)
+ fptan
+ fstp %st(0)
+ ret
OpenPOWER on IntegriCloud