20 #ifndef SSE_VECTORHELPER_H
21 #define SSE_VECTORHELPER_H
37 __m128i tmp = _mm_srli_epi32(_mm_castps_si128(v), 23);
38 tmp = _mm_sub_epi32(tmp, _mm_set1_epi32(0x7f));
39 return _mm_cvtepi32_ps(tmp);
43 __m128i tmp0 = _mm_srli_epi32(_mm_castps_si128(v[0]), 23);
44 __m128i tmp1 = _mm_srli_epi32(_mm_castps_si128(v[1]), 23);
45 tmp0 = _mm_sub_epi32(tmp0, _mm_set1_epi32(0x7f));
46 tmp1 = _mm_sub_epi32(tmp1, _mm_set1_epi32(0x7f));
47 return M256::create( _mm_cvtepi32_ps(tmp0), _mm_cvtepi32_ps(tmp1));
51 __m128i tmp = _mm_srli_epi64(_mm_castpd_si128(v), 52);
52 tmp = _mm_sub_epi32(tmp, _mm_set1_epi32(0x3ff));
53 return _mm_cvtepi32_pd(_mm_shuffle_epi32(tmp, 0x08));
57 template<
typename VectorType,
unsigned int Size>
struct SortHelper
66 #define OP0(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name() { return code; }
67 #define OP2(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name(VectorTypeArg a, VectorTypeArg b) { return code; }
68 #define OP3(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name(VectorTypeArg a, VectorTypeArg b, VectorTypeArg c) { return code; }
72 #ifdef VC_PASSING_VECTOR_BY_VALUE_IS_BROKEN
73 typedef const VectorType &VectorTypeArg;
87 OP0(allone, VectorType::create(_mm_setallone_ps(), _mm_setallone_ps()))
88 OP0(zero, VectorType::create(_mm_setzero_ps(), _mm_setzero_ps()))
89 OP2(or_, VectorType::create(_mm_or_ps(a[0], b[0]), _mm_or_ps(a[1], b[1])))
90 OP2(xor_, VectorType::create(_mm_xor_ps(a[0], b[0]), _mm_xor_ps(a[1], b[1])))
91 OP2(and_, VectorType::create(_mm_and_ps(a[0], b[0]), _mm_and_ps(a[1], b[1])))
92 OP2(andnot_, VectorType::create(_mm_andnot_ps(a[0], b[0]), _mm_andnot_ps(a[1], b[1])))
99 #define OP0(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name() { return code; }
100 #define OP1(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name(const VectorType a) { return code; }
101 #define OP2(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name(const VectorType a, const VectorType b) { return code; }
102 #define OP3(name, code) static Vc_ALWAYS_INLINE Vc_CONST VectorType name(const VectorType a, const VectorType b, const VectorType c) { return code; }
117 OP0(allone, _mm_setallone_ps())
118 OP0(zero, _mm_setzero_ps())
119 OP2(or_, _mm_or_ps(a, b))
120 OP2(xor_, _mm_xor_ps(a, b))
121 OP2(and_, _mm_and_ps(a, b))
122 OP2(andnot_, _mm_andnot_ps(a, b))
141 OP0(zero, _mm_setzero_pd())
142 OP2(or_, _mm_or_pd(a, b))
143 OP2(xor_, _mm_xor_pd(a, b))
144 OP2(and_, _mm_and_pd(a, b))
145 OP2(andnot_, _mm_andnot_pd(a, b))
166 OP0(zero, _mm_setzero_si128())
167 OP2(or_, _mm_or_si128(a, b))
168 OP2(xor_, _mm_xor_si128(a, b))
169 OP2(and_, _mm_and_si128(a, b))
170 OP2(andnot_, _mm_andnot_si128(a, b))
179 static Vc_ALWAYS_INLINE Vc_CONST VectorType op(const VectorType a) { return CAT(_mm_##op##_, SUFFIX)(a); }
181 static Vc_ALWAYS_INLINE Vc_CONST VectorType op(const VectorType a, const VectorType b) { return CAT(_mm_##op##_ , SUFFIX)(a, b); }
183 static Vc_ALWAYS_INLINE Vc_CONST VectorType op(const VectorType a, const VectorType b) { return CAT(_mm_##op , SUFFIX)(a, b); }
184 #define OPx(op, op2) \
185 static Vc_ALWAYS_INLINE Vc_CONST VectorType op(const VectorType a, const VectorType b) { return CAT(_mm_##op2##_, SUFFIX)(a, b); }
187 static Vc_ALWAYS_INLINE Vc_CONST VectorType cmp##op(const VectorType a, const VectorType b) { return CAT(_mm_cmp##op##_, SUFFIX)(a, b); }
188 #define OP_CAST_(op) \
189 static Vc_ALWAYS_INLINE Vc_CONST VectorType op(const VectorType a, const VectorType b) { return CAT(_mm_castps_, SUFFIX)( \
190 _mm_##op##ps(CAT(CAT(_mm_cast, SUFFIX), _ps)(a), \
191 CAT(CAT(_mm_cast, SUFFIX), _ps)(b))); \
194 static Vc_ALWAYS_INLINE Vc_CONST VectorType min(VectorType a, VectorType b) { return CAT(_mm_min_, SUFFIX)(a, b); } \
195 static Vc_ALWAYS_INLINE Vc_CONST VectorType max(VectorType a, VectorType b) { return CAT(_mm_max_, SUFFIX)(a, b); }
211 v1 = _mm_macc_pd(v1, v2, v3);
214 static inline void fma(VectorType &
v1, VectorType v2, VectorType v3) {
215 VectorType
h1 = _mm_and_pd(v1, _mm_load_pd(reinterpret_cast<const double *>(&c_general::highMaskDouble)));
216 VectorType h2 = _mm_and_pd(v2, _mm_load_pd(reinterpret_cast<const double *>(&c_general::highMaskDouble)));
217 #if defined(VC_GCC) && VC_GCC < 0x40703
220 asm(
"":
"+x"(
h1),
"+x"(h2));
222 const VectorType l1 = _mm_sub_pd(v1, h1);
223 const VectorType l2 = _mm_sub_pd(v2, h2);
224 const VectorType ll = mul(l1, l2);
225 const VectorType lh = add(mul(l1, h2), mul(h1, l2));
226 const VectorType hh = mul(h1, h2);
228 const VectorType lh_lt_v3 = cmplt(
abs(lh),
abs(v3));
231 v1 = add(add(ll, b), add(c, hh));
242 return _mm_div_pd(one(),
sqrt(x));
245 return _mm_div_pd(one(), x);
248 return _mm_cmpunord_pd(x, x);
251 return _mm_cmpord_pd(x, _mm_mul_pd(zero(), x));
259 a = _mm_min_sd(a, _mm_unpackhi_pd(a, a));
260 return _mm_cvtsd_f64(a);
263 a = _mm_max_sd(a, _mm_unpackhi_pd(a, a));
264 return _mm_cvtsd_f64(a);
267 a = _mm_mul_sd(a, _mm_shuffle_pd(a, a, _MM_SHUFFLE2(0, 1)));
268 return _mm_cvtsd_f64(a);
271 a = _mm_add_sd(a, _mm_shuffle_pd(a, a, _MM_SHUFFLE2(0, 1)));
272 return _mm_cvtsd_f64(a);
276 #ifdef VC_IMPL_SSE4_1
277 return _mm_round_pd(a, _MM_FROUND_NINT);
280 return _mm_cvtepi32_pd(_mm_cvtpd_epi32(a));
300 v1 = _mm_macc_ps(v1, v2, v3);
303 static inline void fma(VectorType &
v1, VectorType v2, VectorType v3) {
304 __m128d v1_0 = _mm_cvtps_pd(v1);
305 __m128d v1_1 = _mm_cvtps_pd(_mm_movehl_ps(v1, v1));
306 __m128d v2_0 = _mm_cvtps_pd(v2);
307 __m128d v2_1 = _mm_cvtps_pd(_mm_movehl_ps(v2, v2));
308 __m128d v3_0 = _mm_cvtps_pd(v3);
309 __m128d v3_1 = _mm_cvtps_pd(_mm_movehl_ps(v3, v3));
311 _mm_cvtpd_ps(_mm_add_pd(_mm_mul_pd(v1_0, v2_0), v3_0)),
312 _mm_cvtpd_ps(_mm_add_pd(_mm_mul_pd(v1_1, v2_1), v3_1)));
323 return _mm_cmpunord_ps(x, x);
326 return _mm_cmpord_ps(x, _mm_mul_ps(zero(), x));
329 return _mm_rcp_ps(x);
337 a = _mm_min_ps(a, _mm_movehl_ps(a, a));
338 a = _mm_min_ss(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
339 return _mm_cvtss_f32(a);
342 a = _mm_max_ps(a, _mm_movehl_ps(a, a));
343 a = _mm_max_ss(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
344 return _mm_cvtss_f32(a);
347 a = _mm_mul_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 2, 3)));
348 a = _mm_mul_ss(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 0, 1)));
349 return _mm_cvtss_f32(a);
352 a = _mm_add_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 2, 3)));
353 a = _mm_add_ss(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 0, 1)));
354 return _mm_cvtss_f32(a);
358 #ifdef VC_IMPL_SSE4_1
359 return _mm_round_ps(a, _MM_FROUND_NINT);
362 return _mm_cvtepi32_ps(_mm_cvtps_epi32(a));
370 #ifdef VC_PASSING_VECTOR_BY_VALUE_IS_BROKEN
371 typedef const VectorType &VectorTypeArg;
377 const _M128 x = _mm_set1_ps(a);
378 return VectorType::create(x, x);
381 const _M128 x = _mm_set_ps(a, b, c, d);
382 return VectorType::create(x, x);
385 const float e,
const float f,
const float g,
const float h) {
386 return VectorType::create(_mm_set_ps(a, b, c, d), _mm_set_ps(e, f, g, h));
391 #define REUSE_FLOAT_IMPL1(fun) \
392 static Vc_ALWAYS_INLINE Vc_CONST VectorType fun(VectorTypeArg x) { \
393 return VectorType::create(VectorHelper<float>::fun(x[0]), VectorHelper<float>::fun(x[1])); \
395 #define REUSE_FLOAT_IMPL2(fun) \
396 static Vc_ALWAYS_INLINE Vc_CONST VectorType fun(VectorTypeArg x, VectorTypeArg y) { \
397 return VectorType::create(VectorHelper<float>::fun(x[0], y[0]), VectorHelper<float>::fun(x[1], y[1])); \
436 static inline void fma(VectorType &a, VectorTypeArg b, VectorTypeArg c) {
440 #undef REUSE_FLOAT_IMPL2
441 #undef REUSE_FLOAT_IMPL1
472 a =
min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
474 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
475 return _mm_cvtsi128_si32(a);
478 a =
max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
480 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
481 return _mm_cvtsi128_si32(a);
484 a = add(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
485 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
486 return _mm_cvtsi128_si32(a);
488 #ifdef VC_IMPL_SSE4_1
491 a = mul(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
492 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
493 return _mm_cvtsi128_si32(a);
496 static inline Vc_CONST VectorType
mul(
const VectorType a,
const VectorType b) {
497 const VectorType aShift = _mm_srli_si128(a, 4);
498 const VectorType ab02 = _mm_mul_epu32(a, b);
499 const VectorType bShift = _mm_srli_si128(b, 4);
500 const VectorType ab13 = _mm_mul_epu32(aShift, bShift);
501 return _mm_unpacklo_epi32(_mm_shuffle_epi32(ab02, 8), _mm_shuffle_epi32(ab13, 8));
532 a =
min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
534 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
535 return _mm_cvtsi128_si32(a);
538 a =
max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
540 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
541 return _mm_cvtsi128_si32(a);
544 a = mul(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
546 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
547 return _mm_cvtsi128_si32(a);
550 a = add(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
552 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
553 return _mm_cvtsi128_si32(a);
595 #ifndef USE_INCORRECT_UNSIGNED_COMPARE
638 const EntryType e,
const EntryType
f,
const EntryType
g,
const EntryType
h) {
643 v1 = add(mul(v1, v2), v3); }
651 a =
min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
652 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
653 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
654 return _mm_cvtsi128_si32(a);
658 a =
max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
659 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
660 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
661 return _mm_cvtsi128_si32(a);
664 a = mul(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
665 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
666 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
667 return _mm_cvtsi128_si32(a);
670 a = add(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
671 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
672 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
673 return _mm_cvtsi128_si32(a);
695 #ifdef VC_IMPL_SSE4_1
726 #if !defined(USE_INCORRECT_UNSIGNED_COMPARE) || VC_IMPL_SSE4_1
742 #if defined(USE_INCORRECT_UNSIGNED_COMPARE) && !defined(VC_IMPL_SSE4_1)
747 a =
min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
748 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
749 a =
min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
750 return _mm_cvtsi128_si32(a);
754 a =
max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
755 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
756 a =
max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
757 return _mm_cvtsi128_si32(a);
761 a = mul(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
762 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
763 a = mul(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
764 return _mm_cvtsi128_si32(a);
768 a = add(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)));
769 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)));
770 a = add(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)));
771 return _mm_cvtsi128_si32(a);
775 const EntryType d,
const EntryType e,
const EntryType
f,
776 const EntryType
g,
const EntryType
h) {
784 #ifndef USE_INCORRECT_UNSIGNED_COMPARE
811 #include "vectorhelper.tcc"
814 #endif // SSE_VECTORHELPER_H
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnle(const VectorType a, const VectorType b)
static Vc_INTRINSIC Vc_CONST VectorType abs(const VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType notMaskedToZero(VectorType a, _M128 mask)
static Vc_ALWAYS_INLINE Vc_CONST VectorType mul(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorType a)
static Vc_CONST_L VectorType sort(VectorType) Vc_CONST_R
OP_CAST_(or_) OP_CAST_(and_) OP_CAST_(xor_) static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_CONST _M128I concat(_M128I a, _M128I b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const float a, const float b, const float c, const float d)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
Vc_INTRINSIC Vc_CONST __m128 exponent(__m128 v)
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
static Vc_ALWAYS_INLINE Vc_CONST _M128I expand0(_M128I x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpgt(const VectorType a, const VectorType b)
OP_CAST_(or_) OP_CAST_(and_) OP_CAST_(xor_) static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
Small helper to encapsulate whether to return the value pointed to by the iterator or its address...
static Vc_ALWAYS_INLINE Vc_CONST _M128I concat(_M128I a, _M128I b)
static Vc_ALWAYS_INLINE Vc_PURE Vector< T > sqrt(const Vector< T > &x)
Namespace for new ROOT classes and functions.
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const EntryType a, const EntryType b, const EntryType c, const EntryType d, const EntryType e, const EntryType f, const EntryType g, const EntryType h)
static MINMAX Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
OPx(mul, mullo) static Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
OP_(or_) OP_(and_) OP_(xor_) static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftLeft(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_PURE int_v min(const int_v &x, const int_v &y)
static void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmplt(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST _M128I expand1(_M128I x)
static Vc_INTRINSIC Vc_CONST VectorType min(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType reciprocal(VectorType x)
static void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_INTRINSIC __m128d Vc_CONST _mm_setallone_pd()
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const EntryType a, const EntryType b, const EntryType c, const EntryType d, const EntryType e, const EntryType f, const EntryType g, const EntryType h)
StreamingAndUnalignedFlag
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const EntryType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftRight(VectorType a, int shift)
static Vc_INTRINSIC Vc_CONST M256 create(_M128 a, _M128 b)
static void fma(VectorType &a, VectorTypeArg b, VectorTypeArg c)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorTypeArg a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftRight(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const float a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnlt(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorType a)
static Vc_ALWAYS_INLINE void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_INTRINSIC __m128i Vc_CONST _mm_cmplt_epu16(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE Vc_CONST _M128I expand0(_M128I x)
static Vc_INTRINSIC __m128i Vc_CONST mm_max_epu32(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorTypeArg a)
OP(add) OP(sub) OP(mul) OPcmp(eq) OPcmp(neq) OPcmp(lt) OPcmp(nlt) OPcmp(le) OPcmp(nle) OP1(sqrt) OP1(rsqrt) static Vc_ALWAYS_INLINE Vc_CONST VectorType isNaN(VectorType x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_PURE Vector< T > abs(const Vector< T > &x)
static Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
static Vc_INTRINSIC Vc_CONST VectorType max(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_INTRINSIC __m128i Vc_CONST _mm_setallone_si128()
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftRight(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftLeft(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST _M128I expand1(_M128I x)
Vc_INTRINSIC Vc_CONST m256 concat(param128 a, param128 b)
static Vc_INTRINSIC Vc_CONST VectorType max(const VectorType a, const VectorType b)
static Vc_INTRINSIC __m128i Vc_CONST mm_abs_epi32(__m128i a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType abs(const VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType notMaskedToZero(VectorType a, _M128 mask)
static Vc_INTRINSIC __m128i mm_blendv_epi8(__m128i a, __m128i b, __m128i c)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmplt(const VectorType a, const VectorType b)
const VectorType VectorTypeArg
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const int a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const EntryType a)
static Vc_ALWAYS_INLINE Vc_PURE Vector< T > round(const Vector< T > &x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
static Vc_INTRINSIC __m128i Vc_CONST _mm_cmpgt_epu16(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType isFinite(VectorType x)
const VectorType VectorTypeArg
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorType a)
static Vc_INTRINSIC __m128i Vc_CONST mm_abs_epi16(__m128i a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorTypeArg a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType mul(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const double a, const double b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
#define VC_ALIGNED_PARAMETER(_Type)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
static Vc_INTRINSIC Vc_CONST VectorType min(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType isFinite(VectorType x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmple(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const unsigned int a, const unsigned int b, const unsigned int c, const unsigned int d)
static Vc_ALWAYS_INLINE Vc_CONST VectorType reciprocal(VectorType x)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
static Vc_INTRINSIC __m128d mm_blendv_pd(__m128d a, __m128d b, __m128d c)
static Vc_INTRINSIC __m128i Vc_CONST _mm_cmplt_epu32(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE Vc_PURE Vector< T > rsqrt(const Vector< T > &x)
static MINMAX Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const float a, const float b, const float c, const float d, const float e, const float f, const float g, const float h)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnle(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_PURE Vector< T > reciprocal(const Vector< T > &x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpgt(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_PURE int_v max(const int_v &x, const int_v &y)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const unsigned int a)
static Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmple(const VectorType a, const VectorType b)
static Vc_INTRINSIC __m128i Vc_CONST mm_min_epi32(__m128i a, __m128i b)
static Vc_CONST VectorType mul(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmple(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const float a, const float b, const float c, const float d)
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
#define Vc_ALWAYS_INLINE_L
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const int a, const int b, const int c, const int d)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
static Vc_INTRINSIC Vc_CONST VectorType abs(const VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType abs(const VectorType a)
static Vc_INTRINSIC __m128i Vc_CONST mm_min_epu32(__m128i a, __m128i b)
static Vc_INTRINSIC __m128d Vc_CONST _mm_setabsmask_pd()
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnlt(const VectorType a, const VectorType b)
static Vc_INTRINSIC Vc_CONST VectorType min(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
static Vc_ALWAYS_INLINE Vc_CONST EntryType max(VectorType a)
OP(add) OP(sub) OP(mul) OPcmp(eq) OPcmp(neq) OPcmp(lt) OPcmp(nlt) OPcmp(le) OPcmp(nle) static Vc_ALWAYS_INLINE Vc_CONST VectorType rsqrt(VectorType x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const double a)
static Vc_INTRINSIC __m128 mm_blendv_ps(__m128 a, __m128 b, __m128 c)
OPx(mul, mullo) OP(min) OP(max) static Vc_ALWAYS_INLINE Vc_CONST EntryType min(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnlt(const VectorType a, const VectorType b)
static Vc_INTRINSIC Vc_CONST VectorType max(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmple(const VectorType a, const VectorType b)
OP_(or_) OP_(and_) OP_(xor_) static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_CONST VectorType isNaN(VectorType x)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftRight(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnlt(const VectorType a, const VectorType b)
static Vc_INTRINSIC __m128i Vc_CONST mm_max_epi32(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
static Vc_INTRINSIC __m128i Vc_CONST _mm_cmpgt_epu32(__m128i a, __m128i b)
static Vc_ALWAYS_INLINE void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_ALWAYS_INLINE Vc_CONST VectorType notMaskedToZero(VectorType a, _M128 mask)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnle(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftLeft(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST VectorType zero()
static Vc_ALWAYS_INLINE Vc_CONST EntryType add(VectorType a)
static Vc_ALWAYS_INLINE void fma(VectorType &v1, VectorType v2, VectorType v3)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
static Vc_ALWAYS_INLINE Vc_CONST VectorType notMaskedToZero(VectorType a, _M128 mask)
static Vc_ALWAYS_INLINE Vc_CONST VectorType round(VectorType a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType cmpnle(const VectorType a, const VectorType b)
static Vc_ALWAYS_INLINE Vc_CONST VectorType set(const float a)
static Vc_ALWAYS_INLINE Vc_CONST VectorType shiftLeft(VectorType a, int shift)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
static Vc_INTRINSIC __m128 Vc_CONST _mm_setabsmask_ps()
static Vc_ALWAYS_INLINE Vc_CONST _M128 concat(_M128D a, _M128D b)
#define REUSE_FLOAT_IMPL1(fun)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()
#define REUSE_FLOAT_IMPL2(fun)
static Vc_ALWAYS_INLINE Vc_CONST VectorType one()