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
> ──────────────────────────────────────────────────────────────────────────
>
>
>

Reply via email to