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

via libc-commits libc-commits at lists.llvm.org
Tue Feb 24 00:22:47 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 1/7] 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 2/7] 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 3/7] 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 4/7] 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 5/7] 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 6/7] 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 7/7] 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>) {



More information about the libc-commits mailing list