From 8d46840e091fa8e330d505f91be45a527f529efd Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 7 Jun 2022 12:23:08 +0300 Subject: [PATCH] Enable ppu_feed_data in PPU Interpreter --- rpcs3/Emu/Cell/PPUInterpreter.cpp | 192 ++++++++++++++++-------------- 1 file changed, 100 insertions(+), 92 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUInterpreter.cpp b/rpcs3/Emu/Cell/PPUInterpreter.cpp index d0d8762f2f..f665a910d0 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/PPUInterpreter.cpp @@ -43,6 +43,7 @@ enum class ppu_exec_bit : u64 use_dfma, set_cr_stats, set_call_history, + use_feed_data, __bitset_enum_max }; @@ -419,14 +420,19 @@ void ppu_set_fpcc(ppu_thread& ppu, f64 a, f64 b, u64 cr_field = 1) } // Validate read data in case does not match reservation -template +template auto ppu_feed_data(ppu_thread& ppu, u64 addr) { static_assert(sizeof(T) <= 128, "Incompatible type-size, break down into smaller loads"); auto value = vm::_ref(vm::cast(addr)); - //if (!ppu.use_full_rdata) + if constexpr (!((Flags == use_feed_data) || ...)) + { + return value; + } + + if (!ppu.use_full_rdata) { return value; } @@ -3720,11 +3726,11 @@ template auto LVEBX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]) & ~0xfull; - ppu.vr[op.vd] = ppu_feed_data(ppu, addr); + ppu.vr[op.vd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -3864,11 +3870,11 @@ template auto LDX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -3877,11 +3883,11 @@ template auto LWZX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4001,11 +4007,11 @@ template auto LVEHX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]) & ~0xfull; - ppu.vr[op.vd] = ppu_feed_data(ppu, addr); + ppu.vr[op.vd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4032,11 +4038,11 @@ template auto LDUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -4057,11 +4063,11 @@ template auto LWZUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -4124,11 +4130,11 @@ template auto LVEWX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]) & ~0xfull; - ppu.vr[op.vd] = ppu_feed_data(ppu, addr); + ppu.vr[op.vd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4191,11 +4197,11 @@ template auto LBZX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4204,11 +4210,11 @@ template auto LVX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]) & ~0xfull; - ppu.vr[op.vd] = ppu_feed_data(ppu, addr); + ppu.vr[op.vd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4234,11 +4240,11 @@ template auto LBZUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -4671,11 +4677,11 @@ template auto LHZX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4710,11 +4716,11 @@ template auto LHZUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -4763,11 +4769,11 @@ template auto LWAX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4787,11 +4793,11 @@ template auto LHAX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4800,11 +4806,11 @@ template auto LVXL() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]) & ~0xfull; - ppu.vr[op.vd] = ppu_feed_data(ppu, addr); + ppu.vr[op.vd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -4833,11 +4839,11 @@ template auto LWAUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -4858,11 +4864,11 @@ template auto LHAUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5081,12 +5087,12 @@ template auto LVLX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - const u128 data = ppu_feed_data(ppu, addr & -16); + const u128 data = ppu_feed_data(ppu, addr & -16); ppu.vr[op.vd] = data << ((addr & 15) * 8); }; @@ -5097,11 +5103,11 @@ template auto LDBRX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data>(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data, Flags...>(ppu, addr); }; RETURN_(ppu, op); } @@ -5110,21 +5116,21 @@ template auto LSWX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; u32 count = ppu.xer.cnt & 0x7f; for (; count >= 4; count -= 4, addr += 4, op.rd = (op.rd + 1) & 31) { - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); } if (count) { u32 value = 0; for (u32 byte = 0; byte < count; byte++) { - u32 byte_value = ppu_feed_data(ppu, addr + byte); + u32 byte_value = ppu_feed_data(ppu, addr + byte); value |= byte_value << ((3 ^ byte) * 8); } ppu.gpr[op.rd] = value; @@ -5137,11 +5143,11 @@ template auto LWBRX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data>(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data, Flags...>(ppu, addr); }; RETURN_(ppu, op); } @@ -5150,11 +5156,11 @@ template auto LFSX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5192,12 +5198,12 @@ template auto LVRX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - const u128 data = ppu_feed_data(ppu, addr & -16); + const u128 data = ppu_feed_data(ppu, addr & -16); ppu.vr[op.vd] = data >> ((~addr & 15) * 8) >> 8; }; @@ -5208,7 +5214,7 @@ template auto LSWI() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { u64 addr = op.ra ? ppu.gpr[op.ra] : 0; @@ -5219,7 +5225,7 @@ auto LSWI() { if (N > 3) { - ppu.gpr[reg] = ppu_feed_data(ppu, addr); + ppu.gpr[reg] = ppu_feed_data(ppu, addr); addr += 4; N -= 4; } @@ -5230,7 +5236,7 @@ auto LSWI() while (N > 0) { N = N - 1; - buf |= ppu_feed_data(ppu, addr) << (i * 8); + buf |= ppu_feed_data(ppu, addr) << (i * 8); addr++; i--; } @@ -5246,11 +5252,11 @@ template auto LFSUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + ppu.gpr[op.rb]; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5272,11 +5278,11 @@ template auto LFDX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5285,11 +5291,11 @@ template auto LFDUX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + ppu.gpr[op.rb]; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5483,11 +5489,11 @@ template auto LHBRX() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + ppu.gpr[op.rb] : ppu.gpr[op.rb]; - ppu.gpr[op.rd] = ppu_feed_data>(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data, Flags...>(ppu, addr); }; RETURN_(ppu, op); } @@ -5725,11 +5731,11 @@ template auto LWZ() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5738,11 +5744,11 @@ template auto LWZU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5752,11 +5758,11 @@ template auto LBZ() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5765,11 +5771,11 @@ template auto LBZU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5841,11 +5847,11 @@ template auto LHZ() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5854,11 +5860,11 @@ template auto LHZU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5868,11 +5874,11 @@ template auto LHA() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5881,11 +5887,11 @@ template auto LHAU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5922,13 +5928,13 @@ template auto LMW() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { u64 addr = op.ra ? ppu.gpr[op.ra] + op.simm16 : op.simm16; for (u32 i = op.rd; i<32; ++i, addr += 4) { - ppu.gpr[i] = ppu_feed_data(ppu, addr); + ppu.gpr[i] = ppu_feed_data(ppu, addr); } }; RETURN_(ppu, op); @@ -5954,11 +5960,11 @@ template auto LFS() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5967,11 +5973,11 @@ template auto LFSU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -5981,11 +5987,11 @@ template auto LFD() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra || 1 ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -5994,11 +6000,11 @@ template auto LFDU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + op.simm16; - ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); + ppu.fpr[op.frd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -6062,11 +6068,11 @@ template auto LD() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.simm16 & ~3) + (op.ra ? ppu.gpr[op.ra] : 0); - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -6075,11 +6081,11 @@ template auto LDU() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = ppu.gpr[op.ra] + (op.simm16 & ~3); - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); ppu.gpr[op.ra] = addr; }; RETURN_(ppu, op); @@ -6089,11 +6095,11 @@ template auto LWA() { if constexpr (Build == 0xf1a6) - return ppu_exec_select::template select<>(); + return ppu_exec_select::template select(); static const auto exec = [](ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = (op.simm16 & ~3) + (op.ra ? ppu.gpr[op.ra] : 0); - ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); + ppu.gpr[op.rd] = ppu_feed_data(ppu, addr); }; RETURN_(ppu, op); } @@ -7324,6 +7330,8 @@ ppu_interpreter_rt_base::ppu_interpreter_rt_base() noexcept selected += set_cr_stats; // TODO if (g_cfg.core.ppu_call_history) selected += set_call_history; + if (g_cfg.core.ppu_128_reservations_loop_max_length != 0) + selected += use_feed_data; if (selected & use_nj) ppu_log.success("Enabled: Accurate Non-Java Mode");