]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Avoid ill-formed types on ARM
authorMatthias Kretz <m.kretz@gsi.de>
Wed, 17 Apr 2024 07:11:25 +0000 (09:11 +0200)
committerMatthias Kretz <m.kretz@gsi.de>
Wed, 17 Apr 2024 08:33:56 +0000 (10:33 +0200)
This resolves failing tests in check-simd.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:

PR libstdc++/114750
* include/experimental/bits/simd_builtin.h
(_SimdImplBuiltin::_S_load, _S_store): Fall back to copying
scalars if the memory type cannot be vectorized for the target.

libstdc++-v3/include/experimental/bits/simd_builtin.h

index 28227a5d97f4575e0d91d8e97950395689852660..af0c4886108bde5bd968bda0e934fd13f6fdf71a 100644 (file)
@@ -1464,7 +1464,7 @@ template <typename _Abi, typename>
                   [&](auto __i) constexpr {
                     return static_cast<_Tp>(__i < _Np ? __mem[__i] : 0);
                   });
-       else if constexpr (sizeof(_Up) > 8)
+       else if constexpr (sizeof(_Up) > 8 or __vectorized_sizeof<_Up>() <= sizeof(_Up))
          return __generate_vector<_Tp, _SimdMember<_Tp>::_S_full_size>(
                   [&](auto __i) constexpr _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
                     return static_cast<_Tp>(__i < _Np ? __mem[__i] : 0);
@@ -1536,7 +1536,7 @@ template <typename _Abi, typename>
            for (size_t __i = 0; __i < _Np; ++__i)
              __mem[__i] = __v[__i];
          }
-       else if constexpr (sizeof(_Up) > 8)
+       else if constexpr (sizeof(_Up) > 8 or __vectorized_sizeof<_Up>() <= sizeof(_Up))
          __execute_n_times<_Np>([&](auto __i) constexpr _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
            __mem[__i] = __v[__i];
          });