From ebe8ffc58503a1b4f167a13d5663e8849379eaaf Mon Sep 17 00:00:00 2001
From: Grant Cox <grant.cox@deepspaceamps.com>
Date: Wed, 20 Nov 2019 23:18:56 -0600
Subject: gr-blocks: VOLKize add_const_ff implementation

- Use volk_32fc_x2_add_32fc to volk add constants to the input vector of
  the block
- use volk::vector in add_const_ff_impl: Rather than using float* for
  variable length vector addition in volk, use volk::vector<float> for
  easier resizing.
- Use scoped_lock when modifying private data members in
  add_const_ff_impl.cc. Remove getter functions for the d_k_copy vector.
  Cast with static_cast rather than typical cast. Use vector.data()
  rather than &vector[0].
---
 gr-blocks/lib/add_const_ff_impl.cc | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

(limited to 'gr-blocks/lib/add_const_ff_impl.cc')

diff --git a/gr-blocks/lib/add_const_ff_impl.cc b/gr-blocks/lib/add_const_ff_impl.cc
index 110c5450eb..3671546529 100644
--- a/gr-blocks/lib/add_const_ff_impl.cc
+++ b/gr-blocks/lib/add_const_ff_impl.cc
@@ -43,6 +43,13 @@ add_const_ff_impl::add_const_ff_impl(float k)
 {
 }
 
+void add_const_ff_impl::set_k(float k)
+{
+    gr::thread::scoped_lock guard(d_setlock);
+    d_k = k;
+    std::fill(d_k_copy.begin(), d_k_copy.end(), d_k);
+}
+
 int add_const_ff_impl::work(int noutput_items,
                             gr_vector_const_void_star& input_items,
                             gr_vector_void_star& output_items)
@@ -50,23 +57,14 @@ int add_const_ff_impl::work(int noutput_items,
     const float* iptr = (const float*)input_items[0];
     float* optr = (float*)output_items[0];
 
-    int size = noutput_items;
+    unsigned long input_size = static_cast<unsigned long>(noutput_items);
 
-    while (size >= 8) {
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        *optr++ = *iptr++ + d_k;
-        size -= 8;
+    gr::thread::scoped_lock guard(d_setlock);
+    if (d_k_copy.size() < input_size) {
+        d_k_copy.resize(input_size, d_k);
     }
 
-    while (size-- > 0) {
-        *optr++ = *iptr++ + d_k;
-    }
+    volk_32f_x2_add_32f(optr, iptr, d_k_copy.data(), noutput_items);
 
     return noutput_items;
 }
-- 
cgit v1.2.3