[libc-commits] [libc] [libc][math][c23] Add hypotf16() function (PR #131991)

via libc-commits libc-commits at lists.llvm.org
Sun Mar 23 20:04:33 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Tejas Vipin (meltq)

<details>
<summary>Changes</summary>

Implement hypot for Float16 along with tests.

---

Patch is 44.37 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/131991.diff


15 Files Affected:

- (modified) libc/config/linux/x86_64/entrypoints.txt (+1) 
- (modified) libc/docs/headers/math/index.rst (+1-1) 
- (modified) libc/include/math.yaml (+8) 
- (modified) libc/src/math/CMakeLists.txt (+1) 
- (modified) libc/src/math/generic/CMakeLists.txt (+16) 
- (added) libc/src/math/generic/hypotf16.cpp (+86) 
- (added) libc/src/math/hypotf16.h (+21) 
- (modified) libc/test/src/math/CMakeLists.txt (+11) 
- (modified) libc/test/src/math/HypotTest.h (+1-1) 
- (modified) libc/test/src/math/exhaustive/CMakeLists.txt (+18) 
- (added) libc/test/src/math/exhaustive/hypotf16_test.cpp (+58) 
- (added) libc/test/src/math/hypotf16_hard_to_round.h (+522) 
- (added) libc/test/src/math/hypotf16_test.cpp (+27) 
- (modified) libc/test/src/math/smoke/CMakeLists.txt (+13) 
- (added) libc/test/src/math/smoke/hypotf16_test.cpp (+17) 


``````````diff
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index a29478898fe70..f2a936962dd6d 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -701,6 +701,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
     libc.src.math.fromfpf16
     libc.src.math.fromfpxf16
     libc.src.math.getpayloadf16
+    libc.src.math.hypotf16
     libc.src.math.ilogbf16
     libc.src.math.iscanonicalf16
     libc.src.math.issignalingf16
diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index 5b855ce4881c3..ff7fd32690b3c 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -305,7 +305,7 @@ Higher Math Functions
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
 | fsqrt     | N/A              | |check|         |  |check|               | N/A                  | |check|\*              | 7.12.14.6              | F.10.11                    |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| hypot     | |check|          | |check|         |                        |                      |                        | 7.12.7.4               | F.10.4.4                   |
+| hypot     | |check|          | |check|         |                        | |check|              |                        | 7.12.7.4               | F.10.4.4                   |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
 | lgamma    |                  |                 |                        |                      |                        | 7.12.8.3               | F.10.5.3                   |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/include/math.yaml b/libc/include/math.yaml
index a66f981030864..b0bb5d74c5605 100644
--- a/libc/include/math.yaml
+++ b/libc/include/math.yaml
@@ -1366,6 +1366,14 @@ functions:
     arguments:
       - type: float
       - type: float
+  - name: hypotf16
+    standards:
+      - stdc
+    return_type: _Float16
+    arguments:
+      - type: _Float16
+      - type: _Float16
+    guard: LIBC_TYPES_HAS_FLOAT16
   - name: ilogb
     standards:
       - stdc
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index f18a73d46f9aa..3a098951bb205 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -310,6 +310,7 @@ add_math_entrypoint_object(getpayloadf128)
 
 add_math_entrypoint_object(hypot)
 add_math_entrypoint_object(hypotf)
+add_math_entrypoint_object(hypotf16)
 
 add_math_entrypoint_object(ilogb)
 add_math_entrypoint_object(ilogbf)
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 3114289bad486..e980d103a1d22 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -3105,6 +3105,22 @@ add_entrypoint_object(
     libc.src.__support.macros.optimization
 )
 
+add_entrypoint_object(
+  hypotf16
+  SRCS
+    hypotf16.cpp
+  HDRS
+    ../hypotf16.h
+  DEPENDS
+    libc.src.__support.FPUtil.fenv_impl
+    libc.src.__support.FPUtil.fp_bits
+    libc.src.__support.FPUtil.cast
+    libc.src.__support.FPUtil.multiply_add
+    libc.src.__support.FPUtil.sqrt
+    libc.src.__support.macros.optimization
+    libc.src.__support.macros.properties.types
+)
+
 add_entrypoint_object(
   fdim
   SRCS
diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp
new file mode 100644
index 0000000000000..b7255bc4420db
--- /dev/null
+++ b/libc/src/math/generic/hypotf16.cpp
@@ -0,0 +1,86 @@
+//===-- Implementation of hypotf16 function -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/hypotf16.h"
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/cast.h"
+#include "src/__support/FPUtil/multiply_add.h"
+#include "src/__support/FPUtil/sqrt.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/optimization.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) {
+  using FloatBits = fputil::FPBits<float>;
+  using FPBits = fputil::FPBits<float16>;
+
+  FPBits x_abs = FPBits(x).abs();
+  FPBits y_abs = FPBits(y).abs();
+
+  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;
+
+  uint16_t a_u = a_bits.uintval();
+  uint16_t b_u = b_bits.uintval();
+
+  // Note: replacing `a_u >= FPBits::EXP_MASK` with `a_bits.is_inf_or_nan()`
+  // generates extra exponent bit masking instructions on x86-64.
+  if (LIBC_UNLIKELY(a_u >= FPBits::EXP_MASK)) {
+    // x or y is inf or nan
+    if (a_bits.is_signaling_nan() || b_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())
+      return FPBits::inf().get_val();
+    return a_bits.get_val();
+  }
+
+  if (LIBC_UNLIKELY(a_u - b_u >=
+                    static_cast<uint16_t>((FPBits::FRACTION_LEN + 2)
+                                          << FPBits::FRACTION_LEN)))
+    return x_abs.get_val() + y_abs.get_val();
+
+  float ad = fputil::cast<float>(a_bits.get_val());
+  float bd = fputil::cast<float>(b_bits.get_val());
+
+  // These squares are exact.
+  float a_sq = ad * ad;
+  float sum_sq = fputil::multiply_add(bd, bd, a_sq);
+
+  FloatBits result(fputil::sqrt<float>(sum_sq));
+  uint32_t r_u = result.uintval();
+
+  // If any of the sticky bits of the result are non-zero, except the LSB, then
+  // the rounded result is correct.
+  if (LIBC_UNLIKELY(((r_u + 1) & 0x0000'0FFE) == 0)) {
+    float r_d = result.get_val();
+
+    // Perform rounding correction.
+    float sum_sq_lo = fputil::multiply_add(bd, bd, a_sq - sum_sq);
+    float err = sum_sq_lo - fputil::multiply_add(r_d, r_d, -sum_sq);
+
+    if (err > 0) {
+      r_u |= 1;
+    } else if ((err < 0) && (r_u & 1) == 0) {
+      r_u -= 1;
+    } else if ((r_u & 0x0000'1FFF) == 0) {
+      // The rounded result is exact.
+      fputil::clear_except_if_required(FE_INEXACT);
+    }
+    return fputil::cast<float16>(FloatBits(r_u).get_val());
+  }
+
+  return fputil::cast<float16>(result.get_val());
+}
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/hypotf16.h b/libc/src/math/hypotf16.h
new file mode 100644
index 0000000000000..2d37c61b4ee7b
--- /dev/null
+++ b/libc/src/math/hypotf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for hypotf16 ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_MATH_HYPOTF16_H
+#define LLVM_LIBC_SRC_MATH_HYPOTF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+float16 hypotf16(float16 x, float16 y);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_HYPOTF16_H
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index 53ddd301900c0..6daaacac99345 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -1701,6 +1701,17 @@ add_fp_unittest(
     libc.src.__support.FPUtil.fp_bits
 )
 
+add_fp_unittest(
+  hypotf16_test
+  NEED_MPFR
+  SUITE
+    libc-math-unittests
+  SRCS
+    hypotf16_test.cpp
+  DEPENDS
+    libc.src.math.hypotf16
+)
+
 add_fp_unittest(
   nextafter_test
   SUITE
diff --git a/libc/test/src/math/HypotTest.h b/libc/test/src/math/HypotTest.h
index fd0c1b394b8f7..dc73581e67ff0 100644
--- a/libc/test/src/math/HypotTest.h
+++ b/libc/test/src/math/HypotTest.h
@@ -73,7 +73,7 @@ class HypotTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     constexpr StorageType COUNT = 10'001;
     for (unsigned scale = 0; scale < 4; ++scale) {
       StorageType max_value = MAX_SUBNORMAL << scale;
-      StorageType step = (max_value - MIN_SUBNORMAL) / COUNT;
+      StorageType step = (max_value - MIN_SUBNORMAL) / COUNT + 1;
       for (int signs = 0; signs < 4; ++signs) {
         for (StorageType v = MIN_SUBNORMAL, w = max_value;
              v <= max_value && w >= MIN_SUBNORMAL; v += step, w -= step) {
diff --git a/libc/test/src/math/exhaustive/CMakeLists.txt b/libc/test/src/math/exhaustive/CMakeLists.txt
index b1927dbc19a3b..551f449c9c8db 100644
--- a/libc/test/src/math/exhaustive/CMakeLists.txt
+++ b/libc/test/src/math/exhaustive/CMakeLists.txt
@@ -314,6 +314,24 @@ add_fp_unittest(
     -lpthread
 )
 
+add_fp_unittest(
+  hypotf16_test
+  NO_RUN_POSTBUILD
+  NEED_MPFR
+  SUITE
+    libc_math_exhaustive_tests
+  SRCS
+    hypotf16_test.cpp
+  COMPILE_OPTIONS
+    ${libc_opt_high_flag}
+  DEPENDS
+    .exhaustive_test
+    libc.src.math.hypotf16
+    libc.src.__support.FPUtil.fp_bits
+  LINK_LIBRARIES
+    -lpthread
+)
+
 add_fp_unittest(
   fmod_generic_impl_test
   NO_RUN_POSTBUILD
diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp
new file mode 100644
index 0000000000000..3ba752bd81f24
--- /dev/null
+++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp
@@ -0,0 +1,58 @@
+//===-- Exhaustive test for hypotf16 --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "exhaustive_test.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/Hypot.h"
+#include "src/math/hypotf16.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "utils/MPFRWrapper/MPFRUtils.h"
+
+namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
+
+// Range of both inputs: [0, inf]
+static constexpr uint16_t START = 0x0000U;
+static constexpr uint16_t STOP = 0x7C00U;
+
+struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test {
+  using FloatType = float16;
+  using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>;
+  using StorageType = typename FPBits::StorageType;
+
+  uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) {
+    mpfr::ForceRoundingMode r(rounding);
+    if (!r.success)
+      return true;
+    uint16_t xbits = start;
+    uint64_t failed = 0;
+    do {
+      float16 x = FPBits(xbits).get_val();
+      uint16_t ybits = xbits;
+      do {
+        float16 y = FPBits(ybits).get_val();
+        bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y),
+                                  LIBC_NAMESPACE::hypotf16(x, y));
+        // Using MPFR will be much slower.
+        // mpfr::BinaryInput<float16> input{x, y};
+        // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY(
+        //  mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y),
+        // 0.5,
+        //  rounding);
+        failed += (!correct);
+      } while (ybits++ < STOP);
+    } while (xbits++ < stop);
+    return failed;
+  }
+};
+
+using LlvmLibcHypotf16ExhaustiveTest =
+    LlvmLibcExhaustiveMathTest<Hypotf16Checker>;
+
+TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) {
+  test_full_range_all_roundings(START, STOP);
+}
diff --git a/libc/test/src/math/hypotf16_hard_to_round.h b/libc/test/src/math/hypotf16_hard_to_round.h
new file mode 100644
index 0000000000000..15e0dc13adbf3
--- /dev/null
+++ b/libc/test/src/math/hypotf16_hard_to_round.h
@@ -0,0 +1,522 @@
+//===-- Hard-to-round inputs for hypotf16 ----------------------------C++--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H
+#define LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H
+
+#include "utils/MPFRWrapper/MPFRUtils.h"
+
+namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
+
+// 1000 cases where the precise result is between two consecutive
+// Float16 numbers
+constexpr int N_HARD_TO_ROUND = 1000;
+constexpr mpfr::BinaryInput<float16> HYPOTF16_HARD_TO_ROUND[N_HARD_TO_ROUND] = {
+    {0x1.3b8p-5, 0x1.d94p-6},   {0x1.068p-7, 0x1.1ccp-8},
+    {0x1.1dp-3, 0x1.4c8p-5},    {0x1.c38p-2, 0x1.784p-3},
+    {0x1.e3cp-3, 0x1.02p-3},    {0x1.04p-8, 0x1.b3p-11},
+    {0x1.e3p+5, 0x1.928p+4},    {0x1.8bp+4, 0x1.638p+2},
+    {0x1.4fp+1, 0x1.2d8p-1},    {0x1.458p+3, 0x1.0f4p+2},
+    {0x1.c08p+1, 0x1.75cp+0},   {0x1.1fp-13, 0x1.524p-14},
+    {0x1.36p-3, 0x1.2e4p-4},    {0x1.b58p-9, 0x1.3ecp-10},
+    {0x1.d74p+6, 0x1.a7p+6},    {0x1.dc4p-6, 0x1.fcp-7},
+    {0x1.6f8p-3, 0x1.324p-4},   {0x1.86p+13, 0x1.7c4p+12},
+    {0x1.9c8p+4, 0x1.57cp+3},   {0x1.81p+7, 0x1.638p+5},
+    {0x1.488p+9, 0x1.11cp+8},   {0x1.0a8p+12, 0x1.f68p+10},
+    {0x1.008p-8, 0x1.bcp-13},   {0x1.818p-8, 0x1.414p-9},
+    {0x1.efp+1, 0x1.814p+1},    {0x1.b6cp+6, 0x1.11p+6},
+    {0x1.458p+10, 0x1.93p+7},   {0x1.058p+13, 0x1.884p+12},
+    {0x1.ae8p+7, 0x1.0a8p+5},   {0x1.9c8p+7, 0x1.60cp+6},
+    {0x1.2cp+2, 0x1.14cp+1},    {0x1.9bp+13, 0x1.df8p+11},
+    {0x1.b2p+14, 0x1.d1p+11},   {0x1.f8p-10, 0x1.d1cp-10},
+    {0x1.22p-13, 0x1.7b8p-15},  {0x1.cep-13, 0x1.104p-13},
+    {0x1.2e8p+5, 0x1.cep+1},    {0x1.edp-10, 0x1.71cp-10},
+    {0x1.6f8p+12, 0x1.96p+8},   {0x1.e78p+7, 0x1.32p+3},
+    {0x1.2dp-1, 0x1.62cp-2},    {0x1.ab8p-4, 0x1.72p-8},
+    {0x1.ab8p+7, 0x1.398p+5},   {0x1.97p-10, 0x1.1b8p-12},
+    {0x1.eap+5, 0x1.068p+3},    {0x1.fdp+11, 0x1.7dcp+11},
+    {0x1.fbp-14, 0x1.b04p-14},  {0x1.3bp+14, 0x1.6f8p+12},
+    {0x1.4c8p+5, 0x1.c8cp+4},   {0x1.848p-3, 0x1.e1p-6},
+    {0x1.72p+4, 0x1.68cp+3},    {0x1.2a8p-10, 0x1.bfcp-11},
+    {0x1.d8cp+9, 0x1.59p+9},    {0x1.e3p+12, 0x1.a2cp+12},
+    {0x1.81p-8, 0x1.5a8p-10},   {0x1.b48p+3, 0x1.6bcp+2},
+    {0x1.14p+8, 0x1.bbcp+7},    {0x1.72p-1, 0x1.cep-5},
+    {0x1.068p-3, 0x1.aa4p-4},   {0x1.7b8p+5, 0x1.e8cp+4},
+    {0x1.14p-9, 0x1.998p-11},   {0x1.878p+1, 0x1.83cp+0},
+    {0x1.068p+5, 0x1.41cp+4},   {0x1.0bp+14, 0x1.378p+12},
+    {0x1.2dp-2, 0x1.0a4p-3},    {0x1.ed8p+10, 0x1.bdp+7},
+    {0x1.f8p+5, 0x1.158p+4},    {0x1.44p-2, 0x1.62cp-3},
+    {0x1.a4p+11, 0x1.ce8p+9},   {0x1.fbp+5, 0x1.45p+2},
+    {0x1.1dp+4, 0x1.4c8p+2},    {0x1.2a8p-1, 0x1.f18p-3},
+    {0x1.2dp-11, 0x1.0a4p-12},  {0x1.c2p-8, 0x1.b6cp-9},
+    {0x1.adp+12, 0x1.41cp+12},  {0x1.9fp+4, 0x1.758p+2},
+    {0x1.42p-7, 0x1.59p-10},    {0x1.198p-8, 0x1.a64p-9},
+    {0x1.f2cp-2, 0x1.56p-3},    {0x1.e14p-2, 0x1.b9p-2},
+    {0x1.158p+7, 0x1.d5p+4},    {0x1.1f8p+7, 0x1.af4p+6},
+    {0x1.d88p-6, 0x1.8fp-9},    {0x1.38p-8, 0x1.f1p-11},
+    {0x1.3bp-8, 0x1.1cp-13},    {0x1.4a8p-4, 0x1.efcp-5},
+    {0x1.efp-2, 0x1.848p-3},    {0x1.cep-1, 0x1.75cp-1},
+    {0x1.098p+12, 0x1.ba8p+10}, {0x1.1fp+13, 0x1.c08p+11},
+    {0x1.d9p-12, 0x1.5cp-17},   {0x1.89cp+8, 0x1.77p+8},
+    {0x1.158p+0, 0x1.97p-3},    {0x1.d7p+1, 0x1.614p+1},
+    {0x1.b3p+5, 0x1.878p+3},    {0x1.028p-4, 0x1.af4p-5},
+    {0x1.93p-6, 0x1.b3cp-7},    {0x1.4d8p+13, 0x1.f44p+12},
+    {0x1.d4cp+5, 0x1.f4p+4},    {0x1.efp-11, 0x1.59p-14},
+    {0x1.b6cp+11, 0x1.11p+11},  {0x1.328p+11, 0x1.cbcp+10},
+    {0x1.bap+0, 0x1.be4p-1},    {0x1.318p+11, 0x1.ca4p+10},
+    {0x1.74cp-13, 0x1.63p-13},  {0x1.3bp+11, 0x1.1b8p+9},
+    {0x1.278p-5, 0x1.bb4p-6},   {0x1.1f8p+7, 0x1.74cp+6},
+    {0x1.848p-12, 0x1.8bp-15},  {0x1.28p-5, 0x1.59p-8},
+    {0x1.9ep+11, 0x1.87p+8},    {0x1.d38p-10, 0x1.e78p-12},
+    {0x1.abp-8, 0x1.f74p-9},    {0x1.5fp+12, 0x1.c2p+8},
+    {0x1.dbp-13, 0x1.998p-14},  {0x1.0e8p-5, 0x1.95cp-6},
+    {0x1.98p+6, 0x1.8a4p+5},    {0x1.998p+0, 0x1.fbp-3},
+    {0x1.188p+2, 0x1.d38p+0},   {0x1.efp-5, 0x1.814p-5},
+    {0x1.dbp-10, 0x1.464p-10},  {0x1.1a8p-10, 0x1.a7cp-11},
+    {0x1.068p-12, 0x1.41cp-13}, {0x1.ba8p-4, 0x1.448p-6},
+    {0x1.658p+10, 0x1.89cp+9},  {0x1.9c8p+2, 0x1.2e8p+0},
+    {0x1.d88p-12, 0x1.89cp-13}, {0x1.508p+4, 0x1.f8cp+3},
+    {0x1.c2p-8, 0x1.be4p-8},    {0x1.d4cp+9, 0x1.f4p+8},
+    {0x1.198p+5, 0x1.a64p+4},   {0x1.9ap-5, 0x1.44p-10},
+    {0x1.d5p+5, 0x1.5fcp+5},    {0x1.dbp-3, 0x1.ab8p-5},
+    {0x1.efp-14, 0x1.3ecp-14},  {0x1.05p+0, 0x1.c7p-3},
+    {0x1.c7p+15, 0x1.998p+13},  {0x1.658p+7, 0x1.7b8p+5},
+    {0x1.c98p+11, 0x1.7d4p+10}, {0x1.c2p+2, 0x1.a9p-1},
+    {0x1.fdp-9, 0x1.7dcp-9},    {0x1.3bp-6, 0x1.6f8p-8},
+    {0x1.d18p+3, 0x1.de8p+1},   {0x1.2cp+1, 0x1.36p-3},
+    {0x1.458p-4, 0x1.e84p-5},   {0x1.3f8p+8, 0x1.df4p+7},
+    {0x1.c2p+1, 0x1.26p-3},     {0x1.e5p+9, 0x1.6bcp+9},
+    {0x1.e7p+4, 0x1.6d4p+4},    {0x1.318p-12, 0x1.7f4p-13},
+    {0x1.cbp-2, 0x1.0bcp-3},    {0x1.068p-3, 0x1.41cp-4},
+    {0x1.55p+10, 0x1.e78p+8},   {0x1.c5cp+14, 0x1.8cp+14},
+    {0x1.a28p-1, 0x1.ddcp-2},   {0x1.848p-7, 0x1.43cp-8},
+    {0x1.9ecp-6, 0x1.8bp-6},    {0x1.3bp-2, 0x1.364p-3},
+    {0x1.c2p+13, 0x1.26p+9},    {0x1.1b8p-13, 0x1.a94p-14},
+    {0x1.dbp+11, 0x1.ab8p+9},   {0x1.f3p-13, 0x1.764p-13},
+    {0x1.32p+7, 0x1.ae8p+5},    {0x1.2dp-4, 0x1.0a4p-5},
+    {0x1.d8cp+7, 0x1.59p+7},    {0x1.05p+1, 0x1.308p-1},
+    {0x1.d64p+7, 0x1.11p+7},    {0x1.6f8p+7, 0x1.324p+6},
+    {0x1.d88p+8, 0x1.248p+6},   {0x1.008p+5, 0x1.ab8p+3},
+    {0x1.248p+4, 0x1.f2cp+3},   {0x1.e5p-11, 0x1.b48p-13},
+    {0x1.c2p+7, 0x1.964p+7},    {0x1.fa4p+0, 0x1.3bp+0},
+    {0x1.058p-12, 0x1.884p-13}, {0x1.f2p-13, 0x1.228p-14},
+    {0x1.c5cp-14, 0x1.8cp-14},  {0x1.cep+4, 0x1.75cp+4},
+    {0x1.71p+15, 0x1.81p+12},   {0x1.3bp+12, 0x1.644p+11},
+    {0x1.188p-8, 0x1.0cp-13},   {0x1.2fp+9, 0x1.618p+7},
+    {0x1.088p+11, 0x1.8ccp+10}, {0x1.c3p+9, 0x1.524p+9},
+    {0x1.f2cp+8, 0x1.44p+8},    {0x1.11p-7, 0x1.34cp-8},
+    {0x1.efp+9, 0x1.848p+8},    {0x1.fa4p+11, 0x1.0ep+11},
+    {0x1.3e8p-7, 0x1.ddcp-8},   {0x1.288p-13, 0x1.bccp-14},
+    {0x1.518p-8, 0x1.fa4p-9},   {0x1.c7p-3, 0x1.944p-4},
+    {0x1.338p+3, 0x1.c3p+0},    {0x1.1b8p+14, 0x1.d88p+12},
+    {0x1.d7p-5, 0x1.614p-5},    {0x1.9ep+6, 0x1.87p+3},
+    {0x1.e9p+13, 0x1.6ecp+13},  {0x1.9dp-3, 0x1.35cp-3},
+    {0x1.318p+13, 0x1.ca4p+12}, {0x1.11p+1, 0x1.cd4p+0},
+    {0x1.26p-10, 0x1.3bp-13},   {0x1.adp+14, 0x1.13p+11},
+    {0x1.9bcp-7, 0x1.76p-7},    {0x1.e6p-10, 0x1.cbp-13},
+    {0x1.dbp-2, 0x1.86p-6},     {0x1.f2cp+3, 0x1.dbp+3},
+    {0x1.2a8p+3, 0x1.bfcp+2},   {0x1.f2cp+14, 0x1.0ap+14},
+    {0x1.5cp+13, 0x1.b6cp+12},  {0x1.3d8p+3, 0x1.dc4p+2},
+    {0x1.0b8p-10, 0x1.914p-11}, {0x1.5cp+3, 0x1.6dcp+2},
+    {0x1.ba8p+0, 0x1.70cp-1},   {0x1.45p-2, 0x1.20cp-3},
+    {0x1.ab8p+5, 0x1.72p+1},    {0x1.dbp-13, 0x1.86p-17},
+    {0x1.aep-9, 0x1.6a4p-9},    {0x1.298p-13, 0x1.14p-18},
+    {0x1.0f8p-10, 0x1.974p-11}, {0x1.ddp+1, 0x1.65cp+1},
+    {0x1.d88p-6, 0x1.5a8p-8},   {0x1.08p-4, 0x1.04p-9},
+    {0x1.318p-1, 0x1.ca4p-2},   {0x1.45p-8, 0x1.248p-10},
+    {0x1.068p+14, 0x1.1ccp+13}, {0x1.468p+13, 0x1.e9cp+12},
+    {0x1.aa4p-9, 0x1.74p-9},    {0x1.02p+3, 0x1.3e4p+2},
+    {0x1.6bp-11, 0x1.a78p-13},  {0x1.158p-5, 0x1.d5p-8},
+    {0x1.0f8p-4, 0x1.974p-5},   {0x1.1ep-1, 0x1.728p-3},
+    {0x1.a9p+8, 0x1.7e8p+6},    {0x1.86p+13, 0x1.3cp+8},
+    {0x1.c2p+6, 0x1.8ecp+6},    {0x1.238p-4, 0x1.b54p-5},
+    {0x1.3bp-13, 0x1.734p-14},  {0x1.aep-3, 0x1.f2p-7},
+    {0x1.2cp+7, 0x1.36p+3},     {0x1.70cp+13, 0x1.65p+13},
+    {0x1.ed8p-9, 0x1.bdp-12},   {0x1.188p+15, 0x1.248p+13},
...
[truncated]

``````````

</details>


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


More information about the libc-commits mailing list