diff --git a/src/frontend/A64/decoder/a64.inc b/src/frontend/A64/decoder/a64.inc index 81afdd67..f7646460 100644 --- a/src/frontend/A64/decoder/a64.inc +++ b/src/frontend/A64/decoder/a64.inc @@ -891,7 +891,7 @@ INST(FCVTZU_float_int, "FCVTZU (scalar, integer)", "z0011 //INST(FJCVTZS, "FJCVTZS", "0001111001111110000000nnnnnddddd") // Data Processing - FP and SIMD - Floating point data processing -//INST(FMOV_float, "FMOV (register)", "00011110yy100000010000nnnnnddddd") +INST(FMOV_float, "FMOV (register)", "00011110yy100000010000nnnnnddddd") INST(FABS_float, "FABS (scalar)", "00011110yy100000110000nnnnnddddd") INST(FNEG_float, "FNEG (scalar)", "00011110yy100001010000nnnnnddddd") //INST(FSQRT_float, "FSQRT (scalar)", "00011110yy100001110000nnnnnddddd") diff --git a/src/frontend/A64/translate/impl/floating_point_data_processing_one_register.cpp b/src/frontend/A64/translate/impl/floating_point_data_processing_one_register.cpp index 22033120..ceef79a8 100644 --- a/src/frontend/A64/translate/impl/floating_point_data_processing_one_register.cpp +++ b/src/frontend/A64/translate/impl/floating_point_data_processing_one_register.cpp @@ -22,6 +22,18 @@ static boost::optional GetDataSize(Imm<2> type) { return boost::none; } +bool TranslatorVisitor::FMOV_float(Imm<2> type, Vec Vn, Vec Vd) { + const boost::optional datasize = GetDataSize(type); + if (!datasize || *datasize == 16) { + return UnallocatedEncoding(); + } + + const IR::U128 operand = V(*datasize, Vn); + + V(*datasize, Vd, operand); + return true; +} + bool TranslatorVisitor::FABS_float(Imm<2> type, Vec Vn, Vec Vd) { boost::optional datasize = GetDataSize(type); if (!datasize || *datasize == 16) {