Hermes/Dyforge is a program written in c++ allows you to inject a dll that can analyze all processes in a program, can be used for mod and reverse engeneering
| 1 | #ifndef CAPSTONE_ARM_H |
| 2 | #define CAPSTONE_ARM_H |
| 3 | |
| 4 | /* Capstone Disassembly Engine */ |
| 5 | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */ |
| 6 | /* Rot127 <unisono@quyllur.org>, 2022-2023 */ |
| 7 | |
| 8 | #ifdef __cplusplus |
| 9 | extern "C" { |
| 10 | #endif |
| 11 | |
| 12 | #include <assert.h> |
| 13 | #include <string.h> |
| 14 | |
| 15 | #include "cs_operand.h" |
| 16 | #include "platform.h" |
| 17 | |
| 18 | #ifdef _MSC_VER |
| 19 | #pragma warning(disable:4201) |
| 20 | #endif |
| 21 | |
| 22 | // Enums corresponding to ARM condition codes |
| 23 | // The CondCodes constants map directly to the 4-bit encoding of the |
| 24 | // condition field for predicated instructions. |
| 25 | typedef enum CondCodes { |
| 26 | // Meaning (integer) Meaning (floating-point) |
| 27 | ARMCC_EQ, // Equal Equal |
| 28 | ARMCC_NE, // Not equal Not equal, or unordered |
| 29 | ARMCC_HS, // Carry set >, ==, or unordered |
| 30 | ARMCC_LO, // Carry clear Less than |
| 31 | ARMCC_MI, // Minus, negative Less than |
| 32 | ARMCC_PL, // Plus, positive or zero >, ==, or unordered |
| 33 | ARMCC_VS, // Overflow Unordered |
| 34 | ARMCC_VC, // No overflow Not unordered |
| 35 | ARMCC_HI, // Unsigned higher Greater than, or unordered |
| 36 | ARMCC_LS, // Unsigned lower or same Less than or equal |
| 37 | ARMCC_GE, // Greater than or equal Greater than or equal |
| 38 | ARMCC_LT, // Less than Less than, or unordered |
| 39 | ARMCC_GT, // Greater than Greater than |
| 40 | ARMCC_LE, // Less than or equal <, ==, or unordered |
| 41 | ARMCC_AL, // Always (unconditional) Always (unconditional) |
| 42 | ARMCC_UNDEF = 15, // Undefined |
| 43 | ARMCC_Invalid = 16, // Invalid |
| 44 | } ARMCC_CondCodes; |
| 45 | |
| 46 | inline static ARMCC_CondCodes ARMCC_getOppositeCondition(ARMCC_CondCodes CC) |
| 47 | { |
| 48 | switch (CC) { |
| 49 | default: |
| 50 | // llvm_unreachable("Unknown condition code"); |
| 51 | assert(0); |
| 52 | case ARMCC_EQ: |
| 53 | return ARMCC_NE; |
| 54 | case ARMCC_NE: |
| 55 | return ARMCC_EQ; |
| 56 | case ARMCC_HS: |
| 57 | return ARMCC_LO; |
| 58 | case ARMCC_LO: |
| 59 | return ARMCC_HS; |
| 60 | case ARMCC_MI: |
| 61 | return ARMCC_PL; |
| 62 | case ARMCC_PL: |
| 63 | return ARMCC_MI; |
| 64 | case ARMCC_VS: |
| 65 | return ARMCC_VC; |
| 66 | case ARMCC_VC: |
| 67 | return ARMCC_VS; |
| 68 | case ARMCC_HI: |
| 69 | return ARMCC_LS; |
| 70 | case ARMCC_LS: |
| 71 | return ARMCC_HI; |
| 72 | case ARMCC_GE: |
| 73 | return ARMCC_LT; |
| 74 | case ARMCC_LT: |
| 75 | return ARMCC_GE; |
| 76 | case ARMCC_GT: |
| 77 | return ARMCC_LE; |
| 78 | case ARMCC_LE: |
| 79 | return ARMCC_GT; |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | /// getSwappedCondition - assume the flags are set by MI(a,b), return |
| 84 | /// the condition code if we modify the instructions such that flags are |
| 85 | /// set by MI(b,a). |
| 86 | inline static ARMCC_CondCodes ARMCC_getSwappedCondition(ARMCC_CondCodes CC) |
| 87 | { |
| 88 | switch (CC) { |
| 89 | default: |
| 90 | return ARMCC_AL; |
| 91 | case ARMCC_EQ: |
| 92 | return ARMCC_EQ; |
| 93 | case ARMCC_NE: |
| 94 | return ARMCC_NE; |
| 95 | case ARMCC_HS: |
| 96 | return ARMCC_LS; |
| 97 | case ARMCC_LO: |
| 98 | return ARMCC_HI; |
| 99 | case ARMCC_HI: |
| 100 | return ARMCC_LO; |
| 101 | case ARMCC_LS: |
| 102 | return ARMCC_HS; |
| 103 | case ARMCC_GE: |
| 104 | return ARMCC_LE; |
| 105 | case ARMCC_LT: |
| 106 | return ARMCC_GT; |
| 107 | case ARMCC_GT: |
| 108 | return ARMCC_LT; |
| 109 | case ARMCC_LE: |
| 110 | return ARMCC_GE; |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | typedef enum VPTCodes { |
| 115 | ARMVCC_None = 0, |
| 116 | ARMVCC_Then, |
| 117 | ARMVCC_Else |
| 118 | } ARMVCC_VPTCodes; |
| 119 | |
| 120 | /// Mask values for IT and VPT Blocks, to be used by MCOperands. |
| 121 | /// Note that this is different from the "real" encoding used by the |
| 122 | /// instructions. In this encoding, the lowest set bit indicates the end of |
| 123 | /// the encoding, and above that, "1" indicates an else, while "0" indicates |
| 124 | /// a then. |
| 125 | /// Tx = x100 |
| 126 | /// Txy = xy10 |
| 127 | /// Txyz = xyz1 |
| 128 | typedef enum PredBlockMask { |
| 129 | ARM_PredBlockMaskInvalid = 0, |
| 130 | ARM_T = 0x8, // 0b1000 |
| 131 | ARM_TT = 0x4, // 0b0100 |
| 132 | ARM_TE = 0xc, // 0b1100 |
| 133 | ARM_TTT = 0x2, // 0b0010 |
| 134 | ARM_TTE = 0x6, // 0b0110 |
| 135 | ARM_TEE = 0xe, // 0b1110 |
| 136 | ARM_TET = 0xa, // 0b1010 |
| 137 | ARM_TTTT = 0x1, // 0b0001 |
| 138 | ARM_TTTE = 0x3, // 0b0011 |
| 139 | ARM_TTEE = 0x7, // 0b0111 |
| 140 | ARM_TTET = 0x5, // 0b0101 |
| 141 | ARM_TEEE = 0xf, // 0b1111 |
| 142 | ARM_TEET = 0xd, // 0b1101 |
| 143 | ARM_TETT = 0x9, // 0b1001 |
| 144 | ARM_TETE = 0xb, // 0b1011 |
| 145 | } ARM_PredBlockMask; |
| 146 | |
| 147 | // Expands a PredBlockMask by adding an E or a T at the end, depending on Kind. |
| 148 | // e.g ExpandPredBlockMask(T, Then) = TT, ExpandPredBlockMask(TT, Else) = TTE, |
| 149 | // and so on. |
| 150 | inline static const char *ARMVPTPredToString(ARMVCC_VPTCodes CC) |
| 151 | { |
| 152 | switch (CC) { |
| 153 | case ARMVCC_None: |
| 154 | return "none"; |
| 155 | case ARMVCC_Then: |
| 156 | return "t"; |
| 157 | case ARMVCC_Else: |
| 158 | return "e"; |
| 159 | } |
| 160 | assert(0 && "Unknown VPT code"); |
| 161 | return ""; |
| 162 | } |
| 163 | |
| 164 | inline static unsigned ARMVectorCondCodeFromString(const char CC) |
| 165 | { |
| 166 | switch (CC) { |
| 167 | default: |
| 168 | return ~0U; |
| 169 | case 't': |
| 170 | return ARMVCC_Then; |
| 171 | case 'e': |
| 172 | return ARMVCC_Else; |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | inline static const char *ARMCondCodeToString(ARMCC_CondCodes CC) |
| 177 | { |
| 178 | switch (CC) { |
| 179 | default: |
| 180 | assert(0 && "Unknown condition code"); |
| 181 | case ARMCC_EQ: |
| 182 | return "eq"; |
| 183 | case ARMCC_NE: |
| 184 | return "ne"; |
| 185 | case ARMCC_HS: |
| 186 | return "hs"; |
| 187 | case ARMCC_LO: |
| 188 | return "lo"; |
| 189 | case ARMCC_MI: |
| 190 | return "mi"; |
| 191 | case ARMCC_PL: |
| 192 | return "pl"; |
| 193 | case ARMCC_VS: |
| 194 | return "vs"; |
| 195 | case ARMCC_VC: |
| 196 | return "vc"; |
| 197 | case ARMCC_HI: |
| 198 | return "hi"; |
| 199 | case ARMCC_LS: |
| 200 | return "ls"; |
| 201 | case ARMCC_GE: |
| 202 | return "ge"; |
| 203 | case ARMCC_LT: |
| 204 | return "lt"; |
| 205 | case ARMCC_GT: |
| 206 | return "gt"; |
| 207 | case ARMCC_LE: |
| 208 | return "le"; |
| 209 | case ARMCC_AL: |
| 210 | return "al"; |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | inline static unsigned ARMCondCodeFromString(const char *CC) |
| 215 | { |
| 216 | if (strcmp("eq", CC) == 0) |
| 217 | return ARMCC_EQ; |
| 218 | else if (strcmp("ne", CC) == 0) |
| 219 | return ARMCC_NE; |
| 220 | else if (strcmp("hs", CC) == 0) |
| 221 | return ARMCC_HS; |
| 222 | else if (strcmp("cs", CC) == 0) |
| 223 | return ARMCC_HS; |
| 224 | else if (strcmp("lo", CC) == 0) |
| 225 | return ARMCC_LO; |
| 226 | else if (strcmp("cc", CC) == 0) |
| 227 | return ARMCC_LO; |
| 228 | else if (strcmp("mi", CC) == 0) |
| 229 | return ARMCC_MI; |
| 230 | else if (strcmp("pl", CC) == 0) |
| 231 | return ARMCC_PL; |
| 232 | else if (strcmp("vs", CC) == 0) |
| 233 | return ARMCC_VS; |
| 234 | else if (strcmp("vc", CC) == 0) |
| 235 | return ARMCC_VC; |
| 236 | else if (strcmp("hi", CC) == 0) |
| 237 | return ARMCC_HI; |
| 238 | else if (strcmp("ls", CC) == 0) |
| 239 | return ARMCC_LS; |
| 240 | else if (strcmp("ge", CC) == 0) |
| 241 | return ARMCC_GE; |
| 242 | else if (strcmp("lt", CC) == 0) |
| 243 | return ARMCC_LT; |
| 244 | else if (strcmp("gt", CC) == 0) |
| 245 | return ARMCC_GT; |
| 246 | else if (strcmp("le", CC) == 0) |
| 247 | return ARMCC_LE; |
| 248 | else if (strcmp("al", CC) == 0) |
| 249 | return ARMCC_AL; |
| 250 | return (~0U); |
| 251 | } |
| 252 | |
| 253 | /// ARM shift type |
| 254 | typedef enum arm_shifter { |
| 255 | ARM_SFT_INVALID = 0, |
| 256 | ARM_SFT_ASR, |
| 257 | ARM_SFT_LSL, |
| 258 | ARM_SFT_LSR, |
| 259 | ARM_SFT_ROR, |
| 260 | ARM_SFT_RRX, |
| 261 | ARM_SFT_UXTW, |
| 262 | |
| 263 | // Added by Capstone to signal that the shift amount is stored in a register. |
| 264 | // shift.val should be interpreted as register id. |
| 265 | ARM_SFT_REG, |
| 266 | ARM_SFT_ASR_REG, |
| 267 | ARM_SFT_LSL_REG, |
| 268 | ARM_SFT_LSR_REG, |
| 269 | ARM_SFT_ROR_REG, |
| 270 | // Others are not defined in the ISA. |
| 271 | } arm_shifter; |
| 272 | |
| 273 | /// The memory barrier constants map directly to the 4-bit encoding of |
| 274 | /// the option field for Memory Barrier operations. |
| 275 | typedef enum MemBOpt { |
| 276 | ARM_MB_RESERVED_0, |
| 277 | ARM_MB_OSHLD, |
| 278 | ARM_MB_OSHST, |
| 279 | ARM_MB_OSH, |
| 280 | ARM_MB_RESERVED_4, |
| 281 | ARM_MB_NSHLD, |
| 282 | ARM_MB_NSHST, |
| 283 | ARM_MB_NSH, |
| 284 | ARM_MB_RESERVED_8, |
| 285 | ARM_MB_ISHLD, |
| 286 | ARM_MB_ISHST, |
| 287 | ARM_MB_ISH, |
| 288 | ARM_MB_RESERVED_12, |
| 289 | ARM_MB_LD, |
| 290 | ARM_MB_ST, |
| 291 | ARM_MB_SY, |
| 292 | } arm_mem_bo_opt; |
| 293 | |
| 294 | typedef enum { |
| 295 | // SPSR* field flags can be OR combined |
| 296 | ARM_FIELD_SPSR_C = 1, |
| 297 | ARM_FIELD_SPSR_X = 2, |
| 298 | ARM_FIELD_SPSR_S = 4, |
| 299 | ARM_FIELD_SPSR_F = 8, |
| 300 | |
| 301 | // CPSR* field flags can be OR combined |
| 302 | ARM_FIELD_CPSR_C = 16, |
| 303 | ARM_FIELD_CPSR_X = 32, |
| 304 | ARM_FIELD_CPSR_S = 64, |
| 305 | ARM_FIELD_CPSR_F = 128, |
| 306 | } arm_spsr_cspr_bits; |
| 307 | |
| 308 | // From LLVM docs: |
| 309 | // The values here come from B9.2.3 of the ARM ARM, where bits 4-0 are SysM field |
| 310 | // and bit 5 is R. |
| 311 | typedef enum { |
| 312 | // generated content <ARMGenCSSystemOperandsEnum.inc:GET_ENUM_VALUES_BankedReg> begin |
| 313 | // clang-format off |
| 314 | |
| 315 | ARM_BANKEDREG_ELR_HYP = 0x1e, |
| 316 | ARM_BANKEDREG_LR_ABT = 0x14, |
| 317 | ARM_BANKEDREG_LR_FIQ = 0xe, |
| 318 | ARM_BANKEDREG_LR_IRQ = 0x10, |
| 319 | ARM_BANKEDREG_LR_MON = 0x1c, |
| 320 | ARM_BANKEDREG_LR_SVC = 0x12, |
| 321 | ARM_BANKEDREG_LR_UND = 0x16, |
| 322 | ARM_BANKEDREG_LR_USR = 0x6, |
| 323 | ARM_BANKEDREG_R10_FIQ = 0xa, |
| 324 | ARM_BANKEDREG_R10_USR = 0x2, |
| 325 | ARM_BANKEDREG_R11_FIQ = 0xb, |
| 326 | ARM_BANKEDREG_R11_USR = 0x3, |
| 327 | ARM_BANKEDREG_R12_FIQ = 0xc, |
| 328 | ARM_BANKEDREG_R12_USR = 0x4, |
| 329 | ARM_BANKEDREG_R8_FIQ = 0x8, |
| 330 | ARM_BANKEDREG_R8_USR = 0x0, |
| 331 | ARM_BANKEDREG_R9_FIQ = 0x9, |
| 332 | ARM_BANKEDREG_R9_USR = 0x1, |
| 333 | ARM_BANKEDREG_SPSR_ABT = 0x34, |
| 334 | ARM_BANKEDREG_SPSR_FIQ = 0x2e, |
| 335 | ARM_BANKEDREG_SPSR_HYP = 0x3e, |
| 336 | ARM_BANKEDREG_SPSR_IRQ = 0x30, |
| 337 | ARM_BANKEDREG_SPSR_MON = 0x3c, |
| 338 | ARM_BANKEDREG_SPSR_SVC = 0x32, |
| 339 | ARM_BANKEDREG_SPSR_UND = 0x36, |
| 340 | ARM_BANKEDREG_SP_ABT = 0x15, |
| 341 | ARM_BANKEDREG_SP_FIQ = 0xd, |
| 342 | ARM_BANKEDREG_SP_HYP = 0x1f, |
| 343 | ARM_BANKEDREG_SP_IRQ = 0x11, |
| 344 | ARM_BANKEDREG_SP_MON = 0x1d, |
| 345 | ARM_BANKEDREG_SP_SVC = 0x13, |
| 346 | ARM_BANKEDREG_SP_UND = 0x17, |
| 347 | ARM_BANKEDREG_SP_USR = 0x5, |
| 348 | |
| 349 | // clang-format on |
| 350 | // generated content <ARMGenCSSystemOperandsEnum.inc:GET_ENUM_VALUES_BankedReg> end |
| 351 | } arm_bankedreg; |
| 352 | |
| 353 | typedef enum { |
| 354 | // generated content <ARMGenCSSystemOperandsEnum.inc:GET_ENUM_VALUES_MClassSysReg> begin |
| 355 | // clang-format off |
| 356 | |
| 357 | ARM_MCLASSSYSREG_APSR = 0x800, |
| 358 | ARM_MCLASSSYSREG_APSR_G = 0x400, |
| 359 | ARM_MCLASSSYSREG_APSR_NZCVQ = 0x800, |
| 360 | ARM_MCLASSSYSREG_APSR_NZCVQG = 0xc00, |
| 361 | ARM_MCLASSSYSREG_BASEPRI = 0x811, |
| 362 | ARM_MCLASSSYSREG_BASEPRI_MAX = 0x812, |
| 363 | ARM_MCLASSSYSREG_BASEPRI_NS = 0x891, |
| 364 | ARM_MCLASSSYSREG_CONTROL = 0x814, |
| 365 | ARM_MCLASSSYSREG_CONTROL_NS = 0x894, |
| 366 | ARM_MCLASSSYSREG_EAPSR = 0x802, |
| 367 | ARM_MCLASSSYSREG_EAPSR_G = 0x402, |
| 368 | ARM_MCLASSSYSREG_EAPSR_NZCVQ = 0x802, |
| 369 | ARM_MCLASSSYSREG_EAPSR_NZCVQG = 0xc02, |
| 370 | ARM_MCLASSSYSREG_EPSR = 0x806, |
| 371 | ARM_MCLASSSYSREG_FAULTMASK = 0x813, |
| 372 | ARM_MCLASSSYSREG_FAULTMASK_NS = 0x893, |
| 373 | ARM_MCLASSSYSREG_IAPSR = 0x801, |
| 374 | ARM_MCLASSSYSREG_IAPSR_G = 0x401, |
| 375 | ARM_MCLASSSYSREG_IAPSR_NZCVQ = 0x801, |
| 376 | ARM_MCLASSSYSREG_IAPSR_NZCVQG = 0xc01, |
| 377 | ARM_MCLASSSYSREG_IEPSR = 0x807, |
| 378 | ARM_MCLASSSYSREG_IPSR = 0x805, |
| 379 | ARM_MCLASSSYSREG_MSP = 0x808, |
| 380 | ARM_MCLASSSYSREG_MSPLIM = 0x80a, |
| 381 | ARM_MCLASSSYSREG_MSPLIM_NS = 0x88a, |
| 382 | ARM_MCLASSSYSREG_MSP_NS = 0x888, |
| 383 | ARM_MCLASSSYSREG_PAC_KEY_P_0 = 0x820, |
| 384 | ARM_MCLASSSYSREG_PAC_KEY_P_0_NS = 0x8a0, |
| 385 | ARM_MCLASSSYSREG_PAC_KEY_P_1 = 0x821, |
| 386 | ARM_MCLASSSYSREG_PAC_KEY_P_1_NS = 0x8a1, |
| 387 | ARM_MCLASSSYSREG_PAC_KEY_P_2 = 0x822, |
| 388 | ARM_MCLASSSYSREG_PAC_KEY_P_2_NS = 0x8a2, |
| 389 | ARM_MCLASSSYSREG_PAC_KEY_P_3 = 0x823, |
| 390 | ARM_MCLASSSYSREG_PAC_KEY_P_3_NS = 0x8a3, |
| 391 | ARM_MCLASSSYSREG_PAC_KEY_U_0 = 0x824, |
| 392 | ARM_MCLASSSYSREG_PAC_KEY_U_0_NS = 0x8a4, |
| 393 | ARM_MCLASSSYSREG_PAC_KEY_U_1 = 0x825, |
| 394 | ARM_MCLASSSYSREG_PAC_KEY_U_1_NS = 0x8a5, |
| 395 | ARM_MCLASSSYSREG_PAC_KEY_U_2 = 0x826, |
| 396 | ARM_MCLASSSYSREG_PAC_KEY_U_2_NS = 0x8a6, |
| 397 | ARM_MCLASSSYSREG_PAC_KEY_U_3 = 0x827, |
| 398 | ARM_MCLASSSYSREG_PAC_KEY_U_3_NS = 0x8a7, |
| 399 | ARM_MCLASSSYSREG_PRIMASK = 0x810, |
| 400 | ARM_MCLASSSYSREG_PRIMASK_NS = 0x890, |
| 401 | ARM_MCLASSSYSREG_PSP = 0x809, |
| 402 | ARM_MCLASSSYSREG_PSPLIM = 0x80b, |
| 403 | ARM_MCLASSSYSREG_PSPLIM_NS = 0x88b, |
| 404 | ARM_MCLASSSYSREG_PSP_NS = 0x889, |
| 405 | ARM_MCLASSSYSREG_SP_NS = 0x898, |
| 406 | ARM_MCLASSSYSREG_XPSR = 0x803, |
| 407 | ARM_MCLASSSYSREG_XPSR_G = 0x403, |
| 408 | ARM_MCLASSSYSREG_XPSR_NZCVQ = 0x803, |
| 409 | ARM_MCLASSSYSREG_XPSR_NZCVQG = 0xc03, |
| 410 | |
| 411 | // clang-format on |
| 412 | // generated content <ARMGenCSSystemOperandsEnum.inc:GET_ENUM_VALUES_MClassSysReg> end |
| 413 | } arm_sysreg; |
| 414 | |
| 415 | typedef union { |
| 416 | arm_sysreg mclasssysreg; |
| 417 | arm_bankedreg bankedreg; |
| 418 | int raw_val; ///< Raw value for assignment in generated files. |
| 419 | } arm_sysop_reg; |
| 420 | |
| 421 | /// Operand type for instruction's operands |
| 422 | typedef enum arm_op_type { |
| 423 | ARM_OP_INVALID = CS_OP_INVALID, ///< Invalid |
| 424 | ARM_OP_REG = CS_OP_REG, ///< Register operand |
| 425 | ARM_OP_IMM = CS_OP_IMM, ///< Immediate operand |
| 426 | ARM_OP_FP = CS_OP_FP, ///< Floating-Point operand |
| 427 | ARM_OP_PRED = CS_OP_PRED, ///< Predicate |
| 428 | ARM_OP_CIMM = CS_OP_SPECIAL + 0, ///< C-Immediate (coprocessor registers) |
| 429 | ARM_OP_PIMM = CS_OP_SPECIAL + 1, ///< P-Immediate (coprocessor registers) |
| 430 | ARM_OP_SETEND = CS_OP_SPECIAL + 2, ///< operand for SETEND instruction |
| 431 | ARM_OP_SYSREG = CS_OP_SPECIAL + 3, ///< MSR/MRS special register operand |
| 432 | ARM_OP_BANKEDREG = CS_OP_SPECIAL + 4, ///< Banked register operand |
| 433 | ARM_OP_SPSR = CS_OP_SPECIAL + 5, ///< Collection of SPSR bits |
| 434 | ARM_OP_CPSR = CS_OP_SPECIAL + 6, ///< Collection of CPSR bits |
| 435 | ARM_OP_SYSM = CS_OP_SPECIAL + 7, ///< Raw SYSm field |
| 436 | ARM_OP_VPRED_R = CS_OP_SPECIAL + 8, ///< Vector predicate. Leaves inactive lanes of output vector register unchanged. |
| 437 | ARM_OP_VPRED_N = CS_OP_SPECIAL + 9, ///< Vector predicate. Don't preserved inactive lanes of output register. |
| 438 | ARM_OP_MEM = CS_OP_MEM, ///< Memory operand |
| 439 | } arm_op_type; |
| 440 | |
| 441 | /// Operand type for SETEND instruction |
| 442 | typedef enum arm_setend_type { |
| 443 | ARM_SETEND_INVALID = 0, ///< Uninitialized. |
| 444 | ARM_SETEND_BE, ///< BE operand. |
| 445 | ARM_SETEND_LE, ///< LE operand |
| 446 | } arm_setend_type; |
| 447 | |
| 448 | typedef enum arm_cpsmode_type { |
| 449 | ARM_CPSMODE_INVALID = 0, |
| 450 | ARM_CPSMODE_IE = 2, |
| 451 | ARM_CPSMODE_ID = 3 |
| 452 | } arm_cpsmode_type; |
| 453 | |
| 454 | /// Operand type for SETEND instruction |
| 455 | typedef enum arm_cpsflag_type { |
| 456 | ARM_CPSFLAG_INVALID = 0, |
| 457 | ARM_CPSFLAG_F = 1, |
| 458 | ARM_CPSFLAG_I = 2, |
| 459 | ARM_CPSFLAG_A = 4, |
| 460 | ARM_CPSFLAG_NONE = 16, ///< no flag |
| 461 | } arm_cpsflag_type; |
| 462 | |
| 463 | /// Data type for elements of vector instructions. |
| 464 | typedef enum arm_vectordata_type { |
| 465 | ARM_VECTORDATA_INVALID = 0, |
| 466 | |
| 467 | // Integer type |
| 468 | ARM_VECTORDATA_I8, |
| 469 | ARM_VECTORDATA_I16, |
| 470 | ARM_VECTORDATA_I32, |
| 471 | ARM_VECTORDATA_I64, |
| 472 | |
| 473 | // Signed integer type |
| 474 | ARM_VECTORDATA_S8, |
| 475 | ARM_VECTORDATA_S16, |
| 476 | ARM_VECTORDATA_S32, |
| 477 | ARM_VECTORDATA_S64, |
| 478 | |
| 479 | // Unsigned integer type |
| 480 | ARM_VECTORDATA_U8, |
| 481 | ARM_VECTORDATA_U16, |
| 482 | ARM_VECTORDATA_U32, |
| 483 | ARM_VECTORDATA_U64, |
| 484 | |
| 485 | // Data type for VMUL/VMULL |
| 486 | ARM_VECTORDATA_P8, |
| 487 | ARM_VECTORDATA_P16, |
| 488 | |
| 489 | // Floating type |
| 490 | ARM_VECTORDATA_F16, |
| 491 | ARM_VECTORDATA_F32, |
| 492 | ARM_VECTORDATA_F64, |
| 493 | |
| 494 | // Convert float <-> float |
| 495 | ARM_VECTORDATA_F16F64, // f16.f64 |
| 496 | ARM_VECTORDATA_F64F16, // f64.f16 |
| 497 | ARM_VECTORDATA_F32F16, // f32.f16 |
| 498 | ARM_VECTORDATA_F16F32, // f32.f16 |
| 499 | ARM_VECTORDATA_F64F32, // f64.f32 |
| 500 | ARM_VECTORDATA_F32F64, // f32.f64 |
| 501 | |
| 502 | // Convert integer <-> float |
| 503 | ARM_VECTORDATA_S32F32, // s32.f32 |
| 504 | ARM_VECTORDATA_U32F32, // u32.f32 |
| 505 | ARM_VECTORDATA_F32S32, // f32.s32 |
| 506 | ARM_VECTORDATA_F32U32, // f32.u32 |
| 507 | ARM_VECTORDATA_F64S16, // f64.s16 |
| 508 | ARM_VECTORDATA_F32S16, // f32.s16 |
| 509 | ARM_VECTORDATA_F64S32, // f64.s32 |
| 510 | ARM_VECTORDATA_S16F64, // s16.f64 |
| 511 | ARM_VECTORDATA_S16F32, // s16.f64 |
| 512 | ARM_VECTORDATA_S32F64, // s32.f64 |
| 513 | ARM_VECTORDATA_U16F64, // u16.f64 |
| 514 | ARM_VECTORDATA_U16F32, // u16.f32 |
| 515 | ARM_VECTORDATA_U32F64, // u32.f64 |
| 516 | ARM_VECTORDATA_F64U16, // f64.u16 |
| 517 | ARM_VECTORDATA_F32U16, // f32.u16 |
| 518 | ARM_VECTORDATA_F64U32, // f64.u32 |
| 519 | ARM_VECTORDATA_F16U16, // f16.u16 |
| 520 | ARM_VECTORDATA_U16F16, // u16.f16 |
| 521 | ARM_VECTORDATA_F16U32, // f16.u32 |
| 522 | ARM_VECTORDATA_U32F16, // u32.f16 |
| 523 | ARM_VECTORDATA_F16S16, |
| 524 | ARM_VECTORDATA_S16F16, |
| 525 | ARM_VECTORDATA_F16S32, |
| 526 | ARM_VECTORDATA_S32F16, |
| 527 | } arm_vectordata_type; |
| 528 | |
| 529 | /// ARM registers |
| 530 | typedef enum arm_reg { |
| 531 | // generated content <ARMGenCSRegEnum.inc> begin |
| 532 | // clang-format off |
| 533 | |
| 534 | ARM_REG_INVALID = 0, |
| 535 | ARM_REG_APSR = 1, |
| 536 | ARM_REG_APSR_NZCV = 2, |
| 537 | ARM_REG_CPSR = 3, |
| 538 | ARM_REG_FPCXTNS = 4, |
| 539 | ARM_REG_FPCXTS = 5, |
| 540 | ARM_REG_FPEXC = 6, |
| 541 | ARM_REG_FPINST = 7, |
| 542 | ARM_REG_FPSCR = 8, |
| 543 | ARM_REG_FPSCR_NZCV = 9, |
| 544 | ARM_REG_FPSCR_NZCVQC = 10, |
| 545 | ARM_REG_FPSID = 11, |
| 546 | ARM_REG_ITSTATE = 12, |
| 547 | ARM_REG_LR = 13, |
| 548 | ARM_REG_PC = 14, |
| 549 | ARM_REG_RA_AUTH_CODE = 15, |
| 550 | ARM_REG_SP = 16, |
| 551 | ARM_REG_SPSR = 17, |
| 552 | ARM_REG_VPR = 18, |
| 553 | ARM_REG_ZR = 19, |
| 554 | ARM_REG_D0 = 20, |
| 555 | ARM_REG_D1 = 21, |
| 556 | ARM_REG_D2 = 22, |
| 557 | ARM_REG_D3 = 23, |
| 558 | ARM_REG_D4 = 24, |
| 559 | ARM_REG_D5 = 25, |
| 560 | ARM_REG_D6 = 26, |
| 561 | ARM_REG_D7 = 27, |
| 562 | ARM_REG_D8 = 28, |
| 563 | ARM_REG_D9 = 29, |
| 564 | ARM_REG_D10 = 30, |
| 565 | ARM_REG_D11 = 31, |
| 566 | ARM_REG_D12 = 32, |
| 567 | ARM_REG_D13 = 33, |
| 568 | ARM_REG_D14 = 34, |
| 569 | ARM_REG_D15 = 35, |
| 570 | ARM_REG_D16 = 36, |
| 571 | ARM_REG_D17 = 37, |
| 572 | ARM_REG_D18 = 38, |
| 573 | ARM_REG_D19 = 39, |
| 574 | ARM_REG_D20 = 40, |
| 575 | ARM_REG_D21 = 41, |
| 576 | ARM_REG_D22 = 42, |
| 577 | ARM_REG_D23 = 43, |
| 578 | ARM_REG_D24 = 44, |
| 579 | ARM_REG_D25 = 45, |
| 580 | ARM_REG_D26 = 46, |
| 581 | ARM_REG_D27 = 47, |
| 582 | ARM_REG_D28 = 48, |
| 583 | ARM_REG_D29 = 49, |
| 584 | ARM_REG_D30 = 50, |
| 585 | ARM_REG_D31 = 51, |
| 586 | ARM_REG_FPINST2 = 52, |
| 587 | ARM_REG_MVFR0 = 53, |
| 588 | ARM_REG_MVFR1 = 54, |
| 589 | ARM_REG_MVFR2 = 55, |
| 590 | ARM_REG_P0 = 56, |
| 591 | ARM_REG_Q0 = 57, |
| 592 | ARM_REG_Q1 = 58, |
| 593 | ARM_REG_Q2 = 59, |
| 594 | ARM_REG_Q3 = 60, |
| 595 | ARM_REG_Q4 = 61, |
| 596 | ARM_REG_Q5 = 62, |
| 597 | ARM_REG_Q6 = 63, |
| 598 | ARM_REG_Q7 = 64, |
| 599 | ARM_REG_Q8 = 65, |
| 600 | ARM_REG_Q9 = 66, |
| 601 | ARM_REG_Q10 = 67, |
| 602 | ARM_REG_Q11 = 68, |
| 603 | ARM_REG_Q12 = 69, |
| 604 | ARM_REG_Q13 = 70, |
| 605 | ARM_REG_Q14 = 71, |
| 606 | ARM_REG_Q15 = 72, |
| 607 | ARM_REG_R0 = 73, |
| 608 | ARM_REG_R1 = 74, |
| 609 | ARM_REG_R2 = 75, |
| 610 | ARM_REG_R3 = 76, |
| 611 | ARM_REG_R4 = 77, |
| 612 | ARM_REG_R5 = 78, |
| 613 | ARM_REG_R6 = 79, |
| 614 | ARM_REG_R7 = 80, |
| 615 | ARM_REG_R8 = 81, |
| 616 | ARM_REG_R9 = 82, |
| 617 | ARM_REG_R10 = 83, |
| 618 | ARM_REG_R11 = 84, |
| 619 | ARM_REG_R12 = 85, |
| 620 | ARM_REG_S0 = 86, |
| 621 | ARM_REG_S1 = 87, |
| 622 | ARM_REG_S2 = 88, |
| 623 | ARM_REG_S3 = 89, |
| 624 | ARM_REG_S4 = 90, |
| 625 | ARM_REG_S5 = 91, |
| 626 | ARM_REG_S6 = 92, |
| 627 | ARM_REG_S7 = 93, |
| 628 | ARM_REG_S8 = 94, |
| 629 | ARM_REG_S9 = 95, |
| 630 | ARM_REG_S10 = 96, |
| 631 | ARM_REG_S11 = 97, |
| 632 | ARM_REG_S12 = 98, |
| 633 | ARM_REG_S13 = 99, |
| 634 | ARM_REG_S14 = 100, |
| 635 | ARM_REG_S15 = 101, |
| 636 | ARM_REG_S16 = 102, |
| 637 | ARM_REG_S17 = 103, |
| 638 | ARM_REG_S18 = 104, |
| 639 | ARM_REG_S19 = 105, |
| 640 | ARM_REG_S20 = 106, |
| 641 | ARM_REG_S21 = 107, |
| 642 | ARM_REG_S22 = 108, |
| 643 | ARM_REG_S23 = 109, |
| 644 | ARM_REG_S24 = 110, |
| 645 | ARM_REG_S25 = 111, |
| 646 | ARM_REG_S26 = 112, |
| 647 | ARM_REG_S27 = 113, |
| 648 | ARM_REG_S28 = 114, |
| 649 | ARM_REG_S29 = 115, |
| 650 | ARM_REG_S30 = 116, |
| 651 | ARM_REG_S31 = 117, |
| 652 | ARM_REG_D0_D2 = 118, |
| 653 | ARM_REG_D1_D3 = 119, |
| 654 | ARM_REG_D2_D4 = 120, |
| 655 | ARM_REG_D3_D5 = 121, |
| 656 | ARM_REG_D4_D6 = 122, |
| 657 | ARM_REG_D5_D7 = 123, |
| 658 | ARM_REG_D6_D8 = 124, |
| 659 | ARM_REG_D7_D9 = 125, |
| 660 | ARM_REG_D8_D10 = 126, |
| 661 | ARM_REG_D9_D11 = 127, |
| 662 | ARM_REG_D10_D12 = 128, |
| 663 | ARM_REG_D11_D13 = 129, |
| 664 | ARM_REG_D12_D14 = 130, |
| 665 | ARM_REG_D13_D15 = 131, |
| 666 | ARM_REG_D14_D16 = 132, |
| 667 | ARM_REG_D15_D17 = 133, |
| 668 | ARM_REG_D16_D18 = 134, |
| 669 | ARM_REG_D17_D19 = 135, |
| 670 | ARM_REG_D18_D20 = 136, |
| 671 | ARM_REG_D19_D21 = 137, |
| 672 | ARM_REG_D20_D22 = 138, |
| 673 | ARM_REG_D21_D23 = 139, |
| 674 | ARM_REG_D22_D24 = 140, |
| 675 | ARM_REG_D23_D25 = 141, |
| 676 | ARM_REG_D24_D26 = 142, |
| 677 | ARM_REG_D25_D27 = 143, |
| 678 | ARM_REG_D26_D28 = 144, |
| 679 | ARM_REG_D27_D29 = 145, |
| 680 | ARM_REG_D28_D30 = 146, |
| 681 | ARM_REG_D29_D31 = 147, |
| 682 | ARM_REG_Q0_Q1 = 148, |
| 683 | ARM_REG_Q1_Q2 = 149, |
| 684 | ARM_REG_Q2_Q3 = 150, |
| 685 | ARM_REG_Q3_Q4 = 151, |
| 686 | ARM_REG_Q4_Q5 = 152, |
| 687 | ARM_REG_Q5_Q6 = 153, |
| 688 | ARM_REG_Q6_Q7 = 154, |
| 689 | ARM_REG_Q7_Q8 = 155, |
| 690 | ARM_REG_Q8_Q9 = 156, |
| 691 | ARM_REG_Q9_Q10 = 157, |
| 692 | ARM_REG_Q10_Q11 = 158, |
| 693 | ARM_REG_Q11_Q12 = 159, |
| 694 | ARM_REG_Q12_Q13 = 160, |
| 695 | ARM_REG_Q13_Q14 = 161, |
| 696 | ARM_REG_Q14_Q15 = 162, |
| 697 | ARM_REG_Q0_Q1_Q2_Q3 = 163, |
| 698 | ARM_REG_Q1_Q2_Q3_Q4 = 164, |
| 699 | ARM_REG_Q2_Q3_Q4_Q5 = 165, |
| 700 | ARM_REG_Q3_Q4_Q5_Q6 = 166, |
| 701 | ARM_REG_Q4_Q5_Q6_Q7 = 167, |
| 702 | ARM_REG_Q5_Q6_Q7_Q8 = 168, |
| 703 | ARM_REG_Q6_Q7_Q8_Q9 = 169, |
| 704 | ARM_REG_Q7_Q8_Q9_Q10 = 170, |
| 705 | ARM_REG_Q8_Q9_Q10_Q11 = 171, |
| 706 | ARM_REG_Q9_Q10_Q11_Q12 = 172, |
| 707 | ARM_REG_Q10_Q11_Q12_Q13 = 173, |
| 708 | ARM_REG_Q11_Q12_Q13_Q14 = 174, |
| 709 | ARM_REG_Q12_Q13_Q14_Q15 = 175, |
| 710 | ARM_REG_R0_R1 = 176, |
| 711 | ARM_REG_R2_R3 = 177, |
| 712 | ARM_REG_R4_R5 = 178, |
| 713 | ARM_REG_R6_R7 = 179, |
| 714 | ARM_REG_R8_R9 = 180, |
| 715 | ARM_REG_R10_R11 = 181, |
| 716 | ARM_REG_R12_SP = 182, |
| 717 | ARM_REG_D0_D1_D2 = 183, |
| 718 | ARM_REG_D1_D2_D3 = 184, |
| 719 | ARM_REG_D2_D3_D4 = 185, |
| 720 | ARM_REG_D3_D4_D5 = 186, |
| 721 | ARM_REG_D4_D5_D6 = 187, |
| 722 | ARM_REG_D5_D6_D7 = 188, |
| 723 | ARM_REG_D6_D7_D8 = 189, |
| 724 | ARM_REG_D7_D8_D9 = 190, |
| 725 | ARM_REG_D8_D9_D10 = 191, |
| 726 | ARM_REG_D9_D10_D11 = 192, |
| 727 | ARM_REG_D10_D11_D12 = 193, |
| 728 | ARM_REG_D11_D12_D13 = 194, |
| 729 | ARM_REG_D12_D13_D14 = 195, |
| 730 | ARM_REG_D13_D14_D15 = 196, |
| 731 | ARM_REG_D14_D15_D16 = 197, |
| 732 | ARM_REG_D15_D16_D17 = 198, |
| 733 | ARM_REG_D16_D17_D18 = 199, |
| 734 | ARM_REG_D17_D18_D19 = 200, |
| 735 | ARM_REG_D18_D19_D20 = 201, |
| 736 | ARM_REG_D19_D20_D21 = 202, |
| 737 | ARM_REG_D20_D21_D22 = 203, |
| 738 | ARM_REG_D21_D22_D23 = 204, |
| 739 | ARM_REG_D22_D23_D24 = 205, |
| 740 | ARM_REG_D23_D24_D25 = 206, |
| 741 | ARM_REG_D24_D25_D26 = 207, |
| 742 | ARM_REG_D25_D26_D27 = 208, |
| 743 | ARM_REG_D26_D27_D28 = 209, |
| 744 | ARM_REG_D27_D28_D29 = 210, |
| 745 | ARM_REG_D28_D29_D30 = 211, |
| 746 | ARM_REG_D29_D30_D31 = 212, |
| 747 | ARM_REG_D0_D2_D4 = 213, |
| 748 | ARM_REG_D1_D3_D5 = 214, |
| 749 | ARM_REG_D2_D4_D6 = 215, |
| 750 | ARM_REG_D3_D5_D7 = 216, |
| 751 | ARM_REG_D4_D6_D8 = 217, |
| 752 | ARM_REG_D5_D7_D9 = 218, |
| 753 | ARM_REG_D6_D8_D10 = 219, |
| 754 | ARM_REG_D7_D9_D11 = 220, |
| 755 | ARM_REG_D8_D10_D12 = 221, |
| 756 | ARM_REG_D9_D11_D13 = 222, |
| 757 | ARM_REG_D10_D12_D14 = 223, |
| 758 | ARM_REG_D11_D13_D15 = 224, |
| 759 | ARM_REG_D12_D14_D16 = 225, |
| 760 | ARM_REG_D13_D15_D17 = 226, |
| 761 | ARM_REG_D14_D16_D18 = 227, |
| 762 | ARM_REG_D15_D17_D19 = 228, |
| 763 | ARM_REG_D16_D18_D20 = 229, |
| 764 | ARM_REG_D17_D19_D21 = 230, |
| 765 | ARM_REG_D18_D20_D22 = 231, |
| 766 | ARM_REG_D19_D21_D23 = 232, |
| 767 | ARM_REG_D20_D22_D24 = 233, |
| 768 | ARM_REG_D21_D23_D25 = 234, |
| 769 | ARM_REG_D22_D24_D26 = 235, |
| 770 | ARM_REG_D23_D25_D27 = 236, |
| 771 | ARM_REG_D24_D26_D28 = 237, |
| 772 | ARM_REG_D25_D27_D29 = 238, |
| 773 | ARM_REG_D26_D28_D30 = 239, |
| 774 | ARM_REG_D27_D29_D31 = 240, |
| 775 | ARM_REG_D0_D2_D4_D6 = 241, |
| 776 | ARM_REG_D1_D3_D5_D7 = 242, |
| 777 | ARM_REG_D2_D4_D6_D8 = 243, |
| 778 | ARM_REG_D3_D5_D7_D9 = 244, |
| 779 | ARM_REG_D4_D6_D8_D10 = 245, |
| 780 | ARM_REG_D5_D7_D9_D11 = 246, |
| 781 | ARM_REG_D6_D8_D10_D12 = 247, |
| 782 | ARM_REG_D7_D9_D11_D13 = 248, |
| 783 | ARM_REG_D8_D10_D12_D14 = 249, |
| 784 | ARM_REG_D9_D11_D13_D15 = 250, |
| 785 | ARM_REG_D10_D12_D14_D16 = 251, |
| 786 | ARM_REG_D11_D13_D15_D17 = 252, |
| 787 | ARM_REG_D12_D14_D16_D18 = 253, |
| 788 | ARM_REG_D13_D15_D17_D19 = 254, |
| 789 | ARM_REG_D14_D16_D18_D20 = 255, |
| 790 | ARM_REG_D15_D17_D19_D21 = 256, |
| 791 | ARM_REG_D16_D18_D20_D22 = 257, |
| 792 | ARM_REG_D17_D19_D21_D23 = 258, |
| 793 | ARM_REG_D18_D20_D22_D24 = 259, |
| 794 | ARM_REG_D19_D21_D23_D25 = 260, |
| 795 | ARM_REG_D20_D22_D24_D26 = 261, |
| 796 | ARM_REG_D21_D23_D25_D27 = 262, |
| 797 | ARM_REG_D22_D24_D26_D28 = 263, |
| 798 | ARM_REG_D23_D25_D27_D29 = 264, |
| 799 | ARM_REG_D24_D26_D28_D30 = 265, |
| 800 | ARM_REG_D25_D27_D29_D31 = 266, |
| 801 | ARM_REG_D1_D2 = 267, |
| 802 | ARM_REG_D3_D4 = 268, |
| 803 | ARM_REG_D5_D6 = 269, |
| 804 | ARM_REG_D7_D8 = 270, |
| 805 | ARM_REG_D9_D10 = 271, |
| 806 | ARM_REG_D11_D12 = 272, |
| 807 | ARM_REG_D13_D14 = 273, |
| 808 | ARM_REG_D15_D16 = 274, |
| 809 | ARM_REG_D17_D18 = 275, |
| 810 | ARM_REG_D19_D20 = 276, |
| 811 | ARM_REG_D21_D22 = 277, |
| 812 | ARM_REG_D23_D24 = 278, |
| 813 | ARM_REG_D25_D26 = 279, |
| 814 | ARM_REG_D27_D28 = 280, |
| 815 | ARM_REG_D29_D30 = 281, |
| 816 | ARM_REG_D1_D2_D3_D4 = 282, |
| 817 | ARM_REG_D3_D4_D5_D6 = 283, |
| 818 | ARM_REG_D5_D6_D7_D8 = 284, |
| 819 | ARM_REG_D7_D8_D9_D10 = 285, |
| 820 | ARM_REG_D9_D10_D11_D12 = 286, |
| 821 | ARM_REG_D11_D12_D13_D14 = 287, |
| 822 | ARM_REG_D13_D14_D15_D16 = 288, |
| 823 | ARM_REG_D15_D16_D17_D18 = 289, |
| 824 | ARM_REG_D17_D18_D19_D20 = 290, |
| 825 | ARM_REG_D19_D20_D21_D22 = 291, |
| 826 | ARM_REG_D21_D22_D23_D24 = 292, |
| 827 | ARM_REG_D23_D24_D25_D26 = 293, |
| 828 | ARM_REG_D25_D26_D27_D28 = 294, |
| 829 | ARM_REG_D27_D28_D29_D30 = 295, |
| 830 | ARM_REG_ENDING, // 296 |
| 831 | |
| 832 | // clang-format on |
| 833 | // generated content <ARMGenCSRegEnum.inc> end |
| 834 | |
| 835 | // alias registers |
| 836 | ARM_REG_R13 = ARM_REG_SP, |
| 837 | ARM_REG_R14 = ARM_REG_LR, |
| 838 | ARM_REG_R15 = ARM_REG_PC, |
| 839 | |
| 840 | ARM_REG_SB = ARM_REG_R9, |
| 841 | ARM_REG_SL = ARM_REG_R10, |
| 842 | ARM_REG_FP = ARM_REG_R11, |
| 843 | ARM_REG_IP = ARM_REG_R12, |
| 844 | } arm_reg; |
| 845 | |
| 846 | /// Instruction's operand referring to memory |
| 847 | /// This is associated with ARM_OP_MEM operand type above |
| 848 | typedef struct arm_op_mem { |
| 849 | arm_reg base; ///< base register |
| 850 | arm_reg index; ///< index register |
| 851 | int scale; ///< scale for index register. Can be 1 if index reg is added, -1 if it is subtracted or 0 if unset. |
| 852 | int disp; ///< displacement/offset value |
| 853 | unsigned align; ///< Alignment of base register. 0 If not set. |
| 854 | } arm_op_mem; |
| 855 | |
| 856 | typedef struct { |
| 857 | arm_sysop_reg reg; ///< The system or banked register. |
| 858 | arm_spsr_cspr_bits psr_bits; ///< SPSR/CPSR bits. |
| 859 | uint16_t sysm; ///< Raw SYSm field. UINT16_MAX if unset. |
| 860 | uint8_t msr_mask; ///< Mask of MSR instructions. UINT8_MAX if invalid. |
| 861 | } arm_sysop; |
| 862 | |
| 863 | /// Instruction operand |
| 864 | typedef struct cs_arm_op { |
| 865 | int vector_index; ///< Vector Index for some vector operands (or -1 if irrelevant) |
| 866 | |
| 867 | struct { |
| 868 | arm_shifter type; ///< The shift type |
| 869 | unsigned int value; ///< The amount to shift. If shift.type > ARM_SFT_REG, the value must be interpreted as register id. |
| 870 | } shift; |
| 871 | |
| 872 | arm_op_type type; ///< operand type |
| 873 | |
| 874 | union { |
| 875 | int reg; ///< register value for REG |
| 876 | arm_sysop sysop; ///< System operand. |
| 877 | int64_t imm; ///< immediate value for C-IMM, P-IMM or IMM operand |
| 878 | int pred; ///< Predicate operand value. |
| 879 | double fp; ///< floating point value for FP operand |
| 880 | arm_op_mem mem; ///< base/index/scale/disp value for MEM operand |
| 881 | arm_setend_type setend; ///< SETEND instruction's operand type |
| 882 | }; |
| 883 | |
| 884 | /// in some instructions, an operand can be subtracted or added to |
| 885 | /// the base register, |
| 886 | /// if TRUE, this operand is subtracted. otherwise, it is added. |
| 887 | bool subtracted; |
| 888 | |
| 889 | /// How is this operand accessed? (READ, WRITE or READ|WRITE) |
| 890 | /// This field is combined of cs_ac_type. |
| 891 | /// NOTE: this field is irrelevant if engine is compiled in DIET mode. |
| 892 | uint8_t access; |
| 893 | |
| 894 | /// Neon lane index for NEON instructions (or -1 if irrelevant) |
| 895 | int8_t neon_lane; |
| 896 | } cs_arm_op; |
| 897 | |
| 898 | typedef struct { |
| 899 | cs_ac_type mem_acc; ///< CGI memory access according to mayLoad and mayStore |
| 900 | } arm_suppl_info; |
| 901 | |
| 902 | #define NUM_ARM_OPS 36 |
| 903 | |
| 904 | /// Instruction structure |
| 905 | typedef struct cs_arm { |
| 906 | bool usermode; ///< User-mode registers to be loaded (for LDM/STM instructions) |
| 907 | int vector_size; ///< Scalar size for vector instructions |
| 908 | arm_vectordata_type vector_data; ///< Data type for elements of vector instructions |
| 909 | arm_cpsmode_type cps_mode; ///< CPS mode for CPS instruction |
| 910 | arm_cpsflag_type cps_flag; ///< CPS mode for CPS instruction |
| 911 | ARMCC_CondCodes cc; ///< conditional code for this insn |
| 912 | ARMVCC_VPTCodes vcc; ///< Vector conditional code for this instruction. |
| 913 | bool update_flags; ///< does this insn update flags? |
| 914 | bool post_index; ///< only set if writeback is 'True', if 'False' pre-index, otherwise post. |
| 915 | arm_mem_bo_opt mem_barrier; ///< Option for some memory barrier instructions |
| 916 | // Check ARM_PredBlockMask for encoding details. |
| 917 | uint8_t /* ARM_PredBlockMask */ pred_mask; ///< Used by IT/VPT block instructions. |
| 918 | /// Number of operands of this instruction, |
| 919 | /// or 0 when instruction has no operand. |
| 920 | uint8_t op_count; |
| 921 | |
| 922 | cs_arm_op operands[NUM_ARM_OPS]; ///< operands for this instruction. |
| 923 | } cs_arm; |
| 924 | |
| 925 | /// ARM instruction |
| 926 | typedef enum arm_insn { |
| 927 | // generated content <ARMGenCSInsnEnum.inc> begin |
| 928 | // clang-format off |
| 929 | |
| 930 | ARM_INS_INVALID, |
| 931 | ARM_INS_ASR, |
| 932 | ARM_INS_IT, |
| 933 | ARM_INS_LDRBT, |
| 934 | ARM_INS_LDR, |
| 935 | ARM_INS_LDRHT, |
| 936 | ARM_INS_LDRSBT, |
| 937 | ARM_INS_LDRSHT, |
| 938 | ARM_INS_LDRT, |
| 939 | ARM_INS_LSL, |
| 940 | ARM_INS_LSR, |
| 941 | ARM_INS_ROR, |
| 942 | ARM_INS_RRX, |
| 943 | ARM_INS_STRBT, |
| 944 | ARM_INS_STRT, |
| 945 | ARM_INS_VLD1, |
| 946 | ARM_INS_VLD2, |
| 947 | ARM_INS_VLD3, |
| 948 | ARM_INS_VLD4, |
| 949 | ARM_INS_VST1, |
| 950 | ARM_INS_VST2, |
| 951 | ARM_INS_VST3, |
| 952 | ARM_INS_VST4, |
| 953 | ARM_INS_LDRB, |
| 954 | ARM_INS_LDRH, |
| 955 | ARM_INS_LDRSB, |
| 956 | ARM_INS_LDRSH, |
| 957 | ARM_INS_MOVS, |
| 958 | ARM_INS_MOV, |
| 959 | ARM_INS_STRB, |
| 960 | ARM_INS_STRH, |
| 961 | ARM_INS_STR, |
| 962 | ARM_INS_ADC, |
| 963 | ARM_INS_ADD, |
| 964 | ARM_INS_ADR, |
| 965 | ARM_INS_AESD, |
| 966 | ARM_INS_AESE, |
| 967 | ARM_INS_AESIMC, |
| 968 | ARM_INS_AESMC, |
| 969 | ARM_INS_AND, |
| 970 | ARM_INS_VDOT, |
| 971 | ARM_INS_VCVT, |
| 972 | ARM_INS_VCVTB, |
| 973 | ARM_INS_VCVTT, |
| 974 | ARM_INS_BFC, |
| 975 | ARM_INS_BFI, |
| 976 | ARM_INS_BIC, |
| 977 | ARM_INS_BKPT, |
| 978 | ARM_INS_BL, |
| 979 | ARM_INS_BLX, |
| 980 | ARM_INS_BX, |
| 981 | ARM_INS_BXJ, |
| 982 | ARM_INS_B, |
| 983 | ARM_INS_CX1, |
| 984 | ARM_INS_CX1A, |
| 985 | ARM_INS_CX1D, |
| 986 | ARM_INS_CX1DA, |
| 987 | ARM_INS_CX2, |
| 988 | ARM_INS_CX2A, |
| 989 | ARM_INS_CX2D, |
| 990 | ARM_INS_CX2DA, |
| 991 | ARM_INS_CX3, |
| 992 | ARM_INS_CX3A, |
| 993 | ARM_INS_CX3D, |
| 994 | ARM_INS_CX3DA, |
| 995 | ARM_INS_VCX1A, |
| 996 | ARM_INS_VCX1, |
| 997 | ARM_INS_VCX2A, |
| 998 | ARM_INS_VCX2, |
| 999 | ARM_INS_VCX3A, |
| 1000 | ARM_INS_VCX3, |
| 1001 | ARM_INS_CDP, |
| 1002 | ARM_INS_CDP2, |
| 1003 | ARM_INS_CLREX, |
| 1004 | ARM_INS_CLZ, |
| 1005 | ARM_INS_CMN, |
| 1006 | ARM_INS_CMP, |
| 1007 | ARM_INS_CPS, |
| 1008 | ARM_INS_CRC32B, |
| 1009 | ARM_INS_CRC32CB, |
| 1010 | ARM_INS_CRC32CH, |
| 1011 | ARM_INS_CRC32CW, |
| 1012 | ARM_INS_CRC32H, |
| 1013 | ARM_INS_CRC32W, |
| 1014 | ARM_INS_DBG, |
| 1015 | ARM_INS_DMB, |
| 1016 | ARM_INS_DSB, |
| 1017 | ARM_INS_EOR, |
| 1018 | ARM_INS_ERET, |
| 1019 | ARM_INS_VMOV, |
| 1020 | ARM_INS_FLDMDBX, |
| 1021 | ARM_INS_FLDMIAX, |
| 1022 | ARM_INS_VMRS, |
| 1023 | ARM_INS_FSTMDBX, |
| 1024 | ARM_INS_FSTMIAX, |
| 1025 | ARM_INS_HINT, |
| 1026 | ARM_INS_HLT, |
| 1027 | ARM_INS_HVC, |
| 1028 | ARM_INS_ISB, |
| 1029 | ARM_INS_LDA, |
| 1030 | ARM_INS_LDAB, |
| 1031 | ARM_INS_LDAEX, |
| 1032 | ARM_INS_LDAEXB, |
| 1033 | ARM_INS_LDAEXD, |
| 1034 | ARM_INS_LDAEXH, |
| 1035 | ARM_INS_LDAH, |
| 1036 | ARM_INS_LDC2L, |
| 1037 | ARM_INS_LDC2, |
| 1038 | ARM_INS_LDCL, |
| 1039 | ARM_INS_LDC, |
| 1040 | ARM_INS_LDMDA, |
| 1041 | ARM_INS_LDMDB, |
| 1042 | ARM_INS_LDM, |
| 1043 | ARM_INS_LDMIB, |
| 1044 | ARM_INS_LDRD, |
| 1045 | ARM_INS_LDREX, |
| 1046 | ARM_INS_LDREXB, |
| 1047 | ARM_INS_LDREXD, |
| 1048 | ARM_INS_LDREXH, |
| 1049 | ARM_INS_MCR, |
| 1050 | ARM_INS_MCR2, |
| 1051 | ARM_INS_MCRR, |
| 1052 | ARM_INS_MCRR2, |
| 1053 | ARM_INS_MLA, |
| 1054 | ARM_INS_MLS, |
| 1055 | ARM_INS_MOVT, |
| 1056 | ARM_INS_MOVW, |
| 1057 | ARM_INS_MRC, |
| 1058 | ARM_INS_MRC2, |
| 1059 | ARM_INS_MRRC, |
| 1060 | ARM_INS_MRRC2, |
| 1061 | ARM_INS_MRS, |
| 1062 | ARM_INS_MSR, |
| 1063 | ARM_INS_MUL, |
| 1064 | ARM_INS_ASRL, |
| 1065 | ARM_INS_DLSTP, |
| 1066 | ARM_INS_LCTP, |
| 1067 | ARM_INS_LETP, |
| 1068 | ARM_INS_LSLL, |
| 1069 | ARM_INS_LSRL, |
| 1070 | ARM_INS_SQRSHR, |
| 1071 | ARM_INS_SQRSHRL, |
| 1072 | ARM_INS_SQSHL, |
| 1073 | ARM_INS_SQSHLL, |
| 1074 | ARM_INS_SRSHR, |
| 1075 | ARM_INS_SRSHRL, |
| 1076 | ARM_INS_UQRSHL, |
| 1077 | ARM_INS_UQRSHLL, |
| 1078 | ARM_INS_UQSHL, |
| 1079 | ARM_INS_UQSHLL, |
| 1080 | ARM_INS_URSHR, |
| 1081 | ARM_INS_URSHRL, |
| 1082 | ARM_INS_VABAV, |
| 1083 | ARM_INS_VABD, |
| 1084 | ARM_INS_VABS, |
| 1085 | ARM_INS_VADC, |
| 1086 | ARM_INS_VADCI, |
| 1087 | ARM_INS_VADDLVA, |
| 1088 | ARM_INS_VADDLV, |
| 1089 | ARM_INS_VADDVA, |
| 1090 | ARM_INS_VADDV, |
| 1091 | ARM_INS_VADD, |
| 1092 | ARM_INS_VAND, |
| 1093 | ARM_INS_VBIC, |
| 1094 | ARM_INS_VBRSR, |
| 1095 | ARM_INS_VCADD, |
| 1096 | ARM_INS_VCLS, |
| 1097 | ARM_INS_VCLZ, |
| 1098 | ARM_INS_VCMLA, |
| 1099 | ARM_INS_VCMP, |
| 1100 | ARM_INS_VCMUL, |
| 1101 | ARM_INS_VCTP, |
| 1102 | ARM_INS_VCVTA, |
| 1103 | ARM_INS_VCVTM, |
| 1104 | ARM_INS_VCVTN, |
| 1105 | ARM_INS_VCVTP, |
| 1106 | ARM_INS_VDDUP, |
| 1107 | ARM_INS_VDUP, |
| 1108 | ARM_INS_VDWDUP, |
| 1109 | ARM_INS_VEOR, |
| 1110 | ARM_INS_VFMAS, |
| 1111 | ARM_INS_VFMA, |
| 1112 | ARM_INS_VFMS, |
| 1113 | ARM_INS_VHADD, |
| 1114 | ARM_INS_VHCADD, |
| 1115 | ARM_INS_VHSUB, |
| 1116 | ARM_INS_VIDUP, |
| 1117 | ARM_INS_VIWDUP, |
| 1118 | ARM_INS_VLD20, |
| 1119 | ARM_INS_VLD21, |
| 1120 | ARM_INS_VLD40, |
| 1121 | ARM_INS_VLD41, |
| 1122 | ARM_INS_VLD42, |
| 1123 | ARM_INS_VLD43, |
| 1124 | ARM_INS_VLDRB, |
| 1125 | ARM_INS_VLDRD, |
| 1126 | ARM_INS_VLDRH, |
| 1127 | ARM_INS_VLDRW, |
| 1128 | ARM_INS_VMAXAV, |
| 1129 | ARM_INS_VMAXA, |
| 1130 | ARM_INS_VMAXNMAV, |
| 1131 | ARM_INS_VMAXNMA, |
| 1132 | ARM_INS_VMAXNMV, |
| 1133 | ARM_INS_VMAXNM, |
| 1134 | ARM_INS_VMAXV, |
| 1135 | ARM_INS_VMAX, |
| 1136 | ARM_INS_VMINAV, |
| 1137 | ARM_INS_VMINA, |
| 1138 | ARM_INS_VMINNMAV, |
| 1139 | ARM_INS_VMINNMA, |
| 1140 | ARM_INS_VMINNMV, |
| 1141 | ARM_INS_VMINNM, |
| 1142 | ARM_INS_VMINV, |
| 1143 | ARM_INS_VMIN, |
| 1144 | ARM_INS_VMLADAVA, |
| 1145 | ARM_INS_VMLADAVAX, |
| 1146 | ARM_INS_VMLADAV, |
| 1147 | ARM_INS_VMLADAVX, |
| 1148 | ARM_INS_VMLALDAVA, |
| 1149 | ARM_INS_VMLALDAVAX, |
| 1150 | ARM_INS_VMLALDAV, |
| 1151 | ARM_INS_VMLALDAVX, |
| 1152 | ARM_INS_VMLAS, |
| 1153 | ARM_INS_VMLA, |
| 1154 | ARM_INS_VMLSDAVA, |
| 1155 | ARM_INS_VMLSDAVAX, |
| 1156 | ARM_INS_VMLSDAV, |
| 1157 | ARM_INS_VMLSDAVX, |
| 1158 | ARM_INS_VMLSLDAVA, |
| 1159 | ARM_INS_VMLSLDAVAX, |
| 1160 | ARM_INS_VMLSLDAV, |
| 1161 | ARM_INS_VMLSLDAVX, |
| 1162 | ARM_INS_VMOVLB, |
| 1163 | ARM_INS_VMOVLT, |
| 1164 | ARM_INS_VMOVNB, |
| 1165 | ARM_INS_VMOVNT, |
| 1166 | ARM_INS_VMULH, |
| 1167 | ARM_INS_VMULLB, |
| 1168 | ARM_INS_VMULLT, |
| 1169 | ARM_INS_VMUL, |
| 1170 | ARM_INS_VMVN, |
| 1171 | ARM_INS_VNEG, |
| 1172 | ARM_INS_VORN, |
| 1173 | ARM_INS_VORR, |
| 1174 | ARM_INS_VPNOT, |
| 1175 | ARM_INS_VPSEL, |
| 1176 | ARM_INS_VPST, |
| 1177 | ARM_INS_VPT, |
| 1178 | ARM_INS_VQABS, |
| 1179 | ARM_INS_VQADD, |
| 1180 | ARM_INS_VQDMLADHX, |
| 1181 | ARM_INS_VQDMLADH, |
| 1182 | ARM_INS_VQDMLAH, |
| 1183 | ARM_INS_VQDMLASH, |
| 1184 | ARM_INS_VQDMLSDHX, |
| 1185 | ARM_INS_VQDMLSDH, |
| 1186 | ARM_INS_VQDMULH, |
| 1187 | ARM_INS_VQDMULLB, |
| 1188 | ARM_INS_VQDMULLT, |
| 1189 | ARM_INS_VQMOVNB, |
| 1190 | ARM_INS_VQMOVNT, |
| 1191 | ARM_INS_VQMOVUNB, |
| 1192 | ARM_INS_VQMOVUNT, |
| 1193 | ARM_INS_VQNEG, |
| 1194 | ARM_INS_VQRDMLADHX, |
| 1195 | ARM_INS_VQRDMLADH, |
| 1196 | ARM_INS_VQRDMLAH, |
| 1197 | ARM_INS_VQRDMLASH, |
| 1198 | ARM_INS_VQRDMLSDHX, |
| 1199 | ARM_INS_VQRDMLSDH, |
| 1200 | ARM_INS_VQRDMULH, |
| 1201 | ARM_INS_VQRSHL, |
| 1202 | ARM_INS_VQRSHRNB, |
| 1203 | ARM_INS_VQRSHRNT, |
| 1204 | ARM_INS_VQRSHRUNB, |
| 1205 | ARM_INS_VQRSHRUNT, |
| 1206 | ARM_INS_VQSHLU, |
| 1207 | ARM_INS_VQSHL, |
| 1208 | ARM_INS_VQSHRNB, |
| 1209 | ARM_INS_VQSHRNT, |
| 1210 | ARM_INS_VQSHRUNB, |
| 1211 | ARM_INS_VQSHRUNT, |
| 1212 | ARM_INS_VQSUB, |
| 1213 | ARM_INS_VREV16, |
| 1214 | ARM_INS_VREV32, |
| 1215 | ARM_INS_VREV64, |
| 1216 | ARM_INS_VRHADD, |
| 1217 | ARM_INS_VRINTA, |
| 1218 | ARM_INS_VRINTM, |
| 1219 | ARM_INS_VRINTN, |
| 1220 | ARM_INS_VRINTP, |
| 1221 | ARM_INS_VRINTX, |
| 1222 | ARM_INS_VRINTZ, |
| 1223 | ARM_INS_VRMLALDAVHA, |
| 1224 | ARM_INS_VRMLALDAVHAX, |
| 1225 | ARM_INS_VRMLALDAVH, |
| 1226 | ARM_INS_VRMLALDAVHX, |
| 1227 | ARM_INS_VRMLSLDAVHA, |
| 1228 | ARM_INS_VRMLSLDAVHAX, |
| 1229 | ARM_INS_VRMLSLDAVH, |
| 1230 | ARM_INS_VRMLSLDAVHX, |
| 1231 | ARM_INS_VRMULH, |
| 1232 | ARM_INS_VRSHL, |
| 1233 | ARM_INS_VRSHRNB, |
| 1234 | ARM_INS_VRSHRNT, |
| 1235 | ARM_INS_VRSHR, |
| 1236 | ARM_INS_VSBC, |
| 1237 | ARM_INS_VSBCI, |
| 1238 | ARM_INS_VSHLC, |
| 1239 | ARM_INS_VSHLLB, |
| 1240 | ARM_INS_VSHLLT, |
| 1241 | ARM_INS_VSHL, |
| 1242 | ARM_INS_VSHRNB, |
| 1243 | ARM_INS_VSHRNT, |
| 1244 | ARM_INS_VSHR, |
| 1245 | ARM_INS_VSLI, |
| 1246 | ARM_INS_VSRI, |
| 1247 | ARM_INS_VST20, |
| 1248 | ARM_INS_VST21, |
| 1249 | ARM_INS_VST40, |
| 1250 | ARM_INS_VST41, |
| 1251 | ARM_INS_VST42, |
| 1252 | ARM_INS_VST43, |
| 1253 | ARM_INS_VSTRB, |
| 1254 | ARM_INS_VSTRD, |
| 1255 | ARM_INS_VSTRH, |
| 1256 | ARM_INS_VSTRW, |
| 1257 | ARM_INS_VSUB, |
| 1258 | ARM_INS_WLSTP, |
| 1259 | ARM_INS_MVN, |
| 1260 | ARM_INS_ORR, |
| 1261 | ARM_INS_PKHBT, |
| 1262 | ARM_INS_PKHTB, |
| 1263 | ARM_INS_PLDW, |
| 1264 | ARM_INS_PLD, |
| 1265 | ARM_INS_PLI, |
| 1266 | ARM_INS_QADD, |
| 1267 | ARM_INS_QADD16, |
| 1268 | ARM_INS_QADD8, |
| 1269 | ARM_INS_QASX, |
| 1270 | ARM_INS_QDADD, |
| 1271 | ARM_INS_QDSUB, |
| 1272 | ARM_INS_QSAX, |
| 1273 | ARM_INS_QSUB, |
| 1274 | ARM_INS_QSUB16, |
| 1275 | ARM_INS_QSUB8, |
| 1276 | ARM_INS_RBIT, |
| 1277 | ARM_INS_REV, |
| 1278 | ARM_INS_REV16, |
| 1279 | ARM_INS_REVSH, |
| 1280 | ARM_INS_RFEDA, |
| 1281 | ARM_INS_RFEDB, |
| 1282 | ARM_INS_RFEIA, |
| 1283 | ARM_INS_RFEIB, |
| 1284 | ARM_INS_RSB, |
| 1285 | ARM_INS_RSC, |
| 1286 | ARM_INS_SADD16, |
| 1287 | ARM_INS_SADD8, |
| 1288 | ARM_INS_SASX, |
| 1289 | ARM_INS_SB, |
| 1290 | ARM_INS_SBC, |
| 1291 | ARM_INS_SBFX, |
| 1292 | ARM_INS_SDIV, |
| 1293 | ARM_INS_SEL, |
| 1294 | ARM_INS_SETEND, |
| 1295 | ARM_INS_SETPAN, |
| 1296 | ARM_INS_SHA1C, |
| 1297 | ARM_INS_SHA1H, |
| 1298 | ARM_INS_SHA1M, |
| 1299 | ARM_INS_SHA1P, |
| 1300 | ARM_INS_SHA1SU0, |
| 1301 | ARM_INS_SHA1SU1, |
| 1302 | ARM_INS_SHA256H, |
| 1303 | ARM_INS_SHA256H2, |
| 1304 | ARM_INS_SHA256SU0, |
| 1305 | ARM_INS_SHA256SU1, |
| 1306 | ARM_INS_SHADD16, |
| 1307 | ARM_INS_SHADD8, |
| 1308 | ARM_INS_SHASX, |
| 1309 | ARM_INS_SHSAX, |
| 1310 | ARM_INS_SHSUB16, |
| 1311 | ARM_INS_SHSUB8, |
| 1312 | ARM_INS_SMC, |
| 1313 | ARM_INS_SMLABB, |
| 1314 | ARM_INS_SMLABT, |
| 1315 | ARM_INS_SMLAD, |
| 1316 | ARM_INS_SMLADX, |
| 1317 | ARM_INS_SMLAL, |
| 1318 | ARM_INS_SMLALBB, |
| 1319 | ARM_INS_SMLALBT, |
| 1320 | ARM_INS_SMLALD, |
| 1321 | ARM_INS_SMLALDX, |
| 1322 | ARM_INS_SMLALTB, |
| 1323 | ARM_INS_SMLALTT, |
| 1324 | ARM_INS_SMLATB, |
| 1325 | ARM_INS_SMLATT, |
| 1326 | ARM_INS_SMLAWB, |
| 1327 | ARM_INS_SMLAWT, |
| 1328 | ARM_INS_SMLSD, |
| 1329 | ARM_INS_SMLSDX, |
| 1330 | ARM_INS_SMLSLD, |
| 1331 | ARM_INS_SMLSLDX, |
| 1332 | ARM_INS_SMMLA, |
| 1333 | ARM_INS_SMMLAR, |
| 1334 | ARM_INS_SMMLS, |
| 1335 | ARM_INS_SMMLSR, |
| 1336 | ARM_INS_SMMUL, |
| 1337 | ARM_INS_SMMULR, |
| 1338 | ARM_INS_SMUAD, |
| 1339 | ARM_INS_SMUADX, |
| 1340 | ARM_INS_SMULBB, |
| 1341 | ARM_INS_SMULBT, |
| 1342 | ARM_INS_SMULL, |
| 1343 | ARM_INS_SMULTB, |
| 1344 | ARM_INS_SMULTT, |
| 1345 | ARM_INS_SMULWB, |
| 1346 | ARM_INS_SMULWT, |
| 1347 | ARM_INS_SMUSD, |
| 1348 | ARM_INS_SMUSDX, |
| 1349 | ARM_INS_SRSDA, |
| 1350 | ARM_INS_SRSDB, |
| 1351 | ARM_INS_SRSIA, |
| 1352 | ARM_INS_SRSIB, |
| 1353 | ARM_INS_SSAT, |
| 1354 | ARM_INS_SSAT16, |
| 1355 | ARM_INS_SSAX, |
| 1356 | ARM_INS_SSUB16, |
| 1357 | ARM_INS_SSUB8, |
| 1358 | ARM_INS_STC2L, |
| 1359 | ARM_INS_STC2, |
| 1360 | ARM_INS_STCL, |
| 1361 | ARM_INS_STC, |
| 1362 | ARM_INS_STL, |
| 1363 | ARM_INS_STLB, |
| 1364 | ARM_INS_STLEX, |
| 1365 | ARM_INS_STLEXB, |
| 1366 | ARM_INS_STLEXD, |
| 1367 | ARM_INS_STLEXH, |
| 1368 | ARM_INS_STLH, |
| 1369 | ARM_INS_STMDA, |
| 1370 | ARM_INS_STMDB, |
| 1371 | ARM_INS_STM, |
| 1372 | ARM_INS_STMIB, |
| 1373 | ARM_INS_STRD, |
| 1374 | ARM_INS_STREX, |
| 1375 | ARM_INS_STREXB, |
| 1376 | ARM_INS_STREXD, |
| 1377 | ARM_INS_STREXH, |
| 1378 | ARM_INS_STRHT, |
| 1379 | ARM_INS_SUB, |
| 1380 | ARM_INS_SVC, |
| 1381 | ARM_INS_SWP, |
| 1382 | ARM_INS_SWPB, |
| 1383 | ARM_INS_SXTAB, |
| 1384 | ARM_INS_SXTAB16, |
| 1385 | ARM_INS_SXTAH, |
| 1386 | ARM_INS_SXTB, |
| 1387 | ARM_INS_SXTB16, |
| 1388 | ARM_INS_SXTH, |
| 1389 | ARM_INS_TEQ, |
| 1390 | ARM_INS_TRAP, |
| 1391 | ARM_INS_TSB, |
| 1392 | ARM_INS_TST, |
| 1393 | ARM_INS_UADD16, |
| 1394 | ARM_INS_UADD8, |
| 1395 | ARM_INS_UASX, |
| 1396 | ARM_INS_UBFX, |
| 1397 | ARM_INS_UDF, |
| 1398 | ARM_INS_UDIV, |
| 1399 | ARM_INS_UHADD16, |
| 1400 | ARM_INS_UHADD8, |
| 1401 | ARM_INS_UHASX, |
| 1402 | ARM_INS_UHSAX, |
| 1403 | ARM_INS_UHSUB16, |
| 1404 | ARM_INS_UHSUB8, |
| 1405 | ARM_INS_UMAAL, |
| 1406 | ARM_INS_UMLAL, |
| 1407 | ARM_INS_UMULL, |
| 1408 | ARM_INS_UQADD16, |
| 1409 | ARM_INS_UQADD8, |
| 1410 | ARM_INS_UQASX, |
| 1411 | ARM_INS_UQSAX, |
| 1412 | ARM_INS_UQSUB16, |
| 1413 | ARM_INS_UQSUB8, |
| 1414 | ARM_INS_USAD8, |
| 1415 | ARM_INS_USADA8, |
| 1416 | ARM_INS_USAT, |
| 1417 | ARM_INS_USAT16, |
| 1418 | ARM_INS_USAX, |
| 1419 | ARM_INS_USUB16, |
| 1420 | ARM_INS_USUB8, |
| 1421 | ARM_INS_UXTAB, |
| 1422 | ARM_INS_UXTAB16, |
| 1423 | ARM_INS_UXTAH, |
| 1424 | ARM_INS_UXTB, |
| 1425 | ARM_INS_UXTB16, |
| 1426 | ARM_INS_UXTH, |
| 1427 | ARM_INS_VABAL, |
| 1428 | ARM_INS_VABA, |
| 1429 | ARM_INS_VABDL, |
| 1430 | ARM_INS_VACGE, |
| 1431 | ARM_INS_VACGT, |
| 1432 | ARM_INS_VADDHN, |
| 1433 | ARM_INS_VADDL, |
| 1434 | ARM_INS_VADDW, |
| 1435 | ARM_INS_VFMAB, |
| 1436 | ARM_INS_VFMAT, |
| 1437 | ARM_INS_VBIF, |
| 1438 | ARM_INS_VBIT, |
| 1439 | ARM_INS_VBSL, |
| 1440 | ARM_INS_VCEQ, |
| 1441 | ARM_INS_VCGE, |
| 1442 | ARM_INS_VCGT, |
| 1443 | ARM_INS_VCLE, |
| 1444 | ARM_INS_VCLT, |
| 1445 | ARM_INS_VCMPE, |
| 1446 | ARM_INS_VCNT, |
| 1447 | ARM_INS_VDIV, |
| 1448 | ARM_INS_VEXT, |
| 1449 | ARM_INS_VFMAL, |
| 1450 | ARM_INS_VFMSL, |
| 1451 | ARM_INS_VFNMA, |
| 1452 | ARM_INS_VFNMS, |
| 1453 | ARM_INS_VINS, |
| 1454 | ARM_INS_VJCVT, |
| 1455 | ARM_INS_VLDMDB, |
| 1456 | ARM_INS_VLDMIA, |
| 1457 | ARM_INS_VLDR, |
| 1458 | ARM_INS_VLLDM, |
| 1459 | ARM_INS_VLSTM, |
| 1460 | ARM_INS_VMLAL, |
| 1461 | ARM_INS_VMLS, |
| 1462 | ARM_INS_VMLSL, |
| 1463 | ARM_INS_VMMLA, |
| 1464 | ARM_INS_VMOVX, |
| 1465 | ARM_INS_VMOVL, |
| 1466 | ARM_INS_VMOVN, |
| 1467 | ARM_INS_VMSR, |
| 1468 | ARM_INS_VMULL, |
| 1469 | ARM_INS_VNMLA, |
| 1470 | ARM_INS_VNMLS, |
| 1471 | ARM_INS_VNMUL, |
| 1472 | ARM_INS_VPADAL, |
| 1473 | ARM_INS_VPADDL, |
| 1474 | ARM_INS_VPADD, |
| 1475 | ARM_INS_VPMAX, |
| 1476 | ARM_INS_VPMIN, |
| 1477 | ARM_INS_VQDMLAL, |
| 1478 | ARM_INS_VQDMLSL, |
| 1479 | ARM_INS_VQDMULL, |
| 1480 | ARM_INS_VQMOVUN, |
| 1481 | ARM_INS_VQMOVN, |
| 1482 | ARM_INS_VQRDMLSH, |
| 1483 | ARM_INS_VQRSHRN, |
| 1484 | ARM_INS_VQRSHRUN, |
| 1485 | ARM_INS_VQSHRN, |
| 1486 | ARM_INS_VQSHRUN, |
| 1487 | ARM_INS_VRADDHN, |
| 1488 | ARM_INS_VRECPE, |
| 1489 | ARM_INS_VRECPS, |
| 1490 | ARM_INS_VRINTR, |
| 1491 | ARM_INS_VRSHRN, |
| 1492 | ARM_INS_VRSQRTE, |
| 1493 | ARM_INS_VRSQRTS, |
| 1494 | ARM_INS_VRSRA, |
| 1495 | ARM_INS_VRSUBHN, |
| 1496 | ARM_INS_VSCCLRM, |
| 1497 | ARM_INS_VSDOT, |
| 1498 | ARM_INS_VSELEQ, |
| 1499 | ARM_INS_VSELGE, |
| 1500 | ARM_INS_VSELGT, |
| 1501 | ARM_INS_VSELVS, |
| 1502 | ARM_INS_VSHLL, |
| 1503 | ARM_INS_VSHRN, |
| 1504 | ARM_INS_VSMMLA, |
| 1505 | ARM_INS_VSQRT, |
| 1506 | ARM_INS_VSRA, |
| 1507 | ARM_INS_VSTMDB, |
| 1508 | ARM_INS_VSTMIA, |
| 1509 | ARM_INS_VSTR, |
| 1510 | ARM_INS_VSUBHN, |
| 1511 | ARM_INS_VSUBL, |
| 1512 | ARM_INS_VSUBW, |
| 1513 | ARM_INS_VSUDOT, |
| 1514 | ARM_INS_VSWP, |
| 1515 | ARM_INS_VTBL, |
| 1516 | ARM_INS_VTBX, |
| 1517 | ARM_INS_VCVTR, |
| 1518 | ARM_INS_VTRN, |
| 1519 | ARM_INS_VTST, |
| 1520 | ARM_INS_VUDOT, |
| 1521 | ARM_INS_VUMMLA, |
| 1522 | ARM_INS_VUSDOT, |
| 1523 | ARM_INS_VUSMMLA, |
| 1524 | ARM_INS_VUZP, |
| 1525 | ARM_INS_VZIP, |
| 1526 | ARM_INS_ADDW, |
| 1527 | ARM_INS_AUT, |
| 1528 | ARM_INS_AUTG, |
| 1529 | ARM_INS_BFL, |
| 1530 | ARM_INS_BFLX, |
| 1531 | ARM_INS_BF, |
| 1532 | ARM_INS_BFCSEL, |
| 1533 | ARM_INS_BFX, |
| 1534 | ARM_INS_BTI, |
| 1535 | ARM_INS_BXAUT, |
| 1536 | ARM_INS_CLRM, |
| 1537 | ARM_INS_CSEL, |
| 1538 | ARM_INS_CSINC, |
| 1539 | ARM_INS_CSINV, |
| 1540 | ARM_INS_CSNEG, |
| 1541 | ARM_INS_DCPS1, |
| 1542 | ARM_INS_DCPS2, |
| 1543 | ARM_INS_DCPS3, |
| 1544 | ARM_INS_DLS, |
| 1545 | ARM_INS_LE, |
| 1546 | ARM_INS_ORN, |
| 1547 | ARM_INS_PAC, |
| 1548 | ARM_INS_PACBTI, |
| 1549 | ARM_INS_PACG, |
| 1550 | ARM_INS_SG, |
| 1551 | ARM_INS_SUBS, |
| 1552 | ARM_INS_SUBW, |
| 1553 | ARM_INS_TBB, |
| 1554 | ARM_INS_TBH, |
| 1555 | ARM_INS_TT, |
| 1556 | ARM_INS_TTA, |
| 1557 | ARM_INS_TTAT, |
| 1558 | ARM_INS_TTT, |
| 1559 | ARM_INS_WLS, |
| 1560 | ARM_INS_BLXNS, |
| 1561 | ARM_INS_BXNS, |
| 1562 | ARM_INS_CBNZ, |
| 1563 | ARM_INS_CBZ, |
| 1564 | ARM_INS_POP, |
| 1565 | ARM_INS_PUSH, |
| 1566 | ARM_INS___BRKDIV0, |
| 1567 | |
| 1568 | // clang-format on |
| 1569 | // generated content <ARMGenCSInsnEnum.inc> end |
| 1570 | |
| 1571 | ARM_INS_ENDING, // <-- mark the end of the list of instructions |
| 1572 | |
| 1573 | ARM_INS_ALIAS_BEGIN, |
| 1574 | // generated content <ARMGenCSAliasEnum.inc> begin |
| 1575 | // clang-format off |
| 1576 | |
| 1577 | ARM_INS_ALIAS_VMOV, // Real instr.: ARM_MVE_VORR |
| 1578 | ARM_INS_ALIAS_NOP, // Real instr.: ARM_HINT |
| 1579 | ARM_INS_ALIAS_YIELD, // Real instr.: ARM_HINT |
| 1580 | ARM_INS_ALIAS_WFE, // Real instr.: ARM_HINT |
| 1581 | ARM_INS_ALIAS_WFI, // Real instr.: ARM_HINT |
| 1582 | ARM_INS_ALIAS_SEV, // Real instr.: ARM_HINT |
| 1583 | ARM_INS_ALIAS_SEVL, // Real instr.: ARM_HINT |
| 1584 | ARM_INS_ALIAS_ESB, // Real instr.: ARM_HINT |
| 1585 | ARM_INS_ALIAS_CSDB, // Real instr.: ARM_HINT |
| 1586 | ARM_INS_ALIAS_CLRBHB, // Real instr.: ARM_HINT |
| 1587 | ARM_INS_ALIAS_PACBTI, // Real instr.: ARM_t2HINT |
| 1588 | ARM_INS_ALIAS_BTI, // Real instr.: ARM_t2HINT |
| 1589 | ARM_INS_ALIAS_PAC, // Real instr.: ARM_t2HINT |
| 1590 | ARM_INS_ALIAS_AUT, // Real instr.: ARM_t2HINT |
| 1591 | ARM_INS_ALIAS_SSBB, // Real instr.: ARM_t2DSB |
| 1592 | ARM_INS_ALIAS_PSSBB, // Real instr.: ARM_t2DSB |
| 1593 | ARM_INS_ALIAS_DFB, // Real instr.: ARM_t2DSB |
| 1594 | ARM_INS_ALIAS_CSETM, // Real instr.: ARM_t2CSINV |
| 1595 | ARM_INS_ALIAS_CSET, // Real instr.: ARM_t2CSINC |
| 1596 | ARM_INS_ALIAS_CINC, // Real instr.: ARM_t2CSINC |
| 1597 | ARM_INS_ALIAS_CINV, // Real instr.: ARM_t2CSINV |
| 1598 | ARM_INS_ALIAS_CNEG, // Real instr.: ARM_t2CSNEG |
| 1599 | ARM_INS_ALIAS_VMLAV, // Real instr.: ARM_MVE_VMLADAVs8 |
| 1600 | ARM_INS_ALIAS_VMLAVA, // Real instr.: ARM_MVE_VMLADAVas8 |
| 1601 | ARM_INS_ALIAS_VRMLALVH, // Real instr.: ARM_MVE_VRMLALDAVHs32 |
| 1602 | ARM_INS_ALIAS_VRMLALVHA, // Real instr.: ARM_MVE_VRMLALDAVHas32 |
| 1603 | ARM_INS_ALIAS_VMLALV, // Real instr.: ARM_MVE_VMLALDAVs16 |
| 1604 | ARM_INS_ALIAS_VMLALVA, // Real instr.: ARM_MVE_VMLALDAVas16 |
| 1605 | ARM_INS_ALIAS_VBIC, // Real instr.: ARM_MVE_VBIC |
| 1606 | ARM_INS_ALIAS_VEOR, // Real instr.: ARM_MVE_VEOR |
| 1607 | ARM_INS_ALIAS_VORN, // Real instr.: ARM_MVE_VORN |
| 1608 | ARM_INS_ALIAS_VORR, // Real instr.: ARM_MVE_VORR |
| 1609 | ARM_INS_ALIAS_VAND, // Real instr.: ARM_MVE_VAND |
| 1610 | ARM_INS_ALIAS_VPSEL, // Real instr.: ARM_MVE_VPSEL |
| 1611 | ARM_INS_ALIAS_ERET, // Real instr.: ARM_t2SUBS_PC_LR |
| 1612 | |
| 1613 | // clang-format on |
| 1614 | // generated content <ARMGenCSAliasEnum.inc> end |
| 1615 | |
| 1616 | // Hardcoded in LLVM printer |
| 1617 | ARM_INS_ALIAS_ASR, |
| 1618 | ARM_INS_ALIAS_LSL, |
| 1619 | ARM_INS_ALIAS_LSR, |
| 1620 | ARM_INS_ALIAS_ROR, |
| 1621 | ARM_INS_ALIAS_RRX, |
| 1622 | ARM_INS_ALIAS_UXTW, |
| 1623 | ARM_INS_ALIAS_LDM, |
| 1624 | ARM_INS_ALIAS_POP, |
| 1625 | ARM_INS_ALIAS_PUSH, |
| 1626 | ARM_INS_ALIAS_POPW, |
| 1627 | ARM_INS_ALIAS_PUSHW, |
| 1628 | ARM_INS_ALIAS_VPOP, |
| 1629 | ARM_INS_ALIAS_VPUSH, |
| 1630 | |
| 1631 | ARM_INS_ALIAS_END, |
| 1632 | } arm_insn; |
| 1633 | |
| 1634 | /// Group of ARM instructions |
| 1635 | typedef enum arm_insn_group { |
| 1636 | ARM_GRP_INVALID = 0, ///< = CS_GRP_INVALID |
| 1637 | |
| 1638 | // Generic groups |
| 1639 | // all jump instructions (conditional+direct+indirect jumps) |
| 1640 | ARM_GRP_JUMP, ///< = CS_GRP_JUMP |
| 1641 | ARM_GRP_CALL, ///< = CS_GRP_CALL |
| 1642 | ARM_GRP_RET, ///< = CS_GRP_RET |
| 1643 | ARM_GRP_INT = 4, ///< = CS_GRP_INT |
| 1644 | ARM_GRP_PRIVILEGE = 6, ///< = CS_GRP_PRIVILEGE |
| 1645 | ARM_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE |
| 1646 | |
| 1647 | // Architecture-specific groups |
| 1648 | // generated content <ARMGenCSFeatureEnum.inc> begin |
| 1649 | // clang-format off |
| 1650 | |
| 1651 | ARM_FEATURE_HASV4T = 128, |
| 1652 | ARM_FEATURE_HASV5T, |
| 1653 | ARM_FEATURE_HASV5TE, |
| 1654 | ARM_FEATURE_HASV6, |
| 1655 | ARM_FEATURE_HASV6M, |
| 1656 | ARM_FEATURE_HASV8MBASELINE, |
| 1657 | ARM_FEATURE_HASV8MMAINLINE, |
| 1658 | ARM_FEATURE_HASV8_1MMAINLINE, |
| 1659 | ARM_FEATURE_HASMVEINT, |
| 1660 | ARM_FEATURE_HASMVEFLOAT, |
| 1661 | ARM_FEATURE_HASCDE, |
| 1662 | ARM_FEATURE_HASFPREGS, |
| 1663 | ARM_FEATURE_HASFPREGS16, |
| 1664 | ARM_FEATURE_HASNOFPREGS16, |
| 1665 | ARM_FEATURE_HASFPREGS64, |
| 1666 | ARM_FEATURE_HASFPREGSV8_1M, |
| 1667 | ARM_FEATURE_HASV6T2, |
| 1668 | ARM_FEATURE_HASV6K, |
| 1669 | ARM_FEATURE_HASV7, |
| 1670 | ARM_FEATURE_HASV8, |
| 1671 | ARM_FEATURE_PREV8, |
| 1672 | ARM_FEATURE_HASV8_1A, |
| 1673 | ARM_FEATURE_HASV8_2A, |
| 1674 | ARM_FEATURE_HASV8_3A, |
| 1675 | ARM_FEATURE_HASV8_4A, |
| 1676 | ARM_FEATURE_HASV8_5A, |
| 1677 | ARM_FEATURE_HASV8_6A, |
| 1678 | ARM_FEATURE_HASV8_7A, |
| 1679 | ARM_FEATURE_HASVFP2, |
| 1680 | ARM_FEATURE_HASVFP3, |
| 1681 | ARM_FEATURE_HASVFP4, |
| 1682 | ARM_FEATURE_HASDPVFP, |
| 1683 | ARM_FEATURE_HASFPARMV8, |
| 1684 | ARM_FEATURE_HASNEON, |
| 1685 | ARM_FEATURE_HASSHA2, |
| 1686 | ARM_FEATURE_HASAES, |
| 1687 | ARM_FEATURE_HASCRYPTO, |
| 1688 | ARM_FEATURE_HASDOTPROD, |
| 1689 | ARM_FEATURE_HASCRC, |
| 1690 | ARM_FEATURE_HASRAS, |
| 1691 | ARM_FEATURE_HASLOB, |
| 1692 | ARM_FEATURE_HASPACBTI, |
| 1693 | ARM_FEATURE_HASFP16, |
| 1694 | ARM_FEATURE_HASFULLFP16, |
| 1695 | ARM_FEATURE_HASFP16FML, |
| 1696 | ARM_FEATURE_HASBF16, |
| 1697 | ARM_FEATURE_HASMATMULINT8, |
| 1698 | ARM_FEATURE_HASDIVIDEINTHUMB, |
| 1699 | ARM_FEATURE_HASDIVIDEINARM, |
| 1700 | ARM_FEATURE_HASDSP, |
| 1701 | ARM_FEATURE_HASDB, |
| 1702 | ARM_FEATURE_HASDFB, |
| 1703 | ARM_FEATURE_HASV7CLREX, |
| 1704 | ARM_FEATURE_HASACQUIRERELEASE, |
| 1705 | ARM_FEATURE_HASMP, |
| 1706 | ARM_FEATURE_HASVIRTUALIZATION, |
| 1707 | ARM_FEATURE_HASTRUSTZONE, |
| 1708 | ARM_FEATURE_HAS8MSECEXT, |
| 1709 | ARM_FEATURE_ISTHUMB, |
| 1710 | ARM_FEATURE_ISTHUMB2, |
| 1711 | ARM_FEATURE_ISMCLASS, |
| 1712 | ARM_FEATURE_ISNOTMCLASS, |
| 1713 | ARM_FEATURE_ISARM, |
| 1714 | ARM_FEATURE_USENACLTRAP, |
| 1715 | ARM_FEATURE_USENEGATIVEIMMEDIATES, |
| 1716 | ARM_FEATURE_HASSB, |
| 1717 | ARM_FEATURE_HASCLRBHB, |
| 1718 | |
| 1719 | // clang-format on |
| 1720 | // generated content <ARMGenCSFeatureEnum.inc> end |
| 1721 | |
| 1722 | ARM_GRP_ENDING, |
| 1723 | } arm_insn_group; |
| 1724 | |
| 1725 | #ifdef CAPSTONE_ARM_COMPAT_HEADER |
| 1726 | #define arm_cc ARMCC_CondCodes |
| 1727 | #define ARM_CC_EQ ARMCC_EQ |
| 1728 | #define ARM_CC_NE ARMCC_NE |
| 1729 | #define ARM_CC_HS ARMCC_HS |
| 1730 | #define ARM_CC_LO ARMCC_LO |
| 1731 | #define ARM_CC_MI ARMCC_MI |
| 1732 | #define ARM_CC_PL ARMCC_PL |
| 1733 | #define ARM_CC_VS ARMCC_VS |
| 1734 | #define ARM_CC_VC ARMCC_VC |
| 1735 | #define ARM_CC_HI ARMCC_HI |
| 1736 | #define ARM_CC_LS ARMCC_LS |
| 1737 | #define ARM_CC_GE ARMCC_GE |
| 1738 | #define ARM_CC_LT ARMCC_LT |
| 1739 | #define ARM_CC_GT ARMCC_GT |
| 1740 | #define ARM_CC_LE ARMCC_LE |
| 1741 | #define ARM_CC_AL ARMCC_AL |
| 1742 | #define ARM_CC_INVALID ARMCC_Invalid |
| 1743 | #endif |
| 1744 | |
| 1745 | #ifdef __cplusplus |
| 1746 | } |
| 1747 | #endif |
| 1748 | |
| 1749 | #endif |
| 1750 |