1#ifndef VECCORE_BACKEND_VC_SIMDARRAY_H
2#define VECCORE_BACKEND_VC_SIMDARRAY_H
6template <
typename T,
size_t N>
10 static constexpr size_t Size = N;
13template <
typename T,
size_t N>
16 using MaskType =
typename Vc::SimdArray<T, N>::MaskType;
17 using IndexType =
typename Vc::SimdArray<T, N>::IndexType;
18 static constexpr size_t Size = N;
23template <
size_t N = 16>
26 using Real_v = Vc::SimdArray<Real_s, N>;
30 using Int_v = Vc::SimdArray<int, N>;
31 using Int16_v = Vc::SimdArray<int16_t, N>;
32 using Int32_v = Vc::SimdArray<int32_t, N>;
33 using Int64_v = Vc::SimdArray<int64_t, N>;
35 using UInt_v = Vc::SimdArray<unsigned int, N>;
43template <
typename T,
size_t N>
47 return mask.isEmpty();
50template <
typename T,
size_t N>
52bool MaskFull(
const Vc::SimdMaskArray<T, N> &mask)
57template <
typename T,
size_t N>
59 using M = Vc::SimdMaskArray<T, N>;
60 static inline bool Get(
const M &mask,
size_t i) {
return mask[i]; }
62 static inline void Set(
M &mask,
size_t i,
const bool val) { mask[i] = val; }
65template <
typename T,
size_t N>
67 using V = Vc::SimdArray<T, N>;
69 template <
typename S = Scalar<V>>
70 static inline void Load(
V &v, S
const *ptr)
75 template <
typename S = Scalar<V>>
76 static inline void Store(
V const &v, S *ptr)
82template <
typename T,
size_t N>
84 using M = Vc::SimdMaskArray<T, N>;
86 template <
typename S = Scalar<T>>
87 static inline void Load(
M &mask,
bool const *ptr)
92 template <
typename S = Scalar<T>>
93 static inline void Store(
M const &mask, S *ptr)
99template <
typename T,
size_t N>
101 using V = Vc::SimdArray<T, N>;
102 using M = Vc::SimdMaskArray<T, N>;
104 static inline void Assign(
V &dst,
M const &mask,
V const &src) { dst(mask) = src; }
106 static inline void Blend(
V &dst,
M const &mask,
V const &src1,
V const &src2)
113inline namespace math {
115template <
typename T,
size_t N>
117Vc::SimdArray<T, N>
CopySign(
const Vc::SimdArray<T, N> &x,
const Vc::SimdArray<T, N> &y)
119 return Vc::copysign(x, y);
122#define VC_MATH_UNARY_FUNCTION(F, f) \
123template <typename T, size_t N> \
124VECCORE_FORCE_INLINE \
125Vc::SimdArray<T, N> F(const Vc::SimdArray<T, N> &x) \
126{ return Vc::f(x); } \
144#undef VC_MATH_UNARY_FUNCTION
146template <
typename T,
size_t N>
148Vc::SimdArray<T, N>
Tan(
const Vc::SimdArray<T, N> &x)
150 Vc::SimdArray<T, N> s, c;
151 Vc::sincos(x, &s, &c);
155template <
typename T,
size_t N>
157Vc::SimdMaskArray<T, N>
IsInf(
const Vc::SimdArray<T, N> &x)
#define VECCORE_FORCE_INLINE
#define VC_MATH_UNARY_FUNCTION(F, f)
Vc::SimdArray< uint64_t, N > UInt64_v
Vc::SimdArray< Real_s, N > Real_v
Vc::SimdArray< double, N > Double_v
Vc::SimdArray< int32_t, N > Int32_v
Vc::SimdArray< unsigned int, N > UInt_v
Vc::SimdArray< int, N > Int_v
Vc::SimdArray< uint16_t, N > UInt16_v
Vc::SimdArray< uint32_t, N > UInt32_v
Vc::SimdArray< int64_t, N > Int64_v
Vc::SimdArray< float, N > Float_v
Vc::SimdArray< int16_t, N > Int16_v
VECCORE_FORCE_INLINE UME::SIMD::SIMDVecMask< N > IsInf(const UME::SIMD::SIMDVec_f< T, N > &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Rsqrt(const T &x)
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > CopySign(const Vc::SimdArray< T, N > &x, const Vc::SimdArray< T, N > &y)
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > Tan(const Vc::SimdArray< T, N > &x)
VECCORE_ATT_HOST_DEVICE bool MaskEmpty(const M &mask)
VECCORE_ATT_HOST_DEVICE bool MaskFull(const M &mask)
static bool Get(const M &mask, size_t i)
static void Set(M &mask, size_t i, const bool val)
Vc::SimdMaskArray< T, N > M
static void Store(V const &v, S *ptr)
static void Load(V &v, S const *ptr)
static void Store(M const &mask, S *ptr)
Vc::SimdMaskArray< T, N > M
static void Load(M &mask, bool const *ptr)
static void Blend(V &dst, M const &mask, V const &src1, V const &src2)
static void Assign(V &dst, M const &mask, V const &src)
Vc::SimdMaskArray< T, N > M
typename Vc::SimdArray< T, N >::MaskType MaskType
typename Vc::SimdArray< T, N >::IndexType IndexType
static constexpr size_t Size