From ac2fb6b925da0de08f823d9ea62417af6b051f00 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sun, 10 Jul 2016 10:49:01 +0800 Subject: [PATCH] Implement thumb1_MVN_reg --- src/frontend/decoder/thumb1.h | 4 ++-- src/frontend/disassembler_thumb.cpp | 4 ++++ src/frontend/translate_thumb.cpp | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/frontend/decoder/thumb1.h b/src/frontend/decoder/thumb1.h index d4f1b4e5..9276c95c 100644 --- a/src/frontend/decoder/thumb1.h +++ b/src/frontend/decoder/thumb1.h @@ -56,7 +56,7 @@ private: }; template -static const std::array, 27> g_thumb1_instruction_table {{ +static const std::array, 28> g_thumb1_instruction_table {{ #define INST(fn, name, bitstring) detail::detail::GetMatcher(name, bitstring) @@ -89,7 +89,7 @@ static const std::array, 27> g_thumb1_instruction_table {{ { INST(&V::thumb1_ORR_reg, "ORR (reg)", "0100001100mmmddd") }, //{ INST(&V::thumb1_MULS_rr, "MULS (rr)", "0100001101mmmddd") }, { INST(&V::thumb1_BIC_reg, "BIC (reg)", "0100001110mmmddd") }, - //{ INST(&V::thumb1_MVNS_rr, "MVNS (rr)", "0100001111mmmddd") }, + { INST(&V::thumb1_MVN_reg, "MVN (reg)", "0100001111mmmddd") }, // Special data instructions { INST(&V::thumb1_ADD_reg_t2, "ADD (reg, T2)", "01000100Dmmmmddd") }, // v4T, Low regs: v6T2 diff --git a/src/frontend/disassembler_thumb.cpp b/src/frontend/disassembler_thumb.cpp index d7bfaac3..0ce5913b 100644 --- a/src/frontend/disassembler_thumb.cpp +++ b/src/frontend/disassembler_thumb.cpp @@ -203,6 +203,10 @@ public: return Common::StringFromFormat("bics %s, %s", RegStr(d_n), RegStr(m)); } + std::string thumb1_MVN_reg(Reg m, Reg d) { + return Common::StringFromFormat("mvns %s, %s", RegStr(d), RegStr(m)); + } + std::string thumb1_ADD_reg_t2(bool d_n_hi, Reg m, Reg d_n_lo) { Reg d_n = d_n_hi ? (d_n_lo + 8) : d_n_lo; return Common::StringFromFormat("add %s, %s", RegStr(d_n), RegStr(m)); diff --git a/src/frontend/translate_thumb.cpp b/src/frontend/translate_thumb.cpp index 72e02084..024a0bc8 100644 --- a/src/frontend/translate_thumb.cpp +++ b/src/frontend/translate_thumb.cpp @@ -307,6 +307,15 @@ struct TranslatorVisitor final { ir.SetZFlag(ir.IsZero(result)); return true; } + bool thumb1_MVN_reg(Reg m, Reg d) { + // MVNS , + // Rd cannot encode R15. + auto result = ir.Not(ir.GetRegister(m)); + ir.SetRegister(d, result); + ir.SetNFlag(ir.MostSignificantBit(result)); + ir.SetZFlag(ir.IsZero(result)); + return true; + } bool thumb1_ADD_reg_t2(bool d_n_hi, Reg m, Reg d_n_lo) { Reg d_n = d_n_hi ? (d_n_lo + 8) : d_n_lo;