Wed Jun 5 02:11:30 1996 Ulrich Drepper <drepper@cygnus.com>
authorroland <roland>
Wed, 5 Jun 1996 01:05:50 +0000 (01:05 +0000)
committerroland <roland>
Wed, 5 Jun 1996 01:05:50 +0000 (01:05 +0000)
* sysdeps/libm-i387/e_asinl.S, sysdeps/libm-i387/e_atan2l.S,
sysdeps/libm-i387/e_expl.S, sysdeps/libm-i387/e_fmodl.S,
sysdeps/libm-i387/e_log10l.S, sysdeps/libm-i387/e_logl.S,
sysdeps/libm-i387/e_remainderl.S, sysdeps/libm-i387/e_scalbl.S,
sysdeps/libm-i387/e_sqrtl.S, sysdeps/libm-i387/s_atanl.S,
sysdeps/libm-i387/s_cosl.S, sysdeps/libm-i387/s_ilogbl.S,
sysdeps/libm-i387/s_log1pl.S, sysdeps/libm-i387/s_logbl.S,
sysdeps/libm-i387/s_scalbnl.S, sysdeps/libm-i387/s_sinl.S,
sysdeps/libm-i387/s_tanl.S: New files.  i387 assembler versions
of `long double' math functions.

17 files changed:
sysdeps/libm-i387/e_asinl.S [new file with mode: 0644]
sysdeps/libm-i387/e_atan2l.S [new file with mode: 0644]
sysdeps/libm-i387/e_expl.S [new file with mode: 0644]
sysdeps/libm-i387/e_fmodl.S [new file with mode: 0644]
sysdeps/libm-i387/e_log10l.S [new file with mode: 0644]
sysdeps/libm-i387/e_logl.S [new file with mode: 0644]
sysdeps/libm-i387/e_remainderl.S [new file with mode: 0644]
sysdeps/libm-i387/e_scalbl.S [new file with mode: 0644]
sysdeps/libm-i387/e_sqrtl.S [new file with mode: 0644]
sysdeps/libm-i387/s_atanl.S [new file with mode: 0644]
sysdeps/libm-i387/s_cosl.S [new file with mode: 0644]
sysdeps/libm-i387/s_ilogbl.S [new file with mode: 0644]
sysdeps/libm-i387/s_log1pl.S [new file with mode: 0644]
sysdeps/libm-i387/s_logbl.S [new file with mode: 0644]
sysdeps/libm-i387/s_scalbnl.S [new file with mode: 0644]
sysdeps/libm-i387/s_sinl.S [new file with mode: 0644]
sysdeps/libm-i387/s_tanl.S [new file with mode: 0644]

diff --git a/sysdeps/libm-i387/e_asinl.S b/sysdeps/libm-i387/e_asinl.S
new file mode 100644 (file)
index 0000000..7a90c3e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+/* asinl = atanl (x / sqrtl(1 - x^2)) */
+ENTRY(__ieee754_asinl)
+       fldt    4(%esp)                 /* x */
+       fst     %st(1)
+       fmul    %st(0)                  /* x^2 */
+       fld1
+       fsubp                           /* 1 - x^2 */
+       fsqrt                           /* sqrt (1 - x^2) */
+       fpatan
+       ret
diff --git a/sysdeps/libm-i387/e_atan2l.S b/sysdeps/libm-i387/e_atan2l.S
new file mode 100644 (file)
index 0000000..748571e
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_atan2l)
+       fldt     4(%esp)
+       fldt    16(%esp)
+       fpatan
+       ret
diff --git a/sysdeps/libm-i387/e_expl.S b/sysdeps/libm-i387/e_expl.S
new file mode 100644 (file)
index 0000000..d140898
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+/* e^x = 2^(x * log2l(e)) */
+ENTRY(__ieee754_expl)
+       fldt    4(%esp)
+/* I added the following ugly construct because expl(+-Inf) resulted
+   in NaN.  The ugliness results from the bright minds at Intel.
+   -- drepper@cygnus.com.  */
+       fxam                            /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       sahf
+       jnc     .LnoInfNaN              /* No, jump.   */
+       jp      .LisInf                 /* Is +-Inf, jump.  */
+.LnoInfNaN:
+       fldl2e
+       fmulp                           /* x * log2(e) */
+       fstl    %st(1)
+       frndint                         /* int(x * log2(e)) */
+       fstl    %st(2)
+       fsubrp                          /* fract(x * log2(e)) */
+       f2xm1                           /* 2^(fract(x * log2(e))) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x * log2(e))) */
+       fscale                          /* e^x */
+       ret
+
+.LisInf:
+       andb    $2, %ah                 /* Test sign.  */
+       jz      .LpInf                  /* If positive, jump.  */
+       fldz                            /* Set result to 0.  */
+.LpInf:        ret
diff --git a/sysdeps/libm-i387/e_fmodl.S b/sysdeps/libm-i387/e_fmodl.S
new file mode 100644 (file)
index 0000000..75ed17b
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_fmodl)
+       fldt    16(%esp)
+       fldt    4(%esp)
+1:     fprem
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstpl   %st(1)
+       ret
diff --git a/sysdeps/libm-i387/e_log10l.S b/sysdeps/libm-i387/e_log10l.S
new file mode 100644 (file)
index 0000000..0a19256
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_log10l)
+       fldlg2
+       fldt    4(%esp)
+       fyl2x
+       ret
diff --git a/sysdeps/libm-i387/e_logl.S b/sysdeps/libm-i387/e_logl.S
new file mode 100644 (file)
index 0000000..2575d6c
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_logl)
+       fldln2
+       fldt    4(%esp)
+       fyl2x
+       ret
diff --git a/sysdeps/libm-i387/e_remainderl.S b/sysdeps/libm-i387/e_remainderl.S
new file mode 100644 (file)
index 0000000..ce98515
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_remainderl)
+       fldt    16(%esp)
+       fldt    4(%esp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       ret
diff --git a/sysdeps/libm-i387/e_scalbl.S b/sysdeps/libm-i387/e_scalbl.S
new file mode 100644 (file)
index 0000000..8d5cd3b
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_scalbl)
+       fldt    16(%esp)
+       fldt    4(%esp)
+       fscale
+       ret
diff --git a/sysdeps/libm-i387/e_sqrtl.S b/sysdeps/libm-i387/e_sqrtl.S
new file mode 100644 (file)
index 0000000..88e5f82
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ieee754_sqrtl)
+       fldt    4(%esp)
+       fsqrt
+       ret
diff --git a/sysdeps/libm-i387/s_atanl.S b/sysdeps/libm-i387/s_atanl.S
new file mode 100644 (file)
index 0000000..867e60b
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__atanl)
+       fldt    4(%esp)
+       fld1
+       fpatan
+       ret
+weak_alias (__atanl, atanl)
diff --git a/sysdeps/libm-i387/s_cosl.S b/sysdeps/libm-i387/s_cosl.S
new file mode 100644 (file)
index 0000000..e2c2242
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__cosl)
+       fldt    4(%esp)
+       fcos
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fcos
+       ret
+weak_alias (__cosl, cosl)
diff --git a/sysdeps/libm-i387/s_ilogbl.S b/sysdeps/libm-i387/s_ilogbl.S
new file mode 100644 (file)
index 0000000..11c8101
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__ilogbl)
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $4,%esp
+
+       fldt    8(%ebp)
+       fxtract
+
+       fistpl  -4(%ebp)
+       movl    -4(%ebp),%eax
+
+       leave
+       ret
+weak_alias (__ilogbl, ilogbl)
diff --git a/sysdeps/libm-i387/s_log1pl.S b/sysdeps/libm-i387/s_log1pl.S
new file mode 100644 (file)
index 0000000..4a9faf7
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+/*
+ * Since the fyl2xp1 instruction has such a limited range:
+ *     -(1 - (sqrt(2) / 2)) <= x <= sqrt(2) - 1
+ * it's not worth trying to use it.
+ */
+
+ENTRY(__log1pl)
+       fldln2
+       fldt 4(%esp)
+       fld1
+       faddp
+       fyl2x
+       ret
+weak_alias (__log1pl, log1pl)
diff --git a/sysdeps/libm-i387/s_logbl.S b/sysdeps/libm-i387/s_logbl.S
new file mode 100644 (file)
index 0000000..e72b1fb
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__logbl)
+       fldt    4(%esp)
+       fxtract
+       ret
+weak_alias (__logbl, logbl)
diff --git a/sysdeps/libm-i387/s_scalbnl.S b/sysdeps/libm-i387/s_scalbnl.S
new file mode 100644 (file)
index 0000000..b5fdf82
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__scalbnl)
+       fildl   16(%esp)
+       fldt    4(%esp)
+       fscale
+       ret
+weak_alias (__scalbnl, scalbnl)
diff --git a/sysdeps/libm-i387/s_sinl.S b/sysdeps/libm-i387/s_sinl.S
new file mode 100644 (file)
index 0000000..03c9c87
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__sinl)
+       fldt    4(%esp)
+       fsin
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fsin
+       ret
+weak_alias (__sinl, sinl)
diff --git a/sysdeps/libm-i387/s_tanl.S b/sysdeps/libm-i387/s_tanl.S
new file mode 100644 (file)
index 0000000..6b1532a
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: $")
+
+ENTRY(__tanl)
+       fldt    4(%esp)
+       fptan
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       fstp    %st(0)
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fstsw   %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fptan
+       fstp    %st(0)
+       ret
+weak_alias (__tanl, tanl)