[libc-commits] [libc] [libc][math] Fix sNaN tests for AArch64 (PR #159483)

Krishna Pandey via libc-commits libc-commits at lists.llvm.org
Wed Sep 17 16:54:07 PDT 2025


https://github.com/krishna2803 created https://github.com/llvm/llvm-project/pull/159483

Fixes: #134917, https://github.com/llvm/llvm-project/pull/100632#issuecomment-2258772681, #159417

>From 6309b08e594baf02d70b8e5ad1c52fbf2b05a85f Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Thu, 18 Sep 2025 05:12:30 +0530
Subject: [PATCH 1/4] refactor: EXPECT_FP_EQUAL(aNaN,...) ->
 EXPECT_FP_IS_NAN(...)

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/test/src/math/smoke/asinpif16_test.cpp | 27 ++++++++-------------
 libc/test/src/math/smoke/cospif16_test.cpp  |  8 +++---
 libc/test/src/math/smoke/expf16_test.cpp    |  4 +--
 3 files changed, 16 insertions(+), 23 deletions(-)

diff --git a/libc/test/src/math/smoke/asinpif16_test.cpp b/libc/test/src/math/smoke/asinpif16_test.cpp
index 328da7fb0606f..9589901715075 100644
--- a/libc/test/src/math/smoke/asinpif16_test.cpp
+++ b/libc/test/src/math/smoke/asinpif16_test.cpp
@@ -21,44 +21,37 @@ TEST_F(LlvmLibcAsinpif16Test, SpecialNumbers) {
   EXPECT_FP_EQ(-0.5f16, LIBC_NAMESPACE::asinpif16(-1.0));
 
   // NaN inputs
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(FPBits::quiet_nan().get_val()));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::asinpif16(aNaN));
 
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(FPBits::signaling_nan().get_val()));
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::asinpif16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
   // infinity inputs -> should return NaN
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), LIBC_NAMESPACE::asinpif16(inf));
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::asinpif16(inf), FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(neg_inf));
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::asinpif16(neg_inf),
+                                  FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 }
 
 TEST_F(LlvmLibcAsinpif16Test, OutOfRange) {
   // Test values > 1
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(1.5f16));
+  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinpif16(1.5f16));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(2.0f16));
+  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinpif16(2.0f16));
   EXPECT_MATH_ERRNO(EDOM);
 
   // Test values < -1
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(-1.5f16));
+  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinpif16(-1.5f16));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(-2.0f16));
+  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinpif16(-2.0f16));
   EXPECT_MATH_ERRNO(EDOM);
 
   // Test maximum normal value (should be > 1 for float16)
-  EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
-               LIBC_NAMESPACE::asinpif16(FPBits::max_normal().get_val()));
+  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinpif16(FPBits::max_normal().get_val()));
   EXPECT_MATH_ERRNO(EDOM);
 }
 
diff --git a/libc/test/src/math/smoke/cospif16_test.cpp b/libc/test/src/math/smoke/cospif16_test.cpp
index dadf0cf7b553b..307e483d8ab8d 100644
--- a/libc/test/src/math/smoke/cospif16_test.cpp
+++ b/libc/test/src/math/smoke/cospif16_test.cpp
@@ -15,10 +15,10 @@
 using LlvmLibcCospif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
 
 TEST_F(LlvmLibcCospif16Test, SpecialNumbers) {
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cospif16(sNaN), FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::cospif16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospif16(aNaN));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::cospif16(aNaN));
   EXPECT_MATH_ERRNO(0);
 
   EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospif16(zero));
@@ -27,10 +27,10 @@ TEST_F(LlvmLibcCospif16Test, SpecialNumbers) {
   EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospif16(neg_zero));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospif16(inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::cospif16(inf));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospif16(neg_inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::cospif16(neg_inf));
   EXPECT_MATH_ERRNO(EDOM);
 }
 
diff --git a/libc/test/src/math/smoke/expf16_test.cpp b/libc/test/src/math/smoke/expf16_test.cpp
index 85988c5518787..6334a31e6c397 100644
--- a/libc/test/src/math/smoke/expf16_test.cpp
+++ b/libc/test/src/math/smoke/expf16_test.cpp
@@ -16,10 +16,10 @@
 using LlvmLibcExpf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
 
 TEST_F(LlvmLibcExpf16Test, SpecialNumbers) {
-  EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::expf16(aNaN));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::expf16(aNaN));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::expf16(sNaN), FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::expf16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
   EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::expf16(inf));

>From db213cce4ac4739fcb1ae6b2818f88fa43169771 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Thu, 18 Sep 2025 05:13:03 +0530
Subject: [PATCH 2/4] fix: make sNaN simply const rather than static constexpr

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/test/UnitTest/FPMatcher.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libc/test/UnitTest/FPMatcher.h b/libc/test/UnitTest/FPMatcher.h
index 592cd1b3f37ab..6a68211e6d849 100644
--- a/libc/test/UnitTest/FPMatcher.h
+++ b/libc/test/UnitTest/FPMatcher.h
@@ -177,7 +177,8 @@ template <typename T> struct FPTest : public ErrnoCheckingTest {
   static constexpr T neg_zero = FPBits::zero(Sign::NEG).get_val();
   static constexpr T aNaN = FPBits::quiet_nan(Sign::POS).get_val();
   static constexpr T neg_aNaN = FPBits::quiet_nan(Sign::NEG).get_val();
-  static constexpr T sNaN = FPBits::signaling_nan().get_val();
+  // TODO: make this static constexpr
+  const T sNaN = FPBits::signaling_nan().get_val();
   static constexpr T inf = FPBits::inf(Sign::POS).get_val();
   static constexpr T neg_inf = FPBits::inf(Sign::NEG).get_val();
   static constexpr T min_normal = FPBits::min_normal().get_val();

>From 21997656a93747f9c621be75ba5724c5f082f1f7 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Thu, 18 Sep 2025 05:13:20 +0530
Subject: [PATCH 3/4] chore: re-enable entrypoints for AAarch64

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/config/linux/aarch64/entrypoints.txt | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 00c4b2ec0f828..e38fc857d4e16 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -659,16 +659,13 @@ endif()
 if(LIBC_TYPES_HAS_FLOAT16)
   list(APPEND TARGET_LIBM_ENTRYPOINTS
     # math.h C23 _Float16 entrypoints
-    # libc.src.math.acoshf16
+    libc.src.math.acoshf16
     libc.src.math.asinpif16
     libc.src.math.canonicalizef16
     libc.src.math.ceilf16
     libc.src.math.copysignf16
-    #TODO: Aarch64 bug https://github.com/llvm/llvm-project/issues/134917
-    # libc.src.math.cospif16
-    # TODO: aarch64 bug
-    # Please see https://github.com/llvm/llvm-project/pull/100632#issuecomment-2258772681
-    # libc.src.math.expf16
+    libc.src.math.cospif16
+    libc.src.math.expf16
     libc.src.math.f16add
     libc.src.math.f16addf
     # libc.src.math.f16addl
@@ -740,8 +737,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
     libc.src.math.scalbnf16
     libc.src.math.setpayloadf16
     libc.src.math.setpayloadsigf16
-    #TODO: Aarch64 bug https://github.com/llvm/llvm-project/issues/134917
-    # libc.src.math.sinpif16
+    libc.src.math.sinpif16
     libc.src.math.sqrtf16
     libc.src.math.totalorderf16
     libc.src.math.totalordermagf16

>From d852ab78e58d42d5f808539c3bb01e2afcd9d7f0 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Thu, 18 Sep 2025 05:18:43 +0530
Subject: [PATCH 4/4] refactor: EXPECT_FP_EQUAL(aNaN,...) ->
 EXPECT_FP_IS_NAN(...)

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/test/src/math/smoke/acoshf16_test.cpp  | 31 ++++++++++-----------
 libc/test/src/math/smoke/acospif16_test.cpp | 13 ++++-----
 libc/test/src/math/smoke/sinpif16_test.cpp  |  8 +++---
 3 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/libc/test/src/math/smoke/acoshf16_test.cpp b/libc/test/src/math/smoke/acoshf16_test.cpp
index b020de40b51ed..88776b8c42eb2 100644
--- a/libc/test/src/math/smoke/acoshf16_test.cpp
+++ b/libc/test/src/math/smoke/acoshf16_test.cpp
@@ -15,54 +15,51 @@
 using LlvmLibcAcoshf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
 
 TEST_F(LlvmLibcAcoshf16Test, SpecialNumbers) {
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acoshf16(aNaN));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acoshf16(aNaN));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acoshf16(sNaN), FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::acoshf16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acoshf16(zero), FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::acoshf16(zero), FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acoshf16(neg_zero));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acoshf16(neg_zero));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acoshf16(neg_zero),
-                              FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::acoshf16(neg_zero),
+                                  FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
   EXPECT_FP_EQ(inf, LIBC_NAMESPACE::acoshf16(inf));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acoshf16(neg_inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acoshf16(neg_inf));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acoshf16(neg_inf),
-                              FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::acoshf16(neg_inf),
+                                  FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
   EXPECT_FP_EQ(zero, LIBC_NAMESPACE::acoshf16(
                          LIBC_NAMESPACE::fputil::cast<float16>(1.0)));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acoshf16(
-                         LIBC_NAMESPACE::fputil::cast<float16>(0.5)));
+  EXPECT_FP_IS_NAN(
+      LIBC_NAMESPACE::acoshf16(LIBC_NAMESPACE::fputil::cast<float16>(0.5)));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(
-      aNaN,
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(
       LIBC_NAMESPACE::acoshf16(LIBC_NAMESPACE::fputil::cast<float16>(-1.0)),
       FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(
-      aNaN,
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(
       LIBC_NAMESPACE::acoshf16(LIBC_NAMESPACE::fputil::cast<float16>(-2.0)),
       FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(
-      aNaN,
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(
       LIBC_NAMESPACE::acoshf16(LIBC_NAMESPACE::fputil::cast<float16>(-3.0)),
       FE_INVALID);
   EXPECT_MATH_ERRNO(EDOM);
diff --git a/libc/test/src/math/smoke/acospif16_test.cpp b/libc/test/src/math/smoke/acospif16_test.cpp
index 0669d21a8d99c..79618b54c3d1d 100644
--- a/libc/test/src/math/smoke/acospif16_test.cpp
+++ b/libc/test/src/math/smoke/acospif16_test.cpp
@@ -13,25 +13,24 @@
 
 using LlvmLibcAcospif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
 TEST_F(LlvmLibcAcospif16Test, SpecialNumbers) {
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acospif16(aNaN));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acospif16(aNaN));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acospif16(sNaN),
-                              FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::acospif16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
   EXPECT_FP_EQ(zero, LIBC_NAMESPACE::acospif16(1.0f));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acospif16(inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acospif16(inf));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acospif16(neg_inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acospif16(neg_inf));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acospif16(2.0f));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acospif16(2.0f));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::acospif16(-2.0f));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::acospif16(-2.0f));
   EXPECT_MATH_ERRNO(EDOM);
 }
diff --git a/libc/test/src/math/smoke/sinpif16_test.cpp b/libc/test/src/math/smoke/sinpif16_test.cpp
index 0b4ec915a5cee..e56514ac25fc0 100644
--- a/libc/test/src/math/smoke/sinpif16_test.cpp
+++ b/libc/test/src/math/smoke/sinpif16_test.cpp
@@ -15,10 +15,10 @@
 using LlvmLibcSinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
 
 TEST_F(LlvmLibcSinpif16Test, SpecialNumbers) {
-  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinpif16(sNaN), FE_INVALID);
+  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::sinpif16(sNaN), FE_INVALID);
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinpif16(aNaN));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::sinpif16(aNaN));
   EXPECT_MATH_ERRNO(0);
 
   EXPECT_FP_EQ(zero, LIBC_NAMESPACE::sinpif16(zero));
@@ -27,10 +27,10 @@ TEST_F(LlvmLibcSinpif16Test, SpecialNumbers) {
   EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::sinpif16(neg_zero));
   EXPECT_MATH_ERRNO(0);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinpif16(inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::sinpif16(inf));
   EXPECT_MATH_ERRNO(EDOM);
 
-  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinpif16(neg_inf));
+  EXPECT_FP_IS_NAN(LIBC_NAMESPACE::sinpif16(neg_inf));
   EXPECT_MATH_ERRNO(EDOM);
 }
 



More information about the libc-commits mailing list