[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