31 template <simd::simd_concept simd_t>
37 template <simd::simd_concept simd_t>
43 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
49 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
55 template <u
int8_t index, simd::simd_concept simd_t>
61 template <u
int8_t index, simd::simd_concept simd_t>
67 template <u
int8_t index, simd::simd_concept simd_t>
81 template <simd::simd_concept simd_t>
82 constexpr simd_t
load_avx2(
void const * mem_addr)
84 return reinterpret_cast<simd_t
>(_mm256_loadu_si256(
reinterpret_cast<__m256i
const *
>(mem_addr)));
87 template <simd::simd_concept simd_t>
91 auto _mm256_unpacklo_epi128 = [] (__m256i
const & a, __m256i
const & b)
93 return _mm256_permute2x128_si256(a, b, 0x20);
96 auto _mm256_unpackhi_epi128 = [] (__m256i
const & a, __m256i
const & b)
98 return _mm256_permute2x128_si256(a, b, 0x31);
102 static const uint8_t bit_rev[] = { 0, 8, 4,12, 2,10, 6,14, 1, 9, 5,13, 3,11, 7,15,
103 16,24,20,28,18,26,22,30,17,25,21,29,19,27,23,31};
107 for (
int i = 0; i < 16; ++i)
109 tmp1[i] = _mm256_unpacklo_epi8(
110 reinterpret_cast<const __m256i &
>(
matrix[2*i]),
111 reinterpret_cast<const __m256i &
>(
matrix[2*i+1])
113 tmp1[i+16] = _mm256_unpackhi_epi8(
114 reinterpret_cast<const __m256i &
>(
matrix[2*i]),
115 reinterpret_cast<const __m256i &
>(
matrix[2*i+1])
119 for (
int i = 0; i < 16; ++i)
121 tmp2[i] = _mm256_unpacklo_epi16(tmp1[2*i], tmp1[2*i+1]);
122 tmp2[i+16] = _mm256_unpackhi_epi16(tmp1[2*i], tmp1[2*i+1]);
124 for (
int i = 0; i < 16; ++i)
126 tmp1[i] = _mm256_unpacklo_epi32(tmp2[2*i], tmp2[2*i+1]);
127 tmp1[i+16] = _mm256_unpackhi_epi32(tmp2[2*i], tmp2[2*i+1]);
129 for (
int i = 0; i < 16; ++i)
131 tmp2[i] = _mm256_unpacklo_epi64(tmp1[2*i], tmp1[2*i+1]);
132 tmp2[i+16] = _mm256_unpackhi_epi64(tmp1[2*i], tmp1[2*i+1]);
134 for (
int i = 0; i < 16; ++i)
136 matrix[bit_rev[i]] =
reinterpret_cast<simd_t
>(_mm256_unpacklo_epi128(tmp2[2*i],tmp2[2*i+1]));
137 matrix[bit_rev[i+16]] =
reinterpret_cast<simd_t
>(_mm256_unpackhi_epi128(tmp2[2*i],tmp2[2*i+1]));
141 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
144 __m128i
const & tmp = _mm256_castsi256_si128(
reinterpret_cast<__m256i
const &
>(src));
145 if constexpr (simd_traits<source_simd_t>::length == 32)
147 if constexpr (simd_traits<target_simd_t>::length == 16)
148 return reinterpret_cast<target_simd_t>(_mm256_cvtepi8_epi16(tmp));
149 if constexpr (simd_traits<target_simd_t>::length == 8)
150 return reinterpret_cast<target_simd_t>(_mm256_cvtepi8_epi32(tmp));
151 if constexpr (simd_traits<target_simd_t>::length == 4)
152 return reinterpret_cast<target_simd_t>(_mm256_cvtepi8_epi64(tmp));
154 else if constexpr (simd_traits<source_simd_t>::length == 16)
156 if constexpr (simd_traits<target_simd_t>::length == 8)
157 return reinterpret_cast<target_simd_t>(_mm256_cvtepi16_epi32(tmp));
158 if constexpr (simd_traits<target_simd_t>::length == 4)
159 return reinterpret_cast<target_simd_t>(_mm256_cvtepi16_epi64(tmp));
163 static_assert(simd_traits<source_simd_t>::length == 8,
"Expected 32 bit scalar type.");
164 return reinterpret_cast<target_simd_t
>(_mm256_cvtepi32_epi64(tmp));
168 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
171 __m128i
const & tmp = _mm256_castsi256_si128(
reinterpret_cast<__m256i
const &
>(src));
172 if constexpr (simd_traits<source_simd_t>::length == 32)
174 if constexpr (simd_traits<target_simd_t>::length == 16)
175 return reinterpret_cast<target_simd_t>(_mm256_cvtepu8_epi16(tmp));
176 if constexpr (simd_traits<target_simd_t>::length == 8)
177 return reinterpret_cast<target_simd_t>(_mm256_cvtepu8_epi32(tmp));
178 if constexpr (simd_traits<target_simd_t>::length == 4)
179 return reinterpret_cast<target_simd_t>(_mm256_cvtepu8_epi64(tmp));
181 else if constexpr (simd_traits<source_simd_t>::length == 16)
183 if constexpr (simd_traits<target_simd_t>::length == 8)
184 return reinterpret_cast<target_simd_t>(_mm256_cvtepu16_epi32(tmp));
185 if constexpr (simd_traits<target_simd_t>::length == 4)
186 return reinterpret_cast<target_simd_t>(_mm256_cvtepu16_epi64(tmp));
190 static_assert(simd_traits<source_simd_t>::length == 8,
"Expected 32 bit scalar type.");
191 return reinterpret_cast<target_simd_t
>(_mm256_cvtepu32_epi64(tmp));
195 template <u
int8_t index, simd::simd_concept simd_t>
198 return reinterpret_cast<simd_t
>(_mm256_castsi128_si256(
199 _mm256_extracti128_si256(
reinterpret_cast<__m256i
const &
>(src), index)));
202 template <u
int8_t index, simd::simd_concept simd_t>
205 return reinterpret_cast<simd_t
>(_mm256_castsi128_si256(
206 _mm_cvtsi64x_si128(_mm256_extract_epi64(
reinterpret_cast<__m256i
const &
>(src), index))));
209 template <u
int8_t index, simd::simd_concept simd_t>
212 return reinterpret_cast<simd_t
>(_mm256_castsi128_si256(
213 _mm_cvtsi32_si128(_mm256_extract_epi32(
reinterpret_cast<__m256i
const &
>(src), index))));
Defines the requirements of a matrix (e.g. score matrices, trace matrices).
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
void transpose_matrix_avx2(std::array< simd_t, simd_traits< simd_t >::length > &matrix)
Transposes the given simd vector matrix.
constexpr simd_t extract_half_avx2(simd_t const &src)
Extracts one half of the given simd vector and stores the result in the lower half of the target vect...
constexpr simd_t extract_eighth_avx2(simd_t const &src)
Extracts one eighth of the given simd vector and stores it in the lower eighth of the target vector.
constexpr target_simd_t upcast_signed_avx2(source_simd_t const &src)
Upcasts the given vector into the target vector using signed extension of packed values.
constexpr simd_t extract_quarter_avx2(simd_t const &src)
Extracts one quarter of the given simd vector and stores it in the lower quarter of the target vector...
constexpr simd_t load_avx2(void const *mem_addr)
Load simd_t size bits of integral data from memory.
constexpr target_simd_t upcast_unsigned_avx2(source_simd_t const &src)
Upcasts the given vector into the target vector using unsigned extension of packed values.
seqan3::simd::simd_traits is the trait class that provides uniform interface to the properties of sim...
Definition: simd_traits.hpp:41
Provides seqan3::simd::simd_concept.
Provides seqan3::detail::builtin_simd, seqan3::detail::is_builtin_simd and seqan3::simd::simd_traits<...
Provides intrinsics include for builtin simd.
Provides seqan3::simd::simd_traits.