37#define DEBUG_TYPE "arm-disassembler"
55 void advanceITState() { ITStates.pop_back(); }
58 bool instrInITBlock() {
return !ITStates.empty(); }
61 bool instrLastInITBlock() {
return ITStates.size() == 1; }
67 void setITState(
char Firstcond,
char Mask) {
70 unsigned char CCBits =
static_cast<unsigned char>(Firstcond & 0xf);
71 assert(NumTZ <= 3 &&
"Invalid IT mask!");
73 for (
unsigned Pos = NumTZ + 1; Pos <= 3; ++Pos) {
74 unsigned Else = (Mask >> Pos) & 1;
75 ITStates.push_back(CCBits ^ Else);
77 ITStates.push_back(CCBits);
81 std::vector<unsigned char> ITStates;
86 unsigned getVPTPred() {
88 if (instrInVPTBlock())
89 Pred = VPTStates.back();
93 void advanceVPTState() { VPTStates.pop_back(); }
95 bool instrInVPTBlock() {
return !VPTStates.empty(); }
97 bool instrLastInVPTBlock() {
return VPTStates.size() == 1; }
99 void setVPTState(
char Mask) {
102 assert(NumTZ <= 3 &&
"Invalid VPT mask!");
104 for (
unsigned Pos = NumTZ + 1; Pos <= 3; ++Pos) {
105 bool T = ((Mask >> Pos) & 1) == 0;
121 std::unique_ptr<const MCInstrInfo> MCII;
126 InstructionEndianness = STI.
hasFeature(ARM::ModeBigEndianInstructions)
131 ~ARMDisassembler()
override =
default;
149 mutable ITStatus ITBlock;
150 mutable VPTStatus VPTBlock;
152 void AddThumb1SBit(
MCInst &
MI,
bool InITBlock)
const;
211 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
212 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
213 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
214 ARM::R12, ARM::SP, ARM::LR, ARM::PC
218 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
219 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
220 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
221 ARM::R12, 0, ARM::LR, ARM::APSR
327 ARM::R0_R1, ARM::R2_R3, ARM::R4_R5, ARM::R6_R7,
328 ARM::R8_R9, ARM::R10_R11, ARM::R12_SP
358 if ((RegNo & 1) || RegNo > 10)
413 if ((RegNo == 13 && !featureBits[ARM::HasV8Ops]) || RegNo == 15)
421 ARM::S0, ARM::S1, ARM::S2, ARM::S3,
422 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
423 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
424 ARM::S12, ARM::S13, ARM::S14, ARM::S15,
425 ARM::S16, ARM::S17, ARM::S18, ARM::S19,
426 ARM::S20, ARM::S21, ARM::S22, ARM::S23,
427 ARM::S24, ARM::S25, ARM::S26, ARM::S27,
428 ARM::S28, ARM::S29, ARM::S30, ARM::S31
449 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
450 ARM::D4, ARM::D5, ARM::D6, ARM::D7,
451 ARM::D8, ARM::D9, ARM::D10, ARM::D11,
452 ARM::D12, ARM::D13, ARM::D14, ARM::D15,
453 ARM::D16, ARM::D17, ARM::D18, ARM::D19,
454 ARM::D20, ARM::D21, ARM::D22, ARM::D23,
455 ARM::D24, ARM::D25, ARM::D26, ARM::D27,
456 ARM::D28, ARM::D29, ARM::D30, ARM::D31
465 return featureBits[ARM::FeatureD32];
471 if (RegNo > (
PermitsD32(Inst, Decoder) ? 31u : 15u))
504 ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
505 ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7,
506 ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
507 ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
513 if (RegNo > 31 || (RegNo & 1) != 0)
523 ARM::Q0, ARM::D1_D2, ARM::Q1, ARM::D3_D4, ARM::Q2, ARM::D5_D6,
524 ARM::Q3, ARM::D7_D8, ARM::Q4, ARM::D9_D10, ARM::Q5, ARM::D11_D12,
525 ARM::Q6, ARM::D13_D14, ARM::Q7, ARM::D15_D16, ARM::Q8, ARM::D17_D18,
526 ARM::Q9, ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
527 ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
543 ARM::D0_D2, ARM::D1_D3, ARM::D2_D4, ARM::D3_D5,
544 ARM::D4_D6, ARM::D5_D7, ARM::D6_D8, ARM::D7_D9,
545 ARM::D8_D10, ARM::D9_D11, ARM::D10_D12, ARM::D11_D13,
546 ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
547 ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
548 ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
549 ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
550 ARM::D28_D30, ARM::D29_D31
576 ARM::Q0_Q1, ARM::Q1_Q2, ARM::Q2_Q3, ARM::Q3_Q4,
577 ARM::Q4_Q5, ARM::Q5_Q6, ARM::Q6_Q7
592 ARM::Q0_Q1_Q2_Q3, ARM::Q1_Q2_Q3_Q4, ARM::Q2_Q3_Q4_Q5,
593 ARM::Q3_Q4_Q5_Q6, ARM::Q4_Q5_Q6_Q7
615 if (Inst.
getOpcode() == ARM::tBcc && Val == 0xE)
618 static_cast<const ARMDisassembler *
>(Decoder)->MCII.
get();
671 unsigned Op = Shift | (imm << 3);
718 bool NeedDisjointWriteback =
false;
728 case ARM::t2LDMIA_UPD:
729 case ARM::t2LDMDB_UPD:
730 case ARM::t2STMIA_UPD:
731 case ARM::t2STMDB_UPD:
732 NeedDisjointWriteback =
true;
742 for (
unsigned i = 0; i < 16; ++i) {
743 if (Val & (1 << i)) {
752 if (NeedDisjointWriteback && WritebackReg == Inst.
end()[-1].getReg())
770 if (regs == 0 || (Vd + regs) > 32) {
771 regs = Vd + regs > 32 ? 32 - Vd : regs;
772 regs = std::max( 1u, regs);
778 for (
unsigned i = 0; i < (regs - 1); ++i) {
795 unsigned MaxReg =
PermitsD32(Inst, Decoder) ? 32 : 16;
796 if (regs == 0 || (Vd + regs) > MaxReg) {
797 regs = Vd + regs > MaxReg ? MaxReg - Vd : regs;
798 regs = std::max( 1u, regs);
799 regs = std::min(MaxReg, regs);
805 for (
unsigned i = 0; i < (regs - 1); ++i) {
834 if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
835 uint32_t lsb_mask = (1U << lsb) - 1;
856 case ARM::LDC_OFFSET:
859 case ARM::LDC_OPTION:
860 case ARM::LDCL_OFFSET:
863 case ARM::LDCL_OPTION:
864 case ARM::STC_OFFSET:
867 case ARM::STC_OPTION:
868 case ARM::STCL_OFFSET:
871 case ARM::STCL_OPTION:
872 case ARM::t2LDC_OFFSET:
874 case ARM::t2LDC_POST:
875 case ARM::t2LDC_OPTION:
876 case ARM::t2LDCL_OFFSET:
877 case ARM::t2LDCL_PRE:
878 case ARM::t2LDCL_POST:
879 case ARM::t2LDCL_OPTION:
880 case ARM::t2STC_OFFSET:
882 case ARM::t2STC_POST:
883 case ARM::t2STC_OPTION:
884 case ARM::t2STCL_OFFSET:
885 case ARM::t2STCL_PRE:
886 case ARM::t2STCL_POST:
887 case ARM::t2STCL_OPTION:
888 case ARM::t2LDC2_OFFSET:
889 case ARM::t2LDC2L_OFFSET:
890 case ARM::t2LDC2_PRE:
891 case ARM::t2LDC2L_PRE:
892 case ARM::t2STC2_OFFSET:
893 case ARM::t2STC2L_OFFSET:
894 case ARM::t2STC2_PRE:
895 case ARM::t2STC2L_PRE:
896 case ARM::LDC2_OFFSET:
897 case ARM::LDC2L_OFFSET:
900 case ARM::STC2_OFFSET:
901 case ARM::STC2L_OFFSET:
904 case ARM::t2LDC2_OPTION:
905 case ARM::t2STC2_OPTION:
906 case ARM::t2LDC2_POST:
907 case ARM::t2LDC2L_POST:
908 case ARM::t2STC2_POST:
909 case ARM::t2STC2L_POST:
911 case ARM::LDC2L_POST:
913 case ARM::STC2L_POST:
914 if (coproc == 0xA || coproc == 0xB ||
915 (featureBits[ARM::HasV8_1MMainlineOps] &&
916 (coproc == 0x8 || coproc == 0x9 || coproc == 0xA || coproc == 0xB ||
917 coproc == 0xE || coproc == 0xF)))
924 if (featureBits[ARM::HasV8Ops] && (coproc != 14))
933 case ARM::t2LDC2_OFFSET:
934 case ARM::t2LDC2L_OFFSET:
935 case ARM::t2LDC2_PRE:
936 case ARM::t2LDC2L_PRE:
937 case ARM::t2STC2_OFFSET:
938 case ARM::t2STC2L_OFFSET:
939 case ARM::t2STC2_PRE:
940 case ARM::t2STC2L_PRE:
941 case ARM::LDC2_OFFSET:
942 case ARM::LDC2L_OFFSET:
945 case ARM::STC2_OFFSET:
946 case ARM::STC2L_OFFSET:
949 case ARM::t2LDC_OFFSET:
950 case ARM::t2LDCL_OFFSET:
952 case ARM::t2LDCL_PRE:
953 case ARM::t2STC_OFFSET:
954 case ARM::t2STCL_OFFSET:
956 case ARM::t2STCL_PRE:
957 case ARM::LDC_OFFSET:
958 case ARM::LDCL_OFFSET:
961 case ARM::STC_OFFSET:
962 case ARM::STCL_OFFSET:
968 case ARM::t2LDC2_POST:
969 case ARM::t2LDC2L_POST:
970 case ARM::t2STC2_POST:
971 case ARM::t2STC2L_POST:
973 case ARM::LDC2L_POST:
975 case ARM::STC2L_POST:
976 case ARM::t2LDC_POST:
977 case ARM::t2LDCL_POST:
978 case ARM::t2STC_POST:
979 case ARM::t2STCL_POST:
994 case ARM::LDC_OFFSET:
997 case ARM::LDC_OPTION:
998 case ARM::LDCL_OFFSET:
1000 case ARM::LDCL_POST:
1001 case ARM::LDCL_OPTION:
1002 case ARM::STC_OFFSET:
1005 case ARM::STC_OPTION:
1006 case ARM::STCL_OFFSET:
1008 case ARM::STCL_POST:
1009 case ARM::STCL_OPTION:
1036 case ARM::STR_POST_IMM:
1037 case ARM::STR_POST_REG:
1038 case ARM::STRB_POST_IMM:
1039 case ARM::STRB_POST_REG:
1040 case ARM::STRT_POST_REG:
1041 case ARM::STRT_POST_IMM:
1042 case ARM::STRBT_POST_REG:
1043 case ARM::STRBT_POST_IMM:
1056 case ARM::LDR_POST_IMM:
1057 case ARM::LDR_POST_REG:
1058 case ARM::LDRB_POST_IMM:
1059 case ARM::LDRB_POST_REG:
1060 case ARM::LDRBT_POST_REG:
1061 case ARM::LDRBT_POST_IMM:
1062 case ARM::LDRT_POST_REG:
1063 case ARM::LDRT_POST_IMM:
1078 bool writeback = (
P == 0) || (W == 1);
1079 unsigned idx_mode = 0;
1082 else if (!
P && writeback)
1085 if (writeback && (Rn == 15 || Rn == Rt))
1197 unsigned Rt2 = Rt + 1;
1199 bool writeback = (W == 1) | (
P == 0);
1205 case ARM::STRD_POST:
1208 case ARM::LDRD_POST:
1217 case ARM::STRD_POST:
1218 if (
P == 0 && W == 1)
1221 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1223 if (type && Rm == 15)
1232 case ARM::STRH_POST:
1235 if (writeback && (Rn == 15 || Rn == Rt))
1237 if (!type && Rm == 15)
1242 case ARM::LDRD_POST:
1243 if (type && Rn == 15) {
1248 if (
P == 0 && W == 1)
1250 if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1252 if (!type && writeback && Rn == 15)
1254 if (writeback && (Rn == Rt || Rn == Rt2))
1259 case ARM::LDRH_POST:
1260 if (type && Rn == 15) {
1267 if (!type && Rm == 15)
1269 if (!type && writeback && (Rn == 15 || Rn == Rt))
1273 case ARM::LDRSH_PRE:
1274 case ARM::LDRSH_POST:
1276 case ARM::LDRSB_PRE:
1277 case ARM::LDRSB_POST:
1278 if (type && Rn == 15) {
1283 if (type && (Rt == 15 || (writeback && Rn == Rt)))
1285 if (!type && (Rt == 15 || Rm == 15))
1287 if (!type && writeback && (Rn == 15 || Rn == Rt))
1304 case ARM::STRD_POST:
1307 case ARM::STRH_POST:
1321 case ARM::STRD_POST:
1324 case ARM::LDRD_POST:
1337 case ARM::LDRD_POST:
1340 case ARM::LDRH_POST:
1342 case ARM::LDRSH_PRE:
1343 case ARM::LDRSH_POST:
1345 case ARM::LDRSB_PRE:
1346 case ARM::LDRSB_POST:
1434 }
else if (imod && !M) {
1439 }
else if (!imod && M) {
1493 case ARM::LDMDA_UPD:
1499 case ARM::LDMDB_UPD:
1505 case ARM::LDMIA_UPD:
1511 case ARM::LDMIB_UPD:
1517 case ARM::STMDA_UPD:
1523 case ARM::STMDB_UPD:
1529 case ARM::STMIA_UPD:
1535 case ARM::STMIB_UPD:
1587 if (imm8 == 0x10 && pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
1615 }
else if (imod && !M) {
1620 }
else if (!imod && M) {
1641 unsigned Opcode = ARM::t2HINT;
1644 Opcode = ARM::t2PACBTI;
1645 }
else if (imm == 0x1D) {
1646 Opcode = ARM::t2PAC;
1647 }
else if (imm == 0x2D) {
1648 Opcode = ARM::t2AUT;
1649 }
else if (imm == 0x0F) {
1650 Opcode = ARM::t2BTI;
1654 if (Opcode == ARM::t2HINT) {
1753 if (!FeatureBits[ARM::HasV8_1aOps] ||
1754 !FeatureBits[ARM::HasV8Ops])
1806 if (!add) imm *= -1;
1807 if (imm == 0 && !add) imm = INT32_MIN;
1877 unsigned I1 = !(J1 ^ S);
1878 unsigned I2 = !(J2 ^ S);
1881 unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
1884 true, 4, Inst, Decoder))
1902 true, 4, Inst, Decoder))
1908 true, 4, Inst, Decoder))
1952 case ARM::VLD1q16:
case ARM::VLD1q32:
case ARM::VLD1q64:
case ARM::VLD1q8:
1953 case ARM::VLD1q16wb_fixed:
case ARM::VLD1q16wb_register:
1954 case ARM::VLD1q32wb_fixed:
case ARM::VLD1q32wb_register:
1955 case ARM::VLD1q64wb_fixed:
case ARM::VLD1q64wb_register:
1956 case ARM::VLD1q8wb_fixed:
case ARM::VLD1q8wb_register:
1957 case ARM::VLD2d16:
case ARM::VLD2d32:
case ARM::VLD2d8:
1958 case ARM::VLD2d16wb_fixed:
case ARM::VLD2d16wb_register:
1959 case ARM::VLD2d32wb_fixed:
case ARM::VLD2d32wb_register:
1960 case ARM::VLD2d8wb_fixed:
case ARM::VLD2d8wb_register:
1967 case ARM::VLD2b16wb_fixed:
1968 case ARM::VLD2b16wb_register:
1969 case ARM::VLD2b32wb_fixed:
1970 case ARM::VLD2b32wb_register:
1971 case ARM::VLD2b8wb_fixed:
1972 case ARM::VLD2b8wb_register:
1986 case ARM::VLD3d8_UPD:
1987 case ARM::VLD3d16_UPD:
1988 case ARM::VLD3d32_UPD:
1992 case ARM::VLD4d8_UPD:
1993 case ARM::VLD4d16_UPD:
1994 case ARM::VLD4d32_UPD:
2001 case ARM::VLD3q8_UPD:
2002 case ARM::VLD3q16_UPD:
2003 case ARM::VLD3q32_UPD:
2007 case ARM::VLD4q8_UPD:
2008 case ARM::VLD4q16_UPD:
2009 case ARM::VLD4q32_UPD:
2022 case ARM::VLD3d8_UPD:
2023 case ARM::VLD3d16_UPD:
2024 case ARM::VLD3d32_UPD:
2028 case ARM::VLD4d8_UPD:
2029 case ARM::VLD4d16_UPD:
2030 case ARM::VLD4d32_UPD:
2037 case ARM::VLD3q8_UPD:
2038 case ARM::VLD3q16_UPD:
2039 case ARM::VLD3q32_UPD:
2043 case ARM::VLD4q8_UPD:
2044 case ARM::VLD4q16_UPD:
2045 case ARM::VLD4q32_UPD:
2058 case ARM::VLD4d8_UPD:
2059 case ARM::VLD4d16_UPD:
2060 case ARM::VLD4d32_UPD:
2067 case ARM::VLD4q8_UPD:
2068 case ARM::VLD4q16_UPD:
2069 case ARM::VLD4q32_UPD:
2079 case ARM::VLD1d8wb_fixed:
2080 case ARM::VLD1d16wb_fixed:
2081 case ARM::VLD1d32wb_fixed:
2082 case ARM::VLD1d64wb_fixed:
2083 case ARM::VLD1d8wb_register:
2084 case ARM::VLD1d16wb_register:
2085 case ARM::VLD1d32wb_register:
2086 case ARM::VLD1d64wb_register:
2087 case ARM::VLD1q8wb_fixed:
2088 case ARM::VLD1q16wb_fixed:
2089 case ARM::VLD1q32wb_fixed:
2090 case ARM::VLD1q64wb_fixed:
2091 case ARM::VLD1q8wb_register:
2092 case ARM::VLD1q16wb_register:
2093 case ARM::VLD1q32wb_register:
2094 case ARM::VLD1q64wb_register:
2095 case ARM::VLD1d8Twb_fixed:
2096 case ARM::VLD1d8Twb_register:
2097 case ARM::VLD1d16Twb_fixed:
2098 case ARM::VLD1d16Twb_register:
2099 case ARM::VLD1d32Twb_fixed:
2100 case ARM::VLD1d32Twb_register:
2101 case ARM::VLD1d64Twb_fixed:
2102 case ARM::VLD1d64Twb_register:
2103 case ARM::VLD1d8Qwb_fixed:
2104 case ARM::VLD1d8Qwb_register:
2105 case ARM::VLD1d16Qwb_fixed:
2106 case ARM::VLD1d16Qwb_register:
2107 case ARM::VLD1d32Qwb_fixed:
2108 case ARM::VLD1d32Qwb_register:
2109 case ARM::VLD1d64Qwb_fixed:
2110 case ARM::VLD1d64Qwb_register:
2111 case ARM::VLD2d8wb_fixed:
2112 case ARM::VLD2d16wb_fixed:
2113 case ARM::VLD2d32wb_fixed:
2114 case ARM::VLD2q8wb_fixed:
2115 case ARM::VLD2q16wb_fixed:
2116 case ARM::VLD2q32wb_fixed:
2117 case ARM::VLD2d8wb_register:
2118 case ARM::VLD2d16wb_register:
2119 case ARM::VLD2d32wb_register:
2120 case ARM::VLD2q8wb_register:
2121 case ARM::VLD2q16wb_register:
2122 case ARM::VLD2q32wb_register:
2123 case ARM::VLD2b8wb_fixed:
2124 case ARM::VLD2b16wb_fixed:
2125 case ARM::VLD2b32wb_fixed:
2126 case ARM::VLD2b8wb_register:
2127 case ARM::VLD2b16wb_register:
2128 case ARM::VLD2b32wb_register:
2131 case ARM::VLD3d8_UPD:
2132 case ARM::VLD3d16_UPD:
2133 case ARM::VLD3d32_UPD:
2134 case ARM::VLD3q8_UPD:
2135 case ARM::VLD3q16_UPD:
2136 case ARM::VLD3q32_UPD:
2137 case ARM::VLD4d8_UPD:
2138 case ARM::VLD4d16_UPD:
2139 case ARM::VLD4d32_UPD:
2140 case ARM::VLD4q8_UPD:
2141 case ARM::VLD4q16_UPD:
2142 case ARM::VLD4q32_UPD:
2169 case ARM::VLD1d8wb_fixed:
2170 case ARM::VLD1d16wb_fixed:
2171 case ARM::VLD1d32wb_fixed:
2172 case ARM::VLD1d64wb_fixed:
2173 case ARM::VLD1d8Twb_fixed:
2174 case ARM::VLD1d16Twb_fixed:
2175 case ARM::VLD1d32Twb_fixed:
2176 case ARM::VLD1d64Twb_fixed:
2177 case ARM::VLD1d8Qwb_fixed:
2178 case ARM::VLD1d16Qwb_fixed:
2179 case ARM::VLD1d32Qwb_fixed:
2180 case ARM::VLD1d64Qwb_fixed:
2181 case ARM::VLD1d8wb_register:
2182 case ARM::VLD1d16wb_register:
2183 case ARM::VLD1d32wb_register:
2184 case ARM::VLD1d64wb_register:
2185 case ARM::VLD1q8wb_fixed:
2186 case ARM::VLD1q16wb_fixed:
2187 case ARM::VLD1q32wb_fixed:
2188 case ARM::VLD1q64wb_fixed:
2189 case ARM::VLD1q8wb_register:
2190 case ARM::VLD1q16wb_register:
2191 case ARM::VLD1q32wb_register:
2192 case ARM::VLD1q64wb_register:
2196 if (Rm != 0xD && Rm != 0xF &&
2200 case ARM::VLD2d8wb_fixed:
2201 case ARM::VLD2d16wb_fixed:
2202 case ARM::VLD2d32wb_fixed:
2203 case ARM::VLD2b8wb_fixed:
2204 case ARM::VLD2b16wb_fixed:
2205 case ARM::VLD2b32wb_fixed:
2206 case ARM::VLD2q8wb_fixed:
2207 case ARM::VLD2q16wb_fixed:
2208 case ARM::VLD2q32wb_fixed:
2229 case ARM::VST1d8wb_fixed:
2230 case ARM::VST1d16wb_fixed:
2231 case ARM::VST1d32wb_fixed:
2232 case ARM::VST1d64wb_fixed:
2233 case ARM::VST1d8wb_register:
2234 case ARM::VST1d16wb_register:
2235 case ARM::VST1d32wb_register:
2236 case ARM::VST1d64wb_register:
2237 case ARM::VST1q8wb_fixed:
2238 case ARM::VST1q16wb_fixed:
2239 case ARM::VST1q32wb_fixed:
2240 case ARM::VST1q64wb_fixed:
2241 case ARM::VST1q8wb_register:
2242 case ARM::VST1q16wb_register:
2243 case ARM::VST1q32wb_register:
2244 case ARM::VST1q64wb_register:
2245 case ARM::VST1d8Twb_fixed:
2246 case ARM::VST1d16Twb_fixed:
2247 case ARM::VST1d32Twb_fixed:
2248 case ARM::VST1d64Twb_fixed:
2249 case ARM::VST1d8Twb_register:
2250 case ARM::VST1d16Twb_register:
2251 case ARM::VST1d32Twb_register:
2252 case ARM::VST1d64Twb_register:
2253 case ARM::VST1d8Qwb_fixed:
2254 case ARM::VST1d16Qwb_fixed:
2255 case ARM::VST1d32Qwb_fixed:
2256 case ARM::VST1d64Qwb_fixed:
2257 case ARM::VST1d8Qwb_register:
2258 case ARM::VST1d16Qwb_register:
2259 case ARM::VST1d32Qwb_register:
2260 case ARM::VST1d64Qwb_register:
2261 case ARM::VST2d8wb_fixed:
2262 case ARM::VST2d16wb_fixed:
2263 case ARM::VST2d32wb_fixed:
2264 case ARM::VST2d8wb_register:
2265 case ARM::VST2d16wb_register:
2266 case ARM::VST2d32wb_register:
2267 case ARM::VST2q8wb_fixed:
2268 case ARM::VST2q16wb_fixed:
2269 case ARM::VST2q32wb_fixed:
2270 case ARM::VST2q8wb_register:
2271 case ARM::VST2q16wb_register:
2272 case ARM::VST2q32wb_register:
2273 case ARM::VST2b8wb_fixed:
2274 case ARM::VST2b16wb_fixed:
2275 case ARM::VST2b32wb_fixed:
2276 case ARM::VST2b8wb_register:
2277 case ARM::VST2b16wb_register:
2278 case ARM::VST2b32wb_register:
2283 case ARM::VST3d8_UPD:
2284 case ARM::VST3d16_UPD:
2285 case ARM::VST3d32_UPD:
2286 case ARM::VST3q8_UPD:
2287 case ARM::VST3q16_UPD:
2288 case ARM::VST3q32_UPD:
2289 case ARM::VST4d8_UPD:
2290 case ARM::VST4d16_UPD:
2291 case ARM::VST4d32_UPD:
2292 case ARM::VST4q8_UPD:
2293 case ARM::VST4q16_UPD:
2294 case ARM::VST4q32_UPD:
2311 else if (Rm != 0xF) {
2316 case ARM::VST1d8wb_fixed:
2317 case ARM::VST1d16wb_fixed:
2318 case ARM::VST1d32wb_fixed:
2319 case ARM::VST1d64wb_fixed:
2320 case ARM::VST1q8wb_fixed:
2321 case ARM::VST1q16wb_fixed:
2322 case ARM::VST1q32wb_fixed:
2323 case ARM::VST1q64wb_fixed:
2324 case ARM::VST1d8Twb_fixed:
2325 case ARM::VST1d16Twb_fixed:
2326 case ARM::VST1d32Twb_fixed:
2327 case ARM::VST1d64Twb_fixed:
2328 case ARM::VST1d8Qwb_fixed:
2329 case ARM::VST1d16Qwb_fixed:
2330 case ARM::VST1d32Qwb_fixed:
2331 case ARM::VST1d64Qwb_fixed:
2332 case ARM::VST2d8wb_fixed:
2333 case ARM::VST2d16wb_fixed:
2334 case ARM::VST2d32wb_fixed:
2335 case ARM::VST2q8wb_fixed:
2336 case ARM::VST2q16wb_fixed:
2337 case ARM::VST2q32wb_fixed:
2338 case ARM::VST2b8wb_fixed:
2339 case ARM::VST2b16wb_fixed:
2340 case ARM::VST2b32wb_fixed:
2350 case ARM::VST1q16wb_fixed:
2351 case ARM::VST1q16wb_register:
2352 case ARM::VST1q32wb_fixed:
2353 case ARM::VST1q32wb_register:
2354 case ARM::VST1q64wb_fixed:
2355 case ARM::VST1q64wb_register:
2356 case ARM::VST1q8wb_fixed:
2357 case ARM::VST1q8wb_register:
2361 case ARM::VST2d16wb_fixed:
2362 case ARM::VST2d16wb_register:
2363 case ARM::VST2d32wb_fixed:
2364 case ARM::VST2d32wb_register:
2365 case ARM::VST2d8wb_fixed:
2366 case ARM::VST2d8wb_register:
2373 case ARM::VST2b16wb_fixed:
2374 case ARM::VST2b16wb_register:
2375 case ARM::VST2b32wb_fixed:
2376 case ARM::VST2b32wb_register:
2377 case ARM::VST2b8wb_fixed:
2378 case ARM::VST2b8wb_register:
2392 case ARM::VST3d8_UPD:
2393 case ARM::VST3d16_UPD:
2394 case ARM::VST3d32_UPD:
2398 case ARM::VST4d8_UPD:
2399 case ARM::VST4d16_UPD:
2400 case ARM::VST4d32_UPD:
2407 case ARM::VST3q8_UPD:
2408 case ARM::VST3q16_UPD:
2409 case ARM::VST3q32_UPD:
2413 case ARM::VST4q8_UPD:
2414 case ARM::VST4q16_UPD:
2415 case ARM::VST4q32_UPD:
2428 case ARM::VST3d8_UPD:
2429 case ARM::VST3d16_UPD:
2430 case ARM::VST3d32_UPD:
2434 case ARM::VST4d8_UPD:
2435 case ARM::VST4d16_UPD:
2436 case ARM::VST4d32_UPD:
2443 case ARM::VST3q8_UPD:
2444 case ARM::VST3q16_UPD:
2445 case ARM::VST3q32_UPD:
2449 case ARM::VST4q8_UPD:
2450 case ARM::VST4q16_UPD:
2451 case ARM::VST4q32_UPD:
2464 case ARM::VST4d8_UPD:
2465 case ARM::VST4d16_UPD:
2466 case ARM::VST4d32_UPD:
2473 case ARM::VST4q8_UPD:
2474 case ARM::VST4q16_UPD:
2475 case ARM::VST4q32_UPD:
2553 if (
size == 0 && align == 1)
2555 align *= (1 <<
size);
2558 case ARM::VLD1DUPq16:
case ARM::VLD1DUPq32:
case ARM::VLD1DUPq8:
2559 case ARM::VLD1DUPq16wb_fixed:
case ARM::VLD1DUPq16wb_register:
2560 case ARM::VLD1DUPq32wb_fixed:
case ARM::VLD1DUPq32wb_register:
2561 case ARM::VLD1DUPq8wb_fixed:
case ARM::VLD1DUPq8wb_register:
2582 if (Rm != 0xD && Rm != 0xF &&
2603 case ARM::VLD2DUPd16:
case ARM::VLD2DUPd32:
case ARM::VLD2DUPd8:
2604 case ARM::VLD2DUPd16wb_fixed:
case ARM::VLD2DUPd16wb_register:
2605 case ARM::VLD2DUPd32wb_fixed:
case ARM::VLD2DUPd32wb_register:
2606 case ARM::VLD2DUPd8wb_fixed:
case ARM::VLD2DUPd8wb_register:
2610 case ARM::VLD2DUPd16x2:
case ARM::VLD2DUPd32x2:
case ARM::VLD2DUPd8x2:
2611 case ARM::VLD2DUPd16x2wb_fixed:
case ARM::VLD2DUPd16x2wb_register:
2612 case ARM::VLD2DUPd32x2wb_fixed:
case ARM::VLD2DUPd32x2wb_register:
2613 case ARM::VLD2DUPd8x2wb_fixed:
case ARM::VLD2DUPd8x2wb_register:
2630 if (Rm != 0xD && Rm != 0xF) {
2666 else if (Rm != 0xF) {
2719 else if (Rm != 0xF) {
2752 case ARM::VORRiv4i16:
2753 case ARM::VORRiv2i32:
2754 case ARM::VBICiv4i16:
2755 case ARM::VBICiv2i32:
2759 case ARM::VORRiv8i16:
2760 case ARM::VORRiv4i32:
2761 case ARM::VBICiv8i16:
2762 case ARM::VBICiv4i32:
2787 if (cmode == 0xF && Inst.
getOpcode() == ARM::MVE_VMVNimmi32)
2942 true, 2, Inst, Decoder))
2951 true, 4, Inst, Decoder))
2960 true, 2, Inst, Decoder))
2999 unsigned imm = Val << 2;
3058 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3062 case ARM::t2LDRBpci:
3063 case ARM::t2LDRHpci:
3066 case ARM::t2LDRSBpci:
3069 case ARM::t2LDRSHpci:
3111 bool hasMP = featureBits[ARM::FeatureMP];
3112 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3167 if (!hasV7Ops || !hasMP)
3200 bool hasMP = featureBits[ARM::FeatureMP];
3201 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3211 case ARM::t2LDRSBi8:
3217 case ARM::t2LDRSHi8:
3234 case ARM::t2LDRSHi8:
3240 case ARM::t2LDRSBi8:
3256 if (!hasV7Ops || !hasMP)
3280 case ARM::t2STRBi12:
3281 case ARM::t2STRHi12:
3309 bool hasMP = featureBits[ARM::FeatureMP];
3310 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3317 case ARM::t2LDRHi12:
3320 case ARM::t2LDRSHi12:
3323 case ARM::t2LDRBi12:
3326 case ARM::t2LDRSBi12:
3343 case ARM::t2LDRSHi12:
3345 case ARM::t2LDRHi12:
3348 case ARM::t2LDRSBi12:
3363 case ARM::t2PLDWi12:
3364 if (!hasV7Ops || !hasMP)
3421 int imm = Val & 0xFF;
3423 if (!(Val & 0x100)) imm *= -1;
3435 int imm = Val & 0x7F;
3495 int imm = Val & 0xFF;
3498 else if (!(Val & 0x100))
3508 int imm = Val & 0x7F;
3511 else if (!(Val & 0x80))
3513 if (imm != INT32_MIN)
3514 imm *= (1U << shift);
3584template <
int shift,
int WriteBack>
3617 case ARM::t2LDR_PRE:
3618 case ARM::t2LDR_POST:
3621 case ARM::t2LDRB_PRE:
3622 case ARM::t2LDRB_POST:
3625 case ARM::t2LDRH_PRE:
3626 case ARM::t2LDRH_POST:
3629 case ARM::t2LDRSB_PRE:
3630 case ARM::t2LDRSB_POST:
3636 case ARM::t2LDRSH_PRE:
3637 case ARM::t2LDRSH_POST:
3691 }
else if (Inst.
getOpcode() == ARM::tADDspr) {
3761 if (imm != INT32_MIN)
3762 imm *= (1U << shift);
3778 unsigned S = (Val >> 23) & 1;
3779 unsigned J1 = (Val >> 22) & 1;
3780 unsigned J2 = (Val >> 21) & 1;
3781 unsigned I1 = !(J1 ^ S);
3782 unsigned I2 = !(J2 ^ S);
3783 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3787 (Address & ~2u) + imm32 + 4,
3788 true, 4, Inst, Decoder))
3796 if (Val == 0xA || Val == 0xB)
3843 if (pred == 0xE || pred == 0xF) {
3915 true, 2, Inst, Decoder))
3930 unsigned S = (Val >> 23) & 1;
3931 unsigned J1 = (Val >> 22) & 1;
3932 unsigned J2 = (Val >> 21) & 1;
3933 unsigned I1 = !(J1 ^ S);
3934 unsigned I2 = !(J2 ^ S);
3935 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3939 true, 4, Inst, Decoder))
3960 if (FeatureBits[ARM::FeatureMClass]) {
3961 unsigned ValLow = Val & 0xff;
3980 if (!(FeatureBits[ARM::HasV7Ops]))
3988 if (!(FeatureBits[ARM::HasV8MMainlineOps]))
3998 if (!(FeatureBits[ARM::Feature8MSecExt]))
4017 if (!(FeatureBits[ARM::FeaturePACBTI]))
4028 if (!(FeatureBits[ARM::HasV7Ops])) {
4041 if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4042 (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
4064 if (!ARMBankedReg::lookupBankedRegByEncoding((R << 5) | SysM))
4106 if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
4782 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4808 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4844 unsigned LowBit = mask & -mask;
4845 unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
4846 mask ^= BitsAboveLowBit;
4866 bool writeback = (W == 1) | (
P == 0);
4868 addr |= (U << 8) | (Rn << 9);
4870 if (writeback && (Rn == Rt || Rn == Rt2))
4903 bool writeback = (W == 1) | (
P == 0);
4905 addr |= (U << 8) | (Rn << 9);
4907 if (writeback && (Rn == Rt || Rn == Rt2))
4975 if (Rt == Rn || Rn == Rt2)
4994 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5007 if (!(imm & 0x38)) {
5053 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5066 if (!(imm & 0x38)) {
5125 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5127 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5129 if (!
Check(S, DestRegDecoder(Inst, Vn, Address, Decoder)))
5179 if ((cop & ~0x1) == 0xa)
5224 case ARM::VMSR_FPSCR_NZCVQC:
5235 if (featureBits[ARM::ModeThumb] && !featureBits[ARM::HasV8Ops]) {
5236 if (Rt == 13 || Rt == 15)
5245 case ARM::VMRS_FPSCR_NZCVQC:
5253 if (featureBits[ARM::ModeThumb]) {
5265template <
bool isSigned,
bool isNeg,
bool zeroPermitted,
int size>
5270 if (Val == 0 && !zeroPermitted)
5277 DecVal = (Val << 1);
5290 Val = LocImm + (2 << Val);
5316 case ARM::t2LEUpdate:
5323 Inst, Imm, Address, Decoder)))
5327 case ARM::MVE_WLSTP_8:
5328 case ARM::MVE_WLSTP_16:
5329 case ARM::MVE_WLSTP_32:
5330 case ARM::MVE_WLSTP_64:
5334 Address, Decoder)) ||
5336 Inst, Imm, Address, Decoder)))
5340 case ARM::MVE_DLSTP_8:
5341 case ARM::MVE_DLSTP_16:
5342 case ARM::MVE_DLSTP_32:
5343 case ARM::MVE_DLSTP_64:
5349 uint32_t CanonicalLCTP = 0xF00FE001, SBZMask = 0x00300FFE;
5350 if ((Insn & ~SBZMask) != CanonicalLCTP)
5352 if (Insn != CanonicalLCTP)
5384 if ((RegNo) + 1 > 11)
5430 }
else if (Inst.
getOpcode() == ARM::VSCCLRMD) {
5441 unsigned max_reg = Vd + regs;
5442 if (max_reg > 64 || (max_reg > 32 && (max_reg & 1)))
5444 unsigned max_sreg = std::min(32u, max_reg);
5445 unsigned max_dreg = std::min(32u, max_reg / 2);
5446 for (
unsigned i = Vd; i < max_sreg; ++i)
5449 for (
unsigned i = 16; i < max_dreg; ++i)
5468 unsigned CurBit = 0;
5469 for (
int i = 3; i >= 0; --i) {
5472 CurBit ^= (Val >> i) & 1U;
5475 Imm |= (CurBit << i);
5478 if ((Val & ~(~0U << i)) == 0) {
5524 switch (Val & 0x3) {
5585 unsigned DecodedVal = 64 - Val;
5588 case ARM::MVE_VCVTf16s16_fix:
5589 case ARM::MVE_VCVTs16f16_fix:
5590 case ARM::MVE_VCVTf16u16_fix:
5591 case ARM::MVE_VCVTu16f16_fix:
5592 if (DecodedVal > 16)
5595 case ARM::MVE_VCVTf32s32_fix:
5596 case ARM::MVE_VCVTs32f32_fix:
5597 case ARM::MVE_VCVTf32u32_fix:
5598 case ARM::MVE_VCVTu32f32_fix:
5599 if (DecodedVal > 32)
5611 case ARM::VSTR_P0_off:
5612 case ARM::VSTR_P0_pre:
5613 case ARM::VSTR_P0_post:
5614 case ARM::VLDR_P0_off:
5615 case ARM::VLDR_P0_pre:
5616 case ARM::VLDR_P0_post:
5618 case ARM::VSTR_FPSCR_NZCVQC_off:
5619 case ARM::VSTR_FPSCR_NZCVQC_pre:
5620 case ARM::VSTR_FPSCR_NZCVQC_post:
5621 case ARM::VLDR_FPSCR_NZCVQC_off:
5622 case ARM::VLDR_FPSCR_NZCVQC_pre:
5623 case ARM::VLDR_FPSCR_NZCVQC_post:
5630template <
bool Writeback>
5635 case ARM::VSTR_FPSCR_pre:
5636 case ARM::VSTR_FPSCR_NZCVQC_pre:
5637 case ARM::VLDR_FPSCR_pre:
5638 case ARM::VLDR_FPSCR_NZCVQC_pre:
5639 case ARM::VSTR_FPSCR_off:
5640 case ARM::VSTR_FPSCR_NZCVQC_off:
5641 case ARM::VLDR_FPSCR_off:
5642 case ARM::VLDR_FPSCR_NZCVQC_off:
5643 case ARM::VSTR_FPSCR_post:
5644 case ARM::VSTR_FPSCR_NZCVQC_post:
5645 case ARM::VLDR_FPSCR_post:
5646 case ARM::VLDR_FPSCR_NZCVQC_post:
5650 if (!featureBits[ARM::HasMVEIntegerOps] && !featureBits[ARM::FeatureVFP2])
5684 if (!
Check(S, RnDecoder(Inst, Rn, Address, Decoder)))
5688 if (!
Check(S, AddrDecoder(Inst, addr, Address, Decoder)))
5724template <
unsigned MinLog,
unsigned MaxLog>
5730 if (Val < MinLog || Val > MaxLog)
5737template <
unsigned start>
5816 case ARM::MVE_ASRLr:
5817 case ARM::MVE_SQRSHRL:
5820 case ARM::MVE_LSLLr:
5821 case ARM::MVE_UQRSHLL:
5868 if (Inst.
getOpcode() == ARM::MVE_SQRSHRL ||
5898template <
bool scalar, OperandDecoder predicate_decoder>
5926 if (!
Check(S, predicate_decoder(Inst, fc, Address, Decoder)))
5977 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm12 : ARM::t2ADDspImm12);
5980 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm : ARM::t2ADDspImm);
6010#include "ARMGenDisassemblerTables.inc"
6017 switch (
MI.getOpcode()) {
6029 case ARM::t2ADDri12:
6033 case ARM::t2SUBri12:
6036 if (
MI.getOperand(0).getReg() == ARM::SP &&
6037 MI.getOperand(1).getReg() != ARM::SP)
6040 default:
return Result;
6049 if (!STI.hasFeature(ARM::ModeThumb))
6064 if (Bytes.
size() < 2)
6068 Bytes.
data(), InstructionEndianness);
6069 return Insn16 < 0xE800 ? 2 : 4;
6073 ArrayRef<uint8_t> Bytes,
6075 raw_ostream &CS)
const {
6076 if (STI.hasFeature(ARM::ModeThumb))
6082 ArrayRef<uint8_t> Bytes,
6084 raw_ostream &CS)
const {
6085 CommentStream = &CS;
6087 assert(!STI.hasFeature(ARM::ModeThumb) &&
6088 "Asked to disassemble an ARM instruction but Subtarget is in Thumb "
6092 if (Bytes.
size() < 4) {
6099 InstructionEndianness);
6103 decodeInstruction(DecoderTableARM32,
MI, Insn,
Address,
this, STI);
6109 struct DecodeTable {
6114 const DecodeTable Tables[] = {
6115 {DecoderTableVFP32,
false}, {DecoderTableVFPV832,
false},
6116 {DecoderTableNEONData32,
true}, {DecoderTableNEONLoadStore32,
true},
6117 {DecoderTableNEONDup32,
true}, {DecoderTablev8NEON32,
false},
6118 {DecoderTablev8Crypto32,
false},
6121 for (
auto Table : Tables) {
6134 decodeInstruction(DecoderTableCoProc32,
MI, Insn,
Address,
this, STI);
6148void ARMDisassembler::AddThumb1SBit(MCInst &
MI,
bool InITBlock)
const {
6149 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6152 if (
I ==
MI.end())
break;
6153 if (MCID.
operands()[i].isOptionalDef() &&
6154 MCID.
operands()[i].RegClass == ARM::CCRRegClassID) {
6155 if (i > 0 && MCID.
operands()[i - 1].isPredicate())
6166bool ARMDisassembler::isVectorPredicable(
const MCInst &
MI)
const {
6167 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6180ARMDisassembler::AddThumbPredicate(MCInst &
MI)
const {
6183 const FeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
6187 switch (
MI.getOpcode()) {
6204 if (ITBlock.instrInITBlock())
6210 if (
MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
6219 if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
6236 if (ITBlock.instrInITBlock()) {
6237 CC = ITBlock.getITCC();
6238 ITBlock.advanceITState();
6239 }
else if (VPTBlock.instrInVPTBlock()) {
6240 VCC = VPTBlock.getVPTPred();
6241 VPTBlock.advanceVPTState();
6244 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6247 for (
unsigned i = 0; i < MCID.
NumOperands; ++i, ++CCI) {
6248 if (MCID.
operands()[i].isPredicate() || CCI ==
MI.end())
6265 for (VCCPos = 0; VCCPos < MCID.
NumOperands; ++VCCPos, ++VCCI) {
6283 "Inactive register in vpred_r is not tied to an output!");
6285 MI.insert(VCCI, MCOperand(
MI.getOperand(TiedOp)));
6299void ARMDisassembler::UpdateThumbVFPPredicate(
6302 CC = ITBlock.getITCC();
6305 if (ITBlock.instrInITBlock())
6306 ITBlock.advanceITState();
6307 else if (VPTBlock.instrInVPTBlock()) {
6308 CC = VPTBlock.getVPTPred();
6309 VPTBlock.advanceVPTState();
6312 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6316 for (
unsigned i = 0; i <
NumOps; ++i, ++
I) {
6317 if (OpInfo[i].isPredicate() ) {
6323 I->setReg(ARM::NoRegister);
6325 I->setReg(ARM::CPSR);
6332 ArrayRef<uint8_t> Bytes,
6334 raw_ostream &CS)
const {
6335 CommentStream = &CS;
6337 assert(STI.hasFeature(ARM::ModeThumb) &&
6338 "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
6341 if (Bytes.
size() < 2) {
6347 Bytes.
data(), InstructionEndianness);
6349 decodeInstruction(DecoderTableThumb16,
MI, Insn16,
Address,
this, STI);
6352 Check(Result, AddThumbPredicate(
MI));
6356 Result = decodeInstruction(DecoderTableThumbSBit16,
MI, Insn16,
Address,
this,
6360 bool InITBlock = ITBlock.instrInITBlock();
6361 Check(Result, AddThumbPredicate(
MI));
6362 AddThumb1SBit(
MI, InITBlock);
6367 decodeInstruction(DecoderTableThumb216,
MI, Insn16,
Address,
this, STI);
6373 if (
MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
6376 Check(Result, AddThumbPredicate(
MI));
6381 if (
MI.getOpcode() == ARM::t2IT) {
6382 unsigned Firstcond =
MI.getOperand(0).getImm();
6383 unsigned Mask =
MI.getOperand(1).getImm();
6384 ITBlock.setITState(Firstcond, Mask);
6388 CS <<
"unpredictable IT predicate sequence";
6395 if (Bytes.
size() < 4) {
6402 Bytes.
data() + 2, InstructionEndianness);
6405 decodeInstruction(DecoderTableMVE32,
MI, Insn32,
Address,
this, STI);
6411 if (
isVPTOpcode(
MI.getOpcode()) && VPTBlock.instrInVPTBlock())
6414 Check(Result, AddThumbPredicate(
MI));
6417 unsigned Mask =
MI.getOperand(0).getImm();
6418 VPTBlock.setVPTState(Mask);
6425 decodeInstruction(DecoderTableThumb32,
MI, Insn32,
Address,
this, STI);
6428 bool InITBlock = ITBlock.instrInITBlock();
6429 Check(Result, AddThumbPredicate(
MI));
6430 AddThumb1SBit(
MI, InITBlock);
6435 decodeInstruction(DecoderTableThumb232,
MI, Insn32,
Address,
this, STI);
6438 Check(Result, AddThumbPredicate(
MI));
6444 decodeInstruction(DecoderTableVFP32,
MI, Insn32,
Address,
this, STI);
6447 UpdateThumbVFPPredicate(Result,
MI);
6453 decodeInstruction(DecoderTableVFPV832,
MI, Insn32,
Address,
this, STI);
6460 Result = decodeInstruction(DecoderTableNEONDup32,
MI, Insn32,
Address,
this,
6464 Check(Result, AddThumbPredicate(
MI));
6470 uint32_t NEONLdStInsn = Insn32;
6471 NEONLdStInsn &= 0xF0FFFFFF;
6472 NEONLdStInsn |= 0x04000000;
6473 Result = decodeInstruction(DecoderTableNEONLoadStore32,
MI, NEONLdStInsn,
6477 Check(Result, AddThumbPredicate(
MI));
6483 uint32_t NEONDataInsn = Insn32;
6484 NEONDataInsn &= 0xF0FFFFFF;
6485 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4;
6486 NEONDataInsn |= 0x12000000;
6487 Result = decodeInstruction(DecoderTableNEONData32,
MI, NEONDataInsn,
6491 Check(Result, AddThumbPredicate(
MI));
6495 uint32_t NEONCryptoInsn = Insn32;
6496 NEONCryptoInsn &= 0xF0FFFFFF;
6497 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4;
6498 NEONCryptoInsn |= 0x12000000;
6499 Result = decodeInstruction(DecoderTablev8Crypto32,
MI, NEONCryptoInsn,
6506 uint32_t NEONv8Insn = Insn32;
6507 NEONv8Insn &= 0xF3FFFFFF;
6508 Result = decodeInstruction(DecoderTablev8NEON32,
MI, NEONv8Insn,
Address,
6518 ? DecoderTableThumb2CDE32
6519 : DecoderTableThumb2CoProc32;
6521 decodeInstruction(DecoderTable,
MI, Insn32,
Address,
this, STI);
6524 Check(Result, AddThumbPredicate(
MI));
6530 if (ITBlock.instrInITBlock())
6531 ITBlock.advanceITState();
6539 return new ARMDisassembler(STI, Ctx,
T.createMCInstrInfo());
MCDisassembler::DecodeStatus DecodeStatus
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Mark last scratch load
static bool isVectorPredicable(const MCInstrDesc &MCID)
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static const uint16_t GPRPairDecoderTable[]
static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2LoadT(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVPNOT(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVCMP(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg QQPRDecoderTable[]
static DecodeStatus DecodeT2LoadLabel(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEPairVectorIndexOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeTAddrModeImm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeBranchImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value, const MCDisassembler *Decoder)
tryAddingPcLoadReferenceComment - trys to add a comment as to what is being referenced by a load inst...
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARMDisassembler()
static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg DPairDecoderTable[]
static DecodeStatus DecodeTSBInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVE_MEM_1_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodePowerTwoOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2Imm7S4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeQADDInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg DPairSpacedDecoderTable[]
static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSETPANInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddSubSPImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static MCDisassembler * createARMDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
static DecodeStatus DecodeT2LoadImm12(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static unsigned FixedRegForVSTRVLDR_SYSREG(unsigned Opcode)
static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg QPRDecoderTable[]
static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg SPRDecoderTable[]
static DecodeStatus DecodeBFAfterTargetOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMQQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
DecodeStatus OperandDecoder(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode3Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVE_MEM_3_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2STRDPreInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static bool PermitsD32(const MCInst &Inst, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static const uint16_t CLRMGPRDecoderTable[]
static const MCPhysReg DPRDecoderTable[]
static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, uint32_t Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVpredROperand(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value, bool isBranch, uint64_t InstSize, MCInst &MI, const MCDisassembler *Decoder)
tryAddingSymbolicOperand - trys to add a symbolic operand in place of the immediate Value in the MCIn...
static DecodeStatus DecodeT2LoadImm8(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLDST3Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static const uint16_t GPRDecoderTable[]
static DecodeStatus DecodeMveAddrModeQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2Imm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVpredNOperand(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVE_MEM_2_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVCVTt1fp(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVCVTImmOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVMOVQtoDReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static const MCPhysReg QQQQPRDecoderTable[]
static DecodeStatus DecodeLongShiftOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMveAddrModeRQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEModImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeIT(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRspRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLDST4Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVE_MEM_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder, unsigned Rn, OperandDecoder RnDecoder, OperandDecoder AddrDecoder)
static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbTableBranch(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMveVCTP(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus checkDecodedInstruction(MCInst &MI, uint64_t &Size, uint64_t Address, raw_ostream &CS, uint32_t Insn, DecodeStatus Result)
static DecodeStatus DecodeVSTRVLDR_SYSREG(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodePredNoALOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVPTMaskOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2AddrModeImm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLDST2Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeTSTInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeBFLabelOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeHPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVMOVModImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeHINTInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVSCCLRM(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMVEVADCInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeRFEInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2BInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2Adr(MCInst &Inst, uint32_t Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodetGPREvenRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeBankedReg(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodetGPROddRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVLDST1Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSPR_8RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeLazyLoadStoreMul(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeForVMRSandVMSR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeInstSyncBarrierOption(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeLOLoop(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
#define LLVM_EXTERNAL_VISIBILITY
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static bool isSigned(unsigned int Opcode)
amode Optimize addressing mode
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static bool isBranch(unsigned Opcode)
const SmallVectorImpl< MachineOperand > & Cond
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Container class for subtarget features.
Context object for machine code objects.
Superclass for all disassemblers.
bool tryAddingSymbolicOperand(MCInst &Inst, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) const
const MCSubtargetInfo & getSubtargetInfo() const
void tryAddingPcLoadReferenceComment(int64_t Value, uint64_t Address) const
DecodeStatus
Ternary decode status.
Instances of this class represent a single low-level machine instruction.
unsigned getNumOperands() const
SmallVectorImpl< MCOperand >::iterator iterator
unsigned getOpcode() const
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
const MCOperand & getOperand(unsigned i) const
ArrayRef< MCOperandInfo > operands() const
unsigned short NumOperands
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specified operand constraint if it is present.
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution.
Interface to description of machine instruction set.
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
MCRegister getReg() const
Returns the register number.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const FeatureBitset & getFeatureBits() const
Wrapper class representing virtual and physical registers.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Target - Wrapper for Target specific information.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned getAM2Opc(AddrOpc Opc, unsigned Imm12, ShiftOpc SO, unsigned IdxMode=0)
unsigned getAM5Opc(AddrOpc Opc, unsigned char Offset)
getAM5Opc - This function encodes the addrmode5 opc field.
unsigned getAM5FP16Opc(AddrOpc Opc, unsigned char Offset)
getAM5FP16Opc - This function encodes the addrmode5fp16 opc field.
bool isVpred(OperandType op)
bool isCDECoproc(size_t Coproc, const MCSubtargetInfo &STI)
@ D16
Only 16 D registers.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
std::enable_if_t< std::is_integral_v< IntType >, IntType > fieldFromInstruction(const IntType &Insn, unsigned StartBit, unsigned NumBits)
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
This is an optimization pass for GlobalISel generic memory operations.
constexpr T rotr(T V, int R)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Target & getTheThumbBETarget()
static bool isVPTOpcode(int Opc)
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
static bool isValidCoprocessorNumber(unsigned Num, const FeatureBitset &featureBits)
isValidCoprocessorNumber - decide whether an explicit coprocessor number is legal in generic instruct...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr int32_t SignExtend32(uint32_t X)
Sign-extend the number in the bottom B bits of X to a 32-bit integer.
Target & getTheARMLETarget()
Target & getTheARMBETarget()
Target & getTheThumbLETarget()
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.