From 45fae363c6fa104c4d79a9da92309781e314faee Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 25 Jun 2017 17:22:33 +0300 Subject: [PATCH] PPU LLVM: MFCR optimized --- rpcs3/Emu/Cell/PPUTranslator.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 7eff3e4fc2..e5544273dc 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -5,6 +5,7 @@ #include "PPUInterpreter.h" #include "../Utilities/Log.h" +#include using namespace llvm; @@ -2123,9 +2124,24 @@ void PPUTranslator::MFOCRF(ppu_opcode_t op) return; } } - else + else if (std::none_of(m_cr + 0, m_cr + 32, [](auto* p) { return p; })) { - // MFCR + // MFCR (optimized) + Value* ln0 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(nullptr, m_thread, 99), GetType()), GetType()->getPointerTo()); + Value* ln1 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(nullptr, m_thread, 115), GetType()), GetType()->getPointerTo()); + + ln0 = m_ir->CreateLoad(ln0); + ln1 = m_ir->CreateLoad(ln1); + if (!m_is_be) + { + ln0 = Shuffle(ln0, nullptr, {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); + ln1 = Shuffle(ln1, nullptr, {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); + } + + const auto m0 = Call(GetType(), m_pure_attr, "llvm.x86.sse2.pmovmskb.128", m_ir->CreateShl(ln0, 7)); + const auto m1 = Call(GetType(), m_pure_attr, "llvm.x86.sse2.pmovmskb.128", m_ir->CreateShl(ln1, 7)); + SetGpr(op.rd, m_ir->CreateOr(m_ir->CreateShl(m0, 16), m1)); + return; } Value* result{};