From 8cde1c18c484a35556264c09d129f151581f9f32 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 12 Sep 2014 00:46:11 +0400 Subject: [PATCH] Cb fix --- rpcs3/Emu/Cell/SPURecompiler.h | 10 +++++----- rpcs3/Emu/SysCalls/CB_FUNC.h | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index 03602fc564..4601054474 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -288,7 +288,7 @@ public: const XmmLink& XmmGet(s8 reg, s8 target = -1) // get xmm register with specific SPU reg { assert(reg >= 0); - XmmLink* res = nullptr; + const XmmLink* res = nullptr; if (reg == target) { for (u32 i = 0; i < 16; i++) @@ -311,7 +311,7 @@ public: } if (!res) { - res = &(XmmLink&)XmmAlloc(target); + res = &XmmAlloc(target); /*if (target != res->reg) { c.movdqa(*res->data, cpu_xmm(GPR[reg])); @@ -327,7 +327,7 @@ public: c.movdqa(*res->data, cpu_xmm(GPR[reg])); } } - res->reg = -1; // ??? + const_cast(res)->reg = -1; // ??? LOG4_OPCODE("* cached GPR[%d] not found", reg); } return *res; @@ -335,9 +335,9 @@ public: const XmmLink& XmmCopy(const XmmLink& from, s8 pref = -1) // XmmAlloc + mov { - XmmLink* res = &(XmmLink&)XmmAlloc(pref); + const XmmLink* res = &XmmAlloc(pref); c.movdqa(*res->data, *from.data); - res->reg = -1; // ??? + const_cast(res)->reg = -1; // ??? LOG4_OPCODE("*"); return *res; } diff --git a/rpcs3/Emu/SysCalls/CB_FUNC.h b/rpcs3/Emu/SysCalls/CB_FUNC.h index 0e0c79f7c4..83d1de2c0b 100644 --- a/rpcs3/Emu/SysCalls/CB_FUNC.h +++ b/rpcs3/Emu/SysCalls/CB_FUNC.h @@ -21,15 +21,33 @@ namespace vm } }; - template - RT _ptr_base::operator ()(T... args) const + template + struct _func_res { static_assert(!std::is_floating_point::value, "TODO: Unsupported callback result type (floating point)"); static_assert(!std::is_same::value, "TODO: Unsupported callback result type (vector)"); + static_assert(sizeof(RT) <= 8, "Invalid callback result type"); static_assert(!std::is_pointer::value, "Invalid callback result type (pointer)"); static_assert(!std::is_reference::value, "Invalid callback result type (reference)"); - return (RT)GetCurrentPPUThread().FastCall(vm::read32(m_addr), vm::read32(m_addr + 4), _func_arg::get_value(args)...); + __forceinline static RT get_value(const u64 res) + { + return (RT&)res; + } + }; + + template<> + struct _func_res + { + __forceinline static void get_value(const u64 res) + { + } + }; + + template + RT _ptr_base::operator ()(T... args) const + { + return _func_res::get_value(GetCurrentPPUThread().FastCall(vm::read32(m_addr), vm::read32(m_addr + 4), _func_arg::get_value(args)...)); } } \ No newline at end of file