32 #ifndef MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_HPP 33 #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_HPP 43 #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_KBOX(N) \ 44 xmmt0 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 45 ThreefryKBox<T, K, N>::template key<0x0>(par))); \ 46 xmmt1 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 47 ThreefryKBox<T, K, N>::template key<0x1>(par))); \ 48 xmmt2 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 49 ThreefryKBox<T, K, N>::template key<0x2>(par))); \ 50 xmmt3 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 51 ThreefryKBox<T, K, N>::template key<0x3>(par))); \ 52 xmmt4 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 53 ThreefryKBox<T, K, N>::template key<0x4>(par))); \ 54 xmmt5 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 55 ThreefryKBox<T, K, N>::template key<0x5>(par))); \ 56 xmmt6 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 57 ThreefryKBox<T, K, N>::template key<0x6>(par))); \ 58 xmmt7 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 59 ThreefryKBox<T, K, N>::template key<0x7>(par))); \ 60 xmmt8 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 61 ThreefryKBox<T, K, N>::template key<0x8>(par))); \ 62 xmmt9 = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 63 ThreefryKBox<T, K, N>::template key<0x9>(par))); \ 64 xmmtA = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 65 ThreefryKBox<T, K, N>::template key<0xA>(par))); \ 66 xmmtB = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 67 ThreefryKBox<T, K, N>::template key<0xB>(par))); \ 68 xmmtC = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 69 ThreefryKBox<T, K, N>::template key<0xC>(par))); \ 70 xmmtD = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 71 ThreefryKBox<T, K, N>::template key<0xD>(par))); \ 72 xmmtE = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 73 ThreefryKBox<T, K, N>::template key<0xE>(par))); \ 74 xmmtF = _mm_set1_epi64x(static_cast<MCKL_INT64>( \ 75 ThreefryKBox<T, K, N>::template key<0xF>(par))); \ 76 xmms0 = _mm_add_epi64(xmms0, xmmt0); \ 77 xmms1 = _mm_add_epi64(xmms1, xmmt1); \ 78 xmms2 = _mm_add_epi64(xmms2, xmmt2); \ 79 xmms3 = _mm_add_epi64(xmms3, xmmt3); \ 80 xmms4 = _mm_add_epi64(xmms4, xmmt4); \ 81 xmms5 = _mm_add_epi64(xmms5, xmmt5); \ 82 xmms6 = _mm_add_epi64(xmms6, xmmt6); \ 83 xmms7 = _mm_add_epi64(xmms7, xmmt7); \ 84 xmms8 = _mm_add_epi64(xmms8, xmmt8); \ 85 xmms9 = _mm_add_epi64(xmms9, xmmt9); \ 86 xmmsA = _mm_add_epi64(xmmsA, xmmtA); \ 87 xmmsB = _mm_add_epi64(xmmsB, xmmtB); \ 88 xmmsC = _mm_add_epi64(xmmsC, xmmtC); \ 89 xmmsD = _mm_add_epi64(xmmsD, xmmtD); \ 90 xmmsE = _mm_add_epi64(xmmsE, xmmtE); \ 91 xmmsF = _mm_add_epi64(xmmsF, xmmtF); 93 #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N) \ 95 constexpr int L0 = Constants::rotate::value[0][(N - 1) % 8]; \ 96 constexpr int L1 = Constants::rotate::value[1][(N - 1) % 8]; \ 97 constexpr int L2 = Constants::rotate::value[2][(N - 1) % 8]; \ 98 constexpr int L3 = Constants::rotate::value[3][(N - 1) % 8]; \ 99 constexpr int L4 = Constants::rotate::value[4][(N - 1) % 8]; \ 100 constexpr int L5 = Constants::rotate::value[5][(N - 1) % 8]; \ 101 constexpr int L6 = Constants::rotate::value[6][(N - 1) % 8]; \ 102 constexpr int L7 = Constants::rotate::value[7][(N - 1) % 8]; \ 103 constexpr int R0 = 64 - L0; \ 104 constexpr int R1 = 64 - L1; \ 105 constexpr int R2 = 64 - L2; \ 106 constexpr int R3 = 64 - L3; \ 107 constexpr int R4 = 64 - L4; \ 108 constexpr int R5 = 64 - L5; \ 109 constexpr int R6 = 64 - L6; \ 110 constexpr int R7 = 64 - L7; \ 111 xmmt0 = _mm_add_epi64(xmms0, xmms1); \ 112 xmmt2 = _mm_add_epi64(xmms2, xmms3); \ 113 xmmt4 = _mm_add_epi64(xmms4, xmms5); \ 114 xmmt6 = _mm_add_epi64(xmms6, xmms7); \ 115 xmmt8 = _mm_add_epi64(xmms8, xmms9); \ 116 xmmtA = _mm_add_epi64(xmmsA, xmmsB); \ 117 xmmtC = _mm_add_epi64(xmmsC, xmmsD); \ 118 xmmtE = _mm_add_epi64(xmmsE, xmmsF); \ 119 xmmt1 = _mm_slli_epi64(xmms1, L0); \ 120 xmmt3 = _mm_slli_epi64(xmms3, L1); \ 121 xmmt5 = _mm_slli_epi64(xmms5, L2); \ 122 xmmt7 = _mm_slli_epi64(xmms7, L3); \ 123 xmmt9 = _mm_slli_epi64(xmms9, L4); \ 124 xmmtB = _mm_slli_epi64(xmmsB, L5); \ 125 xmmtD = _mm_slli_epi64(xmmsD, L6); \ 126 xmmtF = _mm_slli_epi64(xmmsF, L7); \ 127 xmms1 = _mm_srli_epi64(xmms1, R0); \ 128 xmms3 = _mm_srli_epi64(xmms3, R1); \ 129 xmms5 = _mm_srli_epi64(xmms5, R2); \ 130 xmms7 = _mm_srli_epi64(xmms7, R3); \ 131 xmms9 = _mm_srli_epi64(xmms9, R4); \ 132 xmmsB = _mm_srli_epi64(xmmsB, R5); \ 133 xmmsD = _mm_srli_epi64(xmmsD, R6); \ 134 xmmsF = _mm_srli_epi64(xmmsF, R7); \ 135 xmmt1 = _mm_or_si128(xmms1, xmmt1); \ 136 xmmt3 = _mm_or_si128(xmms3, xmmt3); \ 137 xmmt5 = _mm_or_si128(xmms5, xmmt5); \ 138 xmmt7 = _mm_or_si128(xmms7, xmmt7); \ 139 xmmt9 = _mm_or_si128(xmms9, xmmt9); \ 140 xmmtB = _mm_or_si128(xmmsB, xmmtB); \ 141 xmmtD = _mm_or_si128(xmmsD, xmmtD); \ 142 xmmtF = _mm_or_si128(xmmsF, xmmtF); \ 151 xmms1 = _mm_xor_si128(xmmt8, xmmt9); \ 152 xmms3 = _mm_xor_si128(xmmtC, xmmtD); \ 153 xmms5 = _mm_xor_si128(xmmtA, xmmtB); \ 154 xmms7 = _mm_xor_si128(xmmtE, xmmtF); \ 155 xmms9 = _mm_xor_si128(xmmt6, xmmt7); \ 156 xmmsB = _mm_xor_si128(xmmt2, xmmt3); \ 157 xmmsD = _mm_xor_si128(xmmt4, xmmt5); \ 158 xmmsF = _mm_xor_si128(xmmt0, xmmt1); \ 161 #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_CYCLE_4(N) \ 162 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 1); \ 163 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 2); \ 164 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 3); \ 165 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 4); \ 166 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_KBOX(N * 8 + 4); 168 #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_CYCLE_8(N) \ 169 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 1); \ 170 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 2); \ 171 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 3); \ 172 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 4); \ 173 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_KBOX(N * 8 + 4); \ 174 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 5); \ 175 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 6); \ 176 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 7); \ 177 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_RBOX(N * 8 + 8); \ 178 MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_KBOX(N * 8 + 8); 184 template <
typename T>
187 static_assert(std::numeric_limits<T>::digits == 64,
188 "**Threefry16x64GeneratorSSE2Impl** used with T other than a 64-bit " 189 "unsigned integers");
191 static constexpr std::size_t K = 16;
192 static constexpr std::size_t Rounds = 20;
197 const void *plain,
void *cipher,
const std::array<T, K + 4> &par)
202 template <
typename ResultType>
203 static void eval(std::array<std::uint64_t, 16> &ctr, ResultType *r,
204 const std::array<T, K + 4> &par)
209 template <
typename ResultType>
210 static void eval(std::array<std::uint64_t, 16> &ctr, std::size_t n,
211 ResultType *r,
const std::array<T, K + 4> &par)
213 constexpr std::size_t R =
sizeof(T) * K /
sizeof(ResultType);
215 const std::size_t n0 =
216 static_cast<std::size_t
>(std::min(static_cast<std::uint64_t>(n),
217 std::numeric_limits<std::uint64_t>::max() - ctr.front()));
219 eval_kernel(ctr, n0, r, par);
229 eval_kernel(ctr, n, r, par);
233 template <
typename ResultType>
234 static void eval_kernel(std::array<std::uint64_t, 16> &ctr, std::size_t n,
235 ResultType *r,
const std::array<T, K + 4> &par)
237 constexpr std::size_t
S = 16;
238 constexpr std::size_t N =
sizeof(__m128i) * S / (
sizeof(T) * K);
241 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x1>(ctr)),
242 static_cast<MCKL_INT64>(std::get<0x0>(ctr)));
244 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x3>(ctr)),
245 static_cast<MCKL_INT64>(std::get<0x2>(ctr)));
247 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x5>(ctr)),
248 static_cast<MCKL_INT64>(std::get<0x4>(ctr)));
250 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x7>(ctr)),
251 static_cast<MCKL_INT64>(std::get<0x6>(ctr)));
253 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x9>(ctr)),
254 static_cast<MCKL_INT64>(std::get<0x8>(ctr)));
256 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xB>(ctr)),
257 static_cast<MCKL_INT64>(std::get<0xA>(ctr)));
259 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xD>(ctr)),
260 static_cast<MCKL_INT64>(std::get<0xC>(ctr)));
262 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xF>(ctr)),
263 static_cast<MCKL_INT64>(std::get<0xE>(ctr)));
266 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
268 __m128i xmmt0 = _mm_add_epi64(xmmc0, _mm_set_epi64x(0, 1));
269 __m128i xmmt8 = _mm_add_epi64(xmmc0, _mm_set_epi64x(0, 2));
272 __m128i xmmt1 = xmmc1;
273 __m128i xmmt2 = xmmc2;
274 __m128i xmmt3 = xmmc3;
275 __m128i xmmt4 = xmmc4;
276 __m128i xmmt5 = xmmc5;
277 __m128i xmmt6 = xmmc6;
278 __m128i xmmt7 = xmmc7;
279 __m128i xmmt9 = xmmc1;
280 __m128i xmmtA = xmmc2;
281 __m128i xmmtB = xmmc3;
282 __m128i xmmtC = xmmc4;
283 __m128i xmmtD = xmmc5;
284 __m128i xmmtE = xmmc6;
285 __m128i xmmtF = xmmc7;
326 xmms0 = _mm_unpacklo_epi64(xmmt0, xmmt1);
327 xmms1 = _mm_unpackhi_epi64(xmmt0, xmmt1);
328 xmms2 = _mm_unpacklo_epi64(xmmt2, xmmt3);
329 xmms3 = _mm_unpackhi_epi64(xmmt2, xmmt3);
330 xmms4 = _mm_unpacklo_epi64(xmmt4, xmmt5);
331 xmms5 = _mm_unpackhi_epi64(xmmt4, xmmt5);
332 xmms6 = _mm_unpacklo_epi64(xmmt6, xmmt7);
333 xmms7 = _mm_unpackhi_epi64(xmmt6, xmmt7);
334 xmms8 = _mm_unpacklo_epi64(xmmt8, xmmt9);
335 xmms9 = _mm_unpackhi_epi64(xmmt8, xmmt9);
336 xmmsA = _mm_unpacklo_epi64(xmmtA, xmmtB);
337 xmmsB = _mm_unpackhi_epi64(xmmtA, xmmtB);
338 xmmsC = _mm_unpacklo_epi64(xmmtC, xmmtD);
339 xmmsD = _mm_unpackhi_epi64(xmmtC, xmmtD);
340 xmmsE = _mm_unpacklo_epi64(xmmtE, xmmtF);
341 xmmsF = _mm_unpackhi_epi64(xmmtE, xmmtF);
348 xmmt0 = _mm_unpacklo_epi64(xmms0, xmms1);
349 xmmt1 = _mm_unpackhi_epi64(xmms0, xmms1);
350 xmmt2 = _mm_unpacklo_epi64(xmms2, xmms3);
351 xmmt3 = _mm_unpackhi_epi64(xmms2, xmms3);
352 xmmt4 = _mm_unpacklo_epi64(xmms4, xmms5);
353 xmmt5 = _mm_unpackhi_epi64(xmms4, xmms5);
354 xmmt6 = _mm_unpacklo_epi64(xmms6, xmms7);
355 xmmt7 = _mm_unpackhi_epi64(xmms6, xmms7);
356 xmmt8 = _mm_unpacklo_epi64(xmms8, xmms9);
357 xmmt9 = _mm_unpackhi_epi64(xmms8, xmms9);
358 xmmtA = _mm_unpacklo_epi64(xmmsA, xmmsB);
359 xmmtB = _mm_unpackhi_epi64(xmmsA, xmmsB);
360 xmmtC = _mm_unpacklo_epi64(xmmsC, xmmsD);
361 xmmtD = _mm_unpackhi_epi64(xmmsC, xmmsD);
362 xmmtE = _mm_unpacklo_epi64(xmmsE, xmmsF);
363 xmmtF = _mm_unpackhi_epi64(xmmsE, xmmsF);
389 _mm_storeu_si128(rptr++, xmmt0);
390 _mm_storeu_si128(rptr++, xmmt1);
391 _mm_storeu_si128(rptr++, xmmt2);
392 _mm_storeu_si128(rptr++, xmmt3);
393 _mm_storeu_si128(rptr++, xmmt4);
394 _mm_storeu_si128(rptr++, xmmt5);
395 _mm_storeu_si128(rptr++, xmmt6);
396 _mm_storeu_si128(rptr++, xmmt7);
397 _mm_storeu_si128(rptr++, xmmt8);
398 _mm_storeu_si128(rptr++, xmmt9);
399 _mm_storeu_si128(rptr++, xmmtA);
400 _mm_storeu_si128(rptr++, xmmtB);
401 _mm_storeu_si128(rptr++, xmmtC);
402 _mm_storeu_si128(rptr++, xmmtD);
403 _mm_storeu_si128(rptr++, xmmtE);
404 _mm_storeu_si128(rptr++, xmmtF);
406 std::array<__m128i, S> s;
407 std::get<0x0>(s) = xmmt0;
408 std::get<0x1>(s) = xmmt1;
409 std::get<0x2>(s) = xmmt2;
410 std::get<0x3>(s) = xmmt3;
411 std::get<0x4>(s) = xmmt4;
412 std::get<0x5>(s) = xmmt5;
413 std::get<0x6>(s) = xmmt6;
414 std::get<0x7>(s) = xmmt7;
415 std::get<0x8>(s) = xmmt8;
416 std::get<0x9>(s) = xmmt9;
417 std::get<0xA>(s) = xmmtA;
418 std::get<0xB>(s) = xmmtB;
419 std::get<0xC>(s) = xmmtC;
420 std::get<0xD>(s) = xmmtD;
421 std::get<0xE>(s) = xmmtE;
422 std::get<0xF>(s) = xmmtF;
423 std::memcpy(rptr, s.data(), n *
sizeof(T) * K);
430 template <
typename T>
433 static_assert(std::numeric_limits<T>::digits == 64,
434 "**Threefish1024GeneratorSSE2Impl** used with T other than a 64-bit " 435 "unsigned integers");
437 static constexpr std::size_t K = 16;
438 static constexpr std::size_t Rounds = 80;
443 const void *plain,
void *cipher,
const std::array<T, K + 4> &par)
448 template <
typename ResultType>
449 static void eval(std::array<std::uint64_t, 16> &ctr, ResultType *r,
450 const std::array<T, K + 4> &par)
455 template <
typename ResultType>
456 static void eval(std::array<std::uint64_t, 16> &ctr, std::size_t n,
457 ResultType *r,
const std::array<T, K + 4> &par)
459 constexpr std::size_t R =
sizeof(T) * K /
sizeof(ResultType);
461 const std::size_t n0 =
462 static_cast<std::size_t
>(std::min(static_cast<std::uint64_t>(n),
463 std::numeric_limits<std::uint64_t>::max() - ctr.front()));
465 eval_kernel(ctr, n0, r, par);
475 eval_kernel(ctr, n, r, par);
479 template <
typename ResultType>
480 static void eval_kernel(std::array<std::uint64_t, 16> &ctr, std::size_t n,
481 ResultType *r,
const std::array<T, K + 4> &par)
483 constexpr std::size_t
S = 16;
484 constexpr std::size_t N =
sizeof(__m128i) * S / (
sizeof(T) * K);
487 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x1>(ctr)),
488 static_cast<MCKL_INT64>(std::get<0x0>(ctr)));
490 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x3>(ctr)),
491 static_cast<MCKL_INT64>(std::get<0x2>(ctr)));
493 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x5>(ctr)),
494 static_cast<MCKL_INT64>(std::get<0x4>(ctr)));
496 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x7>(ctr)),
497 static_cast<MCKL_INT64>(std::get<0x6>(ctr)));
499 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0x9>(ctr)),
500 static_cast<MCKL_INT64>(std::get<0x8>(ctr)));
502 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xB>(ctr)),
503 static_cast<MCKL_INT64>(std::get<0xA>(ctr)));
505 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xD>(ctr)),
506 static_cast<MCKL_INT64>(std::get<0xC>(ctr)));
508 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<0xF>(ctr)),
509 static_cast<MCKL_INT64>(std::get<0xE>(ctr)));
512 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
514 __m128i xmmt0 = _mm_add_epi64(xmmc0, _mm_set_epi64x(0, 1));
515 __m128i xmmt8 = _mm_add_epi64(xmmc0, _mm_set_epi64x(0, 2));
518 __m128i xmmt1 = xmmc1;
519 __m128i xmmt2 = xmmc2;
520 __m128i xmmt3 = xmmc3;
521 __m128i xmmt4 = xmmc4;
522 __m128i xmmt5 = xmmc5;
523 __m128i xmmt6 = xmmc6;
524 __m128i xmmt7 = xmmc7;
525 __m128i xmmt9 = xmmc1;
526 __m128i xmmtA = xmmc2;
527 __m128i xmmtB = xmmc3;
528 __m128i xmmtC = xmmc4;
529 __m128i xmmtD = xmmc5;
530 __m128i xmmtE = xmmc6;
531 __m128i xmmtF = xmmc7;
572 xmms0 = _mm_unpacklo_epi64(xmmt0, xmmt1);
573 xmms1 = _mm_unpackhi_epi64(xmmt0, xmmt1);
574 xmms2 = _mm_unpacklo_epi64(xmmt2, xmmt3);
575 xmms3 = _mm_unpackhi_epi64(xmmt2, xmmt3);
576 xmms4 = _mm_unpacklo_epi64(xmmt4, xmmt5);
577 xmms5 = _mm_unpackhi_epi64(xmmt4, xmmt5);
578 xmms6 = _mm_unpacklo_epi64(xmmt6, xmmt7);
579 xmms7 = _mm_unpackhi_epi64(xmmt6, xmmt7);
580 xmms8 = _mm_unpacklo_epi64(xmmt8, xmmt9);
581 xmms9 = _mm_unpackhi_epi64(xmmt8, xmmt9);
582 xmmsA = _mm_unpacklo_epi64(xmmtA, xmmtB);
583 xmmsB = _mm_unpackhi_epi64(xmmtA, xmmtB);
584 xmmsC = _mm_unpacklo_epi64(xmmtC, xmmtD);
585 xmmsD = _mm_unpackhi_epi64(xmmtC, xmmtD);
586 xmmsE = _mm_unpacklo_epi64(xmmtE, xmmtF);
587 xmmsF = _mm_unpackhi_epi64(xmmtE, xmmtF);
601 xmmt0 = _mm_unpacklo_epi64(xmms0, xmms1);
602 xmmt1 = _mm_unpackhi_epi64(xmms0, xmms1);
603 xmmt2 = _mm_unpacklo_epi64(xmms2, xmms3);
604 xmmt3 = _mm_unpackhi_epi64(xmms2, xmms3);
605 xmmt4 = _mm_unpacklo_epi64(xmms4, xmms5);
606 xmmt5 = _mm_unpackhi_epi64(xmms4, xmms5);
607 xmmt6 = _mm_unpacklo_epi64(xmms6, xmms7);
608 xmmt7 = _mm_unpackhi_epi64(xmms6, xmms7);
609 xmmt8 = _mm_unpacklo_epi64(xmms8, xmms9);
610 xmmt9 = _mm_unpackhi_epi64(xmms8, xmms9);
611 xmmtA = _mm_unpacklo_epi64(xmmsA, xmmsB);
612 xmmtB = _mm_unpackhi_epi64(xmmsA, xmmsB);
613 xmmtC = _mm_unpacklo_epi64(xmmsC, xmmsD);
614 xmmtD = _mm_unpackhi_epi64(xmmsC, xmmsD);
615 xmmtE = _mm_unpacklo_epi64(xmmsE, xmmsF);
616 xmmtF = _mm_unpackhi_epi64(xmmsE, xmmsF);
642 _mm_storeu_si128(rptr++, xmmt0);
643 _mm_storeu_si128(rptr++, xmmt1);
644 _mm_storeu_si128(rptr++, xmmt2);
645 _mm_storeu_si128(rptr++, xmmt3);
646 _mm_storeu_si128(rptr++, xmmt4);
647 _mm_storeu_si128(rptr++, xmmt5);
648 _mm_storeu_si128(rptr++, xmmt6);
649 _mm_storeu_si128(rptr++, xmmt7);
650 _mm_storeu_si128(rptr++, xmmt8);
651 _mm_storeu_si128(rptr++, xmmt9);
652 _mm_storeu_si128(rptr++, xmmtA);
653 _mm_storeu_si128(rptr++, xmmtB);
654 _mm_storeu_si128(rptr++, xmmtC);
655 _mm_storeu_si128(rptr++, xmmtD);
656 _mm_storeu_si128(rptr++, xmmtE);
657 _mm_storeu_si128(rptr++, xmmtF);
659 std::array<__m128i, S> s;
660 std::get<0x0>(s) = xmmt0;
661 std::get<0x1>(s) = xmmt1;
662 std::get<0x2>(s) = xmmt2;
663 std::get<0x3>(s) = xmmt3;
664 std::get<0x4>(s) = xmmt4;
665 std::get<0x5>(s) = xmmt5;
666 std::get<0x6>(s) = xmmt6;
667 std::get<0x7>(s) = xmmt7;
668 std::get<0x8>(s) = xmmt8;
669 std::get<0x9>(s) = xmmt9;
670 std::get<0xA>(s) = xmmtA;
671 std::get<0xB>(s) = xmmtB;
672 std::get<0xC>(s) = xmmtC;
673 std::get<0xD>(s) = xmmtD;
674 std::get<0xE>(s) = xmmtE;
675 std::get<0xF>(s) = xmmtF;
676 std::memcpy(rptr, s.data(), n *
sizeof(T) * K);
689 #endif // MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_HPP #define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_CYCLE_8(N)
#define MCKL_PUSH_GCC_WARNING(warning)
static void eval(const void *plain, void *cipher, const std::array< T, K+4 > &par)
static void eval(const void *plain, void *cipher, const std::array< T, K+4 > &par)
static void eval(std::array< std::uint64_t, 16 > &ctr, std::size_t n, ResultType *r, const std::array< T, K+4 > &par)
static void eval(const void *plain, void *cipher, const std::array< T, K+4 > &par)
static void eval(std::array< std::uint64_t, 16 > &ctr, ResultType *r, const std::array< T, K+4 > &par)
static void eval(std::array< std::uint64_t, 16 > &ctr, ResultType *r, const std::array< T, K+4 > &par)
Default Threefry constants.
static void eval(const void *plain, void *cipher, const std::array< T, K+4 > &par)
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_CYCLE_4(N)
static void eval(std::array< std::uint64_t, 16 > &ctr, std::size_t n, ResultType *r, const std::array< T, K+4 > &par)
#define MCKL_POP_GCC_WARNING
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_16X64_KBOX(N)