| 1756 | } |
| 1757 | |
| 1758 | static 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) |
nothing calls this directly
no test coverage detected
searching dependent graphs…