17 #include <type_traits>
24 namespace seqan3::detail
52 template <
typename scalar_t,
size_t length>
57 template <
typename scalar_t,
size_t length>
58 requires (std::has_single_bit(length))
59 struct builtin_simd<scalar_t, length>
62 #if SEQAN3_DOXYGEN_ONLY(1) 0
63 using type = scalar_t __attribute__((vector_size(
sizeof(scalar_t) * length))));
65 #elif defined(__clang__)
66 using type = scalar_t __attribute__((ext_vector_type(length)));
68 using type [[gnu::vector_size(
sizeof(scalar_t) * length)]] = scalar_t;
76 template <
typename builtin_simd_t>
84 template <
typename builtin_simd_t>
94 struct builtin_simd_traits_helper<builtin_simd_t>
99 static constexpr
auto length =
sizeof(builtin_simd_t) /
sizeof(scalar_type);
103 static constexpr
bool value =
104 std::has_single_bit(length)
105 && std::is_same_v<builtin_simd_t, transformation_trait_or_t<builtin_simd<scalar_type, length>,
void>>;
116 template <
typename builtin_simd_t>
117 struct is_builtin_simd :
std::bool_constant<builtin_simd_traits_helper<builtin_simd_t>::value>
125 template <
typename builtin_simd_t>
126 constexpr
bool is_builtin_simd_v = is_builtin_simd<builtin_simd_t>::value;
137 constexpr
auto default_simd_max_length<builtin_simd> = []()
139 #if defined(__AVX512F__)
140 return min_viable_uint_v<64u>;
141 #elif defined(__AVX2__)
142 return min_viable_uint_v<32u>;
143 #elif defined(__SSE4_1__) && defined(__SSE4_2__)
144 return min_viable_uint_v<16u>;
146 return min_viable_uint_v<0u>;
162 template <
typename builtin_simd_t>
163 struct is_native_builtin_simd :
165 && ((builtin_simd_traits_helper<builtin_simd_t>::length
166 * sizeof(typename builtin_simd_traits_helper<builtin_simd_t>::scalar_type))
168 && ((builtin_simd_traits_helper<builtin_simd_t>::length
169 * sizeof(typename builtin_simd_traits_helper<builtin_simd_t>::scalar_type))
178 template <
typename builtin_simd_t>
179 constexpr
bool is_native_builtin_simd_v = is_native_builtin_simd<builtin_simd_t>::value;
186 inline namespace simd
194 template <
typename builtin_simd_t>
196 requires detail::is_builtin_simd<builtin_simd_t>::value
198 struct simd_traits<builtin_simd_t>
201 using scalar_type =
typename detail::builtin_simd_traits_helper<builtin_simd_t>::scalar_type;
203 static constexpr
auto length = detail::builtin_simd_traits_helper<builtin_simd_t>::length;
205 static constexpr
auto max_length = length == 1u ? length :
sizeof(scalar_type) * length;
207 static_assert(std::is_integral_v<scalar_type>,
"For now we assume that builtin simd can only be integers");
209 using mask_type = decltype(std::declval<builtin_simd_t>() == std::declval<builtin_simd_t>());
211 using swizzle_type =
typename detail::builtin_simd<uint8_t, max_length>::type;
214 template <
typename new_scalar_type>
216 requires (
sizeof(scalar_type) ==
sizeof(new_scalar_type))
218 using rebind =
typename detail::builtin_simd<new_scalar_type, length>::type;
The <bit> header from C++20's standard library.
Provides seqan3::detail::default_simd_length and seqan3::detail::default_simd_max_length.
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
Provides metaprogramming utilities for integer types.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides seqan3::simd::simd_traits.