Back to home page

EIC code displayed by LXR

 
 

    


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 } // namespace backend
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 } // namespace vecCore
0093 
0094 #endif