32 #ifndef MCKL_RANDOM_INTERNAL_INCREMENT_AVX2_64_4_HPP 33 #define MCKL_RANDOM_INTERNAL_INCREMENT_AVX2_64_4_HPP 46 static constexpr std::size_t K_ = 1;
49 static void eval(
const std::array<T, K_> &ctr, std::array<__m256i, 4> &s)
52 _mm256_set1_epi64x(static_cast<MCKL_INT64>(std::get<0>(ctr)));
55 _mm256_add_epi64(c, _mm256_set_epi64x(0x04, 0x03, 0x02, 0x01));
57 _mm256_add_epi64(c, _mm256_set_epi64x(0x08, 0x07, 0x06, 0x05));
59 _mm256_add_epi64(c, _mm256_set_epi64x(0x0C, 0x0B, 0x0A, 0x09));
61 _mm256_add_epi64(c, _mm256_set_epi64x(0x10, 0x0F, 0x0E, 0x0D));
68 static constexpr std::size_t K_ = 2;
71 static void eval(
const std::array<T, K_> &ctr, std::array<__m256i, 4> &s)
74 _mm256_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
75 static_cast<MCKL_INT64>(std::get<0>(ctr)),
76 static_cast<MCKL_INT64>(std::get<1>(ctr)),
77 static_cast<MCKL_INT64>(std::get<0>(ctr)));
79 std::get<0>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 2, 0, 1));
80 std::get<1>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 4, 0, 3));
81 std::get<2>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 6, 0, 5));
82 std::get<3>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 8, 0, 7));
89 static constexpr std::size_t K_ = 4;
92 static void eval(
const std::array<T, K_> &ctr, std::array<__m256i, 4> &s)
95 _mm256_set_epi64x(static_cast<MCKL_INT64>(std::get<3>(ctr)),
96 static_cast<MCKL_INT64>(std::get<2>(ctr)),
97 static_cast<MCKL_INT64>(std::get<1>(ctr)),
98 static_cast<MCKL_INT64>(std::get<0>(ctr)));
100 std::get<0>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 1));
101 std::get<1>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 2));
102 std::get<2>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 3));
103 std::get<3>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 4));
107 template <
typename T>
110 static constexpr std::size_t K_ = 8;
113 static void eval(
const std::array<T, K_> &ctr, std::array<__m256i, 4> &s)
116 _mm256_set_epi64x(static_cast<MCKL_INT64>(std::get<3>(ctr)),
117 static_cast<MCKL_INT64>(std::get<2>(ctr)),
118 static_cast<MCKL_INT64>(std::get<1>(ctr)),
119 static_cast<MCKL_INT64>(std::get<0>(ctr)));
121 std::get<0>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 1));
123 _mm256_set_epi64x(static_cast<MCKL_INT64>(std::get<7>(ctr)),
124 static_cast<MCKL_INT64>(std::get<6>(ctr)),
125 static_cast<MCKL_INT64>(std::get<5>(ctr)),
126 static_cast<MCKL_INT64>(std::get<4>(ctr)));
127 std::get<2>(s) = _mm256_add_epi64(c, _mm256_set_epi64x(0, 0, 0, 2));
128 std::get<3>(s) = std::get<1>(s);
132 template <
typename T>
135 static constexpr std::size_t K_ = 16;
138 static void eval(
const std::array<T, K_> &ctr, std::array<__m256i, 4> &s)
140 std::memcpy(s.data(), ctr.data(), 128);
142 _mm256_add_epi64(std::get<0>(s), _mm256_set_epi64x(0, 0, 0, 1));
152 #endif // MCKL_RANDOM_INTERNAL_INCREMENT_AVX2_64_4_HPP static void eval(const std::array< T, K_ > &ctr, std::array< __m256i, 4 > &s)
#define MCKL_PUSH_GCC_WARNING(warning)
static void eval(const std::array< T, K_ > &ctr, std::array< __m256i, 4 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m256i, 4 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m256i, 4 > &s)
static void eval(const std::array< T, K_ > &ctr, std::array< __m256i, 4 > &s)
#define MCKL_POP_GCC_WARNING