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:
parent
37eb14dd2b
commit
aa1b4dff45
2 changed files with 21 additions and 1 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue