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