]> 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>
Fri, 10 May 2024 14:06:51 +0000 (16:06 +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 9c8094d70167ffa7b835d08efa550d7995d4c887..9703012a6d952dce2cefaf1b83510cfdfb0aaf42 100644 (file)
@@ -1460,7 +1460,7 @@ template <typename _Abi>
                   [&](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);
@@ -1532,7 +1532,7 @@ template <typename _Abi>
            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];
          });