From 2268aa9093fcfba66cb8f27dda8ec1f37ec97e3e Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 3 Sep 2021 15:44:24 +0300 Subject: [PATCH] LLVM DSL: reimplement fre, frsqe, fmax, fmin --- rpcs3/Emu/CPU/CPUTranslator.h | 63 +++++++++++++---------------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index a7fd01a306..373ed8a24c 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3197,45 +3197,6 @@ public: return llvm::Intrinsic::getDeclaration(_module, id, {get_type()...}); } - // TODO: Support doubles - template ::esize == 32u && llvm_value_t::is_float>> - auto fre(T a) - { - value_t result; - const auto av = a.eval(m_ir); - result.value = m_ir->CreateCall(m_module->getOrInsertFunction("llvm.x86.sse.rcp.ps", av->getType(), av->getType()), {av}); - return result; - } - - template ::esize == 32u && llvm_value_t::is_float>> - auto frsqe(T a) - { - value_t result; - const auto av = a.eval(m_ir); - result.value = m_ir->CreateCall(m_module->getOrInsertFunction("llvm.x86.sse.rsqrt.ps", av->getType(), av->getType()), {av}); - return result; - } - - template && llvm_value_t::esize == 32u && llvm_value_t::is_float>> - auto fmax(T a, U b) - { - value_t result; - const auto av = a.eval(m_ir); - const auto bv = b.eval(m_ir); - result.value = m_ir->CreateCall(m_module->getOrInsertFunction("llvm.x86.sse.max.ps", av->getType(), av->getType(), av->getType()), {av, bv}); - return result; - } - - template && llvm_value_t::esize == 32u && llvm_value_t::is_float>> - auto fmin(T a, U b) - { - value_t result; - const auto av = a.eval(m_ir); - const auto bv = b.eval(m_ir); - result.value = m_ir->CreateCall(m_module->getOrInsertFunction("llvm.x86.sse.min.ps", av->getType(), av->getType(), av->getType()), {av, bv}); - return result; - } - template value_t gf2p8affineqb(T1 a, T2 b, u8 c) { @@ -3428,6 +3389,30 @@ public: return nullptr; }); } + + template , f32[4]>>> + static auto fre(T&& a) + { + return llvm_calli{"llvm.x86.sse.rcp.ps", {std::forward(a)}}; + } + + template , f32[4]>>> + static auto frsqe(T&& a) + { + return llvm_calli{"llvm.x86.sse.rsqrt.ps", {std::forward(a)}}; + } + + template , f32[4]>>> + static auto fmax(T&& a, U&& b) + { + return llvm_calli{"llvm.x86.sse.max.ps", {std::forward(a), std::forward(b)}}; + } + + template , f32[4]>>> + static auto fmin(T&& a, U&& b) + { + return llvm_calli{"llvm.x86.sse.min.ps", {std::forward(a), std::forward(b)}}; + } }; // Format llvm::SizeType