[libc-commits] [libc] [libc][math] optimize `asinpif` and `acospif` (PR #184286)

via libc-commits libc-commits at lists.llvm.org
Mon Mar 2 19:30:38 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Mohamed Emad (hulxv)

<details>
<summary>Changes</summary>

Optimize `asinpif` and `acospif` using [Estrin's scheme](https://en.wikipedia.org/wiki/Estrin%27s_scheme).

## Benchmarking in **debug mode**
### **before**
**asinpif**

```
Ntrial = 40 ; Min = 0.000 + 350.920 clc/call; Median-Min = 450.477 clc/call; Max = 468.882 clc/call;
```

**acospif**
```
Ntrial = 40 ; Min = 0.000 + 309.248 clc/call; Median-Min = 384.386 clc/call; Max = 420.073 clc/call;
```

### **after**
**asinpif**
```
Ntrial = 40 ; Min = 0.000 + 258.178 clc/call; Median-Min = 318.840 clc/call; Max = 326.965 clc/call;
```
**acospif**
```
Ntrial = 40 ; Min = 0.000 + 217.385 clc/call; Median-Min = 260.928 clc/call; Max = 293.692 clc/call;
```

---
Full diff: https://github.com/llvm/llvm-project/pull/184286.diff


1 Files Affected:

- (modified) libc/src/__support/math/inv_trigf_utils.h (+19-4) 


``````````diff
diff --git a/libc/src/__support/math/inv_trigf_utils.h b/libc/src/__support/math/inv_trigf_utils.h
index 7a93831333db0..a1ebe5f75c4fc 100644
--- a/libc/src/__support/math/inv_trigf_utils.h
+++ b/libc/src/__support/math/inv_trigf_utils.h
@@ -208,10 +208,25 @@ LIBC_INLINE_VAR constexpr double ASINPI_COEFFS[13] = {
 
 // Evaluates P1(v2) = c1 + c2*v2 + c3*v2^2 + ... (tail of P without c0)
 LIBC_INLINE double asinpi_eval(double v2) {
-  return fputil::polyeval(
-      v2, ASINPI_COEFFS[1], ASINPI_COEFFS[2], ASINPI_COEFFS[3],
-      ASINPI_COEFFS[4], ASINPI_COEFFS[5], ASINPI_COEFFS[6], ASINPI_COEFFS[7],
-      ASINPI_COEFFS[8], ASINPI_COEFFS[9], ASINPI_COEFFS[10], ASINPI_COEFFS[11]);
+  double v4 = v2 * v2;
+  double v8 = v4 * v4;
+
+  double p01 = fputil::multiply_add(v2, ASINPI_COEFFS[2], ASINPI_COEFFS[1]);
+  double p23 = fputil::multiply_add(v2, ASINPI_COEFFS[4], ASINPI_COEFFS[3]);
+  double p45 = fputil::multiply_add(v2, ASINPI_COEFFS[6], ASINPI_COEFFS[5]);
+  double p67 = fputil::multiply_add(v2, ASINPI_COEFFS[8], ASINPI_COEFFS[7]);
+  double p89 = fputil::multiply_add(v2, ASINPI_COEFFS[10], ASINPI_COEFFS[9]);
+  double p10 = ASINPI_COEFFS[11];
+
+  double q0 = fputil::multiply_add(v4, p23, p01);
+  double q1 = fputil::multiply_add(v4, p67, p45);
+  double q2 = fputil::multiply_add(v4, p10, p89);
+
+  double r0 = fputil::multiply_add(v8, q1, q0);
+  double r1 = q2;
+
+  double v16 = v8 * v8;
+  return fputil::multiply_add(v16, r1, r0);
 }
 
 } // namespace inv_trigf_utils_internal

``````````

</details>


https://github.com/llvm/llvm-project/pull/184286


More information about the libc-commits mailing list