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