From 01db83bc365e7a7c5f0f608d3779de8710ceea90 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 2 Mar 2020 23:28:13 +0300 Subject: [PATCH] SPU LLVM: Rewrite fma32x4 to match FM and older asmjit stuff --- rpcs3/Emu/Cell/SPURecompiler.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 1886fe6b00..897e04b1ed 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -7381,27 +7381,25 @@ public: value_t fma32x4(value_t a, value_t b, value_t c) { - // Compare absolute values with max positive float in normal range. - const auto aa = bitcast(fabs(a)); - const auto ab = bitcast(fabs(b)); - const auto sc = eval(max(aa, ab) > 0x7f7fffff); + const auto ma = eval(sext(fcmp_uno(a != fsplat(0.)))); + const auto mb = eval(sext(fcmp_uno(b != fsplat(0.)))); + const auto ca = eval(bitcast(bitcast(a) & mb)); + const auto cb = eval(bitcast(bitcast(b) & ma)); if (m_use_fma) { value_t r; - r.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::fma), {a.value, b.value, c.value}); - r.value = m_ir->CreateSelect(sc.value, c.value, r.value); + r.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::fma), {ca.value, cb.value, c.value}); return r; } // Convert to doubles - const auto xa = m_ir->CreateFPExt(a.value, get_type()); - const auto xb = m_ir->CreateFPExt(b.value, get_type()); + const auto xa = m_ir->CreateFPExt(ca.value, get_type()); + const auto xb = m_ir->CreateFPExt(cb.value, get_type()); const auto xc = m_ir->CreateFPExt(c.value, get_type()); const auto xr = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::fmuladd), {xa, xb, xc}); value_t r; r.value = m_ir->CreateFPTrunc(xr, get_type()); - r.value = m_ir->CreateSelect(sc.value, c.value, r.value); return r; }