math: change the formula used for acos.s
[musl] / src / math / i386 / acos.s
index 4f0168f..47f365e 100644 (file)
@@ -1,3 +1,5 @@
+# use acos(x) = atan2(fabs(sqrt((1-x)*(1+x))), x)
+
 .global acosf
 .type acosf,@function
 acosf:
@@ -14,19 +16,13 @@ acosl:
 .type acos,@function
 acos:
        fldl 4(%esp)
-1:     fld1
-       fld %st(1)
+1:     fld %st(0)
        fld1
-       fsubp
-       fxch %st(2)
-       faddp
-       fdivp
+       fsub %st(0),%st(1)
+       fadd %st(2)
+       fmulp
        fsqrt
-       fld1
+       fabs         # fix sign of zero (matters in downward rounding mode)
        fxch %st(1)
        fpatan
-       fld1
-       fld1
-       faddp
-       fmulp
        ret