17 #ifndef DISTRHO_SCOPED_DENORMAL_DISABLE_HPP_INCLUDED
18 #define DISTRHO_SCOPED_DENORMAL_DISABLE_HPP_INCLUDED
20 #include "../DistrhoUtils.hpp"
23 # include <xmmintrin.h>
55 #if defined(__SSE2_MATH__)
56 typedef uint cpuflags_t;
57 #elif defined(__aarch64__)
58 typedef uint64_t cpuflags_t;
59 #elif defined(__arm__) && !defined(__SOFTFP__)
60 typedef uint32_t cpuflags_t;
62 typedef char cpuflags_t;
69 inline void setFlags(cpuflags_t flags) noexcept;
72 DISTRHO_PREVENT_HEAP_ALLOCATION
78 inline ScopedDenormalDisable::ScopedDenormalDisable() noexcept
81 #if defined(__SSE2_MATH__)
82 oldflags = _mm_getcsr();
83 setFlags(oldflags | 0x8040);
84 #elif defined(__aarch64__)
85 __asm__ __volatile__(
"mrs %0, fpcr" :
"=r" (oldflags));
86 setFlags(oldflags | 0x1000000);
87 __asm__ __volatile__(
"isb");
88 #elif defined(__arm__) && !defined(__SOFTFP__)
89 __asm__ __volatile__(
"vmrs %0, fpscr" :
"=r" (oldflags));
90 setFlags(oldflags | 0x1000000);
94 inline void ScopedDenormalDisable::setFlags(
const cpuflags_t flags) noexcept
96 #if defined(__SSE2_MATH__)
98 #elif defined(__aarch64__)
99 __asm__ __volatile__(
"msr fpcr, %0" ::
"r" (flags));
100 #elif defined(__arm__) && !defined(__SOFTFP__)
101 __asm__ __volatile__(
"vmsr fpscr, %0" ::
"r" (flags));
Definition: ScopedDenormalDisable.hpp:37
#define END_NAMESPACE_DISTRHO
Definition: DistrhoInfo.hpp:949
#define START_NAMESPACE_DISTRHO
Definition: DistrhoInfo.hpp:943