32 #ifndef MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_8_HPP 33 #define MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_8_HPP 46 static constexpr std::size_t K_ = 1;
49 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
52 _mm512_set1_epi64(static_cast<MCKL_INT64>(std::get<0>(ctr)));
54 std::get<0x0>(s) = _mm512_add_epi64(c,
55 _mm512_set_epi64(0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01));
56 std::get<0x1>(s) = _mm512_add_epi64(c,
57 _mm512_set_epi64(0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09));
58 std::get<0x2>(s) = _mm512_add_epi64(c,
59 _mm512_set_epi64(0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11));
60 std::get<0x3>(s) = _mm512_add_epi64(c,
61 _mm512_set_epi64(0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19));
63 __m512i d = _mm512_set1_epi64(0x20);
64 std::get<0x4>(s) = _mm512_add_epi64(std::get<0x0>(s), d);
65 std::get<0x5>(s) = _mm512_add_epi64(std::get<0x1>(s), d);
66 std::get<0x6>(s) = _mm512_add_epi64(std::get<0x2>(s), d);
67 std::get<0x7>(s) = _mm512_add_epi64(std::get<0x3>(s), d);
74 static constexpr std::size_t K_ = 2;
77 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
79 __m512i c = _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<1>(ctr)),
80 static_cast<MCKL_INT64>(std::get<0>(ctr)),
81 static_cast<MCKL_INT64>(std::get<1>(ctr)),
82 static_cast<MCKL_INT64>(std::get<0>(ctr)),
83 static_cast<MCKL_INT64>(std::get<1>(ctr)),
84 static_cast<MCKL_INT64>(std::get<0>(ctr)),
85 static_cast<MCKL_INT64>(std::get<1>(ctr)),
86 static_cast<MCKL_INT64>(std::get<0>(ctr)));
88 std::get<0x0>(s) = _mm512_add_epi64(
89 c, _mm512_set_epi64(0, 0x04, 0, 0x03, 0, 0x02, 0, 0x01));
90 std::get<0x1>(s) = _mm512_add_epi64(
91 c, _mm512_set_epi64(0, 0x08, 0, 0x07, 0, 0x06, 0, 0x05));
92 std::get<0x2>(s) = _mm512_add_epi64(
93 c, _mm512_set_epi64(0, 0x0C, 0, 0x0B, 0, 0x0A, 0, 0x09));
94 std::get<0x3>(s) = _mm512_add_epi64(
95 c, _mm512_set_epi64(0, 0x10, 0, 0x0F, 0, 0x0E, 0, 0x0D));
97 __m512i d = _mm512_set_epi64(0, 0x10, 0, 0x10, 0, 0x10, 0, 0x10);
98 std::get<0x4>(s) = _mm512_add_epi64(std::get<0x0>(s), d);
99 std::get<0x5>(s) = _mm512_add_epi64(std::get<0x1>(s), d);
100 std::get<0x6>(s) = _mm512_add_epi64(std::get<0x2>(s), d);
101 std::get<0x7>(s) = _mm512_add_epi64(std::get<0x3>(s), d);
105 template <
typename T>
108 static constexpr std::size_t K_ = 4;
111 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
113 __m512i c = _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<3>(ctr)),
114 static_cast<MCKL_INT64>(std::get<2>(ctr)),
115 static_cast<MCKL_INT64>(std::get<1>(ctr)),
116 static_cast<MCKL_INT64>(std::get<0>(ctr)),
117 static_cast<MCKL_INT64>(std::get<3>(ctr)),
118 static_cast<MCKL_INT64>(std::get<2>(ctr)),
119 static_cast<MCKL_INT64>(std::get<1>(ctr)),
120 static_cast<MCKL_INT64>(std::get<0>(ctr)));
122 std::get<0>(s) = _mm512_add_epi64(
123 c, _mm512_set_epi64(0, 0, 0, 0x02, 0, 0, 0, 0x01));
124 std::get<1>(s) = _mm512_add_epi64(
125 c, _mm512_set_epi64(0, 0, 0, 0x04, 0, 0, 0, 0x03));
126 std::get<2>(s) = _mm512_add_epi64(
127 c, _mm512_set_epi64(0, 0, 0, 0x06, 0, 0, 0, 0x05));
128 std::get<3>(s) = _mm512_add_epi64(
129 c, _mm512_set_epi64(0, 0, 0, 0x08, 0, 0, 0, 0x07));
130 std::get<4>(s) = _mm512_add_epi64(
131 c, _mm512_set_epi64(0, 0, 0, 0x0A, 0, 0, 0, 0x09));
132 std::get<5>(s) = _mm512_add_epi64(
133 c, _mm512_set_epi64(0, 0, 0, 0x0C, 0, 0, 0, 0x0B));
134 std::get<6>(s) = _mm512_add_epi64(
135 c, _mm512_set_epi64(0, 0, 0, 0x0E, 0, 0, 0, 0x0D));
136 std::get<7>(s) = _mm512_add_epi64(
137 c, _mm512_set_epi64(0, 0, 0, 0x10, 0, 0, 0, 0x0F));
141 template <
typename T>
144 static constexpr std::size_t K_ = 8;
147 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
149 __m512i c = _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<7>(ctr)),
150 static_cast<MCKL_INT64>(std::get<6>(ctr)),
151 static_cast<MCKL_INT64>(std::get<5>(ctr)),
152 static_cast<MCKL_INT64>(std::get<4>(ctr)),
153 static_cast<MCKL_INT64>(std::get<3>(ctr)),
154 static_cast<MCKL_INT64>(std::get<2>(ctr)),
155 static_cast<MCKL_INT64>(std::get<1>(ctr)),
156 static_cast<MCKL_INT64>(std::get<0>(ctr)));
159 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 1));
161 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 2));
163 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 3));
165 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 4));
167 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 5));
169 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 6));
171 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 7));
173 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 8));
177 template <
typename T>
180 static constexpr std::size_t K_ = 16;
183 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
186 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0x7>(ctr)),
187 static_cast<MCKL_INT64>(std::get<0x6>(ctr)),
188 static_cast<MCKL_INT64>(std::get<0x5>(ctr)),
189 static_cast<MCKL_INT64>(std::get<0x4>(ctr)),
190 static_cast<MCKL_INT64>(std::get<0x3>(ctr)),
191 static_cast<MCKL_INT64>(std::get<0x2>(ctr)),
192 static_cast<MCKL_INT64>(std::get<0x1>(ctr)),
193 static_cast<MCKL_INT64>(std::get<0x0>(ctr)));
196 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 1));
198 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0xF>(ctr)),
199 static_cast<MCKL_INT64>(std::get<0xE>(ctr)),
200 static_cast<MCKL_INT64>(std::get<0xD>(ctr)),
201 static_cast<MCKL_INT64>(std::get<0xC>(ctr)),
202 static_cast<MCKL_INT64>(std::get<0xB>(ctr)),
203 static_cast<MCKL_INT64>(std::get<0xA>(ctr)),
204 static_cast<MCKL_INT64>(std::get<0x9>(ctr)),
205 static_cast<MCKL_INT64>(std::get<0x8>(ctr)));
207 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 2));
208 std::get<3>(s) = std::get<1>(s);
210 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 3));
211 std::get<5>(s) = std::get<1>(s);
213 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 4));
214 std::get<7>(s) = std::get<1>(s);
218 template <
typename T>
221 static constexpr std::size_t K_ = 32;
224 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
227 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0x07>(ctr)),
228 static_cast<MCKL_INT64>(std::get<0x06>(ctr)),
229 static_cast<MCKL_INT64>(std::get<0x05>(ctr)),
230 static_cast<MCKL_INT64>(std::get<0x04>(ctr)),
231 static_cast<MCKL_INT64>(std::get<0x03>(ctr)),
232 static_cast<MCKL_INT64>(std::get<0x02>(ctr)),
233 static_cast<MCKL_INT64>(std::get<0x01>(ctr)),
234 static_cast<MCKL_INT64>(std::get<0x00>(ctr)));
237 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 1));
239 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0x0F>(ctr)),
240 static_cast<MCKL_INT64>(std::get<0x0E>(ctr)),
241 static_cast<MCKL_INT64>(std::get<0x0D>(ctr)),
242 static_cast<MCKL_INT64>(std::get<0x0C>(ctr)),
243 static_cast<MCKL_INT64>(std::get<0x0B>(ctr)),
244 static_cast<MCKL_INT64>(std::get<0x0A>(ctr)),
245 static_cast<MCKL_INT64>(std::get<0x09>(ctr)),
246 static_cast<MCKL_INT64>(std::get<0x08>(ctr)));
248 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0x17>(ctr)),
255 static_cast<MCKL_INT64>(std::get<0x10>(ctr)));
257 _mm512_set_epi64(static_cast<MCKL_INT64>(std::get<0x1F>(ctr)),
258 static_cast<MCKL_INT64>(std::get<0x1E>(ctr)),
259 static_cast<MCKL_INT64>(std::get<0x1D>(ctr)),
260 static_cast<MCKL_INT64>(std::get<0x1C>(ctr)),
261 static_cast<MCKL_INT64>(std::get<0x1B>(ctr)),
262 static_cast<MCKL_INT64>(std::get<0x1A>(ctr)),
263 static_cast<MCKL_INT64>(std::get<0x19>(ctr)),
264 static_cast<MCKL_INT64>(std::get<0x18>(ctr)));
266 _mm512_add_epi64(c, _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 2));
267 std::get<5>(s) = std::get<0x1>(s);
268 std::get<6>(s) = std::get<0x2>(s);
269 std::get<7>(s) = std::get<0x3>(s);
273 template <
typename T>
276 static constexpr std::size_t K_ = 64;
279 static void eval(
const std::array<T, K_> &ctr, std::array<__m512i, 8> &s)
281 std::memcpy(s.data(), ctr.data(), 512);
282 std::get<0>(s) = _mm512_add_epi64(
283 std::get<0>(s), _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 1));
293 #endif // MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_8_HPP static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
#define MCKL_PUSH_GCC_WARNING(warning)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m512i, 8 > &s)
#define MCKL_POP_GCC_WARNING