MCKL
Monte Carlo Kernel Library
avx512_op.hpp
Go to the documentation of this file.
1 //============================================================================
2 // MCKL/include/mckl/internal/avx512_op.hpp
3 //----------------------------------------------------------------------------
4 // MCKL: Monte Carlo Kernel Library
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013-2018, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef MCKL_INTERNAL_AVX512_OP_HPP
33 #define MCKL_INTERNAL_AVX512_OP_HPP
34 
35 #include <mckl/internal/config.h>
36 #include <array>
37 
38 MCKL_PUSH_GCC_WARNING("-Wignored-attributes")
39 
40 namespace mckl {
41 
42 namespace internal {
43 
44 template <int imm8>
45 MCKL_INLINE inline void slli_epi32(std::array<__m512i, 4> &s)
46 {
47  std::get<0>(s) = _mm512_slli_epi32(std::get<0>(s), imm8);
48  std::get<1>(s) = _mm512_slli_epi32(std::get<1>(s), imm8);
49  std::get<2>(s) = _mm512_slli_epi32(std::get<2>(s), imm8);
50  std::get<3>(s) = _mm512_slli_epi32(std::get<3>(s), imm8);
51 }
52 
53 template <int imm8>
54 MCKL_INLINE inline void srli_epi32(std::array<__m512i, 4> &s)
55 {
56  std::get<0>(s) = _mm512_srli_epi32(std::get<0>(s), imm8);
57  std::get<1>(s) = _mm512_srli_epi32(std::get<1>(s), imm8);
58  std::get<2>(s) = _mm512_srli_epi32(std::get<2>(s), imm8);
59  std::get<3>(s) = _mm512_srli_epi32(std::get<3>(s), imm8);
60 }
61 
62 template <int imm8>
63 MCKL_INLINE inline void slli_epi64(std::array<__m512i, 4> &s)
64 {
65  std::get<0>(s) = _mm512_slli_epi64(std::get<0>(s), imm8);
66  std::get<1>(s) = _mm512_slli_epi64(std::get<1>(s), imm8);
67  std::get<2>(s) = _mm512_slli_epi64(std::get<2>(s), imm8);
68  std::get<3>(s) = _mm512_slli_epi64(std::get<3>(s), imm8);
69 }
70 
71 template <int imm8>
72 MCKL_INLINE inline void srli_epi64(std::array<__m512i, 4> &s)
73 {
74  std::get<0>(s) = _mm512_srli_epi64(std::get<0>(s), imm8);
75  std::get<1>(s) = _mm512_srli_epi64(std::get<1>(s), imm8);
76  std::get<2>(s) = _mm512_srli_epi64(std::get<2>(s), imm8);
77  std::get<3>(s) = _mm512_srli_epi64(std::get<3>(s), imm8);
78 }
79 
80 template <int imm8>
81 MCKL_INLINE inline void shuffle_epi32(std::array<__m512i, 4> &s)
82 {
83  std::get<0>(s) = _mm512_shuffle_epi32(std::get<0>(s), imm8);
84  std::get<1>(s) = _mm512_shuffle_epi32(std::get<1>(s), imm8);
85  std::get<2>(s) = _mm512_shuffle_epi32(std::get<2>(s), imm8);
86  std::get<3>(s) = _mm512_shuffle_epi32(std::get<3>(s), imm8);
87 }
88 
89 MCKL_INLINE inline void and_si512(const std::array<__m512i, 4> &s,
90  const __m512i &a, std::array<__m512i, 4> &t)
91 {
92  std::get<0>(t) = _mm512_and_si512(std::get<0>(s), a);
93  std::get<1>(t) = _mm512_and_si512(std::get<1>(s), a);
94  std::get<2>(t) = _mm512_and_si512(std::get<2>(s), a);
95  std::get<3>(t) = _mm512_and_si512(std::get<3>(s), a);
96 }
97 
98 MCKL_INLINE inline void and_si512(std::array<__m512i, 4> &s, const __m512i &a)
99 {
100  std::get<0>(s) = _mm512_and_si512(std::get<0>(s), a);
101  std::get<1>(s) = _mm512_and_si512(std::get<1>(s), a);
102  std::get<2>(s) = _mm512_and_si512(std::get<2>(s), a);
103  std::get<3>(s) = _mm512_and_si512(std::get<3>(s), a);
104 }
105 
106 MCKL_INLINE inline void xor_si512(
107  std::array<__m512i, 4> &s, const std::array<__m512i, 4> &a)
108 {
109  std::get<0>(s) = _mm512_xor_si512(std::get<0>(s), std::get<0>(a));
110  std::get<1>(s) = _mm512_xor_si512(std::get<1>(s), std::get<1>(a));
111  std::get<2>(s) = _mm512_xor_si512(std::get<2>(s), std::get<2>(a));
112  std::get<3>(s) = _mm512_xor_si512(std::get<3>(s), std::get<3>(a));
113 }
114 
115 MCKL_INLINE inline void xor_si512(std::array<__m512i, 4> &s, const __m512i &a)
116 {
117  std::get<0>(s) = _mm512_xor_si512(std::get<0>(s), a);
118  std::get<1>(s) = _mm512_xor_si512(std::get<1>(s), a);
119  std::get<2>(s) = _mm512_xor_si512(std::get<2>(s), a);
120  std::get<3>(s) = _mm512_xor_si512(std::get<3>(s), a);
121 }
122 
123 MCKL_INLINE inline void add_epi32(
124  std::array<__m512i, 4> &s, const std::array<__m512i, 4> &a)
125 {
126  std::get<0>(s) = _mm512_add_epi32(std::get<0>(s), std::get<0>(a));
127  std::get<1>(s) = _mm512_add_epi32(std::get<1>(s), std::get<1>(a));
128  std::get<2>(s) = _mm512_add_epi32(std::get<2>(s), std::get<2>(a));
129  std::get<3>(s) = _mm512_add_epi32(std::get<3>(s), std::get<3>(a));
130 }
131 
132 MCKL_INLINE inline void add_epi64(
133  std::array<__m512i, 4> &s, const std::array<__m512i, 4> &a)
134 {
135  std::get<0>(s) = _mm512_add_epi64(std::get<0>(s), std::get<0>(a));
136  std::get<1>(s) = _mm512_add_epi64(std::get<1>(s), std::get<1>(a));
137  std::get<2>(s) = _mm512_add_epi64(std::get<2>(s), std::get<2>(a));
138  std::get<3>(s) = _mm512_add_epi64(std::get<3>(s), std::get<3>(a));
139 }
140 
141 MCKL_INLINE inline void add_epi64(std::array<__m512i, 4> &s, const __m512i &a)
142 {
143  std::get<0>(s) = _mm512_add_epi64(std::get<0>(s), a);
144  std::get<1>(s) = _mm512_add_epi64(std::get<1>(s), a);
145  std::get<2>(s) = _mm512_add_epi64(std::get<2>(s), a);
146  std::get<3>(s) = _mm512_add_epi64(std::get<3>(s), a);
147 }
148 
149 MCKL_INLINE inline void mul_epu32(const std::array<__m512i, 4> &s,
150  const __m512i &a, std::array<__m512i, 4> &t)
151 {
152  std::get<0>(t) = _mm512_mul_epu32(std::get<0>(s), a);
153  std::get<1>(t) = _mm512_mul_epu32(std::get<1>(s), a);
154  std::get<2>(t) = _mm512_mul_epu32(std::get<2>(s), a);
155  std::get<3>(t) = _mm512_mul_epu32(std::get<3>(s), a);
156 }
157 
158 MCKL_INLINE inline void add_ps(std::array<__m512i, 4> &s, const __m512i &a)
159 {
160  std::get<0>(s) = _mm512_castps_si512(_mm512_add_ps(
161  _mm512_castsi512_ps(std::get<0>(s)), _mm512_castsi512_ps(a)));
162  std::get<1>(s) = _mm512_castps_si512(_mm512_add_ps(
163  _mm512_castsi512_ps(std::get<1>(s)), _mm512_castsi512_ps(a)));
164  std::get<2>(s) = _mm512_castps_si512(_mm512_add_ps(
165  _mm512_castsi512_ps(std::get<2>(s)), _mm512_castsi512_ps(a)));
166  std::get<3>(s) = _mm512_castps_si512(_mm512_add_ps(
167  _mm512_castsi512_ps(std::get<3>(s)), _mm512_castsi512_ps(a)));
168 }
169 
170 MCKL_INLINE inline void mul_ps(std::array<__m512i, 4> &s, const __m512i &a)
171 {
172  std::get<0>(s) = _mm512_castps_si512(_mm512_mul_ps(
173  _mm512_castsi512_ps(std::get<0>(s)), _mm512_castsi512_ps(a)));
174  std::get<1>(s) = _mm512_castps_si512(_mm512_mul_ps(
175  _mm512_castsi512_ps(std::get<1>(s)), _mm512_castsi512_ps(a)));
176  std::get<2>(s) = _mm512_castps_si512(_mm512_mul_ps(
177  _mm512_castsi512_ps(std::get<2>(s)), _mm512_castsi512_ps(a)));
178  std::get<3>(s) = _mm512_castps_si512(_mm512_mul_ps(
179  _mm512_castsi512_ps(std::get<3>(s)), _mm512_castsi512_ps(a)));
180 }
181 
182 MCKL_INLINE inline void add_pd(std::array<__m512i, 4> &s, const __m512i &a)
183 {
184  std::get<0>(s) = _mm512_castpd_si512(_mm512_add_pd(
185  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
186  std::get<1>(s) = _mm512_castpd_si512(_mm512_add_pd(
187  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
188  std::get<2>(s) = _mm512_castpd_si512(_mm512_add_pd(
189  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
190  std::get<3>(s) = _mm512_castpd_si512(_mm512_add_pd(
191  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
192 }
193 
194 MCKL_INLINE inline void add_pd(
195  std::array<__m512i, 4> &s, const std::array<__m512i, 4> &a)
196 {
197  std::get<0>(s) =
198  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<0>(s)),
199  _mm512_castsi512_pd(std::get<0>(a))));
200  std::get<1>(s) =
201  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<1>(s)),
202  _mm512_castsi512_pd(std::get<1>(a))));
203  std::get<2>(s) =
204  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<2>(s)),
205  _mm512_castsi512_pd(std::get<2>(a))));
206  std::get<3>(s) =
207  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<3>(s)),
208  _mm512_castsi512_pd(std::get<3>(a))));
209 }
210 
211 MCKL_INLINE inline void sub_pd(std::array<__m512i, 4> &s, const __m512i &a)
212 {
213  std::get<0>(s) = _mm512_castpd_si512(_mm512_sub_pd(
214  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
215  std::get<1>(s) = _mm512_castpd_si512(_mm512_sub_pd(
216  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
217  std::get<2>(s) = _mm512_castpd_si512(_mm512_sub_pd(
218  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
219  std::get<3>(s) = _mm512_castpd_si512(_mm512_sub_pd(
220  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
221 }
222 
223 MCKL_INLINE inline void mul_pd(std::array<__m512i, 4> &s, const __m512i &a)
224 {
225  std::get<0>(s) = _mm512_castpd_si512(_mm512_mul_pd(
226  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
227  std::get<1>(s) = _mm512_castpd_si512(_mm512_mul_pd(
228  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
229  std::get<2>(s) = _mm512_castpd_si512(_mm512_mul_pd(
230  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
231  std::get<3>(s) = _mm512_castpd_si512(_mm512_mul_pd(
232  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
233 }
234 
235 MCKL_INLINE inline void mul_pd(
236  std::array<__m512i, 4> &s, const std::array<__m512i, 4> &a)
237 {
238  std::get<0>(s) =
239  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<0>(s)),
240  _mm512_castsi512_pd(std::get<0>(a))));
241  std::get<1>(s) =
242  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<1>(s)),
243  _mm512_castsi512_pd(std::get<1>(a))));
244  std::get<2>(s) =
245  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<2>(s)),
246  _mm512_castsi512_pd(std::get<2>(a))));
247  std::get<3>(s) =
248  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<3>(s)),
249  _mm512_castsi512_pd(std::get<3>(a))));
250 }
251 
252 template <int imm8>
253 MCKL_INLINE inline void slli_epi32(std::array<__m512i, 8> &s)
254 {
255  std::get<0>(s) = _mm512_slli_epi32(std::get<0>(s), imm8);
256  std::get<1>(s) = _mm512_slli_epi32(std::get<1>(s), imm8);
257  std::get<2>(s) = _mm512_slli_epi32(std::get<2>(s), imm8);
258  std::get<3>(s) = _mm512_slli_epi32(std::get<3>(s), imm8);
259  std::get<4>(s) = _mm512_slli_epi32(std::get<4>(s), imm8);
260  std::get<5>(s) = _mm512_slli_epi32(std::get<5>(s), imm8);
261  std::get<6>(s) = _mm512_slli_epi32(std::get<6>(s), imm8);
262  std::get<7>(s) = _mm512_slli_epi32(std::get<7>(s), imm8);
263 }
264 
265 template <int imm8>
266 MCKL_INLINE inline void srli_epi32(std::array<__m512i, 8> &s)
267 {
268  std::get<0>(s) = _mm512_srli_epi32(std::get<0>(s), imm8);
269  std::get<1>(s) = _mm512_srli_epi32(std::get<1>(s), imm8);
270  std::get<2>(s) = _mm512_srli_epi32(std::get<2>(s), imm8);
271  std::get<3>(s) = _mm512_srli_epi32(std::get<3>(s), imm8);
272  std::get<4>(s) = _mm512_srli_epi32(std::get<4>(s), imm8);
273  std::get<5>(s) = _mm512_srli_epi32(std::get<5>(s), imm8);
274  std::get<6>(s) = _mm512_srli_epi32(std::get<6>(s), imm8);
275  std::get<7>(s) = _mm512_srli_epi32(std::get<7>(s), imm8);
276 }
277 
278 template <int imm8>
279 MCKL_INLINE inline void slli_epi64(std::array<__m512i, 8> &s)
280 {
281  std::get<0>(s) = _mm512_slli_epi64(std::get<0>(s), imm8);
282  std::get<1>(s) = _mm512_slli_epi64(std::get<1>(s), imm8);
283  std::get<2>(s) = _mm512_slli_epi64(std::get<2>(s), imm8);
284  std::get<3>(s) = _mm512_slli_epi64(std::get<3>(s), imm8);
285  std::get<4>(s) = _mm512_slli_epi64(std::get<4>(s), imm8);
286  std::get<5>(s) = _mm512_slli_epi64(std::get<5>(s), imm8);
287  std::get<6>(s) = _mm512_slli_epi64(std::get<6>(s), imm8);
288  std::get<7>(s) = _mm512_slli_epi64(std::get<7>(s), imm8);
289 }
290 
291 template <int imm8>
292 MCKL_INLINE inline void srli_epi64(std::array<__m512i, 8> &s)
293 {
294  std::get<0>(s) = _mm512_srli_epi64(std::get<0>(s), imm8);
295  std::get<1>(s) = _mm512_srli_epi64(std::get<1>(s), imm8);
296  std::get<2>(s) = _mm512_srli_epi64(std::get<2>(s), imm8);
297  std::get<3>(s) = _mm512_srli_epi64(std::get<3>(s), imm8);
298  std::get<4>(s) = _mm512_srli_epi64(std::get<4>(s), imm8);
299  std::get<5>(s) = _mm512_srli_epi64(std::get<5>(s), imm8);
300  std::get<6>(s) = _mm512_srli_epi64(std::get<6>(s), imm8);
301  std::get<7>(s) = _mm512_srli_epi64(std::get<7>(s), imm8);
302 }
303 
304 template <int imm8>
305 MCKL_INLINE inline void shuffle_epi32(std::array<__m512i, 8> &s)
306 {
307  std::get<0>(s) = _mm512_shuffle_epi32(std::get<0>(s), imm8);
308  std::get<1>(s) = _mm512_shuffle_epi32(std::get<1>(s), imm8);
309  std::get<2>(s) = _mm512_shuffle_epi32(std::get<2>(s), imm8);
310  std::get<3>(s) = _mm512_shuffle_epi32(std::get<3>(s), imm8);
311  std::get<4>(s) = _mm512_shuffle_epi32(std::get<4>(s), imm8);
312  std::get<5>(s) = _mm512_shuffle_epi32(std::get<5>(s), imm8);
313  std::get<6>(s) = _mm512_shuffle_epi32(std::get<6>(s), imm8);
314  std::get<7>(s) = _mm512_shuffle_epi32(std::get<7>(s), imm8);
315 }
316 
317 MCKL_INLINE inline void and_si512(const std::array<__m512i, 8> &s,
318  const __m512i &a, std::array<__m512i, 8> &t)
319 {
320  std::get<0>(t) = _mm512_and_si512(std::get<0>(s), a);
321  std::get<1>(t) = _mm512_and_si512(std::get<1>(s), a);
322  std::get<2>(t) = _mm512_and_si512(std::get<2>(s), a);
323  std::get<3>(t) = _mm512_and_si512(std::get<3>(s), a);
324  std::get<4>(t) = _mm512_and_si512(std::get<4>(s), a);
325  std::get<5>(t) = _mm512_and_si512(std::get<5>(s), a);
326  std::get<6>(t) = _mm512_and_si512(std::get<6>(s), a);
327  std::get<7>(t) = _mm512_and_si512(std::get<7>(s), a);
328 }
329 
330 MCKL_INLINE inline void and_si512(std::array<__m512i, 8> &s, const __m512i &a)
331 {
332  std::get<0>(s) = _mm512_and_si512(std::get<0>(s), a);
333  std::get<1>(s) = _mm512_and_si512(std::get<1>(s), a);
334  std::get<2>(s) = _mm512_and_si512(std::get<2>(s), a);
335  std::get<3>(s) = _mm512_and_si512(std::get<3>(s), a);
336  std::get<4>(s) = _mm512_and_si512(std::get<4>(s), a);
337  std::get<5>(s) = _mm512_and_si512(std::get<5>(s), a);
338  std::get<6>(s) = _mm512_and_si512(std::get<6>(s), a);
339  std::get<7>(s) = _mm512_and_si512(std::get<7>(s), a);
340 }
341 
342 MCKL_INLINE inline void xor_si512(
343  std::array<__m512i, 8> &s, const std::array<__m512i, 8> &a)
344 {
345  std::get<0>(s) = _mm512_xor_si512(std::get<0>(s), std::get<0>(a));
346  std::get<1>(s) = _mm512_xor_si512(std::get<1>(s), std::get<1>(a));
347  std::get<2>(s) = _mm512_xor_si512(std::get<2>(s), std::get<2>(a));
348  std::get<3>(s) = _mm512_xor_si512(std::get<3>(s), std::get<3>(a));
349  std::get<4>(s) = _mm512_xor_si512(std::get<4>(s), std::get<4>(a));
350  std::get<5>(s) = _mm512_xor_si512(std::get<5>(s), std::get<5>(a));
351  std::get<6>(s) = _mm512_xor_si512(std::get<6>(s), std::get<6>(a));
352  std::get<7>(s) = _mm512_xor_si512(std::get<7>(s), std::get<7>(a));
353 }
354 
355 MCKL_INLINE inline void xor_si512(std::array<__m512i, 8> &s, const __m512i &a)
356 {
357  std::get<0>(s) = _mm512_xor_si512(std::get<0>(s), a);
358  std::get<1>(s) = _mm512_xor_si512(std::get<1>(s), a);
359  std::get<2>(s) = _mm512_xor_si512(std::get<2>(s), a);
360  std::get<3>(s) = _mm512_xor_si512(std::get<3>(s), a);
361  std::get<4>(s) = _mm512_xor_si512(std::get<4>(s), a);
362  std::get<5>(s) = _mm512_xor_si512(std::get<5>(s), a);
363  std::get<6>(s) = _mm512_xor_si512(std::get<6>(s), a);
364  std::get<7>(s) = _mm512_xor_si512(std::get<7>(s), a);
365 }
366 
367 MCKL_INLINE inline void add_epi32(
368  std::array<__m512i, 8> &s, const std::array<__m512i, 8> &a)
369 {
370  std::get<0>(s) = _mm512_add_epi32(std::get<0>(s), std::get<0>(a));
371  std::get<1>(s) = _mm512_add_epi32(std::get<1>(s), std::get<1>(a));
372  std::get<2>(s) = _mm512_add_epi32(std::get<2>(s), std::get<2>(a));
373  std::get<3>(s) = _mm512_add_epi32(std::get<3>(s), std::get<3>(a));
374  std::get<4>(s) = _mm512_add_epi32(std::get<4>(s), std::get<4>(a));
375  std::get<5>(s) = _mm512_add_epi32(std::get<5>(s), std::get<5>(a));
376  std::get<6>(s) = _mm512_add_epi32(std::get<6>(s), std::get<6>(a));
377  std::get<7>(s) = _mm512_add_epi32(std::get<7>(s), std::get<7>(a));
378 }
379 
380 MCKL_INLINE inline void add_epi64(
381  std::array<__m512i, 8> &s, const std::array<__m512i, 8> &a)
382 {
383  std::get<0>(s) = _mm512_add_epi64(std::get<0>(s), std::get<0>(a));
384  std::get<1>(s) = _mm512_add_epi64(std::get<1>(s), std::get<1>(a));
385  std::get<2>(s) = _mm512_add_epi64(std::get<2>(s), std::get<2>(a));
386  std::get<3>(s) = _mm512_add_epi64(std::get<3>(s), std::get<3>(a));
387  std::get<4>(s) = _mm512_add_epi64(std::get<4>(s), std::get<4>(a));
388  std::get<5>(s) = _mm512_add_epi64(std::get<5>(s), std::get<5>(a));
389  std::get<6>(s) = _mm512_add_epi64(std::get<6>(s), std::get<6>(a));
390  std::get<7>(s) = _mm512_add_epi64(std::get<7>(s), std::get<7>(a));
391 }
392 
393 MCKL_INLINE inline void add_epi64(std::array<__m512i, 8> &s, const __m512i &a)
394 {
395  std::get<0>(s) = _mm512_add_epi64(std::get<0>(s), a);
396  std::get<1>(s) = _mm512_add_epi64(std::get<1>(s), a);
397  std::get<2>(s) = _mm512_add_epi64(std::get<2>(s), a);
398  std::get<3>(s) = _mm512_add_epi64(std::get<3>(s), a);
399  std::get<4>(s) = _mm512_add_epi64(std::get<4>(s), a);
400  std::get<5>(s) = _mm512_add_epi64(std::get<5>(s), a);
401  std::get<6>(s) = _mm512_add_epi64(std::get<6>(s), a);
402  std::get<7>(s) = _mm512_add_epi64(std::get<7>(s), a);
403 }
404 
405 MCKL_INLINE inline void mul_epu32(const std::array<__m512i, 8> &s,
406  const __m512i &a, std::array<__m512i, 8> &t)
407 {
408  std::get<0>(t) = _mm512_mul_epu32(std::get<0>(s), a);
409  std::get<1>(t) = _mm512_mul_epu32(std::get<1>(s), a);
410  std::get<2>(t) = _mm512_mul_epu32(std::get<2>(s), a);
411  std::get<3>(t) = _mm512_mul_epu32(std::get<3>(s), a);
412  std::get<4>(t) = _mm512_mul_epu32(std::get<4>(s), a);
413  std::get<5>(t) = _mm512_mul_epu32(std::get<5>(s), a);
414  std::get<6>(t) = _mm512_mul_epu32(std::get<6>(s), a);
415  std::get<7>(t) = _mm512_mul_epu32(std::get<7>(s), a);
416 }
417 
418 MCKL_INLINE inline void add_ps(std::array<__m512i, 8> &s, const __m512i &a)
419 {
420  std::get<0>(s) = _mm512_castps_si512(_mm512_add_ps(
421  _mm512_castsi512_ps(std::get<0>(s)), _mm512_castsi512_ps(a)));
422  std::get<1>(s) = _mm512_castps_si512(_mm512_add_ps(
423  _mm512_castsi512_ps(std::get<1>(s)), _mm512_castsi512_ps(a)));
424  std::get<2>(s) = _mm512_castps_si512(_mm512_add_ps(
425  _mm512_castsi512_ps(std::get<2>(s)), _mm512_castsi512_ps(a)));
426  std::get<3>(s) = _mm512_castps_si512(_mm512_add_ps(
427  _mm512_castsi512_ps(std::get<3>(s)), _mm512_castsi512_ps(a)));
428  std::get<4>(s) = _mm512_castps_si512(_mm512_add_ps(
429  _mm512_castsi512_ps(std::get<4>(s)), _mm512_castsi512_ps(a)));
430  std::get<5>(s) = _mm512_castps_si512(_mm512_add_ps(
431  _mm512_castsi512_ps(std::get<5>(s)), _mm512_castsi512_ps(a)));
432  std::get<6>(s) = _mm512_castps_si512(_mm512_add_ps(
433  _mm512_castsi512_ps(std::get<6>(s)), _mm512_castsi512_ps(a)));
434  std::get<7>(s) = _mm512_castps_si512(_mm512_add_ps(
435  _mm512_castsi512_ps(std::get<7>(s)), _mm512_castsi512_ps(a)));
436 }
437 
438 MCKL_INLINE inline void mul_ps(std::array<__m512i, 8> &s, const __m512i &a)
439 {
440  std::get<0>(s) = _mm512_castps_si512(_mm512_mul_ps(
441  _mm512_castsi512_ps(std::get<0>(s)), _mm512_castsi512_ps(a)));
442  std::get<1>(s) = _mm512_castps_si512(_mm512_mul_ps(
443  _mm512_castsi512_ps(std::get<1>(s)), _mm512_castsi512_ps(a)));
444  std::get<2>(s) = _mm512_castps_si512(_mm512_mul_ps(
445  _mm512_castsi512_ps(std::get<2>(s)), _mm512_castsi512_ps(a)));
446  std::get<3>(s) = _mm512_castps_si512(_mm512_mul_ps(
447  _mm512_castsi512_ps(std::get<3>(s)), _mm512_castsi512_ps(a)));
448  std::get<4>(s) = _mm512_castps_si512(_mm512_mul_ps(
449  _mm512_castsi512_ps(std::get<4>(s)), _mm512_castsi512_ps(a)));
450  std::get<5>(s) = _mm512_castps_si512(_mm512_mul_ps(
451  _mm512_castsi512_ps(std::get<5>(s)), _mm512_castsi512_ps(a)));
452  std::get<6>(s) = _mm512_castps_si512(_mm512_mul_ps(
453  _mm512_castsi512_ps(std::get<6>(s)), _mm512_castsi512_ps(a)));
454  std::get<7>(s) = _mm512_castps_si512(_mm512_mul_ps(
455  _mm512_castsi512_ps(std::get<7>(s)), _mm512_castsi512_ps(a)));
456 }
457 
458 MCKL_INLINE inline void add_pd(std::array<__m512i, 8> &s, const __m512i &a)
459 {
460  std::get<0>(s) = _mm512_castpd_si512(_mm512_add_pd(
461  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
462  std::get<1>(s) = _mm512_castpd_si512(_mm512_add_pd(
463  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
464  std::get<2>(s) = _mm512_castpd_si512(_mm512_add_pd(
465  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
466  std::get<3>(s) = _mm512_castpd_si512(_mm512_add_pd(
467  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
468  std::get<4>(s) = _mm512_castpd_si512(_mm512_add_pd(
469  _mm512_castsi512_pd(std::get<4>(s)), _mm512_castsi512_pd(a)));
470  std::get<5>(s) = _mm512_castpd_si512(_mm512_add_pd(
471  _mm512_castsi512_pd(std::get<5>(s)), _mm512_castsi512_pd(a)));
472  std::get<6>(s) = _mm512_castpd_si512(_mm512_add_pd(
473  _mm512_castsi512_pd(std::get<6>(s)), _mm512_castsi512_pd(a)));
474  std::get<7>(s) = _mm512_castpd_si512(_mm512_add_pd(
475  _mm512_castsi512_pd(std::get<7>(s)), _mm512_castsi512_pd(a)));
476 }
477 
478 MCKL_INLINE inline void add_pd(
479  std::array<__m512i, 8> &s, const std::array<__m512i, 8> &a)
480 {
481  std::get<0>(s) =
482  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<0>(s)),
483  _mm512_castsi512_pd(std::get<0>(a))));
484  std::get<1>(s) =
485  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<1>(s)),
486  _mm512_castsi512_pd(std::get<1>(a))));
487  std::get<2>(s) =
488  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<2>(s)),
489  _mm512_castsi512_pd(std::get<2>(a))));
490  std::get<3>(s) =
491  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<3>(s)),
492  _mm512_castsi512_pd(std::get<3>(a))));
493  std::get<4>(s) =
494  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<4>(s)),
495  _mm512_castsi512_pd(std::get<4>(a))));
496  std::get<5>(s) =
497  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<5>(s)),
498  _mm512_castsi512_pd(std::get<5>(a))));
499  std::get<6>(s) =
500  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<6>(s)),
501  _mm512_castsi512_pd(std::get<6>(a))));
502  std::get<7>(s) =
503  _mm512_castpd_si512(_mm512_add_pd(_mm512_castsi512_pd(std::get<7>(s)),
504  _mm512_castsi512_pd(std::get<7>(a))));
505 }
506 
507 MCKL_INLINE inline void sub_pd(std::array<__m512i, 8> &s, const __m512i &a)
508 {
509  std::get<0>(s) = _mm512_castpd_si512(_mm512_sub_pd(
510  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
511  std::get<1>(s) = _mm512_castpd_si512(_mm512_sub_pd(
512  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
513  std::get<2>(s) = _mm512_castpd_si512(_mm512_sub_pd(
514  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
515  std::get<3>(s) = _mm512_castpd_si512(_mm512_sub_pd(
516  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
517  std::get<4>(s) = _mm512_castpd_si512(_mm512_sub_pd(
518  _mm512_castsi512_pd(std::get<4>(s)), _mm512_castsi512_pd(a)));
519  std::get<5>(s) = _mm512_castpd_si512(_mm512_sub_pd(
520  _mm512_castsi512_pd(std::get<5>(s)), _mm512_castsi512_pd(a)));
521  std::get<6>(s) = _mm512_castpd_si512(_mm512_sub_pd(
522  _mm512_castsi512_pd(std::get<6>(s)), _mm512_castsi512_pd(a)));
523  std::get<7>(s) = _mm512_castpd_si512(_mm512_sub_pd(
524  _mm512_castsi512_pd(std::get<7>(s)), _mm512_castsi512_pd(a)));
525 }
526 
527 MCKL_INLINE inline void mul_pd(std::array<__m512i, 8> &s, const __m512i &a)
528 {
529  std::get<0>(s) = _mm512_castpd_si512(_mm512_mul_pd(
530  _mm512_castsi512_pd(std::get<0>(s)), _mm512_castsi512_pd(a)));
531  std::get<1>(s) = _mm512_castpd_si512(_mm512_mul_pd(
532  _mm512_castsi512_pd(std::get<1>(s)), _mm512_castsi512_pd(a)));
533  std::get<2>(s) = _mm512_castpd_si512(_mm512_mul_pd(
534  _mm512_castsi512_pd(std::get<2>(s)), _mm512_castsi512_pd(a)));
535  std::get<3>(s) = _mm512_castpd_si512(_mm512_mul_pd(
536  _mm512_castsi512_pd(std::get<3>(s)), _mm512_castsi512_pd(a)));
537  std::get<4>(s) = _mm512_castpd_si512(_mm512_mul_pd(
538  _mm512_castsi512_pd(std::get<4>(s)), _mm512_castsi512_pd(a)));
539  std::get<5>(s) = _mm512_castpd_si512(_mm512_mul_pd(
540  _mm512_castsi512_pd(std::get<5>(s)), _mm512_castsi512_pd(a)));
541  std::get<6>(s) = _mm512_castpd_si512(_mm512_mul_pd(
542  _mm512_castsi512_pd(std::get<6>(s)), _mm512_castsi512_pd(a)));
543  std::get<7>(s) = _mm512_castpd_si512(_mm512_mul_pd(
544  _mm512_castsi512_pd(std::get<7>(s)), _mm512_castsi512_pd(a)));
545 }
546 
547 MCKL_INLINE inline void mul_pd(
548  std::array<__m512i, 8> &s, const std::array<__m512i, 8> &a)
549 {
550  std::get<0>(s) =
551  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<0>(s)),
552  _mm512_castsi512_pd(std::get<0>(a))));
553  std::get<1>(s) =
554  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<1>(s)),
555  _mm512_castsi512_pd(std::get<1>(a))));
556  std::get<2>(s) =
557  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<2>(s)),
558  _mm512_castsi512_pd(std::get<2>(a))));
559  std::get<3>(s) =
560  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<3>(s)),
561  _mm512_castsi512_pd(std::get<3>(a))));
562  std::get<4>(s) =
563  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<4>(s)),
564  _mm512_castsi512_pd(std::get<4>(a))));
565  std::get<5>(s) =
566  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<5>(s)),
567  _mm512_castsi512_pd(std::get<5>(a))));
568  std::get<6>(s) =
569  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<6>(s)),
570  _mm512_castsi512_pd(std::get<6>(a))));
571  std::get<7>(s) =
572  _mm512_castpd_si512(_mm512_mul_pd(_mm512_castsi512_pd(std::get<7>(s)),
573  _mm512_castsi512_pd(std::get<7>(a))));
574 }
575 
576 template <int imm8>
577 MCKL_INLINE inline void slli_epi32(std::array<__m512i, 16> &s)
578 {
579  std::get<0x0>(s) = _mm512_slli_epi32(std::get<0x0>(s), imm8);
580  std::get<0x1>(s) = _mm512_slli_epi32(std::get<0x1>(s), imm8);
581  std::get<0x2>(s) = _mm512_slli_epi32(std::get<0x2>(s), imm8);
582  std::get<0x3>(s) = _mm512_slli_epi32(std::get<0x3>(s), imm8);
583  std::get<0x4>(s) = _mm512_slli_epi32(std::get<0x4>(s), imm8);
584  std::get<0x5>(s) = _mm512_slli_epi32(std::get<0x5>(s), imm8);
585  std::get<0x6>(s) = _mm512_slli_epi32(std::get<0x6>(s), imm8);
586  std::get<0x7>(s) = _mm512_slli_epi32(std::get<0x7>(s), imm8);
587  std::get<0x8>(s) = _mm512_slli_epi32(std::get<0x8>(s), imm8);
588  std::get<0x9>(s) = _mm512_slli_epi32(std::get<0x9>(s), imm8);
589  std::get<0xA>(s) = _mm512_slli_epi32(std::get<0xA>(s), imm8);
590  std::get<0xB>(s) = _mm512_slli_epi32(std::get<0xB>(s), imm8);
591  std::get<0xC>(s) = _mm512_slli_epi32(std::get<0xC>(s), imm8);
592  std::get<0xD>(s) = _mm512_slli_epi32(std::get<0xD>(s), imm8);
593  std::get<0xE>(s) = _mm512_slli_epi32(std::get<0xE>(s), imm8);
594  std::get<0xF>(s) = _mm512_slli_epi32(std::get<0xF>(s), imm8);
595 }
596 
597 template <int imm8>
598 MCKL_INLINE inline void srli_epi32(std::array<__m512i, 16> &s)
599 {
600  std::get<0x0>(s) = _mm512_srli_epi32(std::get<0x0>(s), imm8);
601  std::get<0x1>(s) = _mm512_srli_epi32(std::get<0x1>(s), imm8);
602  std::get<0x2>(s) = _mm512_srli_epi32(std::get<0x2>(s), imm8);
603  std::get<0x3>(s) = _mm512_srli_epi32(std::get<0x3>(s), imm8);
604  std::get<0x4>(s) = _mm512_srli_epi32(std::get<0x4>(s), imm8);
605  std::get<0x5>(s) = _mm512_srli_epi32(std::get<0x5>(s), imm8);
606  std::get<0x6>(s) = _mm512_srli_epi32(std::get<0x6>(s), imm8);
607  std::get<0x7>(s) = _mm512_srli_epi32(std::get<0x7>(s), imm8);
608  std::get<0x8>(s) = _mm512_srli_epi32(std::get<0x8>(s), imm8);
609  std::get<0x9>(s) = _mm512_srli_epi32(std::get<0x9>(s), imm8);
610  std::get<0xA>(s) = _mm512_srli_epi32(std::get<0xA>(s), imm8);
611  std::get<0xB>(s) = _mm512_srli_epi32(std::get<0xB>(s), imm8);
612  std::get<0xC>(s) = _mm512_srli_epi32(std::get<0xC>(s), imm8);
613  std::get<0xD>(s) = _mm512_srli_epi32(std::get<0xD>(s), imm8);
614  std::get<0xE>(s) = _mm512_srli_epi32(std::get<0xE>(s), imm8);
615  std::get<0xF>(s) = _mm512_srli_epi32(std::get<0xF>(s), imm8);
616 }
617 
618 template <int imm8>
619 MCKL_INLINE inline void slli_epi64(std::array<__m512i, 16> &s)
620 {
621  std::get<0x0>(s) = _mm512_slli_epi64(std::get<0x0>(s), imm8);
622  std::get<0x1>(s) = _mm512_slli_epi64(std::get<0x1>(s), imm8);
623  std::get<0x2>(s) = _mm512_slli_epi64(std::get<0x2>(s), imm8);
624  std::get<0x3>(s) = _mm512_slli_epi64(std::get<0x3>(s), imm8);
625  std::get<0x4>(s) = _mm512_slli_epi64(std::get<0x4>(s), imm8);
626  std::get<0x5>(s) = _mm512_slli_epi64(std::get<0x5>(s), imm8);
627  std::get<0x6>(s) = _mm512_slli_epi64(std::get<0x6>(s), imm8);
628  std::get<0x7>(s) = _mm512_slli_epi64(std::get<0x7>(s), imm8);
629  std::get<0x8>(s) = _mm512_slli_epi64(std::get<0x8>(s), imm8);
630  std::get<0x9>(s) = _mm512_slli_epi64(std::get<0x9>(s), imm8);
631  std::get<0xA>(s) = _mm512_slli_epi64(std::get<0xA>(s), imm8);
632  std::get<0xB>(s) = _mm512_slli_epi64(std::get<0xB>(s), imm8);
633  std::get<0xC>(s) = _mm512_slli_epi64(std::get<0xC>(s), imm8);
634  std::get<0xD>(s) = _mm512_slli_epi64(std::get<0xD>(s), imm8);
635  std::get<0xE>(s) = _mm512_slli_epi64(std::get<0xE>(s), imm8);
636  std::get<0xF>(s) = _mm512_slli_epi64(std::get<0xF>(s), imm8);
637 }
638 
639 template <int imm8>
640 MCKL_INLINE inline void srli_epi64(std::array<__m512i, 16> &s)
641 {
642  std::get<0x0>(s) = _mm512_srli_epi64(std::get<0x0>(s), imm8);
643  std::get<0x1>(s) = _mm512_srli_epi64(std::get<0x1>(s), imm8);
644  std::get<0x2>(s) = _mm512_srli_epi64(std::get<0x2>(s), imm8);
645  std::get<0x3>(s) = _mm512_srli_epi64(std::get<0x3>(s), imm8);
646  std::get<0x4>(s) = _mm512_srli_epi64(std::get<0x4>(s), imm8);
647  std::get<0x5>(s) = _mm512_srli_epi64(std::get<0x5>(s), imm8);
648  std::get<0x6>(s) = _mm512_srli_epi64(std::get<0x6>(s), imm8);
649  std::get<0x7>(s) = _mm512_srli_epi64(std::get<0x7>(s), imm8);
650  std::get<0x8>(s) = _mm512_srli_epi64(std::get<0x8>(s), imm8);
651  std::get<0x9>(s) = _mm512_srli_epi64(std::get<0x9>(s), imm8);
652  std::get<0xA>(s) = _mm512_srli_epi64(std::get<0xA>(s), imm8);
653  std::get<0xB>(s) = _mm512_srli_epi64(std::get<0xB>(s), imm8);
654  std::get<0xC>(s) = _mm512_srli_epi64(std::get<0xC>(s), imm8);
655  std::get<0xD>(s) = _mm512_srli_epi64(std::get<0xD>(s), imm8);
656  std::get<0xE>(s) = _mm512_srli_epi64(std::get<0xE>(s), imm8);
657  std::get<0xF>(s) = _mm512_srli_epi64(std::get<0xF>(s), imm8);
658 }
659 
660 template <int imm8>
661 MCKL_INLINE inline void shuffle_epi32(std::array<__m512i, 16> &s)
662 {
663  std::get<0x0>(s) = _mm512_shuffle_epi32(std::get<0x0>(s), imm8);
664  std::get<0x1>(s) = _mm512_shuffle_epi32(std::get<0x1>(s), imm8);
665  std::get<0x2>(s) = _mm512_shuffle_epi32(std::get<0x2>(s), imm8);
666  std::get<0x3>(s) = _mm512_shuffle_epi32(std::get<0x3>(s), imm8);
667  std::get<0x4>(s) = _mm512_shuffle_epi32(std::get<0x4>(s), imm8);
668  std::get<0x5>(s) = _mm512_shuffle_epi32(std::get<0x5>(s), imm8);
669  std::get<0x6>(s) = _mm512_shuffle_epi32(std::get<0x6>(s), imm8);
670  std::get<0x7>(s) = _mm512_shuffle_epi32(std::get<0x7>(s), imm8);
671  std::get<0x8>(s) = _mm512_shuffle_epi32(std::get<0x8>(s), imm8);
672  std::get<0x9>(s) = _mm512_shuffle_epi32(std::get<0x9>(s), imm8);
673  std::get<0xA>(s) = _mm512_shuffle_epi32(std::get<0xA>(s), imm8);
674  std::get<0xB>(s) = _mm512_shuffle_epi32(std::get<0xB>(s), imm8);
675  std::get<0xC>(s) = _mm512_shuffle_epi32(std::get<0xC>(s), imm8);
676  std::get<0xD>(s) = _mm512_shuffle_epi32(std::get<0xD>(s), imm8);
677  std::get<0xE>(s) = _mm512_shuffle_epi32(std::get<0xE>(s), imm8);
678  std::get<0xF>(s) = _mm512_shuffle_epi32(std::get<0xF>(s), imm8);
679 }
680 
681 MCKL_INLINE inline void and_si512(const std::array<__m512i, 16> &s,
682  const __m512i &a, std::array<__m512i, 16> &t)
683 {
684  std::get<0x0>(t) = _mm512_and_si512(std::get<0x0>(s), a);
685  std::get<0x1>(t) = _mm512_and_si512(std::get<0x1>(s), a);
686  std::get<0x2>(t) = _mm512_and_si512(std::get<0x2>(s), a);
687  std::get<0x3>(t) = _mm512_and_si512(std::get<0x3>(s), a);
688  std::get<0x4>(t) = _mm512_and_si512(std::get<0x4>(s), a);
689  std::get<0x5>(t) = _mm512_and_si512(std::get<0x5>(s), a);
690  std::get<0x6>(t) = _mm512_and_si512(std::get<0x6>(s), a);
691  std::get<0x7>(t) = _mm512_and_si512(std::get<0x7>(s), a);
692  std::get<0x8>(t) = _mm512_and_si512(std::get<0x8>(s), a);
693  std::get<0x9>(t) = _mm512_and_si512(std::get<0x9>(s), a);
694  std::get<0xA>(t) = _mm512_and_si512(std::get<0xA>(s), a);
695  std::get<0xB>(t) = _mm512_and_si512(std::get<0xB>(s), a);
696  std::get<0xC>(t) = _mm512_and_si512(std::get<0xC>(s), a);
697  std::get<0xD>(t) = _mm512_and_si512(std::get<0xD>(s), a);
698  std::get<0xE>(t) = _mm512_and_si512(std::get<0xE>(s), a);
699  std::get<0xF>(t) = _mm512_and_si512(std::get<0xF>(s), a);
700 }
701 
702 MCKL_INLINE inline void and_si512(std::array<__m512i, 16> &s, const __m512i &a)
703 {
704  std::get<0x0>(s) = _mm512_and_si512(std::get<0x0>(s), a);
705  std::get<0x1>(s) = _mm512_and_si512(std::get<0x1>(s), a);
706  std::get<0x2>(s) = _mm512_and_si512(std::get<0x2>(s), a);
707  std::get<0x3>(s) = _mm512_and_si512(std::get<0x3>(s), a);
708  std::get<0x4>(s) = _mm512_and_si512(std::get<0x4>(s), a);
709  std::get<0x5>(s) = _mm512_and_si512(std::get<0x5>(s), a);
710  std::get<0x6>(s) = _mm512_and_si512(std::get<0x6>(s), a);
711  std::get<0x7>(s) = _mm512_and_si512(std::get<0x7>(s), a);
712  std::get<0x8>(s) = _mm512_and_si512(std::get<0x8>(s), a);
713  std::get<0x9>(s) = _mm512_and_si512(std::get<0x9>(s), a);
714  std::get<0xA>(s) = _mm512_and_si512(std::get<0xA>(s), a);
715  std::get<0xB>(s) = _mm512_and_si512(std::get<0xB>(s), a);
716  std::get<0xC>(s) = _mm512_and_si512(std::get<0xC>(s), a);
717  std::get<0xD>(s) = _mm512_and_si512(std::get<0xD>(s), a);
718  std::get<0xE>(s) = _mm512_and_si512(std::get<0xE>(s), a);
719  std::get<0xF>(s) = _mm512_and_si512(std::get<0xF>(s), a);
720 }
721 
722 MCKL_INLINE inline void xor_si512(
723  std::array<__m512i, 16> &s, const std::array<__m512i, 16> &a)
724 {
725  std::get<0x0>(s) = _mm512_xor_si512(std::get<0x0>(s), std::get<0x0>(a));
726  std::get<0x1>(s) = _mm512_xor_si512(std::get<0x1>(s), std::get<0x1>(a));
727  std::get<0x2>(s) = _mm512_xor_si512(std::get<0x2>(s), std::get<0x2>(a));
728  std::get<0x3>(s) = _mm512_xor_si512(std::get<0x3>(s), std::get<0x3>(a));
729  std::get<0x4>(s) = _mm512_xor_si512(std::get<0x4>(s), std::get<0x4>(a));
730  std::get<0x5>(s) = _mm512_xor_si512(std::get<0x5>(s), std::get<0x5>(a));
731  std::get<0x6>(s) = _mm512_xor_si512(std::get<0x6>(s), std::get<0x6>(a));
732  std::get<0x7>(s) = _mm512_xor_si512(std::get<0x7>(s), std::get<0x7>(a));
733  std::get<0x8>(s) = _mm512_xor_si512(std::get<0x8>(s), std::get<0x8>(a));
734  std::get<0x9>(s) = _mm512_xor_si512(std::get<0x9>(s), std::get<0x9>(a));
735  std::get<0xA>(s) = _mm512_xor_si512(std::get<0xA>(s), std::get<0xA>(a));
736  std::get<0xB>(s) = _mm512_xor_si512(std::get<0xB>(s), std::get<0xB>(a));
737  std::get<0xC>(s) = _mm512_xor_si512(std::get<0xC>(s), std::get<0xC>(a));
738  std::get<0xD>(s) = _mm512_xor_si512(std::get<0xD>(s), std::get<0xD>(a));
739  std::get<0xE>(s) = _mm512_xor_si512(std::get<0xE>(s), std::get<0xE>(a));
740  std::get<0xF>(s) = _mm512_xor_si512(std::get<0xF>(s), std::get<0xF>(a));
741 }
742 
743 MCKL_INLINE inline void xor_si512(std::array<__m512i, 16> &s, const __m512i &a)
744 {
745  std::get<0x0>(s) = _mm512_xor_si512(std::get<0x0>(s), a);
746  std::get<0x1>(s) = _mm512_xor_si512(std::get<0x1>(s), a);
747  std::get<0x2>(s) = _mm512_xor_si512(std::get<0x2>(s), a);
748  std::get<0x3>(s) = _mm512_xor_si512(std::get<0x3>(s), a);
749  std::get<0x4>(s) = _mm512_xor_si512(std::get<0x4>(s), a);
750  std::get<0x5>(s) = _mm512_xor_si512(std::get<0x5>(s), a);
751  std::get<0x6>(s) = _mm512_xor_si512(std::get<0x6>(s), a);
752  std::get<0x7>(s) = _mm512_xor_si512(std::get<0x7>(s), a);
753  std::get<0x8>(s) = _mm512_xor_si512(std::get<0x8>(s), a);
754  std::get<0x9>(s) = _mm512_xor_si512(std::get<0x9>(s), a);
755  std::get<0xA>(s) = _mm512_xor_si512(std::get<0xA>(s), a);
756  std::get<0xB>(s) = _mm512_xor_si512(std::get<0xB>(s), a);
757  std::get<0xC>(s) = _mm512_xor_si512(std::get<0xC>(s), a);
758  std::get<0xD>(s) = _mm512_xor_si512(std::get<0xD>(s), a);
759  std::get<0xE>(s) = _mm512_xor_si512(std::get<0xE>(s), a);
760  std::get<0xF>(s) = _mm512_xor_si512(std::get<0xF>(s), a);
761 }
762 
763 MCKL_INLINE inline void add_epi32(
764  std::array<__m512i, 16> &s, const std::array<__m512i, 16> &a)
765 {
766  std::get<0x0>(s) = _mm512_add_epi32(std::get<0x0>(s), std::get<0x0>(a));
767  std::get<0x1>(s) = _mm512_add_epi32(std::get<0x1>(s), std::get<0x1>(a));
768  std::get<0x2>(s) = _mm512_add_epi32(std::get<0x2>(s), std::get<0x2>(a));
769  std::get<0x3>(s) = _mm512_add_epi32(std::get<0x3>(s), std::get<0x3>(a));
770  std::get<0x4>(s) = _mm512_add_epi32(std::get<0x4>(s), std::get<0x4>(a));
771  std::get<0x5>(s) = _mm512_add_epi32(std::get<0x5>(s), std::get<0x5>(a));
772  std::get<0x6>(s) = _mm512_add_epi32(std::get<0x6>(s), std::get<0x6>(a));
773  std::get<0x7>(s) = _mm512_add_epi32(std::get<0x7>(s), std::get<0x7>(a));
774  std::get<0x8>(s) = _mm512_add_epi32(std::get<0x8>(s), std::get<0x8>(a));
775  std::get<0x9>(s) = _mm512_add_epi32(std::get<0x9>(s), std::get<0x9>(a));
776  std::get<0xA>(s) = _mm512_add_epi32(std::get<0xA>(s), std::get<0xA>(a));
777  std::get<0xB>(s) = _mm512_add_epi32(std::get<0xB>(s), std::get<0xB>(a));
778  std::get<0xC>(s) = _mm512_add_epi32(std::get<0xC>(s), std::get<0xC>(a));
779  std::get<0xD>(s) = _mm512_add_epi32(std::get<0xD>(s), std::get<0xD>(a));
780  std::get<0xE>(s) = _mm512_add_epi32(std::get<0xE>(s), std::get<0xE>(a));
781  std::get<0xF>(s) = _mm512_add_epi32(std::get<0xF>(s), std::get<0xF>(a));
782 }
783 
784 MCKL_INLINE inline void add_epi64(
785  std::array<__m512i, 16> &s, const std::array<__m512i, 16> &a)
786 {
787  std::get<0x0>(s) = _mm512_add_epi64(std::get<0x0>(s), std::get<0x0>(a));
788  std::get<0x1>(s) = _mm512_add_epi64(std::get<0x1>(s), std::get<0x1>(a));
789  std::get<0x2>(s) = _mm512_add_epi64(std::get<0x2>(s), std::get<0x2>(a));
790  std::get<0x3>(s) = _mm512_add_epi64(std::get<0x3>(s), std::get<0x3>(a));
791  std::get<0x4>(s) = _mm512_add_epi64(std::get<0x4>(s), std::get<0x4>(a));
792  std::get<0x5>(s) = _mm512_add_epi64(std::get<0x5>(s), std::get<0x5>(a));
793  std::get<0x6>(s) = _mm512_add_epi64(std::get<0x6>(s), std::get<0x6>(a));
794  std::get<0x7>(s) = _mm512_add_epi64(std::get<0x7>(s), std::get<0x7>(a));
795  std::get<0x8>(s) = _mm512_add_epi64(std::get<0x8>(s), std::get<0x8>(a));
796  std::get<0x9>(s) = _mm512_add_epi64(std::get<0x9>(s), std::get<0x9>(a));
797  std::get<0xA>(s) = _mm512_add_epi64(std::get<0xA>(s), std::get<0xA>(a));
798  std::get<0xB>(s) = _mm512_add_epi64(std::get<0xB>(s), std::get<0xB>(a));
799  std::get<0xC>(s) = _mm512_add_epi64(std::get<0xC>(s), std::get<0xC>(a));
800  std::get<0xD>(s) = _mm512_add_epi64(std::get<0xD>(s), std::get<0xD>(a));
801  std::get<0xE>(s) = _mm512_add_epi64(std::get<0xE>(s), std::get<0xE>(a));
802  std::get<0xF>(s) = _mm512_add_epi64(std::get<0xF>(s), std::get<0xF>(a));
803 }
804 
805 MCKL_INLINE inline void add_epi64(std::array<__m512i, 16> &s, const __m512i &a)
806 {
807  std::get<0x0>(s) = _mm512_add_epi64(std::get<0x0>(s), a);
808  std::get<0x1>(s) = _mm512_add_epi64(std::get<0x1>(s), a);
809  std::get<0x2>(s) = _mm512_add_epi64(std::get<0x2>(s), a);
810  std::get<0x3>(s) = _mm512_add_epi64(std::get<0x3>(s), a);
811  std::get<0x4>(s) = _mm512_add_epi64(std::get<0x4>(s), a);
812  std::get<0x5>(s) = _mm512_add_epi64(std::get<0x5>(s), a);
813  std::get<0x6>(s) = _mm512_add_epi64(std::get<0x6>(s), a);
814  std::get<0x7>(s) = _mm512_add_epi64(std::get<0x7>(s), a);
815  std::get<0x8>(s) = _mm512_add_epi64(std::get<0x8>(s), a);
816  std::get<0x9>(s) = _mm512_add_epi64(std::get<0x9>(s), a);
817  std::get<0xA>(s) = _mm512_add_epi64(std::get<0xA>(s), a);
818  std::get<0xB>(s) = _mm512_add_epi64(std::get<0xB>(s), a);
819  std::get<0xC>(s) = _mm512_add_epi64(std::get<0xC>(s), a);
820  std::get<0xD>(s) = _mm512_add_epi64(std::get<0xD>(s), a);
821  std::get<0xE>(s) = _mm512_add_epi64(std::get<0xE>(s), a);
822  std::get<0xF>(s) = _mm512_add_epi64(std::get<0xF>(s), a);
823 }
824 
825 MCKL_INLINE inline void mul_epu32(const std::array<__m512i, 16> &s,
826  const __m512i &a, std::array<__m512i, 16> &t)
827 {
828  std::get<0x0>(t) = _mm512_mul_epu32(std::get<0x0>(s), a);
829  std::get<0x1>(t) = _mm512_mul_epu32(std::get<0x1>(s), a);
830  std::get<0x2>(t) = _mm512_mul_epu32(std::get<0x2>(s), a);
831  std::get<0x3>(t) = _mm512_mul_epu32(std::get<0x3>(s), a);
832  std::get<0x4>(t) = _mm512_mul_epu32(std::get<0x4>(s), a);
833  std::get<0x5>(t) = _mm512_mul_epu32(std::get<0x5>(s), a);
834  std::get<0x6>(t) = _mm512_mul_epu32(std::get<0x6>(s), a);
835  std::get<0x7>(t) = _mm512_mul_epu32(std::get<0x7>(s), a);
836  std::get<0x8>(t) = _mm512_mul_epu32(std::get<0x8>(s), a);
837  std::get<0x9>(t) = _mm512_mul_epu32(std::get<0x9>(s), a);
838  std::get<0xA>(t) = _mm512_mul_epu32(std::get<0xA>(s), a);
839  std::get<0xB>(t) = _mm512_mul_epu32(std::get<0xB>(s), a);
840  std::get<0xC>(t) = _mm512_mul_epu32(std::get<0xC>(s), a);
841  std::get<0xD>(t) = _mm512_mul_epu32(std::get<0xD>(s), a);
842  std::get<0xE>(t) = _mm512_mul_epu32(std::get<0xE>(s), a);
843  std::get<0xF>(t) = _mm512_mul_epu32(std::get<0xF>(s), a);
844 }
845 
846 MCKL_INLINE inline void add_ps(std::array<__m512i, 16> &s, const __m512i &a)
847 {
848  std::get<0x0>(s) = _mm512_castps_si512(_mm512_add_ps(
849  _mm512_castsi512_ps(std::get<0x0>(s)), _mm512_castsi512_ps(a)));
850  std::get<0x1>(s) = _mm512_castps_si512(_mm512_add_ps(
851  _mm512_castsi512_ps(std::get<0x1>(s)), _mm512_castsi512_ps(a)));
852  std::get<0x2>(s) = _mm512_castps_si512(_mm512_add_ps(
853  _mm512_castsi512_ps(std::get<0x2>(s)), _mm512_castsi512_ps(a)));
854  std::get<0x3>(s) = _mm512_castps_si512(_mm512_add_ps(
855  _mm512_castsi512_ps(std::get<0x3>(s)), _mm512_castsi512_ps(a)));
856  std::get<0x4>(s) = _mm512_castps_si512(_mm512_add_ps(
857  _mm512_castsi512_ps(std::get<0x4>(s)), _mm512_castsi512_ps(a)));
858  std::get<0x5>(s) = _mm512_castps_si512(_mm512_add_ps(
859  _mm512_castsi512_ps(std::get<0x5>(s)), _mm512_castsi512_ps(a)));
860  std::get<0x6>(s) = _mm512_castps_si512(_mm512_add_ps(
861  _mm512_castsi512_ps(std::get<0x6>(s)), _mm512_castsi512_ps(a)));
862  std::get<0x7>(s) = _mm512_castps_si512(_mm512_add_ps(
863  _mm512_castsi512_ps(std::get<0x7>(s)), _mm512_castsi512_ps(a)));
864  std::get<0x8>(s) = _mm512_castps_si512(_mm512_add_ps(
865  _mm512_castsi512_ps(std::get<0x8>(s)), _mm512_castsi512_ps(a)));
866  std::get<0x9>(s) = _mm512_castps_si512(_mm512_add_ps(
867  _mm512_castsi512_ps(std::get<0x9>(s)), _mm512_castsi512_ps(a)));
868  std::get<0xA>(s) = _mm512_castps_si512(_mm512_add_ps(
869  _mm512_castsi512_ps(std::get<0xA>(s)), _mm512_castsi512_ps(a)));
870  std::get<0xB>(s) = _mm512_castps_si512(_mm512_add_ps(
871  _mm512_castsi512_ps(std::get<0xB>(s)), _mm512_castsi512_ps(a)));
872  std::get<0xC>(s) = _mm512_castps_si512(_mm512_add_ps(
873  _mm512_castsi512_ps(std::get<0xC>(s)), _mm512_castsi512_ps(a)));
874  std::get<0xD>(s) = _mm512_castps_si512(_mm512_add_ps(
875  _mm512_castsi512_ps(std::get<0xD>(s)), _mm512_castsi512_ps(a)));
876  std::get<0xE>(s) = _mm512_castps_si512(_mm512_add_ps(
877  _mm512_castsi512_ps(std::get<0xE>(s)), _mm512_castsi512_ps(a)));
878  std::get<0xF>(s) = _mm512_castps_si512(_mm512_add_ps(
879  _mm512_castsi512_ps(std::get<0xF>(s)), _mm512_castsi512_ps(a)));
880 }
881 
882 MCKL_INLINE inline void mul_ps(std::array<__m512i, 16> &s, const __m512i &a)
883 {
884  std::get<0x0>(s) = _mm512_castps_si512(_mm512_mul_ps(
885  _mm512_castsi512_ps(std::get<0x0>(s)), _mm512_castsi512_ps(a)));
886  std::get<0x1>(s) = _mm512_castps_si512(_mm512_mul_ps(
887  _mm512_castsi512_ps(std::get<0x1>(s)), _mm512_castsi512_ps(a)));
888  std::get<0x2>(s) = _mm512_castps_si512(_mm512_mul_ps(
889  _mm512_castsi512_ps(std::get<0x2>(s)), _mm512_castsi512_ps(a)));
890  std::get<0x3>(s) = _mm512_castps_si512(_mm512_mul_ps(
891  _mm512_castsi512_ps(std::get<0x3>(s)), _mm512_castsi512_ps(a)));
892  std::get<0x4>(s) = _mm512_castps_si512(_mm512_mul_ps(
893  _mm512_castsi512_ps(std::get<0x4>(s)), _mm512_castsi512_ps(a)));
894  std::get<0x5>(s) = _mm512_castps_si512(_mm512_mul_ps(
895  _mm512_castsi512_ps(std::get<0x5>(s)), _mm512_castsi512_ps(a)));
896  std::get<0x6>(s) = _mm512_castps_si512(_mm512_mul_ps(
897  _mm512_castsi512_ps(std::get<0x6>(s)), _mm512_castsi512_ps(a)));
898  std::get<0x7>(s) = _mm512_castps_si512(_mm512_mul_ps(
899  _mm512_castsi512_ps(std::get<0x7>(s)), _mm512_castsi512_ps(a)));
900  std::get<0x8>(s) = _mm512_castps_si512(_mm512_mul_ps(
901  _mm512_castsi512_ps(std::get<0x8>(s)), _mm512_castsi512_ps(a)));
902  std::get<0x9>(s) = _mm512_castps_si512(_mm512_mul_ps(
903  _mm512_castsi512_ps(std::get<0x9>(s)), _mm512_castsi512_ps(a)));
904  std::get<0xA>(s) = _mm512_castps_si512(_mm512_mul_ps(
905  _mm512_castsi512_ps(std::get<0xA>(s)), _mm512_castsi512_ps(a)));
906  std::get<0xB>(s) = _mm512_castps_si512(_mm512_mul_ps(
907  _mm512_castsi512_ps(std::get<0xB>(s)), _mm512_castsi512_ps(a)));
908  std::get<0xC>(s) = _mm512_castps_si512(_mm512_mul_ps(
909  _mm512_castsi512_ps(std::get<0xC>(s)), _mm512_castsi512_ps(a)));
910  std::get<0xD>(s) = _mm512_castps_si512(_mm512_mul_ps(
911  _mm512_castsi512_ps(std::get<0xD>(s)), _mm512_castsi512_ps(a)));
912  std::get<0xE>(s) = _mm512_castps_si512(_mm512_mul_ps(
913  _mm512_castsi512_ps(std::get<0xE>(s)), _mm512_castsi512_ps(a)));
914  std::get<0xF>(s) = _mm512_castps_si512(_mm512_mul_ps(
915  _mm512_castsi512_ps(std::get<0xF>(s)), _mm512_castsi512_ps(a)));
916 }
917 
918 MCKL_INLINE inline void add_pd(std::array<__m512i, 16> &s, const __m512i &a)
919 {
920  std::get<0x0>(s) = _mm512_castpd_si512(_mm512_add_pd(
921  _mm512_castsi512_pd(std::get<0x0>(s)), _mm512_castsi512_pd(a)));
922  std::get<0x1>(s) = _mm512_castpd_si512(_mm512_add_pd(
923  _mm512_castsi512_pd(std::get<0x1>(s)), _mm512_castsi512_pd(a)));
924  std::get<0x2>(s) = _mm512_castpd_si512(_mm512_add_pd(
925  _mm512_castsi512_pd(std::get<0x2>(s)), _mm512_castsi512_pd(a)));
926  std::get<0x3>(s) = _mm512_castpd_si512(_mm512_add_pd(
927  _mm512_castsi512_pd(std::get<0x3>(s)), _mm512_castsi512_pd(a)));
928  std::get<0x4>(s) = _mm512_castpd_si512(_mm512_add_pd(
929  _mm512_castsi512_pd(std::get<0x4>(s)), _mm512_castsi512_pd(a)));
930  std::get<0x5>(s) = _mm512_castpd_si512(_mm512_add_pd(
931  _mm512_castsi512_pd(std::get<0x5>(s)), _mm512_castsi512_pd(a)));
932  std::get<0x6>(s) = _mm512_castpd_si512(_mm512_add_pd(
933  _mm512_castsi512_pd(std::get<0x6>(s)), _mm512_castsi512_pd(a)));
934  std::get<0x7>(s) = _mm512_castpd_si512(_mm512_add_pd(
935  _mm512_castsi512_pd(std::get<0x7>(s)), _mm512_castsi512_pd(a)));
936  std::get<0x8>(s) = _mm512_castpd_si512(_mm512_add_pd(
937  _mm512_castsi512_pd(std::get<0x8>(s)), _mm512_castsi512_pd(a)));
938  std::get<0x9>(s) = _mm512_castpd_si512(_mm512_add_pd(
939  _mm512_castsi512_pd(std::get<0x9>(s)), _mm512_castsi512_pd(a)));
940  std::get<0xA>(s) = _mm512_castpd_si512(_mm512_add_pd(
941  _mm512_castsi512_pd(std::get<0xA>(s)), _mm512_castsi512_pd(a)));
942  std::get<0xB>(s) = _mm512_castpd_si512(_mm512_add_pd(
943  _mm512_castsi512_pd(std::get<0xB>(s)), _mm512_castsi512_pd(a)));
944  std::get<0xC>(s) = _mm512_castpd_si512(_mm512_add_pd(
945  _mm512_castsi512_pd(std::get<0xC>(s)), _mm512_castsi512_pd(a)));
946  std::get<0xD>(s) = _mm512_castpd_si512(_mm512_add_pd(
947  _mm512_castsi512_pd(std::get<0xD>(s)), _mm512_castsi512_pd(a)));
948  std::get<0xE>(s) = _mm512_castpd_si512(_mm512_add_pd(
949  _mm512_castsi512_pd(std::get<0xE>(s)), _mm512_castsi512_pd(a)));
950  std::get<0xF>(s) = _mm512_castpd_si512(_mm512_add_pd(
951  _mm512_castsi512_pd(std::get<0xF>(s)), _mm512_castsi512_pd(a)));
952 }
953 
954 MCKL_INLINE inline void add_pd(
955  std::array<__m512i, 16> &s, const std::array<__m512i, 16> &a)
956 {
957  std::get<0x0>(s) = _mm512_castpd_si512(
958  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x0>(s)),
959  _mm512_castsi512_pd(std::get<0x0>(a))));
960  std::get<0x1>(s) = _mm512_castpd_si512(
961  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x1>(s)),
962  _mm512_castsi512_pd(std::get<0x1>(a))));
963  std::get<0x2>(s) = _mm512_castpd_si512(
964  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x2>(s)),
965  _mm512_castsi512_pd(std::get<0x2>(a))));
966  std::get<0x3>(s) = _mm512_castpd_si512(
967  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x3>(s)),
968  _mm512_castsi512_pd(std::get<0x3>(a))));
969  std::get<0x4>(s) = _mm512_castpd_si512(
970  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x4>(s)),
971  _mm512_castsi512_pd(std::get<0x4>(a))));
972  std::get<0x5>(s) = _mm512_castpd_si512(
973  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x5>(s)),
974  _mm512_castsi512_pd(std::get<0x5>(a))));
975  std::get<0x6>(s) = _mm512_castpd_si512(
976  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x6>(s)),
977  _mm512_castsi512_pd(std::get<0x6>(a))));
978  std::get<0x7>(s) = _mm512_castpd_si512(
979  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x7>(s)),
980  _mm512_castsi512_pd(std::get<0x7>(a))));
981  std::get<0x8>(s) = _mm512_castpd_si512(
982  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x8>(s)),
983  _mm512_castsi512_pd(std::get<0x8>(a))));
984  std::get<0x9>(s) = _mm512_castpd_si512(
985  _mm512_add_pd(_mm512_castsi512_pd(std::get<0x9>(s)),
986  _mm512_castsi512_pd(std::get<0x9>(a))));
987  std::get<0xA>(s) = _mm512_castpd_si512(
988  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xA>(s)),
989  _mm512_castsi512_pd(std::get<0xA>(a))));
990  std::get<0xB>(s) = _mm512_castpd_si512(
991  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xB>(s)),
992  _mm512_castsi512_pd(std::get<0xB>(a))));
993  std::get<0xC>(s) = _mm512_castpd_si512(
994  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xC>(s)),
995  _mm512_castsi512_pd(std::get<0xC>(a))));
996  std::get<0xD>(s) = _mm512_castpd_si512(
997  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xD>(s)),
998  _mm512_castsi512_pd(std::get<0xD>(a))));
999  std::get<0xE>(s) = _mm512_castpd_si512(
1000  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xE>(s)),
1001  _mm512_castsi512_pd(std::get<0xE>(a))));
1002  std::get<0xF>(s) = _mm512_castpd_si512(
1003  _mm512_add_pd(_mm512_castsi512_pd(std::get<0xF>(s)),
1004  _mm512_castsi512_pd(std::get<0xF>(a))));
1005 }
1006 
1007 MCKL_INLINE inline void sub_pd(std::array<__m512i, 16> &s, const __m512i &a)
1008 {
1009  std::get<0x0>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1010  _mm512_castsi512_pd(std::get<0x0>(s)), _mm512_castsi512_pd(a)));
1011  std::get<0x1>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1012  _mm512_castsi512_pd(std::get<0x1>(s)), _mm512_castsi512_pd(a)));
1013  std::get<0x2>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1014  _mm512_castsi512_pd(std::get<0x2>(s)), _mm512_castsi512_pd(a)));
1015  std::get<0x3>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1016  _mm512_castsi512_pd(std::get<0x3>(s)), _mm512_castsi512_pd(a)));
1017  std::get<0x4>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1018  _mm512_castsi512_pd(std::get<0x4>(s)), _mm512_castsi512_pd(a)));
1019  std::get<0x5>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1020  _mm512_castsi512_pd(std::get<0x5>(s)), _mm512_castsi512_pd(a)));
1021  std::get<0x6>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1022  _mm512_castsi512_pd(std::get<0x6>(s)), _mm512_castsi512_pd(a)));
1023  std::get<0x7>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1024  _mm512_castsi512_pd(std::get<0x7>(s)), _mm512_castsi512_pd(a)));
1025  std::get<0x8>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1026  _mm512_castsi512_pd(std::get<0x8>(s)), _mm512_castsi512_pd(a)));
1027  std::get<0x9>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1028  _mm512_castsi512_pd(std::get<0x9>(s)), _mm512_castsi512_pd(a)));
1029  std::get<0xA>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1030  _mm512_castsi512_pd(std::get<0xA>(s)), _mm512_castsi512_pd(a)));
1031  std::get<0xB>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1032  _mm512_castsi512_pd(std::get<0xB>(s)), _mm512_castsi512_pd(a)));
1033  std::get<0xC>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1034  _mm512_castsi512_pd(std::get<0xC>(s)), _mm512_castsi512_pd(a)));
1035  std::get<0xD>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1036  _mm512_castsi512_pd(std::get<0xD>(s)), _mm512_castsi512_pd(a)));
1037  std::get<0xE>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1038  _mm512_castsi512_pd(std::get<0xE>(s)), _mm512_castsi512_pd(a)));
1039  std::get<0xF>(s) = _mm512_castpd_si512(_mm512_sub_pd(
1040  _mm512_castsi512_pd(std::get<0xF>(s)), _mm512_castsi512_pd(a)));
1041 }
1042 
1043 MCKL_INLINE inline void mul_pd(std::array<__m512i, 16> &s, const __m512i &a)
1044 {
1045  std::get<0x0>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1046  _mm512_castsi512_pd(std::get<0x0>(s)), _mm512_castsi512_pd(a)));
1047  std::get<0x1>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1048  _mm512_castsi512_pd(std::get<0x1>(s)), _mm512_castsi512_pd(a)));
1049  std::get<0x2>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1050  _mm512_castsi512_pd(std::get<0x2>(s)), _mm512_castsi512_pd(a)));
1051  std::get<0x3>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1052  _mm512_castsi512_pd(std::get<0x3>(s)), _mm512_castsi512_pd(a)));
1053  std::get<0x4>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1054  _mm512_castsi512_pd(std::get<0x4>(s)), _mm512_castsi512_pd(a)));
1055  std::get<0x5>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1056  _mm512_castsi512_pd(std::get<0x5>(s)), _mm512_castsi512_pd(a)));
1057  std::get<0x6>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1058  _mm512_castsi512_pd(std::get<0x6>(s)), _mm512_castsi512_pd(a)));
1059  std::get<0x7>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1060  _mm512_castsi512_pd(std::get<0x7>(s)), _mm512_castsi512_pd(a)));
1061  std::get<0x8>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1062  _mm512_castsi512_pd(std::get<0x8>(s)), _mm512_castsi512_pd(a)));
1063  std::get<0x9>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1064  _mm512_castsi512_pd(std::get<0x9>(s)), _mm512_castsi512_pd(a)));
1065  std::get<0xA>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1066  _mm512_castsi512_pd(std::get<0xA>(s)), _mm512_castsi512_pd(a)));
1067  std::get<0xB>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1068  _mm512_castsi512_pd(std::get<0xB>(s)), _mm512_castsi512_pd(a)));
1069  std::get<0xC>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1070  _mm512_castsi512_pd(std::get<0xC>(s)), _mm512_castsi512_pd(a)));
1071  std::get<0xD>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1072  _mm512_castsi512_pd(std::get<0xD>(s)), _mm512_castsi512_pd(a)));
1073  std::get<0xE>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1074  _mm512_castsi512_pd(std::get<0xE>(s)), _mm512_castsi512_pd(a)));
1075  std::get<0xF>(s) = _mm512_castpd_si512(_mm512_mul_pd(
1076  _mm512_castsi512_pd(std::get<0xF>(s)), _mm512_castsi512_pd(a)));
1077 }
1078 
1079 MCKL_INLINE inline void mul_pd(
1080  std::array<__m512i, 16> &s, const std::array<__m512i, 16> &a)
1081 {
1082  std::get<0x0>(s) = _mm512_castpd_si512(
1083  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x0>(s)),
1084  _mm512_castsi512_pd(std::get<0x0>(a))));
1085  std::get<0x1>(s) = _mm512_castpd_si512(
1086  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x1>(s)),
1087  _mm512_castsi512_pd(std::get<0x1>(a))));
1088  std::get<0x2>(s) = _mm512_castpd_si512(
1089  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x2>(s)),
1090  _mm512_castsi512_pd(std::get<0x2>(a))));
1091  std::get<0x3>(s) = _mm512_castpd_si512(
1092  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x3>(s)),
1093  _mm512_castsi512_pd(std::get<0x3>(a))));
1094  std::get<0x4>(s) = _mm512_castpd_si512(
1095  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x4>(s)),
1096  _mm512_castsi512_pd(std::get<0x4>(a))));
1097  std::get<0x5>(s) = _mm512_castpd_si512(
1098  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x5>(s)),
1099  _mm512_castsi512_pd(std::get<0x5>(a))));
1100  std::get<0x6>(s) = _mm512_castpd_si512(
1101  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x6>(s)),
1102  _mm512_castsi512_pd(std::get<0x6>(a))));
1103  std::get<0x7>(s) = _mm512_castpd_si512(
1104  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x7>(s)),
1105  _mm512_castsi512_pd(std::get<0x7>(a))));
1106  std::get<0x8>(s) = _mm512_castpd_si512(
1107  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x8>(s)),
1108  _mm512_castsi512_pd(std::get<0x8>(a))));
1109  std::get<0x9>(s) = _mm512_castpd_si512(
1110  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0x9>(s)),
1111  _mm512_castsi512_pd(std::get<0x9>(a))));
1112  std::get<0xA>(s) = _mm512_castpd_si512(
1113  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xA>(s)),
1114  _mm512_castsi512_pd(std::get<0xA>(a))));
1115  std::get<0xB>(s) = _mm512_castpd_si512(
1116  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xB>(s)),
1117  _mm512_castsi512_pd(std::get<0xB>(a))));
1118  std::get<0xC>(s) = _mm512_castpd_si512(
1119  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xC>(s)),
1120  _mm512_castsi512_pd(std::get<0xC>(a))));
1121  std::get<0xD>(s) = _mm512_castpd_si512(
1122  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xD>(s)),
1123  _mm512_castsi512_pd(std::get<0xD>(a))));
1124  std::get<0xE>(s) = _mm512_castpd_si512(
1125  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xE>(s)),
1126  _mm512_castsi512_pd(std::get<0xE>(a))));
1127  std::get<0xF>(s) = _mm512_castpd_si512(
1128  _mm512_mul_pd(_mm512_castsi512_pd(std::get<0xF>(s)),
1129  _mm512_castsi512_pd(std::get<0xF>(a))));
1130 }
1131 
1132 } // namespace internal
1133 
1134 } // namespace mckl
1135 
1137 
1138 #endif // MCKL_INTERNAL_AVX512_OP_HPP
#define MCKL_PUSH_GCC_WARNING(warning)
Definition: compiler.h:78
Definition: mcmc.hpp:40
#define MCKL_INLINE
Definition: clang.h:147
#define MCKL_POP_GCC_WARNING
Definition: compiler.h:79