1 /* This file is part of the Vc library. {{{
3 Copyright (C) 2012 Matthias Kretz <kretz@kde.org>
5 Vc is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation, either version 3 of
8 the License, or (at your option) any later version.
10 Vc is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with Vc. If not, see <http://www.gnu.org/licenses/>.
20 #ifndef VC_SCALAR_INTERLEAVEDMEMORY_TCC
21 #define VC_SCALAR_INTERLEAVEDMEMORY_TCC
30 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
31 const typename V::AsArg v1)
33 m_data[m_indexes.data() + 0] = v0.data();
34 m_data[m_indexes.data() + 1] = v1.data();
36 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
37 const typename V::AsArg v1, const typename V::AsArg v2)
39 m_data[m_indexes.data() + 0] = v0.data();
40 m_data[m_indexes.data() + 1] = v1.data();
41 m_data[m_indexes.data() + 2] = v2.data();
43 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
44 const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3)
46 m_data[m_indexes.data() + 0] = v0.data();
47 m_data[m_indexes.data() + 1] = v1.data();
48 m_data[m_indexes.data() + 2] = v2.data();
49 m_data[m_indexes.data() + 3] = v3.data();
51 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
52 const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4)
54 m_data[m_indexes.data() + 0] = v0.data();
55 m_data[m_indexes.data() + 1] = v1.data();
56 m_data[m_indexes.data() + 2] = v2.data();
57 m_data[m_indexes.data() + 3] = v3.data();
58 m_data[m_indexes.data() + 4] = v4.data();
60 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
61 const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
62 const typename V::AsArg v5)
64 m_data[m_indexes.data() + 0] = v0.data();
65 m_data[m_indexes.data() + 1] = v1.data();
66 m_data[m_indexes.data() + 2] = v2.data();
67 m_data[m_indexes.data() + 3] = v3.data();
68 m_data[m_indexes.data() + 4] = v4.data();
69 m_data[m_indexes.data() + 5] = v5.data();
71 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
72 const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
73 const typename V::AsArg v5, const typename V::AsArg v6)
75 m_data[m_indexes.data() + 0] = v0.data();
76 m_data[m_indexes.data() + 1] = v1.data();
77 m_data[m_indexes.data() + 2] = v2.data();
78 m_data[m_indexes.data() + 3] = v3.data();
79 m_data[m_indexes.data() + 4] = v4.data();
80 m_data[m_indexes.data() + 5] = v5.data();
81 m_data[m_indexes.data() + 6] = v6.data();
83 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
84 const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
85 const typename V::AsArg v5, const typename V::AsArg v6, const typename V::AsArg v7)
87 m_data[m_indexes.data() + 0] = v0.data();
88 m_data[m_indexes.data() + 1] = v1.data();
89 m_data[m_indexes.data() + 2] = v2.data();
90 m_data[m_indexes.data() + 3] = v3.data();
91 m_data[m_indexes.data() + 4] = v4.data();
92 m_data[m_indexes.data() + 5] = v5.data();
93 m_data[m_indexes.data() + 6] = v6.data();
94 m_data[m_indexes.data() + 7] = v7.data();
96 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1) const/*{{{*/
98 v0.data() = m_data[m_indexes.data() + 0];
99 v1.data() = m_data[m_indexes.data() + 1];
101 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2) const/*{{{*/
103 v0.data() = m_data[m_indexes.data() + 0];
104 v1.data() = m_data[m_indexes.data() + 1];
105 v2.data() = m_data[m_indexes.data() + 2];
107 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3) const/*{{{*/
109 v0.data() = m_data[m_indexes.data() + 0];
110 v1.data() = m_data[m_indexes.data() + 1];
111 v2.data() = m_data[m_indexes.data() + 2];
112 v3.data() = m_data[m_indexes.data() + 3];
114 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4) const/*{{{*/
116 v0.data() = m_data[m_indexes.data() + 0];
117 v1.data() = m_data[m_indexes.data() + 1];
118 v2.data() = m_data[m_indexes.data() + 2];
119 v3.data() = m_data[m_indexes.data() + 3];
120 v4.data() = m_data[m_indexes.data() + 4];
122 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4, V &v5) const/*{{{*/
124 v0.data() = m_data[m_indexes.data() + 0];
125 v1.data() = m_data[m_indexes.data() + 1];
126 v2.data() = m_data[m_indexes.data() + 2];
127 v3.data() = m_data[m_indexes.data() + 3];
128 v4.data() = m_data[m_indexes.data() + 4];
129 v5.data() = m_data[m_indexes.data() + 5];
131 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4, V &v5, V &v6) const/*{{{*/
133 v0.data() = m_data[m_indexes.data() + 0];
134 v1.data() = m_data[m_indexes.data() + 1];
135 v2.data() = m_data[m_indexes.data() + 2];
136 v3.data() = m_data[m_indexes.data() + 3];
137 v4.data() = m_data[m_indexes.data() + 4];
138 v5.data() = m_data[m_indexes.data() + 5];
139 v6.data() = m_data[m_indexes.data() + 6];
141 template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4, V &v5, V &v6, V &v7) const/*{{{*/
143 v0.data() = m_data[m_indexes.data() + 0];
144 v1.data() = m_data[m_indexes.data() + 1];
145 v2.data() = m_data[m_indexes.data() + 2];
146 v3.data() = m_data[m_indexes.data() + 3];
147 v4.data() = m_data[m_indexes.data() + 4];
148 v5.data() = m_data[m_indexes.data() + 5];
149 v6.data() = m_data[m_indexes.data() + 6];
150 v7.data() = m_data[m_indexes.data() + 7];
153 } // namespace Common
155 } // namespace AliRoot
156 #include "undomacros.h"
158 #endif // VC_SCALAR_INTERLEAVEDMEMORY_TCC
160 // vim: foldmethod=marker