From cb9cc622d06097dbfcf99a4ab4520ce51a0c02cc Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 16 Feb 2021 00:36:46 +0100 Subject: [PATCH] Rewrite SIMD sum 4-to-1 --- src/sfizz/Interpolators.hpp | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/src/sfizz/Interpolators.hpp b/src/sfizz/Interpolators.hpp index 8080dbdc..2585704e 100644 --- a/src/sfizz/Interpolators.hpp +++ b/src/sfizz/Interpolators.hpp @@ -11,6 +11,7 @@ #include #if SIMDE_NATURAL_VECTOR_SIZE_GE(128) #include +#include #endif namespace sfz { @@ -63,15 +64,7 @@ public: simde__m128 x = simde_mm_sub_ps(simde_mm_setr_ps(-1, 0, 1, 2), simde_mm_set1_ps(coeff)); simde__m128 h = hermite3x4(x); simde__m128 y = simde_mm_mul_ps(h, simde_mm_loadu_ps(values - 1)); - // sum 4 to 1 - simde__m128 xmm0 = y; - simde__m128 xmm1 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe5); - simde__m128 xmm2 = simde_mm_movehl_ps(xmm0, xmm0); - xmm1 = simde_mm_add_ss(xmm1, xmm0); - xmm0 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe7); - xmm2 = simde_mm_add_ss(xmm2, xmm1); - xmm0 = simde_mm_add_ss(xmm0, xmm2); - return simde_mm_cvtss_f32(xmm0); + return simde_vaddvq_f32(y); } }; #endif @@ -107,15 +100,7 @@ public: simde__m128 x = simde_mm_sub_ps(simde_mm_setr_ps(-1, 0, 1, 2), simde_mm_set1_ps(coeff)); simde__m128 h = bspline3x4(x); simde__m128 y = simde_mm_mul_ps(h, simde_mm_loadu_ps(values - 1)); - // sum 4 to 1 - simde__m128 xmm0 = y; - simde__m128 xmm1 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe5); - simde__m128 xmm2 = simde_mm_movehl_ps(xmm0, xmm0); - xmm1 = simde_mm_add_ss(xmm1, xmm0); - xmm0 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe7); - xmm2 = simde_mm_add_ss(xmm2, xmm1); - xmm0 = simde_mm_add_ss(xmm0, xmm2); - return simde_mm_cvtss_f32(xmm0); + return simde_vaddvq_f32(y); } }; #endif @@ -218,15 +203,7 @@ public: i += 4; } while (i < Points); - // sum 4 to 1 - simde__m128 xmm0 = y; - simde__m128 xmm1 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe5); - simde__m128 xmm2 = simde_mm_movehl_ps(xmm0, xmm0); - xmm1 = simde_mm_add_ss(xmm1, xmm0); - xmm0 = simde_mm_shuffle_ps(xmm0, xmm0, 0xe7); - xmm2 = simde_mm_add_ss(xmm2, xmm1); - xmm0 = simde_mm_add_ss(xmm0, xmm2); - return simde_mm_cvtss_f32(xmm0); + return simde_vaddvq_f32(y); } }; #endif