diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index f3fe670afd..005e3be9e6 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -5153,6 +5153,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only, u64 file_s accurate_vnan, accurate_nj_mode, contains_symbol_resolver, + daz_and_ftz, __bitset_enum_max }; @@ -5184,6 +5185,8 @@ bool ppu_initialize(const ppu_module& info, bool check_only, u64 file_s settings += ppu_settings::accurate_nj_mode, settings -= ppu_settings::fixup_nj_denormals, fmt::throw_exception("NJ Not implemented"); if (fpos >= info.get_funcs().size() || module_counter % c_moudles_per_jit == c_moudles_per_jit - 1) settings += ppu_settings::contains_symbol_resolver; // Avoid invalidating all modules for this purpose + if (g_cfg.core.set_daz_and_ftz) + settings += ppu_settings::daz_and_ftz; // Write version, hash, CPU, settings fmt::append(obj_name, "v7-kusa-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu.to_string())); diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 7cba32d9f7..4b03eb680c 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -447,6 +447,13 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module& info) Value* PPUTranslator::VecHandleNan(Value* val) { + if (m_use_avx512 && !g_cfg.core.set_daz_and_ftz) + { + // VFIXUPIMMPS is only equivalent when DAZ is disabled. + // Select the canonical NaN for QNaN/SNaN and pass through every other class. + return vfixupimmps(value(nan_vec4), value(val), splat(0x1111'1100), 0x10, 0xff).eval(m_ir); + } + const auto is_nan = m_ir->CreateFCmpUNO(val, val); val = m_ir->CreateSelect(is_nan, nan_vec4, val);