Browse Source

fix broken exponential asm

infinities were getting converted into nans. the new code simply tests
for infinity and replaces it with a large magnitude value of the same
sign.

also, the fcomi instruction is apparently not part of the i387
instruction set, so avoid using it.
Rich Felker 13 years ago
parent
commit
aa1b4dff45
2 changed files with 21 additions and 1 deletions
  1. 9 0
      src/math/i386/exp.s
  2. 12 1
      src/math/i386/expm1.s

+ 9 - 0
src/math/i386/exp.s

@@ -34,6 +34,15 @@ exp:
 .type exp2,@function
 exp2:
 	fldl 4(%esp)
+1:	fxam
+	fnstsw %ax
+	sahf
+	jnp 1f
+	jnc 1f
+	fstps 4(%esp)
+	mov $0xfe,%al
+	and %al,7(%esp)
+	flds 4(%esp)
 1:	fld %st(0)
 	frndint
 	fxch %st(1)

+ 12 - 1
src/math/i386/expm1.s

@@ -14,12 +14,23 @@ expm1l:
 .type expm1,@function
 expm1:
 	fldl 4(%esp)
+1:	fxam
+	fnstsw %ax
+	sahf
+	jnp 1f
+	jnc 1f
+	fstps 4(%esp)
+	mov $0xfe,%al
+	and %al,7(%esp)
+	flds 4(%esp)
 1:	fldl2e
 	fmulp
 	fld %st(0)
 	frndint
 	fldz
-	fcompi
+	fcomp
+	fnstsw %ax
+	sahf
 	jnz 1f
 	fstp %st(0)
 	f2xm1