]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Implement std::philox_engine for targets without __int128
authorJonathan Wakely <jwakely@redhat.com>
Wed, 17 Dec 2025 12:42:12 +0000 (12:42 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 17 Dec 2025 20:41:31 +0000 (20:41 +0000)
commit12084561db6c17158d268f4e22a8a6fe047f6f35
treeb7687a9f59fccb0be1858cb7e9415fdbdaacb798
parenta9eb2f24b01bea3193bdb77cc2aa13d6fbd0f754
libstdc++: Implement std::philox_engine for targets without __int128

This moves the __detail::_Select_uint_least_t<N>::type class to
namespace scope and extends it with more 128-bit arithmetic operations,
implemented in terms of uint64_t.

Now std::philox_engine can use _Select_uint_least_t<w*2>::type instead
of __uint128_t, so that it works on targets without 128-bit integers.
This also means that targets that do support __uint128_t only use it
when actually necessary, so that we use uint64_t when generating a
32-bit result (e.g. with std::philox4x32).

libstdc++-v3/ChangeLog:

* include/bits/random.h [!__SIZEOF_INT128__] (__rand_uint128):
Refactor and rename _Select_uint_least_t<128>::type to a new
class. Make all members constexpr. Add new member functions for
additional arithmetic and bitwise operations, and comparisons.
(__detail::_Select_uint_least_t<>::type): Define as an alias of
__rand_uint128.
* include/bits/random.tcc (philox_engine::_M_mulhi): Use
_Select_uint_least_t<w*2>::type instead of __uint128_t.
(philox_engine::_M_transition): Likewise.
* include/bits/version.def (philox_engine): Remove extra_cond.
* include/bits/version.h: Regenerate.
* testsuite/26_numerics/random/philox4x32.cc: Remove
dg-require-cpp-feature-test directive.
* testsuite/26_numerics/random/philox4x64.cc: Likewise.
* testsuite/26_numerics/random/philox_engine/cons/copy.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/cons/default.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/cons/seed.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/operators/equal.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/operators/serialize.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/requirements/constants.cc:
Likewise.
* testsuite/26_numerics/random/philox_engine/requirements/typedefs.cc:
Likewise.

Co-authored-by: Jakub Jelinek <jakub@redhat.com>
Reviewed-by: Tomasz KamiƄski <tkaminsk@redhat.com>
13 files changed:
libstdc++-v3/include/bits/random.h
libstdc++-v3/include/bits/random.tcc
libstdc++-v3/include/bits/version.def
libstdc++-v3/include/bits/version.h
libstdc++-v3/testsuite/26_numerics/random/philox4x32.cc
libstdc++-v3/testsuite/26_numerics/random/philox4x64.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/cons/copy.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/cons/default.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/cons/seed.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/operators/equal.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/operators/serialize.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/requirements/constants.cc
libstdc++-v3/testsuite/26_numerics/random/philox_engine/requirements/typedefs.cc