1 /* Instruction printing code for the ARM
2 Copyright (C) 1994-2019 Free Software Foundation, Inc.
3 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4 Modification by James G. Smith (jsmith@cygnus.co.uk)
6 This file is part of libopcodes.
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
26 #include "disassemble.h"
27 #include "opcode/arm.h"
29 #include "safe-ctype.h"
30 #include "libiberty.h"
31 #include "floatformat.h"
33 /* FIXME: This shouldn't be done here. */
34 #include "coff/internal.h"
38 #include "elf/internal.h"
42 /* FIXME: Belongs in global header. */
44 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
47 /* Cached mapping symbol state. */
55 struct arm_private_data
57 /* The features to use when disassembling optional instructions. */
58 arm_feature_set features
;
60 /* Track the last type (although this doesn't seem to be useful) */
61 enum map_type last_type
;
63 /* Tracking symbol table information */
66 /* The end range of the current range being disassembled. */
67 bfd_vma last_stop_offset
;
68 bfd_vma last_mapping_addr
;
121 MVE_VSTRB_SCATTER_T1
,
122 MVE_VSTRH_SCATTER_T2
,
123 MVE_VSTRW_SCATTER_T3
,
124 MVE_VSTRD_SCATTER_T4
,
125 MVE_VSTRW_SCATTER_T5
,
126 MVE_VSTRD_SCATTER_T6
,
128 MVE_VCVT_BETWEEN_FP_INT
,
130 MVE_VCVT_FROM_FP_TO_INT
,
133 MVE_VMOV_GP_TO_VEC_LANE
,
136 MVE_VMOV2_VEC_LANE_TO_GP
,
137 MVE_VMOV2_GP_TO_VEC_LANE
,
138 MVE_VMOV_VEC_LANE_TO_GP
,
251 enum mve_unpredictable
253 UNPRED_IT_BLOCK
, /* Unpredictable because mve insn in it block.
255 UNPRED_FCA_0_FCB_1
, /* Unpredictable because fcA = 0 and
257 UNPRED_R13
, /* Unpredictable because r13 (sp) or
259 UNPRED_R15
, /* Unpredictable because r15 (pc) is used. */
260 UNPRED_Q_GT_4
, /* Unpredictable because
261 vec reg start > 4 (vld4/st4). */
262 UNPRED_Q_GT_6
, /* Unpredictable because
263 vec reg start > 6 (vld2/st2). */
264 UNPRED_R13_AND_WB
, /* Unpredictable becase gp reg = r13
266 UNPRED_Q_REGS_EQUAL
, /* Unpredictable because vector registers are
268 UNPRED_OS
, /* Unpredictable because offset scaled == 1. */
269 UNPRED_GP_REGS_EQUAL
, /* Unpredictable because gp registers are the
271 UNPRED_Q_REGS_EQ_AND_SIZE_1
, /* Unpredictable because q regs equal and
273 UNPRED_Q_REGS_EQ_AND_SIZE_2
, /* Unpredictable because q regs equal and
275 UNPRED_NONE
/* No unpredictable behavior. */
280 UNDEF_SIZE
, /* undefined size. */
281 UNDEF_SIZE_0
, /* undefined because size == 0. */
282 UNDEF_SIZE_2
, /* undefined because size == 2. */
283 UNDEF_SIZE_3
, /* undefined because size == 3. */
284 UNDEF_SIZE_LE_1
, /* undefined because size <= 1. */
285 UNDEF_SIZE_NOT_2
, /* undefined because size != 2. */
286 UNDEF_SIZE_NOT_3
, /* undefined because size != 3. */
287 UNDEF_NOT_UNS_SIZE_0
, /* undefined because U == 0 and
289 UNDEF_NOT_UNS_SIZE_1
, /* undefined because U == 0 and
291 UNDEF_NOT_UNSIGNED
, /* undefined because U == 0. */
292 UNDEF_VCVT_IMM6
, /* imm6 < 32. */
293 UNDEF_VCVT_FSI_IMM6
, /* fsi = 0 and 32 >= imm6 <= 47. */
294 UNDEF_BAD_OP1_OP2
, /* undefined with op2 = 2 and
296 UNDEF_BAD_U_OP1_OP2
, /* undefined with U = 1 and
297 op2 == 0 and op1 == (0 or 1). */
298 UNDEF_OP_0_BAD_CMODE
, /* undefined because op == 0 and cmode
300 UNDEF_XCHG_UNS
, /* undefined because X == 1 and U == 1. */
301 UNDEF_NONE
/* no undefined behavior. */
306 arm_feature_set arch
; /* Architecture defining this insn. */
307 unsigned long value
; /* If arch is 0 then value is a sentinel. */
308 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
309 const char * assembler
; /* How to disassemble this insn. */
316 arm_feature_set arch
; /* Architecture defining this insn. */
317 enum mve_instructions mve_op
; /* Specific mve instruction for faster
319 unsigned long value
; /* If arch is 0 then value is a sentinel. */
320 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
321 const char * assembler
; /* How to disassemble this insn. */
331 /* Shared (between Arm and Thumb mode) opcode. */
334 enum isa isa
; /* Execution mode instruction availability. */
335 arm_feature_set arch
; /* Architecture defining this insn. */
336 unsigned long value
; /* If arch is 0 then value is a sentinel. */
337 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
338 const char * assembler
; /* How to disassemble this insn. */
343 arm_feature_set arch
; /* Architecture defining this insn. */
344 unsigned short value
, mask
; /* Recognise insn if (op & mask) == value. */
345 const char *assembler
; /* How to disassemble this insn. */
348 /* print_insn_coprocessor recognizes the following format control codes:
352 %c print condition code (always bits 28-31 in ARM mode)
353 %q print shifter argument
354 %u print condition code (unconditional in ARM mode,
355 UNPREDICTABLE if not AL in Thumb)
356 %A print address for ldc/stc/ldf/stf instruction
357 %B print vstm/vldm register list
358 %C print vscclrm register list
359 %I print cirrus signed shift immediate: bits 0..3|4..6
360 %J print register for VLDR instruction
361 %K print address for VLDR instruction
362 %F print the COUNT field of a LFM/SFM instruction.
363 %P print floating point precision in arithmetic insn
364 %Q print floating point precision in ldf/stf insn
365 %R print floating point rounding mode
367 %<bitfield>c print as a condition code (for vsel)
368 %<bitfield>r print as an ARM register
369 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
370 %<bitfield>ru as %<>r but each u register must be unique.
371 %<bitfield>d print the bitfield in decimal
372 %<bitfield>k print immediate for VFPv3 conversion instruction
373 %<bitfield>x print the bitfield in hex
374 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
375 %<bitfield>f print a floating point constant if >7 else a
376 floating point register
377 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
378 %<bitfield>g print as an iWMMXt 64-bit register
379 %<bitfield>G print as an iWMMXt general purpose or control register
380 %<bitfield>D print as a NEON D register
381 %<bitfield>Q print as a NEON Q register
382 %<bitfield>V print as a NEON D or Q register
383 %<bitfield>E print a quarter-float immediate value
385 %y<code> print a single precision VFP reg.
386 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
387 %z<code> print a double precision VFP reg
388 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
390 %<bitfield>'c print specified char iff bitfield is all ones
391 %<bitfield>`c print specified char iff bitfield is all zeroes
392 %<bitfield>?ab... select from array of values in big endian order
394 %L print as an iWMMXt N/M width field.
395 %Z print the Immediate of a WSHUFH instruction.
396 %l like 'A' except use byte offsets for 'B' & 'H'
398 %i print 5-bit immediate in bits 8,3..0
400 %r print register offset address for wldt/wstr instruction. */
402 enum opcode_sentinel_enum
404 SENTINEL_IWMMXT_START
= 1,
406 SENTINEL_GENERIC_START
409 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x"
410 #define UNKNOWN_INSTRUCTION_32BIT "\t\t; <UNDEFINED> instruction: %08x"
411 #define UNKNOWN_INSTRUCTION_16BIT "\t\t; <UNDEFINED> instruction: %04x"
412 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>"
414 /* Common coprocessor opcodes shared between Arm and Thumb-2. */
416 static const struct sopcode32 coprocessor_opcodes
[] =
418 /* XScale instructions. */
419 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
420 0x0e200010, 0x0fff0ff0,
421 "mia%c\tacc0, %0-3r, %12-15r"},
422 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
423 0x0e280010, 0x0fff0ff0,
424 "miaph%c\tacc0, %0-3r, %12-15r"},
425 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
426 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
427 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
428 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
429 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
430 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
432 /* Intel Wireless MMX technology instructions. */
433 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START
, 0, "" },
434 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT
),
435 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
436 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
437 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
438 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
439 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
440 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
441 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
442 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
443 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
444 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
445 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
446 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
447 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
448 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
449 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
450 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
451 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
452 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
453 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
454 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
455 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
456 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
457 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
458 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
459 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
460 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
461 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
462 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
463 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
464 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
465 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
466 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
467 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
468 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
469 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
470 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
471 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
472 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
473 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
474 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
475 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
476 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
477 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
478 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
479 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
480 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
481 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
482 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
483 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
484 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
485 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
486 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
487 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
488 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
489 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
490 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
491 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
492 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
493 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
494 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
495 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
496 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
497 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
498 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
499 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
500 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
501 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
502 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
503 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
504 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
505 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
506 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
507 0x0e800120, 0x0f800ff0,
508 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
509 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
510 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
511 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
512 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
513 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
514 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
515 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
516 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
517 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
518 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
519 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
520 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
521 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
522 0x0e8000a0, 0x0f800ff0,
523 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
524 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
525 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
526 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
527 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
528 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
529 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
530 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
531 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
532 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
533 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
534 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
535 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
536 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
537 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
538 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
539 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
540 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
541 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
542 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
543 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
544 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
545 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
546 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
547 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
548 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
549 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
550 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
551 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
552 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
553 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
554 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
555 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
556 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
557 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
558 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
559 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
560 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
561 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
562 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
563 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
564 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
565 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
566 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
567 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
568 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
569 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
570 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
571 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
572 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
573 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
574 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
575 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
576 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
577 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
578 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
579 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
580 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
581 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
582 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
583 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
584 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
585 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
586 {ANY
, ARM_FEATURE_CORE_LOW (0),
587 SENTINEL_IWMMXT_END
, 0, "" },
589 /* Floating point coprocessor (FPA) instructions. */
590 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
591 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
592 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
593 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
594 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
595 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
596 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
597 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
598 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
599 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
600 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
601 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
602 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
603 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
604 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
605 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
606 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
607 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
608 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
609 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
610 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
611 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
612 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
613 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
614 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
615 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
616 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
617 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
618 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
619 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
620 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
621 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
622 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
623 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
624 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
625 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
626 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
627 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
628 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
629 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
630 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
631 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
632 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
633 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
634 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
635 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
636 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
637 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
638 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
639 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
640 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
641 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
642 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
643 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
644 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
645 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
646 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
647 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
648 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
649 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
650 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
651 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
652 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
653 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
654 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
655 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
656 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
657 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
658 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
659 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
660 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
661 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
662 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
663 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
664 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
665 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
666 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
667 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
668 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
669 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
670 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
671 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
672 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
673 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
674 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
675 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
677 /* Armv8.1-M Mainline instructions. */
678 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
679 0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
680 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
681 0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
683 /* ARMv8-M Mainline Security Extensions instructions. */
684 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
685 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
686 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
687 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
689 /* Register load/store. */
690 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
691 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
692 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
693 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
694 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
695 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
696 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
697 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
698 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
699 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
700 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
701 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
702 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
703 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
704 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
705 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
706 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
707 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
708 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
709 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
710 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
711 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
712 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
713 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
714 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
715 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
716 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
717 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
718 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
719 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
720 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
721 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
722 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
723 0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
724 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
725 0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
727 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
728 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
729 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
730 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
731 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
732 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
733 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
734 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
736 /* Data transfer between ARM and NEON registers. */
737 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
738 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
739 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
740 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
741 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
742 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
743 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
744 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
745 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
746 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
747 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
748 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
749 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
750 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
751 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
752 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
753 /* Half-precision conversion instructions. */
754 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
755 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
756 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
757 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
758 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
759 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
760 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
761 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
763 /* Floating point coprocessor (VFP) instructions. */
764 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
765 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
766 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
767 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
768 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
769 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
770 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
771 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
772 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
773 0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
774 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
775 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
776 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
777 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
778 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
779 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
780 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
781 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
782 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
783 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
784 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
785 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
786 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
787 0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
788 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
789 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
790 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
791 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
792 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
793 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
794 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
795 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
796 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
797 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
798 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
799 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
800 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
801 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
802 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
803 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
804 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
805 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
806 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
807 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
808 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
809 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
810 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
811 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
812 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
813 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
814 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
815 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
816 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
817 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
818 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
819 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
820 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
821 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
822 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
823 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
824 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
825 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
826 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
827 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
828 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
829 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
830 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
831 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
832 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
833 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
834 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
835 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
836 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
837 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
838 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
839 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
840 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
841 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
842 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
843 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
844 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
845 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
846 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
847 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
848 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
849 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
850 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
851 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
852 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
853 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
854 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
855 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
856 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
857 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
858 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
859 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
860 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
861 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
862 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
863 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
864 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
865 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
866 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
867 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
868 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
869 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
870 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
871 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
872 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
873 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
874 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
875 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
876 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
877 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
878 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
879 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
880 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
881 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
882 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
883 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
884 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
885 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
886 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
887 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
888 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
889 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
890 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
891 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
892 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
893 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
894 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
895 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
896 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
897 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
898 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
899 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
900 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
901 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
903 /* Cirrus coprocessor instructions. */
904 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
905 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
906 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
907 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
908 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
909 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
910 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
911 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
912 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
913 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
914 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
915 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
916 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
917 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
918 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
919 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
920 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
921 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
922 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
923 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
924 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
925 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
926 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
927 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
928 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
929 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
930 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
931 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
932 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
933 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
934 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
935 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
936 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
937 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
938 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
939 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
940 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
941 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
942 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
943 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
944 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
945 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
946 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
947 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
948 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
949 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
950 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
951 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
952 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
953 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
954 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
955 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
956 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
957 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
958 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
959 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
960 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
961 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
962 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
963 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
964 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
965 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
966 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
967 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
968 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
969 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
970 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
971 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
972 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
973 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
974 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
975 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
976 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
977 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
978 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
979 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
980 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
981 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
982 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
983 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
984 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
985 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
986 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
987 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
988 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
989 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
990 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
991 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
992 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
993 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
994 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
995 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
996 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
997 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
998 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
999 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
1000 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1001 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
1002 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1003 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
1004 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1005 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
1006 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1007 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
1008 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1009 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
1010 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1011 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
1012 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1013 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
1014 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1015 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
1016 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1017 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
1018 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1019 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
1020 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1021 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
1022 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1023 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
1024 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1025 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
1026 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1027 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
1028 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1029 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1030 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1031 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1032 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1033 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1034 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1035 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1036 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1037 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1038 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1039 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1040 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1041 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
1042 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1043 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
1044 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1045 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
1046 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1047 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
1048 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1049 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1050 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1051 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1052 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1053 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1054 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1055 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1056 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1057 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1058 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1059 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1060 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1061 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1062 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1063 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1064 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1065 0x0e000600, 0x0ff00f10,
1066 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1067 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1068 0x0e100600, 0x0ff00f10,
1069 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1070 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1071 0x0e200600, 0x0ff00f10,
1072 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1073 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1074 0x0e300600, 0x0ff00f10,
1075 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1077 /* VFP Fused multiply add instructions. */
1078 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1079 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
1080 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1081 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
1082 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1083 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
1084 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1085 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
1086 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1087 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
1088 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1089 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
1090 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1091 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
1092 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1093 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
1096 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1097 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
1098 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1099 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
1100 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1101 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
1102 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1103 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
1104 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1105 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
1106 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1107 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
1108 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1109 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
1110 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1111 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
1112 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1113 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
1114 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1115 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
1116 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1117 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
1118 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1119 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
1121 /* Generic coprocessor instructions. */
1122 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START
, 0, "" },
1123 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1124 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
1125 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1126 0x0c500000, 0x0ff00000,
1127 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1128 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1129 0x0e000000, 0x0f000010,
1130 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1131 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1132 0x0e10f010, 0x0f10f010,
1133 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
1134 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1135 0x0e100010, 0x0f100010,
1136 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1137 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1138 0x0e000010, 0x0f100010,
1139 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1140 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1141 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
1142 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1143 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
1145 /* V6 coprocessor instructions. */
1146 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1147 0xfc500000, 0xfff00000,
1148 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1149 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1150 0xfc400000, 0xfff00000,
1151 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
1153 /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8. */
1154 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1155 0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1156 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1157 0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1158 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1159 0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1160 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1161 0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1162 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1163 0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1164 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1165 0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1166 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1167 0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
1168 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1169 0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
1170 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1171 0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
1172 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1173 0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
1175 /* Dot Product instructions in the space of coprocessor 13. */
1176 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1177 0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
1178 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1179 0xfe000d00, 0xff000f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
1181 /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */
1182 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1183 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1184 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1185 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1186 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1187 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1188 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1189 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1190 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1191 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1192 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1193 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1194 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1195 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1196 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1197 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1199 /* V5 coprocessor instructions. */
1200 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1201 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1202 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1203 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1204 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1205 0xfe000000, 0xff000010,
1206 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1207 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1208 0xfe000010, 0xff100010,
1209 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1210 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1211 0xfe100010, 0xff100010,
1212 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1214 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
1215 cp_num: bit <11:8> == 0b1001.
1216 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */
1217 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1218 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
1219 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1220 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
1221 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1222 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
1223 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1224 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
1225 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1226 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
1227 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1228 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
1229 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1230 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
1231 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1232 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
1233 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1234 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
1235 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1236 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
1237 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1238 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
1239 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1240 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
1241 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1242 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
1243 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1244 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
1245 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1246 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
1247 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1248 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
1249 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1250 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
1251 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1252 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
1253 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1254 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
1255 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1256 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
1257 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1258 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
1259 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1260 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
1261 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1262 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
1263 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1264 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
1265 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1266 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
1267 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1268 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
1269 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1270 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
1271 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1272 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
1273 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1274 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
1275 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1276 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
1277 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1278 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
1279 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1280 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
1281 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1282 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
1283 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1284 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
1285 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1286 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
1288 /* ARMv8.3 javascript conversion instruction. */
1289 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1290 0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
1292 {ANY
, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1295 /* Neon opcode table: This does not encode the top byte -- that is
1296 checked by the print_insn_neon routine, as it depends on whether we are
1297 doing thumb32 or arm32 disassembly. */
1299 /* print_insn_neon recognizes the following format control codes:
1303 %c print condition code
1304 %u print condition code (unconditional in ARM mode,
1305 UNPREDICTABLE if not AL in Thumb)
1306 %A print v{st,ld}[1234] operands
1307 %B print v{st,ld}[1234] any one operands
1308 %C print v{st,ld}[1234] single->all operands
1310 %E print vmov, vmvn, vorr, vbic encoded constant
1311 %F print vtbl,vtbx register list
1313 %<bitfield>r print as an ARM register
1314 %<bitfield>d print the bitfield in decimal
1315 %<bitfield>e print the 2^N - bitfield in decimal
1316 %<bitfield>D print as a NEON D register
1317 %<bitfield>Q print as a NEON Q register
1318 %<bitfield>R print as a NEON D or Q register
1319 %<bitfield>Sn print byte scaled width limited by n
1320 %<bitfield>Tn print short scaled width limited by n
1321 %<bitfield>Un print long scaled width limited by n
1323 %<bitfield>'c print specified char iff bitfield is all ones
1324 %<bitfield>`c print specified char iff bitfield is all zeroes
1325 %<bitfield>?ab... select from array of values in big endian order. */
1327 static const struct opcode32 neon_opcodes
[] =
1330 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1331 0xf2b00840, 0xffb00850,
1332 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1333 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1334 0xf2b00000, 0xffb00810,
1335 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1337 /* Data transfer between ARM and NEON registers. */
1338 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1339 0x0e800b10, 0x1ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
1340 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1341 0x0e800b30, 0x1ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
1342 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1343 0x0ea00b10, 0x1ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
1344 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1345 0x0ea00b30, 0x1ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
1346 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1347 0x0ec00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
1348 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1349 0x0ee00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
1351 /* Move data element to all lanes. */
1352 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1353 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
1354 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1355 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
1356 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1357 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
1360 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1361 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
1362 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1363 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
1365 /* Half-precision conversions. */
1366 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1367 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
1368 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1369 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
1371 /* NEON fused multiply add instructions. */
1372 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1373 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1374 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1375 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1376 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1377 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1378 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1379 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1381 /* Two registers, miscellaneous. */
1382 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1383 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
1384 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1385 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
1386 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1387 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
1388 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1389 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
1390 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1391 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
1392 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1393 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
1394 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1395 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
1396 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1397 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
1398 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1399 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
1400 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1401 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
1402 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1403 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
1404 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1405 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
1406 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1407 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
1408 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1409 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
1410 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1411 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
1412 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1413 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
1414 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1415 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
1416 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1417 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
1418 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1419 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1420 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1421 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1422 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1423 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
1424 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1425 0xf3b20300, 0xffb30fd0,
1426 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
1427 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1428 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1429 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1430 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1431 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1432 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1433 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1434 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1435 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1436 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1437 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1438 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1439 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1440 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1441 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1442 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1443 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1444 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
1445 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1446 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1447 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1448 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1449 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1450 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1451 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1452 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1453 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1454 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1455 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1456 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1457 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1458 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1459 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1460 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1461 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1462 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1463 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1464 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1465 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1466 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1467 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1468 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1469 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1470 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1471 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1472 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1473 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1474 0xf3bb0600, 0xffbf0e10,
1475 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
1476 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1477 0xf3b70600, 0xffbf0e10,
1478 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
1480 /* Three registers of the same length. */
1481 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1482 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1483 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1484 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1485 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1486 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1487 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1488 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1489 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1490 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1491 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1492 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1493 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1494 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1495 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1496 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1497 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1498 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1499 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1500 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1501 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1502 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1503 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1504 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1505 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1506 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1507 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1508 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1509 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1510 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1511 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1512 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1513 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1514 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1515 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1516 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1517 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1518 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1519 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1520 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1521 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1522 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1523 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1524 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1525 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1526 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1527 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1528 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1529 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1530 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1531 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1532 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1533 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1534 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1535 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1536 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1537 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1538 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1539 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1540 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1541 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1542 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1543 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1544 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1545 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1546 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1547 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1548 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1549 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1550 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1551 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1552 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1553 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1554 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1555 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1556 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1557 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1558 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1559 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1560 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1561 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1562 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1563 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1564 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1565 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1566 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1567 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1568 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1569 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1570 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1571 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1572 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1573 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1574 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1575 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1576 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1577 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1578 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1579 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1580 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1581 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1582 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1583 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1584 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1585 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1586 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1587 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1588 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1589 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1590 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1591 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1592 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1593 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1594 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1595 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1596 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1597 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1598 0xf2000b00, 0xff800f10,
1599 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1600 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1601 0xf2000b10, 0xff800f10,
1602 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1603 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1604 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1605 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1606 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1607 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1608 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1609 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1610 0xf3000b00, 0xff800f10,
1611 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1612 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1613 0xf2000000, 0xfe800f10,
1614 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1615 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1616 0xf2000010, 0xfe800f10,
1617 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1618 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1619 0xf2000100, 0xfe800f10,
1620 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1621 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1622 0xf2000200, 0xfe800f10,
1623 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1624 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1625 0xf2000210, 0xfe800f10,
1626 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1627 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1628 0xf2000300, 0xfe800f10,
1629 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1630 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1631 0xf2000310, 0xfe800f10,
1632 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1633 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1634 0xf2000400, 0xfe800f10,
1635 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1636 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1637 0xf2000410, 0xfe800f10,
1638 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1639 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1640 0xf2000500, 0xfe800f10,
1641 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1642 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1643 0xf2000510, 0xfe800f10,
1644 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1645 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1646 0xf2000600, 0xfe800f10,
1647 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1648 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1649 0xf2000610, 0xfe800f10,
1650 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1651 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1652 0xf2000700, 0xfe800f10,
1653 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1654 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1655 0xf2000710, 0xfe800f10,
1656 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1657 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1658 0xf2000910, 0xfe800f10,
1659 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1660 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1661 0xf2000a00, 0xfe800f10,
1662 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1663 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1664 0xf2000a10, 0xfe800f10,
1665 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1666 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1667 0xf3000b10, 0xff800f10,
1668 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1669 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1670 0xf3000c10, 0xff800f10,
1671 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1673 /* One register and an immediate value. */
1674 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1675 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
1676 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1677 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
1678 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1679 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
1680 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1681 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
1682 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1683 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
1684 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1685 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
1686 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1687 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
1688 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1689 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
1690 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1691 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
1692 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1693 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
1694 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1695 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
1696 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1697 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
1698 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1699 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
1701 /* Two registers and a shift amount. */
1702 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1703 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1704 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1705 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1706 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1707 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1708 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1709 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1710 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1711 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1712 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1713 0xf2880950, 0xfeb80fd0,
1714 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1715 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1716 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
1717 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1718 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1719 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1720 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1721 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1722 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1723 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1724 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
1725 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1726 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
1727 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1728 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
1729 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1730 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1731 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1732 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1733 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1734 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1735 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1736 0xf2900950, 0xfeb00fd0,
1737 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1738 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1739 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
1740 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1741 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1742 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1743 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1744 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1745 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1746 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1747 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1748 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1749 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1750 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1751 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1752 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1753 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1754 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1755 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1756 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1757 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
1758 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1759 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
1760 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1761 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
1762 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1763 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
1764 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1765 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1766 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1767 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1768 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1769 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1770 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1771 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1772 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1773 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1774 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1775 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1776 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1777 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1778 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1779 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1780 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1781 0xf2a00950, 0xfea00fd0,
1782 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1783 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1784 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1785 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1786 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
1787 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1788 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
1789 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1790 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
1791 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1792 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1793 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1794 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1795 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1796 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1797 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1798 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1799 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1800 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1801 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1802 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1803 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1804 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
1805 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1806 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
1807 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1808 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
1809 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1810 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1811 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1812 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1813 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1814 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1815 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1816 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1817 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1818 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1819 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1820 0xf2a00e10, 0xfea00e90,
1821 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
1822 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1823 0xf2a00c10, 0xfea00e90,
1824 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
1826 /* Three registers of different lengths. */
1827 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1828 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1829 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1830 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1831 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1832 0xf2800400, 0xff800f50,
1833 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1834 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1835 0xf2800600, 0xff800f50,
1836 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1837 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1838 0xf2800900, 0xff800f50,
1839 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1840 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1841 0xf2800b00, 0xff800f50,
1842 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1843 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1844 0xf2800d00, 0xff800f50,
1845 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1846 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1847 0xf3800400, 0xff800f50,
1848 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1849 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1850 0xf3800600, 0xff800f50,
1851 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1852 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1853 0xf2800000, 0xfe800f50,
1854 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1855 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1856 0xf2800100, 0xfe800f50,
1857 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1858 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1859 0xf2800200, 0xfe800f50,
1860 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1861 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1862 0xf2800300, 0xfe800f50,
1863 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1864 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1865 0xf2800500, 0xfe800f50,
1866 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1867 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1868 0xf2800700, 0xfe800f50,
1869 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1870 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1871 0xf2800800, 0xfe800f50,
1872 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1873 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1874 0xf2800a00, 0xfe800f50,
1875 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1876 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1877 0xf2800c00, 0xfe800f50,
1878 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1880 /* Two registers and a scalar. */
1881 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1882 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1883 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1884 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1885 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1886 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
1887 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1888 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1889 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1890 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1891 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1892 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1893 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1894 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
1895 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1896 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1897 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1898 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1899 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1900 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1901 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1902 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
1903 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1904 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1905 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1906 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1907 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1908 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1909 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1910 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1911 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1912 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1913 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1914 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1915 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1916 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1917 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1918 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1919 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1920 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1921 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1922 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1923 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1924 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1925 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1926 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1927 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1928 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1929 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1930 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1931 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1932 0xf2800240, 0xfe800f50,
1933 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1934 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1935 0xf2800640, 0xfe800f50,
1936 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1937 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1938 0xf2800a40, 0xfe800f50,
1939 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1940 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1941 0xf2800e40, 0xff800f50,
1942 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1943 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1944 0xf2800f40, 0xff800f50,
1945 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1946 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1947 0xf3800e40, 0xff800f50,
1948 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1949 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1950 0xf3800f40, 0xff800f50,
1951 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
1954 /* Element and structure load/store. */
1955 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1956 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
1957 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1958 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
1959 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1960 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
1961 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1962 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
1963 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1964 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
1965 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1966 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
1967 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1968 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
1969 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1970 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
1971 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1972 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
1973 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1974 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
1975 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1976 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
1977 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1978 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
1979 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1980 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
1981 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1982 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
1983 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1984 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
1985 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1986 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
1987 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1988 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
1989 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1990 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
1991 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1992 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
1994 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
1997 /* mve opcode table. */
1999 /* print_insn_mve recognizes the following format control codes:
2003 %a print '+' or '-' or imm offset in vldr[bhwd] and
2005 %c print condition code
2006 %d print addr mode of MVE vldr[bhw] and vstr[bhw]
2007 %u print 'U' (unsigned) or 'S' for various mve instructions
2008 %i print MVE predicate(s) for vpt and vpst
2009 %m print rounding mode for vcvt and vrint
2010 %n print vector comparison code for predicated instruction
2011 %s print size for various vcvt instructions
2012 %v print vector predicate for instruction in predicated
2014 %o print offset scaled for vldr[hwd] and vstr[hwd]
2015 %w print writeback mode for MVE v{st,ld}[24]
2016 %B print v{st,ld}[24] any one operands
2017 %E print vmov, vmvn, vorr, vbic encoded constant
2018 %N print generic index for vmov
2019 %T print bottom ('b') or top ('t') of source register
2020 %X print exchange field in vmla* instructions
2022 %<bitfield>r print as an ARM register
2023 %<bitfield>d print the bitfield in decimal
2024 %<bitfield>A print accumulate or not
2025 %<bitfield>Q print as a MVE Q register
2026 %<bitfield>F print as a MVE S register
2027 %<bitfield>Z as %<>r but r15 is ZR instead of PC and r13 is
2029 %<bitfield>s print size for vector predicate & non VMOV instructions
2030 %<bitfield>I print carry flag or not
2031 %<bitfield>i print immediate for vstr/vldr reg +/- imm
2032 %<bitfield>h print high half of 64-bit destination reg
2033 %<bitfield>k print immediate for vector conversion instruction
2034 %<bitfield>l print low half of 64-bit destination reg
2035 %<bitfield>o print rotate value for vcmul
2036 %<bitfield>u print immediate value for vddup/vdwdup
2037 %<bitfield>x print the bitfield in hex.
2040 static const struct mopcode32 mve_opcodes
[] =
2044 {ARM_FEATURE_COPROC (FPU_MVE
),
2046 0xfe310f4d, 0xffbf1fff,
2050 /* Floating point VPT T1. */
2051 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2053 0xee310f00, 0xefb10f50,
2054 "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
2055 /* Floating point VPT T2. */
2056 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2058 0xee310f40, 0xefb10f50,
2059 "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
2061 /* Vector VPT T1. */
2062 {ARM_FEATURE_COPROC (FPU_MVE
),
2064 0xfe010f00, 0xff811f51,
2065 "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2066 /* Vector VPT T2. */
2067 {ARM_FEATURE_COPROC (FPU_MVE
),
2069 0xfe010f01, 0xff811f51,
2070 "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2071 /* Vector VPT T3. */
2072 {ARM_FEATURE_COPROC (FPU_MVE
),
2074 0xfe011f00, 0xff811f50,
2075 "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2076 /* Vector VPT T4. */
2077 {ARM_FEATURE_COPROC (FPU_MVE
),
2079 0xfe010f40, 0xff811f70,
2080 "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
2081 /* Vector VPT T5. */
2082 {ARM_FEATURE_COPROC (FPU_MVE
),
2084 0xfe010f60, 0xff811f70,
2085 "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
2086 /* Vector VPT T6. */
2087 {ARM_FEATURE_COPROC (FPU_MVE
),
2089 0xfe011f40, 0xff811f50,
2090 "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
2092 /* Vector VBIC immediate. */
2093 {ARM_FEATURE_COPROC (FPU_MVE
),
2095 0xef800070, 0xefb81070,
2096 "vbic%v.i%8-11s\t%13-15,22Q, %E"},
2098 /* Vector VBIC register. */
2099 {ARM_FEATURE_COPROC (FPU_MVE
),
2101 0xef100150, 0xffb11f51,
2102 "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2105 {ARM_FEATURE_COPROC (FPU_MVE
),
2107 0xee800f01, 0xefc10f51,
2108 "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
2110 /* Vector VABD floating point. */
2111 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2113 0xff200d40, 0xffa11f51,
2114 "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2117 {ARM_FEATURE_COPROC (FPU_MVE
),
2119 0xef000740, 0xef811f51,
2120 "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2122 /* Vector VABS floating point. */
2123 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2125 0xFFB10740, 0xFFB31FD1,
2126 "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2128 {ARM_FEATURE_COPROC (FPU_MVE
),
2130 0xffb10340, 0xffb31fd1,
2131 "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2133 /* Vector VADD floating point T1. */
2134 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2136 0xef000d40, 0xffa11f51,
2137 "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2138 /* Vector VADD floating point T2. */
2139 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2141 0xee300f40, 0xefb11f70,
2142 "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2143 /* Vector VADD T1. */
2144 {ARM_FEATURE_COPROC (FPU_MVE
),
2146 0xef000840, 0xff811f51,
2147 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2148 /* Vector VADD T2. */
2149 {ARM_FEATURE_COPROC (FPU_MVE
),
2151 0xee010f40, 0xff811f70,
2152 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2154 /* Vector VADDLV. */
2155 {ARM_FEATURE_COPROC (FPU_MVE
),
2157 0xee890f00, 0xef8f1fd1,
2158 "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
2161 {ARM_FEATURE_COPROC (FPU_MVE
),
2163 0xeef10f00, 0xeff31fd1,
2164 "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
2167 {ARM_FEATURE_COPROC (FPU_MVE
),
2169 0xee300f00, 0xffb10f51,
2170 "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2173 {ARM_FEATURE_COPROC (FPU_MVE
),
2175 0xef000150, 0xffb11f51,
2176 "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2178 /* Vector VBRSR register. */
2179 {ARM_FEATURE_COPROC (FPU_MVE
),
2181 0xfe011e60, 0xff811f70,
2182 "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2184 /* Vector VCADD floating point. */
2185 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2187 0xfc800840, 0xfea11f51,
2188 "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"},
2191 {ARM_FEATURE_COPROC (FPU_MVE
),
2193 0xfe000f00, 0xff810f51,
2194 "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2197 {ARM_FEATURE_COPROC (FPU_MVE
),
2199 0xffb00440, 0xffb31fd1,
2200 "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2203 {ARM_FEATURE_COPROC (FPU_MVE
),
2205 0xffb004c0, 0xffb31fd1,
2206 "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2209 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2211 0xfc200840, 0xfe211f51,
2212 "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"},
2214 /* Vector VCMP floating point T1. */
2215 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2217 0xee310f00, 0xeff1ef50,
2218 "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
2220 /* Vector VCMP floating point T2. */
2221 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2223 0xee310f40, 0xeff1ef50,
2224 "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
2226 /* Vector VCMP T1. */
2227 {ARM_FEATURE_COPROC (FPU_MVE
),
2229 0xfe010f00, 0xffc1ff51,
2230 "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2231 /* Vector VCMP T2. */
2232 {ARM_FEATURE_COPROC (FPU_MVE
),
2234 0xfe010f01, 0xffc1ff51,
2235 "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2236 /* Vector VCMP T3. */
2237 {ARM_FEATURE_COPROC (FPU_MVE
),
2239 0xfe011f00, 0xffc1ff50,
2240 "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2241 /* Vector VCMP T4. */
2242 {ARM_FEATURE_COPROC (FPU_MVE
),
2244 0xfe010f40, 0xffc1ff70,
2245 "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
2246 /* Vector VCMP T5. */
2247 {ARM_FEATURE_COPROC (FPU_MVE
),
2249 0xfe010f60, 0xffc1ff70,
2250 "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
2251 /* Vector VCMP T6. */
2252 {ARM_FEATURE_COPROC (FPU_MVE
),
2254 0xfe011f40, 0xffc1ff50,
2255 "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
2258 {ARM_FEATURE_COPROC (FPU_MVE
),
2260 0xeea00b10, 0xffb10f5f,
2261 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2264 {ARM_FEATURE_COPROC (FPU_MVE
),
2266 0xff000150, 0xffd11f51,
2267 "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2269 /* Vector VFMA, vector * scalar. */
2270 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2272 0xee310e40, 0xefb11f70,
2273 "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2275 /* Vector VFMA floating point. */
2276 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2278 0xef000c50, 0xffa11f51,
2279 "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2281 /* Vector VFMS floating point. */
2282 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2284 0xef200c50, 0xffa11f51,
2285 "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2287 /* Vector VFMAS, vector * scalar. */
2288 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2289 MVE_VFMAS_FP_SCALAR
,
2290 0xee311e40, 0xefb11f70,
2291 "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2293 /* Vector VHADD T1. */
2294 {ARM_FEATURE_COPROC (FPU_MVE
),
2296 0xef000040, 0xef811f51,
2297 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2299 /* Vector VHADD T2. */
2300 {ARM_FEATURE_COPROC (FPU_MVE
),
2302 0xee000f40, 0xef811f70,
2303 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2305 /* Vector VHSUB T1. */
2306 {ARM_FEATURE_COPROC (FPU_MVE
),
2308 0xef000240, 0xef811f51,
2309 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2311 /* Vector VHSUB T2. */
2312 {ARM_FEATURE_COPROC (FPU_MVE
),
2314 0xee001f40, 0xef811f70,
2315 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2318 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2320 0xee300e00, 0xefb10f50,
2321 "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"},
2324 {ARM_FEATURE_COPROC (FPU_MVE
),
2326 0xf000e801, 0xffc0ffff,
2327 "vctp%v.%20-21s\t%16-19r"},
2330 {ARM_FEATURE_COPROC (FPU_MVE
),
2332 0xeea00b10, 0xffb10f5f,
2333 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2335 /* Vector VRHADD. */
2336 {ARM_FEATURE_COPROC (FPU_MVE
),
2338 0xef000140, 0xef811f51,
2339 "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2342 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2343 MVE_VCVT_FP_FIX_VEC
,
2344 0xef800c50, 0xef801cd1,
2345 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"},
2348 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2349 MVE_VCVT_BETWEEN_FP_INT
,
2350 0xffb30640, 0xffb31e51,
2351 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
2353 /* Vector VCVT between single and half-precision float, bottom half. */
2354 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2355 MVE_VCVT_FP_HALF_FP
,
2356 0xee3f0e01, 0xefbf1fd1,
2357 "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
2359 /* Vector VCVT between single and half-precision float, top half. */
2360 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2361 MVE_VCVT_FP_HALF_FP
,
2362 0xee3f1e01, 0xefbf1fd1,
2363 "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
2366 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2367 MVE_VCVT_FROM_FP_TO_INT
,
2368 0xffb30040, 0xffb31c51,
2369 "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
2372 {ARM_FEATURE_COPROC (FPU_MVE
),
2374 0xee011f6e, 0xff811f7e,
2375 "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2377 /* Vector VDWDUP. */
2378 {ARM_FEATURE_COPROC (FPU_MVE
),
2380 0xee011f60, 0xff811f70,
2381 "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2383 /* Vector VHCADD. */
2384 {ARM_FEATURE_COPROC (FPU_MVE
),
2386 0xee000f00, 0xff810f51,
2387 "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2389 /* Vector VIWDUP. */
2390 {ARM_FEATURE_COPROC (FPU_MVE
),
2392 0xee010f60, 0xff811f70,
2393 "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2396 {ARM_FEATURE_COPROC (FPU_MVE
),
2398 0xee010f6e, 0xff811f7e,
2399 "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2402 {ARM_FEATURE_COPROC (FPU_MVE
),
2404 0xfc901e00, 0xff901e5f,
2405 "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
2408 {ARM_FEATURE_COPROC (FPU_MVE
),
2410 0xfc901e01, 0xff901e1f,
2411 "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
2413 /* Vector VLDRB gather load. */
2414 {ARM_FEATURE_COPROC (FPU_MVE
),
2415 MVE_VLDRB_GATHER_T1
,
2416 0xec900e00, 0xefb01e50,
2417 "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
2419 /* Vector VLDRH gather load. */
2420 {ARM_FEATURE_COPROC (FPU_MVE
),
2421 MVE_VLDRH_GATHER_T2
,
2422 0xec900e10, 0xefb01e50,
2423 "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2425 /* Vector VLDRW gather load. */
2426 {ARM_FEATURE_COPROC (FPU_MVE
),
2427 MVE_VLDRW_GATHER_T3
,
2428 0xfc900f40, 0xffb01fd0,
2429 "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2431 /* Vector VLDRD gather load. */
2432 {ARM_FEATURE_COPROC (FPU_MVE
),
2433 MVE_VLDRD_GATHER_T4
,
2434 0xec900fd0, 0xefb01fd0,
2435 "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2437 /* Vector VLDRW gather load. */
2438 {ARM_FEATURE_COPROC (FPU_MVE
),
2439 MVE_VLDRW_GATHER_T5
,
2440 0xfd101e00, 0xff111f00,
2441 "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2443 /* Vector VLDRD gather load, variant T6. */
2444 {ARM_FEATURE_COPROC (FPU_MVE
),
2445 MVE_VLDRD_GATHER_T6
,
2446 0xfd101f00, 0xff111f00,
2447 "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2450 {ARM_FEATURE_COPROC (FPU_MVE
),
2452 0xec100e00, 0xee581e00,
2453 "vldrb%v.%u%7-8s\t%13-15Q, %d"},
2456 {ARM_FEATURE_COPROC (FPU_MVE
),
2458 0xec180e00, 0xee581e00,
2459 "vldrh%v.%u%7-8s\t%13-15Q, %d"},
2461 /* Vector VLDRB unsigned, variant T5. */
2462 {ARM_FEATURE_COPROC (FPU_MVE
),
2464 0xec101e00, 0xfe101f80,
2465 "vldrb%v.u8\t%13-15,22Q, %d"},
2467 /* Vector VLDRH unsigned, variant T6. */
2468 {ARM_FEATURE_COPROC (FPU_MVE
),
2470 0xec101e80, 0xfe101f80,
2471 "vldrh%v.u16\t%13-15,22Q, %d"},
2473 /* Vector VLDRW unsigned, variant T7. */
2474 {ARM_FEATURE_COPROC (FPU_MVE
),
2476 0xec101f00, 0xfe101f80,
2477 "vldrw%v.u32\t%13-15,22Q, %d"},
2480 {ARM_FEATURE_COPROC (FPU_MVE
),
2482 0xef000640, 0xef811f51,
2483 "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2486 {ARM_FEATURE_COPROC (FPU_MVE
),
2488 0xee330e81, 0xffb31fd1,
2489 "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2491 /* Vector VMAXNM floating point. */
2492 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2494 0xff000f50, 0xffa11f51,
2495 "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2497 /* Vector VMAXNMA floating point. */
2498 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2500 0xee3f0e81, 0xefbf1fd1,
2501 "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2503 /* Vector VMAXNMV floating point. */
2504 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2506 0xeeee0f00, 0xefff0fd1,
2507 "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2509 /* Vector VMAXNMAV floating point. */
2510 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2512 0xeeec0f00, 0xefff0fd1,
2513 "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2516 {ARM_FEATURE_COPROC (FPU_MVE
),
2518 0xeee20f00, 0xeff30fd1,
2519 "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2521 /* Vector VMAXAV. */
2522 {ARM_FEATURE_COPROC (FPU_MVE
),
2524 0xeee00f00, 0xfff30fd1,
2525 "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2528 {ARM_FEATURE_COPROC (FPU_MVE
),
2530 0xef000650, 0xef811f51,
2531 "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2534 {ARM_FEATURE_COPROC (FPU_MVE
),
2536 0xee331e81, 0xffb31fd1,
2537 "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2539 /* Vector VMINNM floating point. */
2540 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2542 0xff200f50, 0xffa11f51,
2543 "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2545 /* Vector VMINNMA floating point. */
2546 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2548 0xee3f1e81, 0xefbf1fd1,
2549 "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2551 /* Vector VMINNMV floating point. */
2552 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2554 0xeeee0f80, 0xefff0fd1,
2555 "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2557 /* Vector VMINNMAV floating point. */
2558 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2560 0xeeec0f80, 0xefff0fd1,
2561 "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2564 {ARM_FEATURE_COPROC (FPU_MVE
),
2566 0xeee20f80, 0xeff30fd1,
2567 "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2569 /* Vector VMINAV. */
2570 {ARM_FEATURE_COPROC (FPU_MVE
),
2572 0xeee00f80, 0xfff30fd1,
2573 "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2576 {ARM_FEATURE_COPROC (FPU_MVE
),
2578 0xee010e40, 0xef811f70,
2579 "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2581 /* Vector VMLALDAV. Note must appear before VMLADAV due to instruction
2583 {ARM_FEATURE_COPROC (FPU_MVE
),
2585 0xee801e00, 0xef801f51,
2586 "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2588 {ARM_FEATURE_COPROC (FPU_MVE
),
2590 0xee800e00, 0xef801f51,
2591 "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2593 /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0. */
2594 {ARM_FEATURE_COPROC (FPU_MVE
),
2596 0xeef00e00, 0xeff01f51,
2597 "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2599 /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0. */
2600 {ARM_FEATURE_COPROC (FPU_MVE
),
2602 0xeef00f00, 0xeff11f51,
2603 "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2605 /* Vector VMLADAV T1 variant. */
2606 {ARM_FEATURE_COPROC (FPU_MVE
),
2608 0xeef01e00, 0xeff01f51,
2609 "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2611 /* Vector VMLADAV T2 variant. */
2612 {ARM_FEATURE_COPROC (FPU_MVE
),
2614 0xeef01f00, 0xeff11f51,
2615 "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2618 {ARM_FEATURE_COPROC (FPU_MVE
),
2620 0xee011e40, 0xef811f70,
2621 "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2623 /* Vector VRMLSLDAVH. Note must appear before VMLSDAV due to instruction
2625 {ARM_FEATURE_COPROC (FPU_MVE
),
2627 0xfe800e01, 0xff810f51,
2628 "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2630 /* Vector VMLSLDAV. Note must appear before VMLSDAV due to instruction
2632 {ARM_FEATURE_COPROC (FPU_MVE
),
2634 0xee800e01, 0xff800f51,
2635 "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2637 /* Vector VMLSDAV T1 Variant. */
2638 {ARM_FEATURE_COPROC (FPU_MVE
),
2640 0xeef00e01, 0xfff00f51,
2641 "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2643 /* Vector VMLSDAV T2 Variant. */
2644 {ARM_FEATURE_COPROC (FPU_MVE
),
2646 0xfef00e01, 0xfff10f51,
2647 "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
2649 /* Vector VMOV between gpr and half precision register, op == 0. */
2650 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2652 0xee000910, 0xfff00f7f,
2653 "vmov.f16\t%7,16-19F, %12-15r"},
2655 /* Vector VMOV between gpr and half precision register, op == 1. */
2656 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2658 0xee100910, 0xfff00f7f,
2659 "vmov.f16\t%12-15r, %7,16-19F"},
2661 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2662 MVE_VMOV_GP_TO_VEC_LANE
,
2663 0xee000b10, 0xff900f1f,
2664 "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"},
2666 /* Vector VORR immediate to vector.
2667 NOTE: MVE_VORR_IMM must appear in the table
2668 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2669 {ARM_FEATURE_COPROC (FPU_MVE
),
2671 0xef800050, 0xefb810f0,
2672 "vorr%v.i%8-11s\t%13-15,22Q, %E"},
2674 /* Vector VQSHL T2 Variant.
2675 NOTE: MVE_VQSHL_T2 must appear in the table before
2676 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2677 {ARM_FEATURE_COPROC (FPU_MVE
),
2679 0xef800750, 0xef801fd1,
2680 "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2682 /* Vector VQSHLU T3 Variant
2683 NOTE: MVE_VQSHL_T2 must appear in the table before
2684 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2686 {ARM_FEATURE_COPROC (FPU_MVE
),
2688 0xff800650, 0xff801fd1,
2689 "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2692 NOTE: MVE_VRSHR must appear in the table before
2693 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2694 {ARM_FEATURE_COPROC (FPU_MVE
),
2696 0xef800250, 0xef801fd1,
2697 "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2700 NOTE: MVE_VSHL must appear in the table before
2701 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2702 {ARM_FEATURE_COPROC (FPU_MVE
),
2704 0xef800550, 0xff801fd1,
2705 "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2708 NOTE: MVE_VSHR must appear in the table before
2709 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2710 {ARM_FEATURE_COPROC (FPU_MVE
),
2712 0xef800050, 0xef801fd1,
2713 "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2716 NOTE: MVE_VSLI must appear in the table before
2717 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2718 {ARM_FEATURE_COPROC (FPU_MVE
),
2720 0xff800550, 0xff801fd1,
2721 "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2724 NOTE: MVE_VSRI must appear in the table before
2725 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2726 {ARM_FEATURE_COPROC (FPU_MVE
),
2728 0xff800450, 0xff801fd1,
2729 "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2731 /* Vector VMOV immediate to vector,
2732 cmode == 11x1 -> VMVN which is UNDEFINED
2733 for such a cmode. */
2734 {ARM_FEATURE_COPROC (FPU_MVE
),
2735 MVE_VMVN_IMM
, 0xef800d50, 0xefb81dd0, UNDEFINED_INSTRUCTION
},
2737 /* Vector VMOV immediate to vector. */
2738 {ARM_FEATURE_COPROC (FPU_MVE
),
2739 MVE_VMOV_IMM_TO_VEC
,
2740 0xef800050, 0xefb810d0,
2741 "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2743 /* Vector VMOV two 32-bit lanes to two gprs, idx = 0. */
2744 {ARM_FEATURE_COPROC (FPU_MVE
),
2745 MVE_VMOV2_VEC_LANE_TO_GP
,
2746 0xec000f00, 0xffb01ff0,
2747 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"},
2749 /* Vector VMOV two 32-bit lanes to two gprs, idx = 1. */
2750 {ARM_FEATURE_COPROC (FPU_MVE
),
2751 MVE_VMOV2_VEC_LANE_TO_GP
,
2752 0xec000f10, 0xffb01ff0,
2753 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"},
2755 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0. */
2756 {ARM_FEATURE_COPROC (FPU_MVE
),
2757 MVE_VMOV2_GP_TO_VEC_LANE
,
2758 0xec100f00, 0xffb01ff0,
2759 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2761 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1. */
2762 {ARM_FEATURE_COPROC (FPU_MVE
),
2763 MVE_VMOV2_GP_TO_VEC_LANE
,
2764 0xec100f10, 0xffb01ff0,
2765 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2767 /* Vector VMOV Vector lane to gpr. */
2768 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2769 MVE_VMOV_VEC_LANE_TO_GP
,
2770 0xee100b10, 0xff100f1f,
2771 "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
2773 /* Vector VSHLL T1 Variant. Note: VSHLL T1 must appear before MVE_VMOVL due
2774 to instruction opcode aliasing. */
2775 {ARM_FEATURE_COPROC (FPU_MVE
),
2777 0xeea00f40, 0xefa00fd1,
2778 "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2780 /* Vector VMOVL long. */
2781 {ARM_FEATURE_COPROC (FPU_MVE
),
2783 0xeea00f40, 0xefa70fd1,
2784 "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
2786 /* Vector VMOV and narrow. */
2787 {ARM_FEATURE_COPROC (FPU_MVE
),
2789 0xfe310e81, 0xffb30fd1,
2790 "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2792 /* Floating point move extract. */
2793 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2795 0xfeb00a40, 0xffbf0fd0,
2796 "vmovx.f16\t%22,12-15F, %5,0-3F"},
2798 /* Vector VMULL integer. */
2799 {ARM_FEATURE_COPROC (FPU_MVE
),
2801 0xee010e00, 0xef810f51,
2802 "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2804 /* Vector VMULL polynomial. */
2805 {ARM_FEATURE_COPROC (FPU_MVE
),
2807 0xee310e00, 0xefb10f51,
2808 "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2810 /* Vector VMVN immediate to vector. */
2811 {ARM_FEATURE_COPROC (FPU_MVE
),
2813 0xef800070, 0xefb810f0,
2814 "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
2816 /* Vector VMVN register. */
2817 {ARM_FEATURE_COPROC (FPU_MVE
),
2819 0xffb005c0, 0xffbf1fd1,
2820 "vmvn%v\t%13-15,22Q, %1-3,5Q"},
2822 /* Vector VORN, vector bitwise or not. */
2823 {ARM_FEATURE_COPROC (FPU_MVE
),
2825 0xef300150, 0xffb11f51,
2826 "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2828 /* Vector VORR register. */
2829 {ARM_FEATURE_COPROC (FPU_MVE
),
2831 0xef200150, 0xffb11f51,
2832 "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2834 /* Vector VQDMULL T1 variant. */
2835 {ARM_FEATURE_COPROC (FPU_MVE
),
2837 0xee300f01, 0xefb10f51,
2838 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2840 /* Vector VQDMULL T2 variant. */
2841 {ARM_FEATURE_COPROC (FPU_MVE
),
2843 0xee300f60, 0xefb10f70,
2844 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2846 /* Vector VQMOVN. */
2847 {ARM_FEATURE_COPROC (FPU_MVE
),
2849 0xee330e01, 0xefb30fd1,
2850 "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
2852 /* Vector VQMOVUN. */
2853 {ARM_FEATURE_COPROC (FPU_MVE
),
2855 0xee310e81, 0xffb30fd1,
2856 "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2858 /* Vector VQDMLADH. */
2859 {ARM_FEATURE_COPROC (FPU_MVE
),
2861 0xee000e00, 0xff810f51,
2862 "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2864 /* Vector VQRDMLADH. */
2865 {ARM_FEATURE_COPROC (FPU_MVE
),
2867 0xee000e01, 0xff810f51,
2868 "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2870 /* Vector VQDMLAH. */
2871 {ARM_FEATURE_COPROC (FPU_MVE
),
2873 0xee000e60, 0xef811f70,
2874 "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2876 /* Vector VQRDMLAH. */
2877 {ARM_FEATURE_COPROC (FPU_MVE
),
2879 0xee000e40, 0xef811f70,
2880 "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2882 /* Vector VQDMLASH. */
2883 {ARM_FEATURE_COPROC (FPU_MVE
),
2885 0xee001e60, 0xef811f70,
2886 "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2888 /* Vector VQRDMLASH. */
2889 {ARM_FEATURE_COPROC (FPU_MVE
),
2891 0xee001e40, 0xef811f70,
2892 "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2894 /* Vector VQDMLSDH. */
2895 {ARM_FEATURE_COPROC (FPU_MVE
),
2897 0xfe000e00, 0xff810f51,
2898 "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2900 /* Vector VQRDMLSDH. */
2901 {ARM_FEATURE_COPROC (FPU_MVE
),
2903 0xfe000e01, 0xff810f51,
2904 "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2906 /* Vector VQDMULH T1 variant. */
2907 {ARM_FEATURE_COPROC (FPU_MVE
),
2909 0xef000b40, 0xff811f51,
2910 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2912 /* Vector VQRDMULH T2 variant. */
2913 {ARM_FEATURE_COPROC (FPU_MVE
),
2915 0xff000b40, 0xff811f51,
2916 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2918 /* Vector VQDMULH T3 variant. */
2919 {ARM_FEATURE_COPROC (FPU_MVE
),
2921 0xee010e60, 0xff811f70,
2922 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2924 /* Vector VQRDMULH T4 variant. */
2925 {ARM_FEATURE_COPROC (FPU_MVE
),
2927 0xfe010e60, 0xff811f70,
2928 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2930 /* Vector VQRSHL T1 variant. */
2931 {ARM_FEATURE_COPROC (FPU_MVE
),
2933 0xef000550, 0xef811f51,
2934 "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
2936 /* Vector VQRSHL T2 variant. */
2937 {ARM_FEATURE_COPROC (FPU_MVE
),
2939 0xee331ee0, 0xefb31ff0,
2940 "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
2942 /* Vector VQRSHRN. */
2943 {ARM_FEATURE_COPROC (FPU_MVE
),
2945 0xee800f41, 0xefa00fd1,
2946 "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2948 /* Vector VQRSHRUN. */
2949 {ARM_FEATURE_COPROC (FPU_MVE
),
2951 0xfe800fc0, 0xffa00fd1,
2952 "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2954 /* Vector VQSHL T1 Variant. */
2955 {ARM_FEATURE_COPROC (FPU_MVE
),
2957 0xee311ee0, 0xefb31ff0,
2958 "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
2960 /* Vector VQSHL T4 Variant. */
2961 {ARM_FEATURE_COPROC (FPU_MVE
),
2963 0xef000450, 0xef811f51,
2964 "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
2966 /* Vector VQSHRN. */
2967 {ARM_FEATURE_COPROC (FPU_MVE
),
2969 0xee800f40, 0xefa00fd1,
2970 "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2972 /* Vector VQSHRUN. */
2973 {ARM_FEATURE_COPROC (FPU_MVE
),
2975 0xee800fc0, 0xffa00fd1,
2976 "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2978 /* Vector VRINT floating point. */
2979 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2981 0xffb20440, 0xffb31c51,
2982 "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2984 /* Vector VRMLALDAVH. */
2985 {ARM_FEATURE_COPROC (FPU_MVE
),
2987 0xee800f00, 0xef811f51,
2988 "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2990 /* Vector VRMLALDAVH. */
2991 {ARM_FEATURE_COPROC (FPU_MVE
),
2993 0xee801f00, 0xef811f51,
2994 "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2996 /* Vector VRSHL T1 Variant. */
2997 {ARM_FEATURE_COPROC (FPU_MVE
),
2999 0xef000540, 0xef811f51,
3000 "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3002 /* Vector VRSHL T2 Variant. */
3003 {ARM_FEATURE_COPROC (FPU_MVE
),
3005 0xee331e60, 0xefb31ff0,
3006 "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3008 /* Vector VRSHRN. */
3009 {ARM_FEATURE_COPROC (FPU_MVE
),
3011 0xfe800fc1, 0xffa00fd1,
3012 "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3015 {ARM_FEATURE_COPROC (FPU_MVE
),
3017 0xfe300f00, 0xffb10f51,
3018 "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3020 /* Vector VSHL T2 Variant. */
3021 {ARM_FEATURE_COPROC (FPU_MVE
),
3023 0xee311e60, 0xefb31ff0,
3024 "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3026 /* Vector VSHL T3 Variant. */
3027 {ARM_FEATURE_COPROC (FPU_MVE
),
3029 0xef000440, 0xef811f51,
3030 "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3033 {ARM_FEATURE_COPROC (FPU_MVE
),
3035 0xeea00fc0, 0xffa01ff0,
3036 "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"},
3038 /* Vector VSHLL T2 Variant. */
3039 {ARM_FEATURE_COPROC (FPU_MVE
),
3041 0xee310e01, 0xefb30fd1,
3042 "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"},
3045 {ARM_FEATURE_COPROC (FPU_MVE
),
3047 0xee800fc1, 0xffa00fd1,
3048 "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3050 /* Vector VST2 no writeback. */
3051 {ARM_FEATURE_COPROC (FPU_MVE
),
3053 0xfc801e00, 0xffb01e5f,
3054 "vst2%5d.%7-8s\t%B, [%16-19r]"},
3056 /* Vector VST2 writeback. */
3057 {ARM_FEATURE_COPROC (FPU_MVE
),
3059 0xfca01e00, 0xffb01e5f,
3060 "vst2%5d.%7-8s\t%B, [%16-19r]!"},
3062 /* Vector VST4 no writeback. */
3063 {ARM_FEATURE_COPROC (FPU_MVE
),
3065 0xfc801e01, 0xffb01e1f,
3066 "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
3068 /* Vector VST4 writeback. */
3069 {ARM_FEATURE_COPROC (FPU_MVE
),
3071 0xfca01e01, 0xffb01e1f,
3072 "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
3074 /* Vector VSTRB scatter store, T1 variant. */
3075 {ARM_FEATURE_COPROC (FPU_MVE
),
3076 MVE_VSTRB_SCATTER_T1
,
3077 0xec800e00, 0xffb01e50,
3078 "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
3080 /* Vector VSTRH scatter store, T2 variant. */
3081 {ARM_FEATURE_COPROC (FPU_MVE
),
3082 MVE_VSTRH_SCATTER_T2
,
3083 0xec800e10, 0xffb01e50,
3084 "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3086 /* Vector VSTRW scatter store, T3 variant. */
3087 {ARM_FEATURE_COPROC (FPU_MVE
),
3088 MVE_VSTRW_SCATTER_T3
,
3089 0xec800e40, 0xffb01e50,
3090 "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3092 /* Vector VSTRD scatter store, T4 variant. */
3093 {ARM_FEATURE_COPROC (FPU_MVE
),
3094 MVE_VSTRD_SCATTER_T4
,
3095 0xec800fd0, 0xffb01fd0,
3096 "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3098 /* Vector VSTRW scatter store, T5 variant. */
3099 {ARM_FEATURE_COPROC (FPU_MVE
),
3100 MVE_VSTRW_SCATTER_T5
,
3101 0xfd001e00, 0xff111f00,
3102 "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3104 /* Vector VSTRD scatter store, T6 variant. */
3105 {ARM_FEATURE_COPROC (FPU_MVE
),
3106 MVE_VSTRD_SCATTER_T6
,
3107 0xfd001f00, 0xff111f00,
3108 "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3111 {ARM_FEATURE_COPROC (FPU_MVE
),
3113 0xec000e00, 0xfe581e00,
3114 "vstrb%v.%7-8s\t%13-15Q, %d"},
3117 {ARM_FEATURE_COPROC (FPU_MVE
),
3119 0xec080e00, 0xfe581e00,
3120 "vstrh%v.%7-8s\t%13-15Q, %d"},
3122 /* Vector VSTRB variant T5. */
3123 {ARM_FEATURE_COPROC (FPU_MVE
),
3125 0xec001e00, 0xfe101f80,
3126 "vstrb%v.8\t%13-15,22Q, %d"},
3128 /* Vector VSTRH variant T6. */
3129 {ARM_FEATURE_COPROC (FPU_MVE
),
3131 0xec001e80, 0xfe101f80,
3132 "vstrh%v.16\t%13-15,22Q, %d"},
3134 /* Vector VSTRW variant T7. */
3135 {ARM_FEATURE_COPROC (FPU_MVE
),
3137 0xec001f00, 0xfe101f80,
3138 "vstrw%v.32\t%13-15,22Q, %d"},
3140 /* Vector VSUB floating point T1 variant. */
3141 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3143 0xef200d40, 0xffa11f51,
3144 "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3146 /* Vector VSUB floating point T2 variant. */
3147 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3149 0xee301f40, 0xefb11f70,
3150 "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3152 /* Vector VSUB T1 variant. */
3153 {ARM_FEATURE_COPROC (FPU_MVE
),
3155 0xff000840, 0xff811f51,
3156 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3158 /* Vector VSUB T2 variant. */
3159 {ARM_FEATURE_COPROC (FPU_MVE
),
3161 0xee011f40, 0xff811f70,
3162 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3164 {ARM_FEATURE_CORE_LOW (0),
3166 0x00000000, 0x00000000, 0}
3169 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
3170 ordered: they must be searched linearly from the top to obtain a correct
3173 /* print_insn_arm recognizes the following format control codes:
3177 %a print address for ldr/str instruction
3178 %s print address for ldr/str halfword/signextend instruction
3179 %S like %s but allow UNPREDICTABLE addressing
3180 %b print branch destination
3181 %c print condition code (always bits 28-31)
3182 %m print register mask for ldm/stm instruction
3183 %o print operand2 (immediate or register + shift)
3184 %p print 'p' iff bits 12-15 are 15
3185 %t print 't' iff bit 21 set and bit 24 clear
3186 %B print arm BLX(1) destination
3187 %C print the PSR sub type.
3188 %U print barrier type.
3189 %P print address for pli instruction.
3191 %<bitfield>r print as an ARM register
3192 %<bitfield>T print as an ARM register + 1
3193 %<bitfield>R as %r but r15 is UNPREDICTABLE
3194 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE
3195 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE
3196 %<bitfield>d print the bitfield in decimal
3197 %<bitfield>W print the bitfield plus one in decimal
3198 %<bitfield>x print the bitfield in hex
3199 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
3201 %<bitfield>'c print specified char iff bitfield is all ones
3202 %<bitfield>`c print specified char iff bitfield is all zeroes
3203 %<bitfield>?ab... select from array of values in big endian order
3205 %e print arm SMI operand (bits 0..7,8..19).
3206 %E print the LSB and WIDTH fields of a BFI or BFC instruction.
3207 %V print the 16-bit immediate field of a MOVT or MOVW instruction.
3208 %R print the SPSR/CPSR or banked register of an MRS. */
3210 static const struct opcode32 arm_opcodes
[] =
3212 /* ARM instructions. */
3213 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3214 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
3215 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3216 0xe7f000f0, 0xfff000f0, "udf\t#%e"},
3218 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
| ARM_EXT_V5
),
3219 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
3220 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3221 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
3222 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3223 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3224 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S
),
3225 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
3226 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3227 0x00800090, 0x0fa000f0,
3228 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3229 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3230 0x00a00090, 0x0fa000f0,
3231 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3233 /* V8.2 RAS extension instructions. */
3234 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
3235 0xe320f010, 0xffffffff, "esb"},
3237 /* V8 instructions. */
3238 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3239 0x0320f005, 0x0fffffff, "sevl"},
3240 /* Defined in V8 but is in NOP space so available to all arch. */
3241 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3242 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
3243 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS
),
3244 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
3245 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3246 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
3247 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3248 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
3249 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3250 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
3251 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3252 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
3253 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3254 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
3255 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3256 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
3257 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3258 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
3259 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3260 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
3261 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3262 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
3263 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3264 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
3265 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3266 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
3267 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3268 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
3269 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3270 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
3271 /* CRC32 instructions. */
3272 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3273 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
3274 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3275 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
3276 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3277 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
3278 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3279 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
3280 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3281 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
3282 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3283 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
3285 /* Privileged Access Never extension instructions. */
3286 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
),
3287 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
3289 /* Virtualization Extension instructions. */
3290 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x0160006e, 0x0fffffff, "eret%c"},
3291 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
3293 /* Integer Divide Extension instructions. */
3294 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3295 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
3296 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3297 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
3299 /* MP Extension instructions. */
3300 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf410f000, 0xfc70f000, "pldw\t%a"},
3302 /* Speculation Barriers. */
3303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xe320f014, 0xffffffff, "csdb"},
3304 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff040, 0xffffffff, "ssbb"},
3305 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff044, 0xffffffff, "pssbb"},
3307 /* V7 instructions. */
3308 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf450f000, 0xfd70f000, "pli\t%P"},
3309 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
3310 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
3311 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
3312 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
3313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
3314 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff060, 0xfffffff0, "isb\t%U"},
3315 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
3316 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
3318 /* ARM V6T2 instructions. */
3319 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3320 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
3321 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3322 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
3323 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3324 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3325 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3326 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
3328 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3329 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION
},
3330 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3331 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
3333 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3334 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
3335 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3336 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
3337 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3338 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
3339 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3340 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
3342 /* ARM Security extension instructions. */
3343 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
),
3344 0x01600070, 0x0ff000f0, "smc%c\t%e"},
3346 /* ARM V6K instructions. */
3347 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3348 0xf57ff01f, 0xffffffff, "clrex"},
3349 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3350 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
3351 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3352 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
3353 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3354 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
3355 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3356 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
3357 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3358 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
3359 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3360 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
3362 /* ARMv8.5-A instructions. */
3363 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf57ff070, 0xffffffff, "sb"},
3365 /* ARM V6K NOP hints. */
3366 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3367 0x0320f001, 0x0fffffff, "yield%c"},
3368 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3369 0x0320f002, 0x0fffffff, "wfe%c"},
3370 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3371 0x0320f003, 0x0fffffff, "wfi%c"},
3372 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3373 0x0320f004, 0x0fffffff, "sev%c"},
3374 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3375 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
3377 /* ARM V6 instructions. */
3378 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3379 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
3380 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3381 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
3382 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3383 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
3384 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3385 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
3386 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3387 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
3388 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3389 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
3390 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3391 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
3392 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3393 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
3394 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3395 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
3396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3397 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
3398 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3399 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
3400 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3401 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
3402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3403 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
3404 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3405 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
3406 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3407 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
3408 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3409 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
3410 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3411 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
3412 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3413 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
3414 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3415 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
3416 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3417 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
3418 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3419 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
3420 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3421 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
3422 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3423 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
3424 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3425 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
3426 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3427 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
3428 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3429 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
3430 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3431 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
3432 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3433 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
3434 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3435 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
3436 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3437 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
3438 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3439 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
3440 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3441 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
3442 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3443 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
3444 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3445 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
3446 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3447 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
3448 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3449 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
3450 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3451 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
3452 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3453 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
3454 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3455 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
3456 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3457 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
3458 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3459 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
3460 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3461 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
3462 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3463 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
3464 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3465 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
3466 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3467 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
3468 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3469 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
3470 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3471 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
3472 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3473 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
3474 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3475 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
3476 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3477 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
3478 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3479 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
3480 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3481 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
3482 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3483 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
3484 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3485 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
3486 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3487 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
3488 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3489 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
3490 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3491 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
3492 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3493 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
3494 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3495 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
3496 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3497 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
3498 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3499 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
3500 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3501 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
3502 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3503 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
3504 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3505 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
3506 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3507 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
3508 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3509 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
3510 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3511 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
3512 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3513 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
3514 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3515 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
3516 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3517 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
3518 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3519 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
3520 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3521 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
3522 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3523 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
3524 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3525 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
3526 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3527 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
3528 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3529 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3530 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3531 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3532 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3533 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3534 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3535 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
3536 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3537 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3538 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3539 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3540 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3541 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3543 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
3544 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3545 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3546 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3547 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3548 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3549 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3550 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3551 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
3552 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3553 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3554 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3555 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3556 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3557 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3558 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3559 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
3560 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3561 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3562 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3563 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3564 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3565 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
3566 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3567 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
3568 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3569 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3570 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3571 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3572 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3573 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3574 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3575 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
3576 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3577 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
3578 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3579 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
3580 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3581 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
3582 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3583 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3584 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3585 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3586 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3587 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3588 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3589 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3591 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
3592 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3593 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3594 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3595 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3596 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3597 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
3598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3599 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
3600 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3601 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
3602 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3603 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
3604 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3605 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
3606 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3607 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
3608 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3609 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
3610 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3611 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
3612 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3613 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3614 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3615 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
3616 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3617 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
3618 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3619 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
3620 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3621 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
3623 /* V5J instruction. */
3624 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J
),
3625 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
3627 /* V5 Instructions. */
3628 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3629 0xe1200070, 0xfff000f0,
3630 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
3631 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3632 0xfa000000, 0xfe000000, "blx\t%B"},
3633 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3634 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
3635 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3636 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
3638 /* V5E "El Segundo" Instructions. */
3639 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3640 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
3641 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3642 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
3643 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3644 0xf450f000, 0xfc70f000, "pld\t%a"},
3645 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3646 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3647 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3648 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3649 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3650 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3651 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3652 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
3654 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3655 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3656 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3657 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
3659 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3660 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3662 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3663 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3664 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3665 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3666 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3668 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3669 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
3670 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3671 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
3672 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3673 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
3674 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3675 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
3677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3678 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
3679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3680 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
3682 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3683 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"},
3684 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3685 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
3686 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3687 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"},
3688 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3689 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
3691 /* ARM Instructions. */
3692 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3693 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
3695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3696 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
3697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3698 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
3699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3700 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
3701 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3702 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
3703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3704 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
3705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3706 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
3708 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3709 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
3710 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3711 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
3712 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3713 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
3714 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3715 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
3717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3718 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION
},
3719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3720 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
3721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3722 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION
},
3723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3724 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
3726 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3727 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
3728 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3729 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
3730 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3731 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
3733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3734 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
3735 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3736 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
3737 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3738 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
3740 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3741 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
3742 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3743 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
3744 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3745 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
3747 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3748 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
3749 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3750 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
3751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3752 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
3754 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3755 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
3756 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3757 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
3758 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3759 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
3761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3762 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
3763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3764 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
3765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3766 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
3768 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3769 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
3770 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3771 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
3772 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3773 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
3775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3776 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
3777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3778 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
3779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3780 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
3782 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
),
3783 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
3784 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
3785 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
3786 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
3787 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
3789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3790 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
3791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3792 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
3793 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3794 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
3796 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3797 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
3798 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3799 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
3800 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3801 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
3803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3804 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
3805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3806 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
3807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3808 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
3810 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3811 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
3812 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3813 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
3814 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3815 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
3817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3818 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
3819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3820 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
3821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3822 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
3824 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3825 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
3826 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3827 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
3828 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3829 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
3830 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3831 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
3832 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3833 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
3834 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3835 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
3836 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3837 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
3839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3840 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
3841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3842 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
3843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3844 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
3846 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3847 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
3848 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3849 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
3850 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3851 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
3853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3854 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION
},
3855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3856 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
3858 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3859 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
3861 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3862 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
3863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3864 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
3866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3867 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3868 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3869 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3870 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3871 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3873 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3875 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3876 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3877 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3879 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3881 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3883 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3885 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3887 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3889 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3891 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3892 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3893 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3894 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3895 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3897 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
3898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3899 0x092d0000, 0x0fff0000, "push%c\t%m"},
3900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3901 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
3902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3903 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
3905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3906 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3908 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3910 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3912 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3914 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3915 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3916 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3917 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3918 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3920 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3921 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3922 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3924 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3926 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3928 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3929 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3930 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3932 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3933 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3934 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3935 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3936 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
3937 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3938 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
3939 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3940 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
3941 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3942 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
3944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3945 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
3946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3947 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
3950 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
3951 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION
},
3952 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3953 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
3954 {ARM_FEATURE_CORE_LOW (0),
3955 0x00000000, 0x00000000, 0}
3958 /* print_insn_thumb16 recognizes the following format control codes:
3960 %S print Thumb register (bits 3..5 as high number if bit 6 set)
3961 %D print Thumb register (bits 0..2 as high number if bit 7 set)
3962 %<bitfield>I print bitfield as a signed decimal
3963 (top bit of range being the sign bit)
3964 %N print Thumb register mask (with LR)
3965 %O print Thumb register mask (with PC)
3966 %M print Thumb register mask
3967 %b print CZB's 6-bit unsigned branch destination
3968 %s print Thumb right-shift immediate (6..10; 0 == 32).
3969 %c print the condition code
3970 %C print the condition code, or "s" if not conditional
3971 %x print warning if conditional an not at end of IT block"
3972 %X print "\t; unpredictable <IT:code>" if conditional
3973 %I print IT instruction suffix and operands
3974 %W print Thumb Writeback indicator for LDMIA
3975 %<bitfield>r print bitfield as an ARM register
3976 %<bitfield>d print bitfield as a decimal
3977 %<bitfield>H print (bitfield * 2) as a decimal
3978 %<bitfield>W print (bitfield * 4) as a decimal
3979 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
3980 %<bitfield>B print Thumb branch destination (signed displacement)
3981 %<bitfield>c print bitfield as a condition code
3982 %<bitnum>'c print specified char iff bit is one
3983 %<bitnum>?ab print a if bit is one else print b. */
3985 static const struct opcode16 thumb_opcodes
[] =
3987 /* Thumb instructions. */
3989 /* ARMv8-M Security Extensions instructions. */
3990 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4784, 0xff87, "blxns\t%3-6r"},
3991 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4704, 0xff87, "bxns\t%3-6r"},
3993 /* ARM V8 instructions. */
3994 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xbf50, 0xffff, "sevl%c"},
3995 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xba80, 0xffc0, "hlt\t%0-5x"},
3996 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
), 0xb610, 0xfff7, "setpan\t#%3-3d"},
3998 /* ARM V6K no-argument instructions. */
3999 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xffff, "nop%c"},
4000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf10, 0xffff, "yield%c"},
4001 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf20, 0xffff, "wfe%c"},
4002 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf30, 0xffff, "wfi%c"},
4003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf40, 0xffff, "sev%c"},
4004 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
4006 /* ARM V6T2 instructions. */
4007 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4008 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
4009 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4010 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
4011 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xbf00, 0xff00, "it%I%X"},
4014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
4015 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
4016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
4017 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
4018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
4019 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
4020 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb650, 0xfff7, "setend\t%3?ble%X"},
4021 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
4022 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
4023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
4024 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
4026 /* ARM V5 ISA extends Thumb. */
4027 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4028 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
4029 /* This is BLX(2). BLX(1) is a 32-bit instruction. */
4030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4031 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
4032 /* ARM V4T ISA (Thumb v1). */
4033 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4034 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
4036 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
4037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
4038 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
4039 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
4040 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
4041 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
4042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
4043 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
4044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
4045 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
4046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
4047 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
4048 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
4049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
4050 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
4051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
4053 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
4054 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
4056 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4700, 0xFF80, "bx%c\t%S%x"},
4057 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4400, 0xFF00, "add%c\t%D, %S"},
4058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
4059 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4600, 0xFF00, "mov%c\t%D, %S"},
4061 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB400, 0xFE00, "push%c\t%N"},
4062 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xBC00, 0xFE00, "pop%c\t%O"},
4064 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4065 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
4066 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4067 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
4068 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4069 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
4070 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4071 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
4073 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4074 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
4075 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4076 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
4077 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4078 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
4080 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4081 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4082 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4083 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4085 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
4086 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4087 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
4088 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
4089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
4091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
4092 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
4093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
4094 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
4096 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
4097 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4099 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
4101 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4102 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
4103 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4104 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
4105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4106 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
4107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4108 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
4110 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4111 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
4112 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4113 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
4115 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4116 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
4117 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4118 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
4120 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4121 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
4122 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4123 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
4125 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
4126 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
4128 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
4130 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
4131 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION
},
4132 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
4134 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
4136 /* The E800 .. FFFF range is unconditionally redirected to the
4137 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
4138 are processed via that table. Thus, we can never encounter a
4139 bare "second half of BL/BLX(1)" instruction here. */
4140 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
), 0x0000, 0x0000, UNDEFINED_INSTRUCTION
},
4141 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4144 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
4145 We adopt the convention that hw1 is the high 16 bits of .value and
4146 .mask, hw2 the low 16 bits.
4148 print_insn_thumb32 recognizes the following format control codes:
4152 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
4153 %M print a modified 12-bit immediate (same location)
4154 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
4155 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
4156 %H print a 16-bit immediate from hw2[3:0],hw1[11:0]
4157 %S print a possibly-shifted Rm
4159 %L print address for a ldrd/strd instruction
4160 %a print the address of a plain load/store
4161 %w print the width and signedness of a core load/store
4162 %m print register mask for ldm/stm
4163 %n print register mask for clrm
4165 %E print the lsb and width fields of a bfc/bfi instruction
4166 %F print the lsb and width fields of a sbfx/ubfx instruction
4167 %G print a fallback offset for Branch Future instructions
4168 %W print an offset for BF instruction
4169 %Y print an offset for BFL instruction
4170 %Z print an offset for BFCSEL instruction
4171 %Q print an offset for Low Overhead Loop instructions
4172 %P print an offset for Low Overhead Loop end instructions
4173 %b print a conditional branch offset
4174 %B print an unconditional branch offset
4175 %s print the shift field of an SSAT instruction
4176 %R print the rotation field of an SXT instruction
4177 %U print barrier type.
4178 %P print address for pli instruction.
4179 %c print the condition code
4180 %x print warning if conditional an not at end of IT block"
4181 %X print "\t; unpredictable <IT:code>" if conditional
4183 %<bitfield>d print bitfield in decimal
4184 %<bitfield>D print bitfield plus one in decimal
4185 %<bitfield>W print bitfield*4 in decimal
4186 %<bitfield>r print bitfield as an ARM register
4187 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
4188 %<bitfield>S as %<>r but r13 and r15 is UNPREDICTABLE
4189 %<bitfield>c print bitfield as a condition code
4191 %<bitfield>'c print specified char iff bitfield is all ones
4192 %<bitfield>`c print specified char iff bitfield is all zeroes
4193 %<bitfield>?ab... select from array of values in big endian order
4195 With one exception at the bottom (done because BL and BLX(1) need
4196 to come dead last), this table was machine-sorted first in
4197 decreasing order of number of bits set in the mask, then in
4198 increasing numeric order of mask, then in increasing numeric order
4199 of opcode. This order is not the clearest for a human reader, but
4200 is guaranteed never to catch a special-case bit pattern with a more
4201 general mask, which is important, because this instruction encoding
4202 makes heavy use of special-case bit patterns. */
4203 static const struct opcode32 thumb32_opcodes
[] =
4205 /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
4207 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4208 0xf00fe001, 0xffffffff, "lctp%c"},
4209 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4210 0xf02fc001, 0xfffff001, "le\t%P"},
4211 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4212 0xf00fc001, 0xfffff001, "le\tlr, %P"},
4213 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4214 0xf01fc001, 0xfffff001, "letp\tlr, %P"},
4215 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4216 0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"},
4217 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4218 0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"},
4219 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4220 0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"},
4221 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4222 0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"},
4224 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4225 0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
4226 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4227 0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
4228 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4229 0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
4230 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4231 0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
4232 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4233 0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"},
4235 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4236 0xe89f0000, 0xffff2000, "clrm%c\t%n"},
4238 /* ARMv8-M and ARMv8-M Security Extensions instructions. */
4239 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0xe97fe97f, 0xffffffff, "sg"},
4240 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4241 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
4242 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4243 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
4244 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4245 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
4246 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4247 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
4249 /* ARM V8.2 RAS extension instructions. */
4250 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
4251 0xf3af8010, 0xffffffff, "esb"},
4253 /* V8 instructions. */
4254 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4255 0xf3af8005, 0xffffffff, "sevl%c.w"},
4256 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4257 0xf78f8000, 0xfffffffc, "dcps%0-1d"},
4258 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4259 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
4260 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4261 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
4262 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4263 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
4264 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4265 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
4266 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4267 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
4268 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4269 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
4270 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4271 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
4272 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4273 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
4274 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4275 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
4276 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4277 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
4278 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4279 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
4280 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4281 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
4282 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4283 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
4284 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4285 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
4287 /* CRC32 instructions. */
4288 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4289 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
4290 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4291 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
4292 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4293 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
4294 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4295 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
4296 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4297 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
4298 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4299 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
4301 /* Speculation Barriers. */
4302 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8014, 0xffffffff, "csdb"},
4303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f40, 0xffffffff, "ssbb"},
4304 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f44, 0xffffffff, "pssbb"},
4306 /* V7 instructions. */
4307 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf910f000, 0xff70f000, "pli%c\t%a"},
4308 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
4309 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
4310 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
4311 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
4312 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
4313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
4314 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4315 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
4316 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4317 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
4319 /* Virtualization Extension instructions. */
4320 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
4321 /* We skip ERET as that is SUBS pc, lr, #0. */
4323 /* MP Extension instructions. */
4324 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf830f000, 0xff70f000, "pldw%c\t%a"},
4326 /* Security extension instructions. */
4327 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
), 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
4329 /* ARMv8.5-A instructions. */
4330 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf3bf8f70, 0xffffffff, "sb"},
4332 /* Instructions defined in the basic V6T2 set. */
4333 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8000, 0xffffffff, "nop%c.w"},
4334 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8001, 0xffffffff, "yield%c.w"},
4335 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8002, 0xffffffff, "wfe%c.w"},
4336 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8003, 0xffffffff, "wfi%c.w"},
4337 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8004, 0xffffffff, "sev%c.w"},
4338 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4339 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
4340 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
4342 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4343 0xf3bf8f2f, 0xffffffff, "clrex%c"},
4344 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4345 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
4346 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4347 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
4348 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4349 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
4350 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4351 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
4352 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4353 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
4354 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4355 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
4356 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4357 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
4358 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4359 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
4360 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4361 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
4362 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4363 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
4364 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4365 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
4366 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4367 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
4368 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4369 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
4370 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4371 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
4372 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4373 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
4374 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4375 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
4376 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4377 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
4378 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4379 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
4380 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4381 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
4382 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4383 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
4384 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4385 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
4386 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4387 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
4388 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4389 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
4390 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4391 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
4392 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4393 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
4394 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4395 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
4396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4397 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
4398 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4399 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
4400 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4401 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
4402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4403 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
4404 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4405 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
4406 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4407 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
4408 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4409 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
4410 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4411 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
4412 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4413 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
4414 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4415 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
4416 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4417 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
4418 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4419 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
4420 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4421 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
4422 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4423 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
4424 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4425 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
4426 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4427 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
4428 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4429 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
4430 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4431 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
4432 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4433 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
4434 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4435 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
4436 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4437 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
4438 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4439 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
4440 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4441 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
4442 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4443 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
4444 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4445 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
4446 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4447 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
4448 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4449 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
4450 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4451 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
4452 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4453 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
4454 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4455 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
4456 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4457 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
4458 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4459 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
4460 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4461 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
4462 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4463 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
4464 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4465 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
4466 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4467 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
4468 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4469 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
4470 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4471 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
4472 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4473 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
4474 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4475 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
4476 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4477 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
4478 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4479 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
4480 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4481 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
4482 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4483 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
4484 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4485 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
4486 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4487 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
4488 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4489 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
4490 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4491 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4492 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4493 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4494 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4495 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4496 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4497 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
4498 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4499 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
4500 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4501 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
4502 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4503 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
4504 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4505 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
4506 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4507 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4508 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4509 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
4510 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4511 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
4512 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4513 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4514 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4515 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4516 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4517 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4518 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4519 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4520 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4521 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4522 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4523 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4524 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4525 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4526 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4527 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
4528 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4529 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
4530 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4531 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
4532 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4533 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
4534 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4535 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
4536 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4537 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
4538 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4539 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
4540 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4541 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
4542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4543 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
4544 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4545 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
4546 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4547 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
4548 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4549 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
4550 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4551 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4552 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4553 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4554 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4555 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4556 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4557 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4558 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4559 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4560 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4561 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4562 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4563 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4564 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4565 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4566 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4567 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
4568 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4569 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
4570 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4571 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
4572 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4573 0xf810f000, 0xff70f000, "pld%c\t%a"},
4574 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4575 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4576 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4577 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4578 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4579 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4580 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4581 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4582 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4583 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4584 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4585 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4586 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4587 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4588 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4589 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
4590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4591 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
4592 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4593 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
4594 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4595 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
4596 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4597 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
4598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4599 0xfb100000, 0xfff000c0,
4600 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4601 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4602 0xfbc00080, 0xfff000c0,
4603 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
4604 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4605 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
4606 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4607 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
4608 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4609 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
4610 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4611 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
4612 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4613 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
4614 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4615 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
4616 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4617 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
4618 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4619 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
4620 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4621 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
4622 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4623 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
4624 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4625 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
4626 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4627 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
4628 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4629 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
4630 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4631 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
4632 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4633 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
4634 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4635 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
4636 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4637 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
4638 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4639 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
4640 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4641 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
4642 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4643 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
4644 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4645 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
4646 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4647 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
4648 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4649 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
4650 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4651 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
4652 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4653 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
4654 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4655 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
4656 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4657 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
4658 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4659 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
4660 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4661 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
4662 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4663 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
4664 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4665 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
4666 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4667 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
4668 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4669 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
4670 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4671 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
4672 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4673 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
4674 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4675 0xe9400000, 0xff500000,
4676 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4678 0xe9500000, 0xff500000,
4679 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4680 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4681 0xe8600000, 0xff700000,
4682 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4684 0xe8700000, 0xff700000,
4685 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4686 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4687 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
4688 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4689 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
4691 /* Filter out Bcc with cond=E or F, which are used for other instructions. */
4692 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4693 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
4694 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4695 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
4696 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4697 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
4698 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4699 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
4701 /* These have been 32-bit since the invention of Thumb. */
4702 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4703 0xf000c000, 0xf800d001, "blx%c\t%B%x"},
4704 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4705 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
4708 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4709 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
4710 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4713 static const char *const arm_conditional
[] =
4714 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
4715 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
4717 static const char *const arm_fp_const
[] =
4718 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
4720 static const char *const arm_shift
[] =
4721 {"lsl", "lsr", "asr", "ror"};
4726 const char *description
;
4727 const char *reg_names
[16];
4731 static const arm_regname regnames
[] =
4733 { "reg-names-raw", N_("Select raw register names"),
4734 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
4735 { "reg-names-gcc", N_("Select register names used by GCC"),
4736 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
4737 { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
4738 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
4739 { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL
} },
4740 { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL
} },
4741 { "reg-names-apcs", N_("Select register names used in the APCS"),
4742 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
4743 { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
4744 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
4745 { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
4746 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }}
4749 static const char *const iwmmxt_wwnames
[] =
4750 {"b", "h", "w", "d"};
4752 static const char *const iwmmxt_wwssnames
[] =
4753 {"b", "bus", "bc", "bss",
4754 "h", "hus", "hc", "hss",
4755 "w", "wus", "wc", "wss",
4756 "d", "dus", "dc", "dss"
4759 static const char *const iwmmxt_regnames
[] =
4760 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
4761 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
4764 static const char *const iwmmxt_cregnames
[] =
4765 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
4766 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
4769 static const char *const vec_condnames
[] =
4770 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
4773 static const char *const mve_predicatenames
[] =
4774 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
4775 "eee", "ee", "eet", "e", "ett", "et", "ete"
4778 /* Names for 2-bit size field for mve vector isntructions. */
4779 static const char *const mve_vec_sizename
[] =
4780 { "8", "16", "32", "64"};
4782 /* Indicates whether we are processing a then predicate,
4783 else predicate or none at all. */
4791 /* Information used to process a vpt block and subsequent instructions. */
4794 /* Are we in a vpt block. */
4795 bfd_boolean in_vpt_block
;
4797 /* Next predicate state if in vpt block. */
4798 enum vpt_pred_state next_pred_state
;
4800 /* Mask from vpt/vpst instruction. */
4801 long predicate_mask
;
4803 /* Instruction number in vpt block. */
4804 long current_insn_num
;
4806 /* Number of instructions in vpt block.. */
4810 static struct vpt_block vpt_block_state
=
4819 /* Default to GCC register name set. */
4820 static unsigned int regname_selected
= 1;
4822 #define NUM_ARM_OPTIONS ARRAY_SIZE (regnames)
4823 #define arm_regnames regnames[regname_selected].reg_names
4825 static bfd_boolean force_thumb
= FALSE
;
4827 /* Current IT instruction state. This contains the same state as the IT
4828 bits in the CPSR. */
4829 static unsigned int ifthen_state
;
4830 /* IT state for the next instruction. */
4831 static unsigned int ifthen_next_state
;
4832 /* The address of the insn for which the IT state is valid. */
4833 static bfd_vma ifthen_address
;
4834 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
4835 /* Indicates that the current Conditional state is unconditional or outside
4837 #define COND_UNCOND 16
4841 /* Extract the predicate mask for a VPT or VPST instruction.
4842 The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh). */
4845 mve_extract_pred_mask (long given
)
4847 return ((given
& 0x00400000) >> 19) | ((given
& 0xe000) >> 13);
4850 /* Return the number of instructions in a MVE predicate block. */
4852 num_instructions_vpt_block (long given
)
4854 long mask
= mve_extract_pred_mask (given
);
4861 if ((mask
& 7) == 4)
4864 if ((mask
& 3) == 2)
4867 if ((mask
& 1) == 1)
4874 mark_outside_vpt_block (void)
4876 vpt_block_state
.in_vpt_block
= FALSE
;
4877 vpt_block_state
.next_pred_state
= PRED_NONE
;
4878 vpt_block_state
.predicate_mask
= 0;
4879 vpt_block_state
.current_insn_num
= 0;
4880 vpt_block_state
.num_pred_insn
= 0;
4884 mark_inside_vpt_block (long given
)
4886 vpt_block_state
.in_vpt_block
= TRUE
;
4887 vpt_block_state
.next_pred_state
= PRED_THEN
;
4888 vpt_block_state
.predicate_mask
= mve_extract_pred_mask (given
);
4889 vpt_block_state
.current_insn_num
= 0;
4890 vpt_block_state
.num_pred_insn
= num_instructions_vpt_block (given
);
4891 assert (vpt_block_state
.num_pred_insn
>= 1);
4894 static enum vpt_pred_state
4895 invert_next_predicate_state (enum vpt_pred_state astate
)
4897 if (astate
== PRED_THEN
)
4899 else if (astate
== PRED_ELSE
)
4905 static enum vpt_pred_state
4906 update_next_predicate_state (void)
4908 long pred_mask
= vpt_block_state
.predicate_mask
;
4909 long mask_for_insn
= 0;
4911 switch (vpt_block_state
.current_insn_num
)
4929 if (pred_mask
& mask_for_insn
)
4930 return invert_next_predicate_state (vpt_block_state
.next_pred_state
);
4932 return vpt_block_state
.next_pred_state
;
4936 update_vpt_block_state (void)
4938 vpt_block_state
.current_insn_num
++;
4939 if (vpt_block_state
.current_insn_num
== vpt_block_state
.num_pred_insn
)
4941 /* No more instructions to process in vpt block. */
4942 mark_outside_vpt_block ();
4946 vpt_block_state
.next_pred_state
= update_next_predicate_state ();
4949 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
4950 Returns pointer to following character of the format string and
4951 fills in *VALUEP and *WIDTHP with the extracted value and number of
4952 bits extracted. WIDTHP can be NULL. */
4955 arm_decode_bitfield (const char *ptr
,
4957 unsigned long *valuep
,
4960 unsigned long value
= 0;
4968 for (start
= 0; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
4969 start
= start
* 10 + *ptr
- '0';
4971 for (end
= 0, ptr
++; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
4972 end
= end
* 10 + *ptr
- '0';
4978 value
|= ((insn
>> start
) & ((2ul << bits
) - 1)) << width
;
4981 while (*ptr
++ == ',');
4989 arm_decode_shift (long given
, fprintf_ftype func
, void *stream
,
4990 bfd_boolean print_shift
)
4992 func (stream
, "%s", arm_regnames
[given
& 0xf]);
4994 if ((given
& 0xff0) != 0)
4996 if ((given
& 0x10) == 0)
4998 int amount
= (given
& 0xf80) >> 7;
4999 int shift
= (given
& 0x60) >> 5;
5005 func (stream
, ", rrx");
5013 func (stream
, ", %s #%d", arm_shift
[shift
], amount
);
5015 func (stream
, ", #%d", amount
);
5017 else if ((given
& 0x80) == 0x80)
5018 func (stream
, "\t; <illegal shifter operand>");
5019 else if (print_shift
)
5020 func (stream
, ", %s %s", arm_shift
[(given
& 0x60) >> 5],
5021 arm_regnames
[(given
& 0xf00) >> 8]);
5023 func (stream
, ", %s", arm_regnames
[(given
& 0xf00) >> 8]);
5027 /* Return TRUE if the MATCHED_INSN can be inside an IT block. */
5030 is_mve_okay_in_it (enum mve_instructions matched_insn
)
5032 switch (matched_insn
)
5034 case MVE_VMOV_GP_TO_VEC_LANE
:
5035 case MVE_VMOV2_VEC_LANE_TO_GP
:
5036 case MVE_VMOV2_GP_TO_VEC_LANE
:
5037 case MVE_VMOV_VEC_LANE_TO_GP
:
5045 is_mve_architecture (struct disassemble_info
*info
)
5047 struct arm_private_data
*private_data
= info
->private_data
;
5048 arm_feature_set allowed_arches
= private_data
->features
;
5050 arm_feature_set arm_ext_v8_1m_main
5051 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
5053 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
5054 && !ARM_CPU_IS_ANY (allowed_arches
))
5061 is_vpt_instruction (long given
)
5064 /* If mkh:mkl is '0000' then its not a vpt/vpst instruction. */
5065 if ((given
& 0x0040e000) == 0)
5068 /* VPT floating point T1 variant. */
5069 if (((given
& 0xefb10f50) == 0xee310f00 && ((given
& 0x1001) != 0x1))
5070 /* VPT floating point T2 variant. */
5071 || ((given
& 0xefb10f50) == 0xee310f40)
5072 /* VPT vector T1 variant. */
5073 || ((given
& 0xff811f51) == 0xfe010f00)
5074 /* VPT vector T2 variant. */
5075 || ((given
& 0xff811f51) == 0xfe010f01
5076 && ((given
& 0x300000) != 0x300000))
5077 /* VPT vector T3 variant. */
5078 || ((given
& 0xff811f50) == 0xfe011f00)
5079 /* VPT vector T4 variant. */
5080 || ((given
& 0xff811f70) == 0xfe010f40)
5081 /* VPT vector T5 variant. */
5082 || ((given
& 0xff811f70) == 0xfe010f60)
5083 /* VPT vector T6 variant. */
5084 || ((given
& 0xff811f50) == 0xfe011f40)
5085 /* VPST vector T variant. */
5086 || ((given
& 0xffbf1fff) == 0xfe310f4d))
5092 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
5093 and ending bitfield = END. END must be greater than START. */
5095 static unsigned long
5096 arm_decode_field (unsigned long given
, unsigned int start
, unsigned int end
)
5098 int bits
= end
- start
;
5103 return ((given
>> start
) & ((2ul << bits
) - 1));
5106 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
5107 START:END and START2:END2. END/END2 must be greater than
5110 static unsigned long
5111 arm_decode_field_multiple (unsigned long given
, unsigned int start
,
5112 unsigned int end
, unsigned int start2
,
5115 int bits
= end
- start
;
5116 int bits2
= end2
- start2
;
5117 unsigned long value
= 0;
5123 value
= arm_decode_field (given
, start
, end
);
5126 value
|= ((given
>> start2
) & ((2ul << bits2
) - 1)) << width
;
5130 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
5131 This helps us decode instructions that change mnemonic depending on specific
5132 operand values/encodings. */
5135 is_mve_encoding_conflict (unsigned long given
,
5136 enum mve_instructions matched_insn
)
5138 switch (matched_insn
)
5141 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5147 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5149 if ((arm_decode_field (given
, 12, 12) == 0)
5150 && (arm_decode_field (given
, 0, 0) == 1))
5155 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5157 if (arm_decode_field (given
, 0, 3) == 0xd)
5161 case MVE_VPT_VEC_T1
:
5162 case MVE_VPT_VEC_T2
:
5163 case MVE_VPT_VEC_T3
:
5164 case MVE_VPT_VEC_T4
:
5165 case MVE_VPT_VEC_T5
:
5166 case MVE_VPT_VEC_T6
:
5167 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5169 if (arm_decode_field (given
, 20, 21) == 3)
5173 case MVE_VCMP_FP_T1
:
5174 if ((arm_decode_field (given
, 12, 12) == 0)
5175 && (arm_decode_field (given
, 0, 0) == 1))
5180 case MVE_VCMP_FP_T2
:
5181 if (arm_decode_field (given
, 0, 3) == 0xd)
5190 case MVE_VADD_VEC_T2
:
5191 case MVE_VSUB_VEC_T2
:
5208 case MVE_VQDMULH_T3
:
5209 case MVE_VQRDMULH_T4
:
5215 case MVE_VCMP_VEC_T1
:
5216 case MVE_VCMP_VEC_T2
:
5217 case MVE_VCMP_VEC_T3
:
5218 case MVE_VCMP_VEC_T4
:
5219 case MVE_VCMP_VEC_T5
:
5220 case MVE_VCMP_VEC_T6
:
5221 if (arm_decode_field (given
, 20, 21) == 3)
5230 if (arm_decode_field (given
, 7, 8) == 3)
5237 if ((arm_decode_field (given
, 24, 24) == 0)
5238 && (arm_decode_field (given
, 21, 21) == 0))
5242 else if ((arm_decode_field (given
, 7, 8) == 3))
5250 if ((arm_decode_field (given
, 24, 24) == 0)
5251 && (arm_decode_field (given
, 21, 21) == 0))
5258 case MVE_VCVT_FP_FIX_VEC
:
5259 return (arm_decode_field (given
, 16, 21) & 0x38) == 0;
5264 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5266 if ((cmode
& 1) == 0)
5268 else if ((cmode
& 0xc) == 0xc)
5276 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5278 if ((cmode
& 9) == 1)
5280 else if ((cmode
& 5) == 1)
5282 else if ((cmode
& 0xe) == 0xe)
5288 case MVE_VMOV_IMM_TO_VEC
:
5289 if ((arm_decode_field (given
, 5, 5) == 1)
5290 && (arm_decode_field (given
, 8, 11) != 0xe))
5297 unsigned long size
= arm_decode_field (given
, 19, 20);
5298 if ((size
== 0) || (size
== 3))
5319 if (arm_decode_field (given
, 18, 19) == 3)
5325 case MVE_VRMLSLDAVH
:
5328 if (arm_decode_field (given
, 20, 22) == 7)
5333 case MVE_VRMLALDAVH
:
5334 if ((arm_decode_field (given
, 20, 22) & 6) == 6)
5341 if ((arm_decode_field (given
, 20, 21) == 3)
5342 || (arm_decode_field (given
, 1, 3) == 7))
5349 if (arm_decode_field (given
, 16, 18) == 0)
5351 unsigned long sz
= arm_decode_field (given
, 19, 20);
5353 if ((sz
== 1) || (sz
== 2))
5368 if (arm_decode_field (given
, 19, 21) == 0)
5374 if (arm_decode_field (given
, 16, 19) == 0xf)
5380 case MVE_VADD_FP_T1
:
5381 case MVE_VADD_FP_T2
:
5382 case MVE_VADD_VEC_T1
:
5389 print_mve_vld_str_addr (struct disassemble_info
*info
,
5390 unsigned long given
,
5391 enum mve_instructions matched_insn
)
5393 void *stream
= info
->stream
;
5394 fprintf_ftype func
= info
->fprintf_func
;
5396 unsigned long p
, w
, gpr
, imm
, add
, mod_imm
;
5398 imm
= arm_decode_field (given
, 0, 6);
5401 switch (matched_insn
)
5405 gpr
= arm_decode_field (given
, 16, 18);
5410 gpr
= arm_decode_field (given
, 16, 18);
5416 gpr
= arm_decode_field (given
, 16, 19);
5422 gpr
= arm_decode_field (given
, 16, 19);
5428 gpr
= arm_decode_field (given
, 16, 19);
5435 p
= arm_decode_field (given
, 24, 24);
5436 w
= arm_decode_field (given
, 21, 21);
5438 add
= arm_decode_field (given
, 23, 23);
5442 /* Don't print anything for '+' as it is implied. */
5452 func (stream
, "[%s, #%s%lu]", arm_regnames
[gpr
], add_sub
, mod_imm
);
5453 /* Pre-indexed mode. */
5455 func (stream
, "[%s, #%s%lu]!", arm_regnames
[gpr
], add_sub
, mod_imm
);
5457 else if ((p
== 0) && (w
== 1))
5458 /* Post-index mode. */
5459 func (stream
, "[%s], #%s%lu", arm_regnames
[gpr
], add_sub
, mod_imm
);
5462 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
5463 Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
5464 this encoding is undefined. */
5467 is_mve_undefined (unsigned long given
, enum mve_instructions matched_insn
,
5468 enum mve_undefined
*undefined_code
)
5470 *undefined_code
= UNDEF_NONE
;
5472 switch (matched_insn
)
5475 if (arm_decode_field_multiple (given
, 5, 5, 22, 22) == 3)
5477 *undefined_code
= UNDEF_SIZE_3
;
5484 case MVE_VADD_VEC_T1
:
5485 case MVE_VSUB_VEC_T1
:
5486 case MVE_VQDMULH_T1
:
5487 case MVE_VQRDMULH_T2
:
5491 if (arm_decode_field (given
, 20, 21) == 3)
5493 *undefined_code
= UNDEF_SIZE_3
;
5500 if (arm_decode_field (given
, 7, 8) == 3)
5502 *undefined_code
= UNDEF_SIZE_3
;
5509 if (arm_decode_field (given
, 7, 8) <= 1)
5511 *undefined_code
= UNDEF_SIZE_LE_1
;
5518 if ((arm_decode_field (given
, 7, 8) == 0))
5520 *undefined_code
= UNDEF_SIZE_0
;
5527 if ((arm_decode_field (given
, 7, 8) <= 1))
5529 *undefined_code
= UNDEF_SIZE_LE_1
;
5535 case MVE_VLDRB_GATHER_T1
:
5536 if (arm_decode_field (given
, 7, 8) == 3)
5538 *undefined_code
= UNDEF_SIZE_3
;
5541 else if ((arm_decode_field (given
, 28, 28) == 0)
5542 && (arm_decode_field (given
, 7, 8) == 0))
5544 *undefined_code
= UNDEF_NOT_UNS_SIZE_0
;
5550 case MVE_VLDRH_GATHER_T2
:
5551 if (arm_decode_field (given
, 7, 8) == 3)
5553 *undefined_code
= UNDEF_SIZE_3
;
5556 else if ((arm_decode_field (given
, 28, 28) == 0)
5557 && (arm_decode_field (given
, 7, 8) == 1))
5559 *undefined_code
= UNDEF_NOT_UNS_SIZE_1
;
5562 else if (arm_decode_field (given
, 7, 8) == 0)
5564 *undefined_code
= UNDEF_SIZE_0
;
5570 case MVE_VLDRW_GATHER_T3
:
5571 if (arm_decode_field (given
, 7, 8) != 2)
5573 *undefined_code
= UNDEF_SIZE_NOT_2
;
5576 else if (arm_decode_field (given
, 28, 28) == 0)
5578 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5584 case MVE_VLDRD_GATHER_T4
:
5585 if (arm_decode_field (given
, 7, 8) != 3)
5587 *undefined_code
= UNDEF_SIZE_NOT_3
;
5590 else if (arm_decode_field (given
, 28, 28) == 0)
5592 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5598 case MVE_VSTRB_SCATTER_T1
:
5599 if (arm_decode_field (given
, 7, 8) == 3)
5601 *undefined_code
= UNDEF_SIZE_3
;
5607 case MVE_VSTRH_SCATTER_T2
:
5609 unsigned long size
= arm_decode_field (given
, 7, 8);
5612 *undefined_code
= UNDEF_SIZE_3
;
5617 *undefined_code
= UNDEF_SIZE_0
;
5624 case MVE_VSTRW_SCATTER_T3
:
5625 if (arm_decode_field (given
, 7, 8) != 2)
5627 *undefined_code
= UNDEF_SIZE_NOT_2
;
5633 case MVE_VSTRD_SCATTER_T4
:
5634 if (arm_decode_field (given
, 7, 8) != 3)
5636 *undefined_code
= UNDEF_SIZE_NOT_3
;
5642 case MVE_VCVT_FP_FIX_VEC
:
5644 unsigned long imm6
= arm_decode_field (given
, 16, 21);
5645 if ((imm6
& 0x20) == 0)
5647 *undefined_code
= UNDEF_VCVT_IMM6
;
5651 if ((arm_decode_field (given
, 9, 9) == 0)
5652 && ((imm6
& 0x30) == 0x20))
5654 *undefined_code
= UNDEF_VCVT_FSI_IMM6
;
5662 case MVE_VCVT_BETWEEN_FP_INT
:
5663 case MVE_VCVT_FROM_FP_TO_INT
:
5665 unsigned long size
= arm_decode_field (given
, 18, 19);
5668 *undefined_code
= UNDEF_SIZE_0
;
5673 *undefined_code
= UNDEF_SIZE_3
;
5680 case MVE_VMOV_VEC_LANE_TO_GP
:
5682 unsigned long op1
= arm_decode_field (given
, 21, 22);
5683 unsigned long op2
= arm_decode_field (given
, 5, 6);
5684 unsigned long u
= arm_decode_field (given
, 23, 23);
5686 if ((op2
== 0) && (u
== 1))
5688 if ((op1
== 0) || (op1
== 1))
5690 *undefined_code
= UNDEF_BAD_U_OP1_OP2
;
5698 if ((op1
== 0) || (op1
== 1))
5700 *undefined_code
= UNDEF_BAD_OP1_OP2
;
5710 case MVE_VMOV_GP_TO_VEC_LANE
:
5711 if (arm_decode_field (given
, 5, 6) == 2)
5713 unsigned long op1
= arm_decode_field (given
, 21, 22);
5714 if ((op1
== 0) || (op1
== 1))
5716 *undefined_code
= UNDEF_BAD_OP1_OP2
;
5725 case MVE_VMOV_IMM_TO_VEC
:
5726 if (arm_decode_field (given
, 5, 5) == 0)
5728 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5730 if (((cmode
& 9) == 1) || ((cmode
& 5) == 1))
5732 *undefined_code
= UNDEF_OP_0_BAD_CMODE
;
5743 if (arm_decode_field (given
, 18, 19) == 2)
5745 *undefined_code
= UNDEF_SIZE_2
;
5751 case MVE_VRMLALDAVH
:
5752 case MVE_VMLADAV_T1
:
5753 case MVE_VMLADAV_T2
:
5755 if ((arm_decode_field (given
, 28, 28) == 1)
5756 && (arm_decode_field (given
, 12, 12) == 1))
5758 *undefined_code
= UNDEF_XCHG_UNS
;
5769 unsigned long sz
= arm_decode_field (given
, 19, 20);
5772 else if ((sz
& 2) == 2)
5776 *undefined_code
= UNDEF_SIZE
;
5790 unsigned long sz
= arm_decode_field (given
, 19, 21);
5793 else if ((sz
& 6) == 2)
5795 else if ((sz
& 4) == 4)
5799 *undefined_code
= UNDEF_SIZE
;
5806 if (arm_decode_field (given
, 19, 20) == 0)
5808 *undefined_code
= UNDEF_SIZE_0
;
5815 if (arm_decode_field (given
, 18, 19) == 3)
5817 *undefined_code
= UNDEF_SIZE_3
;
5825 if (arm_decode_field (given
, 18, 19) == 3)
5827 *undefined_code
= UNDEF_SIZE_3
;
5838 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
5839 Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
5840 why this encoding is unpredictable. */
5843 is_mve_unpredictable (unsigned long given
, enum mve_instructions matched_insn
,
5844 enum mve_unpredictable
*unpredictable_code
)
5846 *unpredictable_code
= UNPRED_NONE
;
5848 switch (matched_insn
)
5850 case MVE_VCMP_FP_T2
:
5852 if ((arm_decode_field (given
, 12, 12) == 0)
5853 && (arm_decode_field (given
, 5, 5) == 1))
5855 *unpredictable_code
= UNPRED_FCA_0_FCB_1
;
5861 case MVE_VPT_VEC_T4
:
5862 case MVE_VPT_VEC_T5
:
5863 case MVE_VPT_VEC_T6
:
5864 case MVE_VCMP_VEC_T4
:
5865 case MVE_VCMP_VEC_T5
:
5866 case MVE_VCMP_VEC_T6
:
5867 if (arm_decode_field (given
, 0, 3) == 0xd)
5869 *unpredictable_code
= UNPRED_R13
;
5877 unsigned long gpr
= arm_decode_field (given
, 12, 15);
5880 *unpredictable_code
= UNPRED_R13
;
5883 else if (gpr
== 0xf)
5885 *unpredictable_code
= UNPRED_R15
;
5894 case MVE_VADD_FP_T2
:
5895 case MVE_VSUB_FP_T2
:
5896 case MVE_VADD_VEC_T2
:
5897 case MVE_VSUB_VEC_T2
:
5907 case MVE_VQDMULH_T3
:
5908 case MVE_VQRDMULH_T4
:
5910 case MVE_VFMA_FP_SCALAR
:
5911 case MVE_VFMAS_FP_SCALAR
:
5915 unsigned long gpr
= arm_decode_field (given
, 0, 3);
5918 *unpredictable_code
= UNPRED_R13
;
5921 else if (gpr
== 0xf)
5923 *unpredictable_code
= UNPRED_R15
;
5933 unsigned long rn
= arm_decode_field (given
, 16, 19);
5935 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
5937 *unpredictable_code
= UNPRED_R13_AND_WB
;
5943 *unpredictable_code
= UNPRED_R15
;
5947 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 6)
5949 *unpredictable_code
= UNPRED_Q_GT_6
;
5959 unsigned long rn
= arm_decode_field (given
, 16, 19);
5961 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
5963 *unpredictable_code
= UNPRED_R13_AND_WB
;
5969 *unpredictable_code
= UNPRED_R15
;
5973 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 4)
5975 *unpredictable_code
= UNPRED_Q_GT_4
;
5989 unsigned long rn
= arm_decode_field (given
, 16, 19);
5991 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
5993 *unpredictable_code
= UNPRED_R13_AND_WB
;
5998 *unpredictable_code
= UNPRED_R15
;
6005 case MVE_VLDRB_GATHER_T1
:
6006 if (arm_decode_field (given
, 0, 0) == 1)
6008 *unpredictable_code
= UNPRED_OS
;
6013 /* To handle common code with T2-T4 variants. */
6014 case MVE_VLDRH_GATHER_T2
:
6015 case MVE_VLDRW_GATHER_T3
:
6016 case MVE_VLDRD_GATHER_T4
:
6018 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6019 unsigned long qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6023 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6027 if (arm_decode_field (given
, 16, 19) == 0xf)
6029 *unpredictable_code
= UNPRED_R15
;
6036 case MVE_VLDRW_GATHER_T5
:
6037 case MVE_VLDRD_GATHER_T6
:
6039 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6040 unsigned long qm
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6044 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6051 case MVE_VSTRB_SCATTER_T1
:
6052 if (arm_decode_field (given
, 16, 19) == 0xf)
6054 *unpredictable_code
= UNPRED_R15
;
6057 else if (arm_decode_field (given
, 0, 0) == 1)
6059 *unpredictable_code
= UNPRED_OS
;
6065 case MVE_VSTRH_SCATTER_T2
:
6066 case MVE_VSTRW_SCATTER_T3
:
6067 case MVE_VSTRD_SCATTER_T4
:
6068 if (arm_decode_field (given
, 16, 19) == 0xf)
6070 *unpredictable_code
= UNPRED_R15
;
6076 case MVE_VMOV2_VEC_LANE_TO_GP
:
6077 case MVE_VMOV2_GP_TO_VEC_LANE
:
6078 case MVE_VCVT_BETWEEN_FP_INT
:
6079 case MVE_VCVT_FROM_FP_TO_INT
:
6081 unsigned long rt
= arm_decode_field (given
, 0, 3);
6082 unsigned long rt2
= arm_decode_field (given
, 16, 19);
6084 if ((rt
== 0xd) || (rt2
== 0xd))
6086 *unpredictable_code
= UNPRED_R13
;
6089 else if ((rt
== 0xf) || (rt2
== 0xf))
6091 *unpredictable_code
= UNPRED_R15
;
6096 *unpredictable_code
= UNPRED_GP_REGS_EQUAL
;
6105 case MVE_VMAXNMV_FP
:
6106 case MVE_VMAXNMAV_FP
:
6107 case MVE_VMINNMV_FP
:
6108 case MVE_VMINNMAV_FP
:
6112 case MVE_VMOV_HFP_TO_GP
:
6113 case MVE_VMOV_GP_TO_VEC_LANE
:
6114 case MVE_VMOV_VEC_LANE_TO_GP
:
6116 unsigned long rda
= arm_decode_field (given
, 12, 15);
6119 *unpredictable_code
= UNPRED_R13
;
6122 else if (rda
== 0xf)
6124 *unpredictable_code
= UNPRED_R15
;
6141 if (arm_decode_field (given
, 20, 21) == 2)
6143 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6144 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6145 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6147 if ((Qd
== Qn
) || (Qd
== Qm
))
6149 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6160 case MVE_VQDMULL_T1
:
6166 if (arm_decode_field (given
, 28, 28) == 1)
6168 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6169 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6170 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6172 if ((Qd
== Qn
) || (Qd
== Qm
))
6174 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6184 case MVE_VQDMULL_T2
:
6186 unsigned long gpr
= arm_decode_field (given
, 0, 3);
6189 *unpredictable_code
= UNPRED_R13
;
6192 else if (gpr
== 0xf)
6194 *unpredictable_code
= UNPRED_R15
;
6198 if (arm_decode_field (given
, 28, 28) == 1)
6201 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
6202 unsigned long Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6206 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6217 case MVE_VRMLSLDAVH
:
6220 if (arm_decode_field (given
, 20, 22) == 6)
6222 *unpredictable_code
= UNPRED_R13
;
6230 if (arm_decode_field (given
, 1, 3) == 6)
6232 *unpredictable_code
= UNPRED_R13
;
6241 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6242 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6243 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 21) == 2)
6245 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6254 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6255 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6256 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 20) == 1)
6258 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6271 if (arm_decode_field (given
, 20, 20) == 1)
6273 Qda
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6274 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6275 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6277 if ((Qda
== Qn
) || (Qda
== Qm
))
6279 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6291 if (arm_decode_field (given
, 16, 19) == 0xd)
6293 *unpredictable_code
= UNPRED_R13
;
6305 print_mve_vmov_index (struct disassemble_info
*info
, unsigned long given
)
6307 unsigned long op1
= arm_decode_field (given
, 21, 22);
6308 unsigned long op2
= arm_decode_field (given
, 5, 6);
6309 unsigned long h
= arm_decode_field (given
, 16, 16);
6310 unsigned long index
, esize
, targetBeat
, idx
;
6311 void *stream
= info
->stream
;
6312 fprintf_ftype func
= info
->fprintf_func
;
6314 if ((op1
& 0x2) == 0x2)
6319 else if (((op1
& 0x2) == 0x0) && ((op2
& 0x1) == 0x1))
6324 else if (((op1
& 0x2) == 0) && ((op2
& 0x3) == 0))
6331 func (stream
, "<undefined index>");
6335 targetBeat
= (op1
& 0x1) | (h
<< 1);
6336 idx
= index
+ targetBeat
* (32/esize
);
6338 func (stream
, "%lu", idx
);
6341 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
6342 in length and integer of floating-point type. */
6344 print_simd_imm8 (struct disassemble_info
*info
, unsigned long given
,
6345 unsigned int ibit_loc
, const struct mopcode32
*insn
)
6348 int cmode
= (given
>> 8) & 0xf;
6349 int op
= (given
>> 5) & 0x1;
6350 unsigned long value
= 0, hival
= 0;
6354 void *stream
= info
->stream
;
6355 fprintf_ftype func
= info
->fprintf_func
;
6357 /* On Neon the 'i' bit is at bit 24, on mve it is
6359 bits
|= ((given
>> ibit_loc
) & 1) << 7;
6360 bits
|= ((given
>> 16) & 7) << 4;
6361 bits
|= ((given
>> 0) & 15) << 0;
6365 shift
= (cmode
>> 1) & 3;
6366 value
= (unsigned long) bits
<< (8 * shift
);
6369 else if (cmode
< 12)
6371 shift
= (cmode
>> 1) & 1;
6372 value
= (unsigned long) bits
<< (8 * shift
);
6375 else if (cmode
< 14)
6377 shift
= (cmode
& 1) + 1;
6378 value
= (unsigned long) bits
<< (8 * shift
);
6379 value
|= (1ul << (8 * shift
)) - 1;
6382 else if (cmode
== 14)
6386 /* Bit replication into bytes. */
6392 for (ix
= 7; ix
>= 0; ix
--)
6394 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
6396 value
= (value
<< 8) | mask
;
6398 hival
= (hival
<< 8) | mask
;
6404 /* Byte replication. */
6405 value
= (unsigned long) bits
;
6411 /* Floating point encoding. */
6414 value
= (unsigned long) (bits
& 0x7f) << 19;
6415 value
|= (unsigned long) (bits
& 0x80) << 24;
6416 tmp
= bits
& 0x40 ? 0x3c : 0x40;
6417 value
|= (unsigned long) tmp
<< 24;
6423 func (stream
, "<illegal constant %.8x:%x:%x>",
6429 // printU determines whether the immediate value should be printed as
6431 unsigned printU
= 0;
6432 switch (insn
->mve_op
)
6436 // We want this for instructions that don't have a 'signed' type
6440 case MVE_VMOV_IMM_TO_VEC
:
6447 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
6454 : "#%ld\t; 0x%.4lx", value
, value
);
6460 unsigned char valbytes
[4];
6463 /* Do this a byte at a time so we don't have to
6464 worry about the host's endianness. */
6465 valbytes
[0] = value
& 0xff;
6466 valbytes
[1] = (value
>> 8) & 0xff;
6467 valbytes
[2] = (value
>> 16) & 0xff;
6468 valbytes
[3] = (value
>> 24) & 0xff;
6470 floatformat_to_double
6471 (& floatformat_ieee_single_little
, valbytes
,
6474 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
6481 : "#%ld\t; 0x%.8lx",
6482 (long) (((value
& 0x80000000L
) != 0)
6484 ? value
| ~0xffffffffL
: value
),
6489 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
6499 print_mve_undefined (struct disassemble_info
*info
,
6500 enum mve_undefined undefined_code
)
6502 void *stream
= info
->stream
;
6503 fprintf_ftype func
= info
->fprintf_func
;
6505 func (stream
, "\t\tundefined instruction: ");
6507 switch (undefined_code
)
6510 func (stream
, "illegal size");
6514 func (stream
, "size equals zero");
6518 func (stream
, "size equals two");
6522 func (stream
, "size equals three");
6525 case UNDEF_SIZE_LE_1
:
6526 func (stream
, "size <= 1");
6529 case UNDEF_SIZE_NOT_2
:
6530 func (stream
, "size not equal to 2");
6533 case UNDEF_SIZE_NOT_3
:
6534 func (stream
, "size not equal to 3");
6537 case UNDEF_NOT_UNS_SIZE_0
:
6538 func (stream
, "not unsigned and size = zero");
6541 case UNDEF_NOT_UNS_SIZE_1
:
6542 func (stream
, "not unsigned and size = one");
6545 case UNDEF_NOT_UNSIGNED
:
6546 func (stream
, "not unsigned");
6549 case UNDEF_VCVT_IMM6
:
6550 func (stream
, "invalid imm6");
6553 case UNDEF_VCVT_FSI_IMM6
:
6554 func (stream
, "fsi = 0 and invalid imm6");
6557 case UNDEF_BAD_OP1_OP2
:
6558 func (stream
, "bad size with op2 = 2 and op1 = 0 or 1");
6561 case UNDEF_BAD_U_OP1_OP2
:
6562 func (stream
, "unsigned with op2 = 0 and op1 = 0 or 1");
6565 case UNDEF_OP_0_BAD_CMODE
:
6566 func (stream
, "op field equal 0 and bad cmode");
6569 case UNDEF_XCHG_UNS
:
6570 func (stream
, "exchange and unsigned together");
6580 print_mve_unpredictable (struct disassemble_info
*info
,
6581 enum mve_unpredictable unpredict_code
)
6583 void *stream
= info
->stream
;
6584 fprintf_ftype func
= info
->fprintf_func
;
6586 func (stream
, "%s: ", UNPREDICTABLE_INSTRUCTION
);
6588 switch (unpredict_code
)
6590 case UNPRED_IT_BLOCK
:
6591 func (stream
, "mve instruction in it block");
6594 case UNPRED_FCA_0_FCB_1
:
6595 func (stream
, "condition bits, fca = 0 and fcb = 1");
6599 func (stream
, "use of r13 (sp)");
6603 func (stream
, "use of r15 (pc)");
6607 func (stream
, "start register block > r4");
6611 func (stream
, "start register block > r6");
6614 case UNPRED_R13_AND_WB
:
6615 func (stream
, "use of r13 and write back");
6618 case UNPRED_Q_REGS_EQUAL
:
6620 "same vector register used for destination and other operand");
6624 func (stream
, "use of offset scaled");
6627 case UNPRED_GP_REGS_EQUAL
:
6628 func (stream
, "same general-purpose register used for both operands");
6631 case UNPRED_Q_REGS_EQ_AND_SIZE_1
:
6632 func (stream
, "use of identical q registers and size = 1");
6635 case UNPRED_Q_REGS_EQ_AND_SIZE_2
:
6636 func (stream
, "use of identical q registers and size = 1");
6644 /* Print register block operand for mve vld2/vld4/vst2/vld4. */
6647 print_mve_register_blocks (struct disassemble_info
*info
,
6648 unsigned long given
,
6649 enum mve_instructions matched_insn
)
6651 void *stream
= info
->stream
;
6652 fprintf_ftype func
= info
->fprintf_func
;
6654 unsigned long q_reg_start
= arm_decode_field_multiple (given
,
6657 switch (matched_insn
)
6661 if (q_reg_start
<= 6)
6662 func (stream
, "{q%ld, q%ld}", q_reg_start
, q_reg_start
+ 1);
6664 func (stream
, "<illegal reg q%ld>", q_reg_start
);
6669 if (q_reg_start
<= 4)
6670 func (stream
, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start
,
6671 q_reg_start
+ 1, q_reg_start
+ 2,
6674 func (stream
, "<illegal reg q%ld>", q_reg_start
);
6683 print_mve_rounding_mode (struct disassemble_info
*info
,
6684 unsigned long given
,
6685 enum mve_instructions matched_insn
)
6687 void *stream
= info
->stream
;
6688 fprintf_ftype func
= info
->fprintf_func
;
6690 switch (matched_insn
)
6692 case MVE_VCVT_FROM_FP_TO_INT
:
6694 switch (arm_decode_field (given
, 8, 9))
6720 switch (arm_decode_field (given
, 7, 9))
6759 print_mve_vcvt_size (struct disassemble_info
*info
,
6760 unsigned long given
,
6761 enum mve_instructions matched_insn
)
6763 unsigned long mode
= 0;
6764 void *stream
= info
->stream
;
6765 fprintf_ftype func
= info
->fprintf_func
;
6767 switch (matched_insn
)
6769 case MVE_VCVT_FP_FIX_VEC
:
6771 mode
= (((given
& 0x200) >> 7)
6772 | ((given
& 0x10000000) >> 27)
6773 | ((given
& 0x100) >> 8));
6778 func (stream
, "f16.s16");
6782 func (stream
, "s16.f16");
6786 func (stream
, "f16.u16");
6790 func (stream
, "u16.f16");
6794 func (stream
, "f32.s32");
6798 func (stream
, "s32.f32");
6802 func (stream
, "f32.u32");
6806 func (stream
, "u32.f32");
6814 case MVE_VCVT_BETWEEN_FP_INT
:
6816 unsigned long size
= arm_decode_field (given
, 18, 19);
6817 unsigned long op
= arm_decode_field (given
, 7, 8);
6824 func (stream
, "f16.s16");
6828 func (stream
, "f16.u16");
6832 func (stream
, "s16.f16");
6836 func (stream
, "u16.f16");
6848 func (stream
, "f32.s32");
6852 func (stream
, "f32.u32");
6856 func (stream
, "s32.f32");
6860 func (stream
, "u32.f32");
6867 case MVE_VCVT_FP_HALF_FP
:
6869 unsigned long op
= arm_decode_field (given
, 28, 28);
6871 func (stream
, "f16.f32");
6873 func (stream
, "f32.f16");
6877 case MVE_VCVT_FROM_FP_TO_INT
:
6879 unsigned long size
= arm_decode_field_multiple (given
, 7, 7, 18, 19);
6884 func (stream
, "s16.f16");
6888 func (stream
, "u16.f16");
6892 func (stream
, "s32.f32");
6896 func (stream
, "u32.f32");
6911 print_mve_rotate (struct disassemble_info
*info
, unsigned long rot
,
6912 unsigned long rot_width
)
6914 void *stream
= info
->stream
;
6915 fprintf_ftype func
= info
->fprintf_func
;
6922 func (stream
, "90");
6925 func (stream
, "270");
6931 else if (rot_width
== 2)
6939 func (stream
, "90");
6942 func (stream
, "180");
6945 func (stream
, "270");
6954 print_instruction_predicate (struct disassemble_info
*info
)
6956 void *stream
= info
->stream
;
6957 fprintf_ftype func
= info
->fprintf_func
;
6959 if (vpt_block_state
.next_pred_state
== PRED_THEN
)
6961 else if (vpt_block_state
.next_pred_state
== PRED_ELSE
)
6966 print_mve_size (struct disassemble_info
*info
,
6968 enum mve_instructions matched_insn
)
6970 void *stream
= info
->stream
;
6971 fprintf_ftype func
= info
->fprintf_func
;
6973 switch (matched_insn
)
6979 case MVE_VADD_VEC_T1
:
6980 case MVE_VADD_VEC_T2
:
6986 case MVE_VCMP_VEC_T1
:
6987 case MVE_VCMP_VEC_T2
:
6988 case MVE_VCMP_VEC_T3
:
6989 case MVE_VCMP_VEC_T4
:
6990 case MVE_VCMP_VEC_T5
:
6991 case MVE_VCMP_VEC_T6
:
7004 case MVE_VLDRB_GATHER_T1
:
7005 case MVE_VLDRH_GATHER_T2
:
7006 case MVE_VLDRW_GATHER_T3
:
7007 case MVE_VLDRD_GATHER_T4
:
7020 case MVE_VPT_VEC_T1
:
7021 case MVE_VPT_VEC_T2
:
7022 case MVE_VPT_VEC_T3
:
7023 case MVE_VPT_VEC_T4
:
7024 case MVE_VPT_VEC_T5
:
7025 case MVE_VPT_VEC_T6
:
7034 case MVE_VQDMULH_T1
:
7035 case MVE_VQRDMULH_T2
:
7036 case MVE_VQDMULH_T3
:
7037 case MVE_VQRDMULH_T4
:
7051 case MVE_VSTRB_SCATTER_T1
:
7052 case MVE_VSTRH_SCATTER_T2
:
7053 case MVE_VSTRW_SCATTER_T3
:
7056 case MVE_VSUB_VEC_T1
:
7057 case MVE_VSUB_VEC_T2
:
7059 func (stream
, "%s", mve_vec_sizename
[size
]);
7061 func (stream
, "<undef size>");
7065 case MVE_VADD_FP_T1
:
7066 case MVE_VADD_FP_T2
:
7067 case MVE_VSUB_FP_T1
:
7068 case MVE_VSUB_FP_T2
:
7069 case MVE_VCMP_FP_T1
:
7070 case MVE_VCMP_FP_T2
:
7071 case MVE_VFMA_FP_SCALAR
:
7074 case MVE_VFMAS_FP_SCALAR
:
7076 case MVE_VMAXNMA_FP
:
7077 case MVE_VMAXNMV_FP
:
7078 case MVE_VMAXNMAV_FP
:
7080 case MVE_VMINNMA_FP
:
7081 case MVE_VMINNMV_FP
:
7082 case MVE_VMINNMAV_FP
:
7086 func (stream
, "32");
7088 func (stream
, "16");
7094 case MVE_VMLADAV_T1
:
7096 case MVE_VMLSDAV_T1
:
7099 case MVE_VQDMULL_T1
:
7100 case MVE_VQDMULL_T2
:
7104 func (stream
, "16");
7106 func (stream
, "32");
7113 func (stream
, "16");
7120 func (stream
, "32");
7123 func (stream
, "16");
7133 case MVE_VMOV_GP_TO_VEC_LANE
:
7134 case MVE_VMOV_VEC_LANE_TO_GP
:
7138 func (stream
, "32");
7143 func (stream
, "16");
7146 case 8: case 9: case 10: case 11:
7147 case 12: case 13: case 14: case 15:
7156 case MVE_VMOV_IMM_TO_VEC
:
7159 case 0: case 4: case 8:
7160 case 12: case 24: case 26:
7161 func (stream
, "i32");
7164 func (stream
, "i16");
7167 func (stream
, "i8");
7170 func (stream
, "i64");
7173 func (stream
, "f32");
7180 case MVE_VMULL_POLY
:
7182 func (stream
, "p8");
7184 func (stream
, "p16");
7190 case 0: case 2: case 4:
7191 case 6: case 12: case 13:
7192 func (stream
, "32");
7196 func (stream
, "16");
7210 func (stream
, "32");
7214 func (stream
, "16");
7232 func (stream
, "16");
7236 func (stream
, "32");
7261 func (stream
, "16");
7264 case 4: case 5: case 6: case 7:
7265 func (stream
, "32");
7280 print_mve_shift_n (struct disassemble_info
*info
, long given
,
7281 enum mve_instructions matched_insn
)
7283 void *stream
= info
->stream
;
7284 fprintf_ftype func
= info
->fprintf_func
;
7287 = matched_insn
== MVE_VQSHL_T2
7288 || matched_insn
== MVE_VQSHLU_T3
7289 || matched_insn
== MVE_VSHL_T1
7290 || matched_insn
== MVE_VSHLL_T1
7291 || matched_insn
== MVE_VSLI
;
7293 unsigned imm6
= (given
& 0x3f0000) >> 16;
7295 if (matched_insn
== MVE_VSHLL_T1
)
7298 unsigned shiftAmount
= 0;
7299 if ((imm6
& 0x20) != 0)
7300 shiftAmount
= startAt0
? imm6
- 32 : 64 - imm6
;
7301 else if ((imm6
& 0x10) != 0)
7302 shiftAmount
= startAt0
? imm6
- 16 : 32 - imm6
;
7303 else if ((imm6
& 0x08) != 0)
7304 shiftAmount
= startAt0
? imm6
- 8 : 16 - imm6
;
7306 print_mve_undefined (info
, UNDEF_SIZE_0
);
7308 func (stream
, "%u", shiftAmount
);
7312 print_vec_condition (struct disassemble_info
*info
, long given
,
7313 enum mve_instructions matched_insn
)
7315 void *stream
= info
->stream
;
7316 fprintf_ftype func
= info
->fprintf_func
;
7319 switch (matched_insn
)
7322 case MVE_VCMP_FP_T1
:
7323 vec_cond
= (((given
& 0x1000) >> 10)
7324 | ((given
& 1) << 1)
7325 | ((given
& 0x0080) >> 7));
7326 func (stream
, "%s",vec_condnames
[vec_cond
]);
7330 case MVE_VCMP_FP_T2
:
7331 vec_cond
= (((given
& 0x1000) >> 10)
7332 | ((given
& 0x0020) >> 4)
7333 | ((given
& 0x0080) >> 7));
7334 func (stream
, "%s",vec_condnames
[vec_cond
]);
7337 case MVE_VPT_VEC_T1
:
7338 case MVE_VCMP_VEC_T1
:
7339 vec_cond
= (given
& 0x0080) >> 7;
7340 func (stream
, "%s",vec_condnames
[vec_cond
]);
7343 case MVE_VPT_VEC_T2
:
7344 case MVE_VCMP_VEC_T2
:
7345 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7346 func (stream
, "%s",vec_condnames
[vec_cond
]);
7349 case MVE_VPT_VEC_T3
:
7350 case MVE_VCMP_VEC_T3
:
7351 vec_cond
= 4 | ((given
& 1) << 1) | ((given
& 0x0080) >> 7);
7352 func (stream
, "%s",vec_condnames
[vec_cond
]);
7355 case MVE_VPT_VEC_T4
:
7356 case MVE_VCMP_VEC_T4
:
7357 vec_cond
= (given
& 0x0080) >> 7;
7358 func (stream
, "%s",vec_condnames
[vec_cond
]);
7361 case MVE_VPT_VEC_T5
:
7362 case MVE_VCMP_VEC_T5
:
7363 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7364 func (stream
, "%s",vec_condnames
[vec_cond
]);
7367 case MVE_VPT_VEC_T6
:
7368 case MVE_VCMP_VEC_T6
:
7369 vec_cond
= 4 | ((given
& 0x0020) >> 4) | ((given
& 0x0080) >> 7);
7370 func (stream
, "%s",vec_condnames
[vec_cond
]);
7385 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
7386 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
7387 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0)
7388 #define PRE_BIT_SET (given & (1 << P_BIT))
7391 /* Print one coprocessor instruction on INFO->STREAM.
7392 Return TRUE if the instuction matched, FALSE if this is not a
7393 recognised coprocessor instruction. */
7396 print_insn_coprocessor (bfd_vma pc
,
7397 struct disassemble_info
*info
,
7401 const struct sopcode32
*insn
;
7402 void *stream
= info
->stream
;
7403 fprintf_ftype func
= info
->fprintf_func
;
7405 unsigned long value
= 0;
7408 struct arm_private_data
*private_data
= info
->private_data
;
7409 arm_feature_set allowed_arches
= ARM_ARCH_NONE
;
7410 arm_feature_set arm_ext_v8_1m_main
=
7411 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
7413 allowed_arches
= private_data
->features
;
7415 for (insn
= coprocessor_opcodes
; insn
->assembler
; insn
++)
7417 unsigned long u_reg
= 16;
7418 bfd_boolean is_unpredictable
= FALSE
;
7419 signed long value_in_comment
= 0;
7422 if (ARM_FEATURE_ZERO (insn
->arch
))
7423 switch (insn
->value
)
7425 case SENTINEL_IWMMXT_START
:
7426 if (info
->mach
!= bfd_mach_arm_XScale
7427 && info
->mach
!= bfd_mach_arm_iWMMXt
7428 && info
->mach
!= bfd_mach_arm_iWMMXt2
)
7431 while ((! ARM_FEATURE_ZERO (insn
->arch
))
7432 && insn
->value
!= SENTINEL_IWMMXT_END
);
7435 case SENTINEL_IWMMXT_END
:
7438 case SENTINEL_GENERIC_START
:
7439 allowed_arches
= private_data
->features
;
7447 value
= insn
->value
;
7448 cp_num
= (given
>> 8) & 0xf;
7452 /* The high 4 bits are 0xe for Arm conditional instructions, and
7453 0xe for arm unconditional instructions. The rest of the
7454 encoding is the same. */
7456 value
|= 0xe0000000;
7464 /* Only match unconditional instuctions against unconditional
7466 if ((given
& 0xf0000000) == 0xf0000000)
7473 cond
= (given
>> 28) & 0xf;
7479 if ((insn
->isa
== T32
&& !thumb
)
7480 || (insn
->isa
== ARM
&& thumb
))
7483 if ((given
& mask
) != value
)
7486 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, allowed_arches
))
7489 if (insn
->value
== 0xfe000010 /* mcr2 */
7490 || insn
->value
== 0xfe100010 /* mrc2 */
7491 || insn
->value
== 0xfc100000 /* ldc2 */
7492 || insn
->value
== 0xfc000000) /* stc2 */
7494 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7495 is_unpredictable
= TRUE
;
7497 /* Armv8.1-M Mainline FP & MVE instructions. */
7498 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7499 && !ARM_CPU_IS_ANY (allowed_arches
)
7500 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7504 else if (insn
->value
== 0x0e000000 /* cdp */
7505 || insn
->value
== 0xfe000000 /* cdp2 */
7506 || insn
->value
== 0x0e000010 /* mcr */
7507 || insn
->value
== 0x0e100010 /* mrc */
7508 || insn
->value
== 0x0c100000 /* ldc */
7509 || insn
->value
== 0x0c000000) /* stc */
7511 /* Floating-point instructions. */
7512 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7515 /* Armv8.1-M Mainline FP & MVE instructions. */
7516 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7517 && !ARM_CPU_IS_ANY (allowed_arches
)
7518 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7521 else if ((insn
->value
== 0xec100f80 /* vldr (system register) */
7522 || insn
->value
== 0xec000f80) /* vstr (system register) */
7523 && arm_decode_field (given
, 24, 24) == 0
7524 && arm_decode_field (given
, 21, 21) == 0)
7525 /* If the P and W bits are both 0 then these encodings match the MVE
7526 VLDR and VSTR instructions, these are in a different table, so we
7527 don't let it match here. */
7530 for (c
= insn
->assembler
; *c
; c
++)
7534 const char mod
= *++c
;
7538 func (stream
, "%%");
7544 int rn
= (given
>> 16) & 0xf;
7545 bfd_vma offset
= given
& 0xff;
7548 offset
= given
& 0x7f;
7550 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
7552 if (PRE_BIT_SET
|| WRITEBACK_BIT_SET
)
7554 /* Not unindexed. The offset is scaled. */
7556 /* vldr.16/vstr.16 will shift the address
7557 left by 1 bit only. */
7558 offset
= offset
* 2;
7560 offset
= offset
* 4;
7562 if (NEGATIVE_BIT_SET
)
7565 value_in_comment
= offset
;
7571 func (stream
, ", #%d]%s",
7573 WRITEBACK_BIT_SET
? "!" : "");
7574 else if (NEGATIVE_BIT_SET
)
7575 func (stream
, ", #-0]");
7583 if (WRITEBACK_BIT_SET
)
7586 func (stream
, ", #%d", (int) offset
);
7587 else if (NEGATIVE_BIT_SET
)
7588 func (stream
, ", #-0");
7592 func (stream
, ", {%s%d}",
7593 (NEGATIVE_BIT_SET
&& !offset
) ? "-" : "",
7595 value_in_comment
= offset
;
7598 if (rn
== 15 && (PRE_BIT_SET
|| WRITEBACK_BIT_SET
))
7600 func (stream
, "\t; ");
7601 /* For unaligned PCs, apply off-by-alignment
7603 info
->print_address_func (offset
+ pc
7604 + info
->bytes_per_chunk
* 2
7613 int regno
= ((given
>> 12) & 0xf) | ((given
>> (22 - 4)) & 0x10);
7614 int offset
= (given
>> 1) & 0x3f;
7617 func (stream
, "{d%d}", regno
);
7618 else if (regno
+ offset
> 32)
7619 func (stream
, "{d%d-<overflow reg d%d>}", regno
, regno
+ offset
- 1);
7621 func (stream
, "{d%d-d%d}", regno
, regno
+ offset
- 1);
7627 bfd_boolean single
= ((given
>> 8) & 1) == 0;
7628 char reg_prefix
= single
? 's' : 'd';
7629 int Dreg
= (given
>> 22) & 0x1;
7630 int Vdreg
= (given
>> 12) & 0xf;
7631 int reg
= single
? ((Vdreg
<< 1) | Dreg
)
7632 : ((Dreg
<< 4) | Vdreg
);
7633 int num
= (given
>> (single
? 0 : 1)) & 0x7f;
7634 int maxreg
= single
? 31 : 15;
7635 int topreg
= reg
+ num
- 1;
7638 func (stream
, "{VPR}");
7640 func (stream
, "{%c%d, VPR}", reg_prefix
, reg
);
7641 else if (topreg
> maxreg
)
7642 func (stream
, "{%c%d-<overflow reg d%d, VPR}",
7643 reg_prefix
, reg
, single
? topreg
>> 1 : topreg
);
7645 func (stream
, "{%c%d-%c%d, VPR}", reg_prefix
, reg
,
7646 reg_prefix
, topreg
);
7651 if (cond
!= COND_UNCOND
)
7652 is_unpredictable
= TRUE
;
7656 if (cond
!= COND_UNCOND
&& cp_num
== 9)
7657 is_unpredictable
= TRUE
;
7659 func (stream
, "%s", arm_conditional
[cond
]);
7663 /* Print a Cirrus/DSP shift immediate. */
7664 /* Immediates are 7bit signed ints with bits 0..3 in
7665 bits 0..3 of opcode and bits 4..6 in bits 5..7
7670 imm
= (given
& 0xf) | ((given
& 0xe0) >> 1);
7672 /* Is ``imm'' a negative number? */
7676 func (stream
, "%d", imm
);
7684 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
7689 func (stream
, "FPSCR");
7692 func (stream
, "FPSCR_nzcvqc");
7695 func (stream
, "VPR");
7698 func (stream
, "P0");
7701 func (stream
, "FPCXTNS");
7704 func (stream
, "FPCXTS");
7707 func (stream
, "<invalid reg %lu>", regno
);
7714 switch (given
& 0x00408000)
7731 switch (given
& 0x00080080)
7743 func (stream
, _("<illegal precision>"));
7749 switch (given
& 0x00408000)
7767 switch (given
& 0x60)
7783 case '0': case '1': case '2': case '3': case '4':
7784 case '5': case '6': case '7': case '8': case '9':
7788 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
7794 is_unpredictable
= TRUE
;
7799 /* Eat the 'u' character. */
7803 is_unpredictable
= TRUE
;
7806 func (stream
, "%s", arm_regnames
[value
]);
7809 if (given
& (1 << 6))
7813 func (stream
, "d%ld", value
);
7818 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
7820 func (stream
, "q%ld", value
>> 1);
7823 func (stream
, "%ld", value
);
7824 value_in_comment
= value
;
7828 /* Converts immediate 8 bit back to float value. */
7829 unsigned floatVal
= (value
& 0x80) << 24
7830 | (value
& 0x3F) << 19
7831 | ((value
& 0x40) ? (0xF8 << 22) : (1 << 30));
7833 /* Quarter float have a maximum value of 31.0.
7834 Get floating point value multiplied by 1e7.
7835 The maximum value stays in limit of a 32-bit int. */
7837 (78125 << (((floatVal
>> 23) & 0xFF) - 124)) *
7838 (16 + (value
& 0xF));
7840 if (!(decVal
% 1000000))
7841 func (stream
, "%ld\t; 0x%08x %c%u.%01u", value
,
7842 floatVal
, value
& 0x80 ? '-' : ' ',
7844 decVal
% 10000000 / 1000000);
7845 else if (!(decVal
% 10000))
7846 func (stream
, "%ld\t; 0x%08x %c%u.%03u", value
,
7847 floatVal
, value
& 0x80 ? '-' : ' ',
7849 decVal
% 10000000 / 10000);
7851 func (stream
, "%ld\t; 0x%08x %c%u.%07u", value
,
7852 floatVal
, value
& 0x80 ? '-' : ' ',
7853 decVal
/ 10000000, decVal
% 10000000);
7858 int from
= (given
& (1 << 7)) ? 32 : 16;
7859 func (stream
, "%ld", from
- value
);
7865 func (stream
, "#%s", arm_fp_const
[value
& 7]);
7867 func (stream
, "f%ld", value
);
7872 func (stream
, "%s", iwmmxt_wwnames
[value
]);
7874 func (stream
, "%s", iwmmxt_wwssnames
[value
]);
7878 func (stream
, "%s", iwmmxt_regnames
[value
]);
7881 func (stream
, "%s", iwmmxt_cregnames
[value
]);
7885 func (stream
, "0x%lx", (value
& 0xffffffffUL
));
7892 func (stream
, "eq");
7896 func (stream
, "vs");
7900 func (stream
, "ge");
7904 func (stream
, "gt");
7908 func (stream
, "??");
7916 func (stream
, "%c", *c
);
7920 if (value
== ((1ul << width
) - 1))
7921 func (stream
, "%c", *c
);
7924 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
7936 int single
= *c
++ == 'y';
7941 case '4': /* Sm pair */
7942 case '0': /* Sm, Dm */
7943 regno
= given
& 0x0000000f;
7947 regno
+= (given
>> 5) & 1;
7950 regno
+= ((given
>> 5) & 1) << 4;
7953 case '1': /* Sd, Dd */
7954 regno
= (given
>> 12) & 0x0000000f;
7958 regno
+= (given
>> 22) & 1;
7961 regno
+= ((given
>> 22) & 1) << 4;
7964 case '2': /* Sn, Dn */
7965 regno
= (given
>> 16) & 0x0000000f;
7969 regno
+= (given
>> 7) & 1;
7972 regno
+= ((given
>> 7) & 1) << 4;
7975 case '3': /* List */
7977 regno
= (given
>> 12) & 0x0000000f;
7981 regno
+= (given
>> 22) & 1;
7984 regno
+= ((given
>> 22) & 1) << 4;
7991 func (stream
, "%c%d", single
? 's' : 'd', regno
);
7995 int count
= given
& 0xff;
8002 func (stream
, "-%c%d",
8010 func (stream
, ", %c%d", single
? 's' : 'd',
8016 switch (given
& 0x00400100)
8018 case 0x00000000: func (stream
, "b"); break;
8019 case 0x00400000: func (stream
, "h"); break;
8020 case 0x00000100: func (stream
, "w"); break;
8021 case 0x00400100: func (stream
, "d"); break;
8029 /* given (20, 23) | given (0, 3) */
8030 value
= ((given
>> 16) & 0xf0) | (given
& 0xf);
8031 func (stream
, "%d", (int) value
);
8036 /* This is like the 'A' operator, except that if
8037 the width field "M" is zero, then the offset is
8038 *not* multiplied by four. */
8040 int offset
= given
& 0xff;
8041 int multiplier
= (given
& 0x00000100) ? 4 : 1;
8043 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
8047 value_in_comment
= offset
* multiplier
;
8048 if (NEGATIVE_BIT_SET
)
8049 value_in_comment
= - value_in_comment
;
8055 func (stream
, ", #%s%d]%s",
8056 NEGATIVE_BIT_SET
? "-" : "",
8057 offset
* multiplier
,
8058 WRITEBACK_BIT_SET
? "!" : "");
8060 func (stream
, "], #%s%d",
8061 NEGATIVE_BIT_SET
? "-" : "",
8062 offset
* multiplier
);
8071 int imm4
= (given
>> 4) & 0xf;
8072 int puw_bits
= ((given
>> 22) & 6) | ((given
>> W_BIT
) & 1);
8073 int ubit
= ! NEGATIVE_BIT_SET
;
8074 const char *rm
= arm_regnames
[given
& 0xf];
8075 const char *rn
= arm_regnames
[(given
>> 16) & 0xf];
8081 func (stream
, "[%s], %c%s", rn
, ubit
? '+' : '-', rm
);
8083 func (stream
, ", lsl #%d", imm4
);
8090 func (stream
, "[%s, %c%s", rn
, ubit
? '+' : '-', rm
);
8092 func (stream
, ", lsl #%d", imm4
);
8094 if (puw_bits
== 5 || puw_bits
== 7)
8099 func (stream
, "INVALID");
8107 imm5
= ((given
& 0x100) >> 4) | (given
& 0xf);
8108 func (stream
, "%ld", (imm5
== 0) ? 32 : imm5
);
8117 func (stream
, "%c", *c
);
8120 if (value_in_comment
> 32 || value_in_comment
< -16)
8121 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
8123 if (is_unpredictable
)
8124 func (stream
, UNPREDICTABLE_INSTRUCTION
);
8131 /* Decodes and prints ARM addressing modes. Returns the offset
8132 used in the address, if any, if it is worthwhile printing the
8133 offset as a hexadecimal value in a comment at the end of the
8134 line of disassembly. */
8137 print_arm_address (bfd_vma pc
, struct disassemble_info
*info
, long given
)
8139 void *stream
= info
->stream
;
8140 fprintf_ftype func
= info
->fprintf_func
;
8143 if (((given
& 0x000f0000) == 0x000f0000)
8144 && ((given
& 0x02000000) == 0))
8146 offset
= given
& 0xfff;
8148 func (stream
, "[pc");
8152 /* Pre-indexed. Elide offset of positive zero when
8154 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8155 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8157 if (NEGATIVE_BIT_SET
)
8162 /* Cope with the possibility of write-back
8163 being used. Probably a very dangerous thing
8164 for the programmer to do, but who are we to
8166 func (stream
, "]%s", WRITEBACK_BIT_SET
? "!" : "");
8168 else /* Post indexed. */
8170 func (stream
, "], #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8172 /* Ie ignore the offset. */
8176 func (stream
, "\t; ");
8177 info
->print_address_func (offset
, info
);
8182 func (stream
, "[%s",
8183 arm_regnames
[(given
>> 16) & 0xf]);
8187 if ((given
& 0x02000000) == 0)
8189 /* Elide offset of positive zero when non-writeback. */
8190 offset
= given
& 0xfff;
8191 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8192 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8196 func (stream
, ", %s", NEGATIVE_BIT_SET
? "-" : "");
8197 arm_decode_shift (given
, func
, stream
, TRUE
);
8200 func (stream
, "]%s",
8201 WRITEBACK_BIT_SET
? "!" : "");
8205 if ((given
& 0x02000000) == 0)
8207 /* Always show offset. */
8208 offset
= given
& 0xfff;
8209 func (stream
, "], #%s%d",
8210 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8214 func (stream
, "], %s",
8215 NEGATIVE_BIT_SET
? "-" : "");
8216 arm_decode_shift (given
, func
, stream
, TRUE
);
8219 if (NEGATIVE_BIT_SET
)
8223 return (signed long) offset
;
8226 /* Print one neon instruction on INFO->STREAM.
8227 Return TRUE if the instuction matched, FALSE if this is not a
8228 recognised neon instruction. */
8231 print_insn_neon (struct disassemble_info
*info
, long given
, bfd_boolean thumb
)
8233 const struct opcode32
*insn
;
8234 void *stream
= info
->stream
;
8235 fprintf_ftype func
= info
->fprintf_func
;
8239 if ((given
& 0xef000000) == 0xef000000)
8241 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
8242 unsigned long bit28
= given
& (1 << 28);
8244 given
&= 0x00ffffff;
8246 given
|= 0xf3000000;
8248 given
|= 0xf2000000;
8250 else if ((given
& 0xff000000) == 0xf9000000)
8251 given
^= 0xf9000000 ^ 0xf4000000;
8252 /* vdup is also a valid neon instruction. */
8253 else if ((given
& 0xff910f5f) != 0xee800b10)
8257 for (insn
= neon_opcodes
; insn
->assembler
; insn
++)
8259 if ((given
& insn
->mask
) == insn
->value
)
8261 signed long value_in_comment
= 0;
8262 bfd_boolean is_unpredictable
= FALSE
;
8265 for (c
= insn
->assembler
; *c
; c
++)
8272 func (stream
, "%%");
8276 if (thumb
&& ifthen_state
)
8277 is_unpredictable
= TRUE
;
8281 if (thumb
&& ifthen_state
)
8282 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
8287 static const unsigned char enc
[16] =
8289 0x4, 0x14, /* st4 0,1 */
8301 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8302 int rn
= ((given
>> 16) & 0xf);
8303 int rm
= ((given
>> 0) & 0xf);
8304 int align
= ((given
>> 4) & 0x3);
8305 int type
= ((given
>> 8) & 0xf);
8306 int n
= enc
[type
] & 0xf;
8307 int stride
= (enc
[type
] >> 4) + 1;
8312 for (ix
= 0; ix
!= n
; ix
++)
8313 func (stream
, "%sd%d", ix
? "," : "", rd
+ ix
* stride
);
8315 func (stream
, "d%d", rd
);
8317 func (stream
, "d%d-d%d", rd
, rd
+ n
- 1);
8318 func (stream
, "}, [%s", arm_regnames
[rn
]);
8320 func (stream
, " :%d", 32 << align
);
8325 func (stream
, ", %s", arm_regnames
[rm
]);
8331 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8332 int rn
= ((given
>> 16) & 0xf);
8333 int rm
= ((given
>> 0) & 0xf);
8334 int idx_align
= ((given
>> 4) & 0xf);
8336 int size
= ((given
>> 10) & 0x3);
8337 int idx
= idx_align
>> (size
+ 1);
8338 int length
= ((given
>> 8) & 3) + 1;
8342 if (length
> 1 && size
> 0)
8343 stride
= (idx_align
& (1 << size
)) ? 2 : 1;
8349 int amask
= (1 << size
) - 1;
8350 if ((idx_align
& (1 << size
)) != 0)
8354 if ((idx_align
& amask
) == amask
)
8356 else if ((idx_align
& amask
) != 0)
8363 if (size
== 2 && (idx_align
& 2) != 0)
8365 align
= (idx_align
& 1) ? 16 << size
: 0;
8369 if ((size
== 2 && (idx_align
& 3) != 0)
8370 || (idx_align
& 1) != 0)
8377 if ((idx_align
& 3) == 3)
8379 align
= (idx_align
& 3) * 64;
8382 align
= (idx_align
& 1) ? 32 << size
: 0;
8390 for (i
= 0; i
< length
; i
++)
8391 func (stream
, "%sd%d[%d]", (i
== 0) ? "" : ",",
8392 rd
+ i
* stride
, idx
);
8393 func (stream
, "}, [%s", arm_regnames
[rn
]);
8395 func (stream
, " :%d", align
);
8400 func (stream
, ", %s", arm_regnames
[rm
]);
8406 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8407 int rn
= ((given
>> 16) & 0xf);
8408 int rm
= ((given
>> 0) & 0xf);
8409 int align
= ((given
>> 4) & 0x1);
8410 int size
= ((given
>> 6) & 0x3);
8411 int type
= ((given
>> 8) & 0x3);
8413 int stride
= ((given
>> 5) & 0x1);
8416 if (stride
&& (n
== 1))
8423 for (ix
= 0; ix
!= n
; ix
++)
8424 func (stream
, "%sd%d[]", ix
? "," : "", rd
+ ix
* stride
);
8426 func (stream
, "d%d[]", rd
);
8428 func (stream
, "d%d[]-d%d[]", rd
, rd
+ n
- 1);
8429 func (stream
, "}, [%s", arm_regnames
[rn
]);
8432 align
= (8 * (type
+ 1)) << size
;
8434 align
= (size
> 1) ? align
>> 1 : align
;
8435 if (type
== 2 || (type
== 0 && !size
))
8436 func (stream
, " :<bad align %d>", align
);
8438 func (stream
, " :%d", align
);
8444 func (stream
, ", %s", arm_regnames
[rm
]);
8450 int raw_reg
= (given
& 0xf) | ((given
>> 1) & 0x10);
8451 int size
= (given
>> 20) & 3;
8452 int reg
= raw_reg
& ((4 << size
) - 1);
8453 int ix
= raw_reg
>> size
>> 2;
8455 func (stream
, "d%d[%d]", reg
, ix
);
8460 /* Neon encoded constant for mov, mvn, vorr, vbic. */
8463 int cmode
= (given
>> 8) & 0xf;
8464 int op
= (given
>> 5) & 0x1;
8465 unsigned long value
= 0, hival
= 0;
8470 bits
|= ((given
>> 24) & 1) << 7;
8471 bits
|= ((given
>> 16) & 7) << 4;
8472 bits
|= ((given
>> 0) & 15) << 0;
8476 shift
= (cmode
>> 1) & 3;
8477 value
= (unsigned long) bits
<< (8 * shift
);
8480 else if (cmode
< 12)
8482 shift
= (cmode
>> 1) & 1;
8483 value
= (unsigned long) bits
<< (8 * shift
);
8486 else if (cmode
< 14)
8488 shift
= (cmode
& 1) + 1;
8489 value
= (unsigned long) bits
<< (8 * shift
);
8490 value
|= (1ul << (8 * shift
)) - 1;
8493 else if (cmode
== 14)
8497 /* Bit replication into bytes. */
8503 for (ix
= 7; ix
>= 0; ix
--)
8505 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
8507 value
= (value
<< 8) | mask
;
8509 hival
= (hival
<< 8) | mask
;
8515 /* Byte replication. */
8516 value
= (unsigned long) bits
;
8522 /* Floating point encoding. */
8525 value
= (unsigned long) (bits
& 0x7f) << 19;
8526 value
|= (unsigned long) (bits
& 0x80) << 24;
8527 tmp
= bits
& 0x40 ? 0x3c : 0x40;
8528 value
|= (unsigned long) tmp
<< 24;
8534 func (stream
, "<illegal constant %.8x:%x:%x>",
8542 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
8546 func (stream
, "#%ld\t; 0x%.4lx", value
, value
);
8552 unsigned char valbytes
[4];
8555 /* Do this a byte at a time so we don't have to
8556 worry about the host's endianness. */
8557 valbytes
[0] = value
& 0xff;
8558 valbytes
[1] = (value
>> 8) & 0xff;
8559 valbytes
[2] = (value
>> 16) & 0xff;
8560 valbytes
[3] = (value
>> 24) & 0xff;
8562 floatformat_to_double
8563 (& floatformat_ieee_single_little
, valbytes
,
8566 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
8570 func (stream
, "#%ld\t; 0x%.8lx",
8571 (long) (((value
& 0x80000000L
) != 0)
8572 ? value
| ~0xffffffffL
: value
),
8577 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
8588 int regno
= ((given
>> 16) & 0xf) | ((given
>> (7 - 4)) & 0x10);
8589 int num
= (given
>> 8) & 0x3;
8592 func (stream
, "{d%d}", regno
);
8593 else if (num
+ regno
>= 32)
8594 func (stream
, "{d%d-<overflow reg d%d}", regno
, regno
+ num
);
8596 func (stream
, "{d%d-d%d}", regno
, regno
+ num
);
8601 case '0': case '1': case '2': case '3': case '4':
8602 case '5': case '6': case '7': case '8': case '9':
8605 unsigned long value
;
8607 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
8612 func (stream
, "%s", arm_regnames
[value
]);
8615 func (stream
, "%ld", value
);
8616 value_in_comment
= value
;
8619 func (stream
, "%ld", (1ul << width
) - value
);
8625 /* Various width encodings. */
8627 int base
= 8 << (*c
- 'S'); /* 8,16 or 32 */
8632 if (*c
>= '0' && *c
<= '9')
8634 else if (*c
>= 'a' && *c
<= 'f')
8635 limit
= *c
- 'a' + 10;
8641 if (value
< low
|| value
> high
)
8642 func (stream
, "<illegal width %d>", base
<< value
);
8644 func (stream
, "%d", base
<< value
);
8648 if (given
& (1 << 6))
8652 func (stream
, "d%ld", value
);
8657 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
8659 func (stream
, "q%ld", value
>> 1);
8665 func (stream
, "%c", *c
);
8669 if (value
== ((1ul << width
) - 1))
8670 func (stream
, "%c", *c
);
8673 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
8687 func (stream
, "%c", *c
);
8690 if (value_in_comment
> 32 || value_in_comment
< -16)
8691 func (stream
, "\t; 0x%lx", value_in_comment
);
8693 if (is_unpredictable
)
8694 func (stream
, UNPREDICTABLE_INSTRUCTION
);
8702 /* Print one mve instruction on INFO->STREAM.
8703 Return TRUE if the instuction matched, FALSE if this is not a
8704 recognised mve instruction. */
8707 print_insn_mve (struct disassemble_info
*info
, long given
)
8709 const struct mopcode32
*insn
;
8710 void *stream
= info
->stream
;
8711 fprintf_ftype func
= info
->fprintf_func
;
8713 for (insn
= mve_opcodes
; insn
->assembler
; insn
++)
8715 if (((given
& insn
->mask
) == insn
->value
)
8716 && !is_mve_encoding_conflict (given
, insn
->mve_op
))
8718 signed long value_in_comment
= 0;
8719 bfd_boolean is_unpredictable
= FALSE
;
8720 bfd_boolean is_undefined
= FALSE
;
8722 enum mve_unpredictable unpredictable_cond
= UNPRED_NONE
;
8723 enum mve_undefined undefined_cond
= UNDEF_NONE
;
8725 /* Most vector mve instruction are illegal in a it block.
8726 There are a few exceptions; check for them. */
8727 if (ifthen_state
&& !is_mve_okay_in_it (insn
->mve_op
))
8729 is_unpredictable
= TRUE
;
8730 unpredictable_cond
= UNPRED_IT_BLOCK
;
8732 else if (is_mve_unpredictable (given
, insn
->mve_op
,
8733 &unpredictable_cond
))
8734 is_unpredictable
= TRUE
;
8736 if (is_mve_undefined (given
, insn
->mve_op
, &undefined_cond
))
8737 is_undefined
= TRUE
;
8739 for (c
= insn
->assembler
; *c
; c
++)
8746 func (stream
, "%%");
8750 /* Don't print anything for '+' as it is implied. */
8751 if (arm_decode_field (given
, 23, 23) == 0)
8757 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
8761 print_mve_vld_str_addr (info
, given
, insn
->mve_op
);
8766 long mve_mask
= mve_extract_pred_mask (given
);
8767 func (stream
, "%s", mve_predicatenames
[mve_mask
]);
8772 print_vec_condition (info
, given
, insn
->mve_op
);
8776 if (arm_decode_field (given
, 0, 0) == 1)
8779 = arm_decode_field (given
, 4, 4)
8780 | (arm_decode_field (given
, 6, 6) << 1);
8782 func (stream
, ", uxtw #%lu", size
);
8787 print_mve_rounding_mode (info
, given
, insn
->mve_op
);
8791 print_mve_vcvt_size (info
, given
, insn
->mve_op
);
8796 unsigned long op1
= arm_decode_field (given
, 21, 22);
8798 if ((insn
->mve_op
== MVE_VMOV_VEC_LANE_TO_GP
))
8800 /* Check for signed. */
8801 if (arm_decode_field (given
, 23, 23) == 0)
8803 /* We don't print 's' for S32. */
8804 if ((arm_decode_field (given
, 5, 6) == 0)
8805 && ((op1
== 0) || (op1
== 1)))
8815 if (arm_decode_field (given
, 28, 28) == 0)
8824 print_instruction_predicate (info
);
8828 if (arm_decode_field (given
, 21, 21) == 1)
8833 print_mve_register_blocks (info
, given
, insn
->mve_op
);
8837 /* SIMD encoded constant for mov, mvn, vorr, vbic. */
8839 print_simd_imm8 (info
, given
, 28, insn
);
8843 print_mve_vmov_index (info
, given
);
8847 if (arm_decode_field (given
, 12, 12) == 0)
8854 if (arm_decode_field (given
, 12, 12) == 1)
8858 case '0': case '1': case '2': case '3': case '4':
8859 case '5': case '6': case '7': case '8': case '9':
8862 unsigned long value
;
8864 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
8870 is_unpredictable
= TRUE
;
8871 else if (value
== 15)
8872 func (stream
, "zr");
8874 func (stream
, "%s", arm_regnames
[value
]);
8877 print_mve_size (info
,
8891 unsigned int odd_reg
= (value
<< 1) | 1;
8892 func (stream
, "%s", arm_regnames
[odd_reg
]);
8898 = arm_decode_field (given
, 0, 6);
8899 unsigned long mod_imm
= imm
;
8901 switch (insn
->mve_op
)
8903 case MVE_VLDRW_GATHER_T5
:
8904 case MVE_VSTRW_SCATTER_T5
:
8905 mod_imm
= mod_imm
<< 2;
8907 case MVE_VSTRD_SCATTER_T6
:
8908 case MVE_VLDRD_GATHER_T6
:
8909 mod_imm
= mod_imm
<< 3;
8916 func (stream
, "%lu", mod_imm
);
8920 func (stream
, "%lu", 64 - value
);
8924 unsigned int even_reg
= value
<< 1;
8925 func (stream
, "%s", arm_regnames
[even_reg
]);
8948 print_mve_rotate (info
, value
, width
);
8951 func (stream
, "%s", arm_regnames
[value
]);
8954 if (insn
->mve_op
== MVE_VQSHL_T2
8955 || insn
->mve_op
== MVE_VQSHLU_T3
8956 || insn
->mve_op
== MVE_VRSHR
8957 || insn
->mve_op
== MVE_VRSHRN
8958 || insn
->mve_op
== MVE_VSHL_T1
8959 || insn
->mve_op
== MVE_VSHLL_T1
8960 || insn
->mve_op
== MVE_VSHR
8961 || insn
->mve_op
== MVE_VSHRN
8962 || insn
->mve_op
== MVE_VSLI
8963 || insn
->mve_op
== MVE_VSRI
)
8964 print_mve_shift_n (info
, given
, insn
->mve_op
);
8965 else if (insn
->mve_op
== MVE_VSHLL_T2
)
8973 func (stream
, "16");
8976 print_mve_undefined (info
, UNDEF_SIZE_0
);
8985 if (insn
->mve_op
== MVE_VSHLC
&& value
== 0)
8987 func (stream
, "%ld", value
);
8988 value_in_comment
= value
;
8992 func (stream
, "s%ld", value
);
8996 func (stream
, "<illegal reg q%ld.5>", value
);
8998 func (stream
, "q%ld", value
);
9001 func (stream
, "0x%08lx", value
);
9013 func (stream
, "%c", *c
);
9016 if (value_in_comment
> 32 || value_in_comment
< -16)
9017 func (stream
, "\t; 0x%lx", value_in_comment
);
9019 if (is_unpredictable
)
9020 print_mve_unpredictable (info
, unpredictable_cond
);
9023 print_mve_undefined (info
, undefined_cond
);
9025 if ((vpt_block_state
.in_vpt_block
== FALSE
)
9027 && (is_vpt_instruction (given
) == TRUE
))
9028 mark_inside_vpt_block (given
);
9029 else if (vpt_block_state
.in_vpt_block
== TRUE
)
9030 update_vpt_block_state ();
9039 /* Return the name of a v7A special register. */
9042 banked_regname (unsigned reg
)
9046 case 15: return "CPSR";
9047 case 32: return "R8_usr";
9048 case 33: return "R9_usr";
9049 case 34: return "R10_usr";
9050 case 35: return "R11_usr";
9051 case 36: return "R12_usr";
9052 case 37: return "SP_usr";
9053 case 38: return "LR_usr";
9054 case 40: return "R8_fiq";
9055 case 41: return "R9_fiq";
9056 case 42: return "R10_fiq";
9057 case 43: return "R11_fiq";
9058 case 44: return "R12_fiq";
9059 case 45: return "SP_fiq";
9060 case 46: return "LR_fiq";
9061 case 48: return "LR_irq";
9062 case 49: return "SP_irq";
9063 case 50: return "LR_svc";
9064 case 51: return "SP_svc";
9065 case 52: return "LR_abt";
9066 case 53: return "SP_abt";
9067 case 54: return "LR_und";
9068 case 55: return "SP_und";
9069 case 60: return "LR_mon";
9070 case 61: return "SP_mon";
9071 case 62: return "ELR_hyp";
9072 case 63: return "SP_hyp";
9073 case 79: return "SPSR";
9074 case 110: return "SPSR_fiq";
9075 case 112: return "SPSR_irq";
9076 case 114: return "SPSR_svc";
9077 case 116: return "SPSR_abt";
9078 case 118: return "SPSR_und";
9079 case 124: return "SPSR_mon";
9080 case 126: return "SPSR_hyp";
9081 default: return NULL
;
9085 /* Return the name of the DMB/DSB option. */
9087 data_barrier_option (unsigned option
)
9089 switch (option
& 0xf)
9091 case 0xf: return "sy";
9092 case 0xe: return "st";
9093 case 0xd: return "ld";
9094 case 0xb: return "ish";
9095 case 0xa: return "ishst";
9096 case 0x9: return "ishld";
9097 case 0x7: return "un";
9098 case 0x6: return "unst";
9099 case 0x5: return "nshld";
9100 case 0x3: return "osh";
9101 case 0x2: return "oshst";
9102 case 0x1: return "oshld";
9103 default: return NULL
;
9107 /* Print one ARM instruction from PC on INFO->STREAM. */
9110 print_insn_arm (bfd_vma pc
, struct disassemble_info
*info
, long given
)
9112 const struct opcode32
*insn
;
9113 void *stream
= info
->stream
;
9114 fprintf_ftype func
= info
->fprintf_func
;
9115 struct arm_private_data
*private_data
= info
->private_data
;
9117 if (print_insn_coprocessor (pc
, info
, given
, FALSE
))
9120 if (print_insn_neon (info
, given
, FALSE
))
9123 for (insn
= arm_opcodes
; insn
->assembler
; insn
++)
9125 if ((given
& insn
->mask
) != insn
->value
)
9128 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, private_data
->features
))
9131 /* Special case: an instruction with all bits set in the condition field
9132 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
9133 or by the catchall at the end of the table. */
9134 if ((given
& 0xF0000000) != 0xF0000000
9135 || (insn
->mask
& 0xF0000000) == 0xF0000000
9136 || (insn
->mask
== 0 && insn
->value
== 0))
9138 unsigned long u_reg
= 16;
9139 unsigned long U_reg
= 16;
9140 bfd_boolean is_unpredictable
= FALSE
;
9141 signed long value_in_comment
= 0;
9144 for (c
= insn
->assembler
; *c
; c
++)
9148 bfd_boolean allow_unpredictable
= FALSE
;
9153 func (stream
, "%%");
9157 value_in_comment
= print_arm_address (pc
, info
, given
);
9161 /* Set P address bit and use normal address
9162 printing routine. */
9163 value_in_comment
= print_arm_address (pc
, info
, given
| (1 << P_BIT
));
9167 allow_unpredictable
= TRUE
;
9170 if ((given
& 0x004f0000) == 0x004f0000)
9172 /* PC relative with immediate offset. */
9173 bfd_vma offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9177 /* Elide positive zero offset. */
9178 if (offset
|| NEGATIVE_BIT_SET
)
9179 func (stream
, "[pc, #%s%d]\t; ",
9180 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9182 func (stream
, "[pc]\t; ");
9183 if (NEGATIVE_BIT_SET
)
9185 info
->print_address_func (offset
+ pc
+ 8, info
);
9189 /* Always show the offset. */
9190 func (stream
, "[pc], #%s%d",
9191 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9192 if (! allow_unpredictable
)
9193 is_unpredictable
= TRUE
;
9198 int offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9200 func (stream
, "[%s",
9201 arm_regnames
[(given
>> 16) & 0xf]);
9205 if (IMMEDIATE_BIT_SET
)
9207 /* Elide offset for non-writeback
9209 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
9211 func (stream
, ", #%s%d",
9212 NEGATIVE_BIT_SET
? "-" : "", offset
);
9214 if (NEGATIVE_BIT_SET
)
9217 value_in_comment
= offset
;
9221 /* Register Offset or Register Pre-Indexed. */
9222 func (stream
, ", %s%s",
9223 NEGATIVE_BIT_SET
? "-" : "",
9224 arm_regnames
[given
& 0xf]);
9226 /* Writing back to the register that is the source/
9227 destination of the load/store is unpredictable. */
9228 if (! allow_unpredictable
9229 && WRITEBACK_BIT_SET
9230 && ((given
& 0xf) == ((given
>> 12) & 0xf)))
9231 is_unpredictable
= TRUE
;
9234 func (stream
, "]%s",
9235 WRITEBACK_BIT_SET
? "!" : "");
9239 if (IMMEDIATE_BIT_SET
)
9241 /* Immediate Post-indexed. */
9242 /* PR 10924: Offset must be printed, even if it is zero. */
9243 func (stream
, "], #%s%d",
9244 NEGATIVE_BIT_SET
? "-" : "", offset
);
9245 if (NEGATIVE_BIT_SET
)
9247 value_in_comment
= offset
;
9251 /* Register Post-indexed. */
9252 func (stream
, "], %s%s",
9253 NEGATIVE_BIT_SET
? "-" : "",
9254 arm_regnames
[given
& 0xf]);
9256 /* Writing back to the register that is the source/
9257 destination of the load/store is unpredictable. */
9258 if (! allow_unpredictable
9259 && (given
& 0xf) == ((given
>> 12) & 0xf))
9260 is_unpredictable
= TRUE
;
9263 if (! allow_unpredictable
)
9265 /* Writeback is automatically implied by post- addressing.
9266 Setting the W bit is unnecessary and ARM specify it as
9267 being unpredictable. */
9268 if (WRITEBACK_BIT_SET
9269 /* Specifying the PC register as the post-indexed
9270 registers is also unpredictable. */
9271 || (! IMMEDIATE_BIT_SET
&& ((given
& 0xf) == 0xf)))
9272 is_unpredictable
= TRUE
;
9280 bfd_vma disp
= (((given
& 0xffffff) ^ 0x800000) - 0x800000);
9281 info
->print_address_func (disp
* 4 + pc
+ 8, info
);
9286 if (((given
>> 28) & 0xf) != 0xe)
9288 arm_conditional
[(given
>> 28) & 0xf]);
9297 for (reg
= 0; reg
< 16; reg
++)
9298 if ((given
& (1 << reg
)) != 0)
9301 func (stream
, ", ");
9303 func (stream
, "%s", arm_regnames
[reg
]);
9307 is_unpredictable
= TRUE
;
9312 arm_decode_shift (given
, func
, stream
, FALSE
);
9316 if ((given
& 0x02000000) != 0)
9318 unsigned int rotate
= (given
& 0xf00) >> 7;
9319 unsigned int immed
= (given
& 0xff);
9322 a
= (((immed
<< (32 - rotate
))
9323 | (immed
>> rotate
)) & 0xffffffff);
9324 /* If there is another encoding with smaller rotate,
9325 the rotate should be specified directly. */
9326 for (i
= 0; i
< 32; i
+= 2)
9327 if ((a
<< i
| a
>> (32 - i
)) <= 0xff)
9331 func (stream
, "#%d, %d", immed
, rotate
);
9333 func (stream
, "#%d", a
);
9334 value_in_comment
= a
;
9337 arm_decode_shift (given
, func
, stream
, TRUE
);
9341 if ((given
& 0x0000f000) == 0x0000f000)
9343 arm_feature_set arm_ext_v6
=
9344 ARM_FEATURE_CORE_LOW (ARM_EXT_V6
);
9346 /* The p-variants of tst/cmp/cmn/teq are the pre-V6
9347 mechanism for setting PSR flag bits. They are
9348 obsolete in V6 onwards. */
9349 if (! ARM_CPU_HAS_FEATURE (private_data
->features
, \
9353 is_unpredictable
= TRUE
;
9358 if ((given
& 0x01200000) == 0x00200000)
9364 int offset
= given
& 0xff;
9366 value_in_comment
= offset
* 4;
9367 if (NEGATIVE_BIT_SET
)
9368 value_in_comment
= - value_in_comment
;
9370 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
9375 func (stream
, ", #%d]%s",
9376 (int) value_in_comment
,
9377 WRITEBACK_BIT_SET
? "!" : "");
9385 if (WRITEBACK_BIT_SET
)
9388 func (stream
, ", #%d", (int) value_in_comment
);
9392 func (stream
, ", {%d}", (int) offset
);
9393 value_in_comment
= offset
;
9400 /* Print ARM V5 BLX(1) address: pc+25 bits. */
9405 if (! NEGATIVE_BIT_SET
)
9406 /* Is signed, hi bits should be ones. */
9407 offset
= (-1) ^ 0x00ffffff;
9409 /* Offset is (SignExtend(offset field)<<2). */
9410 offset
+= given
& 0x00ffffff;
9412 address
= offset
+ pc
+ 8;
9414 if (given
& 0x01000000)
9415 /* H bit allows addressing to 2-byte boundaries. */
9418 info
->print_address_func (address
, info
);
9423 if ((given
& 0x02000200) == 0x200)
9426 unsigned sysm
= (given
& 0x004f0000) >> 16;
9428 sysm
|= (given
& 0x300) >> 4;
9429 name
= banked_regname (sysm
);
9432 func (stream
, "%s", name
);
9434 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
9438 func (stream
, "%cPSR_",
9439 (given
& 0x00400000) ? 'S' : 'C');
9440 if (given
& 0x80000)
9442 if (given
& 0x40000)
9444 if (given
& 0x20000)
9446 if (given
& 0x10000)
9452 if ((given
& 0xf0) == 0x60)
9454 switch (given
& 0xf)
9456 case 0xf: func (stream
, "sy"); break;
9458 func (stream
, "#%d", (int) given
& 0xf);
9464 const char * opt
= data_barrier_option (given
& 0xf);
9466 func (stream
, "%s", opt
);
9468 func (stream
, "#%d", (int) given
& 0xf);
9472 case '0': case '1': case '2': case '3': case '4':
9473 case '5': case '6': case '7': case '8': case '9':
9476 unsigned long value
;
9478 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9484 is_unpredictable
= TRUE
;
9488 /* We want register + 1 when decoding T. */
9494 /* Eat the 'u' character. */
9498 is_unpredictable
= TRUE
;
9503 /* Eat the 'U' character. */
9507 is_unpredictable
= TRUE
;
9510 func (stream
, "%s", arm_regnames
[value
]);
9513 func (stream
, "%ld", value
);
9514 value_in_comment
= value
;
9517 func (stream
, "%ld", value
* 8);
9518 value_in_comment
= value
* 8;
9521 func (stream
, "%ld", value
+ 1);
9522 value_in_comment
= value
+ 1;
9525 func (stream
, "0x%08lx", value
);
9527 /* Some SWI instructions have special
9529 if ((given
& 0x0fffffff) == 0x0FF00000)
9530 func (stream
, "\t; IMB");
9531 else if ((given
& 0x0fffffff) == 0x0FF00001)
9532 func (stream
, "\t; IMBRange");
9535 func (stream
, "%01lx", value
& 0xf);
9536 value_in_comment
= value
;
9541 func (stream
, "%c", *c
);
9545 if (value
== ((1ul << width
) - 1))
9546 func (stream
, "%c", *c
);
9549 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
9562 imm
= (given
& 0xf) | ((given
& 0xfff00) >> 4);
9563 func (stream
, "%d", imm
);
9564 value_in_comment
= imm
;
9569 /* LSB and WIDTH fields of BFI or BFC. The machine-
9570 language instruction encodes LSB and MSB. */
9572 long msb
= (given
& 0x001f0000) >> 16;
9573 long lsb
= (given
& 0x00000f80) >> 7;
9574 long w
= msb
- lsb
+ 1;
9577 func (stream
, "#%lu, #%lu", lsb
, w
);
9579 func (stream
, "(invalid: %lu:%lu)", lsb
, msb
);
9584 /* Get the PSR/banked register name. */
9587 unsigned sysm
= (given
& 0x004f0000) >> 16;
9589 sysm
|= (given
& 0x300) >> 4;
9590 name
= banked_regname (sysm
);
9593 func (stream
, "%s", name
);
9595 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
9600 /* 16-bit unsigned immediate from a MOVT or MOVW
9601 instruction, encoded in bits 0:11 and 15:19. */
9603 long hi
= (given
& 0x000f0000) >> 4;
9604 long lo
= (given
& 0x00000fff);
9605 long imm16
= hi
| lo
;
9607 func (stream
, "#%lu", imm16
);
9608 value_in_comment
= imm16
;
9617 func (stream
, "%c", *c
);
9620 if (value_in_comment
> 32 || value_in_comment
< -16)
9621 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
9623 if (is_unpredictable
)
9624 func (stream
, UNPREDICTABLE_INSTRUCTION
);
9629 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
9633 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
9636 print_insn_thumb16 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
9638 const struct opcode16
*insn
;
9639 void *stream
= info
->stream
;
9640 fprintf_ftype func
= info
->fprintf_func
;
9642 for (insn
= thumb_opcodes
; insn
->assembler
; insn
++)
9643 if ((given
& insn
->mask
) == insn
->value
)
9645 signed long value_in_comment
= 0;
9646 const char *c
= insn
->assembler
;
9655 func (stream
, "%c", *c
);
9662 func (stream
, "%%");
9667 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
9672 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
9681 ifthen_next_state
= given
& 0xff;
9682 for (tmp
= given
<< 1; tmp
& 0xf; tmp
<<= 1)
9683 func (stream
, ((given
^ tmp
) & 0x10) ? "e" : "t");
9684 func (stream
, "\t%s", arm_conditional
[(given
>> 4) & 0xf]);
9689 if (ifthen_next_state
)
9690 func (stream
, "\t; unpredictable branch in IT block\n");
9695 func (stream
, "\t; unpredictable <IT:%s>",
9696 arm_conditional
[IFTHEN_COND
]);
9703 reg
= (given
>> 3) & 0x7;
9704 if (given
& (1 << 6))
9707 func (stream
, "%s", arm_regnames
[reg
]);
9716 if (given
& (1 << 7))
9719 func (stream
, "%s", arm_regnames
[reg
]);
9724 if (given
& (1 << 8))
9728 if (*c
== 'O' && (given
& (1 << 8)))
9738 /* It would be nice if we could spot
9739 ranges, and generate the rS-rE format: */
9740 for (reg
= 0; (reg
< 8); reg
++)
9741 if ((given
& (1 << reg
)) != 0)
9744 func (stream
, ", ");
9746 func (stream
, "%s", arm_regnames
[reg
]);
9752 func (stream
, ", ");
9754 func (stream
, "%s", arm_regnames
[14] /* "lr" */);
9760 func (stream
, ", ");
9761 func (stream
, "%s", arm_regnames
[15] /* "pc" */);
9769 /* Print writeback indicator for a LDMIA. We are doing a
9770 writeback if the base register is not in the register
9772 if ((given
& (1 << ((given
& 0x0700) >> 8))) == 0)
9777 /* Print ARM V6T2 CZB address: pc+4+6 bits. */
9779 bfd_vma address
= (pc
+ 4
9780 + ((given
& 0x00f8) >> 2)
9781 + ((given
& 0x0200) >> 3));
9782 info
->print_address_func (address
, info
);
9787 /* Right shift immediate -- bits 6..10; 1-31 print
9788 as themselves, 0 prints as 32. */
9790 long imm
= (given
& 0x07c0) >> 6;
9793 func (stream
, "#%ld", imm
);
9797 case '0': case '1': case '2': case '3': case '4':
9798 case '5': case '6': case '7': case '8': case '9':
9800 int bitstart
= *c
++ - '0';
9803 while (*c
>= '0' && *c
<= '9')
9804 bitstart
= (bitstart
* 10) + *c
++ - '0';
9813 while (*c
>= '0' && *c
<= '9')
9814 bitend
= (bitend
* 10) + *c
++ - '0';
9817 reg
= given
>> bitstart
;
9818 reg
&= (2 << (bitend
- bitstart
)) - 1;
9823 func (stream
, "%s", arm_regnames
[reg
]);
9827 func (stream
, "%ld", (long) reg
);
9828 value_in_comment
= reg
;
9832 func (stream
, "%ld", (long) (reg
<< 1));
9833 value_in_comment
= reg
<< 1;
9837 func (stream
, "%ld", (long) (reg
<< 2));
9838 value_in_comment
= reg
<< 2;
9842 /* PC-relative address -- the bottom two
9843 bits of the address are dropped
9844 before the calculation. */
9845 info
->print_address_func
9846 (((pc
+ 4) & ~3) + (reg
<< 2), info
);
9847 value_in_comment
= 0;
9851 func (stream
, "0x%04lx", (long) reg
);
9855 reg
= ((reg
^ (1 << bitend
)) - (1 << bitend
));
9856 info
->print_address_func (reg
* 2 + pc
+ 4, info
);
9857 value_in_comment
= 0;
9861 func (stream
, "%s", arm_conditional
[reg
]);
9872 if ((given
& (1 << bitstart
)) != 0)
9873 func (stream
, "%c", *c
);
9878 if ((given
& (1 << bitstart
)) != 0)
9879 func (stream
, "%c", *c
++);
9881 func (stream
, "%c", *++c
);
9895 if (value_in_comment
> 32 || value_in_comment
< -16)
9896 func (stream
, "\t; 0x%lx", value_in_comment
);
9901 func (stream
, UNKNOWN_INSTRUCTION_16BIT
, (unsigned)given
);
9905 /* Return the name of an V7M special register. */
9908 psr_name (int regno
)
9912 case 0x0: return "APSR";
9913 case 0x1: return "IAPSR";
9914 case 0x2: return "EAPSR";
9915 case 0x3: return "PSR";
9916 case 0x5: return "IPSR";
9917 case 0x6: return "EPSR";
9918 case 0x7: return "IEPSR";
9919 case 0x8: return "MSP";
9920 case 0x9: return "PSP";
9921 case 0xa: return "MSPLIM";
9922 case 0xb: return "PSPLIM";
9923 case 0x10: return "PRIMASK";
9924 case 0x11: return "BASEPRI";
9925 case 0x12: return "BASEPRI_MAX";
9926 case 0x13: return "FAULTMASK";
9927 case 0x14: return "CONTROL";
9928 case 0x88: return "MSP_NS";
9929 case 0x89: return "PSP_NS";
9930 case 0x8a: return "MSPLIM_NS";
9931 case 0x8b: return "PSPLIM_NS";
9932 case 0x90: return "PRIMASK_NS";
9933 case 0x91: return "BASEPRI_NS";
9934 case 0x93: return "FAULTMASK_NS";
9935 case 0x94: return "CONTROL_NS";
9936 case 0x98: return "SP_NS";
9937 default: return "<unknown>";
9941 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
9944 print_insn_thumb32 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
9946 const struct opcode32
*insn
;
9947 void *stream
= info
->stream
;
9948 fprintf_ftype func
= info
->fprintf_func
;
9949 bfd_boolean is_mve
= is_mve_architecture (info
);
9951 if (print_insn_coprocessor (pc
, info
, given
, TRUE
))
9954 if ((is_mve
== FALSE
) && print_insn_neon (info
, given
, TRUE
))
9957 if (is_mve
&& print_insn_mve (info
, given
))
9960 for (insn
= thumb32_opcodes
; insn
->assembler
; insn
++)
9961 if ((given
& insn
->mask
) == insn
->value
)
9963 bfd_boolean is_clrm
= FALSE
;
9964 bfd_boolean is_unpredictable
= FALSE
;
9965 signed long value_in_comment
= 0;
9966 const char *c
= insn
->assembler
;
9972 func (stream
, "%c", *c
);
9979 func (stream
, "%%");
9984 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
9988 if (ifthen_next_state
)
9989 func (stream
, "\t; unpredictable branch in IT block\n");
9994 func (stream
, "\t; unpredictable <IT:%s>",
9995 arm_conditional
[IFTHEN_COND
]);
10000 unsigned int imm12
= 0;
10002 imm12
|= (given
& 0x000000ffu
);
10003 imm12
|= (given
& 0x00007000u
) >> 4;
10004 imm12
|= (given
& 0x04000000u
) >> 15;
10005 func (stream
, "#%u", imm12
);
10006 value_in_comment
= imm12
;
10012 unsigned int bits
= 0, imm
, imm8
, mod
;
10014 bits
|= (given
& 0x000000ffu
);
10015 bits
|= (given
& 0x00007000u
) >> 4;
10016 bits
|= (given
& 0x04000000u
) >> 15;
10017 imm8
= (bits
& 0x0ff);
10018 mod
= (bits
& 0xf00) >> 8;
10021 case 0: imm
= imm8
; break;
10022 case 1: imm
= ((imm8
<< 16) | imm8
); break;
10023 case 2: imm
= ((imm8
<< 24) | (imm8
<< 8)); break;
10024 case 3: imm
= ((imm8
<< 24) | (imm8
<< 16) | (imm8
<< 8) | imm8
); break;
10026 mod
= (bits
& 0xf80) >> 7;
10027 imm8
= (bits
& 0x07f) | 0x80;
10028 imm
= (((imm8
<< (32 - mod
)) | (imm8
>> mod
)) & 0xffffffff);
10030 func (stream
, "#%u", imm
);
10031 value_in_comment
= imm
;
10037 unsigned int imm
= 0;
10039 imm
|= (given
& 0x000000ffu
);
10040 imm
|= (given
& 0x00007000u
) >> 4;
10041 imm
|= (given
& 0x04000000u
) >> 15;
10042 imm
|= (given
& 0x000f0000u
) >> 4;
10043 func (stream
, "#%u", imm
);
10044 value_in_comment
= imm
;
10050 unsigned int imm
= 0;
10052 imm
|= (given
& 0x000f0000u
) >> 16;
10053 imm
|= (given
& 0x00000ff0u
) >> 0;
10054 imm
|= (given
& 0x0000000fu
) << 12;
10055 func (stream
, "#%u", imm
);
10056 value_in_comment
= imm
;
10062 unsigned int imm
= 0;
10064 imm
|= (given
& 0x000f0000u
) >> 4;
10065 imm
|= (given
& 0x00000fffu
) >> 0;
10066 func (stream
, "#%u", imm
);
10067 value_in_comment
= imm
;
10073 unsigned int imm
= 0;
10075 imm
|= (given
& 0x00000fffu
);
10076 imm
|= (given
& 0x000f0000u
) >> 4;
10077 func (stream
, "#%u", imm
);
10078 value_in_comment
= imm
;
10084 unsigned int reg
= (given
& 0x0000000fu
);
10085 unsigned int stp
= (given
& 0x00000030u
) >> 4;
10086 unsigned int imm
= 0;
10087 imm
|= (given
& 0x000000c0u
) >> 6;
10088 imm
|= (given
& 0x00007000u
) >> 10;
10090 func (stream
, "%s", arm_regnames
[reg
]);
10095 func (stream
, ", lsl #%u", imm
);
10101 func (stream
, ", lsr #%u", imm
);
10107 func (stream
, ", asr #%u", imm
);
10112 func (stream
, ", rrx");
10114 func (stream
, ", ror #%u", imm
);
10121 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10122 unsigned int U
= ! NEGATIVE_BIT_SET
;
10123 unsigned int op
= (given
& 0x00000f00) >> 8;
10124 unsigned int i12
= (given
& 0x00000fff);
10125 unsigned int i8
= (given
& 0x000000ff);
10126 bfd_boolean writeback
= FALSE
, postind
= FALSE
;
10127 bfd_vma offset
= 0;
10129 func (stream
, "[%s", arm_regnames
[Rn
]);
10130 if (U
) /* 12-bit positive immediate offset. */
10134 value_in_comment
= offset
;
10136 else if (Rn
== 15) /* 12-bit negative immediate offset. */
10137 offset
= - (int) i12
;
10138 else if (op
== 0x0) /* Shifted register offset. */
10140 unsigned int Rm
= (i8
& 0x0f);
10141 unsigned int sh
= (i8
& 0x30) >> 4;
10143 func (stream
, ", %s", arm_regnames
[Rm
]);
10145 func (stream
, ", lsl #%u", sh
);
10146 func (stream
, "]");
10151 case 0xE: /* 8-bit positive immediate offset. */
10155 case 0xC: /* 8-bit negative immediate offset. */
10159 case 0xF: /* 8-bit + preindex with wb. */
10164 case 0xD: /* 8-bit - preindex with wb. */
10169 case 0xB: /* 8-bit + postindex. */
10174 case 0x9: /* 8-bit - postindex. */
10180 func (stream
, ", <undefined>]");
10185 func (stream
, "], #%d", (int) offset
);
10189 func (stream
, ", #%d", (int) offset
);
10190 func (stream
, writeback
? "]!" : "]");
10195 func (stream
, "\t; ");
10196 info
->print_address_func (((pc
+ 4) & ~3) + offset
, info
);
10204 unsigned int U
= ! NEGATIVE_BIT_SET
;
10205 unsigned int W
= WRITEBACK_BIT_SET
;
10206 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10207 unsigned int off
= (given
& 0x000000ff);
10209 func (stream
, "[%s", arm_regnames
[Rn
]);
10215 func (stream
, ", #%c%u", U
? '+' : '-', off
* 4);
10216 value_in_comment
= off
* 4 * (U
? 1 : -1);
10218 func (stream
, "]");
10220 func (stream
, "!");
10224 func (stream
, "], ");
10227 func (stream
, "#%c%u", U
? '+' : '-', off
* 4);
10228 value_in_comment
= off
* 4 * (U
? 1 : -1);
10232 func (stream
, "{%u}", off
);
10233 value_in_comment
= off
;
10241 unsigned int Sbit
= (given
& 0x01000000) >> 24;
10242 unsigned int type
= (given
& 0x00600000) >> 21;
10246 case 0: func (stream
, Sbit
? "sb" : "b"); break;
10247 case 1: func (stream
, Sbit
? "sh" : "h"); break;
10250 func (stream
, "??");
10253 func (stream
, "??");
10261 /* Fall through. */
10267 func (stream
, "{");
10268 for (reg
= 0; reg
< 16; reg
++)
10269 if ((given
& (1 << reg
)) != 0)
10272 func (stream
, ", ");
10274 if (is_clrm
&& reg
== 13)
10275 func (stream
, "(invalid: %s)", arm_regnames
[reg
]);
10276 else if (is_clrm
&& reg
== 15)
10277 func (stream
, "%s", "APSR");
10279 func (stream
, "%s", arm_regnames
[reg
]);
10281 func (stream
, "}");
10287 unsigned int msb
= (given
& 0x0000001f);
10288 unsigned int lsb
= 0;
10290 lsb
|= (given
& 0x000000c0u
) >> 6;
10291 lsb
|= (given
& 0x00007000u
) >> 10;
10292 func (stream
, "#%u, #%u", lsb
, msb
- lsb
+ 1);
10298 unsigned int width
= (given
& 0x0000001f) + 1;
10299 unsigned int lsb
= 0;
10301 lsb
|= (given
& 0x000000c0u
) >> 6;
10302 lsb
|= (given
& 0x00007000u
) >> 10;
10303 func (stream
, "#%u, #%u", lsb
, width
);
10309 unsigned int boff
= (((given
& 0x07800000) >> 23) << 1);
10310 func (stream
, "%x", boff
);
10316 unsigned int immA
= (given
& 0x001f0000u
) >> 16;
10317 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10318 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10319 bfd_vma offset
= 0;
10321 offset
|= immA
<< 12;
10322 offset
|= immB
<< 2;
10323 offset
|= immC
<< 1;
10325 offset
= (offset
& 0x10000) ? offset
- (1 << 17) : offset
;
10327 info
->print_address_func (pc
+ 4 + offset
, info
);
10333 unsigned int immA
= (given
& 0x007f0000u
) >> 16;
10334 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10335 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10336 bfd_vma offset
= 0;
10338 offset
|= immA
<< 12;
10339 offset
|= immB
<< 2;
10340 offset
|= immC
<< 1;
10342 offset
= (offset
& 0x40000) ? offset
- (1 << 19) : offset
;
10344 info
->print_address_func (pc
+ 4 + offset
, info
);
10350 unsigned int immA
= (given
& 0x00010000u
) >> 16;
10351 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10352 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10353 bfd_vma offset
= 0;
10355 offset
|= immA
<< 12;
10356 offset
|= immB
<< 2;
10357 offset
|= immC
<< 1;
10359 offset
= (offset
& 0x1000) ? offset
- (1 << 13) : offset
;
10361 info
->print_address_func (pc
+ 4 + offset
, info
);
10363 unsigned int T
= (given
& 0x00020000u
) >> 17;
10364 unsigned int endoffset
= (((given
& 0x07800000) >> 23) << 1);
10365 unsigned int boffset
= (T
== 1) ? 4 : 2;
10366 func (stream
, ", ");
10367 func (stream
, "%x", endoffset
+ boffset
);
10373 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10374 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10377 imm32
|= immh
<< 2;
10378 imm32
|= imml
<< 1;
10380 info
->print_address_func (pc
+ 4 + imm32
, info
);
10386 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10387 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10390 imm32
|= immh
<< 2;
10391 imm32
|= imml
<< 1;
10393 info
->print_address_func (pc
+ 4 - imm32
, info
);
10399 unsigned int S
= (given
& 0x04000000u
) >> 26;
10400 unsigned int J1
= (given
& 0x00002000u
) >> 13;
10401 unsigned int J2
= (given
& 0x00000800u
) >> 11;
10402 bfd_vma offset
= 0;
10404 offset
|= !S
<< 20;
10405 offset
|= J2
<< 19;
10406 offset
|= J1
<< 18;
10407 offset
|= (given
& 0x003f0000) >> 4;
10408 offset
|= (given
& 0x000007ff) << 1;
10409 offset
-= (1 << 20);
10411 info
->print_address_func (pc
+ 4 + offset
, info
);
10417 unsigned int S
= (given
& 0x04000000u
) >> 26;
10418 unsigned int I1
= (given
& 0x00002000u
) >> 13;
10419 unsigned int I2
= (given
& 0x00000800u
) >> 11;
10420 bfd_vma offset
= 0;
10422 offset
|= !S
<< 24;
10423 offset
|= !(I1
^ S
) << 23;
10424 offset
|= !(I2
^ S
) << 22;
10425 offset
|= (given
& 0x03ff0000u
) >> 4;
10426 offset
|= (given
& 0x000007ffu
) << 1;
10427 offset
-= (1 << 24);
10430 /* BLX target addresses are always word aligned. */
10431 if ((given
& 0x00001000u
) == 0)
10434 info
->print_address_func (offset
, info
);
10440 unsigned int shift
= 0;
10442 shift
|= (given
& 0x000000c0u
) >> 6;
10443 shift
|= (given
& 0x00007000u
) >> 10;
10444 if (WRITEBACK_BIT_SET
)
10445 func (stream
, ", asr #%u", shift
);
10447 func (stream
, ", lsl #%u", shift
);
10448 /* else print nothing - lsl #0 */
10454 unsigned int rot
= (given
& 0x00000030) >> 4;
10457 func (stream
, ", ror #%u", rot
* 8);
10462 if ((given
& 0xf0) == 0x60)
10464 switch (given
& 0xf)
10466 case 0xf: func (stream
, "sy"); break;
10468 func (stream
, "#%d", (int) given
& 0xf);
10474 const char * opt
= data_barrier_option (given
& 0xf);
10476 func (stream
, "%s", opt
);
10478 func (stream
, "#%d", (int) given
& 0xf);
10483 if ((given
& 0xff) == 0)
10485 func (stream
, "%cPSR_", (given
& 0x100000) ? 'S' : 'C');
10487 func (stream
, "f");
10489 func (stream
, "s");
10491 func (stream
, "x");
10493 func (stream
, "c");
10495 else if ((given
& 0x20) == 0x20)
10498 unsigned sysm
= (given
& 0xf00) >> 8;
10500 sysm
|= (given
& 0x30);
10501 sysm
|= (given
& 0x00100000) >> 14;
10502 name
= banked_regname (sysm
);
10505 func (stream
, "%s", name
);
10507 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
10511 func (stream
, "%s", psr_name (given
& 0xff));
10516 if (((given
& 0xff) == 0)
10517 || ((given
& 0x20) == 0x20))
10520 unsigned sm
= (given
& 0xf0000) >> 16;
10522 sm
|= (given
& 0x30);
10523 sm
|= (given
& 0x00100000) >> 14;
10524 name
= banked_regname (sm
);
10527 func (stream
, "%s", name
);
10529 func (stream
, "(UNDEF: %lu)", (unsigned long) sm
);
10532 func (stream
, "%s", psr_name (given
& 0xff));
10535 case '0': case '1': case '2': case '3': case '4':
10536 case '5': case '6': case '7': case '8': case '9':
10541 c
= arm_decode_bitfield (c
, given
, &val
, &width
);
10547 func (stream
, "%s", mve_vec_sizename
[val
]);
10549 func (stream
, "<undef size>");
10553 func (stream
, "%lu", val
);
10554 value_in_comment
= val
;
10558 func (stream
, "%lu", val
+ 1);
10559 value_in_comment
= val
+ 1;
10563 func (stream
, "%lu", val
* 4);
10564 value_in_comment
= val
* 4;
10569 is_unpredictable
= TRUE
;
10570 /* Fall through. */
10573 is_unpredictable
= TRUE
;
10574 /* Fall through. */
10576 func (stream
, "%s", arm_regnames
[val
]);
10580 func (stream
, "%s", arm_conditional
[val
]);
10585 if (val
== ((1ul << width
) - 1))
10586 func (stream
, "%c", *c
);
10592 func (stream
, "%c", *c
);
10596 func (stream
, "%c", c
[(1 << width
) - (int) val
]);
10601 func (stream
, "0x%lx", val
& 0xffffffffUL
);
10611 /* PR binutils/12534
10612 If we have a PC relative offset in an LDRD or STRD
10613 instructions then display the decoded address. */
10614 if (((given
>> 16) & 0xf) == 0xf)
10616 bfd_vma offset
= (given
& 0xff) * 4;
10618 if ((given
& (1 << 23)) == 0)
10620 func (stream
, "\t; ");
10621 info
->print_address_func ((pc
& ~3) + 4 + offset
, info
);
10630 if (value_in_comment
> 32 || value_in_comment
< -16)
10631 func (stream
, "\t; 0x%lx", value_in_comment
);
10633 if (is_unpredictable
)
10634 func (stream
, UNPREDICTABLE_INSTRUCTION
);
10640 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
10644 /* Print data bytes on INFO->STREAM. */
10647 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED
,
10648 struct disassemble_info
*info
,
10651 switch (info
->bytes_per_chunk
)
10654 info
->fprintf_func (info
->stream
, ".byte\t0x%02lx", given
);
10657 info
->fprintf_func (info
->stream
, ".short\t0x%04lx", given
);
10660 info
->fprintf_func (info
->stream
, ".word\t0x%08lx", given
);
10667 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
10668 being displayed in symbol relative addresses.
10670 Also disallow private symbol, with __tagsym$$ prefix,
10671 from ARM RVCT toolchain being displayed. */
10674 arm_symbol_is_valid (asymbol
* sym
,
10675 struct disassemble_info
* info ATTRIBUTE_UNUSED
)
10682 name
= bfd_asymbol_name (sym
);
10684 return (name
&& *name
!= '$' && strncmp (name
, "__tagsym$$", 10));
10687 /* Parse the string of disassembler options. */
10690 parse_arm_disassembler_options (const char *options
)
10694 FOR_EACH_DISASSEMBLER_OPTION (opt
, options
)
10696 if (CONST_STRNEQ (opt
, "reg-names-"))
10699 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
10700 if (disassembler_options_cmp (opt
, regnames
[i
].name
) == 0)
10702 regname_selected
= i
;
10706 if (i
>= NUM_ARM_OPTIONS
)
10707 /* xgettext: c-format */
10708 opcodes_error_handler (_("unrecognised register name set: %s"),
10711 else if (CONST_STRNEQ (opt
, "force-thumb"))
10713 else if (CONST_STRNEQ (opt
, "no-force-thumb"))
10716 /* xgettext: c-format */
10717 opcodes_error_handler (_("unrecognised disassembler option: %s"), opt
);
10724 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
10725 enum map_type
*map_symbol
);
10727 /* Search back through the insn stream to determine if this instruction is
10728 conditionally executed. */
10731 find_ifthen_state (bfd_vma pc
,
10732 struct disassemble_info
*info
,
10733 bfd_boolean little
)
10735 unsigned char b
[2];
10738 /* COUNT is twice the number of instructions seen. It will be odd if we
10739 just crossed an instruction boundary. */
10742 unsigned int seen_it
;
10745 ifthen_address
= pc
;
10752 /* Scan backwards looking for IT instructions, keeping track of where
10753 instruction boundaries are. We don't know if something is actually an
10754 IT instruction until we find a definite instruction boundary. */
10757 if (addr
== 0 || info
->symbol_at_address_func (addr
, info
))
10759 /* A symbol must be on an instruction boundary, and will not
10760 be within an IT block. */
10761 if (seen_it
&& (count
& 1))
10767 status
= info
->read_memory_func (addr
, (bfd_byte
*) b
, 2, info
);
10772 insn
= (b
[0]) | (b
[1] << 8);
10774 insn
= (b
[1]) | (b
[0] << 8);
10777 if ((insn
& 0xf800) < 0xe800)
10779 /* Addr + 2 is an instruction boundary. See if this matches
10780 the expected boundary based on the position of the last
10787 if ((insn
& 0xff00) == 0xbf00 && (insn
& 0xf) != 0)
10789 enum map_type type
= MAP_ARM
;
10790 bfd_boolean found
= mapping_symbol_for_insn (addr
, info
, &type
);
10792 if (!found
|| (found
&& type
== MAP_THUMB
))
10794 /* This could be an IT instruction. */
10796 it_count
= count
>> 1;
10799 if ((insn
& 0xf800) >= 0xe800)
10802 count
= (count
+ 2) | 1;
10803 /* IT blocks contain at most 4 instructions. */
10804 if (count
>= 8 && !seen_it
)
10807 /* We found an IT instruction. */
10808 ifthen_state
= (seen_it
& 0xe0) | ((seen_it
<< it_count
) & 0x1f);
10809 if ((ifthen_state
& 0xf) == 0)
10813 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
10817 is_mapping_symbol (struct disassemble_info
*info
, int n
,
10818 enum map_type
*map_type
)
10822 name
= bfd_asymbol_name (info
->symtab
[n
]);
10823 if (name
[0] == '$' && (name
[1] == 'a' || name
[1] == 't' || name
[1] == 'd')
10824 && (name
[2] == 0 || name
[2] == '.'))
10826 *map_type
= ((name
[1] == 'a') ? MAP_ARM
10827 : (name
[1] == 't') ? MAP_THUMB
10835 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
10836 Returns nonzero if *MAP_TYPE was set. */
10839 get_map_sym_type (struct disassemble_info
*info
,
10841 enum map_type
*map_type
)
10843 /* If the symbol is in a different section, ignore it. */
10844 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
10847 return is_mapping_symbol (info
, n
, map_type
);
10850 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
10851 Returns nonzero if *MAP_TYPE was set. */
10854 get_sym_code_type (struct disassemble_info
*info
,
10856 enum map_type
*map_type
)
10858 elf_symbol_type
*es
;
10861 /* If the symbol is in a different section, ignore it. */
10862 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
10865 es
= *(elf_symbol_type
**)(info
->symtab
+ n
);
10866 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
10868 /* If the symbol has function type then use that. */
10869 if (type
== STT_FUNC
|| type
== STT_GNU_IFUNC
)
10871 if (ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
10872 == ST_BRANCH_TO_THUMB
)
10873 *map_type
= MAP_THUMB
;
10875 *map_type
= MAP_ARM
;
10882 /* Search the mapping symbol state for instruction at pc. This is only
10883 applicable for elf target.
10885 There is an assumption Here, info->private_data contains the correct AND
10886 up-to-date information about current scan process. The information will be
10887 used to speed this search process.
10889 Return TRUE if the mapping state can be determined, and map_symbol
10890 will be updated accordingly. Otherwise, return FALSE. */
10893 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
10894 enum map_type
*map_symbol
)
10896 bfd_vma addr
, section_vma
= 0;
10897 int n
, last_sym
= -1;
10898 bfd_boolean found
= FALSE
;
10899 bfd_boolean can_use_search_opt_p
= FALSE
;
10901 /* Default to DATA. A text section is required by the ABI to contain an
10902 INSN mapping symbol at the start. A data section has no such
10903 requirement, hence if no mapping symbol is found the section must
10904 contain only data. This however isn't very useful if the user has
10905 fully stripped the binaries. If this is the case use the section
10906 attributes to determine the default. If we have no section default to
10907 INSN as well, as we may be disassembling some raw bytes on a baremetal
10908 HEX file or similar. */
10909 enum map_type type
= MAP_DATA
;
10910 if ((info
->section
&& info
->section
->flags
& SEC_CODE
) || !info
->section
)
10912 struct arm_private_data
*private_data
;
10914 if (info
->private_data
== NULL
10915 || bfd_asymbol_flavour (*info
->symtab
) != bfd_target_elf_flavour
)
10918 private_data
= info
->private_data
;
10920 /* First, look for mapping symbols. */
10921 if (info
->symtab_size
!= 0)
10923 if (pc
<= private_data
->last_mapping_addr
)
10924 private_data
->last_mapping_sym
= -1;
10926 /* Start scanning at the start of the function, or wherever
10927 we finished last time. */
10928 n
= info
->symtab_pos
+ 1;
10930 /* If the last stop offset is different from the current one it means we
10931 are disassembling a different glob of bytes. As such the optimization
10932 would not be safe and we should start over. */
10933 can_use_search_opt_p
10934 = private_data
->last_mapping_sym
>= 0
10935 && info
->stop_offset
== private_data
->last_stop_offset
;
10937 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
10938 n
= private_data
->last_mapping_sym
;
10940 /* Look down while we haven't passed the location being disassembled.
10941 The reason for this is that there's no defined order between a symbol
10942 and an mapping symbol that may be at the same address. We may have to
10943 look at least one position ahead. */
10944 for (; n
< info
->symtab_size
; n
++)
10946 addr
= bfd_asymbol_value (info
->symtab
[n
]);
10949 if (get_map_sym_type (info
, n
, &type
))
10958 n
= info
->symtab_pos
;
10959 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
10960 n
= private_data
->last_mapping_sym
;
10962 /* No mapping symbol found at this address. Look backwards
10963 for a preceeding one, but don't go pass the section start
10964 otherwise a data section with no mapping symbol can pick up
10965 a text mapping symbol of a preceeding section. The documentation
10966 says section can be NULL, in which case we will seek up all the
10969 section_vma
= info
->section
->vma
;
10971 for (; n
>= 0; n
--)
10973 addr
= bfd_asymbol_value (info
->symtab
[n
]);
10974 if (addr
< section_vma
)
10977 if (get_map_sym_type (info
, n
, &type
))
10987 /* If no mapping symbol was found, try looking up without a mapping
10988 symbol. This is done by walking up from the current PC to the nearest
10989 symbol. We don't actually have to loop here since symtab_pos will
10990 contain the nearest symbol already. */
10993 n
= info
->symtab_pos
;
10994 if (n
>= 0 && get_sym_code_type (info
, n
, &type
))
11001 private_data
->last_mapping_sym
= last_sym
;
11002 private_data
->last_type
= type
;
11003 private_data
->last_stop_offset
= info
->stop_offset
;
11005 *map_symbol
= type
;
11009 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
11010 of the supplied arm_feature_set structure with bitmasks indicating
11011 the supported base architectures and coprocessor extensions.
11013 FIXME: This could more efficiently implemented as a constant array,
11014 although it would also be less robust. */
11017 select_arm_features (unsigned long mach
,
11018 arm_feature_set
* features
)
11020 arm_feature_set arch_fset
;
11021 const arm_feature_set fpu_any
= FPU_ANY
;
11023 #undef ARM_SET_FEATURES
11024 #define ARM_SET_FEATURES(FSET) \
11026 const arm_feature_set fset = FSET; \
11027 arch_fset = fset; \
11030 /* When several architecture versions share the same bfd_mach_arm_XXX value
11031 the most featureful is chosen. */
11034 case bfd_mach_arm_2
: ARM_SET_FEATURES (ARM_ARCH_V2
); break;
11035 case bfd_mach_arm_2a
: ARM_SET_FEATURES (ARM_ARCH_V2S
); break;
11036 case bfd_mach_arm_3
: ARM_SET_FEATURES (ARM_ARCH_V3
); break;
11037 case bfd_mach_arm_3M
: ARM_SET_FEATURES (ARM_ARCH_V3M
); break;
11038 case bfd_mach_arm_4
: ARM_SET_FEATURES (ARM_ARCH_V4
); break;
11039 case bfd_mach_arm_4T
: ARM_SET_FEATURES (ARM_ARCH_V4T
); break;
11040 case bfd_mach_arm_5
: ARM_SET_FEATURES (ARM_ARCH_V5
); break;
11041 case bfd_mach_arm_5T
: ARM_SET_FEATURES (ARM_ARCH_V5T
); break;
11042 case bfd_mach_arm_5TE
: ARM_SET_FEATURES (ARM_ARCH_V5TE
); break;
11043 case bfd_mach_arm_XScale
: ARM_SET_FEATURES (ARM_ARCH_XSCALE
); break;
11044 case bfd_mach_arm_ep9312
:
11045 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T
,
11046 ARM_CEXT_MAVERICK
| FPU_MAVERICK
));
11048 case bfd_mach_arm_iWMMXt
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT
); break;
11049 case bfd_mach_arm_iWMMXt2
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2
); break;
11050 case bfd_mach_arm_5TEJ
: ARM_SET_FEATURES (ARM_ARCH_V5TEJ
); break;
11051 case bfd_mach_arm_6
: ARM_SET_FEATURES (ARM_ARCH_V6
); break;
11052 case bfd_mach_arm_6KZ
: ARM_SET_FEATURES (ARM_ARCH_V6KZ
); break;
11053 case bfd_mach_arm_6T2
: ARM_SET_FEATURES (ARM_ARCH_V6KZT2
); break;
11054 case bfd_mach_arm_6K
: ARM_SET_FEATURES (ARM_ARCH_V6K
); break;
11055 case bfd_mach_arm_7
: ARM_SET_FEATURES (ARM_ARCH_V7VE
); break;
11056 case bfd_mach_arm_6M
: ARM_SET_FEATURES (ARM_ARCH_V6M
); break;
11057 case bfd_mach_arm_6SM
: ARM_SET_FEATURES (ARM_ARCH_V6SM
); break;
11058 case bfd_mach_arm_7EM
: ARM_SET_FEATURES (ARM_ARCH_V7EM
); break;
11059 case bfd_mach_arm_8
:
11061 /* Add bits for extensions that Armv8.5-A recognizes. */
11062 arm_feature_set armv8_5_ext_fset
11063 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
);
11064 ARM_SET_FEATURES (ARM_ARCH_V8_5A
);
11065 ARM_MERGE_FEATURE_SETS (arch_fset
, arch_fset
, armv8_5_ext_fset
);
11068 case bfd_mach_arm_8R
: ARM_SET_FEATURES (ARM_ARCH_V8R
); break;
11069 case bfd_mach_arm_8M_BASE
: ARM_SET_FEATURES (ARM_ARCH_V8M_BASE
); break;
11070 case bfd_mach_arm_8M_MAIN
: ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN
); break;
11071 case bfd_mach_arm_8_1M_MAIN
:
11072 ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN
);
11075 /* If the machine type is unknown allow all architecture types and all
11077 case bfd_mach_arm_unknown
: ARM_SET_FEATURES (ARM_FEATURE_ALL
); break;
11081 #undef ARM_SET_FEATURES
11083 /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
11084 and thus on bfd_mach_arm_XXX value. Therefore for a given
11085 bfd_mach_arm_XXX value all coprocessor feature bits should be allowed. */
11086 ARM_MERGE_FEATURE_SETS (*features
, arch_fset
, fpu_any
);
11090 /* NOTE: There are no checks in these routines that
11091 the relevant number of data bytes exist. */
11094 print_insn (bfd_vma pc
, struct disassemble_info
*info
, bfd_boolean little
)
11096 unsigned char b
[4];
11099 int is_thumb
= FALSE
;
11100 int is_data
= FALSE
;
11102 unsigned int size
= 4;
11103 void (*printer
) (bfd_vma
, struct disassemble_info
*, long);
11104 bfd_boolean found
= FALSE
;
11105 struct arm_private_data
*private_data
;
11107 if (info
->disassembler_options
)
11109 parse_arm_disassembler_options (info
->disassembler_options
);
11111 /* To avoid repeated parsing of these options, we remove them here. */
11112 info
->disassembler_options
= NULL
;
11115 /* PR 10288: Control which instructions will be disassembled. */
11116 if (info
->private_data
== NULL
)
11118 static struct arm_private_data
private;
11120 if ((info
->flags
& USER_SPECIFIED_MACHINE_TYPE
) == 0)
11121 /* If the user did not use the -m command line switch then default to
11122 disassembling all types of ARM instruction.
11124 The info->mach value has to be ignored as this will be based on
11125 the default archictecture for the target and/or hints in the notes
11126 section, but it will never be greater than the current largest arm
11127 machine value (iWMMXt2), which is only equivalent to the V5TE
11128 architecture. ARM architectures have advanced beyond the machine
11129 value encoding, and these newer architectures would be ignored if
11130 the machine value was used.
11132 Ie the -m switch is used to restrict which instructions will be
11133 disassembled. If it is necessary to use the -m switch to tell
11134 objdump that an ARM binary is being disassembled, eg because the
11135 input is a raw binary file, but it is also desired to disassemble
11136 all ARM instructions then use "-marm". This will select the
11137 "unknown" arm architecture which is compatible with any ARM
11139 info
->mach
= bfd_mach_arm_unknown
;
11141 /* Compute the architecture bitmask from the machine number.
11142 Note: This assumes that the machine number will not change
11143 during disassembly.... */
11144 select_arm_features (info
->mach
, & private.features
);
11146 private.last_mapping_sym
= -1;
11147 private.last_mapping_addr
= 0;
11148 private.last_stop_offset
= 0;
11150 info
->private_data
= & private;
11153 private_data
= info
->private_data
;
11155 /* Decide if our code is going to be little-endian, despite what the
11156 function argument might say. */
11157 little_code
= ((info
->endian_code
== BFD_ENDIAN_LITTLE
) || little
);
11159 /* For ELF, consult the symbol table to determine what kind of code
11160 or data we have. */
11161 if (info
->symtab_size
!= 0
11162 && bfd_asymbol_flavour (*info
->symtab
) == bfd_target_elf_flavour
)
11167 enum map_type type
= MAP_ARM
;
11169 found
= mapping_symbol_for_insn (pc
, info
, &type
);
11170 last_sym
= private_data
->last_mapping_sym
;
11172 is_thumb
= (private_data
->last_type
== MAP_THUMB
);
11173 is_data
= (private_data
->last_type
== MAP_DATA
);
11175 /* Look a little bit ahead to see if we should print out
11176 two or four bytes of data. If there's a symbol,
11177 mapping or otherwise, after two bytes then don't
11181 size
= 4 - (pc
& 3);
11182 for (n
= last_sym
+ 1; n
< info
->symtab_size
; n
++)
11184 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11186 && (info
->section
== NULL
11187 || info
->section
== info
->symtab
[n
]->section
))
11189 if (addr
- pc
< size
)
11194 /* If the next symbol is after three bytes, we need to
11195 print only part of the data, so that we can use either
11196 .byte or .short. */
11198 size
= (pc
& 1) ? 1 : 2;
11202 if (info
->symbols
!= NULL
)
11204 if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_coff_flavour
)
11206 coff_symbol_type
* cs
;
11208 cs
= coffsymbol (*info
->symbols
);
11209 is_thumb
= ( cs
->native
->u
.syment
.n_sclass
== C_THUMBEXT
11210 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTAT
11211 || cs
->native
->u
.syment
.n_sclass
== C_THUMBLABEL
11212 || cs
->native
->u
.syment
.n_sclass
== C_THUMBEXTFUNC
11213 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTATFUNC
);
11215 else if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_elf_flavour
11218 /* If no mapping symbol has been found then fall back to the type
11219 of the function symbol. */
11220 elf_symbol_type
* es
;
11223 es
= *(elf_symbol_type
**)(info
->symbols
);
11224 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
11227 ((ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
11228 == ST_BRANCH_TO_THUMB
) || type
== STT_ARM_16BIT
);
11230 else if (bfd_asymbol_flavour (*info
->symbols
)
11231 == bfd_target_mach_o_flavour
)
11233 bfd_mach_o_asymbol
*asym
= (bfd_mach_o_asymbol
*)*info
->symbols
;
11235 is_thumb
= (asym
->n_desc
& BFD_MACH_O_N_ARM_THUMB_DEF
);
11243 info
->display_endian
= little
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11245 info
->display_endian
= little_code
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11247 info
->bytes_per_line
= 4;
11249 /* PR 10263: Disassemble data if requested to do so by the user. */
11250 if (is_data
&& ((info
->flags
& DISASSEMBLE_DATA
) == 0))
11254 /* Size was already set above. */
11255 info
->bytes_per_chunk
= size
;
11256 printer
= print_insn_data
;
11258 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, size
, info
);
11261 for (i
= size
- 1; i
>= 0; i
--)
11262 given
= b
[i
] | (given
<< 8);
11264 for (i
= 0; i
< (int) size
; i
++)
11265 given
= b
[i
] | (given
<< 8);
11267 else if (!is_thumb
)
11269 /* In ARM mode endianness is a straightforward issue: the instruction
11270 is four bytes long and is either ordered 0123 or 3210. */
11271 printer
= print_insn_arm
;
11272 info
->bytes_per_chunk
= 4;
11275 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 4, info
);
11277 given
= (b
[0]) | (b
[1] << 8) | (b
[2] << 16) | (b
[3] << 24);
11279 given
= (b
[3]) | (b
[2] << 8) | (b
[1] << 16) | (b
[0] << 24);
11283 /* In Thumb mode we have the additional wrinkle of two
11284 instruction lengths. Fortunately, the bits that determine
11285 the length of the current instruction are always to be found
11286 in the first two bytes. */
11287 printer
= print_insn_thumb16
;
11288 info
->bytes_per_chunk
= 2;
11291 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 2, info
);
11293 given
= (b
[0]) | (b
[1] << 8);
11295 given
= (b
[1]) | (b
[0] << 8);
11299 /* These bit patterns signal a four-byte Thumb
11301 if ((given
& 0xF800) == 0xF800
11302 || (given
& 0xF800) == 0xF000
11303 || (given
& 0xF800) == 0xE800)
11305 status
= info
->read_memory_func (pc
+ 2, (bfd_byte
*) b
, 2, info
);
11307 given
= (b
[0]) | (b
[1] << 8) | (given
<< 16);
11309 given
= (b
[1]) | (b
[0] << 8) | (given
<< 16);
11311 printer
= print_insn_thumb32
;
11316 if (ifthen_address
!= pc
)
11317 find_ifthen_state (pc
, info
, little_code
);
11321 if ((ifthen_state
& 0xf) == 0x8)
11322 ifthen_next_state
= 0;
11324 ifthen_next_state
= (ifthen_state
& 0xe0)
11325 | ((ifthen_state
& 0xf) << 1);
11331 info
->memory_error_func (status
, pc
, info
);
11334 if (info
->flags
& INSN_HAS_RELOC
)
11335 /* If the instruction has a reloc associated with it, then
11336 the offset field in the instruction will actually be the
11337 addend for the reloc. (We are using REL type relocs).
11338 In such cases, we can ignore the pc when computing
11339 addresses, since the addend is not currently pc-relative. */
11342 printer (pc
, info
, given
);
11346 ifthen_state
= ifthen_next_state
;
11347 ifthen_address
+= size
;
11353 print_insn_big_arm (bfd_vma pc
, struct disassemble_info
*info
)
11355 /* Detect BE8-ness and record it in the disassembler info. */
11356 if (info
->flavour
== bfd_target_elf_flavour
11357 && info
->section
!= NULL
11358 && (elf_elfheader (info
->section
->owner
)->e_flags
& EF_ARM_BE8
))
11359 info
->endian_code
= BFD_ENDIAN_LITTLE
;
11361 return print_insn (pc
, info
, FALSE
);
11365 print_insn_little_arm (bfd_vma pc
, struct disassemble_info
*info
)
11367 return print_insn (pc
, info
, TRUE
);
11370 const disasm_options_and_args_t
*
11371 disassembler_options_arm (void)
11373 static disasm_options_and_args_t
*opts_and_args
;
11375 if (opts_and_args
== NULL
)
11377 disasm_options_t
*opts
;
11380 opts_and_args
= XNEW (disasm_options_and_args_t
);
11381 opts_and_args
->args
= NULL
;
11383 opts
= &opts_and_args
->options
;
11384 opts
->name
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11385 opts
->description
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11387 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11389 opts
->name
[i
] = regnames
[i
].name
;
11390 if (regnames
[i
].description
!= NULL
)
11391 opts
->description
[i
] = _(regnames
[i
].description
);
11393 opts
->description
[i
] = NULL
;
11395 /* The array we return must be NULL terminated. */
11396 opts
->name
[i
] = NULL
;
11397 opts
->description
[i
] = NULL
;
11400 return opts_and_args
;
11404 print_arm_disassembler_options (FILE *stream
)
11406 unsigned int i
, max_len
= 0;
11407 fprintf (stream
, _("\n\
11408 The following ARM specific disassembler options are supported for use with\n\
11409 the -M switch:\n"));
11411 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11413 unsigned int len
= strlen (regnames
[i
].name
);
11418 for (i
= 0, max_len
++; i
< NUM_ARM_OPTIONS
; i
++)
11419 fprintf (stream
, " %s%*c %s\n",
11421 (int)(max_len
- strlen (regnames
[i
].name
)), ' ',
11422 _(regnames
[i
].description
));