MCPcopy Create free account
hub / github.com/capstone-engine/capstone / DecodeAddrMode3Instruction

Function DecodeAddrMode3Instruction

arch/ARM/ARMDisassembler.c:1758–1978  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1756}
1757
1758static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
1759 uint64_t Address, const void *Decoder)
1760{
1761 DecodeStatus S = MCDisassembler_Success;
1762
1763 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
1764 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1765 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
1766 unsigned type = fieldFromInstruction_4(Insn, 22, 1);
1767 unsigned imm = fieldFromInstruction_4(Insn, 8, 4);
1768 unsigned U = ((~fieldFromInstruction_4(Insn, 23, 1)) & 1) << 8;
1769 unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1770 unsigned W = fieldFromInstruction_4(Insn, 21, 1);
1771 unsigned P = fieldFromInstruction_4(Insn, 24, 1);
1772 unsigned Rt2 = Rt + 1;
1773
1774 bool writeback = (W == 1) | (P == 0);
1775
1776 // For {LD,ST}RD, Rt must be even, else undefined.
1777 switch (MCInst_getOpcode(Inst)) {
1778 case ARM_STRD:
1779 case ARM_STRD_PRE:
1780 case ARM_STRD_POST:
1781 case ARM_LDRD:
1782 case ARM_LDRD_PRE:
1783 case ARM_LDRD_POST:
1784 if (Rt & 0x1)
1785 S = MCDisassembler_SoftFail;
1786 break;
1787 default:
1788 break;
1789 }
1790
1791 switch (MCInst_getOpcode(Inst)) {
1792 case ARM_STRD:
1793 case ARM_STRD_PRE:
1794 case ARM_STRD_POST:
1795 if (P == 0 && W == 1)
1796 S = MCDisassembler_SoftFail;
1797
1798 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1799 S = MCDisassembler_SoftFail;
1800
1801 if (type && Rm == 15)
1802 S = MCDisassembler_SoftFail;
1803
1804 if (Rt2 == 15)
1805 S = MCDisassembler_SoftFail;
1806
1807 if (!type && fieldFromInstruction_4(Insn, 8, 4))
1808 S = MCDisassembler_SoftFail;
1809
1810 break;
1811
1812 case ARM_STRH:
1813 case ARM_STRH_PRE:
1814 case ARM_STRH_POST:
1815 if (Rt == 15)

Callers

nothing calls this directly

Calls 6

MCInst_getOpcodeFunction · 0.85
MCOperand_CreateReg0Function · 0.85
MCOperand_CreateImm0Function · 0.85
DecodePredicateOperandFunction · 0.85
CheckFunction · 0.70
DecodeGPRRegisterClassFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…