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