thumb32: Implement MRS (register)
This commit is contained in:
parent
a5a210a9a5
commit
61333917a4
4 changed files with 20 additions and 2 deletions
|
@ -110,8 +110,7 @@ INST(thumb32_BXJ, "BXJ", "111100111100mmmm100011
|
||||||
//INST(thumb32_SUBS_pc_lr, "SUBS PC, LR", "111100111101111010001111--------")
|
//INST(thumb32_SUBS_pc_lr, "SUBS PC, LR", "111100111101111010001111--------")
|
||||||
|
|
||||||
//INST(thumb32_MRS_banked, "MRS (banked)", "11110011111-----10-0------1-----")
|
//INST(thumb32_MRS_banked, "MRS (banked)", "11110011111-----10-0------1-----")
|
||||||
//INST(thumb32_MRS_reg_1, "MRS (reg)", "111100111111----10-0------0-----")
|
INST(thumb32_MRS_reg, "MRS (reg)", "11110011111R11111000dddd00000000")
|
||||||
//INST(thumb32_MRS_reg_2, "MRS (reg)", "111100111110----10-0------0-----")
|
|
||||||
//INST(thumb32_HVC, "HVC", "111101111110----1000------------")
|
//INST(thumb32_HVC, "HVC", "111101111110----1000------------")
|
||||||
//INST(thumb32_SMC, "SMC", "111101111111----1000000000000000")
|
//INST(thumb32_SMC, "SMC", "111101111111----1000000000000000")
|
||||||
INST(thumb32_UDF, "UDF", "111101111111----1010------------") // v6T2
|
INST(thumb32_UDF, "UDF", "111101111111----1010------------") // v6T2
|
||||||
|
|
|
@ -66,4 +66,19 @@ bool TranslatorVisitor::thumb32_YIELD() {
|
||||||
return thumb16_YIELD();
|
return thumb16_YIELD();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TranslatorVisitor::thumb32_MRS_reg(bool read_spsr, Reg d) {
|
||||||
|
if (d == Reg::R15) {
|
||||||
|
return UnpredictableInstruction();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Revisit when implementing more than user mode.
|
||||||
|
|
||||||
|
if (read_spsr) {
|
||||||
|
return UndefinedInstruction();
|
||||||
|
}
|
||||||
|
|
||||||
|
ir.SetRegister(d, ir.GetCpsr());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Dynarmic::A32
|
} // namespace Dynarmic::A32
|
||||||
|
|
|
@ -575,6 +575,7 @@ struct TranslatorVisitor final {
|
||||||
bool thumb32_WFE();
|
bool thumb32_WFE();
|
||||||
bool thumb32_WFI();
|
bool thumb32_WFI();
|
||||||
bool thumb32_YIELD();
|
bool thumb32_YIELD();
|
||||||
|
bool thumb32_MSR_reg(bool R, Reg n, Imm<4> mask);
|
||||||
|
|
||||||
// thumb32 branch instructions
|
// thumb32 branch instructions
|
||||||
bool thumb32_BL_imm(Imm<1> S, Imm<10> hi, Imm<1> j1, Imm<1> j2, Imm<11> lo);
|
bool thumb32_BL_imm(Imm<1> S, Imm<10> hi, Imm<1> j1, Imm<1> j2, Imm<11> lo);
|
||||||
|
|
|
@ -192,6 +192,9 @@ std::vector<u16> GenRandomThumbInst(u32 pc, bool is_last_inst, A32::ITState it_s
|
||||||
// FPSCR is inaccurate
|
// FPSCR is inaccurate
|
||||||
"vfp_VMRS",
|
"vfp_VMRS",
|
||||||
|
|
||||||
|
// Unicorn is incorrect?
|
||||||
|
"thumb32_MRS_reg",
|
||||||
|
|
||||||
// Unicorn has incorrect implementation (incorrect rounding and unsets CPSR.T??)
|
// Unicorn has incorrect implementation (incorrect rounding and unsets CPSR.T??)
|
||||||
"vfp_VCVT_to_fixed",
|
"vfp_VCVT_to_fixed",
|
||||||
"vfp_VCVT_from_fixed",
|
"vfp_VCVT_from_fixed",
|
||||||
|
|
Loading…
Reference in a new issue