about summary refs log tree commit diff
path: root/src/math/i386/exp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/i386/exp.s')
-rw-r--r--src/math/i386/exp.s70
1 files changed, 38 insertions, 32 deletions
diff --git a/src/math/i386/exp.s b/src/math/i386/exp.s
index e5f54588..abb90369 100644
--- a/src/math/i386/exp.s
+++ b/src/math/i386/exp.s
@@ -95,42 +95,32 @@ exp:
 .type exp2,@function
 exp2:
 	fldl 4(%esp)
-1:	pushl $0x467ff000
-	flds (%esp)       # 16380
-	xorl %eax,%eax
-	pushl $0x80000000
-	push %eax
-	fld %st(1)
-	fabs
-	fucomp %st(1)
-	fnstsw
-	fstp %st(0)
-	sahf
-	ja 3f             # |x| > 16380
-	jp 2f             # x is nan (avoid invalid except in fistp)
+1:	sub $12,%esp
 	fld %st(0)
-	fistpl 8(%esp)
-	fildl 8(%esp)
-	fxch %st(1)
-	fsub %st(1)
-	mov $0x3fff,%eax
-	add %eax,8(%esp)
-	f2xm1
-	fld1
-	faddp             # 2^(x-rint(x))
-	fldt (%esp)       # 2^rint(x)
-	fmulp
-	fstp %st(1)
-2:	add $12,%esp
-	ret
-
-3:	fld %st(0)
 	fstpt (%esp)
-	fld1
 	mov 8(%esp),%ax
 	and $0x7fff,%ax
-	cmp $0x7fff,%ax
-	je 1f             # x = +-inf
+	cmp $0x3fff+13,%ax
+	jb 4f             # |x| < 8192
+	cmp $0x3fff+15,%ax
+	jae 3f            # |x| >= 32768
+	fsts (%esp)
+	cmpl $0xc67ff800,(%esp)
+	jb 2f             # x > -16382
+	movl $0x5f000000,(%esp)
+	flds (%esp)       # 0x1p63
+	fld %st(1)
+	fsub %st(1)
+	faddp
+	fucomp %st(1)
+	fnstsw
+	sahf
+	je 2f             # x - 0x1p63 + 0x1p63 == x
+	movl $1,(%esp)
+	flds (%esp)       # 0x1p-149
+	fdiv %st(1)
+	fstps (%esp)      # raise underflow
+2:	fld1
 	fld %st(1)
 	frndint
 	fxch %st(2)
@@ -141,3 +131,19 @@ exp2:
 	fstp %st(1)
 	add $12,%esp
 	ret
+3:	xor %eax,%eax
+4:	cmp $0x3fff-64,%ax
+	fld1
+	jb 1b             # |x| < 0x1p-64
+	fstpt (%esp)
+	fistl 8(%esp)
+	fildl 8(%esp)
+	fsubrp %st(1)
+	addl $0x3fff,8(%esp)
+	f2xm1
+	fld1
+	faddp             # 2^(x-rint(x))
+	fldt (%esp)       # 2^rint(x)
+	fmulp
+	add $12,%esp
+	ret