File indexing completed on 2025-01-31 10:25:42
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef VC_SCALAR_DETAIL_H_
0029 #define VC_SCALAR_DETAIL_H_
0030
0031 #include "../common/detail.h"
0032 #include "macros.h"
0033
0034 namespace Vc_VERSIONED_NAMESPACE
0035 {
0036 namespace Detail
0037 {
0038
0039 template<typename V, size_t Size, size_t VSize> struct InterleaveImpl;
0040 template<typename V, size_t VSize> struct InterleaveImpl<V, 1, VSize> {
0041 template <typename I>
0042 static inline void interleave(typename V::EntryType *const data, const I &i,
0043 const typename V::AsArg v0, const typename V::AsArg v1)
0044 {
0045 data[i[0] + 0] = v0.data();
0046 data[i[0] + 1] = v1.data();
0047 }
0048 template <typename I>
0049 static inline void interleave(typename V::EntryType *const data, const I &i,
0050 const typename V::AsArg v0, const typename V::AsArg v1,
0051 const typename V::AsArg v2)
0052 {
0053 data[i[0] + 0] = v0.data();
0054 data[i[0] + 1] = v1.data();
0055 data[i[0] + 2] = v2.data();
0056 }
0057 template <typename I>
0058 static inline void interleave(typename V::EntryType *const data, const I &i,
0059 const typename V::AsArg v0, const typename V::AsArg v1,
0060 const typename V::AsArg v2, const typename V::AsArg v3)
0061 {
0062 data[i[0] + 0] = v0.data();
0063 data[i[0] + 1] = v1.data();
0064 data[i[0] + 2] = v2.data();
0065 data[i[0] + 3] = v3.data();
0066 }
0067 template <typename I>
0068 static inline void interleave(typename V::EntryType *const data, const I &i,
0069 const typename V::AsArg v0, const typename V::AsArg v1,
0070 const typename V::AsArg v2, const typename V::AsArg v3,
0071 const typename V::AsArg v4)
0072 {
0073 interleave(data, i, v0, v1, v2, v3);
0074 data[i[0] + 4] = v4.data();
0075 }
0076 template <typename I>
0077 static inline void interleave(typename V::EntryType *const data, const I &i,
0078 const typename V::AsArg v0, const typename V::AsArg v1,
0079 const typename V::AsArg v2, const typename V::AsArg v3,
0080 const typename V::AsArg v4, const typename V::AsArg v5)
0081 {
0082 interleave(data, i, v0, v1, v2, v3);
0083 interleave(data + 4, i, v4, v5);
0084 }
0085 template <typename I>
0086 static inline void interleave(typename V::EntryType *const data, const I &i,
0087 const typename V::AsArg v0, const typename V::AsArg v1,
0088 const typename V::AsArg v2, const typename V::AsArg v3,
0089 const typename V::AsArg v4, const typename V::AsArg v5,
0090 const typename V::AsArg v6)
0091 {
0092 interleave(data, i, v0, v1, v2, v3);
0093 interleave(data + 4, i, v4, v5, v6);
0094 }
0095 template <typename I>
0096 static inline void interleave(typename V::EntryType *const data, const I &i,
0097 const typename V::AsArg v0, const typename V::AsArg v1,
0098 const typename V::AsArg v2, const typename V::AsArg v3,
0099 const typename V::AsArg v4, const typename V::AsArg v5,
0100 const typename V::AsArg v6, const typename V::AsArg v7)
0101 {
0102 interleave(data, i, v0, v1, v2, v3);
0103 interleave(data + 4, i, v4, v5, v6, v7);
0104 }
0105
0106 template <typename I>
0107 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0108 V &v0, V &v1)
0109 {
0110 v0.data() = data[i[0] + 0];
0111 v1.data() = data[i[0] + 1];
0112 }
0113 template <typename I>
0114 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0115 V &v0, V &v1, V &v2)
0116 {
0117 v0.data() = data[i[0] + 0];
0118 v1.data() = data[i[0] + 1];
0119 v2.data() = data[i[0] + 2];
0120 }
0121 template <typename I>
0122 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0123 V &v0, V &v1, V &v2, V &v3)
0124 {
0125 v0.data() = data[i[0] + 0];
0126 v1.data() = data[i[0] + 1];
0127 v2.data() = data[i[0] + 2];
0128 v3.data() = data[i[0] + 3];
0129 }
0130 template <typename I>
0131 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0132 V &v0, V &v1, V &v2, V &v3, V &v4)
0133 {
0134 deinterleave(data, i, v0, v1, v2, v3);
0135 v4.data() = data[i[0] + 4];
0136 }
0137 template <typename I>
0138 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0139 V &v0, V &v1, V &v2, V &v3, V &v4, V &v5)
0140 {
0141 deinterleave(data, i, v0, v1, v2, v3);
0142 deinterleave(data + 4, i, v4, v5);
0143 }
0144 template <typename I>
0145 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0146 V &v0, V &v1, V &v2, V &v3, V &v4, V &v5, V &v6)
0147 {
0148 deinterleave(data, i, v0, v1, v2, v3);
0149 deinterleave(data + 4, i, v4, v5, v6);
0150 }
0151 template <typename I>
0152 static inline void deinterleave(typename V::EntryType const *const data, const I &i,
0153 V &v0, V &v1, V &v2, V &v3, V &v4, V &v5, V &v6,
0154 V &v7)
0155 {
0156 deinterleave(data, i, v0, v1, v2, v3);
0157 deinterleave(data + 4, i, v4, v5, v6, v7);
0158 }
0159 };
0160
0161 }
0162 }
0163
0164 #endif
0165
0166