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
,
287 enum mve_unpredictable
289 UNPRED_IT_BLOCK
, /* Unpredictable because mve insn in it block.
291 UNPRED_FCA_0_FCB_1
, /* Unpredictable because fcA = 0 and
293 UNPRED_R13
, /* Unpredictable because r13 (sp) or
295 UNPRED_R15
, /* Unpredictable because r15 (pc) is used. */
296 UNPRED_Q_GT_4
, /* Unpredictable because
297 vec reg start > 4 (vld4/st4). */
298 UNPRED_Q_GT_6
, /* Unpredictable because
299 vec reg start > 6 (vld2/st2). */
300 UNPRED_R13_AND_WB
, /* Unpredictable becase gp reg = r13
302 UNPRED_Q_REGS_EQUAL
, /* Unpredictable because vector registers are
304 UNPRED_OS
, /* Unpredictable because offset scaled == 1. */
305 UNPRED_GP_REGS_EQUAL
, /* Unpredictable because gp registers are the
307 UNPRED_Q_REGS_EQ_AND_SIZE_1
, /* Unpredictable because q regs equal and
309 UNPRED_Q_REGS_EQ_AND_SIZE_2
, /* Unpredictable because q regs equal and
311 UNPRED_NONE
/* No unpredictable behavior. */
316 UNDEF_SIZE
, /* undefined size. */
317 UNDEF_SIZE_0
, /* undefined because size == 0. */
318 UNDEF_SIZE_2
, /* undefined because size == 2. */
319 UNDEF_SIZE_3
, /* undefined because size == 3. */
320 UNDEF_SIZE_LE_1
, /* undefined because size <= 1. */
321 UNDEF_SIZE_NOT_0
, /* undefined because size != 0. */
322 UNDEF_SIZE_NOT_2
, /* undefined because size != 2. */
323 UNDEF_SIZE_NOT_3
, /* undefined because size != 3. */
324 UNDEF_NOT_UNS_SIZE_0
, /* undefined because U == 0 and
326 UNDEF_NOT_UNS_SIZE_1
, /* undefined because U == 0 and
328 UNDEF_NOT_UNSIGNED
, /* undefined because U == 0. */
329 UNDEF_VCVT_IMM6
, /* imm6 < 32. */
330 UNDEF_VCVT_FSI_IMM6
, /* fsi = 0 and 32 >= imm6 <= 47. */
331 UNDEF_BAD_OP1_OP2
, /* undefined with op2 = 2 and
333 UNDEF_BAD_U_OP1_OP2
, /* undefined with U = 1 and
334 op2 == 0 and op1 == (0 or 1). */
335 UNDEF_OP_0_BAD_CMODE
, /* undefined because op == 0 and cmode
337 UNDEF_XCHG_UNS
, /* undefined because X == 1 and U == 1. */
338 UNDEF_NONE
/* no undefined behavior. */
343 arm_feature_set arch
; /* Architecture defining this insn. */
344 unsigned long value
; /* If arch is 0 then value is a sentinel. */
345 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
346 const char * assembler
; /* How to disassemble this insn. */
353 arm_feature_set arch
; /* Architecture defining this insn. */
354 enum mve_instructions mve_op
; /* Specific mve instruction for faster
356 unsigned long value
; /* If arch is 0 then value is a sentinel. */
357 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
358 const char * assembler
; /* How to disassemble this insn. */
368 /* Shared (between Arm and Thumb mode) opcode. */
371 enum isa isa
; /* Execution mode instruction availability. */
372 arm_feature_set arch
; /* Architecture defining this insn. */
373 unsigned long value
; /* If arch is 0 then value is a sentinel. */
374 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
375 const char * assembler
; /* How to disassemble this insn. */
380 arm_feature_set arch
; /* Architecture defining this insn. */
381 unsigned short value
, mask
; /* Recognise insn if (op & mask) == value. */
382 const char *assembler
; /* How to disassemble this insn. */
385 /* print_insn_coprocessor recognizes the following format control codes:
389 %c print condition code (always bits 28-31 in ARM mode)
390 %q print shifter argument
391 %u print condition code (unconditional in ARM mode,
392 UNPREDICTABLE if not AL in Thumb)
393 %A print address for ldc/stc/ldf/stf instruction
394 %B print vstm/vldm register list
395 %C print vscclrm register list
396 %I print cirrus signed shift immediate: bits 0..3|4..6
397 %J print register for VLDR instruction
398 %K print address for VLDR instruction
399 %F print the COUNT field of a LFM/SFM instruction.
400 %P print floating point precision in arithmetic insn
401 %Q print floating point precision in ldf/stf insn
402 %R print floating point rounding mode
404 %<bitfield>c print as a condition code (for vsel)
405 %<bitfield>r print as an ARM register
406 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
407 %<bitfield>ru as %<>r but each u register must be unique.
408 %<bitfield>d print the bitfield in decimal
409 %<bitfield>k print immediate for VFPv3 conversion instruction
410 %<bitfield>x print the bitfield in hex
411 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
412 %<bitfield>f print a floating point constant if >7 else a
413 floating point register
414 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
415 %<bitfield>g print as an iWMMXt 64-bit register
416 %<bitfield>G print as an iWMMXt general purpose or control register
417 %<bitfield>D print as a NEON D register
418 %<bitfield>Q print as a NEON Q register
419 %<bitfield>V print as a NEON D or Q register
420 %<bitfield>E print a quarter-float immediate value
422 %y<code> print a single precision VFP reg.
423 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
424 %z<code> print a double precision VFP reg
425 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
427 %<bitfield>'c print specified char iff bitfield is all ones
428 %<bitfield>`c print specified char iff bitfield is all zeroes
429 %<bitfield>?ab... select from array of values in big endian order
431 %L print as an iWMMXt N/M width field.
432 %Z print the Immediate of a WSHUFH instruction.
433 %l like 'A' except use byte offsets for 'B' & 'H'
435 %i print 5-bit immediate in bits 8,3..0
437 %r print register offset address for wldt/wstr instruction. */
439 enum opcode_sentinel_enum
441 SENTINEL_IWMMXT_START
= 1,
443 SENTINEL_GENERIC_START
446 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x"
447 #define UNKNOWN_INSTRUCTION_32BIT "\t\t; <UNDEFINED> instruction: %08x"
448 #define UNKNOWN_INSTRUCTION_16BIT "\t\t; <UNDEFINED> instruction: %04x"
449 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>"
451 /* Common coprocessor opcodes shared between Arm and Thumb-2. */
453 static const struct sopcode32 coprocessor_opcodes
[] =
455 /* XScale instructions. */
456 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
457 0x0e200010, 0x0fff0ff0,
458 "mia%c\tacc0, %0-3r, %12-15r"},
459 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
460 0x0e280010, 0x0fff0ff0,
461 "miaph%c\tacc0, %0-3r, %12-15r"},
462 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
463 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
464 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
465 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
466 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
467 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
469 /* Intel Wireless MMX technology instructions. */
470 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START
, 0, "" },
471 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT
),
472 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
473 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
474 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
475 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
476 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
477 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
478 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
479 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
480 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
481 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
482 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
483 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
484 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
485 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
486 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
487 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
488 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
489 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
490 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
491 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
492 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
493 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
494 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
495 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
496 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
497 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
498 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
499 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
500 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
501 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
502 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
503 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
504 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
505 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
506 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
507 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
508 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
509 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
510 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
511 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
512 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
513 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
514 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
515 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
516 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
517 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
518 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
519 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
520 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
521 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
522 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
523 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
524 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
525 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
526 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
527 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
528 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
529 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
530 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
531 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
532 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
533 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
534 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
535 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
536 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
537 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
538 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
539 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
540 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
541 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
542 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
543 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
544 0x0e800120, 0x0f800ff0,
545 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
546 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
547 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
548 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
549 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
550 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
551 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
552 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
553 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
554 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
555 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
556 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
557 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
558 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
559 0x0e8000a0, 0x0f800ff0,
560 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
561 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
562 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
563 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
564 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
565 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
566 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
567 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
568 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
569 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
570 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
571 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
572 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
573 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
574 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
575 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
576 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
577 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
578 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
579 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
580 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
581 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
582 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
583 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
584 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
585 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
586 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
587 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
588 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
589 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
590 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
591 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
592 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
593 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
594 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
595 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
596 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
597 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
598 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
599 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
600 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
601 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
602 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
603 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
604 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
605 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
606 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
607 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
608 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
609 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
610 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
611 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
612 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
613 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
614 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
615 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
616 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
617 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
618 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
619 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
620 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
621 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE
),
622 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
623 {ANY
, ARM_FEATURE_CORE_LOW (0),
624 SENTINEL_IWMMXT_END
, 0, "" },
626 /* Floating point coprocessor (FPA) instructions. */
627 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
628 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
629 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
630 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
631 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
632 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
633 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
634 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
635 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
636 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
637 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
638 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
639 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
640 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
641 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
642 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
643 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
644 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
645 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
646 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
647 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
648 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
649 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
650 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
651 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
652 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
653 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
654 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
655 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
656 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
657 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
658 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
659 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
660 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
661 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
662 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
663 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
664 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
665 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
666 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
667 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
668 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
669 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
670 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
671 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
672 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
673 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
674 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
675 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
676 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
677 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
678 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
679 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
680 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
681 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
682 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
683 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
684 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
685 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
686 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
687 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
688 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
689 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
690 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
691 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
692 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
693 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
694 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
695 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
696 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
697 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
698 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
699 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
700 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
701 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
702 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
703 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
704 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
705 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
706 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
707 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1
),
708 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
709 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
710 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
711 {ANY
, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2
),
712 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
714 /* Armv8.1-M Mainline instructions. */
715 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
716 0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
717 {T32
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
718 0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
720 /* ARMv8-M Mainline Security Extensions instructions. */
721 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
722 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
723 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN
),
724 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
726 /* Register load/store. */
727 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
728 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
729 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
730 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
731 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
732 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
733 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
734 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
735 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
736 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
737 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
738 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
739 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
740 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
741 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
),
742 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
743 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
744 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
745 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
746 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
747 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
748 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
749 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
750 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
751 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
752 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
753 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
754 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
755 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
756 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
757 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
758 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
759 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
760 0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
761 {ANY
, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN
),
762 0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
764 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
765 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
766 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
767 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
768 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
769 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
770 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
771 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
773 /* Data transfer between ARM and NEON registers. */
774 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
775 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
776 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
777 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
778 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
779 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
780 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
781 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
782 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
783 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
784 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
785 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
786 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
787 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
788 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
789 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
790 /* Half-precision conversion instructions. */
791 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
792 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
793 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
794 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
795 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
796 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
797 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
798 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
800 /* Floating point coprocessor (VFP) instructions. */
801 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
802 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
803 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
804 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
805 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
806 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
807 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
808 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
809 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
810 0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
811 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
812 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
813 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
814 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
815 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
816 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
817 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
818 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
819 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
820 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
821 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
822 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
823 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
824 0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
825 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
826 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
827 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
828 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
829 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
830 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
831 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
832 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
833 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
834 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
835 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
836 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
837 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
838 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
839 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
840 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
841 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
842 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
843 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
844 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
845 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
846 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
847 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
848 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
849 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
850 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
851 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
852 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
853 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
854 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
855 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
856 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
857 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
858 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
859 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
860 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
861 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
862 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
863 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
864 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
865 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
866 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
867 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
868 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
869 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
870 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
871 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
872 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
873 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
874 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
875 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
876 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
877 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
878 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
879 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
880 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
881 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
882 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
883 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
884 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
885 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
886 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
887 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
888 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
889 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
890 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
891 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
892 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
893 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD
),
894 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
895 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3
),
896 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
897 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
898 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
899 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
900 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
901 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2
),
902 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
903 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
904 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
905 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
906 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
907 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
908 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
909 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
910 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
911 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
912 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
913 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
914 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
915 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
916 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
917 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
918 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
919 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
920 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
921 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
922 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
923 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
924 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
925 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
926 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
927 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
928 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
929 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
930 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
931 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
932 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
933 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
934 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
935 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD
),
936 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
937 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1
),
938 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
940 /* Cirrus coprocessor instructions. */
941 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
942 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
943 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
944 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
945 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
946 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
947 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
948 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
949 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
950 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
951 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
952 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
953 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
954 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
955 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
956 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
957 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
958 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
959 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
960 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
961 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
962 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
963 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
964 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
965 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
966 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
967 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
968 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
969 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
970 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
971 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
972 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
973 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
974 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
975 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
976 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
977 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
978 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
979 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
980 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
981 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
982 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
983 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
984 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
985 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
986 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
987 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
988 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
989 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
990 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
991 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
992 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
993 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
994 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
995 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
996 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
997 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
998 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
999 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1000 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
1001 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1002 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
1003 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1004 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
1005 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1006 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
1007 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1008 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
1009 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1010 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
1011 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1012 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
1013 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1014 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
1015 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1016 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
1017 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1018 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
1019 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1020 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
1021 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1022 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
1023 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1024 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
1025 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1026 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
1027 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1028 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
1029 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1030 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
1031 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1032 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
1033 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1034 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
1035 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1036 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
1037 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1038 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
1039 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1040 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
1041 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1042 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
1043 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1044 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
1045 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1046 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
1047 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1048 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
1049 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1050 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
1051 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1052 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
1053 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1054 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
1055 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1056 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
1057 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1058 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
1059 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1060 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
1061 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1062 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
1063 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1064 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
1065 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1066 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1067 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1068 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1069 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1070 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1071 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1072 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1073 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1074 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1075 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1076 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1077 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1078 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
1079 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1080 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
1081 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1082 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
1083 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1084 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
1085 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1086 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1087 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1088 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1089 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1090 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1091 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1092 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1093 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1094 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1095 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1096 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1097 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1098 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1099 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1100 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1101 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1102 0x0e000600, 0x0ff00f10,
1103 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1104 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1105 0x0e100600, 0x0ff00f10,
1106 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1107 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1108 0x0e200600, 0x0ff00f10,
1109 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1110 {ANY
, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK
),
1111 0x0e300600, 0x0ff00f10,
1112 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1114 /* VFP Fused multiply add instructions. */
1115 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1116 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
1117 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1118 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
1119 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1120 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
1121 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1122 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
1123 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1124 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
1125 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1126 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
1127 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1128 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
1129 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA
),
1130 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
1133 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1134 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
1135 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1136 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
1137 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1138 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
1139 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1140 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
1141 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1142 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
1143 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1144 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
1145 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1146 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
1147 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1148 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
1149 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1150 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
1151 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1152 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
1153 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1154 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
1155 {ANY
, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8
),
1156 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
1158 /* Generic coprocessor instructions. */
1159 {ANY
, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START
, 0, "" },
1160 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1161 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
1162 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
1163 0x0c500000, 0x0ff00000,
1164 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1165 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1166 0x0e000000, 0x0f000010,
1167 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1168 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1169 0x0e10f010, 0x0f10f010,
1170 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
1171 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1172 0x0e100010, 0x0f100010,
1173 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1174 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1175 0x0e000010, 0x0f100010,
1176 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1177 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1178 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
1179 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
1180 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
1182 /* V6 coprocessor instructions. */
1183 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1184 0xfc500000, 0xfff00000,
1185 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1186 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
1187 0xfc400000, 0xfff00000,
1188 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
1190 /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8. */
1191 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1192 0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1193 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1194 0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1195 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1196 0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1197 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1198 0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1199 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1200 0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1201 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1202 0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1203 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1204 0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
1205 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1206 0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
1207 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1208 0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
1209 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1210 0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
1212 /* Dot Product instructions in the space of coprocessor 13. */
1213 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1214 0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
1215 {ANY
, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD
),
1216 0xfe000d00, 0xff000f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
1218 /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */
1219 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1220 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1221 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1222 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1223 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1224 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1225 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1226 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1227 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1228 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1229 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1230 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1231 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1232 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1233 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
| ARM_EXT2_V8_2A
),
1234 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1236 /* V5 coprocessor instructions. */
1237 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1238 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1239 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1240 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1241 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1242 0xfe000000, 0xff000010,
1243 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1244 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1245 0xfe000010, 0xff100010,
1246 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1247 {ANY
, ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
1248 0xfe100010, 0xff100010,
1249 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1251 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
1252 cp_num: bit <11:8> == 0b1001.
1253 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */
1254 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1255 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
1256 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1257 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
1258 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1259 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
1260 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1261 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
1262 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1263 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
1264 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1265 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
1266 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1267 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
1268 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1269 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
1270 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1271 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
1272 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1273 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
1274 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1275 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
1276 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1277 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
1278 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1279 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
1280 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1281 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
1282 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1283 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
1284 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1285 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
1286 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1287 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
1288 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1289 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
1290 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1291 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
1292 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1293 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
1294 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1295 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
1296 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1297 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
1298 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1299 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
1300 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1301 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
1302 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1303 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
1304 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1305 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
1306 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1307 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
1308 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1309 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
1310 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1311 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
1312 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1313 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
1314 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1315 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
1316 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1317 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
1318 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1319 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
1320 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1321 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
1322 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1323 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
1325 /* ARMv8.3 javascript conversion instruction. */
1326 {ANY
, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A
),
1327 0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
1329 {ANY
, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1332 /* Neon opcode table: This does not encode the top byte -- that is
1333 checked by the print_insn_neon routine, as it depends on whether we are
1334 doing thumb32 or arm32 disassembly. */
1336 /* print_insn_neon recognizes the following format control codes:
1340 %c print condition code
1341 %u print condition code (unconditional in ARM mode,
1342 UNPREDICTABLE if not AL in Thumb)
1343 %A print v{st,ld}[1234] operands
1344 %B print v{st,ld}[1234] any one operands
1345 %C print v{st,ld}[1234] single->all operands
1347 %E print vmov, vmvn, vorr, vbic encoded constant
1348 %F print vtbl,vtbx register list
1350 %<bitfield>r print as an ARM register
1351 %<bitfield>d print the bitfield in decimal
1352 %<bitfield>e print the 2^N - bitfield in decimal
1353 %<bitfield>D print as a NEON D register
1354 %<bitfield>Q print as a NEON Q register
1355 %<bitfield>R print as a NEON D or Q register
1356 %<bitfield>Sn print byte scaled width limited by n
1357 %<bitfield>Tn print short scaled width limited by n
1358 %<bitfield>Un print long scaled width limited by n
1360 %<bitfield>'c print specified char iff bitfield is all ones
1361 %<bitfield>`c print specified char iff bitfield is all zeroes
1362 %<bitfield>?ab... select from array of values in big endian order. */
1364 static const struct opcode32 neon_opcodes
[] =
1367 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1368 0xf2b00840, 0xffb00850,
1369 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1370 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1371 0xf2b00000, 0xffb00810,
1372 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1374 /* Data transfer between ARM and NEON registers. */
1375 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1376 0x0e800b10, 0x1ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
1377 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1378 0x0e800b30, 0x1ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
1379 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1380 0x0ea00b10, 0x1ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
1381 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1382 0x0ea00b30, 0x1ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
1383 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1384 0x0ec00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
1385 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1386 0x0ee00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
1388 /* Move data element to all lanes. */
1389 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1390 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
1391 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1392 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
1393 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1394 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
1397 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1398 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
1399 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1400 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
1402 /* Half-precision conversions. */
1403 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1404 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
1405 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16
),
1406 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
1408 /* NEON fused multiply add instructions. */
1409 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1410 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1411 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1412 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1413 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA
),
1414 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1415 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1416 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1418 /* Two registers, miscellaneous. */
1419 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1420 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
1421 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1422 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
1423 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1424 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
1425 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1426 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
1427 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1428 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
1429 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1430 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
1431 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1432 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
1433 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1434 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
1435 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1436 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
1437 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1438 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
1439 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1440 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
1441 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1442 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
1443 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1444 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
1445 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1446 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
1447 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1448 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
1449 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1450 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
1451 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1452 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
1453 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1454 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
1455 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1456 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1457 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1458 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1459 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1460 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
1461 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1462 0xf3b20300, 0xffb30fd0,
1463 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
1464 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1465 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1466 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1467 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1468 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1469 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1470 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1471 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1472 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1473 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1474 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1475 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1476 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1477 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1478 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1479 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1480 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1481 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
1482 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1483 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1484 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1485 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1486 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1487 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1488 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1489 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1490 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1491 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1492 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1493 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1494 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1495 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1496 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1497 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1498 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1499 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1500 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1501 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1502 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1503 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1504 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1505 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1506 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1507 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1508 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1509 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1510 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1511 0xf3bb0600, 0xffbf0e10,
1512 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
1513 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1514 0xf3b70600, 0xffbf0e10,
1515 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
1517 /* Three registers of the same length. */
1518 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1519 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1520 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1521 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1522 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1523 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1524 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1525 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1526 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1527 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1528 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1529 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1530 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1531 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1532 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1533 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1534 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1535 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1536 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8
),
1537 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1538 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1539 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1540 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1541 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1542 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1543 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1544 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1545 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1546 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1547 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1548 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1549 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1550 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1551 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1552 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1553 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1554 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1555 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1556 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1557 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1558 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1559 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1560 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1561 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1562 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1563 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1564 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1565 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1566 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1567 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1568 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1569 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1570 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1571 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1572 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1573 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1574 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1575 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1576 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1577 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1578 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1579 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1580 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1581 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1582 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1583 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1584 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1585 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1586 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1587 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1588 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1589 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1590 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1591 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1592 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1593 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1594 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1595 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1596 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1597 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1598 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1599 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1600 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1601 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1602 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1603 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1604 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1605 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1606 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1607 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1608 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1609 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1610 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1611 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1612 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1613 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1614 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1615 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1616 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1617 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1618 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1619 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1620 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1621 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1622 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1623 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1624 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1625 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1626 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1627 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1628 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1629 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1630 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1631 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1632 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1633 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1634 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1635 0xf2000b00, 0xff800f10,
1636 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1637 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1638 0xf2000b10, 0xff800f10,
1639 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1640 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1641 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1642 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1643 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1644 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1645 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1646 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1647 0xf3000b00, 0xff800f10,
1648 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1649 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1650 0xf2000000, 0xfe800f10,
1651 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1652 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1653 0xf2000010, 0xfe800f10,
1654 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1655 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1656 0xf2000100, 0xfe800f10,
1657 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1658 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1659 0xf2000200, 0xfe800f10,
1660 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1661 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1662 0xf2000210, 0xfe800f10,
1663 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1664 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1665 0xf2000300, 0xfe800f10,
1666 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1667 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1668 0xf2000310, 0xfe800f10,
1669 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1670 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1671 0xf2000400, 0xfe800f10,
1672 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1673 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1674 0xf2000410, 0xfe800f10,
1675 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1676 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1677 0xf2000500, 0xfe800f10,
1678 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1679 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1680 0xf2000510, 0xfe800f10,
1681 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1682 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1683 0xf2000600, 0xfe800f10,
1684 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1685 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1686 0xf2000610, 0xfe800f10,
1687 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1688 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1689 0xf2000700, 0xfe800f10,
1690 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1691 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1692 0xf2000710, 0xfe800f10,
1693 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1694 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1695 0xf2000910, 0xfe800f10,
1696 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1697 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1698 0xf2000a00, 0xfe800f10,
1699 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1700 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1701 0xf2000a10, 0xfe800f10,
1702 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1703 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1704 0xf3000b10, 0xff800f10,
1705 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1706 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1707 0xf3000c10, 0xff800f10,
1708 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1710 /* One register and an immediate value. */
1711 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1712 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
1713 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1714 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
1715 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1716 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
1717 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1718 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
1719 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1720 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
1721 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1722 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
1723 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1724 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
1725 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1726 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
1727 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1728 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
1729 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1730 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
1731 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1732 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
1733 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1734 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
1735 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1736 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
1738 /* Two registers and a shift amount. */
1739 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1740 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1741 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1742 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1743 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1744 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1745 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1746 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1747 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1748 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1749 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1750 0xf2880950, 0xfeb80fd0,
1751 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1752 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1753 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
1754 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1755 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1756 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1757 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1758 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1759 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1760 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1761 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
1762 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1763 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
1764 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1765 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
1766 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1767 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1768 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1769 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1770 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1771 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1772 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1773 0xf2900950, 0xfeb00fd0,
1774 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1775 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1776 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
1777 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1778 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1779 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1780 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1781 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1782 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1783 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1784 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1785 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1786 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1787 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1788 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1789 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1790 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1791 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1792 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1793 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1794 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
1795 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1796 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
1797 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1798 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
1799 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1800 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
1801 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1802 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1803 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1804 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1805 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1806 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1807 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1808 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1809 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1810 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1811 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1812 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1813 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1814 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1815 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1816 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1817 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1818 0xf2a00950, 0xfea00fd0,
1819 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1820 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1821 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1822 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1823 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
1824 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1825 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
1826 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1827 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
1828 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1829 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1830 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1831 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1832 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1833 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1834 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1835 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1836 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1837 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1838 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1839 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1840 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1841 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
1842 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1843 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
1844 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1845 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
1846 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1847 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1848 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1849 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1850 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1851 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1852 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1853 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1854 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1855 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1856 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1857 0xf2a00e10, 0xfea00e90,
1858 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
1859 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
),
1860 0xf2a00c10, 0xfea00e90,
1861 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
1863 /* Three registers of different lengths. */
1864 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8
),
1865 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1866 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1867 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1868 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1869 0xf2800400, 0xff800f50,
1870 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1871 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1872 0xf2800600, 0xff800f50,
1873 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1874 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1875 0xf2800900, 0xff800f50,
1876 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1877 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1878 0xf2800b00, 0xff800f50,
1879 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1880 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1881 0xf2800d00, 0xff800f50,
1882 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1883 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1884 0xf3800400, 0xff800f50,
1885 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1886 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1887 0xf3800600, 0xff800f50,
1888 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
1889 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1890 0xf2800000, 0xfe800f50,
1891 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1892 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1893 0xf2800100, 0xfe800f50,
1894 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1895 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1896 0xf2800200, 0xfe800f50,
1897 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1898 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1899 0xf2800300, 0xfe800f50,
1900 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
1901 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1902 0xf2800500, 0xfe800f50,
1903 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1904 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1905 0xf2800700, 0xfe800f50,
1906 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1907 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1908 0xf2800800, 0xfe800f50,
1909 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1910 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1911 0xf2800a00, 0xfe800f50,
1912 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1913 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1914 0xf2800c00, 0xfe800f50,
1915 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
1917 /* Two registers and a scalar. */
1918 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1919 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1920 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1921 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1922 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1923 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
1924 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1925 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1926 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1927 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1928 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1929 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1930 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1931 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
1932 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1933 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1934 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1935 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1936 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1937 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
1938 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1939 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
1940 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1941 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1942 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1943 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1944 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1945 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1946 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1947 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1948 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1949 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1950 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1951 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1952 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1953 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1954 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1955 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1956 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1957 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1958 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1959 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1960 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1961 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
1962 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST
),
1963 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
1964 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1965 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1966 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1967 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1968 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1969 0xf2800240, 0xfe800f50,
1970 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1971 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1972 0xf2800640, 0xfe800f50,
1973 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1974 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1975 0xf2800a40, 0xfe800f50,
1976 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
1977 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1978 0xf2800e40, 0xff800f50,
1979 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1980 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1981 0xf2800f40, 0xff800f50,
1982 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
1983 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1984 0xf3800e40, 0xff800f50,
1985 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
1986 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA
),
1987 0xf3800f40, 0xff800f50,
1988 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
1991 /* Element and structure load/store. */
1992 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1993 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
1994 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1995 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
1996 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1997 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
1998 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
1999 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
2000 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2001 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
2002 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2003 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2004 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2005 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2006 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2007 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2008 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2009 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2010 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2011 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2012 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2013 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2014 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2015 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2016 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2017 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2018 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2019 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2020 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2021 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
2022 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2023 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
2024 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2025 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
2026 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2027 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
2028 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1
),
2029 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
2031 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
2034 /* mve opcode table. */
2036 /* print_insn_mve recognizes the following format control codes:
2040 %a print '+' or '-' or imm offset in vldr[bhwd] and
2042 %c print condition code
2043 %d print addr mode of MVE vldr[bhw] and vstr[bhw]
2044 %u print 'U' (unsigned) or 'S' for various mve instructions
2045 %i print MVE predicate(s) for vpt and vpst
2046 %j print a 5-bit immediate from hw2[14:12,7:6]
2047 %m print rounding mode for vcvt and vrint
2048 %n print vector comparison code for predicated instruction
2049 %s print size for various vcvt instructions
2050 %v print vector predicate for instruction in predicated
2052 %o print offset scaled for vldr[hwd] and vstr[hwd]
2053 %w print writeback mode for MVE v{st,ld}[24]
2054 %B print v{st,ld}[24] any one operands
2055 %E print vmov, vmvn, vorr, vbic encoded constant
2056 %N print generic index for vmov
2057 %T print bottom ('b') or top ('t') of source register
2058 %X print exchange field in vmla* instructions
2060 %<bitfield>r print as an ARM register
2061 %<bitfield>d print the bitfield in decimal
2062 %<bitfield>A print accumulate or not
2063 %<bitfield>Q print as a MVE Q register
2064 %<bitfield>F print as a MVE S register
2065 %<bitfield>Z as %<>r but r15 is ZR instead of PC and r13 is
2068 %<bitfield>S as %<>r but r15 or r13 is UNPREDICTABLE
2069 %<bitfield>s print size for vector predicate & non VMOV instructions
2070 %<bitfield>I print carry flag or not
2071 %<bitfield>i print immediate for vstr/vldr reg +/- imm
2072 %<bitfield>h print high half of 64-bit destination reg
2073 %<bitfield>k print immediate for vector conversion instruction
2074 %<bitfield>l print low half of 64-bit destination reg
2075 %<bitfield>o print rotate value for vcmul
2076 %<bitfield>u print immediate value for vddup/vdwdup
2077 %<bitfield>x print the bitfield in hex.
2080 static const struct mopcode32 mve_opcodes
[] =
2084 {ARM_FEATURE_COPROC (FPU_MVE
),
2086 0xfe310f4d, 0xffbf1fff,
2090 /* Floating point VPT T1. */
2091 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2093 0xee310f00, 0xefb10f50,
2094 "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
2095 /* Floating point VPT T2. */
2096 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2098 0xee310f40, 0xefb10f50,
2099 "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
2101 /* Vector VPT T1. */
2102 {ARM_FEATURE_COPROC (FPU_MVE
),
2104 0xfe010f00, 0xff811f51,
2105 "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2106 /* Vector VPT T2. */
2107 {ARM_FEATURE_COPROC (FPU_MVE
),
2109 0xfe010f01, 0xff811f51,
2110 "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2111 /* Vector VPT T3. */
2112 {ARM_FEATURE_COPROC (FPU_MVE
),
2114 0xfe011f00, 0xff811f50,
2115 "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2116 /* Vector VPT T4. */
2117 {ARM_FEATURE_COPROC (FPU_MVE
),
2119 0xfe010f40, 0xff811f70,
2120 "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
2121 /* Vector VPT T5. */
2122 {ARM_FEATURE_COPROC (FPU_MVE
),
2124 0xfe010f60, 0xff811f70,
2125 "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
2126 /* Vector VPT T6. */
2127 {ARM_FEATURE_COPROC (FPU_MVE
),
2129 0xfe011f40, 0xff811f50,
2130 "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
2132 /* Vector VBIC immediate. */
2133 {ARM_FEATURE_COPROC (FPU_MVE
),
2135 0xef800070, 0xefb81070,
2136 "vbic%v.i%8-11s\t%13-15,22Q, %E"},
2138 /* Vector VBIC register. */
2139 {ARM_FEATURE_COPROC (FPU_MVE
),
2141 0xef100150, 0xffb11f51,
2142 "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2145 {ARM_FEATURE_COPROC (FPU_MVE
),
2147 0xee800f01, 0xefc10f51,
2148 "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
2150 /* Vector VABD floating point. */
2151 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2153 0xff200d40, 0xffa11f51,
2154 "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2157 {ARM_FEATURE_COPROC (FPU_MVE
),
2159 0xef000740, 0xef811f51,
2160 "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2162 /* Vector VABS floating point. */
2163 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2165 0xFFB10740, 0xFFB31FD1,
2166 "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2168 {ARM_FEATURE_COPROC (FPU_MVE
),
2170 0xffb10340, 0xffb31fd1,
2171 "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2173 /* Vector VADD floating point T1. */
2174 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2176 0xef000d40, 0xffa11f51,
2177 "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2178 /* Vector VADD floating point T2. */
2179 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2181 0xee300f40, 0xefb11f70,
2182 "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2183 /* Vector VADD T1. */
2184 {ARM_FEATURE_COPROC (FPU_MVE
),
2186 0xef000840, 0xff811f51,
2187 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2188 /* Vector VADD T2. */
2189 {ARM_FEATURE_COPROC (FPU_MVE
),
2191 0xee010f40, 0xff811f70,
2192 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2194 /* Vector VADDLV. */
2195 {ARM_FEATURE_COPROC (FPU_MVE
),
2197 0xee890f00, 0xef8f1fd1,
2198 "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
2201 {ARM_FEATURE_COPROC (FPU_MVE
),
2203 0xeef10f00, 0xeff31fd1,
2204 "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
2207 {ARM_FEATURE_COPROC (FPU_MVE
),
2209 0xee300f00, 0xffb10f51,
2210 "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2213 {ARM_FEATURE_COPROC (FPU_MVE
),
2215 0xef000150, 0xffb11f51,
2216 "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2218 /* Vector VBRSR register. */
2219 {ARM_FEATURE_COPROC (FPU_MVE
),
2221 0xfe011e60, 0xff811f70,
2222 "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2224 /* Vector VCADD floating point. */
2225 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2227 0xfc800840, 0xfea11f51,
2228 "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"},
2231 {ARM_FEATURE_COPROC (FPU_MVE
),
2233 0xfe000f00, 0xff810f51,
2234 "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2237 {ARM_FEATURE_COPROC (FPU_MVE
),
2239 0xffb00440, 0xffb31fd1,
2240 "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2243 {ARM_FEATURE_COPROC (FPU_MVE
),
2245 0xffb004c0, 0xffb31fd1,
2246 "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2249 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2251 0xfc200840, 0xfe211f51,
2252 "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"},
2254 /* Vector VCMP floating point T1. */
2255 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2257 0xee310f00, 0xeff1ef50,
2258 "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
2260 /* Vector VCMP floating point T2. */
2261 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2263 0xee310f40, 0xeff1ef50,
2264 "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
2266 /* Vector VCMP T1. */
2267 {ARM_FEATURE_COPROC (FPU_MVE
),
2269 0xfe010f00, 0xffc1ff51,
2270 "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2271 /* Vector VCMP T2. */
2272 {ARM_FEATURE_COPROC (FPU_MVE
),
2274 0xfe010f01, 0xffc1ff51,
2275 "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2276 /* Vector VCMP T3. */
2277 {ARM_FEATURE_COPROC (FPU_MVE
),
2279 0xfe011f00, 0xffc1ff50,
2280 "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2281 /* Vector VCMP T4. */
2282 {ARM_FEATURE_COPROC (FPU_MVE
),
2284 0xfe010f40, 0xffc1ff70,
2285 "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
2286 /* Vector VCMP T5. */
2287 {ARM_FEATURE_COPROC (FPU_MVE
),
2289 0xfe010f60, 0xffc1ff70,
2290 "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
2291 /* Vector VCMP T6. */
2292 {ARM_FEATURE_COPROC (FPU_MVE
),
2294 0xfe011f40, 0xffc1ff50,
2295 "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
2298 {ARM_FEATURE_COPROC (FPU_MVE
),
2300 0xeea00b10, 0xffb10f5f,
2301 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2304 {ARM_FEATURE_COPROC (FPU_MVE
),
2306 0xff000150, 0xffd11f51,
2307 "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2309 /* Vector VFMA, vector * scalar. */
2310 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2312 0xee310e40, 0xefb11f70,
2313 "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2315 /* Vector VFMA floating point. */
2316 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2318 0xef000c50, 0xffa11f51,
2319 "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2321 /* Vector VFMS floating point. */
2322 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2324 0xef200c50, 0xffa11f51,
2325 "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2327 /* Vector VFMAS, vector * scalar. */
2328 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2329 MVE_VFMAS_FP_SCALAR
,
2330 0xee311e40, 0xefb11f70,
2331 "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2333 /* Vector VHADD T1. */
2334 {ARM_FEATURE_COPROC (FPU_MVE
),
2336 0xef000040, 0xef811f51,
2337 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2339 /* Vector VHADD T2. */
2340 {ARM_FEATURE_COPROC (FPU_MVE
),
2342 0xee000f40, 0xef811f70,
2343 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2345 /* Vector VHSUB T1. */
2346 {ARM_FEATURE_COPROC (FPU_MVE
),
2348 0xef000240, 0xef811f51,
2349 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2351 /* Vector VHSUB T2. */
2352 {ARM_FEATURE_COPROC (FPU_MVE
),
2354 0xee001f40, 0xef811f70,
2355 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2358 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2360 0xee300e00, 0xefb10f50,
2361 "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"},
2364 {ARM_FEATURE_COPROC (FPU_MVE
),
2366 0xf000e801, 0xffc0ffff,
2367 "vctp%v.%20-21s\t%16-19r"},
2370 {ARM_FEATURE_COPROC (FPU_MVE
),
2372 0xeea00b10, 0xffb10f5f,
2373 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2375 /* Vector VRHADD. */
2376 {ARM_FEATURE_COPROC (FPU_MVE
),
2378 0xef000140, 0xef811f51,
2379 "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2382 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2383 MVE_VCVT_FP_FIX_VEC
,
2384 0xef800c50, 0xef801cd1,
2385 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"},
2388 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2389 MVE_VCVT_BETWEEN_FP_INT
,
2390 0xffb30640, 0xffb31e51,
2391 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
2393 /* Vector VCVT between single and half-precision float, bottom half. */
2394 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2395 MVE_VCVT_FP_HALF_FP
,
2396 0xee3f0e01, 0xefbf1fd1,
2397 "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
2399 /* Vector VCVT between single and half-precision float, top half. */
2400 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2401 MVE_VCVT_FP_HALF_FP
,
2402 0xee3f1e01, 0xefbf1fd1,
2403 "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
2406 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2407 MVE_VCVT_FROM_FP_TO_INT
,
2408 0xffb30040, 0xffb31c51,
2409 "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
2412 {ARM_FEATURE_COPROC (FPU_MVE
),
2414 0xee011f6e, 0xff811f7e,
2415 "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2417 /* Vector VDWDUP. */
2418 {ARM_FEATURE_COPROC (FPU_MVE
),
2420 0xee011f60, 0xff811f70,
2421 "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2423 /* Vector VHCADD. */
2424 {ARM_FEATURE_COPROC (FPU_MVE
),
2426 0xee000f00, 0xff810f51,
2427 "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2429 /* Vector VIWDUP. */
2430 {ARM_FEATURE_COPROC (FPU_MVE
),
2432 0xee010f60, 0xff811f70,
2433 "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2436 {ARM_FEATURE_COPROC (FPU_MVE
),
2438 0xee010f6e, 0xff811f7e,
2439 "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2442 {ARM_FEATURE_COPROC (FPU_MVE
),
2444 0xfc901e00, 0xff901e5f,
2445 "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
2448 {ARM_FEATURE_COPROC (FPU_MVE
),
2450 0xfc901e01, 0xff901e1f,
2451 "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
2453 /* Vector VLDRB gather load. */
2454 {ARM_FEATURE_COPROC (FPU_MVE
),
2455 MVE_VLDRB_GATHER_T1
,
2456 0xec900e00, 0xefb01e50,
2457 "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
2459 /* Vector VLDRH gather load. */
2460 {ARM_FEATURE_COPROC (FPU_MVE
),
2461 MVE_VLDRH_GATHER_T2
,
2462 0xec900e10, 0xefb01e50,
2463 "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2465 /* Vector VLDRW gather load. */
2466 {ARM_FEATURE_COPROC (FPU_MVE
),
2467 MVE_VLDRW_GATHER_T3
,
2468 0xfc900f40, 0xffb01fd0,
2469 "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2471 /* Vector VLDRD gather load. */
2472 {ARM_FEATURE_COPROC (FPU_MVE
),
2473 MVE_VLDRD_GATHER_T4
,
2474 0xec900fd0, 0xefb01fd0,
2475 "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2477 /* Vector VLDRW gather load. */
2478 {ARM_FEATURE_COPROC (FPU_MVE
),
2479 MVE_VLDRW_GATHER_T5
,
2480 0xfd101e00, 0xff111f00,
2481 "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2483 /* Vector VLDRD gather load, variant T6. */
2484 {ARM_FEATURE_COPROC (FPU_MVE
),
2485 MVE_VLDRD_GATHER_T6
,
2486 0xfd101f00, 0xff111f00,
2487 "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2490 {ARM_FEATURE_COPROC (FPU_MVE
),
2492 0xec100e00, 0xee581e00,
2493 "vldrb%v.%u%7-8s\t%13-15Q, %d"},
2496 {ARM_FEATURE_COPROC (FPU_MVE
),
2498 0xec180e00, 0xee581e00,
2499 "vldrh%v.%u%7-8s\t%13-15Q, %d"},
2501 /* Vector VLDRB unsigned, variant T5. */
2502 {ARM_FEATURE_COPROC (FPU_MVE
),
2504 0xec101e00, 0xfe101f80,
2505 "vldrb%v.u8\t%13-15,22Q, %d"},
2507 /* Vector VLDRH unsigned, variant T6. */
2508 {ARM_FEATURE_COPROC (FPU_MVE
),
2510 0xec101e80, 0xfe101f80,
2511 "vldrh%v.u16\t%13-15,22Q, %d"},
2513 /* Vector VLDRW unsigned, variant T7. */
2514 {ARM_FEATURE_COPROC (FPU_MVE
),
2516 0xec101f00, 0xfe101f80,
2517 "vldrw%v.u32\t%13-15,22Q, %d"},
2520 {ARM_FEATURE_COPROC (FPU_MVE
),
2522 0xef000640, 0xef811f51,
2523 "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2526 {ARM_FEATURE_COPROC (FPU_MVE
),
2528 0xee330e81, 0xffb31fd1,
2529 "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2531 /* Vector VMAXNM floating point. */
2532 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2534 0xff000f50, 0xffa11f51,
2535 "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2537 /* Vector VMAXNMA floating point. */
2538 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2540 0xee3f0e81, 0xefbf1fd1,
2541 "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2543 /* Vector VMAXNMV floating point. */
2544 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2546 0xeeee0f00, 0xefff0fd1,
2547 "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2549 /* Vector VMAXNMAV floating point. */
2550 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2552 0xeeec0f00, 0xefff0fd1,
2553 "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2556 {ARM_FEATURE_COPROC (FPU_MVE
),
2558 0xeee20f00, 0xeff30fd1,
2559 "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2561 /* Vector VMAXAV. */
2562 {ARM_FEATURE_COPROC (FPU_MVE
),
2564 0xeee00f00, 0xfff30fd1,
2565 "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2568 {ARM_FEATURE_COPROC (FPU_MVE
),
2570 0xef000650, 0xef811f51,
2571 "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2574 {ARM_FEATURE_COPROC (FPU_MVE
),
2576 0xee331e81, 0xffb31fd1,
2577 "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2579 /* Vector VMINNM floating point. */
2580 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2582 0xff200f50, 0xffa11f51,
2583 "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2585 /* Vector VMINNMA floating point. */
2586 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2588 0xee3f1e81, 0xefbf1fd1,
2589 "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2591 /* Vector VMINNMV floating point. */
2592 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2594 0xeeee0f80, 0xefff0fd1,
2595 "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2597 /* Vector VMINNMAV floating point. */
2598 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2600 0xeeec0f80, 0xefff0fd1,
2601 "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2604 {ARM_FEATURE_COPROC (FPU_MVE
),
2606 0xeee20f80, 0xeff30fd1,
2607 "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2609 /* Vector VMINAV. */
2610 {ARM_FEATURE_COPROC (FPU_MVE
),
2612 0xeee00f80, 0xfff30fd1,
2613 "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2616 {ARM_FEATURE_COPROC (FPU_MVE
),
2618 0xee010e40, 0xef811f70,
2619 "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2621 /* Vector VMLALDAV. Note must appear before VMLADAV due to instruction
2623 {ARM_FEATURE_COPROC (FPU_MVE
),
2625 0xee801e00, 0xef801f51,
2626 "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2628 {ARM_FEATURE_COPROC (FPU_MVE
),
2630 0xee800e00, 0xef801f51,
2631 "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2633 /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0. */
2634 {ARM_FEATURE_COPROC (FPU_MVE
),
2636 0xeef00e00, 0xeff01f51,
2637 "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2639 /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0. */
2640 {ARM_FEATURE_COPROC (FPU_MVE
),
2642 0xeef00f00, 0xeff11f51,
2643 "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2645 /* Vector VMLADAV T1 variant. */
2646 {ARM_FEATURE_COPROC (FPU_MVE
),
2648 0xeef01e00, 0xeff01f51,
2649 "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2651 /* Vector VMLADAV T2 variant. */
2652 {ARM_FEATURE_COPROC (FPU_MVE
),
2654 0xeef01f00, 0xeff11f51,
2655 "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2658 {ARM_FEATURE_COPROC (FPU_MVE
),
2660 0xee011e40, 0xef811f70,
2661 "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2663 /* Vector VRMLSLDAVH. Note must appear before VMLSDAV due to instruction
2665 {ARM_FEATURE_COPROC (FPU_MVE
),
2667 0xfe800e01, 0xff810f51,
2668 "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2670 /* Vector VMLSLDAV. Note must appear before VMLSDAV due to instruction
2672 {ARM_FEATURE_COPROC (FPU_MVE
),
2674 0xee800e01, 0xff800f51,
2675 "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2677 /* Vector VMLSDAV T1 Variant. */
2678 {ARM_FEATURE_COPROC (FPU_MVE
),
2680 0xeef00e01, 0xfff00f51,
2681 "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2683 /* Vector VMLSDAV T2 Variant. */
2684 {ARM_FEATURE_COPROC (FPU_MVE
),
2686 0xfef00e01, 0xfff10f51,
2687 "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
2689 /* Vector VMOV between gpr and half precision register, op == 0. */
2690 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2692 0xee000910, 0xfff00f7f,
2693 "vmov.f16\t%7,16-19F, %12-15r"},
2695 /* Vector VMOV between gpr and half precision register, op == 1. */
2696 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2698 0xee100910, 0xfff00f7f,
2699 "vmov.f16\t%12-15r, %7,16-19F"},
2701 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2702 MVE_VMOV_GP_TO_VEC_LANE
,
2703 0xee000b10, 0xff900f1f,
2704 "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"},
2706 /* Vector VORR immediate to vector.
2707 NOTE: MVE_VORR_IMM must appear in the table
2708 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2709 {ARM_FEATURE_COPROC (FPU_MVE
),
2711 0xef800050, 0xefb810f0,
2712 "vorr%v.i%8-11s\t%13-15,22Q, %E"},
2714 /* Vector VQSHL T2 Variant.
2715 NOTE: MVE_VQSHL_T2 must appear in the table before
2716 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2717 {ARM_FEATURE_COPROC (FPU_MVE
),
2719 0xef800750, 0xef801fd1,
2720 "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2722 /* Vector VQSHLU T3 Variant
2723 NOTE: MVE_VQSHL_T2 must appear in the table before
2724 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2726 {ARM_FEATURE_COPROC (FPU_MVE
),
2728 0xff800650, 0xff801fd1,
2729 "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2732 NOTE: MVE_VRSHR must appear in the table before
2733 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2734 {ARM_FEATURE_COPROC (FPU_MVE
),
2736 0xef800250, 0xef801fd1,
2737 "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2740 NOTE: MVE_VSHL must appear in the table before
2741 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2742 {ARM_FEATURE_COPROC (FPU_MVE
),
2744 0xef800550, 0xff801fd1,
2745 "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2748 NOTE: MVE_VSHR must appear in the table before
2749 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2750 {ARM_FEATURE_COPROC (FPU_MVE
),
2752 0xef800050, 0xef801fd1,
2753 "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2756 NOTE: MVE_VSLI must appear in the table before
2757 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2758 {ARM_FEATURE_COPROC (FPU_MVE
),
2760 0xff800550, 0xff801fd1,
2761 "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2764 NOTE: MVE_VSRI must appear in the table before
2765 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2766 {ARM_FEATURE_COPROC (FPU_MVE
),
2768 0xff800450, 0xff801fd1,
2769 "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2771 /* Vector VMOV immediate to vector,
2772 cmode == 11x1 -> VMVN which is UNDEFINED
2773 for such a cmode. */
2774 {ARM_FEATURE_COPROC (FPU_MVE
),
2775 MVE_VMVN_IMM
, 0xef800d50, 0xefb81dd0, UNDEFINED_INSTRUCTION
},
2777 /* Vector VMOV immediate to vector. */
2778 {ARM_FEATURE_COPROC (FPU_MVE
),
2779 MVE_VMOV_IMM_TO_VEC
,
2780 0xef800050, 0xefb810d0,
2781 "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2783 /* Vector VMOV two 32-bit lanes to two gprs, idx = 0. */
2784 {ARM_FEATURE_COPROC (FPU_MVE
),
2785 MVE_VMOV2_VEC_LANE_TO_GP
,
2786 0xec000f00, 0xffb01ff0,
2787 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"},
2789 /* Vector VMOV two 32-bit lanes to two gprs, idx = 1. */
2790 {ARM_FEATURE_COPROC (FPU_MVE
),
2791 MVE_VMOV2_VEC_LANE_TO_GP
,
2792 0xec000f10, 0xffb01ff0,
2793 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"},
2795 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0. */
2796 {ARM_FEATURE_COPROC (FPU_MVE
),
2797 MVE_VMOV2_GP_TO_VEC_LANE
,
2798 0xec100f00, 0xffb01ff0,
2799 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2801 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1. */
2802 {ARM_FEATURE_COPROC (FPU_MVE
),
2803 MVE_VMOV2_GP_TO_VEC_LANE
,
2804 0xec100f10, 0xffb01ff0,
2805 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2807 /* Vector VMOV Vector lane to gpr. */
2808 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2809 MVE_VMOV_VEC_LANE_TO_GP
,
2810 0xee100b10, 0xff100f1f,
2811 "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
2813 /* Vector VSHLL T1 Variant. Note: VSHLL T1 must appear before MVE_VMOVL due
2814 to instruction opcode aliasing. */
2815 {ARM_FEATURE_COPROC (FPU_MVE
),
2817 0xeea00f40, 0xefa00fd1,
2818 "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2820 /* Vector VMOVL long. */
2821 {ARM_FEATURE_COPROC (FPU_MVE
),
2823 0xeea00f40, 0xefa70fd1,
2824 "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
2826 /* Vector VMOV and narrow. */
2827 {ARM_FEATURE_COPROC (FPU_MVE
),
2829 0xfe310e81, 0xffb30fd1,
2830 "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2832 /* Floating point move extract. */
2833 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2835 0xfeb00a40, 0xffbf0fd0,
2836 "vmovx.f16\t%22,12-15F, %5,0-3F"},
2838 /* Vector VMUL floating-point T1 variant. */
2839 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2841 0xff000d50, 0xffa11f51,
2842 "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2844 /* Vector VMUL floating-point T2 variant. */
2845 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2847 0xee310e60, 0xefb11f70,
2848 "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2850 /* Vector VMUL T1 variant. */
2851 {ARM_FEATURE_COPROC (FPU_MVE
),
2853 0xef000950, 0xff811f51,
2854 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2856 /* Vector VMUL T2 variant. */
2857 {ARM_FEATURE_COPROC (FPU_MVE
),
2859 0xee011e60, 0xff811f70,
2860 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2863 {ARM_FEATURE_COPROC (FPU_MVE
),
2865 0xee010e01, 0xef811f51,
2866 "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2868 /* Vector VRMULH. */
2869 {ARM_FEATURE_COPROC (FPU_MVE
),
2871 0xee011e01, 0xef811f51,
2872 "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2874 /* Vector VMULL integer. */
2875 {ARM_FEATURE_COPROC (FPU_MVE
),
2877 0xee010e00, 0xef810f51,
2878 "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2880 /* Vector VMULL polynomial. */
2881 {ARM_FEATURE_COPROC (FPU_MVE
),
2883 0xee310e00, 0xefb10f51,
2884 "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2886 /* Vector VMVN immediate to vector. */
2887 {ARM_FEATURE_COPROC (FPU_MVE
),
2889 0xef800070, 0xefb810f0,
2890 "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
2892 /* Vector VMVN register. */
2893 {ARM_FEATURE_COPROC (FPU_MVE
),
2895 0xffb005c0, 0xffbf1fd1,
2896 "vmvn%v\t%13-15,22Q, %1-3,5Q"},
2898 /* Vector VNEG floating point. */
2899 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
2901 0xffb107c0, 0xffb31fd1,
2902 "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2905 {ARM_FEATURE_COPROC (FPU_MVE
),
2907 0xffb103c0, 0xffb31fd1,
2908 "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2910 /* Vector VORN, vector bitwise or not. */
2911 {ARM_FEATURE_COPROC (FPU_MVE
),
2913 0xef300150, 0xffb11f51,
2914 "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2916 /* Vector VORR register. */
2917 {ARM_FEATURE_COPROC (FPU_MVE
),
2919 0xef200150, 0xffb11f51,
2920 "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2922 /* Vector VQDMULL T1 variant. */
2923 {ARM_FEATURE_COPROC (FPU_MVE
),
2925 0xee300f01, 0xefb10f51,
2926 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2929 {ARM_FEATURE_COPROC (FPU_MVE
),
2931 0xfe310f4d, 0xffffffff,
2935 {ARM_FEATURE_COPROC (FPU_MVE
),
2937 0xfe310f01, 0xffb11f51,
2938 "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2941 {ARM_FEATURE_COPROC (FPU_MVE
),
2943 0xffb00740, 0xffb31fd1,
2944 "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2946 /* Vector VQADD T1 variant. */
2947 {ARM_FEATURE_COPROC (FPU_MVE
),
2949 0xef000050, 0xef811f51,
2950 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2952 /* Vector VQADD T2 variant. */
2953 {ARM_FEATURE_COPROC (FPU_MVE
),
2955 0xee000f60, 0xef811f70,
2956 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2958 /* Vector VQDMULL T2 variant. */
2959 {ARM_FEATURE_COPROC (FPU_MVE
),
2961 0xee300f60, 0xefb10f70,
2962 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2964 /* Vector VQMOVN. */
2965 {ARM_FEATURE_COPROC (FPU_MVE
),
2967 0xee330e01, 0xefb30fd1,
2968 "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
2970 /* Vector VQMOVUN. */
2971 {ARM_FEATURE_COPROC (FPU_MVE
),
2973 0xee310e81, 0xffb30fd1,
2974 "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2976 /* Vector VQDMLADH. */
2977 {ARM_FEATURE_COPROC (FPU_MVE
),
2979 0xee000e00, 0xff810f51,
2980 "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2982 /* Vector VQRDMLADH. */
2983 {ARM_FEATURE_COPROC (FPU_MVE
),
2985 0xee000e01, 0xff810f51,
2986 "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2988 /* Vector VQDMLAH. */
2989 {ARM_FEATURE_COPROC (FPU_MVE
),
2991 0xee000e60, 0xef811f70,
2992 "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2994 /* Vector VQRDMLAH. */
2995 {ARM_FEATURE_COPROC (FPU_MVE
),
2997 0xee000e40, 0xef811f70,
2998 "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3000 /* Vector VQDMLASH. */
3001 {ARM_FEATURE_COPROC (FPU_MVE
),
3003 0xee001e60, 0xef811f70,
3004 "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3006 /* Vector VQRDMLASH. */
3007 {ARM_FEATURE_COPROC (FPU_MVE
),
3009 0xee001e40, 0xef811f70,
3010 "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3012 /* Vector VQDMLSDH. */
3013 {ARM_FEATURE_COPROC (FPU_MVE
),
3015 0xfe000e00, 0xff810f51,
3016 "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3018 /* Vector VQRDMLSDH. */
3019 {ARM_FEATURE_COPROC (FPU_MVE
),
3021 0xfe000e01, 0xff810f51,
3022 "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3024 /* Vector VQDMULH T1 variant. */
3025 {ARM_FEATURE_COPROC (FPU_MVE
),
3027 0xef000b40, 0xff811f51,
3028 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3030 /* Vector VQRDMULH T2 variant. */
3031 {ARM_FEATURE_COPROC (FPU_MVE
),
3033 0xff000b40, 0xff811f51,
3034 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3036 /* Vector VQDMULH T3 variant. */
3037 {ARM_FEATURE_COPROC (FPU_MVE
),
3039 0xee010e60, 0xff811f70,
3040 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3042 /* Vector VQRDMULH T4 variant. */
3043 {ARM_FEATURE_COPROC (FPU_MVE
),
3045 0xfe010e60, 0xff811f70,
3046 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3049 {ARM_FEATURE_COPROC (FPU_MVE
),
3051 0xffb007c0, 0xffb31fd1,
3052 "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3054 /* Vector VQRSHL T1 variant. */
3055 {ARM_FEATURE_COPROC (FPU_MVE
),
3057 0xef000550, 0xef811f51,
3058 "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3060 /* Vector VQRSHL T2 variant. */
3061 {ARM_FEATURE_COPROC (FPU_MVE
),
3063 0xee331ee0, 0xefb31ff0,
3064 "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3066 /* Vector VQRSHRN. */
3067 {ARM_FEATURE_COPROC (FPU_MVE
),
3069 0xee800f41, 0xefa00fd1,
3070 "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3072 /* Vector VQRSHRUN. */
3073 {ARM_FEATURE_COPROC (FPU_MVE
),
3075 0xfe800fc0, 0xffa00fd1,
3076 "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3078 /* Vector VQSHL T1 Variant. */
3079 {ARM_FEATURE_COPROC (FPU_MVE
),
3081 0xee311ee0, 0xefb31ff0,
3082 "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3084 /* Vector VQSHL T4 Variant. */
3085 {ARM_FEATURE_COPROC (FPU_MVE
),
3087 0xef000450, 0xef811f51,
3088 "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3090 /* Vector VQSHRN. */
3091 {ARM_FEATURE_COPROC (FPU_MVE
),
3093 0xee800f40, 0xefa00fd1,
3094 "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3096 /* Vector VQSHRUN. */
3097 {ARM_FEATURE_COPROC (FPU_MVE
),
3099 0xee800fc0, 0xffa00fd1,
3100 "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3102 /* Vector VQSUB T1 Variant. */
3103 {ARM_FEATURE_COPROC (FPU_MVE
),
3105 0xef000250, 0xef811f51,
3106 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3108 /* Vector VQSUB T2 Variant. */
3109 {ARM_FEATURE_COPROC (FPU_MVE
),
3111 0xee001f60, 0xef811f70,
3112 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3114 /* Vector VREV16. */
3115 {ARM_FEATURE_COPROC (FPU_MVE
),
3117 0xffb00140, 0xffb31fd1,
3118 "vrev16%v.8\t%13-15,22Q, %1-3,5Q"},
3120 /* Vector VREV32. */
3121 {ARM_FEATURE_COPROC (FPU_MVE
),
3123 0xffb000c0, 0xffb31fd1,
3124 "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3126 /* Vector VREV64. */
3127 {ARM_FEATURE_COPROC (FPU_MVE
),
3129 0xffb00040, 0xffb31fd1,
3130 "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3132 /* Vector VRINT floating point. */
3133 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3135 0xffb20440, 0xffb31c51,
3136 "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3138 /* Vector VRMLALDAVH. */
3139 {ARM_FEATURE_COPROC (FPU_MVE
),
3141 0xee800f00, 0xef811f51,
3142 "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3144 /* Vector VRMLALDAVH. */
3145 {ARM_FEATURE_COPROC (FPU_MVE
),
3147 0xee801f00, 0xef811f51,
3148 "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3150 /* Vector VRSHL T1 Variant. */
3151 {ARM_FEATURE_COPROC (FPU_MVE
),
3153 0xef000540, 0xef811f51,
3154 "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3156 /* Vector VRSHL T2 Variant. */
3157 {ARM_FEATURE_COPROC (FPU_MVE
),
3159 0xee331e60, 0xefb31ff0,
3160 "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3162 /* Vector VRSHRN. */
3163 {ARM_FEATURE_COPROC (FPU_MVE
),
3165 0xfe800fc1, 0xffa00fd1,
3166 "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3169 {ARM_FEATURE_COPROC (FPU_MVE
),
3171 0xfe300f00, 0xffb10f51,
3172 "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3174 /* Vector VSHL T2 Variant. */
3175 {ARM_FEATURE_COPROC (FPU_MVE
),
3177 0xee311e60, 0xefb31ff0,
3178 "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3180 /* Vector VSHL T3 Variant. */
3181 {ARM_FEATURE_COPROC (FPU_MVE
),
3183 0xef000440, 0xef811f51,
3184 "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3187 {ARM_FEATURE_COPROC (FPU_MVE
),
3189 0xeea00fc0, 0xffa01ff0,
3190 "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"},
3192 /* Vector VSHLL T2 Variant. */
3193 {ARM_FEATURE_COPROC (FPU_MVE
),
3195 0xee310e01, 0xefb30fd1,
3196 "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"},
3199 {ARM_FEATURE_COPROC (FPU_MVE
),
3201 0xee800fc1, 0xffa00fd1,
3202 "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3204 /* Vector VST2 no writeback. */
3205 {ARM_FEATURE_COPROC (FPU_MVE
),
3207 0xfc801e00, 0xffb01e5f,
3208 "vst2%5d.%7-8s\t%B, [%16-19r]"},
3210 /* Vector VST2 writeback. */
3211 {ARM_FEATURE_COPROC (FPU_MVE
),
3213 0xfca01e00, 0xffb01e5f,
3214 "vst2%5d.%7-8s\t%B, [%16-19r]!"},
3216 /* Vector VST4 no writeback. */
3217 {ARM_FEATURE_COPROC (FPU_MVE
),
3219 0xfc801e01, 0xffb01e1f,
3220 "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
3222 /* Vector VST4 writeback. */
3223 {ARM_FEATURE_COPROC (FPU_MVE
),
3225 0xfca01e01, 0xffb01e1f,
3226 "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
3228 /* Vector VSTRB scatter store, T1 variant. */
3229 {ARM_FEATURE_COPROC (FPU_MVE
),
3230 MVE_VSTRB_SCATTER_T1
,
3231 0xec800e00, 0xffb01e50,
3232 "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
3234 /* Vector VSTRH scatter store, T2 variant. */
3235 {ARM_FEATURE_COPROC (FPU_MVE
),
3236 MVE_VSTRH_SCATTER_T2
,
3237 0xec800e10, 0xffb01e50,
3238 "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3240 /* Vector VSTRW scatter store, T3 variant. */
3241 {ARM_FEATURE_COPROC (FPU_MVE
),
3242 MVE_VSTRW_SCATTER_T3
,
3243 0xec800e40, 0xffb01e50,
3244 "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3246 /* Vector VSTRD scatter store, T4 variant. */
3247 {ARM_FEATURE_COPROC (FPU_MVE
),
3248 MVE_VSTRD_SCATTER_T4
,
3249 0xec800fd0, 0xffb01fd0,
3250 "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3252 /* Vector VSTRW scatter store, T5 variant. */
3253 {ARM_FEATURE_COPROC (FPU_MVE
),
3254 MVE_VSTRW_SCATTER_T5
,
3255 0xfd001e00, 0xff111f00,
3256 "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3258 /* Vector VSTRD scatter store, T6 variant. */
3259 {ARM_FEATURE_COPROC (FPU_MVE
),
3260 MVE_VSTRD_SCATTER_T6
,
3261 0xfd001f00, 0xff111f00,
3262 "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3265 {ARM_FEATURE_COPROC (FPU_MVE
),
3267 0xec000e00, 0xfe581e00,
3268 "vstrb%v.%7-8s\t%13-15Q, %d"},
3271 {ARM_FEATURE_COPROC (FPU_MVE
),
3273 0xec080e00, 0xfe581e00,
3274 "vstrh%v.%7-8s\t%13-15Q, %d"},
3276 /* Vector VSTRB variant T5. */
3277 {ARM_FEATURE_COPROC (FPU_MVE
),
3279 0xec001e00, 0xfe101f80,
3280 "vstrb%v.8\t%13-15,22Q, %d"},
3282 /* Vector VSTRH variant T6. */
3283 {ARM_FEATURE_COPROC (FPU_MVE
),
3285 0xec001e80, 0xfe101f80,
3286 "vstrh%v.16\t%13-15,22Q, %d"},
3288 /* Vector VSTRW variant T7. */
3289 {ARM_FEATURE_COPROC (FPU_MVE
),
3291 0xec001f00, 0xfe101f80,
3292 "vstrw%v.32\t%13-15,22Q, %d"},
3294 /* Vector VSUB floating point T1 variant. */
3295 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3297 0xef200d40, 0xffa11f51,
3298 "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3300 /* Vector VSUB floating point T2 variant. */
3301 {ARM_FEATURE_COPROC (FPU_MVE_FP
),
3303 0xee301f40, 0xefb11f70,
3304 "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3306 /* Vector VSUB T1 variant. */
3307 {ARM_FEATURE_COPROC (FPU_MVE
),
3309 0xff000840, 0xff811f51,
3310 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3312 /* Vector VSUB T2 variant. */
3313 {ARM_FEATURE_COPROC (FPU_MVE
),
3315 0xee011f40, 0xff811f70,
3316 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3318 {ARM_FEATURE_COPROC (FPU_MVE
),
3320 0xea50012f, 0xfff1813f,
3321 "asrl%c\t%17-19l, %9-11h, %j"},
3323 {ARM_FEATURE_COPROC (FPU_MVE
),
3325 0xea50012d, 0xfff101ff,
3326 "asrl%c\t%17-19l, %9-11h, %12-15S"},
3328 {ARM_FEATURE_COPROC (FPU_MVE
),
3330 0xea50010f, 0xfff1813f,
3331 "lsll%c\t%17-19l, %9-11h, %j"},
3333 {ARM_FEATURE_COPROC (FPU_MVE
),
3335 0xea50010d, 0xfff101ff,
3336 "lsll%c\t%17-19l, %9-11h, %12-15S"},
3338 {ARM_FEATURE_COPROC (FPU_MVE
),
3340 0xea50011f, 0xfff1813f,
3341 "lsrl%c\t%17-19l, %9-11h, %j"},
3343 {ARM_FEATURE_COPROC (FPU_MVE
),
3345 0xea51012d, 0xfff101ff,
3346 "sqrshrl%c\t%17-19l, %9-11h, %12-15S"},
3348 {ARM_FEATURE_COPROC (FPU_MVE
),
3350 0xea500f2d, 0xfff00fff,
3351 "sqrshr%c\t%16-19S, %12-15S"},
3353 {ARM_FEATURE_COPROC (FPU_MVE
),
3355 0xea51013f, 0xfff1813f,
3356 "sqshll%c\t%17-19l, %9-11h, %j"},
3358 {ARM_FEATURE_COPROC (FPU_MVE
),
3360 0xea500f3f, 0xfff08f3f,
3361 "sqshl%c\t%16-19S, %j"},
3363 {ARM_FEATURE_COPROC (FPU_MVE
),
3365 0xea51012f, 0xfff1813f,
3366 "srshrl%c\t%17-19l, %9-11h, %j"},
3368 {ARM_FEATURE_COPROC (FPU_MVE
),
3370 0xea500f2f, 0xfff08f3f,
3371 "srshr%c\t%16-19S, %j"},
3373 {ARM_FEATURE_COPROC (FPU_MVE
),
3375 0xea51010d, 0xfff101ff,
3376 "uqrshll%c\t%17-19l, %9-11h, %12-15S"},
3378 {ARM_FEATURE_COPROC (FPU_MVE
),
3380 0xea500f0d, 0xfff00fff,
3381 "uqrshl%c\t%16-19S, %12-15S"},
3383 {ARM_FEATURE_COPROC (FPU_MVE
),
3385 0xea51010f, 0xfff1813f,
3386 "uqshll%c\t%17-19l, %9-11h, %j"},
3388 {ARM_FEATURE_COPROC (FPU_MVE
),
3390 0xea500f0f, 0xfff08f3f,
3391 "uqshl%c\t%16-19S, %j"},
3393 {ARM_FEATURE_COPROC (FPU_MVE
),
3395 0xea51011f, 0xfff1813f,
3396 "urshrl%c\t%17-19l, %9-11h, %j"},
3398 {ARM_FEATURE_COPROC (FPU_MVE
),
3400 0xea500f1f, 0xfff08f3f,
3401 "urshr%c\t%16-19S, %j"},
3403 {ARM_FEATURE_CORE_LOW (0),
3405 0x00000000, 0x00000000, 0}
3408 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
3409 ordered: they must be searched linearly from the top to obtain a correct
3412 /* print_insn_arm recognizes the following format control codes:
3416 %a print address for ldr/str instruction
3417 %s print address for ldr/str halfword/signextend instruction
3418 %S like %s but allow UNPREDICTABLE addressing
3419 %b print branch destination
3420 %c print condition code (always bits 28-31)
3421 %m print register mask for ldm/stm instruction
3422 %o print operand2 (immediate or register + shift)
3423 %p print 'p' iff bits 12-15 are 15
3424 %t print 't' iff bit 21 set and bit 24 clear
3425 %B print arm BLX(1) destination
3426 %C print the PSR sub type.
3427 %U print barrier type.
3428 %P print address for pli instruction.
3430 %<bitfield>r print as an ARM register
3431 %<bitfield>T print as an ARM register + 1
3432 %<bitfield>R as %r but r15 is UNPREDICTABLE
3433 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE
3434 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE
3435 %<bitfield>d print the bitfield in decimal
3436 %<bitfield>W print the bitfield plus one in decimal
3437 %<bitfield>x print the bitfield in hex
3438 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
3440 %<bitfield>'c print specified char iff bitfield is all ones
3441 %<bitfield>`c print specified char iff bitfield is all zeroes
3442 %<bitfield>?ab... select from array of values in big endian order
3444 %e print arm SMI operand (bits 0..7,8..19).
3445 %E print the LSB and WIDTH fields of a BFI or BFC instruction.
3446 %V print the 16-bit immediate field of a MOVT or MOVW instruction.
3447 %R print the SPSR/CPSR or banked register of an MRS. */
3449 static const struct opcode32 arm_opcodes
[] =
3451 /* ARM instructions. */
3452 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3453 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
3454 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3455 0xe7f000f0, 0xfff000f0, "udf\t#%e"},
3457 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
| ARM_EXT_V5
),
3458 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
3459 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3460 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
3461 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2
),
3462 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3463 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S
),
3464 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
3465 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3466 0x00800090, 0x0fa000f0,
3467 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3468 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M
),
3469 0x00a00090, 0x0fa000f0,
3470 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3472 /* V8.2 RAS extension instructions. */
3473 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
3474 0xe320f010, 0xffffffff, "esb"},
3476 /* V8 instructions. */
3477 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3478 0x0320f005, 0x0fffffff, "sevl"},
3479 /* Defined in V8 but is in NOP space so available to all arch. */
3480 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3481 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
3482 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS
),
3483 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
3484 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3485 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
3486 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3487 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
3488 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
3489 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
3490 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3491 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
3492 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3493 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
3494 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3495 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
3496 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3497 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
3498 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3499 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
3500 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3501 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
3502 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3503 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
3504 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3505 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
3506 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3507 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
3508 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS
),
3509 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
3510 /* CRC32 instructions. */
3511 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3512 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
3513 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3514 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
3515 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3516 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
3517 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3518 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
3519 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3520 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
3521 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
3522 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
3524 /* Privileged Access Never extension instructions. */
3525 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
),
3526 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
3528 /* Virtualization Extension instructions. */
3529 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x0160006e, 0x0fffffff, "eret%c"},
3530 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
3532 /* Integer Divide Extension instructions. */
3533 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3534 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
3535 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV
),
3536 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
3538 /* MP Extension instructions. */
3539 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf410f000, 0xfc70f000, "pldw\t%a"},
3541 /* Speculation Barriers. */
3542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xe320f014, 0xffffffff, "csdb"},
3543 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff040, 0xffffffff, "ssbb"},
3544 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
), 0xf57ff044, 0xffffffff, "pssbb"},
3546 /* V7 instructions. */
3547 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf450f000, 0xfd70f000, "pli\t%P"},
3548 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
3549 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
3550 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
3551 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
3552 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
3553 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf57ff060, 0xfffffff0, "isb\t%U"},
3554 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
3555 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
3557 /* ARM V6T2 instructions. */
3558 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3559 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
3560 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3561 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
3562 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3563 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3564 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3565 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
3567 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3568 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION
},
3569 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3570 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
3572 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3573 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
3574 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
3575 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
3576 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3577 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
3578 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
3579 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
3581 /* ARM Security extension instructions. */
3582 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
),
3583 0x01600070, 0x0ff000f0, "smc%c\t%e"},
3585 /* ARM V6K instructions. */
3586 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3587 0xf57ff01f, 0xffffffff, "clrex"},
3588 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3589 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
3590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3591 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
3592 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3593 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
3594 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3595 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
3596 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3597 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
3598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3599 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
3601 /* ARMv8.5-A instructions. */
3602 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf57ff070, 0xffffffff, "sb"},
3604 /* ARM V6K NOP hints. */
3605 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3606 0x0320f001, 0x0fffffff, "yield%c"},
3607 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3608 0x0320f002, 0x0fffffff, "wfe%c"},
3609 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3610 0x0320f003, 0x0fffffff, "wfi%c"},
3611 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3612 0x0320f004, 0x0fffffff, "sev%c"},
3613 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
),
3614 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
3616 /* ARM V6 instructions. */
3617 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3618 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
3619 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3620 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
3621 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3622 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
3623 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3624 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
3625 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3626 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
3627 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3628 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
3629 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3630 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
3631 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3632 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
3633 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3634 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
3635 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3636 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
3637 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3638 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
3639 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3640 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
3641 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3642 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
3643 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3644 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
3645 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3646 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
3647 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3648 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
3649 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3650 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
3651 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3652 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
3653 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3654 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
3655 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3656 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
3657 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3658 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
3659 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3660 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
3661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3662 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
3663 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3664 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
3665 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3666 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
3667 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3668 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
3669 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3670 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
3671 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3672 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
3673 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3674 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
3675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3676 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
3677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3678 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
3679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3680 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
3681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3682 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
3683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3684 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
3685 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3686 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
3687 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3688 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
3689 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3690 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
3691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3692 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
3693 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3694 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
3695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3696 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
3697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3698 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
3699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3700 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
3701 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3702 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
3703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3704 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
3705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3706 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
3707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3708 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
3709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3710 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
3711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3712 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
3713 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3714 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
3715 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3716 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
3717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3718 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
3719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3720 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
3721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3722 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
3723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3724 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
3725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3726 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
3727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3728 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
3729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3730 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
3731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3732 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
3733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3734 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
3735 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3736 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
3737 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3738 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
3739 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3740 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
3741 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3742 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
3743 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3744 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
3745 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3746 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
3747 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3748 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
3749 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3750 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
3751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3752 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
3753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3754 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
3755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3756 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
3757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3758 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
3759 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3760 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
3761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3762 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
3763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3764 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
3765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3766 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
3767 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3768 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3769 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3770 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3771 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3772 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3773 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3774 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
3775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3776 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3778 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3780 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3781 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3782 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
3783 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3784 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3785 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3786 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3788 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3790 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
3791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3792 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3793 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3794 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3795 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3796 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3798 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
3799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3800 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3802 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3804 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
3805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3806 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
3807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3808 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3810 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3811 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3812 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3813 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3814 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
3815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3816 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
3817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3818 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
3819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3820 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
3821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3822 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3823 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3824 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3825 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3826 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3828 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3830 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
3831 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3832 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3833 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3834 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3835 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3836 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
3837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3838 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
3839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3840 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
3841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3842 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
3843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3844 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
3845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3846 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
3847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3848 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
3849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3850 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
3851 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3852 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3854 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
3855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3856 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
3857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3858 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
3859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
),
3860 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
3862 /* V5J instruction. */
3863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J
),
3864 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
3866 /* V5 Instructions. */
3867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3868 0xe1200070, 0xfff000f0,
3869 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
3870 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3871 0xfa000000, 0xfe000000, "blx\t%B"},
3872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3873 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
3874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5
),
3875 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
3877 /* V5E "El Segundo" Instructions. */
3878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3879 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
3880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3881 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
3882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E
),
3883 0xf450f000, 0xfc70f000, "pld\t%a"},
3884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3885 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3887 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3889 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3891 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
3893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3894 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3895 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3896 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
3898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3899 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3901 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3903 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3904 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3905 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3908 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
3909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3910 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
3911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3912 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
3913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3914 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
3916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3917 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
3918 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3919 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
3921 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3922 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"},
3923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3924 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
3925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3926 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"},
3927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP
),
3928 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
3930 /* ARM Instructions. */
3931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3932 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
3934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3935 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
3936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3937 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
3938 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3939 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
3940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3941 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
3942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3943 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
3944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3945 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
3947 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3948 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
3949 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3950 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
3951 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3952 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
3953 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3954 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
3956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3957 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION
},
3958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3959 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
3960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3961 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION
},
3962 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3963 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
3965 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3966 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
3967 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3968 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
3969 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3970 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
3972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3973 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
3974 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3975 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
3976 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3977 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
3979 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3980 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
3981 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3982 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
3983 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3984 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
3986 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3987 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
3988 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3989 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
3990 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3991 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
3993 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3994 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
3995 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3996 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
3997 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
3998 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
4000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4001 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
4002 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4003 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
4004 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4005 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
4007 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4008 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4009 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4010 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4011 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4012 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
4014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4015 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4017 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4019 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
4021 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
),
4022 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
4023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
4024 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
4025 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3
),
4026 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
4028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4029 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
4030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4031 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
4032 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4033 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
4035 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4036 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
4037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4038 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
4039 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4040 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
4042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4043 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
4044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4045 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
4046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4047 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
4049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4050 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
4051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4052 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
4053 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4054 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
4056 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4057 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
4058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4059 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
4060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4061 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
4063 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4064 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
4065 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4066 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
4067 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4068 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
4069 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4070 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
4071 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4072 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
4073 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4074 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
4075 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4076 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
4078 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4079 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
4080 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4081 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
4082 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4083 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
4085 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4086 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
4087 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4088 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
4089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4090 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
4092 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4093 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION
},
4094 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4095 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
4097 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4098 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
4100 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4101 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
4102 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4103 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
4105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4106 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4108 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4109 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4110 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4111 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4112 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4113 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4114 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4115 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4116 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4117 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4118 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4119 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4120 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4121 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4122 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4123 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4124 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4125 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4126 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4127 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4128 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4129 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4130 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4131 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4132 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4133 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4134 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4135 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4136 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4137 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4138 0x092d0000, 0x0fff0000, "push%c\t%m"},
4139 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4140 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
4141 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4142 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4144 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4145 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4146 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4147 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4148 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4149 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4150 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4151 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4152 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4153 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4154 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4155 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4156 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4157 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4158 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4159 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4160 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4161 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4162 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4163 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4164 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4165 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4166 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4167 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4168 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4169 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4170 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4171 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4172 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4173 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4174 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4175 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4176 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4177 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
4178 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4179 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
4180 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4181 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4183 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4184 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
4185 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4186 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
4189 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
),
4190 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION
},
4191 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4192 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
4193 {ARM_FEATURE_CORE_LOW (0),
4194 0x00000000, 0x00000000, 0}
4197 /* print_insn_thumb16 recognizes the following format control codes:
4199 %S print Thumb register (bits 3..5 as high number if bit 6 set)
4200 %D print Thumb register (bits 0..2 as high number if bit 7 set)
4201 %<bitfield>I print bitfield as a signed decimal
4202 (top bit of range being the sign bit)
4203 %N print Thumb register mask (with LR)
4204 %O print Thumb register mask (with PC)
4205 %M print Thumb register mask
4206 %b print CZB's 6-bit unsigned branch destination
4207 %s print Thumb right-shift immediate (6..10; 0 == 32).
4208 %c print the condition code
4209 %C print the condition code, or "s" if not conditional
4210 %x print warning if conditional an not at end of IT block"
4211 %X print "\t; unpredictable <IT:code>" if conditional
4212 %I print IT instruction suffix and operands
4213 %W print Thumb Writeback indicator for LDMIA
4214 %<bitfield>r print bitfield as an ARM register
4215 %<bitfield>d print bitfield as a decimal
4216 %<bitfield>H print (bitfield * 2) as a decimal
4217 %<bitfield>W print (bitfield * 4) as a decimal
4218 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
4219 %<bitfield>B print Thumb branch destination (signed displacement)
4220 %<bitfield>c print bitfield as a condition code
4221 %<bitnum>'c print specified char iff bit is one
4222 %<bitnum>?ab print a if bit is one else print b. */
4224 static const struct opcode16 thumb_opcodes
[] =
4226 /* Thumb instructions. */
4228 /* ARMv8-M Security Extensions instructions. */
4229 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4784, 0xff87, "blxns\t%3-6r"},
4230 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0x4704, 0xff87, "bxns\t%3-6r"},
4232 /* ARM V8 instructions. */
4233 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xbf50, 0xffff, "sevl%c"},
4234 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xba80, 0xffc0, "hlt\t%0-5x"},
4235 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN
), 0xb610, 0xfff7, "setpan\t#%3-3d"},
4237 /* ARM V6K no-argument instructions. */
4238 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xffff, "nop%c"},
4239 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf10, 0xffff, "yield%c"},
4240 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf20, 0xffff, "wfe%c"},
4241 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf30, 0xffff, "wfi%c"},
4242 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf40, 0xffff, "sev%c"},
4243 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K
), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
4245 /* ARM V6T2 instructions. */
4246 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4247 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
4248 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4249 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
4250 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xbf00, 0xff00, "it%I%X"},
4253 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
4254 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
4255 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
4256 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
4257 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
4258 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
4259 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb650, 0xfff7, "setend\t%3?ble%X"},
4260 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
4261 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
4262 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
4263 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6
), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
4265 /* ARM V5 ISA extends Thumb. */
4266 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4267 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
4268 /* This is BLX(2). BLX(1) is a 32-bit instruction. */
4269 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T
),
4270 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
4271 /* ARM V4T ISA (Thumb v1). */
4272 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4273 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
4275 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
4276 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
4277 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
4278 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
4279 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
4280 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
4281 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
4282 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
4283 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
4284 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
4285 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
4286 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
4287 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
4288 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
4289 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
4290 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
4292 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
4293 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
4295 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4700, 0xFF80, "bx%c\t%S%x"},
4296 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4400, 0xFF00, "add%c\t%D, %S"},
4297 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
4298 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x4600, 0xFF00, "mov%c\t%D, %S"},
4300 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xB400, 0xFE00, "push%c\t%N"},
4301 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xBC00, 0xFE00, "pop%c\t%O"},
4303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4304 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
4305 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4306 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
4307 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4308 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
4309 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4310 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
4312 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4313 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
4314 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4315 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
4316 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4317 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
4319 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4320 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4321 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4322 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4324 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
4325 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4326 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
4327 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
4328 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
4330 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
4331 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
4332 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
4333 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
4335 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
4336 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4338 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
4340 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4341 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
4342 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4343 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
4344 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4345 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
4346 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4347 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
4349 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4350 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
4351 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4352 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
4354 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4355 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
4356 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4357 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
4359 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4360 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
4361 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4362 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
4364 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
4365 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
4367 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
4369 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
4370 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION
},
4371 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
4373 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
4375 /* The E800 .. FFFF range is unconditionally redirected to the
4376 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
4377 are processed via that table. Thus, we can never encounter a
4378 bare "second half of BL/BLX(1)" instruction here. */
4379 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
), 0x0000, 0x0000, UNDEFINED_INSTRUCTION
},
4380 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4383 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
4384 We adopt the convention that hw1 is the high 16 bits of .value and
4385 .mask, hw2 the low 16 bits.
4387 print_insn_thumb32 recognizes the following format control codes:
4391 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
4392 %M print a modified 12-bit immediate (same location)
4393 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
4394 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
4395 %H print a 16-bit immediate from hw2[3:0],hw1[11:0]
4396 %S print a possibly-shifted Rm
4398 %L print address for a ldrd/strd instruction
4399 %a print the address of a plain load/store
4400 %w print the width and signedness of a core load/store
4401 %m print register mask for ldm/stm
4402 %n print register mask for clrm
4404 %E print the lsb and width fields of a bfc/bfi instruction
4405 %F print the lsb and width fields of a sbfx/ubfx instruction
4406 %G print a fallback offset for Branch Future instructions
4407 %W print an offset for BF instruction
4408 %Y print an offset for BFL instruction
4409 %Z print an offset for BFCSEL instruction
4410 %Q print an offset for Low Overhead Loop instructions
4411 %P print an offset for Low Overhead Loop end instructions
4412 %b print a conditional branch offset
4413 %B print an unconditional branch offset
4414 %s print the shift field of an SSAT instruction
4415 %R print the rotation field of an SXT instruction
4416 %U print barrier type.
4417 %P print address for pli instruction.
4418 %c print the condition code
4419 %x print warning if conditional an not at end of IT block"
4420 %X print "\t; unpredictable <IT:code>" if conditional
4422 %<bitfield>d print bitfield in decimal
4423 %<bitfield>D print bitfield plus one in decimal
4424 %<bitfield>W print bitfield*4 in decimal
4425 %<bitfield>r print bitfield as an ARM register
4426 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
4427 %<bitfield>S as %<>r but r13 and r15 is UNPREDICTABLE
4428 %<bitfield>c print bitfield as a condition code
4430 %<bitfield>'c print specified char iff bitfield is all ones
4431 %<bitfield>`c print specified char iff bitfield is all zeroes
4432 %<bitfield>?ab... select from array of values in big endian order
4434 With one exception at the bottom (done because BL and BLX(1) need
4435 to come dead last), this table was machine-sorted first in
4436 decreasing order of number of bits set in the mask, then in
4437 increasing numeric order of mask, then in increasing numeric order
4438 of opcode. This order is not the clearest for a human reader, but
4439 is guaranteed never to catch a special-case bit pattern with a more
4440 general mask, which is important, because this instruction encoding
4441 makes heavy use of special-case bit patterns. */
4442 static const struct opcode32 thumb32_opcodes
[] =
4444 /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
4446 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4447 0xf00fe001, 0xffffffff, "lctp%c"},
4448 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4449 0xf02fc001, 0xfffff001, "le\t%P"},
4450 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4451 0xf00fc001, 0xfffff001, "le\tlr, %P"},
4452 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4453 0xf01fc001, 0xfffff001, "letp\tlr, %P"},
4454 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4455 0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"},
4456 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4457 0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"},
4458 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4459 0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"},
4460 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4461 0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"},
4463 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4464 0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
4465 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4466 0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
4467 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4468 0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
4469 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4470 0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
4471 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4472 0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"},
4474 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
),
4475 0xe89f0000, 0xffff2000, "clrm%c\t%n"},
4477 /* ARMv8-M and ARMv8-M Security Extensions instructions. */
4478 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
), 0xe97fe97f, 0xffffffff, "sg"},
4479 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4480 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
4481 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4482 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
4483 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4484 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
4485 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M
),
4486 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
4488 /* ARM V8.2 RAS extension instructions. */
4489 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS
),
4490 0xf3af8010, 0xffffffff, "esb"},
4492 /* V8 instructions. */
4493 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4494 0xf3af8005, 0xffffffff, "sevl%c.w"},
4495 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4496 0xf78f8000, 0xfffffffc, "dcps%0-1d"},
4497 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4498 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
4499 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4500 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
4501 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4502 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
4503 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4504 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
4505 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4506 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
4507 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4508 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
4509 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4510 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
4511 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4512 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
4513 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4514 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
4515 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4516 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
4517 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4518 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
4519 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4520 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
4521 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4522 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
4523 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
),
4524 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
4526 /* CRC32 instructions. */
4527 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4528 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
4529 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4530 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
4531 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4532 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
4533 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4534 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
4535 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4536 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
4537 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8
),
4538 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
4540 /* Speculation Barriers. */
4541 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8014, 0xffffffff, "csdb"},
4542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f40, 0xffffffff, "ssbb"},
4543 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3bf8f44, 0xffffffff, "pssbb"},
4545 /* V7 instructions. */
4546 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf910f000, 0xff70f000, "pli%c\t%a"},
4547 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
4548 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
4549 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8
), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
4550 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
4551 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
4552 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7
), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
4553 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4554 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
4555 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV
),
4556 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
4558 /* Virtualization Extension instructions. */
4559 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT
), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
4560 /* We skip ERET as that is SUBS pc, lr, #0. */
4562 /* MP Extension instructions. */
4563 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP
), 0xf830f000, 0xff70f000, "pldw%c\t%a"},
4565 /* Security extension instructions. */
4566 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC
), 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
4568 /* ARMv8.5-A instructions. */
4569 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB
), 0xf3bf8f70, 0xffffffff, "sb"},
4571 /* Instructions defined in the basic V6T2 set. */
4572 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8000, 0xffffffff, "nop%c.w"},
4573 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8001, 0xffffffff, "yield%c.w"},
4574 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8002, 0xffffffff, "wfe%c.w"},
4575 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8003, 0xffffffff, "wfi%c.w"},
4576 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf3af8004, 0xffffffff, "sev%c.w"},
4577 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4578 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
4579 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
4581 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4582 0xf3bf8f2f, 0xffffffff, "clrex%c"},
4583 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4584 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
4585 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4586 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
4587 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4588 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
4589 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4590 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
4591 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4592 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
4593 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4594 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
4595 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4596 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
4597 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4598 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
4599 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4600 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
4601 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4602 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
4603 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4604 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
4605 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4606 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
4607 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4608 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
4609 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4610 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
4611 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4612 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
4613 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4614 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
4615 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4616 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
4617 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4618 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
4619 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4620 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
4621 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4622 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
4623 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4624 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
4625 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4626 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
4627 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4628 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
4629 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4630 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
4631 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4632 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
4633 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4634 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
4635 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4636 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
4637 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4638 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
4639 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4640 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
4641 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4642 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
4643 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4644 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
4645 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4646 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
4647 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4648 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
4649 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4650 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
4651 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4652 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
4653 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4654 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
4655 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4656 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
4657 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4658 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
4659 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4660 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
4661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4662 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
4663 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4664 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
4665 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4666 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
4667 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4668 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
4669 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4670 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
4671 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4672 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
4673 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4674 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
4675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4676 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
4677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4678 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
4679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4680 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
4681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4682 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
4683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4684 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
4685 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4686 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
4687 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4688 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
4689 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4690 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
4691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4692 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
4693 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4694 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
4695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4696 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
4697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4698 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
4699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4700 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
4701 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4702 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
4703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4704 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
4705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4706 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
4707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4708 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
4709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4710 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
4711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4712 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
4713 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4714 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
4715 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4716 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
4717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4718 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
4719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4720 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
4721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4722 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
4723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4724 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
4725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4726 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
4727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4728 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
4729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4730 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4732 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4734 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4735 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4736 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
4737 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4738 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
4739 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4740 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
4741 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4742 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
4743 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4744 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
4745 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4746 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4747 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4748 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
4749 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4750 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
4751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4752 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4754 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4756 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4758 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4759 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4760 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4762 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4764 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4766 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
4767 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4768 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
4769 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4770 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
4771 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4772 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
4773 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4774 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
4775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4776 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
4777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4778 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
4779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4780 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
4781 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4782 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
4783 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4784 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
4785 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4786 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
4787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4788 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
4789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4790 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4792 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4793 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4794 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4795 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4796 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4798 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4800 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4802 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4804 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4805 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4806 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
4807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4808 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
4809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4810 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
4811 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4812 0xf810f000, 0xff70f000, "pld%c\t%a"},
4813 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4814 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4816 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4818 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4820 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4822 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
4823 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4824 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4825 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4826 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
4827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4828 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
4829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4830 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
4831 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4832 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
4833 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4834 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
4835 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4836 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
4837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4838 0xfb100000, 0xfff000c0,
4839 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
4840 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4841 0xfbc00080, 0xfff000c0,
4842 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
4843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4844 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
4845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4846 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
4847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4848 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
4849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4850 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
4851 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4852 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
4853 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4854 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
4855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4856 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
4857 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4858 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
4859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4860 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
4861 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4862 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
4863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4864 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
4865 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4866 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
4867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4868 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
4869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4870 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
4871 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4872 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
4873 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4874 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
4875 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4876 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
4877 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4878 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
4879 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M
),
4880 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
4881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4882 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
4883 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4884 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
4885 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4886 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
4887 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4888 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
4889 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4890 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
4891 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4892 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
4893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4894 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
4895 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4896 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
4897 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4898 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
4899 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4900 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
4901 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4902 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
4903 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4904 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
4905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4906 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
4907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4908 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
4909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4910 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
4911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4912 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
4913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4914 0xe9400000, 0xff500000,
4915 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4917 0xe9500000, 0xff500000,
4918 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
4919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4920 0xe8600000, 0xff700000,
4921 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4922 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4923 0xe8700000, 0xff700000,
4924 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
4925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4926 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
4927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4928 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
4930 /* Filter out Bcc with cond=E or F, which are used for other instructions. */
4931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4932 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
4933 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4934 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
4935 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4936 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
4937 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2
),
4938 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
4940 /* These have been 32-bit since the invention of Thumb. */
4941 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4942 0xf000c000, 0xf800d001, "blx%c\t%B%x"},
4943 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T
),
4944 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
4947 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1
),
4948 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
4949 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4952 static const char *const arm_conditional
[] =
4953 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
4954 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
4956 static const char *const arm_fp_const
[] =
4957 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
4959 static const char *const arm_shift
[] =
4960 {"lsl", "lsr", "asr", "ror"};
4965 const char *description
;
4966 const char *reg_names
[16];
4970 static const arm_regname regnames
[] =
4972 { "reg-names-raw", N_("Select raw register names"),
4973 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
4974 { "reg-names-gcc", N_("Select register names used by GCC"),
4975 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
4976 { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
4977 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
4978 { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL
} },
4979 { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL
} },
4980 { "reg-names-apcs", N_("Select register names used in the APCS"),
4981 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
4982 { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
4983 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
4984 { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
4985 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }}
4988 static const char *const iwmmxt_wwnames
[] =
4989 {"b", "h", "w", "d"};
4991 static const char *const iwmmxt_wwssnames
[] =
4992 {"b", "bus", "bc", "bss",
4993 "h", "hus", "hc", "hss",
4994 "w", "wus", "wc", "wss",
4995 "d", "dus", "dc", "dss"
4998 static const char *const iwmmxt_regnames
[] =
4999 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
5000 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
5003 static const char *const iwmmxt_cregnames
[] =
5004 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
5005 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
5008 static const char *const vec_condnames
[] =
5009 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
5012 static const char *const mve_predicatenames
[] =
5013 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
5014 "eee", "ee", "eet", "e", "ett", "et", "ete"
5017 /* Names for 2-bit size field for mve vector isntructions. */
5018 static const char *const mve_vec_sizename
[] =
5019 { "8", "16", "32", "64"};
5021 /* Indicates whether we are processing a then predicate,
5022 else predicate or none at all. */
5030 /* Information used to process a vpt block and subsequent instructions. */
5033 /* Are we in a vpt block. */
5034 bfd_boolean in_vpt_block
;
5036 /* Next predicate state if in vpt block. */
5037 enum vpt_pred_state next_pred_state
;
5039 /* Mask from vpt/vpst instruction. */
5040 long predicate_mask
;
5042 /* Instruction number in vpt block. */
5043 long current_insn_num
;
5045 /* Number of instructions in vpt block.. */
5049 static struct vpt_block vpt_block_state
=
5058 /* Default to GCC register name set. */
5059 static unsigned int regname_selected
= 1;
5061 #define NUM_ARM_OPTIONS ARRAY_SIZE (regnames)
5062 #define arm_regnames regnames[regname_selected].reg_names
5064 static bfd_boolean force_thumb
= FALSE
;
5066 /* Current IT instruction state. This contains the same state as the IT
5067 bits in the CPSR. */
5068 static unsigned int ifthen_state
;
5069 /* IT state for the next instruction. */
5070 static unsigned int ifthen_next_state
;
5071 /* The address of the insn for which the IT state is valid. */
5072 static bfd_vma ifthen_address
;
5073 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
5074 /* Indicates that the current Conditional state is unconditional or outside
5076 #define COND_UNCOND 16
5080 /* Extract the predicate mask for a VPT or VPST instruction.
5081 The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh). */
5084 mve_extract_pred_mask (long given
)
5086 return ((given
& 0x00400000) >> 19) | ((given
& 0xe000) >> 13);
5089 /* Return the number of instructions in a MVE predicate block. */
5091 num_instructions_vpt_block (long given
)
5093 long mask
= mve_extract_pred_mask (given
);
5100 if ((mask
& 7) == 4)
5103 if ((mask
& 3) == 2)
5106 if ((mask
& 1) == 1)
5113 mark_outside_vpt_block (void)
5115 vpt_block_state
.in_vpt_block
= FALSE
;
5116 vpt_block_state
.next_pred_state
= PRED_NONE
;
5117 vpt_block_state
.predicate_mask
= 0;
5118 vpt_block_state
.current_insn_num
= 0;
5119 vpt_block_state
.num_pred_insn
= 0;
5123 mark_inside_vpt_block (long given
)
5125 vpt_block_state
.in_vpt_block
= TRUE
;
5126 vpt_block_state
.next_pred_state
= PRED_THEN
;
5127 vpt_block_state
.predicate_mask
= mve_extract_pred_mask (given
);
5128 vpt_block_state
.current_insn_num
= 0;
5129 vpt_block_state
.num_pred_insn
= num_instructions_vpt_block (given
);
5130 assert (vpt_block_state
.num_pred_insn
>= 1);
5133 static enum vpt_pred_state
5134 invert_next_predicate_state (enum vpt_pred_state astate
)
5136 if (astate
== PRED_THEN
)
5138 else if (astate
== PRED_ELSE
)
5144 static enum vpt_pred_state
5145 update_next_predicate_state (void)
5147 long pred_mask
= vpt_block_state
.predicate_mask
;
5148 long mask_for_insn
= 0;
5150 switch (vpt_block_state
.current_insn_num
)
5168 if (pred_mask
& mask_for_insn
)
5169 return invert_next_predicate_state (vpt_block_state
.next_pred_state
);
5171 return vpt_block_state
.next_pred_state
;
5175 update_vpt_block_state (void)
5177 vpt_block_state
.current_insn_num
++;
5178 if (vpt_block_state
.current_insn_num
== vpt_block_state
.num_pred_insn
)
5180 /* No more instructions to process in vpt block. */
5181 mark_outside_vpt_block ();
5185 vpt_block_state
.next_pred_state
= update_next_predicate_state ();
5188 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
5189 Returns pointer to following character of the format string and
5190 fills in *VALUEP and *WIDTHP with the extracted value and number of
5191 bits extracted. WIDTHP can be NULL. */
5194 arm_decode_bitfield (const char *ptr
,
5196 unsigned long *valuep
,
5199 unsigned long value
= 0;
5207 for (start
= 0; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
5208 start
= start
* 10 + *ptr
- '0';
5210 for (end
= 0, ptr
++; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
5211 end
= end
* 10 + *ptr
- '0';
5217 value
|= ((insn
>> start
) & ((2ul << bits
) - 1)) << width
;
5220 while (*ptr
++ == ',');
5228 arm_decode_shift (long given
, fprintf_ftype func
, void *stream
,
5229 bfd_boolean print_shift
)
5231 func (stream
, "%s", arm_regnames
[given
& 0xf]);
5233 if ((given
& 0xff0) != 0)
5235 if ((given
& 0x10) == 0)
5237 int amount
= (given
& 0xf80) >> 7;
5238 int shift
= (given
& 0x60) >> 5;
5244 func (stream
, ", rrx");
5252 func (stream
, ", %s #%d", arm_shift
[shift
], amount
);
5254 func (stream
, ", #%d", amount
);
5256 else if ((given
& 0x80) == 0x80)
5257 func (stream
, "\t; <illegal shifter operand>");
5258 else if (print_shift
)
5259 func (stream
, ", %s %s", arm_shift
[(given
& 0x60) >> 5],
5260 arm_regnames
[(given
& 0xf00) >> 8]);
5262 func (stream
, ", %s", arm_regnames
[(given
& 0xf00) >> 8]);
5266 /* Return TRUE if the MATCHED_INSN can be inside an IT block. */
5269 is_mve_okay_in_it (enum mve_instructions matched_insn
)
5271 switch (matched_insn
)
5273 case MVE_VMOV_GP_TO_VEC_LANE
:
5274 case MVE_VMOV2_VEC_LANE_TO_GP
:
5275 case MVE_VMOV2_GP_TO_VEC_LANE
:
5276 case MVE_VMOV_VEC_LANE_TO_GP
:
5301 is_mve_architecture (struct disassemble_info
*info
)
5303 struct arm_private_data
*private_data
= info
->private_data
;
5304 arm_feature_set allowed_arches
= private_data
->features
;
5306 arm_feature_set arm_ext_v8_1m_main
5307 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
5309 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
5310 && !ARM_CPU_IS_ANY (allowed_arches
))
5317 is_vpt_instruction (long given
)
5320 /* If mkh:mkl is '0000' then its not a vpt/vpst instruction. */
5321 if ((given
& 0x0040e000) == 0)
5324 /* VPT floating point T1 variant. */
5325 if (((given
& 0xefb10f50) == 0xee310f00 && ((given
& 0x1001) != 0x1))
5326 /* VPT floating point T2 variant. */
5327 || ((given
& 0xefb10f50) == 0xee310f40)
5328 /* VPT vector T1 variant. */
5329 || ((given
& 0xff811f51) == 0xfe010f00)
5330 /* VPT vector T2 variant. */
5331 || ((given
& 0xff811f51) == 0xfe010f01
5332 && ((given
& 0x300000) != 0x300000))
5333 /* VPT vector T3 variant. */
5334 || ((given
& 0xff811f50) == 0xfe011f00)
5335 /* VPT vector T4 variant. */
5336 || ((given
& 0xff811f70) == 0xfe010f40)
5337 /* VPT vector T5 variant. */
5338 || ((given
& 0xff811f70) == 0xfe010f60)
5339 /* VPT vector T6 variant. */
5340 || ((given
& 0xff811f50) == 0xfe011f40)
5341 /* VPST vector T variant. */
5342 || ((given
& 0xffbf1fff) == 0xfe310f4d))
5348 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
5349 and ending bitfield = END. END must be greater than START. */
5351 static unsigned long
5352 arm_decode_field (unsigned long given
, unsigned int start
, unsigned int end
)
5354 int bits
= end
- start
;
5359 return ((given
>> start
) & ((2ul << bits
) - 1));
5362 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
5363 START:END and START2:END2. END/END2 must be greater than
5366 static unsigned long
5367 arm_decode_field_multiple (unsigned long given
, unsigned int start
,
5368 unsigned int end
, unsigned int start2
,
5371 int bits
= end
- start
;
5372 int bits2
= end2
- start2
;
5373 unsigned long value
= 0;
5379 value
= arm_decode_field (given
, start
, end
);
5382 value
|= ((given
>> start2
) & ((2ul << bits2
) - 1)) << width
;
5386 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
5387 This helps us decode instructions that change mnemonic depending on specific
5388 operand values/encodings. */
5391 is_mve_encoding_conflict (unsigned long given
,
5392 enum mve_instructions matched_insn
)
5394 switch (matched_insn
)
5397 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5403 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5405 if ((arm_decode_field (given
, 12, 12) == 0)
5406 && (arm_decode_field (given
, 0, 0) == 1))
5411 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5413 if (arm_decode_field (given
, 0, 3) == 0xd)
5417 case MVE_VPT_VEC_T1
:
5418 case MVE_VPT_VEC_T2
:
5419 case MVE_VPT_VEC_T3
:
5420 case MVE_VPT_VEC_T4
:
5421 case MVE_VPT_VEC_T5
:
5422 case MVE_VPT_VEC_T6
:
5423 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) == 0)
5425 if (arm_decode_field (given
, 20, 21) == 3)
5429 case MVE_VCMP_FP_T1
:
5430 if ((arm_decode_field (given
, 12, 12) == 0)
5431 && (arm_decode_field (given
, 0, 0) == 1))
5436 case MVE_VCMP_FP_T2
:
5437 if (arm_decode_field (given
, 0, 3) == 0xd)
5444 case MVE_VMUL_VEC_T2
:
5451 case MVE_VADD_VEC_T2
:
5452 case MVE_VSUB_VEC_T2
:
5469 case MVE_VQDMULH_T3
:
5470 case MVE_VQRDMULH_T4
:
5476 case MVE_VCMP_VEC_T1
:
5477 case MVE_VCMP_VEC_T2
:
5478 case MVE_VCMP_VEC_T3
:
5479 case MVE_VCMP_VEC_T4
:
5480 case MVE_VCMP_VEC_T5
:
5481 case MVE_VCMP_VEC_T6
:
5482 if (arm_decode_field (given
, 20, 21) == 3)
5491 if (arm_decode_field (given
, 7, 8) == 3)
5498 if ((arm_decode_field (given
, 24, 24) == 0)
5499 && (arm_decode_field (given
, 21, 21) == 0))
5503 else if ((arm_decode_field (given
, 7, 8) == 3))
5511 if ((arm_decode_field (given
, 24, 24) == 0)
5512 && (arm_decode_field (given
, 21, 21) == 0))
5519 case MVE_VCVT_FP_FIX_VEC
:
5520 return (arm_decode_field (given
, 16, 21) & 0x38) == 0;
5525 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5527 if ((cmode
& 1) == 0)
5529 else if ((cmode
& 0xc) == 0xc)
5537 unsigned long cmode
= arm_decode_field (given
, 8, 11);
5539 if ((cmode
& 9) == 1)
5541 else if ((cmode
& 5) == 1)
5543 else if ((cmode
& 0xe) == 0xe)
5549 case MVE_VMOV_IMM_TO_VEC
:
5550 if ((arm_decode_field (given
, 5, 5) == 1)
5551 && (arm_decode_field (given
, 8, 11) != 0xe))
5558 unsigned long size
= arm_decode_field (given
, 19, 20);
5559 if ((size
== 0) || (size
== 3))
5580 if (arm_decode_field (given
, 18, 19) == 3)
5586 case MVE_VRMLSLDAVH
:
5589 if (arm_decode_field (given
, 20, 22) == 7)
5594 case MVE_VRMLALDAVH
:
5595 if ((arm_decode_field (given
, 20, 22) & 6) == 6)
5602 if ((arm_decode_field (given
, 20, 21) == 3)
5603 || (arm_decode_field (given
, 1, 3) == 7))
5610 if (arm_decode_field (given
, 16, 18) == 0)
5612 unsigned long sz
= arm_decode_field (given
, 19, 20);
5614 if ((sz
== 1) || (sz
== 2))
5629 if (arm_decode_field (given
, 19, 21) == 0)
5635 if (arm_decode_field (given
, 16, 19) == 0xf)
5651 if (arm_decode_field (given
, 9, 11) == 0x7)
5657 case MVE_VADD_FP_T1
:
5658 case MVE_VADD_FP_T2
:
5659 case MVE_VADD_VEC_T1
:
5666 print_mve_vld_str_addr (struct disassemble_info
*info
,
5667 unsigned long given
,
5668 enum mve_instructions matched_insn
)
5670 void *stream
= info
->stream
;
5671 fprintf_ftype func
= info
->fprintf_func
;
5673 unsigned long p
, w
, gpr
, imm
, add
, mod_imm
;
5675 imm
= arm_decode_field (given
, 0, 6);
5678 switch (matched_insn
)
5682 gpr
= arm_decode_field (given
, 16, 18);
5687 gpr
= arm_decode_field (given
, 16, 18);
5693 gpr
= arm_decode_field (given
, 16, 19);
5699 gpr
= arm_decode_field (given
, 16, 19);
5705 gpr
= arm_decode_field (given
, 16, 19);
5712 p
= arm_decode_field (given
, 24, 24);
5713 w
= arm_decode_field (given
, 21, 21);
5715 add
= arm_decode_field (given
, 23, 23);
5719 /* Don't print anything for '+' as it is implied. */
5729 func (stream
, "[%s, #%s%lu]", arm_regnames
[gpr
], add_sub
, mod_imm
);
5730 /* Pre-indexed mode. */
5732 func (stream
, "[%s, #%s%lu]!", arm_regnames
[gpr
], add_sub
, mod_imm
);
5734 else if ((p
== 0) && (w
== 1))
5735 /* Post-index mode. */
5736 func (stream
, "[%s], #%s%lu", arm_regnames
[gpr
], add_sub
, mod_imm
);
5739 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
5740 Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
5741 this encoding is undefined. */
5744 is_mve_undefined (unsigned long given
, enum mve_instructions matched_insn
,
5745 enum mve_undefined
*undefined_code
)
5747 *undefined_code
= UNDEF_NONE
;
5749 switch (matched_insn
)
5752 if (arm_decode_field_multiple (given
, 5, 5, 22, 22) == 3)
5754 *undefined_code
= UNDEF_SIZE_3
;
5762 case MVE_VMUL_VEC_T1
:
5764 case MVE_VADD_VEC_T1
:
5765 case MVE_VSUB_VEC_T1
:
5766 case MVE_VQDMULH_T1
:
5767 case MVE_VQRDMULH_T2
:
5771 if (arm_decode_field (given
, 20, 21) == 3)
5773 *undefined_code
= UNDEF_SIZE_3
;
5780 if (arm_decode_field (given
, 7, 8) == 3)
5782 *undefined_code
= UNDEF_SIZE_3
;
5789 if (arm_decode_field (given
, 7, 8) <= 1)
5791 *undefined_code
= UNDEF_SIZE_LE_1
;
5798 if ((arm_decode_field (given
, 7, 8) == 0))
5800 *undefined_code
= UNDEF_SIZE_0
;
5807 if ((arm_decode_field (given
, 7, 8) <= 1))
5809 *undefined_code
= UNDEF_SIZE_LE_1
;
5815 case MVE_VLDRB_GATHER_T1
:
5816 if (arm_decode_field (given
, 7, 8) == 3)
5818 *undefined_code
= UNDEF_SIZE_3
;
5821 else if ((arm_decode_field (given
, 28, 28) == 0)
5822 && (arm_decode_field (given
, 7, 8) == 0))
5824 *undefined_code
= UNDEF_NOT_UNS_SIZE_0
;
5830 case MVE_VLDRH_GATHER_T2
:
5831 if (arm_decode_field (given
, 7, 8) == 3)
5833 *undefined_code
= UNDEF_SIZE_3
;
5836 else if ((arm_decode_field (given
, 28, 28) == 0)
5837 && (arm_decode_field (given
, 7, 8) == 1))
5839 *undefined_code
= UNDEF_NOT_UNS_SIZE_1
;
5842 else if (arm_decode_field (given
, 7, 8) == 0)
5844 *undefined_code
= UNDEF_SIZE_0
;
5850 case MVE_VLDRW_GATHER_T3
:
5851 if (arm_decode_field (given
, 7, 8) != 2)
5853 *undefined_code
= UNDEF_SIZE_NOT_2
;
5856 else if (arm_decode_field (given
, 28, 28) == 0)
5858 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5864 case MVE_VLDRD_GATHER_T4
:
5865 if (arm_decode_field (given
, 7, 8) != 3)
5867 *undefined_code
= UNDEF_SIZE_NOT_3
;
5870 else if (arm_decode_field (given
, 28, 28) == 0)
5872 *undefined_code
= UNDEF_NOT_UNSIGNED
;
5878 case MVE_VSTRB_SCATTER_T1
:
5879 if (arm_decode_field (given
, 7, 8) == 3)
5881 *undefined_code
= UNDEF_SIZE_3
;
5887 case MVE_VSTRH_SCATTER_T2
:
5889 unsigned long size
= arm_decode_field (given
, 7, 8);
5892 *undefined_code
= UNDEF_SIZE_3
;
5897 *undefined_code
= UNDEF_SIZE_0
;
5904 case MVE_VSTRW_SCATTER_T3
:
5905 if (arm_decode_field (given
, 7, 8) != 2)
5907 *undefined_code
= UNDEF_SIZE_NOT_2
;
5913 case MVE_VSTRD_SCATTER_T4
:
5914 if (arm_decode_field (given
, 7, 8) != 3)
5916 *undefined_code
= UNDEF_SIZE_NOT_3
;
5922 case MVE_VCVT_FP_FIX_VEC
:
5924 unsigned long imm6
= arm_decode_field (given
, 16, 21);
5925 if ((imm6
& 0x20) == 0)
5927 *undefined_code
= UNDEF_VCVT_IMM6
;
5931 if ((arm_decode_field (given
, 9, 9) == 0)
5932 && ((imm6
& 0x30) == 0x20))
5934 *undefined_code
= UNDEF_VCVT_FSI_IMM6
;
5943 case MVE_VCVT_BETWEEN_FP_INT
:
5944 case MVE_VCVT_FROM_FP_TO_INT
:
5946 unsigned long size
= arm_decode_field (given
, 18, 19);
5949 *undefined_code
= UNDEF_SIZE_0
;
5954 *undefined_code
= UNDEF_SIZE_3
;
5961 case MVE_VMOV_VEC_LANE_TO_GP
:
5963 unsigned long op1
= arm_decode_field (given
, 21, 22);
5964 unsigned long op2
= arm_decode_field (given
, 5, 6);
5965 unsigned long u
= arm_decode_field (given
, 23, 23);
5967 if ((op2
== 0) && (u
== 1))
5969 if ((op1
== 0) || (op1
== 1))
5971 *undefined_code
= UNDEF_BAD_U_OP1_OP2
;
5979 if ((op1
== 0) || (op1
== 1))
5981 *undefined_code
= UNDEF_BAD_OP1_OP2
;
5991 case MVE_VMOV_GP_TO_VEC_LANE
:
5992 if (arm_decode_field (given
, 5, 6) == 2)
5994 unsigned long op1
= arm_decode_field (given
, 21, 22);
5995 if ((op1
== 0) || (op1
== 1))
5997 *undefined_code
= UNDEF_BAD_OP1_OP2
;
6006 case MVE_VMOV_IMM_TO_VEC
:
6007 if (arm_decode_field (given
, 5, 5) == 0)
6009 unsigned long cmode
= arm_decode_field (given
, 8, 11);
6011 if (((cmode
& 9) == 1) || ((cmode
& 5) == 1))
6013 *undefined_code
= UNDEF_OP_0_BAD_CMODE
;
6024 if (arm_decode_field (given
, 18, 19) == 2)
6026 *undefined_code
= UNDEF_SIZE_2
;
6032 case MVE_VRMLALDAVH
:
6033 case MVE_VMLADAV_T1
:
6034 case MVE_VMLADAV_T2
:
6036 if ((arm_decode_field (given
, 28, 28) == 1)
6037 && (arm_decode_field (given
, 12, 12) == 1))
6039 *undefined_code
= UNDEF_XCHG_UNS
;
6050 unsigned long sz
= arm_decode_field (given
, 19, 20);
6053 else if ((sz
& 2) == 2)
6057 *undefined_code
= UNDEF_SIZE
;
6071 unsigned long sz
= arm_decode_field (given
, 19, 21);
6074 else if ((sz
& 6) == 2)
6076 else if ((sz
& 4) == 4)
6080 *undefined_code
= UNDEF_SIZE
;
6087 if (arm_decode_field (given
, 19, 20) == 0)
6089 *undefined_code
= UNDEF_SIZE_0
;
6096 if (arm_decode_field (given
, 18, 19) == 3)
6098 *undefined_code
= UNDEF_SIZE_3
;
6109 if (arm_decode_field (given
, 18, 19) == 3)
6111 *undefined_code
= UNDEF_SIZE_3
;
6118 if (arm_decode_field (given
, 18, 19) == 0)
6122 *undefined_code
= UNDEF_SIZE_NOT_0
;
6128 unsigned long size
= arm_decode_field (given
, 18, 19);
6129 if ((size
& 2) == 2)
6131 *undefined_code
= UNDEF_SIZE_2
;
6139 if (arm_decode_field (given
, 18, 19) != 3)
6143 *undefined_code
= UNDEF_SIZE_3
;
6152 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
6153 Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
6154 why this encoding is unpredictable. */
6157 is_mve_unpredictable (unsigned long given
, enum mve_instructions matched_insn
,
6158 enum mve_unpredictable
*unpredictable_code
)
6160 *unpredictable_code
= UNPRED_NONE
;
6162 switch (matched_insn
)
6164 case MVE_VCMP_FP_T2
:
6166 if ((arm_decode_field (given
, 12, 12) == 0)
6167 && (arm_decode_field (given
, 5, 5) == 1))
6169 *unpredictable_code
= UNPRED_FCA_0_FCB_1
;
6175 case MVE_VPT_VEC_T4
:
6176 case MVE_VPT_VEC_T5
:
6177 case MVE_VPT_VEC_T6
:
6178 case MVE_VCMP_VEC_T4
:
6179 case MVE_VCMP_VEC_T5
:
6180 case MVE_VCMP_VEC_T6
:
6181 if (arm_decode_field (given
, 0, 3) == 0xd)
6183 *unpredictable_code
= UNPRED_R13
;
6191 unsigned long gpr
= arm_decode_field (given
, 12, 15);
6194 *unpredictable_code
= UNPRED_R13
;
6197 else if (gpr
== 0xf)
6199 *unpredictable_code
= UNPRED_R15
;
6208 case MVE_VMUL_FP_T2
:
6209 case MVE_VMUL_VEC_T2
:
6212 case MVE_VADD_FP_T2
:
6213 case MVE_VSUB_FP_T2
:
6214 case MVE_VADD_VEC_T2
:
6215 case MVE_VSUB_VEC_T2
:
6225 case MVE_VQDMULH_T3
:
6226 case MVE_VQRDMULH_T4
:
6228 case MVE_VFMA_FP_SCALAR
:
6229 case MVE_VFMAS_FP_SCALAR
:
6233 unsigned long gpr
= arm_decode_field (given
, 0, 3);
6236 *unpredictable_code
= UNPRED_R13
;
6239 else if (gpr
== 0xf)
6241 *unpredictable_code
= UNPRED_R15
;
6251 unsigned long rn
= arm_decode_field (given
, 16, 19);
6253 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6255 *unpredictable_code
= UNPRED_R13_AND_WB
;
6261 *unpredictable_code
= UNPRED_R15
;
6265 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 6)
6267 *unpredictable_code
= UNPRED_Q_GT_6
;
6277 unsigned long rn
= arm_decode_field (given
, 16, 19);
6279 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6281 *unpredictable_code
= UNPRED_R13_AND_WB
;
6287 *unpredictable_code
= UNPRED_R15
;
6291 if (arm_decode_field_multiple (given
, 13, 15, 22, 22) > 4)
6293 *unpredictable_code
= UNPRED_Q_GT_4
;
6307 unsigned long rn
= arm_decode_field (given
, 16, 19);
6309 if ((rn
== 0xd) && (arm_decode_field (given
, 21, 21) == 1))
6311 *unpredictable_code
= UNPRED_R13_AND_WB
;
6316 *unpredictable_code
= UNPRED_R15
;
6323 case MVE_VLDRB_GATHER_T1
:
6324 if (arm_decode_field (given
, 0, 0) == 1)
6326 *unpredictable_code
= UNPRED_OS
;
6331 /* To handle common code with T2-T4 variants. */
6332 case MVE_VLDRH_GATHER_T2
:
6333 case MVE_VLDRW_GATHER_T3
:
6334 case MVE_VLDRD_GATHER_T4
:
6336 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6337 unsigned long qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6341 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6345 if (arm_decode_field (given
, 16, 19) == 0xf)
6347 *unpredictable_code
= UNPRED_R15
;
6354 case MVE_VLDRW_GATHER_T5
:
6355 case MVE_VLDRD_GATHER_T6
:
6357 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6358 unsigned long qm
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6362 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6369 case MVE_VSTRB_SCATTER_T1
:
6370 if (arm_decode_field (given
, 16, 19) == 0xf)
6372 *unpredictable_code
= UNPRED_R15
;
6375 else if (arm_decode_field (given
, 0, 0) == 1)
6377 *unpredictable_code
= UNPRED_OS
;
6383 case MVE_VSTRH_SCATTER_T2
:
6384 case MVE_VSTRW_SCATTER_T3
:
6385 case MVE_VSTRD_SCATTER_T4
:
6386 if (arm_decode_field (given
, 16, 19) == 0xf)
6388 *unpredictable_code
= UNPRED_R15
;
6394 case MVE_VMOV2_VEC_LANE_TO_GP
:
6395 case MVE_VMOV2_GP_TO_VEC_LANE
:
6396 case MVE_VCVT_BETWEEN_FP_INT
:
6397 case MVE_VCVT_FROM_FP_TO_INT
:
6399 unsigned long rt
= arm_decode_field (given
, 0, 3);
6400 unsigned long rt2
= arm_decode_field (given
, 16, 19);
6402 if ((rt
== 0xd) || (rt2
== 0xd))
6404 *unpredictable_code
= UNPRED_R13
;
6407 else if ((rt
== 0xf) || (rt2
== 0xf))
6409 *unpredictable_code
= UNPRED_R15
;
6414 *unpredictable_code
= UNPRED_GP_REGS_EQUAL
;
6423 case MVE_VMAXNMV_FP
:
6424 case MVE_VMAXNMAV_FP
:
6425 case MVE_VMINNMV_FP
:
6426 case MVE_VMINNMAV_FP
:
6430 case MVE_VMOV_HFP_TO_GP
:
6431 case MVE_VMOV_GP_TO_VEC_LANE
:
6432 case MVE_VMOV_VEC_LANE_TO_GP
:
6434 unsigned long rda
= arm_decode_field (given
, 12, 15);
6437 *unpredictable_code
= UNPRED_R13
;
6440 else if (rda
== 0xf)
6442 *unpredictable_code
= UNPRED_R15
;
6459 if (arm_decode_field (given
, 20, 21) == 2)
6461 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6462 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6463 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6465 if ((Qd
== Qn
) || (Qd
== Qm
))
6467 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6478 case MVE_VQDMULL_T1
:
6484 if (arm_decode_field (given
, 28, 28) == 1)
6486 Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6487 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6488 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6490 if ((Qd
== Qn
) || (Qd
== Qm
))
6492 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6502 case MVE_VQDMULL_T2
:
6504 unsigned long gpr
= arm_decode_field (given
, 0, 3);
6507 *unpredictable_code
= UNPRED_R13
;
6510 else if (gpr
== 0xf)
6512 *unpredictable_code
= UNPRED_R15
;
6516 if (arm_decode_field (given
, 28, 28) == 1)
6519 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
6520 unsigned long Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6524 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6535 case MVE_VRMLSLDAVH
:
6538 if (arm_decode_field (given
, 20, 22) == 6)
6540 *unpredictable_code
= UNPRED_R13
;
6548 if (arm_decode_field (given
, 1, 3) == 6)
6550 *unpredictable_code
= UNPRED_R13
;
6559 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6560 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6561 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 21) == 2)
6563 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_2
;
6572 unsigned long Qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6573 unsigned long Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6574 if ((Qd
== Qm
) && arm_decode_field (given
, 20, 20) == 1)
6576 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6589 if (arm_decode_field (given
, 20, 20) == 1)
6591 Qda
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6592 Qm
= arm_decode_field_multiple (given
, 1, 3, 5, 5);
6593 Qn
= arm_decode_field_multiple (given
, 17, 19, 7, 7);
6595 if ((Qda
== Qn
) || (Qda
== Qm
))
6597 *unpredictable_code
= UNPRED_Q_REGS_EQ_AND_SIZE_1
;
6609 if (arm_decode_field (given
, 16, 19) == 0xd)
6611 *unpredictable_code
= UNPRED_R13
;
6619 unsigned long qd
= arm_decode_field_multiple (given
, 13, 15, 22, 22);
6620 unsigned long qm
= arm_decode_field_multiple (given
, 1, 3, 6, 6);
6624 *unpredictable_code
= UNPRED_Q_REGS_EQUAL
;
6643 unsigned long gpr
= arm_decode_field (given
, 9, 11);
6644 gpr
= ((gpr
<< 1) | 1);
6647 *unpredictable_code
= UNPRED_R13
;
6650 else if (gpr
== 0xf)
6652 *unpredictable_code
= UNPRED_R15
;
6665 print_mve_vmov_index (struct disassemble_info
*info
, unsigned long given
)
6667 unsigned long op1
= arm_decode_field (given
, 21, 22);
6668 unsigned long op2
= arm_decode_field (given
, 5, 6);
6669 unsigned long h
= arm_decode_field (given
, 16, 16);
6670 unsigned long index
, esize
, targetBeat
, idx
;
6671 void *stream
= info
->stream
;
6672 fprintf_ftype func
= info
->fprintf_func
;
6674 if ((op1
& 0x2) == 0x2)
6679 else if (((op1
& 0x2) == 0x0) && ((op2
& 0x1) == 0x1))
6684 else if (((op1
& 0x2) == 0) && ((op2
& 0x3) == 0))
6691 func (stream
, "<undefined index>");
6695 targetBeat
= (op1
& 0x1) | (h
<< 1);
6696 idx
= index
+ targetBeat
* (32/esize
);
6698 func (stream
, "%lu", idx
);
6701 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
6702 in length and integer of floating-point type. */
6704 print_simd_imm8 (struct disassemble_info
*info
, unsigned long given
,
6705 unsigned int ibit_loc
, const struct mopcode32
*insn
)
6708 int cmode
= (given
>> 8) & 0xf;
6709 int op
= (given
>> 5) & 0x1;
6710 unsigned long value
= 0, hival
= 0;
6714 void *stream
= info
->stream
;
6715 fprintf_ftype func
= info
->fprintf_func
;
6717 /* On Neon the 'i' bit is at bit 24, on mve it is
6719 bits
|= ((given
>> ibit_loc
) & 1) << 7;
6720 bits
|= ((given
>> 16) & 7) << 4;
6721 bits
|= ((given
>> 0) & 15) << 0;
6725 shift
= (cmode
>> 1) & 3;
6726 value
= (unsigned long) bits
<< (8 * shift
);
6729 else if (cmode
< 12)
6731 shift
= (cmode
>> 1) & 1;
6732 value
= (unsigned long) bits
<< (8 * shift
);
6735 else if (cmode
< 14)
6737 shift
= (cmode
& 1) + 1;
6738 value
= (unsigned long) bits
<< (8 * shift
);
6739 value
|= (1ul << (8 * shift
)) - 1;
6742 else if (cmode
== 14)
6746 /* Bit replication into bytes. */
6752 for (ix
= 7; ix
>= 0; ix
--)
6754 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
6756 value
= (value
<< 8) | mask
;
6758 hival
= (hival
<< 8) | mask
;
6764 /* Byte replication. */
6765 value
= (unsigned long) bits
;
6771 /* Floating point encoding. */
6774 value
= (unsigned long) (bits
& 0x7f) << 19;
6775 value
|= (unsigned long) (bits
& 0x80) << 24;
6776 tmp
= bits
& 0x40 ? 0x3c : 0x40;
6777 value
|= (unsigned long) tmp
<< 24;
6783 func (stream
, "<illegal constant %.8x:%x:%x>",
6789 // printU determines whether the immediate value should be printed as
6791 unsigned printU
= 0;
6792 switch (insn
->mve_op
)
6796 // We want this for instructions that don't have a 'signed' type
6800 case MVE_VMOV_IMM_TO_VEC
:
6807 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
6814 : "#%ld\t; 0x%.4lx", value
, value
);
6820 unsigned char valbytes
[4];
6823 /* Do this a byte at a time so we don't have to
6824 worry about the host's endianness. */
6825 valbytes
[0] = value
& 0xff;
6826 valbytes
[1] = (value
>> 8) & 0xff;
6827 valbytes
[2] = (value
>> 16) & 0xff;
6828 valbytes
[3] = (value
>> 24) & 0xff;
6830 floatformat_to_double
6831 (& floatformat_ieee_single_little
, valbytes
,
6834 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
6841 : "#%ld\t; 0x%.8lx",
6842 (long) (((value
& 0x80000000L
) != 0)
6844 ? value
| ~0xffffffffL
: value
),
6849 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
6859 print_mve_undefined (struct disassemble_info
*info
,
6860 enum mve_undefined undefined_code
)
6862 void *stream
= info
->stream
;
6863 fprintf_ftype func
= info
->fprintf_func
;
6865 func (stream
, "\t\tundefined instruction: ");
6867 switch (undefined_code
)
6870 func (stream
, "illegal size");
6874 func (stream
, "size equals zero");
6878 func (stream
, "size equals two");
6882 func (stream
, "size equals three");
6885 case UNDEF_SIZE_LE_1
:
6886 func (stream
, "size <= 1");
6889 case UNDEF_SIZE_NOT_0
:
6890 func (stream
, "size not equal to 0");
6893 case UNDEF_SIZE_NOT_2
:
6894 func (stream
, "size not equal to 2");
6897 case UNDEF_SIZE_NOT_3
:
6898 func (stream
, "size not equal to 3");
6901 case UNDEF_NOT_UNS_SIZE_0
:
6902 func (stream
, "not unsigned and size = zero");
6905 case UNDEF_NOT_UNS_SIZE_1
:
6906 func (stream
, "not unsigned and size = one");
6909 case UNDEF_NOT_UNSIGNED
:
6910 func (stream
, "not unsigned");
6913 case UNDEF_VCVT_IMM6
:
6914 func (stream
, "invalid imm6");
6917 case UNDEF_VCVT_FSI_IMM6
:
6918 func (stream
, "fsi = 0 and invalid imm6");
6921 case UNDEF_BAD_OP1_OP2
:
6922 func (stream
, "bad size with op2 = 2 and op1 = 0 or 1");
6925 case UNDEF_BAD_U_OP1_OP2
:
6926 func (stream
, "unsigned with op2 = 0 and op1 = 0 or 1");
6929 case UNDEF_OP_0_BAD_CMODE
:
6930 func (stream
, "op field equal 0 and bad cmode");
6933 case UNDEF_XCHG_UNS
:
6934 func (stream
, "exchange and unsigned together");
6944 print_mve_unpredictable (struct disassemble_info
*info
,
6945 enum mve_unpredictable unpredict_code
)
6947 void *stream
= info
->stream
;
6948 fprintf_ftype func
= info
->fprintf_func
;
6950 func (stream
, "%s: ", UNPREDICTABLE_INSTRUCTION
);
6952 switch (unpredict_code
)
6954 case UNPRED_IT_BLOCK
:
6955 func (stream
, "mve instruction in it block");
6958 case UNPRED_FCA_0_FCB_1
:
6959 func (stream
, "condition bits, fca = 0 and fcb = 1");
6963 func (stream
, "use of r13 (sp)");
6967 func (stream
, "use of r15 (pc)");
6971 func (stream
, "start register block > r4");
6975 func (stream
, "start register block > r6");
6978 case UNPRED_R13_AND_WB
:
6979 func (stream
, "use of r13 and write back");
6982 case UNPRED_Q_REGS_EQUAL
:
6984 "same vector register used for destination and other operand");
6988 func (stream
, "use of offset scaled");
6991 case UNPRED_GP_REGS_EQUAL
:
6992 func (stream
, "same general-purpose register used for both operands");
6995 case UNPRED_Q_REGS_EQ_AND_SIZE_1
:
6996 func (stream
, "use of identical q registers and size = 1");
6999 case UNPRED_Q_REGS_EQ_AND_SIZE_2
:
7000 func (stream
, "use of identical q registers and size = 1");
7008 /* Print register block operand for mve vld2/vld4/vst2/vld4. */
7011 print_mve_register_blocks (struct disassemble_info
*info
,
7012 unsigned long given
,
7013 enum mve_instructions matched_insn
)
7015 void *stream
= info
->stream
;
7016 fprintf_ftype func
= info
->fprintf_func
;
7018 unsigned long q_reg_start
= arm_decode_field_multiple (given
,
7021 switch (matched_insn
)
7025 if (q_reg_start
<= 6)
7026 func (stream
, "{q%ld, q%ld}", q_reg_start
, q_reg_start
+ 1);
7028 func (stream
, "<illegal reg q%ld>", q_reg_start
);
7033 if (q_reg_start
<= 4)
7034 func (stream
, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start
,
7035 q_reg_start
+ 1, q_reg_start
+ 2,
7038 func (stream
, "<illegal reg q%ld>", q_reg_start
);
7047 print_mve_rounding_mode (struct disassemble_info
*info
,
7048 unsigned long given
,
7049 enum mve_instructions matched_insn
)
7051 void *stream
= info
->stream
;
7052 fprintf_ftype func
= info
->fprintf_func
;
7054 switch (matched_insn
)
7056 case MVE_VCVT_FROM_FP_TO_INT
:
7058 switch (arm_decode_field (given
, 8, 9))
7084 switch (arm_decode_field (given
, 7, 9))
7123 print_mve_vcvt_size (struct disassemble_info
*info
,
7124 unsigned long given
,
7125 enum mve_instructions matched_insn
)
7127 unsigned long mode
= 0;
7128 void *stream
= info
->stream
;
7129 fprintf_ftype func
= info
->fprintf_func
;
7131 switch (matched_insn
)
7133 case MVE_VCVT_FP_FIX_VEC
:
7135 mode
= (((given
& 0x200) >> 7)
7136 | ((given
& 0x10000000) >> 27)
7137 | ((given
& 0x100) >> 8));
7142 func (stream
, "f16.s16");
7146 func (stream
, "s16.f16");
7150 func (stream
, "f16.u16");
7154 func (stream
, "u16.f16");
7158 func (stream
, "f32.s32");
7162 func (stream
, "s32.f32");
7166 func (stream
, "f32.u32");
7170 func (stream
, "u32.f32");
7178 case MVE_VCVT_BETWEEN_FP_INT
:
7180 unsigned long size
= arm_decode_field (given
, 18, 19);
7181 unsigned long op
= arm_decode_field (given
, 7, 8);
7188 func (stream
, "f16.s16");
7192 func (stream
, "f16.u16");
7196 func (stream
, "s16.f16");
7200 func (stream
, "u16.f16");
7212 func (stream
, "f32.s32");
7216 func (stream
, "f32.u32");
7220 func (stream
, "s32.f32");
7224 func (stream
, "u32.f32");
7231 case MVE_VCVT_FP_HALF_FP
:
7233 unsigned long op
= arm_decode_field (given
, 28, 28);
7235 func (stream
, "f16.f32");
7237 func (stream
, "f32.f16");
7241 case MVE_VCVT_FROM_FP_TO_INT
:
7243 unsigned long size
= arm_decode_field_multiple (given
, 7, 7, 18, 19);
7248 func (stream
, "s16.f16");
7252 func (stream
, "u16.f16");
7256 func (stream
, "s32.f32");
7260 func (stream
, "u32.f32");
7275 print_mve_rotate (struct disassemble_info
*info
, unsigned long rot
,
7276 unsigned long rot_width
)
7278 void *stream
= info
->stream
;
7279 fprintf_ftype func
= info
->fprintf_func
;
7286 func (stream
, "90");
7289 func (stream
, "270");
7295 else if (rot_width
== 2)
7303 func (stream
, "90");
7306 func (stream
, "180");
7309 func (stream
, "270");
7318 print_instruction_predicate (struct disassemble_info
*info
)
7320 void *stream
= info
->stream
;
7321 fprintf_ftype func
= info
->fprintf_func
;
7323 if (vpt_block_state
.next_pred_state
== PRED_THEN
)
7325 else if (vpt_block_state
.next_pred_state
== PRED_ELSE
)
7330 print_mve_size (struct disassemble_info
*info
,
7332 enum mve_instructions matched_insn
)
7334 void *stream
= info
->stream
;
7335 fprintf_ftype func
= info
->fprintf_func
;
7337 switch (matched_insn
)
7343 case MVE_VADD_VEC_T1
:
7344 case MVE_VADD_VEC_T2
:
7350 case MVE_VCMP_VEC_T1
:
7351 case MVE_VCMP_VEC_T2
:
7352 case MVE_VCMP_VEC_T3
:
7353 case MVE_VCMP_VEC_T4
:
7354 case MVE_VCMP_VEC_T5
:
7355 case MVE_VCMP_VEC_T6
:
7368 case MVE_VLDRB_GATHER_T1
:
7369 case MVE_VLDRH_GATHER_T2
:
7370 case MVE_VLDRW_GATHER_T3
:
7371 case MVE_VLDRD_GATHER_T4
:
7384 case MVE_VMUL_VEC_T1
:
7385 case MVE_VMUL_VEC_T2
:
7391 case MVE_VPT_VEC_T1
:
7392 case MVE_VPT_VEC_T2
:
7393 case MVE_VPT_VEC_T3
:
7394 case MVE_VPT_VEC_T4
:
7395 case MVE_VPT_VEC_T5
:
7396 case MVE_VPT_VEC_T6
:
7408 case MVE_VQDMULH_T1
:
7409 case MVE_VQRDMULH_T2
:
7410 case MVE_VQDMULH_T3
:
7411 case MVE_VQRDMULH_T4
:
7430 case MVE_VSTRB_SCATTER_T1
:
7431 case MVE_VSTRH_SCATTER_T2
:
7432 case MVE_VSTRW_SCATTER_T3
:
7435 case MVE_VSUB_VEC_T1
:
7436 case MVE_VSUB_VEC_T2
:
7438 func (stream
, "%s", mve_vec_sizename
[size
]);
7440 func (stream
, "<undef size>");
7444 case MVE_VADD_FP_T1
:
7445 case MVE_VADD_FP_T2
:
7446 case MVE_VSUB_FP_T1
:
7447 case MVE_VSUB_FP_T2
:
7448 case MVE_VCMP_FP_T1
:
7449 case MVE_VCMP_FP_T2
:
7450 case MVE_VFMA_FP_SCALAR
:
7453 case MVE_VFMAS_FP_SCALAR
:
7455 case MVE_VMAXNMA_FP
:
7456 case MVE_VMAXNMV_FP
:
7457 case MVE_VMAXNMAV_FP
:
7459 case MVE_VMINNMA_FP
:
7460 case MVE_VMINNMV_FP
:
7461 case MVE_VMINNMAV_FP
:
7462 case MVE_VMUL_FP_T1
:
7463 case MVE_VMUL_FP_T2
:
7467 func (stream
, "32");
7469 func (stream
, "16");
7475 case MVE_VMLADAV_T1
:
7477 case MVE_VMLSDAV_T1
:
7480 case MVE_VQDMULL_T1
:
7481 case MVE_VQDMULL_T2
:
7485 func (stream
, "16");
7487 func (stream
, "32");
7494 func (stream
, "16");
7501 func (stream
, "32");
7504 func (stream
, "16");
7514 case MVE_VMOV_GP_TO_VEC_LANE
:
7515 case MVE_VMOV_VEC_LANE_TO_GP
:
7519 func (stream
, "32");
7524 func (stream
, "16");
7527 case 8: case 9: case 10: case 11:
7528 case 12: case 13: case 14: case 15:
7537 case MVE_VMOV_IMM_TO_VEC
:
7540 case 0: case 4: case 8:
7541 case 12: case 24: case 26:
7542 func (stream
, "i32");
7545 func (stream
, "i16");
7548 func (stream
, "i8");
7551 func (stream
, "i64");
7554 func (stream
, "f32");
7561 case MVE_VMULL_POLY
:
7563 func (stream
, "p8");
7565 func (stream
, "p16");
7571 case 0: case 2: case 4:
7572 case 6: case 12: case 13:
7573 func (stream
, "32");
7577 func (stream
, "16");
7591 func (stream
, "32");
7595 func (stream
, "16");
7613 func (stream
, "16");
7617 func (stream
, "32");
7642 func (stream
, "16");
7645 case 4: case 5: case 6: case 7:
7646 func (stream
, "32");
7661 print_mve_shift_n (struct disassemble_info
*info
, long given
,
7662 enum mve_instructions matched_insn
)
7664 void *stream
= info
->stream
;
7665 fprintf_ftype func
= info
->fprintf_func
;
7668 = matched_insn
== MVE_VQSHL_T2
7669 || matched_insn
== MVE_VQSHLU_T3
7670 || matched_insn
== MVE_VSHL_T1
7671 || matched_insn
== MVE_VSHLL_T1
7672 || matched_insn
== MVE_VSLI
;
7674 unsigned imm6
= (given
& 0x3f0000) >> 16;
7676 if (matched_insn
== MVE_VSHLL_T1
)
7679 unsigned shiftAmount
= 0;
7680 if ((imm6
& 0x20) != 0)
7681 shiftAmount
= startAt0
? imm6
- 32 : 64 - imm6
;
7682 else if ((imm6
& 0x10) != 0)
7683 shiftAmount
= startAt0
? imm6
- 16 : 32 - imm6
;
7684 else if ((imm6
& 0x08) != 0)
7685 shiftAmount
= startAt0
? imm6
- 8 : 16 - imm6
;
7687 print_mve_undefined (info
, UNDEF_SIZE_0
);
7689 func (stream
, "%u", shiftAmount
);
7693 print_vec_condition (struct disassemble_info
*info
, long given
,
7694 enum mve_instructions matched_insn
)
7696 void *stream
= info
->stream
;
7697 fprintf_ftype func
= info
->fprintf_func
;
7700 switch (matched_insn
)
7703 case MVE_VCMP_FP_T1
:
7704 vec_cond
= (((given
& 0x1000) >> 10)
7705 | ((given
& 1) << 1)
7706 | ((given
& 0x0080) >> 7));
7707 func (stream
, "%s",vec_condnames
[vec_cond
]);
7711 case MVE_VCMP_FP_T2
:
7712 vec_cond
= (((given
& 0x1000) >> 10)
7713 | ((given
& 0x0020) >> 4)
7714 | ((given
& 0x0080) >> 7));
7715 func (stream
, "%s",vec_condnames
[vec_cond
]);
7718 case MVE_VPT_VEC_T1
:
7719 case MVE_VCMP_VEC_T1
:
7720 vec_cond
= (given
& 0x0080) >> 7;
7721 func (stream
, "%s",vec_condnames
[vec_cond
]);
7724 case MVE_VPT_VEC_T2
:
7725 case MVE_VCMP_VEC_T2
:
7726 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7727 func (stream
, "%s",vec_condnames
[vec_cond
]);
7730 case MVE_VPT_VEC_T3
:
7731 case MVE_VCMP_VEC_T3
:
7732 vec_cond
= 4 | ((given
& 1) << 1) | ((given
& 0x0080) >> 7);
7733 func (stream
, "%s",vec_condnames
[vec_cond
]);
7736 case MVE_VPT_VEC_T4
:
7737 case MVE_VCMP_VEC_T4
:
7738 vec_cond
= (given
& 0x0080) >> 7;
7739 func (stream
, "%s",vec_condnames
[vec_cond
]);
7742 case MVE_VPT_VEC_T5
:
7743 case MVE_VCMP_VEC_T5
:
7744 vec_cond
= 2 | ((given
& 0x0080) >> 7);
7745 func (stream
, "%s",vec_condnames
[vec_cond
]);
7748 case MVE_VPT_VEC_T6
:
7749 case MVE_VCMP_VEC_T6
:
7750 vec_cond
= 4 | ((given
& 0x0020) >> 4) | ((given
& 0x0080) >> 7);
7751 func (stream
, "%s",vec_condnames
[vec_cond
]);
7766 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
7767 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
7768 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0)
7769 #define PRE_BIT_SET (given & (1 << P_BIT))
7772 /* Print one coprocessor instruction on INFO->STREAM.
7773 Return TRUE if the instuction matched, FALSE if this is not a
7774 recognised coprocessor instruction. */
7777 print_insn_coprocessor (bfd_vma pc
,
7778 struct disassemble_info
*info
,
7782 const struct sopcode32
*insn
;
7783 void *stream
= info
->stream
;
7784 fprintf_ftype func
= info
->fprintf_func
;
7786 unsigned long value
= 0;
7789 struct arm_private_data
*private_data
= info
->private_data
;
7790 arm_feature_set allowed_arches
= ARM_ARCH_NONE
;
7791 arm_feature_set arm_ext_v8_1m_main
=
7792 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN
);
7794 allowed_arches
= private_data
->features
;
7796 for (insn
= coprocessor_opcodes
; insn
->assembler
; insn
++)
7798 unsigned long u_reg
= 16;
7799 bfd_boolean is_unpredictable
= FALSE
;
7800 signed long value_in_comment
= 0;
7803 if (ARM_FEATURE_ZERO (insn
->arch
))
7804 switch (insn
->value
)
7806 case SENTINEL_IWMMXT_START
:
7807 if (info
->mach
!= bfd_mach_arm_XScale
7808 && info
->mach
!= bfd_mach_arm_iWMMXt
7809 && info
->mach
!= bfd_mach_arm_iWMMXt2
)
7812 while ((! ARM_FEATURE_ZERO (insn
->arch
))
7813 && insn
->value
!= SENTINEL_IWMMXT_END
);
7816 case SENTINEL_IWMMXT_END
:
7819 case SENTINEL_GENERIC_START
:
7820 allowed_arches
= private_data
->features
;
7828 value
= insn
->value
;
7829 cp_num
= (given
>> 8) & 0xf;
7833 /* The high 4 bits are 0xe for Arm conditional instructions, and
7834 0xe for arm unconditional instructions. The rest of the
7835 encoding is the same. */
7837 value
|= 0xe0000000;
7845 /* Only match unconditional instuctions against unconditional
7847 if ((given
& 0xf0000000) == 0xf0000000)
7854 cond
= (given
>> 28) & 0xf;
7860 if ((insn
->isa
== T32
&& !thumb
)
7861 || (insn
->isa
== ARM
&& thumb
))
7864 if ((given
& mask
) != value
)
7867 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, allowed_arches
))
7870 if (insn
->value
== 0xfe000010 /* mcr2 */
7871 || insn
->value
== 0xfe100010 /* mrc2 */
7872 || insn
->value
== 0xfc100000 /* ldc2 */
7873 || insn
->value
== 0xfc000000) /* stc2 */
7875 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7876 is_unpredictable
= TRUE
;
7878 /* Armv8.1-M Mainline FP & MVE instructions. */
7879 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7880 && !ARM_CPU_IS_ANY (allowed_arches
)
7881 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7885 else if (insn
->value
== 0x0e000000 /* cdp */
7886 || insn
->value
== 0xfe000000 /* cdp2 */
7887 || insn
->value
== 0x0e000010 /* mcr */
7888 || insn
->value
== 0x0e100010 /* mrc */
7889 || insn
->value
== 0x0c100000 /* ldc */
7890 || insn
->value
== 0x0c000000) /* stc */
7892 /* Floating-point instructions. */
7893 if (cp_num
== 9 || cp_num
== 10 || cp_num
== 11)
7896 /* Armv8.1-M Mainline FP & MVE instructions. */
7897 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main
, allowed_arches
)
7898 && !ARM_CPU_IS_ANY (allowed_arches
)
7899 && (cp_num
== 8 || cp_num
== 14 || cp_num
== 15))
7902 else if ((insn
->value
== 0xec100f80 /* vldr (system register) */
7903 || insn
->value
== 0xec000f80) /* vstr (system register) */
7904 && arm_decode_field (given
, 24, 24) == 0
7905 && arm_decode_field (given
, 21, 21) == 0)
7906 /* If the P and W bits are both 0 then these encodings match the MVE
7907 VLDR and VSTR instructions, these are in a different table, so we
7908 don't let it match here. */
7911 for (c
= insn
->assembler
; *c
; c
++)
7915 const char mod
= *++c
;
7919 func (stream
, "%%");
7925 int rn
= (given
>> 16) & 0xf;
7926 bfd_vma offset
= given
& 0xff;
7929 offset
= given
& 0x7f;
7931 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
7933 if (PRE_BIT_SET
|| WRITEBACK_BIT_SET
)
7935 /* Not unindexed. The offset is scaled. */
7937 /* vldr.16/vstr.16 will shift the address
7938 left by 1 bit only. */
7939 offset
= offset
* 2;
7941 offset
= offset
* 4;
7943 if (NEGATIVE_BIT_SET
)
7946 value_in_comment
= offset
;
7952 func (stream
, ", #%d]%s",
7954 WRITEBACK_BIT_SET
? "!" : "");
7955 else if (NEGATIVE_BIT_SET
)
7956 func (stream
, ", #-0]");
7964 if (WRITEBACK_BIT_SET
)
7967 func (stream
, ", #%d", (int) offset
);
7968 else if (NEGATIVE_BIT_SET
)
7969 func (stream
, ", #-0");
7973 func (stream
, ", {%s%d}",
7974 (NEGATIVE_BIT_SET
&& !offset
) ? "-" : "",
7976 value_in_comment
= offset
;
7979 if (rn
== 15 && (PRE_BIT_SET
|| WRITEBACK_BIT_SET
))
7981 func (stream
, "\t; ");
7982 /* For unaligned PCs, apply off-by-alignment
7984 info
->print_address_func (offset
+ pc
7985 + info
->bytes_per_chunk
* 2
7994 int regno
= ((given
>> 12) & 0xf) | ((given
>> (22 - 4)) & 0x10);
7995 int offset
= (given
>> 1) & 0x3f;
7998 func (stream
, "{d%d}", regno
);
7999 else if (regno
+ offset
> 32)
8000 func (stream
, "{d%d-<overflow reg d%d>}", regno
, regno
+ offset
- 1);
8002 func (stream
, "{d%d-d%d}", regno
, regno
+ offset
- 1);
8008 bfd_boolean single
= ((given
>> 8) & 1) == 0;
8009 char reg_prefix
= single
? 's' : 'd';
8010 int Dreg
= (given
>> 22) & 0x1;
8011 int Vdreg
= (given
>> 12) & 0xf;
8012 int reg
= single
? ((Vdreg
<< 1) | Dreg
)
8013 : ((Dreg
<< 4) | Vdreg
);
8014 int num
= (given
>> (single
? 0 : 1)) & 0x7f;
8015 int maxreg
= single
? 31 : 15;
8016 int topreg
= reg
+ num
- 1;
8019 func (stream
, "{VPR}");
8021 func (stream
, "{%c%d, VPR}", reg_prefix
, reg
);
8022 else if (topreg
> maxreg
)
8023 func (stream
, "{%c%d-<overflow reg d%d, VPR}",
8024 reg_prefix
, reg
, single
? topreg
>> 1 : topreg
);
8026 func (stream
, "{%c%d-%c%d, VPR}", reg_prefix
, reg
,
8027 reg_prefix
, topreg
);
8032 if (cond
!= COND_UNCOND
)
8033 is_unpredictable
= TRUE
;
8037 if (cond
!= COND_UNCOND
&& cp_num
== 9)
8038 is_unpredictable
= TRUE
;
8040 func (stream
, "%s", arm_conditional
[cond
]);
8044 /* Print a Cirrus/DSP shift immediate. */
8045 /* Immediates are 7bit signed ints with bits 0..3 in
8046 bits 0..3 of opcode and bits 4..6 in bits 5..7
8051 imm
= (given
& 0xf) | ((given
& 0xe0) >> 1);
8053 /* Is ``imm'' a negative number? */
8057 func (stream
, "%d", imm
);
8065 = arm_decode_field_multiple (given
, 13, 15, 22, 22);
8070 func (stream
, "FPSCR");
8073 func (stream
, "FPSCR_nzcvqc");
8076 func (stream
, "VPR");
8079 func (stream
, "P0");
8082 func (stream
, "FPCXTNS");
8085 func (stream
, "FPCXTS");
8088 func (stream
, "<invalid reg %lu>", regno
);
8095 switch (given
& 0x00408000)
8112 switch (given
& 0x00080080)
8124 func (stream
, _("<illegal precision>"));
8130 switch (given
& 0x00408000)
8148 switch (given
& 0x60)
8164 case '0': case '1': case '2': case '3': case '4':
8165 case '5': case '6': case '7': case '8': case '9':
8169 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
8175 is_unpredictable
= TRUE
;
8180 /* Eat the 'u' character. */
8184 is_unpredictable
= TRUE
;
8187 func (stream
, "%s", arm_regnames
[value
]);
8190 if (given
& (1 << 6))
8194 func (stream
, "d%ld", value
);
8199 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
8201 func (stream
, "q%ld", value
>> 1);
8204 func (stream
, "%ld", value
);
8205 value_in_comment
= value
;
8209 /* Converts immediate 8 bit back to float value. */
8210 unsigned floatVal
= (value
& 0x80) << 24
8211 | (value
& 0x3F) << 19
8212 | ((value
& 0x40) ? (0xF8 << 22) : (1 << 30));
8214 /* Quarter float have a maximum value of 31.0.
8215 Get floating point value multiplied by 1e7.
8216 The maximum value stays in limit of a 32-bit int. */
8218 (78125 << (((floatVal
>> 23) & 0xFF) - 124)) *
8219 (16 + (value
& 0xF));
8221 if (!(decVal
% 1000000))
8222 func (stream
, "%ld\t; 0x%08x %c%u.%01u", value
,
8223 floatVal
, value
& 0x80 ? '-' : ' ',
8225 decVal
% 10000000 / 1000000);
8226 else if (!(decVal
% 10000))
8227 func (stream
, "%ld\t; 0x%08x %c%u.%03u", value
,
8228 floatVal
, value
& 0x80 ? '-' : ' ',
8230 decVal
% 10000000 / 10000);
8232 func (stream
, "%ld\t; 0x%08x %c%u.%07u", value
,
8233 floatVal
, value
& 0x80 ? '-' : ' ',
8234 decVal
/ 10000000, decVal
% 10000000);
8239 int from
= (given
& (1 << 7)) ? 32 : 16;
8240 func (stream
, "%ld", from
- value
);
8246 func (stream
, "#%s", arm_fp_const
[value
& 7]);
8248 func (stream
, "f%ld", value
);
8253 func (stream
, "%s", iwmmxt_wwnames
[value
]);
8255 func (stream
, "%s", iwmmxt_wwssnames
[value
]);
8259 func (stream
, "%s", iwmmxt_regnames
[value
]);
8262 func (stream
, "%s", iwmmxt_cregnames
[value
]);
8266 func (stream
, "0x%lx", (value
& 0xffffffffUL
));
8273 func (stream
, "eq");
8277 func (stream
, "vs");
8281 func (stream
, "ge");
8285 func (stream
, "gt");
8289 func (stream
, "??");
8297 func (stream
, "%c", *c
);
8301 if (value
== ((1ul << width
) - 1))
8302 func (stream
, "%c", *c
);
8305 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
8317 int single
= *c
++ == 'y';
8322 case '4': /* Sm pair */
8323 case '0': /* Sm, Dm */
8324 regno
= given
& 0x0000000f;
8328 regno
+= (given
>> 5) & 1;
8331 regno
+= ((given
>> 5) & 1) << 4;
8334 case '1': /* Sd, Dd */
8335 regno
= (given
>> 12) & 0x0000000f;
8339 regno
+= (given
>> 22) & 1;
8342 regno
+= ((given
>> 22) & 1) << 4;
8345 case '2': /* Sn, Dn */
8346 regno
= (given
>> 16) & 0x0000000f;
8350 regno
+= (given
>> 7) & 1;
8353 regno
+= ((given
>> 7) & 1) << 4;
8356 case '3': /* List */
8358 regno
= (given
>> 12) & 0x0000000f;
8362 regno
+= (given
>> 22) & 1;
8365 regno
+= ((given
>> 22) & 1) << 4;
8372 func (stream
, "%c%d", single
? 's' : 'd', regno
);
8376 int count
= given
& 0xff;
8383 func (stream
, "-%c%d",
8391 func (stream
, ", %c%d", single
? 's' : 'd',
8397 switch (given
& 0x00400100)
8399 case 0x00000000: func (stream
, "b"); break;
8400 case 0x00400000: func (stream
, "h"); break;
8401 case 0x00000100: func (stream
, "w"); break;
8402 case 0x00400100: func (stream
, "d"); break;
8410 /* given (20, 23) | given (0, 3) */
8411 value
= ((given
>> 16) & 0xf0) | (given
& 0xf);
8412 func (stream
, "%d", (int) value
);
8417 /* This is like the 'A' operator, except that if
8418 the width field "M" is zero, then the offset is
8419 *not* multiplied by four. */
8421 int offset
= given
& 0xff;
8422 int multiplier
= (given
& 0x00000100) ? 4 : 1;
8424 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
8428 value_in_comment
= offset
* multiplier
;
8429 if (NEGATIVE_BIT_SET
)
8430 value_in_comment
= - value_in_comment
;
8436 func (stream
, ", #%s%d]%s",
8437 NEGATIVE_BIT_SET
? "-" : "",
8438 offset
* multiplier
,
8439 WRITEBACK_BIT_SET
? "!" : "");
8441 func (stream
, "], #%s%d",
8442 NEGATIVE_BIT_SET
? "-" : "",
8443 offset
* multiplier
);
8452 int imm4
= (given
>> 4) & 0xf;
8453 int puw_bits
= ((given
>> 22) & 6) | ((given
>> W_BIT
) & 1);
8454 int ubit
= ! NEGATIVE_BIT_SET
;
8455 const char *rm
= arm_regnames
[given
& 0xf];
8456 const char *rn
= arm_regnames
[(given
>> 16) & 0xf];
8462 func (stream
, "[%s], %c%s", rn
, ubit
? '+' : '-', rm
);
8464 func (stream
, ", lsl #%d", imm4
);
8471 func (stream
, "[%s, %c%s", rn
, ubit
? '+' : '-', rm
);
8473 func (stream
, ", lsl #%d", imm4
);
8475 if (puw_bits
== 5 || puw_bits
== 7)
8480 func (stream
, "INVALID");
8488 imm5
= ((given
& 0x100) >> 4) | (given
& 0xf);
8489 func (stream
, "%ld", (imm5
== 0) ? 32 : imm5
);
8498 func (stream
, "%c", *c
);
8501 if (value_in_comment
> 32 || value_in_comment
< -16)
8502 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
8504 if (is_unpredictable
)
8505 func (stream
, UNPREDICTABLE_INSTRUCTION
);
8512 /* Decodes and prints ARM addressing modes. Returns the offset
8513 used in the address, if any, if it is worthwhile printing the
8514 offset as a hexadecimal value in a comment at the end of the
8515 line of disassembly. */
8518 print_arm_address (bfd_vma pc
, struct disassemble_info
*info
, long given
)
8520 void *stream
= info
->stream
;
8521 fprintf_ftype func
= info
->fprintf_func
;
8524 if (((given
& 0x000f0000) == 0x000f0000)
8525 && ((given
& 0x02000000) == 0))
8527 offset
= given
& 0xfff;
8529 func (stream
, "[pc");
8533 /* Pre-indexed. Elide offset of positive zero when
8535 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8536 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8538 if (NEGATIVE_BIT_SET
)
8543 /* Cope with the possibility of write-back
8544 being used. Probably a very dangerous thing
8545 for the programmer to do, but who are we to
8547 func (stream
, "]%s", WRITEBACK_BIT_SET
? "!" : "");
8549 else /* Post indexed. */
8551 func (stream
, "], #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8553 /* Ie ignore the offset. */
8557 func (stream
, "\t; ");
8558 info
->print_address_func (offset
, info
);
8563 func (stream
, "[%s",
8564 arm_regnames
[(given
>> 16) & 0xf]);
8568 if ((given
& 0x02000000) == 0)
8570 /* Elide offset of positive zero when non-writeback. */
8571 offset
= given
& 0xfff;
8572 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
8573 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8577 func (stream
, ", %s", NEGATIVE_BIT_SET
? "-" : "");
8578 arm_decode_shift (given
, func
, stream
, TRUE
);
8581 func (stream
, "]%s",
8582 WRITEBACK_BIT_SET
? "!" : "");
8586 if ((given
& 0x02000000) == 0)
8588 /* Always show offset. */
8589 offset
= given
& 0xfff;
8590 func (stream
, "], #%s%d",
8591 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
8595 func (stream
, "], %s",
8596 NEGATIVE_BIT_SET
? "-" : "");
8597 arm_decode_shift (given
, func
, stream
, TRUE
);
8600 if (NEGATIVE_BIT_SET
)
8604 return (signed long) offset
;
8607 /* Print one neon instruction on INFO->STREAM.
8608 Return TRUE if the instuction matched, FALSE if this is not a
8609 recognised neon instruction. */
8612 print_insn_neon (struct disassemble_info
*info
, long given
, bfd_boolean thumb
)
8614 const struct opcode32
*insn
;
8615 void *stream
= info
->stream
;
8616 fprintf_ftype func
= info
->fprintf_func
;
8620 if ((given
& 0xef000000) == 0xef000000)
8622 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
8623 unsigned long bit28
= given
& (1 << 28);
8625 given
&= 0x00ffffff;
8627 given
|= 0xf3000000;
8629 given
|= 0xf2000000;
8631 else if ((given
& 0xff000000) == 0xf9000000)
8632 given
^= 0xf9000000 ^ 0xf4000000;
8633 /* vdup is also a valid neon instruction. */
8634 else if ((given
& 0xff910f5f) != 0xee800b10)
8638 for (insn
= neon_opcodes
; insn
->assembler
; insn
++)
8640 if ((given
& insn
->mask
) == insn
->value
)
8642 signed long value_in_comment
= 0;
8643 bfd_boolean is_unpredictable
= FALSE
;
8646 for (c
= insn
->assembler
; *c
; c
++)
8653 func (stream
, "%%");
8657 if (thumb
&& ifthen_state
)
8658 is_unpredictable
= TRUE
;
8662 if (thumb
&& ifthen_state
)
8663 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
8668 static const unsigned char enc
[16] =
8670 0x4, 0x14, /* st4 0,1 */
8682 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8683 int rn
= ((given
>> 16) & 0xf);
8684 int rm
= ((given
>> 0) & 0xf);
8685 int align
= ((given
>> 4) & 0x3);
8686 int type
= ((given
>> 8) & 0xf);
8687 int n
= enc
[type
] & 0xf;
8688 int stride
= (enc
[type
] >> 4) + 1;
8693 for (ix
= 0; ix
!= n
; ix
++)
8694 func (stream
, "%sd%d", ix
? "," : "", rd
+ ix
* stride
);
8696 func (stream
, "d%d", rd
);
8698 func (stream
, "d%d-d%d", rd
, rd
+ n
- 1);
8699 func (stream
, "}, [%s", arm_regnames
[rn
]);
8701 func (stream
, " :%d", 32 << align
);
8706 func (stream
, ", %s", arm_regnames
[rm
]);
8712 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8713 int rn
= ((given
>> 16) & 0xf);
8714 int rm
= ((given
>> 0) & 0xf);
8715 int idx_align
= ((given
>> 4) & 0xf);
8717 int size
= ((given
>> 10) & 0x3);
8718 int idx
= idx_align
>> (size
+ 1);
8719 int length
= ((given
>> 8) & 3) + 1;
8723 if (length
> 1 && size
> 0)
8724 stride
= (idx_align
& (1 << size
)) ? 2 : 1;
8730 int amask
= (1 << size
) - 1;
8731 if ((idx_align
& (1 << size
)) != 0)
8735 if ((idx_align
& amask
) == amask
)
8737 else if ((idx_align
& amask
) != 0)
8744 if (size
== 2 && (idx_align
& 2) != 0)
8746 align
= (idx_align
& 1) ? 16 << size
: 0;
8750 if ((size
== 2 && (idx_align
& 3) != 0)
8751 || (idx_align
& 1) != 0)
8758 if ((idx_align
& 3) == 3)
8760 align
= (idx_align
& 3) * 64;
8763 align
= (idx_align
& 1) ? 32 << size
: 0;
8771 for (i
= 0; i
< length
; i
++)
8772 func (stream
, "%sd%d[%d]", (i
== 0) ? "" : ",",
8773 rd
+ i
* stride
, idx
);
8774 func (stream
, "}, [%s", arm_regnames
[rn
]);
8776 func (stream
, " :%d", align
);
8781 func (stream
, ", %s", arm_regnames
[rm
]);
8787 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
8788 int rn
= ((given
>> 16) & 0xf);
8789 int rm
= ((given
>> 0) & 0xf);
8790 int align
= ((given
>> 4) & 0x1);
8791 int size
= ((given
>> 6) & 0x3);
8792 int type
= ((given
>> 8) & 0x3);
8794 int stride
= ((given
>> 5) & 0x1);
8797 if (stride
&& (n
== 1))
8804 for (ix
= 0; ix
!= n
; ix
++)
8805 func (stream
, "%sd%d[]", ix
? "," : "", rd
+ ix
* stride
);
8807 func (stream
, "d%d[]", rd
);
8809 func (stream
, "d%d[]-d%d[]", rd
, rd
+ n
- 1);
8810 func (stream
, "}, [%s", arm_regnames
[rn
]);
8813 align
= (8 * (type
+ 1)) << size
;
8815 align
= (size
> 1) ? align
>> 1 : align
;
8816 if (type
== 2 || (type
== 0 && !size
))
8817 func (stream
, " :<bad align %d>", align
);
8819 func (stream
, " :%d", align
);
8825 func (stream
, ", %s", arm_regnames
[rm
]);
8831 int raw_reg
= (given
& 0xf) | ((given
>> 1) & 0x10);
8832 int size
= (given
>> 20) & 3;
8833 int reg
= raw_reg
& ((4 << size
) - 1);
8834 int ix
= raw_reg
>> size
>> 2;
8836 func (stream
, "d%d[%d]", reg
, ix
);
8841 /* Neon encoded constant for mov, mvn, vorr, vbic. */
8844 int cmode
= (given
>> 8) & 0xf;
8845 int op
= (given
>> 5) & 0x1;
8846 unsigned long value
= 0, hival
= 0;
8851 bits
|= ((given
>> 24) & 1) << 7;
8852 bits
|= ((given
>> 16) & 7) << 4;
8853 bits
|= ((given
>> 0) & 15) << 0;
8857 shift
= (cmode
>> 1) & 3;
8858 value
= (unsigned long) bits
<< (8 * shift
);
8861 else if (cmode
< 12)
8863 shift
= (cmode
>> 1) & 1;
8864 value
= (unsigned long) bits
<< (8 * shift
);
8867 else if (cmode
< 14)
8869 shift
= (cmode
& 1) + 1;
8870 value
= (unsigned long) bits
<< (8 * shift
);
8871 value
|= (1ul << (8 * shift
)) - 1;
8874 else if (cmode
== 14)
8878 /* Bit replication into bytes. */
8884 for (ix
= 7; ix
>= 0; ix
--)
8886 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
8888 value
= (value
<< 8) | mask
;
8890 hival
= (hival
<< 8) | mask
;
8896 /* Byte replication. */
8897 value
= (unsigned long) bits
;
8903 /* Floating point encoding. */
8906 value
= (unsigned long) (bits
& 0x7f) << 19;
8907 value
|= (unsigned long) (bits
& 0x80) << 24;
8908 tmp
= bits
& 0x40 ? 0x3c : 0x40;
8909 value
|= (unsigned long) tmp
<< 24;
8915 func (stream
, "<illegal constant %.8x:%x:%x>",
8923 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
8927 func (stream
, "#%ld\t; 0x%.4lx", value
, value
);
8933 unsigned char valbytes
[4];
8936 /* Do this a byte at a time so we don't have to
8937 worry about the host's endianness. */
8938 valbytes
[0] = value
& 0xff;
8939 valbytes
[1] = (value
>> 8) & 0xff;
8940 valbytes
[2] = (value
>> 16) & 0xff;
8941 valbytes
[3] = (value
>> 24) & 0xff;
8943 floatformat_to_double
8944 (& floatformat_ieee_single_little
, valbytes
,
8947 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
8951 func (stream
, "#%ld\t; 0x%.8lx",
8952 (long) (((value
& 0x80000000L
) != 0)
8953 ? value
| ~0xffffffffL
: value
),
8958 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
8969 int regno
= ((given
>> 16) & 0xf) | ((given
>> (7 - 4)) & 0x10);
8970 int num
= (given
>> 8) & 0x3;
8973 func (stream
, "{d%d}", regno
);
8974 else if (num
+ regno
>= 32)
8975 func (stream
, "{d%d-<overflow reg d%d}", regno
, regno
+ num
);
8977 func (stream
, "{d%d-d%d}", regno
, regno
+ num
);
8982 case '0': case '1': case '2': case '3': case '4':
8983 case '5': case '6': case '7': case '8': case '9':
8986 unsigned long value
;
8988 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
8993 func (stream
, "%s", arm_regnames
[value
]);
8996 func (stream
, "%ld", value
);
8997 value_in_comment
= value
;
9000 func (stream
, "%ld", (1ul << width
) - value
);
9006 /* Various width encodings. */
9008 int base
= 8 << (*c
- 'S'); /* 8,16 or 32 */
9013 if (*c
>= '0' && *c
<= '9')
9015 else if (*c
>= 'a' && *c
<= 'f')
9016 limit
= *c
- 'a' + 10;
9022 if (value
< low
|| value
> high
)
9023 func (stream
, "<illegal width %d>", base
<< value
);
9025 func (stream
, "%d", base
<< value
);
9029 if (given
& (1 << 6))
9033 func (stream
, "d%ld", value
);
9038 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
9040 func (stream
, "q%ld", value
>> 1);
9046 func (stream
, "%c", *c
);
9050 if (value
== ((1ul << width
) - 1))
9051 func (stream
, "%c", *c
);
9054 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
9068 func (stream
, "%c", *c
);
9071 if (value_in_comment
> 32 || value_in_comment
< -16)
9072 func (stream
, "\t; 0x%lx", value_in_comment
);
9074 if (is_unpredictable
)
9075 func (stream
, UNPREDICTABLE_INSTRUCTION
);
9083 /* Print one mve instruction on INFO->STREAM.
9084 Return TRUE if the instuction matched, FALSE if this is not a
9085 recognised mve instruction. */
9088 print_insn_mve (struct disassemble_info
*info
, long given
)
9090 const struct mopcode32
*insn
;
9091 void *stream
= info
->stream
;
9092 fprintf_ftype func
= info
->fprintf_func
;
9094 for (insn
= mve_opcodes
; insn
->assembler
; insn
++)
9096 if (((given
& insn
->mask
) == insn
->value
)
9097 && !is_mve_encoding_conflict (given
, insn
->mve_op
))
9099 signed long value_in_comment
= 0;
9100 bfd_boolean is_unpredictable
= FALSE
;
9101 bfd_boolean is_undefined
= FALSE
;
9103 enum mve_unpredictable unpredictable_cond
= UNPRED_NONE
;
9104 enum mve_undefined undefined_cond
= UNDEF_NONE
;
9106 /* Most vector mve instruction are illegal in a it block.
9107 There are a few exceptions; check for them. */
9108 if (ifthen_state
&& !is_mve_okay_in_it (insn
->mve_op
))
9110 is_unpredictable
= TRUE
;
9111 unpredictable_cond
= UNPRED_IT_BLOCK
;
9113 else if (is_mve_unpredictable (given
, insn
->mve_op
,
9114 &unpredictable_cond
))
9115 is_unpredictable
= TRUE
;
9117 if (is_mve_undefined (given
, insn
->mve_op
, &undefined_cond
))
9118 is_undefined
= TRUE
;
9120 for (c
= insn
->assembler
; *c
; c
++)
9127 func (stream
, "%%");
9131 /* Don't print anything for '+' as it is implied. */
9132 if (arm_decode_field (given
, 23, 23) == 0)
9138 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
9142 print_mve_vld_str_addr (info
, given
, insn
->mve_op
);
9147 long mve_mask
= mve_extract_pred_mask (given
);
9148 func (stream
, "%s", mve_predicatenames
[mve_mask
]);
9154 unsigned int imm5
= 0;
9155 imm5
|= arm_decode_field (given
, 6, 7);
9156 imm5
|= (arm_decode_field (given
, 12, 14) << 2);
9157 func (stream
, "#%u", (imm5
== 0) ? 32 : imm5
);
9162 print_vec_condition (info
, given
, insn
->mve_op
);
9166 if (arm_decode_field (given
, 0, 0) == 1)
9169 = arm_decode_field (given
, 4, 4)
9170 | (arm_decode_field (given
, 6, 6) << 1);
9172 func (stream
, ", uxtw #%lu", size
);
9177 print_mve_rounding_mode (info
, given
, insn
->mve_op
);
9181 print_mve_vcvt_size (info
, given
, insn
->mve_op
);
9186 unsigned long op1
= arm_decode_field (given
, 21, 22);
9188 if ((insn
->mve_op
== MVE_VMOV_VEC_LANE_TO_GP
))
9190 /* Check for signed. */
9191 if (arm_decode_field (given
, 23, 23) == 0)
9193 /* We don't print 's' for S32. */
9194 if ((arm_decode_field (given
, 5, 6) == 0)
9195 && ((op1
== 0) || (op1
== 1)))
9205 if (arm_decode_field (given
, 28, 28) == 0)
9214 print_instruction_predicate (info
);
9218 if (arm_decode_field (given
, 21, 21) == 1)
9223 print_mve_register_blocks (info
, given
, insn
->mve_op
);
9227 /* SIMD encoded constant for mov, mvn, vorr, vbic. */
9229 print_simd_imm8 (info
, given
, 28, insn
);
9233 print_mve_vmov_index (info
, given
);
9237 if (arm_decode_field (given
, 12, 12) == 0)
9244 if (arm_decode_field (given
, 12, 12) == 1)
9248 case '0': case '1': case '2': case '3': case '4':
9249 case '5': case '6': case '7': case '8': case '9':
9252 unsigned long value
;
9254 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9260 is_unpredictable
= TRUE
;
9261 else if (value
== 15)
9262 func (stream
, "zr");
9264 func (stream
, "%s", arm_regnames
[value
]);
9268 if (value
== 13 || value
== 15)
9269 is_unpredictable
= TRUE
;
9271 func (stream
, "%s", arm_regnames
[value
]);
9275 print_mve_size (info
,
9289 unsigned int odd_reg
= (value
<< 1) | 1;
9290 func (stream
, "%s", arm_regnames
[odd_reg
]);
9296 = arm_decode_field (given
, 0, 6);
9297 unsigned long mod_imm
= imm
;
9299 switch (insn
->mve_op
)
9301 case MVE_VLDRW_GATHER_T5
:
9302 case MVE_VSTRW_SCATTER_T5
:
9303 mod_imm
= mod_imm
<< 2;
9305 case MVE_VSTRD_SCATTER_T6
:
9306 case MVE_VLDRD_GATHER_T6
:
9307 mod_imm
= mod_imm
<< 3;
9314 func (stream
, "%lu", mod_imm
);
9318 func (stream
, "%lu", 64 - value
);
9322 unsigned int even_reg
= value
<< 1;
9323 func (stream
, "%s", arm_regnames
[even_reg
]);
9346 print_mve_rotate (info
, value
, width
);
9349 func (stream
, "%s", arm_regnames
[value
]);
9352 if (insn
->mve_op
== MVE_VQSHL_T2
9353 || insn
->mve_op
== MVE_VQSHLU_T3
9354 || insn
->mve_op
== MVE_VRSHR
9355 || insn
->mve_op
== MVE_VRSHRN
9356 || insn
->mve_op
== MVE_VSHL_T1
9357 || insn
->mve_op
== MVE_VSHLL_T1
9358 || insn
->mve_op
== MVE_VSHR
9359 || insn
->mve_op
== MVE_VSHRN
9360 || insn
->mve_op
== MVE_VSLI
9361 || insn
->mve_op
== MVE_VSRI
)
9362 print_mve_shift_n (info
, given
, insn
->mve_op
);
9363 else if (insn
->mve_op
== MVE_VSHLL_T2
)
9371 func (stream
, "16");
9374 print_mve_undefined (info
, UNDEF_SIZE_0
);
9383 if (insn
->mve_op
== MVE_VSHLC
&& value
== 0)
9385 func (stream
, "%ld", value
);
9386 value_in_comment
= value
;
9390 func (stream
, "s%ld", value
);
9394 func (stream
, "<illegal reg q%ld.5>", value
);
9396 func (stream
, "q%ld", value
);
9399 func (stream
, "0x%08lx", value
);
9411 func (stream
, "%c", *c
);
9414 if (value_in_comment
> 32 || value_in_comment
< -16)
9415 func (stream
, "\t; 0x%lx", value_in_comment
);
9417 if (is_unpredictable
)
9418 print_mve_unpredictable (info
, unpredictable_cond
);
9421 print_mve_undefined (info
, undefined_cond
);
9423 if ((vpt_block_state
.in_vpt_block
== FALSE
)
9425 && (is_vpt_instruction (given
) == TRUE
))
9426 mark_inside_vpt_block (given
);
9427 else if (vpt_block_state
.in_vpt_block
== TRUE
)
9428 update_vpt_block_state ();
9437 /* Return the name of a v7A special register. */
9440 banked_regname (unsigned reg
)
9444 case 15: return "CPSR";
9445 case 32: return "R8_usr";
9446 case 33: return "R9_usr";
9447 case 34: return "R10_usr";
9448 case 35: return "R11_usr";
9449 case 36: return "R12_usr";
9450 case 37: return "SP_usr";
9451 case 38: return "LR_usr";
9452 case 40: return "R8_fiq";
9453 case 41: return "R9_fiq";
9454 case 42: return "R10_fiq";
9455 case 43: return "R11_fiq";
9456 case 44: return "R12_fiq";
9457 case 45: return "SP_fiq";
9458 case 46: return "LR_fiq";
9459 case 48: return "LR_irq";
9460 case 49: return "SP_irq";
9461 case 50: return "LR_svc";
9462 case 51: return "SP_svc";
9463 case 52: return "LR_abt";
9464 case 53: return "SP_abt";
9465 case 54: return "LR_und";
9466 case 55: return "SP_und";
9467 case 60: return "LR_mon";
9468 case 61: return "SP_mon";
9469 case 62: return "ELR_hyp";
9470 case 63: return "SP_hyp";
9471 case 79: return "SPSR";
9472 case 110: return "SPSR_fiq";
9473 case 112: return "SPSR_irq";
9474 case 114: return "SPSR_svc";
9475 case 116: return "SPSR_abt";
9476 case 118: return "SPSR_und";
9477 case 124: return "SPSR_mon";
9478 case 126: return "SPSR_hyp";
9479 default: return NULL
;
9483 /* Return the name of the DMB/DSB option. */
9485 data_barrier_option (unsigned option
)
9487 switch (option
& 0xf)
9489 case 0xf: return "sy";
9490 case 0xe: return "st";
9491 case 0xd: return "ld";
9492 case 0xb: return "ish";
9493 case 0xa: return "ishst";
9494 case 0x9: return "ishld";
9495 case 0x7: return "un";
9496 case 0x6: return "unst";
9497 case 0x5: return "nshld";
9498 case 0x3: return "osh";
9499 case 0x2: return "oshst";
9500 case 0x1: return "oshld";
9501 default: return NULL
;
9505 /* Print one ARM instruction from PC on INFO->STREAM. */
9508 print_insn_arm (bfd_vma pc
, struct disassemble_info
*info
, long given
)
9510 const struct opcode32
*insn
;
9511 void *stream
= info
->stream
;
9512 fprintf_ftype func
= info
->fprintf_func
;
9513 struct arm_private_data
*private_data
= info
->private_data
;
9515 if (print_insn_coprocessor (pc
, info
, given
, FALSE
))
9518 if (print_insn_neon (info
, given
, FALSE
))
9521 for (insn
= arm_opcodes
; insn
->assembler
; insn
++)
9523 if ((given
& insn
->mask
) != insn
->value
)
9526 if (! ARM_CPU_HAS_FEATURE (insn
->arch
, private_data
->features
))
9529 /* Special case: an instruction with all bits set in the condition field
9530 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
9531 or by the catchall at the end of the table. */
9532 if ((given
& 0xF0000000) != 0xF0000000
9533 || (insn
->mask
& 0xF0000000) == 0xF0000000
9534 || (insn
->mask
== 0 && insn
->value
== 0))
9536 unsigned long u_reg
= 16;
9537 unsigned long U_reg
= 16;
9538 bfd_boolean is_unpredictable
= FALSE
;
9539 signed long value_in_comment
= 0;
9542 for (c
= insn
->assembler
; *c
; c
++)
9546 bfd_boolean allow_unpredictable
= FALSE
;
9551 func (stream
, "%%");
9555 value_in_comment
= print_arm_address (pc
, info
, given
);
9559 /* Set P address bit and use normal address
9560 printing routine. */
9561 value_in_comment
= print_arm_address (pc
, info
, given
| (1 << P_BIT
));
9565 allow_unpredictable
= TRUE
;
9568 if ((given
& 0x004f0000) == 0x004f0000)
9570 /* PC relative with immediate offset. */
9571 bfd_vma offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9575 /* Elide positive zero offset. */
9576 if (offset
|| NEGATIVE_BIT_SET
)
9577 func (stream
, "[pc, #%s%d]\t; ",
9578 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9580 func (stream
, "[pc]\t; ");
9581 if (NEGATIVE_BIT_SET
)
9583 info
->print_address_func (offset
+ pc
+ 8, info
);
9587 /* Always show the offset. */
9588 func (stream
, "[pc], #%s%d",
9589 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
9590 if (! allow_unpredictable
)
9591 is_unpredictable
= TRUE
;
9596 int offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
9598 func (stream
, "[%s",
9599 arm_regnames
[(given
>> 16) & 0xf]);
9603 if (IMMEDIATE_BIT_SET
)
9605 /* Elide offset for non-writeback
9607 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
9609 func (stream
, ", #%s%d",
9610 NEGATIVE_BIT_SET
? "-" : "", offset
);
9612 if (NEGATIVE_BIT_SET
)
9615 value_in_comment
= offset
;
9619 /* Register Offset or Register Pre-Indexed. */
9620 func (stream
, ", %s%s",
9621 NEGATIVE_BIT_SET
? "-" : "",
9622 arm_regnames
[given
& 0xf]);
9624 /* Writing back to the register that is the source/
9625 destination of the load/store is unpredictable. */
9626 if (! allow_unpredictable
9627 && WRITEBACK_BIT_SET
9628 && ((given
& 0xf) == ((given
>> 12) & 0xf)))
9629 is_unpredictable
= TRUE
;
9632 func (stream
, "]%s",
9633 WRITEBACK_BIT_SET
? "!" : "");
9637 if (IMMEDIATE_BIT_SET
)
9639 /* Immediate Post-indexed. */
9640 /* PR 10924: Offset must be printed, even if it is zero. */
9641 func (stream
, "], #%s%d",
9642 NEGATIVE_BIT_SET
? "-" : "", offset
);
9643 if (NEGATIVE_BIT_SET
)
9645 value_in_comment
= offset
;
9649 /* Register Post-indexed. */
9650 func (stream
, "], %s%s",
9651 NEGATIVE_BIT_SET
? "-" : "",
9652 arm_regnames
[given
& 0xf]);
9654 /* Writing back to the register that is the source/
9655 destination of the load/store is unpredictable. */
9656 if (! allow_unpredictable
9657 && (given
& 0xf) == ((given
>> 12) & 0xf))
9658 is_unpredictable
= TRUE
;
9661 if (! allow_unpredictable
)
9663 /* Writeback is automatically implied by post- addressing.
9664 Setting the W bit is unnecessary and ARM specify it as
9665 being unpredictable. */
9666 if (WRITEBACK_BIT_SET
9667 /* Specifying the PC register as the post-indexed
9668 registers is also unpredictable. */
9669 || (! IMMEDIATE_BIT_SET
&& ((given
& 0xf) == 0xf)))
9670 is_unpredictable
= TRUE
;
9678 bfd_vma disp
= (((given
& 0xffffff) ^ 0x800000) - 0x800000);
9679 info
->print_address_func (disp
* 4 + pc
+ 8, info
);
9684 if (((given
>> 28) & 0xf) != 0xe)
9686 arm_conditional
[(given
>> 28) & 0xf]);
9695 for (reg
= 0; reg
< 16; reg
++)
9696 if ((given
& (1 << reg
)) != 0)
9699 func (stream
, ", ");
9701 func (stream
, "%s", arm_regnames
[reg
]);
9705 is_unpredictable
= TRUE
;
9710 arm_decode_shift (given
, func
, stream
, FALSE
);
9714 if ((given
& 0x02000000) != 0)
9716 unsigned int rotate
= (given
& 0xf00) >> 7;
9717 unsigned int immed
= (given
& 0xff);
9720 a
= (((immed
<< (32 - rotate
))
9721 | (immed
>> rotate
)) & 0xffffffff);
9722 /* If there is another encoding with smaller rotate,
9723 the rotate should be specified directly. */
9724 for (i
= 0; i
< 32; i
+= 2)
9725 if ((a
<< i
| a
>> (32 - i
)) <= 0xff)
9729 func (stream
, "#%d, %d", immed
, rotate
);
9731 func (stream
, "#%d", a
);
9732 value_in_comment
= a
;
9735 arm_decode_shift (given
, func
, stream
, TRUE
);
9739 if ((given
& 0x0000f000) == 0x0000f000)
9741 arm_feature_set arm_ext_v6
=
9742 ARM_FEATURE_CORE_LOW (ARM_EXT_V6
);
9744 /* The p-variants of tst/cmp/cmn/teq are the pre-V6
9745 mechanism for setting PSR flag bits. They are
9746 obsolete in V6 onwards. */
9747 if (! ARM_CPU_HAS_FEATURE (private_data
->features
, \
9751 is_unpredictable
= TRUE
;
9756 if ((given
& 0x01200000) == 0x00200000)
9762 int offset
= given
& 0xff;
9764 value_in_comment
= offset
* 4;
9765 if (NEGATIVE_BIT_SET
)
9766 value_in_comment
= - value_in_comment
;
9768 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
9773 func (stream
, ", #%d]%s",
9774 (int) value_in_comment
,
9775 WRITEBACK_BIT_SET
? "!" : "");
9783 if (WRITEBACK_BIT_SET
)
9786 func (stream
, ", #%d", (int) value_in_comment
);
9790 func (stream
, ", {%d}", (int) offset
);
9791 value_in_comment
= offset
;
9798 /* Print ARM V5 BLX(1) address: pc+25 bits. */
9803 if (! NEGATIVE_BIT_SET
)
9804 /* Is signed, hi bits should be ones. */
9805 offset
= (-1) ^ 0x00ffffff;
9807 /* Offset is (SignExtend(offset field)<<2). */
9808 offset
+= given
& 0x00ffffff;
9810 address
= offset
+ pc
+ 8;
9812 if (given
& 0x01000000)
9813 /* H bit allows addressing to 2-byte boundaries. */
9816 info
->print_address_func (address
, info
);
9821 if ((given
& 0x02000200) == 0x200)
9824 unsigned sysm
= (given
& 0x004f0000) >> 16;
9826 sysm
|= (given
& 0x300) >> 4;
9827 name
= banked_regname (sysm
);
9830 func (stream
, "%s", name
);
9832 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
9836 func (stream
, "%cPSR_",
9837 (given
& 0x00400000) ? 'S' : 'C');
9838 if (given
& 0x80000)
9840 if (given
& 0x40000)
9842 if (given
& 0x20000)
9844 if (given
& 0x10000)
9850 if ((given
& 0xf0) == 0x60)
9852 switch (given
& 0xf)
9854 case 0xf: func (stream
, "sy"); break;
9856 func (stream
, "#%d", (int) given
& 0xf);
9862 const char * opt
= data_barrier_option (given
& 0xf);
9864 func (stream
, "%s", opt
);
9866 func (stream
, "#%d", (int) given
& 0xf);
9870 case '0': case '1': case '2': case '3': case '4':
9871 case '5': case '6': case '7': case '8': case '9':
9874 unsigned long value
;
9876 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
9882 is_unpredictable
= TRUE
;
9886 /* We want register + 1 when decoding T. */
9892 /* Eat the 'u' character. */
9896 is_unpredictable
= TRUE
;
9901 /* Eat the 'U' character. */
9905 is_unpredictable
= TRUE
;
9908 func (stream
, "%s", arm_regnames
[value
]);
9911 func (stream
, "%ld", value
);
9912 value_in_comment
= value
;
9915 func (stream
, "%ld", value
* 8);
9916 value_in_comment
= value
* 8;
9919 func (stream
, "%ld", value
+ 1);
9920 value_in_comment
= value
+ 1;
9923 func (stream
, "0x%08lx", value
);
9925 /* Some SWI instructions have special
9927 if ((given
& 0x0fffffff) == 0x0FF00000)
9928 func (stream
, "\t; IMB");
9929 else if ((given
& 0x0fffffff) == 0x0FF00001)
9930 func (stream
, "\t; IMBRange");
9933 func (stream
, "%01lx", value
& 0xf);
9934 value_in_comment
= value
;
9939 func (stream
, "%c", *c
);
9943 if (value
== ((1ul << width
) - 1))
9944 func (stream
, "%c", *c
);
9947 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
9960 imm
= (given
& 0xf) | ((given
& 0xfff00) >> 4);
9961 func (stream
, "%d", imm
);
9962 value_in_comment
= imm
;
9967 /* LSB and WIDTH fields of BFI or BFC. The machine-
9968 language instruction encodes LSB and MSB. */
9970 long msb
= (given
& 0x001f0000) >> 16;
9971 long lsb
= (given
& 0x00000f80) >> 7;
9972 long w
= msb
- lsb
+ 1;
9975 func (stream
, "#%lu, #%lu", lsb
, w
);
9977 func (stream
, "(invalid: %lu:%lu)", lsb
, msb
);
9982 /* Get the PSR/banked register name. */
9985 unsigned sysm
= (given
& 0x004f0000) >> 16;
9987 sysm
|= (given
& 0x300) >> 4;
9988 name
= banked_regname (sysm
);
9991 func (stream
, "%s", name
);
9993 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
9998 /* 16-bit unsigned immediate from a MOVT or MOVW
9999 instruction, encoded in bits 0:11 and 15:19. */
10001 long hi
= (given
& 0x000f0000) >> 4;
10002 long lo
= (given
& 0x00000fff);
10003 long imm16
= hi
| lo
;
10005 func (stream
, "#%lu", imm16
);
10006 value_in_comment
= imm16
;
10015 func (stream
, "%c", *c
);
10018 if (value_in_comment
> 32 || value_in_comment
< -16)
10019 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
10021 if (is_unpredictable
)
10022 func (stream
, UNPREDICTABLE_INSTRUCTION
);
10027 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
10031 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
10034 print_insn_thumb16 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
10036 const struct opcode16
*insn
;
10037 void *stream
= info
->stream
;
10038 fprintf_ftype func
= info
->fprintf_func
;
10040 for (insn
= thumb_opcodes
; insn
->assembler
; insn
++)
10041 if ((given
& insn
->mask
) == insn
->value
)
10043 signed long value_in_comment
= 0;
10044 const char *c
= insn
->assembler
;
10053 func (stream
, "%c", *c
);
10060 func (stream
, "%%");
10065 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10070 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10072 func (stream
, "s");
10079 ifthen_next_state
= given
& 0xff;
10080 for (tmp
= given
<< 1; tmp
& 0xf; tmp
<<= 1)
10081 func (stream
, ((given
^ tmp
) & 0x10) ? "e" : "t");
10082 func (stream
, "\t%s", arm_conditional
[(given
>> 4) & 0xf]);
10087 if (ifthen_next_state
)
10088 func (stream
, "\t; unpredictable branch in IT block\n");
10093 func (stream
, "\t; unpredictable <IT:%s>",
10094 arm_conditional
[IFTHEN_COND
]);
10101 reg
= (given
>> 3) & 0x7;
10102 if (given
& (1 << 6))
10105 func (stream
, "%s", arm_regnames
[reg
]);
10114 if (given
& (1 << 7))
10117 func (stream
, "%s", arm_regnames
[reg
]);
10122 if (given
& (1 << 8))
10124 /* Fall through. */
10126 if (*c
== 'O' && (given
& (1 << 8)))
10128 /* Fall through. */
10134 func (stream
, "{");
10136 /* It would be nice if we could spot
10137 ranges, and generate the rS-rE format: */
10138 for (reg
= 0; (reg
< 8); reg
++)
10139 if ((given
& (1 << reg
)) != 0)
10142 func (stream
, ", ");
10144 func (stream
, "%s", arm_regnames
[reg
]);
10150 func (stream
, ", ");
10152 func (stream
, "%s", arm_regnames
[14] /* "lr" */);
10158 func (stream
, ", ");
10159 func (stream
, "%s", arm_regnames
[15] /* "pc" */);
10162 func (stream
, "}");
10167 /* Print writeback indicator for a LDMIA. We are doing a
10168 writeback if the base register is not in the register
10170 if ((given
& (1 << ((given
& 0x0700) >> 8))) == 0)
10171 func (stream
, "!");
10175 /* Print ARM V6T2 CZB address: pc+4+6 bits. */
10177 bfd_vma address
= (pc
+ 4
10178 + ((given
& 0x00f8) >> 2)
10179 + ((given
& 0x0200) >> 3));
10180 info
->print_address_func (address
, info
);
10185 /* Right shift immediate -- bits 6..10; 1-31 print
10186 as themselves, 0 prints as 32. */
10188 long imm
= (given
& 0x07c0) >> 6;
10191 func (stream
, "#%ld", imm
);
10195 case '0': case '1': case '2': case '3': case '4':
10196 case '5': case '6': case '7': case '8': case '9':
10198 int bitstart
= *c
++ - '0';
10201 while (*c
>= '0' && *c
<= '9')
10202 bitstart
= (bitstart
* 10) + *c
++ - '0';
10211 while (*c
>= '0' && *c
<= '9')
10212 bitend
= (bitend
* 10) + *c
++ - '0';
10215 reg
= given
>> bitstart
;
10216 reg
&= (2 << (bitend
- bitstart
)) - 1;
10221 func (stream
, "%s", arm_regnames
[reg
]);
10225 func (stream
, "%ld", (long) reg
);
10226 value_in_comment
= reg
;
10230 func (stream
, "%ld", (long) (reg
<< 1));
10231 value_in_comment
= reg
<< 1;
10235 func (stream
, "%ld", (long) (reg
<< 2));
10236 value_in_comment
= reg
<< 2;
10240 /* PC-relative address -- the bottom two
10241 bits of the address are dropped
10242 before the calculation. */
10243 info
->print_address_func
10244 (((pc
+ 4) & ~3) + (reg
<< 2), info
);
10245 value_in_comment
= 0;
10249 func (stream
, "0x%04lx", (long) reg
);
10253 reg
= ((reg
^ (1 << bitend
)) - (1 << bitend
));
10254 info
->print_address_func (reg
* 2 + pc
+ 4, info
);
10255 value_in_comment
= 0;
10259 func (stream
, "%s", arm_conditional
[reg
]);
10270 if ((given
& (1 << bitstart
)) != 0)
10271 func (stream
, "%c", *c
);
10276 if ((given
& (1 << bitstart
)) != 0)
10277 func (stream
, "%c", *c
++);
10279 func (stream
, "%c", *++c
);
10293 if (value_in_comment
> 32 || value_in_comment
< -16)
10294 func (stream
, "\t; 0x%lx", value_in_comment
);
10299 func (stream
, UNKNOWN_INSTRUCTION_16BIT
, (unsigned)given
);
10303 /* Return the name of an V7M special register. */
10305 static const char *
10306 psr_name (int regno
)
10310 case 0x0: return "APSR";
10311 case 0x1: return "IAPSR";
10312 case 0x2: return "EAPSR";
10313 case 0x3: return "PSR";
10314 case 0x5: return "IPSR";
10315 case 0x6: return "EPSR";
10316 case 0x7: return "IEPSR";
10317 case 0x8: return "MSP";
10318 case 0x9: return "PSP";
10319 case 0xa: return "MSPLIM";
10320 case 0xb: return "PSPLIM";
10321 case 0x10: return "PRIMASK";
10322 case 0x11: return "BASEPRI";
10323 case 0x12: return "BASEPRI_MAX";
10324 case 0x13: return "FAULTMASK";
10325 case 0x14: return "CONTROL";
10326 case 0x88: return "MSP_NS";
10327 case 0x89: return "PSP_NS";
10328 case 0x8a: return "MSPLIM_NS";
10329 case 0x8b: return "PSPLIM_NS";
10330 case 0x90: return "PRIMASK_NS";
10331 case 0x91: return "BASEPRI_NS";
10332 case 0x93: return "FAULTMASK_NS";
10333 case 0x94: return "CONTROL_NS";
10334 case 0x98: return "SP_NS";
10335 default: return "<unknown>";
10339 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
10342 print_insn_thumb32 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
10344 const struct opcode32
*insn
;
10345 void *stream
= info
->stream
;
10346 fprintf_ftype func
= info
->fprintf_func
;
10347 bfd_boolean is_mve
= is_mve_architecture (info
);
10349 if (print_insn_coprocessor (pc
, info
, given
, TRUE
))
10352 if ((is_mve
== FALSE
) && print_insn_neon (info
, given
, TRUE
))
10355 if (is_mve
&& print_insn_mve (info
, given
))
10358 for (insn
= thumb32_opcodes
; insn
->assembler
; insn
++)
10359 if ((given
& insn
->mask
) == insn
->value
)
10361 bfd_boolean is_clrm
= FALSE
;
10362 bfd_boolean is_unpredictable
= FALSE
;
10363 signed long value_in_comment
= 0;
10364 const char *c
= insn
->assembler
;
10370 func (stream
, "%c", *c
);
10377 func (stream
, "%%");
10382 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
10386 if (ifthen_next_state
)
10387 func (stream
, "\t; unpredictable branch in IT block\n");
10392 func (stream
, "\t; unpredictable <IT:%s>",
10393 arm_conditional
[IFTHEN_COND
]);
10398 unsigned int imm12
= 0;
10400 imm12
|= (given
& 0x000000ffu
);
10401 imm12
|= (given
& 0x00007000u
) >> 4;
10402 imm12
|= (given
& 0x04000000u
) >> 15;
10403 func (stream
, "#%u", imm12
);
10404 value_in_comment
= imm12
;
10410 unsigned int bits
= 0, imm
, imm8
, mod
;
10412 bits
|= (given
& 0x000000ffu
);
10413 bits
|= (given
& 0x00007000u
) >> 4;
10414 bits
|= (given
& 0x04000000u
) >> 15;
10415 imm8
= (bits
& 0x0ff);
10416 mod
= (bits
& 0xf00) >> 8;
10419 case 0: imm
= imm8
; break;
10420 case 1: imm
= ((imm8
<< 16) | imm8
); break;
10421 case 2: imm
= ((imm8
<< 24) | (imm8
<< 8)); break;
10422 case 3: imm
= ((imm8
<< 24) | (imm8
<< 16) | (imm8
<< 8) | imm8
); break;
10424 mod
= (bits
& 0xf80) >> 7;
10425 imm8
= (bits
& 0x07f) | 0x80;
10426 imm
= (((imm8
<< (32 - mod
)) | (imm8
>> mod
)) & 0xffffffff);
10428 func (stream
, "#%u", imm
);
10429 value_in_comment
= imm
;
10435 unsigned int imm
= 0;
10437 imm
|= (given
& 0x000000ffu
);
10438 imm
|= (given
& 0x00007000u
) >> 4;
10439 imm
|= (given
& 0x04000000u
) >> 15;
10440 imm
|= (given
& 0x000f0000u
) >> 4;
10441 func (stream
, "#%u", imm
);
10442 value_in_comment
= imm
;
10448 unsigned int imm
= 0;
10450 imm
|= (given
& 0x000f0000u
) >> 16;
10451 imm
|= (given
& 0x00000ff0u
) >> 0;
10452 imm
|= (given
& 0x0000000fu
) << 12;
10453 func (stream
, "#%u", imm
);
10454 value_in_comment
= imm
;
10460 unsigned int imm
= 0;
10462 imm
|= (given
& 0x000f0000u
) >> 4;
10463 imm
|= (given
& 0x00000fffu
) >> 0;
10464 func (stream
, "#%u", imm
);
10465 value_in_comment
= imm
;
10471 unsigned int imm
= 0;
10473 imm
|= (given
& 0x00000fffu
);
10474 imm
|= (given
& 0x000f0000u
) >> 4;
10475 func (stream
, "#%u", imm
);
10476 value_in_comment
= imm
;
10482 unsigned int reg
= (given
& 0x0000000fu
);
10483 unsigned int stp
= (given
& 0x00000030u
) >> 4;
10484 unsigned int imm
= 0;
10485 imm
|= (given
& 0x000000c0u
) >> 6;
10486 imm
|= (given
& 0x00007000u
) >> 10;
10488 func (stream
, "%s", arm_regnames
[reg
]);
10493 func (stream
, ", lsl #%u", imm
);
10499 func (stream
, ", lsr #%u", imm
);
10505 func (stream
, ", asr #%u", imm
);
10510 func (stream
, ", rrx");
10512 func (stream
, ", ror #%u", imm
);
10519 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10520 unsigned int U
= ! NEGATIVE_BIT_SET
;
10521 unsigned int op
= (given
& 0x00000f00) >> 8;
10522 unsigned int i12
= (given
& 0x00000fff);
10523 unsigned int i8
= (given
& 0x000000ff);
10524 bfd_boolean writeback
= FALSE
, postind
= FALSE
;
10525 bfd_vma offset
= 0;
10527 func (stream
, "[%s", arm_regnames
[Rn
]);
10528 if (U
) /* 12-bit positive immediate offset. */
10532 value_in_comment
= offset
;
10534 else if (Rn
== 15) /* 12-bit negative immediate offset. */
10535 offset
= - (int) i12
;
10536 else if (op
== 0x0) /* Shifted register offset. */
10538 unsigned int Rm
= (i8
& 0x0f);
10539 unsigned int sh
= (i8
& 0x30) >> 4;
10541 func (stream
, ", %s", arm_regnames
[Rm
]);
10543 func (stream
, ", lsl #%u", sh
);
10544 func (stream
, "]");
10549 case 0xE: /* 8-bit positive immediate offset. */
10553 case 0xC: /* 8-bit negative immediate offset. */
10557 case 0xF: /* 8-bit + preindex with wb. */
10562 case 0xD: /* 8-bit - preindex with wb. */
10567 case 0xB: /* 8-bit + postindex. */
10572 case 0x9: /* 8-bit - postindex. */
10578 func (stream
, ", <undefined>]");
10583 func (stream
, "], #%d", (int) offset
);
10587 func (stream
, ", #%d", (int) offset
);
10588 func (stream
, writeback
? "]!" : "]");
10593 func (stream
, "\t; ");
10594 info
->print_address_func (((pc
+ 4) & ~3) + offset
, info
);
10602 unsigned int U
= ! NEGATIVE_BIT_SET
;
10603 unsigned int W
= WRITEBACK_BIT_SET
;
10604 unsigned int Rn
= (given
& 0x000f0000) >> 16;
10605 unsigned int off
= (given
& 0x000000ff);
10607 func (stream
, "[%s", arm_regnames
[Rn
]);
10613 func (stream
, ", #%c%u", U
? '+' : '-', off
* 4);
10614 value_in_comment
= off
* 4 * (U
? 1 : -1);
10616 func (stream
, "]");
10618 func (stream
, "!");
10622 func (stream
, "], ");
10625 func (stream
, "#%c%u", U
? '+' : '-', off
* 4);
10626 value_in_comment
= off
* 4 * (U
? 1 : -1);
10630 func (stream
, "{%u}", off
);
10631 value_in_comment
= off
;
10639 unsigned int Sbit
= (given
& 0x01000000) >> 24;
10640 unsigned int type
= (given
& 0x00600000) >> 21;
10644 case 0: func (stream
, Sbit
? "sb" : "b"); break;
10645 case 1: func (stream
, Sbit
? "sh" : "h"); break;
10648 func (stream
, "??");
10651 func (stream
, "??");
10659 /* Fall through. */
10665 func (stream
, "{");
10666 for (reg
= 0; reg
< 16; reg
++)
10667 if ((given
& (1 << reg
)) != 0)
10670 func (stream
, ", ");
10672 if (is_clrm
&& reg
== 13)
10673 func (stream
, "(invalid: %s)", arm_regnames
[reg
]);
10674 else if (is_clrm
&& reg
== 15)
10675 func (stream
, "%s", "APSR");
10677 func (stream
, "%s", arm_regnames
[reg
]);
10679 func (stream
, "}");
10685 unsigned int msb
= (given
& 0x0000001f);
10686 unsigned int lsb
= 0;
10688 lsb
|= (given
& 0x000000c0u
) >> 6;
10689 lsb
|= (given
& 0x00007000u
) >> 10;
10690 func (stream
, "#%u, #%u", lsb
, msb
- lsb
+ 1);
10696 unsigned int width
= (given
& 0x0000001f) + 1;
10697 unsigned int lsb
= 0;
10699 lsb
|= (given
& 0x000000c0u
) >> 6;
10700 lsb
|= (given
& 0x00007000u
) >> 10;
10701 func (stream
, "#%u, #%u", lsb
, width
);
10707 unsigned int boff
= (((given
& 0x07800000) >> 23) << 1);
10708 func (stream
, "%x", boff
);
10714 unsigned int immA
= (given
& 0x001f0000u
) >> 16;
10715 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10716 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10717 bfd_vma offset
= 0;
10719 offset
|= immA
<< 12;
10720 offset
|= immB
<< 2;
10721 offset
|= immC
<< 1;
10723 offset
= (offset
& 0x10000) ? offset
- (1 << 17) : offset
;
10725 info
->print_address_func (pc
+ 4 + offset
, info
);
10731 unsigned int immA
= (given
& 0x007f0000u
) >> 16;
10732 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10733 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10734 bfd_vma offset
= 0;
10736 offset
|= immA
<< 12;
10737 offset
|= immB
<< 2;
10738 offset
|= immC
<< 1;
10740 offset
= (offset
& 0x40000) ? offset
- (1 << 19) : offset
;
10742 info
->print_address_func (pc
+ 4 + offset
, info
);
10748 unsigned int immA
= (given
& 0x00010000u
) >> 16;
10749 unsigned int immB
= (given
& 0x000007feu
) >> 1;
10750 unsigned int immC
= (given
& 0x00000800u
) >> 11;
10751 bfd_vma offset
= 0;
10753 offset
|= immA
<< 12;
10754 offset
|= immB
<< 2;
10755 offset
|= immC
<< 1;
10757 offset
= (offset
& 0x1000) ? offset
- (1 << 13) : offset
;
10759 info
->print_address_func (pc
+ 4 + offset
, info
);
10761 unsigned int T
= (given
& 0x00020000u
) >> 17;
10762 unsigned int endoffset
= (((given
& 0x07800000) >> 23) << 1);
10763 unsigned int boffset
= (T
== 1) ? 4 : 2;
10764 func (stream
, ", ");
10765 func (stream
, "%x", endoffset
+ boffset
);
10771 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10772 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10775 imm32
|= immh
<< 2;
10776 imm32
|= imml
<< 1;
10778 info
->print_address_func (pc
+ 4 + imm32
, info
);
10784 unsigned int immh
= (given
& 0x000007feu
) >> 1;
10785 unsigned int imml
= (given
& 0x00000800u
) >> 11;
10788 imm32
|= immh
<< 2;
10789 imm32
|= imml
<< 1;
10791 info
->print_address_func (pc
+ 4 - imm32
, info
);
10797 unsigned int S
= (given
& 0x04000000u
) >> 26;
10798 unsigned int J1
= (given
& 0x00002000u
) >> 13;
10799 unsigned int J2
= (given
& 0x00000800u
) >> 11;
10800 bfd_vma offset
= 0;
10802 offset
|= !S
<< 20;
10803 offset
|= J2
<< 19;
10804 offset
|= J1
<< 18;
10805 offset
|= (given
& 0x003f0000) >> 4;
10806 offset
|= (given
& 0x000007ff) << 1;
10807 offset
-= (1 << 20);
10809 info
->print_address_func (pc
+ 4 + offset
, info
);
10815 unsigned int S
= (given
& 0x04000000u
) >> 26;
10816 unsigned int I1
= (given
& 0x00002000u
) >> 13;
10817 unsigned int I2
= (given
& 0x00000800u
) >> 11;
10818 bfd_vma offset
= 0;
10820 offset
|= !S
<< 24;
10821 offset
|= !(I1
^ S
) << 23;
10822 offset
|= !(I2
^ S
) << 22;
10823 offset
|= (given
& 0x03ff0000u
) >> 4;
10824 offset
|= (given
& 0x000007ffu
) << 1;
10825 offset
-= (1 << 24);
10828 /* BLX target addresses are always word aligned. */
10829 if ((given
& 0x00001000u
) == 0)
10832 info
->print_address_func (offset
, info
);
10838 unsigned int shift
= 0;
10840 shift
|= (given
& 0x000000c0u
) >> 6;
10841 shift
|= (given
& 0x00007000u
) >> 10;
10842 if (WRITEBACK_BIT_SET
)
10843 func (stream
, ", asr #%u", shift
);
10845 func (stream
, ", lsl #%u", shift
);
10846 /* else print nothing - lsl #0 */
10852 unsigned int rot
= (given
& 0x00000030) >> 4;
10855 func (stream
, ", ror #%u", rot
* 8);
10860 if ((given
& 0xf0) == 0x60)
10862 switch (given
& 0xf)
10864 case 0xf: func (stream
, "sy"); break;
10866 func (stream
, "#%d", (int) given
& 0xf);
10872 const char * opt
= data_barrier_option (given
& 0xf);
10874 func (stream
, "%s", opt
);
10876 func (stream
, "#%d", (int) given
& 0xf);
10881 if ((given
& 0xff) == 0)
10883 func (stream
, "%cPSR_", (given
& 0x100000) ? 'S' : 'C');
10885 func (stream
, "f");
10887 func (stream
, "s");
10889 func (stream
, "x");
10891 func (stream
, "c");
10893 else if ((given
& 0x20) == 0x20)
10896 unsigned sysm
= (given
& 0xf00) >> 8;
10898 sysm
|= (given
& 0x30);
10899 sysm
|= (given
& 0x00100000) >> 14;
10900 name
= banked_regname (sysm
);
10903 func (stream
, "%s", name
);
10905 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
10909 func (stream
, "%s", psr_name (given
& 0xff));
10914 if (((given
& 0xff) == 0)
10915 || ((given
& 0x20) == 0x20))
10918 unsigned sm
= (given
& 0xf0000) >> 16;
10920 sm
|= (given
& 0x30);
10921 sm
|= (given
& 0x00100000) >> 14;
10922 name
= banked_regname (sm
);
10925 func (stream
, "%s", name
);
10927 func (stream
, "(UNDEF: %lu)", (unsigned long) sm
);
10930 func (stream
, "%s", psr_name (given
& 0xff));
10933 case '0': case '1': case '2': case '3': case '4':
10934 case '5': case '6': case '7': case '8': case '9':
10939 c
= arm_decode_bitfield (c
, given
, &val
, &width
);
10945 func (stream
, "%s", mve_vec_sizename
[val
]);
10947 func (stream
, "<undef size>");
10951 func (stream
, "%lu", val
);
10952 value_in_comment
= val
;
10956 func (stream
, "%lu", val
+ 1);
10957 value_in_comment
= val
+ 1;
10961 func (stream
, "%lu", val
* 4);
10962 value_in_comment
= val
* 4;
10967 is_unpredictable
= TRUE
;
10968 /* Fall through. */
10971 is_unpredictable
= TRUE
;
10972 /* Fall through. */
10974 func (stream
, "%s", arm_regnames
[val
]);
10978 func (stream
, "%s", arm_conditional
[val
]);
10983 if (val
== ((1ul << width
) - 1))
10984 func (stream
, "%c", *c
);
10990 func (stream
, "%c", *c
);
10994 func (stream
, "%c", c
[(1 << width
) - (int) val
]);
10999 func (stream
, "0x%lx", val
& 0xffffffffUL
);
11009 /* PR binutils/12534
11010 If we have a PC relative offset in an LDRD or STRD
11011 instructions then display the decoded address. */
11012 if (((given
>> 16) & 0xf) == 0xf)
11014 bfd_vma offset
= (given
& 0xff) * 4;
11016 if ((given
& (1 << 23)) == 0)
11018 func (stream
, "\t; ");
11019 info
->print_address_func ((pc
& ~3) + 4 + offset
, info
);
11028 if (value_in_comment
> 32 || value_in_comment
< -16)
11029 func (stream
, "\t; 0x%lx", value_in_comment
);
11031 if (is_unpredictable
)
11032 func (stream
, UNPREDICTABLE_INSTRUCTION
);
11038 func (stream
, UNKNOWN_INSTRUCTION_32BIT
, (unsigned)given
);
11042 /* Print data bytes on INFO->STREAM. */
11045 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED
,
11046 struct disassemble_info
*info
,
11049 switch (info
->bytes_per_chunk
)
11052 info
->fprintf_func (info
->stream
, ".byte\t0x%02lx", given
);
11055 info
->fprintf_func (info
->stream
, ".short\t0x%04lx", given
);
11058 info
->fprintf_func (info
->stream
, ".word\t0x%08lx", given
);
11065 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
11066 being displayed in symbol relative addresses.
11068 Also disallow private symbol, with __tagsym$$ prefix,
11069 from ARM RVCT toolchain being displayed. */
11072 arm_symbol_is_valid (asymbol
* sym
,
11073 struct disassemble_info
* info ATTRIBUTE_UNUSED
)
11080 name
= bfd_asymbol_name (sym
);
11082 return (name
&& *name
!= '$' && strncmp (name
, "__tagsym$$", 10));
11085 /* Parse the string of disassembler options. */
11088 parse_arm_disassembler_options (const char *options
)
11092 FOR_EACH_DISASSEMBLER_OPTION (opt
, options
)
11094 if (CONST_STRNEQ (opt
, "reg-names-"))
11097 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11098 if (disassembler_options_cmp (opt
, regnames
[i
].name
) == 0)
11100 regname_selected
= i
;
11104 if (i
>= NUM_ARM_OPTIONS
)
11105 /* xgettext: c-format */
11106 opcodes_error_handler (_("unrecognised register name set: %s"),
11109 else if (CONST_STRNEQ (opt
, "force-thumb"))
11111 else if (CONST_STRNEQ (opt
, "no-force-thumb"))
11114 /* xgettext: c-format */
11115 opcodes_error_handler (_("unrecognised disassembler option: %s"), opt
);
11122 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
11123 enum map_type
*map_symbol
);
11125 /* Search back through the insn stream to determine if this instruction is
11126 conditionally executed. */
11129 find_ifthen_state (bfd_vma pc
,
11130 struct disassemble_info
*info
,
11131 bfd_boolean little
)
11133 unsigned char b
[2];
11136 /* COUNT is twice the number of instructions seen. It will be odd if we
11137 just crossed an instruction boundary. */
11140 unsigned int seen_it
;
11143 ifthen_address
= pc
;
11150 /* Scan backwards looking for IT instructions, keeping track of where
11151 instruction boundaries are. We don't know if something is actually an
11152 IT instruction until we find a definite instruction boundary. */
11155 if (addr
== 0 || info
->symbol_at_address_func (addr
, info
))
11157 /* A symbol must be on an instruction boundary, and will not
11158 be within an IT block. */
11159 if (seen_it
&& (count
& 1))
11165 status
= info
->read_memory_func (addr
, (bfd_byte
*) b
, 2, info
);
11170 insn
= (b
[0]) | (b
[1] << 8);
11172 insn
= (b
[1]) | (b
[0] << 8);
11175 if ((insn
& 0xf800) < 0xe800)
11177 /* Addr + 2 is an instruction boundary. See if this matches
11178 the expected boundary based on the position of the last
11185 if ((insn
& 0xff00) == 0xbf00 && (insn
& 0xf) != 0)
11187 enum map_type type
= MAP_ARM
;
11188 bfd_boolean found
= mapping_symbol_for_insn (addr
, info
, &type
);
11190 if (!found
|| (found
&& type
== MAP_THUMB
))
11192 /* This could be an IT instruction. */
11194 it_count
= count
>> 1;
11197 if ((insn
& 0xf800) >= 0xe800)
11200 count
= (count
+ 2) | 1;
11201 /* IT blocks contain at most 4 instructions. */
11202 if (count
>= 8 && !seen_it
)
11205 /* We found an IT instruction. */
11206 ifthen_state
= (seen_it
& 0xe0) | ((seen_it
<< it_count
) & 0x1f);
11207 if ((ifthen_state
& 0xf) == 0)
11211 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
11215 is_mapping_symbol (struct disassemble_info
*info
, int n
,
11216 enum map_type
*map_type
)
11220 name
= bfd_asymbol_name (info
->symtab
[n
]);
11221 if (name
[0] == '$' && (name
[1] == 'a' || name
[1] == 't' || name
[1] == 'd')
11222 && (name
[2] == 0 || name
[2] == '.'))
11224 *map_type
= ((name
[1] == 'a') ? MAP_ARM
11225 : (name
[1] == 't') ? MAP_THUMB
11233 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
11234 Returns nonzero if *MAP_TYPE was set. */
11237 get_map_sym_type (struct disassemble_info
*info
,
11239 enum map_type
*map_type
)
11241 /* If the symbol is in a different section, ignore it. */
11242 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
11245 return is_mapping_symbol (info
, n
, map_type
);
11248 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
11249 Returns nonzero if *MAP_TYPE was set. */
11252 get_sym_code_type (struct disassemble_info
*info
,
11254 enum map_type
*map_type
)
11256 elf_symbol_type
*es
;
11259 /* If the symbol is in a different section, ignore it. */
11260 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
11263 es
= *(elf_symbol_type
**)(info
->symtab
+ n
);
11264 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
11266 /* If the symbol has function type then use that. */
11267 if (type
== STT_FUNC
|| type
== STT_GNU_IFUNC
)
11269 if (ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
11270 == ST_BRANCH_TO_THUMB
)
11271 *map_type
= MAP_THUMB
;
11273 *map_type
= MAP_ARM
;
11280 /* Search the mapping symbol state for instruction at pc. This is only
11281 applicable for elf target.
11283 There is an assumption Here, info->private_data contains the correct AND
11284 up-to-date information about current scan process. The information will be
11285 used to speed this search process.
11287 Return TRUE if the mapping state can be determined, and map_symbol
11288 will be updated accordingly. Otherwise, return FALSE. */
11291 mapping_symbol_for_insn (bfd_vma pc
, struct disassemble_info
*info
,
11292 enum map_type
*map_symbol
)
11294 bfd_vma addr
, section_vma
= 0;
11295 int n
, last_sym
= -1;
11296 bfd_boolean found
= FALSE
;
11297 bfd_boolean can_use_search_opt_p
= FALSE
;
11299 /* Default to DATA. A text section is required by the ABI to contain an
11300 INSN mapping symbol at the start. A data section has no such
11301 requirement, hence if no mapping symbol is found the section must
11302 contain only data. This however isn't very useful if the user has
11303 fully stripped the binaries. If this is the case use the section
11304 attributes to determine the default. If we have no section default to
11305 INSN as well, as we may be disassembling some raw bytes on a baremetal
11306 HEX file or similar. */
11307 enum map_type type
= MAP_DATA
;
11308 if ((info
->section
&& info
->section
->flags
& SEC_CODE
) || !info
->section
)
11310 struct arm_private_data
*private_data
;
11312 if (info
->private_data
== NULL
11313 || bfd_asymbol_flavour (*info
->symtab
) != bfd_target_elf_flavour
)
11316 private_data
= info
->private_data
;
11318 /* First, look for mapping symbols. */
11319 if (info
->symtab_size
!= 0)
11321 if (pc
<= private_data
->last_mapping_addr
)
11322 private_data
->last_mapping_sym
= -1;
11324 /* Start scanning at the start of the function, or wherever
11325 we finished last time. */
11326 n
= info
->symtab_pos
+ 1;
11328 /* If the last stop offset is different from the current one it means we
11329 are disassembling a different glob of bytes. As such the optimization
11330 would not be safe and we should start over. */
11331 can_use_search_opt_p
11332 = private_data
->last_mapping_sym
>= 0
11333 && info
->stop_offset
== private_data
->last_stop_offset
;
11335 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
11336 n
= private_data
->last_mapping_sym
;
11338 /* Look down while we haven't passed the location being disassembled.
11339 The reason for this is that there's no defined order between a symbol
11340 and an mapping symbol that may be at the same address. We may have to
11341 look at least one position ahead. */
11342 for (; n
< info
->symtab_size
; n
++)
11344 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11347 if (get_map_sym_type (info
, n
, &type
))
11356 n
= info
->symtab_pos
;
11357 if (n
>= private_data
->last_mapping_sym
&& can_use_search_opt_p
)
11358 n
= private_data
->last_mapping_sym
;
11360 /* No mapping symbol found at this address. Look backwards
11361 for a preceeding one, but don't go pass the section start
11362 otherwise a data section with no mapping symbol can pick up
11363 a text mapping symbol of a preceeding section. The documentation
11364 says section can be NULL, in which case we will seek up all the
11367 section_vma
= info
->section
->vma
;
11369 for (; n
>= 0; n
--)
11371 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11372 if (addr
< section_vma
)
11375 if (get_map_sym_type (info
, n
, &type
))
11385 /* If no mapping symbol was found, try looking up without a mapping
11386 symbol. This is done by walking up from the current PC to the nearest
11387 symbol. We don't actually have to loop here since symtab_pos will
11388 contain the nearest symbol already. */
11391 n
= info
->symtab_pos
;
11392 if (n
>= 0 && get_sym_code_type (info
, n
, &type
))
11399 private_data
->last_mapping_sym
= last_sym
;
11400 private_data
->last_type
= type
;
11401 private_data
->last_stop_offset
= info
->stop_offset
;
11403 *map_symbol
= type
;
11407 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
11408 of the supplied arm_feature_set structure with bitmasks indicating
11409 the supported base architectures and coprocessor extensions.
11411 FIXME: This could more efficiently implemented as a constant array,
11412 although it would also be less robust. */
11415 select_arm_features (unsigned long mach
,
11416 arm_feature_set
* features
)
11418 arm_feature_set arch_fset
;
11419 const arm_feature_set fpu_any
= FPU_ANY
;
11421 #undef ARM_SET_FEATURES
11422 #define ARM_SET_FEATURES(FSET) \
11424 const arm_feature_set fset = FSET; \
11425 arch_fset = fset; \
11428 /* When several architecture versions share the same bfd_mach_arm_XXX value
11429 the most featureful is chosen. */
11432 case bfd_mach_arm_2
: ARM_SET_FEATURES (ARM_ARCH_V2
); break;
11433 case bfd_mach_arm_2a
: ARM_SET_FEATURES (ARM_ARCH_V2S
); break;
11434 case bfd_mach_arm_3
: ARM_SET_FEATURES (ARM_ARCH_V3
); break;
11435 case bfd_mach_arm_3M
: ARM_SET_FEATURES (ARM_ARCH_V3M
); break;
11436 case bfd_mach_arm_4
: ARM_SET_FEATURES (ARM_ARCH_V4
); break;
11437 case bfd_mach_arm_4T
: ARM_SET_FEATURES (ARM_ARCH_V4T
); break;
11438 case bfd_mach_arm_5
: ARM_SET_FEATURES (ARM_ARCH_V5
); break;
11439 case bfd_mach_arm_5T
: ARM_SET_FEATURES (ARM_ARCH_V5T
); break;
11440 case bfd_mach_arm_5TE
: ARM_SET_FEATURES (ARM_ARCH_V5TE
); break;
11441 case bfd_mach_arm_XScale
: ARM_SET_FEATURES (ARM_ARCH_XSCALE
); break;
11442 case bfd_mach_arm_ep9312
:
11443 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T
,
11444 ARM_CEXT_MAVERICK
| FPU_MAVERICK
));
11446 case bfd_mach_arm_iWMMXt
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT
); break;
11447 case bfd_mach_arm_iWMMXt2
: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2
); break;
11448 case bfd_mach_arm_5TEJ
: ARM_SET_FEATURES (ARM_ARCH_V5TEJ
); break;
11449 case bfd_mach_arm_6
: ARM_SET_FEATURES (ARM_ARCH_V6
); break;
11450 case bfd_mach_arm_6KZ
: ARM_SET_FEATURES (ARM_ARCH_V6KZ
); break;
11451 case bfd_mach_arm_6T2
: ARM_SET_FEATURES (ARM_ARCH_V6KZT2
); break;
11452 case bfd_mach_arm_6K
: ARM_SET_FEATURES (ARM_ARCH_V6K
); break;
11453 case bfd_mach_arm_7
: ARM_SET_FEATURES (ARM_ARCH_V7VE
); break;
11454 case bfd_mach_arm_6M
: ARM_SET_FEATURES (ARM_ARCH_V6M
); break;
11455 case bfd_mach_arm_6SM
: ARM_SET_FEATURES (ARM_ARCH_V6SM
); break;
11456 case bfd_mach_arm_7EM
: ARM_SET_FEATURES (ARM_ARCH_V7EM
); break;
11457 case bfd_mach_arm_8
:
11459 /* Add bits for extensions that Armv8.5-A recognizes. */
11460 arm_feature_set armv8_5_ext_fset
11461 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
);
11462 ARM_SET_FEATURES (ARM_ARCH_V8_5A
);
11463 ARM_MERGE_FEATURE_SETS (arch_fset
, arch_fset
, armv8_5_ext_fset
);
11466 case bfd_mach_arm_8R
: ARM_SET_FEATURES (ARM_ARCH_V8R
); break;
11467 case bfd_mach_arm_8M_BASE
: ARM_SET_FEATURES (ARM_ARCH_V8M_BASE
); break;
11468 case bfd_mach_arm_8M_MAIN
: ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN
); break;
11469 case bfd_mach_arm_8_1M_MAIN
:
11470 ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN
);
11473 /* If the machine type is unknown allow all architecture types and all
11475 case bfd_mach_arm_unknown
: ARM_SET_FEATURES (ARM_FEATURE_ALL
); break;
11479 #undef ARM_SET_FEATURES
11481 /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
11482 and thus on bfd_mach_arm_XXX value. Therefore for a given
11483 bfd_mach_arm_XXX value all coprocessor feature bits should be allowed. */
11484 ARM_MERGE_FEATURE_SETS (*features
, arch_fset
, fpu_any
);
11488 /* NOTE: There are no checks in these routines that
11489 the relevant number of data bytes exist. */
11492 print_insn (bfd_vma pc
, struct disassemble_info
*info
, bfd_boolean little
)
11494 unsigned char b
[4];
11497 int is_thumb
= FALSE
;
11498 int is_data
= FALSE
;
11500 unsigned int size
= 4;
11501 void (*printer
) (bfd_vma
, struct disassemble_info
*, long);
11502 bfd_boolean found
= FALSE
;
11503 struct arm_private_data
*private_data
;
11505 if (info
->disassembler_options
)
11507 parse_arm_disassembler_options (info
->disassembler_options
);
11509 /* To avoid repeated parsing of these options, we remove them here. */
11510 info
->disassembler_options
= NULL
;
11513 /* PR 10288: Control which instructions will be disassembled. */
11514 if (info
->private_data
== NULL
)
11516 static struct arm_private_data
private;
11518 if ((info
->flags
& USER_SPECIFIED_MACHINE_TYPE
) == 0)
11519 /* If the user did not use the -m command line switch then default to
11520 disassembling all types of ARM instruction.
11522 The info->mach value has to be ignored as this will be based on
11523 the default archictecture for the target and/or hints in the notes
11524 section, but it will never be greater than the current largest arm
11525 machine value (iWMMXt2), which is only equivalent to the V5TE
11526 architecture. ARM architectures have advanced beyond the machine
11527 value encoding, and these newer architectures would be ignored if
11528 the machine value was used.
11530 Ie the -m switch is used to restrict which instructions will be
11531 disassembled. If it is necessary to use the -m switch to tell
11532 objdump that an ARM binary is being disassembled, eg because the
11533 input is a raw binary file, but it is also desired to disassemble
11534 all ARM instructions then use "-marm". This will select the
11535 "unknown" arm architecture which is compatible with any ARM
11537 info
->mach
= bfd_mach_arm_unknown
;
11539 /* Compute the architecture bitmask from the machine number.
11540 Note: This assumes that the machine number will not change
11541 during disassembly.... */
11542 select_arm_features (info
->mach
, & private.features
);
11544 private.last_mapping_sym
= -1;
11545 private.last_mapping_addr
= 0;
11546 private.last_stop_offset
= 0;
11548 info
->private_data
= & private;
11551 private_data
= info
->private_data
;
11553 /* Decide if our code is going to be little-endian, despite what the
11554 function argument might say. */
11555 little_code
= ((info
->endian_code
== BFD_ENDIAN_LITTLE
) || little
);
11557 /* For ELF, consult the symbol table to determine what kind of code
11558 or data we have. */
11559 if (info
->symtab_size
!= 0
11560 && bfd_asymbol_flavour (*info
->symtab
) == bfd_target_elf_flavour
)
11565 enum map_type type
= MAP_ARM
;
11567 found
= mapping_symbol_for_insn (pc
, info
, &type
);
11568 last_sym
= private_data
->last_mapping_sym
;
11570 is_thumb
= (private_data
->last_type
== MAP_THUMB
);
11571 is_data
= (private_data
->last_type
== MAP_DATA
);
11573 /* Look a little bit ahead to see if we should print out
11574 two or four bytes of data. If there's a symbol,
11575 mapping or otherwise, after two bytes then don't
11579 size
= 4 - (pc
& 3);
11580 for (n
= last_sym
+ 1; n
< info
->symtab_size
; n
++)
11582 addr
= bfd_asymbol_value (info
->symtab
[n
]);
11584 && (info
->section
== NULL
11585 || info
->section
== info
->symtab
[n
]->section
))
11587 if (addr
- pc
< size
)
11592 /* If the next symbol is after three bytes, we need to
11593 print only part of the data, so that we can use either
11594 .byte or .short. */
11596 size
= (pc
& 1) ? 1 : 2;
11600 if (info
->symbols
!= NULL
)
11602 if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_coff_flavour
)
11604 coff_symbol_type
* cs
;
11606 cs
= coffsymbol (*info
->symbols
);
11607 is_thumb
= ( cs
->native
->u
.syment
.n_sclass
== C_THUMBEXT
11608 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTAT
11609 || cs
->native
->u
.syment
.n_sclass
== C_THUMBLABEL
11610 || cs
->native
->u
.syment
.n_sclass
== C_THUMBEXTFUNC
11611 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTATFUNC
);
11613 else if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_elf_flavour
11616 /* If no mapping symbol has been found then fall back to the type
11617 of the function symbol. */
11618 elf_symbol_type
* es
;
11621 es
= *(elf_symbol_type
**)(info
->symbols
);
11622 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
11625 ((ARM_GET_SYM_BRANCH_TYPE (es
->internal_elf_sym
.st_target_internal
)
11626 == ST_BRANCH_TO_THUMB
) || type
== STT_ARM_16BIT
);
11628 else if (bfd_asymbol_flavour (*info
->symbols
)
11629 == bfd_target_mach_o_flavour
)
11631 bfd_mach_o_asymbol
*asym
= (bfd_mach_o_asymbol
*)*info
->symbols
;
11633 is_thumb
= (asym
->n_desc
& BFD_MACH_O_N_ARM_THUMB_DEF
);
11641 info
->display_endian
= little
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11643 info
->display_endian
= little_code
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
11645 info
->bytes_per_line
= 4;
11647 /* PR 10263: Disassemble data if requested to do so by the user. */
11648 if (is_data
&& ((info
->flags
& DISASSEMBLE_DATA
) == 0))
11652 /* Size was already set above. */
11653 info
->bytes_per_chunk
= size
;
11654 printer
= print_insn_data
;
11656 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, size
, info
);
11659 for (i
= size
- 1; i
>= 0; i
--)
11660 given
= b
[i
] | (given
<< 8);
11662 for (i
= 0; i
< (int) size
; i
++)
11663 given
= b
[i
] | (given
<< 8);
11665 else if (!is_thumb
)
11667 /* In ARM mode endianness is a straightforward issue: the instruction
11668 is four bytes long and is either ordered 0123 or 3210. */
11669 printer
= print_insn_arm
;
11670 info
->bytes_per_chunk
= 4;
11673 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 4, info
);
11675 given
= (b
[0]) | (b
[1] << 8) | (b
[2] << 16) | (b
[3] << 24);
11677 given
= (b
[3]) | (b
[2] << 8) | (b
[1] << 16) | (b
[0] << 24);
11681 /* In Thumb mode we have the additional wrinkle of two
11682 instruction lengths. Fortunately, the bits that determine
11683 the length of the current instruction are always to be found
11684 in the first two bytes. */
11685 printer
= print_insn_thumb16
;
11686 info
->bytes_per_chunk
= 2;
11689 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 2, info
);
11691 given
= (b
[0]) | (b
[1] << 8);
11693 given
= (b
[1]) | (b
[0] << 8);
11697 /* These bit patterns signal a four-byte Thumb
11699 if ((given
& 0xF800) == 0xF800
11700 || (given
& 0xF800) == 0xF000
11701 || (given
& 0xF800) == 0xE800)
11703 status
= info
->read_memory_func (pc
+ 2, (bfd_byte
*) b
, 2, info
);
11705 given
= (b
[0]) | (b
[1] << 8) | (given
<< 16);
11707 given
= (b
[1]) | (b
[0] << 8) | (given
<< 16);
11709 printer
= print_insn_thumb32
;
11714 if (ifthen_address
!= pc
)
11715 find_ifthen_state (pc
, info
, little_code
);
11719 if ((ifthen_state
& 0xf) == 0x8)
11720 ifthen_next_state
= 0;
11722 ifthen_next_state
= (ifthen_state
& 0xe0)
11723 | ((ifthen_state
& 0xf) << 1);
11729 info
->memory_error_func (status
, pc
, info
);
11732 if (info
->flags
& INSN_HAS_RELOC
)
11733 /* If the instruction has a reloc associated with it, then
11734 the offset field in the instruction will actually be the
11735 addend for the reloc. (We are using REL type relocs).
11736 In such cases, we can ignore the pc when computing
11737 addresses, since the addend is not currently pc-relative. */
11740 printer (pc
, info
, given
);
11744 ifthen_state
= ifthen_next_state
;
11745 ifthen_address
+= size
;
11751 print_insn_big_arm (bfd_vma pc
, struct disassemble_info
*info
)
11753 /* Detect BE8-ness and record it in the disassembler info. */
11754 if (info
->flavour
== bfd_target_elf_flavour
11755 && info
->section
!= NULL
11756 && (elf_elfheader (info
->section
->owner
)->e_flags
& EF_ARM_BE8
))
11757 info
->endian_code
= BFD_ENDIAN_LITTLE
;
11759 return print_insn (pc
, info
, FALSE
);
11763 print_insn_little_arm (bfd_vma pc
, struct disassemble_info
*info
)
11765 return print_insn (pc
, info
, TRUE
);
11768 const disasm_options_and_args_t
*
11769 disassembler_options_arm (void)
11771 static disasm_options_and_args_t
*opts_and_args
;
11773 if (opts_and_args
== NULL
)
11775 disasm_options_t
*opts
;
11778 opts_and_args
= XNEW (disasm_options_and_args_t
);
11779 opts_and_args
->args
= NULL
;
11781 opts
= &opts_and_args
->options
;
11782 opts
->name
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11783 opts
->description
= XNEWVEC (const char *, NUM_ARM_OPTIONS
+ 1);
11785 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11787 opts
->name
[i
] = regnames
[i
].name
;
11788 if (regnames
[i
].description
!= NULL
)
11789 opts
->description
[i
] = _(regnames
[i
].description
);
11791 opts
->description
[i
] = NULL
;
11793 /* The array we return must be NULL terminated. */
11794 opts
->name
[i
] = NULL
;
11795 opts
->description
[i
] = NULL
;
11798 return opts_and_args
;
11802 print_arm_disassembler_options (FILE *stream
)
11804 unsigned int i
, max_len
= 0;
11805 fprintf (stream
, _("\n\
11806 The following ARM specific disassembler options are supported for use with\n\
11807 the -M switch:\n"));
11809 for (i
= 0; i
< NUM_ARM_OPTIONS
; i
++)
11811 unsigned int len
= strlen (regnames
[i
].name
);
11816 for (i
= 0, max_len
++; i
< NUM_ARM_OPTIONS
; i
++)
11817 fprintf (stream
, " %s%*c %s\n",
11819 (int)(max_len
- strlen (regnames
[i
].name
)), ' ',
11820 _(regnames
[i
].description
));