25 namespace seqan3::detail
30 template <simd::simd_concept simd_t>
31 constexpr simd_t load_avx512(
void const * mem_addr);
36 template <simd::simd_concept simd_t>
37 inline void transpose_matrix_avx512(
std::array<simd_t, simd_traits<simd_t>::length> & matrix);
42 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
43 constexpr target_simd_t upcast_signed_avx512(source_simd_t
const & src);
48 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
49 constexpr target_simd_t upcast_unsigned_avx512(source_simd_t
const & src);
54 template <u
int8_t index, simd::simd_concept simd_t>
55 constexpr simd_t extract_half_avx512(simd_t
const & src);
60 template <u
int8_t index, simd::simd_concept simd_t>
61 constexpr simd_t extract_quarter_avx512(simd_t
const & src);
66 template <u
int8_t index, simd::simd_concept simd_t>
67 constexpr simd_t extract_eighth_avx512(simd_t
const & src);
77 namespace seqan3::detail
80 template <simd::simd_concept simd_t>
81 constexpr simd_t load_avx512(
void const * mem_addr)
83 return reinterpret_cast<simd_t
>(_mm512_loadu_si512(mem_addr));
87 template <simd::simd_concept simd_t>
88 inline void transpose_matrix_avx512(
std::array<simd_t, simd_traits<simd_t>::length> & matrix);
90 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
91 constexpr target_simd_t upcast_signed_avx512(source_simd_t
const & src)
93 __m512i
const & tmp =
reinterpret_cast<__m512i
const &
>(src);
94 if constexpr (simd_traits<source_simd_t>::length == 64)
96 if constexpr (simd_traits<target_simd_t>::length == 32)
97 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi16(_mm512_castsi512_si256(tmp)));
98 if constexpr (simd_traits<target_simd_t>::length == 16)
99 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi32(_mm512_castsi512_si128(tmp)));
100 if constexpr (simd_traits<target_simd_t>::length == 8)
101 return reinterpret_cast<target_simd_t>(_mm512_cvtepi8_epi64(_mm512_castsi512_si128(tmp)));
103 else if constexpr (simd_traits<source_simd_t>::length == 32)
105 if constexpr (simd_traits<target_simd_t>::length == 16)
106 return reinterpret_cast<target_simd_t>(_mm512_cvtepi16_epi32(_mm512_castsi512_si256(tmp)));
107 if constexpr (simd_traits<target_simd_t>::length == 8)
108 return reinterpret_cast<target_simd_t>(_mm512_cvtepi16_epi64(_mm512_castsi512_si128(tmp)));
112 static_assert(simd_traits<source_simd_t>::length == 16,
"Expected 32 bit scalar type.");
113 return reinterpret_cast<target_simd_t
>(_mm512_cvtepi32_epi64(_mm512_castsi512_si256(tmp)));
117 template <simd::simd_concept target_simd_t, simd::simd_concept source_simd_t>
118 constexpr target_simd_t upcast_unsigned_avx512(source_simd_t
const & src)
120 __m512i
const & tmp =
reinterpret_cast<__m512i
const &
>(src);
121 if constexpr (simd_traits<source_simd_t>::length == 64)
123 if constexpr (simd_traits<target_simd_t>::length == 32)
124 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi16(_mm512_castsi512_si256(tmp)));
125 if constexpr (simd_traits<target_simd_t>::length == 16)
126 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi32(_mm512_castsi512_si128(tmp)));
127 if constexpr (simd_traits<target_simd_t>::length == 8)
128 return reinterpret_cast<target_simd_t>(_mm512_cvtepu8_epi64(_mm512_castsi512_si128(tmp)));
130 else if constexpr (simd_traits<source_simd_t>::length == 32)
132 if constexpr (simd_traits<target_simd_t>::length == 16)
133 return reinterpret_cast<target_simd_t>(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(tmp)));
134 if constexpr (simd_traits<target_simd_t>::length == 8)
135 return reinterpret_cast<target_simd_t>(_mm512_cvtepu16_epi64(_mm512_castsi512_si128(tmp)));
139 static_assert(simd_traits<source_simd_t>::length == 16,
"Expected 32 bit scalar type.");
140 return reinterpret_cast<target_simd_t
>(_mm512_cvtepu32_epi64(_mm512_castsi512_si256(tmp)));
145 template <u
int8_t index, simd::simd_concept simd_t>
146 constexpr simd_t extract_half_avx512(simd_t
const & src);
149 template <u
int8_t index, simd::simd_concept simd_t>
150 constexpr simd_t extract_quarter_avx512(simd_t
const & src);
153 template <u
int8_t index, simd::simd_concept simd_t>
154 constexpr simd_t extract_eighth_avx512(simd_t
const & src);
158 #endif // __AVX512F__