File indexing completed on 2025-03-13 09:29:07
0001 #ifndef VECCORE_BACKEND_VC_SCALAR_H
0002 #define VECCORE_BACKEND_VC_SCALAR_H
0003
0004 namespace vecCore {
0005
0006 template <typename T>
0007 struct TypeTraits<Vc::Scalar::Mask<T>> {
0008 using IndexType = size_t;
0009 using ScalarType = bool;
0010 static constexpr size_t Size = 1;
0011 };
0012
0013 template <typename T>
0014 struct TypeTraits<Vc::Scalar::Vector<T>> {
0015 using ScalarType = T;
0016 using MaskType = typename Vc::Scalar::Vector<T>::MaskType;
0017 using IndexType = typename Vc::Scalar::Vector<T>::IndexType;
0018 static constexpr size_t Size = 1;
0019 };
0020
0021 namespace backend {
0022
0023 template <typename T = Real_s>
0024 class VcScalarT {
0025 public:
0026 using Real_v = Vc::Scalar::Vector<T>;
0027 using Float_v = Vc::Scalar::Vector<float>;
0028 using Double_v = Vc::Scalar::Vector<double>;
0029
0030 using Int_v = Vc::Scalar::Vector<int>;
0031 using Int16_v = Vc::Scalar::Vector<int16_t>;
0032 using Int32_v = Vc::Scalar::Vector<int32_t>;
0033 using Int64_v = Vc::Scalar::Vector<int64_t>;
0034
0035 using UInt_v = Vc::Scalar::Vector<unsigned int>;
0036 using UInt16_v = Vc::Scalar::Vector<uint16_t>;
0037 using UInt32_v = Vc::Scalar::Vector<uint32_t>;
0038 using UInt64_v = Vc::Scalar::Vector<uint64_t>;
0039 };
0040
0041 using VcScalar = VcScalarT<>;
0042
0043 }
0044
0045 template <typename T>
0046 VECCORE_FORCE_INLINE
0047 bool MaskEmpty(const Vc::Scalar::Mask<T> &mask)
0048 {
0049 return mask.isEmpty();
0050 }
0051
0052 template <typename T>
0053 VECCORE_FORCE_INLINE
0054 bool MaskFull(const Vc::Scalar::Mask<T> &mask)
0055 {
0056 return mask.isFull();
0057 }
0058
0059 template <typename T>
0060 struct IndexingImplementation<Vc::Scalar::Mask<T>> {
0061 using M = Vc::Scalar::Mask<T>;
0062 static inline bool Get(const M &mask, size_t i) { return mask[i]; }
0063
0064 static inline void Set(M &mask, size_t i, const bool val) { mask[i] = val; }
0065 };
0066
0067 template <typename T>
0068 struct MaskingImplementation<Vc::Scalar::Vector<T>> {
0069 using M = Vc::Scalar::Mask<T>;
0070 using V = Vc::Scalar::Vector<T>;
0071
0072 static inline void Assign(V &dst, M const &mask, V const &src) { dst(mask) = src; }
0073
0074 static inline void Blend(V &dst, M const &mask, V const &src1, V const src2)
0075 {
0076 dst = src2;
0077 dst(mask) = src1;
0078 }
0079 };
0080
0081 inline namespace math {
0082
0083 template <typename T>
0084 VECCORE_FORCE_INLINE
0085 Vc::Scalar::Mask<T> IsInf(const Vc::Scalar::Vector<T> &x)
0086 {
0087 return Vc::isinf(x);
0088 }
0089
0090 }
0091
0092 }
0093
0094 #endif