|
20 | 20 |
|
21 | 21 | namespace LIBC_NAMESPACE_DECL { |
22 | 22 |
|
23 | | -#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS |
24 | | -static constexpr size_t N_ASINPIF16_EXCEPTS = 3; |
25 | | - |
26 | 23 | LLVM_LIBC_FUNCTION(float16, asinpif16, (float16 x)) { |
27 | 24 | using FPBits = fputil::FPBits<float16>; |
28 | 25 |
|
29 | 26 | FPBits xbits(x); |
30 | 27 | bool is_neg = xbits.is_neg(); |
31 | | - float16 x_abs = xbits.abs().get_val(); |
| 28 | + double x_abs = fputil::cast<double>(xbits.abs().get_val()); |
32 | 29 |
|
33 | 30 | auto signed_result = [is_neg](auto r) -> auto { return is_neg ? -r : r; }; |
34 | 31 |
|
35 | | - if (LIBC_UNLIKELY(x_abs > 1.0f16)) { |
| 32 | + if (LIBC_UNLIKELY(x_abs > 1.0)) { |
36 | 33 | // aspinf16(NaN) = NaN |
37 | 34 | if (xbits.is_nan()) { |
38 | 35 | if (xbits.is_signaling_nan()) { |
@@ -87,7 +84,7 @@ LLVM_LIBC_FUNCTION(float16, asinpif16, (float16 x)) { |
87 | 84 | }; |
88 | 85 |
|
89 | 86 | // if |x| <= 0.5: |
90 | | - if (LIBC_UNLIKELY(x_abs <= 0.5f16)) { |
| 87 | + if (LIBC_UNLIKELY(x_abs <= 0.5)) { |
91 | 88 | // Use polynomial approximation of asin(x)/pi in the range [0, 0.5] |
92 | 89 | double result = asinpi_polyeval(fputil::cast<double>(x)); |
93 | 90 | return fputil::cast<float16>(result); |
@@ -120,7 +117,7 @@ LLVM_LIBC_FUNCTION(float16, asinpif16, (float16 x)) { |
120 | 117 | // = 0.5 - 0.5 * x |
121 | 118 | // = multiply_add(-0.5, x, 0.5) |
122 | 119 |
|
123 | | - double u = fputil::multiply_add(-0.5, fputil::cast<double>(x_abs), 0.5); |
| 120 | + double u = fputil::multiply_add(-0.5, x_abs, 0.5); |
124 | 121 | double asinpi_sqrt_u = asinpi_polyeval(fputil::sqrt<double>(u)); |
125 | 122 | double result = fputil::multiply_add(-2.0, asinpi_sqrt_u, 0.5); |
126 | 123 |
|
|
0 commit comments