32 #ifndef __Random123_ars_dot_hpp__ 33 #define __Random123_ars_dot_hpp__ 40 #ifndef ARS1xm128i_DEFAULT_ROUNDS 41 #define ARS1xm128i_DEFAULT_ROUNDS 7 45 enum r123_enum_ars1xm128i {ars1xm128i_rounds = ARS1xm128i_DEFAULT_ROUNDS};
49 typedef struct r123array1xm128i ars1xm128i_ctr_t;
51 typedef struct r123array1xm128i ars1xm128i_key_t;
53 typedef struct r123array1xm128i ars1xm128i_ukey_t;
55 R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) {
return uk; }
57 R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(
unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t
k){
58 __m128i kweyl = _mm_set_epi64x(R123_64BIT(0xBB67AE8584CAA73B),
59 R123_64BIT(0x9E3779B97F4A7C15));
63 __m128i kk = k.v[0].m;
64 __m128i
v = _mm_xor_si128(in.v[0].m, kk);
68 kk = _mm_add_epi64(kk, kweyl);
69 v = _mm_aesenc_si128(v, kk);
72 kk = _mm_add_epi64(kk, kweyl);
73 v = _mm_aesenc_si128(v, kk);
76 kk = _mm_add_epi64(kk, kweyl);
77 v = _mm_aesenc_si128(v, kk);
80 kk = _mm_add_epi64(kk, kweyl);
81 v = _mm_aesenc_si128(v, kk);
84 kk = _mm_add_epi64(kk, kweyl);
85 v = _mm_aesenc_si128(v, kk);
88 kk = _mm_add_epi64(kk, kweyl);
89 v = _mm_aesenc_si128(v, kk);
92 kk = _mm_add_epi64(kk, kweyl);
93 v = _mm_aesenc_si128(v, kk);
96 kk = _mm_add_epi64(kk, kweyl);
97 v = _mm_aesenc_si128(v, kk);
100 kk = _mm_add_epi64(kk, kweyl);
101 v = _mm_aesenc_si128(v, kk);
103 kk = _mm_add_epi64(kk, kweyl);
104 v = _mm_aesenclast_si128(v, kk);
112 #define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k) 115 typedef struct r123array4x32 ars4x32_ctr_t;
117 typedef struct r123array4x32 ars4x32_key_t;
119 typedef struct r123array4x32 ars4x32_ukey_t;
121 enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS};
125 R123_STATIC_INLINE ars4x32_ctr_t ars4x32_R(
unsigned int Nrounds, ars4x32_ctr_t
c, ars4x32_key_t k){
126 ars1xm128i_ctr_t c128;
127 ars1xm128i_key_t k128;
128 c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]);
129 k128.v[0].m = _mm_set_epi32(k.v[3], k.v[2], k.v[1], k.v[0]);
130 c128 = ars1xm128i_R(Nrounds, c128, k128);
131 _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m);
138 #define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k) 163 template<
unsigned int ROUNDS>
165 typedef ars1xm128i_ctr_t ctr_type;
166 typedef ars1xm128i_key_t key_type;
167 typedef ars1xm128i_key_t ukey_type;
168 static const unsigned int rounds=ROUNDS;
170 return ars1xm128i_R(ROUNDS, ctr, key);
178 template<
unsigned int ROUNDS>
180 typedef ars4x32_ctr_t ctr_type;
181 typedef ars4x32_key_t key_type;
182 typedef ars4x32_key_t ukey_type;
183 static const unsigned int rounds=ROUNDS;
185 return ars4x32_R(ROUNDS, ctr, key);
196 typedef ARS1xm128i_R<ars1xm128i_rounds> ARS1xm128i;
197 typedef ARS4x32_R<ars4x32_rounds> ARS4x32;
static philox4x32_key_t k
#define R123_STATIC_INLINE
Most of the Random123 C++ API is contained in the r123 namespace.
#define R123_FORCE_INLINE(decl)