[PATCH 1/3] libstdc++: Implement std::philox_engine for targets without __int128

Jonathan Wakely jwakely.gcc@gmail.com
Wed Dec 17 20:29:17 GMT 2025


On Wed, 17 Dec 2025 at 20:22, Tomasz Kaminski <tkaminsk@redhat.com> wrote:
>
>
>
> On Wed, Dec 17, 2025 at 8:51 PM Jonathan Wakely <jwakely@redhat.com> wrote:
>>
>> 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>
>> ---
>>
>> Tested x86_64-linux
>> Also checked -m32 and -D_GLIBCXX_USE_OLD_GENERATE_CANONICAL
>
> LGTM.
> I haven't fully verified the algorithms part of __int128, but they look ok in general.
> Checked, if additional operations are matching ones that were removed.

Thanks for checking it.

One reason for hoisting this class out of the _Select_uint_least_t
template was that it should be easier to add proper tests for the
operators now. I didn't do that as part of this fix, because the
priority was just to fix the failing tests, and because the tests for
std::uniform_real_distribution and std::linear_congruential_engine
contain checks that the results are as expected, which confirms that
the arithmetic is giving the expected answers for the current uses of
the class.


More information about the Libstdc++ mailing list