From 635799ae37407621f791e6fe2aa3dba141c24763 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sun, 6 Dec 2020 15:54:48 -0800 Subject: TODONE: adr with add/subtracted offset instead of trying to shoehorn in `adr reg, label` syntax like the manual requests, it's much easier to just describe these as `{add, sub} reg, pc, offset` and potentially rewrite `pc, offset` as an `adr reg, label` if a higher-level tool has that kind of information available. --- src/armv7/thumb.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/armv7') diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs index 0d2a36e..3c480af 100644 --- a/src/armv7/thumb.rs +++ b/src/armv7/thumb.rs @@ -1281,13 +1281,14 @@ pub fn decode_into>(decoder: &InstDecoder, inst: &mut I } else { // `ADR` (`A8-320`) // v6T2 - // TODO: add = TRUE; - inst.opcode = Opcode::ADR; + // encoding T3 + // handle "add = TRUE" and "add = FALSE" by calling this add/sub + inst.opcode = Opcode::ADD; inst.operands = [ Operand::Reg(Reg::from_u8(rd)), + Operand::Reg(Reg::from_u8(15)), Operand::Imm32(imm as u32), Operand::Nothing, - Operand::Nothing, ]; } } @@ -1318,13 +1319,14 @@ pub fn decode_into>(decoder: &InstDecoder, inst: &mut I } else { // `ADR` (`A8-320`) // v6T2 - // TODO: add = FALSE; - inst.opcode = Opcode::ADR; + // encoding T2 + // handle "add = TRUE" and "add = FALSE" by calling this add/sub + inst.opcode = Opcode::SUB; inst.operands = [ Operand::Reg(Reg::from_u8(rd)), + Operand::Reg(Reg::from_u8(15)), Operand::Imm32(imm as u32), Operand::Nothing, - Operand::Nothing, ]; } } -- cgit v1.1