diff options
author | Liam <byteslice@airmail.cc> | 2022-11-06 22:45:36 +0100 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-11-09 22:58:49 +0100 |
commit | cbaf642ffe4b05f8796798ebdc5c6892605928cc (patch) | |
tree | 8ac4094f709da71b334c152e111247c89c958cee /src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | |
parent | Merge pull request #9215 from liamwhite/swordfight (diff) | |
download | yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.gz yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.bz2 yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.lz yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.xz yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.zst yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp index 200efe4db..5a4eba3eb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp @@ -52,12 +52,16 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 case 4: // CP15_DATA_SYNC_BARRIER return Callback{ - [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { -#ifdef _MSC_VER + [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { +#if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64) _mm_mfence(); _mm_lfence(); -#else +#elif defined(ARCHITECTURE_x86_64) asm volatile("mfence\n\tlfence\n\t" : : : "memory"); +#elif defined(ARCHITECTURE_arm64) + asm volatile("dsb sy\n\t" : : : "memory"); +#else +#error Unsupported architecture #endif return 0; }, @@ -66,11 +70,15 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 case 5: // CP15_DATA_MEMORY_BARRIER return Callback{ - [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { -#ifdef _MSC_VER + [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { +#if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64) _mm_mfence(); -#else +#elif defined(ARCHITECTURE_x86_64) asm volatile("mfence\n\t" : : : "memory"); +#elif defined(ARCHITECTURE_arm64) + asm volatile("dmb sy\n\t" : : : "memory"); +#else +#error Unsupported architecture #endif return 0; }, @@ -115,7 +123,7 @@ CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { if (!two && opc == 0 && CRm == CoprocReg::C14) { // CNTPCT - const auto callback = [](Dynarmic::A32::Jit*, void* arg, u32, u32) -> u64 { + const auto callback = [](void* arg, u32, u32) -> u64 { const auto& parent_arg = *static_cast<ARM_Dynarmic_32*>(arg); return parent_arg.system.CoreTiming().GetClockTicks(); }; |