From cdbc43712bac68cd174f4c7305bfcd41d04db51c Mon Sep 17 00:00:00 2001 From: yahfz <17715080+Yahfz@users.noreply.github.com> Date: Wed, 15 Jul 2026 02:19:53 -0300 Subject: [PATCH] PPU LLVM: Optimize vector denormal handling --- rpcs3/Emu/Cell/PPUTranslator.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 4b03eb680c..f39ae4394f 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -466,7 +466,16 @@ Value* PPUTranslator::VecHandleDenormal(Value* val) const auto type = val->getType(); const auto value = bitcast(val, GetType()); - const auto mask = SExt(m_ir->CreateICmpEQ(m_ir->CreateAnd(value, Broadcast(RegLoad(m_jm_mask), 4)), ConstantAggregateZero::get(value->getType())), GetType()); + const auto is_zero_or_denormal = m_ir->CreateICmpEQ(m_ir->CreateAnd(value, Broadcast(RegLoad(m_jm_mask), 4)), ConstantAggregateZero::get(value->getType())); + + if (m_use_avx512) + { + // AVX-512 lowers this to vptestnmd and a masked AND. + const auto signed_zero = m_ir->CreateAnd(value, Broadcast(m_ir->getInt32(0x8000'0000), 4)); + return bitcast(m_ir->CreateSelect(is_zero_or_denormal, signed_zero, value), type); + } + + const auto mask = SExt(is_zero_or_denormal, GetType()); const auto nz = m_ir->CreateLShr(mask, 1); const auto result = m_ir->CreateAnd(m_ir->CreateNot(nz), value);