1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2025-01-31 20:41:45 +01:00

Add cpu_flag::jit_return

This commit is contained in:
Nekotekina 2019-03-18 19:33:59 +03:00
parent 849411693a
commit 3794f65bb6
5 changed files with 28 additions and 7 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -8,8 +8,6 @@
// SPU ASMJIT Recompiler
class spu_recompiler : public spu_recompiler_base
{
std::shared_ptr<spu_runtime> m_spurt;
public:
spu_recompiler();

View File

@ -582,6 +582,15 @@ spu_function_t spu_runtime::make_branch_patchpoint(u32 target) const
return reinterpret_cast<spu_function_t>(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<spu_runtime> m_spurt;
// JIT Instance
jit_compiler m_jit{{}, jit_compiler::cpu(g_cfg.core.llvm_cpu)};

View File

@ -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<spu_function_t>* const g_dispatcher;
};
@ -87,6 +90,8 @@ public:
class spu_recompiler_base
{
protected:
std::shared_ptr<spu_runtime> 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<spu_recompiler_base> make_asmjit_recompiler();