disassembler: Fix RegList
This commit is contained in:
parent
6197bde0fc
commit
993e142c6b
3 changed files with 16 additions and 12 deletions
|
@ -562,30 +562,30 @@ public:
|
||||||
|
|
||||||
// Load/Store multiple instructions
|
// Load/Store multiple instructions
|
||||||
std::string arm_LDM(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_LDM(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("ldm{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("ldm{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_LDMDA(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_LDMDA(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("ldmda{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("ldmda{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_LDMDB(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_LDMDB(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("ldmdb{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("ldmdb{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_LDMIB(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_LDMIB(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("ldmib{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("ldmib{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_LDM_usr() { return "ice"; }
|
std::string arm_LDM_usr() { return "ice"; }
|
||||||
std::string arm_LDM_eret() { return "ice"; }
|
std::string arm_LDM_eret() { return "ice"; }
|
||||||
std::string arm_STM(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_STM(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("stm{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("stm{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_STMDA(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_STMDA(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("stmda{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("stmda{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_STMDB(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_STMDB(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("stmdb{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("stmdb{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_STMIB(Cond cond, bool W, Reg n, RegList list) {
|
std::string arm_STMIB(Cond cond, bool W, Reg n, RegList list) {
|
||||||
return fmt::format("stmib{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", list);
|
return fmt::format("stmib{} {}{}, {{{}}}", CondToString(cond), n, W ? "!" : "", RegListToString(list));
|
||||||
}
|
}
|
||||||
std::string arm_STM_usr() { return "ice"; }
|
std::string arm_STM_usr() { return "ice"; }
|
||||||
|
|
||||||
|
|
|
@ -262,12 +262,12 @@ public:
|
||||||
|
|
||||||
std::string thumb16_PUSH(bool M, RegList reg_list) {
|
std::string thumb16_PUSH(bool M, RegList reg_list) {
|
||||||
if (M) reg_list |= 1 << 14;
|
if (M) reg_list |= 1 << 14;
|
||||||
return fmt::format("push {}", reg_list);
|
return fmt::format("push {{{}}}", RegListToString(reg_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string thumb16_POP(bool P, RegList reg_list) {
|
std::string thumb16_POP(bool P, RegList reg_list) {
|
||||||
if (P) reg_list |= 1 << 15;
|
if (P) reg_list |= 1 << 15;
|
||||||
return fmt::format("pop {}", reg_list);
|
return fmt::format("pop {{{}}}", RegListToString(reg_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string thumb16_SETEND(bool E) {
|
std::string thumb16_SETEND(bool E) {
|
||||||
|
@ -291,12 +291,12 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string thumb16_STMIA(Reg n, RegList reg_list) {
|
std::string thumb16_STMIA(Reg n, RegList reg_list) {
|
||||||
return fmt::format("stm {}!, {}", n, reg_list);
|
return fmt::format("stm {}!, {{{}}}", n, RegListToString(reg_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string thumb16_LDMIA(Reg n, RegList reg_list) {
|
std::string thumb16_LDMIA(Reg n, RegList reg_list) {
|
||||||
bool write_back = !Common::Bit(static_cast<size_t>(n), reg_list);
|
bool write_back = !Common::Bit(static_cast<size_t>(n), reg_list);
|
||||||
return fmt::format("ldm {}{}, {}", n, write_back ? "!" : "", reg_list);
|
return fmt::format("ldm {}{}, {{{}}}", n, write_back ? "!" : "", RegListToString(reg_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string thumb16_BX(Reg m) {
|
std::string thumb16_BX(Reg m) {
|
||||||
|
|
|
@ -376,3 +376,7 @@ TEST_CASE("Disassemble synchronization primitive instructions", "[arm][disassemb
|
||||||
REQUIRE(DisassembleArm(0xE1031092) == "swp r1, r2, [r3]");
|
REQUIRE(DisassembleArm(0xE1031092) == "swp r1, r2, [r3]");
|
||||||
REQUIRE(DisassembleArm(0xE1431092) == "swpb r1, r2, [r3]");
|
REQUIRE(DisassembleArm(0xE1431092) == "swpb r1, r2, [r3]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Disassemble load / store multiple instructions", "[arm][disassembler]") {
|
||||||
|
REQUIRE(DisassembleArm(0xE92D500F) == "stmdb sp!, {r0, r1, r2, r3, r12, lr}");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue