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.
This commit is contained in:
Rich Felker
2012-03-18 23:17:28 -04:00
parent 37eb14dd2b
commit aa1b4dff45
2 changed files with 21 additions and 1 deletions

View File

@@ -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)

View File

@@ -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