Browse Source

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

analogous to commit 1c9afd6905 for
atan[2][f].
master
Rich Felker 6 years ago
parent
commit
141c8d4ccb
  1. 16
      src/math/i386/acos.s
  2. 17
      src/math/i386/acosf.s
  3. 15
      src/math/i386/acosl.s
  4. 32
      src/math/i386/asin.s
  5. 24
      src/math/i386/asinf.s
  6. 13
      src/math/i386/asinl.s

16
src/math/i386/acos.s

@ -1,22 +1,10 @@
# 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:
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

17
src/math/i386/acosf.s

@ -1 +1,16 @@
# 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

15
src/math/i386/acosl.s

@ -1 +1,14 @@
# 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

32
src/math/i386/asin.s

@ -1,23 +1,3 @@
.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:
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

24
src/math/i386/asinf.s

@ -1 +1,23 @@
# 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

13
src/math/i386/asinl.s

@ -1 +1,12 @@
# 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

Loading…
Cancel
Save