about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/math/i386/exp.s45
-rw-r--r--src/math/i386/llrint.s2
-rw-r--r--src/math/i386/llrintl.s2
3 files changed, 24 insertions, 25 deletions
diff --git a/src/math/i386/exp.s b/src/math/i386/exp.s
index 76ab4d64..ca0de1d4 100644
--- a/src/math/i386/exp.s
+++ b/src/math/i386/exp.s
@@ -68,21 +68,19 @@ exp:
 .type exp2,@function
 exp2:
 	fldl 4(%esp)
-1:	mov $0x47000000,%eax
-	push %eax
+1:	pushl $0x467ff000
 	flds (%esp)
-	shl $7,%eax
-	push %eax
-	add %eax,%eax
+	xorl %eax,%eax
+	pushl $0x80000000
 	push %eax
 	fld %st(1)
 	fabs
 	fucom %st(1)
 	fnstsw
-	sahf
-	ja 2f
 	fstp %st(0)
 	fstp %st(0)
+	sahf
+	ja 2f
 	fld %st(0)
 	fistpl 8(%esp)
 	fildl 8(%esp)
@@ -99,22 +97,23 @@ exp2:
 	add $12,%esp
 	ret
 
-2:	fstp %st(0)
-	fstp %st(0)
-	fsts 8(%esp)
-	mov 8(%esp),%eax
-	lea (%eax,%eax),%ecx
-	cmp $0xff000000,%ecx
-	ja 2f
+2:	fld %st(0)
+	fstpt (%esp)
+	mov 9(%esp),%ah
+	and $0x7f,%ah
+	cmp $0x7f,%ah
+	jne 1f
+	decb 9(%esp)
 	fstp %st(0)
-	xor %ecx,%ecx
-	inc %ecx
-	add %eax,%eax
-	jc 1f
-	mov $0x7ffe,%ecx
-1:	mov %ecx,8(%esp)
 	fldt (%esp)
-	fld %st(0)
-	fmulp
-2:	add $12,%esp
+1:	fld %st(0)
+	frndint
+	fxch %st(1)
+	fsub %st(1)
+	f2xm1
+	fld1
+	faddp
+	fscale
+	fstp %st(1)
+	add $12,%esp
 	ret
diff --git a/src/math/i386/llrint.s b/src/math/i386/llrint.s
index e961b35d..eaa7f1fb 100644
--- a/src/math/i386/llrint.s
+++ b/src/math/i386/llrint.s
@@ -2,7 +2,7 @@
 .type llrint,@function
 llrint:
 	fldl 4(%esp)
-	fistpl 4(%esp)
+	fistpq 4(%esp)
 	mov 4(%esp),%eax
 	mov 8(%esp),%edx
 	ret
diff --git a/src/math/i386/llrintl.s b/src/math/i386/llrintl.s
index 84e63867..fd9a1cbd 100644
--- a/src/math/i386/llrintl.s
+++ b/src/math/i386/llrintl.s
@@ -2,7 +2,7 @@
 .type llrintl,@function
 llrintl:
 	fldt 4(%esp)
-	fistpl 4(%esp)
+	fistpq 4(%esp)
 	mov 4(%esp),%eax
 	mov 8(%esp),%edx
 	ret