1 /* Copyright (C) 2013-2014 Povilas Kanapickas <povilas@radix.lt>
2
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at
5 http://www.boost.org/LICENSE_1_0.txt)
6 */
7
8 #ifndef LIBSIMDPP_SIMDPP_CORE_STORE_H
9 #define LIBSIMDPP_SIMDPP_CORE_STORE_H
10
11 #ifndef LIBSIMDPP_SIMD_H
12 #error "This file must be included through simd.h"
13 #endif
14
15 #include <simdpp/types.h>
16 #include <simdpp/detail/insn/store.h>
17
18 namespace simdpp {
19 namespace SIMDPP_ARCH_NAMESPACE {
20
21 /** Stores a 128-bit or 256-bit integer vector to an aligned memory location.
22
23 @par 128-bit version:
24
25 @code
26 *(p) = a[0..127]
27 @endcode
28 @a p must be aligned to 16 bytes.
29
30 @par 256-bit version:
31
32 @code
33 *(p) = a[0..255]
34 @endcode
35 @a p must be aligned to 32 bytes.
36 @icost{SSE2-SSE4.1, NEON, ALTIVEC, 2}
37 @icost{AVX (integer vectors), 2}
38 */
39 template<class T, unsigned N, class V> SIMDPP_INL
store(T * p,const any_vec<N,V> & a)40 void store(T* p, const any_vec<N,V>& a)
41 {
42 static_assert(!is_mask<V>::value, "Masks can not be stored"); // FIXME: automatically convert
43 detail::insn::i_store(reinterpret_cast<char*>(p), a.wrapped().eval());
44 }
45
46 } // namespace SIMDPP_ARCH_NAMESPACE
47 } // namespace simdpp
48
49 #endif
50
51