summaryrefslogtreecommitdiffstats
path: root/libc/test/src/__support/math_extras_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libc/test/src/__support/math_extras_test.cpp')
-rw-r--r--libc/test/src/__support/math_extras_test.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/libc/test/src/__support/math_extras_test.cpp b/libc/test/src/__support/math_extras_test.cpp
index ed064363d446..e642248881a4 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