kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

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:
Minclude/kfr/simd/shuffle.hpp | 49+++++++++++++++++++++++++++++++++++++++++++++++++
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