commit 635669de7aae89e981231b5656db6be8e434f6bd
parent 83fb4650b693397fef1d412d4e1c476864126964
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date: Thu, 14 Jul 2022 19:39:24 +0100
padhigh/padlow with constant, enumerate with step
Diffstat:
1 file changed, 49 insertions(+), 0 deletions(-)
diff --git a/include/kfr/simd/shuffle.hpp b/include/kfr/simd/shuffle.hpp
@@ -32,6 +32,9 @@
#include <tuple>
#include <utility>
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 5051))
+
namespace kfr
{
@@ -130,6 +133,14 @@ KFR_INTRINSIC vec<T, N + Ncount> padhigh(const vec<T, N>& x)
{
return x.shuffle(csizeseq<N + Ncount>);
}
+template <size_t Ncount, typename T, size_t N>
+KFR_INTRINSIC vec<T, N + Ncount> padhigh(const vec<T, N>& x, identity<T> newvalue)
+{
+ if constexpr (Ncount == 0)
+ return x;
+ else
+ return concat(x, broadcast<Ncount, T>(newvalue));
+}
KFR_FN(padhigh)
template <size_t Ncount, typename T, size_t N>
@@ -137,6 +148,14 @@ KFR_INTRINSIC vec<T, N + Ncount> padlow(const vec<T, N>& x)
{
return x.shuffle(csizeseq<N + Ncount, 0 - Ncount>);
}
+template <size_t Ncount, typename T, size_t N>
+KFR_INTRINSIC vec<T, N + Ncount> padlow(const vec<T, N>& x, identity<T> newvalue)
+{
+ if constexpr (Ncount == 0)
+ return x;
+ else
+ return concat(broadcast<Ncount, T>(newvalue), x);
+}
KFR_FN(padlow)
template <size_t Nout, typename T>
@@ -566,6 +585,33 @@ constexpr KFR_INTRINSIC vec<T, N> enumerate(vec_shape<T, N>)
{
return generate_vector<T, N, internal::generate_index<start, stride>>();
}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> enumerate(vec_shape<T, N> sh, identity<T> step)
+{
+ if constexpr (N == 1)
+ {
+ return czeros;
+ }
+ else if constexpr (!is_poweroftwo(N))
+ {
+ return slice<0, N>(enumerate(vec_shape<T, next_poweroftwo(N)>{}, step));
+ }
+ else
+ {
+ vec<T, N> vv = step;
+ vec<T, N> zz(czeros);
+
+ vec<T, N> acc = blend(zz, vv, csizeseq<N> % csize<2>);
+ cfor(csize<0>, csize<ilog2(N) - 1>,
+ [&](auto idx) CMT_INLINE_LAMBDA
+ {
+ vv = vv + vv;
+ acc += blend(zz, vv, csizeseq<N> / (csize<2 << (idx)>) % csize<2>);
+ });
+ return acc;
+ }
+}
+
KFR_FN(enumerate)
template <typename T, size_t N, size_t start = 0, size_t size = 1, int on = 1, int off = 0>
@@ -585,3 +631,5 @@ KFR_FN(onoff)
} // namespace kfr
#define KFR_SHUFFLE_SPECIALIZATIONS 1
#include "impl/specializations.i"
+
+CMT_PRAGMA_MSVC(warning(pop))
+\ No newline at end of file