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
29
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
30
const typename V::AsArg v1)
32
m_data[m_indexes.data() + 0] = v0.data();
33
m_data[m_indexes.data() + 1] = v1.data();
35
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
36
const typename V::AsArg v1, const typename V::AsArg v2)
38
m_data[m_indexes.data() + 0] = v0.data();
39
m_data[m_indexes.data() + 1] = v1.data();
40
m_data[m_indexes.data() + 2] = v2.data();
42
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
43
const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3)
45
m_data[m_indexes.data() + 0] = v0.data();
46
m_data[m_indexes.data() + 1] = v1.data();
47
m_data[m_indexes.data() + 2] = v2.data();
48
m_data[m_indexes.data() + 3] = v3.data();
50
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
51
const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4)
53
m_data[m_indexes.data() + 0] = v0.data();
54
m_data[m_indexes.data() + 1] = v1.data();
55
m_data[m_indexes.data() + 2] = v2.data();
56
m_data[m_indexes.data() + 3] = v3.data();
57
m_data[m_indexes.data() + 4] = v4.data();
59
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
60
const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
61
const typename V::AsArg v5)
63
m_data[m_indexes.data() + 0] = v0.data();
64
m_data[m_indexes.data() + 1] = v1.data();
65
m_data[m_indexes.data() + 2] = v2.data();
66
m_data[m_indexes.data() + 3] = v3.data();
67
m_data[m_indexes.data() + 4] = v4.data();
68
m_data[m_indexes.data() + 5] = v5.data();
70
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
71
const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
72
const typename V::AsArg v5, const typename V::AsArg v6)
74
m_data[m_indexes.data() + 0] = v0.data();
75
m_data[m_indexes.data() + 1] = v1.data();
76
m_data[m_indexes.data() + 2] = v2.data();
77
m_data[m_indexes.data() + 3] = v3.data();
78
m_data[m_indexes.data() + 4] = v4.data();
79
m_data[m_indexes.data() + 5] = v5.data();
80
m_data[m_indexes.data() + 6] = v6.data();
82
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::interleave(const typename V::AsArg v0,/*{{{*/
83
const typename V::AsArg v1, const typename V::AsArg v2, const typename V::AsArg v3, const typename V::AsArg v4,
84
const typename V::AsArg v5, const typename V::AsArg v6, const typename V::AsArg v7)
86
m_data[m_indexes.data() + 0] = v0.data();
87
m_data[m_indexes.data() + 1] = v1.data();
88
m_data[m_indexes.data() + 2] = v2.data();
89
m_data[m_indexes.data() + 3] = v3.data();
90
m_data[m_indexes.data() + 4] = v4.data();
91
m_data[m_indexes.data() + 5] = v5.data();
92
m_data[m_indexes.data() + 6] = v6.data();
93
m_data[m_indexes.data() + 7] = v7.data();
95
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1) const/*{{{*/
97
v0.data() = m_data[m_indexes.data() + 0];
98
v1.data() = m_data[m_indexes.data() + 1];
100
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2) const/*{{{*/
102
v0.data() = m_data[m_indexes.data() + 0];
103
v1.data() = m_data[m_indexes.data() + 1];
104
v2.data() = m_data[m_indexes.data() + 2];
106
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3) const/*{{{*/
108
v0.data() = m_data[m_indexes.data() + 0];
109
v1.data() = m_data[m_indexes.data() + 1];
110
v2.data() = m_data[m_indexes.data() + 2];
111
v3.data() = m_data[m_indexes.data() + 3];
113
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4) const/*{{{*/
115
v0.data() = m_data[m_indexes.data() + 0];
116
v1.data() = m_data[m_indexes.data() + 1];
117
v2.data() = m_data[m_indexes.data() + 2];
118
v3.data() = m_data[m_indexes.data() + 3];
119
v4.data() = m_data[m_indexes.data() + 4];
121
template<typename V> Vc_ALWAYS_INLINE void InterleavedMemoryAccessBase<V>::deinterleave(V &v0, V &v1, V &v2, V &v3, V &v4, V &v5) const/*{{{*/
123
v0.data() = m_data[m_indexes.data() + 0];
124
v1.data() = m_data[m_indexes.data() + 1];
125
v2.data() = m_data[m_indexes.data() + 2];
126
v3.data() = m_data[m_indexes.data() + 3];
127
v4.data() = m_data[m_indexes.data() + 4];
128
v5.data() = m_data[m_indexes.data() + 5];
130
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/*{{{*/
132
v0.data() = m_data[m_indexes.data() + 0];
133
v1.data() = m_data[m_indexes.data() + 1];
134
v2.data() = m_data[m_indexes.data() + 2];
135
v3.data() = m_data[m_indexes.data() + 3];
136
v4.data() = m_data[m_indexes.data() + 4];
137
v5.data() = m_data[m_indexes.data() + 5];
138
v6.data() = m_data[m_indexes.data() + 6];
140
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/*{{{*/
142
v0.data() = m_data[m_indexes.data() + 0];
143
v1.data() = m_data[m_indexes.data() + 1];
144
v2.data() = m_data[m_indexes.data() + 2];
145
v3.data() = m_data[m_indexes.data() + 3];
146
v4.data() = m_data[m_indexes.data() + 4];
147
v5.data() = m_data[m_indexes.data() + 5];
148
v6.data() = m_data[m_indexes.data() + 6];
149
v7.data() = m_data[m_indexes.data() + 7];
152
} // namespace Common
154
#include "undomacros.h"
156
#endif // VC_SCALAR_INTERLEAVEDMEMORY_TCC
158
// vim: foldmethod=marker