@@ -35,24 +35,23 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
3535
3636 // |x| <= 0x1p-1, |x| <= 0.5
3737 if (x_abs <= 0x3800 ) {
38+ // asinf16(+/-0) = +/-0
39+ if (LIBC_UNLIKELY (x_abs == 0 ))
40+ return x;
41+
42+ // Exhaustive tests show that,
43+ // for |x| <= 0x1.878p-9, when:
44+ // x > 0, and rounding upward, or
45+ // x < 0, and rounding downward, then,
46+ // asin(x) = x * 2^-11 + x
47+ // else, in other rounding modes,
48+ // asin(x) = x
3849 if (LIBC_UNLIKELY (x_abs <= 0x1a1e )) {
39- // asinf16(+/-0) = +/-0
40- if (LIBC_UNLIKELY (x_abs == 0U )) {
41- return x;
42- }
43-
44- // Exhaustive tests show that, when:
45- // x > 0, and rounding upward, or
46- // x < 0, and rounding downward, then,
47- // asin(x) = x * 2^-11 + x
48- // else, in other rounding modes,
49- // asin(x) = x
5050 int rounding = fputil::quick_get_round ();
5151
5252 if ((xbits.is_pos () && rounding == FE_UPWARD) ||
53- (xbits.is_neg () && rounding == FE_DOWNWARD)) {
53+ (xbits.is_neg () && rounding == FE_DOWNWARD))
5454 return fputil::cast<float16>(fputil::multiply_add (xf, 0x1 .0p-11f , xf));
55- }
5655 return x;
5756 }
5857
@@ -66,11 +65,8 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
6665
6766 // |x| > 1, asinf16(x) = NaN
6867 if (LIBC_UNLIKELY (x_abs > 0x3c00 )) {
69- // |x| <= +/-inf
70- if (LIBC_UNLIKELY (x_abs <= 0x7c00 )) {
71- fputil::set_errno_if_required (EDOM);
72- fputil::raise_except_if_required (FE_INVALID);
73- }
68+ fputil::set_errno_if_required (EDOM);
69+ fputil::raise_except_if_required (FE_INVALID);
7470
7571 return FPBits::quiet_nan ().get_val ();
7672 }
@@ -91,13 +87,13 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
9187 // sin(z/2) = sqrt((1 - x)/2)
9288 // 7: Let u = (1 - x)/2
9389 // 8: Therefore:
94- // arcsin (sqrt(u)) = z/2
95- // 2 * arcsin (sqrt(u)) = z
90+ // asin (sqrt(u)) = z/2
91+ // 2 * asin (sqrt(u)) = z
9692 // 9: Recall [3], z = pi/2 - y. Therefore:
9793 // y = pi/2 - z
9894 // y = pi/2 - 2 * arcsin(sqrt(u))
9995 // 10: Recall [1], y = asin(x). Therefore:
100- // arcsin (x) = pi/2 - 2 * arcsin (sqrt(u))
96+ // asin (x) = pi/2 - 2 * asin (sqrt(u))
10197 //
10298 // WHY?
10399 // 11: Recall [7], u = (1 - x)/2
@@ -109,7 +105,7 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
109105
110106 // 0x1p-1 < |x| <= 0x1p0, 0.5 < |x| <= 1.0
111107 float xf_abs = (xf < 0 ? -xf : xf);
112- float sign = (( xbits.uintval () >> 15 ) == 1 ? -1.0 : 1.0 );
108+ float sign = (xbits.uintval () >> 15 == 1 ? -1.0 : 1.0 );
113109 float u = fputil::multiply_add (-0 .5f , xf_abs, 0 .5f );
114110 float u_sqrt = fputil::sqrt<float >(u);
115111
0 commit comments