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>)>
296template <
class T,
int N>
300template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
304template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
308template <
int i,
class T,
int N>
313template <
class T,
int N>
321template <
class V,
class... MoreBools>
327template <
class V = Vec4r>
331template <
int i,
class V = Vec4r>
335template <
class V = Vec4r>
347template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
351template <
int N,
class V, MOCHI_CONCEPT(IsSimd<V>)>
356template <
class V, MOCHI_CONCEPT(IsSimd<V>)>
361template <
class V,
class I, MOCHI_CONCEPT(IsSimd<V>)>
363LoadIndexed(
typename V::Scalar
const* ptr, Simd<I, V::kSize> indices);
374template <
int kTupleCount = -1,
class T,
int N>
376LoadTransposed(T
const* ptr, Simd<T, N>& out0, Simd<T, N>& out1, Simd<T, N>& out2);
379template <
class T,
int N>
383template <
int i,
class T,
int N>
387template <
class T,
int N>
391template <
int iHalf,
class T,
int N>
395template <
int i,
class T,
int N>
399template <
class T,
int N>
409template <
int COUNT = -1,
class T,
int N>
414template <
class T,
int N>
431template <
class T,
int N,
class MaskT>
443template <
int kTupleCount = -1,
class T,
int N>
449template <
class T,
int N,
class MaskT>
451Select(Simd<MaskT, N> conditionMask, Simd<T, N> a, Simd<T, N> b);
454template <
int kShift,
class T,
int N>
458template <
int x = 0,
int y = 1,
class T>
460template <
int x = 0,
int y = 1,
int z = 2,
int w = 3,
class T>
464template <
int x,
int y,
int z,
int w,
class T>
468template <
int x,
int y,
class T,
int N>
472template <
int x,
int y,
int z,
int w,
class T,
int N>
476template <
bool x,
bool y,
bool z,
bool w,
class T,
int N>
479template <
class T,
int N>
481template <
class T,
int N>
483template <
class T,
int N>
486template <
class T,
int N>
490template <
class T,
int N>
492template <
class T,
int N>
494template <
class T,
int N>
500template <
class T,
int N>
504template <
int COUNT = -1,
class T,
int N>
508template <
int COUNT = -1,
class T,
int N>
512template <
int COUNT = -1,
class T,
int N>
516template <
int COUNT = -1,
class T,
int N>
523template <
class T,
int N>
528template <
class T,
int N>
536template <
class T,
int N>
542template <
class T,
int N>
544template <
class T,
int N>
546template <
class T,
int N>
548template <
class T,
int N>
550template <
class T,
int N>
554template <
class T,
int N>
556template <
class T,
int N>
576template <
int COUNT = -1,
class T,
int N>
581template <
int COUNT = -1,
class T,
int N>
590template <
int COUNT = -1,
class T,
int N>
599template <
int COUNT = -1,
class T,
int N>
610template <
int COUNT = -1,
class T,
int N,
class Eps = T>
623template <
int COUNT = -1,
class T,
int N,
class Eps = T>
631template <
class T,
int N>
635template <
class T,
int N>
642template <
int i,
class T,
int N>
646template <
class T,
int N>
648MulAdd(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
649template <
class T,
int N>
651MulSub(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
652template <
class T,
int N>
654NegMulAdd(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
655template <
class T,
int N>
657NegMulSub(Simd<T, N> a, Simd<T, N> b, Simd<T, N> c);
661template <
int COUNT = -1,
class V>
665template <
int COUNT = -1,
class T,
int N>
671template <
class T,
int N>
677template <
int COUNT = -1,
class T,
int N>
682template <
int COUNT = -1,
class T,
int N>
687template <
int COUNT = -1,
class T,
int N>
691template <
int COUNT = -1,
class T,
int N>
696template <
int COUNT = -1,
class T,
int N>
700template <
class T,
int N>
704template <
class T,
int N>
708template <
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)
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)