mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Added disableDenormalisedNumberSupport to query if denormals are disabled and improved documentation
This commit is contained in:
parent
bd9a8a8529
commit
2ac2a39a21
2 changed files with 28 additions and 8 deletions
|
|
@ -1084,7 +1084,7 @@ void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnab
|
|||
#endif
|
||||
}
|
||||
|
||||
void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport() noexcept
|
||||
void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool shouldDisable) noexcept
|
||||
{
|
||||
#if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))
|
||||
#if JUCE_USE_SSE_INTRINSICS
|
||||
|
|
@ -1093,14 +1093,31 @@ void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport() noe
|
|||
intptr_t mask = (1 << 24 /* FZ */);
|
||||
#endif
|
||||
|
||||
setFpStatusRegister (getFpStatusRegister() | mask);
|
||||
setFpStatusRegister ((getFpStatusRegister() & (~mask)) | (shouldDisable ? mask : 0));
|
||||
#else
|
||||
ignoreUnused (shouldDisable);
|
||||
|
||||
#if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))
|
||||
jassertfalse; // No support for disable denormals mode on your platform
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
bool JUCE_CALLTYPE FloatVectorOperations::areDenormalsDisabled() noexcept
|
||||
{
|
||||
#if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))
|
||||
#if JUCE_USE_SSE_INTRINSICS
|
||||
intptr_t mask = 0x8040;
|
||||
#else /*JUCE_USE_ARM_NEON*/
|
||||
intptr_t mask = (1 << 24 /* FZ */);
|
||||
#endif
|
||||
|
||||
return ((getFpStatusRegister() & mask) == mask);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
ScopedNoDenormals::ScopedNoDenormals() noexcept
|
||||
{
|
||||
#if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))
|
||||
|
|
|
|||
|
|
@ -210,16 +210,19 @@ public:
|
|||
/** Finds the maximum value in the given array. */
|
||||
static double JUCE_CALLTYPE findMaximum (const double* src, int numValues) noexcept;
|
||||
|
||||
/** On Intel CPUs, this method enables or disables the SSE flush-to-zero mode.
|
||||
Effectively, this is a wrapper around a call to _MM_SET_FLUSH_ZERO_MODE
|
||||
*/
|
||||
/** This method enables or disables the SSE/NEON flush-to-zero mode. */
|
||||
static void JUCE_CALLTYPE enableFlushToZeroMode (bool shouldEnable) noexcept;
|
||||
|
||||
/** On Intel CPUs, this method enables the SSE flush-to-zero and denormalised-are-zero modes.
|
||||
This effectively sets the DAZ and FZ bits of the MXCSR register. It's a convenient thing to
|
||||
call before audio processing code where you really want to avoid denormalisation performance hits.
|
||||
This effectively sets the DAZ and FZ bits of the MXCSR register. On arm CPUs this will
|
||||
enable flush to zero mode.
|
||||
It's a convenient thing to call before audio processing code where you really want to
|
||||
avoid denormalisation performance hits.
|
||||
*/
|
||||
static void JUCE_CALLTYPE disableDenormalisedNumberSupport() noexcept;
|
||||
static void JUCE_CALLTYPE disableDenormalisedNumberSupport (bool shouldDisable = true) noexcept;
|
||||
|
||||
/** This method returns true if denormals are currently disabled. */
|
||||
static bool JUCE_CALLTYPE areDenormalsDisabled() noexcept;
|
||||
|
||||
private:
|
||||
friend ScopedNoDenormals;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue