Skip to content

[libc][[math] Implement IsZero Macro #109336

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Sep 20, 2024
Merged

[libc][[math] Implement IsZero Macro #109336

merged 9 commits into from
Sep 20, 2024

Conversation

Sh0g0-1758
Copy link
Member

@Sh0g0-1758 Sh0g0-1758 marked this pull request as ready for review September 19, 2024 21:42
@llvmbot llvmbot added the libc label Sep 19, 2024
@llvmbot
Copy link
Member

llvmbot commented Sep 19, 2024

@llvm/pr-subscribers-libc

Author: Shourya Goel (Sh0g0-1758)

Changes

#109201


Full diff: https://github.com/llvm/llvm-project/pull/109336.diff

7 Files Affected:

  • (modified) libc/include/llvm-libc-macros/math-function-macros.h (+1)
  • (modified) libc/test/include/CMakeLists.txt (+45)
  • (added) libc/test/include/IsZeroTest.h (+38)
  • (added) libc/test/include/iszero_test.c (+25)
  • (added) libc/test/include/iszero_test.cpp (+12)
  • (added) libc/test/include/iszerof_test.cpp (+12)
  • (added) libc/test/include/iszerol_test.cpp (+12)
diff --git a/libc/include/llvm-libc-macros/math-function-macros.h b/libc/include/llvm-libc-macros/math-function-macros.h
index 8d18997bed8d26..eee7f969dfb4c2 100644
--- a/libc/include/llvm-libc-macros/math-function-macros.h
+++ b/libc/include/llvm-libc-macros/math-function-macros.h
@@ -13,5 +13,6 @@
 #define isinf(x) __builtin_isinf(x)
 #define isnan(x) __builtin_isnan(x)
 #define signbit(x) __builtin_signbit(x)
+#define iszero(x) __builtin_iszero(x)
 
 #endif // LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H
diff --git a/libc/test/include/CMakeLists.txt b/libc/test/include/CMakeLists.txt
index 32513f234b9b99..1a2f18731565c2 100644
--- a/libc/test/include/CMakeLists.txt
+++ b/libc/test/include/CMakeLists.txt
@@ -81,6 +81,36 @@ add_libc_test(
     libc.include.llvm-libc-macros.stdckdint_macros
 )
 
+add_libc_test(
+  iszero_test
+  SUITE
+    libc_include_tests
+  SRCS
+    iszero_test.cpp
+  DEPENDS
+    libc.include.llvm-libc-macros.math_function_macros
+)
+
+add_libc_test(
+  iszerof_test
+  SUITE
+    libc_include_tests
+  SRCS
+    iszerof_test.cpp
+  DEPENDS
+    libc.include.llvm-libc-macros.math_function_macros
+)
+
+add_libc_test(
+  iszerol_test
+  SUITE
+    libc_include_tests
+  SRCS
+    iszerol_test.cpp
+  DEPENDS
+    libc.include.llvm-libc-macros.math_function_macros
+)
+
 add_libc_test(
   signbit_test
   SUITE
@@ -260,3 +290,18 @@ add_libc_test(
   DEPENDS
     libc.include.llvm-libc-macros.math_function_macros
 )
+
+add_libc_test(
+  iszero_c_test
+  C_TEST
+  UNIT_TEST_ONLY
+  SUITE
+    libc_include_tests
+  SRCS
+    iszero_test.c
+  COMPILE_OPTIONS
+    -Wall
+    -Werror
+  DEPENDS
+    libc.include.llvm-libc-macros.math_function_macros
+)
diff --git a/libc/test/include/IsZeroTest.h b/libc/test/include/IsZeroTest.h
new file mode 100644
index 00000000000000..f15bca9e7d487d
--- /dev/null
+++ b/libc/test/include/IsZeroTest.h
@@ -0,0 +1,38 @@
+//===-- Utility class to test the iszero macro  -----------------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TEST_INCLUDE_MATH_ISZERO_H
+#define LLVM_LIBC_TEST_INCLUDE_MATH_ISZERO_H
+
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include "include/llvm-libc-macros/math-function-macros.h"
+
+template <typename T> class IsZeroTest : public LIBC_NAMESPACE::testing::Test {
+  DECLARE_SPECIAL_CONSTANTS(T)
+
+public:
+  typedef int (*IsZeroFunc)(T);
+
+  void testSpecialNumbers(IsZeroFunc func) {
+    EXPECT_EQ(func(inf), 0);
+    EXPECT_EQ(func(neg_inf), 0);
+    EXPECT_EQ(func(zero), 1);
+    EXPECT_EQ(func(neg_zero), 1);
+  }
+};
+
+#define LIST_ISZERO_TESTS(T, func)                                             \
+  using LlvmLibcIsZeroTest = IsZeroTest<T>;                                    \
+  TEST_F(LlvmLibcIsZeroTest, SpecialNumbers) {                                 \
+    auto iszero_func = [](T x) { return func(x); };                            \
+    testSpecialNumbers(iszero_func);                                           \
+  }
+
+#endif // LLVM_LIBC_TEST_INCLUDE_MATH_ISZERO_H
diff --git a/libc/test/include/iszero_test.c b/libc/test/include/iszero_test.c
new file mode 100644
index 00000000000000..be2d34ae3e395b
--- /dev/null
+++ b/libc/test/include/iszero_test.c
@@ -0,0 +1,25 @@
+//===-- Unittests for iszero macro ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDSList-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#include "include/llvm-libc-macros/math-function-macros.h"
+
+#include <assert.h>
+
+// check if macro is defined
+#ifndef iszero
+#error "iszero macro is not defined"
+#else
+int main(void) {
+  assert(iszero(1.0f) == 0);
+  assert(iszero(1.0) == 0);
+  assert(iszero(1.0L) == 0);
+  assert(iszero(0.0f) == 1);
+  assert(iszero(0.0) == 1);
+  assert(iszero(0.0L) == 1);
+  return 0;
+}
+#endif
diff --git a/libc/test/include/iszero_test.cpp b/libc/test/include/iszero_test.cpp
new file mode 100644
index 00000000000000..c47809708e0bc5
--- /dev/null
+++ b/libc/test/include/iszero_test.cpp
@@ -0,0 +1,12 @@
+//===-- Unittest for iszero[d] macro --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDSList-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "IsZeroTest.h"
+#include "include/llvm-libc-macros/math-function-macros.h"
+
+LIST_ISZERO_TESTS(double, iszero)
diff --git a/libc/test/include/iszerof_test.cpp b/libc/test/include/iszerof_test.cpp
new file mode 100644
index 00000000000000..8bf5319f6e9be5
--- /dev/null
+++ b/libc/test/include/iszerof_test.cpp
@@ -0,0 +1,12 @@
+//===-- Unittest for iszero[f] macro --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDSList-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "IsZeroTest.h"
+#include "include/llvm-libc-macros/math-function-macros.h"
+
+LIST_ISZERO_TESTS(float, iszero)
diff --git a/libc/test/include/iszerol_test.cpp b/libc/test/include/iszerol_test.cpp
new file mode 100644
index 00000000000000..1b1249f9f0552a
--- /dev/null
+++ b/libc/test/include/iszerol_test.cpp
@@ -0,0 +1,12 @@
+//===-- Unittest for iszero[l] macro --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDSList-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "IsZeroTest.h"
+#include "include/llvm-libc-macros/math-function-macros.h"
+
+LIST_ISZERO_TESTS(long double, iszero)

Copy link
Contributor

@michaelrj-google michaelrj-google left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Sh0g0-1758
Copy link
Member Author

@michaelrj-google could you please take a look at the buildkite output and help me understand why its failing ? I don't think that the tests I introduced are failing. Also I don't have push rights yet so if the PR looks good, please merge it from your end.

@lntue lntue merged commit 739ede4 into llvm:main Sep 20, 2024
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants