mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-07 16:00:18 +02:00
- Do compiler/architecture checks EARLY, don't waste time doing random configuration stuff if the user can't even compile in the first place - MSVC is unsupported, I assume? So add a check to disallow. There's literally no MSVC or MSC_VER checks anywhere, so... - Rather than using the MSVC architecture definitions, use our own `ARCHITECTURE_arm64` et al. Hijacking existing "standard" definitions is a very bad idea. Also makes it more readable in CMake - Change the x86 host check to `x86|amd64`. Some systems still refer to themselves as x86 despite being 64-bit for... reasons, and I saw one a very long time ago that referred to it as amd64. This should basically never come up, nor is it really relevant given that FEX is for arm64... but it kinda annoyed me so whatever. TODOs: - Should we check `CMAKE_SIZEOF_VOID_P (equal) 64`? I don't think anyone is even trying to compile this thing on armv7 or older, but might as well? maybe? - What's the status of *BSD, Solaris, macOS? Technically macOS does support Wine, not sure about the others. Signed-off-by: crueter <crueter@eden-emu.dev>
28 lines
974 B
C++
28 lines
974 B
C++
// SPDX-License-Identifier: MIT
|
|
#include "Utils/SpinWaitLock.h"
|
|
|
|
namespace FEXCore::Utils::SpinWaitLock {
|
|
#ifdef ARCHITECTURE_arm64
|
|
constexpr uint64_t NanosecondsInSecond = 1'000'000'000ULL;
|
|
|
|
static uint32_t GetCycleCounterFrequency() {
|
|
uint64_t Result {};
|
|
__asm("mrs %[Res], CNTFRQ_EL0" : [Res] "=r"(Result));
|
|
return Result;
|
|
}
|
|
|
|
static uint64_t CalculateCyclesPerNanosecond() {
|
|
// Snapdragon devices historically use a 19.2Mhz cycle counter frequency
|
|
// This means that the number of cycles per nanosecond ends up being 52.0833...
|
|
//
|
|
// ARMv8.6 and ARMv9.1 requires the cycle counter frequency to be 1Ghz.
|
|
// This means the number of cycles per nanosecond ends up being 1.
|
|
uint64_t CounterFrequency = GetCycleCounterFrequency();
|
|
return NanosecondsInSecond / CounterFrequency;
|
|
}
|
|
|
|
uint32_t CycleCounterFrequency = GetCycleCounterFrequency();
|
|
uint64_t CyclesPerNanosecond = CalculateCyclesPerNanosecond();
|
|
#endif
|
|
} // namespace FEXCore::Utils::SpinWaitLock
|