From fefdc26f84f6735131b91ca7c046105af7208204 Mon Sep 17 00:00:00 2001 From: Martin Koch Date: Wed, 13 May 2020 10:23:05 +0200 Subject: [PATCH] plugin: workaround for AVX intrinsic: "_mm256_setr_m128()" missing in GCC Signed-off-by: Martin Koch --- spa/plugins/audioconvert/fmt-ops-avx2.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/spa/plugins/audioconvert/fmt-ops-avx2.c b/spa/plugins/audioconvert/fmt-ops-avx2.c index ba9262e57..065fa997e 100644 --- a/spa/plugins/audioconvert/fmt-ops-avx2.c +++ b/spa/plugins/audioconvert/fmt-ops-avx2.c @@ -25,6 +25,14 @@ #include "fmt-ops.h" #include +// GCC: workaround for missing AVX intrinsic: "_mm256_setr_m128()" +// (see https://stackoverflow.com/questions/32630458/setting-m256i-to-the-value-of-two-m128i-values) +#ifndef _mm256_setr_m128i +# ifndef _mm256_set_m128i +# define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) +# endif +# define _mm256_setr_m128i(v0, v1) _mm256_set_m128i((v1), (v0)) +#endif static void conv_s16_to_f32d_1s_avx2(void *data, void * SPA_RESTRICT dst[], const void * SPA_RESTRICT src, @@ -489,10 +497,10 @@ conv_s32_to_f32d_1s_avx2(void *data, void * SPA_RESTRICT dst[], const void * SPA for(n = 0; n < unrolled; n += 16) { in[0] = _mm256_setr_m128i( _mm256_i64gather_epi32(&s[ 0*n_channels], mask1, 4), - _mm256_i64gather_epi32(&s[ 0*n_channels], mask2, 4)), + _mm256_i64gather_epi32(&s[ 0*n_channels], mask2, 4)); in[1] = _mm256_setr_m128i( _mm256_i64gather_epi32(&s[ 8*n_channels], mask1, 4), - _mm256_i64gather_epi32(&s[ 8*n_channels], mask2, 4)), + _mm256_i64gather_epi32(&s[ 8*n_channels], mask2, 4)); in[0] = _mm256_srai_epi32(in[0], 8); in[1] = _mm256_srai_epi32(in[1], 8);