Mercurial > vec
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) |