61 static constexpr size_t n =
sizeof (vSIMDType) /
sizeof (ScalarType);
62 static constexpr size_t mask = (
sizeof (vSIMDType) /
sizeof (ScalarType)) - 1;
66 using MaskType = SIMDInternal::MaskType<ScalarType>;
87 static forcedinline ScalarType get (vSIMDType v,
size_t i)
noexcept
93 static forcedinline vSIMDType set (vSIMDType v,
size_t i, ScalarType s)
noexcept
103 UnionMaskType a {
av};
105 for (
size_t i = 0; i < n; ++i)
114 auto retval =
static_cast<ScalarType
> (0);
116 for (
size_t i = 0; i < n; ++i)
126 for (
size_t i = 0; i < n; ++i)
127 a.s[i] =
static_cast<ScalarType
> (
static_cast<int> (a.s[i]));
132 static forcedinline vSIMDType multiplyAdd (vSIMDType
av, vSIMDType
bv, vSIMDType
cv)
noexcept
134 UnionType a {
av}, b {
bv}, c {
cv};
136 for (
size_t i = 0; i < n; ++i)
137 a.s[i] += b.s[i] * c.s[i];
145 UnionType a {
av}, b {
bv};
147 for (
size_t i = 0; i < n; ++i)
155 static forcedinline vSIMDType cmplxmul (vSIMDType
av, vSIMDType
bv)
noexcept
157 UnionType a {
av}, b {
bv}, r;
159 const int m = n >> 1;
160 for (
int i = 0; i < m; ++i)
166 r.s[i<<1] = result.
real();
167 r.s[(i<<1)|1] = result.
imag();
188 template <
typename Op>
193 for (
size_t i = 0; i < n; ++i)
194 a.s[i] = Op::op (a.s[i], b.s[i]);
199 template <
typename Op>
202 UnionType a {
av}, b {
bv};
205 for (
size_t i = 0; i < n; ++i)
206 r.m[i] = Op::op (a.s[i], b.s[i]) ?
static_cast<MaskType
> (-1) :
static_cast<MaskType> (0);
211 template <
typename Op>
212 static forcedinline vSIMDType bitapply (vSIMDType
av, vSIMDType
bv)
noexcept
214 UnionMaskType a {
av}, b {
bv};
216 for (
size_t i = 0; i < n; ++i)
217 a.m[i] = Op::op (a.m[i], b.m[i]);
222 static forcedinline vSIMDType expand (ScalarType s)
noexcept
226 for (
size_t i = 0; i < n; ++i)
232 static forcedinline vSIMDType load (
const ScalarType* a)
noexcept
236 for (
size_t i = 0; i < n; ++i)
242 static forcedinline void store (vSIMDType
av, ScalarType* dest)
noexcept
246 for (
size_t i = 0; i < n; ++i)
250 template <
unsigned int shuffle_
idx>
257 for (
size_t i = 0; i < n; ++i)