22 #ifndef _BLAZE_MATH_INTRINSICS_STORE_H_
23 #define _BLAZE_MATH_INTRINSICS_STORE_H_
74 template<
typename T >
79 typedef sse_int16_t Type;
83 static inline void store( T* address,
const Type& value )
86 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 16UL ),
"Invalid alignment detected" );
87 _mm_store_si128( reinterpret_cast<__m128i*>( address ), value.value );
89 *address = value.value;
108 template<
typename T >
113 typedef sse_int32_t Type;
117 static inline void store( T* address,
const Type& value )
120 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 64UL ),
"Invalid alignment detected" );
121 _mm512_store_epi32( address, value.value );
122 #elif BLAZE_SSE2_MODE
123 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 16UL ),
"Invalid alignment detected" );
124 _mm_store_si128( reinterpret_cast<__m128i*>( address ), value.value );
126 *address = value.value;
145 template<
typename T >
150 typedef sse_int64_t Type;
154 static inline void store( T* address,
const Type& value )
157 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 64UL ),
"Invalid alignment detected" );
158 _mm512_store_epi64( address, value.value );
159 #elif BLAZE_SSE2_MODE
160 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 16UL ),
"Invalid alignment detected" );
161 _mm_store_si128( reinterpret_cast<__m128i*>( address ), value.value );
163 *address = value.value;
193 template<
typename T >
194 inline typename EnableIf< IsIntegral<T> >::Type
195 store( T* address,
const typename Store<T,
sizeof(T)>::Type& value )
213 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 64UL ),
"Invalid alignment detected" );
214 _mm512_store_ps( address, value.value );
216 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 32UL ),
"Invalid alignment detected" );
217 _mm256_store_ps( address, value.value );
219 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 16UL ),
"Invalid alignment detected" );
220 _mm_store_ps( address, value.value );
222 *address = value.value;
239 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 64UL ),
"Invalid alignment detected" );
240 _mm512_store_pd( address, value.value );
242 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 32UL ),
"Invalid alignment detected" );
243 _mm256_store_pd( address, value.value );
244 #elif BLAZE_SSE2_MODE
245 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( address ) % 16UL ),
"Invalid alignment detected" );
246 _mm_store_pd( address, value.value );
248 *address = value.value;