diff --git a/src/frontend/A32/decoder/thumb16.h b/src/frontend/A32/decoder/thumb16.h index e93a7556..87662396 100644 --- a/src/frontend/A32/decoder/thumb16.h +++ b/src/frontend/A32/decoder/thumb16.h @@ -116,6 +116,7 @@ std::optional>> DecodeThumb16(u16 // Branch instructions INST(&V::thumb16_BX, "BX", "010001110mmmm000"), // v4T INST(&V::thumb16_BLX_reg, "BLX (reg)", "010001111mmmm000"), // v5T + INST(&V::thumb16_CBZ_CBNZ, "CBZ/CBNZ", "1011o0i1iiiiinnn"), // v6T2 INST(&V::thumb16_UDF, "UDF", "11011110--------"), INST(&V::thumb16_SVC, "SVC", "11011111xxxxxxxx"), INST(&V::thumb16_B_t1, "B (T1)", "1101ccccvvvvvvvv"), diff --git a/src/frontend/A32/disassembler/disassembler_thumb.cpp b/src/frontend/A32/disassembler/disassembler_thumb.cpp index a53475db..12c444da 100644 --- a/src/frontend/A32/disassembler/disassembler_thumb.cpp +++ b/src/frontend/A32/disassembler/disassembler_thumb.cpp @@ -337,6 +337,13 @@ public: return fmt::format("blx {}", m); } + std::string thumb16_CBZ_CBNZ(bool nonzero, Imm<1> i, Imm<5> imm5, Reg n) { + const char* const name = nonzero ? "cbnz" : "cbz"; + const u32 imm = concatenate(i, imm5, Imm<1>{0}).ZeroExtend(); + + return fmt::format("{} {}, #{}", name, n, imm); + } + std::string thumb16_UDF() { return fmt::format("udf"); } diff --git a/src/frontend/A32/translate/translate_thumb.cpp b/src/frontend/A32/translate/translate_thumb.cpp index fae7ccf5..f008e493 100644 --- a/src/frontend/A32/translate/translate_thumb.cpp +++ b/src/frontend/A32/translate/translate_thumb.cpp @@ -884,6 +884,29 @@ struct ThumbTranslatorVisitor final { return true; } + // CB{N}Z ,