diff --git a/src/sfizz/SIMDSSE.cpp b/src/sfizz/SIMDSSE.cpp index 23e8dcd7..c61151dc 100644 --- a/src/sfizz/SIMDSSE.cpp +++ b/src/sfizz/SIMDSSE.cpp @@ -45,34 +45,25 @@ struct AlignmentSentinels { float* lastAligned; }; -float* nextAligned(const float* ptr) +constexpr float* nextAligned(const float* ptr) { return reinterpret_cast((reinterpret_cast(ptr) + ByteAlignmentMask) & (~ByteAlignmentMask)); } -float* prevAligned(const float* ptr) +constexpr float* prevAligned(const float* ptr) { return reinterpret_cast(reinterpret_cast(ptr) & (~ByteAlignmentMask)); } -bool unaligned(const float* ptr) +constexpr bool unaligned(const float* ptr) { return (reinterpret_cast(ptr) & ByteAlignmentMask) != 0; } -bool unaligned(const float* ptr1, const float* ptr2) +template +constexpr bool unaligned(const float* ptr1, Args... rest) { - return unaligned(ptr1) || unaligned(ptr2); -} - -bool unaligned(const float* ptr1, const float* ptr2, const float* ptr3) -{ - return unaligned(ptr1) || unaligned(ptr2) || unaligned(ptr3); -} - -bool unaligned(const float* ptr1, const float* ptr2, const float* ptr3, const float* ptr4) -{ - return unaligned(ptr1) || unaligned(ptr2) || unaligned(ptr3) || unaligned(ptr4); + return unaligned(ptr1) || unaligned(rest...); } template <> @@ -186,8 +177,7 @@ void sfz::exp(absl::Span input, absl::Span outp while (in < lastAligned) { _mm_store_ps(out, exp_ps(_mm_load_ps(in))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(out, in); } while (in < sentinel) @@ -208,8 +198,7 @@ void sfz::cos(absl::Span input, absl::Span outp while (in < lastAligned) { _mm_store_ps(out, cos_ps(_mm_load_ps(in))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(out, in); } while (in < sentinel) @@ -230,8 +219,7 @@ void sfz::log(absl::Span input, absl::Span outp while (in < lastAligned) { _mm_store_ps(out, log_ps(_mm_load_ps(in))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(out, in); } while (in < sentinel) @@ -252,8 +240,7 @@ void sfz::sin(absl::Span input, absl::Span outp while (in < lastAligned) { _mm_store_ps(out, sin_ps(_mm_load_ps(in))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(out, in); } while (in < sentinel) @@ -274,8 +261,7 @@ void sfz::applyGain(float gain, absl::Span input, absl while (out < lastAligned) { _mm_store_ps(out, _mm_mul_ps(mmGain, _mm_load_ps(in))); - in += TypeAlignment; - out += TypeAlignment; + incrementAll(out, in); } while (out < output.end()) @@ -296,9 +282,7 @@ void sfz::applyGain(absl::Span gain, absl::Span(g, in, out); } while (out < output.end()) @@ -320,9 +304,7 @@ void sfz::divide(absl::Span input, absl::Span(in, div, out); } while (out < output.end()) @@ -346,9 +328,7 @@ void sfz::multiplyAdd(absl::Span gain, absl::Span(g, in, out); } while (out < output.end()) @@ -405,10 +385,7 @@ float sfz::loopingSFZIndex(absl::Span jumps, mmFloatIndex = _mm_shuffle_ps(mmFloatIndex, mmFloatIndex, _MM_SHUFFLE(3, 3, 3, 3)); // floatingIndex = _mm_cvtss_f32(_mm_shuffle_ps(mmFloatIndex, mmFloatIndex, _MM_SHUFFLE(0, 0, 0, 3)));; // floatingIndex = *(index + 3) + *(rightCoeff + 3); - index += TypeAlignment; - jump += TypeAlignment; - leftCoeff += TypeAlignment; - rightCoeff += TypeAlignment; + incrementAll(index, jump, leftCoeff, rightCoeff); } floatIndex = _mm_cvtss_f32(mmFloatIndex); @@ -463,10 +440,7 @@ float sfz::saturatingSFZIndex(absl::Span jumps, mmFloatIndex = _mm_shuffle_ps(mmFloatIndex, mmFloatIndex, _MM_SHUFFLE(3, 3, 3, 3)); // floatingIndex = _mm_cvtss_f32(_mm_shuffle_ps(mmFloatIndex, mmFloatIndex, _MM_SHUFFLE(0, 0, 0, 3)));; // floatingIndex = *(index + 3) + *(rightCoeff + 3); - index += TypeAlignment; - jump += TypeAlignment; - leftCoeff += TypeAlignment; - rightCoeff += TypeAlignment; + incrementAll(index, jump, leftCoeff, rightCoeff); } floatIndex = _mm_cvtss_f32(mmFloatIndex); @@ -539,8 +513,7 @@ void sfz::add(absl::Span input, absl::Span outp while (out < lastAligned) { _mm_store_ps(out, _mm_add_ps(_mm_load_ps(in), _mm_load_ps(out))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(in, out); } while (out < sentinel) @@ -581,8 +554,7 @@ void sfz::subtract(absl::Span input, absl::Span while (out < lastAligned) { _mm_store_ps(out, _mm_sub_ps(_mm_load_ps(out), _mm_load_ps(in))); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(in, out); } while (out < sentinel) @@ -623,8 +595,7 @@ void sfz::copy(absl::Span input, absl::Span out while (out < lastAligned) { _mm_store_ps(out, _mm_load_ps(in)); - out += TypeAlignment; - in += TypeAlignment; + incrementAll(in, out); } while (out < sentinel) @@ -658,9 +629,7 @@ void sfz::pan(absl::Span panEnvelope, absl::Span(pan, left, right); } while (pan < sentinel) @@ -760,8 +729,7 @@ void sfz::cumsum(absl::Span input, absl::Span o mmOutput = _mm_add_ps(mmOutput, mmOffset); _mm_store_ps(out, mmOutput); mmOutput = _mm_shuffle_ps(mmOutput, mmOutput, _MM_SHUFFLE(3, 3, 3, 3)); - in += TypeAlignment; - out += TypeAlignment; + incrementAll(in, out); } while (in < sentinel) @@ -794,10 +762,7 @@ void sfz::sfzInterpolationCast(absl::Span floatJumps, auto mmLeft = _mm_sub_ps(_mm_set_ps1(1.0f), mmRight); _mm_store_ps(leftCoeff, mmLeft); _mm_store_ps(rightCoeff, mmRight); - floatJump += TypeAlignment; - jump += TypeAlignment; - leftCoeff += TypeAlignment; - rightCoeff += TypeAlignment; + incrementAll(floatJump, jump, leftCoeff, rightCoeff); } while(floatJump < sentinel) @@ -828,8 +793,7 @@ void sfz::diff(absl::Span input, absl::Span out mmBase = mmNextBase; mmOutput = _mm_sub_ps(mmOutput, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(mmOutput), 4))); _mm_store_ps(out, mmOutput); - in += TypeAlignment; - out += TypeAlignment; + incrementAll(in, out); } while (in < sentinel)