mirror of
https://github.com/mborgerding/kissfft.git
synced 2026-05-25 13:08:42 -04:00
loongarch: add lsx simd opt
This commit is contained in:
@@ -109,6 +109,21 @@ if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$" AND NOT CMAKE_CROSSCOMPILI
|
|||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch32|loongarch64")
|
||||||
|
set (CMAKE_REQUIRED_FLAGS -mlsx)
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"int main() {
|
||||||
|
#if !defined(__loongarch_sx)
|
||||||
|
static_assert(false, \"__loongarch_sx is not defined\");
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}"
|
||||||
|
COMPILER_SUPPORT_LSX_FLAG
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
#
|
#
|
||||||
# Declare PKGINCLUDEDIR for kissfft include path
|
# Declare PKGINCLUDEDIR for kissfft include path
|
||||||
#
|
#
|
||||||
@@ -167,7 +182,10 @@ else()
|
|||||||
|
|
||||||
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
||||||
list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD)
|
list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD)
|
||||||
if (NOT MSVC)
|
if(COMPILER_SUPPORT_LSX_FLAG)
|
||||||
|
list(APPEND KISSFFT_COMPILE_DEFINITIONS HAVE_LSX)
|
||||||
|
target_compile_options(kissfft PRIVATE -mlsx)
|
||||||
|
elseif(NOT MSVC)
|
||||||
target_compile_options(kissfft PRIVATE -msse)
|
target_compile_options(kissfft PRIVATE -msse)
|
||||||
else()
|
else()
|
||||||
target_compile_options(kissfft PRIVATE "/arch:SSE")
|
target_compile_options(kissfft PRIVATE "/arch:SSE")
|
||||||
@@ -262,6 +280,10 @@ function(add_kissfft_executable NAME)
|
|||||||
target_link_libraries(${NAME} PRIVATE m)
|
target_link_libraries(${NAME} PRIVATE m)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(COMPILER_SUPPORT_LSX_FLAG)
|
||||||
|
target_compile_options(${NAME} PRIVATE -mlsx)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (NOT KISSFFT_OPENMP)
|
if (NOT KISSFFT_OPENMP)
|
||||||
set_target_properties(${NAME} PROPERTIES
|
set_target_properties(${NAME} PROPERTIES
|
||||||
OUTPUT_NAME "${NAME}-${KISSFFT_DATATYPE}")
|
OUTPUT_NAME "${NAME}-${KISSFFT_DATATYPE}")
|
||||||
@@ -329,7 +351,9 @@ if (KISSFFT_PKGCONFIG)
|
|||||||
join_paths(PKGCONFIG_KISSFFT_INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
|
join_paths(PKGCONFIG_KISSFFT_INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
||||||
list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD)
|
list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD)
|
||||||
if (NOT MSVC)
|
if(COMPILER_SUPPORT_LSX_FLAG)
|
||||||
|
set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} -mlsx")
|
||||||
|
elseif(NOT MSVC)
|
||||||
set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} -msse")
|
set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} -msse")
|
||||||
else()
|
else()
|
||||||
set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} /ARCH:SSE")
|
set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} /ARCH:SSE")
|
||||||
|
|||||||
27
Makefile
27
Makefile
@@ -72,6 +72,11 @@ ifneq ($(MAKECMDGOALS),clean)
|
|||||||
ifeq ($(_UNAME_ARCH),x86_64)
|
ifeq ($(_UNAME_ARCH),x86_64)
|
||||||
CANDIDATE_LIBDIR_NAME = lib64
|
CANDIDATE_LIBDIR_NAME = lib64
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(_UNAME_ARCH),loongarch64)
|
||||||
|
CANDIDATE_LIBDIR_NAME = lib64
|
||||||
|
HAVE_LSX=lsx
|
||||||
|
export HAVE_LSX
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -127,7 +132,11 @@ ifeq "$(KISSFFT_DATATYPE)" "int32_t"
|
|||||||
else ifeq "$(KISSFFT_DATATYPE)" "int16_t"
|
else ifeq "$(KISSFFT_DATATYPE)" "int16_t"
|
||||||
TYPEFLAGS += -DFIXED_POINT=16
|
TYPEFLAGS += -DFIXED_POINT=16
|
||||||
else ifeq "$(KISSFFT_DATATYPE)" "simd"
|
else ifeq "$(KISSFFT_DATATYPE)" "simd"
|
||||||
|
ifeq "$(HAVE_LSX)" "lsx"
|
||||||
|
TYPEFLAGS += -DUSE_SIMD=1 -DHAVE_LSX=1 -mlsx
|
||||||
|
else
|
||||||
TYPEFLAGS += -DUSE_SIMD=1 -msse
|
TYPEFLAGS += -DUSE_SIMD=1 -msse
|
||||||
|
endif
|
||||||
else ifeq "$(KISSFFT_DATATYPE)" "float"
|
else ifeq "$(KISSFFT_DATATYPE)" "float"
|
||||||
TYPEFLAGS += -Dkiss_fft_scalar=$(KISSFFT_DATATYPE)
|
TYPEFLAGS += -Dkiss_fft_scalar=$(KISSFFT_DATATYPE)
|
||||||
else ifeq "$(KISSFFT_DATATYPE)" "double"
|
else ifeq "$(KISSFFT_DATATYPE)" "double"
|
||||||
@@ -273,21 +282,33 @@ testall:
|
|||||||
$(MAKE) KISSFFT_DATATYPE=int16_t testsingle
|
$(MAKE) KISSFFT_DATATYPE=int16_t testsingle
|
||||||
# The simd and int32_t types may or may not work on your machine
|
# The simd and int32_t types may or may not work on your machine
|
||||||
$(MAKE) KISSFFT_DATATYPE=int32_t testsingle
|
$(MAKE) KISSFFT_DATATYPE=int32_t testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=simd testsingle
|
@if [ "$(HAVE_LSX)" = "lsx" ]; then \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd HAVE_LSX=lsx testsingle; \
|
||||||
|
else \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd testsingle; \
|
||||||
|
fi
|
||||||
# Static libraries
|
# Static libraries
|
||||||
$(MAKE) KISSFFT_DATATYPE=double KISSFFT_STATIC=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=double KISSFFT_STATIC=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=float KISSFFT_STATIC=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=float KISSFFT_STATIC=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=int16_t KISSFFT_STATIC=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=int16_t KISSFFT_STATIC=1 testsingle
|
||||||
# The simd and int32_t types may or may not work on your machine
|
# The simd and int32_t types may or may not work on your machine
|
||||||
$(MAKE) KISSFFT_DATATYPE=int32_t KISSFFT_STATIC=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=int32_t KISSFFT_STATIC=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=simd KISSFFT_STATIC=1 testsingle
|
@if [ "$(HAVE_LSX)" = "lsx" ]; then \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd HAVE_LSX=lsx KISSFFT_STATIC=1 testsingle; \
|
||||||
|
else \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd KISSFFT_STATIC=1 testsingle; \
|
||||||
|
fi
|
||||||
# OpenMP libraries
|
# OpenMP libraries
|
||||||
$(MAKE) KISSFFT_DATATYPE=double KISSFFT_OPENMP=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=double KISSFFT_OPENMP=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=float KISSFFT_OPENMP=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=float KISSFFT_OPENMP=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=int16_t KISSFFT_OPENMP=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=int16_t KISSFFT_OPENMP=1 testsingle
|
||||||
# The simd and int32_t types may or may not work on your machine
|
# The simd and int32_t types may or may not work on your machine
|
||||||
$(MAKE) KISSFFT_DATATYPE=int32_t KISSFFT_OPENMP=1 testsingle
|
$(MAKE) KISSFFT_DATATYPE=int32_t KISSFFT_OPENMP=1 testsingle
|
||||||
$(MAKE) KISSFFT_DATATYPE=simd KISSFFT_OPENMP=1 testsingle
|
@if [ "$(HAVE_LSX)" = "lsx" ]; then \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd HAVE_LSX=lsx KISSFFT_OPENMP=1 testsingle; \
|
||||||
|
else \
|
||||||
|
$(MAKE) KISSFFT_DATATYPE=simd KISSFFT_OPENMP=1 testsingle; \
|
||||||
|
fi
|
||||||
$(warning All tests passed!)
|
$(warning All tests passed!)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -128,6 +128,16 @@ struct kiss_fft_state{
|
|||||||
# define KISS_FFT_COS(phase) floor(.5+SAMP_MAX * cos (phase))
|
# define KISS_FFT_COS(phase) floor(.5+SAMP_MAX * cos (phase))
|
||||||
# define KISS_FFT_SIN(phase) floor(.5+SAMP_MAX * sin (phase))
|
# define KISS_FFT_SIN(phase) floor(.5+SAMP_MAX * sin (phase))
|
||||||
# define HALF_OF(x) ((x)>>1)
|
# define HALF_OF(x) ((x)>>1)
|
||||||
|
#elif defined(USE_SIMD) && defined(HAVE_LSX)
|
||||||
|
#define KISS_FFT_COS(phase) ({ \
|
||||||
|
float __cos_val = cosf(phase); \
|
||||||
|
(__m128)(__lsx_vldrepl_w(&__cos_val, 0)); \
|
||||||
|
})
|
||||||
|
#define KISS_FFT_SIN(phase) ({ \
|
||||||
|
float __sin_val = sinf(phase); \
|
||||||
|
(__m128)(__lsx_vldrepl_w(&__sin_val, 0)); \
|
||||||
|
})
|
||||||
|
#define HALF_OF(x) ((x) * (__m128)(__lsx_vreplgr2vr_w(0x3F000000))) // 0.5f
|
||||||
#elif defined(USE_SIMD)
|
#elif defined(USE_SIMD)
|
||||||
# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )
|
# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )
|
||||||
# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )
|
# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )
|
||||||
|
|||||||
15
kiss_fft.h
15
kiss_fft.h
@@ -48,16 +48,29 @@ extern "C" {
|
|||||||
|
|
||||||
/* User may override KISS_FFT_MALLOC and/or KISS_FFT_FREE. */
|
/* User may override KISS_FFT_MALLOC and/or KISS_FFT_FREE. */
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
# include <lsxintrin.h>
|
||||||
|
# define kiss_fft_scalar __m128
|
||||||
|
# ifndef KISS_FFT_MALLOC
|
||||||
|
# define KISS_FFT_MALLOC(nbytes) aligned_alloc(16, KISS_FFT_ALIGN_SIZE_UP(nbytes))
|
||||||
|
# define KISS_FFT_ALIGN_CHECK(ptr)
|
||||||
|
# define KISS_FFT_ALIGN_SIZE_UP(size) ((size + 15UL) & ~0xFUL)
|
||||||
|
# endif
|
||||||
|
# ifndef KISS_FFT_FREE
|
||||||
|
# define KISS_FFT_FREE free
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
# include <xmmintrin.h>
|
# include <xmmintrin.h>
|
||||||
# define kiss_fft_scalar __m128
|
# define kiss_fft_scalar __m128
|
||||||
# ifndef KISS_FFT_MALLOC
|
# ifndef KISS_FFT_MALLOC
|
||||||
# define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16)
|
# define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16)
|
||||||
# define KISS_FFT_ALIGN_CHECK(ptr)
|
# define KISS_FFT_ALIGN_CHECK(ptr)
|
||||||
# define KISS_FFT_ALIGN_SIZE_UP(size) ((size + 15UL) & ~0xFUL)
|
# define KISS_FFT_ALIGN_SIZE_UP(size) ((size + 15UL) & ~0xFUL)
|
||||||
# endif
|
# endif
|
||||||
# ifndef KISS_FFT_FREE
|
# ifndef KISS_FFT_FREE
|
||||||
# define KISS_FFT_FREE _mm_free
|
# define KISS_FFT_FREE _mm_free
|
||||||
# endif
|
# endif
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
# define KISS_FFT_ALIGN_CHECK(ptr)
|
# define KISS_FFT_ALIGN_CHECK(ptr)
|
||||||
# define KISS_FFT_ALIGN_SIZE_UP(size) (size)
|
# define KISS_FFT_ALIGN_SIZE_UP(size) (size)
|
||||||
|
|||||||
10
kiss_fftr.c
10
kiss_fftr.c
@@ -93,7 +93,12 @@ void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *fr
|
|||||||
freqdata[0].r = tdc.r + tdc.i;
|
freqdata[0].r = tdc.r + tdc.i;
|
||||||
freqdata[ncfft].r = tdc.r - tdc.i;
|
freqdata[ncfft].r = tdc.r - tdc.i;
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
freqdata[0].i = (__m128)(__lsx_vreplgr2vr_w(0));
|
||||||
|
freqdata[ncfft].i = freqdata[0].i;
|
||||||
|
#else
|
||||||
freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0);
|
freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
freqdata[ncfft].i = freqdata[0].i = 0;
|
freqdata[ncfft].i = freqdata[0].i = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -146,7 +151,12 @@ void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *t
|
|||||||
C_ADD (st->tmpbuf[k], fek, fok);
|
C_ADD (st->tmpbuf[k], fek, fok);
|
||||||
C_SUB (st->tmpbuf[ncfft - k], fek, fok);
|
C_SUB (st->tmpbuf[ncfft - k], fek, fok);
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
__m128 neg_one = (__m128)__lsx_vreplgr2vr_w(0xBF800000); // -1.0f
|
||||||
|
st->tmpbuf[ncfft - k].i = __lsx_vfmul_s(st->tmpbuf[ncfft - k].i, neg_one);
|
||||||
|
#else
|
||||||
st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0);
|
st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
st->tmpbuf[ncfft - k].i *= -1;
|
st->tmpbuf[ncfft - k].i *= -1;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ function(add_kissfft_test_executable NAME)
|
|||||||
add_kissfft_executable(${NAME} ${ARGN})
|
add_kissfft_executable(${NAME} ${ARGN})
|
||||||
target_include_directories(${NAME} PRIVATE ..)
|
target_include_directories(${NAME} PRIVATE ..)
|
||||||
|
|
||||||
|
if(COMPILER_SUPPORT_LSX_FLAG)
|
||||||
|
target_compile_options(${NAME} PRIVATE -mlsx)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_test(NAME ${NAME} COMMAND ${NAME})
|
add_test(NAME ${NAME} COMMAND ${NAME})
|
||||||
set_tests_properties(${NAME} PROPERTIES TIMEOUT 3600)
|
set_tests_properties(${NAME} PROPERTIES TIMEOUT 3600)
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -46,7 +50,9 @@ add_kissfft_test_executable(testcpp testcpp.cc)
|
|||||||
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
||||||
add_kissfft_test_executable(tsimd test_simd.c)
|
add_kissfft_test_executable(tsimd test_simd.c)
|
||||||
target_compile_definitions(tsimd PRIVATE USE_SIMD)
|
target_compile_definitions(tsimd PRIVATE USE_SIMD)
|
||||||
if (NOT MSVC)
|
if(COMPILER_SUPPORT_LSX_FLAG)
|
||||||
|
target_compile_options(kissfft PRIVATE -mlsx)
|
||||||
|
elseif(NOT MSVC)
|
||||||
target_compile_options(kissfft PRIVATE -msse)
|
target_compile_options(kissfft PRIVATE -msse)
|
||||||
else()
|
else()
|
||||||
target_compile_options(kissfft PRIVATE "/arch:SSE")
|
target_compile_options(kissfft PRIVATE "/arch:SSE")
|
||||||
|
|||||||
@@ -143,7 +143,11 @@ endif
|
|||||||
|
|
||||||
$(TESTSIMD): test_simd.c
|
$(TESTSIMD): test_simd.c
|
||||||
ifeq "$(KISSFFT_DATATYPE)" "simd"
|
ifeq "$(KISSFFT_DATATYPE)" "simd"
|
||||||
|
ifeq "$(HAVE_LSX)" "lsx"
|
||||||
|
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -DHAVE_LSX=1 -mlsx $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
||||||
|
else
|
||||||
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -msse $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -msse $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
$(error ERROR: This test makes sense only with KISSFFT_DATATYPE=simd)
|
$(error ERROR: This test makes sense only with KISSFFT_DATATYPE=simd)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -22,7 +22,12 @@ static
|
|||||||
kiss_fft_scalar rand_scalar(void)
|
kiss_fft_scalar rand_scalar(void)
|
||||||
{
|
{
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
float tmp = rand()-RAND_MAX/2;
|
||||||
|
return (__m128)(__lsx_vldrepl_w(&tmp, 0));
|
||||||
|
#else
|
||||||
return _mm_set1_ps(rand()-RAND_MAX/2);
|
return _mm_set1_ps(rand()-RAND_MAX/2);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
kiss_fft_scalar s = (kiss_fft_scalar)(rand() -RAND_MAX/2);
|
kiss_fft_scalar s = (kiss_fft_scalar)(rand() -RAND_MAX/2);
|
||||||
return s/2;
|
return s/2;
|
||||||
|
|||||||
@@ -6,16 +6,30 @@ static void test1(void)
|
|||||||
int n[2] = {256,256};
|
int n[2] = {256,256};
|
||||||
size_t nbytes = sizeof(kiss_fft_cpx)*n[0]*n[1];
|
size_t nbytes = sizeof(kiss_fft_cpx)*n[0]*n[1];
|
||||||
|
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
kiss_fft_cpx * inbuf = NULL;
|
||||||
|
kiss_fft_cpx * outbuf = NULL;
|
||||||
|
if (posix_memalign((void**)&inbuf, 16, nbytes) ||
|
||||||
|
posix_memalign((void**)&outbuf, 16, nbytes))
|
||||||
|
return;
|
||||||
|
#else
|
||||||
kiss_fft_cpx * inbuf = _mm_malloc(nbytes,16);
|
kiss_fft_cpx * inbuf = _mm_malloc(nbytes,16);
|
||||||
kiss_fft_cpx * outbuf = _mm_malloc(nbytes,16);
|
kiss_fft_cpx * outbuf = _mm_malloc(nbytes,16);
|
||||||
|
#endif
|
||||||
memset(inbuf,0,nbytes);
|
memset(inbuf,0,nbytes);
|
||||||
memset(outbuf,0,nbytes);
|
memset(outbuf,0,nbytes);
|
||||||
|
|
||||||
kiss_fftnd_cfg cfg = kiss_fftnd_alloc(n,2,is_inverse,0,0);
|
kiss_fftnd_cfg cfg = kiss_fftnd_alloc(n,2,is_inverse,0,0);
|
||||||
kiss_fftnd(cfg,inbuf,outbuf);
|
kiss_fftnd(cfg,inbuf,outbuf);
|
||||||
kiss_fft_free(cfg);
|
kiss_fft_free(cfg);
|
||||||
|
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
free(inbuf);
|
||||||
|
free(outbuf);
|
||||||
|
#else
|
||||||
_mm_free(inbuf);
|
_mm_free(inbuf);
|
||||||
_mm_free(outbuf);
|
_mm_free(outbuf);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|||||||
@@ -38,8 +38,14 @@ double two_tone_test( int nfft, int bin1,int bin2)
|
|||||||
/* generate a signal with two tones*/
|
/* generate a signal with two tones*/
|
||||||
for (i = 0; i < nfft; i++) {
|
for (i = 0; i < nfft; i++) {
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
float tmp = (maxrange>>1)*cos(f1*i) + (maxrange>>1)*cos(f2*i);
|
||||||
|
tbuf[i] = (__m128)__lsx_vldrepl_w(&tmp, 0);
|
||||||
|
|
||||||
|
#else
|
||||||
tbuf[i] = _mm_set1_ps( (maxrange>>1)*cos(f1*i)
|
tbuf[i] = _mm_set1_ps( (maxrange>>1)*cos(f1*i)
|
||||||
+ (maxrange>>1)*cos(f2*i) );
|
+ (maxrange>>1)*cos(f2*i) );
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
tbuf[i] = (maxrange>>1)*cos(f1*i)
|
tbuf[i] = (maxrange>>1)*cos(f1*i)
|
||||||
+ (maxrange>>1)*cos(f2*i);
|
+ (maxrange>>1)*cos(f2*i);
|
||||||
|
|||||||
@@ -154,8 +154,14 @@ kiss_fastfir_cfg kiss_fastfir_alloc(
|
|||||||
|
|
||||||
for ( i=0; i < st->n_freq_bins; ++i ) {
|
for ( i=0; i < st->n_freq_bins; ++i ) {
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
|
#ifdef HAVE_LSX
|
||||||
|
__m128 tmp = (__m128)__lsx_vldrepl_w(&scale, 0);
|
||||||
|
st->fir_freq_resp[i].r = __lsx_vfmul_s(tmp, st->fir_freq_resp[i].r);
|
||||||
|
st->fir_freq_resp[i].i = __lsx_vfmul_s(tmp, st->fir_freq_resp[i].i);
|
||||||
|
#else
|
||||||
st->fir_freq_resp[i].r *= _mm_set1_ps(scale);
|
st->fir_freq_resp[i].r *= _mm_set1_ps(scale);
|
||||||
st->fir_freq_resp[i].i *= _mm_set1_ps(scale);
|
st->fir_freq_resp[i].i *= _mm_set1_ps(scale);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
st->fir_freq_resp[i].r *= scale;
|
st->fir_freq_resp[i].r *= scale;
|
||||||
st->fir_freq_resp[i].i *= scale;
|
st->fir_freq_resp[i].i *= scale;
|
||||||
@@ -286,7 +292,11 @@ void direct_file_filter(
|
|||||||
tmph = imp_resp+nlag;
|
tmph = imp_resp+nlag;
|
||||||
#ifdef REAL_FASTFIR
|
#ifdef REAL_FASTFIR
|
||||||
# ifdef USE_SIMD
|
# ifdef USE_SIMD
|
||||||
|
# ifdef HAVE_LSX
|
||||||
|
outval = (__m128)(__lsx_vreplgr2vr_w(0));
|
||||||
|
#else
|
||||||
outval = _mm_set1_ps(0);
|
outval = _mm_set1_ps(0);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
outval = 0;
|
outval = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -297,7 +307,12 @@ void direct_file_filter(
|
|||||||
outval += buf[k] * *tmph;
|
outval += buf[k] * *tmph;
|
||||||
#else
|
#else
|
||||||
# ifdef USE_SIMD
|
# ifdef USE_SIMD
|
||||||
|
# ifdef HAVE_LSX
|
||||||
|
outval.i = (__m128)(__lsx_vreplgr2vr_w(0));
|
||||||
|
outval.r = outval.i;
|
||||||
|
#else
|
||||||
outval.r = outval.i = _mm_set1_ps(0);
|
outval.r = outval.i = _mm_set1_ps(0);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
outval.r = outval.i = 0;
|
outval.r = outval.i = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user