1 /* Copyright (C) 2011-2012 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_DETAIL_NULL_MEMORY_H
9 #define LIBSIMDPP_DETAIL_NULL_MEMORY_H
10 #if SIMDPP_USE_NULL || SIMDPP_USE_NEON || SIMDPP_USE_ALTIVEC
11
12 #ifndef LIBSIMDPP_SIMD_H
13 #error "This file must be included through simd.h"
14 #endif
15
16 #include <simdpp/types.h>
17
18 namespace simdpp {
19 namespace SIMDPP_ARCH_NAMESPACE {
20 namespace detail {
21 namespace null {
22
23 template<class V> SIMDPP_INL
load(V & a,const char * p)24 void load(V& a, const char* p)
25 {
26 using T = typename V::element_type;
27 const T* pt = reinterpret_cast<const T*>(p);
28 for (unsigned i = 0; i < V::length; i++) {
29 a.el(i) = *pt++;
30 }
31 }
32
33 template<class V> SIMDPP_INL
load_packed2(V & a,V & b,const char * p)34 void load_packed2(V& a, V& b, const char* p)
35 {
36 using T = typename V::element_type;
37 const T* pt = reinterpret_cast<const T*>(p);
38 for (unsigned i = 0; i < V::length; i++) {
39 a.el(i) = *pt++;
40 b.el(i) = *pt++;
41 }
42 }
43
44 template<class V> SIMDPP_INL
load_packed3(V & a,V & b,V & c,const char * p)45 void load_packed3(V& a, V& b, V& c, const char* p)
46 {
47 using T = typename V::element_type;
48 const T* pt = reinterpret_cast<const T*>(p);
49 for (unsigned i = 0; i < V::length; i++) {
50 a.el(i) = *pt++;
51 b.el(i) = *pt++;
52 c.el(i) = *pt++;
53 }
54 }
55
56 template<class V> SIMDPP_INL
load_packed4(V & a,V & b,V & c,V & d,const char * p)57 void load_packed4(V& a, V& b, V& c, V& d, const char* p)
58 {
59 using T = typename V::element_type;
60 const T* pt = reinterpret_cast<const T*>(p);
61 for (unsigned i = 0; i < V::length; i++) {
62 a.el(i) = *pt++;
63 b.el(i) = *pt++;
64 c.el(i) = *pt++;
65 d.el(i) = *pt++;
66 }
67 }
68
69 template<class V> SIMDPP_INL
store(char * p,const V & a)70 void store(char* p, const V& a)
71 {
72 using T = typename V::element_type;
73 T* pt = reinterpret_cast<T*>(p);
74 for (unsigned i = 0; i < V::length; i++) {
75 *pt++ = a.el(i);
76 }
77 }
78
79 template<class V, class M> SIMDPP_INL
store_masked(char * p,const V & a,const M & mask)80 void store_masked(char* p, const V& a, const M& mask)
81 {
82 using T = typename V::element_type;
83 T* pt = reinterpret_cast<T*>(p);
84 for (unsigned i = 0; i < a.length; ++i) {
85 if (mask.el(i))
86 *pt = a.el(i);
87 pt++;
88 }
89 }
90
91 template<class V> SIMDPP_INL
store_first(char * p,const V & a,unsigned n)92 void store_first(char* p, const V& a, unsigned n)
93 {
94 using T = typename V::element_type;
95 T* pt = reinterpret_cast<T*>(p);
96 for (unsigned i = 0; i < V::length && i < n; i++) {
97 *pt++ = a.el(i);
98 }
99 }
100
101 template<class V> SIMDPP_INL
store_last(char * p,const V & a,unsigned n)102 void store_last(char* p, const V& a, unsigned n)
103 {
104 using T = typename V::element_type;
105 T* pt = reinterpret_cast<T*>(p);
106 pt += V::length - n;
107 for (unsigned i = V::length - n; i < V::length; i++) {
108 *pt++ = a.el(i);
109 }
110 }
111
112 template<class V> SIMDPP_INL
store_packed2(char * p,const V & a,const V & b)113 void store_packed2(char* p, const V& a, const V& b)
114 {
115 using T = typename V::element_type;
116 T* pt = reinterpret_cast<T*>(p);
117 for (unsigned i = 0; i < V::length; i++) {
118 *pt++ = a.el(i);
119 *pt++ = b.el(i);
120 }
121 }
122
123 template<class V> SIMDPP_INL
store_packed3(char * p,const V & a,const V & b,const V & c)124 void store_packed3(char* p, const V& a, const V& b, const V& c)
125 {
126 using T = typename V::element_type;
127 T* pt = reinterpret_cast<T*>(p);
128 for (unsigned i = 0; i < V::length; i++) {
129 *pt++ = a.el(i);
130 *pt++ = b.el(i);
131 *pt++ = c.el(i);
132 }
133 }
134
135 template<class V> SIMDPP_INL
store_packed4(char * p,const V & a,const V & b,const V & c,const V & d)136 void store_packed4(char* p, const V& a, const V& b, const V& c, const V& d)
137 {
138 using T = typename V::element_type;
139 T* pt = reinterpret_cast<T*>(p);
140 for (unsigned i = 0; i < V::length; i++) {
141 *pt++ = a.el(i);
142 *pt++ = b.el(i);
143 *pt++ = c.el(i);
144 *pt++ = d.el(i);
145 }
146 }
147
148 } // namespace null
149 } // namespace detail
150 } // namespace SIMDPP_ARCH_NAMESPACE
151 } // namespace simdpp
152
153 #endif
154 #endif
155