Home | History | Annotate | Download | only in include
      1 #ifndef CAPSTONE_ARM_H
      2 #define CAPSTONE_ARM_H
      3 
      4 /* Capstone Disassembly Engine */
      5 /* By Nguyen Anh Quynh <aquynh (at) gmail.com>, 2013-2014 */
      6 
      7 #ifdef __cplusplus
      8 extern "C" {
      9 #endif
     10 
     11 #if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
     12 #include <stdint.h>
     13 #endif
     14 
     15 #include "platform.h"
     16 
     17 #ifdef _MSC_VER
     18 #pragma warning(disable:4201)
     19 #endif
     20 
     21 //> ARM shift type
     22 typedef enum arm_shifter {
     23 	ARM_SFT_INVALID = 0,
     24 	ARM_SFT_ASR,	// shift with immediate const
     25 	ARM_SFT_LSL,	// shift with immediate const
     26 	ARM_SFT_LSR,	// shift with immediate const
     27 	ARM_SFT_ROR,	// shift with immediate const
     28 	ARM_SFT_RRX,	// shift with immediate const
     29 	ARM_SFT_ASR_REG,	// shift with register
     30 	ARM_SFT_LSL_REG,	// shift with register
     31 	ARM_SFT_LSR_REG,	// shift with register
     32 	ARM_SFT_ROR_REG,	// shift with register
     33 	ARM_SFT_RRX_REG,	// shift with register
     34 } arm_shifter;
     35 
     36 //> ARM condition code
     37 typedef enum arm_cc {
     38 	ARM_CC_INVALID = 0,
     39 	ARM_CC_EQ,            // Equal                      Equal
     40 	ARM_CC_NE,            // Not equal                  Not equal, or unordered
     41 	ARM_CC_HS,            // Carry set                  >, ==, or unordered
     42 	ARM_CC_LO,            // Carry clear                Less than
     43 	ARM_CC_MI,            // Minus, negative            Less than
     44 	ARM_CC_PL,            // Plus, positive or zero     >, ==, or unordered
     45 	ARM_CC_VS,            // Overflow                   Unordered
     46 	ARM_CC_VC,            // No overflow                Not unordered
     47 	ARM_CC_HI,            // Unsigned higher            Greater than, or unordered
     48 	ARM_CC_LS,            // Unsigned lower or same     Less than or equal
     49 	ARM_CC_GE,            // Greater than or equal      Greater than or equal
     50 	ARM_CC_LT,            // Less than                  Less than, or unordered
     51 	ARM_CC_GT,            // Greater than               Greater than
     52 	ARM_CC_LE,            // Less than or equal         <, ==, or unordered
     53 	ARM_CC_AL             // Always (unconditional)     Always (unconditional)
     54 } arm_cc;
     55 
     56 typedef enum arm_sysreg {
     57 	//> Special registers for MSR
     58 	ARM_SYSREG_INVALID = 0,
     59 
     60 	// SPSR* registers can be OR combined
     61 	ARM_SYSREG_SPSR_C = 1,
     62 	ARM_SYSREG_SPSR_X = 2,
     63 	ARM_SYSREG_SPSR_S = 4,
     64 	ARM_SYSREG_SPSR_F = 8,
     65 
     66 	// CPSR* registers can be OR combined
     67 	ARM_SYSREG_CPSR_C = 16,
     68 	ARM_SYSREG_CPSR_X = 32,
     69 	ARM_SYSREG_CPSR_S = 64,
     70 	ARM_SYSREG_CPSR_F = 128,
     71 
     72 	// independent registers
     73 	ARM_SYSREG_APSR = 256,
     74 	ARM_SYSREG_APSR_G,
     75 	ARM_SYSREG_APSR_NZCVQ,
     76 	ARM_SYSREG_APSR_NZCVQG,
     77 
     78 	ARM_SYSREG_IAPSR,
     79 	ARM_SYSREG_IAPSR_G,
     80 	ARM_SYSREG_IAPSR_NZCVQG,
     81 
     82 	ARM_SYSREG_EAPSR,
     83 	ARM_SYSREG_EAPSR_G,
     84 	ARM_SYSREG_EAPSR_NZCVQG,
     85 
     86 	ARM_SYSREG_XPSR,
     87 	ARM_SYSREG_XPSR_G,
     88 	ARM_SYSREG_XPSR_NZCVQG,
     89 
     90 	ARM_SYSREG_IPSR,
     91 	ARM_SYSREG_EPSR,
     92 	ARM_SYSREG_IEPSR,
     93 
     94 	ARM_SYSREG_MSP,
     95 	ARM_SYSREG_PSP,
     96 	ARM_SYSREG_PRIMASK,
     97 	ARM_SYSREG_BASEPRI,
     98 	ARM_SYSREG_BASEPRI_MAX,
     99 	ARM_SYSREG_FAULTMASK,
    100 	ARM_SYSREG_CONTROL,
    101 } arm_sysreg;
    102 
    103 //> The memory barrier constants map directly to the 4-bit encoding of
    104 //> the option field for Memory Barrier operations.
    105 typedef enum arm_mem_barrier {
    106 	ARM_MB_INVALID = 0,
    107 	ARM_MB_RESERVED_0,
    108 	ARM_MB_OSHLD,
    109 	ARM_MB_OSHST,
    110 	ARM_MB_OSH,
    111 	ARM_MB_RESERVED_4,
    112 	ARM_MB_NSHLD,
    113 	ARM_MB_NSHST,
    114 	ARM_MB_NSH,
    115 	ARM_MB_RESERVED_8,
    116 	ARM_MB_ISHLD,
    117 	ARM_MB_ISHST,
    118 	ARM_MB_ISH,
    119 	ARM_MB_RESERVED_12,
    120 	ARM_MB_LD,
    121 	ARM_MB_ST,
    122 	ARM_MB_SY,
    123 } arm_mem_barrier;
    124 
    125 //> Operand type for instruction's operands
    126 typedef enum arm_op_type {
    127 	ARM_OP_INVALID = 0, // = CS_OP_INVALID (Uninitialized).
    128 	ARM_OP_REG, // = CS_OP_REG (Register operand).
    129 	ARM_OP_IMM, // = CS_OP_IMM (Immediate operand).
    130 	ARM_OP_MEM, // = CS_OP_MEM (Memory operand).
    131 	ARM_OP_FP,  // = CS_OP_FP (Floating-Point operand).
    132 	ARM_OP_CIMM = 64, // C-Immediate (coprocessor registers)
    133 	ARM_OP_PIMM, // P-Immediate (coprocessor registers)
    134 	ARM_OP_SETEND,	// operand for SETEND instruction
    135 	ARM_OP_SYSREG,	// MSR/MRS special register operand
    136 } arm_op_type;
    137 
    138 //> Operand type for SETEND instruction
    139 typedef enum arm_setend_type {
    140 	ARM_SETEND_INVALID = 0,	// Uninitialized.
    141 	ARM_SETEND_BE,	// BE operand.
    142 	ARM_SETEND_LE, // LE operand
    143 } arm_setend_type;
    144 
    145 typedef enum arm_cpsmode_type {
    146 	ARM_CPSMODE_INVALID = 0,
    147 	ARM_CPSMODE_IE = 2,
    148 	ARM_CPSMODE_ID = 3
    149 } arm_cpsmode_type;
    150 
    151 //> Operand type for SETEND instruction
    152 typedef enum arm_cpsflag_type {
    153 	ARM_CPSFLAG_INVALID = 0,
    154 	ARM_CPSFLAG_F = 1,
    155 	ARM_CPSFLAG_I = 2,
    156 	ARM_CPSFLAG_A = 4,
    157 	ARM_CPSFLAG_NONE = 16,	// no flag
    158 } arm_cpsflag_type;
    159 
    160 //> Data type for elements of vector instructions.
    161 typedef enum arm_vectordata_type {
    162 	ARM_VECTORDATA_INVALID = 0,
    163 
    164 	// Integer type
    165 	ARM_VECTORDATA_I8,
    166 	ARM_VECTORDATA_I16,
    167 	ARM_VECTORDATA_I32,
    168 	ARM_VECTORDATA_I64,
    169 
    170 	// Signed integer type
    171 	ARM_VECTORDATA_S8,
    172 	ARM_VECTORDATA_S16,
    173 	ARM_VECTORDATA_S32,
    174 	ARM_VECTORDATA_S64,
    175 
    176 	// Unsigned integer type
    177 	ARM_VECTORDATA_U8,
    178 	ARM_VECTORDATA_U16,
    179 	ARM_VECTORDATA_U32,
    180 	ARM_VECTORDATA_U64,
    181 
    182 	// Data type for VMUL/VMULL
    183 	ARM_VECTORDATA_P8,
    184 
    185 	// Floating type
    186 	ARM_VECTORDATA_F32,
    187 	ARM_VECTORDATA_F64,
    188 
    189 	// Convert float <-> float
    190 	ARM_VECTORDATA_F16F64,	// f16.f64
    191 	ARM_VECTORDATA_F64F16,	// f64.f16
    192 	ARM_VECTORDATA_F32F16,	// f32.f16
    193 	ARM_VECTORDATA_F16F32,	// f32.f16
    194 	ARM_VECTORDATA_F64F32,	// f64.f32
    195 	ARM_VECTORDATA_F32F64,	// f32.f64
    196 
    197 	// Convert integer <-> float
    198 	ARM_VECTORDATA_S32F32,	// s32.f32
    199 	ARM_VECTORDATA_U32F32,	// u32.f32
    200 	ARM_VECTORDATA_F32S32,	// f32.s32
    201 	ARM_VECTORDATA_F32U32,	// f32.u32
    202 	ARM_VECTORDATA_F64S16,	// f64.s16
    203 	ARM_VECTORDATA_F32S16,	// f32.s16
    204 	ARM_VECTORDATA_F64S32,	// f64.s32
    205 	ARM_VECTORDATA_S16F64,	// s16.f64
    206 	ARM_VECTORDATA_S16F32,	// s16.f64
    207 	ARM_VECTORDATA_S32F64,	// s32.f64
    208 	ARM_VECTORDATA_U16F64,	// u16.f64
    209 	ARM_VECTORDATA_U16F32,	// u16.f32
    210 	ARM_VECTORDATA_U32F64,	// u32.f64
    211 	ARM_VECTORDATA_F64U16,	// f64.u16
    212 	ARM_VECTORDATA_F32U16,	// f32.u16
    213 	ARM_VECTORDATA_F64U32,	// f64.u32
    214 } arm_vectordata_type;
    215 
    216 // Instruction's operand referring to memory
    217 // This is associated with ARM_OP_MEM operand type above
    218 typedef struct arm_op_mem {
    219 	unsigned int base;	// base register
    220 	unsigned int index;	// index register
    221 	int scale;	// scale for index register (can be 1, or -1)
    222 	int disp;	// displacement/offset value
    223 } arm_op_mem;
    224 
    225 // Instruction operand
    226 typedef struct cs_arm_op {
    227 	int vector_index;	// Vector Index for some vector operands (or -1 if irrelevant)
    228 	struct {
    229 		arm_shifter type;
    230 		unsigned int value;
    231 	} shift;
    232 	arm_op_type type;	// operand type
    233 	union {
    234 		unsigned int reg;	// register value for REG/SYSREG operand
    235 		int32_t imm;			// immediate value for C-IMM, P-IMM or IMM operand
    236 		double fp;			// floating point value for FP operand
    237 		arm_op_mem mem;		// base/index/scale/disp value for MEM operand
    238 		arm_setend_type setend; // SETEND instruction's operand type
    239 	};
    240 	// in some instructions, an operand can be subtracted or added to
    241 	// the base register,
    242 	bool subtracted; // if TRUE, this operand is subtracted. otherwise, it is added.
    243 } cs_arm_op;
    244 
    245 // Instruction structure
    246 typedef struct cs_arm {
    247 	bool usermode;	// User-mode registers to be loaded (for LDM/STM instructions)
    248 	int vector_size; 	// Scalar size for vector instructions
    249 	arm_vectordata_type vector_data; // Data type for elements of vector instructions
    250 	arm_cpsmode_type cps_mode;	// CPS mode for CPS instruction
    251 	arm_cpsflag_type cps_flag;	// CPS mode for CPS instruction
    252 	arm_cc cc;			// conditional code for this insn
    253 	bool update_flags;	// does this insn update flags?
    254 	bool writeback;		// does this insn write-back?
    255 	arm_mem_barrier mem_barrier;	// Option for some memory barrier instructions
    256 
    257 	// Number of operands of this instruction,
    258 	// or 0 when instruction has no operand.
    259 	uint8_t op_count;
    260 
    261 	cs_arm_op operands[36];	// operands for this instruction.
    262 } cs_arm;
    263 
    264 //> ARM registers
    265 typedef enum arm_reg {
    266 	ARM_REG_INVALID = 0,
    267 	ARM_REG_APSR,
    268 	ARM_REG_APSR_NZCV,
    269 	ARM_REG_CPSR,
    270 	ARM_REG_FPEXC,
    271 	ARM_REG_FPINST,
    272 	ARM_REG_FPSCR,
    273 	ARM_REG_FPSCR_NZCV,
    274 	ARM_REG_FPSID,
    275 	ARM_REG_ITSTATE,
    276 	ARM_REG_LR,
    277 	ARM_REG_PC,
    278 	ARM_REG_SP,
    279 	ARM_REG_SPSR,
    280 	ARM_REG_D0,
    281 	ARM_REG_D1,
    282 	ARM_REG_D2,
    283 	ARM_REG_D3,
    284 	ARM_REG_D4,
    285 	ARM_REG_D5,
    286 	ARM_REG_D6,
    287 	ARM_REG_D7,
    288 	ARM_REG_D8,
    289 	ARM_REG_D9,
    290 	ARM_REG_D10,
    291 	ARM_REG_D11,
    292 	ARM_REG_D12,
    293 	ARM_REG_D13,
    294 	ARM_REG_D14,
    295 	ARM_REG_D15,
    296 	ARM_REG_D16,
    297 	ARM_REG_D17,
    298 	ARM_REG_D18,
    299 	ARM_REG_D19,
    300 	ARM_REG_D20,
    301 	ARM_REG_D21,
    302 	ARM_REG_D22,
    303 	ARM_REG_D23,
    304 	ARM_REG_D24,
    305 	ARM_REG_D25,
    306 	ARM_REG_D26,
    307 	ARM_REG_D27,
    308 	ARM_REG_D28,
    309 	ARM_REG_D29,
    310 	ARM_REG_D30,
    311 	ARM_REG_D31,
    312 	ARM_REG_FPINST2,
    313 	ARM_REG_MVFR0,
    314 	ARM_REG_MVFR1,
    315 	ARM_REG_MVFR2,
    316 	ARM_REG_Q0,
    317 	ARM_REG_Q1,
    318 	ARM_REG_Q2,
    319 	ARM_REG_Q3,
    320 	ARM_REG_Q4,
    321 	ARM_REG_Q5,
    322 	ARM_REG_Q6,
    323 	ARM_REG_Q7,
    324 	ARM_REG_Q8,
    325 	ARM_REG_Q9,
    326 	ARM_REG_Q10,
    327 	ARM_REG_Q11,
    328 	ARM_REG_Q12,
    329 	ARM_REG_Q13,
    330 	ARM_REG_Q14,
    331 	ARM_REG_Q15,
    332 	ARM_REG_R0,
    333 	ARM_REG_R1,
    334 	ARM_REG_R2,
    335 	ARM_REG_R3,
    336 	ARM_REG_R4,
    337 	ARM_REG_R5,
    338 	ARM_REG_R6,
    339 	ARM_REG_R7,
    340 	ARM_REG_R8,
    341 	ARM_REG_R9,
    342 	ARM_REG_R10,
    343 	ARM_REG_R11,
    344 	ARM_REG_R12,
    345 	ARM_REG_S0,
    346 	ARM_REG_S1,
    347 	ARM_REG_S2,
    348 	ARM_REG_S3,
    349 	ARM_REG_S4,
    350 	ARM_REG_S5,
    351 	ARM_REG_S6,
    352 	ARM_REG_S7,
    353 	ARM_REG_S8,
    354 	ARM_REG_S9,
    355 	ARM_REG_S10,
    356 	ARM_REG_S11,
    357 	ARM_REG_S12,
    358 	ARM_REG_S13,
    359 	ARM_REG_S14,
    360 	ARM_REG_S15,
    361 	ARM_REG_S16,
    362 	ARM_REG_S17,
    363 	ARM_REG_S18,
    364 	ARM_REG_S19,
    365 	ARM_REG_S20,
    366 	ARM_REG_S21,
    367 	ARM_REG_S22,
    368 	ARM_REG_S23,
    369 	ARM_REG_S24,
    370 	ARM_REG_S25,
    371 	ARM_REG_S26,
    372 	ARM_REG_S27,
    373 	ARM_REG_S28,
    374 	ARM_REG_S29,
    375 	ARM_REG_S30,
    376 	ARM_REG_S31,
    377 
    378 	ARM_REG_ENDING,		// <-- mark the end of the list or registers
    379 
    380 	//> alias registers
    381 	ARM_REG_R13 = ARM_REG_SP,
    382 	ARM_REG_R14 = ARM_REG_LR,
    383 	ARM_REG_R15 = ARM_REG_PC,
    384 
    385 	ARM_REG_SB = ARM_REG_R9,
    386 	ARM_REG_SL = ARM_REG_R10,
    387 	ARM_REG_FP = ARM_REG_R11,
    388 	ARM_REG_IP = ARM_REG_R12,
    389 } arm_reg;
    390 
    391 //> ARM instruction
    392 typedef enum arm_insn {
    393 	ARM_INS_INVALID = 0,
    394 
    395 	ARM_INS_ADC,
    396 	ARM_INS_ADD,
    397 	ARM_INS_ADR,
    398 	ARM_INS_AESD,
    399 	ARM_INS_AESE,
    400 	ARM_INS_AESIMC,
    401 	ARM_INS_AESMC,
    402 	ARM_INS_AND,
    403 	ARM_INS_BFC,
    404 	ARM_INS_BFI,
    405 	ARM_INS_BIC,
    406 	ARM_INS_BKPT,
    407 	ARM_INS_BL,
    408 	ARM_INS_BLX,
    409 	ARM_INS_BX,
    410 	ARM_INS_BXJ,
    411 	ARM_INS_B,
    412 	ARM_INS_CDP,
    413 	ARM_INS_CDP2,
    414 	ARM_INS_CLREX,
    415 	ARM_INS_CLZ,
    416 	ARM_INS_CMN,
    417 	ARM_INS_CMP,
    418 	ARM_INS_CPS,
    419 	ARM_INS_CRC32B,
    420 	ARM_INS_CRC32CB,
    421 	ARM_INS_CRC32CH,
    422 	ARM_INS_CRC32CW,
    423 	ARM_INS_CRC32H,
    424 	ARM_INS_CRC32W,
    425 	ARM_INS_DBG,
    426 	ARM_INS_DMB,
    427 	ARM_INS_DSB,
    428 	ARM_INS_EOR,
    429 	ARM_INS_VMOV,
    430 	ARM_INS_FLDMDBX,
    431 	ARM_INS_FLDMIAX,
    432 	ARM_INS_VMRS,
    433 	ARM_INS_FSTMDBX,
    434 	ARM_INS_FSTMIAX,
    435 	ARM_INS_HINT,
    436 	ARM_INS_HLT,
    437 	ARM_INS_ISB,
    438 	ARM_INS_LDA,
    439 	ARM_INS_LDAB,
    440 	ARM_INS_LDAEX,
    441 	ARM_INS_LDAEXB,
    442 	ARM_INS_LDAEXD,
    443 	ARM_INS_LDAEXH,
    444 	ARM_INS_LDAH,
    445 	ARM_INS_LDC2L,
    446 	ARM_INS_LDC2,
    447 	ARM_INS_LDCL,
    448 	ARM_INS_LDC,
    449 	ARM_INS_LDMDA,
    450 	ARM_INS_LDMDB,
    451 	ARM_INS_LDM,
    452 	ARM_INS_LDMIB,
    453 	ARM_INS_LDRBT,
    454 	ARM_INS_LDRB,
    455 	ARM_INS_LDRD,
    456 	ARM_INS_LDREX,
    457 	ARM_INS_LDREXB,
    458 	ARM_INS_LDREXD,
    459 	ARM_INS_LDREXH,
    460 	ARM_INS_LDRH,
    461 	ARM_INS_LDRHT,
    462 	ARM_INS_LDRSB,
    463 	ARM_INS_LDRSBT,
    464 	ARM_INS_LDRSH,
    465 	ARM_INS_LDRSHT,
    466 	ARM_INS_LDRT,
    467 	ARM_INS_LDR,
    468 	ARM_INS_MCR,
    469 	ARM_INS_MCR2,
    470 	ARM_INS_MCRR,
    471 	ARM_INS_MCRR2,
    472 	ARM_INS_MLA,
    473 	ARM_INS_MLS,
    474 	ARM_INS_MOV,
    475 	ARM_INS_MOVT,
    476 	ARM_INS_MOVW,
    477 	ARM_INS_MRC,
    478 	ARM_INS_MRC2,
    479 	ARM_INS_MRRC,
    480 	ARM_INS_MRRC2,
    481 	ARM_INS_MRS,
    482 	ARM_INS_MSR,
    483 	ARM_INS_MUL,
    484 	ARM_INS_MVN,
    485 	ARM_INS_ORR,
    486 	ARM_INS_PKHBT,
    487 	ARM_INS_PKHTB,
    488 	ARM_INS_PLDW,
    489 	ARM_INS_PLD,
    490 	ARM_INS_PLI,
    491 	ARM_INS_QADD,
    492 	ARM_INS_QADD16,
    493 	ARM_INS_QADD8,
    494 	ARM_INS_QASX,
    495 	ARM_INS_QDADD,
    496 	ARM_INS_QDSUB,
    497 	ARM_INS_QSAX,
    498 	ARM_INS_QSUB,
    499 	ARM_INS_QSUB16,
    500 	ARM_INS_QSUB8,
    501 	ARM_INS_RBIT,
    502 	ARM_INS_REV,
    503 	ARM_INS_REV16,
    504 	ARM_INS_REVSH,
    505 	ARM_INS_RFEDA,
    506 	ARM_INS_RFEDB,
    507 	ARM_INS_RFEIA,
    508 	ARM_INS_RFEIB,
    509 	ARM_INS_RSB,
    510 	ARM_INS_RSC,
    511 	ARM_INS_SADD16,
    512 	ARM_INS_SADD8,
    513 	ARM_INS_SASX,
    514 	ARM_INS_SBC,
    515 	ARM_INS_SBFX,
    516 	ARM_INS_SDIV,
    517 	ARM_INS_SEL,
    518 	ARM_INS_SETEND,
    519 	ARM_INS_SHA1C,
    520 	ARM_INS_SHA1H,
    521 	ARM_INS_SHA1M,
    522 	ARM_INS_SHA1P,
    523 	ARM_INS_SHA1SU0,
    524 	ARM_INS_SHA1SU1,
    525 	ARM_INS_SHA256H,
    526 	ARM_INS_SHA256H2,
    527 	ARM_INS_SHA256SU0,
    528 	ARM_INS_SHA256SU1,
    529 	ARM_INS_SHADD16,
    530 	ARM_INS_SHADD8,
    531 	ARM_INS_SHASX,
    532 	ARM_INS_SHSAX,
    533 	ARM_INS_SHSUB16,
    534 	ARM_INS_SHSUB8,
    535 	ARM_INS_SMC,
    536 	ARM_INS_SMLABB,
    537 	ARM_INS_SMLABT,
    538 	ARM_INS_SMLAD,
    539 	ARM_INS_SMLADX,
    540 	ARM_INS_SMLAL,
    541 	ARM_INS_SMLALBB,
    542 	ARM_INS_SMLALBT,
    543 	ARM_INS_SMLALD,
    544 	ARM_INS_SMLALDX,
    545 	ARM_INS_SMLALTB,
    546 	ARM_INS_SMLALTT,
    547 	ARM_INS_SMLATB,
    548 	ARM_INS_SMLATT,
    549 	ARM_INS_SMLAWB,
    550 	ARM_INS_SMLAWT,
    551 	ARM_INS_SMLSD,
    552 	ARM_INS_SMLSDX,
    553 	ARM_INS_SMLSLD,
    554 	ARM_INS_SMLSLDX,
    555 	ARM_INS_SMMLA,
    556 	ARM_INS_SMMLAR,
    557 	ARM_INS_SMMLS,
    558 	ARM_INS_SMMLSR,
    559 	ARM_INS_SMMUL,
    560 	ARM_INS_SMMULR,
    561 	ARM_INS_SMUAD,
    562 	ARM_INS_SMUADX,
    563 	ARM_INS_SMULBB,
    564 	ARM_INS_SMULBT,
    565 	ARM_INS_SMULL,
    566 	ARM_INS_SMULTB,
    567 	ARM_INS_SMULTT,
    568 	ARM_INS_SMULWB,
    569 	ARM_INS_SMULWT,
    570 	ARM_INS_SMUSD,
    571 	ARM_INS_SMUSDX,
    572 	ARM_INS_SRSDA,
    573 	ARM_INS_SRSDB,
    574 	ARM_INS_SRSIA,
    575 	ARM_INS_SRSIB,
    576 	ARM_INS_SSAT,
    577 	ARM_INS_SSAT16,
    578 	ARM_INS_SSAX,
    579 	ARM_INS_SSUB16,
    580 	ARM_INS_SSUB8,
    581 	ARM_INS_STC2L,
    582 	ARM_INS_STC2,
    583 	ARM_INS_STCL,
    584 	ARM_INS_STC,
    585 	ARM_INS_STL,
    586 	ARM_INS_STLB,
    587 	ARM_INS_STLEX,
    588 	ARM_INS_STLEXB,
    589 	ARM_INS_STLEXD,
    590 	ARM_INS_STLEXH,
    591 	ARM_INS_STLH,
    592 	ARM_INS_STMDA,
    593 	ARM_INS_STMDB,
    594 	ARM_INS_STM,
    595 	ARM_INS_STMIB,
    596 	ARM_INS_STRBT,
    597 	ARM_INS_STRB,
    598 	ARM_INS_STRD,
    599 	ARM_INS_STREX,
    600 	ARM_INS_STREXB,
    601 	ARM_INS_STREXD,
    602 	ARM_INS_STREXH,
    603 	ARM_INS_STRH,
    604 	ARM_INS_STRHT,
    605 	ARM_INS_STRT,
    606 	ARM_INS_STR,
    607 	ARM_INS_SUB,
    608 	ARM_INS_SVC,
    609 	ARM_INS_SWP,
    610 	ARM_INS_SWPB,
    611 	ARM_INS_SXTAB,
    612 	ARM_INS_SXTAB16,
    613 	ARM_INS_SXTAH,
    614 	ARM_INS_SXTB,
    615 	ARM_INS_SXTB16,
    616 	ARM_INS_SXTH,
    617 	ARM_INS_TEQ,
    618 	ARM_INS_TRAP,
    619 	ARM_INS_TST,
    620 	ARM_INS_UADD16,
    621 	ARM_INS_UADD8,
    622 	ARM_INS_UASX,
    623 	ARM_INS_UBFX,
    624 	ARM_INS_UDF,
    625 	ARM_INS_UDIV,
    626 	ARM_INS_UHADD16,
    627 	ARM_INS_UHADD8,
    628 	ARM_INS_UHASX,
    629 	ARM_INS_UHSAX,
    630 	ARM_INS_UHSUB16,
    631 	ARM_INS_UHSUB8,
    632 	ARM_INS_UMAAL,
    633 	ARM_INS_UMLAL,
    634 	ARM_INS_UMULL,
    635 	ARM_INS_UQADD16,
    636 	ARM_INS_UQADD8,
    637 	ARM_INS_UQASX,
    638 	ARM_INS_UQSAX,
    639 	ARM_INS_UQSUB16,
    640 	ARM_INS_UQSUB8,
    641 	ARM_INS_USAD8,
    642 	ARM_INS_USADA8,
    643 	ARM_INS_USAT,
    644 	ARM_INS_USAT16,
    645 	ARM_INS_USAX,
    646 	ARM_INS_USUB16,
    647 	ARM_INS_USUB8,
    648 	ARM_INS_UXTAB,
    649 	ARM_INS_UXTAB16,
    650 	ARM_INS_UXTAH,
    651 	ARM_INS_UXTB,
    652 	ARM_INS_UXTB16,
    653 	ARM_INS_UXTH,
    654 	ARM_INS_VABAL,
    655 	ARM_INS_VABA,
    656 	ARM_INS_VABDL,
    657 	ARM_INS_VABD,
    658 	ARM_INS_VABS,
    659 	ARM_INS_VACGE,
    660 	ARM_INS_VACGT,
    661 	ARM_INS_VADD,
    662 	ARM_INS_VADDHN,
    663 	ARM_INS_VADDL,
    664 	ARM_INS_VADDW,
    665 	ARM_INS_VAND,
    666 	ARM_INS_VBIC,
    667 	ARM_INS_VBIF,
    668 	ARM_INS_VBIT,
    669 	ARM_INS_VBSL,
    670 	ARM_INS_VCEQ,
    671 	ARM_INS_VCGE,
    672 	ARM_INS_VCGT,
    673 	ARM_INS_VCLE,
    674 	ARM_INS_VCLS,
    675 	ARM_INS_VCLT,
    676 	ARM_INS_VCLZ,
    677 	ARM_INS_VCMP,
    678 	ARM_INS_VCMPE,
    679 	ARM_INS_VCNT,
    680 	ARM_INS_VCVTA,
    681 	ARM_INS_VCVTB,
    682 	ARM_INS_VCVT,
    683 	ARM_INS_VCVTM,
    684 	ARM_INS_VCVTN,
    685 	ARM_INS_VCVTP,
    686 	ARM_INS_VCVTT,
    687 	ARM_INS_VDIV,
    688 	ARM_INS_VDUP,
    689 	ARM_INS_VEOR,
    690 	ARM_INS_VEXT,
    691 	ARM_INS_VFMA,
    692 	ARM_INS_VFMS,
    693 	ARM_INS_VFNMA,
    694 	ARM_INS_VFNMS,
    695 	ARM_INS_VHADD,
    696 	ARM_INS_VHSUB,
    697 	ARM_INS_VLD1,
    698 	ARM_INS_VLD2,
    699 	ARM_INS_VLD3,
    700 	ARM_INS_VLD4,
    701 	ARM_INS_VLDMDB,
    702 	ARM_INS_VLDMIA,
    703 	ARM_INS_VLDR,
    704 	ARM_INS_VMAXNM,
    705 	ARM_INS_VMAX,
    706 	ARM_INS_VMINNM,
    707 	ARM_INS_VMIN,
    708 	ARM_INS_VMLA,
    709 	ARM_INS_VMLAL,
    710 	ARM_INS_VMLS,
    711 	ARM_INS_VMLSL,
    712 	ARM_INS_VMOVL,
    713 	ARM_INS_VMOVN,
    714 	ARM_INS_VMSR,
    715 	ARM_INS_VMUL,
    716 	ARM_INS_VMULL,
    717 	ARM_INS_VMVN,
    718 	ARM_INS_VNEG,
    719 	ARM_INS_VNMLA,
    720 	ARM_INS_VNMLS,
    721 	ARM_INS_VNMUL,
    722 	ARM_INS_VORN,
    723 	ARM_INS_VORR,
    724 	ARM_INS_VPADAL,
    725 	ARM_INS_VPADDL,
    726 	ARM_INS_VPADD,
    727 	ARM_INS_VPMAX,
    728 	ARM_INS_VPMIN,
    729 	ARM_INS_VQABS,
    730 	ARM_INS_VQADD,
    731 	ARM_INS_VQDMLAL,
    732 	ARM_INS_VQDMLSL,
    733 	ARM_INS_VQDMULH,
    734 	ARM_INS_VQDMULL,
    735 	ARM_INS_VQMOVUN,
    736 	ARM_INS_VQMOVN,
    737 	ARM_INS_VQNEG,
    738 	ARM_INS_VQRDMULH,
    739 	ARM_INS_VQRSHL,
    740 	ARM_INS_VQRSHRN,
    741 	ARM_INS_VQRSHRUN,
    742 	ARM_INS_VQSHL,
    743 	ARM_INS_VQSHLU,
    744 	ARM_INS_VQSHRN,
    745 	ARM_INS_VQSHRUN,
    746 	ARM_INS_VQSUB,
    747 	ARM_INS_VRADDHN,
    748 	ARM_INS_VRECPE,
    749 	ARM_INS_VRECPS,
    750 	ARM_INS_VREV16,
    751 	ARM_INS_VREV32,
    752 	ARM_INS_VREV64,
    753 	ARM_INS_VRHADD,
    754 	ARM_INS_VRINTA,
    755 	ARM_INS_VRINTM,
    756 	ARM_INS_VRINTN,
    757 	ARM_INS_VRINTP,
    758 	ARM_INS_VRINTR,
    759 	ARM_INS_VRINTX,
    760 	ARM_INS_VRINTZ,
    761 	ARM_INS_VRSHL,
    762 	ARM_INS_VRSHRN,
    763 	ARM_INS_VRSHR,
    764 	ARM_INS_VRSQRTE,
    765 	ARM_INS_VRSQRTS,
    766 	ARM_INS_VRSRA,
    767 	ARM_INS_VRSUBHN,
    768 	ARM_INS_VSELEQ,
    769 	ARM_INS_VSELGE,
    770 	ARM_INS_VSELGT,
    771 	ARM_INS_VSELVS,
    772 	ARM_INS_VSHLL,
    773 	ARM_INS_VSHL,
    774 	ARM_INS_VSHRN,
    775 	ARM_INS_VSHR,
    776 	ARM_INS_VSLI,
    777 	ARM_INS_VSQRT,
    778 	ARM_INS_VSRA,
    779 	ARM_INS_VSRI,
    780 	ARM_INS_VST1,
    781 	ARM_INS_VST2,
    782 	ARM_INS_VST3,
    783 	ARM_INS_VST4,
    784 	ARM_INS_VSTMDB,
    785 	ARM_INS_VSTMIA,
    786 	ARM_INS_VSTR,
    787 	ARM_INS_VSUB,
    788 	ARM_INS_VSUBHN,
    789 	ARM_INS_VSUBL,
    790 	ARM_INS_VSUBW,
    791 	ARM_INS_VSWP,
    792 	ARM_INS_VTBL,
    793 	ARM_INS_VTBX,
    794 	ARM_INS_VCVTR,
    795 	ARM_INS_VTRN,
    796 	ARM_INS_VTST,
    797 	ARM_INS_VUZP,
    798 	ARM_INS_VZIP,
    799 	ARM_INS_ADDW,
    800 	ARM_INS_ASR,
    801 	ARM_INS_DCPS1,
    802 	ARM_INS_DCPS2,
    803 	ARM_INS_DCPS3,
    804 	ARM_INS_IT,
    805 	ARM_INS_LSL,
    806 	ARM_INS_LSR,
    807 	ARM_INS_ASRS,
    808 	ARM_INS_LSRS,
    809 	ARM_INS_ORN,
    810 	ARM_INS_ROR,
    811 	ARM_INS_RRX,
    812 	ARM_INS_SUBS,
    813 	ARM_INS_SUBW,
    814 	ARM_INS_TBB,
    815 	ARM_INS_TBH,
    816 	ARM_INS_CBNZ,
    817 	ARM_INS_CBZ,
    818 	ARM_INS_MOVS,
    819 	ARM_INS_POP,
    820 	ARM_INS_PUSH,
    821 
    822 	// special instructions
    823 	ARM_INS_NOP,
    824 	ARM_INS_YIELD,
    825 	ARM_INS_WFE,
    826 	ARM_INS_WFI,
    827 	ARM_INS_SEV,
    828 	ARM_INS_SEVL,
    829 	ARM_INS_VPUSH,
    830 	ARM_INS_VPOP,
    831 
    832 	ARM_INS_ENDING,	// <-- mark the end of the list of instructions
    833 } arm_insn;
    834 
    835 //> Group of ARM instructions
    836 typedef enum arm_insn_group {
    837 	ARM_GRP_INVALID = 0, // = CS_GRP_INVALID
    838 
    839 	//> Generic groups
    840 	// all jump instructions (conditional+direct+indirect jumps)
    841 	ARM_GRP_JUMP,	// = CS_GRP_JUMP
    842 
    843 	//> Architecture-specific groups
    844 	ARM_GRP_CRYPTO = 128,
    845 	ARM_GRP_DATABARRIER,
    846 	ARM_GRP_DIVIDE,
    847 	ARM_GRP_FPARMV8,
    848 	ARM_GRP_MULTPRO,
    849 	ARM_GRP_NEON,
    850 	ARM_GRP_T2EXTRACTPACK,
    851 	ARM_GRP_THUMB2DSP,
    852 	ARM_GRP_TRUSTZONE,
    853 	ARM_GRP_V4T,
    854 	ARM_GRP_V5T,
    855 	ARM_GRP_V5TE,
    856 	ARM_GRP_V6,
    857 	ARM_GRP_V6T2,
    858 	ARM_GRP_V7,
    859 	ARM_GRP_V8,
    860 	ARM_GRP_VFP2,
    861 	ARM_GRP_VFP3,
    862 	ARM_GRP_VFP4,
    863 	ARM_GRP_ARM,
    864 	ARM_GRP_MCLASS,
    865 	ARM_GRP_NOTMCLASS,
    866 	ARM_GRP_THUMB,
    867 	ARM_GRP_THUMB1ONLY,
    868 	ARM_GRP_THUMB2,
    869 	ARM_GRP_PREV8,
    870 	ARM_GRP_FPVMLX,
    871 	ARM_GRP_MULOPS,
    872 	ARM_GRP_CRC,
    873 	ARM_GRP_DPVFP,
    874 	ARM_GRP_V6M,
    875 
    876 	ARM_GRP_ENDING,
    877 } arm_insn_group;
    878 
    879 #ifdef __cplusplus
    880 }
    881 #endif
    882 
    883 #endif
    884