[libc-commits] [libc] [libc][math] Bfloat16 `*= (Multiply assign)` operator support (PR #182882)

via libc-commits libc-commits at lists.llvm.org
Tue Feb 24 07:49:41 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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) {

>From 848d714778fc9ee36eb306bd0333eede48fa7b2f Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 18:41:14 +0530
Subject: [PATCH 16/17] reverted back to checking imporatants

---
 libc/test/src/__support/FPUtil/bfloat16_test.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 3d8dcdf46bb25..259b0f5a8acd2 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -70,8 +70,11 @@ TEST_F(LlvmLibcBfloat16ConversionTest, FromInteger) {
 
 TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
 
-  static constexpr BFloat16 val[] = {bfloat16(1.0f), bfloat16(4.0f),
-                                     bfloat16(2.0f), bfloat16(3.0f)};
+  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;

>From 0a318a779bb2eb8c7814ee50fbd7a563d7cf78c3 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Tue, 24 Feb 2026 21:11:57 +0530
Subject: [PATCH 17/17] fixed along with adding smoke tests

---
 libc/test/src/__support/FPUtil/bfloat16_test.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/libc/test/src/__support/FPUtil/bfloat16_test.cpp b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
index 259b0f5a8acd2..2eaad29a65bd0 100644
--- a/libc/test/src/__support/FPUtil/bfloat16_test.cpp
+++ b/libc/test/src/__support/FPUtil/bfloat16_test.cpp
@@ -79,8 +79,7 @@ TEST_F(LlvmLibcBfloat16ConversionTest, MultiplyAssign) {
     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);
+      MPFRNumber mpfr_c = mpfr_a.mul(mpfr_b);
       BFloat16 mpfr_bfloat = mpfr_c.as<BFloat16>();
       a *= b;
       BFloat16 libc_bfloat = a;



More information about the libc-commits mailing list