Make internal bit manipulation functions available in C++11
Internal bit manipulation functions are now constexpr and available for C++11, improving code quality and enabling more compile-time operations.
This commit enhances several internal bit manipulation functions within libstdc++, making them available as constexpr in C++11. Functions like __countl_zero, __countr_zero, __popcount, __bit_width, and __bit_floor now support C++11 compilation and can be evaluated at compile time. Specializations for __rand_uint128 are also provided, and __bit_floor is optimized for specific types to avoid unnecessary dependencies.
In Details
The patch backports constexpr availability for several bit manipulation intrinsics (__countl_zero, __countr_zero, __popcount, __bit_width, __bit_floor) to C++11. Previously, some required C++14 for constexpr usage. This involves splitting definitions between generic builtins and typed builtins and providing explicit template specializations for __detail::__rand_uint128 to avoid dependencies on __gnu_cxx::__int_traits and ensure correct selection for functions like __countl_one.
- constexpr
- A C++ keyword that denotes that a variable or function's value can be evaluated at compile time. This allows for optimizations and guarantees that certain operations can be performed during compilation rather than at runtime.
- C++11
- A major revision of the C++ programming language standard, introduced in 2011. It brought significant new features and improvements, including
constexpr, move semantics, and lambdas. - bit manipulation functions
- Functions that perform operations directly on the binary representation of numbers, such as counting leading/trailing zeros, population count (number of set bits), and bit width.
- __rand_uint128
- An internal type in libstdc++ likely representing an unsigned 128-bit integer, used for random number generation or other computations requiring large integer support.