<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>