From 525ad96e0ef6e46b6ac28438ef2ffa1d5317fb64 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sun, 16 Dec 2012 17:28:18 +0100 Subject: math: move x86_64 exp2l implementation to exp2l.s from expl.s --- src/math/x86_64/exp2l.s | 76 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) (limited to 'src/math/x86_64/exp2l.s') diff --git a/src/math/x86_64/exp2l.s b/src/math/x86_64/exp2l.s index 510c256d..1f8ed7bb 100644 --- a/src/math/x86_64/exp2l.s +++ b/src/math/x86_64/exp2l.s @@ -1 +1,75 @@ -# see expl.s +.global expm1l +.type expm1l,@function +expm1l: + fldt 8(%rsp) + fldl2e + fmulp + fld1 + fld %st(1) + fabs + fucom %st(1) + fnstsw %ax + fstp %st(0) + fstp %st(0) + sahf + ja 1f + f2xm1 + ret +1: push %rax + call 1f + pop %rax + fld1 + fsubrp + ret + +.global exp2l +.type exp2l,@function +exp2l: + fldt 8(%rsp) +1: mov $0x467ff000,%eax + mov %eax,-16(%rsp) + mov $0x80000000,%eax + mov %eax,-20(%rsp) + xor %eax,%eax + mov %eax,-24(%rsp) + flds -16(%rsp) # 16380 + fld %st(1) + fabs + fucom %st(1) + fnstsw + fstp %st(0) + fstp %st(0) + sahf + ja 3f # |x| > 16380 + jp 2f # x is nan (avoid invalid except in fistp) + fld %st(0) + fistpl -16(%rsp) + fildl -16(%rsp) + fxch %st(1) + fsub %st(1) + mov $0x3fff,%eax + add %eax,-16(%rsp) + f2xm1 + fld1 + faddp # 2^(x-rint(x)) + fldt -24(%rsp) # 2^rint(x) + fmulp +2: fstp %st(1) + ret + +3: fld %st(0) + fstpt -24(%rsp) + fld1 + mov -15(%rsp),%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) + ret -- cgit 1.4.1