comparison src/impl/x86/avx2.c @ 31:bf6ad516f1e6

Backed out changeset c6c99ab1088a
author Paper <paper@tflc.us>
date Fri, 25 Apr 2025 17:40:33 -0400
parents c6c99ab1088a
children 99e4539f922f
comparison
equal deleted inserted replaced
30:641d8c79b1da 31:bf6ad516f1e6
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE. 22 * SOFTWARE.
23 **/ 23 **/
24 24
25 #include "vec/impl/x86/avx2.h" 25 #include "vec/impl/x86/avx2.h"
26 #include "vec/impl/generic.h"
26 27
27 #include <immintrin.h> 28 #include <immintrin.h>
28 29
29 /* ------------------------------------------------------------------------ */ 30 // this does NOT handle sign bits properly, use with caution
30 /* min/max */ 31 #define VEC_AVX2_OPERATION_8x32_16x16(op, sign) \
31 32 do { \
32 #define VEC_AVX2_MINMAX_TEMPLATE(SIGN, BITS, SIZE, INTLSIGN, OP) \ 33 union v##sign##int8x32_impl_data *vec1d = (union v##sign##int8x32_impl_data *)&vec1; \
33 VEC_FUNC_IMPL v##SIGN##int##BITS##x##SIZE v##SIGN##int##BITS##x##SIZE##_avx2_##OP(v##SIGN##int##BITS##x##SIZE vec1, v##SIGN##int##BITS##x##SIZE vec2) \ 34 union v##sign##int8x32_impl_data *vec2d = (union v##sign##int8x32_impl_data *)&vec2; \
34 { \ 35 \
35 union v##SIGN##int##BITS##x##SIZE##_impl_data *vec1d = (union v##SIGN##int##BITS##x##SIZE##_impl_data *)&vec1; \ 36 /* unpack and multiply */ \
36 union v##SIGN##int##BITS##x##SIZE##_impl_data *vec2d = (union v##SIGN##int##BITS##x##SIZE##_impl_data *)&vec2; \ 37 __m256i dst_even = _mm256_##op##_epi16(vec1d->avx2, vec2d->avx2); \
37 \ 38 __m256i dst_odd = _mm256_##op##_epi16(_mm256_srli_epi16(vec1d->avx2, 8), _mm256_srli_epi16(vec2d->avx2, 8)); \
38 vec1d->avx2 = _mm256_##OP##_ep##INTLSIGN##BITS(vec1d->avx2, vec2d->avx2); \ 39 \
39 \ 40 /* repack */ \
40 return vec1d->vec; \ 41 vec1d->avx2 = _mm256_or_si256( \
41 } 42 _mm256_slli_epi16(dst_odd, 8), \
42 43 _mm256_srli_epi16(_mm256_slli_epi16(dst_even, 8), 8) \
43 #define VEC_AVX2_MINMAX_8x32(OP) VEC_AVX2_MINMAX_TEMPLATE( , 8, 32, i, OP) 44 ); \
44 #define VEC_AVX2_MINMAX_u8x32(OP) VEC_AVX2_MINMAX_TEMPLATE(u, 8, 32, u, OP) 45 return vec1d->vec; \
45 #define VEC_AVX2_MINMAX_16x16(OP) VEC_AVX2_MINMAX_TEMPLATE( , 16, 16, i, OP) 46 } while (0)
46 #define VEC_AVX2_MINMAX_u16x16(OP) VEC_AVX2_MINMAX_TEMPLATE(u, 16, 16, u, OP) 47
47 #define VEC_AVX2_MINMAX_32x8(OP) VEC_AVX2_MINMAX_TEMPLATE( , 32, 8, i, OP) 48 #define VEC_AVX2_OPERATION_16x16(op, sign) \
48 #define VEC_AVX2_MINMAX_u32x8(OP) VEC_AVX2_MINMAX_TEMPLATE(u, 32, 8, u, OP) 49 do { \
49 #define VEC_AVX2_MINMAX_64x4(OP) /* nothing */
50 #define VEC_AVX2_MINMAX_u64x4(OP) /* nothing */
51
52 #define VEC_AVX2_STRUCT_MINMAX_8x32(OP, SIGN) v##SIGN##int8x32_avx2_##OP
53 #define VEC_AVX2_STRUCT_MINMAX_16x16(OP, SIGN) v##SIGN##int16x16_avx2_##OP
54 #define VEC_AVX2_STRUCT_MINMAX_32x8(OP, SIGN) v##SIGN##int32x8_avx2_##OP
55 #define VEC_AVX2_STRUCT_MINMAX_64x4(OP, SIGN) NULL
56
57 /* reused this for avg */
58
59 #define VEC_AVX2_AVG_8x32 /* nothing */
60 #define VEC_AVX2_AVG_16x16 /* nothing */
61 #define VEC_AVX2_AVG_32x8 /* nothing */
62 #define VEC_AVX2_AVG_64x4 /* nothing */
63
64 #define VEC_AVX2_AVG_u8x32 VEC_AVX2_MINMAX_TEMPLATE(u, 8, 32, u, avg)
65 #define VEC_AVX2_AVG_u16x16 VEC_AVX2_MINMAX_TEMPLATE(u, 16, 16, u, avg)
66 #define VEC_AVX2_AVG_u32x8 /* nothing */
67 #define VEC_AVX2_AVG_u64x4 /* nothing */
68
69 #define VEC_AVX2_STRUCT_AVG_8x32 NULL
70 #define VEC_AVX2_STRUCT_AVG_16x16 NULL
71 #define VEC_AVX2_STRUCT_AVG_32x8 NULL
72 #define VEC_AVX2_STRUCT_AVG_64x4 NULL
73
74 #define VEC_AVX2_STRUCT_AVG_u8x32 vuint8x32_avx2_avg
75 #define VEC_AVX2_STRUCT_AVG_u16x16 vuint16x16_avx2_avg
76 #define VEC_AVX2_STRUCT_AVG_u32x8 NULL
77 #define VEC_AVX2_STRUCT_AVG_u64x4 NULL
78
79 /* ------------------------------------------------------------------------ */
80
81 // multiplication
82
83 #define VEC_AVX2_MUL_8x32(sign) /* nothing */
84
85 #define VEC_AVX2_MUL_16x16(sign) \
86 VEC_FUNC_IMPL v##sign##int16x16 v##sign##int16x16_avx2_mul(v##sign##int16x16 vec1, v##sign##int16x16 vec2) \
87 { \
88 union v##sign##int16x16_impl_data *vec1d = (union v##sign##int16x16_impl_data *)&vec1; \ 50 union v##sign##int16x16_impl_data *vec1d = (union v##sign##int16x16_impl_data *)&vec1; \
89 union v##sign##int16x16_impl_data *vec2d = (union v##sign##int16x16_impl_data *)&vec2; \ 51 union v##sign##int16x16_impl_data *vec2d = (union v##sign##int16x16_impl_data *)&vec2; \
90 \ 52 \
53 /* unpack and multiply */ \
54 __m256i dst_even = _mm256_##op##_epi32(vec1d->avx2, vec2d->avx2); \
55 __m256i dst_odd = _mm256_##op##_epi32(_mm256_srli_epi32(vec1d->avx2, 16), _mm256_srli_epi32(vec2d->avx2, 16)); \
56 \
57 /* repack */ \
58 vec1d->avx2 = _mm256_or_si256( \
59 _mm256_slli_epi32(dst_odd, 16), \
60 _mm256_srli_epi32(_mm256_slli_epi16(dst_even, 16), 16) \
61 ); \
62 return vec1d->vec; \
63 } while (0)
64
65 // multiplication
66
67 #define VEC_AVX2_MUL_8x32(sign) \
68 VEC_AVX2_OPERATION_8x32_16x16(mullo, sign)
69
70 #define VEC_AVX2_MUL_16x16(sign) \
71 do { \
72 union v##sign##int16x16_impl_data *vec1d = (union v##sign##int16x16_impl_data *)&vec1; \
73 union v##sign##int16x16_impl_data *vec2d = (union v##sign##int16x16_impl_data *)&vec2; \
74 \
91 vec1d->avx2 = _mm256_mullo_epi16(vec1d->avx2, vec2d->avx2); \ 75 vec1d->avx2 = _mm256_mullo_epi16(vec1d->avx2, vec2d->avx2); \
92 return vec1d->vec; \ 76 return vec1d->vec; \
93 } 77 } while (0)
94 78
95 #define VEC_AVX2_MUL_32x8(sign) \ 79 #define VEC_AVX2_MUL_32x8(sign) \
96 VEC_FUNC_IMPL v##sign##int32x8 v##sign##int32x8_avx2_mul(v##sign##int32x8 vec1, v##sign##int32x8 vec2) \ 80 do { \
97 { \
98 union v##sign##int32x8_impl_data *vec1d = (union v##sign##int32x8_impl_data *)&vec1; \ 81 union v##sign##int32x8_impl_data *vec1d = (union v##sign##int32x8_impl_data *)&vec1; \
99 union v##sign##int32x8_impl_data *vec2d = (union v##sign##int32x8_impl_data *)&vec2; \ 82 union v##sign##int32x8_impl_data *vec2d = (union v##sign##int32x8_impl_data *)&vec2; \
100 \ 83 \
101 vec1d->avx2 = _mm256_mullo_epi32(vec1d->avx2, vec2d->avx2); \ 84 vec1d->avx2 = _mm256_mullo_epi32(vec1d->avx2, vec2d->avx2); \
102 return vec1d->vec; \ 85 return vec1d->vec; \
103 } 86 } while (0)
104 87
105 #define VEC_AVX2_MUL_64x4(sign) \ 88 #define VEC_AVX2_MUL_64x4(sign) \
106 VEC_FUNC_IMPL v##sign##int64x4 v##sign##int64x4_avx2_mul(v##sign##int64x4 vec1, v##sign##int64x4 vec2) \ 89 do { \
107 { \
108 union v##sign##int64x4_impl_data *vec1d = (union v##sign##int64x4_impl_data *)&vec1; \ 90 union v##sign##int64x4_impl_data *vec1d = (union v##sign##int64x4_impl_data *)&vec1; \
109 union v##sign##int64x4_impl_data *vec2d = (union v##sign##int64x4_impl_data *)&vec2; \ 91 union v##sign##int64x4_impl_data *vec2d = (union v##sign##int64x4_impl_data *)&vec2; \
110 \ 92 \
111 __m256i ac = _mm256_mul_epu32(vec1d->avx2, vec2d->avx2); \ 93 __m256i ac = _mm256_mul_epu32(vec1d->avx2, vec2d->avx2); \
112 __m256i b = _mm256_srli_epi64(vec1d->avx2, 32); \ 94 __m256i b = _mm256_srli_epi64(vec1d->avx2, 32); \
116 __m256i hi = _mm256_add_epi64(bc, ad); \ 98 __m256i hi = _mm256_add_epi64(bc, ad); \
117 hi = _mm256_slli_epi64(hi, 32); \ 99 hi = _mm256_slli_epi64(hi, 32); \
118 \ 100 \
119 vec1d->avx2 = _mm256_add_epi64(hi, ac); \ 101 vec1d->avx2 = _mm256_add_epi64(hi, ac); \
120 return vec1d->vec; \ 102 return vec1d->vec; \
121 } 103 } while (0)
122
123 #define VEC_AVX2_STRUCT_MUL_8x32(SIGN) NULL
124 #define VEC_AVX2_STRUCT_MUL_16x16(SIGN) v##SIGN##int16x16_avx2_mul
125 #define VEC_AVX2_STRUCT_MUL_32x8(SIGN) v##SIGN##int32x8_avx2_mul
126 #define VEC_AVX2_STRUCT_MUL_64x4(SIGN) v##SIGN##int64x4_avx2_mul
127 104
128 // operations 105 // operations
129 106
130 #define VEC_AVX2_DEFINE_OPERATIONS_SIGN(sign, bits, size) \ 107 #define VEC_AVX2_DEFINE_OPERATIONS_SIGN(sign, bits, size) \
131 union v##sign##int##bits##x##size##_impl_data { \ 108 union v##sign##int##bits##x##size##_impl_data { \
134 }; \ 111 }; \
135 \ 112 \
136 VEC_STATIC_ASSERT(VEC_ALIGNOF(__m256i) <= VEC_ALIGNOF(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " alignment needs to be expanded to fit intrinsic type size"); \ 113 VEC_STATIC_ASSERT(VEC_ALIGNOF(__m256i) <= VEC_ALIGNOF(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " alignment needs to be expanded to fit intrinsic type size"); \
137 VEC_STATIC_ASSERT(sizeof(__m256i) <= sizeof(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " needs to be expanded to fit intrinsic type size"); \ 114 VEC_STATIC_ASSERT(sizeof(__m256i) <= sizeof(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " needs to be expanded to fit intrinsic type size"); \
138 \ 115 \
139 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_load_aligned(const vec_##sign##int##bits in[size]) \ 116 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_load_aligned(const vec_##sign##int##bits in[size]) \
140 { \ 117 { \
141 union v##sign##int##bits##x##size##_impl_data vec; \ 118 union v##sign##int##bits##x##size##_impl_data vec; \
142 vec.avx2 = _mm256_load_si256((const __m256i *)in); \ 119 vec.avx2 = _mm256_load_si256((const __m256i *)in); \
143 return vec.vec; \ 120 return vec.vec; \
144 } \ 121 } \
145 \ 122 \
146 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_load(const vec_##sign##int##bits in[size]) \ 123 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_load(const vec_##sign##int##bits in[size]) \
147 { \ 124 { \
148 union v##sign##int##bits##x##size##_impl_data vec; \ 125 union v##sign##int##bits##x##size##_impl_data vec; \
149 vec.avx2 = _mm256_loadu_si256((const __m256i *)in); \ 126 vec.avx2 = _mm256_loadu_si256((const __m256i *)in); \
150 return vec.vec; \ 127 return vec.vec; \
151 } \ 128 } \
152 \ 129 \
153 VEC_FUNC_IMPL void v##sign##int##bits##x##size##_avx2_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 130 static void v##sign##int##bits##x##size##_avx2_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
154 { \ 131 { \
155 _mm256_store_si256((__m256i *)out, ((union v##sign##int##bits##x##size##_impl_data*)&vec)->avx2); \ 132 _mm256_store_si256((__m256i *)out, ((union v##sign##int##bits##x##size##_impl_data*)&vec)->avx2); \
156 } \ 133 } \
157 \ 134 \
158 VEC_FUNC_IMPL void v##sign##int##bits##x##size##_avx2_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ 135 static void v##sign##int##bits##x##size##_avx2_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
159 { \ 136 { \
160 _mm256_storeu_si256((__m256i *)out, ((union v##sign##int##bits##x##size##_impl_data*)&vec)->avx2); \ 137 _mm256_storeu_si256((__m256i *)out, ((union v##sign##int##bits##x##size##_impl_data*)&vec)->avx2); \
161 } \ 138 } \
162 \ 139 \
163 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 140 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
164 { \ 141 { \
165 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 142 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
166 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 143 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
167 \ 144 \
168 vec1d->avx2 = _mm256_add_epi##bits(vec1d->avx2, vec2d->avx2); \ 145 vec1d->avx2 = _mm256_add_epi##bits(vec1d->avx2, vec2d->avx2); \
169 return vec1d->vec; \ 146 return vec1d->vec; \
170 } \ 147 } \
171 \ 148 \
172 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 149 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
173 { \ 150 { \
174 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 151 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
175 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 152 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
176 \ 153 \
177 vec1d->avx2 = _mm256_sub_epi##bits(vec1d->avx2, vec2d->avx2); \ 154 vec1d->avx2 = _mm256_sub_epi##bits(vec1d->avx2, vec2d->avx2); \
178 return vec1d->vec; \ 155 return vec1d->vec; \
179 } \ 156 } \
180 \ 157 \
181 VEC_AVX2_MUL_##bits##x##size(sign) \ 158 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
182 \ 159 { \
183 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 160 VEC_AVX2_MUL_##bits##x##size(sign); \
161 } \
162 \
163 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
184 { \ 164 { \
185 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 165 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
186 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 166 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
187 \ 167 \
188 vec1d->avx2 = _mm256_and_si256(vec1d->avx2, vec2d->avx2); \ 168 vec1d->avx2 = _mm256_and_si256(vec1d->avx2, vec2d->avx2); \
189 return vec1d->vec; \ 169 return vec1d->vec; \
190 } \ 170 } \
191 \ 171 \
192 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 172 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
193 { \ 173 { \
194 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 174 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
195 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 175 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
196 \ 176 \
197 vec1d->avx2 = _mm256_or_si256(vec1d->avx2, vec2d->avx2); \ 177 vec1d->avx2 = _mm256_or_si256(vec1d->avx2, vec2d->avx2); \
198 return vec1d->vec; \ 178 return vec1d->vec; \
199 } \ 179 } \
200 \ 180 \
201 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ 181 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_avx2_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
202 { \ 182 { \
203 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 183 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
204 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 184 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
205 \ 185 \
206 vec1d->avx2 = _mm256_xor_si256(vec1d->avx2, vec2d->avx2); \ 186 vec1d->avx2 = _mm256_xor_si256(vec1d->avx2, vec2d->avx2); \
207 return vec1d->vec; \ 187 return vec1d->vec; \
208 } \ 188 } \
209 \ 189 \
210 VEC_AVX2_AVG_##sign##bits##x##size \
211 \
212 VEC_AVX2_MINMAX_##sign##bits##x##size(min) \
213 VEC_AVX2_MINMAX_##sign##bits##x##size(max) \
214 \
215 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_avx2 = { \ 190 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_avx2 = { \
216 .load_aligned = v##sign##int##bits##x##size##_avx2_load_aligned, \ 191 v##sign##int##bits##x##size##_generic_splat, \
217 .load = v##sign##int##bits##x##size##_avx2_load, \ 192 v##sign##int##bits##x##size##_avx2_load_aligned, \
218 .store_aligned = v##sign##int##bits##x##size##_avx2_store_aligned, \ 193 v##sign##int##bits##x##size##_avx2_load, \
219 .store = v##sign##int##bits##x##size##_avx2_store, \ 194 v##sign##int##bits##x##size##_avx2_store_aligned, \
220 .add = v##sign##int##bits##x##size##_avx2_add, \ 195 v##sign##int##bits##x##size##_avx2_store, \
221 .sub = v##sign##int##bits##x##size##_avx2_sub, \ 196 v##sign##int##bits##x##size##_avx2_add, \
222 .mul = VEC_AVX2_STRUCT_MUL_##bits##x##size(sign), \ 197 v##sign##int##bits##x##size##_avx2_sub, \
223 .band = v##sign##int##bits##x##size##_avx2_and, \ 198 v##sign##int##bits##x##size##_avx2_mul, \
224 .bor = v##sign##int##bits##x##size##_avx2_or, \ 199 v##sign##int##bits##x##size##_generic_div, \
225 .bxor = v##sign##int##bits##x##size##_avx2_xor, \ 200 v##sign##int##bits##x##size##_generic_avg, \
226 .min = VEC_AVX2_STRUCT_MINMAX_##bits##x##size(min, sign), \ 201 v##sign##int##bits##x##size##_avx2_and, \
227 .max = VEC_AVX2_STRUCT_MINMAX_##bits##x##size(max, sign), \ 202 v##sign##int##bits##x##size##_avx2_or, \
228 .avg = VEC_AVX2_STRUCT_AVG_##sign##bits##x##size, \ 203 v##sign##int##bits##x##size##_avx2_xor, \
204 v##sign##int##bits##x##size##_generic_not, \
205 v##sign##int##bits##x##size##_generic_lshift, \
206 v##sign##int##bits##x##size##_generic_rshift, \
207 v##sign##int##bits##x##size##_generic_lrshift, \
208 v##sign##int##bits##x##size##_generic_cmplt, \
209 v##sign##int##bits##x##size##_generic_cmple, \
210 v##sign##int##bits##x##size##_generic_cmpeq, \
211 v##sign##int##bits##x##size##_generic_cmpge, \
212 v##sign##int##bits##x##size##_generic_cmpgt, \
229 }; 213 };
230 214
231 #define VEC_AVX2_DEFINE_OPERATIONS(bits, size) \ 215 #define VEC_AVX2_DEFINE_OPERATIONS(bits, size) \
232 VEC_AVX2_DEFINE_OPERATIONS_SIGN( , bits, size) \ 216 VEC_AVX2_DEFINE_OPERATIONS_SIGN( , bits, size) \
233 VEC_AVX2_DEFINE_OPERATIONS_SIGN(u, bits, size) 217 VEC_AVX2_DEFINE_OPERATIONS_SIGN(u, bits, size)