diff --git a/src/frontend/A64/decoder/a64.inc b/src/frontend/A64/decoder/a64.inc index 39dd32de..9b9eb30b 100644 --- a/src/frontend/A64/decoder/a64.inc +++ b/src/frontend/A64/decoder/a64.inc @@ -427,7 +427,7 @@ INST(ADDP_pair, "ADDP (scalar)", "01011 //INST(FMAXNMP_pair_1, "FMAXNMP (scalar)", "0101111000110000110010nnnnnddddd") //INST(FMAXNMP_pair_2, "FMAXNMP (scalar)", "011111100z110000110010nnnnnddddd") //INST(FADDP_pair_1, "FADDP (scalar)", "0101111000110000110110nnnnnddddd") -//INST(FADDP_pair_2, "FADDP (scalar)", "011111100z110000110110nnnnnddddd") +INST(FADDP_pair_2, "FADDP (scalar)", "011111100z110000110110nnnnnddddd") //INST(FMAXP_pair_1, "FMAXP (scalar)", "0101111000110000111110nnnnnddddd") //INST(FMAXP_pair_2, "FMAXP (scalar)", "011111100z110000111110nnnnnddddd") //INST(FMINNMP_pair_1, "FMINNMP (scalar)", "0101111010110000110010nnnnnddddd") diff --git a/src/frontend/A64/translate/impl/simd_scalar_pairwise.cpp b/src/frontend/A64/translate/impl/simd_scalar_pairwise.cpp index aa7dae0d..4facf3ef 100644 --- a/src/frontend/A64/translate/impl/simd_scalar_pairwise.cpp +++ b/src/frontend/A64/translate/impl/simd_scalar_pairwise.cpp @@ -21,5 +21,15 @@ bool TranslatorVisitor::ADDP_pair(Imm<2> size, Vec Vn, Vec Vd) { return true; } +bool TranslatorVisitor::FADDP_pair_2(bool size, Vec Vn, Vec Vd) { + const size_t esize = size ? 64 : 32; + + const IR::U32U64 operand1 = ir.VectorGetElement(esize, V(128, Vn), 0); + const IR::U32U64 operand2 = ir.VectorGetElement(esize, V(128, Vn), 1); + const IR::U128 result = ir.ZeroExtendToQuad(ir.FPAdd(operand1, operand2, true)); + V(128, Vd, result); + return true; +} + } // namespace A64 } // namespace Dynarmic