20 #ifndef VC_AVX_SHUFFLE_H
21 #define VC_AVX_SHUFFLE_H
23 #include "../sse/shuffle.h"
46 return _mm256_permute2f128_ps(x, x,
L +
H * (1 << 4));
51 return _mm256_permute2f128_pd(x, x,
L +
H * (1 << 4));
56 return _mm256_permute2f128_si256(x, x,
L +
H * (1 << 4));
61 return _mm256_permute2f128_ps(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
66 return _mm256_permute2f128_si256(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
71 return _mm256_permute2f128_pd(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
76 return _mm256_permute_pd(x, Dst0 + Dst1 * 2 + (Dst2 -
X2) * 4 + (Dst3 -
X2) * 8);
81 return _mm256_permute_ps(x, Dst0 + Dst1 * 4 + Dst2 * 16 + Dst3 * 64);
84 return _mm256_castps_si256(permute<Dst0, Dst1, Dst2, Dst3>(_mm256_castsi256_ps(x)));
89 return _mm256_shuffle_pd(x, y, Dst0 + (Dst1 -
Y0) * 2 + (Dst2 -
X2) * 4 + (Dst3 -
Y2) * 8);
94 return _mm256_shuffle_ps(x, y, Dst0 + Dst1 * 4 + (Dst2 -
Y0) * 16 + (Dst3 -
Y0) * 64);
96 template<VecPos Dst0, VecPos Dst1, VecPos Dst2, VecPos Dst3, VecPos Dst4, VecPos Dst5, VecPos Dst6, VecPos Dst7>
106 return _mm256_blend_ps(x, y,
107 (Dst0 /
Y0) * 1 + (Dst1 /
Y1) * 2 +
108 (Dst2 /
Y2) * 4 + (Dst3 /
Y3) * 8 +
109 (Dst4 /
Y4) * 16 + (Dst5 /
Y5) * 32 +
110 (Dst6 /
Y6) * 64 + (Dst7 /
Y7) *128
113 template<VecPos Dst0, VecPos Dst1, VecPos Dst2, VecPos Dst3, VecPos Dst4, VecPos Dst5, VecPos Dst6, VecPos Dst7>
115 return _mm256_castps_si256(blend<Dst0, Dst1, Dst2, Dst3, Dst4, Dst5, Dst6, Dst7>(_mm256_castsi256_ps(x), _mm256_castsi256_ps(y)));
118 template<VecPos Dst0, VecPos Dst1, VecPos Dst2, VecPos Dst3, VecPos Dst4, VecPos Dst5, VecPos Dst6, VecPos Dst7>
128 if (Dst0 +
X4 == Dst4 && Dst1 +
X4 == Dst5 && Dst2 +
X4 == Dst6 && Dst3 +
X4 == Dst7) {
129 return permute<Dst0, Dst1, Dst2, Dst3>(
x);
131 const m128 loIn = _mm256_castps256_ps128(x);
132 const m128 hiIn = _mm256_extractf128_ps(x, 1);
135 if (Dst0 <
X4 && Dst1 <
X4 && Dst2 <
X4 && Dst3 <
X4) {
136 lo = _mm_permute_ps(loIn, Dst0 + Dst1 * 4 + Dst2 * 16 + Dst3 * 64);
137 }
else if (Dst0 >=
X4 && Dst1 >=
X4 && Dst2 >=
X4 && Dst3 >=
X4) {
138 lo = _mm_permute_ps(hiIn, Dst0 + Dst1 * 4 + Dst2 * 16 + Dst3 * 64);
139 }
else if (Dst0 <
X4 && Dst1 < X4 && Dst2 >=
X4 && Dst3 >=
X4) {
140 lo =
shuffle<Dst0, Dst1, Dst2 -
X4 +
Y0, Dst3 -
X4 + Y0>(loIn, hiIn);
141 }
else if (Dst0 >=
X4 && Dst1 >=
X4 && Dst2 <
X4 && Dst3 <
X4) {
142 lo =
shuffle<Dst0 -
X4, Dst1 -
X4, Dst2 +
Y0, Dst3 + Y0>(hiIn, loIn);
143 }
else if (Dst0 ==
X0 && Dst1 ==
X4 && Dst2 ==
X1 && Dst3 ==
X5) {
144 lo = _mm_unpacklo_ps(loIn, hiIn);
145 }
else if (Dst0 ==
X4 && Dst1 ==
X0 && Dst2 ==
X5 && Dst3 ==
X1) {
146 lo = _mm_unpacklo_ps(hiIn, loIn);
147 }
else if (Dst0 ==
X2 && Dst1 ==
X6 && Dst2 ==
X3 && Dst3 ==
X7) {
148 lo = _mm_unpackhi_ps(loIn, hiIn);
149 }
else if (Dst0 ==
X6 && Dst1 ==
X2 && Dst2 ==
X7 && Dst3 ==
X3) {
150 lo = _mm_unpackhi_ps(hiIn, loIn);
151 }
else if (Dst0 %
X4 == 0 && Dst1 %
X4 == 1 && Dst2 %
X4 == 2 && Dst3 %
X4 == 3) {
156 if (Dst4 >=
X4 && Dst5 >=
X4 && Dst6 >=
X4 && Dst7 >=
X4) {
157 hi = _mm_permute_ps(hiIn, (Dst4 -
X4) + (Dst5 -
X4) * 4 + (Dst6 -
X4) * 16 + (Dst7 -
X4) * 64);
158 }
else if (Dst4 <
X4 && Dst5 <
X4 && Dst6 <
X4 && Dst7 <
X4) {
159 hi = _mm_permute_ps(loIn, (Dst4 -
X4) + (Dst5 -
X4) * 4 + (Dst6 -
X4) * 16 + (Dst7 -
X4) * 64);
160 }
else if (Dst4 <
X4 && Dst5 < X4 && Dst6 >=
X4 && Dst7 >=
X4) {
161 hi =
shuffle<Dst4, Dst5, Dst6 -
X4 +
Y0, Dst7 -
X4 + Y0>(loIn, hiIn);
162 }
else if (Dst4 >=
X4 && Dst5 >=
X4 && Dst6 <
X4 && Dst7 <
X4) {
163 hi =
shuffle<Dst4 -
X4, Dst5 -
X4, Dst6 +
Y0, Dst7 + Y0>(hiIn, loIn);
164 }
else if (Dst4 ==
X0 && Dst5 ==
X4 && Dst6 ==
X1 && Dst7 ==
X5) {
165 hi = _mm_unpacklo_ps(loIn, hiIn);
166 }
else if (Dst4 ==
X4 && Dst5 ==
X0 && Dst6 ==
X5 && Dst7 ==
X1) {
167 hi = _mm_unpacklo_ps(hiIn, loIn);
168 }
else if (Dst4 ==
X2 && Dst5 ==
X6 && Dst6 ==
X3 && Dst7 ==
X7) {
169 hi = _mm_unpackhi_ps(loIn, hiIn);
170 }
else if (Dst4 ==
X6 && Dst5 ==
X2 && Dst6 ==
X7 && Dst7 ==
X3) {
171 hi = _mm_unpackhi_ps(hiIn, loIn);
172 }
else if (Dst4 %
X4 == 0 && Dst5 %
X4 == 1 && Dst6 %
X4 == 2 && Dst7 %
X4 == 3) {
177 return _mm256_insertf128_ps(_mm256_castps128_ps256(lo), hi, 1);
192 return _mm256_permute2f128_ps(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
197 return _mm256_permute2f128_si256(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
202 return _mm256_permute2f128_pd(x, y, (
L <
Y0 ?
L :
L -
Y0 + 2) + (
H <
Y0 ?
H :
H -
Y0 + 2) * (1 << 4));
207 return _mm256_permute_pd(x, Dst0 + Dst1 * 2 + (Dst2 -
X2) * 4 + (Dst3 -
X2) * 8);
212 return _mm256_permute_ps(x, Dst0 + Dst1 * 4 + Dst2 * 16 + Dst3 * 64);
217 return _mm_permute_pd(x, Dst0 + Dst1 * 2);
222 return _mm_permute_ps(x, Dst0 + Dst1 * 4 + Dst2 * 16 + Dst3 * 64);
227 return _mm256_shuffle_pd(x, y, Dst0 + (Dst1 -
Y0) * 2 + (Dst2 -
X2) * 4 + (Dst3 -
Y2) * 8);
232 return _mm256_shuffle_ps(x, y, Dst0 + Dst1 * 4 + (Dst2 -
Y0) * 16 + (Dst3 -
Y0) * 64);
239 #endif // VC_AVX_SHUFFLE_H
static Vc_ALWAYS_INLINE m256 Vc_CONST blend(param256 x, param256 y)
RooArgList L(const RooAbsArg &v1)
static Vc_ALWAYS_INLINE m256d Vc_CONST permute(param256d x)
static Vc_ALWAYS_INLINE m256d Vc_CONST permute(param256d x)
static Vc_ALWAYS_INLINE m256 Vc_CONST permute128(param256 x)
static Vc_ALWAYS_INLINE m256 Vc_CONST shuffle128(param256 x, param256 y)
static Vc_ALWAYS_INLINE m256d Vc_CONST shuffle(param256d x, param256d y)
static Vc_ALWAYS_INLINE m256d Vc_CONST shuffle(param256d x, param256d y)
#define VC_STATIC_ASSERT(cond, msg)
float type_of_call hi(const int &, const int &)
static Vc_ALWAYS_INLINE m256 Vc_CONST permute128(param256 x, param256 y)