X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fmath%2Fi386%2Fexp.s;h=e3b42af5ae244fde2e2e30b048d9877d9d1a1177;hp=f4769d59c1ee499beacc8df5974ab45be60b9c8b;hb=a8f73bb1a685dd7d67669c6f6ceb255cfa967790;hpb=0627e58af8514967372a8ff703e7a86c2571acc2 diff --git a/src/math/i386/exp.s b/src/math/i386/exp.s index f4769d59..e3b42af5 100644 --- a/src/math/i386/exp.s +++ b/src/math/i386/exp.s @@ -1,3 +1,37 @@ +.global expm1f +.type expm1f,@function +expm1f: + flds 4(%esp) + jmp 1f + +.global expm1l +.type expm1l,@function +expm1l: + fldt 4(%esp) + jmp 1f + +.global expm1 +.type expm1,@function +expm1: + fldl 4(%esp) +1: fldl2e + fmulp + fld1 + fld %st(1) + fabs + fucom %st(1) + fnstsw %ax + fstp %st(0) + fstp %st(0) + sahf + ja 1f + f2xm1 + ret +1: call 1f + fld1 + fsubrp + ret + .global exp2f .type exp2f,@function exp2f: @@ -16,12 +50,6 @@ expf: flds 4(%esp) jmp 2f -.global expl -.type expl,@function -expl: - fldt 4(%esp) - jmp 2f - .global exp .type exp,@function exp: @@ -34,22 +62,49 @@ exp: .type exp2,@function exp2: fldl 4(%esp) -1: fxam - fnstsw %ax +1: pushl $0x467ff000 + flds (%esp) # 16380 + xorl %eax,%eax + pushl $0x80000000 + push %eax + fld %st(1) + fabs + fucomp %st(1) + fnstsw + fstp %st(0) sahf - jnp 1f - jnc 1f - fstps 4(%esp) - mov $0xfe,%al - and %al,7(%esp) - flds 4(%esp) -1: fld %st(0) - frndint + ja 3f # |x| > 16380 + jp 2f # x is nan (avoid invalid except in fistp) + fld %st(0) + fistpl 8(%esp) + fildl 8(%esp) fxch %st(1) fsub %st(1) + mov $0x3fff,%eax + add %eax,8(%esp) f2xm1 fld1 - faddp - fscale + faddp # 2^(x-rint(x)) + fldt (%esp) # 2^rint(x) + fmulp + fstp %st(1) +2: add $12,%esp + ret + +3: fld %st(0) + fstpt (%esp) + fld1 + mov 8(%esp),%ax + and $0x7fff,%ax + cmp $0x7fff,%ax + je 1f # x = +-inf + fld %st(1) + frndint + fxch %st(2) + fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x) + f2xm1 + faddp # 2^(x-rint(x)) +1: fscale fstp %st(1) + add $12,%esp ret