[libc-commits] [libc] [libc][math][c++23] Add bfloat16 support in LLVM libc (PR #144463)
via libc-commits
libc-commits at lists.llvm.org
Sun Jul 6 20:16:45 PDT 2025
================
@@ -0,0 +1,73 @@
+//===-- Unit tests for bfloat16 type --------------------------------------===//
+//
+// 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/__support/FPUtil/bfloat16.h"
+
+#include "utils/MPFRWrapper/MPCommon.h"
+
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using LlvmLibcBfloat16ToFloatTest = LIBC_NAMESPACE::testing::FPTest<bfloat16>;
+
+// range: [0, inf]
+static constexpr uint16_t POS_START = 0x0000U;
+static constexpr uint16_t POS_STOP = 0x7f80U;
+
+// range: [-0, -inf]
+static constexpr uint16_t NEG_START = 0x8000U;
+static constexpr uint16_t NEG_STOP = 0xff80;
+
+using MPFRNumber = LIBC_NAMESPACE::testing::mpfr::MPFRNumber;
+
+TEST_F(LlvmLibcBfloat16ToFloatTest, PositiveRange) {
+ for (uint16_t bits = POS_START; bits <= POS_STOP; bits++) {
+ bfloat16 bf16_num{bits};
+ MPFRNumber mpfr_num{bf16_num};
+
+ // bfloat16 to float
+ float mpfr_float = mpfr_num.as<float>();
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_float, bf16_num.as_float());
+
+ // float to bfloat16
+ bfloat16 bf16_from_float{mpfr_float};
+ MPFRNumber mpfr_num_2{mpfr_float};
+ bfloat16 mpfr_bfloat = mpfr_num_2.as<bfloat16>();
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, bf16_from_float);
+ }
+}
+
+TEST_F(LlvmLibcBfloat16ToFloatTest, NegativeRange) {
+ for (uint16_t bits = NEG_START; bits <= NEG_STOP; bits++) {
+ bfloat16 bf16_num{bits};
+ MPFRNumber mpfr_num{bf16_num};
+
+ // bfloat16 to float
+ float mpfr_float = mpfr_num.as<float>();
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_float, bf16_num.as_float());
+
+ // float to bfloat16
+ bfloat16 bf16_from_float{mpfr_float};
+ MPFRNumber mpfr_num_2{mpfr_float};
+ bfloat16 mpfr_bfloat = mpfr_num_2.as<bfloat16>();
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, bf16_from_float);
+ }
+}
+
+TEST_F(LlvmLibcBfloat16ToFloatTest, SpecialIntegers) {
+ const auto test_for_int = [&](const int i) {
+ const auto mpfr_bfloat = MPFRNumber(i).as<bfloat16>();
----------------
overmighty wrote:
Using `auto` here instead of `bfloat16` is inconsistent with the code above. No need for all the `const`s.
https://github.com/llvm/llvm-project/pull/144463
More information about the libc-commits
mailing list