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;
209 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
210 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
211 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
212 ARM::R12, ARM::SP, ARM::LR, ARM::PC
216 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
217 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
218 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
219 ARM::R12, 0, ARM::LR, ARM::APSR
325 ARM::R0_R1, ARM::R2_R3, ARM::R4_R5, ARM::R6_R7,
326 ARM::R8_R9, ARM::R10_R11, ARM::R12_SP
356 if ((RegNo & 1) || RegNo > 10)
411 if ((RegNo == 13 && !featureBits[ARM::HasV8Ops]) || RegNo == 15)
419 ARM::S0, ARM::S1, ARM::S2, ARM::S3,
420 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
421 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
422 ARM::S12, ARM::S13, ARM::S14, ARM::S15,
423 ARM::S16, ARM::S17, ARM::S18, ARM::S19,
424 ARM::S20, ARM::S21, ARM::S22, ARM::S23,
425 ARM::S24, ARM::S25, ARM::S26, ARM::S27,
426 ARM::S28, ARM::S29, ARM::S30, ARM::S31
447 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
448 ARM::D4, ARM::D5, ARM::D6, ARM::D7,
449 ARM::D8, ARM::D9, ARM::D10, ARM::D11,
450 ARM::D12, ARM::D13, ARM::D14, ARM::D15,
451 ARM::D16, ARM::D17, ARM::D18, ARM::D19,
452 ARM::D20, ARM::D21, ARM::D22, ARM::D23,
453 ARM::D24, ARM::D25, ARM::D26, ARM::D27,
454 ARM::D28, ARM::D29, ARM::D30, ARM::D31
463 return featureBits[ARM::FeatureD32];
469 if (RegNo > (
PermitsD32(Inst, Decoder) ? 31u : 15u))
502 ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
503 ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7,
504 ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
505 ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
511 if (RegNo > 31 || (RegNo & 1) != 0)
521 ARM::Q0, ARM::D1_D2, ARM::Q1, ARM::D3_D4, ARM::Q2, ARM::D5_D6,
522 ARM::Q3, ARM::D7_D8, ARM::Q4, ARM::D9_D10, ARM::Q5, ARM::D11_D12,
523 ARM::Q6, ARM::D13_D14, ARM::Q7, ARM::D15_D16, ARM::Q8, ARM::D17_D18,
524 ARM::Q9, ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
525 ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
541 ARM::D0_D2, ARM::D1_D3, ARM::D2_D4, ARM::D3_D5,
542 ARM::D4_D6, ARM::D5_D7, ARM::D6_D8, ARM::D7_D9,
543 ARM::D8_D10, ARM::D9_D11, ARM::D10_D12, ARM::D11_D13,
544 ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
545 ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
546 ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
547 ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
548 ARM::D28_D30, ARM::D29_D31
574 ARM::Q0_Q1, ARM::Q1_Q2, ARM::Q2_Q3, ARM::Q3_Q4,
575 ARM::Q4_Q5, ARM::Q5_Q6, ARM::Q6_Q7
590 ARM::Q0_Q1_Q2_Q3, ARM::Q1_Q2_Q3_Q4, ARM::Q2_Q3_Q4_Q5,
591 ARM::Q3_Q4_Q5_Q6, ARM::Q4_Q5_Q6_Q7
613 if (Inst.
getOpcode() == ARM::tBcc && Val == 0xE)
616 static_cast<const ARMDisassembler *
>(Decoder)->MCII.
get();
641 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
643 MCRegister CCR =
D->ITBlock.instrInITBlock() ? ARM::NoRegister : ARM::CPSR;
680 unsigned Op = Shift | (imm << 3);
727 bool NeedDisjointWriteback =
false;
737 case ARM::t2LDMIA_UPD:
738 case ARM::t2LDMDB_UPD:
739 case ARM::t2STMIA_UPD:
740 case ARM::t2STMDB_UPD:
741 NeedDisjointWriteback =
true;
751 for (
unsigned i = 0; i < 16; ++i) {
752 if (Val & (1 << i)) {
761 if (NeedDisjointWriteback && WritebackReg == Inst.
end()[-1].getReg())
779 if (regs == 0 || (Vd + regs) > 32) {
780 regs = Vd + regs > 32 ? 32 - Vd : regs;
781 regs = std::max( 1u, regs);
787 for (
unsigned i = 0; i < (regs - 1); ++i) {
804 unsigned MaxReg =
PermitsD32(Inst, Decoder) ? 32 : 16;
805 if (regs == 0 || (Vd + regs) > MaxReg) {
806 regs = Vd + regs > MaxReg ? MaxReg - Vd : regs;
807 regs = std::max( 1u, regs);
808 regs = std::min(MaxReg, regs);
814 for (
unsigned i = 0; i < (regs - 1); ++i) {
843 if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
844 uint32_t lsb_mask = (1U << lsb) - 1;
865 case ARM::LDC_OFFSET:
868 case ARM::LDC_OPTION:
869 case ARM::LDCL_OFFSET:
872 case ARM::LDCL_OPTION:
873 case ARM::STC_OFFSET:
876 case ARM::STC_OPTION:
877 case ARM::STCL_OFFSET:
880 case ARM::STCL_OPTION:
881 case ARM::t2LDC_OFFSET:
883 case ARM::t2LDC_POST:
884 case ARM::t2LDC_OPTION:
885 case ARM::t2LDCL_OFFSET:
886 case ARM::t2LDCL_PRE:
887 case ARM::t2LDCL_POST:
888 case ARM::t2LDCL_OPTION:
889 case ARM::t2STC_OFFSET:
891 case ARM::t2STC_POST:
892 case ARM::t2STC_OPTION:
893 case ARM::t2STCL_OFFSET:
894 case ARM::t2STCL_PRE:
895 case ARM::t2STCL_POST:
896 case ARM::t2STCL_OPTION:
897 case ARM::t2LDC2_OFFSET:
898 case ARM::t2LDC2L_OFFSET:
899 case ARM::t2LDC2_PRE:
900 case ARM::t2LDC2L_PRE:
901 case ARM::t2STC2_OFFSET:
902 case ARM::t2STC2L_OFFSET:
903 case ARM::t2STC2_PRE:
904 case ARM::t2STC2L_PRE:
905 case ARM::LDC2_OFFSET:
906 case ARM::LDC2L_OFFSET:
909 case ARM::STC2_OFFSET:
910 case ARM::STC2L_OFFSET:
913 case ARM::t2LDC2_OPTION:
914 case ARM::t2STC2_OPTION:
915 case ARM::t2LDC2_POST:
916 case ARM::t2LDC2L_POST:
917 case ARM::t2STC2_POST:
918 case ARM::t2STC2L_POST:
920 case ARM::LDC2L_POST:
922 case ARM::STC2L_POST:
923 if (coproc == 0xA || coproc == 0xB ||
924 (featureBits[ARM::HasV8_1MMainlineOps] &&
925 (coproc == 0x8 || coproc == 0x9 || coproc == 0xA || coproc == 0xB ||
926 coproc == 0xE || coproc == 0xF)))
933 if (featureBits[ARM::HasV8Ops] && (coproc != 14))
942 case ARM::t2LDC2_OFFSET:
943 case ARM::t2LDC2L_OFFSET:
944 case ARM::t2LDC2_PRE:
945 case ARM::t2LDC2L_PRE:
946 case ARM::t2STC2_OFFSET:
947 case ARM::t2STC2L_OFFSET:
948 case ARM::t2STC2_PRE:
949 case ARM::t2STC2L_PRE:
950 case ARM::LDC2_OFFSET:
951 case ARM::LDC2L_OFFSET:
954 case ARM::STC2_OFFSET:
955 case ARM::STC2L_OFFSET:
958 case ARM::t2LDC_OFFSET:
959 case ARM::t2LDCL_OFFSET:
961 case ARM::t2LDCL_PRE:
962 case ARM::t2STC_OFFSET:
963 case ARM::t2STCL_OFFSET:
965 case ARM::t2STCL_PRE:
966 case ARM::LDC_OFFSET:
967 case ARM::LDCL_OFFSET:
970 case ARM::STC_OFFSET:
971 case ARM::STCL_OFFSET:
977 case ARM::t2LDC2_POST:
978 case ARM::t2LDC2L_POST:
979 case ARM::t2STC2_POST:
980 case ARM::t2STC2L_POST:
982 case ARM::LDC2L_POST:
984 case ARM::STC2L_POST:
985 case ARM::t2LDC_POST:
986 case ARM::t2LDCL_POST:
987 case ARM::t2STC_POST:
988 case ARM::t2STCL_POST:
1003 case ARM::LDC_OFFSET:
1006 case ARM::LDC_OPTION:
1007 case ARM::LDCL_OFFSET:
1009 case ARM::LDCL_POST:
1010 case ARM::LDCL_OPTION:
1011 case ARM::STC_OFFSET:
1014 case ARM::STC_OPTION:
1015 case ARM::STCL_OFFSET:
1017 case ARM::STCL_POST:
1018 case ARM::STCL_OPTION:
1045 case ARM::STR_POST_IMM:
1046 case ARM::STR_POST_REG:
1047 case ARM::STRB_POST_IMM:
1048 case ARM::STRB_POST_REG:
1049 case ARM::STRT_POST_REG:
1050 case ARM::STRT_POST_IMM:
1051 case ARM::STRBT_POST_REG:
1052 case ARM::STRBT_POST_IMM:
1065 case ARM::LDR_POST_IMM:
1066 case ARM::LDR_POST_REG:
1067 case ARM::LDRB_POST_IMM:
1068 case ARM::LDRB_POST_REG:
1069 case ARM::LDRBT_POST_REG:
1070 case ARM::LDRBT_POST_IMM:
1071 case ARM::LDRT_POST_REG:
1072 case ARM::LDRT_POST_IMM:
1087 bool writeback = (
P == 0) || (W == 1);
1088 unsigned idx_mode = 0;
1091 else if (!
P && writeback)
1094 if (writeback && (Rn == 15 || Rn == Rt))
1206 unsigned Rt2 = Rt + 1;
1208 bool writeback = (W == 1) | (
P == 0);
1214 case ARM::STRD_POST:
1217 case ARM::LDRD_POST:
1226 case ARM::STRD_POST:
1227 if (
P == 0 && W == 1)
1230 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1232 if (type && Rm == 15)
1241 case ARM::STRH_POST:
1244 if (writeback && (Rn == 15 || Rn == Rt))
1246 if (!type && Rm == 15)
1251 case ARM::LDRD_POST:
1252 if (type && Rn == 15) {
1257 if (
P == 0 && W == 1)
1259 if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1261 if (!type && writeback && Rn == 15)
1263 if (writeback && (Rn == Rt || Rn == Rt2))
1268 case ARM::LDRH_POST:
1269 if (type && Rn == 15) {
1276 if (!type && Rm == 15)
1278 if (!type && writeback && (Rn == 15 || Rn == Rt))
1282 case ARM::LDRSH_PRE:
1283 case ARM::LDRSH_POST:
1285 case ARM::LDRSB_PRE:
1286 case ARM::LDRSB_POST:
1287 if (type && Rn == 15) {
1292 if (type && (Rt == 15 || (writeback && Rn == Rt)))
1294 if (!type && (Rt == 15 || Rm == 15))
1296 if (!type && writeback && (Rn == 15 || Rn == Rt))
1313 case ARM::STRD_POST:
1316 case ARM::STRH_POST:
1330 case ARM::STRD_POST:
1333 case ARM::LDRD_POST:
1346 case ARM::LDRD_POST:
1349 case ARM::LDRH_POST:
1351 case ARM::LDRSH_PRE:
1352 case ARM::LDRSH_POST:
1354 case ARM::LDRSB_PRE:
1355 case ARM::LDRSB_POST:
1425 }
else if (imod && !M) {
1430 }
else if (!imod && M) {
1484 case ARM::LDMDA_UPD:
1490 case ARM::LDMDB_UPD:
1496 case ARM::LDMIA_UPD:
1502 case ARM::LDMIB_UPD:
1508 case ARM::STMDA_UPD:
1514 case ARM::STMDB_UPD:
1520 case ARM::STMIA_UPD:
1526 case ARM::STMIB_UPD:
1578 if (imm8 == 0x10 && pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
1606 }
else if (imod && !M) {
1611 }
else if (!imod && M) {
1632 unsigned Opcode = ARM::t2HINT;
1635 Opcode = ARM::t2PACBTI;
1636 }
else if (imm == 0x1D) {
1637 Opcode = ARM::t2PAC;
1638 }
else if (imm == 0x2D) {
1639 Opcode = ARM::t2AUT;
1640 }
else if (imm == 0x0F) {
1641 Opcode = ARM::t2BTI;
1645 if (Opcode == ARM::t2HINT) {
1744 if (!FeatureBits[ARM::HasV8_1aOps] ||
1745 !FeatureBits[ARM::HasV8Ops])
1797 if (!add) imm *= -1;
1798 if (imm == 0 && !add) imm = INT32_MIN;
1868 unsigned I1 = !(J1 ^ S);
1869 unsigned I2 = !(J2 ^ S);
1872 unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
1875 true, 4, Inst, Decoder))
1893 true, 4, Inst, Decoder))
1899 true, 4, Inst, Decoder))
1943 case ARM::VLD1q16:
case ARM::VLD1q32:
case ARM::VLD1q64:
case ARM::VLD1q8:
1944 case ARM::VLD1q16wb_fixed:
case ARM::VLD1q16wb_register:
1945 case ARM::VLD1q32wb_fixed:
case ARM::VLD1q32wb_register:
1946 case ARM::VLD1q64wb_fixed:
case ARM::VLD1q64wb_register:
1947 case ARM::VLD1q8wb_fixed:
case ARM::VLD1q8wb_register:
1948 case ARM::VLD2d16:
case ARM::VLD2d32:
case ARM::VLD2d8:
1949 case ARM::VLD2d16wb_fixed:
case ARM::VLD2d16wb_register:
1950 case ARM::VLD2d32wb_fixed:
case ARM::VLD2d32wb_register:
1951 case ARM::VLD2d8wb_fixed:
case ARM::VLD2d8wb_register:
1958 case ARM::VLD2b16wb_fixed:
1959 case ARM::VLD2b16wb_register:
1960 case ARM::VLD2b32wb_fixed:
1961 case ARM::VLD2b32wb_register:
1962 case ARM::VLD2b8wb_fixed:
1963 case ARM::VLD2b8wb_register:
1977 case ARM::VLD3d8_UPD:
1978 case ARM::VLD3d16_UPD:
1979 case ARM::VLD3d32_UPD:
1983 case ARM::VLD4d8_UPD:
1984 case ARM::VLD4d16_UPD:
1985 case ARM::VLD4d32_UPD:
1992 case ARM::VLD3q8_UPD:
1993 case ARM::VLD3q16_UPD:
1994 case ARM::VLD3q32_UPD:
1998 case ARM::VLD4q8_UPD:
1999 case ARM::VLD4q16_UPD:
2000 case ARM::VLD4q32_UPD:
2013 case ARM::VLD3d8_UPD:
2014 case ARM::VLD3d16_UPD:
2015 case ARM::VLD3d32_UPD:
2019 case ARM::VLD4d8_UPD:
2020 case ARM::VLD4d16_UPD:
2021 case ARM::VLD4d32_UPD:
2028 case ARM::VLD3q8_UPD:
2029 case ARM::VLD3q16_UPD:
2030 case ARM::VLD3q32_UPD:
2034 case ARM::VLD4q8_UPD:
2035 case ARM::VLD4q16_UPD:
2036 case ARM::VLD4q32_UPD:
2049 case ARM::VLD4d8_UPD:
2050 case ARM::VLD4d16_UPD:
2051 case ARM::VLD4d32_UPD:
2058 case ARM::VLD4q8_UPD:
2059 case ARM::VLD4q16_UPD:
2060 case ARM::VLD4q32_UPD:
2070 case ARM::VLD1d8wb_fixed:
2071 case ARM::VLD1d16wb_fixed:
2072 case ARM::VLD1d32wb_fixed:
2073 case ARM::VLD1d64wb_fixed:
2074 case ARM::VLD1d8wb_register:
2075 case ARM::VLD1d16wb_register:
2076 case ARM::VLD1d32wb_register:
2077 case ARM::VLD1d64wb_register:
2078 case ARM::VLD1q8wb_fixed:
2079 case ARM::VLD1q16wb_fixed:
2080 case ARM::VLD1q32wb_fixed:
2081 case ARM::VLD1q64wb_fixed:
2082 case ARM::VLD1q8wb_register:
2083 case ARM::VLD1q16wb_register:
2084 case ARM::VLD1q32wb_register:
2085 case ARM::VLD1q64wb_register:
2086 case ARM::VLD1d8Twb_fixed:
2087 case ARM::VLD1d8Twb_register:
2088 case ARM::VLD1d16Twb_fixed:
2089 case ARM::VLD1d16Twb_register:
2090 case ARM::VLD1d32Twb_fixed:
2091 case ARM::VLD1d32Twb_register:
2092 case ARM::VLD1d64Twb_fixed:
2093 case ARM::VLD1d64Twb_register:
2094 case ARM::VLD1d8Qwb_fixed:
2095 case ARM::VLD1d8Qwb_register:
2096 case ARM::VLD1d16Qwb_fixed:
2097 case ARM::VLD1d16Qwb_register:
2098 case ARM::VLD1d32Qwb_fixed:
2099 case ARM::VLD1d32Qwb_register:
2100 case ARM::VLD1d64Qwb_fixed:
2101 case ARM::VLD1d64Qwb_register:
2102 case ARM::VLD2d8wb_fixed:
2103 case ARM::VLD2d16wb_fixed:
2104 case ARM::VLD2d32wb_fixed:
2105 case ARM::VLD2q8wb_fixed:
2106 case ARM::VLD2q16wb_fixed:
2107 case ARM::VLD2q32wb_fixed:
2108 case ARM::VLD2d8wb_register:
2109 case ARM::VLD2d16wb_register:
2110 case ARM::VLD2d32wb_register:
2111 case ARM::VLD2q8wb_register:
2112 case ARM::VLD2q16wb_register:
2113 case ARM::VLD2q32wb_register:
2114 case ARM::VLD2b8wb_fixed:
2115 case ARM::VLD2b16wb_fixed:
2116 case ARM::VLD2b32wb_fixed:
2117 case ARM::VLD2b8wb_register:
2118 case ARM::VLD2b16wb_register:
2119 case ARM::VLD2b32wb_register:
2122 case ARM::VLD3d8_UPD:
2123 case ARM::VLD3d16_UPD:
2124 case ARM::VLD3d32_UPD:
2125 case ARM::VLD3q8_UPD:
2126 case ARM::VLD3q16_UPD:
2127 case ARM::VLD3q32_UPD:
2128 case ARM::VLD4d8_UPD:
2129 case ARM::VLD4d16_UPD:
2130 case ARM::VLD4d32_UPD:
2131 case ARM::VLD4q8_UPD:
2132 case ARM::VLD4q16_UPD:
2133 case ARM::VLD4q32_UPD:
2160 case ARM::VLD1d8wb_fixed:
2161 case ARM::VLD1d16wb_fixed:
2162 case ARM::VLD1d32wb_fixed:
2163 case ARM::VLD1d64wb_fixed:
2164 case ARM::VLD1d8Twb_fixed:
2165 case ARM::VLD1d16Twb_fixed:
2166 case ARM::VLD1d32Twb_fixed:
2167 case ARM::VLD1d64Twb_fixed:
2168 case ARM::VLD1d8Qwb_fixed:
2169 case ARM::VLD1d16Qwb_fixed:
2170 case ARM::VLD1d32Qwb_fixed:
2171 case ARM::VLD1d64Qwb_fixed:
2172 case ARM::VLD1d8wb_register:
2173 case ARM::VLD1d16wb_register:
2174 case ARM::VLD1d32wb_register:
2175 case ARM::VLD1d64wb_register:
2176 case ARM::VLD1q8wb_fixed:
2177 case ARM::VLD1q16wb_fixed:
2178 case ARM::VLD1q32wb_fixed:
2179 case ARM::VLD1q64wb_fixed:
2180 case ARM::VLD1q8wb_register:
2181 case ARM::VLD1q16wb_register:
2182 case ARM::VLD1q32wb_register:
2183 case ARM::VLD1q64wb_register:
2187 if (Rm != 0xD && Rm != 0xF &&
2191 case ARM::VLD2d8wb_fixed:
2192 case ARM::VLD2d16wb_fixed:
2193 case ARM::VLD2d32wb_fixed:
2194 case ARM::VLD2b8wb_fixed:
2195 case ARM::VLD2b16wb_fixed:
2196 case ARM::VLD2b32wb_fixed:
2197 case ARM::VLD2q8wb_fixed:
2198 case ARM::VLD2q16wb_fixed:
2199 case ARM::VLD2q32wb_fixed:
2220 case ARM::VST1d8wb_fixed:
2221 case ARM::VST1d16wb_fixed:
2222 case ARM::VST1d32wb_fixed:
2223 case ARM::VST1d64wb_fixed:
2224 case ARM::VST1d8wb_register:
2225 case ARM::VST1d16wb_register:
2226 case ARM::VST1d32wb_register:
2227 case ARM::VST1d64wb_register:
2228 case ARM::VST1q8wb_fixed:
2229 case ARM::VST1q16wb_fixed:
2230 case ARM::VST1q32wb_fixed:
2231 case ARM::VST1q64wb_fixed:
2232 case ARM::VST1q8wb_register:
2233 case ARM::VST1q16wb_register:
2234 case ARM::VST1q32wb_register:
2235 case ARM::VST1q64wb_register:
2236 case ARM::VST1d8Twb_fixed:
2237 case ARM::VST1d16Twb_fixed:
2238 case ARM::VST1d32Twb_fixed:
2239 case ARM::VST1d64Twb_fixed:
2240 case ARM::VST1d8Twb_register:
2241 case ARM::VST1d16Twb_register:
2242 case ARM::VST1d32Twb_register:
2243 case ARM::VST1d64Twb_register:
2244 case ARM::VST1d8Qwb_fixed:
2245 case ARM::VST1d16Qwb_fixed:
2246 case ARM::VST1d32Qwb_fixed:
2247 case ARM::VST1d64Qwb_fixed:
2248 case ARM::VST1d8Qwb_register:
2249 case ARM::VST1d16Qwb_register:
2250 case ARM::VST1d32Qwb_register:
2251 case ARM::VST1d64Qwb_register:
2252 case ARM::VST2d8wb_fixed:
2253 case ARM::VST2d16wb_fixed:
2254 case ARM::VST2d32wb_fixed:
2255 case ARM::VST2d8wb_register:
2256 case ARM::VST2d16wb_register:
2257 case ARM::VST2d32wb_register:
2258 case ARM::VST2q8wb_fixed:
2259 case ARM::VST2q16wb_fixed:
2260 case ARM::VST2q32wb_fixed:
2261 case ARM::VST2q8wb_register:
2262 case ARM::VST2q16wb_register:
2263 case ARM::VST2q32wb_register:
2264 case ARM::VST2b8wb_fixed:
2265 case ARM::VST2b16wb_fixed:
2266 case ARM::VST2b32wb_fixed:
2267 case ARM::VST2b8wb_register:
2268 case ARM::VST2b16wb_register:
2269 case ARM::VST2b32wb_register:
2274 case ARM::VST3d8_UPD:
2275 case ARM::VST3d16_UPD:
2276 case ARM::VST3d32_UPD:
2277 case ARM::VST3q8_UPD:
2278 case ARM::VST3q16_UPD:
2279 case ARM::VST3q32_UPD:
2280 case ARM::VST4d8_UPD:
2281 case ARM::VST4d16_UPD:
2282 case ARM::VST4d32_UPD:
2283 case ARM::VST4q8_UPD:
2284 case ARM::VST4q16_UPD:
2285 case ARM::VST4q32_UPD:
2302 else if (Rm != 0xF) {
2307 case ARM::VST1d8wb_fixed:
2308 case ARM::VST1d16wb_fixed:
2309 case ARM::VST1d32wb_fixed:
2310 case ARM::VST1d64wb_fixed:
2311 case ARM::VST1q8wb_fixed:
2312 case ARM::VST1q16wb_fixed:
2313 case ARM::VST1q32wb_fixed:
2314 case ARM::VST1q64wb_fixed:
2315 case ARM::VST1d8Twb_fixed:
2316 case ARM::VST1d16Twb_fixed:
2317 case ARM::VST1d32Twb_fixed:
2318 case ARM::VST1d64Twb_fixed:
2319 case ARM::VST1d8Qwb_fixed:
2320 case ARM::VST1d16Qwb_fixed:
2321 case ARM::VST1d32Qwb_fixed:
2322 case ARM::VST1d64Qwb_fixed:
2323 case ARM::VST2d8wb_fixed:
2324 case ARM::VST2d16wb_fixed:
2325 case ARM::VST2d32wb_fixed:
2326 case ARM::VST2q8wb_fixed:
2327 case ARM::VST2q16wb_fixed:
2328 case ARM::VST2q32wb_fixed:
2329 case ARM::VST2b8wb_fixed:
2330 case ARM::VST2b16wb_fixed:
2331 case ARM::VST2b32wb_fixed:
2341 case ARM::VST1q16wb_fixed:
2342 case ARM::VST1q16wb_register:
2343 case ARM::VST1q32wb_fixed:
2344 case ARM::VST1q32wb_register:
2345 case ARM::VST1q64wb_fixed:
2346 case ARM::VST1q64wb_register:
2347 case ARM::VST1q8wb_fixed:
2348 case ARM::VST1q8wb_register:
2352 case ARM::VST2d16wb_fixed:
2353 case ARM::VST2d16wb_register:
2354 case ARM::VST2d32wb_fixed:
2355 case ARM::VST2d32wb_register:
2356 case ARM::VST2d8wb_fixed:
2357 case ARM::VST2d8wb_register:
2364 case ARM::VST2b16wb_fixed:
2365 case ARM::VST2b16wb_register:
2366 case ARM::VST2b32wb_fixed:
2367 case ARM::VST2b32wb_register:
2368 case ARM::VST2b8wb_fixed:
2369 case ARM::VST2b8wb_register:
2383 case ARM::VST3d8_UPD:
2384 case ARM::VST3d16_UPD:
2385 case ARM::VST3d32_UPD:
2389 case ARM::VST4d8_UPD:
2390 case ARM::VST4d16_UPD:
2391 case ARM::VST4d32_UPD:
2398 case ARM::VST3q8_UPD:
2399 case ARM::VST3q16_UPD:
2400 case ARM::VST3q32_UPD:
2404 case ARM::VST4q8_UPD:
2405 case ARM::VST4q16_UPD:
2406 case ARM::VST4q32_UPD:
2419 case ARM::VST3d8_UPD:
2420 case ARM::VST3d16_UPD:
2421 case ARM::VST3d32_UPD:
2425 case ARM::VST4d8_UPD:
2426 case ARM::VST4d16_UPD:
2427 case ARM::VST4d32_UPD:
2434 case ARM::VST3q8_UPD:
2435 case ARM::VST3q16_UPD:
2436 case ARM::VST3q32_UPD:
2440 case ARM::VST4q8_UPD:
2441 case ARM::VST4q16_UPD:
2442 case ARM::VST4q32_UPD:
2455 case ARM::VST4d8_UPD:
2456 case ARM::VST4d16_UPD:
2457 case ARM::VST4d32_UPD:
2464 case ARM::VST4q8_UPD:
2465 case ARM::VST4q16_UPD:
2466 case ARM::VST4q32_UPD:
2544 if (
size == 0 && align == 1)
2546 align *= (1 <<
size);
2549 case ARM::VLD1DUPq16:
case ARM::VLD1DUPq32:
case ARM::VLD1DUPq8:
2550 case ARM::VLD1DUPq16wb_fixed:
case ARM::VLD1DUPq16wb_register:
2551 case ARM::VLD1DUPq32wb_fixed:
case ARM::VLD1DUPq32wb_register:
2552 case ARM::VLD1DUPq8wb_fixed:
case ARM::VLD1DUPq8wb_register:
2573 if (Rm != 0xD && Rm != 0xF &&
2594 case ARM::VLD2DUPd16:
case ARM::VLD2DUPd32:
case ARM::VLD2DUPd8:
2595 case ARM::VLD2DUPd16wb_fixed:
case ARM::VLD2DUPd16wb_register:
2596 case ARM::VLD2DUPd32wb_fixed:
case ARM::VLD2DUPd32wb_register:
2597 case ARM::VLD2DUPd8wb_fixed:
case ARM::VLD2DUPd8wb_register:
2601 case ARM::VLD2DUPd16x2:
case ARM::VLD2DUPd32x2:
case ARM::VLD2DUPd8x2:
2602 case ARM::VLD2DUPd16x2wb_fixed:
case ARM::VLD2DUPd16x2wb_register:
2603 case ARM::VLD2DUPd32x2wb_fixed:
case ARM::VLD2DUPd32x2wb_register:
2604 case ARM::VLD2DUPd8x2wb_fixed:
case ARM::VLD2DUPd8x2wb_register:
2621 if (Rm != 0xD && Rm != 0xF) {
2657 else if (Rm != 0xF) {
2710 else if (Rm != 0xF) {
2743 case ARM::VORRiv4i16:
2744 case ARM::VORRiv2i32:
2745 case ARM::VBICiv4i16:
2746 case ARM::VBICiv2i32:
2750 case ARM::VORRiv8i16:
2751 case ARM::VORRiv4i32:
2752 case ARM::VBICiv8i16:
2753 case ARM::VBICiv4i32:
2778 if (cmode == 0xF && Inst.
getOpcode() == ARM::MVE_VMVNimmi32)
2928 true, 2, Inst, Decoder))
2937 true, 4, Inst, Decoder))
2946 true, 2, Inst, Decoder))
2985 unsigned imm = Val << 2;
3044 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3048 case ARM::t2LDRBpci:
3049 case ARM::t2LDRHpci:
3052 case ARM::t2LDRSBpci:
3055 case ARM::t2LDRSHpci:
3097 bool hasMP = featureBits[ARM::FeatureMP];
3098 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3153 if (!hasV7Ops || !hasMP)
3186 bool hasMP = featureBits[ARM::FeatureMP];
3187 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3197 case ARM::t2LDRSBi8:
3203 case ARM::t2LDRSHi8:
3220 case ARM::t2LDRSHi8:
3226 case ARM::t2LDRSBi8:
3242 if (!hasV7Ops || !hasMP)
3266 case ARM::t2STRBi12:
3267 case ARM::t2STRHi12:
3295 bool hasMP = featureBits[ARM::FeatureMP];
3296 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3303 case ARM::t2LDRHi12:
3306 case ARM::t2LDRSHi12:
3309 case ARM::t2LDRBi12:
3312 case ARM::t2LDRSBi12:
3329 case ARM::t2LDRSHi12:
3331 case ARM::t2LDRHi12:
3334 case ARM::t2LDRSBi12:
3349 case ARM::t2PLDWi12:
3350 if (!hasV7Ops || !hasMP)
3407 int imm = Val & 0xFF;
3409 if (!(Val & 0x100)) imm *= -1;
3421 int imm = Val & 0x7F;
3481 int imm = Val & 0xFF;
3484 else if (!(Val & 0x100))
3494 int imm = Val & 0x7F;
3497 else if (!(Val & 0x80))
3499 if (imm != INT32_MIN)
3500 imm *= (1U << shift);
3570template <
int shift,
int WriteBack>
3603 case ARM::t2LDR_PRE:
3604 case ARM::t2LDR_POST:
3607 case ARM::t2LDRB_PRE:
3608 case ARM::t2LDRB_POST:
3611 case ARM::t2LDRH_PRE:
3612 case ARM::t2LDRH_POST:
3615 case ARM::t2LDRSB_PRE:
3616 case ARM::t2LDRSB_POST:
3622 case ARM::t2LDRSH_PRE:
3623 case ARM::t2LDRSH_POST:
3677 }
else if (Inst.
getOpcode() == ARM::tADDspr) {
3747 if (imm != INT32_MIN)
3748 imm *= (1U << shift);
3764 unsigned S = (Val >> 23) & 1;
3765 unsigned J1 = (Val >> 22) & 1;
3766 unsigned J2 = (Val >> 21) & 1;
3767 unsigned I1 = !(J1 ^ S);
3768 unsigned I2 = !(J2 ^ S);
3769 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3773 (Address & ~2u) + imm32 + 4,
3774 true, 4, Inst, Decoder))
3782 if (Val == 0xA || Val == 0xB)
3829 if (pred == 0xE || pred == 0xF) {
3901 true, 2, Inst, Decoder))
3916 unsigned S = (Val >> 23) & 1;
3917 unsigned J1 = (Val >> 22) & 1;
3918 unsigned J2 = (Val >> 21) & 1;
3919 unsigned I1 = !(J1 ^ S);
3920 unsigned I2 = !(J2 ^ S);
3921 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3925 true, 4, Inst, Decoder))
3946 if (FeatureBits[ARM::FeatureMClass]) {
3947 unsigned ValLow = Val & 0xff;
3966 if (!(FeatureBits[ARM::HasV7Ops]))
3974 if (!(FeatureBits[ARM::HasV8MMainlineOps]))
3984 if (!(FeatureBits[ARM::Feature8MSecExt]))
4003 if (!(FeatureBits[ARM::FeaturePACBTI]))
4014 if (!(FeatureBits[ARM::HasV7Ops])) {
4027 if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4028 (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
4050 if (!ARMBankedReg::lookupBankedRegByEncoding((R << 5) | SysM))
4092 if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
4768 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4794 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4830 unsigned LowBit = mask & -mask;
4831 unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
4832 mask ^= BitsAboveLowBit;
4852 bool writeback = (W == 1) | (
P == 0);
4854 addr |= (U << 8) | (Rn << 9);
4856 if (writeback && (Rn == Rt || Rn == Rt2))
4889 bool writeback = (W == 1) | (
P == 0);
4891 addr |= (U << 8) | (Rn << 9);
4893 if (writeback && (Rn == Rt || Rn == Rt2))
4961 if (Rt == Rn || Rn == Rt2)
4980 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
4993 if (!(imm & 0x38)) {
5039 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5052 if (!(imm & 0x38)) {
5111 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5113 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5115 if (!
Check(S, DestRegDecoder(Inst, Vn, Address, Decoder)))
5165 if ((cop & ~0x1) == 0xa)
5210 case ARM::VMSR_FPSCR_NZCVQC:
5221 if (featureBits[ARM::ModeThumb] && !featureBits[ARM::HasV8Ops]) {
5222 if (Rt == 13 || Rt == 15)
5231 case ARM::VMRS_FPSCR_NZCVQC:
5239 if (featureBits[ARM::ModeThumb]) {
5251template <
bool isSigned,
bool isNeg,
bool zeroPermitted,
int size>
5256 if (Val == 0 && !zeroPermitted)
5263 DecVal = (Val << 1);
5276 Val = LocImm + (2 << Val);
5302 case ARM::t2LEUpdate:
5309 Inst, Imm, Address, Decoder)))
5313 case ARM::MVE_WLSTP_8:
5314 case ARM::MVE_WLSTP_16:
5315 case ARM::MVE_WLSTP_32:
5316 case ARM::MVE_WLSTP_64:
5320 Address, Decoder)) ||
5322 Inst, Imm, Address, Decoder)))
5326 case ARM::MVE_DLSTP_8:
5327 case ARM::MVE_DLSTP_16:
5328 case ARM::MVE_DLSTP_32:
5329 case ARM::MVE_DLSTP_64:
5335 uint32_t CanonicalLCTP = 0xF00FE001, SBZMask = 0x00300FFE;
5336 if ((Insn & ~SBZMask) != CanonicalLCTP)
5338 if (Insn != CanonicalLCTP)
5370 if ((RegNo) + 1 > 11)
5416 }
else if (Inst.
getOpcode() == ARM::VSCCLRMD) {
5427 unsigned max_reg = Vd + regs;
5428 if (max_reg > 64 || (max_reg > 32 && (max_reg & 1)))
5430 unsigned max_sreg = std::min(32u, max_reg);
5431 unsigned max_dreg = std::min(32u, max_reg / 2);
5432 for (
unsigned i = Vd; i < max_sreg; ++i)
5435 for (
unsigned i = 16; i < max_dreg; ++i)
5454 unsigned CurBit = 0;
5455 for (
int i = 3; i >= 0; --i) {
5458 CurBit ^= (Val >> i) & 1U;
5461 Imm |= (CurBit << i);
5464 if ((Val & ~(~0U << i)) == 0) {
5510 switch (Val & 0x3) {
5571 unsigned DecodedVal = 64 - Val;
5574 case ARM::MVE_VCVTf16s16_fix:
5575 case ARM::MVE_VCVTs16f16_fix:
5576 case ARM::MVE_VCVTf16u16_fix:
5577 case ARM::MVE_VCVTu16f16_fix:
5578 if (DecodedVal > 16)
5581 case ARM::MVE_VCVTf32s32_fix:
5582 case ARM::MVE_VCVTs32f32_fix:
5583 case ARM::MVE_VCVTf32u32_fix:
5584 case ARM::MVE_VCVTu32f32_fix:
5585 if (DecodedVal > 32)
5597 case ARM::VSTR_P0_off:
5598 case ARM::VSTR_P0_pre:
5599 case ARM::VSTR_P0_post:
5600 case ARM::VLDR_P0_off:
5601 case ARM::VLDR_P0_pre:
5602 case ARM::VLDR_P0_post:
5604 case ARM::VSTR_FPSCR_NZCVQC_off:
5605 case ARM::VSTR_FPSCR_NZCVQC_pre:
5606 case ARM::VSTR_FPSCR_NZCVQC_post:
5607 case ARM::VLDR_FPSCR_NZCVQC_off:
5608 case ARM::VLDR_FPSCR_NZCVQC_pre:
5609 case ARM::VLDR_FPSCR_NZCVQC_post:
5616template <
bool Writeback>
5621 case ARM::VSTR_FPSCR_pre:
5622 case ARM::VSTR_FPSCR_NZCVQC_pre:
5623 case ARM::VLDR_FPSCR_pre:
5624 case ARM::VLDR_FPSCR_NZCVQC_pre:
5625 case ARM::VSTR_FPSCR_off:
5626 case ARM::VSTR_FPSCR_NZCVQC_off:
5627 case ARM::VLDR_FPSCR_off:
5628 case ARM::VLDR_FPSCR_NZCVQC_off:
5629 case ARM::VSTR_FPSCR_post:
5630 case ARM::VSTR_FPSCR_NZCVQC_post:
5631 case ARM::VLDR_FPSCR_post:
5632 case ARM::VLDR_FPSCR_NZCVQC_post:
5636 if (!featureBits[ARM::HasMVEIntegerOps] && !featureBits[ARM::FeatureVFP2])
5670 if (!
Check(S, RnDecoder(Inst, Rn, Address, Decoder)))
5674 if (!
Check(S, AddrDecoder(Inst, addr, Address, Decoder)))
5710template <
unsigned MinLog,
unsigned MaxLog>
5716 if (Val < MinLog || Val > MaxLog)
5723template <
unsigned start>
5802 case ARM::MVE_ASRLr:
5803 case ARM::MVE_SQRSHRL:
5806 case ARM::MVE_LSLLr:
5807 case ARM::MVE_UQRSHLL:
5854 if (Inst.
getOpcode() == ARM::MVE_SQRSHRL ||
5884template <
bool scalar, OperandDecoder predicate_decoder>
5912 if (!
Check(S, predicate_decoder(Inst, fc, Address, Decoder)))
5959 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm12 : ARM::t2ADDspImm12);
5962 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm : ARM::t2ADDspImm);
5992#include "ARMGenDisassemblerTables.inc"
5999 switch (
MI.getOpcode()) {
6011 case ARM::t2ADDri12:
6015 case ARM::t2SUBri12:
6018 if (
MI.getOperand(0).getReg() == ARM::SP &&
6019 MI.getOperand(1).getReg() != ARM::SP)
6022 default:
return Result;
6031 if (!STI.hasFeature(ARM::ModeThumb))
6046 if (Bytes.
size() < 2)
6050 Bytes.
data(), InstructionEndianness);
6051 return Insn16 < 0xE800 ? 2 : 4;
6055 ArrayRef<uint8_t> Bytes,
6057 raw_ostream &CS)
const {
6059 if (STI.hasFeature(ARM::ModeThumb))
6063 if (S == DecodeStatus::Fail)
6067 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6071 Twine(
MI.getNumOperands()) +
"\n");
6078 ArrayRef<uint8_t> Bytes,
6080 raw_ostream &CS)
const {
6081 CommentStream = &CS;
6083 assert(!STI.hasFeature(ARM::ModeThumb) &&
6084 "Asked to disassemble an ARM instruction but Subtarget is in Thumb "
6088 if (Bytes.
size() < 4) {
6095 InstructionEndianness);
6099 decodeInstruction(DecoderTableARM32,
MI, Insn,
Address,
this, STI);
6105 struct DecodeTable {
6110 const DecodeTable Tables[] = {
6111 {DecoderTableVFP32,
false}, {DecoderTableVFPV832,
false},
6112 {DecoderTableNEONData32,
true}, {DecoderTableNEONLoadStore32,
true},
6113 {DecoderTableNEONDup32,
false}, {DecoderTablev8NEON32,
false},
6114 {DecoderTablev8Crypto32,
false},
6117 for (
auto Table : Tables) {
6123 if (Table.DecodePred && MCII->get(
MI.getOpcode()).isPredicable()) {
6132 decodeInstruction(DecoderTableCoProc32,
MI, Insn,
Address,
this, STI);
6142bool ARMDisassembler::isVectorPredicable(
const MCInst &
MI)
const {
6143 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6156ARMDisassembler::AddThumbPredicate(MCInst &
MI)
const {
6159 const FeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
6163 switch (
MI.getOpcode()) {
6180 if (ITBlock.instrInITBlock())
6186 if (
MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
6195 if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
6212 if (ITBlock.instrInITBlock()) {
6213 CC = ITBlock.getITCC();
6214 ITBlock.advanceITState();
6215 }
else if (VPTBlock.instrInVPTBlock()) {
6216 VCC = VPTBlock.getVPTPred();
6217 VPTBlock.advanceVPTState();
6220 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6223 for (
unsigned i = 0; i < MCID.
NumOperands; ++i, ++CCI) {
6224 if (MCID.
operands()[i].isPredicate() || CCI ==
MI.end())
6241 for (VCCPos = 0; VCCPos < MCID.
NumOperands; ++VCCPos, ++VCCI) {
6259 "Inactive register in vpred_r is not tied to an output!");
6261 MI.insert(VCCI, MCOperand(
MI.getOperand(TiedOp)));
6275void ARMDisassembler::UpdateThumbPredicate(
DecodeStatus &S, MCInst &
MI)
const {
6277 CC = ITBlock.getITCC();
6280 if (ITBlock.instrInITBlock())
6281 ITBlock.advanceITState();
6282 else if (VPTBlock.instrInVPTBlock()) {
6283 CC = VPTBlock.getVPTPred();
6284 VPTBlock.advanceVPTState();
6287 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6291 for (
unsigned i = 0; i <
NumOps; ++i, ++
I) {
6292 if (OpInfo[i].isPredicate() ) {
6298 I->setReg(ARM::NoRegister);
6300 I->setReg(ARM::CPSR);
6307 ArrayRef<uint8_t> Bytes,
6309 raw_ostream &CS)
const {
6310 CommentStream = &CS;
6312 assert(STI.hasFeature(ARM::ModeThumb) &&
6313 "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
6316 if (Bytes.
size() < 2) {
6322 Bytes.
data(), InstructionEndianness);
6324 decodeInstruction(DecoderTableThumb16,
MI, Insn16,
Address,
this, STI);
6327 Check(Result, AddThumbPredicate(
MI));
6331 Result = decodeInstruction(DecoderTableThumbSBit16,
MI, Insn16,
Address,
this,
6335 Check(Result, AddThumbPredicate(
MI));
6340 decodeInstruction(DecoderTableThumb216,
MI, Insn16,
Address,
this, STI);
6346 if (
MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
6349 Check(Result, AddThumbPredicate(
MI));
6354 if (
MI.getOpcode() == ARM::t2IT) {
6355 unsigned Firstcond =
MI.getOperand(0).getImm();
6356 unsigned Mask =
MI.getOperand(1).getImm();
6357 ITBlock.setITState(Firstcond, Mask);
6361 CS <<
"unpredictable IT predicate sequence";
6368 if (Bytes.
size() < 4) {
6375 Bytes.
data() + 2, InstructionEndianness);
6378 decodeInstruction(DecoderTableMVE32,
MI, Insn32,
Address,
this, STI);
6384 if (
isVPTOpcode(
MI.getOpcode()) && VPTBlock.instrInVPTBlock())
6387 Check(Result, AddThumbPredicate(
MI));
6390 unsigned Mask =
MI.getOperand(0).getImm();
6391 VPTBlock.setVPTState(Mask);
6398 decodeInstruction(DecoderTableThumb32,
MI, Insn32,
Address,
this, STI);
6401 Check(Result, AddThumbPredicate(
MI));
6406 decodeInstruction(DecoderTableThumb232,
MI, Insn32,
Address,
this, STI);
6409 Check(Result, AddThumbPredicate(
MI));
6415 decodeInstruction(DecoderTableVFP32,
MI, Insn32,
Address,
this, STI);
6418 UpdateThumbPredicate(Result,
MI);
6424 decodeInstruction(DecoderTableVFPV832,
MI, Insn32,
Address,
this, STI);
6431 Result = decodeInstruction(DecoderTableNEONDup32,
MI, Insn32,
Address,
this,
6435 UpdateThumbPredicate(Result,
MI);
6441 uint32_t NEONLdStInsn = Insn32;
6442 NEONLdStInsn &= 0xF0FFFFFF;
6443 NEONLdStInsn |= 0x04000000;
6444 Result = decodeInstruction(DecoderTableNEONLoadStore32,
MI, NEONLdStInsn,
6448 Check(Result, AddThumbPredicate(
MI));
6454 uint32_t NEONDataInsn = Insn32;
6455 NEONDataInsn &= 0xF0FFFFFF;
6456 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4;
6457 NEONDataInsn |= 0x12000000;
6458 Result = decodeInstruction(DecoderTableNEONData32,
MI, NEONDataInsn,
6462 Check(Result, AddThumbPredicate(
MI));
6466 uint32_t NEONCryptoInsn = Insn32;
6467 NEONCryptoInsn &= 0xF0FFFFFF;
6468 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4;
6469 NEONCryptoInsn |= 0x12000000;
6470 Result = decodeInstruction(DecoderTablev8Crypto32,
MI, NEONCryptoInsn,
6477 uint32_t NEONv8Insn = Insn32;
6478 NEONv8Insn &= 0xF3FFFFFF;
6479 Result = decodeInstruction(DecoderTablev8NEON32,
MI, NEONv8Insn,
Address,
6489 ? DecoderTableThumb2CDE32
6490 : DecoderTableThumb2CoProc32;
6492 decodeInstruction(DecoderTable,
MI, Insn32,
Address,
this, STI);
6495 Check(Result, AddThumbPredicate(
MI));
6501 if (ITBlock.instrInITBlock())
6502 ITBlock.advanceITState();
6510 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)
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
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
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.
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.
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.