55#include " simd_dispatch.h"
66#include " cpu_features.h"
77
8- #if (defined(__AVX512F__) && defined(__AVX512BW__)) || defined(__AVX2__)
8+ #if defined(__AVX2__)
99#include < immintrin.h>
1010#endif
1111
@@ -24,19 +24,6 @@ static void simd_and_mask_scalar(uint8_t* dest, const uint8_t* a, const uint8_t*
2424 }
2525}
2626
27- #if defined(__AVX512F__) && defined(__AVX512BW__)
28- static void simd_and_mask_avx512 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
29- size_t i = 0 ;
30- for (; i + 64 <= n; i += 64 ) {
31- __m512i va = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(a + i));
32- __m512i vb = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(b + i));
33- __m512i result = _mm512_and_si512 (va, vb);
34- _mm512_storeu_si512 (reinterpret_cast <__m512i*>(dest + i), result);
35- }
36- for (; i < n; i++) dest[i] = a[i] & b[i];
37- }
38- #endif
39-
4027#if defined(__AVX2__)
4128static void simd_and_mask_avx2 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
4229 size_t i = 0 ;
@@ -67,10 +54,8 @@ void simd_and_mask(uint8_t* dest, const uint8_t* a, const uint8_t* b, size_t n)
6754 using fn_t = void (*)(uint8_t *, const uint8_t *, const uint8_t *, size_t );
6855 static std::atomic<fn_t > cache{nullptr };
6956
70- fn_t fn = simd::select_dispatch<fn_t >(cache, {
71- #if defined(__AVX512F__) && defined(__AVX512BW__)
72- { &cpu_supports_avx512, simd_and_mask_avx512 },
73- #endif
57+ #if defined(__AVX2__)
58+ fn_t fn = simd::select_dispatch<fn_t >(cache, {
7459#if defined(__AVX2__)
7560 { &cpu_supports_avx2, simd_and_mask_avx2 },
7661#endif
@@ -91,19 +76,6 @@ static void simd_or_mask_scalar(uint8_t* dest, const uint8_t* a, const uint8_t*
9176 for (size_t i = 0 ; i < n; i++) dest[i] = a[i] | b[i];
9277}
9378
94- #if defined(__AVX512F__) && defined(__AVX512BW__)
95- static void simd_or_mask_avx512 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
96- size_t i = 0 ;
97- for (; i + 64 <= n; i += 64 ) {
98- __m512i va = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(a + i));
99- __m512i vb = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(b + i));
100- __m512i result = _mm512_or_si512 (va, vb);
101- _mm512_storeu_si512 (reinterpret_cast <__m512i*>(dest + i), result);
102- }
103- for (; i < n; i++) dest[i] = a[i] | b[i];
104- }
105- #endif
106-
10779#if defined(__AVX2__)
10880static void simd_or_mask_avx2 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
10981 size_t i = 0 ;
@@ -134,10 +106,8 @@ void simd_or_mask(uint8_t* dest, const uint8_t* a, const uint8_t* b, size_t n) {
134106 using fn_t = void (*)(uint8_t *, const uint8_t *, const uint8_t *, size_t );
135107 static std::atomic<fn_t > cache{nullptr };
136108
109+ #if defined(__AVX2__)
137110 fn_t fn = simd::select_dispatch<fn_t >(cache, {
138- #if defined(__AVX512F__) && defined(__AVX512BW__)
139- { &cpu_supports_avx512, simd_or_mask_avx512 },
140- #endif
141111#if defined(__AVX2__)
142112 { &cpu_supports_avx2, simd_or_mask_avx2 },
143113#endif
@@ -158,19 +128,6 @@ static void simd_xor_mask_scalar(uint8_t* dest, const uint8_t* a, const uint8_t*
158128 for (size_t i = 0 ; i < n; i++) dest[i] = a[i] ^ b[i];
159129}
160130
161- #if defined(__AVX512F__) && defined(__AVX512BW__)
162- static void simd_xor_mask_avx512 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
163- size_t i = 0 ;
164- for (; i + 64 <= n; i += 64 ) {
165- __m512i va = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(a + i));
166- __m512i vb = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(b + i));
167- __m512i result = _mm512_xor_si512 (va, vb);
168- _mm512_storeu_si512 (reinterpret_cast <__m512i*>(dest + i), result);
169- }
170- for (; i < n; i++) dest[i] = a[i] ^ b[i];
171- }
172- #endif
173-
174131#if defined(__AVX2__)
175132static void simd_xor_mask_avx2 (uint8_t * dest, const uint8_t * a, const uint8_t * b, size_t n) {
176133 size_t i = 0 ;
@@ -201,10 +158,8 @@ void simd_xor_mask(uint8_t* dest, const uint8_t* a, const uint8_t* b, size_t n)
201158 using fn_t = void (*)(uint8_t *, const uint8_t *, const uint8_t *, size_t );
202159 static std::atomic<fn_t > cache{nullptr };
203160
161+ #if defined(__AVX2__)
204162 fn_t fn = simd::select_dispatch<fn_t >(cache, {
205- #if defined(__AVX512F__) && defined(__AVX512BW__)
206- { &cpu_supports_avx512, simd_xor_mask_avx512 },
207- #endif
208163#if defined(__AVX2__)
209164 { &cpu_supports_avx2, simd_xor_mask_avx2 },
210165#endif
@@ -225,19 +180,6 @@ static void simd_not_mask_scalar(uint8_t* dest, const uint8_t* src, size_t n) {
225180 for (size_t i = 0 ; i < n; i++) dest[i] = ~src[i];
226181}
227182
228- #if defined(__AVX512F__) && defined(__AVX512BW__)
229- static void simd_not_mask_avx512 (uint8_t * dest, const uint8_t * src, size_t n) {
230- size_t i = 0 ;
231- __m512i all_ones = _mm512_set1_epi8 (static_cast <char >(0xFF ));
232- for (; i + 64 <= n; i += 64 ) {
233- __m512i v = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(src + i));
234- __m512i result = _mm512_xor_si512 (v, all_ones);
235- _mm512_storeu_si512 (reinterpret_cast <__m512i*>(dest + i), result);
236- }
237- for (; i < n; i++) dest[i] = ~src[i];
238- }
239- #endif
240-
241183#if defined(__AVX2__)
242184static void simd_not_mask_avx2 (uint8_t * dest, const uint8_t * src, size_t n) {
243185 size_t i = 0 ;
@@ -267,10 +209,8 @@ void simd_not_mask(uint8_t* dest, const uint8_t* src, size_t n) {
267209 using fn_t = void (*)(uint8_t *, const uint8_t *, size_t );
268210 static std::atomic<fn_t > cache{nullptr };
269211
212+ #if defined(__AVX2__)
270213 fn_t fn = simd::select_dispatch<fn_t >(cache, {
271- #if defined(__AVX512F__) && defined(__AVX512BW__)
272- { &cpu_supports_avx512, simd_not_mask_avx512 },
273- #endif
274214#if defined(__AVX2__)
275215 { &cpu_supports_avx2, simd_not_mask_avx2 },
276216#endif
@@ -330,24 +270,6 @@ static void simd_select_bytes_scalar(uint8_t* dest, const uint8_t* mask,
330270 for (size_t i = 0 ; i < n; i++) dest[i] = mask[i] ? a[i] : b[i];
331271}
332272
333- #if defined(__AVX512F__) && defined(__AVX512BW__)
334- static void simd_select_bytes_avx512 (uint8_t * dest, const uint8_t * mask,
335- const uint8_t * a, const uint8_t * b, size_t n) {
336- size_t i = 0 ;
337- __m512i zero = _mm512_setzero_si512 ();
338-
339- for (; i + 64 <= n; i += 64 ) {
340- __m512i vm = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(mask + i));
341- __m512i va = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(a + i));
342- __m512i vb = _mm512_loadu_si512 (reinterpret_cast <const __m512i*>(b + i));
343- __mmask64 m = _mm512_cmpneq_epu8_mask (vm, zero);
344- __m512i result = _mm512_mask_blend_epi8 (m, vb, va);
345- _mm512_storeu_si512 (reinterpret_cast <__m512i*>(dest + i), result);
346- }
347- for (; i < n; i++) dest[i] = mask[i] ? a[i] : b[i];
348- }
349- #endif
350-
351273#if defined(__AVX2__)
352274static void simd_select_bytes_avx2 (uint8_t * dest, const uint8_t * mask,
353275 const uint8_t * a, const uint8_t * b, size_t n) {
@@ -371,10 +293,8 @@ void simd_select_bytes(uint8_t* dest, const uint8_t* mask,
371293 using fn_t = void (*)(uint8_t *, const uint8_t *, const uint8_t *, const uint8_t *, size_t );
372294 static std::atomic<fn_t > cache{nullptr };
373295
296+ #if defined(__AVX2__)
374297 fn_t fn = simd::select_dispatch<fn_t >(cache, {
375- #if defined(__AVX512F__) && defined(__AVX512BW__)
376- { &cpu_supports_avx512, simd_select_bytes_avx512 },
377- #endif
378298#if defined(__AVX2__)
379299 { &cpu_supports_avx2, simd_select_bytes_avx2 },
380300#endif
0 commit comments