Files
Luke Street ce0185adc4 CI: Add ARM64 Windows and Linux builds (#1778)
* ci: Try arm64 Linux/Windows builds

* Update aurora

* Explicitly set CMAKE_SYSTEM_PROCESSOR on Windows

* Update build-appimage.sh for aarch64

* Set Rust_RUSTUP_INSTALL_MISSING_TARGET=ON

* Use CMAKE_SYSTEM_PROCESSOR normalization for jpeg-turbo build too

* MSVC ARM64 support for freeverb
2026-05-23 19:32:50 -06:00

72 lines
2.1 KiB
C++

#ifndef _denormals_
#define _denormals_
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
#include <immintrin.h>
using denormal_state = unsigned int;
inline denormal_state denormals_enable()
{
denormal_state saved = _mm_getcsr();
_mm_setcsr(saved | 0x8040); // FTZ (0x8000) | DAZ (0x0040)
return saved;
}
inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); }
#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
#include <cstdint>
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
#include <intrin.h>
#endif
using denormal_state = uint64_t;
inline denormal_state denormals_enable()
{
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
denormal_state saved = static_cast<denormal_state>(_ReadStatusReg(ARM64_FPCR));
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved | (1ULL << 24))); // FZ
return saved;
#else
denormal_state saved;
asm volatile("mrs %0, fpcr" : "=r"(saved));
asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ
return saved;
#endif
}
inline void denormals_restore(denormal_state saved)
{
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved));
#else
asm volatile("msr fpcr, %0" :: "r"(saved));
#endif
}
#elif defined(__arm__) || defined(_M_ARM)
#include <cstdint>
using denormal_state = uint32_t;
inline denormal_state denormals_enable()
{
denormal_state saved;
asm volatile("vmrs %0, fpscr" : "=r"(saved));
asm volatile("vmsr fpscr, %0" :: "r"(saved | (1U << 24))); // FZ
return saved;
}
inline void denormals_restore(denormal_state saved)
{
asm volatile("vmsr fpscr, %0" :: "r"(saved));
}
#else
// unknown platform so denormals will be preserved
#warning "This platform is not supported for denormals, reverb will be very slow!"
using denormal_state = int;
inline denormal_state denormals_enable() { return 0; }
inline void denormals_restore(denormal_state) {}
#endif
#endif