10template <
class T,
class AbiT,
class I,
class AbiI>
17template <
class T1,
class T2>
19 std::integral<T1> && std::integral<T2> &&
sizeof(T1) ==
sizeof(T2) && !std::same_as<T1, T2>;
21template <std::
integral I>
23 if constexpr (std::is_signed_v<I> &&
sizeof(I) ==
sizeof(int32_t)) {
24 return static_cast<int32_t
>(i);
25 }
else if constexpr (std::is_unsigned_v<I> &&
sizeof(I) ==
sizeof(int32_t)) {
26 return static_cast<uint32_t
>(i);
27 }
else if constexpr (std::is_signed_v<I> &&
sizeof(I) ==
sizeof(int64_t)) {
28 return static_cast<int64_t
>(i);
29 }
else if constexpr (std::is_unsigned_v<I> &&
sizeof(I) ==
sizeof(int64_t)) {
30 return static_cast<uint64_t
>(i);
33template <std::
integral I>
38#if defined(__AVX512F__)
39#include <batmat/ops/avx-512/gather.hpp>
40#elif defined(__AVX2__)
41#include <batmat/ops/avx2/gather.hpp>
55template <
class T,
class AbiT,
class I,
class AbiI,
class M>
61#if BATMAT_WITH_GSI_HPC_SIMD
63 const auto idx_ = std::bit_cast<isimd>(idx);
66 const auto idx_ = simd_cast<isimd>(idx);
datapar::simd< T, AbiT > gather(const T *p, datapar::simd< I, AbiI > idx, M mask)
Gathers elements from memory at the addresses specified by idx, which should be an integer SIMD vecto...
stdx::rebind_simd_t< T, V > rebind_simd_t
stdx::simd< Tp, Abi > simd
datapar::simd< T, AbiT > gather(datapar::simd< T, AbiT > src, typename datapar::simd< T, AbiT >::mask_type mask, datapar::simd< I, AbiI > vindex, const T *base_addr)
mask_type_t< T, AbiT > convert_mask(M mask)
Convert a SIMD mask to the appropriate intrinsic type.
decltype(convert_int(std::declval< I >())) convert_int_t