26 namespace seqan3::detail
31 template <simd::simd_concept simd_t>
32 constexpr simd_t load_avx512(
void const * mem_addr);
37 template <simd::simd_concept simd_t>
38 constexpr
void store_avx512(
void * mem_addr, simd_t
const & simd_vec);
43 template <simd::simd_concept simd_t>
44 inline void transpose_matrix_avx512(
std::array<simd_t, simd_traits<simd_t>::length> & matrix);
49 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
50 constexpr target_simd_t upcast_signed_avx512(source_simd_t
const & src);
55 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
56 constexpr target_simd_t upcast_unsigned_avx512(source_simd_t
const & src);
61 template <u
int8_t index, simd::simd_concept simd_t>
62 constexpr simd_t extract_half_avx512(simd_t
const & src);
67 template <u
int8_t index, simd::simd_concept simd_t>
68 constexpr simd_t extract_quarter_avx512(simd_t
const & src);
73 template <u
int8_t index, simd::simd_concept simd_t>
74 constexpr simd_t extract_eighth_avx512(simd_t
const & src);
84 namespace seqan3::detail
87 template <simd::simd_concept simd_t>
88 constexpr simd_t load_avx512(
void const * mem_addr)
90 return reinterpret_cast<simd_t
>(_mm512_loadu_si512(mem_addr));
93 template <simd::simd_concept simd_t>
94 constexpr
void store_avx512(
void * mem_addr, simd_t
const & simd_vec)
96 _mm512_storeu_si512(mem_addr,
reinterpret_cast<__m512i
const &
>(simd_vec));
100 template <simd::simd_concept simd_t>
101 inline void transpose_matrix_avx512(
std::array<simd_t, simd_traits<simd_t>::length> & matrix);
103 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
104 constexpr target_simd_t upcast_signed_avx512(source_simd_t
const & src)
106 __m512i
const & tmp =
reinterpret_cast<__m512i
const &
>(src);
107 if constexpr (simd_traits<source_simd_t>::length == 64)
109 if constexpr (simd_traits<target_simd_t>::length == 32)
110 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi16(_mm512_castsi512_si256(tmp)));
111 if constexpr (simd_traits<target_simd_t>::length == 16)
112 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi32(_mm512_castsi512_si128(tmp)));
113 if constexpr (simd_traits<target_simd_t>::length == 8)
114 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi64(_mm512_castsi512_si128(tmp)));
116 else if constexpr (simd_traits<source_simd_t>::length == 32)
118 if constexpr (simd_traits<target_simd_t>::length == 16)
119 return reinterpret_cast<target_simd_t>(_mm512_cvtepi16_epi32(_mm512_castsi512_si256(tmp)));
120 if constexpr (simd_traits<target_simd_t>::length == 8)
121 return reinterpret_cast<target_simd_t>(_mm512_cvtepi16_epi64(_mm512_castsi512_si128(tmp)));
125 static_assert(simd_traits<source_simd_t>::length == 16,
"Expected 32 bit scalar type.");
126 return reinterpret_cast<target_simd_t
>(_mm512_cvtepi32_epi64(_mm512_castsi512_si256(tmp)));
130 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
131 constexpr target_simd_t upcast_unsigned_avx512(source_simd_t
const & src)
133 __m512i
const & tmp =
reinterpret_cast<__m512i
const &
>(src);
134 if constexpr (simd_traits<source_simd_t>::length == 64)
136 if constexpr (simd_traits<target_simd_t>::length == 32)
137 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi16(_mm512_castsi512_si256(tmp)));
138 if constexpr (simd_traits<target_simd_t>::length == 16)
139 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi32(_mm512_castsi512_si128(tmp)));
140 if constexpr (simd_traits<target_simd_t>::length == 8)
141 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi64(_mm512_castsi512_si128(tmp)));
143 else if constexpr (simd_traits<source_simd_t>::length == 32)
145 if constexpr (simd_traits<target_simd_t>::length == 16)
146 return reinterpret_cast<target_simd_t>(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(tmp)));
147 if constexpr (simd_traits<target_simd_t>::length == 8)
148 return reinterpret_cast<target_simd_t>(_mm512_cvtepu16_epi64(_mm512_castsi512_si128(tmp)));
152 static_assert(simd_traits<source_simd_t>::length == 16,
"Expected 32 bit scalar type.");
153 return reinterpret_cast<target_simd_t
>(_mm512_cvtepu32_epi64(_mm512_castsi512_si256(tmp)));
158 template <u
int8_t index, simd::simd_concept simd_t>
159 constexpr simd_t extract_half_avx512(simd_t
const & src);
162 template <u
int8_t index, simd::simd_concept simd_t>
163 constexpr simd_t extract_quarter_avx512(simd_t
const & src);
166 template <u
int8_t index, simd::simd_concept simd_t>
167 constexpr simd_t extract_eighth_avx512(simd_t
const & src);
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.