A32: Implement Thumb-16's variant of BKPT
This commit is contained in:
parent
675f67e41d
commit
b17a5d3365
3 changed files with 14 additions and 1 deletions
|
@ -99,7 +99,7 @@ std::optional<std::reference_wrapper<const Thumb16Matcher<V>>> DecodeThumb16(u16
|
||||||
INST(&V::thumb16_REV, "REV", "1011101000mmmddd"), // v6
|
INST(&V::thumb16_REV, "REV", "1011101000mmmddd"), // v6
|
||||||
INST(&V::thumb16_REV16, "REV16", "1011101001mmmddd"), // v6
|
INST(&V::thumb16_REV16, "REV16", "1011101001mmmddd"), // v6
|
||||||
INST(&V::thumb16_REVSH, "REVSH", "1011101011mmmddd"), // v6
|
INST(&V::thumb16_REVSH, "REVSH", "1011101011mmmddd"), // v6
|
||||||
//INST(&V::thumb16_BKPT, "BKPT", "10111110xxxxxxxx"), // v5
|
INST(&V::thumb16_BKPT, "BKPT", "10111110xxxxxxxx"), // v5
|
||||||
|
|
||||||
// Store/Load multiple registers
|
// Store/Load multiple registers
|
||||||
INST(&V::thumb16_STMIA, "STMIA", "11000nnnxxxxxxxx"),
|
INST(&V::thumb16_STMIA, "STMIA", "11000nnnxxxxxxxx"),
|
||||||
|
|
|
@ -292,6 +292,10 @@ public:
|
||||||
return fmt::format("revsh {}, {}", d, m);
|
return fmt::format("revsh {}, {}", d, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string thumb16_BKPT(Imm<8> imm8) {
|
||||||
|
return fmt::format("bkpt #{}", imm8.ZeroExtend());
|
||||||
|
}
|
||||||
|
|
||||||
std::string thumb16_STMIA(Reg n, RegList reg_list) {
|
std::string thumb16_STMIA(Reg n, RegList reg_list) {
|
||||||
return fmt::format("stm {}!, {{{}}}", n, RegListToString(reg_list));
|
return fmt::format("stm {}!, {{{}}}", n, RegListToString(reg_list));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
|
#include <dynarmic/A32/config.h>
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/bit_util.h"
|
#include "common/bit_util.h"
|
||||||
#include "frontend/imm.h"
|
#include "frontend/imm.h"
|
||||||
|
@ -804,6 +806,13 @@ struct ThumbTranslatorVisitor final {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BKPT #<imm8>
|
||||||
|
bool thumb16_BKPT([[maybe_unused]] Imm<8> imm8) {
|
||||||
|
ir.ExceptionRaised(Exception::Breakpoint);
|
||||||
|
ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// STM <Rn>!, <reg_list>
|
// STM <Rn>!, <reg_list>
|
||||||
bool thumb16_STMIA(Reg n, RegList reg_list) {
|
bool thumb16_STMIA(Reg n, RegList reg_list) {
|
||||||
auto address = ir.GetRegister(n);
|
auto address = ir.GetRegister(n);
|
||||||
|
|
Loading…
Reference in a new issue