From ba84e7a8def4a50b308520f53a14417e9895ccb8 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 4 Apr 2018 19:02:45 +0100 Subject: [PATCH] A64: Implement FNMSUB --- src/frontend/A64/decoder/a64.inc | 2 +- ...oating_point_data_processing_three_register.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/frontend/A64/decoder/a64.inc b/src/frontend/A64/decoder/a64.inc index 01de3f09..6c32fc46 100644 --- a/src/frontend/A64/decoder/a64.inc +++ b/src/frontend/A64/decoder/a64.inc @@ -942,4 +942,4 @@ INST(FCSEL_float, "FCSEL", "00011 INST(FMADD_float, "FMADD", "00011111yy0mmmmm0aaaaannnnnddddd") INST(FMSUB_float, "FMSUB", "00011111yy0mmmmm1aaaaannnnnddddd") INST(FNMADD_float, "FNMADD", "00011111yy1mmmmm0aaaaannnnnddddd") -//INST(FNMSUB_float, "FNMSUB", "00011111yy1mmmmm1aaaaannnnnddddd") +INST(FNMSUB_float, "FNMSUB", "00011111yy1mmmmm1aaaaannnnnddddd") diff --git a/src/frontend/A64/translate/impl/floating_point_data_processing_three_register.cpp b/src/frontend/A64/translate/impl/floating_point_data_processing_three_register.cpp index ae609f7e..488cedbe 100644 --- a/src/frontend/A64/translate/impl/floating_point_data_processing_three_register.cpp +++ b/src/frontend/A64/translate/impl/floating_point_data_processing_three_register.cpp @@ -65,4 +65,18 @@ bool TranslatorVisitor::FNMADD_float(Imm<2> type, Vec Vm, Vec Va, Vec Vn, Vec Vd return true; } +bool TranslatorVisitor::FNMSUB_float(Imm<2> type, Vec Vm, Vec Va, Vec Vn, Vec Vd) { + const auto datasize = GetDataSize(type); + if (!datasize || *datasize == 16) { + return UnallocatedEncoding(); + } + + const IR::U32U64 operanda = V_scalar(*datasize, Va); + const IR::U32U64 operand1 = V_scalar(*datasize, Vn); + const IR::U32U64 operand2 = V_scalar(*datasize, Vm); + const IR::U32U64 result = ir.FPMulAdd(ir.FPNeg(operanda), operand1, operand2, true); + V_scalar(*datasize, Vd, result); + return true; +} + } // namespace Dynarmic::A64