On Mon, 22 May 2023 at 16:36, Matthias Kretz via Libstdc++ < libstdc++@gcc.gnu.org> wrote: > OK for trunk and backporting? > > regtested on x86_64-linux and aarch64-linux > > The constexpr API is only available with -std=gnu++XX (and proposed for > C++26). The proposal is to have the complete simd API usable in constant > expressions. > > This patch resolves several issues with using simd in constant > expressions. > > Issues why constant_evaluated branches are necessary: > I note that using if (not __builtin_constant_evaluated()) will fail if compiled with -fno-operator-names, which is why we don't use 'not', 'and', etc. elsewhere in libstdc++. I don't know if (or why) anybody uses that option though, so I don't think you need to hange anything in stdx::simd. > * subscripting vector builtins is not allowed in constant expressions > Is that just because nobody made it work (yet)? * if the implementation needs/uses memcpy > * if the implementation would otherwise call SIMD intrinsics/builtins > The indentation looks off here and in the _M_set member function following it: operator[](size_t __i) const noexcept { if constexpr (_S_tuple_size == 1) return _M_subscript_read(__i); else - { #ifdef _GLIBCXX_SIMD_USE_ALIASING_LOADS - return reinterpret_cast*>(this)[__i]; -#else - if constexpr (__is_scalar_abi<_Abi0>()) - { - const _Tp* ptr = &first; - return ptr[__i]; - } - else - return __i < simd_size_v<_Tp, _Abi0> - ? _M_subscript_read(__i) - : second[__i - simd_size_v<_Tp, _Abi0>]; + if (not __builtin_is_constant_evaluated()) + return reinterpret_cast*>(this)[__i]; + else #endif + if constexpr (__is_scalar_abi<_Abi0>()) + { + const _Tp* ptr = &first; + return ptr[__i]; } + else + return __i < simd_size_v<_Tp, _Abi0> ? _M_subscript_read(__i) + : second[__i - simd_size_v<_Tp, _Abi0>]; } Are the copyright years on testsuite/experimental/simd/pr109261_constexpr_simd.cc correct, or just copy&paste?