diff --git a/Transceiver52M/arm/convert.c b/Transceiver52M/arm/convert.c index e489d224..57796ea5 100644 --- a/Transceiver52M/arm/convert.c +++ b/Transceiver52M/arm/convert.c @@ -28,19 +28,6 @@ void neon_convert_ps_si16_4n(short *, const float *, const float *, int); void neon_convert_si16_ps_4n(float *, const short *, int); -#ifndef HAVE_NEON -static void convert_si16_ps(float *out, const short *in, int len) -{ - for (int i = 0; i < len; i++) - out[i] = in[i]; -} - -static void convert_ps_si16(short *out, const float *in, float scale, int len) -{ - for (int i = 0; i < len; i++) - out[i] = in[i] * scale; -} -#else /* 4*N 16-bit signed integer conversion with remainder */ static void neon_convert_si16_ps(float *out, const short *in, @@ -79,7 +66,7 @@ void convert_float_short(short *out, const float *in, float scale, int len) else neon_convert_ps_si16_4n(out, in, q, len >> 2); #else - convert_ps_si16(out, in, scale, len); + base_convert_float_short(out, in, scale, len); #endif } @@ -91,6 +78,6 @@ void convert_short_float(float *out, const short *in, int len) else neon_convert_si16_ps_4n(out, in, len >> 2); #else - convert_si16_ps(out, in, len); + base_convert_short_float(out, in, len); #endif } diff --git a/Transceiver52M/common/convert.h b/Transceiver52M/common/convert.h index 1d3a1803..73402b09 100644 --- a/Transceiver52M/common/convert.h +++ b/Transceiver52M/common/convert.h @@ -2,7 +2,14 @@ #define _CONVERT_H_ void convert_float_short(short *out, const float *in, float scale, int len); + void convert_short_float(float *out, const short *in, int len); + +void base_convert_float_short(short *out, const float *in, + float scale, int len); + +void base_convert_short_float(float *out, const short *in, int len); + void convert_init(void); #endif /* _CONVERT_H_ */ diff --git a/Transceiver52M/common/convert_base.c b/Transceiver52M/common/convert_base.c new file mode 100644 index 00000000..5251fb8f --- /dev/null +++ b/Transceiver52M/common/convert_base.c @@ -0,0 +1,34 @@ +/* + * Conversion + * Copyright (C) 2012, 2013 Thomas Tsou + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "convert.h" + +void base_convert_float_short(short *out, const float *in, + float scale, int len) +{ + for (int i = 0; i < len; i++) + out[i] = in[i] * scale; +} + +void base_convert_short_float(float *out, const short *in, int len) +{ + for (int i = 0; i < len; i++) + out[i] = in[i]; +} + diff --git a/Transceiver52M/x86/Makefile.am b/Transceiver52M/x86/Makefile.am index 699faade..7a0b75f8 100644 --- a/Transceiver52M/x86/Makefile.am +++ b/Transceiver52M/x86/Makefile.am @@ -5,6 +5,7 @@ noinst_LTLIBRARIES = libarch.la libarch_la_SOURCES = \ ../common/convolve_base.c \ + ../common/convert_base.c \ convert.c \ convolve.c endif diff --git a/Transceiver52M/x86/convert.c b/Transceiver52M/x86/convert.c index db1c0fc5..3f76b656 100644 --- a/Transceiver52M/x86/convert.c +++ b/Transceiver52M/x86/convert.c @@ -170,28 +170,13 @@ static void _sse_convert_scale_ps_si16_16n(short *restrict out, } #endif -__attribute__((optimize("no-tree-vectorize"))) -static void convert_scale_ps_si16(short *out, const float *in, - float scale, int len) -{ - for (int i = 0; i < len; i++) - out[i] = in[i] * scale; -} - -__attribute__((optimize("no-tree-vectorize"))) -static void convert_si16_ps(float *out, const short *in, int len) -{ - for (int i = 0; i < len; i++) - out[i] = in[i]; -} - void convert_init(void) { - c.convert_scale_ps_si16_16n = convert_scale_ps_si16; - c.convert_scale_ps_si16_8n = convert_scale_ps_si16; - c.convert_scale_ps_si16 = convert_scale_ps_si16; - c.convert_si16_ps_16n = convert_si16_ps; - c.convert_si16_ps = convert_si16_ps; + c.convert_scale_ps_si16_16n = base_convert_float_short; + c.convert_scale_ps_si16_8n = base_convert_float_short; + c.convert_scale_ps_si16 = base_convert_float_short; + c.convert_si16_ps_16n = base_convert_short_float; + c.convert_si16_ps = base_convert_short_float; #ifdef HAVE_SSE4_1 if (__builtin_cpu_supports("sse4.1")) {