16 #include <type_traits> 52 template <
typename scalar_t,
size_t length>
57 template <
typename scalar_t,
size_t length>
59 requires is_power_of_two(length)
61 struct builtin_simd<scalar_t, length>
64 #if SEQAN3_DOXYGEN_ONLY(1)0 65 using type = scalar_t __attribute__((vector_size(
sizeof(scalar_t) * length))));
67 #elif defined(__clang__) 68 using type = scalar_t __attribute__((ext_vector_type(length)));
70 using type [[gnu::vector_size(
sizeof(scalar_t) * length)]] = scalar_t;
78 template <
typename builtin_simd_t>
86 template <
typename builtin_simd_t>
90 requires !std::is_pointer_v<std::decay_t<builtin_simd_t>> && requires(builtin_simd_t simd)
95 struct builtin_simd_traits_helper<builtin_simd_t>
100 static constexpr
auto length = min_viable_uint_v<
sizeof(builtin_simd_t) /
sizeof(scalar_type)>;
104 static constexpr
bool value = is_power_of_two(length) && 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>
129 constexpr
auto default_simd_max_length<builtin_simd> = []()
131 #if defined(__AVX512F__) 132 return min_viable_uint_v<64u>;
133 #elif defined(__AVX2__) 134 return min_viable_uint_v<32u>;
135 #elif defined(__SSE4_1__) && defined(__SSE4_2__) 136 return min_viable_uint_v<16u>;
138 return min_viable_uint_v<0u>;
147 inline namespace simd
155 template <
typename builtin_simd_t>
157 requires detail::is_builtin_simd<builtin_simd_t>::value
159 struct simd_traits<builtin_simd_t>
162 using scalar_type =
typename detail::builtin_simd_traits_helper<builtin_simd_t>::scalar_type;
164 static constexpr
auto length = detail::builtin_simd_traits_helper<builtin_simd_t>::length;
166 static constexpr
auto max_length = length == 1u ? length :
sizeof(scalar_type) * length;
168 static_assert(std::is_integral_v<scalar_type>,
"For now we assume that builtin simd can only be integers");
170 using mask_type = decltype(std::declval<builtin_simd_t>() == std::declval<builtin_simd_t>());
172 using swizzle_type =
typename detail::builtin_simd<uint8_t, max_length>::type;
Provides seqan3::simd::simd_traits.
Provides metaprogramming utilities for integer types.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:35
Provides utility functions for bit twiddling.
Provides seqan3::detail::default_simd_length and seqan3::detail::default_simd_max_length.