提交 141c8d4c 编写于 作者: R Rich Felker

fix excess precision in return value of i386 acos[f] and asin[f]

analogous to commit 1c9afd69 for
atan[2][f].
上级 1c9afd69
# use acos(x) = atan2(fabs(sqrt((1-x)*(1+x))), x) # use acos(x) = atan2(fabs(sqrt((1-x)*(1+x))), x)
.global acosf
.type acosf,@function
acosf:
flds 4(%esp)
jmp 1f
.global acosl
.type acosl,@function
acosl:
fldt 4(%esp)
jmp 1f
.global acos .global acos
.type acos,@function .type acos,@function
acos: acos:
fldl 4(%esp) fldl 4(%esp)
1: fld %st(0) fld %st(0)
fld1 fld1
fsub %st(0),%st(1) fsub %st(0),%st(1)
fadd %st(2) fadd %st(2)
...@@ -25,4 +13,6 @@ acos: ...@@ -25,4 +13,6 @@ acos:
fabs # fix sign of zero (matters in downward rounding mode) fabs # fix sign of zero (matters in downward rounding mode)
fxch %st(1) fxch %st(1)
fpatan fpatan
fstpl 4(%esp)
fldl 4(%esp)
ret ret
# see acos.s .global acosf
.type acosf,@function
acosf:
flds 4(%esp)
fld %st(0)
fld1
fsub %st(0),%st(1)
fadd %st(2)
fmulp
fsqrt
fabs # fix sign of zero (matters in downward rounding mode)
fxch %st(1)
fpatan
fstps 4(%esp)
flds 4(%esp)
ret
# see acos.s .global acosl
.type acosl,@function
acosl:
fldt 4(%esp)
fld %st(0)
fld1
fsub %st(0),%st(1)
fadd %st(2)
fmulp
fsqrt
fabs # fix sign of zero (matters in downward rounding mode)
fxch %st(1)
fpatan
ret
.global asinf
.type asinf,@function
asinf:
flds 4(%esp)
mov 4(%esp),%eax
add %eax,%eax
cmp $0x01000000,%eax
jae 1f
# subnormal x, return x with underflow
fld %st(0)
fmul %st(1)
fstps 4(%esp)
ret
.global asinl
.type asinl,@function
asinl:
fldt 4(%esp)
jmp 1f
.global asin .global asin
.type asin,@function .type asin,@function
asin: asin:
...@@ -25,15 +5,17 @@ asin: ...@@ -25,15 +5,17 @@ asin:
mov 8(%esp),%eax mov 8(%esp),%eax
add %eax,%eax add %eax,%eax
cmp $0x00200000,%eax cmp $0x00200000,%eax
jae 1f jb 1f
# subnormal x, return x with underflow fld %st(0)
fsts 4(%esp)
ret
1: fld %st(0)
fld1 fld1
fsub %st(0),%st(1) fsub %st(0),%st(1)
fadd %st(2) fadd %st(2)
fmulp fmulp
fsqrt fsqrt
fpatan fpatan
fstpl 4(%esp)
fldl 4(%esp)
ret
# subnormal x, return x with underflow
1: fsts 4(%esp)
ret ret
# see asin.s .global asinf
.type asinf,@function
asinf:
flds 4(%esp)
mov 4(%esp),%eax
add %eax,%eax
cmp $0x01000000,%eax
jb 1f
fld %st(0)
fld1
fsub %st(0),%st(1)
fadd %st(2)
fmulp
fsqrt
fpatan
fstps 4(%esp)
flds 4(%esp)
ret
# subnormal x, return x with underflow
1: fld %st(0)
fmul %st(1)
fstps 4(%esp)
ret
# see asin.s .global asinl
.type asinl,@function
asinl:
fldt 4(%esp)
fld %st(0)
fld1
fsub %st(0),%st(1)
fadd %st(2)
fmulp
fsqrt
fpatan
ret
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册