18#if (DL_CPU_ARCH == DL_CPU_ARCH_AMD64 || DL_CPU_ARCH == DL_CPU_ARCH_X86)
19#include <simde/x86/sse.h>
25 inline simde__m128 simde_mm_load_ps(
float arr[4])
34 inline simde__m128 simde_mm_set1_ps(
float a)
43 inline void simde_mm_store_ps(simde__m128& ret,
const simde__m128& a)
48 inline simde__m128 simde_mm_add_ps(
const simde__m128& a,
const simde__m128& b)
52 inline simde__m128 simde_mm_sub_ps(
const simde__m128& a,
const simde__m128& b)
56 inline simde__m128 simde_mm_mul_ps(
const simde__m128& a,
const simde__m128& b)
60 inline simde__m128 simde_mm_div_ps(
const simde__m128& a,
const simde__m128& b)
69 template<
typename T,
size_t N>
70 requires std::is_arithmetic_v<T>
80 simde__m128 vec_ax = simde_mm_load_ps(a.
x);
81 simde__m128 vec_bx = simde_mm_set1_ps(b.x);
82 vec_ax = op(vec_ax, vec_bx);
83 simde_mm_store_ps(ret.
x, vec_ax);
85 simde__m128 vec_ay = simde_mm_load_ps(a.
y);
86 simde__m128 vec_by = simde_mm_set1_ps(b.y);
87 vec_ay = op(vec_ay, vec_by);
88 simde_mm_store_ps(ret.
y, vec_ay);
92 static_assert(
N == 4);
100template<
typename T,
size_t N>
101 requires std::is_arithmetic_v<T>
121 return {
x[i],
y[i] };
126 ret[0] =
x[i] +
x[j];
127 ret[1] =
y[i] +
y[j];
137 size_t N_LIST = std::size(data);
138 for (
size_t i = 0; i <
N; ++i)
139 x[i] = i < N_LIST ? data.x :
T{};
140 for (
size_t i = 0; i <
N; ++i)
141 y[i] = i < N_LIST ? data.y :
T{};
145template<
typename T, std::
size_t N>
148 if constexpr (
N == 4)
152 for (
size_t i = 0; i <
N; ++i)
160template<
typename T, std::
size_t N>
163 if constexpr (
N == 4)
173template<
typename T, std::
size_t N>
176 if constexpr (
N == 4)
180 for (
size_t i = 0; i <
N; ++i)
188template<
typename T, std::
size_t N>
191 if constexpr (
N == 4)
201template<
typename T, std::
size_t N>
204 if constexpr (
N == 4)
208 for (
size_t i = 0; i <
N; ++i)
216template<
typename T, std::
size_t N>
219 if constexpr (
N == 4)
229template<
typename T, std::
size_t N>
232 if constexpr (
N == 4)
236 for (
size_t i = 0; i <
N; ++i)
244template<
typename T, std::
size_t N>
247 if constexpr (
N == 4)
258template<
size_t M = 1,
typename T,
size_t N>
261 static_assert(
M <=
N);
263 for (
size_t i = 0; i <
N -
M; ++i)
constexpr Array< T, 2 > Get(size_t i) const
constexpr Array< T, 2 > Sum(size_t i, size_t j) const
constexpr ArrayS2(std::initializer_list< Array< T, 2 > > data)
类似std::array,增加xyzw、wh等成员访问
ArrayS2< float, N > simd_m128u_op(simde__m128(*op)(simde__m128, simde__m128), const ArrayS2< float, N > &a, const Array< float, 2 > &b)
constexpr ArrayS2< T, N > & operator/=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N - M > toShorter(const ArrayS2< T, N > &a)
constexpr ArrayS2< T, N > & operator*=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > & operator+=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator+(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator-(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator/(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > & operator-=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator*(const ArrayS2< T, N > &a, const Array< T, 2 > &b)