From 3794f65bb61fc365afb85c32843337b0a98ee59a Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 18 Mar 2019 19:33:59 +0300 Subject: [PATCH] Add cpu_flag::jit_return --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/CPU/CPUThread.h | 3 ++- rpcs3/Emu/Cell/SPUASMJITRecompiler.h | 2 -- rpcs3/Emu/Cell/SPURecompiler.cpp | 12 +++++++++--- rpcs3/Emu/Cell/SPURecompiler.h | 16 ++++++++++++++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index ebb74ef023..1be93a4df2 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -131,7 +131,7 @@ bool cpu_thread::check_state() state -= cpu_flag::memory; } - if (state & cpu_flag::exit + cpu_flag::dbg_global_stop) + if (state & cpu_flag::exit + cpu_flag::jit_return + cpu_flag::dbg_global_stop) { return true; } diff --git a/rpcs3/Emu/CPU/CPUThread.h b/rpcs3/Emu/CPU/CPUThread.h index 5d270eef70..7eb3fdf633 100644 --- a/rpcs3/Emu/CPU/CPUThread.h +++ b/rpcs3/Emu/CPU/CPUThread.h @@ -13,6 +13,7 @@ enum class cpu_flag : u32 signal, // Thread received a signal (HLE) memory, // Thread must unlock memory mutex + jit_return, // JIT compiler event (forced return) dbg_global_pause, // Emulation paused dbg_global_stop, // Emulation stopped dbg_pause, // Thread paused @@ -60,7 +61,7 @@ public: // Test stopped state bool is_stopped() { - return !!(state & (cpu_flag::stop + cpu_flag::exit + cpu_flag::dbg_global_stop)); + return !!(state & (cpu_flag::stop + cpu_flag::exit + cpu_flag::jit_return + cpu_flag::dbg_global_stop)); } // Test paused state diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.h b/rpcs3/Emu/Cell/SPUASMJITRecompiler.h index b98b140a70..b82ed75314 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.h +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.h @@ -8,8 +8,6 @@ // SPU ASMJIT Recompiler class spu_recompiler : public spu_recompiler_base { - std::shared_ptr m_spurt; - public: spu_recompiler(); diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 79906a072c..196f47ada9 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -582,6 +582,15 @@ spu_function_t spu_runtime::make_branch_patchpoint(u32 target) const return reinterpret_cast(raw); } +void spu_runtime::handle_return(cpu_thread* _thr) +{ + // Wait until the runtime becomes available + //writer_lock lock(*this); + + // Simply reset the flag + _thr->state -= cpu_flag::jit_return; +} + spu_recompiler_base::spu_recompiler_base() { } @@ -1874,9 +1883,6 @@ void spu_recompiler_base::dump(std::string& out) class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator { - // SPU Runtime Instance - std::shared_ptr m_spurt; - // JIT Instance jit_compiler m_jit{{}, jit_compiler::cpu(g_cfg.core.llvm_cpu)}; diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index 9f9f233d5d..0273a03ad4 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -79,6 +79,9 @@ public: // Generate a patchable trampoline to spu_recompiler_base::branch spu_function_t make_branch_patchpoint(u32 target) const; + // Handle cpu_flag::jit_return + void handle_return(cpu_thread* _thr); + // All dispatchers (array allocated in jit memory) static atomic_t* const g_dispatcher; }; @@ -87,6 +90,8 @@ public: class spu_recompiler_base { protected: + std::shared_ptr m_spurt; + u32 m_pos; u32 m_size; @@ -137,6 +142,17 @@ public: // Print analyser internal state void dump(std::string& out); + // Get SPU Runtime + spu_runtime& get_runtime() + { + if (!m_spurt) + { + init(); + } + + return *m_spurt; + } + // Create recompiler instance (ASMJIT) static std::unique_ptr make_asmjit_recompiler();