46template <
class T,
int N = kSimdDefaultSize<T>,
class Concept = SimdConcept>
51template <
class T>
constexpr bool IsSimdDef =
false;
52template <
class T,
int N>
constexpr bool IsSimdDef<Simd<T, N>> =
true;
53template <
class T>
constexpr bool IsSimdSupportedTypeDef =
false;
54template <>
inline constexpr bool IsSimdSupportedTypeDef<float> =
true;
55template <>
inline constexpr bool IsSimdSupportedTypeDef<double> =
true;
56template <>
inline constexpr bool IsSimdSupportedTypeDef<int> =
true;
57template <>
inline constexpr bool IsSimdSupportedTypeDef<int64_t> =
true;
58template <
class T>
constexpr bool IsHalfDef =
false;
66#if MOCHI_LANGUAGE_CPP20
68concept IsSimd = details::IsSimdDef<std::decay_t<T>>;
72concept IsHalf = details::IsHalfDef<std::decay_t<T>>;
75inline constexpr bool IsSimd = details::IsSimdDef<std::decay_t<T>>;
79inline constexpr bool IsHalf = details::IsHalfDef<std::decay_t<T>>;
90template <
class T,
int N,
class Concept>
103 static_assert(!std::is_const_v<T>,
"Scalar type must not be const");
106 static_assert(std::is_same_v<T, void>,
"The requested SIMD size or type is not supported");
118 template <
class... Ts>
122 static constexpr size_t size() {
181template <
class VecTo,
class VecFrom, MOCHI_CONCEPT(IsSimd<VecTo>&& IsSimd<VecFrom>)>
184 std::is_same_v<std::decay_t<VecTo>, std::decay_t<VecFrom>>,
185 "ReinterpretCast not supported for these types.");
192template <
class VecTo,
class VecFrom, MOCHI_CONCEPT(IsSimd<VecTo>&& IsSimd<VecFrom>)>
303template <
class T,
int N>
307template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
311template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
315template <
int i,
class T,
int N>
320template <
class T,
int N>
328template <
class V,
class... MoreBools>
334template <
class V = Vec4r>
338template <
int i,
class V = Vec4r>
342template <
class V = Vec4r>
354template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
358template <
int N,
class V, MOCHI_CONCEPT(IsSimd<V>)>
363template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
368template <
class V,
class I, MOCHI_CONCEPT(IsSimd<V>)>
370LoadIndexed(
typename V::Scalar
const* ptr, Simd<I, V::kSize> indices);
381template <
int kTupleCount = -1,
class T,
int N>
383LoadTransposed(T
const* ptr, Simd<T, N>& out0, Simd<T, N>& out1, Simd<T, N>& out2);
386template <
class T,
int N>
390template <
int i,
class T,
int N>
394template <
int iHalf,
class T,
int N>
398template <
int i,
class T,
int N>
402template <
class T,
int N>
412template <
int COUNT = -1,
class T,
int N>
417template <
class T,
int N>
434template <
class T,
int N,
class MaskT>
446template <
int kTupleCount = -1,
class T,
int N>
452template <
class T,
int N,
class MaskT>
454Select(Simd<MaskT, N> conditionMask, Simd<T, N> a, Simd<T, N> b);
459template <
int kShift,
class T,
int N>
463template <
int x = 0,
int y = 1,
class T>
465template <
int x = 0,
int y = 1,
int z = 2,
int w = 3,
class T>
469template <
int x,
int y,
int z,
int w,
class T>
473template <
int x,
int y,
class T,
int N>
477template <
int x,
int y,
int z,
int w,
class T,
int N>
481template <
bool x,
bool y,
bool z,
bool w,
class T,
int N>
484template <
class T,
int N>
486template <
class T,
int N>
488template <
class T,
int N>
491template <
class T,
int N>
495template <
class T,
int N>
497template <
class T,
int N>
499template <
class T,
int N>
505template <
class T,
int N>
509template <
int COUNT = -1,
class T,
int N>
513template <
int COUNT = -1,
class T,
int N>
517template <
int COUNT = -1,
class T,
int N>
521template <
int COUNT = -1,
class T,
int N>
528template <
class T,
int N>
533template <
class T,
int N>
541template <
class T,
int N>
547template <
class T,
int N>
549template <
class T,
int N>
551template <
class T,
int N>
553template <
class T,
int N>
555template <
class T,
int N>
559template <
class T,
int N>
561template <
class T,
int N>
582template <
int COUNT = -1,
class T,
int N>
588template <
int COUNT = -1,
class T,
int N>
597template <
int COUNT = -1,
class T,
int N>
606template <
int COUNT = -1,
class T,
int N>
617template <
int COUNT = -1,
class T,
int N,
class Eps = T>
630template <
int COUNT = -1,
class T,
int N,
class Eps = T>
638template <
class T,
int N>
642template <
class T,
int N>
649template <
int i,
class T,
int N>
653template <
class T,
int N>
655MulAdd(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
656template <
class T,
int N>
658MulSub(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
659template <
class T,
int N>
661NegMulAdd(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
662template <
class T,
int N>
664NegMulSub(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
668template <
int COUNT = -1,
class V>
672template <
int COUNT = -1,
class T,
int N>
678template <
class T,
int N>
684template <
int COUNT = -1,
class T,
int N>
689template <
int COUNT = -1,
class T,
int N>
694template <
int COUNT = -1,
class T,
int N>
698template <
int COUNT = -1,
class T,
int N>
703template <
int COUNT = -1,
class T,
int N>
707template <
class T,
int N>
711template <
class T,
int N>
715template <
typename T,
int N>
Simd operator-(Simd rhs) const
Simd operator&(Simd rhs) const
Simd & operator^=(Simd rhs)
Simd & operator&=(Simd rhs)
bool operator==(Simd rhs) const
Simd operator&&(Simd rhs) const
Simd operator>(Simd rhs) const
Simd operator<<(int shift) const
Simd operator*(Simd rhs) const
Simd operator^(Simd rhs) const
Simd & operator=(Scalar rhs)
Simd & operator-=(Simd rhs)
Simd(Scalar a, Scalar b, Ts... vals)
Simd(Simd const &rhs)=default
Simd operator||(Simd rhs) const
Simd operator>=(Simd rhs) const
static constexpr bool kIsComposite
Simd operator<(Simd rhs) const
Simd & operator|=(Simd rhs)
bool operator!=(Simd rhs) const
Simd & operator*=(Simd rhs)
static constexpr size_t size()
static constexpr bool kIsEmulated
Simd & operator=(Simd rhs)
Simd operator|(Simd rhs) const
static constexpr int kSize
Simd operator+(Simd rhs) const
static constexpr bool kIsSupported
Simd operator/(Simd rhs) const
Simd & operator/=(Simd rhs)
Simd operator<=(Simd rhs) const
Simd & operator+=(Simd rhs)
Scalar operator[](int i) const
#define MOCHI_SIMD_REGISTER_SIZE_BYTES
T Dot(Simd< T, N > a, Simd< T, N > b)
Simd< T, N > VIsFinite(Simd< T, N > a)
Simd< T, 2 > Shuffle(Simd< T, 2 > a)
constexpr int kSimdDefaultSize
V LoadIndexed(typename V::Scalar const *ptr, Simd< I, V::kSize > indices)
constexpr T const & Min(T const &a, T const &b)
T NormSqr(Simd< T, N > a)
constexpr auto Equal(T const &a, T const &b)
Simd< T, N > Cross3(Simd< T, N > a, Simd< T, N > b)
constexpr To StaticCast(From const &a)
constexpr T kDefaultNearEqualEpsilon
constexpr auto MulAdd(A a, B b, C c)
Simd< T, N > Tanh(Simd< T, N > a)
Simd< T, N > Set(Simd< T, N > a, T value)
constexpr auto NotEqual(T const &a, T const &b)
V VNearEqual(V a, V b, V epsilon)
Simd< T, N > VNormSqr(Simd< T, N > a)
int IsTrue(Simd< T, N > mask)
V Broadcast(typename V::Scalar a)
constexpr auto MulSub(A a, B b, C c)
Simd< T, N > Normalize(Simd< T, N > a)
Simd< T, N > Blend(Simd< T, N > a, Simd< T, N > b)
constexpr T Select(bool condition, T a, T b)
Simd< T, N > Ln(Simd< T, N > a)
std::pair< Simd< T, N >, Simd< T, N > > SinCos(Simd< T, N > a)
constexpr auto NegMulAdd(A a, B b, C c)
Simd< int64_t, 16 > Vec16l
Simd< double, 16 > Vec16d
V SimdMask(bool b0, bool b1, MoreBools... bs)
Simd< T, N/2 > GetHalf(Simd< T, N > a)
Simd< T, 4 > OrthogonalVector3(Simd< T, 4 > a)
Simd< T, N > VNorm(Simd< T, N > a)
constexpr T const & Max(T const &a, T const &b)
void LoadTransposed(T const *ptr, Simd< T, N > &out0, Simd< T, N > &out1, Simd< T, N > &out2)
Simd< T, N > FastRound(Simd< T, N > a)
void StoreTransposed(T *ptr, Simd< T, N > a, Simd< T, N > b, Simd< T, N > c)
void Store(T *ptr, Simd< T, N > a)
Simd< T, N > RcpSqrtApprox(Simd< T, N > a)
constexpr T RcpApprox(T a)
bool NearEqual(TransformRT const &a, TransformRT const &b, real epsilon=kDefaultNearEqualEpsilon< real >)
constexpr auto NegMulSub(A a, B b, C c)
V VNearZero(V a, V epsilon)
int StoreSelected(T *ptr, Simd< MaskT, N > condition, Simd< T, N > values)
V Load(typename V::Scalar const *ptr)
Simd< T, N > Neg(Simd< T, N > a)
bool IsFinite(TransformRT const &a)
constexpr auto NearZero(T const &a, T epsilon=kDefaultNearEqualEpsilon< T >)
Simd< T, N > ShiftRight(Simd< T, N > a)