Implemented Thumb Instructions: STR (imm, T1), STRB (imm), LDRB (imm), STR (imm, T2), LDR (imm, T2)

This commit is contained in:
MerryMage
2016-07-18 18:48:08 +01:00
parent a605a43ef9
commit 14dcb18bbe
3 changed files with 83 additions and 3 deletions

View File

@@ -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>