32 #ifndef MCKL_INTERNAL_FMA_HPP 33 #define MCKL_INTERNAL_FMA_HPP 45 std::array<__m256i, 4> &s,
const __m256i &a,
const __m256i &b)
47 std::get<0>(s) = _mm256_castps_si256(
48 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0>(s)),
49 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
50 std::get<1>(s) = _mm256_castps_si256(
51 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<1>(s)),
52 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
53 std::get<2>(s) = _mm256_castps_si256(
54 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<2>(s)),
55 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
56 std::get<3>(s) = _mm256_castps_si256(
57 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<3>(s)),
58 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
62 std::array<__m256i, 4> &s,
const __m256i &a,
const __m256i &b)
64 std::get<0>(s) = _mm256_castpd_si256(
65 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0>(s)),
66 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
67 std::get<1>(s) = _mm256_castpd_si256(
68 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<1>(s)),
69 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
70 std::get<2>(s) = _mm256_castpd_si256(
71 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<2>(s)),
72 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
73 std::get<3>(s) = _mm256_castpd_si256(
74 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<3>(s)),
75 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
78 MCKL_INLINE inline void fmadd_pd(std::array<__m256i, 4> &s,
const __m256i &a,
79 const std::array<__m256i, 4> &b)
81 std::get<0>(s) = _mm256_castpd_si256(
82 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0>(s)),
83 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0>(b))));
84 std::get<1>(s) = _mm256_castpd_si256(
85 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<1>(s)),
86 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<1>(b))));
87 std::get<2>(s) = _mm256_castpd_si256(
88 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<2>(s)),
89 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<2>(b))));
90 std::get<3>(s) = _mm256_castpd_si256(
91 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<3>(s)),
92 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<3>(b))));
96 std::array<__m256i, 8> &s,
const __m256i &a,
const __m256i &b)
98 std::get<0>(s) = _mm256_castps_si256(
99 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0>(s)),
100 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
101 std::get<1>(s) = _mm256_castps_si256(
102 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<1>(s)),
103 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
104 std::get<2>(s) = _mm256_castps_si256(
105 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<2>(s)),
106 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
107 std::get<3>(s) = _mm256_castps_si256(
108 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<3>(s)),
109 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
110 std::get<4>(s) = _mm256_castps_si256(
111 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<4>(s)),
112 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
113 std::get<5>(s) = _mm256_castps_si256(
114 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<5>(s)),
115 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
116 std::get<6>(s) = _mm256_castps_si256(
117 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<6>(s)),
118 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
119 std::get<7>(s) = _mm256_castps_si256(
120 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<7>(s)),
121 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
125 std::array<__m256i, 8> &s,
const __m256i &a,
const __m256i &b)
127 std::get<0>(s) = _mm256_castpd_si256(
128 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0>(s)),
129 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
130 std::get<1>(s) = _mm256_castpd_si256(
131 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<1>(s)),
132 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
133 std::get<2>(s) = _mm256_castpd_si256(
134 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<2>(s)),
135 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
136 std::get<3>(s) = _mm256_castpd_si256(
137 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<3>(s)),
138 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
139 std::get<4>(s) = _mm256_castpd_si256(
140 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<4>(s)),
141 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
142 std::get<5>(s) = _mm256_castpd_si256(
143 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<5>(s)),
144 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
145 std::get<6>(s) = _mm256_castpd_si256(
146 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<6>(s)),
147 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
148 std::get<7>(s) = _mm256_castpd_si256(
149 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<7>(s)),
150 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
153 MCKL_INLINE inline void fmadd_pd(std::array<__m256i, 8> &s,
const __m256i &a,
154 const std::array<__m256i, 8> &b)
156 std::get<0>(s) = _mm256_castpd_si256(
157 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0>(s)),
158 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0>(b))));
159 std::get<1>(s) = _mm256_castpd_si256(
160 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<1>(s)),
161 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<1>(b))));
162 std::get<2>(s) = _mm256_castpd_si256(
163 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<2>(s)),
164 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<2>(b))));
165 std::get<3>(s) = _mm256_castpd_si256(
166 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<3>(s)),
167 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<3>(b))));
168 std::get<4>(s) = _mm256_castpd_si256(
169 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<4>(s)),
170 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<4>(b))));
171 std::get<5>(s) = _mm256_castpd_si256(
172 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<5>(s)),
173 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<5>(b))));
174 std::get<6>(s) = _mm256_castpd_si256(
175 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<6>(s)),
176 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<6>(b))));
177 std::get<7>(s) = _mm256_castpd_si256(
178 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<7>(s)),
179 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<7>(b))));
183 std::array<__m256i, 16> &s,
const __m256i &a,
const __m256i &b)
185 std::get<0x0>(s) = _mm256_castps_si256(
186 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x0>(s)),
187 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
188 std::get<0x1>(s) = _mm256_castps_si256(
189 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x1>(s)),
190 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
191 std::get<0x2>(s) = _mm256_castps_si256(
192 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x2>(s)),
193 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
194 std::get<0x3>(s) = _mm256_castps_si256(
195 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x3>(s)),
196 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
197 std::get<0x4>(s) = _mm256_castps_si256(
198 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x4>(s)),
199 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
200 std::get<0x5>(s) = _mm256_castps_si256(
201 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x5>(s)),
202 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
203 std::get<0x6>(s) = _mm256_castps_si256(
204 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x6>(s)),
205 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
206 std::get<0x7>(s) = _mm256_castps_si256(
207 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x7>(s)),
208 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
209 std::get<0x8>(s) = _mm256_castps_si256(
210 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x8>(s)),
211 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
212 std::get<0x9>(s) = _mm256_castps_si256(
213 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0x9>(s)),
214 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
215 std::get<0xA>(s) = _mm256_castps_si256(
216 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xA>(s)),
217 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
218 std::get<0xB>(s) = _mm256_castps_si256(
219 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xB>(s)),
220 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
221 std::get<0xC>(s) = _mm256_castps_si256(
222 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xC>(s)),
223 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
224 std::get<0xD>(s) = _mm256_castps_si256(
225 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xD>(s)),
226 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
227 std::get<0xE>(s) = _mm256_castps_si256(
228 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xE>(s)),
229 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
230 std::get<0xF>(s) = _mm256_castps_si256(
231 _mm256_fmadd_ps(_mm256_castsi256_ps(std::get<0xF>(s)),
232 _mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
236 std::array<__m256i, 16> &s,
const __m256i &a,
const __m256i &b)
238 std::get<0x0>(s) = _mm256_castpd_si256(
239 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x0>(s)),
240 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
241 std::get<0x1>(s) = _mm256_castpd_si256(
242 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x1>(s)),
243 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
244 std::get<0x2>(s) = _mm256_castpd_si256(
245 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x2>(s)),
246 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
247 std::get<0x3>(s) = _mm256_castpd_si256(
248 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x3>(s)),
249 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
250 std::get<0x4>(s) = _mm256_castpd_si256(
251 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x4>(s)),
252 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
253 std::get<0x5>(s) = _mm256_castpd_si256(
254 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x5>(s)),
255 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
256 std::get<0x6>(s) = _mm256_castpd_si256(
257 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x6>(s)),
258 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
259 std::get<0x7>(s) = _mm256_castpd_si256(
260 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x7>(s)),
261 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
262 std::get<0x8>(s) = _mm256_castpd_si256(
263 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x8>(s)),
264 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
265 std::get<0x9>(s) = _mm256_castpd_si256(
266 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x9>(s)),
267 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
268 std::get<0xA>(s) = _mm256_castpd_si256(
269 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xA>(s)),
270 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
271 std::get<0xB>(s) = _mm256_castpd_si256(
272 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xB>(s)),
273 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
274 std::get<0xC>(s) = _mm256_castpd_si256(
275 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xC>(s)),
276 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
277 std::get<0xD>(s) = _mm256_castpd_si256(
278 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xD>(s)),
279 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
280 std::get<0xE>(s) = _mm256_castpd_si256(
281 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xE>(s)),
282 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
283 std::get<0xF>(s) = _mm256_castpd_si256(
284 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xF>(s)),
285 _mm256_castsi256_pd(a), _mm256_castsi256_pd(b)));
288 MCKL_INLINE inline void fmadd_pd(std::array<__m256i, 16> &s,
const __m256i &a,
289 const std::array<__m256i, 16> &b)
291 std::get<0x0>(s) = _mm256_castpd_si256(
292 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x0>(s)),
293 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x0>(b))));
294 std::get<0x1>(s) = _mm256_castpd_si256(
295 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x1>(s)),
296 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x1>(b))));
297 std::get<0x2>(s) = _mm256_castpd_si256(
298 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x2>(s)),
299 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x2>(b))));
300 std::get<0x3>(s) = _mm256_castpd_si256(
301 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x3>(s)),
302 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x3>(b))));
303 std::get<0x4>(s) = _mm256_castpd_si256(
304 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x4>(s)),
305 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x4>(b))));
306 std::get<0x5>(s) = _mm256_castpd_si256(
307 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x5>(s)),
308 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x5>(b))));
309 std::get<0x6>(s) = _mm256_castpd_si256(
310 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x6>(s)),
311 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x6>(b))));
312 std::get<0x7>(s) = _mm256_castpd_si256(
313 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x7>(s)),
314 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x7>(b))));
315 std::get<0x8>(s) = _mm256_castpd_si256(
316 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x8>(s)),
317 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x8>(b))));
318 std::get<0x9>(s) = _mm256_castpd_si256(
319 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0x9>(s)),
320 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0x9>(b))));
321 std::get<0xA>(s) = _mm256_castpd_si256(
322 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xA>(s)),
323 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xA>(b))));
324 std::get<0xB>(s) = _mm256_castpd_si256(
325 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xB>(s)),
326 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xB>(b))));
327 std::get<0xC>(s) = _mm256_castpd_si256(
328 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xC>(s)),
329 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xC>(b))));
330 std::get<0xD>(s) = _mm256_castpd_si256(
331 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xD>(s)),
332 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xD>(b))));
333 std::get<0xE>(s) = _mm256_castpd_si256(
334 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xE>(s)),
335 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xE>(b))));
336 std::get<0xF>(s) = _mm256_castpd_si256(
337 _mm256_fmadd_pd(_mm256_castsi256_pd(std::get<0xF>(s)),
338 _mm256_castsi256_pd(a), _mm256_castsi256_pd(std::get<0xF>(b))));
347 #endif // MCKL_INTERNAL_FMA_HPP #define MCKL_PUSH_GCC_WARNING(warning)
#define MCKL_POP_GCC_WARNING