diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp index 0b8e4c77f3..3630bcfc31 100644 --- a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp @@ -5624,7 +5624,7 @@ std::shared_ptr RecompilationEngine::s_the_instance = nullp RecompilationEngine::RecompilationEngine() : m_log(nullptr) , m_next_ordinal(0) - , m_compiler(*this, ExecutionEngine::ExecuteFunction, ExecutionEngine::ExecuteTillReturn, ExecutionEngine::PollStatus) { + , m_compiler(*this, CPUHybridDecoderRecompiler::ExecuteFunction, CPUHybridDecoderRecompiler::ExecuteTillReturn, CPUHybridDecoderRecompiler::PollStatus) { m_compiler.RunAllTests(); } @@ -5639,7 +5639,7 @@ u32 RecompilationEngine::AllocateOrdinal(u32 address, bool is_function) { if (i == m_address_to_ordinal.end()) { assert(m_next_ordinal < (sizeof(m_executable_lookup) / sizeof(m_executable_lookup[0]))); - m_executable_lookup[m_next_ordinal] = is_function ? ExecutionEngine::ExecuteFunction : ExecutionEngine::ExecuteTillReturn; + m_executable_lookup[m_next_ordinal] = is_function ? CPUHybridDecoderRecompiler::ExecuteFunction : CPUHybridDecoderRecompiler::ExecuteTillReturn; std::atomic_thread_fence(std::memory_order_release); i = m_address_to_ordinal.insert(m_address_to_ordinal.end(), std::make_pair(address, m_next_ordinal++)); } @@ -5967,7 +5967,7 @@ void Tracer::Terminate() { // TODO: Notify recompilation engine } -ppu_recompiler_llvm::ExecutionEngine::ExecutionEngine(PPUThread & ppu) +ppu_recompiler_llvm::CPUHybridDecoderRecompiler::CPUHybridDecoderRecompiler(PPUThread & ppu) : m_ppu(ppu) , m_interpreter(new PPUInterpreter(ppu)) , m_decoder(m_interpreter) @@ -5975,16 +5975,16 @@ ppu_recompiler_llvm::ExecutionEngine::ExecutionEngine(PPUThread & ppu) , m_recompilation_engine(RecompilationEngine::GetInstance()) { } -ppu_recompiler_llvm::ExecutionEngine::~ExecutionEngine() { +ppu_recompiler_llvm::CPUHybridDecoderRecompiler::~CPUHybridDecoderRecompiler() { } -u32 ppu_recompiler_llvm::ExecutionEngine::DecodeMemory(const u32 address) { +u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::DecodeMemory(const u32 address) { ExecuteFunction(&m_ppu, 0); return 0; } -void ppu_recompiler_llvm::ExecutionEngine::RemoveUnusedEntriesFromCache() const { +void ppu_recompiler_llvm::CPUHybridDecoderRecompiler::RemoveUnusedEntriesFromCache() const { auto now = std::chrono::high_resolution_clock::now(); if (std::chrono::duration_cast(now - m_last_cache_clear_time).count() > 10000) { for (auto i = m_address_to_ordinal.begin(); i != m_address_to_ordinal.end();) { @@ -6001,7 +6001,7 @@ void ppu_recompiler_llvm::ExecutionEngine::RemoveUnusedEntriesFromCache() const } } -Executable ppu_recompiler_llvm::ExecutionEngine::GetExecutable(u32 address, Executable default_executable) const { +Executable ppu_recompiler_llvm::CPUHybridDecoderRecompiler::GetExecutable(u32 address, Executable default_executable) const { // Find the ordinal for the specified address and insert it to the cache auto i = m_address_to_ordinal.find(address); if (i == m_address_to_ordinal.end()) { @@ -6021,14 +6021,14 @@ Executable ppu_recompiler_llvm::ExecutionEngine::GetExecutable(u32 address, Exec return executable; } -u32 ppu_recompiler_llvm::ExecutionEngine::ExecuteFunction(PPUThread * ppu_state, u64 context) { - auto execution_engine = (ExecutionEngine *)ppu_state->GetDecoder(); +u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::ExecuteFunction(PPUThread * ppu_state, u64 context) { + auto execution_engine = (CPUHybridDecoderRecompiler *)ppu_state->GetDecoder(); execution_engine->m_tracer.Trace(Tracer::TraceType::EnterFunction, ppu_state->PC, 0); return ExecuteTillReturn(ppu_state, 0); } -u32 ppu_recompiler_llvm::ExecutionEngine::ExecuteTillReturn(PPUThread * ppu_state, u64 context) { - auto execution_engine = (ExecutionEngine *)ppu_state->GetDecoder(); +u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::ExecuteTillReturn(PPUThread * ppu_state, u64 context) { + auto execution_engine = (CPUHybridDecoderRecompiler *)ppu_state->GetDecoder(); auto terminate = false; auto branch_type = BranchType::NonBranch; @@ -6079,7 +6079,7 @@ u32 ppu_recompiler_llvm::ExecutionEngine::ExecuteTillReturn(PPUThread * ppu_stat return 0; } -bool ppu_recompiler_llvm::ExecutionEngine::PollStatus(PPUThread * ppu_state) { +bool ppu_recompiler_llvm::CPUHybridDecoderRecompiler::PollStatus(PPUThread * ppu_state) { return ppu_state->check_status(); } diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.h b/rpcs3/Emu/Cell/PPULLVMRecompiler.h index e182492f89..57aaceb175 100644 --- a/rpcs3/Emu/Cell/PPULLVMRecompiler.h +++ b/rpcs3/Emu/Cell/PPULLVMRecompiler.h @@ -1119,20 +1119,25 @@ namespace ppu_recompiler_llvm { std::shared_ptr m_recompilation_engine; }; - /// PPU execution engine - class ExecutionEngine : public CPUDecoder { + /** + * PPU execution engine + * Relies on PPUInterpreter1 to execute uncompiled code. + * Traces execution to determine which block to compile. + * Use LLVM to compile block into native code. + */ + class CPUHybridDecoderRecompiler : public CPUDecoder { friend class RecompilationEngine; public: - ExecutionEngine(PPUThread & ppu); - ExecutionEngine() = delete; + CPUHybridDecoderRecompiler(PPUThread & ppu); + CPUHybridDecoderRecompiler() = delete; - ExecutionEngine(const ExecutionEngine & other) = delete; - ExecutionEngine(ExecutionEngine && other) = delete; + CPUHybridDecoderRecompiler(const CPUHybridDecoderRecompiler & other) = delete; + CPUHybridDecoderRecompiler(CPUHybridDecoderRecompiler && other) = delete; - virtual ~ExecutionEngine(); + virtual ~CPUHybridDecoderRecompiler(); - ExecutionEngine & operator = (const ExecutionEngine & other) = delete; - ExecutionEngine & operator = (ExecutionEngine && other) = delete; + CPUHybridDecoderRecompiler & operator = (const ExecutionEngine & other) = delete; + CPUHybridDecoderRecompiler & operator = (ExecutionEngine && other) = delete; u32 DecodeMemory(const u32 address) override; diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 38635acec3..01ab861a29 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -583,7 +583,7 @@ void PPUThread::do_run() case 2: { #ifdef PPU_LLVM_RECOMPILER - m_dec.reset(new ppu_recompiler_llvm::ExecutionEngine(*this)); + m_dec.reset(new ppu_recompiler_llvm::CPUHybridDecoderRecompiler(*this)); #else LOG_ERROR(PPU, "This image does not include PPU JIT (LLVM)"); Emu.Pause();