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
|
.type exp2,@function
|
||||||
exp2:
|
exp2:
|
||||||
fldl 4(%esp)
|
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)
|
1: fld %st(0)
|
||||||
frndint
|
frndint
|
||||||
fxch %st(1)
|
fxch %st(1)
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,23 @@ expm1l:
|
||||||
.type expm1,@function
|
.type expm1,@function
|
||||||
expm1:
|
expm1:
|
||||||
fldl 4(%esp)
|
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
|
1: fldl2e
|
||||||
fmulp
|
fmulp
|
||||||
fld %st(0)
|
fld %st(0)
|
||||||
frndint
|
frndint
|
||||||
fldz
|
fldz
|
||||||
fcompi
|
fcomp
|
||||||
|
fnstsw %ax
|
||||||
|
sahf
|
||||||
jnz 1f
|
jnz 1f
|
||||||
fstp %st(0)
|
fstp %st(0)
|
||||||
f2xm1
|
f2xm1
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue