diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 5c92578ef3..68c6e44234 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1590,6 +1590,7 @@ extern void ppu_initialize(const ppu_module& info) { non_win32, accurate_fma, + accurate_ppu_vector_nan, __bitset_enum_max }; @@ -1603,6 +1604,10 @@ extern void ppu_initialize(const ppu_module& info) { settings += ppu_settings::accurate_fma; } + if (g_cfg.core.llvm_ppu_accurate_vector_nan) + { + settings += ppu_settings::accurate_ppu_vector_nan; + } // Write version, hash, CPU, settings fmt::append(obj_name, "v3-tane-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu)); diff --git a/rpcs3/Emu/Cell/PPUTranslator.h b/rpcs3/Emu/Cell/PPUTranslator.h index 4ae256bcd9..ec512b739d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.h +++ b/rpcs3/Emu/Cell/PPUTranslator.h @@ -107,7 +107,10 @@ public: auto vec_handle_nan(T&& expr) { value_t result; - result.value = VecHandleNan(expr.eval(m_ir)); + if (g_cfg.core.llvm_ppu_accurate_vector_nan) + result.value = VecHandleNan(expr.eval(m_ir)); + else + result.value = expr.eval(m_ir); return result; } diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index c109c3d4f4..d4097d036d 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -46,6 +46,7 @@ struct cfg_root : cfg::node cfg::_bool spu_accurate_xfloat{ this, "Accurate xfloat", false }; cfg::_bool spu_approx_xfloat{ this, "Approximate xfloat", true }; cfg::_bool llvm_accurate_dfma{ this, "LLVM Accurate DFMA", true }; // Enable accurate double-precision FMA for CPUs which do not support it natively + cfg::_bool llvm_ppu_accurate_vector_nan{ this, "PPU LLVM Accurate Vector NaN values", false }; cfg::_bool debug_console_mode{ this, "Debug Console Mode", false }; // Debug console emulation, not recommended cfg::_enum lib_loading{ this, "Lib Loader", lib_loading_type::liblv2only };