From e851c044b5f07f8b5dc1a976fafa3fb000118ed8 Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 31 Aug 2023 09:54:45 +0300 Subject: [PATCH] SPU: Function discovery fix Do not detect branch to next. --- rpcs3/Emu/Cell/SPURecompiler.cpp | 12 ++++++------ rpcs3/util/simd.hpp | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index b9f70ffe31..46eda7110e 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -2122,16 +2122,16 @@ std::vector spu_thread::discover_functions(u32 base_addr, std::span(base_addr, 0x10); i < std::min(base_addr + ls.size(), 0x3FFF0); i += 0x10) { - // Search for BRSL and BRASL + // Search for BRSL LR and BRASL LR // TODO: BISL const v128 inst = read_from_ptr>(ls.data(), i - base_addr); - const v128 shifted = gv_shr32(inst, 23); - const v128 eq_brsl = gv_eq32(shifted, v128::from32p(0x66)); - const v128 eq_brasl = gv_eq32(shifted, brasl_mask); + const v128 cleared_i16 = gv_and32(inst, v128::from32p(utils::rol32(~0xffff, 7))); + const v128 eq_brsl = gv_eq32(cleared_i16, v128::from32p(0x66u << 23)); + const v128 eq_brasl = gv_eq32(cleared_i16, brasl_mask); const v128 result = eq_brsl | eq_brasl; if (!gv_testz(result)) @@ -2160,7 +2160,7 @@ std::vector spu_thread::discover_functions(u32 base_addr, std::span> (~c & 7) >> 1) template inline auto gv_fshl8(A&& a, B&& b, C&& c)