[libc-commits] [libc] [libc][math] Optimize exp2f and exp10f hot paths (PR #224178)

via libc-commits libc-commits at lists.llvm.org
Fri Oct 9 09:48:15 PDT 2026


================
@@ -27,67 +27,49 @@ namespace LIBC_NAMESPACE_DECL {
 namespace math {
 namespace double_eval {
 
-LIBC_INLINE float exp10f(float x) {
+LIBC_INLINE float exp10f_mid(float x) {
+  // Range reduction: 10^x = 2^(mid + hi) * 10^lo
+  auto rr = exp_b_range_reduc<Exp10Base>(x);
+
+  // The low part is approximated by a degree-5 minimax polynomial.
+  using fputil::multiply_add;
+  double lo2 = rr.lo * rr.lo;
+  double c0 = multiply_add(rr.lo, Exp10Base::COEFFS[0], 1.0);
+  double c1 = multiply_add(rr.lo, Exp10Base::COEFFS[2], Exp10Base::COEFFS[1]);
+  double c2 = multiply_add(rr.lo, Exp10Base::COEFFS[4], Exp10Base::COEFFS[3]);
+  double p = multiply_add(lo2, c2, c1);
+  // 10^x = 2^(mid + hi) * 10^lo
+  //      ~ mh * (1 + COEFFS[0] * lo + ... + COEFFS[4] * lo^5)
+  return static_cast<float>(multiply_add(p, lo2 * rr.mh, c0 * rr.mh));
+}
+
+[[gnu::cold, gnu::noinline]] LIBC_INLINE float exp10f_slow(float x) {
----------------
lntue wrote:

I'll fix it later today.

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


More information about the libc-commits mailing list