36#ifndef NEKTAR_LIB_LIBUTILITES_SIMDLIB_SCALAR_H
37#define NEKTAR_LIB_LIBUTILITES_SIMDLIB_SCALAR_H
52template <
typename scalarType>
struct scalar
62 typename =
typename std::enable_if<std::is_arithmetic_v<T>>::type>
100template <>
struct scalar<size_t>
111 static constexpr unsigned int width = 1;
158 template <
typename U,
159 typename =
typename std::enable_if<std::is_integral_v<U>>::type>
165 template <
typename U,
166 typename =
typename std::enable_if<std::is_integral_v<U>>::type>
218template <
typename T,
typename U,
219 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
222 return lhs + rhs.
_data;
224template <
typename T,
typename U,
225 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
228 return lhs.
_data + rhs;
236template <
typename T,
typename U,
237 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
240 return lhs - rhs.
_data;
242template <
typename T,
typename U,
243 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
246 return lhs.
_data - rhs;
254template <
typename T,
typename U,
255 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
258 return lhs * rhs.
_data;
260template <
typename T,
typename U,
261 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
264 return lhs.
_data * rhs;
272template <
typename T,
typename U,
273 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
276 return lhs / rhs.
_data;
278template <
typename T,
typename U,
279 typename =
typename std::enable_if<std::is_arithmetic_v<U>>::type>
282 return lhs.
_data / rhs;
301 const T *in,
const size_t dataLen,
304 for (
size_t i = 0; i < dataLen; ++i)
314 for (
size_t i = 0; i < dataLen; ++i)
323 const size_t dataLen, T *out)
325 for (
size_t i = 0; i < dataLen; ++i)
327 out[i] = in[i]._data;
334 const size_t dataLen, T *out)
336 for (
size_t i = 0; i < dataLen; ++i)
338 out[i] = in[i]._data;
391 return lhs.
_data && rhs;
void load_interleave(const T *in, const size_t dataLen, std::vector< scalarT< T >, allocator< scalarT< T > > > &out)
scalarT< T > abs(scalarT< T > in)
void deinterleave_unalign_store(const std::vector< scalarT< T >, allocator< scalarT< T > > > &in, const size_t dataLen, T *out)
scalarT< T > operator-(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > operator/(scalarT< T > lhs, scalarT< T > rhs)
boost::alignment::aligned_allocator< T, T::alignment > allocator
scalarT< T > log(scalarT< T > in)
scalarT< T > operator*(scalarT< T > lhs, scalarT< T > rhs)
scalarMask operator>(scalarT< double > lhs, scalarT< double > rhs)
bool operator&&(scalarMask lhs, bool rhs)
void load_unalign_interleave(const T *in, const size_t dataLen, std::vector< scalarT< T >, allocator< scalarT< T > > > &out)
void deinterleave_store(const std::vector< scalarT< T >, allocator< scalarT< T > > > &in, const size_t dataLen, T *out)
scalarT< T > sqrt(scalarT< T > in)
scalarT< T > operator+(scalarT< T > lhs, scalarT< T > rhs)
static constexpr scalarType false_v
void load(const std::uint32_t *p)
void store(std::uint32_t *p) const
static constexpr scalarType true_v
void store(scalarType *p) const
scalarT(const scalarT &rhs)=default
void gather(const scalarType *p, const scalarT< U > &indices)
static constexpr unsigned int alignment
void broadcast(const scalarType rhs)
scalarType operator[](size_t) const
void operator/=(scalarT< T > rhs)
scalarType[width] scalarArray
void load(const scalarType *p, flag)
void operator+=(scalarT< T > rhs)
scalarType & operator[](size_t)
scalarT(const vectorType &rhs)
static constexpr unsigned int width
void fma(const scalarT< T > &a, const scalarT< T > &b)
void operator-=(scalarT< T > rhs)
void load(const scalarType *p)
void operator*=(scalarT< T > rhs)
void store(scalarType *p, flag) const
scalarT & operator=(const scalarT &)=default
void scatter(scalarType *p, const scalarT< U > &indices) const