[libc-commits] [libc] [libc][math] Bfloat16 `*= (Multiply assign)` operator support (PR #182882)
via libc-commits
libc-commits at lists.llvm.org
Tue Feb 24 04:44:55 PST 2026
https://github.com/Sukumarsawant updated https://github.com/llvm/llvm-project/pull/182882
>From 2b6c56d51810ef0f5e9f830dfc4aa04022530cd3 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 23 Feb 2026 21:29:54 +0530
Subject: [PATCH 01/15] initial commit for Bfloat16 changes
---
libc/src/__support/FPUtil/bfloat16.h | 5 +
.../src/__support/FPUtil/bfloat16_test.cpp | 154 ++++++++++--------
2 files changed, 90 insertions(+), 69 deletions(-)
diff --git a/libc/src/__support/FPUtil/bfloat16.h b/libc/src/__support/FPUtil/bfloat16.h
index 13e151208567d..7d64b441bf9b2 100644
--- a/libc/src/__support/FPUtil/bfloat16.h
+++ b/libc/src/__support/FPUtil/bfloat16.h
@@ -113,6 +113,11 @@ struct BFloat16 {
LIBC_INLINE BFloat16 operator/(BFloat16 other) const {
return fputil::generic::div<bfloat16>(*this, other);
}
+
+ LIBC_INLINE BFloat16 &operator*=(const BFloat16 &other) {
+ *this = *this * other;
+ return *this;
+ }
}; // struct BFloat16
} // namespace fputil
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index a71d971a9ad3d..820e384e20285 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -1,69 +1,85 @@
-//===-- 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 "test/UnitTest/FPMatcher.h"
-#include "test/UnitTest/Test.h"
-#include "utils/MPFRWrapper/MPCommon.h"
-
-using BFloat16 = LIBC_NAMESPACE::fputil::BFloat16;
-using LlvmLibcBfloat16ConversionTest =
- 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 = 0xff80U;
-
-using MPFRNumber = LIBC_NAMESPACE::testing::mpfr::MPFRNumber;
-
-TEST_F(LlvmLibcBfloat16ConversionTest, ToFloatPositiveRange) {
- 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, static_cast<float>(bf16_num));
-
- // 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(LlvmLibcBfloat16ConversionTest, ToFloatNegativeRange) {
- 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, static_cast<float>(bf16_num));
-
- // 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(LlvmLibcBfloat16ConversionTest, FromInteger) {
- constexpr int RANGE = 100'000;
- for (int i = -RANGE; i <= RANGE; i++) {
- BFloat16 mpfr_bfloat = MPFRNumber(i).as<BFloat16>();
- BFloat16 libc_bfloat{i};
- EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
- }
-}
+//===-- 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 "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+#include "utils/MPFRWrapper/MPCommon.h"
+
+using BFloat16 = LIBC_NAMESPACE::fputil::BFloat16;
+using LlvmLibcBfloat16ConversionTest =
+ 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 = 0xff80U;
+
+using MPFRNumber = LIBC_NAMESPACE::testing::mpfr::MPFRNumber;
+
+TEST_F(LlvmLibcBfloat16ConversionTest, ToFloatPositiveRange) {
+ 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, static_cast<float>(bf16_num));
+
+ // 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(LlvmLibcBfloat16ConversionTest, ToFloatNegativeRange) {
+ 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, static_cast<float>(bf16_num));
+
+ // 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(LlvmLibcBfloat16ConversionTest, FromInteger) {
+ constexpr int RANGE = 100'000;
+ for (int i = -RANGE; i <= RANGE; i++) {
+ BFloat16 mpfr_bfloat = MPFRNumber(i).as<BFloat16>();
+ BFloat16 libc_bfloat{i};
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
+ }
+}
+
+TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
+ for(uint16_t i = POS_START; i<=POS_STOP; i++){
+ for(uint16_t j = POS_START; j<=POS_STOP; j++){
+ BFloat16 a{i}, b{j};
+ MPFRNumber mpfr_a{a}, mpfr_b{j};
+ MPFRNumber mpfr_c = mpfr_a;
+ mpfr_c.mul(mpfr_b);
+ BFloat16 mpfr_bfloat = mpfr_c.as<BFloat16>();
+ a *= b;
+ BFloat16 libc_bfloat = a;
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
+
+ }
+ }
+}
>From bf06aeacbfb1ca0608affd4f582ac683f0d53c10 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 23 Feb 2026 21:30:51 +0530
Subject: [PATCH 02/15] clang-format
---
.../src/__support/FPUtil/bfloat16_test.cpp | 169 +++++++++---------
1 file changed, 84 insertions(+), 85 deletions(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 820e384e20285..48b2dfd5c4f3b 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -1,85 +1,84 @@
-//===-- 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 "test/UnitTest/FPMatcher.h"
-#include "test/UnitTest/Test.h"
-#include "utils/MPFRWrapper/MPCommon.h"
-
-using BFloat16 = LIBC_NAMESPACE::fputil::BFloat16;
-using LlvmLibcBfloat16ConversionTest =
- 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 = 0xff80U;
-
-using MPFRNumber = LIBC_NAMESPACE::testing::mpfr::MPFRNumber;
-
-TEST_F(LlvmLibcBfloat16ConversionTest, ToFloatPositiveRange) {
- 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, static_cast<float>(bf16_num));
-
- // 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(LlvmLibcBfloat16ConversionTest, ToFloatNegativeRange) {
- 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, static_cast<float>(bf16_num));
-
- // 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(LlvmLibcBfloat16ConversionTest, FromInteger) {
- constexpr int RANGE = 100'000;
- for (int i = -RANGE; i <= RANGE; i++) {
- BFloat16 mpfr_bfloat = MPFRNumber(i).as<BFloat16>();
- BFloat16 libc_bfloat{i};
- EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
- }
-}
-
-TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
- for(uint16_t i = POS_START; i<=POS_STOP; i++){
- for(uint16_t j = POS_START; j<=POS_STOP; j++){
- BFloat16 a{i}, b{j};
- MPFRNumber mpfr_a{a}, mpfr_b{j};
- MPFRNumber mpfr_c = mpfr_a;
- mpfr_c.mul(mpfr_b);
- BFloat16 mpfr_bfloat = mpfr_c.as<BFloat16>();
- a *= b;
- BFloat16 libc_bfloat = a;
- EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
-
- }
- }
-}
+//===-- 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 "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+#include "utils/MPFRWrapper/MPCommon.h"
+
+using BFloat16 = LIBC_NAMESPACE::fputil::BFloat16;
+using LlvmLibcBfloat16ConversionTest =
+ 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 = 0xff80U;
+
+using MPFRNumber = LIBC_NAMESPACE::testing::mpfr::MPFRNumber;
+
+TEST_F(LlvmLibcBfloat16ConversionTest, ToFloatPositiveRange) {
+ 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, static_cast<float>(bf16_num));
+
+ // 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(LlvmLibcBfloat16ConversionTest, ToFloatNegativeRange) {
+ 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, static_cast<float>(bf16_num));
+
+ // 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(LlvmLibcBfloat16ConversionTest, FromInteger) {
+ constexpr int RANGE = 100'000;
+ for (int i = -RANGE; i <= RANGE; i++) {
+ BFloat16 mpfr_bfloat = MPFRNumber(i).as<BFloat16>();
+ BFloat16 libc_bfloat{i};
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
+ }
+}
+
+TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
+ for (uint16_t i = POS_START; i <= POS_STOP; i++) {
+ for (uint16_t j = POS_START; j <= POS_STOP; j++) {
+ BFloat16 a{i}, b{j};
+ MPFRNumber mpfr_a{a}, mpfr_b{j};
+ MPFRNumber mpfr_c = mpfr_a;
+ mpfr_c.mul(mpfr_b);
+ BFloat16 mpfr_bfloat = mpfr_c.as<BFloat16>();
+ a *= b;
+ BFloat16 libc_bfloat = a;
+ EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
+ }
+ }
+}
>From 59260a6d18937a663c442bba8cc2d5b1475ff189 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 23 Feb 2026 23:09:40 +0530
Subject: [PATCH 03/15] fixed a typo and testing if it works for 2^32
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 48b2dfd5c4f3b..f369f9655d2a4 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -72,7 +72,7 @@ TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
for (uint16_t i = POS_START; i <= POS_STOP; i++) {
for (uint16_t j = POS_START; j <= POS_STOP; j++) {
BFloat16 a{i}, b{j};
- MPFRNumber mpfr_a{a}, mpfr_b{j};
+ MPFRNumber mpfr_a{a}, mpfr_b{b};
MPFRNumber mpfr_c = mpfr_a;
mpfr_c.mul(mpfr_b);
BFloat16 mpfr_bfloat = mpfr_c.as<BFloat16>();
>From a173c66f3261eb757d50edb44313b12b379c3a07 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 13:30:32 +0530
Subject: [PATCH 04/15] limited tests to imp
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index f369f9655d2a4..87bb57c8d9b23 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -69,9 +69,11 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
}
TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
- for (uint16_t i = POS_START; i <= POS_STOP; i++) {
- for (uint16_t j = POS_START; j <= POS_STOP; j++) {
- BFloat16 a{i}, b{j};
+
+ static constexpr BFloat16 val[] = {zero,neg_zero,inf, neg_inf, min_normal, max_normal, bfloat16(1.0f),bfloat16(-1.0f),bfloat16(2.0f),bfloat16(3.0f)};
+ for(const bfloat16 &x: val){
+ for(const bfloat16 &y:val){
+ BFloat16 a = x, b = y;
MPFRNumber mpfr_a{a}, mpfr_b{b};
MPFRNumber mpfr_c = mpfr_a;
mpfr_c.mul(mpfr_b);
@@ -79,6 +81,7 @@ TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
a *= b;
BFloat16 libc_bfloat = a;
EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
+ }
}
- }
+
}
>From 1779528bb96d636c52c1d5750da879932be53eb5 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 13:31:31 +0530
Subject: [PATCH 05/15] formatted
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 87bb57c8d9b23..259b0f5a8acd2 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -70,9 +70,13 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
- static constexpr BFloat16 val[] = {zero,neg_zero,inf, neg_inf, min_normal, max_normal, bfloat16(1.0f),bfloat16(-1.0f),bfloat16(2.0f),bfloat16(3.0f)};
- for(const bfloat16 &x: val){
- for(const bfloat16 &y:val){
+ static constexpr BFloat16 val[] = {
+ zero, neg_zero, inf,
+ neg_inf, min_normal, max_normal,
+ bfloat16(1.0f), bfloat16(-1.0f), bfloat16(2.0f),
+ bfloat16(3.0f)};
+ for (const bfloat16 &x : val) {
+ for (const bfloat16 &y : val) {
BFloat16 a = x, b = y;
MPFRNumber mpfr_a{a}, mpfr_b{b};
MPFRNumber mpfr_c = mpfr_a;
@@ -81,7 +85,6 @@ TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
a *= b;
BFloat16 libc_bfloat = a;
EXPECT_FP_EQ_ALL_ROUNDING(mpfr_bfloat, libc_bfloat);
- }
}
-
+ }
}
>From ac92342750ba15a66b225a2b2a00ea7c62f42ed0 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 13:51:39 +0530
Subject: [PATCH 06/15] testing if add_sub change fixes
---
libc/src/__support/FPUtil/generic/add_sub.h | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 9f3ecff0eb233..d01dca9806263 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,12 +96,15 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- switch (quick_get_round()) {
- case FE_DOWNWARD:
- return OutFPBits::zero(Sign::NEG).get_val();
- default:
- return OutFPBits::zero(Sign::POS).get_val();
- }
+ if (is_effectively_add) {
+ return OutFPBits::zero(x_bits.sign()).get_val();
+ } else {
+ switch (quick_get_round()) {
+ case FE_DOWNWARD:
+ return OutFPBits::zero(Sign::NEG).get_val();
+ default:
+ return OutFPBits::zero(Sign::POS).get_val();
+ }
}
if constexpr (cpp::is_same_v<InType, bfloat16> &&
>From e0e3c39286a95ba0aa01f2154ebe45151865fc53 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 13:52:09 +0530
Subject: [PATCH 07/15] formatted
---
libc/src/__support/FPUtil/generic/add_sub.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index d01dca9806263..894d80ce42e30 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,7 +96,7 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- if (is_effectively_add) {
+ if (is_effectively_add) {
return OutFPBits::zero(x_bits.sign()).get_val();
} else {
switch (quick_get_round()) {
@@ -105,7 +105,7 @@ add_or_sub(InType x, InType y) {
default:
return OutFPBits::zero(Sign::POS).get_val();
}
- }
+ }
if constexpr (cpp::is_same_v<InType, bfloat16> &&
cpp::is_same_v<OutType, bfloat16>) {
>From 2af40c5b6503ba80f0fbbf2654ac8a728452d6ab Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 14:00:44 +0530
Subject: [PATCH 08/15] syn err
---
libc/src/__support/FPUtil/generic/add_sub.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 894d80ce42e30..9fcbd1f976dfe 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,7 +96,7 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- if (is_effectively_add) {
+ if (is_effectively_add) {
return OutFPBits::zero(x_bits.sign()).get_val();
} else {
switch (quick_get_round()) {
@@ -106,6 +106,7 @@ add_or_sub(InType x, InType y) {
return OutFPBits::zero(Sign::POS).get_val();
}
}
+ }
if constexpr (cpp::is_same_v<InType, bfloat16> &&
cpp::is_same_v<OutType, bfloat16>) {
>From 184cbe529749bd2b08f6d7c000468483859b4daa Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 14:10:30 +0530
Subject: [PATCH 09/15] formatted
---
libc/src/__support/FPUtil/generic/add_sub.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 9fcbd1f976dfe..aabc7fa59d840 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,7 +96,7 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- if (is_effectively_add) {
+ if (is_effectively_add) {
return OutFPBits::zero(x_bits.sign()).get_val();
} else {
switch (quick_get_round()) {
>From 52705f7816e0903c52045210c78b5747b873c15a Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 14:31:48 +0530
Subject: [PATCH 10/15] reverted
---
libc/src/__support/FPUtil/generic/add_sub.h | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index aabc7fa59d840..9f3ecff0eb233 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,15 +96,11 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- if (is_effectively_add) {
- return OutFPBits::zero(x_bits.sign()).get_val();
- } else {
- switch (quick_get_round()) {
- case FE_DOWNWARD:
- return OutFPBits::zero(Sign::NEG).get_val();
- default:
- return OutFPBits::zero(Sign::POS).get_val();
- }
+ switch (quick_get_round()) {
+ case FE_DOWNWARD:
+ return OutFPBits::zero(Sign::NEG).get_val();
+ default:
+ return OutFPBits::zero(Sign::POS).get_val();
}
}
>From 35a8bc5519aa29bb4bba17444eaaae196a28174d Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 14:39:56 +0530
Subject: [PATCH 11/15] testing again
---
libc/src/__support/FPUtil/generic/add_sub.h | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 9f3ecff0eb233..f17a86a98d43c 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,11 +96,15 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- switch (quick_get_round()) {
- case FE_DOWNWARD:
- return OutFPBits::zero(Sign::NEG).get_val();
- default:
+ if (is_effectively_add) {
return OutFPBits::zero(Sign::POS).get_val();
+ } else {
+ switch (quick_get_round()) {
+ case FE_DOWNWARD:
+ return OutFPBits::zero(Sign::NEG).get_val();
+ default:
+ return OutFPBits::zero(Sign::POS).get_val();
+ }
}
}
>From 95f0d6c712550c3ddc594da44e9e37c5edfba930 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 14:49:41 +0530
Subject: [PATCH 12/15] reverted as still gives mismatch
---
libc/src/__support/FPUtil/generic/add_sub.h | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index f17a86a98d43c..9f3ecff0eb233 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -96,15 +96,11 @@ add_or_sub(InType x, InType y) {
if (x_bits.is_zero()) {
if (y_bits.is_zero()) {
- if (is_effectively_add) {
+ switch (quick_get_round()) {
+ case FE_DOWNWARD:
+ return OutFPBits::zero(Sign::NEG).get_val();
+ default:
return OutFPBits::zero(Sign::POS).get_val();
- } else {
- switch (quick_get_round()) {
- case FE_DOWNWARD:
- return OutFPBits::zero(Sign::NEG).get_val();
- default:
- return OutFPBits::zero(Sign::POS).get_val();
- }
}
}
>From 4473db32ae193b4ab4042a41dfe3e5efe7602dbd Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 18:04:42 +0530
Subject: [PATCH 13/15] testing with normal values only
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 259b0f5a8acd2..5f4262e1d053f 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -71,8 +71,6 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
static constexpr BFloat16 val[] = {
- zero, neg_zero, inf,
- neg_inf, min_normal, max_normal,
bfloat16(1.0f), bfloat16(-1.0f), bfloat16(2.0f),
bfloat16(3.0f)};
for (const bfloat16 &x : val) {
>From 937374d6dc46fdcf675aa43a2118973946c0204b Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 18:05:26 +0530
Subject: [PATCH 14/15] formatted
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 5f4262e1d053f..fba8b93b5d1ee 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -70,9 +70,8 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
- static constexpr BFloat16 val[] = {
- bfloat16(1.0f), bfloat16(-1.0f), bfloat16(2.0f),
- bfloat16(3.0f)};
+ static constexpr BFloat16 val[] = {bfloat16(1.0f), bfloat16(-1.0f),
+ bfloat16(2.0f), bfloat16(3.0f)};
for (const bfloat16 &x : val) {
for (const bfloat16 &y : val) {
BFloat16 a = x, b = y;
>From 755ee95a9cb16d03bf00539e08f98838b213f41c Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 18:14:28 +0530
Subject: [PATCH 15/15] only unsigned
---
libc/test/src/__support/FPUtil/bfloat16_test.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index fba8b93b5d1ee..3d8dcdf46bb25 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -70,7 +70,7 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
- static constexpr BFloat16 val[] = {bfloat16(1.0f), bfloat16(-1.0f),
+ static constexpr BFloat16 val[] = {bfloat16(1.0f), bfloat16(4.0f),
bfloat16(2.0f), bfloat16(3.0f)};
for (const bfloat16 &x : val) {
for (const bfloat16 &y : val) {
More information about the libc-commits
mailing list