<p>tnt has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12415">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">convolve: Remove support for step, offset parameters<br><br> - Those are not used any where<br> - Those are not supported by the sse/neon accelerated versions<br> - And I see very little use cases for those.<br><br>Change-Id: Ic850269a0ed5d98c0ea68980afd31016ed555b48<br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>---<br>M Transceiver52M/Channelizer.cpp<br>M Transceiver52M/Resampler.cpp<br>M Transceiver52M/Synthesis.cpp<br>M Transceiver52M/arch/arm/convolve.c<br>M Transceiver52M/arch/common/convolve.h<br>M Transceiver52M/arch/common/convolve_base.c<br>M Transceiver52M/arch/x86/convolve.c<br>M Transceiver52M/arch/x86/convolve_sse_3.c<br>M Transceiver52M/arch/x86/convolve_sse_3.h<br>M Transceiver52M/sigProcLib.cpp<br>M tests/Transceiver52M/convolve_test.c<br>11 files changed, 124 insertions(+), 166 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/15/12415/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Channelizer.cpp b/Transceiver52M/Channelizer.cpp</span><br><span>index 2d817b0..a18dd03 100644</span><br><span>--- a/Transceiver52M/Channelizer.cpp</span><br><span>+++ b/Transceiver52M/Channelizer.cpp</span><br><span>@@ -88,7 +88,7 @@</span><br><span>           convolve_real(hInputs[i], blockLen,</span><br><span>                        subFilters[i], hLen,</span><br><span>                         hOutputs[i], blockLen,</span><br><span style="color: hsl(0, 100%, 40%);">-                          0, blockLen, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                           0, blockLen);</span><br><span>  }</span><br><span> </span><br><span>        cxvec_fft(fftHandle);</span><br><span>diff --git a/Transceiver52M/Resampler.cpp b/Transceiver52M/Resampler.cpp</span><br><span>index 6b9621c..ecd8865 100644</span><br><span>--- a/Transceiver52M/Resampler.cpp</span><br><span>+++ b/Transceiver52M/Resampler.cpp</span><br><span>@@ -143,7 +143,7 @@</span><br><span>             convolve_real(in, in_len,</span><br><span>                          reinterpret_cast<float *>(partitions[path]),</span><br><span>                           filt_len, &out[2 * i], out_len - i,</span><br><span style="color: hsl(0, 100%, 40%);">-                         n, 1, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                          n, 1);</span><br><span>         }</span><br><span> </span><br><span>        return out_len;</span><br><span>diff --git a/Transceiver52M/Synthesis.cpp b/Transceiver52M/Synthesis.cpp</span><br><span>index 262c638..6b62156 100644</span><br><span>--- a/Transceiver52M/Synthesis.cpp</span><br><span>+++ b/Transceiver52M/Synthesis.cpp</span><br><span>@@ -102,7 +102,7 @@</span><br><span>           convolve_real(hInputs[i], blockLen,</span><br><span>                        subFilters[i], hLen,</span><br><span>                         hOutputs[i], blockLen,</span><br><span style="color: hsl(0, 100%, 40%);">-                          0, blockLen, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                           0, blockLen);</span><br><span>  }</span><br><span> </span><br><span>        /* Interleave into output vector */</span><br><span>diff --git a/Transceiver52M/arch/arm/convolve.c b/Transceiver52M/arch/arm/convolve.c</span><br><span>index 912d0c2..5b5bce5 100644</span><br><span>--- a/Transceiver52M/arch/arm/convolve.c</span><br><span>+++ b/Transceiver52M/arch/arm/convolve.c</span><br><span>@@ -29,17 +29,15 @@</span><br><span> int _base_convolve_real(float *x, int x_len,</span><br><span>                       float *h, int h_len,</span><br><span>                         float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        int start, int len);</span><br><span> </span><br><span> int _base_convolve_complex(float *x, int x_len,</span><br><span>                     float *h, int h_len,</span><br><span>                         float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        int start, int len);</span><br><span> </span><br><span> int bounds_check(int x_len, int h_len, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                 int start, int len, int step);</span><br><span style="color: hsl(120, 100%, 40%);">+                int start, int len);</span><br><span> </span><br><span> #ifdef HAVE_NEON</span><br><span> /* Calls into NEON assembler */</span><br><span>@@ -69,35 +67,32 @@</span><br><span> int convolve_real(float *x, int x_len,</span><br><span>               float *h, int h_len,</span><br><span>                 float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-            int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-             int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                 int start, int len)</span><br><span> {</span><br><span>   void (*conv_func)(float *, float *, float *, int) = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span> </span><br><span> #ifdef HAVE_NEON</span><br><span style="color: hsl(0, 100%, 40%);">-  if (step <= 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (h_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                case 4:</span><br><span style="color: hsl(0, 100%, 40%);">-                 conv_func = neon_conv_real4;</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 8:</span><br><span style="color: hsl(0, 100%, 40%);">-                 conv_func = neon_conv_real8;</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 12:</span><br><span style="color: hsl(0, 100%, 40%);">-                        conv_func = neon_conv_real12;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 16:</span><br><span style="color: hsl(0, 100%, 40%);">-                        conv_func = neon_conv_real16;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 20:</span><br><span style="color: hsl(0, 100%, 40%);">-                        conv_func = neon_conv_real20;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (h_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+               conv_func = neon_conv_real4;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+               conv_func = neon_conv_real8;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 12:</span><br><span style="color: hsl(120, 100%, 40%);">+              conv_func = neon_conv_real12;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 16:</span><br><span style="color: hsl(120, 100%, 40%);">+              conv_func = neon_conv_real16;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 20:</span><br><span style="color: hsl(120, 100%, 40%);">+              conv_func = neon_conv_real20;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       }</span><br><span> #endif</span><br><span>  if (conv_func) {</span><br><span>@@ -107,7 +102,7 @@</span><br><span>               _base_convolve_real(x, x_len,</span><br><span>                                    h, h_len,</span><br><span>                                    y, y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    start, len);</span><br><span>     }</span><br><span> </span><br><span>        return len;</span><br><span>@@ -118,18 +113,17 @@</span><br><span> int convolve_complex(float *x, int x_len,</span><br><span>                  float *h, int h_len,</span><br><span>                 float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                 int start, int len)</span><br><span> {</span><br><span>        void (*conv_func)(float *, float *, float *, int, int) = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span> </span><br><span> #ifdef HAVE_NEON</span><br><span style="color: hsl(0, 100%, 40%);">-  if (step <= 4 && !(h_len % 4))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!(h_len % 4))</span><br><span>            conv_func = neon_conv_cmplx_4n;</span><br><span> #endif</span><br><span>    if (conv_func) {</span><br><span>@@ -139,7 +133,7 @@</span><br><span>               _base_convolve_complex(x, x_len,</span><br><span>                                    h, h_len,</span><br><span>                                    y, y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    start, len);</span><br><span>  }</span><br><span> </span><br><span>        return len;</span><br><span>diff --git a/Transceiver52M/arch/common/convolve.h b/Transceiver52M/arch/common/convolve.h</span><br><span>index 095b04c..e30f7ec 100644</span><br><span>--- a/Transceiver52M/arch/common/convolve.h</span><br><span>+++ b/Transceiver52M/arch/common/convolve.h</span><br><span>@@ -6,26 +6,22 @@</span><br><span> int convolve_real(const float *x, int x_len,</span><br><span>               const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-            int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-             int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                int start, int len);</span><br><span> </span><br><span> int convolve_complex(const float *x, int x_len,</span><br><span>                     const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                int start, int len);</span><br><span> </span><br><span> int base_convolve_real(const float *x, int x_len,</span><br><span>                  const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                int start, int len);</span><br><span> </span><br><span> int base_convolve_complex(const float *x, int x_len,</span><br><span>                        const float *h, int h_len,</span><br><span>                           float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        int start, int len);</span><br><span> </span><br><span> void convolve_init(void);</span><br><span> </span><br><span>diff --git a/Transceiver52M/arch/common/convolve_base.c b/Transceiver52M/arch/common/convolve_base.c</span><br><span>index 2eb7124..9bb8d3d 100644</span><br><span>--- a/Transceiver52M/arch/common/convolve_base.c</span><br><span>+++ b/Transceiver52M/arch/common/convolve_base.c</span><br><span>@@ -41,17 +41,17 @@</span><br><span> </span><br><span> /* Base vector complex-complex multiply and accumulate */</span><br><span> static void mac_real_vec_n(const float *x, const float *h, float *y,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                        int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        for (int i = offset; i < len; i += step)</span><br><span style="color: hsl(120, 100%, 40%);">+   for (int i=0; i<len; i++)</span><br><span>                 mac_real(&x[2 * i], &h[2 * i], y);</span><br><span> }</span><br><span> </span><br><span> /* Base vector complex-complex multiply and accumulate */</span><br><span> static void mac_cmplx_vec_n(const float *x, const float *h, float *y,</span><br><span style="color: hsl(0, 100%, 40%);">-                           int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                        int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       for (int i = offset; i < len; i += step)</span><br><span style="color: hsl(120, 100%, 40%);">+   for (int i=0; i<len; i++)</span><br><span>                 mac_cmplx(&x[2 * i], &h[2 * i], y);</span><br><span> }</span><br><span> </span><br><span>@@ -59,14 +59,12 @@</span><br><span> int _base_convolve_real(const float *x, int x_len,</span><br><span>                     const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                 int start, int len)</span><br><span> {</span><br><span>     for (int i = 0; i < len; i++) {</span><br><span>           mac_real_vec_n(&x[2 * (i - (h_len - 1) + start)],</span><br><span>                               h,</span><br><span style="color: hsl(0, 100%, 40%);">-                              &y[2 * i], h_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                           step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        &y[2 * i], h_len);</span><br><span>        }</span><br><span> </span><br><span>        return len;</span><br><span>@@ -76,14 +74,13 @@</span><br><span> int _base_convolve_complex(const float *x, int x_len,</span><br><span>                      const float *h, int h_len,</span><br><span>                           float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                         int start, int len)</span><br><span> {</span><br><span>  for (int i = 0; i < len; i++) {</span><br><span>           mac_cmplx_vec_n(&x[2 * (i - (h_len - 1) + start)],</span><br><span>                               h,</span><br><span>                           &y[2 * i],</span><br><span style="color: hsl(0, 100%, 40%);">-                          h_len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                         h_len);</span><br><span>      }</span><br><span> </span><br><span>        return len;</span><br><span>@@ -91,10 +88,10 @@</span><br><span> </span><br><span> /* Buffer validity checks */</span><br><span> int bounds_check(int x_len, int h_len, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-               int start, int len, int step)</span><br><span style="color: hsl(120, 100%, 40%);">+                 int start, int len)</span><br><span> {</span><br><span>    if ((x_len < 1) || (h_len < 1) ||</span><br><span style="color: hsl(0, 100%, 40%);">-     (y_len < 1) || (len < 1) || (step < 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            (y_len < 1) || (len < 1)) {</span><br><span>                fprintf(stderr, "Convolve: Invalid input\n");</span><br><span>              return -1;</span><br><span>   }</span><br><span>@@ -113,10 +110,9 @@</span><br><span> int base_convolve_real(const float *x, int x_len,</span><br><span>                       const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                 int start, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span>@@ -124,17 +120,16 @@</span><br><span>       return _base_convolve_real(x, x_len,</span><br><span>                                    h, h_len,</span><br><span>                                    y, y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                            start, len);</span><br><span> }</span><br><span> </span><br><span> /* API: Non-aligned (no SSE) complex-complex */</span><br><span> int base_convolve_complex(const float *x, int x_len,</span><br><span>                    const float *h, int h_len,</span><br><span>                           float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                         int start, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span>@@ -142,7 +137,7 @@</span><br><span>         return _base_convolve_complex(x, x_len,</span><br><span>                                    h, h_len,</span><br><span>                                    y, y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    start, len);</span><br><span> }</span><br><span> </span><br><span> /* Aligned filter tap allocation */</span><br><span>diff --git a/Transceiver52M/arch/x86/convolve.c b/Transceiver52M/arch/x86/convolve.c</span><br><span>index eb38f64..209d377 100644</span><br><span>--- a/Transceiver52M/arch/x86/convolve.c</span><br><span>+++ b/Transceiver52M/arch/x86/convolve.c</span><br><span>@@ -30,25 +30,25 @@</span><br><span> /* Architecture dependant function pointers */</span><br><span> struct convolve_cpu_context {</span><br><span>     void (*conv_cmplx_4n) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>       void (*conv_cmplx_8n) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>       void (*conv_cmplx) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                     int, int, int);</span><br><span>  void (*conv_real4) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                     int, int, int);</span><br><span>  void (*conv_real8) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                     int, int, int);</span><br><span>  void (*conv_real12) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>         void (*conv_real16) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>         void (*conv_real20) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>         void (*conv_real4n) (const float *, int, const float *, int, float *,</span><br><span style="color: hsl(0, 100%, 40%);">-                        int, int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                             int, int, int);</span><br><span>         void (*conv_real) (const float *, int, const float *, int, float *, int,</span><br><span style="color: hsl(0, 100%, 40%);">-                           int, int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+                          int, int);</span><br><span> };</span><br><span> static struct convolve_cpu_context c;</span><br><span> </span><br><span>@@ -56,17 +56,15 @@</span><br><span> int _base_convolve_real(const float *x, int x_len,</span><br><span>                         const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        int start, int len);</span><br><span> </span><br><span> int _base_convolve_complex(const float *x, int x_len,</span><br><span>                       const float *h, int h_len,</span><br><span>                           float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len,</span><br><span style="color: hsl(0, 100%, 40%);">-                     int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                        int start, int len);</span><br><span> </span><br><span> int bounds_check(int x_len, int h_len, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                 int start, int len, int step);</span><br><span style="color: hsl(120, 100%, 40%);">+                int start, int len);</span><br><span> </span><br><span> /* API: Initalize convolve module */</span><br><span> void convolve_init(void)</span><br><span>@@ -99,46 +97,37 @@</span><br><span> /* API: Aligned complex-real */</span><br><span> int convolve_real(const float *x, int x_len,</span><br><span>                 const float *h, int h_len,</span><br><span style="color: hsl(0, 100%, 40%);">-              float *y, int y_len, int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                float *y, int y_len, int start, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (step <= 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (h_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                case 4:</span><br><span style="color: hsl(0, 100%, 40%);">-                 c.conv_real4(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 8:</span><br><span style="color: hsl(0, 100%, 40%);">-                 c.conv_real8(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 12:</span><br><span style="color: hsl(0, 100%, 40%);">-                        c.conv_real12(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 16:</span><br><span style="color: hsl(0, 100%, 40%);">-                        c.conv_real16(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 20:</span><br><span style="color: hsl(0, 100%, 40%);">-                        c.conv_real20(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (!(h_len % 4))</span><br><span style="color: hsl(0, 100%, 40%);">-                               c.conv_real4n(x, x_len, h, h_len, y, y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           start, len, step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                        else</span><br><span style="color: hsl(0, 100%, 40%);">-                            c.conv_real(x, x_len, h, h_len, y, y_len, start,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            len, step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else</span><br><span style="color: hsl(0, 100%, 40%);">-          c.conv_real(x, x_len, h, h_len, y, y_len, start, len, step,</span><br><span style="color: hsl(0, 100%, 40%);">-                         offset);</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (h_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+               c.conv_real4(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+               c.conv_real8(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 12:</span><br><span style="color: hsl(120, 100%, 40%);">+              c.conv_real12(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 16:</span><br><span style="color: hsl(120, 100%, 40%);">+              c.conv_real16(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 20:</span><br><span style="color: hsl(120, 100%, 40%);">+              c.conv_real20(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!(h_len % 4))</span><br><span style="color: hsl(120, 100%, 40%);">+                     c.conv_real4n(x, x_len, h, h_len, y, y_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  c.conv_real(x, x_len, h, h_len, y, y_len, start,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  len);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        return len;</span><br><span> }</span><br><span>@@ -147,26 +136,19 @@</span><br><span> int convolve_complex(const float *x, int x_len,</span><br><span>               const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   if (bounds_check(x_len, h_len, y_len, start, len, step) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (step <= 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!(h_len % 8))</span><br><span style="color: hsl(0, 100%, 40%);">-                       c.conv_cmplx_8n(x, x_len, h, h_len, y, y_len, start,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    len, step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-             else if (!(h_len % 4))</span><br><span style="color: hsl(0, 100%, 40%);">-                  c.conv_cmplx_4n(x, x_len, h, h_len, y, y_len, start,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    len, step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    c.conv_cmplx(x, x_len, h, h_len, y, y_len, start, len,</span><br><span style="color: hsl(0, 100%, 40%);">-                               step, offset);</span><br><span style="color: hsl(0, 100%, 40%);">-     } else</span><br><span style="color: hsl(0, 100%, 40%);">-          c.conv_cmplx(x, x_len, h, h_len, y, y_len, start, len, step,</span><br><span style="color: hsl(0, 100%, 40%);">-                         offset);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(h_len % 8))</span><br><span style="color: hsl(120, 100%, 40%);">+             c.conv_cmplx_8n(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (!(h_len % 4))</span><br><span style="color: hsl(120, 100%, 40%);">+                c.conv_cmplx_4n(x, x_len, h, h_len, y, y_len, start, len);</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          c.conv_cmplx(x, x_len, h, h_len, y, y_len, start, len);</span><br><span> </span><br><span>  return len;</span><br><span> }</span><br><span>diff --git a/Transceiver52M/arch/x86/convolve_sse_3.c b/Transceiver52M/arch/x86/convolve_sse_3.c</span><br><span>index dbee3cc..8fd3b5e 100644</span><br><span>--- a/Transceiver52M/arch/x86/convolve_sse_3.c</span><br><span>+++ b/Transceiver52M/arch/x86/convolve_sse_3.c</span><br><span>@@ -34,12 +34,12 @@</span><br><span> void sse_conv_real4(const float *x, int x_len,</span><br><span>                    const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+             int start, int len)</span><br><span> {</span><br><span>         /* NOTE: The parameter list of this function has to match the parameter</span><br><span>       * list of _base_convolve_real() in convolve_base.c. This specific</span><br><span>    * implementation, ignores some of the parameters of</span><br><span style="color: hsl(0, 100%, 40%);">-     * _base_convolve_complex(), which are: x_len, y_len, offset, step */</span><br><span style="color: hsl(120, 100%, 40%);">+  * _base_convolve_complex(), which are: x_len, y_len. */</span><br><span> </span><br><span>         __m128 m0, m1, m2, m3, m4, m5, m6, m7;</span><br><span> </span><br><span>@@ -75,7 +75,7 @@</span><br><span> void sse_conv_real8(const float *x, int x_len,</span><br><span>                 const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+             int start, int len)</span><br><span> {</span><br><span>         /* See NOTE in sse_conv_real4() */</span><br><span> </span><br><span>@@ -126,7 +126,7 @@</span><br><span> void sse_conv_real12(const float *x, int x_len,</span><br><span>                   const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>        /* See NOTE in sse_conv_real4() */</span><br><span> </span><br><span>@@ -192,7 +192,7 @@</span><br><span> void sse_conv_real16(const float *x, int x_len,</span><br><span>                   const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>        /* See NOTE in sse_conv_real4() */</span><br><span> </span><br><span>@@ -271,7 +271,7 @@</span><br><span> void sse_conv_real20(const float *x, int x_len,</span><br><span>                   const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>        /* See NOTE in sse_conv_real4() */</span><br><span> </span><br><span>@@ -361,7 +361,7 @@</span><br><span> void sse_conv_real4n(const float *x, int x_len,</span><br><span>                   const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>        /* See NOTE in sse_conv_real4() */</span><br><span> </span><br><span>@@ -408,12 +408,12 @@</span><br><span> void sse_conv_cmplx_4n(const float *x, int x_len,</span><br><span>                 const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>      /* NOTE: The parameter list of this function has to match the parameter</span><br><span>       * list of _base_convolve_complex() in convolve_base.c. This specific</span><br><span>         * implementation, ignores some of the parameters of</span><br><span style="color: hsl(0, 100%, 40%);">-     * _base_convolve_complex(), which are: x_len, y_len, offset, step. */</span><br><span style="color: hsl(120, 100%, 40%);">+         * _base_convolve_complex(), which are: x_len, y_len. */</span><br><span> </span><br><span>         __m128 m0, m1, m2, m3, m4, m5, m6, m7;</span><br><span> </span><br><span>@@ -466,7 +466,7 @@</span><br><span> void sse_conv_cmplx_8n(const float *x, int x_len,</span><br><span>                       const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     int start, int len)</span><br><span> {</span><br><span>      /* See NOTE in sse_conv_cmplx_4n() */</span><br><span> </span><br><span>diff --git a/Transceiver52M/arch/x86/convolve_sse_3.h b/Transceiver52M/arch/x86/convolve_sse_3.h</span><br><span>index ac30ca5..d929ef6 100644</span><br><span>--- a/Transceiver52M/arch/x86/convolve_sse_3.h</span><br><span>+++ b/Transceiver52M/arch/x86/convolve_sse_3.h</span><br><span>@@ -23,46 +23,46 @@</span><br><span> void sse_conv_real4(const float *x, int x_len,</span><br><span>                   const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 8-tap SSE complex-real convolution */</span><br><span> void sse_conv_real8(const float *x, int x_len,</span><br><span>               const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 12-tap SSE complex-real convolution */</span><br><span> void sse_conv_real12(const float *x, int x_len,</span><br><span>                      const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 16-tap SSE complex-real convolution */</span><br><span> void sse_conv_real16(const float *x, int x_len,</span><br><span>                     const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 20-tap SSE complex-real convolution */</span><br><span> void sse_conv_real20(const float *x, int x_len,</span><br><span>                     const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 4*N-tap SSE complex-real convolution */</span><br><span> void sse_conv_real4n(const float *x, int x_len,</span><br><span>                    const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 4*N-tap SSE complex-complex convolution */</span><br><span> void sse_conv_cmplx_4n(const float *x, int x_len,</span><br><span>                 const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span> </span><br><span> /* 8*N-tap SSE complex-complex convolution */</span><br><span> void sse_conv_cmplx_8n(const float *x, int x_len,</span><br><span>                       const float *h, int h_len,</span><br><span>                   float *y, int y_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int start, int len, int step, int offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                    int start, int len);</span><br><span>diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp</span><br><span>index f720828..fcda5fa 100644</span><br><span>--- a/Transceiver52M/sigProcLib.cpp</span><br><span>+++ b/Transceiver52M/sigProcLib.cpp</span><br><span>@@ -285,8 +285,7 @@</span><br><span> </span><br><span> static signalVector *convolve(const signalVector *x, const signalVector *h,</span><br><span>                               signalVector *y, ConvType spanType,</span><br><span style="color: hsl(0, 100%, 40%);">-                              size_t start = 0, size_t len = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                              size_t step = 1, int offset = 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                              size_t start = 0, size_t len = 0)</span><br><span> {</span><br><span>   int rc;</span><br><span>   size_t head = 0, tail = 0;</span><br><span>@@ -354,22 +353,22 @@</span><br><span>     rc = convolve_real((float *) _x->begin(), _x->size(),</span><br><span>                        (float *) h->begin(), h->size(),</span><br><span>                        (float *) y->begin(), y->size(),</span><br><span style="color: hsl(0, 100%, 40%);">-                       start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                       start, len);</span><br><span>   } else if (!h->isReal() && h->isAligned()) {</span><br><span>     rc = convolve_complex((float *) _x->begin(), _x->size(),</span><br><span>                           (float *) h->begin(), h->size(),</span><br><span>                           (float *) y->begin(), y->size(),</span><br><span style="color: hsl(0, 100%, 40%);">-                          start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                          start, len);</span><br><span>   } else if (h->isReal() && !h->isAligned()) {</span><br><span>     rc = base_convolve_real((float *) _x->begin(), _x->size(),</span><br><span>                             (float *) h->begin(), h->size(),</span><br><span>                             (float *) y->begin(), y->size(),</span><br><span style="color: hsl(0, 100%, 40%);">-                            start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                            start, len);</span><br><span>   } else if (!h->isReal() && !h->isAligned()) {</span><br><span>     rc = base_convolve_complex((float *) _x->begin(), _x->size(),</span><br><span>                                (float *) h->begin(), h->size(),</span><br><span>                                (float *) y->begin(), y->size(),</span><br><span style="color: hsl(0, 100%, 40%);">-                               start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                               start, len);</span><br><span>   } else {</span><br><span>     rc = -1;</span><br><span>   }</span><br><span>@@ -1482,7 +1481,7 @@</span><br><span> </span><br><span>   /* Correlate */</span><br><span>   if (!convolve(corr_in, sync->sequence, &corr,</span><br><span style="color: hsl(0, 100%, 40%);">-                CUSTOM, start, len, 1, 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                CUSTOM, start, len)) {</span><br><span>     delete dec;</span><br><span>     return -1;</span><br><span>   }</span><br><span>diff --git a/tests/Transceiver52M/convolve_test.c b/tests/Transceiver52M/convolve_test.c</span><br><span>index 54bc7a1..8ca4b72 100644</span><br><span>--- a/tests/Transceiver52M/convolve_test.c</span><br><span>+++ b/tests/Transceiver52M/convolve_test.c</span><br><span>@@ -62,21 +62,17 @@</span><br><span>   int y_len;</span><br><span>   int start;</span><br><span>   int len;</span><br><span style="color: hsl(0, 100%, 40%);">-        int step;</span><br><span style="color: hsl(0, 100%, 40%);">-       int offset;</span><br><span> </span><br><span>      x_len=34;</span><br><span>    y_len=26;</span><br><span>    start=8;</span><br><span>     len=26;</span><br><span style="color: hsl(0, 100%, 40%);">- step=1;</span><br><span style="color: hsl(0, 100%, 40%);">- offset=1;</span><br><span>    reset_testvec(0);</span><br><span>    dump_floats(x,x_len,"x");</span><br><span>  printf("\n");</span><br><span>      dump_floats(h,h_len,"h");</span><br><span>  printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">- convolve_complex(x, x_len, h, h_len, y, y_len, start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+     convolve_complex(x, x_len, h, h_len, y, y_len, start, len);</span><br><span>  dump_floats(y,y_len,"y");</span><br><span>  printf("\n");</span><br><span> }</span><br><span>@@ -88,21 +84,17 @@</span><br><span>   int y_len;</span><br><span>   int start;</span><br><span>   int len;</span><br><span style="color: hsl(0, 100%, 40%);">-        int step;</span><br><span style="color: hsl(0, 100%, 40%);">-       int offset;</span><br><span> </span><br><span>      x_len=34;</span><br><span>    y_len=26;</span><br><span>    start=8;</span><br><span>     len=26;</span><br><span style="color: hsl(0, 100%, 40%);">- step=1;</span><br><span style="color: hsl(0, 100%, 40%);">- offset=1;</span><br><span>    reset_testvec(0);</span><br><span style="color: hsl(0, 100%, 40%);">-       dump_floats(x,x_len,"x");</span><br><span style="color: hsl(120, 100%, 40%);">+   dump_floats(x-30,2*x_len+30,"x");</span><br><span>  printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">- dump_floats(h,h_len,"h");</span><br><span style="color: hsl(120, 100%, 40%);">+   dump_floats(h,2*h_len,"h");</span><br><span>        printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">- convolve_real(x, x_len, h, h_len, y, y_len, start, len, step, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        convolve_real(x, x_len, h, h_len, y, y_len, start, len);</span><br><span>     dump_floats(y,y_len,"y");</span><br><span>  printf("\n");</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12415">change 12415</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12415"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ic850269a0ed5d98c0ea68980afd31016ed555b48 </div>
<div style="display:none"> Gerrit-Change-Number: 12415 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: tnt <tnt@246tNt.com> </div>