From e13ee157918ed0402bd2befa1920202d63b3e8dc Mon Sep 17 00:00:00 2001 From: Malcolm Date: Tue, 15 Sep 2026 17:16:38 -0400 Subject: [PATCH] SPU LLVM: Stop inverting float-to-int saturation on ARM64 - Fix CFLTS saturation in the approximate and accurate xfloat paths - Original fix credit to jpolo1224 of armsx3 https://github.com/ARMSX2/ARMSX3/commit/424514fde67adb83540d39feea860b5eb17b3500 - Accurate-xfloat follow-up https://github.com/ARMSX2/ARMSX3/commit/19d23eb6913c34cb63c00861bf95e58c3144e78e Co-authored-by: jpolo1224 --- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 4659a4d828..b6cf013a6a 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -9238,7 +9238,12 @@ public: } r.value = m_ir->CreateFPToSI(a.value, get_type()); +#if defined(ARCH_ARM64) + set_vr(op.rt, select(fcmp_ord(a >= fsplat(std::exp2(31.f))), splat(0x7fffffff), + select(fcmp_ord(a < fsplat(-std::exp2(31.f))), splat(0x80000000), r))); +#else set_vr(op.rt, r ^ sext(fcmp_ord(a >= fsplat(std::exp2(31.f))))); +#endif } else { @@ -9253,7 +9258,12 @@ public: value_t r; r.value = m_ir->CreateFPToSI(a.value, get_type()); +#if defined(ARCH_ARM64) + const auto sat_hi = bitcast(a) > splat(((31 + 127) << 23) - 1); + set_vr(op.rt, select(sat_hi, splat(0x7fffffff), select(fcmp_uno(a != a), splat(0x80000000), r))); +#else set_vr(op.rt, r ^ sext(bitcast(a) > splat(((31 + 127) << 23) - 1))); +#endif } }