22template <
typename T>
inline void add_impl(
const T* a,
const T* b, T* dst, std::size_t n)
noexcept {
23 for (std::size_t i = 0; i < n; ++i)
27template <
typename T>
inline void mul_impl(
const T* a,
const T* b, T* dst, std::size_t n)
noexcept {
28 for (std::size_t i = 0; i < n; ++i)
33inline void fma_impl(
const T* a,
const T* b,
const T* c, T* dst, std::size_t n)
noexcept {
34 for (std::size_t i = 0; i < n; ++i)
35 dst[i] = a[i] * b[i] + c[i];
38template <
typename T>
inline void set_impl(T value, T* dst, std::size_t n)
noexcept {
39 for (std::size_t i = 0; i < n; ++i)
43template <
typename T>
inline void scale_impl(
const T* a, T s, T* dst, std::size_t n)
noexcept {
44 for (std::size_t i = 0; i < n; ++i)
48template <
typename T>
inline void add_scaled_impl(
const T* a, T s, T* dst, std::size_t n)
noexcept {
49 for (std::size_t i = 0; i < n; ++i)
53template <
typename T>
inline T
sum_impl(
const T* x, std::size_t n)
noexcept {
55 for (std::size_t i = 0; i < n; ++i)
60template <
typename T>
inline T
maximum_impl(
const T* x, std::size_t n)
noexcept {
64 for (std::size_t i = 1; i < n; ++i)
65 m = std::max(m, x[i]);
69template <
typename T>
inline T
minimum_impl(
const T* x, std::size_t n)
noexcept {
73 for (std::size_t i = 1; i < n; ++i)
74 m = std::min(m, x[i]);
78template <
typename T>
inline void abs_impl(
const T* a, T* dst, std::size_t n)
noexcept {
79 for (std::size_t i = 0; i < n; ++i)
80 dst[i] = std::abs(a[i]);
84inline void clamp_impl(
const T* a, T lo, T hi, T* dst, std::size_t n)
noexcept {
85 for (std::size_t i = 0; i < n; ++i)
86 dst[i] = std::clamp(a[i], lo, hi);
89template <
typename T>
inline T
dot_impl(
const T* a,
const T* b, std::size_t n)
noexcept {
91 for (std::size_t i = 0; i < n; ++i)
98 for (std::size_t i = 0; i < n; ++i)
103template <
typename T>
inline T
max_abs_impl(
const T* x, std::size_t n)
noexcept {
105 for (std::size_t i = 0; i < n; ++i)
106 m = std::max(m, std::abs(x[i]));
111inline void ramp_mul_impl(
const T* x, T start, T step, T* dst, std::size_t n)
noexcept {
112 for (std::size_t i = 0; i < n; ++i)
113 dst[i] = x[i] * (start + T(i) * step);
118 std::size_t taps)
noexcept {
119 for (std::size_t i = 0; i < n_out; ++i)
125 std::size_t taps)
noexcept {
126 for (std::size_t i = 0; i < n_out; ++i)
127 y[i] =
dot_impl(x + 2 * i, h, taps);
134#define PULP_SIMD_SCALAR_DEFINE(SPEC, T) \
135 SPEC void add(const T* a, const T* b, T* dst, std::size_t n) noexcept { \
136 ::pulp::simd::detail::add_impl(a, b, dst, n); \
138 SPEC void mul(const T* a, const T* b, T* dst, std::size_t n) noexcept { \
139 ::pulp::simd::detail::mul_impl(a, b, dst, n); \
141 SPEC void fma(const T* a, const T* b, const T* c, T* dst, std::size_t n) noexcept { \
142 ::pulp::simd::detail::fma_impl(a, b, c, dst, n); \
144 SPEC void set(T value, T* dst, std::size_t n) noexcept { \
145 ::pulp::simd::detail::set_impl(value, dst, n); \
147 SPEC void scale(const T* a, T s, T* dst, std::size_t n) noexcept { \
148 ::pulp::simd::detail::scale_impl(a, s, dst, n); \
150 SPEC void add_scaled(const T* a, T s, T* dst, std::size_t n) noexcept { \
151 ::pulp::simd::detail::add_scaled_impl(a, s, dst, n); \
153 SPEC T sum(const T* x, std::size_t n) noexcept { \
154 return ::pulp::simd::detail::sum_impl(x, n); \
156 SPEC T maximum(const T* x, std::size_t n) noexcept { \
157 return ::pulp::simd::detail::maximum_impl(x, n); \
159 SPEC T minimum(const T* x, std::size_t n) noexcept { \
160 return ::pulp::simd::detail::minimum_impl(x, n); \
162 SPEC void abs(const T* a, T* dst, std::size_t n) noexcept { \
163 ::pulp::simd::detail::abs_impl(a, dst, n); \
165 SPEC void clamp(const T* a, T lo, T hi, T* dst, std::size_t n) noexcept { \
166 ::pulp::simd::detail::clamp_impl(a, lo, hi, dst, n); \
168 SPEC T dot(const T* a, const T* b, std::size_t n) noexcept { \
169 return ::pulp::simd::detail::dot_impl(a, b, n); \
171 SPEC T sum_squares(const T* x, std::size_t n) noexcept { \
172 return ::pulp::simd::detail::sum_squares_impl(x, n); \
174 SPEC T max_abs(const T* x, std::size_t n) noexcept { \
175 return ::pulp::simd::detail::max_abs_impl(x, n); \
177 SPEC void ramp_mul(const T* x, T start, T step, T* dst, std::size_t n) noexcept { \
178 ::pulp::simd::detail::ramp_mul_impl(x, start, step, dst, n); \
180 SPEC void correlate(const T* x, const T* h, T* y, std::size_t n_out, \
181 std::size_t taps) noexcept { \
182 ::pulp::simd::detail::correlate_impl(x, h, y, n_out, taps); \
184 SPEC void decimate2(const T* x, const T* h, T* y, std::size_t n_out, \
185 std::size_t taps) noexcept { \
186 ::pulp::simd::detail::decimate2_impl(x, h, y, n_out, taps); \
Definition scalar_kernels.hpp:20
void add_scaled_impl(const T *a, T s, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:48
T dot_impl(const T *a, const T *b, std::size_t n) noexcept
Definition scalar_kernels.hpp:89
void scale_impl(const T *a, T s, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:43
T max_abs_impl(const T *x, std::size_t n) noexcept
Definition scalar_kernels.hpp:103
T minimum_impl(const T *x, std::size_t n) noexcept
Definition scalar_kernels.hpp:69
T sum_squares_impl(const T *x, std::size_t n) noexcept
Definition scalar_kernels.hpp:96
void decimate2_impl(const T *x, const T *h, T *y, std::size_t n_out, std::size_t taps) noexcept
Definition scalar_kernels.hpp:124
T sum_impl(const T *x, std::size_t n) noexcept
Definition scalar_kernels.hpp:53
void add_impl(const T *a, const T *b, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:22
void clamp_impl(const T *a, T lo, T hi, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:84
T maximum_impl(const T *x, std::size_t n) noexcept
Definition scalar_kernels.hpp:60
void mul_impl(const T *a, const T *b, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:27
void abs_impl(const T *a, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:78
void ramp_mul_impl(const T *x, T start, T step, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:111
void set_impl(T value, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:38
void correlate_impl(const T *x, const T *h, T *y, std::size_t n_out, std::size_t taps) noexcept
Definition scalar_kernels.hpp:117
void fma_impl(const T *a, const T *b, const T *c, T *dst, std::size_t n) noexcept
Definition scalar_kernels.hpp:33