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;
122 mutable ITStatus ITBlock;
123 mutable VPTStatus VPTBlock;
128 InstructionEndianness = STI.
hasFeature(ARM::ModeBigEndianInstructions)
133 ~ARMDisassembler()
override =
default;
203 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
204 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
205 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
206 ARM::R12, ARM::SP, ARM::LR, ARM::PC
210 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
211 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
212 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
213 ARM::R12, 0, ARM::LR, ARM::APSR
319 ARM::R0_R1, ARM::R2_R3, ARM::R4_R5, ARM::R6_R7,
320 ARM::R8_R9, ARM::R10_R11, ARM::R12_SP
350 if ((RegNo & 1) || RegNo > 10)
405 if ((RegNo == 13 && !featureBits[ARM::HasV8Ops]) || RegNo == 15)
413 ARM::S0, ARM::S1, ARM::S2, ARM::S3,
414 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
415 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
416 ARM::S12, ARM::S13, ARM::S14, ARM::S15,
417 ARM::S16, ARM::S17, ARM::S18, ARM::S19,
418 ARM::S20, ARM::S21, ARM::S22, ARM::S23,
419 ARM::S24, ARM::S25, ARM::S26, ARM::S27,
420 ARM::S28, ARM::S29, ARM::S30, ARM::S31
441 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
442 ARM::D4, ARM::D5, ARM::D6, ARM::D7,
443 ARM::D8, ARM::D9, ARM::D10, ARM::D11,
444 ARM::D12, ARM::D13, ARM::D14, ARM::D15,
445 ARM::D16, ARM::D17, ARM::D18, ARM::D19,
446 ARM::D20, ARM::D21, ARM::D22, ARM::D23,
447 ARM::D24, ARM::D25, ARM::D26, ARM::D27,
448 ARM::D28, ARM::D29, ARM::D30, ARM::D31
457 return featureBits[ARM::FeatureD32];
463 if (RegNo > (
PermitsD32(Inst, Decoder) ? 31u : 15u))
496 ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
497 ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7,
498 ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
499 ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
505 if (RegNo > 31 || (RegNo & 1) != 0)
515 ARM::Q0, ARM::D1_D2, ARM::Q1, ARM::D3_D4, ARM::Q2, ARM::D5_D6,
516 ARM::Q3, ARM::D7_D8, ARM::Q4, ARM::D9_D10, ARM::Q5, ARM::D11_D12,
517 ARM::Q6, ARM::D13_D14, ARM::Q7, ARM::D15_D16, ARM::Q8, ARM::D17_D18,
518 ARM::Q9, ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
519 ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
535 ARM::D0_D2, ARM::D1_D3, ARM::D2_D4, ARM::D3_D5,
536 ARM::D4_D6, ARM::D5_D7, ARM::D6_D8, ARM::D7_D9,
537 ARM::D8_D10, ARM::D9_D11, ARM::D10_D12, ARM::D11_D13,
538 ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
539 ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
540 ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
541 ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
542 ARM::D28_D30, ARM::D29_D31
568 ARM::Q0_Q1, ARM::Q1_Q2, ARM::Q2_Q3, ARM::Q3_Q4,
569 ARM::Q4_Q5, ARM::Q5_Q6, ARM::Q6_Q7
584 ARM::Q0_Q1_Q2_Q3, ARM::Q1_Q2_Q3_Q4, ARM::Q2_Q3_Q4_Q5,
585 ARM::Q3_Q4_Q5_Q6, ARM::Q4_Q5_Q6_Q7
607 if (Inst.
getOpcode() == ARM::tBcc && Val == 0xE)
610 static_cast<const ARMDisassembler *
>(Decoder)->MCII.
get();
628 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
630 if (
D->getSubtargetInfo().hasFeature(ARM::ModeThumb))
631 CC =
D->ITBlock.getITCC();
652 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
654 MCRegister CCR =
D->ITBlock.instrInITBlock() ? ARM::NoRegister : ARM::CPSR;
661 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
662 unsigned VCC =
D->VPTBlock.getVPTPred();
674 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
675 unsigned VCC =
D->VPTBlock.getVPTPred();
688 "Inactive register in vpred_r is not tied to an output!");
728 unsigned Op = Shift | (imm << 3);
775 bool NeedDisjointWriteback =
false;
785 case ARM::t2LDMIA_UPD:
786 case ARM::t2LDMDB_UPD:
787 case ARM::t2STMIA_UPD:
788 case ARM::t2STMDB_UPD:
789 NeedDisjointWriteback =
true;
799 for (
unsigned i = 0; i < 16; ++i) {
800 if (Val & (1 << i)) {
809 if (NeedDisjointWriteback && WritebackReg == Inst.
end()[-1].getReg())
827 if (regs == 0 || (Vd + regs) > 32) {
828 regs = Vd + regs > 32 ? 32 - Vd : regs;
829 regs = std::max( 1u, regs);
835 for (
unsigned i = 0; i < (regs - 1); ++i) {
852 unsigned MaxReg =
PermitsD32(Inst, Decoder) ? 32 : 16;
853 if (regs == 0 || (Vd + regs) > MaxReg) {
854 regs = Vd + regs > MaxReg ? MaxReg - Vd : regs;
855 regs = std::max( 1u, regs);
856 regs = std::min(MaxReg, regs);
862 for (
unsigned i = 0; i < (regs - 1); ++i) {
891 if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
892 uint32_t lsb_mask = (1U << lsb) - 1;
913 case ARM::LDC_OFFSET:
916 case ARM::LDC_OPTION:
917 case ARM::LDCL_OFFSET:
920 case ARM::LDCL_OPTION:
921 case ARM::STC_OFFSET:
924 case ARM::STC_OPTION:
925 case ARM::STCL_OFFSET:
928 case ARM::STCL_OPTION:
929 case ARM::t2LDC_OFFSET:
931 case ARM::t2LDC_POST:
932 case ARM::t2LDC_OPTION:
933 case ARM::t2LDCL_OFFSET:
934 case ARM::t2LDCL_PRE:
935 case ARM::t2LDCL_POST:
936 case ARM::t2LDCL_OPTION:
937 case ARM::t2STC_OFFSET:
939 case ARM::t2STC_POST:
940 case ARM::t2STC_OPTION:
941 case ARM::t2STCL_OFFSET:
942 case ARM::t2STCL_PRE:
943 case ARM::t2STCL_POST:
944 case ARM::t2STCL_OPTION:
945 case ARM::t2LDC2_OFFSET:
946 case ARM::t2LDC2L_OFFSET:
947 case ARM::t2LDC2_PRE:
948 case ARM::t2LDC2L_PRE:
949 case ARM::t2STC2_OFFSET:
950 case ARM::t2STC2L_OFFSET:
951 case ARM::t2STC2_PRE:
952 case ARM::t2STC2L_PRE:
953 case ARM::LDC2_OFFSET:
954 case ARM::LDC2L_OFFSET:
957 case ARM::STC2_OFFSET:
958 case ARM::STC2L_OFFSET:
961 case ARM::t2LDC2_OPTION:
962 case ARM::t2STC2_OPTION:
963 case ARM::t2LDC2_POST:
964 case ARM::t2LDC2L_POST:
965 case ARM::t2STC2_POST:
966 case ARM::t2STC2L_POST:
968 case ARM::LDC2L_POST:
970 case ARM::STC2L_POST:
971 if (coproc == 0xA || coproc == 0xB ||
972 (featureBits[ARM::HasV8_1MMainlineOps] &&
973 (coproc == 0x8 || coproc == 0x9 || coproc == 0xA || coproc == 0xB ||
974 coproc == 0xE || coproc == 0xF)))
981 if (featureBits[ARM::HasV8Ops] && (coproc != 14))
990 case ARM::t2LDC2_OFFSET:
991 case ARM::t2LDC2L_OFFSET:
992 case ARM::t2LDC2_PRE:
993 case ARM::t2LDC2L_PRE:
994 case ARM::t2STC2_OFFSET:
995 case ARM::t2STC2L_OFFSET:
996 case ARM::t2STC2_PRE:
997 case ARM::t2STC2L_PRE:
998 case ARM::LDC2_OFFSET:
999 case ARM::LDC2L_OFFSET:
1001 case ARM::LDC2L_PRE:
1002 case ARM::STC2_OFFSET:
1003 case ARM::STC2L_OFFSET:
1005 case ARM::STC2L_PRE:
1006 case ARM::t2LDC_OFFSET:
1007 case ARM::t2LDCL_OFFSET:
1008 case ARM::t2LDC_PRE:
1009 case ARM::t2LDCL_PRE:
1010 case ARM::t2STC_OFFSET:
1011 case ARM::t2STCL_OFFSET:
1012 case ARM::t2STC_PRE:
1013 case ARM::t2STCL_PRE:
1014 case ARM::LDC_OFFSET:
1015 case ARM::LDCL_OFFSET:
1018 case ARM::STC_OFFSET:
1019 case ARM::STCL_OFFSET:
1025 case ARM::t2LDC2_POST:
1026 case ARM::t2LDC2L_POST:
1027 case ARM::t2STC2_POST:
1028 case ARM::t2STC2L_POST:
1029 case ARM::LDC2_POST:
1030 case ARM::LDC2L_POST:
1031 case ARM::STC2_POST:
1032 case ARM::STC2L_POST:
1033 case ARM::t2LDC_POST:
1034 case ARM::t2LDCL_POST:
1035 case ARM::t2STC_POST:
1036 case ARM::t2STCL_POST:
1038 case ARM::LDCL_POST:
1040 case ARM::STCL_POST:
1051 case ARM::LDC_OFFSET:
1054 case ARM::LDC_OPTION:
1055 case ARM::LDCL_OFFSET:
1057 case ARM::LDCL_POST:
1058 case ARM::LDCL_OPTION:
1059 case ARM::STC_OFFSET:
1062 case ARM::STC_OPTION:
1063 case ARM::STCL_OFFSET:
1065 case ARM::STCL_POST:
1066 case ARM::STCL_OPTION:
1070 case ARM::t2LDC2L_OFFSET:
1071 case ARM::t2LDC2L_OPTION:
1072 case ARM::t2LDC2L_POST:
1073 case ARM::t2LDC2L_PRE:
1074 case ARM::t2LDC2_OFFSET:
1075 case ARM::t2LDC2_OPTION:
1076 case ARM::t2LDC2_POST:
1077 case ARM::t2LDC2_PRE:
1078 case ARM::t2LDCL_OFFSET:
1079 case ARM::t2LDCL_OPTION:
1080 case ARM::t2LDCL_POST:
1081 case ARM::t2LDCL_PRE:
1082 case ARM::t2LDC_OFFSET:
1083 case ARM::t2LDC_OPTION:
1084 case ARM::t2LDC_POST:
1085 case ARM::t2LDC_PRE:
1086 case ARM::t2STC2L_OFFSET:
1087 case ARM::t2STC2L_OPTION:
1088 case ARM::t2STC2L_POST:
1089 case ARM::t2STC2L_PRE:
1090 case ARM::t2STC2_OFFSET:
1091 case ARM::t2STC2_OPTION:
1092 case ARM::t2STC2_POST:
1093 case ARM::t2STC2_PRE:
1094 case ARM::t2STCL_OFFSET:
1095 case ARM::t2STCL_OPTION:
1096 case ARM::t2STCL_POST:
1097 case ARM::t2STCL_PRE:
1098 case ARM::t2STC_OFFSET:
1099 case ARM::t2STC_OPTION:
1100 case ARM::t2STC_POST:
1101 case ARM::t2STC_PRE:
1127 case ARM::STR_POST_IMM:
1128 case ARM::STR_POST_REG:
1129 case ARM::STRB_POST_IMM:
1130 case ARM::STRB_POST_REG:
1131 case ARM::STRT_POST_REG:
1132 case ARM::STRT_POST_IMM:
1133 case ARM::STRBT_POST_REG:
1134 case ARM::STRBT_POST_IMM:
1147 case ARM::LDR_POST_IMM:
1148 case ARM::LDR_POST_REG:
1149 case ARM::LDRB_POST_IMM:
1150 case ARM::LDRB_POST_REG:
1151 case ARM::LDRBT_POST_REG:
1152 case ARM::LDRBT_POST_IMM:
1153 case ARM::LDRT_POST_REG:
1154 case ARM::LDRT_POST_IMM:
1169 bool writeback = (
P == 0) || (W == 1);
1170 unsigned idx_mode = 0;
1173 else if (!
P && writeback)
1176 if (writeback && (Rn == 15 || Rn == Rt))
1290 unsigned Rt2 = Rt + 1;
1292 bool writeback = (W == 1) | (
P == 0);
1298 case ARM::STRD_POST:
1301 case ARM::LDRD_POST:
1310 case ARM::STRD_POST:
1311 if (
P == 0 && W == 1)
1314 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1316 if (type && Rm == 15)
1325 case ARM::STRH_POST:
1328 if (writeback && (Rn == 15 || Rn == Rt))
1330 if (!type && Rm == 15)
1335 case ARM::LDRD_POST:
1336 if (type && Rn == 15) {
1341 if (
P == 0 && W == 1)
1343 if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1345 if (!type && writeback && Rn == 15)
1347 if (writeback && (Rn == Rt || Rn == Rt2))
1352 case ARM::LDRH_POST:
1353 if (type && Rn == 15) {
1360 if (!type && Rm == 15)
1362 if (!type && writeback && (Rn == 15 || Rn == Rt))
1366 case ARM::LDRSH_PRE:
1367 case ARM::LDRSH_POST:
1369 case ARM::LDRSB_PRE:
1370 case ARM::LDRSB_POST:
1371 if (type && Rn == 15) {
1376 if (type && (Rt == 15 || (writeback && Rn == Rt)))
1378 if (!type && (Rt == 15 || Rm == 15))
1380 if (!type && writeback && (Rn == 15 || Rn == Rt))
1397 case ARM::STRD_POST:
1400 case ARM::STRH_POST:
1414 case ARM::STRD_POST:
1417 case ARM::LDRD_POST:
1430 case ARM::LDRD_POST:
1433 case ARM::LDRH_POST:
1435 case ARM::LDRSH_PRE:
1436 case ARM::LDRSH_POST:
1438 case ARM::LDRSB_PRE:
1439 case ARM::LDRSB_POST:
1509 }
else if (imod && !M) {
1514 }
else if (!imod && M) {
1568 case ARM::LDMDA_UPD:
1574 case ARM::LDMDB_UPD:
1580 case ARM::LDMIA_UPD:
1586 case ARM::LDMIB_UPD:
1592 case ARM::STMDA_UPD:
1598 case ARM::STMDB_UPD:
1604 case ARM::STMIA_UPD:
1610 case ARM::STMIB_UPD:
1662 if (imm8 == 0x10 && pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
1690 }
else if (imod && !M) {
1695 }
else if (!imod && M) {
1717 unsigned Opcode = ARM::t2HINT;
1720 Opcode = ARM::t2PACBTI;
1721 }
else if (imm == 0x1D) {
1722 Opcode = ARM::t2PAC;
1723 }
else if (imm == 0x2D) {
1724 Opcode = ARM::t2AUT;
1725 }
else if (imm == 0x0F) {
1726 Opcode = ARM::t2BTI;
1730 if (Opcode == ARM::t2HINT) {
1831 if (!FeatureBits[ARM::HasV8_1aOps] ||
1832 !FeatureBits[ARM::HasV8Ops])
1884 if (!add) imm *= -1;
1885 if (imm == 0 && !add) imm = INT32_MIN;
1955 unsigned I1 = !(J1 ^ S);
1956 unsigned I2 = !(J2 ^ S);
1959 unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
1962 true, 4, Inst, Decoder))
1981 true, 4, Inst, Decoder))
1987 true, 4, Inst, Decoder))
2031 case ARM::VLD1q16:
case ARM::VLD1q32:
case ARM::VLD1q64:
case ARM::VLD1q8:
2032 case ARM::VLD1q16wb_fixed:
case ARM::VLD1q16wb_register:
2033 case ARM::VLD1q32wb_fixed:
case ARM::VLD1q32wb_register:
2034 case ARM::VLD1q64wb_fixed:
case ARM::VLD1q64wb_register:
2035 case ARM::VLD1q8wb_fixed:
case ARM::VLD1q8wb_register:
2036 case ARM::VLD2d16:
case ARM::VLD2d32:
case ARM::VLD2d8:
2037 case ARM::VLD2d16wb_fixed:
case ARM::VLD2d16wb_register:
2038 case ARM::VLD2d32wb_fixed:
case ARM::VLD2d32wb_register:
2039 case ARM::VLD2d8wb_fixed:
case ARM::VLD2d8wb_register:
2046 case ARM::VLD2b16wb_fixed:
2047 case ARM::VLD2b16wb_register:
2048 case ARM::VLD2b32wb_fixed:
2049 case ARM::VLD2b32wb_register:
2050 case ARM::VLD2b8wb_fixed:
2051 case ARM::VLD2b8wb_register:
2065 case ARM::VLD3d8_UPD:
2066 case ARM::VLD3d16_UPD:
2067 case ARM::VLD3d32_UPD:
2071 case ARM::VLD4d8_UPD:
2072 case ARM::VLD4d16_UPD:
2073 case ARM::VLD4d32_UPD:
2080 case ARM::VLD3q8_UPD:
2081 case ARM::VLD3q16_UPD:
2082 case ARM::VLD3q32_UPD:
2086 case ARM::VLD4q8_UPD:
2087 case ARM::VLD4q16_UPD:
2088 case ARM::VLD4q32_UPD:
2101 case ARM::VLD3d8_UPD:
2102 case ARM::VLD3d16_UPD:
2103 case ARM::VLD3d32_UPD:
2107 case ARM::VLD4d8_UPD:
2108 case ARM::VLD4d16_UPD:
2109 case ARM::VLD4d32_UPD:
2116 case ARM::VLD3q8_UPD:
2117 case ARM::VLD3q16_UPD:
2118 case ARM::VLD3q32_UPD:
2122 case ARM::VLD4q8_UPD:
2123 case ARM::VLD4q16_UPD:
2124 case ARM::VLD4q32_UPD:
2137 case ARM::VLD4d8_UPD:
2138 case ARM::VLD4d16_UPD:
2139 case ARM::VLD4d32_UPD:
2146 case ARM::VLD4q8_UPD:
2147 case ARM::VLD4q16_UPD:
2148 case ARM::VLD4q32_UPD:
2158 case ARM::VLD1d8wb_fixed:
2159 case ARM::VLD1d16wb_fixed:
2160 case ARM::VLD1d32wb_fixed:
2161 case ARM::VLD1d64wb_fixed:
2162 case ARM::VLD1d8wb_register:
2163 case ARM::VLD1d16wb_register:
2164 case ARM::VLD1d32wb_register:
2165 case ARM::VLD1d64wb_register:
2166 case ARM::VLD1q8wb_fixed:
2167 case ARM::VLD1q16wb_fixed:
2168 case ARM::VLD1q32wb_fixed:
2169 case ARM::VLD1q64wb_fixed:
2170 case ARM::VLD1q8wb_register:
2171 case ARM::VLD1q16wb_register:
2172 case ARM::VLD1q32wb_register:
2173 case ARM::VLD1q64wb_register:
2174 case ARM::VLD1d8Twb_fixed:
2175 case ARM::VLD1d8Twb_register:
2176 case ARM::VLD1d16Twb_fixed:
2177 case ARM::VLD1d16Twb_register:
2178 case ARM::VLD1d32Twb_fixed:
2179 case ARM::VLD1d32Twb_register:
2180 case ARM::VLD1d64Twb_fixed:
2181 case ARM::VLD1d64Twb_register:
2182 case ARM::VLD1d8Qwb_fixed:
2183 case ARM::VLD1d8Qwb_register:
2184 case ARM::VLD1d16Qwb_fixed:
2185 case ARM::VLD1d16Qwb_register:
2186 case ARM::VLD1d32Qwb_fixed:
2187 case ARM::VLD1d32Qwb_register:
2188 case ARM::VLD1d64Qwb_fixed:
2189 case ARM::VLD1d64Qwb_register:
2190 case ARM::VLD2d8wb_fixed:
2191 case ARM::VLD2d16wb_fixed:
2192 case ARM::VLD2d32wb_fixed:
2193 case ARM::VLD2q8wb_fixed:
2194 case ARM::VLD2q16wb_fixed:
2195 case ARM::VLD2q32wb_fixed:
2196 case ARM::VLD2d8wb_register:
2197 case ARM::VLD2d16wb_register:
2198 case ARM::VLD2d32wb_register:
2199 case ARM::VLD2q8wb_register:
2200 case ARM::VLD2q16wb_register:
2201 case ARM::VLD2q32wb_register:
2202 case ARM::VLD2b8wb_fixed:
2203 case ARM::VLD2b16wb_fixed:
2204 case ARM::VLD2b32wb_fixed:
2205 case ARM::VLD2b8wb_register:
2206 case ARM::VLD2b16wb_register:
2207 case ARM::VLD2b32wb_register:
2210 case ARM::VLD3d8_UPD:
2211 case ARM::VLD3d16_UPD:
2212 case ARM::VLD3d32_UPD:
2213 case ARM::VLD3q8_UPD:
2214 case ARM::VLD3q16_UPD:
2215 case ARM::VLD3q32_UPD:
2216 case ARM::VLD4d8_UPD:
2217 case ARM::VLD4d16_UPD:
2218 case ARM::VLD4d32_UPD:
2219 case ARM::VLD4q8_UPD:
2220 case ARM::VLD4q16_UPD:
2221 case ARM::VLD4q32_UPD:
2248 case ARM::VLD1d8wb_fixed:
2249 case ARM::VLD1d16wb_fixed:
2250 case ARM::VLD1d32wb_fixed:
2251 case ARM::VLD1d64wb_fixed:
2252 case ARM::VLD1d8Twb_fixed:
2253 case ARM::VLD1d16Twb_fixed:
2254 case ARM::VLD1d32Twb_fixed:
2255 case ARM::VLD1d64Twb_fixed:
2256 case ARM::VLD1d8Qwb_fixed:
2257 case ARM::VLD1d16Qwb_fixed:
2258 case ARM::VLD1d32Qwb_fixed:
2259 case ARM::VLD1d64Qwb_fixed:
2260 case ARM::VLD1d8wb_register:
2261 case ARM::VLD1d16wb_register:
2262 case ARM::VLD1d32wb_register:
2263 case ARM::VLD1d64wb_register:
2264 case ARM::VLD1q8wb_fixed:
2265 case ARM::VLD1q16wb_fixed:
2266 case ARM::VLD1q32wb_fixed:
2267 case ARM::VLD1q64wb_fixed:
2268 case ARM::VLD1q8wb_register:
2269 case ARM::VLD1q16wb_register:
2270 case ARM::VLD1q32wb_register:
2271 case ARM::VLD1q64wb_register:
2275 if (Rm != 0xD && Rm != 0xF &&
2279 case ARM::VLD2d8wb_fixed:
2280 case ARM::VLD2d16wb_fixed:
2281 case ARM::VLD2d32wb_fixed:
2282 case ARM::VLD2b8wb_fixed:
2283 case ARM::VLD2b16wb_fixed:
2284 case ARM::VLD2b32wb_fixed:
2285 case ARM::VLD2q8wb_fixed:
2286 case ARM::VLD2q16wb_fixed:
2287 case ARM::VLD2q32wb_fixed:
2309 case ARM::VST1d8wb_fixed:
2310 case ARM::VST1d16wb_fixed:
2311 case ARM::VST1d32wb_fixed:
2312 case ARM::VST1d64wb_fixed:
2313 case ARM::VST1d8wb_register:
2314 case ARM::VST1d16wb_register:
2315 case ARM::VST1d32wb_register:
2316 case ARM::VST1d64wb_register:
2317 case ARM::VST1q8wb_fixed:
2318 case ARM::VST1q16wb_fixed:
2319 case ARM::VST1q32wb_fixed:
2320 case ARM::VST1q64wb_fixed:
2321 case ARM::VST1q8wb_register:
2322 case ARM::VST1q16wb_register:
2323 case ARM::VST1q32wb_register:
2324 case ARM::VST1q64wb_register:
2325 case ARM::VST1d8Twb_fixed:
2326 case ARM::VST1d16Twb_fixed:
2327 case ARM::VST1d32Twb_fixed:
2328 case ARM::VST1d64Twb_fixed:
2329 case ARM::VST1d8Twb_register:
2330 case ARM::VST1d16Twb_register:
2331 case ARM::VST1d32Twb_register:
2332 case ARM::VST1d64Twb_register:
2333 case ARM::VST1d8Qwb_fixed:
2334 case ARM::VST1d16Qwb_fixed:
2335 case ARM::VST1d32Qwb_fixed:
2336 case ARM::VST1d64Qwb_fixed:
2337 case ARM::VST1d8Qwb_register:
2338 case ARM::VST1d16Qwb_register:
2339 case ARM::VST1d32Qwb_register:
2340 case ARM::VST1d64Qwb_register:
2341 case ARM::VST2d8wb_fixed:
2342 case ARM::VST2d16wb_fixed:
2343 case ARM::VST2d32wb_fixed:
2344 case ARM::VST2d8wb_register:
2345 case ARM::VST2d16wb_register:
2346 case ARM::VST2d32wb_register:
2347 case ARM::VST2q8wb_fixed:
2348 case ARM::VST2q16wb_fixed:
2349 case ARM::VST2q32wb_fixed:
2350 case ARM::VST2q8wb_register:
2351 case ARM::VST2q16wb_register:
2352 case ARM::VST2q32wb_register:
2353 case ARM::VST2b8wb_fixed:
2354 case ARM::VST2b16wb_fixed:
2355 case ARM::VST2b32wb_fixed:
2356 case ARM::VST2b8wb_register:
2357 case ARM::VST2b16wb_register:
2358 case ARM::VST2b32wb_register:
2363 case ARM::VST3d8_UPD:
2364 case ARM::VST3d16_UPD:
2365 case ARM::VST3d32_UPD:
2366 case ARM::VST3q8_UPD:
2367 case ARM::VST3q16_UPD:
2368 case ARM::VST3q32_UPD:
2369 case ARM::VST4d8_UPD:
2370 case ARM::VST4d16_UPD:
2371 case ARM::VST4d32_UPD:
2372 case ARM::VST4q8_UPD:
2373 case ARM::VST4q16_UPD:
2374 case ARM::VST4q32_UPD:
2391 else if (Rm != 0xF) {
2396 case ARM::VST1d8wb_fixed:
2397 case ARM::VST1d16wb_fixed:
2398 case ARM::VST1d32wb_fixed:
2399 case ARM::VST1d64wb_fixed:
2400 case ARM::VST1q8wb_fixed:
2401 case ARM::VST1q16wb_fixed:
2402 case ARM::VST1q32wb_fixed:
2403 case ARM::VST1q64wb_fixed:
2404 case ARM::VST1d8Twb_fixed:
2405 case ARM::VST1d16Twb_fixed:
2406 case ARM::VST1d32Twb_fixed:
2407 case ARM::VST1d64Twb_fixed:
2408 case ARM::VST1d8Qwb_fixed:
2409 case ARM::VST1d16Qwb_fixed:
2410 case ARM::VST1d32Qwb_fixed:
2411 case ARM::VST1d64Qwb_fixed:
2412 case ARM::VST2d8wb_fixed:
2413 case ARM::VST2d16wb_fixed:
2414 case ARM::VST2d32wb_fixed:
2415 case ARM::VST2q8wb_fixed:
2416 case ARM::VST2q16wb_fixed:
2417 case ARM::VST2q32wb_fixed:
2418 case ARM::VST2b8wb_fixed:
2419 case ARM::VST2b16wb_fixed:
2420 case ARM::VST2b32wb_fixed:
2430 case ARM::VST1q16wb_fixed:
2431 case ARM::VST1q16wb_register:
2432 case ARM::VST1q32wb_fixed:
2433 case ARM::VST1q32wb_register:
2434 case ARM::VST1q64wb_fixed:
2435 case ARM::VST1q64wb_register:
2436 case ARM::VST1q8wb_fixed:
2437 case ARM::VST1q8wb_register:
2441 case ARM::VST2d16wb_fixed:
2442 case ARM::VST2d16wb_register:
2443 case ARM::VST2d32wb_fixed:
2444 case ARM::VST2d32wb_register:
2445 case ARM::VST2d8wb_fixed:
2446 case ARM::VST2d8wb_register:
2453 case ARM::VST2b16wb_fixed:
2454 case ARM::VST2b16wb_register:
2455 case ARM::VST2b32wb_fixed:
2456 case ARM::VST2b32wb_register:
2457 case ARM::VST2b8wb_fixed:
2458 case ARM::VST2b8wb_register:
2472 case ARM::VST3d8_UPD:
2473 case ARM::VST3d16_UPD:
2474 case ARM::VST3d32_UPD:
2478 case ARM::VST4d8_UPD:
2479 case ARM::VST4d16_UPD:
2480 case ARM::VST4d32_UPD:
2487 case ARM::VST3q8_UPD:
2488 case ARM::VST3q16_UPD:
2489 case ARM::VST3q32_UPD:
2493 case ARM::VST4q8_UPD:
2494 case ARM::VST4q16_UPD:
2495 case ARM::VST4q32_UPD:
2508 case ARM::VST3d8_UPD:
2509 case ARM::VST3d16_UPD:
2510 case ARM::VST3d32_UPD:
2514 case ARM::VST4d8_UPD:
2515 case ARM::VST4d16_UPD:
2516 case ARM::VST4d32_UPD:
2523 case ARM::VST3q8_UPD:
2524 case ARM::VST3q16_UPD:
2525 case ARM::VST3q32_UPD:
2529 case ARM::VST4q8_UPD:
2530 case ARM::VST4q16_UPD:
2531 case ARM::VST4q32_UPD:
2544 case ARM::VST4d8_UPD:
2545 case ARM::VST4d16_UPD:
2546 case ARM::VST4d32_UPD:
2553 case ARM::VST4q8_UPD:
2554 case ARM::VST4q16_UPD:
2555 case ARM::VST4q32_UPD:
2634 if (
size == 0 && align == 1)
2636 align *= (1 <<
size);
2639 case ARM::VLD1DUPq16:
case ARM::VLD1DUPq32:
case ARM::VLD1DUPq8:
2640 case ARM::VLD1DUPq16wb_fixed:
case ARM::VLD1DUPq16wb_register:
2641 case ARM::VLD1DUPq32wb_fixed:
case ARM::VLD1DUPq32wb_register:
2642 case ARM::VLD1DUPq8wb_fixed:
case ARM::VLD1DUPq8wb_register:
2663 if (Rm != 0xD && Rm != 0xF &&
2685 case ARM::VLD2DUPd16:
case ARM::VLD2DUPd32:
case ARM::VLD2DUPd8:
2686 case ARM::VLD2DUPd16wb_fixed:
case ARM::VLD2DUPd16wb_register:
2687 case ARM::VLD2DUPd32wb_fixed:
case ARM::VLD2DUPd32wb_register:
2688 case ARM::VLD2DUPd8wb_fixed:
case ARM::VLD2DUPd8wb_register:
2692 case ARM::VLD2DUPd16x2:
case ARM::VLD2DUPd32x2:
case ARM::VLD2DUPd8x2:
2693 case ARM::VLD2DUPd16x2wb_fixed:
case ARM::VLD2DUPd16x2wb_register:
2694 case ARM::VLD2DUPd32x2wb_fixed:
case ARM::VLD2DUPd32x2wb_register:
2695 case ARM::VLD2DUPd8x2wb_fixed:
case ARM::VLD2DUPd8x2wb_register:
2712 if (Rm != 0xD && Rm != 0xF) {
2749 else if (Rm != 0xF) {
2803 else if (Rm != 0xF) {
2837 case ARM::VORRiv4i16:
2838 case ARM::VORRiv2i32:
2839 case ARM::VBICiv4i16:
2840 case ARM::VBICiv2i32:
2844 case ARM::VORRiv8i16:
2845 case ARM::VORRiv4i32:
2846 case ARM::VBICiv8i16:
2847 case ARM::VBICiv4i32:
2873 if (cmode == 0xF && Inst.
getOpcode() == ARM::MVE_VMVNimmi32)
3028 true, 2, Inst, Decoder))
3037 true, 4, Inst, Decoder))
3046 true, 2, Inst, Decoder))
3085 unsigned imm = Val << 2;
3144 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3148 case ARM::t2LDRBpci:
3149 case ARM::t2LDRHpci:
3152 case ARM::t2LDRSBpci:
3155 case ARM::t2LDRSHpci:
3198 bool hasMP = featureBits[ARM::FeatureMP];
3199 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3254 if (!hasV7Ops || !hasMP)
3274 int imm = Val & 0xFF;
3277 else if (!(Val & 0x100))
3347 bool hasMP = featureBits[ARM::FeatureMP];
3348 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3358 case ARM::t2LDRSBi8:
3364 case ARM::t2LDRSHi8:
3381 case ARM::t2LDRSHi8:
3387 case ARM::t2LDRSBi8:
3403 if (!hasV7Ops || !hasMP)
3428 case ARM::t2STRBi12:
3429 case ARM::t2STRHi12:
3457 bool hasMP = featureBits[ARM::FeatureMP];
3458 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3465 case ARM::t2LDRHi12:
3468 case ARM::t2LDRSHi12:
3471 case ARM::t2LDRBi12:
3474 case ARM::t2LDRSBi12:
3491 case ARM::t2LDRSHi12:
3493 case ARM::t2LDRHi12:
3496 case ARM::t2LDRSBi12:
3511 case ARM::t2PLDWi12:
3512 if (!hasV7Ops || !hasMP)
3571 int imm = Val & 0xFF;
3573 if (!(Val & 0x100)) imm *= -1;
3585 int imm = Val & 0x7F;
3646 int imm = Val & 0x7F;
3649 else if (!(Val & 0x80))
3651 if (imm != INT32_MIN)
3652 imm *= (1U << shift);
3675template <
int shift,
int WriteBack>
3708 case ARM::t2LDR_PRE:
3709 case ARM::t2LDR_POST:
3712 case ARM::t2LDRB_PRE:
3713 case ARM::t2LDRB_POST:
3716 case ARM::t2LDRH_PRE:
3717 case ARM::t2LDRH_POST:
3720 case ARM::t2LDRSB_PRE:
3721 case ARM::t2LDRSB_POST:
3727 case ARM::t2LDRSH_PRE:
3728 case ARM::t2LDRSH_POST:
3784 }
else if (Inst.
getOpcode() == ARM::tADDspr) {
3855 if (imm != INT32_MIN)
3856 imm *= (1U << shift);
3872 unsigned S = (Val >> 23) & 1;
3873 unsigned J1 = (Val >> 22) & 1;
3874 unsigned J2 = (Val >> 21) & 1;
3875 unsigned I1 = !(J1 ^ S);
3876 unsigned I2 = !(J2 ^ S);
3877 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3881 (Address & ~2u) + imm32 + 4,
3882 true, 4, Inst, Decoder))
3890 if (Val == 0xA || Val == 0xB)
3938 if (pred == 0xE || pred == 0xF) {
4010 true, 2, Inst, Decoder))
4025 unsigned S = (Val >> 23) & 1;
4026 unsigned J1 = (Val >> 22) & 1;
4027 unsigned J2 = (Val >> 21) & 1;
4028 unsigned I1 = !(J1 ^ S);
4029 unsigned I2 = !(J2 ^ S);
4030 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4034 true, 4, Inst, Decoder))
4055 if (FeatureBits[ARM::FeatureMClass]) {
4056 unsigned ValLow = Val & 0xff;
4075 if (!(FeatureBits[ARM::HasV7Ops]))
4083 if (!(FeatureBits[ARM::HasV8MMainlineOps]))
4093 if (!(FeatureBits[ARM::Feature8MSecExt]))
4112 if (!(FeatureBits[ARM::FeaturePACBTI]))
4123 if (!(FeatureBits[ARM::HasV7Ops])) {
4136 if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4137 (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
4159 if (!ARMBankedReg::lookupBankedRegByEncoding((R << 5) | SysM))
4201 if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
4885 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4911 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4948 unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
4949 mask ^= BitsAboveLowBit;
4969 bool writeback = (W == 1) | (
P == 0);
4971 addr |= (U << 8) | (Rn << 9);
4973 if (writeback && (Rn == Rt || Rn == Rt2))
5007 bool writeback = (W == 1) | (
P == 0);
5009 addr |= (U << 8) | (Rn << 9);
5011 if (writeback && (Rn == Rt || Rn == Rt2))
5081 if (Rt == Rn || Rn == Rt2)
5100 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5113 if (!(imm & 0x38)) {
5160 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5173 if (!(imm & 0x38)) {
5233 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5235 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5237 if (!
Check(S, DestRegDecoder(Inst, Vn, Address, Decoder)))
5287 if ((cop & ~0x1) == 0xa)
5332 case ARM::VMSR_FPSCR_NZCVQC:
5343 if (featureBits[ARM::ModeThumb] && !featureBits[ARM::HasV8Ops]) {
5344 if (Rt == 13 || Rt == 15)
5353 case ARM::VMRS_FPSCR_NZCVQC:
5361 if (featureBits[ARM::ModeThumb]) {
5373template <
bool isSigned,
bool isNeg,
bool zeroPermitted,
int size>
5378 if (Val == 0 && !zeroPermitted)
5385 DecVal = (Val << 1);
5398 Val = LocImm + (2 << Val);
5418 if (Inst.
getOpcode() == ARM::MVE_LCTP) {
5426 case ARM::t2LEUpdate:
5433 Inst, Imm, Address, Decoder)))
5437 case ARM::MVE_WLSTP_8:
5438 case ARM::MVE_WLSTP_16:
5439 case ARM::MVE_WLSTP_32:
5440 case ARM::MVE_WLSTP_64:
5444 Address, Decoder)) ||
5446 Inst, Imm, Address, Decoder)))
5450 case ARM::MVE_DLSTP_8:
5451 case ARM::MVE_DLSTP_16:
5452 case ARM::MVE_DLSTP_32:
5453 case ARM::MVE_DLSTP_64:
5459 uint32_t CanonicalLCTP = 0xF00FE001, SBZMask = 0x00300FFE;
5460 if ((Insn & ~SBZMask) != CanonicalLCTP)
5462 if (Insn != CanonicalLCTP)
5495 if ((RegNo) + 1 > 11)
5541 }
else if (Inst.
getOpcode() == ARM::VSCCLRMD) {
5552 unsigned max_reg = Vd + regs;
5553 if (max_reg > 64 || (max_reg > 32 && (max_reg & 1)))
5555 unsigned max_sreg = std::min(32u, max_reg);
5556 unsigned max_dreg = std::min(32u, max_reg / 2);
5557 for (
unsigned i = Vd; i < max_sreg; ++i)
5560 for (
unsigned i = 16; i < max_dreg; ++i)
5579 unsigned CurBit = 0;
5580 for (
int i = 3; i >= 0; --i) {
5583 CurBit ^= (Val >> i) & 1U;
5586 Imm |= (CurBit << i);
5589 if ((Val & ~(~0U << i)) == 0) {
5611 switch (Val & 0x3) {
5672 unsigned DecodedVal = 64 - Val;
5675 case ARM::MVE_VCVTf16s16_fix:
5676 case ARM::MVE_VCVTs16f16_fix:
5677 case ARM::MVE_VCVTf16u16_fix:
5678 case ARM::MVE_VCVTu16f16_fix:
5679 if (DecodedVal > 16)
5682 case ARM::MVE_VCVTf32s32_fix:
5683 case ARM::MVE_VCVTs32f32_fix:
5684 case ARM::MVE_VCVTf32u32_fix:
5685 case ARM::MVE_VCVTu32f32_fix:
5686 if (DecodedVal > 32)
5698 case ARM::VSTR_P0_off:
5699 case ARM::VSTR_P0_pre:
5700 case ARM::VSTR_P0_post:
5701 case ARM::VLDR_P0_off:
5702 case ARM::VLDR_P0_pre:
5703 case ARM::VLDR_P0_post:
5705 case ARM::VSTR_FPSCR_NZCVQC_off:
5706 case ARM::VSTR_FPSCR_NZCVQC_pre:
5707 case ARM::VSTR_FPSCR_NZCVQC_post:
5708 case ARM::VLDR_FPSCR_NZCVQC_off:
5709 case ARM::VLDR_FPSCR_NZCVQC_pre:
5710 case ARM::VLDR_FPSCR_NZCVQC_post:
5717template <
bool Writeback>
5722 case ARM::VSTR_FPSCR_pre:
5723 case ARM::VSTR_FPSCR_NZCVQC_pre:
5724 case ARM::VLDR_FPSCR_pre:
5725 case ARM::VLDR_FPSCR_NZCVQC_pre:
5726 case ARM::VSTR_FPSCR_off:
5727 case ARM::VSTR_FPSCR_NZCVQC_off:
5728 case ARM::VLDR_FPSCR_off:
5729 case ARM::VLDR_FPSCR_NZCVQC_off:
5730 case ARM::VSTR_FPSCR_post:
5731 case ARM::VSTR_FPSCR_NZCVQC_post:
5732 case ARM::VLDR_FPSCR_post:
5733 case ARM::VLDR_FPSCR_NZCVQC_post:
5737 if (!featureBits[ARM::HasMVEIntegerOps] && !featureBits[ARM::FeatureVFP2])
5771 if (!
Check(S, RnDecoder(Inst, Rn, Address, Decoder)))
5775 if (!
Check(S, AddrDecoder(Inst, addr, Address, Decoder)))
5812template <
unsigned MinLog,
unsigned MaxLog>
5818 if (Val < MinLog || Val > MaxLog)
5825template <
unsigned start>
5906 case ARM::MVE_ASRLr:
5907 case ARM::MVE_SQRSHRL:
5910 case ARM::MVE_LSLLr:
5911 case ARM::MVE_UQRSHLL:
5960 if (Inst.
getOpcode() == ARM::MVE_SQRSHRL ||
5991template <
bool scalar, OperandDecoder predicate_decoder>
6019 if (!
Check(S, predicate_decoder(Inst, fc, Address, Decoder)))
6069 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm12 : ARM::t2ADDspImm12);
6073 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm : ARM::t2ADDspImm);
6104#include "ARMGenDisassemblerTables.inc"
6111 switch (
MI.getOpcode()) {
6123 case ARM::t2ADDri12:
6127 case ARM::t2SUBri12:
6130 if (
MI.getOperand(0).getReg() == ARM::SP &&
6131 MI.getOperand(1).getReg() != ARM::SP)
6134 default:
return Result;
6143 if (!STI.hasFeature(ARM::ModeThumb))
6158 if (Bytes.
size() < 2)
6162 Bytes.
data(), InstructionEndianness);
6163 return Insn16 < 0xE800 ? 2 : 4;
6167 ArrayRef<uint8_t> Bytes,
6169 raw_ostream &CS)
const {
6171 if (STI.hasFeature(ARM::ModeThumb))
6175 if (S == DecodeStatus::Fail)
6179 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6183 Twine(
MI.getNumOperands()) +
"\n");
6190 ArrayRef<uint8_t> Bytes,
6192 raw_ostream &CS)
const {
6193 CommentStream = &CS;
6195 assert(!STI.hasFeature(ARM::ModeThumb) &&
6196 "Asked to disassemble an ARM instruction but Subtarget is in Thumb "
6200 if (Bytes.
size() < 4) {
6207 InstructionEndianness);
6211 decodeInstruction(DecoderTableARM32,
MI, Insn,
Address,
this, STI);
6217 const uint8_t *Tables[] = {
6218 DecoderTableVFP32, DecoderTableVFPV832,
6219 DecoderTableNEONData32, DecoderTableNEONLoadStore32,
6220 DecoderTableNEONDup32, DecoderTablev8NEON32,
6221 DecoderTablev8Crypto32,
6224 for (
const uint8_t *Table : Tables) {
6233 decodeInstruction(DecoderTableCoProc32,
MI, Insn,
Address,
this, STI);
6243bool ARMDisassembler::isVectorPredicable(
const MCInst &
MI)
const {
6244 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6257ARMDisassembler::checkThumbPredicate(MCInst &
MI)
const {
6260 const FeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
6262 switch (
MI.getOpcode()) {
6279 if (ITBlock.instrInITBlock())
6285 if (
MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
6294 if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
6307 if (ITBlock.instrInITBlock())
6308 ITBlock.advanceITState();
6309 else if (VPTBlock.instrInVPTBlock())
6310 VPTBlock.advanceVPTState();
6320void ARMDisassembler::UpdateThumbPredicate(
DecodeStatus &S, MCInst &
MI)
const {
6322 CC = ITBlock.getITCC();
6325 if (ITBlock.instrInITBlock())
6326 ITBlock.advanceITState();
6327 else if (VPTBlock.instrInVPTBlock()) {
6328 CC = VPTBlock.getVPTPred();
6329 VPTBlock.advanceVPTState();
6332 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6336 for (
unsigned i = 0; i <
NumOps; ++i, ++
I) {
6337 if (OpInfo[i].isPredicate() ) {
6343 I->setReg(ARM::NoRegister);
6345 I->setReg(ARM::CPSR);
6352 ArrayRef<uint8_t> Bytes,
6354 raw_ostream &CS)
const {
6355 CommentStream = &CS;
6357 assert(STI.hasFeature(ARM::ModeThumb) &&
6358 "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
6361 if (Bytes.
size() < 2) {
6367 Bytes.
data(), InstructionEndianness);
6369 decodeInstruction(DecoderTableThumb16,
MI, Insn16,
Address,
this, STI);
6372 Check(Result, checkThumbPredicate(
MI));
6376 Result = decodeInstruction(DecoderTableThumbSBit16,
MI, Insn16,
Address,
this,
6380 Check(Result, checkThumbPredicate(
MI));
6385 decodeInstruction(DecoderTableThumb216,
MI, Insn16,
Address,
this, STI);
6391 if (
MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
6394 Check(Result, checkThumbPredicate(
MI));
6399 if (
MI.getOpcode() == ARM::t2IT) {
6400 unsigned Firstcond =
MI.getOperand(0).getImm();
6401 unsigned Mask =
MI.getOperand(1).getImm();
6402 ITBlock.setITState(Firstcond, Mask);
6406 CS <<
"unpredictable IT predicate sequence";
6413 if (Bytes.
size() < 4) {
6420 Bytes.
data() + 2, InstructionEndianness);
6423 decodeInstruction(DecoderTableMVE32,
MI, Insn32,
Address,
this, STI);
6429 if (
isVPTOpcode(
MI.getOpcode()) && VPTBlock.instrInVPTBlock())
6432 Check(Result, checkThumbPredicate(
MI));
6435 unsigned Mask =
MI.getOperand(0).getImm();
6436 VPTBlock.setVPTState(Mask);
6443 decodeInstruction(DecoderTableThumb32,
MI, Insn32,
Address,
this, STI);
6446 Check(Result, checkThumbPredicate(
MI));
6451 decodeInstruction(DecoderTableThumb232,
MI, Insn32,
Address,
this, STI);
6454 Check(Result, checkThumbPredicate(
MI));
6460 decodeInstruction(DecoderTableVFP32,
MI, Insn32,
Address,
this, STI);
6463 UpdateThumbPredicate(Result,
MI);
6469 decodeInstruction(DecoderTableVFPV832,
MI, Insn32,
Address,
this, STI);
6476 Result = decodeInstruction(DecoderTableNEONDup32,
MI, Insn32,
Address,
this,
6480 UpdateThumbPredicate(Result,
MI);
6486 uint32_t NEONLdStInsn = Insn32;
6487 NEONLdStInsn &= 0xF0FFFFFF;
6488 NEONLdStInsn |= 0x04000000;
6489 Result = decodeInstruction(DecoderTableNEONLoadStore32,
MI, NEONLdStInsn,
6493 Check(Result, checkThumbPredicate(
MI));
6499 uint32_t NEONDataInsn = Insn32;
6500 NEONDataInsn &= 0xF0FFFFFF;
6501 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4;
6502 NEONDataInsn |= 0x12000000;
6503 Result = decodeInstruction(DecoderTableNEONData32,
MI, NEONDataInsn,
6507 Check(Result, checkThumbPredicate(
MI));
6511 uint32_t NEONCryptoInsn = Insn32;
6512 NEONCryptoInsn &= 0xF0FFFFFF;
6513 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4;
6514 NEONCryptoInsn |= 0x12000000;
6515 Result = decodeInstruction(DecoderTablev8Crypto32,
MI, NEONCryptoInsn,
6522 uint32_t NEONv8Insn = Insn32;
6523 NEONv8Insn &= 0xF3FFFFFF;
6524 Result = decodeInstruction(DecoderTablev8NEON32,
MI, NEONv8Insn,
Address,
6534 ? DecoderTableThumb2CDE32
6535 : DecoderTableThumb2CoProc32;
6537 decodeInstruction(DecoderTable,
MI, Insn32,
Address,
this, STI);
6540 Check(Result, checkThumbPredicate(
MI));
6546 if (ITBlock.instrInITBlock())
6547 ITBlock.advanceITState();
6555 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 DecodeVpredNOperand(MCInst &Inst, 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 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 DecodeVpredROperand(MCInst &Inst, 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)
static constexpr unsigned long long mask(BlockVerifier::State S)
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#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
Describe properties that are true of each instruction in the target description file.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
ArrayRef< MCOperandInfo > operands() const
unsigned short NumOperands
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution.
bool isVariadic() const
Return true if this instruction can have a variable number of operands.
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.
Instances of this class represent operands of the MCInst class.
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)
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
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.