32 #ifndef VSMC_RNG_M128I_HPP
33 #define VSMC_RNG_M128I_HPP
36 #include <emmintrin.h>
38 #define VSMC_STATIC_ASSERT_RNG_M128I_PACK(Offset, T, N) \
40 ((Offset < N) && (sizeof(T) * (N - Offset) >= sizeof(__m128i))), \
41 TRY_TO_PACK_OR_UNPACK_A_TOO_SMALL_VECTOR_INTO_OR_FROM_m128i)
47 template <std::
size_t Offset,
typename T, std::
size_t N>
49 {m = _mm_load_si128(reinterpret_cast<const __m128i *>(c.
data() + Offset));}
53 template <std::
size_t Offset,
typename T, std::
size_t N>
55 {m = _mm_loadu_si128(reinterpret_cast<const __m128i *>(c.
data() + Offset));}
59 template <std::
size_t Offset,
typename T, std::
size_t N>
61 {_mm_store_si128(reinterpret_cast<__m128i *>(c.
data() + Offset), m);}
65 template <std::
size_t Offset,
typename T, std::
size_t N>
67 {_mm_storeu_si128(reinterpret_cast<__m128i *>(c.
data() + Offset), m);}
71 template <std::
size_t Offset,
typename T, std::
size_t N>
75 m128i_pack_u<Offset>(c, m);
80 template <std::
size_t Offset,
typename T, std::
size_t N>
84 m128i_unpack_u<Offset>(m, c);
93 m128i_unpack<0>(a, sa);
94 m128i_unpack<0>(b, sb);
102 template <
typename CharT,
typename Traits>
104 std::basic_ostream<CharT, Traits> &os,
const __m128i &a)
108 m128i_unpack<0>(a, sa);
118 template <
typename CharT,
typename Traits>
120 std::basic_istream<CharT, Traits> &is,
__m128i &a)
125 if (is) m128i_pack<0>(sa, a);
133 #endif // VSMC_RNG_M128I_HPP
void m128i_unpack(const __m128i &m, Array< T, N > &c)
Unpack an __m128i object into an Array.
void m128i_pack_a(const Array< T, N > &c, __m128i &m)
Aligned pack.
void m128i_unpack_u(const __m128i &m, Array< T, N > &c)
Unaligned unpack.
std::basic_istream< CharT, Traits > & m128i_input(std::basic_istream< CharT, Traits > &is, __m128i &a)
Input an __m128i object from an input stream as 16 bytes unsigned integers written by m128i_output...
void m128i_unpack_a(const __m128i &m, Array< T, N > &c)
Aligned unpack.
#define VSMC_STATIC_ASSERT_RNG_M128I_PACK(Offset, T, N)
std::basic_ostream< CharT, Traits > & m128i_output(std::basic_ostream< CharT, Traits > &os, const __m128i &a)
Write an __m128i object into an output stream as 16 bytes unsigned integers.
void m128i_pack(const Array< T, N > &c, __m128i &m)
Pack an Array into an __m128i object.
bool m128i_is_equal(const __m128i &a, const __m128i &b)
Compare two __m128i objects.
void m128i_pack_u(const Array< T, N > &c, __m128i &m)
Unaligned pack.