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();
635 const auto *
D =
static_cast<const ARMDisassembler *
>(Decoder);
637 MCRegister CCR =
D->ITBlock.instrInITBlock() ? ARM::NoRegister : ARM::CPSR;
674 unsigned Op = Shift | (imm << 3);
721 bool NeedDisjointWriteback =
false;
731 case ARM::t2LDMIA_UPD:
732 case ARM::t2LDMDB_UPD:
733 case ARM::t2STMIA_UPD:
734 case ARM::t2STMDB_UPD:
735 NeedDisjointWriteback =
true;
745 for (
unsigned i = 0; i < 16; ++i) {
746 if (Val & (1 << i)) {
755 if (NeedDisjointWriteback && WritebackReg == Inst.
end()[-1].getReg())
773 if (regs == 0 || (Vd + regs) > 32) {
774 regs = Vd + regs > 32 ? 32 - Vd : regs;
775 regs = std::max( 1u, regs);
781 for (
unsigned i = 0; i < (regs - 1); ++i) {
798 unsigned MaxReg =
PermitsD32(Inst, Decoder) ? 32 : 16;
799 if (regs == 0 || (Vd + regs) > MaxReg) {
800 regs = Vd + regs > MaxReg ? MaxReg - Vd : regs;
801 regs = std::max( 1u, regs);
802 regs = std::min(MaxReg, regs);
808 for (
unsigned i = 0; i < (regs - 1); ++i) {
837 if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
838 uint32_t lsb_mask = (1U << lsb) - 1;
859 case ARM::LDC_OFFSET:
862 case ARM::LDC_OPTION:
863 case ARM::LDCL_OFFSET:
866 case ARM::LDCL_OPTION:
867 case ARM::STC_OFFSET:
870 case ARM::STC_OPTION:
871 case ARM::STCL_OFFSET:
874 case ARM::STCL_OPTION:
875 case ARM::t2LDC_OFFSET:
877 case ARM::t2LDC_POST:
878 case ARM::t2LDC_OPTION:
879 case ARM::t2LDCL_OFFSET:
880 case ARM::t2LDCL_PRE:
881 case ARM::t2LDCL_POST:
882 case ARM::t2LDCL_OPTION:
883 case ARM::t2STC_OFFSET:
885 case ARM::t2STC_POST:
886 case ARM::t2STC_OPTION:
887 case ARM::t2STCL_OFFSET:
888 case ARM::t2STCL_PRE:
889 case ARM::t2STCL_POST:
890 case ARM::t2STCL_OPTION:
891 case ARM::t2LDC2_OFFSET:
892 case ARM::t2LDC2L_OFFSET:
893 case ARM::t2LDC2_PRE:
894 case ARM::t2LDC2L_PRE:
895 case ARM::t2STC2_OFFSET:
896 case ARM::t2STC2L_OFFSET:
897 case ARM::t2STC2_PRE:
898 case ARM::t2STC2L_PRE:
899 case ARM::LDC2_OFFSET:
900 case ARM::LDC2L_OFFSET:
903 case ARM::STC2_OFFSET:
904 case ARM::STC2L_OFFSET:
907 case ARM::t2LDC2_OPTION:
908 case ARM::t2STC2_OPTION:
909 case ARM::t2LDC2_POST:
910 case ARM::t2LDC2L_POST:
911 case ARM::t2STC2_POST:
912 case ARM::t2STC2L_POST:
914 case ARM::LDC2L_POST:
916 case ARM::STC2L_POST:
917 if (coproc == 0xA || coproc == 0xB ||
918 (featureBits[ARM::HasV8_1MMainlineOps] &&
919 (coproc == 0x8 || coproc == 0x9 || coproc == 0xA || coproc == 0xB ||
920 coproc == 0xE || coproc == 0xF)))
927 if (featureBits[ARM::HasV8Ops] && (coproc != 14))
936 case ARM::t2LDC2_OFFSET:
937 case ARM::t2LDC2L_OFFSET:
938 case ARM::t2LDC2_PRE:
939 case ARM::t2LDC2L_PRE:
940 case ARM::t2STC2_OFFSET:
941 case ARM::t2STC2L_OFFSET:
942 case ARM::t2STC2_PRE:
943 case ARM::t2STC2L_PRE:
944 case ARM::LDC2_OFFSET:
945 case ARM::LDC2L_OFFSET:
948 case ARM::STC2_OFFSET:
949 case ARM::STC2L_OFFSET:
952 case ARM::t2LDC_OFFSET:
953 case ARM::t2LDCL_OFFSET:
955 case ARM::t2LDCL_PRE:
956 case ARM::t2STC_OFFSET:
957 case ARM::t2STCL_OFFSET:
959 case ARM::t2STCL_PRE:
960 case ARM::LDC_OFFSET:
961 case ARM::LDCL_OFFSET:
964 case ARM::STC_OFFSET:
965 case ARM::STCL_OFFSET:
971 case ARM::t2LDC2_POST:
972 case ARM::t2LDC2L_POST:
973 case ARM::t2STC2_POST:
974 case ARM::t2STC2L_POST:
976 case ARM::LDC2L_POST:
978 case ARM::STC2L_POST:
979 case ARM::t2LDC_POST:
980 case ARM::t2LDCL_POST:
981 case ARM::t2STC_POST:
982 case ARM::t2STCL_POST:
997 case ARM::LDC_OFFSET:
1000 case ARM::LDC_OPTION:
1001 case ARM::LDCL_OFFSET:
1003 case ARM::LDCL_POST:
1004 case ARM::LDCL_OPTION:
1005 case ARM::STC_OFFSET:
1008 case ARM::STC_OPTION:
1009 case ARM::STCL_OFFSET:
1011 case ARM::STCL_POST:
1012 case ARM::STCL_OPTION:
1039 case ARM::STR_POST_IMM:
1040 case ARM::STR_POST_REG:
1041 case ARM::STRB_POST_IMM:
1042 case ARM::STRB_POST_REG:
1043 case ARM::STRT_POST_REG:
1044 case ARM::STRT_POST_IMM:
1045 case ARM::STRBT_POST_REG:
1046 case ARM::STRBT_POST_IMM:
1059 case ARM::LDR_POST_IMM:
1060 case ARM::LDR_POST_REG:
1061 case ARM::LDRB_POST_IMM:
1062 case ARM::LDRB_POST_REG:
1063 case ARM::LDRBT_POST_REG:
1064 case ARM::LDRBT_POST_IMM:
1065 case ARM::LDRT_POST_REG:
1066 case ARM::LDRT_POST_IMM:
1081 bool writeback = (
P == 0) || (W == 1);
1082 unsigned idx_mode = 0;
1085 else if (!
P && writeback)
1088 if (writeback && (Rn == 15 || Rn == Rt))
1200 unsigned Rt2 = Rt + 1;
1202 bool writeback = (W == 1) | (
P == 0);
1208 case ARM::STRD_POST:
1211 case ARM::LDRD_POST:
1220 case ARM::STRD_POST:
1221 if (
P == 0 && W == 1)
1224 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1226 if (type && Rm == 15)
1235 case ARM::STRH_POST:
1238 if (writeback && (Rn == 15 || Rn == Rt))
1240 if (!type && Rm == 15)
1245 case ARM::LDRD_POST:
1246 if (type && Rn == 15) {
1251 if (
P == 0 && W == 1)
1253 if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1255 if (!type && writeback && Rn == 15)
1257 if (writeback && (Rn == Rt || Rn == Rt2))
1262 case ARM::LDRH_POST:
1263 if (type && Rn == 15) {
1270 if (!type && Rm == 15)
1272 if (!type && writeback && (Rn == 15 || Rn == Rt))
1276 case ARM::LDRSH_PRE:
1277 case ARM::LDRSH_POST:
1279 case ARM::LDRSB_PRE:
1280 case ARM::LDRSB_POST:
1281 if (type && Rn == 15) {
1286 if (type && (Rt == 15 || (writeback && Rn == Rt)))
1288 if (!type && (Rt == 15 || Rm == 15))
1290 if (!type && writeback && (Rn == 15 || Rn == Rt))
1307 case ARM::STRD_POST:
1310 case ARM::STRH_POST:
1324 case ARM::STRD_POST:
1327 case ARM::LDRD_POST:
1340 case ARM::LDRD_POST:
1343 case ARM::LDRH_POST:
1345 case ARM::LDRSH_PRE:
1346 case ARM::LDRSH_POST:
1348 case ARM::LDRSB_PRE:
1349 case ARM::LDRSB_POST:
1419 }
else if (imod && !M) {
1424 }
else if (!imod && M) {
1478 case ARM::LDMDA_UPD:
1484 case ARM::LDMDB_UPD:
1490 case ARM::LDMIA_UPD:
1496 case ARM::LDMIB_UPD:
1502 case ARM::STMDA_UPD:
1508 case ARM::STMDB_UPD:
1514 case ARM::STMIA_UPD:
1520 case ARM::STMIB_UPD:
1572 if (imm8 == 0x10 && pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
1600 }
else if (imod && !M) {
1605 }
else if (!imod && M) {
1626 unsigned Opcode = ARM::t2HINT;
1629 Opcode = ARM::t2PACBTI;
1630 }
else if (imm == 0x1D) {
1631 Opcode = ARM::t2PAC;
1632 }
else if (imm == 0x2D) {
1633 Opcode = ARM::t2AUT;
1634 }
else if (imm == 0x0F) {
1635 Opcode = ARM::t2BTI;
1639 if (Opcode == ARM::t2HINT) {
1738 if (!FeatureBits[ARM::HasV8_1aOps] ||
1739 !FeatureBits[ARM::HasV8Ops])
1791 if (!add) imm *= -1;
1792 if (imm == 0 && !add) imm = INT32_MIN;
1862 unsigned I1 = !(J1 ^ S);
1863 unsigned I2 = !(J2 ^ S);
1866 unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
1869 true, 4, Inst, Decoder))
1887 true, 4, Inst, Decoder))
1893 true, 4, Inst, Decoder))
1937 case ARM::VLD1q16:
case ARM::VLD1q32:
case ARM::VLD1q64:
case ARM::VLD1q8:
1938 case ARM::VLD1q16wb_fixed:
case ARM::VLD1q16wb_register:
1939 case ARM::VLD1q32wb_fixed:
case ARM::VLD1q32wb_register:
1940 case ARM::VLD1q64wb_fixed:
case ARM::VLD1q64wb_register:
1941 case ARM::VLD1q8wb_fixed:
case ARM::VLD1q8wb_register:
1942 case ARM::VLD2d16:
case ARM::VLD2d32:
case ARM::VLD2d8:
1943 case ARM::VLD2d16wb_fixed:
case ARM::VLD2d16wb_register:
1944 case ARM::VLD2d32wb_fixed:
case ARM::VLD2d32wb_register:
1945 case ARM::VLD2d8wb_fixed:
case ARM::VLD2d8wb_register:
1952 case ARM::VLD2b16wb_fixed:
1953 case ARM::VLD2b16wb_register:
1954 case ARM::VLD2b32wb_fixed:
1955 case ARM::VLD2b32wb_register:
1956 case ARM::VLD2b8wb_fixed:
1957 case ARM::VLD2b8wb_register:
1971 case ARM::VLD3d8_UPD:
1972 case ARM::VLD3d16_UPD:
1973 case ARM::VLD3d32_UPD:
1977 case ARM::VLD4d8_UPD:
1978 case ARM::VLD4d16_UPD:
1979 case ARM::VLD4d32_UPD:
1986 case ARM::VLD3q8_UPD:
1987 case ARM::VLD3q16_UPD:
1988 case ARM::VLD3q32_UPD:
1992 case ARM::VLD4q8_UPD:
1993 case ARM::VLD4q16_UPD:
1994 case ARM::VLD4q32_UPD:
2007 case ARM::VLD3d8_UPD:
2008 case ARM::VLD3d16_UPD:
2009 case ARM::VLD3d32_UPD:
2013 case ARM::VLD4d8_UPD:
2014 case ARM::VLD4d16_UPD:
2015 case ARM::VLD4d32_UPD:
2022 case ARM::VLD3q8_UPD:
2023 case ARM::VLD3q16_UPD:
2024 case ARM::VLD3q32_UPD:
2028 case ARM::VLD4q8_UPD:
2029 case ARM::VLD4q16_UPD:
2030 case ARM::VLD4q32_UPD:
2043 case ARM::VLD4d8_UPD:
2044 case ARM::VLD4d16_UPD:
2045 case ARM::VLD4d32_UPD:
2052 case ARM::VLD4q8_UPD:
2053 case ARM::VLD4q16_UPD:
2054 case ARM::VLD4q32_UPD:
2064 case ARM::VLD1d8wb_fixed:
2065 case ARM::VLD1d16wb_fixed:
2066 case ARM::VLD1d32wb_fixed:
2067 case ARM::VLD1d64wb_fixed:
2068 case ARM::VLD1d8wb_register:
2069 case ARM::VLD1d16wb_register:
2070 case ARM::VLD1d32wb_register:
2071 case ARM::VLD1d64wb_register:
2072 case ARM::VLD1q8wb_fixed:
2073 case ARM::VLD1q16wb_fixed:
2074 case ARM::VLD1q32wb_fixed:
2075 case ARM::VLD1q64wb_fixed:
2076 case ARM::VLD1q8wb_register:
2077 case ARM::VLD1q16wb_register:
2078 case ARM::VLD1q32wb_register:
2079 case ARM::VLD1q64wb_register:
2080 case ARM::VLD1d8Twb_fixed:
2081 case ARM::VLD1d8Twb_register:
2082 case ARM::VLD1d16Twb_fixed:
2083 case ARM::VLD1d16Twb_register:
2084 case ARM::VLD1d32Twb_fixed:
2085 case ARM::VLD1d32Twb_register:
2086 case ARM::VLD1d64Twb_fixed:
2087 case ARM::VLD1d64Twb_register:
2088 case ARM::VLD1d8Qwb_fixed:
2089 case ARM::VLD1d8Qwb_register:
2090 case ARM::VLD1d16Qwb_fixed:
2091 case ARM::VLD1d16Qwb_register:
2092 case ARM::VLD1d32Qwb_fixed:
2093 case ARM::VLD1d32Qwb_register:
2094 case ARM::VLD1d64Qwb_fixed:
2095 case ARM::VLD1d64Qwb_register:
2096 case ARM::VLD2d8wb_fixed:
2097 case ARM::VLD2d16wb_fixed:
2098 case ARM::VLD2d32wb_fixed:
2099 case ARM::VLD2q8wb_fixed:
2100 case ARM::VLD2q16wb_fixed:
2101 case ARM::VLD2q32wb_fixed:
2102 case ARM::VLD2d8wb_register:
2103 case ARM::VLD2d16wb_register:
2104 case ARM::VLD2d32wb_register:
2105 case ARM::VLD2q8wb_register:
2106 case ARM::VLD2q16wb_register:
2107 case ARM::VLD2q32wb_register:
2108 case ARM::VLD2b8wb_fixed:
2109 case ARM::VLD2b16wb_fixed:
2110 case ARM::VLD2b32wb_fixed:
2111 case ARM::VLD2b8wb_register:
2112 case ARM::VLD2b16wb_register:
2113 case ARM::VLD2b32wb_register:
2116 case ARM::VLD3d8_UPD:
2117 case ARM::VLD3d16_UPD:
2118 case ARM::VLD3d32_UPD:
2119 case ARM::VLD3q8_UPD:
2120 case ARM::VLD3q16_UPD:
2121 case ARM::VLD3q32_UPD:
2122 case ARM::VLD4d8_UPD:
2123 case ARM::VLD4d16_UPD:
2124 case ARM::VLD4d32_UPD:
2125 case ARM::VLD4q8_UPD:
2126 case ARM::VLD4q16_UPD:
2127 case ARM::VLD4q32_UPD:
2154 case ARM::VLD1d8wb_fixed:
2155 case ARM::VLD1d16wb_fixed:
2156 case ARM::VLD1d32wb_fixed:
2157 case ARM::VLD1d64wb_fixed:
2158 case ARM::VLD1d8Twb_fixed:
2159 case ARM::VLD1d16Twb_fixed:
2160 case ARM::VLD1d32Twb_fixed:
2161 case ARM::VLD1d64Twb_fixed:
2162 case ARM::VLD1d8Qwb_fixed:
2163 case ARM::VLD1d16Qwb_fixed:
2164 case ARM::VLD1d32Qwb_fixed:
2165 case ARM::VLD1d64Qwb_fixed:
2166 case ARM::VLD1d8wb_register:
2167 case ARM::VLD1d16wb_register:
2168 case ARM::VLD1d32wb_register:
2169 case ARM::VLD1d64wb_register:
2170 case ARM::VLD1q8wb_fixed:
2171 case ARM::VLD1q16wb_fixed:
2172 case ARM::VLD1q32wb_fixed:
2173 case ARM::VLD1q64wb_fixed:
2174 case ARM::VLD1q8wb_register:
2175 case ARM::VLD1q16wb_register:
2176 case ARM::VLD1q32wb_register:
2177 case ARM::VLD1q64wb_register:
2181 if (Rm != 0xD && Rm != 0xF &&
2185 case ARM::VLD2d8wb_fixed:
2186 case ARM::VLD2d16wb_fixed:
2187 case ARM::VLD2d32wb_fixed:
2188 case ARM::VLD2b8wb_fixed:
2189 case ARM::VLD2b16wb_fixed:
2190 case ARM::VLD2b32wb_fixed:
2191 case ARM::VLD2q8wb_fixed:
2192 case ARM::VLD2q16wb_fixed:
2193 case ARM::VLD2q32wb_fixed:
2214 case ARM::VST1d8wb_fixed:
2215 case ARM::VST1d16wb_fixed:
2216 case ARM::VST1d32wb_fixed:
2217 case ARM::VST1d64wb_fixed:
2218 case ARM::VST1d8wb_register:
2219 case ARM::VST1d16wb_register:
2220 case ARM::VST1d32wb_register:
2221 case ARM::VST1d64wb_register:
2222 case ARM::VST1q8wb_fixed:
2223 case ARM::VST1q16wb_fixed:
2224 case ARM::VST1q32wb_fixed:
2225 case ARM::VST1q64wb_fixed:
2226 case ARM::VST1q8wb_register:
2227 case ARM::VST1q16wb_register:
2228 case ARM::VST1q32wb_register:
2229 case ARM::VST1q64wb_register:
2230 case ARM::VST1d8Twb_fixed:
2231 case ARM::VST1d16Twb_fixed:
2232 case ARM::VST1d32Twb_fixed:
2233 case ARM::VST1d64Twb_fixed:
2234 case ARM::VST1d8Twb_register:
2235 case ARM::VST1d16Twb_register:
2236 case ARM::VST1d32Twb_register:
2237 case ARM::VST1d64Twb_register:
2238 case ARM::VST1d8Qwb_fixed:
2239 case ARM::VST1d16Qwb_fixed:
2240 case ARM::VST1d32Qwb_fixed:
2241 case ARM::VST1d64Qwb_fixed:
2242 case ARM::VST1d8Qwb_register:
2243 case ARM::VST1d16Qwb_register:
2244 case ARM::VST1d32Qwb_register:
2245 case ARM::VST1d64Qwb_register:
2246 case ARM::VST2d8wb_fixed:
2247 case ARM::VST2d16wb_fixed:
2248 case ARM::VST2d32wb_fixed:
2249 case ARM::VST2d8wb_register:
2250 case ARM::VST2d16wb_register:
2251 case ARM::VST2d32wb_register:
2252 case ARM::VST2q8wb_fixed:
2253 case ARM::VST2q16wb_fixed:
2254 case ARM::VST2q32wb_fixed:
2255 case ARM::VST2q8wb_register:
2256 case ARM::VST2q16wb_register:
2257 case ARM::VST2q32wb_register:
2258 case ARM::VST2b8wb_fixed:
2259 case ARM::VST2b16wb_fixed:
2260 case ARM::VST2b32wb_fixed:
2261 case ARM::VST2b8wb_register:
2262 case ARM::VST2b16wb_register:
2263 case ARM::VST2b32wb_register:
2268 case ARM::VST3d8_UPD:
2269 case ARM::VST3d16_UPD:
2270 case ARM::VST3d32_UPD:
2271 case ARM::VST3q8_UPD:
2272 case ARM::VST3q16_UPD:
2273 case ARM::VST3q32_UPD:
2274 case ARM::VST4d8_UPD:
2275 case ARM::VST4d16_UPD:
2276 case ARM::VST4d32_UPD:
2277 case ARM::VST4q8_UPD:
2278 case ARM::VST4q16_UPD:
2279 case ARM::VST4q32_UPD:
2296 else if (Rm != 0xF) {
2301 case ARM::VST1d8wb_fixed:
2302 case ARM::VST1d16wb_fixed:
2303 case ARM::VST1d32wb_fixed:
2304 case ARM::VST1d64wb_fixed:
2305 case ARM::VST1q8wb_fixed:
2306 case ARM::VST1q16wb_fixed:
2307 case ARM::VST1q32wb_fixed:
2308 case ARM::VST1q64wb_fixed:
2309 case ARM::VST1d8Twb_fixed:
2310 case ARM::VST1d16Twb_fixed:
2311 case ARM::VST1d32Twb_fixed:
2312 case ARM::VST1d64Twb_fixed:
2313 case ARM::VST1d8Qwb_fixed:
2314 case ARM::VST1d16Qwb_fixed:
2315 case ARM::VST1d32Qwb_fixed:
2316 case ARM::VST1d64Qwb_fixed:
2317 case ARM::VST2d8wb_fixed:
2318 case ARM::VST2d16wb_fixed:
2319 case ARM::VST2d32wb_fixed:
2320 case ARM::VST2q8wb_fixed:
2321 case ARM::VST2q16wb_fixed:
2322 case ARM::VST2q32wb_fixed:
2323 case ARM::VST2b8wb_fixed:
2324 case ARM::VST2b16wb_fixed:
2325 case ARM::VST2b32wb_fixed:
2335 case ARM::VST1q16wb_fixed:
2336 case ARM::VST1q16wb_register:
2337 case ARM::VST1q32wb_fixed:
2338 case ARM::VST1q32wb_register:
2339 case ARM::VST1q64wb_fixed:
2340 case ARM::VST1q64wb_register:
2341 case ARM::VST1q8wb_fixed:
2342 case ARM::VST1q8wb_register:
2346 case ARM::VST2d16wb_fixed:
2347 case ARM::VST2d16wb_register:
2348 case ARM::VST2d32wb_fixed:
2349 case ARM::VST2d32wb_register:
2350 case ARM::VST2d8wb_fixed:
2351 case ARM::VST2d8wb_register:
2358 case ARM::VST2b16wb_fixed:
2359 case ARM::VST2b16wb_register:
2360 case ARM::VST2b32wb_fixed:
2361 case ARM::VST2b32wb_register:
2362 case ARM::VST2b8wb_fixed:
2363 case ARM::VST2b8wb_register:
2377 case ARM::VST3d8_UPD:
2378 case ARM::VST3d16_UPD:
2379 case ARM::VST3d32_UPD:
2383 case ARM::VST4d8_UPD:
2384 case ARM::VST4d16_UPD:
2385 case ARM::VST4d32_UPD:
2392 case ARM::VST3q8_UPD:
2393 case ARM::VST3q16_UPD:
2394 case ARM::VST3q32_UPD:
2398 case ARM::VST4q8_UPD:
2399 case ARM::VST4q16_UPD:
2400 case ARM::VST4q32_UPD:
2413 case ARM::VST3d8_UPD:
2414 case ARM::VST3d16_UPD:
2415 case ARM::VST3d32_UPD:
2419 case ARM::VST4d8_UPD:
2420 case ARM::VST4d16_UPD:
2421 case ARM::VST4d32_UPD:
2428 case ARM::VST3q8_UPD:
2429 case ARM::VST3q16_UPD:
2430 case ARM::VST3q32_UPD:
2434 case ARM::VST4q8_UPD:
2435 case ARM::VST4q16_UPD:
2436 case ARM::VST4q32_UPD:
2449 case ARM::VST4d8_UPD:
2450 case ARM::VST4d16_UPD:
2451 case ARM::VST4d32_UPD:
2458 case ARM::VST4q8_UPD:
2459 case ARM::VST4q16_UPD:
2460 case ARM::VST4q32_UPD:
2538 if (
size == 0 && align == 1)
2540 align *= (1 <<
size);
2543 case ARM::VLD1DUPq16:
case ARM::VLD1DUPq32:
case ARM::VLD1DUPq8:
2544 case ARM::VLD1DUPq16wb_fixed:
case ARM::VLD1DUPq16wb_register:
2545 case ARM::VLD1DUPq32wb_fixed:
case ARM::VLD1DUPq32wb_register:
2546 case ARM::VLD1DUPq8wb_fixed:
case ARM::VLD1DUPq8wb_register:
2567 if (Rm != 0xD && Rm != 0xF &&
2588 case ARM::VLD2DUPd16:
case ARM::VLD2DUPd32:
case ARM::VLD2DUPd8:
2589 case ARM::VLD2DUPd16wb_fixed:
case ARM::VLD2DUPd16wb_register:
2590 case ARM::VLD2DUPd32wb_fixed:
case ARM::VLD2DUPd32wb_register:
2591 case ARM::VLD2DUPd8wb_fixed:
case ARM::VLD2DUPd8wb_register:
2595 case ARM::VLD2DUPd16x2:
case ARM::VLD2DUPd32x2:
case ARM::VLD2DUPd8x2:
2596 case ARM::VLD2DUPd16x2wb_fixed:
case ARM::VLD2DUPd16x2wb_register:
2597 case ARM::VLD2DUPd32x2wb_fixed:
case ARM::VLD2DUPd32x2wb_register:
2598 case ARM::VLD2DUPd8x2wb_fixed:
case ARM::VLD2DUPd8x2wb_register:
2615 if (Rm != 0xD && Rm != 0xF) {
2651 else if (Rm != 0xF) {
2704 else if (Rm != 0xF) {
2737 case ARM::VORRiv4i16:
2738 case ARM::VORRiv2i32:
2739 case ARM::VBICiv4i16:
2740 case ARM::VBICiv2i32:
2744 case ARM::VORRiv8i16:
2745 case ARM::VORRiv4i32:
2746 case ARM::VBICiv8i16:
2747 case ARM::VBICiv4i32:
2772 if (cmode == 0xF && Inst.
getOpcode() == ARM::MVE_VMVNimmi32)
2922 true, 2, Inst, Decoder))
2931 true, 4, Inst, Decoder))
2940 true, 2, Inst, Decoder))
2979 unsigned imm = Val << 2;
3038 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3042 case ARM::t2LDRBpci:
3043 case ARM::t2LDRHpci:
3046 case ARM::t2LDRSBpci:
3049 case ARM::t2LDRSHpci:
3091 bool hasMP = featureBits[ARM::FeatureMP];
3092 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3147 if (!hasV7Ops || !hasMP)
3166 int imm = Val & 0xFF;
3169 else if (!(Val & 0x100))
3239 bool hasMP = featureBits[ARM::FeatureMP];
3240 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3250 case ARM::t2LDRSBi8:
3256 case ARM::t2LDRSHi8:
3273 case ARM::t2LDRSHi8:
3279 case ARM::t2LDRSBi8:
3295 if (!hasV7Ops || !hasMP)
3319 case ARM::t2STRBi12:
3320 case ARM::t2STRHi12:
3348 bool hasMP = featureBits[ARM::FeatureMP];
3349 bool hasV7Ops = featureBits[ARM::HasV7Ops];
3356 case ARM::t2LDRHi12:
3359 case ARM::t2LDRSHi12:
3362 case ARM::t2LDRBi12:
3365 case ARM::t2LDRSBi12:
3382 case ARM::t2LDRSHi12:
3384 case ARM::t2LDRHi12:
3387 case ARM::t2LDRSBi12:
3402 case ARM::t2PLDWi12:
3403 if (!hasV7Ops || !hasMP)
3460 int imm = Val & 0xFF;
3462 if (!(Val & 0x100)) imm *= -1;
3474 int imm = Val & 0x7F;
3535 int imm = Val & 0x7F;
3538 else if (!(Val & 0x80))
3540 if (imm != INT32_MIN)
3541 imm *= (1U << shift);
3564template <
int shift,
int WriteBack>
3597 case ARM::t2LDR_PRE:
3598 case ARM::t2LDR_POST:
3601 case ARM::t2LDRB_PRE:
3602 case ARM::t2LDRB_POST:
3605 case ARM::t2LDRH_PRE:
3606 case ARM::t2LDRH_POST:
3609 case ARM::t2LDRSB_PRE:
3610 case ARM::t2LDRSB_POST:
3616 case ARM::t2LDRSH_PRE:
3617 case ARM::t2LDRSH_POST:
3671 }
else if (Inst.
getOpcode() == ARM::tADDspr) {
3741 if (imm != INT32_MIN)
3742 imm *= (1U << shift);
3758 unsigned S = (Val >> 23) & 1;
3759 unsigned J1 = (Val >> 22) & 1;
3760 unsigned J2 = (Val >> 21) & 1;
3761 unsigned I1 = !(J1 ^ S);
3762 unsigned I2 = !(J2 ^ S);
3763 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3767 (Address & ~2u) + imm32 + 4,
3768 true, 4, Inst, Decoder))
3776 if (Val == 0xA || Val == 0xB)
3823 if (pred == 0xE || pred == 0xF) {
3895 true, 2, Inst, Decoder))
3910 unsigned S = (Val >> 23) & 1;
3911 unsigned J1 = (Val >> 22) & 1;
3912 unsigned J2 = (Val >> 21) & 1;
3913 unsigned I1 = !(J1 ^ S);
3914 unsigned I2 = !(J2 ^ S);
3915 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
3919 true, 4, Inst, Decoder))
3940 if (FeatureBits[ARM::FeatureMClass]) {
3941 unsigned ValLow = Val & 0xff;
3960 if (!(FeatureBits[ARM::HasV7Ops]))
3968 if (!(FeatureBits[ARM::HasV8MMainlineOps]))
3978 if (!(FeatureBits[ARM::Feature8MSecExt]))
3997 if (!(FeatureBits[ARM::FeaturePACBTI]))
4008 if (!(FeatureBits[ARM::HasV7Ops])) {
4021 if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4022 (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
4044 if (!ARMBankedReg::lookupBankedRegByEncoding((R << 5) | SysM))
4086 if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
4762 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4788 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4824 unsigned LowBit = mask & -mask;
4825 unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
4826 mask ^= BitsAboveLowBit;
4846 bool writeback = (W == 1) | (
P == 0);
4848 addr |= (U << 8) | (Rn << 9);
4850 if (writeback && (Rn == Rt || Rn == Rt2))
4883 bool writeback = (W == 1) | (
P == 0);
4885 addr |= (U << 8) | (Rn << 9);
4887 if (writeback && (Rn == Rt || Rn == Rt2))
4955 if (Rt == Rn || Rn == Rt2)
4974 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
4987 if (!(imm & 0x38)) {
5033 bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5046 if (!(imm & 0x38)) {
5105 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5107 if (!
Check(S, DestRegDecoder(Inst, Vd, Address, Decoder)))
5109 if (!
Check(S, DestRegDecoder(Inst, Vn, Address, Decoder)))
5159 if ((cop & ~0x1) == 0xa)
5204 case ARM::VMSR_FPSCR_NZCVQC:
5215 if (featureBits[ARM::ModeThumb] && !featureBits[ARM::HasV8Ops]) {
5216 if (Rt == 13 || Rt == 15)
5225 case ARM::VMRS_FPSCR_NZCVQC:
5233 if (featureBits[ARM::ModeThumb]) {
5245template <
bool isSigned,
bool isNeg,
bool zeroPermitted,
int size>
5250 if (Val == 0 && !zeroPermitted)
5257 DecVal = (Val << 1);
5270 Val = LocImm + (2 << Val);
5296 case ARM::t2LEUpdate:
5303 Inst, Imm, Address, Decoder)))
5307 case ARM::MVE_WLSTP_8:
5308 case ARM::MVE_WLSTP_16:
5309 case ARM::MVE_WLSTP_32:
5310 case ARM::MVE_WLSTP_64:
5314 Address, Decoder)) ||
5316 Inst, Imm, Address, Decoder)))
5320 case ARM::MVE_DLSTP_8:
5321 case ARM::MVE_DLSTP_16:
5322 case ARM::MVE_DLSTP_32:
5323 case ARM::MVE_DLSTP_64:
5329 uint32_t CanonicalLCTP = 0xF00FE001, SBZMask = 0x00300FFE;
5330 if ((Insn & ~SBZMask) != CanonicalLCTP)
5332 if (Insn != CanonicalLCTP)
5364 if ((RegNo) + 1 > 11)
5410 }
else if (Inst.
getOpcode() == ARM::VSCCLRMD) {
5421 unsigned max_reg = Vd + regs;
5422 if (max_reg > 64 || (max_reg > 32 && (max_reg & 1)))
5424 unsigned max_sreg = std::min(32u, max_reg);
5425 unsigned max_dreg = std::min(32u, max_reg / 2);
5426 for (
unsigned i = Vd; i < max_sreg; ++i)
5429 for (
unsigned i = 16; i < max_dreg; ++i)
5448 unsigned CurBit = 0;
5449 for (
int i = 3; i >= 0; --i) {
5452 CurBit ^= (Val >> i) & 1U;
5455 Imm |= (CurBit << i);
5458 if ((Val & ~(~0U << i)) == 0) {
5504 switch (Val & 0x3) {
5565 unsigned DecodedVal = 64 - Val;
5568 case ARM::MVE_VCVTf16s16_fix:
5569 case ARM::MVE_VCVTs16f16_fix:
5570 case ARM::MVE_VCVTf16u16_fix:
5571 case ARM::MVE_VCVTu16f16_fix:
5572 if (DecodedVal > 16)
5575 case ARM::MVE_VCVTf32s32_fix:
5576 case ARM::MVE_VCVTs32f32_fix:
5577 case ARM::MVE_VCVTf32u32_fix:
5578 case ARM::MVE_VCVTu32f32_fix:
5579 if (DecodedVal > 32)
5591 case ARM::VSTR_P0_off:
5592 case ARM::VSTR_P0_pre:
5593 case ARM::VSTR_P0_post:
5594 case ARM::VLDR_P0_off:
5595 case ARM::VLDR_P0_pre:
5596 case ARM::VLDR_P0_post:
5598 case ARM::VSTR_FPSCR_NZCVQC_off:
5599 case ARM::VSTR_FPSCR_NZCVQC_pre:
5600 case ARM::VSTR_FPSCR_NZCVQC_post:
5601 case ARM::VLDR_FPSCR_NZCVQC_off:
5602 case ARM::VLDR_FPSCR_NZCVQC_pre:
5603 case ARM::VLDR_FPSCR_NZCVQC_post:
5610template <
bool Writeback>
5615 case ARM::VSTR_FPSCR_pre:
5616 case ARM::VSTR_FPSCR_NZCVQC_pre:
5617 case ARM::VLDR_FPSCR_pre:
5618 case ARM::VLDR_FPSCR_NZCVQC_pre:
5619 case ARM::VSTR_FPSCR_off:
5620 case ARM::VSTR_FPSCR_NZCVQC_off:
5621 case ARM::VLDR_FPSCR_off:
5622 case ARM::VLDR_FPSCR_NZCVQC_off:
5623 case ARM::VSTR_FPSCR_post:
5624 case ARM::VSTR_FPSCR_NZCVQC_post:
5625 case ARM::VLDR_FPSCR_post:
5626 case ARM::VLDR_FPSCR_NZCVQC_post:
5630 if (!featureBits[ARM::HasMVEIntegerOps] && !featureBits[ARM::FeatureVFP2])
5664 if (!
Check(S, RnDecoder(Inst, Rn, Address, Decoder)))
5668 if (!
Check(S, AddrDecoder(Inst, addr, Address, Decoder)))
5704template <
unsigned MinLog,
unsigned MaxLog>
5710 if (Val < MinLog || Val > MaxLog)
5717template <
unsigned start>
5796 case ARM::MVE_ASRLr:
5797 case ARM::MVE_SQRSHRL:
5800 case ARM::MVE_LSLLr:
5801 case ARM::MVE_UQRSHLL:
5848 if (Inst.
getOpcode() == ARM::MVE_SQRSHRL ||
5878template <
bool scalar, OperandDecoder predicate_decoder>
5906 if (!
Check(S, predicate_decoder(Inst, fc, Address, Decoder)))
5953 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm12 : ARM::t2ADDspImm12);
5956 Inst.
setOpcode(sign1 ? ARM::t2SUBspImm : ARM::t2ADDspImm);
5986#include "ARMGenDisassemblerTables.inc"
5993 switch (
MI.getOpcode()) {
6005 case ARM::t2ADDri12:
6009 case ARM::t2SUBri12:
6012 if (
MI.getOperand(0).getReg() == ARM::SP &&
6013 MI.getOperand(1).getReg() != ARM::SP)
6016 default:
return Result;
6025 if (!STI.hasFeature(ARM::ModeThumb))
6040 if (Bytes.
size() < 2)
6044 Bytes.
data(), InstructionEndianness);
6045 return Insn16 < 0xE800 ? 2 : 4;
6049 ArrayRef<uint8_t> Bytes,
6051 raw_ostream &CS)
const {
6053 if (STI.hasFeature(ARM::ModeThumb))
6057 if (S == DecodeStatus::Fail)
6061 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6065 Twine(
MI.getNumOperands()) +
"\n");
6072 ArrayRef<uint8_t> Bytes,
6074 raw_ostream &CS)
const {
6075 CommentStream = &CS;
6077 assert(!STI.hasFeature(ARM::ModeThumb) &&
6078 "Asked to disassemble an ARM instruction but Subtarget is in Thumb "
6082 if (Bytes.
size() < 4) {
6089 InstructionEndianness);
6093 decodeInstruction(DecoderTableARM32,
MI, Insn,
Address,
this, STI);
6099 struct DecodeTable {
6104 const DecodeTable Tables[] = {
6105 {DecoderTableVFP32,
false}, {DecoderTableVFPV832,
false},
6106 {DecoderTableNEONData32,
true}, {DecoderTableNEONLoadStore32,
true},
6107 {DecoderTableNEONDup32,
false}, {DecoderTablev8NEON32,
false},
6108 {DecoderTablev8Crypto32,
false},
6111 for (
auto Table : Tables) {
6117 if (Table.DecodePred && MCII->get(
MI.getOpcode()).isPredicable()) {
6126 decodeInstruction(DecoderTableCoProc32,
MI, Insn,
Address,
this, STI);
6136bool ARMDisassembler::isVectorPredicable(
const MCInst &
MI)
const {
6137 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6150ARMDisassembler::AddThumbPredicate(MCInst &
MI)
const {
6153 const FeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
6157 switch (
MI.getOpcode()) {
6174 if (ITBlock.instrInITBlock())
6180 if (
MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
6189 if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
6206 if (ITBlock.instrInITBlock()) {
6207 CC = ITBlock.getITCC();
6208 ITBlock.advanceITState();
6209 }
else if (VPTBlock.instrInVPTBlock()) {
6210 VCC = VPTBlock.getVPTPred();
6211 VPTBlock.advanceVPTState();
6214 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6217 for (
unsigned i = 0; i < MCID.
NumOperands; ++i, ++CCI) {
6218 if (MCID.
operands()[i].isPredicate() || CCI ==
MI.end())
6235 for (VCCPos = 0; VCCPos < MCID.
NumOperands; ++VCCPos, ++VCCI) {
6253 "Inactive register in vpred_r is not tied to an output!");
6255 MI.insert(VCCI, MCOperand(
MI.getOperand(TiedOp)));
6269void ARMDisassembler::UpdateThumbPredicate(
DecodeStatus &S, MCInst &
MI)
const {
6271 CC = ITBlock.getITCC();
6274 if (ITBlock.instrInITBlock())
6275 ITBlock.advanceITState();
6276 else if (VPTBlock.instrInVPTBlock()) {
6277 CC = VPTBlock.getVPTPred();
6278 VPTBlock.advanceVPTState();
6281 const MCInstrDesc &MCID = MCII->get(
MI.getOpcode());
6285 for (
unsigned i = 0; i <
NumOps; ++i, ++
I) {
6286 if (OpInfo[i].isPredicate() ) {
6292 I->setReg(ARM::NoRegister);
6294 I->setReg(ARM::CPSR);
6301 ArrayRef<uint8_t> Bytes,
6303 raw_ostream &CS)
const {
6304 CommentStream = &CS;
6306 assert(STI.hasFeature(ARM::ModeThumb) &&
6307 "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
6310 if (Bytes.
size() < 2) {
6316 Bytes.
data(), InstructionEndianness);
6318 decodeInstruction(DecoderTableThumb16,
MI, Insn16,
Address,
this, STI);
6321 Check(Result, AddThumbPredicate(
MI));
6325 Result = decodeInstruction(DecoderTableThumbSBit16,
MI, Insn16,
Address,
this,
6329 Check(Result, AddThumbPredicate(
MI));
6334 decodeInstruction(DecoderTableThumb216,
MI, Insn16,
Address,
this, STI);
6340 if (
MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
6343 Check(Result, AddThumbPredicate(
MI));
6348 if (
MI.getOpcode() == ARM::t2IT) {
6349 unsigned Firstcond =
MI.getOperand(0).getImm();
6350 unsigned Mask =
MI.getOperand(1).getImm();
6351 ITBlock.setITState(Firstcond, Mask);
6355 CS <<
"unpredictable IT predicate sequence";
6362 if (Bytes.
size() < 4) {
6369 Bytes.
data() + 2, InstructionEndianness);
6372 decodeInstruction(DecoderTableMVE32,
MI, Insn32,
Address,
this, STI);
6378 if (
isVPTOpcode(
MI.getOpcode()) && VPTBlock.instrInVPTBlock())
6381 Check(Result, AddThumbPredicate(
MI));
6384 unsigned Mask =
MI.getOperand(0).getImm();
6385 VPTBlock.setVPTState(Mask);
6392 decodeInstruction(DecoderTableThumb32,
MI, Insn32,
Address,
this, STI);
6395 Check(Result, AddThumbPredicate(
MI));
6400 decodeInstruction(DecoderTableThumb232,
MI, Insn32,
Address,
this, STI);
6403 Check(Result, AddThumbPredicate(
MI));
6409 decodeInstruction(DecoderTableVFP32,
MI, Insn32,
Address,
this, STI);
6412 UpdateThumbPredicate(Result,
MI);
6418 decodeInstruction(DecoderTableVFPV832,
MI, Insn32,
Address,
this, STI);
6425 Result = decodeInstruction(DecoderTableNEONDup32,
MI, Insn32,
Address,
this,
6429 UpdateThumbPredicate(Result,
MI);
6435 uint32_t NEONLdStInsn = Insn32;
6436 NEONLdStInsn &= 0xF0FFFFFF;
6437 NEONLdStInsn |= 0x04000000;
6438 Result = decodeInstruction(DecoderTableNEONLoadStore32,
MI, NEONLdStInsn,
6442 Check(Result, AddThumbPredicate(
MI));
6448 uint32_t NEONDataInsn = Insn32;
6449 NEONDataInsn &= 0xF0FFFFFF;
6450 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4;
6451 NEONDataInsn |= 0x12000000;
6452 Result = decodeInstruction(DecoderTableNEONData32,
MI, NEONDataInsn,
6456 Check(Result, AddThumbPredicate(
MI));
6460 uint32_t NEONCryptoInsn = Insn32;
6461 NEONCryptoInsn &= 0xF0FFFFFF;
6462 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4;
6463 NEONCryptoInsn |= 0x12000000;
6464 Result = decodeInstruction(DecoderTablev8Crypto32,
MI, NEONCryptoInsn,
6471 uint32_t NEONv8Insn = Insn32;
6472 NEONv8Insn &= 0xF3FFFFFF;
6473 Result = decodeInstruction(DecoderTablev8NEON32,
MI, NEONv8Insn,
Address,
6483 ? DecoderTableThumb2CDE32
6484 : DecoderTableThumb2CoProc32;
6486 decodeInstruction(DecoderTable,
MI, Insn32,
Address,
this, STI);
6489 Check(Result, AddThumbPredicate(
MI));
6495 if (ITBlock.instrInITBlock())
6496 ITBlock.advanceITState();
6504 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.