xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/std/bit (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1627f7eb2Smrg// <bit> -*- C++ -*-
2627f7eb2Smrg
3*4c3eb207Smrg// Copyright (C) 2018-2020 Free Software Foundation, Inc.
4627f7eb2Smrg//
5627f7eb2Smrg// This file is part of the GNU ISO C++ Library.  This library is free
6627f7eb2Smrg// software; you can redistribute it and/or modify it under the
7627f7eb2Smrg// terms of the GNU General Public License as published by the
8627f7eb2Smrg// Free Software Foundation; either version 3, or (at your option)
9627f7eb2Smrg// any later version.
10627f7eb2Smrg
11627f7eb2Smrg// This library is distributed in the hope that it will be useful,
12627f7eb2Smrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
13627f7eb2Smrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14627f7eb2Smrg// GNU General Public License for more details.
15627f7eb2Smrg
16627f7eb2Smrg// Under Section 7 of GPL version 3, you are granted additional
17627f7eb2Smrg// permissions described in the GCC Runtime Library Exception, version
18627f7eb2Smrg// 3.1, as published by the Free Software Foundation.
19627f7eb2Smrg
20627f7eb2Smrg// You should have received a copy of the GNU General Public License and
21627f7eb2Smrg// a copy of the GCC Runtime Library Exception along with this program;
22627f7eb2Smrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23627f7eb2Smrg// <http://www.gnu.org/licenses/>.
24627f7eb2Smrg
25627f7eb2Smrg/** @file include/bit
26627f7eb2Smrg *  This is a Standard C++ Library header.
27627f7eb2Smrg */
28627f7eb2Smrg
29627f7eb2Smrg#ifndef _GLIBCXX_BIT
30627f7eb2Smrg#define _GLIBCXX_BIT 1
31627f7eb2Smrg
32627f7eb2Smrg#pragma GCC system_header
33627f7eb2Smrg
34627f7eb2Smrg#if __cplusplus >= 201402L
35627f7eb2Smrg
36627f7eb2Smrg#include <type_traits>
37*4c3eb207Smrg
38*4c3eb207Smrg#if _GLIBCXX_HOSTED
39*4c3eb207Smrg# include <ext/numeric_traits.h>
40*4c3eb207Smrg#else
41627f7eb2Smrg# include <limits>
42*4c3eb207Smrg/// @cond undocumented
43*4c3eb207Smrgnamespace __gnu_cxx
44*4c3eb207Smrg{
45*4c3eb207Smrg  template<typename _Tp>
46*4c3eb207Smrg    struct __int_traits
47*4c3eb207Smrg    {
48*4c3eb207Smrg      static constexpr int __digits = std::numeric_limits<_Tp>::digits;
49*4c3eb207Smrg      static constexpr _Tp __max = std::numeric_limits<_Tp>::max();
50*4c3eb207Smrg    };
51*4c3eb207Smrg}
52*4c3eb207Smrg/// @endcond
53*4c3eb207Smrg#endif
54627f7eb2Smrg
55627f7eb2Smrgnamespace std _GLIBCXX_VISIBILITY(default)
56627f7eb2Smrg{
57627f7eb2Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
58627f7eb2Smrg
59*4c3eb207Smrg  /**
60*4c3eb207Smrg   * @defgroup bit_manip Bit manipulation
61*4c3eb207Smrg   * @ingroup numerics
62*4c3eb207Smrg   *
63*4c3eb207Smrg   * Utilities for examining and manipulating individual bits.
64*4c3eb207Smrg   *
65*4c3eb207Smrg   * @{
66*4c3eb207Smrg   */
67*4c3eb207Smrg
68*4c3eb207Smrg  /// @cond undoc
69*4c3eb207Smrg
70627f7eb2Smrg  template<typename _Tp>
71627f7eb2Smrg    constexpr _Tp
72627f7eb2Smrg    __rotl(_Tp __x, int __s) noexcept
73627f7eb2Smrg    {
74*4c3eb207Smrg      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
75627f7eb2Smrg      const int __r = __s % _Nd;
76627f7eb2Smrg      if (__r == 0)
77627f7eb2Smrg	return __x;
78627f7eb2Smrg      else if (__r > 0)
79627f7eb2Smrg	return (__x << __r) | (__x >> ((_Nd - __r) % _Nd));
80627f7eb2Smrg      else
81627f7eb2Smrg	return (__x >> -__r) | (__x << ((_Nd + __r) % _Nd)); // rotr(x, -r)
82627f7eb2Smrg    }
83627f7eb2Smrg
84627f7eb2Smrg  template<typename _Tp>
85627f7eb2Smrg    constexpr _Tp
86627f7eb2Smrg    __rotr(_Tp __x, int __s) noexcept
87627f7eb2Smrg    {
88*4c3eb207Smrg      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
89627f7eb2Smrg      const int __r = __s % _Nd;
90627f7eb2Smrg      if (__r == 0)
91627f7eb2Smrg	return __x;
92627f7eb2Smrg      else if (__r > 0)
93627f7eb2Smrg	return (__x >> __r) | (__x << ((_Nd - __r) % _Nd));
94627f7eb2Smrg      else
95627f7eb2Smrg	return (__x << -__r) | (__x >> ((_Nd + __r) % _Nd)); // rotl(x, -r)
96627f7eb2Smrg    }
97627f7eb2Smrg
98627f7eb2Smrg  template<typename _Tp>
99627f7eb2Smrg    constexpr int
100627f7eb2Smrg    __countl_zero(_Tp __x) noexcept
101627f7eb2Smrg    {
102*4c3eb207Smrg      using __gnu_cxx::__int_traits;
103*4c3eb207Smrg      constexpr auto _Nd = __int_traits<_Tp>::__digits;
104627f7eb2Smrg
105627f7eb2Smrg      if (__x == 0)
106627f7eb2Smrg        return _Nd;
107627f7eb2Smrg
108*4c3eb207Smrg      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
109*4c3eb207Smrg      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
110*4c3eb207Smrg      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
111627f7eb2Smrg
112627f7eb2Smrg      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
113627f7eb2Smrg	{
114627f7eb2Smrg	  constexpr int __diff = _Nd_u - _Nd;
115627f7eb2Smrg	  return __builtin_clz(__x) - __diff;
116627f7eb2Smrg	}
117627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
118627f7eb2Smrg	{
119627f7eb2Smrg	  constexpr int __diff = _Nd_ul - _Nd;
120627f7eb2Smrg	  return __builtin_clzl(__x) - __diff;
121627f7eb2Smrg	}
122627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
123627f7eb2Smrg	{
124627f7eb2Smrg	  constexpr int __diff = _Nd_ull - _Nd;
125627f7eb2Smrg	  return __builtin_clzll(__x) - __diff;
126627f7eb2Smrg	}
127627f7eb2Smrg      else // (_Nd > _Nd_ull)
128627f7eb2Smrg	{
129627f7eb2Smrg	  static_assert(_Nd <= (2 * _Nd_ull),
130627f7eb2Smrg			"Maximum supported integer size is 128-bit");
131627f7eb2Smrg
132627f7eb2Smrg	  unsigned long long __high = __x >> _Nd_ull;
133627f7eb2Smrg	  if (__high != 0)
134627f7eb2Smrg	    {
135627f7eb2Smrg	      constexpr int __diff = (2 * _Nd_ull) - _Nd;
136627f7eb2Smrg	      return __builtin_clzll(__high) - __diff;
137627f7eb2Smrg	    }
138*4c3eb207Smrg	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
139627f7eb2Smrg	  unsigned long long __low = __x & __max_ull;
140627f7eb2Smrg	  return (_Nd - _Nd_ull) + __builtin_clzll(__low);
141627f7eb2Smrg	}
142627f7eb2Smrg    }
143627f7eb2Smrg
144627f7eb2Smrg  template<typename _Tp>
145627f7eb2Smrg    constexpr int
146627f7eb2Smrg    __countl_one(_Tp __x) noexcept
147627f7eb2Smrg    {
148627f7eb2Smrg      return std::__countl_zero<_Tp>((_Tp)~__x);
149627f7eb2Smrg    }
150627f7eb2Smrg
151627f7eb2Smrg  template<typename _Tp>
152627f7eb2Smrg    constexpr int
153627f7eb2Smrg    __countr_zero(_Tp __x) noexcept
154627f7eb2Smrg    {
155*4c3eb207Smrg      using __gnu_cxx::__int_traits;
156*4c3eb207Smrg      constexpr auto _Nd = __int_traits<_Tp>::__digits;
157627f7eb2Smrg
158627f7eb2Smrg      if (__x == 0)
159627f7eb2Smrg        return _Nd;
160627f7eb2Smrg
161*4c3eb207Smrg      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
162*4c3eb207Smrg      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
163*4c3eb207Smrg      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
164627f7eb2Smrg
165627f7eb2Smrg      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
166627f7eb2Smrg	return __builtin_ctz(__x);
167627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
168627f7eb2Smrg	return __builtin_ctzl(__x);
169627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
170627f7eb2Smrg	return __builtin_ctzll(__x);
171627f7eb2Smrg      else // (_Nd > _Nd_ull)
172627f7eb2Smrg	{
173627f7eb2Smrg	  static_assert(_Nd <= (2 * _Nd_ull),
174627f7eb2Smrg			"Maximum supported integer size is 128-bit");
175627f7eb2Smrg
176*4c3eb207Smrg	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
177627f7eb2Smrg	  unsigned long long __low = __x & __max_ull;
178627f7eb2Smrg	  if (__low != 0)
179627f7eb2Smrg	    return __builtin_ctzll(__low);
180627f7eb2Smrg	  unsigned long long __high = __x >> _Nd_ull;
181627f7eb2Smrg	  return __builtin_ctzll(__high) + _Nd_ull;
182627f7eb2Smrg	}
183627f7eb2Smrg    }
184627f7eb2Smrg
185627f7eb2Smrg  template<typename _Tp>
186627f7eb2Smrg    constexpr int
187627f7eb2Smrg    __countr_one(_Tp __x) noexcept
188627f7eb2Smrg    {
189627f7eb2Smrg      return std::__countr_zero((_Tp)~__x);
190627f7eb2Smrg    }
191627f7eb2Smrg
192627f7eb2Smrg  template<typename _Tp>
193627f7eb2Smrg    constexpr int
194627f7eb2Smrg    __popcount(_Tp __x) noexcept
195627f7eb2Smrg    {
196*4c3eb207Smrg      using __gnu_cxx::__int_traits;
197*4c3eb207Smrg      constexpr auto _Nd = __int_traits<_Tp>::__digits;
198627f7eb2Smrg
199*4c3eb207Smrg      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
200*4c3eb207Smrg      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
201*4c3eb207Smrg      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
202627f7eb2Smrg
203627f7eb2Smrg      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
204627f7eb2Smrg	return __builtin_popcount(__x);
205627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
206627f7eb2Smrg	return __builtin_popcountl(__x);
207627f7eb2Smrg      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
208627f7eb2Smrg	return __builtin_popcountll(__x);
209627f7eb2Smrg      else // (_Nd > _Nd_ull)
210627f7eb2Smrg	{
211627f7eb2Smrg	  static_assert(_Nd <= (2 * _Nd_ull),
212627f7eb2Smrg			"Maximum supported integer size is 128-bit");
213627f7eb2Smrg
214*4c3eb207Smrg	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
215627f7eb2Smrg	  unsigned long long __low = __x & __max_ull;
216627f7eb2Smrg	  unsigned long long __high = __x >> _Nd_ull;
217627f7eb2Smrg	  return __builtin_popcountll(__low) + __builtin_popcountll(__high);
218627f7eb2Smrg	}
219627f7eb2Smrg    }
220627f7eb2Smrg
221627f7eb2Smrg  template<typename _Tp>
222627f7eb2Smrg    constexpr bool
223*4c3eb207Smrg    __has_single_bit(_Tp __x) noexcept
224627f7eb2Smrg    { return std::__popcount(__x) == 1; }
225627f7eb2Smrg
226627f7eb2Smrg  template<typename _Tp>
227627f7eb2Smrg    constexpr _Tp
228*4c3eb207Smrg    __bit_ceil(_Tp __x) noexcept
229627f7eb2Smrg    {
230*4c3eb207Smrg      using __gnu_cxx::__int_traits;
231*4c3eb207Smrg      constexpr auto _Nd = __int_traits<_Tp>::__digits;
232627f7eb2Smrg      if (__x == 0 || __x == 1)
233627f7eb2Smrg        return 1;
234627f7eb2Smrg      auto __shift_exponent = _Nd - std::__countl_zero((_Tp)(__x - 1u));
235627f7eb2Smrg      // If the shift exponent equals _Nd then the correct result is not
236627f7eb2Smrg      // representable as a value of _Tp, and so the result is undefined.
237627f7eb2Smrg      // Want that undefined behaviour to be detected in constant expressions,
238627f7eb2Smrg      // by UBSan, and by debug assertions.
239627f7eb2Smrg#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
240627f7eb2Smrg      if (!__builtin_is_constant_evaluated())
241*4c3eb207Smrg	{
242*4c3eb207Smrg	  __glibcxx_assert( __shift_exponent != __int_traits<_Tp>::__digits );
243*4c3eb207Smrg	}
244627f7eb2Smrg#endif
245627f7eb2Smrg      using __promoted_type = decltype(__x << 1);
246627f7eb2Smrg      if _GLIBCXX17_CONSTEXPR (!is_same<__promoted_type, _Tp>::value)
247627f7eb2Smrg	{
248627f7eb2Smrg	  // If __x undergoes integral promotion then shifting by _Nd is
249627f7eb2Smrg	  // not undefined. In order to make the shift undefined, so that
250627f7eb2Smrg	  // it is diagnosed in constant expressions and by UBsan, we also
251627f7eb2Smrg	  // need to "promote" the shift exponent to be too large for the
252627f7eb2Smrg	  // promoted type.
253627f7eb2Smrg	  const int __extra_exp = sizeof(__promoted_type) / sizeof(_Tp) / 2;
254627f7eb2Smrg	  __shift_exponent |= (__shift_exponent & _Nd) << __extra_exp;
255627f7eb2Smrg	}
256627f7eb2Smrg      return (_Tp)1u << __shift_exponent;
257627f7eb2Smrg    }
258627f7eb2Smrg
259627f7eb2Smrg  template<typename _Tp>
260627f7eb2Smrg    constexpr _Tp
261*4c3eb207Smrg    __bit_floor(_Tp __x) noexcept
262627f7eb2Smrg    {
263*4c3eb207Smrg      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
264627f7eb2Smrg      if (__x == 0)
265627f7eb2Smrg        return 0;
266627f7eb2Smrg      return (_Tp)1u << (_Nd - std::__countl_zero((_Tp)(__x >> 1)));
267627f7eb2Smrg    }
268627f7eb2Smrg
269627f7eb2Smrg  template<typename _Tp>
270627f7eb2Smrg    constexpr _Tp
271*4c3eb207Smrg    __bit_width(_Tp __x) noexcept
272627f7eb2Smrg    {
273*4c3eb207Smrg      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
274627f7eb2Smrg      return _Nd - std::__countl_zero(__x);
275627f7eb2Smrg    }
276627f7eb2Smrg
277*4c3eb207Smrg  /// @endcond
278*4c3eb207Smrg
279627f7eb2Smrg#if __cplusplus > 201703L
280627f7eb2Smrg
281*4c3eb207Smrg#define __cpp_lib_bitops 201907L
282627f7eb2Smrg
283*4c3eb207Smrg  /// @cond undoc
284627f7eb2Smrg  template<typename _Tp, typename _Up = _Tp>
285627f7eb2Smrg    using _If_is_unsigned_integer
286*4c3eb207Smrg      = enable_if_t<__is_unsigned_integer<_Tp>::value, _Up>;
287*4c3eb207Smrg  /// @endcond
288627f7eb2Smrg
289627f7eb2Smrg  // [bit.rot], rotating
290627f7eb2Smrg
291*4c3eb207Smrg  /// Rotate `x` to the left by `s` bits.
292627f7eb2Smrg  template<typename _Tp>
293627f7eb2Smrg    [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp>
294627f7eb2Smrg    rotl(_Tp __x, int __s) noexcept
295627f7eb2Smrg    { return std::__rotl(__x, __s); }
296627f7eb2Smrg
297*4c3eb207Smrg  /// Rotate `x` to the right by `s` bits.
298627f7eb2Smrg  template<typename _Tp>
299627f7eb2Smrg    [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp>
300627f7eb2Smrg    rotr(_Tp __x, int __s) noexcept
301627f7eb2Smrg    { return std::__rotr(__x, __s); }
302627f7eb2Smrg
303627f7eb2Smrg  // [bit.count], counting
304627f7eb2Smrg
305*4c3eb207Smrg  /// The number of contiguous zero bits, starting from the highest bit.
306627f7eb2Smrg  template<typename _Tp>
307627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, int>
308627f7eb2Smrg    countl_zero(_Tp __x) noexcept
309627f7eb2Smrg    { return std::__countl_zero(__x); }
310627f7eb2Smrg
311*4c3eb207Smrg  /// The number of contiguous one bits, starting from the highest bit.
312627f7eb2Smrg  template<typename _Tp>
313627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, int>
314627f7eb2Smrg    countl_one(_Tp __x) noexcept
315627f7eb2Smrg    { return std::__countl_one(__x); }
316627f7eb2Smrg
317*4c3eb207Smrg  /// The number of contiguous zero bits, starting from the lowest bit.
318627f7eb2Smrg  template<typename _Tp>
319627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, int>
320627f7eb2Smrg    countr_zero(_Tp __x) noexcept
321627f7eb2Smrg    { return std::__countr_zero(__x); }
322627f7eb2Smrg
323*4c3eb207Smrg  /// The number of contiguous one bits, starting from the lowest bit.
324627f7eb2Smrg  template<typename _Tp>
325627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, int>
326627f7eb2Smrg    countr_one(_Tp __x) noexcept
327627f7eb2Smrg    { return std::__countr_one(__x); }
328627f7eb2Smrg
329*4c3eb207Smrg  /// The number of bits set in `x`.
330627f7eb2Smrg  template<typename _Tp>
331627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, int>
332627f7eb2Smrg    popcount(_Tp __x) noexcept
333627f7eb2Smrg    { return std::__popcount(__x); }
334627f7eb2Smrg
335627f7eb2Smrg  // [bit.pow.two], integral powers of 2
336627f7eb2Smrg
337*4c3eb207Smrg#define __cpp_lib_int_pow2 202002L
338*4c3eb207Smrg
339*4c3eb207Smrg  /// True if `x` is a power of two, false otherwise.
340627f7eb2Smrg  template<typename _Tp>
341627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp, bool>
342*4c3eb207Smrg    has_single_bit(_Tp __x) noexcept
343*4c3eb207Smrg    { return std::__has_single_bit(__x); }
344627f7eb2Smrg
345*4c3eb207Smrg  /// The smallest power-of-two not less than `x`.
346627f7eb2Smrg  template<typename _Tp>
347627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp>
348*4c3eb207Smrg    bit_ceil(_Tp __x) noexcept
349*4c3eb207Smrg    { return std::__bit_ceil(__x); }
350627f7eb2Smrg
351*4c3eb207Smrg  /// The largest power-of-two not greater than `x`.
352627f7eb2Smrg  template<typename _Tp>
353627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp>
354*4c3eb207Smrg    bit_floor(_Tp __x) noexcept
355*4c3eb207Smrg    { return std::__bit_floor(__x); }
356627f7eb2Smrg
357*4c3eb207Smrg  /// The smallest integer greater than the base-2 logarithm of `x`.
358627f7eb2Smrg  template<typename _Tp>
359627f7eb2Smrg    constexpr _If_is_unsigned_integer<_Tp>
360*4c3eb207Smrg    bit_width(_Tp __x) noexcept
361*4c3eb207Smrg    { return std::__bit_width(__x); }
362627f7eb2Smrg
363627f7eb2Smrg#define __cpp_lib_endian 201907L
364627f7eb2Smrg
365627f7eb2Smrg  /// Byte order
366627f7eb2Smrg  enum class endian
367627f7eb2Smrg  {
368627f7eb2Smrg    little = __ORDER_LITTLE_ENDIAN__,
369627f7eb2Smrg    big    = __ORDER_BIG_ENDIAN__,
370627f7eb2Smrg    native = __BYTE_ORDER__
371627f7eb2Smrg  };
372627f7eb2Smrg#endif // C++2a
373627f7eb2Smrg
374*4c3eb207Smrg  /// @}
375*4c3eb207Smrg
376627f7eb2Smrg_GLIBCXX_END_NAMESPACE_VERSION
377627f7eb2Smrg} // namespace std
378627f7eb2Smrg
379627f7eb2Smrg#endif // C++14
380627f7eb2Smrg#endif // _GLIBCXX_BIT
381