From 7c0d8fc29ca2a09a1735de7485ab9cd839d0e745 Mon Sep 17 00:00:00 2001 From: Eladash Date: Fri, 1 Sep 2023 21:40:05 +0300 Subject: [PATCH] Improve spu_thread::is_exec_code --- rpcs3/Emu/Cell/SPUThread.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 6daba511b4..9531304fdf 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -4034,10 +4034,10 @@ bool spu_thread::is_exec_code(u32 addr, std::span ls_ptr, u32 base_add } const u32 addr0 = spu_branch_target(addr); - const u32 op = read_from_ptr>(ls_ptr, addr0 - base_addr); - const auto type = s_spu_itype.decode(op); + const spu_opcode_t op{read_from_ptr>(ls_ptr, addr0 - base_addr)}; + const auto type = s_spu_itype.decode(op.opcode); - if (type == spu_itype::UNK || !op) + if (type == spu_itype::UNK || !op.opcode) { return false; } @@ -4054,11 +4054,30 @@ bool spu_thread::is_exec_code(u32 addr, std::span ls_ptr, u32 base_add return false; } - const auto results = op_branch_targets(addr, spu_opcode_t{op}); + auto results = op_branch_targets(addr, op); if (results[0] == umax) { - break; + switch (type) + { + case spu_itype::BIZ: + case spu_itype::BINZ: + case spu_itype::BIHZ: + case spu_itype::BIHNZ: + { + results[0] = addr + 4; + break; + } + default: + { + break; + } + } + + if (results[0] == umax) + { + break; + } } for (usz res_i = 1; res_i < results.size(); res_i++)