-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[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
Conversation
@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:
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)
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@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. |
#109201