diff options
| author | Szabolcs Nagy <nsz@port70.net> | 2012-12-16 17:28:18 +0100 | 
|---|---|---|
| committer | Szabolcs Nagy <nsz@port70.net> | 2012-12-16 17:28:18 +0100 | 
| commit | 525ad96e0ef6e46b6ac28438ef2ffa1d5317fb64 (patch) | |
| tree | 2f0813204b99309ab1d4b1ffe250ccf84514c1a9 /src | |
| parent | 1d7c4f8f93d82ad5d8f650e71bcd99201965d9ad (diff) | |
| download | musl-525ad96e0ef6e46b6ac28438ef2ffa1d5317fb64.tar.gz | |
math: move x86_64 exp2l implementation to exp2l.s from expl.s
Diffstat (limited to 'src')
| -rw-r--r-- | src/math/x86_64/exp2l.s | 76 | ||||
| -rw-r--r-- | src/math/x86_64/expl.s | 83 | ||||
| -rw-r--r-- | src/math/x86_64/expm1l.s | 2 | 
3 files changed, 76 insertions, 85 deletions
| 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 diff --git a/src/math/x86_64/expl.s b/src/math/x86_64/expl.s index 740bc779..e69de29b 100644 --- a/src/math/x86_64/expl.s +++ b/src/math/x86_64/expl.s @@ -1,83 +0,0 @@ -.global expm1l -.type expm1l,@function -expm1l: -	fldt 8(%rsp) -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:	push %rax -	call 1f -	pop %rax -	fld1 -	fsubrp -	ret - -.global expl -.type expl,@function -expl: -	fldt 8(%rsp) -	fldl2e -	fmulp -	jmp 1f - -.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 diff --git a/src/math/x86_64/expm1l.s b/src/math/x86_64/expm1l.s index 89c2d290..e773f080 100644 --- a/src/math/x86_64/expm1l.s +++ b/src/math/x86_64/expm1l.s @@ -1 +1 @@ -# see expm1.s +# see exp2l.s | 
