32 #ifndef MCKL_RANDOM_INTERNAL_AES_AESNI_ARS_HPP 33 #define MCKL_RANDOM_INTERNAL_AES_AESNI_ARS_HPP 46 template <
typename Constants>
53 template <std::
size_t Rp1>
57 std::memcpy(key.data(), rk.data(),
sizeof(
key_type));
62 template <std::
size_t Rp1>
65 key_ = _mm_set_epi32(static_cast<int>(std::get<3>(key)),
66 static_cast<int>(std::get<2>(key)),
67 static_cast<int>(std::get<1>(key)),
68 static_cast<int>(std::get<0>(key)));
69 generate<0>(rk, std::integral_constant<bool, 0 < Rp1>());
75 template <std::
size_t, std::
size_t Rp1>
76 void generate(std::array<__m128i, Rp1> &, std::false_type)
const 80 template <std::
size_t N, std::
size_t Rp1>
81 void generate(std::array<__m128i, Rp1> &rk, std::true_type)
const 84 static_cast<MCKL_INT64>(Constants::weyl::value[0] * N);
86 static_cast<MCKL_INT64>(Constants::weyl::value[1] * N);
88 __m128i w = _mm_set_epi64x(w1, w0);
89 std::get<N>(rk) = _mm_add_epi64(key_, w);
90 generate<N + 1>(rk, std::integral_constant<bool, N + 1 < Rp1>());
94 template <
typename Constants>
104 static_cast<MCKL_INT64>(Constants::weyl::value[0]);
106 static_cast<MCKL_INT64>(Constants::weyl::value[1]);
107 const __m128i xmmw = _mm_set_epi64x(w1, w0);
109 auto &&key = ks.
key();
111 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(key)),
112 static_cast<MCKL_INT64>(std::get<0>(key)));
115 _mm_loadu_si128(reinterpret_cast<const __m128i *>(plain));
117 xmm0 = _mm_xor_si128(xmm0, xmmk);
118 xmmk = _mm_add_epi64(xmmk, xmmw);
119 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
120 xmmk = _mm_add_epi64(xmmk, xmmw);
121 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
122 xmmk = _mm_add_epi64(xmmk, xmmw);
123 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
124 xmmk = _mm_add_epi64(xmmk, xmmw);
125 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
126 xmmk = _mm_add_epi64(xmmk, xmmw);
127 xmm0 = _mm_aesenclast_si128(xmm0, xmmk);
129 _mm_storeu_si128(reinterpret_cast<__m128i *>(cipher), xmm0);
132 template <
typename ResultType>
134 std::array<std::uint64_t, 2> &ctr, ResultType *r,
const KeySeqType &ks)
139 static_cast<MCKL_INT64>(Constants::weyl::value[0]);
141 static_cast<MCKL_INT64>(Constants::weyl::value[1]);
142 const __m128i xmmw = _mm_set_epi64x(w1, w0);
144 auto &&key = ks.
key();
146 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(key)),
147 static_cast<MCKL_INT64>(std::get<0>(key)));
150 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
151 static_cast<MCKL_INT64>(std::get<0>(ctr)));
153 xmm0 = _mm_xor_si128(xmm0, xmmk);
154 xmmk = _mm_add_epi64(xmmk, xmmw);
155 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
156 xmmk = _mm_add_epi64(xmmk, xmmw);
157 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
158 xmmk = _mm_add_epi64(xmmk, xmmw);
159 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
160 xmmk = _mm_add_epi64(xmmk, xmmw);
161 xmm0 = _mm_aesenc_si128(xmm0, xmmk);
162 xmmk = _mm_add_epi64(xmmk, xmmw);
163 xmm0 = _mm_aesenclast_si128(xmm0, xmmk);
165 _mm_storeu_si128(reinterpret_cast<__m128i *>(r), xmm0);
171 template <
typename ResultType>
172 static void eval_kernel(std::array<std::uint64_t, 2> &ctr, std::size_t n,
175 #if MCKL_USE_ASM_LIBRARY 179 auto &&key = ks.
key();
184 static_cast<std::uint64_t>(std::get<2>(key)) +
185 (static_cast<std::uint64_t>(std::get<3>(key)) << 32)};
191 #else // MCKL_USE_ASM_LIBRARY 192 constexpr std::size_t
S = 8;
193 constexpr std::size_t N = S;
196 static_cast<MCKL_INT64>(Constants::weyl::value[0]);
198 static_cast<MCKL_INT64>(Constants::weyl::value[1]);
199 const __m128i xmmw = _mm_set_epi64x(w1, w0);
201 auto &&key = ks.
key();
202 const __m128i xmmk0 =
203 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(key)),
204 static_cast<MCKL_INT64>(std::get<0>(key)));
205 const __m128i xmmk1 = _mm_add_epi64(xmmk0, xmmw);
206 const __m128i xmmk2 = _mm_add_epi64(xmmk1, xmmw);
207 const __m128i xmmk3 = _mm_add_epi64(xmmk2, xmmw);
208 const __m128i xmmk4 = _mm_add_epi64(xmmk3, xmmw);
209 const __m128i xmmk5 = _mm_add_epi64(xmmk4, xmmw);
212 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
213 static_cast<MCKL_INT64>(std::get<0>(ctr)));
216 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
218 __m128i xmm0 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 1));
219 __m128i xmm1 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 2));
220 __m128i xmm2 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 3));
221 __m128i xmm3 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 4));
222 __m128i xmm4 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 5));
223 __m128i xmm5 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 6));
224 __m128i xmm6 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 7));
225 __m128i xmm7 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 8));
236 #endif // MCKL_USE_ASM_LIBRARY 246 #endif // MCKL_RANDOM_INTERNAL_AES_AESNI_ARS_HPP #define MCKL_PUSH_GCC_WARNING(warning)
static void eval(const void *plain, void *cipher, const KeySeqType &ks)
static void eval(std::array< std::uint64_t, 2 > &ctr, ResultType *r, const KeySeqType &ks)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENC(xmmk)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_STORE(n, N, rptr)
std::array< std::uint32_t, 4 > key_type
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCFIRST(xmmk)
const key_type & key() const
#define MCKL_RANDOM_INTERNAL_AES_AESNI_EVAL
void mckl_ars_aesni_sse2_kernel(uint64_t *, size_t, void *, const void *)
void mckl_ars_aesni_avx2_kernel(uint64_t *, size_t, void *, const void *)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
void operator()(const key_type &key, std::array< __m128i, Rp1 > &rk)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCLAST(xmmk)
#define MCKL_POP_GCC_WARNING
static key_type key(const std::array< __m128i, Rp1 > &rk)