diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h index 7205d8d41f5bd..d4a4129496640 100644 --- a/libc/src/__support/FPUtil/generic/add_sub.h +++ b/libc/src/__support/FPUtil/generic/add_sub.h @@ -87,8 +87,12 @@ add_or_sub(InType x, InType y) { return OutFPBits::inf(x_bits.sign()).get_val(); } - if (y_bits.is_inf()) - return OutFPBits::inf(y_bits.sign()).get_val(); + if (y_bits.is_inf()) { + if constexpr (IsSub) + return OutFPBits::inf(y_bits.sign().negate()).get_val(); + else + return OutFPBits::inf(y_bits.sign()).get_val(); + } if (x_bits.is_zero()) { if (y_bits.is_zero()) { diff --git a/libc/test/src/math/smoke/AddTest.h b/libc/test/src/math/smoke/AddTest.h index 68a4bbef01a2e..4bd794c91927e 100644 --- a/libc/test/src/math/smoke/AddTest.h +++ b/libc/test/src/math/smoke/AddTest.h @@ -47,6 +47,10 @@ class AddTest : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero)); EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero)); EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero)); + EXPECT_FP_EQ(inf, func(in.zero, in.inf)); + EXPECT_FP_EQ(inf, func(in.neg_zero, in.inf)); + EXPECT_FP_EQ(neg_inf, func(in.zero, in.neg_inf)); + EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.neg_inf)); } void test_invalid_operations(AddFunc func) { diff --git a/libc/test/src/math/smoke/SubTest.h b/libc/test/src/math/smoke/SubTest.h index c344db28b7fc6..4ff4f3dbbbbad 100644 --- a/libc/test/src/math/smoke/SubTest.h +++ b/libc/test/src/math/smoke/SubTest.h @@ -47,6 +47,10 @@ class SubTest : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero)); EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero)); EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero)); + EXPECT_FP_EQ(neg_inf, func(in.zero, in.inf)); + EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.inf)); + EXPECT_FP_EQ(inf, func(in.zero, in.neg_inf)); + EXPECT_FP_EQ(inf, func(in.neg_zero, in.neg_inf)); } void test_invalid_operations(SubFunc func) {