From 20067523affa6535f5dd33cfec8b3d14c30fb812 Mon Sep 17 00:00:00 2001 From: das Date: Thu, 13 Jan 2005 18:58:25 +0000 Subject: 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 --- lib/msun/Makefile | 6 ++++-- lib/msun/i387/e_atan2f.S | 15 +++++++++++++++ lib/msun/i387/e_log10f.S | 15 +++++++++++++++ lib/msun/i387/e_logf.S | 15 +++++++++++++++ lib/msun/i387/e_remainderf.S | 19 +++++++++++++++++++ lib/msun/i387/e_scalbf.S | 15 +++++++++++++++ lib/msun/i387/e_sqrtf.S | 14 ++++++++++++++ lib/msun/i387/s_ceilf.S | 29 +++++++++++++++++++++++++++++ lib/msun/i387/s_copysignf.S | 19 +++++++++++++++++++ lib/msun/i387/s_cosf.S | 15 +++++++++++++++ lib/msun/i387/s_floorf.S | 29 +++++++++++++++++++++++++++++ lib/msun/i387/s_logbf.S | 15 +++++++++++++++ lib/msun/i387/s_rintf.S | 14 ++++++++++++++ lib/msun/i387/s_scalbnf.S | 16 ++++++++++++++++ lib/msun/i387/s_significandf.S | 15 +++++++++++++++ lib/msun/i387/s_sinf.S | 15 +++++++++++++++ lib/msun/i387/s_tanf.S | 16 ++++++++++++++++ 17 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 lib/msun/i387/e_atan2f.S create mode 100644 lib/msun/i387/e_log10f.S create mode 100644 lib/msun/i387/e_logf.S create mode 100644 lib/msun/i387/e_remainderf.S create mode 100644 lib/msun/i387/e_scalbf.S create mode 100644 lib/msun/i387/e_sqrtf.S create mode 100644 lib/msun/i387/s_ceilf.S create mode 100644 lib/msun/i387/s_copysignf.S create mode 100644 lib/msun/i387/s_cosf.S create mode 100644 lib/msun/i387/s_floorf.S create mode 100644 lib/msun/i387/s_logbf.S create mode 100644 lib/msun/i387/s_rintf.S create mode 100644 lib/msun/i387/s_scalbnf.S create mode 100644 lib/msun/i387/s_significandf.S create mode 100644 lib/msun/i387/s_sinf.S create mode 100644 lib/msun/i387/s_tanf.S (limited to 'lib/msun') 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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 . + * Public domain. + */ + +#include + +__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 -- cgit v1.1