@@ -190,6 +190,56 @@ inline deinterleave2<float>(const Vectorized<float>& a, const Vectorized<float>&
190190 _mm512_mask_permutex2var_ps (a, 0xffff , idx2, b));
191191}
192192
193+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FLIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
194+
195+ template <>
196+ inline Vectorized<float > flip (const Vectorized<float > & v) {
197+ const __m512i mask = _mm512_set_epi32 (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
198+ 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 );
199+ return _mm512_permutexvar_ps (mask, v);
200+ }
201+
202+ template <>
203+ inline Vectorized<double > flip (const Vectorized<double > & v) {
204+ const __m512i mask = _mm512_set_epi64 (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 );
205+ return _mm512_permutexvar_pd (mask, v);
206+ }
207+
208+ template <>
209+ inline Vectorized<int64_t > flip (const Vectorized<int64_t > & v) {
210+ const __m512i mask = _mm512_set_epi64 (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 );
211+ return _mm512_permutexvar_epi64 (mask, v);
212+ }
213+
214+ template <>
215+ inline Vectorized<int32_t > flip (const Vectorized<int32_t > & v) {
216+ const __m512i mask = _mm512_set_epi32 (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
217+ 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 );
218+ return _mm512_permutexvar_epi32 (mask, v);
219+ }
220+
221+ template <>
222+ inline Vectorized<int16_t > flip (const Vectorized<int16_t > & v) {
223+ const __m512i mask = _mm512_set_epi16 (
224+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
225+ 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31
226+ );
227+ return _mm512_permutexvar_epi16 (mask, v);
228+ }
229+
230+ template <>
231+ inline Vectorized<int8_t > flip (const Vectorized<int8_t > & v) {
232+ const __m512i mask1 = _mm512_set_epi8 (
233+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
234+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
235+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
236+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
237+ );
238+ const __m512i mask2 = _mm512_set_epi64 (1 , 0 , 3 , 2 , 5 , 4 , 7 , 6 );
239+ auto reversed_vec = _mm512_shuffle_epi8 (v, mask1);
240+ return _mm512_permutexvar_epi64 (mask2, reversed_vec);
241+ }
242+
193243#endif // defined(CPU_CAPABILITY_AVX512) && !defined(_MSC_VER)
194244
195245}}}
0 commit comments