Use std::countl_zero instead of __builtin_clzll (#7025)

This commit is contained in:
Siarhei Fedartsou 2024-09-28 20:34:23 +02:00 committed by GitHub
parent 5f67e715af
commit f636dbfd44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,50 +1,24 @@
#ifndef OSRM_UTIL_MSB_HPP #ifndef OSRM_UTIL_MSB_HPP
#define OSRM_UTIL_MSB_HPP #define OSRM_UTIL_MSB_HPP
#include <bit>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <climits>
#include <cstdint> #include <cstdint>
#include <utility> #include <limits>
namespace osrm::util namespace osrm::util
{ {
// get the msb of an integer
// return 0 for integers without msb
template <typename T> std::size_t msb(T value) template <typename T> std::size_t msb(T value)
{ {
BOOST_ASSERT(value > 0);
static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required."); static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required.");
std::size_t msb = 0; constexpr auto MSB_INDEX = std::numeric_limits<unsigned char>::digits * sizeof(T) - 1;
while (value > 0)
{ return MSB_INDEX - std::countl_zero(value);
value >>= 1u;
msb++;
}
BOOST_ASSERT(msb > 0);
return msb - 1;
} }
#if (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__))
inline std::size_t msb(unsigned long long v)
{
BOOST_ASSERT(v > 0);
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long long) - 1;
return MSB_INDEX - __builtin_clzll(v);
}
inline std::size_t msb(unsigned long v)
{
BOOST_ASSERT(v > 0);
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long) - 1;
return MSB_INDEX - __builtin_clzl(v);
}
inline std::size_t msb(unsigned int v)
{
BOOST_ASSERT(v > 0);
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned int) - 1;
return MSB_INDEX - __builtin_clz(v);
}
#endif
} // namespace osrm::util } // namespace osrm::util
#endif #endif