79 template <
typename scalar_t,
size_t length>
84 template <
typename scalar_t,
size_t length>
86 requires is_power_of_two(length)
88 struct builtin_simd<scalar_t, length>
91 #if SEQAN3_DOXYGEN_ONLY(1)0 92 using type = scalar_t __attribute__((vector_size(
sizeof(scalar_t) * length))));
94 #elif defined(__clang__) 95 using type = scalar_t __attribute__((ext_vector_type(length)));
97 using type [[gnu::vector_size(
sizeof(scalar_t) * length)]] = scalar_t;
105 template <
typename builtin_simd_t>
106 struct builtin_simd_traits_helper : std::false_type
113 template <
typename builtin_simd_t>
115 requires requires (builtin_simd_t simd) { {simd[0]}; }
117 struct builtin_simd_traits_helper<builtin_simd_t>
120 using scalar_type = std::remove_reference_t<decltype(std::declval<builtin_simd_t>()[0])>;
122 static constexpr
auto length = min_viable_uint_v<
sizeof(builtin_simd_t) /
sizeof(scalar_type)>;
126 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>>;
138 template <
typename builtin_simd_t>
139 struct is_builtin_simd : std::bool_constant<builtin_simd_traits_helper<builtin_simd_t>::value>
151 constexpr
auto default_simd_max_length<builtin_simd> = []()
153 #if defined(__AVX512F__) 154 return min_viable_uint_v<64u>;
155 #elif defined(__AVX2__) 156 return min_viable_uint_v<32u>;
157 #elif defined(__SSE4_1__) && defined(__SSE4_2__) 158 return min_viable_uint_v<16u>;
160 return min_viable_uint_v<0u>;
169 inline namespace simd
177 template <
typename builtin_simd_t>
179 requires detail::is_builtin_simd<builtin_simd_t>::value
184 using scalar_type =
typename detail::builtin_simd_traits_helper<builtin_simd_t>::scalar_type;
186 static constexpr
auto length = detail::builtin_simd_traits_helper<builtin_simd_t>::length;
188 static constexpr
auto max_length = length == 1u ? length :
sizeof(
scalar_type) * length;
190 static_assert(std::is_integral_v<scalar_type>,
"For now we assume that builtin simd can only be integers");
192 using mask_type =
typename detail::builtin_simd<std::make_signed_t<scalar_type>, length>::type;
194 using swizzle_type =
typename detail::builtin_simd<uint8_t, max_length>::type;
Contains seqan3::simd::simd_traits.
typename detail::builtin_simd< uint8_t, max_length >::type swizzle_type
The type used to define how to swizzle a simd vector (is not defined if simd_t does not satisfy seqan...
Definition: builtin_simd.hpp:194
Contains metaprogramming utilities for integer types.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
typename detail::builtin_simd_traits_helper< builtin_simd_t >::scalar_type scalar_type
The underlying type of a simd vector (is not defined if simd_t does not satisfy seqan3::simd::simd_co...
Definition: builtin_simd.hpp:184
Definition: aligned_sequence_concept.hpp:288
seqan3::simd::simd_traits is the trait class that provides uniform interface to the properties of sim...
Definition: simd_traits.hpp:65
Provides C++20 additions to the type_traits header.
Provides utility functions for bit twiddling.
typename detail::builtin_simd< std::make_signed_t< scalar_type >, length >::type mask_type
The type returned by comparison operators (is not defined if simd_t does not satisfy seqan3::simd::si...
Definition: builtin_simd.hpp:192
Contains seqan3::detail::default_simd_length and seqan3::detail::default_simd_max_length.