MCKL
Monte Carlo Kernel Library
Classes | Namespaces | Macros
threefry_sse2_2x32.hpp File Reference
#include <mckl/random/internal/common.hpp>
#include <mckl/random/internal/threefry_common.hpp>
#include <mckl/random/internal/threefry_constants.hpp>
#include <mckl/random/internal/threefry_generic_2x32.hpp>

Go to the source code of this file.

Classes

class  mckl::internal::Threefry2x32GeneratorSSE2Impl< T >
 

Namespaces

 mckl
 
 mckl::internal
 

Macros

#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_4(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_8(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N)
 

Macro Definition Documentation

◆ MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_4

#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_4 (   N)
Value:
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 2); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 3); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX(N * 8 + 4);
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N)

Definition at line 82 of file threefry_sse2_2x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_8

#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_CYCLE_8 (   N)
Value:
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 2); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 3); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 5); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 6); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 7); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N * 8 + 8); \
MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX(N * 8 + 8);
#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX(N)

Definition at line 89 of file threefry_sse2_2x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX

#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_KBOX (   N)
Value:
xmmt0 = _mm_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<0>(par))); \
xmmt1 = _mm_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<1>(par))); \
xmms0 = _mm_add_epi32(xmms0, xmmt0); \
xmms1 = _mm_add_epi32(xmms1, xmmt1); \
xmms2 = _mm_add_epi32(xmms2, xmmt0); \
xmms3 = _mm_add_epi32(xmms3, xmmt1); \
xmms4 = _mm_add_epi32(xmms4, xmmt0); \
xmms5 = _mm_add_epi32(xmms5, xmmt1); \
xmms6 = _mm_add_epi32(xmms6, xmmt0); \
xmms7 = _mm_add_epi32(xmms7, xmmt1);

Definition at line 42 of file threefry_sse2_2x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX

#define MCKL_RANDOM_INTERNAL_THREEFRY_SSE2_2X32_RBOX (   N)
Value:
{ \
constexpr int L0 = Constants::rotate::value[0][(N - 1) % 8]; \
constexpr int R0 = 32 - L0; \
xmms0 = _mm_add_epi32(xmms0, xmms1); \
xmms2 = _mm_add_epi32(xmms2, xmms3); \
xmms4 = _mm_add_epi32(xmms4, xmms5); \
xmms6 = _mm_add_epi32(xmms6, xmms7); \
xmmt1 = _mm_slli_epi32(xmms1, L0); \
xmmt3 = _mm_slli_epi32(xmms3, L0); \
xmmt5 = _mm_slli_epi32(xmms5, L0); \
xmmt7 = _mm_slli_epi32(xmms7, L0); \
xmms1 = _mm_srli_epi32(xmms1, R0); \
xmms3 = _mm_srli_epi32(xmms3, R0); \
xmms5 = _mm_srli_epi32(xmms5, R0); \
xmms7 = _mm_srli_epi32(xmms7, R0); \
xmmt1 = _mm_or_si128(xmms1, xmmt1); \
xmmt3 = _mm_or_si128(xmms3, xmmt3); \
xmmt5 = _mm_or_si128(xmms5, xmmt5); \
xmmt7 = _mm_or_si128(xmms7, xmmt7); \
xmms1 = _mm_xor_si128(xmms0, xmmt1); \
xmms3 = _mm_xor_si128(xmms2, xmmt3); \
xmms5 = _mm_xor_si128(xmms4, xmmt5); \
xmms7 = _mm_xor_si128(xmms6, xmmt7); \
}

Definition at line 56 of file threefry_sse2_2x32.hpp.