diff --git a/src/sfizz/SIMDHelpers.h b/src/sfizz/SIMDHelpers.h index 29e7f2ba..3db5d7bb 100644 --- a/src/sfizz/SIMDHelpers.h +++ b/src/sfizz/SIMDHelpers.h @@ -566,8 +566,8 @@ namespace _internals { template inline void snippetRampMultiplicative(T*& output, T& value, T step) { - value *= step; *output++ = value; + value *= step; } } diff --git a/src/sfizz/SIMDSSE.cpp b/src/sfizz/SIMDSSE.cpp index d76e5528..1048e9cc 100644 --- a/src/sfizz/SIMDSSE.cpp +++ b/src/sfizz/SIMDSSE.cpp @@ -487,7 +487,7 @@ float sfz::multiplicativeRamp(absl::Span output, float value while (unaligned(out) && out < lastAligned) _internals::snippetRampMultiplicative(out, value, step); - auto mmValue = _mm_set1_ps(value); + auto mmValue = _mm_set1_ps(value / step); auto mmStep = _mm_set_ps(step * step * step * step, step * step * step, step * step, step); while (out < lastAligned) { @@ -497,7 +497,7 @@ float sfz::multiplicativeRamp(absl::Span output, float value out += TypeAlignment; } - value = _mm_cvtss_f32(mmValue); + value = _mm_cvtss_f32(mmValue) * step; while (out < output.end()) _internals::snippetRampMultiplicative(out, value, step); return value; diff --git a/tests/SIMDHelpersT.cpp b/tests/SIMDHelpersT.cpp index 327eb29b..44c837c4 100644 --- a/tests/SIMDHelpersT.cpp +++ b/tests/SIMDHelpersT.cpp @@ -539,7 +539,7 @@ TEST_CASE("[Helpers] Multiplicative Ramp") const float start { 1.0f }; const float v { fillValue }; std::array output; - std::array expected { v, v * v, v * v * v, v * v * v * v, v * v * v * v * v, v * v * v * v * v * v }; + std::array expected { start, start * v, start * v * v, start * v * v * v, start * v * v * v * v, start * v * v * v * v * v }; sfz::multiplicativeRamp(absl::MakeSpan(output), start, v); REQUIRE(approxEqual(output, expected)); } @@ -549,7 +549,7 @@ TEST_CASE("[Helpers] Multiplicative Ramp (SIMD)") const float start { 1.0f }; const float v { fillValue }; std::array output; - std::array expected { v, v * v, v * v * v, v * v * v * v, v * v * v * v * v, v * v * v * v * v * v }; + std::array expected { start, start * v, start * v * v, start * v * v * v, start * v * v * v * v, start * v * v * v * v * v }; sfz::multiplicativeRamp(absl::MakeSpan(output), start, v); REQUIRE(approxEqual(output, expected)); }