mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 04:50:34 +05:00
more SIMD features for complex arithmetics
This commit is contained in:
parent
c354118fb9
commit
587843fded
@ -726,6 +726,57 @@ namespace ngcore
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: specialize for AVX, ...
|
||||
template<int N>
|
||||
NETGEN_INLINE auto SwapPairs (SIMD<double,N> a)
|
||||
{
|
||||
if constexpr(N==1) {
|
||||
// static_assert(false);
|
||||
return a;
|
||||
}
|
||||
else if constexpr(N==2) {
|
||||
return SIMD<double,N> (a.Hi(), a.Lo());
|
||||
}
|
||||
else {
|
||||
return SIMD<double,N> (SwapPairs(a.Lo()), SwapPairs(a.Hi()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<int N>
|
||||
NETGEN_INLINE auto HSum128 (SIMD<double,N> a)
|
||||
{
|
||||
if constexpr(N==1) {
|
||||
// static_assert(false);
|
||||
return a;
|
||||
}
|
||||
else if constexpr(N==2) {
|
||||
return a;
|
||||
}
|
||||
else {
|
||||
return HSum128(a.Lo()) + HSum128(a.Hi());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// TODO: specialize for AVX, ...
|
||||
// a*b+-c (even: -, odd: +)
|
||||
template<int N>
|
||||
NETGEN_INLINE auto FMAddSub (SIMD<double,N> a, SIMD<double,N> b, SIMD<double,N> c)
|
||||
{
|
||||
if constexpr(N==1) {
|
||||
// static_assert(false);
|
||||
return a*b-c;
|
||||
}
|
||||
else if constexpr(N==2) {
|
||||
return SIMD<double,N> (a.Lo()*b.Lo()-c.Lo(),
|
||||
a.Hi()*b.Hi()+c.Hi());
|
||||
}
|
||||
else {
|
||||
return SIMD<double,N> (FMAddSub(a.Lo(), b.Lo(), c.Lo()),
|
||||
FMAddSub(a.Hi(), b.Hi(), c.Hi()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user