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