From 91435249c034c1ecf5db0c7341f05e86490e42fd Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sat, 30 May 2020 15:05:18 +0200 Subject: [PATCH] Added base support for runtime config --- src/sfizz/SIMDHelpers.cpp | 51 +++++++++++++++++++++++++++++++++++++++ src/sfizz/SIMDHelpers.h | 33 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/sfizz/SIMDHelpers.cpp diff --git a/src/sfizz/SIMDHelpers.cpp b/src/sfizz/SIMDHelpers.cpp new file mode 100644 index 00000000..b3081621 --- /dev/null +++ b/src/sfizz/SIMDHelpers.cpp @@ -0,0 +1,51 @@ +#include "SIMDHelpers.h" +#include + +namespace sfz{ + +static std::array(sfz::SIMDOps::_sentinel)> simdStatus; +static bool simdStatusInitialized = false; + +static void resetSIMDStatus() +{ + simdStatus[static_cast(SIMDOps::writeInterleaved)] = true; + simdStatus[static_cast(SIMDOps::readInterleaved)] = true; + simdStatus[static_cast(SIMDOps::fill)] = true; + simdStatus[static_cast(SIMDOps::gain)] = false; + simdStatus[static_cast(SIMDOps::divide)] = false; + simdStatus[static_cast(SIMDOps::mathfuns)] = false; + simdStatus[static_cast(SIMDOps::loopingSFZIndex)] = true; + simdStatus[static_cast(SIMDOps::saturatingSFZIndex)] = true; + simdStatus[static_cast(SIMDOps::linearRamp)] = false; + simdStatus[static_cast(SIMDOps::multiplicativeRamp)] = true; + simdStatus[static_cast(SIMDOps::add)] = false; + simdStatus[static_cast(SIMDOps::subtract)] = false; + simdStatus[static_cast(SIMDOps::multiplyAdd)] = false; + simdStatus[static_cast(SIMDOps::copy)] = false; + simdStatus[static_cast(SIMDOps::pan)] = false; + simdStatus[static_cast(SIMDOps::cumsum)] = true; + simdStatus[static_cast(SIMDOps::diff)] = false; + simdStatus[static_cast(SIMDOps::sfzInterpolationCast)] = true; + simdStatus[static_cast(SIMDOps::mean)] = false; + simdStatus[static_cast(SIMDOps::meanSquared)] = false; + simdStatus[static_cast(SIMDOps::upsampling)] = true; + simdStatusInitialized = true; +} + +static void setSIMDOpStatus(SIMDOps op, bool status) +{ + if (!simdStatusInitialized) + resetSIMDStatus(); + + simdStatus[static_cast(op)] = status; +} +static bool getSIMDOpStatus(SIMDOps op) +{ + if (!simdStatusInitialized) + resetSIMDStatus(); + + return simdStatus[static_cast(op)]; +} + +} + diff --git a/src/sfizz/SIMDHelpers.h b/src/sfizz/SIMDHelpers.h index 0600ddd6..732d615c 100644 --- a/src/sfizz/SIMDHelpers.h +++ b/src/sfizz/SIMDHelpers.h @@ -41,6 +41,39 @@ #include namespace sfz { + +// NOTE: The goal is to collapse all checks on release, and compute the sentinels for the span versions +// https://godbolt.org/z/43dveW shows this should work + +enum class SIMDOps { + writeInterleaved, + readInterleaved, + fill, + gain, + divide, + mathfuns, + loopingSFZIndex, + saturatingSFZIndex, + linearRamp, + multiplicativeRamp, + add, + subtract, + multiplyAdd, + copy, + pan, + cumsum, + diff, + sfzInterpolationCast, + mean, + meanSquared, + upsampling, + _sentinel // +}; +// Enable or disable SIMD accelerators at runtime +static void setSIMDOpStatus(SIMDOps op, bool status); +static bool getSIMDOpStatus(SIMDOps op); + + namespace _internals { template inline void snippetRead(const T*& input, T*& outputLeft, T*& outputRight)