about summary refs log tree commit diff
path: root/sysdeps/libm-i387
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-i387')
-rw-r--r--sysdeps/libm-i387/e_asinl.S21
-rw-r--r--sysdeps/libm-i387/e_atan2l.S16
-rw-r--r--sysdeps/libm-i387/e_expl.S40
-rw-r--r--sysdeps/libm-i387/e_fmodl.S20
-rw-r--r--sysdeps/libm-i387/e_log10l.S16
-rw-r--r--sysdeps/libm-i387/e_logl.S16
-rw-r--r--sysdeps/libm-i387/e_remainderl.S19
-rw-r--r--sysdeps/libm-i387/e_scalbl.S16
-rw-r--r--sysdeps/libm-i387/e_sqrtl.S15
-rw-r--r--sysdeps/libm-i387/s_atanl.S17
-rw-r--r--sysdeps/libm-i387/s_cosl.S29
-rw-r--r--sysdeps/libm-i387/s_finitef.S6
-rw-r--r--sysdeps/libm-i387/s_ilogbl.S24
-rw-r--r--sysdeps/libm-i387/s_log1pl.S25
-rw-r--r--sysdeps/libm-i387/s_logbl.S15
-rw-r--r--sysdeps/libm-i387/s_scalbnl.S16
-rw-r--r--sysdeps/libm-i387/s_sinl.S29
-rw-r--r--sysdeps/libm-i387/s_tanl.S31
18 files changed, 368 insertions, 3 deletions
diff --git a/sysdeps/libm-i387/e_asinl.S b/sysdeps/libm-i387/e_asinl.S
new file mode 100644
index 0000000000..7a90c3e63a
--- /dev/null
+++ b/sysdeps/libm-i387/e_asinl.S
@@ -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
index 0000000000..748571e38e
--- /dev/null
+++ b/sysdeps/libm-i387/e_atan2l.S
@@ -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
index 0000000000..d14089828d
--- /dev/null
+++ b/sysdeps/libm-i387/e_expl.S
@@ -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
index 0000000000..75ed17b9e5
--- /dev/null
+++ b/sysdeps/libm-i387/e_fmodl.S
@@ -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
index 0000000000..0a19256933
--- /dev/null
+++ b/sysdeps/libm-i387/e_log10l.S
@@ -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
index 0000000000..2575d6c6e8
--- /dev/null
+++ b/sysdeps/libm-i387/e_logl.S
@@ -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
index 0000000000..ce98515167
--- /dev/null
+++ b/sysdeps/libm-i387/e_remainderl.S
@@ -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
index 0000000000..8d5cd3b429
--- /dev/null
+++ b/sysdeps/libm-i387/e_scalbl.S
@@ -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
index 0000000000..88e5f82a0c
--- /dev/null
+++ b/sysdeps/libm-i387/e_sqrtl.S
@@ -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
index 0000000000..867e60b1c2
--- /dev/null
+++ b/sysdeps/libm-i387/s_atanl.S
@@ -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
index 0000000000..e2c22428b2
--- /dev/null
+++ b/sysdeps/libm-i387/s_cosl.S
@@ -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_finitef.S b/sysdeps/libm-i387/s_finitef.S
index f842d468b9..28a0a40308 100644
--- a/sysdeps/libm-i387/s_finitef.S
+++ b/sysdeps/libm-i387/s_finitef.S
@@ -9,9 +9,9 @@ RCSID("$NetBSD: s_finitef.S,v 1.3 1995/05/09 00:00:02 jtc Exp $")
 
 ENTRY(__finitef)
 	movl	4(%esp),%eax
-	andl	$0x7ff00000, %eax
-	cmpl	$0x7ff00000, %eax
-	setnel	%al
+	andl	$0x7f800000, %eax
+	cmpl	$0x7f800000, %eax
+	setne	%al
 	andl	$0x000000ff, %eax
 	ret
 weak_alias (__finitef, finitef)
diff --git a/sysdeps/libm-i387/s_ilogbl.S b/sysdeps/libm-i387/s_ilogbl.S
new file mode 100644
index 0000000000..11c81011c6
--- /dev/null
+++ b/sysdeps/libm-i387/s_ilogbl.S
@@ -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
index 0000000000..4a9faf7ba4
--- /dev/null
+++ b/sysdeps/libm-i387/s_log1pl.S
@@ -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
index 0000000000..e72b1fb941
--- /dev/null
+++ b/sysdeps/libm-i387/s_logbl.S
@@ -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
index 0000000000..b5fdf820d3
--- /dev/null
+++ b/sysdeps/libm-i387/s_scalbnl.S
@@ -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
index 0000000000..03c9c874b9
--- /dev/null
+++ b/sysdeps/libm-i387/s_sinl.S
@@ -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
index 0000000000..6b1532af9e
--- /dev/null
+++ b/sysdeps/libm-i387/s_tanl.S
@@ -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)