[libc-commits] [libc] [libc] move non <bit> functions to math_extras (PR #84818)
Nick Desaulniers via libc-commits
libc-commits at lists.llvm.org
Mon Mar 11 12:50:12 PDT 2024
https://github.com/nickdesaulniers created https://github.com/llvm/llvm-project/pull/84818
As per TODOs added in
https://github.com/llvm/llvm-project/pull/84035/commits/48b0bc837085a38ff1de33010d9222363f70238f.
>From accd5940c5c18a9d7e40bca453f12b733b6da7dd Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <ndesaulniers at google.com>
Date: Mon, 11 Mar 2024 11:20:14 -0700
Subject: [PATCH] [libc] move non <bit> functions to math_extras
As per TODOs added in
https://github.com/llvm/llvm-project/pull/84035/commits/48b0bc837085a38ff1de33010d9222363f70238f.
---
libc/src/__support/CMakeLists.txt | 1 +
libc/src/__support/CPP/bit.h | 37 ---------------
libc/src/__support/math_extras.h | 37 ++++++++++++++-
libc/src/stdbit/CMakeLists.txt | 46 +++++++++++--------
libc/src/stdbit/stdc_count_zeros_uc.cpp | 4 +-
libc/src/stdbit/stdc_count_zeros_ui.cpp | 4 +-
libc/src/stdbit/stdc_count_zeros_ul.cpp | 4 +-
libc/src/stdbit/stdc_count_zeros_ull.cpp | 4 +-
libc/src/stdbit/stdc_count_zeros_us.cpp | 4 +-
libc/src/stdbit/stdc_first_leading_one_uc.cpp | 4 +-
libc/src/stdbit/stdc_first_leading_one_ui.cpp | 4 +-
libc/src/stdbit/stdc_first_leading_one_ul.cpp | 4 +-
.../src/stdbit/stdc_first_leading_one_ull.cpp | 4 +-
libc/src/stdbit/stdc_first_leading_one_us.cpp | 4 +-
.../src/stdbit/stdc_first_leading_zero_uc.cpp | 4 +-
.../src/stdbit/stdc_first_leading_zero_ui.cpp | 4 +-
.../src/stdbit/stdc_first_leading_zero_ul.cpp | 4 +-
.../stdbit/stdc_first_leading_zero_ull.cpp | 4 +-
.../src/stdbit/stdc_first_leading_zero_us.cpp | 4 +-
.../src/stdbit/stdc_first_trailing_one_uc.cpp | 4 +-
.../src/stdbit/stdc_first_trailing_one_ui.cpp | 4 +-
.../src/stdbit/stdc_first_trailing_one_ul.cpp | 4 +-
.../stdbit/stdc_first_trailing_one_ull.cpp | 4 +-
.../src/stdbit/stdc_first_trailing_one_us.cpp | 4 +-
.../stdbit/stdc_first_trailing_zero_uc.cpp | 4 +-
.../stdbit/stdc_first_trailing_zero_ui.cpp | 4 +-
.../stdbit/stdc_first_trailing_zero_ul.cpp | 4 +-
.../stdbit/stdc_first_trailing_zero_ull.cpp | 4 +-
.../stdbit/stdc_first_trailing_zero_us.cpp | 4 +-
libc/test/src/__support/CPP/bit_test.cpp | 32 -------------
libc/test/src/__support/math_extras_test.cpp | 40 ++++++++++++++++
31 files changed, 154 insertions(+), 139 deletions(-)
diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt
index 2e5a026bf423cd..4c1f271e1df43a 100644
--- a/libc/src/__support/CMakeLists.txt
+++ b/libc/src/__support/CMakeLists.txt
@@ -34,6 +34,7 @@ add_header_library(
HDRS
math_extras.h
DEPENDS
+ libc.src.__support.CPP.bit
libc.src.__support.CPP.limits
libc.src.__support.CPP.type_traits
libc.src.__support.macros.attributes
diff --git a/libc/src/__support/CPP/bit.h b/libc/src/__support/CPP/bit.h
index 1a05728b850653..3f2fbec944054c 100644
--- a/libc/src/__support/CPP/bit.h
+++ b/libc/src/__support/CPP/bit.h
@@ -239,36 +239,6 @@ LIBC_INLINE constexpr To bit_or_static_cast(const From &from) {
}
}
-// TODO: remove from 'bit.h' as it is not a standard function.
-template <typename T>
-[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
-first_leading_zero(T value) {
- return value == cpp::numeric_limits<T>::max() ? 0 : countl_one(value) + 1;
-}
-
-// TODO: remove from 'bit.h' as it is not a standard function.
-template <typename T>
-[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
-first_leading_one(T value) {
- return first_leading_zero(static_cast<T>(~value));
-}
-
-// TODO: remove from 'bit.h' as it is not a standard function.
-template <typename T>
-[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
-first_trailing_zero(T value) {
- return value == cpp::numeric_limits<T>::max()
- ? 0
- : countr_zero(static_cast<T>(~value)) + 1;
-}
-
-// TODO: remove from 'bit.h' as it is not a standard function.
-template <typename T>
-[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
-first_trailing_one(T value) {
- return value == cpp::numeric_limits<T>::max() ? 0 : countr_zero(value) + 1;
-}
-
/// Count number of 1's aka population count or Hamming weight.
///
/// Only unsigned integral types are allowed.
@@ -294,13 +264,6 @@ ADD_SPECIALIZATION(unsigned long long, __builtin_popcountll)
// TODO: 128b specializations?
#undef ADD_SPECIALIZATION
-// TODO: remove from 'bit.h' as it is not a standard function.
-template <typename T>
-[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
-count_zeros(T value) {
- return popcount<T>(static_cast<T>(~value));
-}
-
} // namespace LIBC_NAMESPACE::cpp
#endif // LLVM_LIBC_SRC___SUPPORT_CPP_BIT_H
diff --git a/libc/src/__support/math_extras.h b/libc/src/__support/math_extras.h
index c6b458ddecdabf..28ee1be8b99997 100644
--- a/libc/src/__support/math_extras.h
+++ b/libc/src/__support/math_extras.h
@@ -10,7 +10,8 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H
#define LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H
-#include "src/__support/CPP/limits.h" // CHAR_BIT
+#include "src/__support/CPP/bit.h" // countl_one, countr_zero
+#include "src/__support/CPP/limits.h" // CHAR_BIT, numeric_limits
#include "src/__support/CPP/type_traits.h" // is_unsigned_v
#include "src/__support/macros/attributes.h" // LIBC_INLINE
#include "src/__support/macros/config.h" // LIBC_HAS_BUILTIN
@@ -226,6 +227,40 @@ sub_with_borrow<unsigned long long>(unsigned long long a, unsigned long long b,
#endif // LIBC_HAS_BUILTIN(__builtin_subc)
+template <typename T>
+[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
+first_leading_zero(T value) {
+ return value == cpp::numeric_limits<T>::max() ? 0
+ : cpp::countl_one(value) + 1;
+}
+
+template <typename T>
+[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
+first_leading_one(T value) {
+ return first_leading_zero(static_cast<T>(~value));
+}
+
+template <typename T>
+[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
+first_trailing_zero(T value) {
+ return value == cpp::numeric_limits<T>::max()
+ ? 0
+ : cpp::countr_zero(static_cast<T>(~value)) + 1;
+}
+
+template <typename T>
+[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
+first_trailing_one(T value) {
+ return value == cpp::numeric_limits<T>::max() ? 0
+ : cpp::countr_zero(value) + 1;
+}
+
+template <typename T>
+[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
+count_zeros(T value) {
+ return cpp::popcount<T>(static_cast<T>(~value));
+}
+
} // namespace LIBC_NAMESPACE
#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H
diff --git a/libc/src/stdbit/CMakeLists.txt b/libc/src/stdbit/CMakeLists.txt
index 2aef2029f2df0b..0c22b1d2617abb 100644
--- a/libc/src/stdbit/CMakeLists.txt
+++ b/libc/src/stdbit/CMakeLists.txt
@@ -1,30 +1,38 @@
+function(declare_dependencies prefixes dependencies)
+ set(suffixes c s i l ll)
+ foreach(prefix ${prefixes})
+ foreach(suffix IN LISTS suffixes)
+ add_entrypoint_object(
+ stdc_${prefix}_u${suffix}
+ SRCS
+ stdc_${prefix}_u${suffix}.cpp
+ HDRS
+ stdc_${prefix}_u${suffix}.h
+ DEPENDS
+ ${dependencies}
+ )
+ endforeach()
+ endforeach()
+endfunction()
+
+
set(prefixes
leading_zeros
leading_ones
trailing_zeros
trailing_ones
- first_leading_zero
- first_leading_one
- first_trailing_zero
- first_trailing_one
- count_zeros
count_ones
has_single_bit
bit_width
bit_floor
bit_ceil
)
-set(suffixes c s i l ll)
-foreach(prefix IN LISTS prefixes)
- foreach(suffix IN LISTS suffixes)
- add_entrypoint_object(
- stdc_${prefix}_u${suffix}
- SRCS
- stdc_${prefix}_u${suffix}.cpp
- HDRS
- stdc_${prefix}_u${suffix}.h
- DEPENDS
- libc.src.__support.CPP.bit
- )
- endforeach()
-endforeach()
+declare_dependencies("${prefixes}" libc.src.__support.CPP.bit)
+set(prefixes
+ first_leading_zero
+ first_leading_one
+ first_trailing_zero
+ first_trailing_one
+ count_zeros
+)
+declare_dependencies("${prefixes}" libc.src.__support.math_extras)
diff --git a/libc/src/stdbit/stdc_count_zeros_uc.cpp b/libc/src/stdbit/stdc_count_zeros_uc.cpp
index 22c57bd60c3846..309ebb55e0fac1 100644
--- a/libc/src/stdbit/stdc_count_zeros_uc.cpp
+++ b/libc/src/stdbit/stdc_count_zeros_uc.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_count_zeros_uc.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_count_zeros_uc, (unsigned char value)) {
- return static_cast<unsigned>(cpp::count_zeros(value));
+ return static_cast<unsigned>(count_zeros(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_count_zeros_ui.cpp b/libc/src/stdbit/stdc_count_zeros_ui.cpp
index 6a1defd9d555b2..31ea907b24de87 100644
--- a/libc/src/stdbit/stdc_count_zeros_ui.cpp
+++ b/libc/src/stdbit/stdc_count_zeros_ui.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_count_zeros_ui.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_count_zeros_ui, (unsigned value)) {
- return static_cast<unsigned>(cpp::count_zeros(value));
+ return static_cast<unsigned>(count_zeros(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_count_zeros_ul.cpp b/libc/src/stdbit/stdc_count_zeros_ul.cpp
index ceab32ef9ac36d..f5df5c49f13122 100644
--- a/libc/src/stdbit/stdc_count_zeros_ul.cpp
+++ b/libc/src/stdbit/stdc_count_zeros_ul.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_count_zeros_ul.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_count_zeros_ul, (unsigned long value)) {
- return static_cast<unsigned>(cpp::count_zeros(value));
+ return static_cast<unsigned>(count_zeros(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_count_zeros_ull.cpp b/libc/src/stdbit/stdc_count_zeros_ull.cpp
index 2f57f727a6919c..6a9c8f04a799fe 100644
--- a/libc/src/stdbit/stdc_count_zeros_ull.cpp
+++ b/libc/src/stdbit/stdc_count_zeros_ull.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_count_zeros_ull.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_count_zeros_ull, (unsigned long long value)) {
- return static_cast<unsigned>(cpp::count_zeros(value));
+ return static_cast<unsigned>(count_zeros(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_count_zeros_us.cpp b/libc/src/stdbit/stdc_count_zeros_us.cpp
index fc06836ee292a9..c08186ec6e87cd 100644
--- a/libc/src/stdbit/stdc_count_zeros_us.cpp
+++ b/libc/src/stdbit/stdc_count_zeros_us.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_count_zeros_us.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_count_zeros_us, (unsigned short value)) {
- return static_cast<unsigned>(cpp::count_zeros(value));
+ return static_cast<unsigned>(count_zeros(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_one_uc.cpp b/libc/src/stdbit/stdc_first_leading_one_uc.cpp
index 02871595fdb6b8..2e28ed3bb6f82d 100644
--- a/libc/src/stdbit/stdc_first_leading_one_uc.cpp
+++ b/libc/src/stdbit/stdc_first_leading_one_uc.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_leading_one_uc.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_uc, (unsigned char value)) {
- return static_cast<unsigned>(cpp::first_leading_one(value));
+ return static_cast<unsigned>(first_leading_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_one_ui.cpp b/libc/src/stdbit/stdc_first_leading_one_ui.cpp
index a6c7ef5a833914..a07a39b09d9f44 100644
--- a/libc/src/stdbit/stdc_first_leading_one_ui.cpp
+++ b/libc/src/stdbit/stdc_first_leading_one_ui.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_leading_one_ui.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ui, (unsigned value)) {
- return static_cast<unsigned>(cpp::first_leading_one(value));
+ return static_cast<unsigned>(first_leading_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_one_ul.cpp b/libc/src/stdbit/stdc_first_leading_one_ul.cpp
index d1bcab5dda02a9..4350fb7826b49c 100644
--- a/libc/src/stdbit/stdc_first_leading_one_ul.cpp
+++ b/libc/src/stdbit/stdc_first_leading_one_ul.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_leading_one_ul.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ul, (unsigned long value)) {
- return static_cast<unsigned>(cpp::first_leading_one(value));
+ return static_cast<unsigned>(first_leading_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_one_ull.cpp b/libc/src/stdbit/stdc_first_leading_one_ull.cpp
index 7be8f1051ec231..57a5ae368e11ae 100644
--- a/libc/src/stdbit/stdc_first_leading_one_ull.cpp
+++ b/libc/src/stdbit/stdc_first_leading_one_ull.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_one_ull.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ull,
(unsigned long long value)) {
- return static_cast<unsigned>(cpp::first_leading_one(value));
+ return static_cast<unsigned>(first_leading_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_one_us.cpp b/libc/src/stdbit/stdc_first_leading_one_us.cpp
index 7a4c7e673f367f..f14433b13f3500 100644
--- a/libc/src/stdbit/stdc_first_leading_one_us.cpp
+++ b/libc/src/stdbit/stdc_first_leading_one_us.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_one_us.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_us,
(unsigned short value)) {
- return static_cast<unsigned>(cpp::first_leading_one(value));
+ return static_cast<unsigned>(first_leading_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_zero_uc.cpp b/libc/src/stdbit/stdc_first_leading_zero_uc.cpp
index ffc1d9247406a2..6e2164256f1722 100644
--- a/libc/src/stdbit/stdc_first_leading_zero_uc.cpp
+++ b/libc/src/stdbit/stdc_first_leading_zero_uc.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_zero_uc.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_zero_uc,
(unsigned char value)) {
- return static_cast<unsigned>(cpp::first_leading_zero(value));
+ return static_cast<unsigned>(first_leading_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_zero_ui.cpp b/libc/src/stdbit/stdc_first_leading_zero_ui.cpp
index 1eeab2963e6aa7..cb733a94c0d84d 100644
--- a/libc/src/stdbit/stdc_first_leading_zero_ui.cpp
+++ b/libc/src/stdbit/stdc_first_leading_zero_ui.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_leading_zero_ui.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_zero_ui, (unsigned value)) {
- return static_cast<unsigned>(cpp::first_leading_zero(value));
+ return static_cast<unsigned>(first_leading_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_zero_ul.cpp b/libc/src/stdbit/stdc_first_leading_zero_ul.cpp
index 6743d3eda5168c..8a3930a271ed98 100644
--- a/libc/src/stdbit/stdc_first_leading_zero_ul.cpp
+++ b/libc/src/stdbit/stdc_first_leading_zero_ul.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_zero_ul.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_zero_ul,
(unsigned long value)) {
- return static_cast<unsigned>(cpp::first_leading_zero(value));
+ return static_cast<unsigned>(first_leading_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_zero_ull.cpp b/libc/src/stdbit/stdc_first_leading_zero_ull.cpp
index 8128dd3d59a7bf..5a69197a82996a 100644
--- a/libc/src/stdbit/stdc_first_leading_zero_ull.cpp
+++ b/libc/src/stdbit/stdc_first_leading_zero_ull.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_zero_ull.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_zero_ull,
(unsigned long long value)) {
- return static_cast<unsigned>(cpp::first_leading_zero(value));
+ return static_cast<unsigned>(first_leading_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_leading_zero_us.cpp b/libc/src/stdbit/stdc_first_leading_zero_us.cpp
index d931535e7690a6..6482c8654db3b5 100644
--- a/libc/src/stdbit/stdc_first_leading_zero_us.cpp
+++ b/libc/src/stdbit/stdc_first_leading_zero_us.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_leading_zero_us.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_zero_us,
(unsigned short value)) {
- return static_cast<unsigned>(cpp::first_leading_zero(value));
+ return static_cast<unsigned>(first_leading_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_one_uc.cpp b/libc/src/stdbit/stdc_first_trailing_one_uc.cpp
index 6ed35966be61a0..d3e8825eef00fc 100644
--- a/libc/src/stdbit/stdc_first_trailing_one_uc.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_one_uc.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_one_uc.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_one_uc,
(unsigned char value)) {
- return static_cast<unsigned>(cpp::first_trailing_one(value));
+ return static_cast<unsigned>(first_trailing_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_one_ui.cpp b/libc/src/stdbit/stdc_first_trailing_one_ui.cpp
index a89083bd49507a..842bd699505010 100644
--- a/libc/src/stdbit/stdc_first_trailing_one_ui.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_one_ui.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_trailing_one_ui.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_one_ui, (unsigned value)) {
- return static_cast<unsigned>(cpp::first_trailing_one(value));
+ return static_cast<unsigned>(first_trailing_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_one_ul.cpp b/libc/src/stdbit/stdc_first_trailing_one_ul.cpp
index f30078d0f5ffaa..0497d1d77811e4 100644
--- a/libc/src/stdbit/stdc_first_trailing_one_ul.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_one_ul.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_one_ul.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_one_ul,
(unsigned long value)) {
- return static_cast<unsigned>(cpp::first_trailing_one(value));
+ return static_cast<unsigned>(first_trailing_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_one_ull.cpp b/libc/src/stdbit/stdc_first_trailing_one_ull.cpp
index 2e526a890cda9c..6e062dd27cdd60 100644
--- a/libc/src/stdbit/stdc_first_trailing_one_ull.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_one_ull.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_one_ull.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_one_ull,
(unsigned long long value)) {
- return static_cast<unsigned>(cpp::first_trailing_one(value));
+ return static_cast<unsigned>(first_trailing_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_one_us.cpp b/libc/src/stdbit/stdc_first_trailing_one_us.cpp
index e4c88e0d7906b9..e90158f1020495 100644
--- a/libc/src/stdbit/stdc_first_trailing_one_us.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_one_us.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_one_us.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_one_us,
(unsigned short value)) {
- return static_cast<unsigned>(cpp::first_trailing_one(value));
+ return static_cast<unsigned>(first_trailing_one(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_zero_uc.cpp b/libc/src/stdbit/stdc_first_trailing_zero_uc.cpp
index 5825d5d441c591..a6939f6286b34e 100644
--- a/libc/src/stdbit/stdc_first_trailing_zero_uc.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_zero_uc.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_zero_uc.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_zero_uc,
(unsigned char value)) {
- return static_cast<unsigned>(cpp::first_trailing_zero(value));
+ return static_cast<unsigned>(first_trailing_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_zero_ui.cpp b/libc/src/stdbit/stdc_first_trailing_zero_ui.cpp
index 3b51b5fa22c324..7a50b696afff7e 100644
--- a/libc/src/stdbit/stdc_first_trailing_zero_ui.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_zero_ui.cpp
@@ -8,13 +8,13 @@
#include "src/stdbit/stdc_first_trailing_zero_ui.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_zero_ui, (unsigned value)) {
- return static_cast<unsigned>(cpp::first_trailing_zero(value));
+ return static_cast<unsigned>(first_trailing_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_zero_ul.cpp b/libc/src/stdbit/stdc_first_trailing_zero_ul.cpp
index abf122944a76a4..88acbabdf2d9f1 100644
--- a/libc/src/stdbit/stdc_first_trailing_zero_ul.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_zero_ul.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_zero_ul.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_zero_ul,
(unsigned long value)) {
- return static_cast<unsigned>(cpp::first_trailing_zero(value));
+ return static_cast<unsigned>(first_trailing_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_zero_ull.cpp b/libc/src/stdbit/stdc_first_trailing_zero_ull.cpp
index 336e7d6e075ff2..92df8f284e8b5f 100644
--- a/libc/src/stdbit/stdc_first_trailing_zero_ull.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_zero_ull.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_zero_ull.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_zero_ull,
(unsigned long long value)) {
- return static_cast<unsigned>(cpp::first_trailing_zero(value));
+ return static_cast<unsigned>(first_trailing_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/stdbit/stdc_first_trailing_zero_us.cpp b/libc/src/stdbit/stdc_first_trailing_zero_us.cpp
index b7d05047b2721a..86caa20dd3bd60 100644
--- a/libc/src/stdbit/stdc_first_trailing_zero_us.cpp
+++ b/libc/src/stdbit/stdc_first_trailing_zero_us.cpp
@@ -8,14 +8,14 @@
#include "src/stdbit/stdc_first_trailing_zero_us.h"
-#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
+#include "src/__support/math_extras.h"
namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(unsigned, stdc_first_trailing_zero_us,
(unsigned short value)) {
- return static_cast<unsigned>(cpp::first_trailing_zero(value));
+ return static_cast<unsigned>(first_trailing_zero(value));
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/test/src/__support/CPP/bit_test.cpp b/libc/test/src/__support/CPP/bit_test.cpp
index 3deb1f41dcf882..cee5b90c8f4bdb 100644
--- a/libc/test/src/__support/CPP/bit_test.cpp
+++ b/libc/test/src/__support/CPP/bit_test.cpp
@@ -228,38 +228,6 @@ TEST(LlvmLibcBitTest, Rotr) {
rotr<uint64_t>(0x12345678deadbeefULL, -19));
}
-TYPED_TEST(LlvmLibcBitTest, FirstLeadingZero, UnsignedTypesNoBigInt) {
- EXPECT_EQ(first_leading_zero<T>(cpp::numeric_limits<T>::max()), 0);
- for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
- EXPECT_EQ(first_leading_zero<T>(~(T(1) << i)),
- cpp::numeric_limits<T>::digits - i);
-}
-
-TYPED_TEST(LlvmLibcBitTest, FirstLeadingOne, UnsignedTypesNoBigInt) {
- EXPECT_EQ(first_leading_one<T>(static_cast<T>(0)), 0);
- for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
- EXPECT_EQ(first_leading_one<T>(T(1) << i),
- cpp::numeric_limits<T>::digits - i);
-}
-
-TYPED_TEST(LlvmLibcBitTest, FirstTrailingZero, UnsignedTypesNoBigInt) {
- EXPECT_EQ(first_trailing_zero<T>(cpp::numeric_limits<T>::max()), 0);
- for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
- EXPECT_EQ(first_trailing_zero<T>(~(T(1) << i)), i + 1);
-}
-
-TYPED_TEST(LlvmLibcBitTest, FirstTrailingOne, UnsignedTypesNoBigInt) {
- EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 0);
- for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
- EXPECT_EQ(first_trailing_one<T>(T(1) << i), i + 1);
-}
-
-TYPED_TEST(LlvmLibcBitTest, CountZeros, UnsignedTypesNoBigInt) {
- EXPECT_EQ(count_zeros(T(0)), cpp::numeric_limits<T>::digits);
- for (int i = 0; i != cpp::numeric_limits<T>::digits; ++i)
- EXPECT_EQ(count_zeros<T>(cpp::numeric_limits<T>::max() >> i), i);
-}
-
TYPED_TEST(LlvmLibcBitTest, CountOnes, UnsignedTypesNoBigInt) {
EXPECT_EQ(popcount(T(0)), 0);
for (int i = 0; i != cpp::numeric_limits<T>::digits; ++i)
diff --git a/libc/test/src/__support/math_extras_test.cpp b/libc/test/src/__support/math_extras_test.cpp
index ed064363d446bb..e642248881a41c 100644
--- a/libc/test/src/__support/math_extras_test.cpp
+++ b/libc/test/src/__support/math_extras_test.cpp
@@ -13,6 +13,14 @@
namespace LIBC_NAMESPACE {
+// TODO: add UInt<128> support.
+using UnsignedTypesNoBigInt = testing::TypeList<
+#if defined(LIBC_TYPES_HAS_INT128)
+ __uint128_t,
+#endif // LIBC_TYPES_HAS_INT128
+ unsigned char, unsigned short, unsigned int, unsigned long,
+ unsigned long long>;
+
TEST(LlvmLibcBlockMathExtrasTest, mask_trailing_ones) {
EXPECT_EQ(0_u8, (mask_leading_ones<uint8_t, 0>()));
EXPECT_EQ(0_u8, (mask_trailing_ones<uint8_t, 0>()));
@@ -61,4 +69,36 @@ TEST(LlvmLibcBlockMathExtrasTest, mask_trailing_ones) {
(mask_leading_ones<UInt128, 128>()));
}
+TYPED_TEST(LlvmLibcBitTest, FirstLeadingZero, UnsignedTypesNoBigInt) {
+ EXPECT_EQ(first_leading_zero<T>(cpp::numeric_limits<T>::max()), 0);
+ for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
+ EXPECT_EQ(first_leading_zero<T>(~(T(1) << i)),
+ cpp::numeric_limits<T>::digits - i);
+}
+
+TYPED_TEST(LlvmLibcBitTest, FirstLeadingOne, UnsignedTypesNoBigInt) {
+ EXPECT_EQ(first_leading_one<T>(static_cast<T>(0)), 0);
+ for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
+ EXPECT_EQ(first_leading_one<T>(T(1) << i),
+ cpp::numeric_limits<T>::digits - i);
+}
+
+TYPED_TEST(LlvmLibcBitTest, FirstTrailingZero, UnsignedTypesNoBigInt) {
+ EXPECT_EQ(first_trailing_zero<T>(cpp::numeric_limits<T>::max()), 0);
+ for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
+ EXPECT_EQ(first_trailing_zero<T>(~(T(1) << i)), i + 1);
+}
+
+TYPED_TEST(LlvmLibcBitTest, FirstTrailingOne, UnsignedTypesNoBigInt) {
+ EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 0);
+ for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
+ EXPECT_EQ(first_trailing_one<T>(T(1) << i), i + 1);
+}
+
+TYPED_TEST(LlvmLibcBitTest, CountZeros, UnsignedTypesNoBigInt) {
+ EXPECT_EQ(count_zeros(T(0)), cpp::numeric_limits<T>::digits);
+ for (int i = 0; i != cpp::numeric_limits<T>::digits; ++i)
+ EXPECT_EQ(count_zeros<T>(cpp::numeric_limits<T>::max() >> i), i);
+}
+
} // namespace LIBC_NAMESPACE
More information about the libc-commits
mailing list