From 85773ad8698fc414d12bb0995be194ffd4ae9ffc Mon Sep 17 00:00:00 2001 From: Eladash Date: Mon, 4 Sep 2023 19:33:55 +0300 Subject: [PATCH] PPU LLVM: Optimize traps a bit --- rpcs3/Emu/Cell/PPUTranslator.cpp | 33 +++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 8b3ac0b402..382352fd82 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -5045,13 +5045,32 @@ void PPUTranslator::SetOverflow(Value* bit) Value* PPUTranslator::CheckTrapCondition(u32 to, Value* left, Value* right) { - Value* trap_condition = m_ir->getFalse(); - if (to & 0x10) trap_condition = m_ir->CreateOr(trap_condition, m_ir->CreateICmpSLT(left, right)); - if (to & 0x8) trap_condition = m_ir->CreateOr(trap_condition, m_ir->CreateICmpSGT(left, right)); - if (to & 0x4) trap_condition = m_ir->CreateOr(trap_condition, m_ir->CreateICmpEQ(left, right)); - if (to & 0x2) trap_condition = m_ir->CreateOr(trap_condition, m_ir->CreateICmpULT(left, right)); - if (to & 0x1) trap_condition = m_ir->CreateOr(trap_condition, m_ir->CreateICmpUGT(left, right)); - return trap_condition; + if ((to & 0x3) == 0x3 || (to & 0x18) == 0x18) + { + // Not-equal check or always-true + return to & 0x4 ? m_ir->getTrue() : m_ir->CreateICmpNE(left, right); + } + + Value* trap_condition = nullptr; + + auto add_condition = [&](Value* cond) + { + if (!trap_condition) + { + trap_condition = cond; + return; + } + + trap_condition = m_ir->CreateOr(trap_condition, cond); + }; + + if (to & 0x10) add_condition(m_ir->CreateICmpSLT(left, right)); + if (to & 0x8) add_condition(m_ir->CreateICmpSGT(left, right)); + if (to & 0x4) add_condition(m_ir->CreateICmpEQ(left, right)); + if (to & 0x2) add_condition(m_ir->CreateICmpULT(left, right)); + if (to & 0x1) add_condition(m_ir->CreateICmpUGT(left, right)); + + return trap_condition ? trap_condition : m_ir->getFalse(); } void PPUTranslator::Trap()