mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-02-18 22:42:58 +00:00
Implemented Thumb Instructions: STR (imm, T1), STRB (imm), LDRB (imm), STR (imm, T2), LDR (imm, T2)
This commit is contained in:
@@ -476,9 +476,19 @@ struct ThumbTranslatorVisitor final {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_STR_imm_t1(Imm5 imm5, Reg n, Reg t) {
|
||||
u32 imm32 = imm5 << 2;
|
||||
// STR <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.GetRegister(t);
|
||||
ir.WriteMemory32(address, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_LDR_imm_t1(Imm5 imm5, Reg n, Reg t) {
|
||||
u32 imm32 = imm5 << 2;
|
||||
// LDR <Rt>, [<Rn>, #<imm>}
|
||||
// LDR <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.ReadMemory32(address);
|
||||
@@ -486,6 +496,26 @@ struct ThumbTranslatorVisitor final {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_STRB_imm(Imm5 imm5, Reg n, Reg t) {
|
||||
u32 imm32 = imm5;
|
||||
// STRB <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.LeastSignificantByte(ir.GetRegister(t));
|
||||
ir.WriteMemory8(address, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_LDRB_imm(Imm5 imm5, Reg n, Reg t) {
|
||||
u32 imm32 = imm5;
|
||||
// LDRB <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.ZeroExtendByteToWord(ir.ReadMemory8(address));
|
||||
ir.SetRegister(t, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_STRH_imm(Imm5 imm5, Reg n, Reg t) {
|
||||
u32 imm32 = imm5 << 1;
|
||||
// STRH <Rt>, [<Rn>, #<imm5>]
|
||||
@@ -504,6 +534,28 @@ struct ThumbTranslatorVisitor final {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_STR_imm_t2(Reg t, Imm5 imm5) {
|
||||
u32 imm32 = imm5 << 2;
|
||||
Reg n = Reg::SP;
|
||||
// STR <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.GetRegister(t);
|
||||
ir.WriteMemory32(address, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_LDR_imm_t2(Reg t, Imm5 imm5) {
|
||||
u32 imm32 = imm5 << 2;
|
||||
Reg n = Reg::SP;
|
||||
// LDR <Rt>, [<Rn>, #<imm>]
|
||||
// Rt cannot encode R15.
|
||||
auto address = ir.Add(ir.GetRegister(n), ir.Imm32(imm32));
|
||||
auto data = ir.ReadMemory32(address);
|
||||
ir.SetRegister(t, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool thumb16_ADR(Reg d, Imm8 imm8) {
|
||||
u32 imm32 = imm8 << 2;
|
||||
// ADR <Rd>, <label>
|
||||
|
||||
Reference in New Issue
Block a user