[libc-commits] [libc] [libc][math] Improve hypotf performance. (PR #186627)
via libc-commits
libc-commits at lists.llvm.org
Tue Mar 17 07:18:27 PDT 2026
================
@@ -25,79 +25,96 @@ namespace math {
LIBC_INLINE float hypotf(float x, float y) {
using DoubleBits = fputil::FPBits<double>;
using FPBits = fputil::FPBits<float>;
+ using fputil::DoubleDouble;
- FPBits x_abs = FPBits(x).abs();
- FPBits y_abs = FPBits(y).abs();
+ uint32_t x_a = FPBits(x).uintval() & 0x7fff'ffff;
+ uint32_t y_a = FPBits(y).uintval() & 0x7fff'ffff;
- bool x_abs_larger = x_abs.uintval() >= y_abs.uintval();
-
- FPBits a_bits = x_abs_larger ? x_abs : y_abs;
- FPBits b_bits = x_abs_larger ? y_abs : x_abs;
-
- uint32_t a_u = a_bits.uintval();
- uint32_t b_u = b_bits.uintval();
-
- // Note: replacing `a_u >= FPBits::EXP_MASK` with `a_bits.is_inf_or_nan()`
+ // Note: replacing `x_a >= FPBits::EXP_MASK` with `x_bits.is_inf_or_nan()`
// generates extra exponent bit masking instructions on x86-64.
- if (LIBC_UNLIKELY(a_u >= FPBits::EXP_MASK)) {
+ if (LIBC_UNLIKELY(x_a >= FPBits::EXP_MASK || y_a >= FPBits::EXP_MASK)) {
// x or y is inf or nan
- if (a_bits.is_signaling_nan() || b_bits.is_signaling_nan()) {
+ FPBits x_bits(x);
+ FPBits y_bits(y);
+ if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan()) {
fputil::raise_except_if_required(FE_INVALID);
return FPBits::quiet_nan().get_val();
}
- if (a_bits.is_inf() || b_bits.is_inf())
+ if (x_bits.is_inf() || y_bits.is_inf())
return FPBits::inf().get_val();
- return a_bits.get_val();
+ return x + y;
}
- if (LIBC_UNLIKELY(a_u - b_u >=
----------------
lntue wrote:
The throughput and latency of the main path is low enough. Simply trading off between the performance of when a & b are close enough vs when b is negligible (which should be rarer).
https://github.com/llvm/llvm-project/pull/186627
More information about the libc-commits
mailing list