mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-01 20:24:36 +01:00
Implement thumb STM, LDM. Fix thumb POP implementation for P=1.
This commit is contained in:
parent
8a310777a1
commit
2363759c62
4 changed files with 78 additions and 39 deletions
|
|
@ -102,6 +102,20 @@ public:
|
|||
return "<internal error>";
|
||||
}
|
||||
|
||||
std::string RegListStr(RegList reg_list) {
|
||||
std::string ret = "";
|
||||
bool first_reg = true;
|
||||
for (size_t i = 0; i < 16; i++) {
|
||||
if (Common::Bit(i, reg_list)) {
|
||||
if (!first_reg)
|
||||
ret += ", ";
|
||||
ret += RegStr(static_cast<Reg>(i));
|
||||
first_reg = false;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string thumb16_LSL_imm(Imm5 imm5, Reg m, Reg d) {
|
||||
return Common::StringFromFormat("lsls %s, %s, #%u", RegStr(d), RegStr(m), imm5);
|
||||
}
|
||||
|
|
@ -336,39 +350,13 @@ public:
|
|||
}
|
||||
|
||||
std::string thumb16_PUSH(bool M, RegList reg_list) {
|
||||
if (M)
|
||||
reg_list |= 1 << 14;
|
||||
|
||||
std::string ret = "PUSH ";
|
||||
bool first_reg = true;
|
||||
for (size_t i = 0; i < 16; i++) {
|
||||
if (Common::Bit(i, reg_list)) {
|
||||
if (!first_reg)
|
||||
ret += ", ";
|
||||
ret += RegStr(static_cast<Reg>(i));
|
||||
first_reg = false;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
if (M) reg_list |= 1 << 14;
|
||||
return "push " + RegListStr(reg_list);
|
||||
}
|
||||
|
||||
std::string thumb16_POP(bool P, RegList reg_list) {
|
||||
if (P)
|
||||
reg_list |= 1 << 15;
|
||||
|
||||
std::string ret = "PUSH ";
|
||||
bool first_reg = true;
|
||||
for (size_t i = 0; i < 16; i++) {
|
||||
if (Common::Bit(i, reg_list)) {
|
||||
if (!first_reg)
|
||||
ret += ", ";
|
||||
ret += RegStr(static_cast<Reg>(i));
|
||||
first_reg = false;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
if (P) reg_list |= 1 << 15;
|
||||
return "pop " + RegListStr(reg_list);
|
||||
}
|
||||
|
||||
std::string thumb16_REV(Reg m, Reg d) {
|
||||
|
|
@ -383,6 +371,16 @@ public:
|
|||
return Common::StringFromFormat("revsh %s, %s", RegStr(d), RegStr(m));
|
||||
}
|
||||
|
||||
std::string thumb16_STMIA(Reg n, RegList reg_list) {
|
||||
return Common::StringFromFormat("stm %s!, %s", RegStr(n), RegListStr(reg_list).c_str());
|
||||
}
|
||||
|
||||
std::string thumb16_LDMIA(Reg n, RegList reg_list) {
|
||||
bool write_back = !Dynarmic::Common::Bit(static_cast<size_t>(n), reg_list);
|
||||
return Common::StringFromFormat("ldm %s%s, %s", RegStr(n), write_back ? "!" : "", RegListStr(reg_list).c_str());
|
||||
}
|
||||
|
||||
|
||||
std::string thumb16_UDF() {
|
||||
return Common::StringFromFormat("udf");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue