libstdc++: Use new type-generic built-ins in <bit> [PR118855]

This makes several functions in <bit> faster to compile, with fewer
expressions to parse and fewer instantiations of __numeric_traits
required.

libstdc++-v3/ChangeLog:

	PR libstdc++/118855
	* include/std/bit (__count_lzero, __count_rzero, __popcount):
	Use type-generic built-ins when available.
This commit is contained in:
Jonathan Wakely 2025-02-19 14:48:04 +00:00 committed by Jonathan Wakely
parent 32457bc25f
commit e8ad697a75
No known key found for this signature in database

View file

@ -205,6 +205,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using __gnu_cxx::__int_traits;
constexpr auto _Nd = __int_traits<_Tp>::__digits;
#if _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_clzg)
return __builtin_clzg(__x, _Nd);
#else
if (__x == 0)
return _Nd;
@ -242,6 +245,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
unsigned long long __low = __x & __max_ull;
return (_Nd - _Nd_ull) + __builtin_clzll(__low);
}
#endif
}
template<typename _Tp>
@ -258,6 +262,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using __gnu_cxx::__int_traits;
constexpr auto _Nd = __int_traits<_Tp>::__digits;
#if _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_ctzg)
return __builtin_ctzg(__x, _Nd);
#else
if (__x == 0)
return _Nd;
@ -283,6 +290,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
unsigned long long __high = __x >> _Nd_ull;
return __builtin_ctzll(__high) + _Nd_ull;
}
#endif
}
template<typename _Tp>
@ -296,6 +304,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr int
__popcount(_Tp __x) noexcept
{
#if _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_popcountg)
return __builtin_popcountg(__x);
#else
using __gnu_cxx::__int_traits;
constexpr auto _Nd = __int_traits<_Tp>::__digits;
@ -319,6 +330,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
unsigned long long __high = __x >> _Nd_ull;
return __builtin_popcountll(__low) + __builtin_popcountll(__high);
}
#endif
}
template<typename _Tp>