1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===------------------------------ bit ----------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===---------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_BIT 11*4d6fc14bSjoerg#define _LIBCPP_BIT 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg bit synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std { 17*4d6fc14bSjoerg 18*4d6fc14bSjoerg // [bit.pow.two], integral powers of 2 19*4d6fc14bSjoerg template <class T> 20*4d6fc14bSjoerg constexpr bool has_single_bit(T x) noexcept; // C++20 21*4d6fc14bSjoerg template <class T> 22*4d6fc14bSjoerg constexpr T bit_ceil(T x); // C++20 23*4d6fc14bSjoerg template <class T> 24*4d6fc14bSjoerg constexpr T bit_floor(T x) noexcept; // C++20 25*4d6fc14bSjoerg template <class T> 26*4d6fc14bSjoerg constexpr T bit_width(T x) noexcept; // C++20 27*4d6fc14bSjoerg 28*4d6fc14bSjoerg // [bit.rotate], rotating 29*4d6fc14bSjoerg template<class T> 30*4d6fc14bSjoerg constexpr T rotl(T x, unsigned int s) noexcept; // C++20 31*4d6fc14bSjoerg template<class T> 32*4d6fc14bSjoerg constexpr T rotr(T x, unsigned int s) noexcept; // C++20 33*4d6fc14bSjoerg 34*4d6fc14bSjoerg // [bit.count], counting 35*4d6fc14bSjoerg template<class T> 36*4d6fc14bSjoerg constexpr int countl_zero(T x) noexcept; // C++20 37*4d6fc14bSjoerg template<class T> 38*4d6fc14bSjoerg constexpr int countl_one(T x) noexcept; // C++20 39*4d6fc14bSjoerg template<class T> 40*4d6fc14bSjoerg constexpr int countr_zero(T x) noexcept; // C++20 41*4d6fc14bSjoerg template<class T> 42*4d6fc14bSjoerg constexpr int countr_one(T x) noexcept; // C++20 43*4d6fc14bSjoerg template<class T> 44*4d6fc14bSjoerg constexpr int popcount(T x) noexcept; // C++20 45*4d6fc14bSjoerg 46*4d6fc14bSjoerg // [bit.endian], endian 47*4d6fc14bSjoerg enum class endian { 48*4d6fc14bSjoerg little = see below, // C++20 49*4d6fc14bSjoerg big = see below, // C++20 50*4d6fc14bSjoerg native = see below // C++20 51*4d6fc14bSjoerg}; 52*4d6fc14bSjoerg 53*4d6fc14bSjoerg} // namespace std 54*4d6fc14bSjoerg 55*4d6fc14bSjoerg*/ 56*4d6fc14bSjoerg 57*4d6fc14bSjoerg#include <__config> 58*4d6fc14bSjoerg#include <__bits> 59*4d6fc14bSjoerg#include <__debug> 60*4d6fc14bSjoerg#include <limits> 61*4d6fc14bSjoerg#include <type_traits> 62*4d6fc14bSjoerg#include <version> 63*4d6fc14bSjoerg 64*4d6fc14bSjoerg#if defined(__IBMCPP__) 65*4d6fc14bSjoerg#include "__support/ibm/support.h" 66*4d6fc14bSjoerg#endif 67*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_MSVC) 68*4d6fc14bSjoerg#include <intrin.h> 69*4d6fc14bSjoerg#endif 70*4d6fc14bSjoerg 71*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 72*4d6fc14bSjoerg#pragma GCC system_header 73*4d6fc14bSjoerg#endif 74*4d6fc14bSjoerg 75*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 76*4d6fc14bSjoerg#include <__undef_macros> 77*4d6fc14bSjoerg 78*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 79*4d6fc14bSjoerg 80*4d6fc14bSjoergtemplate<class _Tp> 81*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 82*4d6fc14bSjoerg_Tp __rotl(_Tp __t, unsigned int __cnt) _NOEXCEPT 83*4d6fc14bSjoerg{ 84*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__rotl requires an unsigned integer type"); 85*4d6fc14bSjoerg const unsigned int __dig = numeric_limits<_Tp>::digits; 86*4d6fc14bSjoerg if ((__cnt % __dig) == 0) 87*4d6fc14bSjoerg return __t; 88*4d6fc14bSjoerg return (__t << (__cnt % __dig)) | (__t >> (__dig - (__cnt % __dig))); 89*4d6fc14bSjoerg} 90*4d6fc14bSjoerg 91*4d6fc14bSjoergtemplate<class _Tp> 92*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 93*4d6fc14bSjoerg_Tp __rotr(_Tp __t, unsigned int __cnt) _NOEXCEPT 94*4d6fc14bSjoerg{ 95*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__rotr requires an unsigned integer type"); 96*4d6fc14bSjoerg const unsigned int __dig = numeric_limits<_Tp>::digits; 97*4d6fc14bSjoerg if ((__cnt % __dig) == 0) 98*4d6fc14bSjoerg return __t; 99*4d6fc14bSjoerg return (__t >> (__cnt % __dig)) | (__t << (__dig - (__cnt % __dig))); 100*4d6fc14bSjoerg} 101*4d6fc14bSjoerg 102*4d6fc14bSjoergtemplate<class _Tp> 103*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 104*4d6fc14bSjoergint __countr_zero(_Tp __t) _NOEXCEPT 105*4d6fc14bSjoerg{ 106*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countr_zero requires an unsigned integer type"); 107*4d6fc14bSjoerg if (__t == 0) 108*4d6fc14bSjoerg return numeric_limits<_Tp>::digits; 109*4d6fc14bSjoerg 110*4d6fc14bSjoerg if (sizeof(_Tp) <= sizeof(unsigned int)) 111*4d6fc14bSjoerg return __libcpp_ctz(static_cast<unsigned int>(__t)); 112*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long)) 113*4d6fc14bSjoerg return __libcpp_ctz(static_cast<unsigned long>(__t)); 114*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long long)) 115*4d6fc14bSjoerg return __libcpp_ctz(static_cast<unsigned long long>(__t)); 116*4d6fc14bSjoerg else 117*4d6fc14bSjoerg { 118*4d6fc14bSjoerg int __ret = 0; 119*4d6fc14bSjoerg const unsigned int __ulldigits = numeric_limits<unsigned long long>::digits; 120*4d6fc14bSjoerg while (static_cast<unsigned long long>(__t) == 0uLL) 121*4d6fc14bSjoerg { 122*4d6fc14bSjoerg __ret += __ulldigits; 123*4d6fc14bSjoerg __t >>= __ulldigits; 124*4d6fc14bSjoerg } 125*4d6fc14bSjoerg return __ret + __libcpp_ctz(static_cast<unsigned long long>(__t)); 126*4d6fc14bSjoerg } 127*4d6fc14bSjoerg} 128*4d6fc14bSjoerg 129*4d6fc14bSjoergtemplate<class _Tp> 130*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 131*4d6fc14bSjoergint __countl_zero(_Tp __t) _NOEXCEPT 132*4d6fc14bSjoerg{ 133*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countl_zero requires an unsigned integer type"); 134*4d6fc14bSjoerg if (__t == 0) 135*4d6fc14bSjoerg return numeric_limits<_Tp>::digits; 136*4d6fc14bSjoerg 137*4d6fc14bSjoerg if (sizeof(_Tp) <= sizeof(unsigned int)) 138*4d6fc14bSjoerg return __libcpp_clz(static_cast<unsigned int>(__t)) 139*4d6fc14bSjoerg - (numeric_limits<unsigned int>::digits - numeric_limits<_Tp>::digits); 140*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long)) 141*4d6fc14bSjoerg return __libcpp_clz(static_cast<unsigned long>(__t)) 142*4d6fc14bSjoerg - (numeric_limits<unsigned long>::digits - numeric_limits<_Tp>::digits); 143*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long long)) 144*4d6fc14bSjoerg return __libcpp_clz(static_cast<unsigned long long>(__t)) 145*4d6fc14bSjoerg - (numeric_limits<unsigned long long>::digits - numeric_limits<_Tp>::digits); 146*4d6fc14bSjoerg else 147*4d6fc14bSjoerg { 148*4d6fc14bSjoerg int __ret = 0; 149*4d6fc14bSjoerg int __iter = 0; 150*4d6fc14bSjoerg const unsigned int __ulldigits = numeric_limits<unsigned long long>::digits; 151*4d6fc14bSjoerg while (true) { 152*4d6fc14bSjoerg __t = __rotr(__t, __ulldigits); 153*4d6fc14bSjoerg if ((__iter = __countl_zero(static_cast<unsigned long long>(__t))) != __ulldigits) 154*4d6fc14bSjoerg break; 155*4d6fc14bSjoerg __ret += __iter; 156*4d6fc14bSjoerg } 157*4d6fc14bSjoerg return __ret + __iter; 158*4d6fc14bSjoerg } 159*4d6fc14bSjoerg} 160*4d6fc14bSjoerg 161*4d6fc14bSjoergtemplate<class _Tp> 162*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 163*4d6fc14bSjoergint __countl_one(_Tp __t) _NOEXCEPT 164*4d6fc14bSjoerg{ 165*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countl_one requires an unsigned integer type"); 166*4d6fc14bSjoerg return __t != numeric_limits<_Tp>::max() 167*4d6fc14bSjoerg ? __countl_zero(static_cast<_Tp>(~__t)) 168*4d6fc14bSjoerg : numeric_limits<_Tp>::digits; 169*4d6fc14bSjoerg} 170*4d6fc14bSjoerg 171*4d6fc14bSjoergtemplate<class _Tp> 172*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 173*4d6fc14bSjoergint __countr_one(_Tp __t) _NOEXCEPT 174*4d6fc14bSjoerg{ 175*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countr_one requires an unsigned integer type"); 176*4d6fc14bSjoerg return __t != numeric_limits<_Tp>::max() 177*4d6fc14bSjoerg ? __countr_zero(static_cast<_Tp>(~__t)) 178*4d6fc14bSjoerg : numeric_limits<_Tp>::digits; 179*4d6fc14bSjoerg} 180*4d6fc14bSjoerg 181*4d6fc14bSjoergtemplate<class _Tp> 182*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 183*4d6fc14bSjoergint __popcount(_Tp __t) _NOEXCEPT 184*4d6fc14bSjoerg{ 185*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__popcount requires an unsigned integer type"); 186*4d6fc14bSjoerg if (sizeof(_Tp) <= sizeof(unsigned int)) 187*4d6fc14bSjoerg return __libcpp_popcount(static_cast<unsigned int>(__t)); 188*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long)) 189*4d6fc14bSjoerg return __libcpp_popcount(static_cast<unsigned long>(__t)); 190*4d6fc14bSjoerg else if (sizeof(_Tp) <= sizeof(unsigned long long)) 191*4d6fc14bSjoerg return __libcpp_popcount(static_cast<unsigned long long>(__t)); 192*4d6fc14bSjoerg else 193*4d6fc14bSjoerg { 194*4d6fc14bSjoerg int __ret = 0; 195*4d6fc14bSjoerg while (__t != 0) 196*4d6fc14bSjoerg { 197*4d6fc14bSjoerg __ret += __libcpp_popcount(static_cast<unsigned long long>(__t)); 198*4d6fc14bSjoerg __t >>= numeric_limits<unsigned long long>::digits; 199*4d6fc14bSjoerg } 200*4d6fc14bSjoerg return __ret; 201*4d6fc14bSjoerg } 202*4d6fc14bSjoerg} 203*4d6fc14bSjoerg 204*4d6fc14bSjoerg// integral log base 2 205*4d6fc14bSjoergtemplate<class _Tp> 206*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 207*4d6fc14bSjoergunsigned __bit_log2(_Tp __t) _NOEXCEPT 208*4d6fc14bSjoerg{ 209*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__bit_log2 requires an unsigned integer type"); 210*4d6fc14bSjoerg return numeric_limits<_Tp>::digits - 1 - __countl_zero(__t); 211*4d6fc14bSjoerg} 212*4d6fc14bSjoerg 213*4d6fc14bSjoergtemplate <class _Tp> 214*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 215*4d6fc14bSjoergbool __has_single_bit(_Tp __t) _NOEXCEPT 216*4d6fc14bSjoerg{ 217*4d6fc14bSjoerg static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__has_single_bit requires an unsigned integer type"); 218*4d6fc14bSjoerg return __t != 0 && (((__t & (__t - 1)) == 0)); 219*4d6fc14bSjoerg} 220*4d6fc14bSjoerg 221*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 222*4d6fc14bSjoerg 223*4d6fc14bSjoergtemplate<class _Tp> 224*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 225*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, _Tp> 226*4d6fc14bSjoergrotl(_Tp __t, unsigned int __cnt) noexcept 227*4d6fc14bSjoerg{ 228*4d6fc14bSjoerg return __rotl(__t, __cnt); 229*4d6fc14bSjoerg} 230*4d6fc14bSjoerg 231*4d6fc14bSjoergtemplate<class _Tp> 232*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 233*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, _Tp> 234*4d6fc14bSjoergrotr(_Tp __t, unsigned int __cnt) noexcept 235*4d6fc14bSjoerg{ 236*4d6fc14bSjoerg return __rotr(__t, __cnt); 237*4d6fc14bSjoerg} 238*4d6fc14bSjoerg 239*4d6fc14bSjoergtemplate<class _Tp> 240*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 241*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, int> 242*4d6fc14bSjoergcountl_zero(_Tp __t) noexcept 243*4d6fc14bSjoerg{ 244*4d6fc14bSjoerg return __countl_zero(__t); 245*4d6fc14bSjoerg} 246*4d6fc14bSjoerg 247*4d6fc14bSjoergtemplate<class _Tp> 248*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 249*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, int> 250*4d6fc14bSjoergcountl_one(_Tp __t) noexcept 251*4d6fc14bSjoerg{ 252*4d6fc14bSjoerg return __countl_one(__t); 253*4d6fc14bSjoerg} 254*4d6fc14bSjoerg 255*4d6fc14bSjoergtemplate<class _Tp> 256*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 257*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, int> 258*4d6fc14bSjoergcountr_zero(_Tp __t) noexcept 259*4d6fc14bSjoerg{ 260*4d6fc14bSjoerg return __countr_zero(__t); 261*4d6fc14bSjoerg} 262*4d6fc14bSjoerg 263*4d6fc14bSjoergtemplate<class _Tp> 264*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 265*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, int> 266*4d6fc14bSjoergcountr_one(_Tp __t) noexcept 267*4d6fc14bSjoerg{ 268*4d6fc14bSjoerg return __countr_one(__t); 269*4d6fc14bSjoerg} 270*4d6fc14bSjoerg 271*4d6fc14bSjoergtemplate<class _Tp> 272*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 273*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, int> 274*4d6fc14bSjoergpopcount(_Tp __t) noexcept 275*4d6fc14bSjoerg{ 276*4d6fc14bSjoerg return __popcount(__t); 277*4d6fc14bSjoerg} 278*4d6fc14bSjoerg 279*4d6fc14bSjoergtemplate <class _Tp> 280*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 281*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, bool> 282*4d6fc14bSjoerghas_single_bit(_Tp __t) noexcept 283*4d6fc14bSjoerg{ 284*4d6fc14bSjoerg return __has_single_bit(__t); 285*4d6fc14bSjoerg} 286*4d6fc14bSjoerg 287*4d6fc14bSjoergtemplate <class _Tp> 288*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 289*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, _Tp> 290*4d6fc14bSjoergbit_floor(_Tp __t) noexcept 291*4d6fc14bSjoerg{ 292*4d6fc14bSjoerg return __t == 0 ? 0 : _Tp{1} << __bit_log2(__t); 293*4d6fc14bSjoerg} 294*4d6fc14bSjoerg 295*4d6fc14bSjoergtemplate <class _Tp> 296*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 297*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, _Tp> 298*4d6fc14bSjoergbit_ceil(_Tp __t) noexcept 299*4d6fc14bSjoerg{ 300*4d6fc14bSjoerg if (__t < 2) return 1; 301*4d6fc14bSjoerg const unsigned __n = numeric_limits<_Tp>::digits - countl_zero((_Tp)(__t - 1u)); 302*4d6fc14bSjoerg _LIBCPP_DEBUG_ASSERT(__libcpp_is_constant_evaluated() || __n != numeric_limits<_Tp>::digits, "Bad input to bit_ceil"); 303*4d6fc14bSjoerg 304*4d6fc14bSjoerg if constexpr (sizeof(_Tp) >= sizeof(unsigned)) 305*4d6fc14bSjoerg return _Tp{1} << __n; 306*4d6fc14bSjoerg else 307*4d6fc14bSjoerg { 308*4d6fc14bSjoerg const unsigned __extra = numeric_limits<unsigned>::digits - numeric_limits<_Tp>::digits; 309*4d6fc14bSjoerg const unsigned __retVal = 1u << (__n + __extra); 310*4d6fc14bSjoerg return (_Tp) (__retVal >> __extra); 311*4d6fc14bSjoerg } 312*4d6fc14bSjoerg} 313*4d6fc14bSjoerg 314*4d6fc14bSjoergtemplate <class _Tp> 315*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr 316*4d6fc14bSjoerg_EnableIf<__libcpp_is_unsigned_integer<_Tp>::value, _Tp> 317*4d6fc14bSjoergbit_width(_Tp __t) noexcept 318*4d6fc14bSjoerg{ 319*4d6fc14bSjoerg return __t == 0 ? 0 : __bit_log2(__t) + 1; 320*4d6fc14bSjoerg} 321*4d6fc14bSjoerg 322*4d6fc14bSjoergenum class endian 323*4d6fc14bSjoerg{ 324*4d6fc14bSjoerg little = 0xDEAD, 325*4d6fc14bSjoerg big = 0xFACE, 326*4d6fc14bSjoerg#if defined(_LIBCPP_LITTLE_ENDIAN) 327*4d6fc14bSjoerg native = little 328*4d6fc14bSjoerg#elif defined(_LIBCPP_BIG_ENDIAN) 329*4d6fc14bSjoerg native = big 330*4d6fc14bSjoerg#else 331*4d6fc14bSjoerg native = 0xCAFE 332*4d6fc14bSjoerg#endif 333*4d6fc14bSjoerg}; 334*4d6fc14bSjoerg 335*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 17 336*4d6fc14bSjoerg 337*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 338*4d6fc14bSjoerg 339*4d6fc14bSjoerg_LIBCPP_POP_MACROS 340*4d6fc14bSjoerg 341*4d6fc14bSjoerg#endif // _LIBCPP_BIT 342