From 7e01c81154fc25a63eed78c14fe8f3f360afff06 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 4 Sep 2015 02:23:31 +0300 Subject: [PATCH] SPU Recompiler fixed --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 570 +++++++++++++------------ rpcs3/Emu/Cell/SPUASMJITRecompiler.h | 31 +- rpcs3/Emu/Cell/SPUAnalyser.cpp | 101 ++++- rpcs3/Emu/Cell/SPUAnalyser.h | 6 + rpcs3/Emu/Cell/SPUInterpreter.cpp | 24 +- rpcs3/Emu/Cell/SPUOpcodes.h | 2 +- rpcs3/Emu/Cell/SPURecompiler.cpp | 24 +- rpcs3/Emu/Cell/SPURecompiler.h | 2 - rpcs3/Emu/Cell/SPUThread.cpp | 2 +- rpcs3/Emu/Cell/SPUThread.h | 2 + 10 files changed, 430 insertions(+), 334 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 6cbbe716d7..c53ed35363 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -44,9 +44,8 @@ void spu_recompiler::compile(spu_function_t& f) return; } - if (f.addr >= 0x40000 || f.addr % 4 || f.size == 0 || f.size >= 0x40000 - f.addr || f.size % 4) + if (f.addr >= 0x40000 || f.addr % 4 || f.size == 0 || f.size > 0x40000 - f.addr || f.size % 4) { - // function shouldn't touch the greatest possible address (0x3fffc) as well throw EXCEPTION("Invalid SPU function (addr=0x%05x, size=0x%x)", f.addr, f.size); } @@ -68,18 +67,17 @@ void spu_recompiler::compile(spu_function_t& f) compiler.addFunc(kFuncConvHost, FuncBuilder2()); + // Initialize variables X86GpVar cpu_var(compiler, kVarTypeIntPtr, "cpu"); compiler.setArg(0, cpu_var); - compiler.alloc(cpu_var); // ??? + compiler.alloc(cpu_var, asmjit::host::rbp); // ASMJIT bug workaround this->cpu = &cpu_var; X86GpVar ls_var(compiler, kVarTypeIntPtr, "ls"); compiler.setArg(1, ls_var); - compiler.alloc(ls_var); // ??? + compiler.alloc(ls_var, asmjit::host::rbx); // ASMJIT bug workaround this->ls = &ls_var; - X86GpVar pos_var(compiler, kVarTypeUInt32, "pos"); - this->pos = &pos_var; X86GpVar addr_var(compiler, kVarTypeUInt32, "addr"); this->addr = &addr_var; X86GpVar qw0_var(compiler, kVarTypeUInt64, "qw0"); @@ -89,7 +87,7 @@ void spu_recompiler::compile(spu_function_t& f) X86GpVar qw2_var(compiler, kVarTypeUInt64, "qw2"); this->qw2 = &qw2_var; - std::array vec_vars; + std::array vec_vars; for (u32 i = 0; i < vec_vars.size(); i++) { @@ -97,11 +95,11 @@ void spu_recompiler::compile(spu_function_t& f) vec.at(i) = vec_vars.data() + i; } + // Initialize labels std::vector