51#if defined(__x86_64__) || defined(_M_X64)
52#define PULP_FLUSH_DENORMALS_X86 1
60#elif (defined(__aarch64__) || defined(_M_ARM64)) && defined(__GNUC__)
61#define PULP_FLUSH_DENORMALS_ARM64 1
67#if defined(PULP_FLUSH_DENORMALS_X86)
70inline constexpr unsigned int kMxcsrFtz = 0x8000u;
71#elif defined(PULP_FLUSH_DENORMALS_ARM64)
72inline constexpr std::uint64_t kFpcrFz = std::uint64_t(1) << 24;
74inline std::uint64_t read_fpcr() noexcept {
75 std::uint64_t fpcr = 0;
76 __asm__ __volatile__(
"mrs %0, fpcr" :
"=r"(fpcr));
79inline void write_fpcr(std::uint64_t fpcr)
noexcept {
80 __asm__ __volatile__(
"msr fpcr, %0" : :
"r"(fpcr));
88#if defined(PULP_FLUSH_DENORMALS_X86) || defined(PULP_FLUSH_DENORMALS_ARM64)
97#if defined(PULP_FLUSH_DENORMALS_X86)
98 return (_mm_getcsr() & detail::kMxcsrFtz) != 0;
99#elif defined(PULP_FLUSH_DENORMALS_ARM64)
100 return (detail::read_fpcr() & detail::kFpcrFz) != 0;
114#if defined(PULP_FLUSH_DENORMALS_X86)
115 saved_csr_ = _mm_getcsr();
116 if ((saved_csr_ & detail::kMxcsrFtz) == 0)
117 _mm_setcsr(saved_csr_ | detail::kMxcsrFtz);
118#elif defined(PULP_FLUSH_DENORMALS_ARM64)
119 saved_fpcr_ = detail::read_fpcr();
120 if ((saved_fpcr_ & detail::kFpcrFz) == 0)
121 detail::write_fpcr(saved_fpcr_ | detail::kFpcrFz);
126#if defined(PULP_FLUSH_DENORMALS_X86)
127 if (_mm_getcsr() != saved_csr_)
128 _mm_setcsr(saved_csr_);
129#elif defined(PULP_FLUSH_DENORMALS_ARM64)
130 if (detail::read_fpcr() != saved_fpcr_)
131 detail::write_fpcr(saved_fpcr_);
141#if defined(PULP_FLUSH_DENORMALS_X86)
142 unsigned int saved_csr_ = 0;
143#elif defined(PULP_FLUSH_DENORMALS_ARM64)
144 std::uint64_t saved_fpcr_ = 0;
ScopedFlushDenormals & operator=(const ScopedFlushDenormals &)=delete
ScopedFlushDenormals(const ScopedFlushDenormals &)=delete
ScopedFlushDenormals & operator=(ScopedFlushDenormals &&)=delete
~ScopedFlushDenormals() noexcept
Definition scoped_flush_denormals.hpp:125
ScopedFlushDenormals() noexcept
Definition scoped_flush_denormals.hpp:113
ScopedFlushDenormals(ScopedFlushDenormals &&)=delete
Round-2 effect-wave vocabulary.
Definition analysis_frontends.hpp:50
Definition additive_bank.hpp:218
constexpr bool kHardwareFlushSupported
True when this build sets the hardware flush-to-zero mode.
Definition scoped_flush_denormals.hpp:91
bool denormals_are_flushed() noexcept
Definition scoped_flush_denormals.hpp:96