From f568687bd95a17c7cc0c70916457d706b9653f72 Mon Sep 17 00:00:00 2001
From: MerryMage <MerryMage@users.noreply.github.com>
Date: Thu, 18 Feb 2021 20:51:13 +0000
Subject: [PATCH] thumb32: Implement EOR (immediate)

---
 src/frontend/A32/decoder/thumb32.inc           |  2 +-
 ...mb32_data_processing_modified_immediate.cpp | 18 ++++++++++++++++++
 .../A32/translate/impl/translate_thumb.h       |  1 +
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/frontend/A32/decoder/thumb32.inc b/src/frontend/A32/decoder/thumb32.inc
index 7f0f3553..4e48875a 100644
--- a/src/frontend/A32/decoder/thumb32.inc
+++ b/src/frontend/A32/decoder/thumb32.inc
@@ -61,7 +61,7 @@ INST(thumb32_ORR_imm,        "ORR (imm)",                "11110v00010Snnnn0vvvdd
 INST(thumb32_MVN_imm,        "MVN (imm)",                "11110v00011S11110vvvddddvvvvvvvv")
 INST(thumb32_ORN_imm,        "ORN (imm)",                "11110v00011Snnnn0vvvddddvvvvvvvv")
 INST(thumb32_TEQ_imm,        "TEQ (imm)",                "11110v001001nnnn0vvv1111vvvvvvvv")
-//INST(thumb32_EOR_imm,        "EOR (imm)",                "11110-00100-----0---------------")
+INST(thumb32_EOR_imm,        "EOR (imm)",                "11110v00100Snnnn0vvvddddvvvvvvvv")
 //INST(thumb32_CMN_imm,        "CMN (imm)",                "11110-010001----0---1111--------")
 //INST(thumb32_ADD_imm_1,      "ADD (imm)",                "11110-01000-----0---------------")
 //INST(thumb32_ADC_imm,        "ADC (imm)",                "11110-01010-----0---------------")
diff --git a/src/frontend/A32/translate/impl/thumb32_data_processing_modified_immediate.cpp b/src/frontend/A32/translate/impl/thumb32_data_processing_modified_immediate.cpp
index d2bf430f..029f9249 100644
--- a/src/frontend/A32/translate/impl/thumb32_data_processing_modified_immediate.cpp
+++ b/src/frontend/A32/translate/impl/thumb32_data_processing_modified_immediate.cpp
@@ -140,4 +140,22 @@ bool ThumbTranslatorVisitor::thumb32_TEQ_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8
     return true;
 }
 
+bool ThumbTranslatorVisitor::thumb32_EOR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
+    ASSERT_MSG(!(d == Reg::PC && S), "Decode error");
+    if ((d == Reg::PC && !S) || n == Reg::PC) {
+        return UnpredictableInstruction();
+    }
+
+    const auto imm_carry = ThumbExpandImm_C(i, imm3, imm8, ir.GetCFlag());
+    const auto result = ir.Eor(ir.GetRegister(n), ir.Imm32(imm_carry.imm32));
+
+    ir.SetRegister(d, result);
+    if (S) {
+        ir.SetNFlag(ir.MostSignificantBit(result));
+        ir.SetZFlag(ir.IsZero(result));
+        ir.SetCFlag(imm_carry.carry);
+    }
+    return true;
+}
+
 } // namespace Dynarmic::A32
diff --git a/src/frontend/A32/translate/impl/translate_thumb.h b/src/frontend/A32/translate/impl/translate_thumb.h
index fbc584c7..b0741615 100644
--- a/src/frontend/A32/translate/impl/translate_thumb.h
+++ b/src/frontend/A32/translate/impl/translate_thumb.h
@@ -157,6 +157,7 @@ struct ThumbTranslatorVisitor final {
     bool thumb32_MVN_imm(Imm<1> i, bool S, Imm<3> imm3, Reg d, Imm<8> imm8);
     bool thumb32_ORN_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8);
     bool thumb32_TEQ_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8> imm8);
+    bool thumb32_EOR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8);
 
     // thumb32 miscellaneous control instructions
     bool thumb32_UDF();