4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_leading_zero_us.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_one_uc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_one_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_one_ul.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_one_ull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_one_us.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_zero_uc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_zero_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_zero_ul.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_zero_ull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions libc/src/stdbit/stdc_first_trailing_zero_us.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
32 changes: 0 additions & 32 deletions libc/test/src/__support/CPP/bit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
40 changes: 40 additions & 0 deletions libc/test/src/__support/math_extras_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>()));
Expand Down Expand Up @@ -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