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
,
296 enum mve_unpredictable
298 UNPRED_IT_BLOCK
, /* Unpredictable because mve insn in it block.
300 UNPRED_FCA_0_FCB_1
, /* Unpredictable because fcA = 0 and
302 UNPRED_R13
, /* Unpredictable because r13 (sp) or
304 UNPRED_R15
, /* Unpredictable because r15 (pc) is used. */
305 UNPRED_Q_GT_4
, /* Unpredictable because
306 vec reg start > 4 (vld4/st4). */
307 UNPRED_Q_GT_6
, /* Unpredictable because
308 vec reg start > 6 (vld2/st2). */
309 UNPRED_R13_AND_WB
, /* Unpredictable becase gp reg = r13
311 UNPRED_Q_REGS_EQUAL
, /* Unpredictable because vector registers are
313 UNPRED_OS
, /* Unpredictable because offset scaled == 1. */
314 UNPRED_GP_REGS_EQUAL
, /* Unpredictable because gp registers are the
316 UNPRED_Q_REGS_EQ_AND_SIZE_1
, /* Unpredictable because q regs equal and
318 UNPRED_Q_REGS_EQ_AND_SIZE_2
, /* Unpredictable because q regs equal and
320 UNPRED_NONE
/* No unpredictable behavior. */
325 UNDEF_SIZE
, /* undefined size. */
326 UNDEF_SIZE_0
, /* undefined because size == 0. */
327 UNDEF_SIZE_2
, /* undefined because size == 2. */
328 UNDEF_SIZE_3
, /* undefined because size == 3. */
329 UNDEF_SIZE_LE_1
, /* undefined because size <= 1. */
330 UNDEF_SIZE_NOT_0
, /* undefined because size != 0. */
331 UNDEF_SIZE_NOT_2
, /* undefined because size != 2. */
332 UNDEF_SIZE_NOT_3
, /* undefined because size != 3. */
333 UNDEF_NOT_UNS_SIZE_0
, /* undefined because U == 0 and
335 UNDEF_NOT_UNS_SIZE_1
, /* undefined because U == 0 and
337 UNDEF_NOT_UNSIGNED
, /* undefined because U == 0. */
338 UNDEF_VCVT_IMM6
, /* imm6 < 32. */
339 UNDEF_VCVT_FSI_IMM6
, /* fsi = 0 and 32 >= imm6 <= 47. */
340 UNDEF_BAD_OP1_OP2
, /* undefined with op2 = 2 and
342 UNDEF_BAD_U_OP1_OP2
, /* undefined with U = 1 and
343 op2 == 0 and op1 == (0 or 1). */
344 UNDEF_OP_0_BAD_CMODE
, /* undefined because op == 0 and cmode
346 UNDEF_XCHG_UNS
, /* undefined because X == 1 and U == 1. */
347 UNDEF_NONE
/* no undefined behavior. */
352 arm_feature_set arch
; /* Architecture defining this insn. */
353 unsigned long value
; /* If arch is 0 then value is a sentinel. */
354 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
355 const char * assembler
; /* How to disassemble this insn. */
362 arm_feature_set arch
; /* Architecture defining this insn. */
363 enum mve_instructions mve_op
; /* Specific mve instruction for faster
365 unsigned long value
; /* If arch is 0 then value is a sentinel. */
366 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
367 const char * assembler
; /* How to disassemble this insn. */
377 /* Shared (between Arm and Thumb mode) opcode. */
380 enum isa isa
; /* Execution mode instruction availability. */
381 arm_feature_set arch
; /* Architecture defining this insn. */
382 unsigned long value
; /* If arch is 0 then value is a sentinel. */
383 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
384 const char * assembler
; /* How to disassemble this insn. */
389 arm_feature_set arch
; /* Architecture defining this insn. */
390 unsigned short value
, mask
; /* Recognise insn if (op & mask) == value. */
391 const char *assembler
; /* How to disassemble this insn. */
394 /* print_insn_coprocessor recognizes the following format control codes:
398 %c print condition code (always bits 28-31 in ARM mode)
399 %q print shifter argument
400 %u print condition code (unconditional in ARM mode,
401 UNPREDICTABLE if not AL in Thumb)
402 %A print address for ldc/stc/ldf/stf instruction
403 %B print vstm/vldm register list
404 %C print vscclrm register list
405 %I print cirrus signed shift immediate: bits 0..3|4..6
406 %J print register for VLDR instruction
407 %K print address for VLDR instruction
408 %F print the COUNT field of a LFM/SFM instruction.
409 %P print floating point precision in arithmetic insn
410 %Q print floating point precision in ldf/stf insn
411 %R print floating point rounding mode
413 %<bitfield>c print as a condition code (for vsel)
414 %<bitfield>r print as an ARM register
415 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
416 %<bitfield>ru as %<>r but each u register must be unique.
417 %<bitfield>d print the bitfield in decimal
418 %<bitfield>k print immediate for VFPv3 conversion instruction
419 %<bitfield>x print the bitfield in hex
420 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
421 %<bitfield>f print a floating point constant if >7 else a
422 floating point register
423 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
424 %<bitfield>g print as an iWMMXt 64-bit register
425 %<bitfield>G print as an iWMMXt general purpose or control register
426 %<bitfield>D print as a NEON D register
427 %<bitfield>Q print as a NEON Q register
428 %<bitfield>V print as a NEON D or Q register
429 %<bitfield>E print a quarter-float immediate value
431 %y<code> print a single precision VFP reg.
432 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
433 %z<code> print a double precision VFP reg
434 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
436 %<bitfield>'c print specified char iff bitfield is all ones
437 %<bitfield>`c print specified char iff bitfield is all zeroes
438 %<bitfield>?ab... select from array of values in big endian order
440 %L print as an iWMMXt N/M width field.
441 %Z print the Immediate of a WSHUFH instruction.
442 %l like 'A' except use byte offsets for 'B' & 'H'
444 %i print 5-bit immediate in bits 8,3..0
446 %r print register offset address for wldt/wstr instruction. */
448 enum opcode_sentinel_enum
450 SENTINEL_IWMMXT_START
= 1,
452 SENTINEL_GENERIC_START
455 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x"
456 #define UNKNOWN_INSTRUCTION_32BIT "\t\t; <UNDEFINED> instruction: %08x"
457 #define UNKNOWN_INSTRUCTION_16BIT "\t\t; <UNDEFINED> instruction: %04x"
458 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>"
460 /* Common coprocessor opcodes shared between Arm and Thumb-2. */
462 static const struct sopcode32 coprocessor_opcodes
[] =
464 /* XScale instructions. */
465 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
466 0x0e200010, 0x0fff0ff0,
467 "mia%c\tacc0, %0-3r, %12-15r"},
468 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
469 0x0e280010, 0x0fff0ff0,
470 "miaph%c\tacc0, %0-3r, %12-15r"},
471 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
472 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
473 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
474 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
475 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
476 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
478 /* Intel Wireless MMX technology instructions. */
479 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START
, 0, "" },
480 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT
),
481 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
482 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
483 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
484 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
485 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
486 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
487 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
488 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
489 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
490 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
491 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
492 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
493 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
494 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
495 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
496 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
497 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
498 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
499 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
500 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
501 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
502 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
503 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
504 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
505 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
506 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
507 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
508 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
509 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
510 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
511 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
512 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
513 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
514 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
515 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
516 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
517 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
518 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
519 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
520 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
521 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
522 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
523 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
524 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
525 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
526 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
527 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
528 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
529 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
530 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
531 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
532 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
533 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
534 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
535 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
536 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
537 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
538 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
539 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
540 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
541 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
542 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
543 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
544 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
545 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
546 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
547 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
548 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
549 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
550 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
551 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
552 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
553 0x0e800120, 0x0f800ff0,
554 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
555 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
556 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
557 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
558 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
559 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
560 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
561 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
562 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
563 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
564 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
565 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
566 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
567 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
568 0x0e8000a0, 0x0f800ff0,
569 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
570 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
571 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
572 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
573 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
574 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
575 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
576 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
577 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
578 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
579 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
580 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
581 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
582 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
583 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
584 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
585 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
586 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
587 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
588 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
589 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
590 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
591 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
592 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
593 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
594 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
595 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
596 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
597 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
598 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
599 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
600 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
601 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
602 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
603 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
604 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
605 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
606 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
607 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
608 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
609 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
610 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
611 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
612 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
613 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
614 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
615 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
616 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
617 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
618 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
619 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
620 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
621 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
622 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
623 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
624 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
625 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
626 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
627 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
628 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
629 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
630 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
631 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
632 {ANY
, ARM_FEATURE_CORE_LOW (0),
633 SENTINEL_IWMMXT_END
, 0, "" },
635 /* Floating point coprocessor (FPA) instructions. */
636 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
637 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
638 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
639 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
640 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
641 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
642 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
643 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
644 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
645 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
646 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
647 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
648 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
649 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
650 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
651 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
652 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
653 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
654 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
655 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
656 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
657 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
658 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
659 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
660 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
661 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
662 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
663 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
664 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
665 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
666 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
667 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
668 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
669 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
670 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
671 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
672 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
673 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
674 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
675 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
676 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
677 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
678 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
679 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
680 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
681 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
682 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
683 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
684 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
685 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
686 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
687 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
688 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
689 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
690 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
691 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
692 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
693 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
694 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
695 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
696 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
697 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
698 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
699 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
700 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
701 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
702 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
703 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
704 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
705 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
706 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
707 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
708 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
709 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
710 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
711 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
712 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
713 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
714 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
715 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
716 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
717 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
718 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
719 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
720 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
721 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
723 /* Armv8.1-M Mainline instructions. */
724 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
725 0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
726 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
727 0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
729 /* ARMv8-M Mainline Security Extensions instructions. */
730 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
731 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
732 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
733 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
735 /* Register load/store. */
736 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
737 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
738 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
739 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
740 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
741 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
742 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
743 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
744 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
745 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
746 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
747 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
748 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
749 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
750 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
751 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
752 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
753 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
754 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
755 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
756 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
757 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
758 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
759 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
760 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
761 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
762 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
763 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
764 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
765 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
766 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
767 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
768 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
769 0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
770 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
771 0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
773 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
774 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
775 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
776 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
777 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
778 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
779 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
780 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
782 /* Data transfer between ARM and NEON registers. */
783 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
784 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
785 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
786 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
787 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
788 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
789 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
790 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
791 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
792 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
793 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
794 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
795 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
796 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
797 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
798 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
799 /* Half-precision conversion instructions. */
800 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
801 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
802 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
803 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
804 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
805 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
806 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
807 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
809 /* Floating point coprocessor (VFP) instructions. */
810 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
811 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
812 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
813 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
814 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
815 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
816 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
817 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
818 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
819 0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
820 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
821 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
822 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
823 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
824 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
825 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
826 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
827 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
828 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
829 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
830 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
831 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
832 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
833 0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
834 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
835 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
836 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
837 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
838 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
839 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
840 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
841 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
842 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
843 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
844 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
845 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
846 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
847 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
848 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
849 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
850 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
851 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
852 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
853 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
854 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
855 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
856 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
857 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
858 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
859 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
860 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
861 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
862 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
863 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
864 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
865 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
866 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
867 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
868 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
869 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
870 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
871 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
872 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
873 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
874 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
875 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
876 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
877 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
878 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
879 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
880 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
881 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
882 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
883 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
884 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
885 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
886 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
887 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
888 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
889 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
890 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
891 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
892 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
893 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
894 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
895 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
896 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
897 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
898 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
899 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
900 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
901 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
902 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
903 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
904 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
905 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
906 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
907 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
908 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
909 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
910 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
911 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
912 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
913 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
914 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
915 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
916 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
917 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
918 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
919 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
920 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
921 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
922 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
923 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
924 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
925 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
926 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
927 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
928 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
929 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
930 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
931 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
932 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
933 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
934 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
935 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
936 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
937 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
938 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
939 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
940 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
941 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
942 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
943 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
944 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
945 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
946 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
947 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
949 /* Cirrus coprocessor instructions. */
950 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
951 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
952 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
953 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
954 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
955 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
956 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
957 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
958 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
959 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
960 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
961 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
962 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
963 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
964 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
965 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
966 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
967 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
968 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
969 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
970 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
971 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
972 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
973 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
974 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
975 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
976 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
977 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
978 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
979 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
980 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
981 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
982 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
983 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
984 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
985 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
986 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
987 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
988 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
989 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
990 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
991 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
992 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
993 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
994 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
995 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
996 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
997 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
998 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
999 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
1000 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1001 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
1002 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1003 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
1004 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1005 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
1006 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1007 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
1008 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1009 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
1010 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1011 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
1012 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1013 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
1014 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1015 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
1016 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1017 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
1018 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1019 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
1020 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1021 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
1022 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1023 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
1024 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1025 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
1026 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1027 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
1028 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1029 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
1030 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1031 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
1032 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1033 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
1034 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1035 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
1036 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1037 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
1038 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1039 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
1040 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1041 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
1042 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1043 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
1044 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1045 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
1046 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1047 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
1048 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1049 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
1050 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1051 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
1052 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1053 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
1054 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1055 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
1056 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1057 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
1058 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1059 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
1060 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1061 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
1062 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1063 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
1064 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1065 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
1066 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1067 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
1068 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1069 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
1070 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1071 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
1072 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1073 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
1074 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1075 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1076 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1077 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1078 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1079 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1080 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1081 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1082 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1083 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1084 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1085 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1086 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1087 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
1088 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1089 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
1090 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1091 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
1092 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1093 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
1094 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1095 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1096 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1097 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1098 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1099 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1100 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1101 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1102 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1103 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1104 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1105 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1106 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1107 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1108 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1109 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1110 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1111 0x0e000600, 0x0ff00f10,
1112 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1113 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1114 0x0e100600, 0x0ff00f10,
1115 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1116 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1117 0x0e200600, 0x0ff00f10,
1118 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1119 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1120 0x0e300600, 0x0ff00f10,
1121 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1123 /* VFP Fused multiply add instructions. */
1124 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1125 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
1126 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1127 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
1128 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1129 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
1130 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1131 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
1132 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1133 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
1134 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1135 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
1136 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1137 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
1138 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1139 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
1142 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1143 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
1144 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1145 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
1146 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1147 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
1148 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1149 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
1150 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1151 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
1152 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1153 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
1154 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1155 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
1156 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1157 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
1158 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1159 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
1160 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1161 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
1162 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1163 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
1164 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1165 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
1167 /* Generic coprocessor instructions. */
1168 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START
, 0, "" },
1169 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1170 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
1171 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1172 0x0c500000, 0x0ff00000,
1173 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1174 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1175 0x0e000000, 0x0f000010,
1176 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1177 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1178 0x0e10f010, 0x0f10f010,
1179 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
1180 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1181 0x0e100010, 0x0f100010,
1182 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1183 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1184 0x0e000010, 0x0f100010,
1185 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1186 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1187 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
1188 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1189 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
1191 /* V6 coprocessor instructions. */
1192 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1193 0xfc500000, 0xfff00000,
1194 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1195 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1196 0xfc400000, 0xfff00000,
1197 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
1199 /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8. */
1200 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1201 0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1202 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1203 0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1204 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1205 0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1206 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1207 0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1208 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1209 0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1210 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1211 0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1212 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1213 0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
1214 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1215 0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
1216 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1217 0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
1218 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1219 0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
1221 /* Dot Product instructions in the space of coprocessor 13. */
1222 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1223 0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
1224 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1225 0xfe000d00, 0xff000f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
1227 /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */
1228 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1229 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1230 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1231 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1232 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1233 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1234 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1235 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1236 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1237 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1238 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1239 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1240 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1241 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1242 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1243 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1245 /* V5 coprocessor instructions. */
1246 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1247 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1248 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1249 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1250 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1251 0xfe000000, 0xff000010,
1252 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1253 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1254 0xfe000010, 0xff100010,
1255 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1256 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1257 0xfe100010, 0xff100010,
1258 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1260 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
1261 cp_num: bit <11:8> == 0b1001.
1262 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */
1263 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1264 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
1265 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1266 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
1267 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1268 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
1269 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1270 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
1271 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1272 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
1273 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1274 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
1275 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1276 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
1277 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1278 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
1279 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1280 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
1281 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1282 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
1283 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1284 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
1285 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1286 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
1287 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1288 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
1289 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1290 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
1291 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1292 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
1293 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1294 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
1295 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1296 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
1297 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1298 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
1299 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1300 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
1301 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1302 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
1303 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1304 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
1305 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1306 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
1307 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1308 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
1309 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1310 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
1311 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1312 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
1313 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1314 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
1315 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1316 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
1317 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1318 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
1319 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1320 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
1321 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1322 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
1323 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1324 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
1325 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1326 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
1327 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1328 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
1329 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1330 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
1331 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1332 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
1334 /* ARMv8.3 javascript conversion instruction. */
1335 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1336 0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
1338 {ANY
, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1341 /* Neon opcode table: This does not encode the top byte -- that is
1342 checked by the print_insn_neon routine, as it depends on whether we are
1343 doing thumb32 or arm32 disassembly. */
1345 /* print_insn_neon recognizes the following format control codes:
1349 %c print condition code
1350 %u print condition code (unconditional in ARM mode,
1351 UNPREDICTABLE if not AL in Thumb)
1352 %A print v{st,ld}[1234] operands
1353 %B print v{st,ld}[1234] any one operands
1354 %C print v{st,ld}[1234] single->all operands
1356 %E print vmov, vmvn, vorr, vbic encoded constant
1357 %F print vtbl,vtbx register list
1359 %<bitfield>r print as an ARM register
1360 %<bitfield>d print the bitfield in decimal
1361 %<bitfield>e print the 2^N - bitfield in decimal
1362 %<bitfield>D print as a NEON D register
1363 %<bitfield>Q print as a NEON Q register
1364 %<bitfield>R print as a NEON D or Q register
1365 %<bitfield>Sn print byte scaled width limited by n
1366 %<bitfield>Tn print short scaled width limited by n
1367 %<bitfield>Un print long scaled width limited by n
1369 %<bitfield>'c print specified char iff bitfield is all ones
1370 %<bitfield>`c print specified char iff bitfield is all zeroes
1371 %<bitfield>?ab... select from array of values in big endian order. */
1373 static const struct opcode32 neon_opcodes
[] =
1376 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1377 0xf2b00840, 0xffb00850,
1378 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1379 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1380 0xf2b00000, 0xffb00810,
1381 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1383 /* Data transfer between ARM and NEON registers. */
1384 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1385 0x0e800b10, 0x1ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
1386 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1387 0x0e800b30, 0x1ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
1388 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1389 0x0ea00b10, 0x1ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
1390 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1391 0x0ea00b30, 0x1ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
1392 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1393 0x0ec00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
1394 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1395 0x0ee00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
1397 /* Move data element to all lanes. */
1398 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1399 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
1400 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1401 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
1402 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1403 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
1406 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1407 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
1408 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1409 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
1411 /* Half-precision conversions. */
1412 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1413 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
1414 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1415 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
1417 /* NEON fused multiply add instructions. */
1418 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1419 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1420 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1421 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1422 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1423 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1424 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1425 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1427 /* Two registers, miscellaneous. */
1428 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1429 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
1430 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1431 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
1432 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1433 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
1434 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1435 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
1436 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1437 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
1438 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1439 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
1440 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1441 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
1442 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1443 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
1444 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1445 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
1446 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1447 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
1448 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1449 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
1450 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1451 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
1452 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1453 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
1454 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1455 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
1456 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1457 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
1458 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1459 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
1460 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1461 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
1462 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1463 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
1464 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1465 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1466 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1467 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1468 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1469 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
1470 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1471 0xf3b20300, 0xffb30fd0,
1472 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
1473 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1474 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1475 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1476 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1477 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1478 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1479 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1480 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1481 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1482 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1483 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1484 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1485 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1486 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1487 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1488 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1489 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1490 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
1491 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1492 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1493 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1494 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1495 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1496 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1497 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1498 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1499 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1500 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1501 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1502 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1503 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1504 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1505 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1506 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1507 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1508 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1509 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1510 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1511 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1512 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1513 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1514 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1515 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1516 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1517 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1518 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1519 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1520 0xf3bb0600, 0xffbf0e10,
1521 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
1522 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1523 0xf3b70600, 0xffbf0e10,
1524 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
1526 /* Three registers of the same length. */
1527 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1528 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1529 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1530 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1531 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1532 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1533 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1534 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1535 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1536 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1537 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1538 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1539 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1540 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1541 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1542 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1543 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1544 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1545 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1546 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1547 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1548 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1549 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1550 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1551 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1552 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1553 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1554 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1555 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1556 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1557 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1558 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1559 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1560 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1561 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1562 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1563 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1564 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1565 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1566 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1567 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1568 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1569 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1570 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1571 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1572 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1573 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1574 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1575 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1576 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1577 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1578 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1579 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1580 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1581 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1582 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1583 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1584 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1585 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1586 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1587 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1588 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1589 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1590 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1591 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1592 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1593 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1594 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1595 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1596 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1597 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1598 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1599 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1600 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1601 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1602 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1603 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1604 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1605 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1606 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1607 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1608 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1609 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1610 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1611 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1612 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1613 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1614 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1615 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1616 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1617 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1618 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1619 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1620 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1621 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1622 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1623 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1624 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1625 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1626 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1627 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1628 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1629 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1630 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1631 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1632 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1633 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1634 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1635 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1636 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1637 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1638 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1639 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1640 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1641 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1642 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1643 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1644 0xf2000b00, 0xff800f10,
1645 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1646 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1647 0xf2000b10, 0xff800f10,
1648 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1649 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1650 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1651 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1652 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1653 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1654 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1655 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1656 0xf3000b00, 0xff800f10,
1657 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1658 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1659 0xf2000000, 0xfe800f10,
1660 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1661 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1662 0xf2000010, 0xfe800f10,
1663 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1664 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1665 0xf2000100, 0xfe800f10,
1666 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1667 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1668 0xf2000200, 0xfe800f10,
1669 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1670 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1671 0xf2000210, 0xfe800f10,
1672 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1673 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1674 0xf2000300, 0xfe800f10,
1675 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1676 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1677 0xf2000310, 0xfe800f10,
1678 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1679 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1680 0xf2000400, 0xfe800f10,
1681 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1682 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1683 0xf2000410, 0xfe800f10,
1684 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1685 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1686 0xf2000500, 0xfe800f10,
1687 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1688 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1689 0xf2000510, 0xfe800f10,
1690 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1691 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1692 0xf2000600, 0xfe800f10,
1693 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1694 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1695 0xf2000610, 0xfe800f10,
1696 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1697 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1698 0xf2000700, 0xfe800f10,
1699 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1700 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1701 0xf2000710, 0xfe800f10,
1702 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1703 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1704 0xf2000910, 0xfe800f10,
1705 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1706 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1707 0xf2000a00, 0xfe800f10,
1708 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1709 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1710 0xf2000a10, 0xfe800f10,
1711 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1712 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1713 0xf3000b10, 0xff800f10,
1714 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1715 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1716 0xf3000c10, 0xff800f10,
1717 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1719 /* One register and an immediate value. */
1720 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1721 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
1722 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1723 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
1724 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1725 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
1726 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1727 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
1728 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1729 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
1730 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1731 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
1732 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1733 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
1734 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1735 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
1736 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1737 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
1738 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1739 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
1740 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1741 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
1742 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1743 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
1744 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1745 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
1747 /* Two registers and a shift amount. */
1748 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1749 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1750 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1751 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1752 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1753 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1754 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1755 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1756 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1757 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1758 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1759 0xf2880950, 0xfeb80fd0,
1760 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1761 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1762 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
1763 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1764 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1765 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1766 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1767 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1768 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1769 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1770 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
1771 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1772 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
1773 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1774 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
1775 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1776 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1777 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1778 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1779 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1780 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1781 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1782 0xf2900950, 0xfeb00fd0,
1783 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1784 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1785 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
1786 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1787 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1788 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1789 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1790 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1791 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1792 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1793 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1794 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1795 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1796 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1797 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1798 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1799 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1800 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1801 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1802 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1803 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
1804 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1805 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
1806 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1807 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
1808 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1809 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
1810 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1811 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1812 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1813 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1814 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1815 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1816 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1817 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1818 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1819 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1820 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1821 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1822 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1823 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1824 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1825 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1826 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1827 0xf2a00950, 0xfea00fd0,
1828 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1829 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1830 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1831 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1832 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
1833 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1834 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
1835 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1836 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
1837 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1838 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1839 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1840 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1841 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1842 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1843 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1844 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1845 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1846 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1847 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1848 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1849 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1850 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
1851 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1852 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
1853 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1854 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
1855 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1856 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1857 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1858 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1859 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1860 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1861 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1862 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1863 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1864 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1865 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1866 0xf2a00e10, 0xfea00e90,
1867 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
1868 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1869 0xf2a00c10, 0xfea00e90,
1870 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
1872 /* Three registers of different lengths. */
1873 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1874 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1875 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1876 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1877 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1878 0xf2800400, 0xff800f50,
1879 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1880 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1881 0xf2800600, 0xff800f50,
1882 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1883 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1884 0xf2800900, 0xff800f50,
1885 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1886 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1887 0xf2800b00, 0xff800f50,
1888 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1889 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1890 0xf2800d00, 0xff800f50,
1891 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1892 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1893 0xf3800400, 0xff800f50,
1894 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1895 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1896 0xf3800600, 0xff800f50,
1897 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1898 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1899 0xf2800000, 0xfe800f50,
1900 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1901 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1902 0xf2800100, 0xfe800f50,
1903 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1904 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1905 0xf2800200, 0xfe800f50,
1906 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1907 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1908 0xf2800300, 0xfe800f50,
1909 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1910 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1911 0xf2800500, 0xfe800f50,
1912 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1913 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1914 0xf2800700, 0xfe800f50,
1915 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1916 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1917 0xf2800800, 0xfe800f50,
1918 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1919 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1920 0xf2800a00, 0xfe800f50,
1921 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1922 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1923 0xf2800c00, 0xfe800f50,
1924 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1926 /* Two registers and a scalar. */
1927 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1928 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1929 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1930 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1931 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1932 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
1933 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1934 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1935 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1936 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1937 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1938 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1939 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1940 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
1941 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1942 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1943 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1944 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1945 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1946 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1947 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1948 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
1949 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1950 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1951 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1952 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1953 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1954 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1955 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1956 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1957 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1958 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1959 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1960 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1961 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1962 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1963 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1964 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1965 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1966 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1967 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1968 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1969 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1970 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1971 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1972 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1973 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1974 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1975 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1976 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1977 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1978 0xf2800240, 0xfe800f50,
1979 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1980 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1981 0xf2800640, 0xfe800f50,
1982 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1983 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1984 0xf2800a40, 0xfe800f50,
1985 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1986 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1987 0xf2800e40, 0xff800f50,
1988 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1989 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1990 0xf2800f40, 0xff800f50,
1991 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1992 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1993 0xf3800e40, 0xff800f50,
1994 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1995 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1996 0xf3800f40, 0xff800f50,
1997 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
2000 /* Element and structure load/store. */
2001 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2002 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
2003 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2004 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
2005 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2006 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
2007 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2008 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
2009 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2010 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
2011 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2012 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2013 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2014 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2015 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2016 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2017 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2018 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2019 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2020 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2021 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2022 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2023 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2024 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2025 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2026 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2027 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2028 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2029 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2030 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
2031 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2032 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
2033 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2034 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
2035 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2036 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
2037 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2038 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
2040 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
2043 /* mve opcode table. */
2045 /* print_insn_mve recognizes the following format control codes:
2049 %a print '+' or '-' or imm offset in vldr[bhwd] and
2051 %c print condition code
2052 %d print addr mode of MVE vldr[bhw] and vstr[bhw]
2053 %u print 'U' (unsigned) or 'S' for various mve instructions
2054 %i print MVE predicate(s) for vpt and vpst
2055 %j print a 5-bit immediate from hw2[14:12,7:6]
2056 %m print rounding mode for vcvt and vrint
2057 %n print vector comparison code for predicated instruction
2058 %s print size for various vcvt instructions
2059 %v print vector predicate for instruction in predicated
2061 %o print offset scaled for vldr[hwd] and vstr[hwd]
2062 %w print writeback mode for MVE v{st,ld}[24]
2063 %B print v{st,ld}[24] any one operands
2064 %E print vmov, vmvn, vorr, vbic encoded constant
2065 %N print generic index for vmov
2066 %T print bottom ('b') or top ('t') of source register
2067 %X print exchange field in vmla* instructions
2069 %<bitfield>r print as an ARM register
2070 %<bitfield>d print the bitfield in decimal
2071 %<bitfield>A print accumulate or not
2072 %<bitfield>c print bitfield as a condition code
2073 %<bitfield>C print bitfield as an inverted condition code
2074 %<bitfield>Q print as a MVE Q register
2075 %<bitfield>F print as a MVE S register
2076 %<bitfield>Z as %<>r but r15 is ZR instead of PC and r13 is
2079 %<bitfield>S as %<>r but r15 or r13 is UNPREDICTABLE
2080 %<bitfield>s print size for vector predicate & non VMOV instructions
2081 %<bitfield>I print carry flag or not
2082 %<bitfield>i print immediate for vstr/vldr reg +/- imm
2083 %<bitfield>h print high half of 64-bit destination reg
2084 %<bitfield>k print immediate for vector conversion instruction
2085 %<bitfield>l print low half of 64-bit destination reg
2086 %<bitfield>o print rotate value for vcmul
2087 %<bitfield>u print immediate value for vddup/vdwdup
2088 %<bitfield>x print the bitfield in hex.
2091 static const struct mopcode32 mve_opcodes
[] =
2095 {ARM_FEATURE_COPROC (FPU_MVE
),
2097 0xfe310f4d, 0xffbf1fff,
2101 /* Floating point VPT T1. */
2102 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2104 0xee310f00, 0xefb10f50,
2105 "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
2106 /* Floating point VPT T2. */
2107 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2109 0xee310f40, 0xefb10f50,
2110 "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
2112 /* Vector VPT T1. */
2113 {ARM_FEATURE_COPROC (FPU_MVE
),
2115 0xfe010f00, 0xff811f51,
2116 "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2117 /* Vector VPT T2. */
2118 {ARM_FEATURE_COPROC (FPU_MVE
),
2120 0xfe010f01, 0xff811f51,
2121 "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2122 /* Vector VPT T3. */
2123 {ARM_FEATURE_COPROC (FPU_MVE
),
2125 0xfe011f00, 0xff811f50,
2126 "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2127 /* Vector VPT T4. */
2128 {ARM_FEATURE_COPROC (FPU_MVE
),
2130 0xfe010f40, 0xff811f70,
2131 "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
2132 /* Vector VPT T5. */
2133 {ARM_FEATURE_COPROC (FPU_MVE
),
2135 0xfe010f60, 0xff811f70,
2136 "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
2137 /* Vector VPT T6. */
2138 {ARM_FEATURE_COPROC (FPU_MVE
),
2140 0xfe011f40, 0xff811f50,
2141 "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
2143 /* Vector VBIC immediate. */
2144 {ARM_FEATURE_COPROC (FPU_MVE
),
2146 0xef800070, 0xefb81070,
2147 "vbic%v.i%8-11s\t%13-15,22Q, %E"},
2149 /* Vector VBIC register. */
2150 {ARM_FEATURE_COPROC (FPU_MVE
),
2152 0xef100150, 0xffb11f51,
2153 "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2156 {ARM_FEATURE_COPROC (FPU_MVE
),
2158 0xee800f01, 0xefc10f51,
2159 "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
2161 /* Vector VABD floating point. */
2162 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2164 0xff200d40, 0xffa11f51,
2165 "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2168 {ARM_FEATURE_COPROC (FPU_MVE
),
2170 0xef000740, 0xef811f51,
2171 "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2173 /* Vector VABS floating point. */
2174 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2176 0xFFB10740, 0xFFB31FD1,
2177 "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2179 {ARM_FEATURE_COPROC (FPU_MVE
),
2181 0xffb10340, 0xffb31fd1,
2182 "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2184 /* Vector VADD floating point T1. */
2185 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2187 0xef000d40, 0xffa11f51,
2188 "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2189 /* Vector VADD floating point T2. */
2190 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2192 0xee300f40, 0xefb11f70,
2193 "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2194 /* Vector VADD T1. */
2195 {ARM_FEATURE_COPROC (FPU_MVE
),
2197 0xef000840, 0xff811f51,
2198 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2199 /* Vector VADD T2. */
2200 {ARM_FEATURE_COPROC (FPU_MVE
),
2202 0xee010f40, 0xff811f70,
2203 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2205 /* Vector VADDLV. */
2206 {ARM_FEATURE_COPROC (FPU_MVE
),
2208 0xee890f00, 0xef8f1fd1,
2209 "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
2212 {ARM_FEATURE_COPROC (FPU_MVE
),
2214 0xeef10f00, 0xeff31fd1,
2215 "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
2218 {ARM_FEATURE_COPROC (FPU_MVE
),
2220 0xee300f00, 0xffb10f51,
2221 "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2224 {ARM_FEATURE_COPROC (FPU_MVE
),
2226 0xef000150, 0xffb11f51,
2227 "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2229 /* Vector VBRSR register. */
2230 {ARM_FEATURE_COPROC (FPU_MVE
),
2232 0xfe011e60, 0xff811f70,
2233 "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2235 /* Vector VCADD floating point. */
2236 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2238 0xfc800840, 0xfea11f51,
2239 "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"},
2242 {ARM_FEATURE_COPROC (FPU_MVE
),
2244 0xfe000f00, 0xff810f51,
2245 "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2248 {ARM_FEATURE_COPROC (FPU_MVE
),
2250 0xffb00440, 0xffb31fd1,
2251 "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2254 {ARM_FEATURE_COPROC (FPU_MVE
),
2256 0xffb004c0, 0xffb31fd1,
2257 "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2260 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2262 0xfc200840, 0xfe211f51,
2263 "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"},
2265 /* Vector VCMP floating point T1. */
2266 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2268 0xee310f00, 0xeff1ef50,
2269 "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
2271 /* Vector VCMP floating point T2. */
2272 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2274 0xee310f40, 0xeff1ef50,
2275 "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
2277 /* Vector VCMP T1. */
2278 {ARM_FEATURE_COPROC (FPU_MVE
),
2280 0xfe010f00, 0xffc1ff51,
2281 "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2282 /* Vector VCMP T2. */
2283 {ARM_FEATURE_COPROC (FPU_MVE
),
2285 0xfe010f01, 0xffc1ff51,
2286 "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2287 /* Vector VCMP T3. */
2288 {ARM_FEATURE_COPROC (FPU_MVE
),
2290 0xfe011f00, 0xffc1ff50,
2291 "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2292 /* Vector VCMP T4. */
2293 {ARM_FEATURE_COPROC (FPU_MVE
),
2295 0xfe010f40, 0xffc1ff70,
2296 "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
2297 /* Vector VCMP T5. */
2298 {ARM_FEATURE_COPROC (FPU_MVE
),
2300 0xfe010f60, 0xffc1ff70,
2301 "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
2302 /* Vector VCMP T6. */
2303 {ARM_FEATURE_COPROC (FPU_MVE
),
2305 0xfe011f40, 0xffc1ff50,
2306 "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
2309 {ARM_FEATURE_COPROC (FPU_MVE
),
2311 0xeea00b10, 0xffb10f5f,
2312 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2315 {ARM_FEATURE_COPROC (FPU_MVE
),
2317 0xff000150, 0xffd11f51,
2318 "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2320 /* Vector VFMA, vector * scalar. */
2321 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2323 0xee310e40, 0xefb11f70,
2324 "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2326 /* Vector VFMA floating point. */
2327 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2329 0xef000c50, 0xffa11f51,
2330 "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2332 /* Vector VFMS floating point. */
2333 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2335 0xef200c50, 0xffa11f51,
2336 "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2338 /* Vector VFMAS, vector * scalar. */
2339 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2340 MVE_VFMAS_FP_SCALAR
,
2341 0xee311e40, 0xefb11f70,
2342 "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2344 /* Vector VHADD T1. */
2345 {ARM_FEATURE_COPROC (FPU_MVE
),
2347 0xef000040, 0xef811f51,
2348 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2350 /* Vector VHADD T2. */
2351 {ARM_FEATURE_COPROC (FPU_MVE
),
2353 0xee000f40, 0xef811f70,
2354 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2356 /* Vector VHSUB T1. */
2357 {ARM_FEATURE_COPROC (FPU_MVE
),
2359 0xef000240, 0xef811f51,
2360 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2362 /* Vector VHSUB T2. */
2363 {ARM_FEATURE_COPROC (FPU_MVE
),
2365 0xee001f40, 0xef811f70,
2366 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2369 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2371 0xee300e00, 0xefb10f50,
2372 "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"},
2375 {ARM_FEATURE_COPROC (FPU_MVE
),
2377 0xf000e801, 0xffc0ffff,
2378 "vctp%v.%20-21s\t%16-19r"},
2381 {ARM_FEATURE_COPROC (FPU_MVE
),
2383 0xeea00b10, 0xffb10f5f,
2384 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2386 /* Vector VRHADD. */
2387 {ARM_FEATURE_COPROC (FPU_MVE
),
2389 0xef000140, 0xef811f51,
2390 "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2393 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2394 MVE_VCVT_FP_FIX_VEC
,
2395 0xef800c50, 0xef801cd1,
2396 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"},
2399 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2400 MVE_VCVT_BETWEEN_FP_INT
,
2401 0xffb30640, 0xffb31e51,
2402 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
2404 /* Vector VCVT between single and half-precision float, bottom half. */
2405 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2406 MVE_VCVT_FP_HALF_FP
,
2407 0xee3f0e01, 0xefbf1fd1,
2408 "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
2410 /* Vector VCVT between single and half-precision float, top half. */
2411 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2412 MVE_VCVT_FP_HALF_FP
,
2413 0xee3f1e01, 0xefbf1fd1,
2414 "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
2417 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2418 MVE_VCVT_FROM_FP_TO_INT
,
2419 0xffb30040, 0xffb31c51,
2420 "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
2423 {ARM_FEATURE_COPROC (FPU_MVE
),
2425 0xee011f6e, 0xff811f7e,
2426 "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2428 /* Vector VDWDUP. */
2429 {ARM_FEATURE_COPROC (FPU_MVE
),
2431 0xee011f60, 0xff811f70,
2432 "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2434 /* Vector VHCADD. */
2435 {ARM_FEATURE_COPROC (FPU_MVE
),
2437 0xee000f00, 0xff810f51,
2438 "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2440 /* Vector VIWDUP. */
2441 {ARM_FEATURE_COPROC (FPU_MVE
),
2443 0xee010f60, 0xff811f70,
2444 "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2447 {ARM_FEATURE_COPROC (FPU_MVE
),
2449 0xee010f6e, 0xff811f7e,
2450 "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2453 {ARM_FEATURE_COPROC (FPU_MVE
),
2455 0xfc901e00, 0xff901e5f,
2456 "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
2459 {ARM_FEATURE_COPROC (FPU_MVE
),
2461 0xfc901e01, 0xff901e1f,
2462 "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
2464 /* Vector VLDRB gather load. */
2465 {ARM_FEATURE_COPROC (FPU_MVE
),
2466 MVE_VLDRB_GATHER_T1
,
2467 0xec900e00, 0xefb01e50,
2468 "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
2470 /* Vector VLDRH gather load. */
2471 {ARM_FEATURE_COPROC (FPU_MVE
),
2472 MVE_VLDRH_GATHER_T2
,
2473 0xec900e10, 0xefb01e50,
2474 "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2476 /* Vector VLDRW gather load. */
2477 {ARM_FEATURE_COPROC (FPU_MVE
),
2478 MVE_VLDRW_GATHER_T3
,
2479 0xfc900f40, 0xffb01fd0,
2480 "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2482 /* Vector VLDRD gather load. */
2483 {ARM_FEATURE_COPROC (FPU_MVE
),
2484 MVE_VLDRD_GATHER_T4
,
2485 0xec900fd0, 0xefb01fd0,
2486 "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2488 /* Vector VLDRW gather load. */
2489 {ARM_FEATURE_COPROC (FPU_MVE
),
2490 MVE_VLDRW_GATHER_T5
,
2491 0xfd101e00, 0xff111f00,
2492 "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2494 /* Vector VLDRD gather load, variant T6. */
2495 {ARM_FEATURE_COPROC (FPU_MVE
),
2496 MVE_VLDRD_GATHER_T6
,
2497 0xfd101f00, 0xff111f00,
2498 "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2501 {ARM_FEATURE_COPROC (FPU_MVE
),
2503 0xec100e00, 0xee581e00,
2504 "vldrb%v.%u%7-8s\t%13-15Q, %d"},
2507 {ARM_FEATURE_COPROC (FPU_MVE
),
2509 0xec180e00, 0xee581e00,
2510 "vldrh%v.%u%7-8s\t%13-15Q, %d"},
2512 /* Vector VLDRB unsigned, variant T5. */
2513 {ARM_FEATURE_COPROC (FPU_MVE
),
2515 0xec101e00, 0xfe101f80,
2516 "vldrb%v.u8\t%13-15,22Q, %d"},
2518 /* Vector VLDRH unsigned, variant T6. */
2519 {ARM_FEATURE_COPROC (FPU_MVE
),
2521 0xec101e80, 0xfe101f80,
2522 "vldrh%v.u16\t%13-15,22Q, %d"},
2524 /* Vector VLDRW unsigned, variant T7. */
2525 {ARM_FEATURE_COPROC (FPU_MVE
),
2527 0xec101f00, 0xfe101f80,
2528 "vldrw%v.u32\t%13-15,22Q, %d"},
2531 {ARM_FEATURE_COPROC (FPU_MVE
),
2533 0xef000640, 0xef811f51,
2534 "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2537 {ARM_FEATURE_COPROC (FPU_MVE
),
2539 0xee330e81, 0xffb31fd1,
2540 "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2542 /* Vector VMAXNM floating point. */
2543 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2545 0xff000f50, 0xffa11f51,
2546 "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2548 /* Vector VMAXNMA floating point. */
2549 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2551 0xee3f0e81, 0xefbf1fd1,
2552 "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2554 /* Vector VMAXNMV floating point. */
2555 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2557 0xeeee0f00, 0xefff0fd1,
2558 "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2560 /* Vector VMAXNMAV floating point. */
2561 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2563 0xeeec0f00, 0xefff0fd1,
2564 "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2567 {ARM_FEATURE_COPROC (FPU_MVE
),
2569 0xeee20f00, 0xeff30fd1,
2570 "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2572 /* Vector VMAXAV. */
2573 {ARM_FEATURE_COPROC (FPU_MVE
),
2575 0xeee00f00, 0xfff30fd1,
2576 "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2579 {ARM_FEATURE_COPROC (FPU_MVE
),
2581 0xef000650, 0xef811f51,
2582 "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2585 {ARM_FEATURE_COPROC (FPU_MVE
),
2587 0xee331e81, 0xffb31fd1,
2588 "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2590 /* Vector VMINNM floating point. */
2591 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2593 0xff200f50, 0xffa11f51,
2594 "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2596 /* Vector VMINNMA floating point. */
2597 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2599 0xee3f1e81, 0xefbf1fd1,
2600 "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2602 /* Vector VMINNMV floating point. */
2603 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2605 0xeeee0f80, 0xefff0fd1,
2606 "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2608 /* Vector VMINNMAV floating point. */
2609 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2611 0xeeec0f80, 0xefff0fd1,
2612 "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2615 {ARM_FEATURE_COPROC (FPU_MVE
),
2617 0xeee20f80, 0xeff30fd1,
2618 "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2620 /* Vector VMINAV. */
2621 {ARM_FEATURE_COPROC (FPU_MVE
),
2623 0xeee00f80, 0xfff30fd1,
2624 "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2627 {ARM_FEATURE_COPROC (FPU_MVE
),
2629 0xee010e40, 0xef811f70,
2630 "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2632 /* Vector VMLALDAV. Note must appear before VMLADAV due to instruction
2634 {ARM_FEATURE_COPROC (FPU_MVE
),
2636 0xee801e00, 0xef801f51,
2637 "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2639 {ARM_FEATURE_COPROC (FPU_MVE
),
2641 0xee800e00, 0xef801f51,
2642 "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2644 /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0. */
2645 {ARM_FEATURE_COPROC (FPU_MVE
),
2647 0xeef00e00, 0xeff01f51,
2648 "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2650 /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0. */
2651 {ARM_FEATURE_COPROC (FPU_MVE
),
2653 0xeef00f00, 0xeff11f51,
2654 "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2656 /* Vector VMLADAV T1 variant. */
2657 {ARM_FEATURE_COPROC (FPU_MVE
),
2659 0xeef01e00, 0xeff01f51,
2660 "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2662 /* Vector VMLADAV T2 variant. */
2663 {ARM_FEATURE_COPROC (FPU_MVE
),
2665 0xeef01f00, 0xeff11f51,
2666 "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2669 {ARM_FEATURE_COPROC (FPU_MVE
),
2671 0xee011e40, 0xef811f70,
2672 "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2674 /* Vector VRMLSLDAVH. Note must appear before VMLSDAV due to instruction
2676 {ARM_FEATURE_COPROC (FPU_MVE
),
2678 0xfe800e01, 0xff810f51,
2679 "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2681 /* Vector VMLSLDAV. Note must appear before VMLSDAV due to instruction
2683 {ARM_FEATURE_COPROC (FPU_MVE
),
2685 0xee800e01, 0xff800f51,
2686 "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2688 /* Vector VMLSDAV T1 Variant. */
2689 {ARM_FEATURE_COPROC (FPU_MVE
),
2691 0xeef00e01, 0xfff00f51,
2692 "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2694 /* Vector VMLSDAV T2 Variant. */
2695 {ARM_FEATURE_COPROC (FPU_MVE
),
2697 0xfef00e01, 0xfff10f51,
2698 "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
2700 /* Vector VMOV between gpr and half precision register, op == 0. */
2701 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2703 0xee000910, 0xfff00f7f,
2704 "vmov.f16\t%7,16-19F, %12-15r"},
2706 /* Vector VMOV between gpr and half precision register, op == 1. */
2707 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2709 0xee100910, 0xfff00f7f,
2710 "vmov.f16\t%12-15r, %7,16-19F"},
2712 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2713 MVE_VMOV_GP_TO_VEC_LANE
,
2714 0xee000b10, 0xff900f1f,
2715 "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"},
2717 /* Vector VORR immediate to vector.
2718 NOTE: MVE_VORR_IMM must appear in the table
2719 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2720 {ARM_FEATURE_COPROC (FPU_MVE
),
2722 0xef800050, 0xefb810f0,
2723 "vorr%v.i%8-11s\t%13-15,22Q, %E"},
2725 /* Vector VQSHL T2 Variant.
2726 NOTE: MVE_VQSHL_T2 must appear in the table before
2727 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2728 {ARM_FEATURE_COPROC (FPU_MVE
),
2730 0xef800750, 0xef801fd1,
2731 "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2733 /* Vector VQSHLU T3 Variant
2734 NOTE: MVE_VQSHL_T2 must appear in the table before
2735 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2737 {ARM_FEATURE_COPROC (FPU_MVE
),
2739 0xff800650, 0xff801fd1,
2740 "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2743 NOTE: MVE_VRSHR must appear in the table before
2744 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2745 {ARM_FEATURE_COPROC (FPU_MVE
),
2747 0xef800250, 0xef801fd1,
2748 "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2751 NOTE: MVE_VSHL must appear in the table before
2752 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2753 {ARM_FEATURE_COPROC (FPU_MVE
),
2755 0xef800550, 0xff801fd1,
2756 "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2759 NOTE: MVE_VSHR must appear in the table before
2760 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2761 {ARM_FEATURE_COPROC (FPU_MVE
),
2763 0xef800050, 0xef801fd1,
2764 "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2767 NOTE: MVE_VSLI must appear in the table before
2768 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2769 {ARM_FEATURE_COPROC (FPU_MVE
),
2771 0xff800550, 0xff801fd1,
2772 "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2775 NOTE: MVE_VSRI must appear in the table before
2776 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2777 {ARM_FEATURE_COPROC (FPU_MVE
),
2779 0xff800450, 0xff801fd1,
2780 "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2782 /* Vector VMOV immediate to vector,
2783 cmode == 11x1 -> VMVN which is UNDEFINED
2784 for such a cmode. */
2785 {ARM_FEATURE_COPROC (FPU_MVE
),
2786 MVE_VMVN_IMM
, 0xef800d50, 0xefb81dd0, UNDEFINED_INSTRUCTION
},
2788 /* Vector VMOV immediate to vector. */
2789 {ARM_FEATURE_COPROC (FPU_MVE
),
2790 MVE_VMOV_IMM_TO_VEC
,
2791 0xef800050, 0xefb810d0,
2792 "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2794 /* Vector VMOV two 32-bit lanes to two gprs, idx = 0. */
2795 {ARM_FEATURE_COPROC (FPU_MVE
),
2796 MVE_VMOV2_VEC_LANE_TO_GP
,
2797 0xec000f00, 0xffb01ff0,
2798 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"},
2800 /* Vector VMOV two 32-bit lanes to two gprs, idx = 1. */
2801 {ARM_FEATURE_COPROC (FPU_MVE
),
2802 MVE_VMOV2_VEC_LANE_TO_GP
,
2803 0xec000f10, 0xffb01ff0,
2804 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"},
2806 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0. */
2807 {ARM_FEATURE_COPROC (FPU_MVE
),
2808 MVE_VMOV2_GP_TO_VEC_LANE
,
2809 0xec100f00, 0xffb01ff0,
2810 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2812 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1. */
2813 {ARM_FEATURE_COPROC (FPU_MVE
),
2814 MVE_VMOV2_GP_TO_VEC_LANE
,
2815 0xec100f10, 0xffb01ff0,
2816 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2818 /* Vector VMOV Vector lane to gpr. */
2819 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2820 MVE_VMOV_VEC_LANE_TO_GP
,
2821 0xee100b10, 0xff100f1f,
2822 "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
2824 /* Vector VSHLL T1 Variant. Note: VSHLL T1 must appear before MVE_VMOVL due
2825 to instruction opcode aliasing. */
2826 {ARM_FEATURE_COPROC (FPU_MVE
),
2828 0xeea00f40, 0xefa00fd1,
2829 "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2831 /* Vector VMOVL long. */
2832 {ARM_FEATURE_COPROC (FPU_MVE
),
2834 0xeea00f40, 0xefa70fd1,
2835 "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
2837 /* Vector VMOV and narrow. */
2838 {ARM_FEATURE_COPROC (FPU_MVE
),
2840 0xfe310e81, 0xffb30fd1,
2841 "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2843 /* Floating point move extract. */
2844 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2846 0xfeb00a40, 0xffbf0fd0,
2847 "vmovx.f16\t%22,12-15F, %5,0-3F"},
2849 /* Vector VMUL floating-point T1 variant. */
2850 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2852 0xff000d50, 0xffa11f51,
2853 "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2855 /* Vector VMUL floating-point T2 variant. */
2856 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2858 0xee310e60, 0xefb11f70,
2859 "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2861 /* Vector VMUL T1 variant. */
2862 {ARM_FEATURE_COPROC (FPU_MVE
),
2864 0xef000950, 0xff811f51,
2865 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2867 /* Vector VMUL T2 variant. */
2868 {ARM_FEATURE_COPROC (FPU_MVE
),
2870 0xee011e60, 0xff811f70,
2871 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2874 {ARM_FEATURE_COPROC (FPU_MVE
),
2876 0xee010e01, 0xef811f51,
2877 "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2879 /* Vector VRMULH. */
2880 {ARM_FEATURE_COPROC (FPU_MVE
),
2882 0xee011e01, 0xef811f51,
2883 "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2885 /* Vector VMULL integer. */
2886 {ARM_FEATURE_COPROC (FPU_MVE
),
2888 0xee010e00, 0xef810f51,
2889 "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2891 /* Vector VMULL polynomial. */
2892 {ARM_FEATURE_COPROC (FPU_MVE
),
2894 0xee310e00, 0xefb10f51,
2895 "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2897 /* Vector VMVN immediate to vector. */
2898 {ARM_FEATURE_COPROC (FPU_MVE
),
2900 0xef800070, 0xefb810f0,
2901 "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
2903 /* Vector VMVN register. */
2904 {ARM_FEATURE_COPROC (FPU_MVE
),
2906 0xffb005c0, 0xffbf1fd1,
2907 "vmvn%v\t%13-15,22Q, %1-3,5Q"},
2909 /* Vector VNEG floating point. */
2910 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2912 0xffb107c0, 0xffb31fd1,
2913 "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2916 {ARM_FEATURE_COPROC (FPU_MVE
),
2918 0xffb103c0, 0xffb31fd1,
2919 "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2921 /* Vector VORN, vector bitwise or not. */
2922 {ARM_FEATURE_COPROC (FPU_MVE
),
2924 0xef300150, 0xffb11f51,
2925 "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2927 /* Vector VORR register. */
2928 {ARM_FEATURE_COPROC (FPU_MVE
),
2930 0xef200150, 0xffb11f51,
2931 "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2933 /* Vector VQDMULL T1 variant. */
2934 {ARM_FEATURE_COPROC (FPU_MVE
),
2936 0xee300f01, 0xefb10f51,
2937 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2940 {ARM_FEATURE_COPROC (FPU_MVE
),
2942 0xfe310f4d, 0xffffffff,
2946 {ARM_FEATURE_COPROC (FPU_MVE
),
2948 0xfe310f01, 0xffb11f51,
2949 "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2952 {ARM_FEATURE_COPROC (FPU_MVE
),
2954 0xffb00740, 0xffb31fd1,
2955 "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2957 /* Vector VQADD T1 variant. */
2958 {ARM_FEATURE_COPROC (FPU_MVE
),
2960 0xef000050, 0xef811f51,
2961 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2963 /* Vector VQADD T2 variant. */
2964 {ARM_FEATURE_COPROC (FPU_MVE
),
2966 0xee000f60, 0xef811f70,
2967 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2969 /* Vector VQDMULL T2 variant. */
2970 {ARM_FEATURE_COPROC (FPU_MVE
),
2972 0xee300f60, 0xefb10f70,
2973 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2975 /* Vector VQMOVN. */
2976 {ARM_FEATURE_COPROC (FPU_MVE
),
2978 0xee330e01, 0xefb30fd1,
2979 "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
2981 /* Vector VQMOVUN. */
2982 {ARM_FEATURE_COPROC (FPU_MVE
),
2984 0xee310e81, 0xffb30fd1,
2985 "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2987 /* Vector VQDMLADH. */
2988 {ARM_FEATURE_COPROC (FPU_MVE
),
2990 0xee000e00, 0xff810f51,
2991 "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2993 /* Vector VQRDMLADH. */
2994 {ARM_FEATURE_COPROC (FPU_MVE
),
2996 0xee000e01, 0xff810f51,
2997 "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2999 /* Vector VQDMLAH. */
3000 {ARM_FEATURE_COPROC (FPU_MVE
),
3002 0xee000e60, 0xef811f70,
3003 "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3005 /* Vector VQRDMLAH. */
3006 {ARM_FEATURE_COPROC (FPU_MVE
),
3008 0xee000e40, 0xef811f70,
3009 "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3011 /* Vector VQDMLASH. */
3012 {ARM_FEATURE_COPROC (FPU_MVE
),
3014 0xee001e60, 0xef811f70,
3015 "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3017 /* Vector VQRDMLASH. */
3018 {ARM_FEATURE_COPROC (FPU_MVE
),
3020 0xee001e40, 0xef811f70,
3021 "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3023 /* Vector VQDMLSDH. */
3024 {ARM_FEATURE_COPROC (FPU_MVE
),
3026 0xfe000e00, 0xff810f51,
3027 "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3029 /* Vector VQRDMLSDH. */
3030 {ARM_FEATURE_COPROC (FPU_MVE
),
3032 0xfe000e01, 0xff810f51,
3033 "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3035 /* Vector VQDMULH T1 variant. */
3036 {ARM_FEATURE_COPROC (FPU_MVE
),
3038 0xef000b40, 0xff811f51,
3039 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3041 /* Vector VQRDMULH T2 variant. */
3042 {ARM_FEATURE_COPROC (FPU_MVE
),
3044 0xff000b40, 0xff811f51,
3045 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3047 /* Vector VQDMULH T3 variant. */
3048 {ARM_FEATURE_COPROC (FPU_MVE
),
3050 0xee010e60, 0xff811f70,
3051 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3053 /* Vector VQRDMULH T4 variant. */
3054 {ARM_FEATURE_COPROC (FPU_MVE
),
3056 0xfe010e60, 0xff811f70,
3057 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3060 {ARM_FEATURE_COPROC (FPU_MVE
),
3062 0xffb007c0, 0xffb31fd1,
3063 "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3065 /* Vector VQRSHL T1 variant. */
3066 {ARM_FEATURE_COPROC (FPU_MVE
),
3068 0xef000550, 0xef811f51,
3069 "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3071 /* Vector VQRSHL T2 variant. */
3072 {ARM_FEATURE_COPROC (FPU_MVE
),
3074 0xee331ee0, 0xefb31ff0,
3075 "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3077 /* Vector VQRSHRN. */
3078 {ARM_FEATURE_COPROC (FPU_MVE
),
3080 0xee800f41, 0xefa00fd1,
3081 "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3083 /* Vector VQRSHRUN. */
3084 {ARM_FEATURE_COPROC (FPU_MVE
),
3086 0xfe800fc0, 0xffa00fd1,
3087 "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3089 /* Vector VQSHL T1 Variant. */
3090 {ARM_FEATURE_COPROC (FPU_MVE
),
3092 0xee311ee0, 0xefb31ff0,
3093 "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3095 /* Vector VQSHL T4 Variant. */
3096 {ARM_FEATURE_COPROC (FPU_MVE
),
3098 0xef000450, 0xef811f51,
3099 "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3101 /* Vector VQSHRN. */
3102 {ARM_FEATURE_COPROC (FPU_MVE
),
3104 0xee800f40, 0xefa00fd1,
3105 "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3107 /* Vector VQSHRUN. */
3108 {ARM_FEATURE_COPROC (FPU_MVE
),
3110 0xee800fc0, 0xffa00fd1,
3111 "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3113 /* Vector VQSUB T1 Variant. */
3114 {ARM_FEATURE_COPROC (FPU_MVE
),
3116 0xef000250, 0xef811f51,
3117 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3119 /* Vector VQSUB T2 Variant. */
3120 {ARM_FEATURE_COPROC (FPU_MVE
),
3122 0xee001f60, 0xef811f70,
3123 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3125 /* Vector VREV16. */
3126 {ARM_FEATURE_COPROC (FPU_MVE
),
3128 0xffb00140, 0xffb31fd1,
3129 "vrev16%v.8\t%13-15,22Q, %1-3,5Q"},
3131 /* Vector VREV32. */
3132 {ARM_FEATURE_COPROC (FPU_MVE
),
3134 0xffb000c0, 0xffb31fd1,
3135 "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3137 /* Vector VREV64. */
3138 {ARM_FEATURE_COPROC (FPU_MVE
),
3140 0xffb00040, 0xffb31fd1,
3141 "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3143 /* Vector VRINT floating point. */
3144 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3146 0xffb20440, 0xffb31c51,
3147 "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3149 /* Vector VRMLALDAVH. */
3150 {ARM_FEATURE_COPROC (FPU_MVE
),
3152 0xee800f00, 0xef811f51,
3153 "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3155 /* Vector VRMLALDAVH. */
3156 {ARM_FEATURE_COPROC (FPU_MVE
),
3158 0xee801f00, 0xef811f51,
3159 "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3161 /* Vector VRSHL T1 Variant. */
3162 {ARM_FEATURE_COPROC (FPU_MVE
),
3164 0xef000540, 0xef811f51,
3165 "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3167 /* Vector VRSHL T2 Variant. */
3168 {ARM_FEATURE_COPROC (FPU_MVE
),
3170 0xee331e60, 0xefb31ff0,
3171 "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3173 /* Vector VRSHRN. */
3174 {ARM_FEATURE_COPROC (FPU_MVE
),
3176 0xfe800fc1, 0xffa00fd1,
3177 "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3180 {ARM_FEATURE_COPROC (FPU_MVE
),
3182 0xfe300f00, 0xffb10f51,
3183 "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3185 /* Vector VSHL T2 Variant. */
3186 {ARM_FEATURE_COPROC (FPU_MVE
),
3188 0xee311e60, 0xefb31ff0,
3189 "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3191 /* Vector VSHL T3 Variant. */
3192 {ARM_FEATURE_COPROC (FPU_MVE
),
3194 0xef000440, 0xef811f51,
3195 "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3198 {ARM_FEATURE_COPROC (FPU_MVE
),
3200 0xeea00fc0, 0xffa01ff0,
3201 "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"},
3203 /* Vector VSHLL T2 Variant. */
3204 {ARM_FEATURE_COPROC (FPU_MVE
),
3206 0xee310e01, 0xefb30fd1,
3207 "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"},
3210 {ARM_FEATURE_COPROC (FPU_MVE
),
3212 0xee800fc1, 0xffa00fd1,
3213 "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3215 /* Vector VST2 no writeback. */
3216 {ARM_FEATURE_COPROC (FPU_MVE
),
3218 0xfc801e00, 0xffb01e5f,
3219 "vst2%5d.%7-8s\t%B, [%16-19r]"},
3221 /* Vector VST2 writeback. */
3222 {ARM_FEATURE_COPROC (FPU_MVE
),
3224 0xfca01e00, 0xffb01e5f,
3225 "vst2%5d.%7-8s\t%B, [%16-19r]!"},
3227 /* Vector VST4 no writeback. */
3228 {ARM_FEATURE_COPROC (FPU_MVE
),
3230 0xfc801e01, 0xffb01e1f,
3231 "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
3233 /* Vector VST4 writeback. */
3234 {ARM_FEATURE_COPROC (FPU_MVE
),
3236 0xfca01e01, 0xffb01e1f,
3237 "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
3239 /* Vector VSTRB scatter store, T1 variant. */
3240 {ARM_FEATURE_COPROC (FPU_MVE
),
3241 MVE_VSTRB_SCATTER_T1
,
3242 0xec800e00, 0xffb01e50,
3243 "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
3245 /* Vector VSTRH scatter store, T2 variant. */
3246 {ARM_FEATURE_COPROC (FPU_MVE
),
3247 MVE_VSTRH_SCATTER_T2
,
3248 0xec800e10, 0xffb01e50,
3249 "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3251 /* Vector VSTRW scatter store, T3 variant. */
3252 {ARM_FEATURE_COPROC (FPU_MVE
),
3253 MVE_VSTRW_SCATTER_T3
,
3254 0xec800e40, 0xffb01e50,
3255 "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3257 /* Vector VSTRD scatter store, T4 variant. */
3258 {ARM_FEATURE_COPROC (FPU_MVE
),
3259 MVE_VSTRD_SCATTER_T4
,
3260 0xec800fd0, 0xffb01fd0,
3261 "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3263 /* Vector VSTRW scatter store, T5 variant. */
3264 {ARM_FEATURE_COPROC (FPU_MVE
),
3265 MVE_VSTRW_SCATTER_T5
,
3266 0xfd001e00, 0xff111f00,
3267 "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3269 /* Vector VSTRD scatter store, T6 variant. */
3270 {ARM_FEATURE_COPROC (FPU_MVE
),
3271 MVE_VSTRD_SCATTER_T6
,
3272 0xfd001f00, 0xff111f00,
3273 "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3276 {ARM_FEATURE_COPROC (FPU_MVE
),
3278 0xec000e00, 0xfe581e00,
3279 "vstrb%v.%7-8s\t%13-15Q, %d"},
3282 {ARM_FEATURE_COPROC (FPU_MVE
),
3284 0xec080e00, 0xfe581e00,
3285 "vstrh%v.%7-8s\t%13-15Q, %d"},
3287 /* Vector VSTRB variant T5. */
3288 {ARM_FEATURE_COPROC (FPU_MVE
),
3290 0xec001e00, 0xfe101f80,
3291 "vstrb%v.8\t%13-15,22Q, %d"},
3293 /* Vector VSTRH variant T6. */
3294 {ARM_FEATURE_COPROC (FPU_MVE
),
3296 0xec001e80, 0xfe101f80,
3297 "vstrh%v.16\t%13-15,22Q, %d"},
3299 /* Vector VSTRW variant T7. */
3300 {ARM_FEATURE_COPROC (FPU_MVE
),
3302 0xec001f00, 0xfe101f80,
3303 "vstrw%v.32\t%13-15,22Q, %d"},
3305 /* Vector VSUB floating point T1 variant. */
3306 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3308 0xef200d40, 0xffa11f51,
3309 "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3311 /* Vector VSUB floating point T2 variant. */
3312 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3314 0xee301f40, 0xefb11f70,
3315 "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3317 /* Vector VSUB T1 variant. */
3318 {ARM_FEATURE_COPROC (FPU_MVE
),
3320 0xff000840, 0xff811f51,
3321 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3323 /* Vector VSUB T2 variant. */
3324 {ARM_FEATURE_COPROC (FPU_MVE
),
3326 0xee011f40, 0xff811f70,
3327 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3329 {ARM_FEATURE_COPROC (FPU_MVE
),
3331 0xea50012f, 0xfff1813f,
3332 "asrl%c\t%17-19l, %9-11h, %j"},
3334 {ARM_FEATURE_COPROC (FPU_MVE
),
3336 0xea50012d, 0xfff101ff,
3337 "asrl%c\t%17-19l, %9-11h, %12-15S"},
3339 {ARM_FEATURE_COPROC (FPU_MVE
),
3341 0xea50010f, 0xfff1813f,
3342 "lsll%c\t%17-19l, %9-11h, %j"},
3344 {ARM_FEATURE_COPROC (FPU_MVE
),
3346 0xea50010d, 0xfff101ff,
3347 "lsll%c\t%17-19l, %9-11h, %12-15S"},
3349 {ARM_FEATURE_COPROC (FPU_MVE
),
3351 0xea50011f, 0xfff1813f,
3352 "lsrl%c\t%17-19l, %9-11h, %j"},
3354 {ARM_FEATURE_COPROC (FPU_MVE
),
3356 0xea51012d, 0xfff101ff,
3357 "sqrshrl%c\t%17-19l, %9-11h, %12-15S"},
3359 {ARM_FEATURE_COPROC (FPU_MVE
),
3361 0xea500f2d, 0xfff00fff,
3362 "sqrshr%c\t%16-19S, %12-15S"},
3364 {ARM_FEATURE_COPROC (FPU_MVE
),
3366 0xea51013f, 0xfff1813f,
3367 "sqshll%c\t%17-19l, %9-11h, %j"},
3369 {ARM_FEATURE_COPROC (FPU_MVE
),
3371 0xea500f3f, 0xfff08f3f,
3372 "sqshl%c\t%16-19S, %j"},
3374 {ARM_FEATURE_COPROC (FPU_MVE
),
3376 0xea51012f, 0xfff1813f,
3377 "srshrl%c\t%17-19l, %9-11h, %j"},
3379 {ARM_FEATURE_COPROC (FPU_MVE
),
3381 0xea500f2f, 0xfff08f3f,
3382 "srshr%c\t%16-19S, %j"},
3384 {ARM_FEATURE_COPROC (FPU_MVE
),
3386 0xea51010d, 0xfff101ff,
3387 "uqrshll%c\t%17-19l, %9-11h, %12-15S"},
3389 {ARM_FEATURE_COPROC (FPU_MVE
),
3391 0xea500f0d, 0xfff00fff,
3392 "uqrshl%c\t%16-19S, %12-15S"},
3394 {ARM_FEATURE_COPROC (FPU_MVE
),
3396 0xea51010f, 0xfff1813f,
3397 "uqshll%c\t%17-19l, %9-11h, %j"},
3399 {ARM_FEATURE_COPROC (FPU_MVE
),
3401 0xea500f0f, 0xfff08f3f,
3402 "uqshl%c\t%16-19S, %j"},
3404 {ARM_FEATURE_COPROC (FPU_MVE
),
3406 0xea51011f, 0xfff1813f,
3407 "urshrl%c\t%17-19l, %9-11h, %j"},
3409 {ARM_FEATURE_COPROC (FPU_MVE
),
3411 0xea500f1f, 0xfff08f3f,
3412 "urshr%c\t%16-19S, %j"},
3414 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3416 0xea509000, 0xfff0f000,
3417 "csinc\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3419 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3421 0xea50a000, 0xfff0f000,
3422 "csinv\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3424 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3426 0xea5f900f, 0xfffff00f,
3427 "cset\t%8-11S, %4-7C"},
3429 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3431 0xea5fa00f, 0xfffff00f,
3432 "csetm\t%8-11S, %4-7C"},
3434 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3436 0xea508000, 0xfff0f000,
3437 "csel\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3439 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3441 0xea50b000, 0xfff0f000,
3442 "csneg\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3444 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3446 0xea509000, 0xfff0f000,
3447 "cinc\t%8-11S, %16-19Z, %4-7C"},
3449 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3451 0xea50a000, 0xfff0f000,
3452 "cinv\t%8-11S, %16-19Z, %4-7C"},
3454 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
3456 0xea50b000, 0xfff0f000,
3457 "cneg\t%8-11S, %16-19Z, %4-7C"},
3459 {ARM_FEATURE_CORE_LOW (0),
3461 0x00000000, 0x00000000, 0}
3464 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
3465 ordered: they must be searched linearly from the top to obtain a correct
3468 /* print_insn_arm recognizes the following format control codes:
3472 %a print address for ldr/str instruction
3473 %s print address for ldr/str halfword/signextend instruction
3474 %S like %s but allow UNPREDICTABLE addressing
3475 %b print branch destination
3476 %c print condition code (always bits 28-31)
3477 %m print register mask for ldm/stm instruction
3478 %o print operand2 (immediate or register + shift)
3479 %p print 'p' iff bits 12-15 are 15
3480 %t print 't' iff bit 21 set and bit 24 clear
3481 %B print arm BLX(1) destination
3482 %C print the PSR sub type.
3483 %U print barrier type.
3484 %P print address for pli instruction.
3486 %<bitfield>r print as an ARM register
3487 %<bitfield>T print as an ARM register + 1
3488 %<bitfield>R as %r but r15 is UNPREDICTABLE
3489 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE
3490 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE
3491 %<bitfield>d print the bitfield in decimal
3492 %<bitfield>W print the bitfield plus one in decimal
3493 %<bitfield>x print the bitfield in hex
3494 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
3496 %<bitfield>'c print specified char iff bitfield is all ones
3497 %<bitfield>`c print specified char iff bitfield is all zeroes
3498 %<bitfield>?ab... select from array of values in big endian order
3500 %e print arm SMI operand (bits 0..7,8..19).
3501 %E print the LSB and WIDTH fields of a BFI or BFC instruction.
3502 %V print the 16-bit immediate field of a MOVT or MOVW instruction.
3503 %R print the SPSR/CPSR or banked register of an MRS. */
3505 static const struct opcode32 arm_opcodes
[] =
3507 /* ARM instructions. */
3508 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3509 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
3510 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3511 0xe7f000f0, 0xfff000f0, "udf\t#%e"},
3513 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
| ARM_EXT_V5
),
3514 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
3515 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3516 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
3517 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3518 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3519 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S
),
3520 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
3521 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3522 0x00800090, 0x0fa000f0,
3523 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3524 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3525 0x00a00090, 0x0fa000f0,
3526 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3528 /* V8.2 RAS extension instructions. */
3529 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
3530 0xe320f010, 0xffffffff, "esb"},
3532 /* V8 instructions. */
3533 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3534 0x0320f005, 0x0fffffff, "sevl"},
3535 /* Defined in V8 but is in NOP space so available to all arch. */
3536 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3537 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
3538 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS
),
3539 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
3540 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3541 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
3542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3543 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
3544 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3545 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
3546 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3547 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
3548 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3549 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
3550 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3551 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
3552 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3553 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
3554 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3555 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
3556 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3557 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
3558 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3559 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
3560 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3561 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
3562 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3563 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
3564 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3565 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
3566 /* CRC32 instructions. */
3567 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3568 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
3569 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3570 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
3571 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3572 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
3573 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3574 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
3575 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3576 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
3577 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3578 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
3580 /* Privileged Access Never extension instructions. */
3581 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
),
3582 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
3584 /* Virtualization Extension instructions. */
3585 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x0160006e, 0x0fffffff, "eret%c"},
3586 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
3588 /* Integer Divide Extension instructions. */
3589 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3590 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
3591 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3592 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
3594 /* MP Extension instructions. */
3595 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf410f000, 0xfc70f000, "pldw\t%a"},
3597 /* Speculation Barriers. */
3598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xe320f014, 0xffffffff, "csdb"},
3599 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff040, 0xffffffff, "ssbb"},
3600 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff044, 0xffffffff, "pssbb"},
3602 /* V7 instructions. */
3603 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf450f000, 0xfd70f000, "pli\t%P"},
3604 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
3605 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
3606 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
3607 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
3608 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
3609 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff060, 0xfffffff0, "isb\t%U"},
3610 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
3611 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
3613 /* ARM V6T2 instructions. */
3614 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3615 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
3616 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3617 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
3618 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3619 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3620 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3621 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
3623 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3624 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION
},
3625 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3626 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
3628 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3629 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
3630 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3631 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
3632 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3633 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
3634 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3635 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
3637 /* ARM Security extension instructions. */
3638 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
),
3639 0x01600070, 0x0ff000f0, "smc%c\t%e"},
3641 /* ARM V6K instructions. */
3642 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3643 0xf57ff01f, 0xffffffff, "clrex"},
3644 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3645 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
3646 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3647 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
3648 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3649 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
3650 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3651 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
3652 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3653 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
3654 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3655 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
3657 /* ARMv8.5-A instructions. */
3658 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf57ff070, 0xffffffff, "sb"},
3660 /* ARM V6K NOP hints. */
3661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3662 0x0320f001, 0x0fffffff, "yield%c"},
3663 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3664 0x0320f002, 0x0fffffff, "wfe%c"},
3665 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3666 0x0320f003, 0x0fffffff, "wfi%c"},
3667 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3668 0x0320f004, 0x0fffffff, "sev%c"},
3669 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3670 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
3672 /* ARM V6 instructions. */
3673 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3674 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
3675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3676 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
3677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3678 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
3679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3680 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
3681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3682 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
3683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3684 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
3685 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3686 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
3687 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3688 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
3689 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3690 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
3691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3692 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
3693 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3694 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
3695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3696 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
3697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3698 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
3699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3700 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
3701 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3702 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
3703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3704 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
3705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3706 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
3707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3708 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
3709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3710 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
3711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3712 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
3713 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3714 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
3715 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3716 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
3717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3718 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
3719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3720 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
3721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3722 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
3723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3724 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
3725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3726 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
3727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3728 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
3729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3730 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
3731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3732 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
3733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3734 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
3735 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3736 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
3737 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3738 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
3739 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3740 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
3741 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3742 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
3743 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3744 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
3745 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3746 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
3747 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3748 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
3749 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3750 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
3751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3752 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
3753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3754 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
3755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3756 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
3757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3758 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
3759 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3760 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
3761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3762 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
3763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3764 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
3765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3766 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
3767 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3768 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
3769 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3770 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
3771 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3772 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
3773 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3774 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
3775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3776 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
3777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3778 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
3779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3780 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
3781 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3782 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
3783 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3784 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
3785 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3786 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
3787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3788 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
3789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3790 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
3791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3792 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
3793 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3794 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
3795 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3796 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
3797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3798 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
3799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3800 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
3801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3802 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
3803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3804 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
3805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3806 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
3807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3808 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
3809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3810 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
3811 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3812 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
3813 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3814 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
3815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3816 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
3817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3818 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
3819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3820 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
3821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3822 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
3823 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3824 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3825 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3826 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3828 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3830 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
3831 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3832 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3833 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3834 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3835 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3836 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3838 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
3839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3840 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3842 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3844 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3846 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
3847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3848 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3850 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3851 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3852 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3854 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
3855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3856 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3858 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3860 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
3861 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3862 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
3863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3864 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3865 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3866 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3868 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3870 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
3871 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3872 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
3873 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3874 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
3875 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3876 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
3877 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3878 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3879 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3880 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3882 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3883 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3884 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3885 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3886 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
3887 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3888 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3889 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3890 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3891 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3892 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
3893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3894 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
3895 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3896 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
3897 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3898 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
3899 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3900 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
3901 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3902 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
3903 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3904 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
3905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3906 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
3907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3908 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3910 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
3911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3912 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
3913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3914 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
3915 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3916 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
3918 /* V5J instruction. */
3919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J
),
3920 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
3922 /* V5 Instructions. */
3923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3924 0xe1200070, 0xfff000f0,
3925 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
3926 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3927 0xfa000000, 0xfe000000, "blx\t%B"},
3928 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3929 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
3930 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3931 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
3933 /* V5E "El Segundo" Instructions. */
3934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3935 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
3936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3937 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
3938 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3939 0xf450f000, 0xfc70f000, "pld\t%a"},
3940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3941 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3943 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3945 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3947 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
3949 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3950 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3951 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3952 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
3954 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3955 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3957 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3959 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3961 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3963 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3964 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
3965 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3966 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
3967 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3968 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
3969 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3970 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
3972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3973 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
3974 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3975 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
3977 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3978 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"},
3979 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3980 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
3981 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3982 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"},
3983 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3984 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
3986 /* ARM Instructions. */
3987 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3988 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
3990 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3991 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
3992 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3993 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
3994 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3995 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
3996 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3997 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
3998 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3999 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
4000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4001 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
4003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4004 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
4005 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4006 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
4007 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4008 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
4009 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4010 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
4012 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4013 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION
},
4014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4015 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
4016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4017 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION
},
4018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4019 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
4021 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4022 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
4023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4024 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
4025 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4026 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
4028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4029 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
4030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4031 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
4032 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4033 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
4035 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4036 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
4037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4038 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
4039 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4040 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
4042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4043 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4045 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4047 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
4049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4050 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
4051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4052 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
4053 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4054 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
4056 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4057 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
4058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4059 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
4060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4061 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
4063 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4064 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4065 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4066 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4067 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4068 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
4070 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4071 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4072 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4073 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4074 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4075 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
4077 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
),
4078 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
4079 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
4080 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
4081 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
4082 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
4084 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4085 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
4086 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4087 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
4088 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4089 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
4091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4092 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
4093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4094 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
4095 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4096 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
4098 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4099 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
4100 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4101 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
4102 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4103 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
4105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4106 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
4107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4108 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
4109 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4110 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
4112 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4113 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
4114 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4115 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
4116 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4117 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
4119 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4120 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
4121 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4122 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
4123 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4124 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
4125 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4126 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
4127 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4128 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
4129 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4130 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
4131 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4132 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
4134 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4135 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
4136 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4137 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
4138 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4139 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
4141 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4142 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
4143 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4144 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
4145 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4146 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
4148 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4149 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION
},
4150 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4151 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
4153 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4154 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
4156 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4157 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
4158 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4159 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
4161 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4162 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4163 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4164 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4165 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4166 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4167 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4168 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4169 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4170 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4171 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4172 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4173 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4174 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4175 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4176 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4177 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4178 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4179 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4180 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4181 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4182 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4183 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4184 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4185 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4186 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4187 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4188 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4189 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4190 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4191 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4192 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4193 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4194 0x092d0000, 0x0fff0000, "push%c\t%m"},
4195 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4196 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
4197 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4198 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4200 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4201 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4202 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4203 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4204 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4205 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4206 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4207 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4208 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4209 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4210 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4211 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4212 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4213 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4214 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4215 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4216 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4217 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4218 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4219 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4220 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4221 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4222 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4223 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4224 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4225 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4226 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4227 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4228 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4229 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4230 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4231 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4232 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4233 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
4234 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4235 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
4236 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4237 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4239 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4240 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
4241 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4242 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
4245 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
4246 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION
},
4247 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4248 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
4249 {ARM_FEATURE_CORE_LOW (0),
4250 0x00000000, 0x00000000, 0}
4253 /* print_insn_thumb16 recognizes the following format control codes:
4255 %S print Thumb register (bits 3..5 as high number if bit 6 set)
4256 %D print Thumb register (bits 0..2 as high number if bit 7 set)
4257 %<bitfield>I print bitfield as a signed decimal
4258 (top bit of range being the sign bit)
4259 %N print Thumb register mask (with LR)
4260 %O print Thumb register mask (with PC)
4261 %M print Thumb register mask
4262 %b print CZB's 6-bit unsigned branch destination
4263 %s print Thumb right-shift immediate (6..10; 0 == 32).
4264 %c print the condition code
4265 %C print the condition code, or "s" if not conditional
4266 %x print warning if conditional an not at end of IT block"
4267 %X print "\t; unpredictable <IT:code>" if conditional
4268 %I print IT instruction suffix and operands
4269 %W print Thumb Writeback indicator for LDMIA
4270 %<bitfield>r print bitfield as an ARM register
4271 %<bitfield>d print bitfield as a decimal
4272 %<bitfield>H print (bitfield * 2) as a decimal
4273 %<bitfield>W print (bitfield * 4) as a decimal
4274 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
4275 %<bitfield>B print Thumb branch destination (signed displacement)
4276 %<bitfield>c print bitfield as a condition code
4277 %<bitnum>'c print specified char iff bit is one
4278 %<bitnum>?ab print a if bit is one else print b. */
4280 static const struct opcode16 thumb_opcodes
[] =
4282 /* Thumb instructions. */
4284 /* ARMv8-M Security Extensions instructions. */
4285 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4784, 0xff87, "blxns\t%3-6r"},
4286 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4704, 0xff87, "bxns\t%3-6r"},
4288 /* ARM V8 instructions. */
4289 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xbf50, 0xffff, "sevl%c"},
4290 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xba80, 0xffc0, "hlt\t%0-5x"},
4291 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
), 0xb610, 0xfff7, "setpan\t#%3-3d"},
4293 /* ARM V6K no-argument instructions. */
4294 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xffff, "nop%c"},
4295 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf10, 0xffff, "yield%c"},
4296 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf20, 0xffff, "wfe%c"},
4297 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf30, 0xffff, "wfi%c"},
4298 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf40, 0xffff, "sev%c"},
4299 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
4301 /* ARM V6T2 instructions. */
4302 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4303 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
4304 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4305 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
4306 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xbf00, 0xff00, "it%I%X"},
4309 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
4310 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
4311 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
4312 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
4313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
4314 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
4315 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb650, 0xfff7, "setend\t%3?ble%X"},
4316 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
4317 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
4318 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
4319 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
4321 /* ARM V5 ISA extends Thumb. */
4322 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4323 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
4324 /* This is BLX(2). BLX(1) is a 32-bit instruction. */
4325 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4326 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
4327 /* ARM V4T ISA (Thumb v1). */
4328 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4329 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
4331 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
4332 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
4333 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
4334 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
4335 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
4336 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
4337 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
4338 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
4339 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
4340 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
4341 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
4342 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
4343 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
4344 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
4345 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
4346 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
4348 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
4349 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
4351 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4700, 0xFF80, "bx%c\t%S%x"},
4352 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4400, 0xFF00, "add%c\t%D, %S"},
4353 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
4354 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4600, 0xFF00, "mov%c\t%D, %S"},
4356 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB400, 0xFE00, "push%c\t%N"},
4357 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xBC00, 0xFE00, "pop%c\t%O"},
4359 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4360 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
4361 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4362 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
4363 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4364 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
4365 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4366 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
4368 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4369 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
4370 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4371 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
4372 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4373 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
4375 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4376 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4377 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4378 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4380 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
4381 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4382 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
4383 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
4384 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
4386 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
4387 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
4388 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
4389 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
4391 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
4392 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4394 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
4396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4397 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
4398 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4399 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
4400 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4401 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
4402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4403 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
4405 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4406 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
4407 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4408 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
4410 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4411 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
4412 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4413 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
4415 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4416 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
4417 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4418 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
4420 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
4421 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
4423 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
4425 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
4426 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION
},
4427 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
4429 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
4431 /* The E800 .. FFFF range is unconditionally redirected to the
4432 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
4433 are processed via that table. Thus, we can never encounter a
4434 bare "second half of BL/BLX(1)" instruction here. */
4435 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
), 0x0000, 0x0000, UNDEFINED_INSTRUCTION
},
4436 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4439 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
4440 We adopt the convention that hw1 is the high 16 bits of .value and
4441 .mask, hw2 the low 16 bits.
4443 print_insn_thumb32 recognizes the following format control codes:
4447 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
4448 %M print a modified 12-bit immediate (same location)
4449 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
4450 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
4451 %H print a 16-bit immediate from hw2[3:0],hw1[11:0]
4452 %S print a possibly-shifted Rm
4454 %L print address for a ldrd/strd instruction
4455 %a print the address of a plain load/store
4456 %w print the width and signedness of a core load/store
4457 %m print register mask for ldm/stm
4458 %n print register mask for clrm
4460 %E print the lsb and width fields of a bfc/bfi instruction
4461 %F print the lsb and width fields of a sbfx/ubfx instruction
4462 %G print a fallback offset for Branch Future instructions
4463 %W print an offset for BF instruction
4464 %Y print an offset for BFL instruction
4465 %Z print an offset for BFCSEL instruction
4466 %Q print an offset for Low Overhead Loop instructions
4467 %P print an offset for Low Overhead Loop end instructions
4468 %b print a conditional branch offset
4469 %B print an unconditional branch offset
4470 %s print the shift field of an SSAT instruction
4471 %R print the rotation field of an SXT instruction
4472 %U print barrier type.
4473 %P print address for pli instruction.
4474 %c print the condition code
4475 %x print warning if conditional an not at end of IT block"
4476 %X print "\t; unpredictable <IT:code>" if conditional
4478 %<bitfield>d print bitfield in decimal
4479 %<bitfield>D print bitfield plus one in decimal
4480 %<bitfield>W print bitfield*4 in decimal
4481 %<bitfield>r print bitfield as an ARM register
4482 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
4483 %<bitfield>S as %<>r but r13 and r15 is UNPREDICTABLE
4484 %<bitfield>c print bitfield as a condition code
4486 %<bitfield>'c print specified char iff bitfield is all ones
4487 %<bitfield>`c print specified char iff bitfield is all zeroes
4488 %<bitfield>?ab... select from array of values in big endian order
4490 With one exception at the bottom (done because BL and BLX(1) need
4491 to come dead last), this table was machine-sorted first in
4492 decreasing order of number of bits set in the mask, then in
4493 increasing numeric order of mask, then in increasing numeric order
4494 of opcode. This order is not the clearest for a human reader, but
4495 is guaranteed never to catch a special-case bit pattern with a more
4496 general mask, which is important, because this instruction encoding
4497 makes heavy use of special-case bit patterns. */
4498 static const struct opcode32 thumb32_opcodes
[] =
4500 /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
4502 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4503 0xf00fe001, 0xffffffff, "lctp%c"},
4504 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4505 0xf02fc001, 0xfffff001, "le\t%P"},
4506 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4507 0xf00fc001, 0xfffff001, "le\tlr, %P"},
4508 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4509 0xf01fc001, 0xfffff001, "letp\tlr, %P"},
4510 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4511 0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"},
4512 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4513 0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"},
4514 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4515 0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"},
4516 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4517 0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"},
4519 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4520 0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
4521 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4522 0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
4523 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4524 0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
4525 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4526 0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
4527 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4528 0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"},
4530 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4531 0xe89f0000, 0xffff2000, "clrm%c\t%n"},
4533 /* ARMv8-M and ARMv8-M Security Extensions instructions. */
4534 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0xe97fe97f, 0xffffffff, "sg"},
4535 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4536 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
4537 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4538 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
4539 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4540 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
4541 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4542 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
4544 /* ARM V8.2 RAS extension instructions. */
4545 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
4546 0xf3af8010, 0xffffffff, "esb"},
4548 /* V8 instructions. */
4549 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4550 0xf3af8005, 0xffffffff, "sevl%c.w"},
4551 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4552 0xf78f8000, 0xfffffffc, "dcps%0-1d"},
4553 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4554 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
4555 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4556 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
4557 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4558 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
4559 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4560 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
4561 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4562 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
4563 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4564 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
4565 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4566 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
4567 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4568 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
4569 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4570 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
4571 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4572 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
4573 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4574 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
4575 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4576 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
4577 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4578 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
4579 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4580 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
4582 /* CRC32 instructions. */
4583 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4584 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
4585 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4586 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
4587 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4588 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
4589 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4590 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
4591 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4592 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
4593 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4594 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
4596 /* Speculation Barriers. */
4597 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8014, 0xffffffff, "csdb"},
4598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f40, 0xffffffff, "ssbb"},
4599 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f44, 0xffffffff, "pssbb"},
4601 /* V7 instructions. */
4602 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf910f000, 0xff70f000, "pli%c\t%a"},
4603 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
4604 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
4605 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
4606 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
4607 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
4608 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
4609 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4610 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
4611 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4612 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
4614 /* Virtualization Extension instructions. */
4615 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
4616 /* We skip ERET as that is SUBS pc, lr, #0. */
4618 /* MP Extension instructions. */
4619 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf830f000, 0xff70f000, "pldw%c\t%a"},
4621 /* Security extension instructions. */
4622 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
), 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
4624 /* ARMv8.5-A instructions. */
4625 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf3bf8f70, 0xffffffff, "sb"},
4627 /* Instructions defined in the basic V6T2 set. */
4628 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8000, 0xffffffff, "nop%c.w"},
4629 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8001, 0xffffffff, "yield%c.w"},
4630 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8002, 0xffffffff, "wfe%c.w"},
4631 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8003, 0xffffffff, "wfi%c.w"},
4632 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8004, 0xffffffff, "sev%c.w"},
4633 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4634 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
4635 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
4637 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4638 0xf3bf8f2f, 0xffffffff, "clrex%c"},
4639 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4640 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
4641 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4642 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
4643 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4644 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
4645 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4646 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
4647 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4648 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
4649 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4650 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
4651 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4652 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
4653 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4654 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
4655 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4656 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
4657 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4658 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
4659 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4660 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
4661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4662 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
4663 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4664 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
4665 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4666 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
4667 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4668 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
4669 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4670 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
4671 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4672 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
4673 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4674 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
4675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4676 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
4677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4678 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
4679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4680 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
4681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4682 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
4683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4684 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
4685 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4686 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
4687 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4688 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
4689 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4690 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
4691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4692 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
4693 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4694 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
4695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4696 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
4697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4698 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
4699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4700 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
4701 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4702 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
4703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4704 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
4705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4706 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
4707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4708 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
4709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4710 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
4711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4712 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
4713 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4714 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
4715 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4716 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
4717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4718 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
4719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4720 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
4721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4722 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
4723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4724 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
4725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4726 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
4727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4728 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
4729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4730 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
4731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4732 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
4733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4734 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
4735 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4736 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
4737 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4738 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
4739 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4740 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
4741 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4742 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
4743 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4744 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
4745 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4746 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
4747 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4748 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
4749 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4750 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
4751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4752 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
4753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4754 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
4755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4756 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
4757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4758 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
4759 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4760 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
4761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4762 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
4763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4764 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
4765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4766 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
4767 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4768 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
4769 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4770 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
4771 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4772 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
4773 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4774 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
4775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4776 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
4777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4778 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
4779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4780 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
4781 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4782 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
4783 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4784 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
4785 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4786 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4788 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4790 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4792 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
4793 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4794 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
4795 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4796 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
4797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4798 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
4799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4800 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
4801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4802 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4804 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
4805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4806 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
4807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4808 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4810 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4811 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4812 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4813 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4814 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4816 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4818 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4820 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4822 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
4823 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4824 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
4825 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4826 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
4827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4828 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
4829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4830 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
4831 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4832 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
4833 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4834 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
4835 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4836 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
4837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4838 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
4839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4840 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
4841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4842 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
4843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4844 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
4845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4846 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4848 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4850 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4851 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4852 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4854 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4856 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4858 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4860 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4861 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4862 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
4863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4864 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
4865 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4866 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
4867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4868 0xf810f000, 0xff70f000, "pld%c\t%a"},
4869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4870 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4871 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4872 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4873 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4874 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4875 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4876 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4877 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4878 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4879 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4880 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4882 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4883 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4884 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
4885 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4886 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
4887 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4888 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
4889 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4890 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
4891 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4892 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
4893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4894 0xfb100000, 0xfff000c0,
4895 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4897 0xfbc00080, 0xfff000c0,
4898 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
4899 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4900 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
4901 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4902 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
4903 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4904 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
4905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4906 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
4907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4908 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
4909 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4910 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
4911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4912 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
4913 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4914 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
4915 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4916 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
4917 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4918 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
4919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4920 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
4921 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4922 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
4923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4924 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
4925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4926 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
4927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4928 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
4929 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4930 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
4931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4932 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
4933 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4934 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
4935 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4936 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
4937 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4938 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
4939 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4940 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
4941 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4942 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
4943 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4944 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
4945 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4946 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
4947 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4948 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
4949 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4950 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
4951 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4952 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
4953 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4954 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
4955 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4956 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
4957 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4958 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
4959 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4960 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
4961 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4962 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
4963 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4964 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
4965 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4966 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
4967 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4968 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
4969 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4970 0xe9400000, 0xff500000,
4971 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4973 0xe9500000, 0xff500000,
4974 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4975 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4976 0xe8600000, 0xff700000,
4977 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4978 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4979 0xe8700000, 0xff700000,
4980 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4981 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4982 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
4983 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4984 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
4986 /* Filter out Bcc with cond=E or F, which are used for other instructions. */
4987 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4988 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
4989 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4990 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
4991 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4992 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
4993 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4994 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
4996 /* These have been 32-bit since the invention of Thumb. */
4997 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4998 0xf000c000, 0xf800d001, "blx%c\t%B%x"},
4999 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
5000 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
5003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
5004 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
5005 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
5008 static const char *const arm_conditional
[] =
5009 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
5010 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
5012 static const char *const arm_fp_const
[] =
5013 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
5015 static const char *const arm_shift
[] =
5016 {"lsl", "lsr", "asr", "ror"};
5021 const char *description
;
5022 const char *reg_names
[16];
5026 static const arm_regname regnames
[] =
5028 { "reg-names-raw", N_("Select raw register names"),
5029 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
5030 { "reg-names-gcc", N_("Select register names used by GCC"),
5031 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
5032 { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
5033 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
5034 { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL
} },
5035 { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL
} },
5036 { "reg-names-apcs", N_("Select register names used in the APCS"),
5037 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
5038 { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
5039 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
5040 { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
5041 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }}
5044 static const char *const iwmmxt_wwnames
[] =
5045 {"b", "h", "w", "d"};
5047 static const char *const iwmmxt_wwssnames
[] =
5048 {"b", "bus", "bc", "bss",
5049 "h", "hus", "hc", "hss",
5050 "w", "wus", "wc", "wss",
5051 "d", "dus", "dc", "dss"
5054 static const char *const iwmmxt_regnames
[] =
5055 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
5056 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
5059 static const char *const iwmmxt_cregnames
[] =
5060 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
5061 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
5064 static const char *const vec_condnames
[] =
5065 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
5068 static const char *const mve_predicatenames
[] =
5069 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
5070 "eee", "ee", "eet", "e", "ett", "et", "ete"
5073 /* Names for 2-bit size field for mve vector isntructions. */
5074 static const char *const mve_vec_sizename
[] =
5075 { "8", "16", "32", "64"};
5077 /* Indicates whether we are processing a then predicate,
5078 else predicate or none at all. */
5086 /* Information used to process a vpt block and subsequent instructions. */
5089 /* Are we in a vpt block. */
5090 bfd_boolean in_vpt_block
;
5092 /* Next predicate state if in vpt block. */
5093 enum vpt_pred_state next_pred_state
;
5095 /* Mask from vpt/vpst instruction. */
5096 long predicate_mask
;
5098 /* Instruction number in vpt block. */
5099 long current_insn_num
;
5101 /* Number of instructions in vpt block.. */
5105 static struct vpt_block vpt_block_state
=
5114 /* Default to GCC register name set. */
5115 static unsigned int regname_selected
= 1;
5117 #define NUM_ARM_OPTIONS ARRAY_SIZE (regnames)
5118 #define arm_regnames regnames[regname_selected].reg_names
5120 static bfd_boolean force_thumb
= FALSE
;
5122 /* Current IT instruction state. This contains the same state as the IT
5123 bits in the CPSR. */
5124 static unsigned int ifthen_state
;
5125 /* IT state for the next instruction. */
5126 static unsigned int ifthen_next_state
;
5127 /* The address of the insn for which the IT state is valid. */
5128 static bfd_vma ifthen_address
;
5129 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
5130 /* Indicates that the current Conditional state is unconditional or outside
5132 #define COND_UNCOND 16
5136 /* Extract the predicate mask for a VPT or VPST instruction.
5137 The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh). */
5140 mve_extract_pred_mask (long given
)
5142 return ((given
& 0x00400000) >> 19) | ((given
& 0xe000) >> 13);
5145 /* Return the number of instructions in a MVE predicate block. */
5147 num_instructions_vpt_block (long given
)
5149 long mask
= mve_extract_pred_mask (given
);
5156 if ((mask
& 7) == 4)
5159 if ((mask
& 3) == 2)
5162 if ((mask
& 1) == 1)
5169 mark_outside_vpt_block (void)
5171 vpt_block_state
.in_vpt_block
= FALSE
;
5172 vpt_block_state
.next_pred_state
= PRED_NONE
;
5173 vpt_block_state
.predicate_mask
= 0;
5174 vpt_block_state
.current_insn_num
= 0;
5175 vpt_block_state
.num_pred_insn
= 0;
5179 mark_inside_vpt_block (long given
)
5181 vpt_block_state
.in_vpt_block
= TRUE
;
5182 vpt_block_state
.next_pred_state
= PRED_THEN
;
5183 vpt_block_state
.predicate_mask
= mve_extract_pred_mask (given
);
5184 vpt_block_state
.current_insn_num
= 0;
5185 vpt_block_state
.num_pred_insn
= num_instructions_vpt_block (given
);
5186 assert (vpt_block_state
.num_pred_insn
>= 1);
5189 static enum vpt_pred_state
5190 invert_next_predicate_state (enum vpt_pred_state astate
)
5192 if (astate
== PRED_THEN
)
5194 else if (astate
== PRED_ELSE
)
5200 static enum vpt_pred_state
5201 update_next_predicate_state (void)
5203 long pred_mask
= vpt_block_state
.predicate_mask
;
5204 long mask_for_insn
= 0;
5206 switch (vpt_block_state
.current_insn_num
)
5224 if (pred_mask
& mask_for_insn
)
5225 return invert_next_predicate_state (vpt_block_state
.next_pred_state
);
5227 return vpt_block_state
.next_pred_state
;
5231 update_vpt_block_state (void)
5233 vpt_block_state
.current_insn_num
++;
5234 if (vpt_block_state
.current_insn_num
== vpt_block_state
.num_pred_insn
)
5236 /* No more instructions to process in vpt block. */
5237 mark_outside_vpt_block ();
5241 vpt_block_state
.next_pred_state
= update_next_predicate_state ();
5244 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
5245 Returns pointer to following character of the format string and
5246 fills in *VALUEP and *WIDTHP with the extracted value and number of
5247 bits extracted. WIDTHP can be NULL. */
5250 arm_decode_bitfield (const char *ptr
,
5252 unsigned long *valuep
,
5255 unsigned long value
= 0;
5263 for (start
= 0; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
5264 start
= start
* 10 + *ptr
- '0';
5266 for (end
= 0, ptr
++; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
5267 end
= end
* 10 + *ptr
- '0';
5273 value
|= ((insn
>> start
) & ((2ul << bits
) - 1)) << width
;
5276 while (*ptr
++ == ',');
5284 arm_decode_shift (long given
, fprintf_ftype func
, void *stream
,
5285 bfd_boolean print_shift
)
5287 func (stream
, "%s", arm_regnames
[given
& 0xf]);
5289 if ((given
& 0xff0) != 0)
5291 if ((given
& 0x10) == 0)
5293 int amount
= (given
& 0xf80) >> 7;
5294 int shift
= (given
& 0x60) >> 5;
5300 func (stream
, ", rrx");
5308 func (stream
, ", %s #%d", arm_shift
[shift
], amount
);
5310 func (stream
, ", #%d", amount
);
5312 else if ((given
& 0x80) == 0x80)
5313 func (stream
, "\t; <illegal shifter operand>");
5314 else if (print_shift
)
5315 func (stream
, ", %s %s", arm_shift
[(given
& 0x60) >> 5],
5316 arm_regnames
[(given
& 0xf00) >> 8]);
5318 func (stream
, ", %s", arm_regnames
[(given
& 0xf00) >> 8]);
5322 /* Return TRUE if the MATCHED_INSN can be inside an IT block. */
5325 is_mve_okay_in_it (enum mve_instructions matched_insn
)
5327 switch (matched_insn
)
5329 case MVE_VMOV_GP_TO_VEC_LANE
:
5330 case MVE_VMOV2_VEC_LANE_TO_GP
:
5331 case MVE_VMOV2_GP_TO_VEC_LANE
:
5332 case MVE_VMOV_VEC_LANE_TO_GP
:
5357 is_mve_architecture (struct disassemble_info
*info
)
5359 struct arm_private_data
*private_data
= info
->private_data
;
5360 arm_feature_set allowed_arches
= private_data
->features
;
5362 arm_feature_set arm_ext_v8_1m_main
5363 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
5365 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
5366 && !ARM_CPU_IS_ANY (allowed_arches
))
5373 is_vpt_instruction (long given
)
5376 /* If mkh:mkl is '0000' then its not a vpt/vpst instruction. */
5377 if ((given
& 0x0040e000) == 0)
5380 /* VPT floating point T1 variant. */
5381 if (((given
& 0xefb10f50) == 0xee310f00 && ((given
& 0x1001) != 0x1))
5382 /* VPT floating point T2 variant. */
5383 || ((given
& 0xefb10f50) == 0xee310f40)
5384 /* VPT vector T1 variant. */
5385 || ((given
& 0xff811f51) == 0xfe010f00)
5386 /* VPT vector T2 variant. */
5387 || ((given
& 0xff811f51) == 0xfe010f01
5388 && ((given
& 0x300000) != 0x300000))
5389 /* VPT vector T3 variant. */
5390 || ((given
& 0xff811f50) == 0xfe011f00)
5391 /* VPT vector T4 variant. */
5392 || ((given
& 0xff811f70) == 0xfe010f40)
5393 /* VPT vector T5 variant. */
5394 || ((given
& 0xff811f70) == 0xfe010f60)
5395 /* VPT vector T6 variant. */
5396 || ((given
& 0xff811f50) == 0xfe011f40)
5397 /* VPST vector T variant. */
5398 || ((given
& 0xffbf1fff) == 0xfe310f4d))
5404 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
5405 and ending bitfield = END. END must be greater than START. */
5407 static unsigned long
5408 arm_decode_field (unsigned long given
, unsigned int start
, unsigned int end
)
5410 int bits
= end
- start
;
5415 return ((given
>> start
) & ((2ul << bits
) - 1));
5418 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
5419 START:END and START2:END2. END/END2 must be greater than
5422 static unsigned long
5423 arm_decode_field_multiple (unsigned long given
, unsigned int start
,
5424 unsigned int end
, unsigned int start2
,
5427 int bits
= end
- start
;
5428 int bits2
= end2
- start2
;
5429 unsigned long value
= 0;
5435 value
= arm_decode_field (given
, start
, end
);
5438 value
|= ((given
>> start2
) & ((2ul << bits2
) - 1)) << width
;
5442 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
5443 This helps us decode instructions that change mnemonic depending on specific
5444 operand values/encodings. */
5447 is_mve_encoding_conflict (unsigned long given
,
5448 enum mve_instructions matched_insn
)
5450 switch (matched_insn
)
5453 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5459 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5461 if ((arm_decode_field (given
, 12, 12) == 0)
5462 && (arm_decode_field (given
, 0, 0) == 1))
5467 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5469 if (arm_decode_field (given
, 0, 3) == 0xd)
5473 case MVE_VPT_VEC_T1
:
5474 case MVE_VPT_VEC_T2
:
5475 case MVE_VPT_VEC_T3
:
5476 case MVE_VPT_VEC_T4
:
5477 case MVE_VPT_VEC_T5
:
5478 case MVE_VPT_VEC_T6
:
5479 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5481 if (arm_decode_field (given
, 20, 21) == 3)
5485 case MVE_VCMP_FP_T1
:
5486 if ((arm_decode_field (given
, 12, 12) == 0)
5487 && (arm_decode_field (given
, 0, 0) == 1))
5492 case MVE_VCMP_FP_T2
:
5493 if (arm_decode_field (given
, 0, 3) == 0xd)
5500 case MVE_VMUL_VEC_T2
:
5507 case MVE_VADD_VEC_T2
:
5508 case MVE_VSUB_VEC_T2
:
5525 case MVE_VQDMULH_T3
:
5526 case MVE_VQRDMULH_T4
:
5532 case MVE_VCMP_VEC_T1
:
5533 case MVE_VCMP_VEC_T2
:
5534 case MVE_VCMP_VEC_T3
:
5535 case MVE_VCMP_VEC_T4
:
5536 case MVE_VCMP_VEC_T5
:
5537 case MVE_VCMP_VEC_T6
:
5538 if (arm_decode_field (given
, 20, 21) == 3)
5547 if (arm_decode_field (given
, 7, 8) == 3)
5554 if ((arm_decode_field (given
, 24, 24) == 0)
5555 && (arm_decode_field (given
, 21, 21) == 0))
5559 else if ((arm_decode_field (given
, 7, 8) == 3))
5567 if ((arm_decode_field (given
, 24, 24) == 0)
5568 && (arm_decode_field (given
, 21, 21) == 0))
5575 case MVE_VCVT_FP_FIX_VEC
:
5576 return (arm_decode_field (given
, 16, 21) & 0x38) == 0;
5581 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5583 if ((cmode
& 1) == 0)
5585 else if ((cmode
& 0xc) == 0xc)
5593 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5595 if ((cmode
& 9) == 1)
5597 else if ((cmode
& 5) == 1)
5599 else if ((cmode
& 0xe) == 0xe)
5605 case MVE_VMOV_IMM_TO_VEC
:
5606 if ((arm_decode_field (given
, 5, 5) == 1)
5607 && (arm_decode_field (given
, 8, 11) != 0xe))
5614 unsigned long size
= arm_decode_field (given
, 19, 20);
5615 if ((size
== 0) || (size
== 3))
5636 if (arm_decode_field (given
, 18, 19) == 3)
5642 case MVE_VRMLSLDAVH
:
5645 if (arm_decode_field (given
, 20, 22) == 7)
5650 case MVE_VRMLALDAVH
:
5651 if ((arm_decode_field (given
, 20, 22) & 6) == 6)
5658 if ((arm_decode_field (given
, 20, 21) == 3)
5659 || (arm_decode_field (given
, 1, 3) == 7))
5666 if (arm_decode_field (given
, 16, 18) == 0)
5668 unsigned long sz
= arm_decode_field (given
, 19, 20);
5670 if ((sz
== 1) || (sz
== 2))
5685 if (arm_decode_field (given
, 19, 21) == 0)
5691 if (arm_decode_field (given
, 16, 19) == 0xf)
5707 if (arm_decode_field (given
, 9, 11) == 0x7)
5715 unsigned long rm
, rn
;
5716 rm
= arm_decode_field (given
, 0, 3);
5717 rn
= arm_decode_field (given
, 16, 19);
5719 if (rm
== 0xf && rn
== 0xf)
5722 else if (rn
== rm
&& rn
!= 0xf)
5728 if (arm_decode_field (given
, 0, 3) == 0xd)
5731 else if (matched_insn
== MVE_CSNEG
)
5732 if (arm_decode_field (given
, 0, 3) == arm_decode_field (given
, 16, 19))
5737 case MVE_VADD_FP_T1
:
5738 case MVE_VADD_FP_T2
:
5739 case MVE_VADD_VEC_T1
:
5746 print_mve_vld_str_addr (struct disassemble_info
*info
,
5747 unsigned long given
,
5748 enum mve_instructions matched_insn
)
5750 void *stream
= info
->stream
;
5751 fprintf_ftype func
= info
->fprintf_func
;
5753 unsigned long p
, w
, gpr
, imm
, add
, mod_imm
;
5755 imm
= arm_decode_field (given
, 0, 6);
5758 switch (matched_insn
)
5762 gpr
= arm_decode_field (given
, 16, 18);
5767 gpr
= arm_decode_field (given
, 16, 18);
5773 gpr
= arm_decode_field (given
, 16, 19);
5779 gpr
= arm_decode_field (given
, 16, 19);
5785 gpr
= arm_decode_field (given
, 16, 19);
5792 p
= arm_decode_field (given
, 24, 24);
5793 w
= arm_decode_field (given
, 21, 21);
5795 add
= arm_decode_field (given
, 23, 23);
5799 /* Don't print anything for '+' as it is implied. */
5809 func (stream
, "[%s, #%s%lu]", arm_regnames
[gpr
], add_sub
, mod_imm
);
5810 /* Pre-indexed mode. */
5812 func (stream
, "[%s, #%s%lu]!", arm_regnames
[gpr
], add_sub
, mod_imm
);
5814 else if ((p
== 0) && (w
== 1))
5815 /* Post-index mode. */
5816 func (stream
, "[%s], #%s%lu", arm_regnames
[gpr
], add_sub
, mod_imm
);
5819 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
5820 Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
5821 this encoding is undefined. */
5824 is_mve_undefined (unsigned long given
, enum mve_instructions matched_insn
,
5825 enum mve_undefined
*undefined_code
)
5827 *undefined_code
= UNDEF_NONE
;
5829 switch (matched_insn
)
5832 if (arm_decode_field_multiple (given
, 5, 5, 22, 22) == 3)
5834 *undefined_code
= UNDEF_SIZE_3
;
5842 case MVE_VMUL_VEC_T1
:
5844 case MVE_VADD_VEC_T1
:
5845 case MVE_VSUB_VEC_T1
:
5846 case MVE_VQDMULH_T1
:
5847 case MVE_VQRDMULH_T2
:
5851 if (arm_decode_field (given
, 20, 21) == 3)
5853 *undefined_code
= UNDEF_SIZE_3
;
5860 if (arm_decode_field (given
, 7, 8) == 3)
5862 *undefined_code
= UNDEF_SIZE_3
;
5869 if (arm_decode_field (given
, 7, 8) <= 1)
5871 *undefined_code
= UNDEF_SIZE_LE_1
;
5878 if ((arm_decode_field (given
, 7, 8) == 0))
5880 *undefined_code
= UNDEF_SIZE_0
;
5887 if ((arm_decode_field (given
, 7, 8) <= 1))
5889 *undefined_code
= UNDEF_SIZE_LE_1
;
5895 case MVE_VLDRB_GATHER_T1
:
5896 if (arm_decode_field (given
, 7, 8) == 3)
5898 *undefined_code
= UNDEF_SIZE_3
;
5901 else if ((arm_decode_field (given
, 28, 28) == 0)
5902 && (arm_decode_field (given
, 7, 8) == 0))
5904 *undefined_code
= UNDEF_NOT_UNS_SIZE_0
;
5910 case MVE_VLDRH_GATHER_T2
:
5911 if (arm_decode_field (given
, 7, 8) == 3)
5913 *undefined_code
= UNDEF_SIZE_3
;
5916 else if ((arm_decode_field (given
, 28, 28) == 0)
5917 && (arm_decode_field (given
, 7, 8) == 1))
5919 *undefined_code
= UNDEF_NOT_UNS_SIZE_1
;
5922 else if (arm_decode_field (given
, 7, 8) == 0)
5924 *undefined_code
= UNDEF_SIZE_0
;
5930 case MVE_VLDRW_GATHER_T3
:
5931 if (arm_decode_field (given
, 7, 8) != 2)
5933 *undefined_code
= UNDEF_SIZE_NOT_2
;
5936 else if (arm_decode_field (given
, 28, 28) == 0)
5938 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5944 case MVE_VLDRD_GATHER_T4
:
5945 if (arm_decode_field (given
, 7, 8) != 3)
5947 *undefined_code
= UNDEF_SIZE_NOT_3
;
5950 else if (arm_decode_field (given
, 28, 28) == 0)
5952 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5958 case MVE_VSTRB_SCATTER_T1
:
5959 if (arm_decode_field (given
, 7, 8) == 3)
5961 *undefined_code
= UNDEF_SIZE_3
;
5967 case MVE_VSTRH_SCATTER_T2
:
5969 unsigned long size
= arm_decode_field (given
, 7, 8);
5972 *undefined_code
= UNDEF_SIZE_3
;
5977 *undefined_code
= UNDEF_SIZE_0
;
5984 case MVE_VSTRW_SCATTER_T3
:
5985 if (arm_decode_field (given
, 7, 8) != 2)
5987 *undefined_code
= UNDEF_SIZE_NOT_2
;
5993 case MVE_VSTRD_SCATTER_T4
:
5994 if (arm_decode_field (given
, 7, 8) != 3)
5996 *undefined_code
= UNDEF_SIZE_NOT_3
;
6002 case MVE_VCVT_FP_FIX_VEC
:
6004 unsigned long imm6
= arm_decode_field (given
, 16, 21);
6005 if ((imm6
& 0x20) == 0)
6007 *undefined_code
= UNDEF_VCVT_IMM6
;
6011 if ((arm_decode_field (given
, 9, 9) == 0)
6012 && ((imm6
& 0x30) == 0x20))
6014 *undefined_code
= UNDEF_VCVT_FSI_IMM6
;
6023 case MVE_VCVT_BETWEEN_FP_INT
:
6024 case MVE_VCVT_FROM_FP_TO_INT
:
6026 unsigned long size
= arm_decode_field (given
, 18, 19);
6029 *undefined_code
= UNDEF_SIZE_0
;
6034 *undefined_code
= UNDEF_SIZE_3
;
6041 case MVE_VMOV_VEC_LANE_TO_GP
:
6043 unsigned long op1
= arm_decode_field (given
, 21, 22);
6044 unsigned long op2
= arm_decode_field (given
, 5, 6);
6045 unsigned long u
= arm_decode_field (given
, 23, 23);
6047 if ((op2
== 0) && (u
== 1))
6049 if ((op1
== 0) || (op1
== 1))
6051 *undefined_code
= UNDEF_BAD_U_OP1_OP2
;
6059 if ((op1
== 0) || (op1
== 1))
6061 *undefined_code
= UNDEF_BAD_OP1_OP2
;
6071 case MVE_VMOV_GP_TO_VEC_LANE
:
6072 if (arm_decode_field (given
, 5, 6) == 2)
6074 unsigned long op1
= arm_decode_field (given
, 21, 22);
6075 if ((op1
== 0) || (op1
== 1))
6077 *undefined_code
= UNDEF_BAD_OP1_OP2
;
6086 case MVE_VMOV_IMM_TO_VEC
:
6087 if (arm_decode_field (given
, 5, 5) == 0)
6089 unsigned long cmode
= arm_decode_field (given
, 8, 11);
6091 if (((cmode
& 9) == 1) || ((cmode
& 5) == 1))
6093 *undefined_code
= UNDEF_OP_0_BAD_CMODE
;
6104 if (arm_decode_field (given
, 18, 19) == 2)
6106 *undefined_code
= UNDEF_SIZE_2
;
6112 case MVE_VRMLALDAVH
:
6113 case MVE_VMLADAV_T1
:
6114 case MVE_VMLADAV_T2
:
6116 if ((arm_decode_field (given
, 28, 28) == 1)
6117 && (arm_decode_field (given
, 12, 12) == 1))
6119 *undefined_code
= UNDEF_XCHG_UNS
;
6130 unsigned long sz
= arm_decode_field (given
, 19, 20);
6133 else if ((sz
& 2) == 2)
6137 *undefined_code
= UNDEF_SIZE
;
6151 unsigned long sz
= arm_decode_field (given
, 19, 21);
6154 else if ((sz
& 6) == 2)
6156 else if ((sz
& 4) == 4)
6160 *undefined_code
= UNDEF_SIZE
;
6167 if (arm_decode_field (given
, 19, 20) == 0)
6169 *undefined_code
= UNDEF_SIZE_0
;
6176 if (arm_decode_field (given
, 18, 19) == 3)
6178 *undefined_code
= UNDEF_SIZE_3
;
6189 if (arm_decode_field (given
, 18, 19) == 3)
6191 *undefined_code
= UNDEF_SIZE_3
;
6198 if (arm_decode_field (given
, 18, 19) == 0)
6202 *undefined_code
= UNDEF_SIZE_NOT_0
;
6208 unsigned long size
= arm_decode_field (given
, 18, 19);
6209 if ((size
& 2) == 2)
6211 *undefined_code
= UNDEF_SIZE_2
;
6219 if (arm_decode_field (given
, 18, 19) != 3)
6223 *undefined_code
= UNDEF_SIZE_3
;
6232 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
6233 Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
6234 why this encoding is unpredictable. */
6237 is_mve_unpredictable (unsigned long given
, enum mve_instructions matched_insn
,
6238 enum mve_unpredictable
*unpredictable_code
)
6240 *unpredictable_code
= UNPRED_NONE
;
6242 switch (matched_insn
)
6244 case MVE_VCMP_FP_T2
:
6246 if ((arm_decode_field (given
, 12, 12) == 0)
6247 && (arm_decode_field (given
, 5, 5) == 1))
6249 *unpredictable_code
= UNPRED_FCA_0_FCB_1
;
6255 case MVE_VPT_VEC_T4
:
6256 case MVE_VPT_VEC_T5
:
6257 case MVE_VPT_VEC_T6
:
6258 case MVE_VCMP_VEC_T4
:
6259 case MVE_VCMP_VEC_T5
:
6260 case MVE_VCMP_VEC_T6
:
6261 if (arm_decode_field (given
, 0, 3) == 0xd)
6263 *unpredictable_code
= UNPRED_R13
;
6271 unsigned long gpr
= arm_decode_field (given
, 12, 15);
6274 *unpredictable_code
= UNPRED_R13
;
6277 else if (gpr
== 0xf)
6279 *unpredictable_code
= UNPRED_R15
;
6288 case MVE_VMUL_FP_T2
:
6289 case MVE_VMUL_VEC_T2
:
6292 case MVE_VADD_FP_T2
:
6293 case MVE_VSUB_FP_T2
:
6294 case MVE_VADD_VEC_T2
:
6295 case MVE_VSUB_VEC_T2
:
6305 case MVE_VQDMULH_T3
:
6306 case MVE_VQRDMULH_T4
:
6308 case MVE_VFMA_FP_SCALAR
:
6309 case MVE_VFMAS_FP_SCALAR
:
6313 unsigned long gpr
= arm_decode_field (given
, 0, 3);
6316 *unpredictable_code
= UNPRED_R13
;
6319 else if (gpr
== 0xf)
6321 *unpredictable_code
= UNPRED_R15
;
6331 unsigned long rn
= arm_decode_field (given
, 16, 19);
6333 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6335 *unpredictable_code
= UNPRED_R13_AND_WB
;
6341 *unpredictable_code
= UNPRED_R15
;
6345 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 6)
6347 *unpredictable_code
= UNPRED_Q_GT_6
;
6357 unsigned long rn
= arm_decode_field (given
, 16, 19);
6359 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6361 *unpredictable_code
= UNPRED_R13_AND_WB
;
6367 *unpredictable_code
= UNPRED_R15
;
6371 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 4)
6373 *unpredictable_code
= UNPRED_Q_GT_4
;
6387 unsigned long rn
= arm_decode_field (given
, 16, 19);
6389 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6391 *unpredictable_code
= UNPRED_R13_AND_WB
;
6396 *unpredictable_code
= UNPRED_R15
;
6403 case MVE_VLDRB_GATHER_T1
:
6404 if (arm_decode_field (given
, 0, 0) == 1)
6406 *unpredictable_code
= UNPRED_OS
;
6411 /* To handle common code with T2-T4 variants. */
6412 case MVE_VLDRH_GATHER_T2
:
6413 case MVE_VLDRW_GATHER_T3
:
6414 case MVE_VLDRD_GATHER_T4
:
6416 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6417 unsigned long qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6421 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6425 if (arm_decode_field (given
, 16, 19) == 0xf)
6427 *unpredictable_code
= UNPRED_R15
;
6434 case MVE_VLDRW_GATHER_T5
:
6435 case MVE_VLDRD_GATHER_T6
:
6437 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6438 unsigned long qm
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6442 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6449 case MVE_VSTRB_SCATTER_T1
:
6450 if (arm_decode_field (given
, 16, 19) == 0xf)
6452 *unpredictable_code
= UNPRED_R15
;
6455 else if (arm_decode_field (given
, 0, 0) == 1)
6457 *unpredictable_code
= UNPRED_OS
;
6463 case MVE_VSTRH_SCATTER_T2
:
6464 case MVE_VSTRW_SCATTER_T3
:
6465 case MVE_VSTRD_SCATTER_T4
:
6466 if (arm_decode_field (given
, 16, 19) == 0xf)
6468 *unpredictable_code
= UNPRED_R15
;
6474 case MVE_VMOV2_VEC_LANE_TO_GP
:
6475 case MVE_VMOV2_GP_TO_VEC_LANE
:
6476 case MVE_VCVT_BETWEEN_FP_INT
:
6477 case MVE_VCVT_FROM_FP_TO_INT
:
6479 unsigned long rt
= arm_decode_field (given
, 0, 3);
6480 unsigned long rt2
= arm_decode_field (given
, 16, 19);
6482 if ((rt
== 0xd) || (rt2
== 0xd))
6484 *unpredictable_code
= UNPRED_R13
;
6487 else if ((rt
== 0xf) || (rt2
== 0xf))
6489 *unpredictable_code
= UNPRED_R15
;
6494 *unpredictable_code
= UNPRED_GP_REGS_EQUAL
;
6503 case MVE_VMAXNMV_FP
:
6504 case MVE_VMAXNMAV_FP
:
6505 case MVE_VMINNMV_FP
:
6506 case MVE_VMINNMAV_FP
:
6510 case MVE_VMOV_HFP_TO_GP
:
6511 case MVE_VMOV_GP_TO_VEC_LANE
:
6512 case MVE_VMOV_VEC_LANE_TO_GP
:
6514 unsigned long rda
= arm_decode_field (given
, 12, 15);
6517 *unpredictable_code
= UNPRED_R13
;
6520 else if (rda
== 0xf)
6522 *unpredictable_code
= UNPRED_R15
;
6539 if (arm_decode_field (given
, 20, 21) == 2)
6541 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6542 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6543 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6545 if ((Qd
== Qn
) || (Qd
== Qm
))
6547 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6558 case MVE_VQDMULL_T1
:
6564 if (arm_decode_field (given
, 28, 28) == 1)
6566 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6567 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6568 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6570 if ((Qd
== Qn
) || (Qd
== Qm
))
6572 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6582 case MVE_VQDMULL_T2
:
6584 unsigned long gpr
= arm_decode_field (given
, 0, 3);
6587 *unpredictable_code
= UNPRED_R13
;
6590 else if (gpr
== 0xf)
6592 *unpredictable_code
= UNPRED_R15
;
6596 if (arm_decode_field (given
, 28, 28) == 1)
6599 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
6600 unsigned long Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6604 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6615 case MVE_VRMLSLDAVH
:
6618 if (arm_decode_field (given
, 20, 22) == 6)
6620 *unpredictable_code
= UNPRED_R13
;
6628 if (arm_decode_field (given
, 1, 3) == 6)
6630 *unpredictable_code
= UNPRED_R13
;
6639 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6640 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6641 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 21) == 2)
6643 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6652 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6653 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6654 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 20) == 1)
6656 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6669 if (arm_decode_field (given
, 20, 20) == 1)
6671 Qda
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6672 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6673 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6675 if ((Qda
== Qn
) || (Qda
== Qm
))
6677 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6689 if (arm_decode_field (given
, 16, 19) == 0xd)
6691 *unpredictable_code
= UNPRED_R13
;
6699 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6700 unsigned long qm
= arm_decode_field_multiple (given
, 1, 3, 6, 6);
6704 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6723 unsigned long gpr
= arm_decode_field (given
, 9, 11);
6724 gpr
= ((gpr
<< 1) | 1);
6727 *unpredictable_code
= UNPRED_R13
;
6730 else if (gpr
== 0xf)
6732 *unpredictable_code
= UNPRED_R15
;
6745 print_mve_vmov_index (struct disassemble_info
*info
, unsigned long given
)
6747 unsigned long op1
= arm_decode_field (given
, 21, 22);
6748 unsigned long op2
= arm_decode_field (given
, 5, 6);
6749 unsigned long h
= arm_decode_field (given
, 16, 16);
6750 unsigned long index
, esize
, targetBeat
, idx
;
6751 void *stream
= info
->stream
;
6752 fprintf_ftype func
= info
->fprintf_func
;
6754 if ((op1
& 0x2) == 0x2)
6759 else if (((op1
& 0x2) == 0x0) && ((op2
& 0x1) == 0x1))
6764 else if (((op1
& 0x2) == 0) && ((op2
& 0x3) == 0))
6771 func (stream
, "<undefined index>");
6775 targetBeat
= (op1
& 0x1) | (h
<< 1);
6776 idx
= index
+ targetBeat
* (32/esize
);
6778 func (stream
, "%lu", idx
);
6781 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
6782 in length and integer of floating-point type. */
6784 print_simd_imm8 (struct disassemble_info
*info
, unsigned long given
,
6785 unsigned int ibit_loc
, const struct mopcode32
*insn
)
6788 int cmode
= (given
>> 8) & 0xf;
6789 int op
= (given
>> 5) & 0x1;
6790 unsigned long value
= 0, hival
= 0;
6794 void *stream
= info
->stream
;
6795 fprintf_ftype func
= info
->fprintf_func
;
6797 /* On Neon the 'i' bit is at bit 24, on mve it is
6799 bits
|= ((given
>> ibit_loc
) & 1) << 7;
6800 bits
|= ((given
>> 16) & 7) << 4;
6801 bits
|= ((given
>> 0) & 15) << 0;
6805 shift
= (cmode
>> 1) & 3;
6806 value
= (unsigned long) bits
<< (8 * shift
);
6809 else if (cmode
< 12)
6811 shift
= (cmode
>> 1) & 1;
6812 value
= (unsigned long) bits
<< (8 * shift
);
6815 else if (cmode
< 14)
6817 shift
= (cmode
& 1) + 1;
6818 value
= (unsigned long) bits
<< (8 * shift
);
6819 value
|= (1ul << (8 * shift
)) - 1;
6822 else if (cmode
== 14)
6826 /* Bit replication into bytes. */
6832 for (ix
= 7; ix
>= 0; ix
--)
6834 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
6836 value
= (value
<< 8) | mask
;
6838 hival
= (hival
<< 8) | mask
;
6844 /* Byte replication. */
6845 value
= (unsigned long) bits
;
6851 /* Floating point encoding. */
6854 value
= (unsigned long) (bits
& 0x7f) << 19;
6855 value
|= (unsigned long) (bits
& 0x80) << 24;
6856 tmp
= bits
& 0x40 ? 0x3c : 0x40;
6857 value
|= (unsigned long) tmp
<< 24;
6863 func (stream
, "<illegal constant %.8x:%x:%x>",
6869 // printU determines whether the immediate value should be printed as
6871 unsigned printU
= 0;
6872 switch (insn
->mve_op
)
6876 // We want this for instructions that don't have a 'signed' type
6880 case MVE_VMOV_IMM_TO_VEC
:
6887 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
6894 : "#%ld\t; 0x%.4lx", value
, value
);
6900 unsigned char valbytes
[4];
6903 /* Do this a byte at a time so we don't have to
6904 worry about the host's endianness. */
6905 valbytes
[0] = value
& 0xff;
6906 valbytes
[1] = (value
>> 8) & 0xff;
6907 valbytes
[2] = (value
>> 16) & 0xff;
6908 valbytes
[3] = (value
>> 24) & 0xff;
6910 floatformat_to_double
6911 (& floatformat_ieee_single_little
, valbytes
,
6914 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
6921 : "#%ld\t; 0x%.8lx",
6922 (long) (((value
& 0x80000000L
) != 0)
6924 ? value
| ~0xffffffffL
: value
),
6929 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
6939 print_mve_undefined (struct disassemble_info
*info
,
6940 enum mve_undefined undefined_code
)
6942 void *stream
= info
->stream
;
6943 fprintf_ftype func
= info
->fprintf_func
;
6945 func (stream
, "\t\tundefined instruction: ");
6947 switch (undefined_code
)
6950 func (stream
, "illegal size");
6954 func (stream
, "size equals zero");
6958 func (stream
, "size equals two");
6962 func (stream
, "size equals three");
6965 case UNDEF_SIZE_LE_1
:
6966 func (stream
, "size <= 1");
6969 case UNDEF_SIZE_NOT_0
:
6970 func (stream
, "size not equal to 0");
6973 case UNDEF_SIZE_NOT_2
:
6974 func (stream
, "size not equal to 2");
6977 case UNDEF_SIZE_NOT_3
:
6978 func (stream
, "size not equal to 3");
6981 case UNDEF_NOT_UNS_SIZE_0
:
6982 func (stream
, "not unsigned and size = zero");
6985 case UNDEF_NOT_UNS_SIZE_1
:
6986 func (stream
, "not unsigned and size = one");
6989 case UNDEF_NOT_UNSIGNED
:
6990 func (stream
, "not unsigned");
6993 case UNDEF_VCVT_IMM6
:
6994 func (stream
, "invalid imm6");
6997 case UNDEF_VCVT_FSI_IMM6
:
6998 func (stream
, "fsi = 0 and invalid imm6");
7001 case UNDEF_BAD_OP1_OP2
:
7002 func (stream
, "bad size with op2 = 2 and op1 = 0 or 1");
7005 case UNDEF_BAD_U_OP1_OP2
:
7006 func (stream
, "unsigned with op2 = 0 and op1 = 0 or 1");
7009 case UNDEF_OP_0_BAD_CMODE
:
7010 func (stream
, "op field equal 0 and bad cmode");
7013 case UNDEF_XCHG_UNS
:
7014 func (stream
, "exchange and unsigned together");
7024 print_mve_unpredictable (struct disassemble_info
*info
,
7025 enum mve_unpredictable unpredict_code
)
7027 void *stream
= info
->stream
;
7028 fprintf_ftype func
= info
->fprintf_func
;
7030 func (stream
, "%s: ", UNPREDICTABLE_INSTRUCTION
);
7032 switch (unpredict_code
)
7034 case UNPRED_IT_BLOCK
:
7035 func (stream
, "mve instruction in it block");
7038 case UNPRED_FCA_0_FCB_1
:
7039 func (stream
, "condition bits, fca = 0 and fcb = 1");
7043 func (stream
, "use of r13 (sp)");
7047 func (stream
, "use of r15 (pc)");
7051 func (stream
, "start register block > r4");
7055 func (stream
, "start register block > r6");
7058 case UNPRED_R13_AND_WB
:
7059 func (stream
, "use of r13 and write back");
7062 case UNPRED_Q_REGS_EQUAL
:
7064 "same vector register used for destination and other operand");
7068 func (stream
, "use of offset scaled");
7071 case UNPRED_GP_REGS_EQUAL
:
7072 func (stream
, "same general-purpose register used for both operands");
7075 case UNPRED_Q_REGS_EQ_AND_SIZE_1
:
7076 func (stream
, "use of identical q registers and size = 1");
7079 case UNPRED_Q_REGS_EQ_AND_SIZE_2
:
7080 func (stream
, "use of identical q registers and size = 1");
7088 /* Print register block operand for mve vld2/vld4/vst2/vld4. */
7091 print_mve_register_blocks (struct disassemble_info
*info
,
7092 unsigned long given
,
7093 enum mve_instructions matched_insn
)
7095 void *stream
= info
->stream
;
7096 fprintf_ftype func
= info
->fprintf_func
;
7098 unsigned long q_reg_start
= arm_decode_field_multiple (given
,
7101 switch (matched_insn
)
7105 if (q_reg_start
<= 6)
7106 func (stream
, "{q%ld, q%ld}", q_reg_start
, q_reg_start
+ 1);
7108 func (stream
, "<illegal reg q%ld>", q_reg_start
);
7113 if (q_reg_start
<= 4)
7114 func (stream
, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start
,
7115 q_reg_start
+ 1, q_reg_start
+ 2,
7118 func (stream
, "<illegal reg q%ld>", q_reg_start
);
7127 print_mve_rounding_mode (struct disassemble_info
*info
,
7128 unsigned long given
,
7129 enum mve_instructions matched_insn
)
7131 void *stream
= info
->stream
;
7132 fprintf_ftype func
= info
->fprintf_func
;
7134 switch (matched_insn
)
7136 case MVE_VCVT_FROM_FP_TO_INT
:
7138 switch (arm_decode_field (given
, 8, 9))
7164 switch (arm_decode_field (given
, 7, 9))
7203 print_mve_vcvt_size (struct disassemble_info
*info
,
7204 unsigned long given
,
7205 enum mve_instructions matched_insn
)
7207 unsigned long mode
= 0;
7208 void *stream
= info
->stream
;
7209 fprintf_ftype func
= info
->fprintf_func
;
7211 switch (matched_insn
)
7213 case MVE_VCVT_FP_FIX_VEC
:
7215 mode
= (((given
& 0x200) >> 7)
7216 | ((given
& 0x10000000) >> 27)
7217 | ((given
& 0x100) >> 8));
7222 func (stream
, "f16.s16");
7226 func (stream
, "s16.f16");
7230 func (stream
, "f16.u16");
7234 func (stream
, "u16.f16");
7238 func (stream
, "f32.s32");
7242 func (stream
, "s32.f32");
7246 func (stream
, "f32.u32");
7250 func (stream
, "u32.f32");
7258 case MVE_VCVT_BETWEEN_FP_INT
:
7260 unsigned long size
= arm_decode_field (given
, 18, 19);
7261 unsigned long op
= arm_decode_field (given
, 7, 8);
7268 func (stream
, "f16.s16");
7272 func (stream
, "f16.u16");
7276 func (stream
, "s16.f16");
7280 func (stream
, "u16.f16");
7292 func (stream
, "f32.s32");
7296 func (stream
, "f32.u32");
7300 func (stream
, "s32.f32");
7304 func (stream
, "u32.f32");
7311 case MVE_VCVT_FP_HALF_FP
:
7313 unsigned long op
= arm_decode_field (given
, 28, 28);
7315 func (stream
, "f16.f32");
7317 func (stream
, "f32.f16");
7321 case MVE_VCVT_FROM_FP_TO_INT
:
7323 unsigned long size
= arm_decode_field_multiple (given
, 7, 7, 18, 19);
7328 func (stream
, "s16.f16");
7332 func (stream
, "u16.f16");
7336 func (stream
, "s32.f32");
7340 func (stream
, "u32.f32");
7355 print_mve_rotate (struct disassemble_info
*info
, unsigned long rot
,
7356 unsigned long rot_width
)
7358 void *stream
= info
->stream
;
7359 fprintf_ftype func
= info
->fprintf_func
;
7366 func (stream
, "90");
7369 func (stream
, "270");
7375 else if (rot_width
== 2)
7383 func (stream
, "90");
7386 func (stream
, "180");
7389 func (stream
, "270");
7398 print_instruction_predicate (struct disassemble_info
*info
)
7400 void *stream
= info
->stream
;
7401 fprintf_ftype func
= info
->fprintf_func
;
7403 if (vpt_block_state
.next_pred_state
== PRED_THEN
)
7405 else if (vpt_block_state
.next_pred_state
== PRED_ELSE
)
7410 print_mve_size (struct disassemble_info
*info
,
7412 enum mve_instructions matched_insn
)
7414 void *stream
= info
->stream
;
7415 fprintf_ftype func
= info
->fprintf_func
;
7417 switch (matched_insn
)
7423 case MVE_VADD_VEC_T1
:
7424 case MVE_VADD_VEC_T2
:
7430 case MVE_VCMP_VEC_T1
:
7431 case MVE_VCMP_VEC_T2
:
7432 case MVE_VCMP_VEC_T3
:
7433 case MVE_VCMP_VEC_T4
:
7434 case MVE_VCMP_VEC_T5
:
7435 case MVE_VCMP_VEC_T6
:
7448 case MVE_VLDRB_GATHER_T1
:
7449 case MVE_VLDRH_GATHER_T2
:
7450 case MVE_VLDRW_GATHER_T3
:
7451 case MVE_VLDRD_GATHER_T4
:
7464 case MVE_VMUL_VEC_T1
:
7465 case MVE_VMUL_VEC_T2
:
7471 case MVE_VPT_VEC_T1
:
7472 case MVE_VPT_VEC_T2
:
7473 case MVE_VPT_VEC_T3
:
7474 case MVE_VPT_VEC_T4
:
7475 case MVE_VPT_VEC_T5
:
7476 case MVE_VPT_VEC_T6
:
7488 case MVE_VQDMULH_T1
:
7489 case MVE_VQRDMULH_T2
:
7490 case MVE_VQDMULH_T3
:
7491 case MVE_VQRDMULH_T4
:
7510 case MVE_VSTRB_SCATTER_T1
:
7511 case MVE_VSTRH_SCATTER_T2
:
7512 case MVE_VSTRW_SCATTER_T3
:
7515 case MVE_VSUB_VEC_T1
:
7516 case MVE_VSUB_VEC_T2
:
7518 func (stream
, "%s", mve_vec_sizename
[size
]);
7520 func (stream
, "<undef size>");
7524 case MVE_VADD_FP_T1
:
7525 case MVE_VADD_FP_T2
:
7526 case MVE_VSUB_FP_T1
:
7527 case MVE_VSUB_FP_T2
:
7528 case MVE_VCMP_FP_T1
:
7529 case MVE_VCMP_FP_T2
:
7530 case MVE_VFMA_FP_SCALAR
:
7533 case MVE_VFMAS_FP_SCALAR
:
7535 case MVE_VMAXNMA_FP
:
7536 case MVE_VMAXNMV_FP
:
7537 case MVE_VMAXNMAV_FP
:
7539 case MVE_VMINNMA_FP
:
7540 case MVE_VMINNMV_FP
:
7541 case MVE_VMINNMAV_FP
:
7542 case MVE_VMUL_FP_T1
:
7543 case MVE_VMUL_FP_T2
:
7547 func (stream
, "32");
7549 func (stream
, "16");
7555 case MVE_VMLADAV_T1
:
7557 case MVE_VMLSDAV_T1
:
7560 case MVE_VQDMULL_T1
:
7561 case MVE_VQDMULL_T2
:
7565 func (stream
, "16");
7567 func (stream
, "32");
7574 func (stream
, "16");
7581 func (stream
, "32");
7584 func (stream
, "16");
7594 case MVE_VMOV_GP_TO_VEC_LANE
:
7595 case MVE_VMOV_VEC_LANE_TO_GP
:
7599 func (stream
, "32");
7604 func (stream
, "16");
7607 case 8: case 9: case 10: case 11:
7608 case 12: case 13: case 14: case 15:
7617 case MVE_VMOV_IMM_TO_VEC
:
7620 case 0: case 4: case 8:
7621 case 12: case 24: case 26:
7622 func (stream
, "i32");
7625 func (stream
, "i16");
7628 func (stream
, "i8");
7631 func (stream
, "i64");
7634 func (stream
, "f32");
7641 case MVE_VMULL_POLY
:
7643 func (stream
, "p8");
7645 func (stream
, "p16");
7651 case 0: case 2: case 4:
7652 case 6: case 12: case 13:
7653 func (stream
, "32");
7657 func (stream
, "16");
7671 func (stream
, "32");
7675 func (stream
, "16");
7693 func (stream
, "16");
7697 func (stream
, "32");
7722 func (stream
, "16");
7725 case 4: case 5: case 6: case 7:
7726 func (stream
, "32");
7741 print_mve_shift_n (struct disassemble_info
*info
, long given
,
7742 enum mve_instructions matched_insn
)
7744 void *stream
= info
->stream
;
7745 fprintf_ftype func
= info
->fprintf_func
;
7748 = matched_insn
== MVE_VQSHL_T2
7749 || matched_insn
== MVE_VQSHLU_T3
7750 || matched_insn
== MVE_VSHL_T1
7751 || matched_insn
== MVE_VSHLL_T1
7752 || matched_insn
== MVE_VSLI
;
7754 unsigned imm6
= (given
& 0x3f0000) >> 16;
7756 if (matched_insn
== MVE_VSHLL_T1
)
7759 unsigned shiftAmount
= 0;
7760 if ((imm6
& 0x20) != 0)
7761 shiftAmount
= startAt0
? imm6
- 32 : 64 - imm6
;
7762 else if ((imm6
& 0x10) != 0)
7763 shiftAmount
= startAt0
? imm6
- 16 : 32 - imm6
;
7764 else if ((imm6
& 0x08) != 0)
7765 shiftAmount
= startAt0
? imm6
- 8 : 16 - imm6
;
7767 print_mve_undefined (info
, UNDEF_SIZE_0
);
7769 func (stream
, "%u", shiftAmount
);
7773 print_vec_condition (struct disassemble_info
*info
, long given
,
7774 enum mve_instructions matched_insn
)
7776 void *stream
= info
->stream
;
7777 fprintf_ftype func
= info
->fprintf_func
;
7780 switch (matched_insn
)
7783 case MVE_VCMP_FP_T1
:
7784 vec_cond
= (((given
& 0x1000) >> 10)
7785 | ((given
& 1) << 1)
7786 | ((given
& 0x0080) >> 7));
7787 func (stream
, "%s",vec_condnames
[vec_cond
]);
7791 case MVE_VCMP_FP_T2
:
7792 vec_cond
= (((given
& 0x1000) >> 10)
7793 | ((given
& 0x0020) >> 4)
7794 | ((given
& 0x0080) >> 7));
7795 func (stream
, "%s",vec_condnames
[vec_cond
]);
7798 case MVE_VPT_VEC_T1
:
7799 case MVE_VCMP_VEC_T1
:
7800 vec_cond
= (given
& 0x0080) >> 7;
7801 func (stream
, "%s",vec_condnames
[vec_cond
]);
7804 case MVE_VPT_VEC_T2
:
7805 case MVE_VCMP_VEC_T2
:
7806 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7807 func (stream
, "%s",vec_condnames
[vec_cond
]);
7810 case MVE_VPT_VEC_T3
:
7811 case MVE_VCMP_VEC_T3
:
7812 vec_cond
= 4 | ((given
& 1) << 1) | ((given
& 0x0080) >> 7);
7813 func (stream
, "%s",vec_condnames
[vec_cond
]);
7816 case MVE_VPT_VEC_T4
:
7817 case MVE_VCMP_VEC_T4
:
7818 vec_cond
= (given
& 0x0080) >> 7;
7819 func (stream
, "%s",vec_condnames
[vec_cond
]);
7822 case MVE_VPT_VEC_T5
:
7823 case MVE_VCMP_VEC_T5
:
7824 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7825 func (stream
, "%s",vec_condnames
[vec_cond
]);
7828 case MVE_VPT_VEC_T6
:
7829 case MVE_VCMP_VEC_T6
:
7830 vec_cond
= 4 | ((given
& 0x0020) >> 4) | ((given
& 0x0080) >> 7);
7831 func (stream
, "%s",vec_condnames
[vec_cond
]);
7846 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
7847 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
7848 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0)
7849 #define PRE_BIT_SET (given & (1 << P_BIT))
7852 /* Print one coprocessor instruction on INFO->STREAM.
7853 Return TRUE if the instuction matched, FALSE if this is not a
7854 recognised coprocessor instruction. */
7857 print_insn_coprocessor (bfd_vma pc
,
7858 struct disassemble_info
*info
,
7862 const struct sopcode32
*insn
;
7863 void *stream
= info
->stream
;
7864 fprintf_ftype func
= info
->fprintf_func
;
7866 unsigned long value
= 0;
7869 struct arm_private_data
*private_data
= info
->private_data
;
7870 arm_feature_set allowed_arches
= ARM_ARCH_NONE
;
7871 arm_feature_set arm_ext_v8_1m_main
=
7872 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
7874 allowed_arches
= private_data
->features
;
7876 for (insn
= coprocessor_opcodes
; insn
->assembler
; insn
++)
7878 unsigned long u_reg
= 16;
7879 bfd_boolean is_unpredictable
= FALSE
;
7880 signed long value_in_comment
= 0;
7883 if (ARM_FEATURE_ZERO (insn
->arch
))
7884 switch (insn
->value
)
7886 case SENTINEL_IWMMXT_START
:
7887 if (info
->mach
!= bfd_mach_arm_XScale
7888 && info
->mach
!= bfd_mach_arm_iWMMXt
7889 && info
->mach
!= bfd_mach_arm_iWMMXt2
)
7892 while ((! ARM_FEATURE_ZERO (insn
->arch
))
7893 && insn
->value
!= SENTINEL_IWMMXT_END
);
7896 case SENTINEL_IWMMXT_END
:
7899 case SENTINEL_GENERIC_START
:
7900 allowed_arches
= private_data
->features
;
7908 value
= insn
->value
;
7909 cp_num
= (given
>> 8) & 0xf;
7913 /* The high 4 bits are 0xe for Arm conditional instructions, and
7914 0xe for arm unconditional instructions. The rest of the
7915 encoding is the same. */
7917 value
|= 0xe0000000;
7925 /* Only match unconditional instuctions against unconditional
7927 if ((given
& 0xf0000000) == 0xf0000000)
7934 cond
= (given
>> 28) & 0xf;
7940 if ((insn
->isa
== T32
&& !thumb
)
7941 || (insn
->isa
== ARM
&& thumb
))
7944 if ((given
& mask
) != value
)
7947 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, allowed_arches
))
7950 if (insn
->value
== 0xfe000010 /* mcr2 */
7951 || insn
->value
== 0xfe100010 /* mrc2 */
7952 || insn
->value
== 0xfc100000 /* ldc2 */
7953 || insn
->value
== 0xfc000000) /* stc2 */
7955 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7956 is_unpredictable
= TRUE
;
7958 /* Armv8.1-M Mainline FP & MVE instructions. */
7959 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7960 && !ARM_CPU_IS_ANY (allowed_arches
)
7961 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7965 else if (insn
->value
== 0x0e000000 /* cdp */
7966 || insn
->value
== 0xfe000000 /* cdp2 */
7967 || insn
->value
== 0x0e000010 /* mcr */
7968 || insn
->value
== 0x0e100010 /* mrc */
7969 || insn
->value
== 0x0c100000 /* ldc */
7970 || insn
->value
== 0x0c000000) /* stc */
7972 /* Floating-point instructions. */
7973 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7976 /* Armv8.1-M Mainline FP & MVE instructions. */
7977 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7978 && !ARM_CPU_IS_ANY (allowed_arches
)
7979 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7982 else if ((insn
->value
== 0xec100f80 /* vldr (system register) */
7983 || insn
->value
== 0xec000f80) /* vstr (system register) */
7984 && arm_decode_field (given
, 24, 24) == 0
7985 && arm_decode_field (given
, 21, 21) == 0)
7986 /* If the P and W bits are both 0 then these encodings match the MVE
7987 VLDR and VSTR instructions, these are in a different table, so we
7988 don't let it match here. */
7991 for (c
= insn
->assembler
; *c
; c
++)
7995 const char mod
= *++c
;
7999 func (stream
, "%%");
8005 int rn
= (given
>> 16) & 0xf;
8006 bfd_vma offset
= given
& 0xff;
8009 offset
= given
& 0x7f;
8011 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
8013 if (PRE_BIT_SET
|| WRITEBACK_BIT_SET
)
8015 /* Not unindexed. The offset is scaled. */
8017 /* vldr.16/vstr.16 will shift the address
8018 left by 1 bit only. */
8019 offset
= offset
* 2;
8021 offset
= offset
* 4;
8023 if (NEGATIVE_BIT_SET
)
8026 value_in_comment
= offset
;
8032 func (stream
, ", #%d]%s",
8034 WRITEBACK_BIT_SET
? "!" : "");
8035 else if (NEGATIVE_BIT_SET
)
8036 func (stream
, ", #-0]");
8044 if (WRITEBACK_BIT_SET
)
8047 func (stream
, ", #%d", (int) offset
);
8048 else if (NEGATIVE_BIT_SET
)
8049 func (stream
, ", #-0");
8053 func (stream
, ", {%s%d}",
8054 (NEGATIVE_BIT_SET
&& !offset
) ? "-" : "",
8056 value_in_comment
= offset
;
8059 if (rn
== 15 && (PRE_BIT_SET
|| WRITEBACK_BIT_SET
))
8061 func (stream
, "\t; ");
8062 /* For unaligned PCs, apply off-by-alignment
8064 info
->print_address_func (offset
+ pc
8065 + info
->bytes_per_chunk
* 2
8074 int regno
= ((given
>> 12) & 0xf) | ((given
>> (22 - 4)) & 0x10);
8075 int offset
= (given
>> 1) & 0x3f;
8078 func (stream
, "{d%d}", regno
);
8079 else if (regno
+ offset
> 32)
8080 func (stream
, "{d%d-<overflow reg d%d>}", regno
, regno
+ offset
- 1);
8082 func (stream
, "{d%d-d%d}", regno
, regno
+ offset
- 1);
8088 bfd_boolean single
= ((given
>> 8) & 1) == 0;
8089 char reg_prefix
= single
? 's' : 'd';
8090 int Dreg
= (given
>> 22) & 0x1;
8091 int Vdreg
= (given
>> 12) & 0xf;
8092 int reg
= single
? ((Vdreg
<< 1) | Dreg
)
8093 : ((Dreg
<< 4) | Vdreg
);
8094 int num
= (given
>> (single
? 0 : 1)) & 0x7f;
8095 int maxreg
= single
? 31 : 15;
8096 int topreg
= reg
+ num
- 1;
8099 func (stream
, "{VPR}");
8101 func (stream
, "{%c%d, VPR}", reg_prefix
, reg
);
8102 else if (topreg
> maxreg
)
8103 func (stream
, "{%c%d-<overflow reg d%d, VPR}",
8104 reg_prefix
, reg
, single
? topreg
>> 1 : topreg
);
8106 func (stream
, "{%c%d-%c%d, VPR}", reg_prefix
, reg
,
8107 reg_prefix
, topreg
);
8112 if (cond
!= COND_UNCOND
)
8113 is_unpredictable
= TRUE
;
8117 if (cond
!= COND_UNCOND
&& cp_num
== 9)
8118 is_unpredictable
= TRUE
;
8120 func (stream
, "%s", arm_conditional
[cond
]);
8124 /* Print a Cirrus/DSP shift immediate. */
8125 /* Immediates are 7bit signed ints with bits 0..3 in
8126 bits 0..3 of opcode and bits 4..6 in bits 5..7
8131 imm
= (given
& 0xf) | ((given
& 0xe0) >> 1);
8133 /* Is ``imm'' a negative number? */
8137 func (stream
, "%d", imm
);
8145 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
8150 func (stream
, "FPSCR");
8153 func (stream
, "FPSCR_nzcvqc");
8156 func (stream
, "VPR");
8159 func (stream
, "P0");
8162 func (stream
, "FPCXTNS");
8165 func (stream
, "FPCXTS");
8168 func (stream
, "<invalid reg %lu>", regno
);
8175 switch (given
& 0x00408000)
8192 switch (given
& 0x00080080)
8204 func (stream
, _("<illegal precision>"));
8210 switch (given
& 0x00408000)
8228 switch (given
& 0x60)
8244 case '0': case '1': case '2': case '3': case '4':
8245 case '5': case '6': case '7': case '8': case '9':
8249 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
8255 is_unpredictable
= TRUE
;
8260 /* Eat the 'u' character. */
8264 is_unpredictable
= TRUE
;
8267 func (stream
, "%s", arm_regnames
[value
]);
8270 if (given
& (1 << 6))
8274 func (stream
, "d%ld", value
);
8279 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
8281 func (stream
, "q%ld", value
>> 1);
8284 func (stream
, "%ld", value
);
8285 value_in_comment
= value
;
8289 /* Converts immediate 8 bit back to float value. */
8290 unsigned floatVal
= (value
& 0x80) << 24
8291 | (value
& 0x3F) << 19
8292 | ((value
& 0x40) ? (0xF8 << 22) : (1 << 30));
8294 /* Quarter float have a maximum value of 31.0.
8295 Get floating point value multiplied by 1e7.
8296 The maximum value stays in limit of a 32-bit int. */
8298 (78125 << (((floatVal
>> 23) & 0xFF) - 124)) *
8299 (16 + (value
& 0xF));
8301 if (!(decVal
% 1000000))
8302 func (stream
, "%ld\t; 0x%08x %c%u.%01u", value
,
8303 floatVal
, value
& 0x80 ? '-' : ' ',
8305 decVal
% 10000000 / 1000000);
8306 else if (!(decVal
% 10000))
8307 func (stream
, "%ld\t; 0x%08x %c%u.%03u", value
,
8308 floatVal
, value
& 0x80 ? '-' : ' ',
8310 decVal
% 10000000 / 10000);
8312 func (stream
, "%ld\t; 0x%08x %c%u.%07u", value
,
8313 floatVal
, value
& 0x80 ? '-' : ' ',
8314 decVal
/ 10000000, decVal
% 10000000);
8319 int from
= (given
& (1 << 7)) ? 32 : 16;
8320 func (stream
, "%ld", from
- value
);
8326 func (stream
, "#%s", arm_fp_const
[value
& 7]);
8328 func (stream
, "f%ld", value
);
8333 func (stream
, "%s", iwmmxt_wwnames
[value
]);
8335 func (stream
, "%s", iwmmxt_wwssnames
[value
]);
8339 func (stream
, "%s", iwmmxt_regnames
[value
]);
8342 func (stream
, "%s", iwmmxt_cregnames
[value
]);
8346 func (stream
, "0x%lx", (value
& 0xffffffffUL
));
8353 func (stream
, "eq");
8357 func (stream
, "vs");
8361 func (stream
, "ge");
8365 func (stream
, "gt");
8369 func (stream
, "??");
8377 func (stream
, "%c", *c
);
8381 if (value
== ((1ul << width
) - 1))
8382 func (stream
, "%c", *c
);
8385 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
8397 int single
= *c
++ == 'y';
8402 case '4': /* Sm pair */
8403 case '0': /* Sm, Dm */
8404 regno
= given
& 0x0000000f;
8408 regno
+= (given
>> 5) & 1;
8411 regno
+= ((given
>> 5) & 1) << 4;
8414 case '1': /* Sd, Dd */
8415 regno
= (given
>> 12) & 0x0000000f;
8419 regno
+= (given
>> 22) & 1;
8422 regno
+= ((given
>> 22) & 1) << 4;
8425 case '2': /* Sn, Dn */
8426 regno
= (given
>> 16) & 0x0000000f;
8430 regno
+= (given
>> 7) & 1;
8433 regno
+= ((given
>> 7) & 1) << 4;
8436 case '3': /* List */
8438 regno
= (given
>> 12) & 0x0000000f;
8442 regno
+= (given
>> 22) & 1;
8445 regno
+= ((given
>> 22) & 1) << 4;
8452 func (stream
, "%c%d", single
? 's' : 'd', regno
);
8456 int count
= given
& 0xff;
8463 func (stream
, "-%c%d",
8471 func (stream
, ", %c%d", single
? 's' : 'd',
8477 switch (given
& 0x00400100)
8479 case 0x00000000: func (stream
, "b"); break;
8480 case 0x00400000: func (stream
, "h"); break;
8481 case 0x00000100: func (stream
, "w"); break;
8482 case 0x00400100: func (stream
, "d"); break;
8490 /* given (20, 23) | given (0, 3) */
8491 value
= ((given
>> 16) & 0xf0) | (given
& 0xf);
8492 func (stream
, "%d", (int) value
);
8497 /* This is like the 'A' operator, except that if
8498 the width field "M" is zero, then the offset is
8499 *not* multiplied by four. */
8501 int offset
= given
& 0xff;
8502 int multiplier
= (given
& 0x00000100) ? 4 : 1;
8504 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
8508 value_in_comment
= offset
* multiplier
;
8509 if (NEGATIVE_BIT_SET
)
8510 value_in_comment
= - value_in_comment
;
8516 func (stream
, ", #%s%d]%s",
8517 NEGATIVE_BIT_SET
? "-" : "",
8518 offset
* multiplier
,
8519 WRITEBACK_BIT_SET
? "!" : "");
8521 func (stream
, "], #%s%d",
8522 NEGATIVE_BIT_SET
? "-" : "",
8523 offset
* multiplier
);
8532 int imm4
= (given
>> 4) & 0xf;
8533 int puw_bits
= ((given
>> 22) & 6) | ((given
>> W_BIT
) & 1);
8534 int ubit
= ! NEGATIVE_BIT_SET
;
8535 const char *rm
= arm_regnames
[given
& 0xf];
8536 const char *rn
= arm_regnames
[(given
>> 16) & 0xf];
8542 func (stream
, "[%s], %c%s", rn
, ubit
? '+' : '-', rm
);
8544 func (stream
, ", lsl #%d", imm4
);
8551 func (stream
, "[%s, %c%s", rn
, ubit
? '+' : '-', rm
);
8553 func (stream
, ", lsl #%d", imm4
);
8555 if (puw_bits
== 5 || puw_bits
== 7)
8560 func (stream
, "INVALID");
8568 imm5
= ((given
& 0x100) >> 4) | (given
& 0xf);
8569 func (stream
, "%ld", (imm5
== 0) ? 32 : imm5
);
8578 func (stream
, "%c", *c
);
8581 if (value_in_comment
> 32 || value_in_comment
< -16)
8582 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
8584 if (is_unpredictable
)
8585 func (stream
, UNPREDICTABLE_INSTRUCTION
);
8592 /* Decodes and prints ARM addressing modes. Returns the offset
8593 used in the address, if any, if it is worthwhile printing the
8594 offset as a hexadecimal value in a comment at the end of the
8595 line of disassembly. */
8598 print_arm_address (bfd_vma pc
, struct disassemble_info
*info
, long given
)
8600 void *stream
= info
->stream
;
8601 fprintf_ftype func
= info
->fprintf_func
;
8604 if (((given
& 0x000f0000) == 0x000f0000)
8605 && ((given
& 0x02000000) == 0))
8607 offset
= given
& 0xfff;
8609 func (stream
, "[pc");
8613 /* Pre-indexed. Elide offset of positive zero when
8615 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8616 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8618 if (NEGATIVE_BIT_SET
)
8623 /* Cope with the possibility of write-back
8624 being used. Probably a very dangerous thing
8625 for the programmer to do, but who are we to
8627 func (stream
, "]%s", WRITEBACK_BIT_SET
? "!" : "");
8629 else /* Post indexed. */
8631 func (stream
, "], #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8633 /* Ie ignore the offset. */
8637 func (stream
, "\t; ");
8638 info
->print_address_func (offset
, info
);
8643 func (stream
, "[%s",
8644 arm_regnames
[(given
>> 16) & 0xf]);
8648 if ((given
& 0x02000000) == 0)
8650 /* Elide offset of positive zero when non-writeback. */
8651 offset
= given
& 0xfff;
8652 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8653 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8657 func (stream
, ", %s", NEGATIVE_BIT_SET
? "-" : "");
8658 arm_decode_shift (given
, func
, stream
, TRUE
);
8661 func (stream
, "]%s",
8662 WRITEBACK_BIT_SET
? "!" : "");
8666 if ((given
& 0x02000000) == 0)
8668 /* Always show offset. */
8669 offset
= given
& 0xfff;
8670 func (stream
, "], #%s%d",
8671 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8675 func (stream
, "], %s",
8676 NEGATIVE_BIT_SET
? "-" : "");
8677 arm_decode_shift (given
, func
, stream
, TRUE
);
8680 if (NEGATIVE_BIT_SET
)
8684 return (signed long) offset
;
8687 /* Print one neon instruction on INFO->STREAM.
8688 Return TRUE if the instuction matched, FALSE if this is not a
8689 recognised neon instruction. */
8692 print_insn_neon (struct disassemble_info
*info
, long given
, bfd_boolean thumb
)
8694 const struct opcode32
*insn
;
8695 void *stream
= info
->stream
;
8696 fprintf_ftype func
= info
->fprintf_func
;
8700 if ((given
& 0xef000000) == 0xef000000)
8702 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
8703 unsigned long bit28
= given
& (1 << 28);
8705 given
&= 0x00ffffff;
8707 given
|= 0xf3000000;
8709 given
|= 0xf2000000;
8711 else if ((given
& 0xff000000) == 0xf9000000)
8712 given
^= 0xf9000000 ^ 0xf4000000;
8713 /* vdup is also a valid neon instruction. */
8714 else if ((given
& 0xff910f5f) != 0xee800b10)
8718 for (insn
= neon_opcodes
; insn
->assembler
; insn
++)
8720 if ((given
& insn
->mask
) == insn
->value
)
8722 signed long value_in_comment
= 0;
8723 bfd_boolean is_unpredictable
= FALSE
;
8726 for (c
= insn
->assembler
; *c
; c
++)
8733 func (stream
, "%%");
8737 if (thumb
&& ifthen_state
)
8738 is_unpredictable
= TRUE
;
8742 if (thumb
&& ifthen_state
)
8743 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
8748 static const unsigned char enc
[16] =
8750 0x4, 0x14, /* st4 0,1 */
8762 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8763 int rn
= ((given
>> 16) & 0xf);
8764 int rm
= ((given
>> 0) & 0xf);
8765 int align
= ((given
>> 4) & 0x3);
8766 int type
= ((given
>> 8) & 0xf);
8767 int n
= enc
[type
] & 0xf;
8768 int stride
= (enc
[type
] >> 4) + 1;
8773 for (ix
= 0; ix
!= n
; ix
++)
8774 func (stream
, "%sd%d", ix
? "," : "", rd
+ ix
* stride
);
8776 func (stream
, "d%d", rd
);
8778 func (stream
, "d%d-d%d", rd
, rd
+ n
- 1);
8779 func (stream
, "}, [%s", arm_regnames
[rn
]);
8781 func (stream
, " :%d", 32 << align
);
8786 func (stream
, ", %s", arm_regnames
[rm
]);
8792 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8793 int rn
= ((given
>> 16) & 0xf);
8794 int rm
= ((given
>> 0) & 0xf);
8795 int idx_align
= ((given
>> 4) & 0xf);
8797 int size
= ((given
>> 10) & 0x3);
8798 int idx
= idx_align
>> (size
+ 1);
8799 int length
= ((given
>> 8) & 3) + 1;
8803 if (length
> 1 && size
> 0)
8804 stride
= (idx_align
& (1 << size
)) ? 2 : 1;
8810 int amask
= (1 << size
) - 1;
8811 if ((idx_align
& (1 << size
)) != 0)
8815 if ((idx_align
& amask
) == amask
)
8817 else if ((idx_align
& amask
) != 0)
8824 if (size
== 2 && (idx_align
& 2) != 0)
8826 align
= (idx_align
& 1) ? 16 << size
: 0;
8830 if ((size
== 2 && (idx_align
& 3) != 0)
8831 || (idx_align
& 1) != 0)
8838 if ((idx_align
& 3) == 3)
8840 align
= (idx_align
& 3) * 64;
8843 align
= (idx_align
& 1) ? 32 << size
: 0;
8851 for (i
= 0; i
< length
; i
++)
8852 func (stream
, "%sd%d[%d]", (i
== 0) ? "" : ",",
8853 rd
+ i
* stride
, idx
);
8854 func (stream
, "}, [%s", arm_regnames
[rn
]);
8856 func (stream
, " :%d", align
);
8861 func (stream
, ", %s", arm_regnames
[rm
]);
8867 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8868 int rn
= ((given
>> 16) & 0xf);
8869 int rm
= ((given
>> 0) & 0xf);
8870 int align
= ((given
>> 4) & 0x1);
8871 int size
= ((given
>> 6) & 0x3);
8872 int type
= ((given
>> 8) & 0x3);
8874 int stride
= ((given
>> 5) & 0x1);
8877 if (stride
&& (n
== 1))
8884 for (ix
= 0; ix
!= n
; ix
++)
8885 func (stream
, "%sd%d[]", ix
? "," : "", rd
+ ix
* stride
);
8887 func (stream
, "d%d[]", rd
);
8889 func (stream
, "d%d[]-d%d[]", rd
, rd
+ n
- 1);
8890 func (stream
, "}, [%s", arm_regnames
[rn
]);
8893 align
= (8 * (type
+ 1)) << size
;
8895 align
= (size
> 1) ? align
>> 1 : align
;
8896 if (type
== 2 || (type
== 0 && !size
))
8897 func (stream
, " :<bad align %d>", align
);
8899 func (stream
, " :%d", align
);
8905 func (stream
, ", %s", arm_regnames
[rm
]);
8911 int raw_reg
= (given
& 0xf) | ((given
>> 1) & 0x10);
8912 int size
= (given
>> 20) & 3;
8913 int reg
= raw_reg
& ((4 << size
) - 1);
8914 int ix
= raw_reg
>> size
>> 2;
8916 func (stream
, "d%d[%d]", reg
, ix
);
8921 /* Neon encoded constant for mov, mvn, vorr, vbic. */
8924 int cmode
= (given
>> 8) & 0xf;
8925 int op
= (given
>> 5) & 0x1;
8926 unsigned long value
= 0, hival
= 0;
8931 bits
|= ((given
>> 24) & 1) << 7;
8932 bits
|= ((given
>> 16) & 7) << 4;
8933 bits
|= ((given
>> 0) & 15) << 0;
8937 shift
= (cmode
>> 1) & 3;
8938 value
= (unsigned long) bits
<< (8 * shift
);
8941 else if (cmode
< 12)
8943 shift
= (cmode
>> 1) & 1;
8944 value
= (unsigned long) bits
<< (8 * shift
);
8947 else if (cmode
< 14)
8949 shift
= (cmode
& 1) + 1;
8950 value
= (unsigned long) bits
<< (8 * shift
);
8951 value
|= (1ul << (8 * shift
)) - 1;
8954 else if (cmode
== 14)
8958 /* Bit replication into bytes. */
8964 for (ix
= 7; ix
>= 0; ix
--)
8966 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
8968 value
= (value
<< 8) | mask
;
8970 hival
= (hival
<< 8) | mask
;
8976 /* Byte replication. */
8977 value
= (unsigned long) bits
;
8983 /* Floating point encoding. */
8986 value
= (unsigned long) (bits
& 0x7f) << 19;
8987 value
|= (unsigned long) (bits
& 0x80) << 24;
8988 tmp
= bits
& 0x40 ? 0x3c : 0x40;
8989 value
|= (unsigned long) tmp
<< 24;
8995 func (stream
, "<illegal constant %.8x:%x:%x>",
9003 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
9007 func (stream
, "#%ld\t; 0x%.4lx", value
, value
);
9013 unsigned char valbytes
[4];
9016 /* Do this a byte at a time so we don't have to
9017 worry about the host's endianness. */
9018 valbytes
[0] = value
& 0xff;
9019 valbytes
[1] = (value
>> 8) & 0xff;
9020 valbytes
[2] = (value
>> 16) & 0xff;
9021 valbytes
[3] = (value
>> 24) & 0xff;
9023 floatformat_to_double
9024 (& floatformat_ieee_single_little
, valbytes
,
9027 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
9031 func (stream
, "#%ld\t; 0x%.8lx",
9032 (long) (((value
& 0x80000000L
) != 0)
9033 ? value
| ~0xffffffffL
: value
),
9038 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
9049 int regno
= ((given
>> 16) & 0xf) | ((given
>> (7 - 4)) & 0x10);
9050 int num
= (given
>> 8) & 0x3;
9053 func (stream
, "{d%d}", regno
);
9054 else if (num
+ regno
>= 32)
9055 func (stream
, "{d%d-<overflow reg d%d}", regno
, regno
+ num
);
9057 func (stream
, "{d%d-d%d}", regno
, regno
+ num
);
9062 case '0': case '1': case '2': case '3': case '4':
9063 case '5': case '6': case '7': case '8': case '9':
9066 unsigned long value
;
9068 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9073 func (stream
, "%s", arm_regnames
[value
]);
9076 func (stream
, "%ld", value
);
9077 value_in_comment
= value
;
9080 func (stream
, "%ld", (1ul << width
) - value
);
9086 /* Various width encodings. */
9088 int base
= 8 << (*c
- 'S'); /* 8,16 or 32 */
9093 if (*c
>= '0' && *c
<= '9')
9095 else if (*c
>= 'a' && *c
<= 'f')
9096 limit
= *c
- 'a' + 10;
9102 if (value
< low
|| value
> high
)
9103 func (stream
, "<illegal width %d>", base
<< value
);
9105 func (stream
, "%d", base
<< value
);
9109 if (given
& (1 << 6))
9113 func (stream
, "d%ld", value
);
9118 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
9120 func (stream
, "q%ld", value
>> 1);
9126 func (stream
, "%c", *c
);
9130 if (value
== ((1ul << width
) - 1))
9131 func (stream
, "%c", *c
);
9134 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
9148 func (stream
, "%c", *c
);
9151 if (value_in_comment
> 32 || value_in_comment
< -16)
9152 func (stream
, "\t; 0x%lx", value_in_comment
);
9154 if (is_unpredictable
)
9155 func (stream
, UNPREDICTABLE_INSTRUCTION
);
9163 /* Print one mve instruction on INFO->STREAM.
9164 Return TRUE if the instuction matched, FALSE if this is not a
9165 recognised mve instruction. */
9168 print_insn_mve (struct disassemble_info
*info
, long given
)
9170 const struct mopcode32
*insn
;
9171 void *stream
= info
->stream
;
9172 fprintf_ftype func
= info
->fprintf_func
;
9174 for (insn
= mve_opcodes
; insn
->assembler
; insn
++)
9176 if (((given
& insn
->mask
) == insn
->value
)
9177 && !is_mve_encoding_conflict (given
, insn
->mve_op
))
9179 signed long value_in_comment
= 0;
9180 bfd_boolean is_unpredictable
= FALSE
;
9181 bfd_boolean is_undefined
= FALSE
;
9183 enum mve_unpredictable unpredictable_cond
= UNPRED_NONE
;
9184 enum mve_undefined undefined_cond
= UNDEF_NONE
;
9186 /* Most vector mve instruction are illegal in a it block.
9187 There are a few exceptions; check for them. */
9188 if (ifthen_state
&& !is_mve_okay_in_it (insn
->mve_op
))
9190 is_unpredictable
= TRUE
;
9191 unpredictable_cond
= UNPRED_IT_BLOCK
;
9193 else if (is_mve_unpredictable (given
, insn
->mve_op
,
9194 &unpredictable_cond
))
9195 is_unpredictable
= TRUE
;
9197 if (is_mve_undefined (given
, insn
->mve_op
, &undefined_cond
))
9198 is_undefined
= TRUE
;
9200 for (c
= insn
->assembler
; *c
; c
++)
9207 func (stream
, "%%");
9211 /* Don't print anything for '+' as it is implied. */
9212 if (arm_decode_field (given
, 23, 23) == 0)
9218 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
9222 print_mve_vld_str_addr (info
, given
, insn
->mve_op
);
9227 long mve_mask
= mve_extract_pred_mask (given
);
9228 func (stream
, "%s", mve_predicatenames
[mve_mask
]);
9234 unsigned int imm5
= 0;
9235 imm5
|= arm_decode_field (given
, 6, 7);
9236 imm5
|= (arm_decode_field (given
, 12, 14) << 2);
9237 func (stream
, "#%u", (imm5
== 0) ? 32 : imm5
);
9242 print_vec_condition (info
, given
, insn
->mve_op
);
9246 if (arm_decode_field (given
, 0, 0) == 1)
9249 = arm_decode_field (given
, 4, 4)
9250 | (arm_decode_field (given
, 6, 6) << 1);
9252 func (stream
, ", uxtw #%lu", size
);
9257 print_mve_rounding_mode (info
, given
, insn
->mve_op
);
9261 print_mve_vcvt_size (info
, given
, insn
->mve_op
);
9266 unsigned long op1
= arm_decode_field (given
, 21, 22);
9268 if ((insn
->mve_op
== MVE_VMOV_VEC_LANE_TO_GP
))
9270 /* Check for signed. */
9271 if (arm_decode_field (given
, 23, 23) == 0)
9273 /* We don't print 's' for S32. */
9274 if ((arm_decode_field (given
, 5, 6) == 0)
9275 && ((op1
== 0) || (op1
== 1)))
9285 if (arm_decode_field (given
, 28, 28) == 0)
9294 print_instruction_predicate (info
);
9298 if (arm_decode_field (given
, 21, 21) == 1)
9303 print_mve_register_blocks (info
, given
, insn
->mve_op
);
9307 /* SIMD encoded constant for mov, mvn, vorr, vbic. */
9309 print_simd_imm8 (info
, given
, 28, insn
);
9313 print_mve_vmov_index (info
, given
);
9317 if (arm_decode_field (given
, 12, 12) == 0)
9324 if (arm_decode_field (given
, 12, 12) == 1)
9328 case '0': case '1': case '2': case '3': case '4':
9329 case '5': case '6': case '7': case '8': case '9':
9332 unsigned long value
;
9334 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9340 is_unpredictable
= TRUE
;
9341 else if (value
== 15)
9342 func (stream
, "zr");
9344 func (stream
, "%s", arm_regnames
[value
]);
9348 func (stream
, "%s", arm_conditional
[value
]);
9353 func (stream
, "%s", arm_conditional
[value
]);
9357 if (value
== 13 || value
== 15)
9358 is_unpredictable
= TRUE
;
9360 func (stream
, "%s", arm_regnames
[value
]);
9364 print_mve_size (info
,
9378 unsigned int odd_reg
= (value
<< 1) | 1;
9379 func (stream
, "%s", arm_regnames
[odd_reg
]);
9385 = arm_decode_field (given
, 0, 6);
9386 unsigned long mod_imm
= imm
;
9388 switch (insn
->mve_op
)
9390 case MVE_VLDRW_GATHER_T5
:
9391 case MVE_VSTRW_SCATTER_T5
:
9392 mod_imm
= mod_imm
<< 2;
9394 case MVE_VSTRD_SCATTER_T6
:
9395 case MVE_VLDRD_GATHER_T6
:
9396 mod_imm
= mod_imm
<< 3;
9403 func (stream
, "%lu", mod_imm
);
9407 func (stream
, "%lu", 64 - value
);
9411 unsigned int even_reg
= value
<< 1;
9412 func (stream
, "%s", arm_regnames
[even_reg
]);
9435 print_mve_rotate (info
, value
, width
);
9438 func (stream
, "%s", arm_regnames
[value
]);
9441 if (insn
->mve_op
== MVE_VQSHL_T2
9442 || insn
->mve_op
== MVE_VQSHLU_T3
9443 || insn
->mve_op
== MVE_VRSHR
9444 || insn
->mve_op
== MVE_VRSHRN
9445 || insn
->mve_op
== MVE_VSHL_T1
9446 || insn
->mve_op
== MVE_VSHLL_T1
9447 || insn
->mve_op
== MVE_VSHR
9448 || insn
->mve_op
== MVE_VSHRN
9449 || insn
->mve_op
== MVE_VSLI
9450 || insn
->mve_op
== MVE_VSRI
)
9451 print_mve_shift_n (info
, given
, insn
->mve_op
);
9452 else if (insn
->mve_op
== MVE_VSHLL_T2
)
9460 func (stream
, "16");
9463 print_mve_undefined (info
, UNDEF_SIZE_0
);
9472 if (insn
->mve_op
== MVE_VSHLC
&& value
== 0)
9474 func (stream
, "%ld", value
);
9475 value_in_comment
= value
;
9479 func (stream
, "s%ld", value
);
9483 func (stream
, "<illegal reg q%ld.5>", value
);
9485 func (stream
, "q%ld", value
);
9488 func (stream
, "0x%08lx", value
);
9500 func (stream
, "%c", *c
);
9503 if (value_in_comment
> 32 || value_in_comment
< -16)
9504 func (stream
, "\t; 0x%lx", value_in_comment
);
9506 if (is_unpredictable
)
9507 print_mve_unpredictable (info
, unpredictable_cond
);
9510 print_mve_undefined (info
, undefined_cond
);
9512 if ((vpt_block_state
.in_vpt_block
== FALSE
)
9514 && (is_vpt_instruction (given
) == TRUE
))
9515 mark_inside_vpt_block (given
);
9516 else if (vpt_block_state
.in_vpt_block
== TRUE
)
9517 update_vpt_block_state ();
9526 /* Return the name of a v7A special register. */
9529 banked_regname (unsigned reg
)
9533 case 15: return "CPSR";
9534 case 32: return "R8_usr";
9535 case 33: return "R9_usr";
9536 case 34: return "R10_usr";
9537 case 35: return "R11_usr";
9538 case 36: return "R12_usr";
9539 case 37: return "SP_usr";
9540 case 38: return "LR_usr";
9541 case 40: return "R8_fiq";
9542 case 41: return "R9_fiq";
9543 case 42: return "R10_fiq";
9544 case 43: return "R11_fiq";
9545 case 44: return "R12_fiq";
9546 case 45: return "SP_fiq";
9547 case 46: return "LR_fiq";
9548 case 48: return "LR_irq";
9549 case 49: return "SP_irq";
9550 case 50: return "LR_svc";
9551 case 51: return "SP_svc";
9552 case 52: return "LR_abt";
9553 case 53: return "SP_abt";
9554 case 54: return "LR_und";
9555 case 55: return "SP_und";
9556 case 60: return "LR_mon";
9557 case 61: return "SP_mon";
9558 case 62: return "ELR_hyp";
9559 case 63: return "SP_hyp";
9560 case 79: return "SPSR";
9561 case 110: return "SPSR_fiq";
9562 case 112: return "SPSR_irq";
9563 case 114: return "SPSR_svc";
9564 case 116: return "SPSR_abt";
9565 case 118: return "SPSR_und";
9566 case 124: return "SPSR_mon";
9567 case 126: return "SPSR_hyp";
9568 default: return NULL
;
9572 /* Return the name of the DMB/DSB option. */
9574 data_barrier_option (unsigned option
)
9576 switch (option
& 0xf)
9578 case 0xf: return "sy";
9579 case 0xe: return "st";
9580 case 0xd: return "ld";
9581 case 0xb: return "ish";
9582 case 0xa: return "ishst";
9583 case 0x9: return "ishld";
9584 case 0x7: return "un";
9585 case 0x6: return "unst";
9586 case 0x5: return "nshld";
9587 case 0x3: return "osh";
9588 case 0x2: return "oshst";
9589 case 0x1: return "oshld";
9590 default: return NULL
;
9594 /* Print one ARM instruction from PC on INFO->STREAM. */
9597 print_insn_arm (bfd_vma pc
, struct disassemble_info
*info
, long given
)
9599 const struct opcode32
*insn
;
9600 void *stream
= info
->stream
;
9601 fprintf_ftype func
= info
->fprintf_func
;
9602 struct arm_private_data
*private_data
= info
->private_data
;
9604 if (print_insn_coprocessor (pc
, info
, given
, FALSE
))
9607 if (print_insn_neon (info
, given
, FALSE
))
9610 for (insn
= arm_opcodes
; insn
->assembler
; insn
++)
9612 if ((given
& insn
->mask
) != insn
->value
)
9615 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, private_data
->features
))
9618 /* Special case: an instruction with all bits set in the condition field
9619 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
9620 or by the catchall at the end of the table. */
9621 if ((given
& 0xF0000000) != 0xF0000000
9622 || (insn
->mask
& 0xF0000000) == 0xF0000000
9623 || (insn
->mask
== 0 && insn
->value
== 0))
9625 unsigned long u_reg
= 16;
9626 unsigned long U_reg
= 16;
9627 bfd_boolean is_unpredictable
= FALSE
;
9628 signed long value_in_comment
= 0;
9631 for (c
= insn
->assembler
; *c
; c
++)
9635 bfd_boolean allow_unpredictable
= FALSE
;
9640 func (stream
, "%%");
9644 value_in_comment
= print_arm_address (pc
, info
, given
);
9648 /* Set P address bit and use normal address
9649 printing routine. */
9650 value_in_comment
= print_arm_address (pc
, info
, given
| (1 << P_BIT
));
9654 allow_unpredictable
= TRUE
;
9657 if ((given
& 0x004f0000) == 0x004f0000)
9659 /* PC relative with immediate offset. */
9660 bfd_vma offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9664 /* Elide positive zero offset. */
9665 if (offset
|| NEGATIVE_BIT_SET
)
9666 func (stream
, "[pc, #%s%d]\t; ",
9667 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9669 func (stream
, "[pc]\t; ");
9670 if (NEGATIVE_BIT_SET
)
9672 info
->print_address_func (offset
+ pc
+ 8, info
);
9676 /* Always show the offset. */
9677 func (stream
, "[pc], #%s%d",
9678 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9679 if (! allow_unpredictable
)
9680 is_unpredictable
= TRUE
;
9685 int offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9687 func (stream
, "[%s",
9688 arm_regnames
[(given
>> 16) & 0xf]);
9692 if (IMMEDIATE_BIT_SET
)
9694 /* Elide offset for non-writeback
9696 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
9698 func (stream
, ", #%s%d",
9699 NEGATIVE_BIT_SET
? "-" : "", offset
);
9701 if (NEGATIVE_BIT_SET
)
9704 value_in_comment
= offset
;
9708 /* Register Offset or Register Pre-Indexed. */
9709 func (stream
, ", %s%s",
9710 NEGATIVE_BIT_SET
? "-" : "",
9711 arm_regnames
[given
& 0xf]);
9713 /* Writing back to the register that is the source/
9714 destination of the load/store is unpredictable. */
9715 if (! allow_unpredictable
9716 && WRITEBACK_BIT_SET
9717 && ((given
& 0xf) == ((given
>> 12) & 0xf)))
9718 is_unpredictable
= TRUE
;
9721 func (stream
, "]%s",
9722 WRITEBACK_BIT_SET
? "!" : "");
9726 if (IMMEDIATE_BIT_SET
)
9728 /* Immediate Post-indexed. */
9729 /* PR 10924: Offset must be printed, even if it is zero. */
9730 func (stream
, "], #%s%d",
9731 NEGATIVE_BIT_SET
? "-" : "", offset
);
9732 if (NEGATIVE_BIT_SET
)
9734 value_in_comment
= offset
;
9738 /* Register Post-indexed. */
9739 func (stream
, "], %s%s",
9740 NEGATIVE_BIT_SET
? "-" : "",
9741 arm_regnames
[given
& 0xf]);
9743 /* Writing back to the register that is the source/
9744 destination of the load/store is unpredictable. */
9745 if (! allow_unpredictable
9746 && (given
& 0xf) == ((given
>> 12) & 0xf))
9747 is_unpredictable
= TRUE
;
9750 if (! allow_unpredictable
)
9752 /* Writeback is automatically implied by post- addressing.
9753 Setting the W bit is unnecessary and ARM specify it as
9754 being unpredictable. */
9755 if (WRITEBACK_BIT_SET
9756 /* Specifying the PC register as the post-indexed
9757 registers is also unpredictable. */
9758 || (! IMMEDIATE_BIT_SET
&& ((given
& 0xf) == 0xf)))
9759 is_unpredictable
= TRUE
;
9767 bfd_vma disp
= (((given
& 0xffffff) ^ 0x800000) - 0x800000);
9768 info
->print_address_func (disp
* 4 + pc
+ 8, info
);
9773 if (((given
>> 28) & 0xf) != 0xe)
9775 arm_conditional
[(given
>> 28) & 0xf]);
9784 for (reg
= 0; reg
< 16; reg
++)
9785 if ((given
& (1 << reg
)) != 0)
9788 func (stream
, ", ");
9790 func (stream
, "%s", arm_regnames
[reg
]);
9794 is_unpredictable
= TRUE
;
9799 arm_decode_shift (given
, func
, stream
, FALSE
);
9803 if ((given
& 0x02000000) != 0)
9805 unsigned int rotate
= (given
& 0xf00) >> 7;
9806 unsigned int immed
= (given
& 0xff);
9809 a
= (((immed
<< (32 - rotate
))
9810 | (immed
>> rotate
)) & 0xffffffff);
9811 /* If there is another encoding with smaller rotate,
9812 the rotate should be specified directly. */
9813 for (i
= 0; i
< 32; i
+= 2)
9814 if ((a
<< i
| a
>> (32 - i
)) <= 0xff)
9818 func (stream
, "#%d, %d", immed
, rotate
);
9820 func (stream
, "#%d", a
);
9821 value_in_comment
= a
;
9824 arm_decode_shift (given
, func
, stream
, TRUE
);
9828 if ((given
& 0x0000f000) == 0x0000f000)
9830 arm_feature_set arm_ext_v6
=
9831 ARM_FEATURE_CORE_LOW (ARM_EXT_V6
);
9833 /* The p-variants of tst/cmp/cmn/teq are the pre-V6
9834 mechanism for setting PSR flag bits. They are
9835 obsolete in V6 onwards. */
9836 if (! ARM_CPU_HAS_FEATURE (private_data
->features
, \
9840 is_unpredictable
= TRUE
;
9845 if ((given
& 0x01200000) == 0x00200000)
9851 int offset
= given
& 0xff;
9853 value_in_comment
= offset
* 4;
9854 if (NEGATIVE_BIT_SET
)
9855 value_in_comment
= - value_in_comment
;
9857 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
9862 func (stream
, ", #%d]%s",
9863 (int) value_in_comment
,
9864 WRITEBACK_BIT_SET
? "!" : "");
9872 if (WRITEBACK_BIT_SET
)
9875 func (stream
, ", #%d", (int) value_in_comment
);
9879 func (stream
, ", {%d}", (int) offset
);
9880 value_in_comment
= offset
;
9887 /* Print ARM V5 BLX(1) address: pc+25 bits. */
9892 if (! NEGATIVE_BIT_SET
)
9893 /* Is signed, hi bits should be ones. */
9894 offset
= (-1) ^ 0x00ffffff;
9896 /* Offset is (SignExtend(offset field)<<2). */
9897 offset
+= given
& 0x00ffffff;
9899 address
= offset
+ pc
+ 8;
9901 if (given
& 0x01000000)
9902 /* H bit allows addressing to 2-byte boundaries. */
9905 info
->print_address_func (address
, info
);
9910 if ((given
& 0x02000200) == 0x200)
9913 unsigned sysm
= (given
& 0x004f0000) >> 16;
9915 sysm
|= (given
& 0x300) >> 4;
9916 name
= banked_regname (sysm
);
9919 func (stream
, "%s", name
);
9921 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
9925 func (stream
, "%cPSR_",
9926 (given
& 0x00400000) ? 'S' : 'C');
9927 if (given
& 0x80000)
9929 if (given
& 0x40000)
9931 if (given
& 0x20000)
9933 if (given
& 0x10000)
9939 if ((given
& 0xf0) == 0x60)
9941 switch (given
& 0xf)
9943 case 0xf: func (stream
, "sy"); break;
9945 func (stream
, "#%d", (int) given
& 0xf);
9951 const char * opt
= data_barrier_option (given
& 0xf);
9953 func (stream
, "%s", opt
);
9955 func (stream
, "#%d", (int) given
& 0xf);
9959 case '0': case '1': case '2': case '3': case '4':
9960 case '5': case '6': case '7': case '8': case '9':
9963 unsigned long value
;
9965 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9971 is_unpredictable
= TRUE
;
9975 /* We want register + 1 when decoding T. */
9981 /* Eat the 'u' character. */
9985 is_unpredictable
= TRUE
;
9990 /* Eat the 'U' character. */
9994 is_unpredictable
= TRUE
;
9997 func (stream
, "%s", arm_regnames
[value
]);
10000 func (stream
, "%ld", value
);
10001 value_in_comment
= value
;
10004 func (stream
, "%ld", value
* 8);
10005 value_in_comment
= value
* 8;
10008 func (stream
, "%ld", value
+ 1);
10009 value_in_comment
= value
+ 1;
10012 func (stream
, "0x%08lx", value
);
10014 /* Some SWI instructions have special
10016 if ((given
& 0x0fffffff) == 0x0FF00000)
10017 func (stream
, "\t; IMB");
10018 else if ((given
& 0x0fffffff) == 0x0FF00001)
10019 func (stream
, "\t; IMBRange");
10022 func (stream
, "%01lx", value
& 0xf);
10023 value_in_comment
= value
;
10028 func (stream
, "%c", *c
);
10032 if (value
== ((1ul << width
) - 1))
10033 func (stream
, "%c", *c
);
10036 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
10049 imm
= (given
& 0xf) | ((given
& 0xfff00) >> 4);
10050 func (stream
, "%d", imm
);
10051 value_in_comment
= imm
;
10056 /* LSB and WIDTH fields of BFI or BFC. The machine-
10057 language instruction encodes LSB and MSB. */
10059 long msb
= (given
& 0x001f0000) >> 16;
10060 long lsb
= (given
& 0x00000f80) >> 7;
10061 long w
= msb
- lsb
+ 1;
10064 func (stream
, "#%lu, #%lu", lsb
, w
);
10066 func (stream
, "(invalid: %lu:%lu)", lsb
, msb
);
10071 /* Get the PSR/banked register name. */
10074 unsigned sysm
= (given
& 0x004f0000) >> 16;
10076 sysm
|= (given
& 0x300) >> 4;
10077 name
= banked_regname (sysm
);
10080 func (stream
, "%s", name
);
10082 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
10087 /* 16-bit unsigned immediate from a MOVT or MOVW
10088 instruction, encoded in bits 0:11 and 15:19. */
10090 long hi
= (given
& 0x000f0000) >> 4;
10091 long lo
= (given
& 0x00000fff);
10092 long imm16
= hi
| lo
;
10094 func (stream
, "#%lu", imm16
);
10095 value_in_comment
= imm16
;
10104 func (stream
, "%c", *c
);
10107 if (value_in_comment
> 32 || value_in_comment
< -16)
10108 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
10110 if (is_unpredictable
)
10111 func (stream
, UNPREDICTABLE_INSTRUCTION
);
10116 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
10120 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
10123 print_insn_thumb16 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
10125 const struct opcode16
*insn
;
10126 void *stream
= info
->stream
;
10127 fprintf_ftype func
= info
->fprintf_func
;
10129 for (insn
= thumb_opcodes
; insn
->assembler
; insn
++)
10130 if ((given
& insn
->mask
) == insn
->value
)
10132 signed long value_in_comment
= 0;
10133 const char *c
= insn
->assembler
;
10142 func (stream
, "%c", *c
);
10149 func (stream
, "%%");
10154 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10159 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10161 func (stream
, "s");
10168 ifthen_next_state
= given
& 0xff;
10169 for (tmp
= given
<< 1; tmp
& 0xf; tmp
<<= 1)
10170 func (stream
, ((given
^ tmp
) & 0x10) ? "e" : "t");
10171 func (stream
, "\t%s", arm_conditional
[(given
>> 4) & 0xf]);
10176 if (ifthen_next_state
)
10177 func (stream
, "\t; unpredictable branch in IT block\n");
10182 func (stream
, "\t; unpredictable <IT:%s>",
10183 arm_conditional
[IFTHEN_COND
]);
10190 reg
= (given
>> 3) & 0x7;
10191 if (given
& (1 << 6))
10194 func (stream
, "%s", arm_regnames
[reg
]);
10203 if (given
& (1 << 7))
10206 func (stream
, "%s", arm_regnames
[reg
]);
10211 if (given
& (1 << 8))
10213 /* Fall through. */
10215 if (*c
== 'O' && (given
& (1 << 8)))
10217 /* Fall through. */
10223 func (stream
, "{");
10225 /* It would be nice if we could spot
10226 ranges, and generate the rS-rE format: */
10227 for (reg
= 0; (reg
< 8); reg
++)
10228 if ((given
& (1 << reg
)) != 0)
10231 func (stream
, ", ");
10233 func (stream
, "%s", arm_regnames
[reg
]);
10239 func (stream
, ", ");
10241 func (stream
, "%s", arm_regnames
[14] /* "lr" */);
10247 func (stream
, ", ");
10248 func (stream
, "%s", arm_regnames
[15] /* "pc" */);
10251 func (stream
, "}");
10256 /* Print writeback indicator for a LDMIA. We are doing a
10257 writeback if the base register is not in the register
10259 if ((given
& (1 << ((given
& 0x0700) >> 8))) == 0)
10260 func (stream
, "!");
10264 /* Print ARM V6T2 CZB address: pc+4+6 bits. */
10266 bfd_vma address
= (pc
+ 4
10267 + ((given
& 0x00f8) >> 2)
10268 + ((given
& 0x0200) >> 3));
10269 info
->print_address_func (address
, info
);
10274 /* Right shift immediate -- bits 6..10; 1-31 print
10275 as themselves, 0 prints as 32. */
10277 long imm
= (given
& 0x07c0) >> 6;
10280 func (stream
, "#%ld", imm
);
10284 case '0': case '1': case '2': case '3': case '4':
10285 case '5': case '6': case '7': case '8': case '9':
10287 int bitstart
= *c
++ - '0';
10290 while (*c
>= '0' && *c
<= '9')
10291 bitstart
= (bitstart
* 10) + *c
++ - '0';
10300 while (*c
>= '0' && *c
<= '9')
10301 bitend
= (bitend
* 10) + *c
++ - '0';
10304 reg
= given
>> bitstart
;
10305 reg
&= (2 << (bitend
- bitstart
)) - 1;
10310 func (stream
, "%s", arm_regnames
[reg
]);
10314 func (stream
, "%ld", (long) reg
);
10315 value_in_comment
= reg
;
10319 func (stream
, "%ld", (long) (reg
<< 1));
10320 value_in_comment
= reg
<< 1;
10324 func (stream
, "%ld", (long) (reg
<< 2));
10325 value_in_comment
= reg
<< 2;
10329 /* PC-relative address -- the bottom two
10330 bits of the address are dropped
10331 before the calculation. */
10332 info
->print_address_func
10333 (((pc
+ 4) & ~3) + (reg
<< 2), info
);
10334 value_in_comment
= 0;
10338 func (stream
, "0x%04lx", (long) reg
);
10342 reg
= ((reg
^ (1 << bitend
)) - (1 << bitend
));
10343 info
->print_address_func (reg
* 2 + pc
+ 4, info
);
10344 value_in_comment
= 0;
10348 func (stream
, "%s", arm_conditional
[reg
]);
10359 if ((given
& (1 << bitstart
)) != 0)
10360 func (stream
, "%c", *c
);
10365 if ((given
& (1 << bitstart
)) != 0)
10366 func (stream
, "%c", *c
++);
10368 func (stream
, "%c", *++c
);
10382 if (value_in_comment
> 32 || value_in_comment
< -16)
10383 func (stream
, "\t; 0x%lx", value_in_comment
);
10388 func (stream
, UNKNOWN_INSTRUCTION_16BIT
, (unsigned)given
);
10392 /* Return the name of an V7M special register. */
10394 static const char *
10395 psr_name (int regno
)
10399 case 0x0: return "APSR";
10400 case 0x1: return "IAPSR";
10401 case 0x2: return "EAPSR";
10402 case 0x3: return "PSR";
10403 case 0x5: return "IPSR";
10404 case 0x6: return "EPSR";
10405 case 0x7: return "IEPSR";
10406 case 0x8: return "MSP";
10407 case 0x9: return "PSP";
10408 case 0xa: return "MSPLIM";
10409 case 0xb: return "PSPLIM";
10410 case 0x10: return "PRIMASK";
10411 case 0x11: return "BASEPRI";
10412 case 0x12: return "BASEPRI_MAX";
10413 case 0x13: return "FAULTMASK";
10414 case 0x14: return "CONTROL";
10415 case 0x88: return "MSP_NS";
10416 case 0x89: return "PSP_NS";
10417 case 0x8a: return "MSPLIM_NS";
10418 case 0x8b: return "PSPLIM_NS";
10419 case 0x90: return "PRIMASK_NS";
10420 case 0x91: return "BASEPRI_NS";
10421 case 0x93: return "FAULTMASK_NS";
10422 case 0x94: return "CONTROL_NS";
10423 case 0x98: return "SP_NS";
10424 default: return "<unknown>";
10428 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
10431 print_insn_thumb32 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
10433 const struct opcode32
*insn
;
10434 void *stream
= info
->stream
;
10435 fprintf_ftype func
= info
->fprintf_func
;
10436 bfd_boolean is_mve
= is_mve_architecture (info
);
10438 if (print_insn_coprocessor (pc
, info
, given
, TRUE
))
10441 if ((is_mve
== FALSE
) && print_insn_neon (info
, given
, TRUE
))
10444 if (is_mve
&& print_insn_mve (info
, given
))
10447 for (insn
= thumb32_opcodes
; insn
->assembler
; insn
++)
10448 if ((given
& insn
->mask
) == insn
->value
)
10450 bfd_boolean is_clrm
= FALSE
;
10451 bfd_boolean is_unpredictable
= FALSE
;
10452 signed long value_in_comment
= 0;
10453 const char *c
= insn
->assembler
;
10459 func (stream
, "%c", *c
);
10466 func (stream
, "%%");
10471 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10475 if (ifthen_next_state
)
10476 func (stream
, "\t; unpredictable branch in IT block\n");
10481 func (stream
, "\t; unpredictable <IT:%s>",
10482 arm_conditional
[IFTHEN_COND
]);
10487 unsigned int imm12
= 0;
10489 imm12
|= (given
& 0x000000ffu
);
10490 imm12
|= (given
& 0x00007000u
) >> 4;
10491 imm12
|= (given
& 0x04000000u
) >> 15;
10492 func (stream
, "#%u", imm12
);
10493 value_in_comment
= imm12
;
10499 unsigned int bits
= 0, imm
, imm8
, mod
;
10501 bits
|= (given
& 0x000000ffu
);
10502 bits
|= (given
& 0x00007000u
) >> 4;
10503 bits
|= (given
& 0x04000000u
) >> 15;
10504 imm8
= (bits
& 0x0ff);
10505 mod
= (bits
& 0xf00) >> 8;
10508 case 0: imm
= imm8
; break;
10509 case 1: imm
= ((imm8
<< 16) | imm8
); break;
10510 case 2: imm
= ((imm8
<< 24) | (imm8
<< 8)); break;
10511 case 3: imm
= ((imm8
<< 24) | (imm8
<< 16) | (imm8
<< 8) | imm8
); break;
10513 mod
= (bits
& 0xf80) >> 7;
10514 imm8
= (bits
& 0x07f) | 0x80;
10515 imm
= (((imm8
<< (32 - mod
)) | (imm8
>> mod
)) & 0xffffffff);
10517 func (stream
, "#%u", imm
);
10518 value_in_comment
= imm
;
10524 unsigned int imm
= 0;
10526 imm
|= (given
& 0x000000ffu
);
10527 imm
|= (given
& 0x00007000u
) >> 4;
10528 imm
|= (given
& 0x04000000u
) >> 15;
10529 imm
|= (given
& 0x000f0000u
) >> 4;
10530 func (stream
, "#%u", imm
);
10531 value_in_comment
= imm
;
10537 unsigned int imm
= 0;
10539 imm
|= (given
& 0x000f0000u
) >> 16;
10540 imm
|= (given
& 0x00000ff0u
) >> 0;
10541 imm
|= (given
& 0x0000000fu
) << 12;
10542 func (stream
, "#%u", imm
);
10543 value_in_comment
= imm
;
10549 unsigned int imm
= 0;
10551 imm
|= (given
& 0x000f0000u
) >> 4;
10552 imm
|= (given
& 0x00000fffu
) >> 0;
10553 func (stream
, "#%u", imm
);
10554 value_in_comment
= imm
;
10560 unsigned int imm
= 0;
10562 imm
|= (given
& 0x00000fffu
);
10563 imm
|= (given
& 0x000f0000u
) >> 4;
10564 func (stream
, "#%u", imm
);
10565 value_in_comment
= imm
;
10571 unsigned int reg
= (given
& 0x0000000fu
);
10572 unsigned int stp
= (given
& 0x00000030u
) >> 4;
10573 unsigned int imm
= 0;
10574 imm
|= (given
& 0x000000c0u
) >> 6;
10575 imm
|= (given
& 0x00007000u
) >> 10;
10577 func (stream
, "%s", arm_regnames
[reg
]);
10582 func (stream
, ", lsl #%u", imm
);
10588 func (stream
, ", lsr #%u", imm
);
10594 func (stream
, ", asr #%u", imm
);
10599 func (stream
, ", rrx");
10601 func (stream
, ", ror #%u", imm
);
10608 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10609 unsigned int U
= ! NEGATIVE_BIT_SET
;
10610 unsigned int op
= (given
& 0x00000f00) >> 8;
10611 unsigned int i12
= (given
& 0x00000fff);
10612 unsigned int i8
= (given
& 0x000000ff);
10613 bfd_boolean writeback
= FALSE
, postind
= FALSE
;
10614 bfd_vma offset
= 0;
10616 func (stream
, "[%s", arm_regnames
[Rn
]);
10617 if (U
) /* 12-bit positive immediate offset. */
10621 value_in_comment
= offset
;
10623 else if (Rn
== 15) /* 12-bit negative immediate offset. */
10624 offset
= - (int) i12
;
10625 else if (op
== 0x0) /* Shifted register offset. */
10627 unsigned int Rm
= (i8
& 0x0f);
10628 unsigned int sh
= (i8
& 0x30) >> 4;
10630 func (stream
, ", %s", arm_regnames
[Rm
]);
10632 func (stream
, ", lsl #%u", sh
);
10633 func (stream
, "]");
10638 case 0xE: /* 8-bit positive immediate offset. */
10642 case 0xC: /* 8-bit negative immediate offset. */
10646 case 0xF: /* 8-bit + preindex with wb. */
10651 case 0xD: /* 8-bit - preindex with wb. */
10656 case 0xB: /* 8-bit + postindex. */
10661 case 0x9: /* 8-bit - postindex. */
10667 func (stream
, ", <undefined>]");
10672 func (stream
, "], #%d", (int) offset
);
10676 func (stream
, ", #%d", (int) offset
);
10677 func (stream
, writeback
? "]!" : "]");
10682 func (stream
, "\t; ");
10683 info
->print_address_func (((pc
+ 4) & ~3) + offset
, info
);
10691 unsigned int U
= ! NEGATIVE_BIT_SET
;
10692 unsigned int W
= WRITEBACK_BIT_SET
;
10693 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10694 unsigned int off
= (given
& 0x000000ff);
10696 func (stream
, "[%s", arm_regnames
[Rn
]);
10702 func (stream
, ", #%c%u", U
? '+' : '-', off
* 4);
10703 value_in_comment
= off
* 4 * (U
? 1 : -1);
10705 func (stream
, "]");
10707 func (stream
, "!");
10711 func (stream
, "], ");
10714 func (stream
, "#%c%u", U
? '+' : '-', off
* 4);
10715 value_in_comment
= off
* 4 * (U
? 1 : -1);
10719 func (stream
, "{%u}", off
);
10720 value_in_comment
= off
;
10728 unsigned int Sbit
= (given
& 0x01000000) >> 24;
10729 unsigned int type
= (given
& 0x00600000) >> 21;
10733 case 0: func (stream
, Sbit
? "sb" : "b"); break;
10734 case 1: func (stream
, Sbit
? "sh" : "h"); break;
10737 func (stream
, "??");
10740 func (stream
, "??");
10748 /* Fall through. */
10754 func (stream
, "{");
10755 for (reg
= 0; reg
< 16; reg
++)
10756 if ((given
& (1 << reg
)) != 0)
10759 func (stream
, ", ");
10761 if (is_clrm
&& reg
== 13)
10762 func (stream
, "(invalid: %s)", arm_regnames
[reg
]);
10763 else if (is_clrm
&& reg
== 15)
10764 func (stream
, "%s", "APSR");
10766 func (stream
, "%s", arm_regnames
[reg
]);
10768 func (stream
, "}");
10774 unsigned int msb
= (given
& 0x0000001f);
10775 unsigned int lsb
= 0;
10777 lsb
|= (given
& 0x000000c0u
) >> 6;
10778 lsb
|= (given
& 0x00007000u
) >> 10;
10779 func (stream
, "#%u, #%u", lsb
, msb
- lsb
+ 1);
10785 unsigned int width
= (given
& 0x0000001f) + 1;
10786 unsigned int lsb
= 0;
10788 lsb
|= (given
& 0x000000c0u
) >> 6;
10789 lsb
|= (given
& 0x00007000u
) >> 10;
10790 func (stream
, "#%u, #%u", lsb
, width
);
10796 unsigned int boff
= (((given
& 0x07800000) >> 23) << 1);
10797 func (stream
, "%x", boff
);
10803 unsigned int immA
= (given
& 0x001f0000u
) >> 16;
10804 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10805 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10806 bfd_vma offset
= 0;
10808 offset
|= immA
<< 12;
10809 offset
|= immB
<< 2;
10810 offset
|= immC
<< 1;
10812 offset
= (offset
& 0x10000) ? offset
- (1 << 17) : offset
;
10814 info
->print_address_func (pc
+ 4 + offset
, info
);
10820 unsigned int immA
= (given
& 0x007f0000u
) >> 16;
10821 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10822 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10823 bfd_vma offset
= 0;
10825 offset
|= immA
<< 12;
10826 offset
|= immB
<< 2;
10827 offset
|= immC
<< 1;
10829 offset
= (offset
& 0x40000) ? offset
- (1 << 19) : offset
;
10831 info
->print_address_func (pc
+ 4 + offset
, info
);
10837 unsigned int immA
= (given
& 0x00010000u
) >> 16;
10838 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10839 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10840 bfd_vma offset
= 0;
10842 offset
|= immA
<< 12;
10843 offset
|= immB
<< 2;
10844 offset
|= immC
<< 1;
10846 offset
= (offset
& 0x1000) ? offset
- (1 << 13) : offset
;
10848 info
->print_address_func (pc
+ 4 + offset
, info
);
10850 unsigned int T
= (given
& 0x00020000u
) >> 17;
10851 unsigned int endoffset
= (((given
& 0x07800000) >> 23) << 1);
10852 unsigned int boffset
= (T
== 1) ? 4 : 2;
10853 func (stream
, ", ");
10854 func (stream
, "%x", endoffset
+ boffset
);
10860 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10861 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10864 imm32
|= immh
<< 2;
10865 imm32
|= imml
<< 1;
10867 info
->print_address_func (pc
+ 4 + imm32
, info
);
10873 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10874 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10877 imm32
|= immh
<< 2;
10878 imm32
|= imml
<< 1;
10880 info
->print_address_func (pc
+ 4 - imm32
, info
);
10886 unsigned int S
= (given
& 0x04000000u
) >> 26;
10887 unsigned int J1
= (given
& 0x00002000u
) >> 13;
10888 unsigned int J2
= (given
& 0x00000800u
) >> 11;
10889 bfd_vma offset
= 0;
10891 offset
|= !S
<< 20;
10892 offset
|= J2
<< 19;
10893 offset
|= J1
<< 18;
10894 offset
|= (given
& 0x003f0000) >> 4;
10895 offset
|= (given
& 0x000007ff) << 1;
10896 offset
-= (1 << 20);
10898 info
->print_address_func (pc
+ 4 + offset
, info
);
10904 unsigned int S
= (given
& 0x04000000u
) >> 26;
10905 unsigned int I1
= (given
& 0x00002000u
) >> 13;
10906 unsigned int I2
= (given
& 0x00000800u
) >> 11;
10907 bfd_vma offset
= 0;
10909 offset
|= !S
<< 24;
10910 offset
|= !(I1
^ S
) << 23;
10911 offset
|= !(I2
^ S
) << 22;
10912 offset
|= (given
& 0x03ff0000u
) >> 4;
10913 offset
|= (given
& 0x000007ffu
) << 1;
10914 offset
-= (1 << 24);
10917 /* BLX target addresses are always word aligned. */
10918 if ((given
& 0x00001000u
) == 0)
10921 info
->print_address_func (offset
, info
);
10927 unsigned int shift
= 0;
10929 shift
|= (given
& 0x000000c0u
) >> 6;
10930 shift
|= (given
& 0x00007000u
) >> 10;
10931 if (WRITEBACK_BIT_SET
)
10932 func (stream
, ", asr #%u", shift
);
10934 func (stream
, ", lsl #%u", shift
);
10935 /* else print nothing - lsl #0 */
10941 unsigned int rot
= (given
& 0x00000030) >> 4;
10944 func (stream
, ", ror #%u", rot
* 8);
10949 if ((given
& 0xf0) == 0x60)
10951 switch (given
& 0xf)
10953 case 0xf: func (stream
, "sy"); break;
10955 func (stream
, "#%d", (int) given
& 0xf);
10961 const char * opt
= data_barrier_option (given
& 0xf);
10963 func (stream
, "%s", opt
);
10965 func (stream
, "#%d", (int) given
& 0xf);
10970 if ((given
& 0xff) == 0)
10972 func (stream
, "%cPSR_", (given
& 0x100000) ? 'S' : 'C');
10974 func (stream
, "f");
10976 func (stream
, "s");
10978 func (stream
, "x");
10980 func (stream
, "c");
10982 else if ((given
& 0x20) == 0x20)
10985 unsigned sysm
= (given
& 0xf00) >> 8;
10987 sysm
|= (given
& 0x30);
10988 sysm
|= (given
& 0x00100000) >> 14;
10989 name
= banked_regname (sysm
);
10992 func (stream
, "%s", name
);
10994 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
10998 func (stream
, "%s", psr_name (given
& 0xff));
11003 if (((given
& 0xff) == 0)
11004 || ((given
& 0x20) == 0x20))
11007 unsigned sm
= (given
& 0xf0000) >> 16;
11009 sm
|= (given
& 0x30);
11010 sm
|= (given
& 0x00100000) >> 14;
11011 name
= banked_regname (sm
);
11014 func (stream
, "%s", name
);
11016 func (stream
, "(UNDEF: %lu)", (unsigned long) sm
);
11019 func (stream
, "%s", psr_name (given
& 0xff));
11022 case '0': case '1': case '2': case '3': case '4':
11023 case '5': case '6': case '7': case '8': case '9':
11028 c
= arm_decode_bitfield (c
, given
, &val
, &width
);
11034 func (stream
, "%s", mve_vec_sizename
[val
]);
11036 func (stream
, "<undef size>");
11040 func (stream
, "%lu", val
);
11041 value_in_comment
= val
;
11045 func (stream
, "%lu", val
+ 1);
11046 value_in_comment
= val
+ 1;
11050 func (stream
, "%lu", val
* 4);
11051 value_in_comment
= val
* 4;
11056 is_unpredictable
= TRUE
;
11057 /* Fall through. */
11060 is_unpredictable
= TRUE
;
11061 /* Fall through. */
11063 func (stream
, "%s", arm_regnames
[val
]);
11067 func (stream
, "%s", arm_conditional
[val
]);
11072 if (val
== ((1ul << width
) - 1))
11073 func (stream
, "%c", *c
);
11079 func (stream
, "%c", *c
);
11083 func (stream
, "%c", c
[(1 << width
) - (int) val
]);
11088 func (stream
, "0x%lx", val
& 0xffffffffUL
);
11098 /* PR binutils/12534
11099 If we have a PC relative offset in an LDRD or STRD
11100 instructions then display the decoded address. */
11101 if (((given
>> 16) & 0xf) == 0xf)
11103 bfd_vma offset
= (given
& 0xff) * 4;
11105 if ((given
& (1 << 23)) == 0)
11107 func (stream
, "\t; ");
11108 info
->print_address_func ((pc
& ~3) + 4 + offset
, info
);
11117 if (value_in_comment
> 32 || value_in_comment
< -16)
11118 func (stream
, "\t; 0x%lx", value_in_comment
);
11120 if (is_unpredictable
)
11121 func (stream
, UNPREDICTABLE_INSTRUCTION
);
11127 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
11131 /* Print data bytes on INFO->STREAM. */
11134 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED
,
11135 struct disassemble_info
*info
,
11138 switch (info
->bytes_per_chunk
)
11141 info
->fprintf_func (info
->stream
, ".byte\t0x%02lx", given
);
11144 info
->fprintf_func (info
->stream
, ".short\t0x%04lx", given
);
11147 info
->fprintf_func (info
->stream
, ".word\t0x%08lx", given
);
11154 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
11155 being displayed in symbol relative addresses.
11157 Also disallow private symbol, with __tagsym$$ prefix,
11158 from ARM RVCT toolchain being displayed. */
11161 arm_symbol_is_valid (asymbol
* sym
,
11162 struct disassemble_info
* info ATTRIBUTE_UNUSED
)
11169 name
= bfd_asymbol_name (sym
);
11171 return (name
&& *name
!= '$' && strncmp (name
, "__tagsym$$", 10));
11174 /* Parse the string of disassembler options. */
11177 parse_arm_disassembler_options (const char *options
)
11181 FOR_EACH_DISASSEMBLER_OPTION (opt
, options
)
11183 if (CONST_STRNEQ (opt
, "reg-names-"))
11186 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11187 if (disassembler_options_cmp (opt
, regnames
[i
].name
) == 0)
11189 regname_selected
= i
;
11193 if (i
>= NUM_ARM_OPTIONS
)
11194 /* xgettext: c-format */
11195 opcodes_error_handler (_("unrecognised register name set: %s"),
11198 else if (CONST_STRNEQ (opt
, "force-thumb"))
11200 else if (CONST_STRNEQ (opt
, "no-force-thumb"))
11203 /* xgettext: c-format */
11204 opcodes_error_handler (_("unrecognised disassembler option: %s"), opt
);
11211 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
11212 enum map_type
*map_symbol
);
11214 /* Search back through the insn stream to determine if this instruction is
11215 conditionally executed. */
11218 find_ifthen_state (bfd_vma pc
,
11219 struct disassemble_info
*info
,
11220 bfd_boolean little
)
11222 unsigned char b
[2];
11225 /* COUNT is twice the number of instructions seen. It will be odd if we
11226 just crossed an instruction boundary. */
11229 unsigned int seen_it
;
11232 ifthen_address
= pc
;
11239 /* Scan backwards looking for IT instructions, keeping track of where
11240 instruction boundaries are. We don't know if something is actually an
11241 IT instruction until we find a definite instruction boundary. */
11244 if (addr
== 0 || info
->symbol_at_address_func (addr
, info
))
11246 /* A symbol must be on an instruction boundary, and will not
11247 be within an IT block. */
11248 if (seen_it
&& (count
& 1))
11254 status
= info
->read_memory_func (addr
, (bfd_byte
*) b
, 2, info
);
11259 insn
= (b
[0]) | (b
[1] << 8);
11261 insn
= (b
[1]) | (b
[0] << 8);
11264 if ((insn
& 0xf800) < 0xe800)
11266 /* Addr + 2 is an instruction boundary. See if this matches
11267 the expected boundary based on the position of the last
11274 if ((insn
& 0xff00) == 0xbf00 && (insn
& 0xf) != 0)
11276 enum map_type type
= MAP_ARM
;
11277 bfd_boolean found
= mapping_symbol_for_insn (addr
, info
, &type
);
11279 if (!found
|| (found
&& type
== MAP_THUMB
))
11281 /* This could be an IT instruction. */
11283 it_count
= count
>> 1;
11286 if ((insn
& 0xf800) >= 0xe800)
11289 count
= (count
+ 2) | 1;
11290 /* IT blocks contain at most 4 instructions. */
11291 if (count
>= 8 && !seen_it
)
11294 /* We found an IT instruction. */
11295 ifthen_state
= (seen_it
& 0xe0) | ((seen_it
<< it_count
) & 0x1f);
11296 if ((ifthen_state
& 0xf) == 0)
11300 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
11304 is_mapping_symbol (struct disassemble_info
*info
, int n
,
11305 enum map_type
*map_type
)
11309 name
= bfd_asymbol_name (info
->symtab
[n
]);
11310 if (name
[0] == '$' && (name
[1] == 'a' || name
[1] == 't' || name
[1] == 'd')
11311 && (name
[2] == 0 || name
[2] == '.'))
11313 *map_type
= ((name
[1] == 'a') ? MAP_ARM
11314 : (name
[1] == 't') ? MAP_THUMB
11322 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
11323 Returns nonzero if *MAP_TYPE was set. */
11326 get_map_sym_type (struct disassemble_info
*info
,
11328 enum map_type
*map_type
)
11330 /* If the symbol is in a different section, ignore it. */
11331 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
11334 return is_mapping_symbol (info
, n
, map_type
);
11337 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
11338 Returns nonzero if *MAP_TYPE was set. */
11341 get_sym_code_type (struct disassemble_info
*info
,
11343 enum map_type
*map_type
)
11345 elf_symbol_type
*es
;
11348 /* If the symbol is in a different section, ignore it. */
11349 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
11352 es
= *(elf_symbol_type
**)(info
->symtab
+ n
);
11353 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
11355 /* If the symbol has function type then use that. */
11356 if (type
== STT_FUNC
|| type
== STT_GNU_IFUNC
)
11358 if (ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
11359 == ST_BRANCH_TO_THUMB
)
11360 *map_type
= MAP_THUMB
;
11362 *map_type
= MAP_ARM
;
11369 /* Search the mapping symbol state for instruction at pc. This is only
11370 applicable for elf target.
11372 There is an assumption Here, info->private_data contains the correct AND
11373 up-to-date information about current scan process. The information will be
11374 used to speed this search process.
11376 Return TRUE if the mapping state can be determined, and map_symbol
11377 will be updated accordingly. Otherwise, return FALSE. */
11380 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
11381 enum map_type
*map_symbol
)
11383 bfd_vma addr
, section_vma
= 0;
11384 int n
, last_sym
= -1;
11385 bfd_boolean found
= FALSE
;
11386 bfd_boolean can_use_search_opt_p
= FALSE
;
11388 /* Default to DATA. A text section is required by the ABI to contain an
11389 INSN mapping symbol at the start. A data section has no such
11390 requirement, hence if no mapping symbol is found the section must
11391 contain only data. This however isn't very useful if the user has
11392 fully stripped the binaries. If this is the case use the section
11393 attributes to determine the default. If we have no section default to
11394 INSN as well, as we may be disassembling some raw bytes on a baremetal
11395 HEX file or similar. */
11396 enum map_type type
= MAP_DATA
;
11397 if ((info
->section
&& info
->section
->flags
& SEC_CODE
) || !info
->section
)
11399 struct arm_private_data
*private_data
;
11401 if (info
->private_data
== NULL
11402 || bfd_asymbol_flavour (*info
->symtab
) != bfd_target_elf_flavour
)
11405 private_data
= info
->private_data
;
11407 /* First, look for mapping symbols. */
11408 if (info
->symtab_size
!= 0)
11410 if (pc
<= private_data
->last_mapping_addr
)
11411 private_data
->last_mapping_sym
= -1;
11413 /* Start scanning at the start of the function, or wherever
11414 we finished last time. */
11415 n
= info
->symtab_pos
+ 1;
11417 /* If the last stop offset is different from the current one it means we
11418 are disassembling a different glob of bytes. As such the optimization
11419 would not be safe and we should start over. */
11420 can_use_search_opt_p
11421 = private_data
->last_mapping_sym
>= 0
11422 && info
->stop_offset
== private_data
->last_stop_offset
;
11424 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
11425 n
= private_data
->last_mapping_sym
;
11427 /* Look down while we haven't passed the location being disassembled.
11428 The reason for this is that there's no defined order between a symbol
11429 and an mapping symbol that may be at the same address. We may have to
11430 look at least one position ahead. */
11431 for (; n
< info
->symtab_size
; n
++)
11433 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11436 if (get_map_sym_type (info
, n
, &type
))
11445 n
= info
->symtab_pos
;
11446 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
11447 n
= private_data
->last_mapping_sym
;
11449 /* No mapping symbol found at this address. Look backwards
11450 for a preceeding one, but don't go pass the section start
11451 otherwise a data section with no mapping symbol can pick up
11452 a text mapping symbol of a preceeding section. The documentation
11453 says section can be NULL, in which case we will seek up all the
11456 section_vma
= info
->section
->vma
;
11458 for (; n
>= 0; n
--)
11460 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11461 if (addr
< section_vma
)
11464 if (get_map_sym_type (info
, n
, &type
))
11474 /* If no mapping symbol was found, try looking up without a mapping
11475 symbol. This is done by walking up from the current PC to the nearest
11476 symbol. We don't actually have to loop here since symtab_pos will
11477 contain the nearest symbol already. */
11480 n
= info
->symtab_pos
;
11481 if (n
>= 0 && get_sym_code_type (info
, n
, &type
))
11488 private_data
->last_mapping_sym
= last_sym
;
11489 private_data
->last_type
= type
;
11490 private_data
->last_stop_offset
= info
->stop_offset
;
11492 *map_symbol
= type
;
11496 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
11497 of the supplied arm_feature_set structure with bitmasks indicating
11498 the supported base architectures and coprocessor extensions.
11500 FIXME: This could more efficiently implemented as a constant array,
11501 although it would also be less robust. */
11504 select_arm_features (unsigned long mach
,
11505 arm_feature_set
* features
)
11507 arm_feature_set arch_fset
;
11508 const arm_feature_set fpu_any
= FPU_ANY
;
11510 #undef ARM_SET_FEATURES
11511 #define ARM_SET_FEATURES(FSET) \
11513 const arm_feature_set fset = FSET; \
11514 arch_fset = fset; \
11517 /* When several architecture versions share the same bfd_mach_arm_XXX value
11518 the most featureful is chosen. */
11521 case bfd_mach_arm_2
: ARM_SET_FEATURES (ARM_ARCH_V2
); break;
11522 case bfd_mach_arm_2a
: ARM_SET_FEATURES (ARM_ARCH_V2S
); break;
11523 case bfd_mach_arm_3
: ARM_SET_FEATURES (ARM_ARCH_V3
); break;
11524 case bfd_mach_arm_3M
: ARM_SET_FEATURES (ARM_ARCH_V3M
); break;
11525 case bfd_mach_arm_4
: ARM_SET_FEATURES (ARM_ARCH_V4
); break;
11526 case bfd_mach_arm_4T
: ARM_SET_FEATURES (ARM_ARCH_V4T
); break;
11527 case bfd_mach_arm_5
: ARM_SET_FEATURES (ARM_ARCH_V5
); break;
11528 case bfd_mach_arm_5T
: ARM_SET_FEATURES (ARM_ARCH_V5T
); break;
11529 case bfd_mach_arm_5TE
: ARM_SET_FEATURES (ARM_ARCH_V5TE
); break;
11530 case bfd_mach_arm_XScale
: ARM_SET_FEATURES (ARM_ARCH_XSCALE
); break;
11531 case bfd_mach_arm_ep9312
:
11532 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T
,
11533 ARM_CEXT_MAVERICK
| FPU_MAVERICK
));
11535 case bfd_mach_arm_iWMMXt
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT
); break;
11536 case bfd_mach_arm_iWMMXt2
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2
); break;
11537 case bfd_mach_arm_5TEJ
: ARM_SET_FEATURES (ARM_ARCH_V5TEJ
); break;
11538 case bfd_mach_arm_6
: ARM_SET_FEATURES (ARM_ARCH_V6
); break;
11539 case bfd_mach_arm_6KZ
: ARM_SET_FEATURES (ARM_ARCH_V6KZ
); break;
11540 case bfd_mach_arm_6T2
: ARM_SET_FEATURES (ARM_ARCH_V6KZT2
); break;
11541 case bfd_mach_arm_6K
: ARM_SET_FEATURES (ARM_ARCH_V6K
); break;
11542 case bfd_mach_arm_7
: ARM_SET_FEATURES (ARM_ARCH_V7VE
); break;
11543 case bfd_mach_arm_6M
: ARM_SET_FEATURES (ARM_ARCH_V6M
); break;
11544 case bfd_mach_arm_6SM
: ARM_SET_FEATURES (ARM_ARCH_V6SM
); break;
11545 case bfd_mach_arm_7EM
: ARM_SET_FEATURES (ARM_ARCH_V7EM
); break;
11546 case bfd_mach_arm_8
:
11548 /* Add bits for extensions that Armv8.5-A recognizes. */
11549 arm_feature_set armv8_5_ext_fset
11550 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
);
11551 ARM_SET_FEATURES (ARM_ARCH_V8_5A
);
11552 ARM_MERGE_FEATURE_SETS (arch_fset
, arch_fset
, armv8_5_ext_fset
);
11555 case bfd_mach_arm_8R
: ARM_SET_FEATURES (ARM_ARCH_V8R
); break;
11556 case bfd_mach_arm_8M_BASE
: ARM_SET_FEATURES (ARM_ARCH_V8M_BASE
); break;
11557 case bfd_mach_arm_8M_MAIN
: ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN
); break;
11558 case bfd_mach_arm_8_1M_MAIN
:
11559 ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN
);
11562 /* If the machine type is unknown allow all architecture types and all
11564 case bfd_mach_arm_unknown
: ARM_SET_FEATURES (ARM_FEATURE_ALL
); break;
11568 #undef ARM_SET_FEATURES
11570 /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
11571 and thus on bfd_mach_arm_XXX value. Therefore for a given
11572 bfd_mach_arm_XXX value all coprocessor feature bits should be allowed. */
11573 ARM_MERGE_FEATURE_SETS (*features
, arch_fset
, fpu_any
);
11577 /* NOTE: There are no checks in these routines that
11578 the relevant number of data bytes exist. */
11581 print_insn (bfd_vma pc
, struct disassemble_info
*info
, bfd_boolean little
)
11583 unsigned char b
[4];
11586 int is_thumb
= FALSE
;
11587 int is_data
= FALSE
;
11589 unsigned int size
= 4;
11590 void (*printer
) (bfd_vma
, struct disassemble_info
*, long);
11591 bfd_boolean found
= FALSE
;
11592 struct arm_private_data
*private_data
;
11594 if (info
->disassembler_options
)
11596 parse_arm_disassembler_options (info
->disassembler_options
);
11598 /* To avoid repeated parsing of these options, we remove them here. */
11599 info
->disassembler_options
= NULL
;
11602 /* PR 10288: Control which instructions will be disassembled. */
11603 if (info
->private_data
== NULL
)
11605 static struct arm_private_data
private;
11607 if ((info
->flags
& USER_SPECIFIED_MACHINE_TYPE
) == 0)
11608 /* If the user did not use the -m command line switch then default to
11609 disassembling all types of ARM instruction.
11611 The info->mach value has to be ignored as this will be based on
11612 the default archictecture for the target and/or hints in the notes
11613 section, but it will never be greater than the current largest arm
11614 machine value (iWMMXt2), which is only equivalent to the V5TE
11615 architecture. ARM architectures have advanced beyond the machine
11616 value encoding, and these newer architectures would be ignored if
11617 the machine value was used.
11619 Ie the -m switch is used to restrict which instructions will be
11620 disassembled. If it is necessary to use the -m switch to tell
11621 objdump that an ARM binary is being disassembled, eg because the
11622 input is a raw binary file, but it is also desired to disassemble
11623 all ARM instructions then use "-marm". This will select the
11624 "unknown" arm architecture which is compatible with any ARM
11626 info
->mach
= bfd_mach_arm_unknown
;
11628 /* Compute the architecture bitmask from the machine number.
11629 Note: This assumes that the machine number will not change
11630 during disassembly.... */
11631 select_arm_features (info
->mach
, & private.features
);
11633 private.last_mapping_sym
= -1;
11634 private.last_mapping_addr
= 0;
11635 private.last_stop_offset
= 0;
11637 info
->private_data
= & private;
11640 private_data
= info
->private_data
;
11642 /* Decide if our code is going to be little-endian, despite what the
11643 function argument might say. */
11644 little_code
= ((info
->endian_code
== BFD_ENDIAN_LITTLE
) || little
);
11646 /* For ELF, consult the symbol table to determine what kind of code
11647 or data we have. */
11648 if (info
->symtab_size
!= 0
11649 && bfd_asymbol_flavour (*info
->symtab
) == bfd_target_elf_flavour
)
11654 enum map_type type
= MAP_ARM
;
11656 found
= mapping_symbol_for_insn (pc
, info
, &type
);
11657 last_sym
= private_data
->last_mapping_sym
;
11659 is_thumb
= (private_data
->last_type
== MAP_THUMB
);
11660 is_data
= (private_data
->last_type
== MAP_DATA
);
11662 /* Look a little bit ahead to see if we should print out
11663 two or four bytes of data. If there's a symbol,
11664 mapping or otherwise, after two bytes then don't
11668 size
= 4 - (pc
& 3);
11669 for (n
= last_sym
+ 1; n
< info
->symtab_size
; n
++)
11671 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11673 && (info
->section
== NULL
11674 || info
->section
== info
->symtab
[n
]->section
))
11676 if (addr
- pc
< size
)
11681 /* If the next symbol is after three bytes, we need to
11682 print only part of the data, so that we can use either
11683 .byte or .short. */
11685 size
= (pc
& 1) ? 1 : 2;
11689 if (info
->symbols
!= NULL
)
11691 if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_coff_flavour
)
11693 coff_symbol_type
* cs
;
11695 cs
= coffsymbol (*info
->symbols
);
11696 is_thumb
= ( cs
->native
->u
.syment
.n_sclass
== C_THUMBEXT
11697 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTAT
11698 || cs
->native
->u
.syment
.n_sclass
== C_THUMBLABEL
11699 || cs
->native
->u
.syment
.n_sclass
== C_THUMBEXTFUNC
11700 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTATFUNC
);
11702 else if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_elf_flavour
11705 /* If no mapping symbol has been found then fall back to the type
11706 of the function symbol. */
11707 elf_symbol_type
* es
;
11710 es
= *(elf_symbol_type
**)(info
->symbols
);
11711 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
11714 ((ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
11715 == ST_BRANCH_TO_THUMB
) || type
== STT_ARM_16BIT
);
11717 else if (bfd_asymbol_flavour (*info
->symbols
)
11718 == bfd_target_mach_o_flavour
)
11720 bfd_mach_o_asymbol
*asym
= (bfd_mach_o_asymbol
*)*info
->symbols
;
11722 is_thumb
= (asym
->n_desc
& BFD_MACH_O_N_ARM_THUMB_DEF
);
11730 info
->display_endian
= little
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11732 info
->display_endian
= little_code
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11734 info
->bytes_per_line
= 4;
11736 /* PR 10263: Disassemble data if requested to do so by the user. */
11737 if (is_data
&& ((info
->flags
& DISASSEMBLE_DATA
) == 0))
11741 /* Size was already set above. */
11742 info
->bytes_per_chunk
= size
;
11743 printer
= print_insn_data
;
11745 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, size
, info
);
11748 for (i
= size
- 1; i
>= 0; i
--)
11749 given
= b
[i
] | (given
<< 8);
11751 for (i
= 0; i
< (int) size
; i
++)
11752 given
= b
[i
] | (given
<< 8);
11754 else if (!is_thumb
)
11756 /* In ARM mode endianness is a straightforward issue: the instruction
11757 is four bytes long and is either ordered 0123 or 3210. */
11758 printer
= print_insn_arm
;
11759 info
->bytes_per_chunk
= 4;
11762 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 4, info
);
11764 given
= (b
[0]) | (b
[1] << 8) | (b
[2] << 16) | (b
[3] << 24);
11766 given
= (b
[3]) | (b
[2] << 8) | (b
[1] << 16) | (b
[0] << 24);
11770 /* In Thumb mode we have the additional wrinkle of two
11771 instruction lengths. Fortunately, the bits that determine
11772 the length of the current instruction are always to be found
11773 in the first two bytes. */
11774 printer
= print_insn_thumb16
;
11775 info
->bytes_per_chunk
= 2;
11778 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 2, info
);
11780 given
= (b
[0]) | (b
[1] << 8);
11782 given
= (b
[1]) | (b
[0] << 8);
11786 /* These bit patterns signal a four-byte Thumb
11788 if ((given
& 0xF800) == 0xF800
11789 || (given
& 0xF800) == 0xF000
11790 || (given
& 0xF800) == 0xE800)
11792 status
= info
->read_memory_func (pc
+ 2, (bfd_byte
*) b
, 2, info
);
11794 given
= (b
[0]) | (b
[1] << 8) | (given
<< 16);
11796 given
= (b
[1]) | (b
[0] << 8) | (given
<< 16);
11798 printer
= print_insn_thumb32
;
11803 if (ifthen_address
!= pc
)
11804 find_ifthen_state (pc
, info
, little_code
);
11808 if ((ifthen_state
& 0xf) == 0x8)
11809 ifthen_next_state
= 0;
11811 ifthen_next_state
= (ifthen_state
& 0xe0)
11812 | ((ifthen_state
& 0xf) << 1);
11818 info
->memory_error_func (status
, pc
, info
);
11821 if (info
->flags
& INSN_HAS_RELOC
)
11822 /* If the instruction has a reloc associated with it, then
11823 the offset field in the instruction will actually be the
11824 addend for the reloc. (We are using REL type relocs).
11825 In such cases, we can ignore the pc when computing
11826 addresses, since the addend is not currently pc-relative. */
11829 printer (pc
, info
, given
);
11833 ifthen_state
= ifthen_next_state
;
11834 ifthen_address
+= size
;
11840 print_insn_big_arm (bfd_vma pc
, struct disassemble_info
*info
)
11842 /* Detect BE8-ness and record it in the disassembler info. */
11843 if (info
->flavour
== bfd_target_elf_flavour
11844 && info
->section
!= NULL
11845 && (elf_elfheader (info
->section
->owner
)->e_flags
& EF_ARM_BE8
))
11846 info
->endian_code
= BFD_ENDIAN_LITTLE
;
11848 return print_insn (pc
, info
, FALSE
);
11852 print_insn_little_arm (bfd_vma pc
, struct disassemble_info
*info
)
11854 return print_insn (pc
, info
, TRUE
);
11857 const disasm_options_and_args_t
*
11858 disassembler_options_arm (void)
11860 static disasm_options_and_args_t
*opts_and_args
;
11862 if (opts_and_args
== NULL
)
11864 disasm_options_t
*opts
;
11867 opts_and_args
= XNEW (disasm_options_and_args_t
);
11868 opts_and_args
->args
= NULL
;
11870 opts
= &opts_and_args
->options
;
11871 opts
->name
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11872 opts
->description
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11874 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11876 opts
->name
[i
] = regnames
[i
].name
;
11877 if (regnames
[i
].description
!= NULL
)
11878 opts
->description
[i
] = _(regnames
[i
].description
);
11880 opts
->description
[i
] = NULL
;
11882 /* The array we return must be NULL terminated. */
11883 opts
->name
[i
] = NULL
;
11884 opts
->description
[i
] = NULL
;
11887 return opts_and_args
;
11891 print_arm_disassembler_options (FILE *stream
)
11893 unsigned int i
, max_len
= 0;
11894 fprintf (stream
, _("\n\
11895 The following ARM specific disassembler options are supported for use with\n\
11896 the -M switch:\n"));
11898 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11900 unsigned int len
= strlen (regnames
[i
].name
);
11905 for (i
= 0, max_len
++; i
< NUM_ARM_OPTIONS
; i
++)
11906 fprintf (stream
, " %s%*c %s\n",
11908 (int)(max_len
- strlen (regnames
[i
].name
)), ' ',
11909 _(regnames
[i
].description
));