]> 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, 8 May 2024 12:22:17 +0000 (14:22 +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.

(cherry picked from commit 0fc7f3c6adc8543f55ec35b309016d9d9c4ddd35)

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

index 51034fec6931a5931b8fefacc7227487aa110b33..e060816c6eac05df3aa818a14441c13c402aaaee 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];
          });