From 0586ca869c1ce30e5431dc0ca30c2522cec6cbcb Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Sat, 30 Jan 2021 02:16:18 +0100 Subject: [PATCH] early-access version 1394 --- README.md | 2 +- externals/dynarmic/include/dynarmic/A32/config.h | 7 +++++++ externals/dynarmic/src/backend/x64/a32_emit_x64.cpp | 8 +++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1b5f1fe00..52f77bac0 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 1393. +This is the source code for early-access 1394. ## Legal Notice diff --git a/externals/dynarmic/include/dynarmic/A32/config.h b/externals/dynarmic/include/dynarmic/A32/config.h index d7af62c65..565e2a91f 100755 --- a/externals/dynarmic/include/dynarmic/A32/config.h +++ b/externals/dynarmic/include/dynarmic/A32/config.h @@ -90,6 +90,8 @@ struct UserCallbacks { virtual void ExceptionRaised(VAddr pc, Exception exception) = 0; + virtual void InstructionSynchronizationBarrierRaised() {} + // Timing-related callbacks // ticks ticks have passed virtual void AddTicks(std::uint64_t ticks) = 0; @@ -164,6 +166,11 @@ struct UserConfig { // Coprocessors std::array, 16> coprocessors{}; + /// When set to true, UserCallbacks::InstructionSynchronizationBarrierRaised will be + /// called when an ISB instruction is executed. + /// When set to false, ISB will be treated as a NOP instruction. + bool hook_isb = false; + /// Hint instructions would cause ExceptionRaised to be called with the appropriate /// argument. bool hook_hint_instructions = false; diff --git a/externals/dynarmic/src/backend/x64/a32_emit_x64.cpp b/externals/dynarmic/src/backend/x64/a32_emit_x64.cpp index 099dfdd0e..61d5fba78 100755 --- a/externals/dynarmic/src/backend/x64/a32_emit_x64.cpp +++ b/externals/dynarmic/src/backend/x64/a32_emit_x64.cpp @@ -720,10 +720,12 @@ void A32EmitX64::EmitA32DataMemoryBarrier(A32EmitContext&, IR::Inst*) { } void A32EmitX64::EmitA32InstructionSynchronizationBarrier(A32EmitContext& ctx, IR::Inst*) { - ctx.reg_alloc.HostCall(nullptr); + if (!conf.hook_isb) { + return; + } - code.mov(code.ABI_PARAM1, reinterpret_cast(jit_interface)); - code.CallLambda([](A32::Jit* jit) { jit->ClearCache(); }); + ctx.reg_alloc.HostCall(nullptr); + Devirtualize<&A32::UserCallbacks::InstructionSynchronizationBarrierRaised>(conf.callbacks).EmitCall(code); } void A32EmitX64::EmitA32BXWritePC(A32EmitContext& ctx, IR::Inst* inst) {