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