@@ -391,28 +391,6 @@ namespace xsimd
391391 }
392392
393393 // Scatter with runtime indexes.
394- namespace detail
395- {
396- template <size_t N, typename T, typename A, typename U, typename V, typename std::enable_if<N == 0 , int >::type = 0 >
397- XSIMD_INLINE void scatter (batch<T, A> const & src, U* dst,
398- batch<V, A> const & index,
399- ::xsimd::index<N> I) noexcept
400- {
401- dst[index.get (I)] = static_cast <U>(src.get (I));
402- }
403-
404- template <size_t N, typename T, typename A, typename U, typename V, typename std::enable_if<N != 0 , int >::type = 0 >
405- XSIMD_INLINE void
406- scatter (batch<T, A> const & src, U* dst, batch<V, A> const & index,
407- ::xsimd::index<N> I) noexcept
408- {
409- static_assert (N <= batch<V, A>::size, " Incorrect value in recursion!" );
410-
411- kernel::detail::scatter<N - 1 , T, A, U, V>(
412- src, dst, index, {});
413- dst[index.get (I)] = static_cast <U>(src.get (I));
414- }
415- } // namespace detail
416394
417395 template <typename A, typename T, typename V>
418396 XSIMD_INLINE void
@@ -422,8 +400,13 @@ namespace xsimd
422400 {
423401 static_assert (batch<T, A>::size == batch<V, A>::size,
424402 " Source and index sizes must match" );
425- kernel::detail::scatter<batch<V, A>::size - 1 , T, A, T, V>(
426- src, dst, index, {});
403+ alignas (A::alignment ()) T src_buffer[batch<T, A>::size];
404+ kernel::store_aligned<A>(&src_buffer[0 ], batch<T, A>(src), A {});
405+
406+ alignas (A::alignment ()) V index_buffer[batch<T, A>::size];
407+ kernel::store_aligned<A>(&index_buffer[0 ], batch<V, A>(index), A {});
408+ for (size_t i = 0 ; i < batch<T, A>::size; ++i)
409+ dst[index_buffer[i]] = src_buffer[i];
427410 }
428411
429412 template <typename A, typename T, typename U, typename V>
@@ -434,8 +417,13 @@ namespace xsimd
434417 {
435418 static_assert (batch<T, A>::size == batch<V, A>::size,
436419 " Source and index sizes must match" );
437- kernel::detail::scatter<batch<V, A>::size - 1 , T, A, U, V>(
438- src, dst, index, {});
420+ alignas (A::alignment ()) T src_buffer[batch<T, A>::size];
421+ kernel::store_aligned<A>(&src_buffer[0 ], batch<T, A>(src), A {});
422+
423+ alignas (A::alignment ()) V index_buffer[batch<T, A>::size];
424+ kernel::store_aligned<A>(&index_buffer[0 ], batch<V, A>(index), A {});
425+ for (size_t i = 0 ; i < batch<T, A>::size; ++i)
426+ dst[index_buffer[i]] = src_buffer[i];
439427 }
440428
441429 template <typename A, typename T, typename U, typename V>
@@ -447,7 +435,13 @@ namespace xsimd
447435 static_assert (batch<T, A>::size == batch<V, A>::size,
448436 " Source and index sizes must match" );
449437 const auto tmp = batch_cast<U>(src);
450- kernel::scatter<A>(tmp, dst, index, A {});
438+ alignas (A::alignment ()) U src_buffer[batch<T, A>::size];
439+ kernel::store_aligned<A>(&src_buffer[0 ], batch<U, A>(tmp), A {});
440+
441+ alignas (A::alignment ()) V index_buffer[batch<T, A>::size];
442+ kernel::store_aligned<A>(&index_buffer[0 ], batch<V, A>(index), A {});
443+ for (size_t i = 0 ; i < batch<T, A>::size; ++i)
444+ dst[index_buffer[i]] = src_buffer[i];
451445 }
452446
453447 // shuffle
0 commit comments