From 794a311b114f6e7f561a847457e52ced296ba111 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 17 May 2015 10:20:02 +0200 Subject: [PATCH] Jit64: add FMA4 support to fmaddXX --- .../Core/PowerPC/Jit64/Jit_FloatingPoint.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp index ebaac9f320..032660aa1c 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp @@ -184,6 +184,39 @@ void Jit64::fmaddXX(UGeckoInstruction inst) break; } } + else if (cpu_info.bFMA4 && !Core::g_want_determinism) + { + fpr.BindToRegister(b, true, false); + switch (inst.SUBOP5) + { + case 28: //msub + if (packed) + VFMSUBPD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + else + VFMSUBSD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + break; + case 14: //madds0 + case 15: //madds1 + case 29: //madd + if (packed) + VFMADDPD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + else + VFMADDSD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + break; + case 30: //nmsub + if (packed) + VFNMADDPD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + else + VFNMADDSD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + break; + case 31: //nmadd + if (packed) + VFNMSUBPD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + else + VFNMSUBSD(XMM1, XMM1, fpr.R(a), fpr.RX(b)); + break; + } + } else if (inst.SUBOP5 == 30) //nmsub { // We implement nmsub a little differently ((b - a*c) instead of -(a*c - b)), so handle it separately.