diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-03-18 23:17:28 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-03-18 23:17:28 -0400 |
commit | aa1b4dff45788f8205e32ea01da243fe09568aa8 (patch) | |
tree | 2fb4aa7cf4e3b9ead26ac895d4a22794144f59dd /src | |
parent | 37eb14dd2b92c51404fa54f56b6dfcd487ab5cbb (diff) | |
download | musl-aa1b4dff45788f8205e32ea01da243fe09568aa8.tar.gz musl-aa1b4dff45788f8205e32ea01da243fe09568aa8.tar.xz musl-aa1b4dff45788f8205e32ea01da243fe09568aa8.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/math/i386/exp.s | 9 | ||||
-rw-r--r-- | src/math/i386/expm1.s | 13 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/math/i386/exp.s b/src/math/i386/exp.s index 18f6cd67..f4769d59 100644 --- a/src/math/i386/exp.s +++ b/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) diff --git a/src/math/i386/expm1.s b/src/math/i386/expm1.s index d6d511ef..bbb5d12e 100644 --- a/src/math/i386/expm1.s +++ b/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 |