On Wed, 1 Jul 2026 at 13:33, Matthias Kretz <[email protected]> wrote:
>
> Jonathan Wakely [Wednesday, 1 July 2026, 12:55:41 CEST]:
> > On Wed, 03 Jun 2026 at 05:42 +0000, Matthias Kretz via Sourceware Forge
> wrote:
> > >+ template <typename _T0, typename _T1>
> > >+ constexpr void
> > >+ __check_hi_bits_for_zero(const __trivial_pair<_T0, _T1>& __p)
> > >+ {
> > >+ __check_hi_bits_for_zero(__p._M_first);
> > >+ __check_hi_bits_for_zero(__p._M_second);
> >
> > Do we care about qualifying these to suppress ADL?
>
> std::simd::__check_hi_bits_for_zero? 🤷 I can't imagine how ADL could turn this
> into a problem. All involved types are either standard integral types or
> std::simd::__trivial_pair.
Yeah, it won't find anything. And simd::__trivial_pair is already
complete, so I don't think we'll get problems related to incomplete
types.
>
> Would full qualification be cheaper to compile (in theory)?
Maybe very slightly. For me it also looks a bit simpler because I
don't have to consider whether ADL was intended, or whether it does
anything.
>
> If I do, also qualifying __unwrap_pairs_to_ullong, __unwrap_pairs_to_bitset,
> and __bitset_to_pairs would be consistent:
Yeah, I was thinking about ADL for all of them.
The patch is OK with the new calls in this function qualified. Thanks.
>
> > >+ }
> > >+
> > >+ constexpr unsigned long long
> > >+ __unwrap_pairs_to_ullong(unsigned_integral auto __x)
> > >+ { return __x; }
> > >+
> > >+ template <typename _T0, typename _T1>
> > >+ constexpr unsigned long long
> > >+ __unwrap_pairs_to_ullong(const __trivial_pair<_T0, _T1>& __p)
> > >+ {
> > >+ __check_hi_bits_for_zero(__p._M_second);
> > >+ return __unwrap_pairs_to_ullong(__p._M_first);
> > >+ }
> > >+
> > >+ template <int _Np>
> > >+ constexpr bitset<_Np>
> > >+ __unwrap_pairs_to_bitset(unsigned_integral auto __x)
> > >+ {
> > >+ static_assert(_Np <= 64);
> > >+ return __x;
> > >+ }
> > >+
> > >+ template <size_t _Np, typename _T0, typename _T1>
> > >+ constexpr bitset<_Np>
> > >+ __unwrap_pairs_to_bitset(const __trivial_pair<_T0, _T1>& __p)
> > >+ {
> > >+ constexpr size_t _N0 = __bit_floor(_Np);
> > >+ constexpr size_t _N1 = _Np - _N0;
> > >+ static_assert(_N0 % 64 == 0);
> > >+ struct _Tmp
> > >+ {
> > >+ bitset<__bit_floor(_Np)> _M_lo;
> > >+ bitset<_Np - __bit_floor(_Np)> _M_hi;
> > >+ };
> > >+ _Tmp __tmp = {__unwrap_pairs_to_bitset<_N0>(__p._M_first),
> > >+ __unwrap_pairs_to_bitset<_N1>(__p._M_second)};
> > >+ return __builtin_bit_cast(bitset<_Np>, __tmp);
> > >+ }
> > >+
> > >+ template <size_t _Bytes>
> > >+ consteval auto
> > >+ __tree_of_ulong()
> > >+ {
> > >+ static constexpr size_t _N0 = __bit_floor(_Bytes - 1);
> > >+ static constexpr size_t _N1 = _Bytes - _N0;
> > >+ if constexpr (_Bytes <= sizeof(unsigned long))
> > >+ return 0ul;
> > >+ else
> > >+ return __trivial_pair {__tree_of_ulong<_N0>(),
> __tree_of_ulong<_N1>()};
> > >+ }
> > >+
> > >+ template <size_t _Bytes>
> > >+ using __tree_of_ulong_t = decltype(__tree_of_ulong<_Bytes>());
> > >+
> > >+ template <size_t _Np>
> > >+ constexpr auto
> > >+ __bitset_to_pairs(const bitset<_Np>& __b) noexcept
> > >+ {
> > >+ if constexpr (_Np <= 64)
> > >+ return __b.to_ullong();
> > >+ else
> > >+ return __builtin_bit_cast(__tree_of_ulong_t<__div_ceil(_Np,
> > >size_t(__CHAR_BIT__))>, __b); + }
>
> --
> ──────────────────────────────────────────────────────────────────────────
> Dr. Matthias Kretz https://mattkretz.github.io
> GSI Helmholtz Center for Heavy Ion Research https://gsi.de
> std::simd
> ──────────────────────────────────────────────────────────────────────────
>
>
>