Home | History | Annotate | Line # | Download | only in opcodes
arm-dis.c revision 1.6
      1 /* Instruction printing code for the ARM
      2    Copyright (C) 1994-2019 Free Software Foundation, Inc.
      3    Contributed by Richard Earnshaw (rwe (at) pegasus.esprit.ec.org)
      4    Modification by James G. Smith (jsmith (at) cygnus.co.uk)
      5 
      6    This file is part of libopcodes.
      7 
      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.
     12 
     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.
     17 
     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.  */
     22 
     23 #include "sysdep.h"
     24 
     25 #include "disassemble.h"
     26 #include "opcode/arm.h"
     27 #include "opintl.h"
     28 #include "safe-ctype.h"
     29 #include "libiberty.h"
     30 #include "floatformat.h"
     31 
     32 /* FIXME: This shouldn't be done here.  */
     33 #include "coff/internal.h"
     34 #include "libcoff.h"
     35 #include "bfd.h"
     36 #include "elf-bfd.h"
     37 #include "elf/internal.h"
     38 #include "elf/arm.h"
     39 #include "mach-o.h"
     40 
     41 /* FIXME: Belongs in global header.  */
     42 #ifndef strneq
     43 #define strneq(a,b,n)	(strncmp ((a), (b), (n)) == 0)
     44 #endif
     45 
     46 /* Cached mapping symbol state.  */
     47 enum map_type
     48 {
     49   MAP_ARM,
     50   MAP_THUMB,
     51   MAP_DATA
     52 };
     53 
     54 struct arm_private_data
     55 {
     56   /* The features to use when disassembling optional instructions.  */
     57   arm_feature_set features;
     58 
     59   /* Whether any mapping symbols are present in the provided symbol
     60      table.  -1 if we do not know yet, otherwise 0 or 1.  */
     61   int has_mapping_symbols;
     62 
     63   /* Track the last type (although this doesn't seem to be useful) */
     64   enum map_type last_type;
     65 
     66   /* Tracking symbol table information */
     67   int last_mapping_sym;
     68   bfd_vma last_mapping_addr;
     69 };
     70 
     71 struct opcode32
     72 {
     73   arm_feature_set arch;		/* Architecture defining this insn.  */
     74   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
     75   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
     76   const char *  assembler;	/* How to disassemble this insn.  */
     77 };
     78 
     79 struct opcode16
     80 {
     81   arm_feature_set arch;		/* Architecture defining this insn.  */
     82   unsigned short value, mask;	/* Recognise insn if (op & mask) == value.  */
     83   const char *assembler;	/* How to disassemble this insn.  */
     84 };
     85 
     86 /* print_insn_coprocessor recognizes the following format control codes:
     87 
     88    %%			%
     89 
     90    %c			print condition code (always bits 28-31 in ARM mode)
     91    %q			print shifter argument
     92    %u			print condition code (unconditional in ARM mode,
     93                           UNPREDICTABLE if not AL in Thumb)
     94    %A			print address for ldc/stc/ldf/stf instruction
     95    %B			print vstm/vldm register list
     96    %I                   print cirrus signed shift immediate: bits 0..3|4..6
     97    %F			print the COUNT field of a LFM/SFM instruction.
     98    %P			print floating point precision in arithmetic insn
     99    %Q			print floating point precision in ldf/stf insn
    100    %R			print floating point rounding mode
    101 
    102    %<bitfield>c		print as a condition code (for vsel)
    103    %<bitfield>r		print as an ARM register
    104    %<bitfield>R		as %<>r but r15 is UNPREDICTABLE
    105    %<bitfield>ru        as %<>r but each u register must be unique.
    106    %<bitfield>d		print the bitfield in decimal
    107    %<bitfield>k		print immediate for VFPv3 conversion instruction
    108    %<bitfield>x		print the bitfield in hex
    109    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
    110    %<bitfield>f		print a floating point constant if >7 else a
    111 			floating point register
    112    %<bitfield>w         print as an iWMMXt width field - [bhwd]ss/us
    113    %<bitfield>g         print as an iWMMXt 64-bit register
    114    %<bitfield>G         print as an iWMMXt general purpose or control register
    115    %<bitfield>D		print as a NEON D register
    116    %<bitfield>Q		print as a NEON Q register
    117    %<bitfield>V		print as a NEON D or Q register
    118    %<bitfield>E		print a quarter-float immediate value
    119 
    120    %y<code>		print a single precision VFP reg.
    121 			  Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
    122    %z<code>		print a double precision VFP reg
    123 			  Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
    124 
    125    %<bitfield>'c	print specified char iff bitfield is all ones
    126    %<bitfield>`c	print specified char iff bitfield is all zeroes
    127    %<bitfield>?ab...    select from array of values in big endian order
    128 
    129    %L			print as an iWMMXt N/M width field.
    130    %Z			print the Immediate of a WSHUFH instruction.
    131    %l			like 'A' except use byte offsets for 'B' & 'H'
    132 			versions.
    133    %i			print 5-bit immediate in bits 8,3..0
    134 			(print "32" when 0)
    135    %r			print register offset address for wldt/wstr instruction.  */
    136 
    137 enum opcode_sentinel_enum
    138 {
    139   SENTINEL_IWMMXT_START = 1,
    140   SENTINEL_IWMMXT_END,
    141   SENTINEL_GENERIC_START
    142 } opcode_sentinels;
    143 
    144 #define UNDEFINED_INSTRUCTION      "\t\t; <UNDEFINED> instruction: %0-31x"
    145 #define UNKNOWN_INSTRUCTION_32BIT  "\t\t; <UNDEFINED> instruction: %08x"
    146 #define UNKNOWN_INSTRUCTION_16BIT  "\t\t; <UNDEFINED> instruction: %04x"
    147 #define UNPREDICTABLE_INSTRUCTION  "\t; <UNPREDICTABLE>"
    148 
    149 /* Common coprocessor opcodes shared between Arm and Thumb-2.  */
    150 
    151 static const struct opcode32 coprocessor_opcodes[] =
    152 {
    153   /* XScale instructions.  */
    154   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    155     0x0e200010, 0x0fff0ff0,
    156     "mia%c\tacc0, %0-3r, %12-15r"},
    157   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    158     0x0e280010, 0x0fff0ff0,
    159     "miaph%c\tacc0, %0-3r, %12-15r"},
    160   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    161     0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
    162   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    163     0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
    164   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    165     0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
    166 
    167   /* Intel Wireless MMX technology instructions.  */
    168   {ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" },
    169   {ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
    170     0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
    171   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    172     0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
    173   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    174     0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
    175   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    176     0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
    177   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    178     0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
    179   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    180     0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
    181   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    182     0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
    183   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    184     0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
    185   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    186     0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
    187   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    188     0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
    189   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    190     0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
    191   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    192     0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
    193   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    194     0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
    195   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    196     0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
    197   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    198     0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
    199   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    200     0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
    201   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    202     0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
    203   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    204     0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    205   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    206     0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
    207   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    208     0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
    209   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    210     0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
    211   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    212     0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
    213   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    214     0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
    215   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    216     0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
    217   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    218     0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
    219   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    220     0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    221   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    222     0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    223   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    224     0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
    225   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    226     0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
    227   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    228     0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
    229   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    230     0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
    231   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    232     0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
    233   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    234     0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
    235   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    236     0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    237   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    238     0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
    239   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    240     0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    241   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    242     0x0e800120, 0x0f800ff0,
    243     "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    244   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    245     0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    246   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    247     0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
    248   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    249     0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
    250   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    251     0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
    252   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    253     0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
    254   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    255     0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
    256   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    257     0x0e8000a0, 0x0f800ff0,
    258     "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    259   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    260     0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    261   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    262     0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    263   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    264     0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
    265   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    266     0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    267   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    268     0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
    269   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    270     0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    271   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    272     0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
    273   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    274     0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
    275   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    276     0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
    277   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    278     0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
    279   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    280     0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    281   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    282     0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    283   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    284     0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
    285   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    286     0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    287   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    288     0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    289   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    290     0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
    291   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    292     0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    293   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    294     0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    295   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    296     0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
    297   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    298     0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
    299   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    300     0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
    301   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    302     0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    303   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    304     0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
    305   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    306     0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    307   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    308     0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
    309   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    310     0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
    311   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    312     0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
    313   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    314     0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
    315   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    316     0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    317   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    318     0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    319   {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    320     0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
    321   {ARM_FEATURE_CORE_LOW (0),
    322     SENTINEL_IWMMXT_END, 0, "" },
    323 
    324   /* Floating point coprocessor (FPA) instructions.  */
    325   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    326     0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    327   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    328     0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    329   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    330     0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    331   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    332     0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    333   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    334     0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    335   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    336     0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    337   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    338     0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
    339   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    340     0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
    341   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    342     0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    343   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    344     0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
    345   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    346     0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
    347   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    348     0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
    349   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    350     0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
    351   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    352     0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
    353   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    354     0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
    355   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    356     0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
    357   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    358     0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
    359   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    360     0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
    361   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    362     0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
    363   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    364     0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
    365   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    366     0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
    367   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    368     0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
    369   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    370     0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
    371   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    372     0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
    373   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    374     0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
    375   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    376     0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
    377   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    378     0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
    379   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    380     0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
    381   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    382     0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
    383   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    384     0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
    385   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    386     0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
    387   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    388     0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
    389   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    390     0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
    391   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    392     0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
    393   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    394     0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
    395   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    396     0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
    397   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    398     0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
    399   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    400     0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
    401   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    402     0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
    403   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    404     0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
    405   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
    406     0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
    407   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
    408     0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
    409   {ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
    410     0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
    411 
    412   /* ARMv8-M Mainline Security Extensions instructions.  */
    413   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
    414     0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
    415   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
    416     0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
    417 
    418   /* Register load/store.  */
    419   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    420     0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
    421   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    422     0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
    423   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    424     0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
    425   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    426     0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
    427   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    428     0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
    429   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    430     0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
    431   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    432     0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
    433   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    434     0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
    435   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    436     0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
    437   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    438     0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
    439   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    440     0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
    441   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    442     0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
    443   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    444     0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
    445   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    446     0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
    447   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    448     0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
    449   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    450     0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
    451 
    452   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    453     0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
    454   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    455     0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
    456   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    457     0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
    458   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    459     0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
    460 
    461   /* Data transfer between ARM and NEON registers.  */
    462   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    463     0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
    464   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    465     0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
    466   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    467     0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
    468   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    469     0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
    470   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    471     0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
    472   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    473     0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
    474   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    475     0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
    476   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    477     0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
    478   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    479     0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
    480   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    481     0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
    482   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    483     0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
    484   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    485     0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
    486   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    487     0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
    488   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    489     0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
    490   /* Half-precision conversion instructions.  */
    491   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    492     0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
    493   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    494     0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
    495   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
    496     0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
    497   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
    498     0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
    499 
    500   /* Floating point coprocessor (VFP) instructions.  */
    501   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    502     0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
    503   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    504     0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
    505   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    506     0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
    507   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    508     0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
    509   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    510     0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
    511   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    512     0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
    513   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    514     0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
    515   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    516     0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
    517   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    518     0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
    519   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    520     0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
    521   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    522     0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
    523   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    524     0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
    525   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    526     0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
    527   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    528     0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
    529   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    530     0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
    531   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    532     0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
    533   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    534     0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
    535   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    536     0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
    537   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    538     0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
    539   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    540     0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
    541   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    542     0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
    543   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    544     0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
    545   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    546     0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
    547   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    548     0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
    549   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    550     0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
    551   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    552     0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
    553   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    554     0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
    555   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    556     0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
    557   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    558     0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
    559   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    560     0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
    561   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    562     0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
    563   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    564     0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
    565   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    566     0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
    567   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    568     0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
    569   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    570     0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
    571   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    572     0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
    573   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    574     0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
    575   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    576     0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
    577   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    578     0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
    579   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    580     0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
    581   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    582     0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
    583   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    584     0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
    585   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    586     0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
    587   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    588     0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
    589   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    590     0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
    591   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    592     0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
    593   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    594     0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
    595   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    596     0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
    597   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    598     0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
    599   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    600     0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
    601   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    602     0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
    603   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    604     0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
    605   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    606     0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
    607   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    608     0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
    609   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    610     0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
    611   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    612     0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
    613   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    614     0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
    615   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    616     0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
    617   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    618     0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
    619   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    620     0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
    621   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    622     0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
    623   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    624     0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
    625   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    626     0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
    627   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    628     0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
    629   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    630     0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
    631   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    632     0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
    633   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    634     0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
    635   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    636     0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
    637   {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    638     0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
    639 
    640   /* Cirrus coprocessor instructions.  */
    641   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    642     0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
    643   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    644     0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
    645   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    646     0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
    647   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    648     0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
    649   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    650     0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
    651   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    652     0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
    653   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    654     0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
    655   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    656     0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
    657   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    658     0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
    659   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    660     0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
    661   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    662     0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
    663   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    664     0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
    665   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    666     0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
    667   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    668     0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
    669   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    670     0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
    671   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    672     0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
    673   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    674     0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
    675   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    676     0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
    677   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    678     0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
    679   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    680     0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
    681   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    682     0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
    683   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    684     0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
    685   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    686     0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
    687   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    688     0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
    689   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    690     0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
    691   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    692     0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
    693   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    694     0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
    695   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    696     0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
    697   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    698     0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
    699   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    700     0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
    701   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    702     0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
    703   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    704     0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
    705   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    706     0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
    707   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    708     0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
    709   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    710     0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
    711   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    712     0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
    713   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    714     0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
    715   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    716     0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
    717   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    718     0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
    719   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    720     0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
    721   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    722     0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
    723   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    724     0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
    725   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    726     0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
    727   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    728     0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
    729   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    730     0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
    731   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    732     0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
    733   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    734     0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
    735   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    736     0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
    737   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    738     0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
    739   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    740     0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
    741   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    742     0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
    743   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    744     0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
    745   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    746     0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
    747   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    748     0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
    749   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    750     0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
    751   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    752     0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
    753   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    754     0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
    755   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    756     0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
    757   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    758     0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
    759   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    760     0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
    761   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    762     0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
    763   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    764     0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
    765   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    766     0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    767   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    768     0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    769   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    770     0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    771   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    772     0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    773   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    774     0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    775   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    776     0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    777   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    778     0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
    779   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    780     0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
    781   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    782     0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
    783   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    784     0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
    785   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    786     0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    787   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    788     0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    789   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    790     0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    791   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    792     0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    793   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    794     0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    795   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    796     0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    797   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    798     0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    799   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    800     0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    801   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    802     0x0e000600, 0x0ff00f10,
    803     "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    804   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    805     0x0e100600, 0x0ff00f10,
    806     "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    807   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    808     0x0e200600, 0x0ff00f10,
    809     "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
    810   {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
    811     0x0e300600, 0x0ff00f10,
    812     "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
    813 
    814   /* VFP Fused multiply add instructions.  */
    815   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    816     0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
    817   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    818     0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
    819   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    820     0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
    821   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    822     0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
    823   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    824     0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
    825   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    826     0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
    827   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    828     0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
    829   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    830     0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
    831 
    832   /* FP v5.  */
    833   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    834     0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
    835   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    836     0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
    837   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    838     0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
    839   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    840     0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
    841   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    842     0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
    843   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    844     0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
    845   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    846     0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
    847   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    848     0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
    849   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    850     0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
    851   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    852     0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
    853   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    854     0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
    855   {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    856     0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
    857 
    858   /* Generic coprocessor instructions.  */
    859   {ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" },
    860   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
    861     0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
    862   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
    863     0x0c500000, 0x0ff00000,
    864     "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
    865   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    866     0x0e000000, 0x0f000010,
    867     "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
    868   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    869     0x0e10f010, 0x0f10f010,
    870     "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
    871   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    872     0x0e100010, 0x0f100010,
    873     "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    874   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    875     0x0e000010, 0x0f100010,
    876     "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
    877   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    878     0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
    879   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
    880     0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
    881 
    882   /* V6 coprocessor instructions.  */
    883   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
    884     0xfc500000, 0xfff00000,
    885     "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
    886   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
    887     0xfc400000, 0xfff00000,
    888     "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
    889 
    890   /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8.  */
    891   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    892     0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
    893   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    894     0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
    895   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    896     0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
    897   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    898     0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
    899   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    900     0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
    901   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    902     0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
    903   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    904     0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
    905   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    906     0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
    907   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    908     0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
    909   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    910     0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
    911 
    912   /* Dot Product instructions in the space of coprocessor 13.  */
    913   {ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
    914     0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
    915   {ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
    916     0xfe000d00, 0xff000f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
    917 
    918   /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8.  */
    919   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    920     0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
    921   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    922     0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
    923   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    924     0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
    925   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    926     0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
    927   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    928     0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
    929   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    930     0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
    931   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    932     0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
    933   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
    934     0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
    935 
    936   /* V5 coprocessor instructions.  */
    937   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
    938     0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
    939   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
    940     0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
    941   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
    942     0xfe000000, 0xff000010,
    943     "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
    944   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
    945     0xfe000010, 0xff100010,
    946     "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
    947   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
    948     0xfe100010, 0xff100010,
    949     "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    950 
    951   /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
    952      cp_num: bit <11:8> == 0b1001.
    953      cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE.  */
    954   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    955     0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
    956   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    957     0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
    958   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    959     0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
    960   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    961     0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
    962   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    963     0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
    964   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    965     0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
    966   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    967     0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
    968   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    969     0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
    970   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    971     0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
    972   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    973     0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
    974   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    975     0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
    976   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    977     0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
    978   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    979     0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
    980   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    981     0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
    982   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    983     0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
    984   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    985     0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
    986   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    987     0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
    988   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    989     0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
    990   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    991     0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
    992   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    993     0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
    994   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    995     0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
    996   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    997     0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
    998   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
    999     0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
   1000   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1001     0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
   1002   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1003     0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
   1004   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1005     0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
   1006   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1007     0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
   1008   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1009     0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
   1010   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1011     0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
   1012   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1013     0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
   1014   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1015     0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
   1016   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1017     0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
   1018   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1019     0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
   1020   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1021     0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
   1022   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1023     0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
   1024 
   1025   /* ARMv8.3 javascript conversion instruction.  */
   1026   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1027     0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
   1028 
   1029   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   1030 };
   1031 
   1032 /* Neon opcode table:  This does not encode the top byte -- that is
   1033    checked by the print_insn_neon routine, as it depends on whether we are
   1034    doing thumb32 or arm32 disassembly.  */
   1035 
   1036 /* print_insn_neon recognizes the following format control codes:
   1037 
   1038    %%			%
   1039 
   1040    %c			print condition code
   1041    %u			print condition code (unconditional in ARM mode,
   1042                           UNPREDICTABLE if not AL in Thumb)
   1043    %A			print v{st,ld}[1234] operands
   1044    %B			print v{st,ld}[1234] any one operands
   1045    %C			print v{st,ld}[1234] single->all operands
   1046    %D			print scalar
   1047    %E			print vmov, vmvn, vorr, vbic encoded constant
   1048    %F			print vtbl,vtbx register list
   1049 
   1050    %<bitfield>r		print as an ARM register
   1051    %<bitfield>d		print the bitfield in decimal
   1052    %<bitfield>e         print the 2^N - bitfield in decimal
   1053    %<bitfield>D		print as a NEON D register
   1054    %<bitfield>Q		print as a NEON Q register
   1055    %<bitfield>R		print as a NEON D or Q register
   1056    %<bitfield>Sn	print byte scaled width limited by n
   1057    %<bitfield>Tn	print short scaled width limited by n
   1058    %<bitfield>Un	print long scaled width limited by n
   1059 
   1060    %<bitfield>'c	print specified char iff bitfield is all ones
   1061    %<bitfield>`c	print specified char iff bitfield is all zeroes
   1062    %<bitfield>?ab...    select from array of values in big endian order.  */
   1063 
   1064 static const struct opcode32 neon_opcodes[] =
   1065 {
   1066   /* Extract.  */
   1067   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1068     0xf2b00840, 0xffb00850,
   1069     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
   1070   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1071     0xf2b00000, 0xffb00810,
   1072     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
   1073 
   1074   /* Move data element to all lanes.  */
   1075   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1076     0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
   1077   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1078     0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
   1079   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1080     0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
   1081 
   1082   /* Table lookup.  */
   1083   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1084     0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
   1085   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1086     0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
   1087 
   1088   /* Half-precision conversions.  */
   1089   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
   1090     0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
   1091   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
   1092     0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
   1093 
   1094   /* NEON fused multiply add instructions.  */
   1095   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
   1096     0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1097   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1098     0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1099   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
   1100     0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1101   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1102     0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1103 
   1104   /* Two registers, miscellaneous.  */
   1105   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1106     0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
   1107   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1108     0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
   1109   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1110     0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
   1111   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1112     0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
   1113   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1114     0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
   1115   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1116     0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
   1117   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1118     0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
   1119   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1120     0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
   1121   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1122     0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
   1123   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1124     0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
   1125   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1126     0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
   1127   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1128     0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
   1129   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1130     0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
   1131   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1132     0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
   1133   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1134     0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
   1135   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1136     0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
   1137   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1138     0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
   1139   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1140     0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
   1141   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1142     0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
   1143   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1144     0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
   1145   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1146     0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
   1147   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1148     0xf3b20300, 0xffb30fd0,
   1149     "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
   1150   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1151     0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
   1152   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1153     0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
   1154   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1155     0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
   1156   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1157     0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
   1158   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1159     0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1160   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1161     0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1162   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1163     0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1164   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1165     0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1166   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1167     0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
   1168   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1169     0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1170   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1171     0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1172   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1173     0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1174   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1175     0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1176   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1177     0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1178   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1179     0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
   1180   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1181     0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
   1182   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1183     0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
   1184   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1185     0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
   1186   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1187     0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
   1188   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1189     0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
   1190   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1191     0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
   1192   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1193     0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
   1194   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1195     0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
   1196   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1197     0xf3bb0600, 0xffbf0e10,
   1198     "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
   1199   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1200     0xf3b70600, 0xffbf0e10,
   1201     "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
   1202 
   1203   /* Three registers of the same length.  */
   1204   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1205     0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1206   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1207     0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1208   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1209     0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1210   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1211     0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1212   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1213     0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1214   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1215     0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1216   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1217     0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1218   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1219     0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1220   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1221     0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1222   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1223     0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1224   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1225     0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1226   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1227     0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1228   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1229     0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1230   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1231     0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1232   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1233     0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1234   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1235     0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1236   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1237     0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1238   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1239     0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1240   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1241     0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1242   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1243     0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1244   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1245     0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1246   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1247     0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1248   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1249     0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1250   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1251     0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1252   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1253     0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1254   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1255     0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1256   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1257     0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1258   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1259     0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1260   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1261     0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1262   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1263     0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1264   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1265     0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1266   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1267     0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1268   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1269     0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1270   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1271     0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1272   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1273     0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1274   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1275     0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1276   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1277     0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1278   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1279     0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1280   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1281     0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1282   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1283     0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1284   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1285     0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1286   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1287     0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1288   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1289     0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1290   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1291     0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1292   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1293     0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1294   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1295     0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1296   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1297     0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1298   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1299     0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1300   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1301     0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1302   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1303     0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1304   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1305     0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1306   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1307     0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1308   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1309     0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1310   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1311     0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1312   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1313     0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1314   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1315     0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1316   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1317     0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1318   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1319     0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1320   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1321     0xf2000b00, 0xff800f10,
   1322     "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1323   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1324     0xf2000b10, 0xff800f10,
   1325     "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1326   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1327     0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1328   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1329     0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1330   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1331     0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1332   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1333     0xf3000b00, 0xff800f10,
   1334     "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1335   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1336     0xf2000000, 0xfe800f10,
   1337     "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1338   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1339     0xf2000010, 0xfe800f10,
   1340     "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1341   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1342     0xf2000100, 0xfe800f10,
   1343     "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1344   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1345     0xf2000200, 0xfe800f10,
   1346     "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1347   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1348     0xf2000210, 0xfe800f10,
   1349     "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1350   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1351     0xf2000300, 0xfe800f10,
   1352     "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1353   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1354     0xf2000310, 0xfe800f10,
   1355     "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1356   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1357     0xf2000400, 0xfe800f10,
   1358     "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1359   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1360     0xf2000410, 0xfe800f10,
   1361     "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1362   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1363     0xf2000500, 0xfe800f10,
   1364     "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1365   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1366     0xf2000510, 0xfe800f10,
   1367     "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1368   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1369     0xf2000600, 0xfe800f10,
   1370     "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1371   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1372     0xf2000610, 0xfe800f10,
   1373     "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1374   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1375     0xf2000700, 0xfe800f10,
   1376     "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1377   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1378     0xf2000710, 0xfe800f10,
   1379     "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1380   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1381     0xf2000910, 0xfe800f10,
   1382     "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1383   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1384     0xf2000a00, 0xfe800f10,
   1385     "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1386   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1387     0xf2000a10, 0xfe800f10,
   1388     "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1389   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1390     0xf3000b10, 0xff800f10,
   1391     "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1392   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1393     0xf3000c10, 0xff800f10,
   1394     "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1395 
   1396   /* One register and an immediate value.  */
   1397   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1398     0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
   1399   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1400     0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
   1401   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1402     0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
   1403   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1404     0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
   1405   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1406     0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
   1407   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1408     0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
   1409   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1410     0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
   1411   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1412     0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
   1413   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1414     0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
   1415   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1416     0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
   1417   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1418     0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
   1419   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1420     0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
   1421   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1422     0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
   1423 
   1424   /* Two registers and a shift amount.  */
   1425   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1426     0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1427   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1428     0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1429   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1430     0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1431   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1432     0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1433   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1434     0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1435   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1436     0xf2880950, 0xfeb80fd0,
   1437     "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
   1438   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1439     0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
   1440   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1441     0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1442   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1443     0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1444   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1445     0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
   1446   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1447     0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
   1448   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1449     0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
   1450   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1451     0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
   1452   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1453     0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1454   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1455     0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1456   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1457     0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1458   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1459     0xf2900950, 0xfeb00fd0,
   1460     "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
   1461   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1462     0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
   1463   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1464     0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
   1465   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1466     0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
   1467   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1468     0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
   1469   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1470     0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
   1471   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1472     0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
   1473   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1474     0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1475   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1476     0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1477   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1478     0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
   1479   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1480     0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
   1481   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1482     0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
   1483   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1484     0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
   1485   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1486     0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
   1487   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1488     0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
   1489   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1490     0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
   1491   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1492     0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
   1493   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1494     0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
   1495   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1496     0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
   1497   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1498     0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1499   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1500     0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1501   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1502     0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1503   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1504     0xf2a00950, 0xfea00fd0,
   1505     "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
   1506   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1507     0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
   1508   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1509     0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1510   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1511     0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
   1512   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1513     0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
   1514   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1515     0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1516   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1517     0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1518   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1519     0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1520   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1521     0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1522   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1523     0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
   1524   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1525     0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
   1526   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1527     0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
   1528   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1529     0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
   1530   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1531     0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
   1532   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1533     0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
   1534   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1535     0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
   1536   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1537     0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
   1538   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1539     0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
   1540   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1541     0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
   1542   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1543     0xf2a00e10, 0xfea00e90,
   1544     "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
   1545   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1546     0xf2a00c10, 0xfea00e90,
   1547     "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
   1548 
   1549   /* Three registers of different lengths.  */
   1550   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1551     0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1552   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1553     0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1554   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1555     0xf2800400, 0xff800f50,
   1556     "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1557   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1558     0xf2800600, 0xff800f50,
   1559     "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1560   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1561     0xf2800900, 0xff800f50,
   1562     "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1563   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1564     0xf2800b00, 0xff800f50,
   1565     "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1566   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1567     0xf2800d00, 0xff800f50,
   1568     "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1569   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1570     0xf3800400, 0xff800f50,
   1571     "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1572   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1573     0xf3800600, 0xff800f50,
   1574     "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1575   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1576     0xf2800000, 0xfe800f50,
   1577     "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1578   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1579     0xf2800100, 0xfe800f50,
   1580     "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
   1581   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1582     0xf2800200, 0xfe800f50,
   1583     "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1584   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1585     0xf2800300, 0xfe800f50,
   1586     "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
   1587   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1588     0xf2800500, 0xfe800f50,
   1589     "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1590   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1591     0xf2800700, 0xfe800f50,
   1592     "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1593   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1594     0xf2800800, 0xfe800f50,
   1595     "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1596   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1597     0xf2800a00, 0xfe800f50,
   1598     "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1599   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1600     0xf2800c00, 0xfe800f50,
   1601     "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1602 
   1603   /* Two registers and a scalar.  */
   1604   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1605     0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1606   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1607     0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
   1608   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1609     0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1610   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1611     0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1612   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1613     0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1614   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1615     0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1616   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1617     0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1618   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1619     0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1620   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1621     0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1622   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1623     0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
   1624   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1625     0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1626   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1627     0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1628   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1629     0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1630   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1631     0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1632   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1633     0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1634   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1635     0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1636   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1637     0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1638   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1639     0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1640   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1641     0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1642   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1643     0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1644   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1645     0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1646   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1647     0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1648   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1649     0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1650   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1651     0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1652   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1653     0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1654   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1655     0xf2800240, 0xfe800f50,
   1656     "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1657   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1658     0xf2800640, 0xfe800f50,
   1659     "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1660   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1661     0xf2800a40, 0xfe800f50,
   1662     "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1663   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1664     0xf2800e40, 0xff800f50,
   1665    "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1666   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1667     0xf2800f40, 0xff800f50,
   1668    "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1669   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1670     0xf3800e40, 0xff800f50,
   1671    "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1672   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1673     0xf3800f40, 0xff800f50,
   1674    "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
   1675   },
   1676 
   1677   /* Element and structure load/store.  */
   1678   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1679     0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
   1680   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1681     0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
   1682   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1683     0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
   1684   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1685     0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
   1686   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1687     0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
   1688   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1689     0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1690   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1691     0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1692   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1693     0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
   1694   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1695     0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
   1696   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1697     0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1698   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1699     0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1700   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1701     0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1702   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1703     0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1704   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1705     0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1706   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1707     0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
   1708   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1709     0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
   1710   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1711     0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
   1712   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1713     0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
   1714   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1715     0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
   1716 
   1717   {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
   1718 };
   1719 
   1720 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb.  All three are partially
   1721    ordered: they must be searched linearly from the top to obtain a correct
   1722    match.  */
   1723 
   1724 /* print_insn_arm recognizes the following format control codes:
   1725 
   1726    %%			%
   1727 
   1728    %a			print address for ldr/str instruction
   1729    %s                   print address for ldr/str halfword/signextend instruction
   1730    %S                   like %s but allow UNPREDICTABLE addressing
   1731    %b			print branch destination
   1732    %c			print condition code (always bits 28-31)
   1733    %m			print register mask for ldm/stm instruction
   1734    %o			print operand2 (immediate or register + shift)
   1735    %p			print 'p' iff bits 12-15 are 15
   1736    %t			print 't' iff bit 21 set and bit 24 clear
   1737    %B			print arm BLX(1) destination
   1738    %C			print the PSR sub type.
   1739    %U			print barrier type.
   1740    %P			print address for pli instruction.
   1741 
   1742    %<bitfield>r		print as an ARM register
   1743    %<bitfield>T		print as an ARM register + 1
   1744    %<bitfield>R		as %r but r15 is UNPREDICTABLE
   1745    %<bitfield>{r|R}u    as %{r|R} but if matches the other %u field then is UNPREDICTABLE
   1746    %<bitfield>{r|R}U    as %{r|R} but if matches the other %U field then is UNPREDICTABLE
   1747    %<bitfield>d		print the bitfield in decimal
   1748    %<bitfield>W         print the bitfield plus one in decimal
   1749    %<bitfield>x		print the bitfield in hex
   1750    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
   1751 
   1752    %<bitfield>'c	print specified char iff bitfield is all ones
   1753    %<bitfield>`c	print specified char iff bitfield is all zeroes
   1754    %<bitfield>?ab...    select from array of values in big endian order
   1755 
   1756    %e                   print arm SMI operand (bits 0..7,8..19).
   1757    %E			print the LSB and WIDTH fields of a BFI or BFC instruction.
   1758    %V                   print the 16-bit immediate field of a MOVT or MOVW instruction.
   1759    %R			print the SPSR/CPSR or banked register of an MRS.  */
   1760 
   1761 static const struct opcode32 arm_opcodes[] =
   1762 {
   1763   /* ARM instructions.  */
   1764   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   1765     0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
   1766   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   1767     0xe7f000f0, 0xfff000f0, "udf\t#%e"},
   1768 
   1769   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5),
   1770     0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
   1771   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1772     0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
   1773   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1774     0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   1775   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S),
   1776     0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
   1777   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
   1778     0x00800090, 0x0fa000f0,
   1779     "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   1780   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
   1781     0x00a00090, 0x0fa000f0,
   1782     "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   1783 
   1784   /* V8.2 RAS extension instructions.  */
   1785   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
   1786     0xe320f010, 0xffffffff, "esb"},
   1787 
   1788   /* V8 instructions.  */
   1789   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   1790     0x0320f005, 0x0fffffff, "sevl"},
   1791   /* Defined in V8 but is in NOP space so available to all arch.  */
   1792   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   1793     0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
   1794   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS),
   1795     0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
   1796   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1797     0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
   1798   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   1799     0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
   1800   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   1801     0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
   1802   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1803     0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
   1804   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1805     0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
   1806   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1807     0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
   1808   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1809     0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
   1810   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1811     0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
   1812   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1813     0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
   1814   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1815     0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
   1816   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1817     0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
   1818   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1819     0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
   1820   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   1821     0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
   1822   /* CRC32 instructions.  */
   1823   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1824     0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
   1825   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1826     0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
   1827   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1828     0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
   1829   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1830     0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
   1831   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1832     0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
   1833   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   1834     0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
   1835 
   1836   /* Privileged Access Never extension instructions.  */
   1837   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
   1838     0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
   1839 
   1840   /* Virtualization Extension instructions.  */
   1841   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"},
   1842   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
   1843 
   1844   /* Integer Divide Extension instructions.  */
   1845   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
   1846     0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
   1847   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
   1848     0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
   1849 
   1850   /* MP Extension instructions.  */
   1851   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"},
   1852 
   1853   /* Speculation Barriers.  */
   1854   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xe320f014, 0xffffffff, "csdb"},
   1855   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff040, 0xffffffff, "ssbb"},
   1856   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff044, 0xffffffff, "pssbb"},
   1857 
   1858   /* V7 instructions.  */
   1859   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"},
   1860   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
   1861   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
   1862   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
   1863   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
   1864   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
   1865   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"},
   1866    {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
   1867     0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
   1868 
   1869   /* ARM V6T2 instructions.  */
   1870   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1871     0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
   1872   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1873     0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
   1874   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1875     0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   1876   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1877     0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
   1878 
   1879   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1880     0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION },
   1881   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1882     0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
   1883 
   1884   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   1885     0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
   1886   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   1887     0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
   1888   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1889     0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
   1890   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   1891     0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
   1892 
   1893   /* ARM Security extension instructions.  */
   1894   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
   1895     0x01600070, 0x0ff000f0, "smc%c\t%e"},
   1896 
   1897   /* ARM V6K instructions.  */
   1898   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1899     0xf57ff01f, 0xffffffff, "clrex"},
   1900   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1901     0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
   1902   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1903     0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
   1904   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1905     0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
   1906   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1907     0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
   1908   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1909     0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
   1910   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1911     0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
   1912 
   1913   /* ARMv8.5-A instructions.  */
   1914   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf57ff070, 0xffffffff, "sb"},
   1915 
   1916   /* ARM V6K NOP hints.  */
   1917   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1918     0x0320f001, 0x0fffffff, "yield%c"},
   1919   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1920     0x0320f002, 0x0fffffff, "wfe%c"},
   1921   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1922     0x0320f003, 0x0fffffff, "wfi%c"},
   1923   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1924     0x0320f004, 0x0fffffff, "sev%c"},
   1925   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   1926     0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
   1927 
   1928   /* ARM V6 instructions.  */
   1929   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1930     0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
   1931   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1932     0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
   1933   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1934     0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
   1935   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1936     0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
   1937   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1938     0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
   1939   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1940     0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
   1941   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1942     0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
   1943   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1944     0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
   1945   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1946     0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
   1947   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1948     0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
   1949   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1950     0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
   1951   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1952     0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
   1953   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1954     0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
   1955   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1956     0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
   1957   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1958     0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
   1959   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1960     0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
   1961   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1962     0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
   1963   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1964     0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
   1965   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1966     0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
   1967   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1968     0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
   1969   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1970     0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
   1971   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1972     0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
   1973   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1974     0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
   1975   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1976     0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
   1977   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1978     0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
   1979   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1980     0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
   1981   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1982     0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
   1983   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1984     0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
   1985   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1986     0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
   1987   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1988     0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
   1989   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1990     0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
   1991   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1992     0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
   1993   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1994     0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
   1995   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1996     0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
   1997   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1998     0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
   1999   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2000     0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
   2001   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2002     0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
   2003   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2004     0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
   2005   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2006     0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
   2007   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2008     0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
   2009   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2010     0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
   2011   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2012     0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
   2013   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2014     0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
   2015   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2016     0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
   2017   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2018     0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
   2019   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2020     0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
   2021   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2022     0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
   2023   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2024     0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
   2025   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2026     0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
   2027   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2028     0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
   2029   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2030     0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
   2031   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2032     0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
   2033   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2034     0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
   2035   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2036     0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
   2037   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2038     0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
   2039   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2040     0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
   2041   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2042     0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
   2043   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2044     0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
   2045   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2046     0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
   2047   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2048     0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
   2049   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2050     0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
   2051   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2052     0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
   2053   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2054     0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
   2055   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2056     0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
   2057   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2058     0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
   2059   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2060     0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
   2061   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2062     0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
   2063   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2064     0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
   2065   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2066     0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
   2067   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2068     0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
   2069   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2070     0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
   2071   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2072     0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
   2073   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2074     0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
   2075   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2076     0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
   2077   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2078     0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
   2079   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2080     0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2081   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2082     0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2083   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2084     0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
   2085   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2086     0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
   2087   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2088     0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2089   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2090     0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2091   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2092     0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
   2093   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2094     0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
   2095   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2096     0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2097   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2098     0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2099   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2100     0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
   2101   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2102     0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
   2103   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2104     0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2105   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2106     0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2107   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2108     0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
   2109   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2110     0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
   2111   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2112     0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2113   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2114     0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2115   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2116     0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
   2117   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2118     0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
   2119   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2120     0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
   2121   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2122     0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
   2123   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2124     0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
   2125   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2126     0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
   2127   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2128     0xf1010000, 0xfffffc00, "setend\t%9?ble"},
   2129   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2130     0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
   2131   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2132     0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
   2133   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2134     0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2135   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2136     0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2137   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2138     0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2139   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2140     0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2141   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2142     0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
   2143   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2144     0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2145   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2146     0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2147   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2148     0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
   2149   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2150     0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
   2151   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2152     0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
   2153   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2154     0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
   2155   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2156     0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
   2157   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2158     0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
   2159   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2160     0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
   2161   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2162     0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
   2163   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2164     0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2165   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2166     0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
   2167   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2168     0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
   2169   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2170     0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
   2171   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   2172     0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
   2173 
   2174   /* V5J instruction.  */
   2175   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J),
   2176     0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
   2177 
   2178   /* V5 Instructions.  */
   2179   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   2180     0xe1200070, 0xfff000f0,
   2181     "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
   2182   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   2183     0xfa000000, 0xfe000000, "blx\t%B"},
   2184   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   2185     0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
   2186   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   2187     0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
   2188 
   2189   /* V5E "El Segundo" Instructions.  */
   2190   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   2191     0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
   2192   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   2193     0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
   2194   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   2195     0xf450f000, 0xfc70f000, "pld\t%a"},
   2196   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2197     0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2198   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2199     0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2200   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2201     0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2202   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2203     0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
   2204 
   2205   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2206     0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   2207   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2208     0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
   2209 
   2210   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2211     0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2212   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2213     0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2214   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2215     0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2216   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2217     0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   2218 
   2219   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2220     0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
   2221   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2222     0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
   2223   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2224     0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
   2225   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2226     0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
   2227 
   2228   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2229     0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
   2230   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2231     0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
   2232 
   2233   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2234     0x01000050, 0x0ff00ff0,  "qadd%c\t%12-15R, %0-3R, %16-19R"},
   2235   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2236     0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
   2237   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2238     0x01200050, 0x0ff00ff0,  "qsub%c\t%12-15R, %0-3R, %16-19R"},
   2239   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   2240     0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
   2241 
   2242   /* ARM Instructions.  */
   2243   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2244     0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
   2245 
   2246   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2247     0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
   2248   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2249     0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
   2250   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2251     0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
   2252   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2253     0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
   2254   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2255     0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
   2256   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2257     0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
   2258 
   2259   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2260     0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
   2261   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2262     0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
   2263   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2264     0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
   2265   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2266     0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
   2267 
   2268   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2269     0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION},
   2270   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2271     0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
   2272   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2273     0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION},
   2274   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2275     0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
   2276 
   2277   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2278     0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
   2279   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2280     0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
   2281   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2282     0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
   2283 
   2284   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2285     0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
   2286   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2287     0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
   2288   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2289     0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
   2290 
   2291   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2292     0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
   2293   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2294     0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
   2295   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2296     0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
   2297 
   2298   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2299     0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
   2300   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2301     0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
   2302   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2303     0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
   2304 
   2305   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2306     0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
   2307   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2308     0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
   2309   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2310     0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
   2311 
   2312   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2313     0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
   2314   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2315     0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
   2316   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2317     0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
   2318 
   2319   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2320     0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
   2321   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2322     0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
   2323   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2324     0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
   2325 
   2326   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2327     0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
   2328   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2329     0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
   2330   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2331     0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
   2332 
   2333   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
   2334     0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
   2335   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
   2336     0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
   2337   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
   2338     0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
   2339 
   2340   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2341     0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
   2342   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2343     0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
   2344   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2345     0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
   2346 
   2347   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2348     0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
   2349   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2350     0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
   2351   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2352     0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
   2353 
   2354   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2355     0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
   2356   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2357     0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
   2358   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2359     0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
   2360 
   2361   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2362     0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
   2363   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2364     0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
   2365   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2366     0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
   2367 
   2368   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2369     0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
   2370   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2371     0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
   2372   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2373     0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
   2374 
   2375   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2376     0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
   2377   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2378     0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
   2379   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2380     0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
   2381   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2382     0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
   2383   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2384     0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
   2385   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2386     0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
   2387   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2388     0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
   2389 
   2390   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2391     0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
   2392   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2393     0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
   2394   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2395     0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
   2396 
   2397   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2398     0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
   2399   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2400     0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
   2401   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2402     0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
   2403 
   2404   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2405     0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION},
   2406   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2407     0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
   2408 
   2409   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2410     0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
   2411 
   2412   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2413     0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
   2414   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2415     0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
   2416 
   2417   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2418     0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2419   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2420     0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2421   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2422     0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2423   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2424     0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2425   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2426     0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2427   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2428     0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2429   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2430     0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2431   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2432     0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2433   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2434     0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2435   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2436     0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2437   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2438     0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2439   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2440     0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2441   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2442     0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2443   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2444     0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2445   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2446     0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2447   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2448     0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   2449   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2450     0x092d0000, 0x0fff0000, "push%c\t%m"},
   2451   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2452     0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
   2453   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2454     0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
   2455 
   2456   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2457     0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2458   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2459     0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2460   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2461     0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2462   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2463     0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2464   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2465     0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2466   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2467     0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2468   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2469     0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2470   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2471     0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2472   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2473     0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2474   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2475     0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2476   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2477     0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2478   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2479     0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2480   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2481     0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2482   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2483     0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2484   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2485     0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2486   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2487     0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   2488   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2489     0x08bd0000, 0x0fff0000, "pop%c\t%m"},
   2490   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2491     0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
   2492   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2493     0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
   2494 
   2495   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2496     0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
   2497   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2498     0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
   2499 
   2500   /* The rest.  */
   2501   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
   2502     0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION},
   2503   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   2504     0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
   2505   {ARM_FEATURE_CORE_LOW (0),
   2506     0x00000000, 0x00000000, 0}
   2507 };
   2508 
   2509 /* print_insn_thumb16 recognizes the following format control codes:
   2510 
   2511    %S                   print Thumb register (bits 3..5 as high number if bit 6 set)
   2512    %D                   print Thumb register (bits 0..2 as high number if bit 7 set)
   2513    %<bitfield>I         print bitfield as a signed decimal
   2514    				(top bit of range being the sign bit)
   2515    %N                   print Thumb register mask (with LR)
   2516    %O                   print Thumb register mask (with PC)
   2517    %M                   print Thumb register mask
   2518    %b			print CZB's 6-bit unsigned branch destination
   2519    %s			print Thumb right-shift immediate (6..10; 0 == 32).
   2520    %c			print the condition code
   2521    %C			print the condition code, or "s" if not conditional
   2522    %x			print warning if conditional an not at end of IT block"
   2523    %X			print "\t; unpredictable <IT:code>" if conditional
   2524    %I			print IT instruction suffix and operands
   2525    %W			print Thumb Writeback indicator for LDMIA
   2526    %<bitfield>r		print bitfield as an ARM register
   2527    %<bitfield>d		print bitfield as a decimal
   2528    %<bitfield>H         print (bitfield * 2) as a decimal
   2529    %<bitfield>W         print (bitfield * 4) as a decimal
   2530    %<bitfield>a         print (bitfield * 4) as a pc-rel offset + decoded symbol
   2531    %<bitfield>B         print Thumb branch destination (signed displacement)
   2532    %<bitfield>c         print bitfield as a condition code
   2533    %<bitnum>'c		print specified char iff bit is one
   2534    %<bitnum>?ab		print a if bit is one else print b.  */
   2535 
   2536 static const struct opcode16 thumb_opcodes[] =
   2537 {
   2538   /* Thumb instructions.  */
   2539 
   2540   /* ARMv8-M Security Extensions instructions.  */
   2541   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"},
   2542   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff87, "bxns\t%3-6r"},
   2543 
   2544   /* ARM V8 instructions.  */
   2545   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xbf50, 0xffff, "sevl%c"},
   2546   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xba80, 0xffc0, "hlt\t%0-5x"},
   2547   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),  0xb610, 0xfff7, "setpan\t#%3-3d"},
   2548 
   2549   /* ARM V6K no-argument instructions.  */
   2550   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"},
   2551   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"},
   2552   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"},
   2553   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"},
   2554   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"},
   2555   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
   2556 
   2557   /* ARM V6T2 instructions.  */
   2558   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2559     0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
   2560   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2561     0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
   2562   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"},
   2563 
   2564   /* ARM V6.  */
   2565   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
   2566   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
   2567   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
   2568   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
   2569   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
   2570   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
   2571   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%3?ble%X"},
   2572   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
   2573   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
   2574   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
   2575   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
   2576 
   2577   /* ARM V5 ISA extends Thumb.  */
   2578   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
   2579     0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional.  */
   2580   /* This is BLX(2).  BLX(1) is a 32-bit instruction.  */
   2581   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
   2582     0x4780, 0xff87, "blx%c\t%3-6r%x"},	/* note: 4 bit register number.  */
   2583   /* ARM V4T ISA (Thumb v1).  */
   2584   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2585     0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
   2586   /* Format 4.  */
   2587   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
   2588   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
   2589   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
   2590   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
   2591   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
   2592   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
   2593   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
   2594   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
   2595   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
   2596   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
   2597   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
   2598   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
   2599   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
   2600   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
   2601   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
   2602   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
   2603   /* format 13 */
   2604   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
   2605   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
   2606   /* format 5 */
   2607   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"},
   2608   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"},
   2609   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
   2610   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"},
   2611   /* format 14 */
   2612   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"},
   2613   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"},
   2614   /* format 2 */
   2615   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2616     0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
   2617   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2618     0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
   2619   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2620     0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
   2621   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2622     0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
   2623   /* format 8 */
   2624   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2625     0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
   2626   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2627     0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
   2628   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2629     0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
   2630   /* format 7 */
   2631   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2632     0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   2633   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2634     0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   2635   /* format 1 */
   2636   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
   2637   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2638     0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
   2639   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
   2640   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
   2641   /* format 3 */
   2642   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
   2643   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
   2644   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
   2645   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
   2646   /* format 6 */
   2647   /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
   2648   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2649     0x4800, 0xF800,
   2650     "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
   2651   /* format 9 */
   2652   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2653     0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
   2654   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2655     0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
   2656   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2657     0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
   2658   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2659     0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
   2660   /* format 10 */
   2661   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2662     0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
   2663   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2664     0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
   2665   /* format 11 */
   2666   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2667     0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
   2668   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2669     0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
   2670   /* format 12 */
   2671   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2672     0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
   2673   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   2674     0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
   2675   /* format 15 */
   2676   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
   2677   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
   2678   /* format 17 */
   2679   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
   2680   /* format 16 */
   2681   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
   2682   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION},
   2683   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
   2684   /* format 18 */
   2685   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
   2686 
   2687   /* The E800 .. FFFF range is unconditionally redirected to the
   2688      32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
   2689      are processed via that table.  Thus, we can never encounter a
   2690      bare "second half of BL/BLX(1)" instruction here.  */
   2691   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),  0x0000, 0x0000, UNDEFINED_INSTRUCTION},
   2692   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   2693 };
   2694 
   2695 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
   2696    We adopt the convention that hw1 is the high 16 bits of .value and
   2697    .mask, hw2 the low 16 bits.
   2698 
   2699    print_insn_thumb32 recognizes the following format control codes:
   2700 
   2701        %%		%
   2702 
   2703        %I		print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
   2704        %M		print a modified 12-bit immediate (same location)
   2705        %J		print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
   2706        %K		print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
   2707        %H		print a 16-bit immediate from hw2[3:0],hw1[11:0]
   2708        %S		print a possibly-shifted Rm
   2709 
   2710        %L		print address for a ldrd/strd instruction
   2711        %a		print the address of a plain load/store
   2712        %w		print the width and signedness of a core load/store
   2713        %m		print register mask for ldm/stm
   2714 
   2715        %E		print the lsb and width fields of a bfc/bfi instruction
   2716        %F		print the lsb and width fields of a sbfx/ubfx instruction
   2717        %b		print a conditional branch offset
   2718        %B		print an unconditional branch offset
   2719        %s		print the shift field of an SSAT instruction
   2720        %R		print the rotation field of an SXT instruction
   2721        %U		print barrier type.
   2722        %P		print address for pli instruction.
   2723        %c		print the condition code
   2724        %x		print warning if conditional an not at end of IT block"
   2725        %X		print "\t; unpredictable <IT:code>" if conditional
   2726 
   2727        %<bitfield>d	print bitfield in decimal
   2728        %<bitfield>D     print bitfield plus one in decimal
   2729        %<bitfield>W	print bitfield*4 in decimal
   2730        %<bitfield>r	print bitfield as an ARM register
   2731        %<bitfield>R	as %<>r but r15 is UNPREDICTABLE
   2732        %<bitfield>c	print bitfield as a condition code
   2733 
   2734        %<bitfield>'c	print specified char iff bitfield is all ones
   2735        %<bitfield>`c	print specified char iff bitfield is all zeroes
   2736        %<bitfield>?ab... select from array of values in big endian order
   2737 
   2738    With one exception at the bottom (done because BL and BLX(1) need
   2739    to come dead last), this table was machine-sorted first in
   2740    decreasing order of number of bits set in the mask, then in
   2741    increasing numeric order of mask, then in increasing numeric order
   2742    of opcode.  This order is not the clearest for a human reader, but
   2743    is guaranteed never to catch a special-case bit pattern with a more
   2744    general mask, which is important, because this instruction encoding
   2745    makes heavy use of special-case bit patterns.  */
   2746 static const struct opcode32 thumb32_opcodes[] =
   2747 {
   2748   /* ARMv8-M and ARMv8-M Security Extensions instructions.  */
   2749   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"},
   2750   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   2751     0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
   2752   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   2753     0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
   2754   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   2755     0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
   2756   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   2757     0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
   2758 
   2759   /* ARM V8.2 RAS extension instructions.  */
   2760   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
   2761     0xf3af8010, 0xffffffff, "esb"},
   2762 
   2763   /* V8 instructions.  */
   2764   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2765     0xf3af8005, 0xffffffff, "sevl%c.w"},
   2766   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2767     0xf78f8000, 0xfffffffc, "dcps%0-1d"},
   2768   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2769     0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
   2770   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2771     0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
   2772   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2773     0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
   2774   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2775     0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
   2776   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2777     0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
   2778   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2779     0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
   2780   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2781     0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
   2782   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2783     0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
   2784   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2785     0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
   2786   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2787     0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
   2788   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2789     0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
   2790   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2791     0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
   2792   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2793     0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
   2794   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   2795     0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
   2796 
   2797   /* CRC32 instructions.  */
   2798   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2799     0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
   2800   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2801     0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
   2802   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2803     0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
   2804   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2805     0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
   2806   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2807     0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
   2808   {ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
   2809     0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
   2810 
   2811   /* Speculation Barriers.  */
   2812   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8014, 0xffffffff, "csdb"},
   2813   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f40, 0xffffffff, "ssbb"},
   2814   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f44, 0xffffffff, "pssbb"},
   2815 
   2816   /* V7 instructions.  */
   2817   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"},
   2818   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
   2819   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
   2820   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
   2821   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
   2822   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
   2823   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
   2824   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
   2825     0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
   2826   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
   2827     0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
   2828 
   2829   /* Virtualization Extension instructions.  */
   2830   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
   2831   /* We skip ERET as that is SUBS pc, lr, #0.  */
   2832 
   2833   /* MP Extension instructions.  */
   2834   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP),   0xf830f000, 0xff70f000, "pldw%c\t%a"},
   2835 
   2836   /* Security extension instructions.  */
   2837   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),  0xf7f08000, 0xfff0f000, "smc%c\t%K"},
   2838 
   2839   /* ARMv8.5-A instructions.  */
   2840   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf3bf8f70, 0xffffffff, "sb"},
   2841 
   2842   /* Instructions defined in the basic V6T2 set.  */
   2843   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"},
   2844   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"},
   2845   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"},
   2846   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"},
   2847   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"},
   2848   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2849     0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
   2850   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
   2851 
   2852   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2853     0xf3bf8f2f, 0xffffffff, "clrex%c"},
   2854   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2855     0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
   2856   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2857     0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
   2858   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2859     0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
   2860   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2861     0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
   2862   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2863     0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
   2864   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2865     0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
   2866   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2867     0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
   2868   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2869     0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
   2870   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2871     0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
   2872   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2873     0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
   2874   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2875     0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
   2876   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2877     0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
   2878   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2879     0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
   2880   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2881     0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
   2882   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2883     0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
   2884   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2885     0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
   2886   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2887     0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
   2888   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2889     0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
   2890   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2891     0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
   2892   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2893     0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
   2894   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2895     0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
   2896   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2897     0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
   2898   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2899     0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
   2900   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   2901     0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
   2902   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2903     0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
   2904   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2905     0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
   2906   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2907     0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
   2908   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2909     0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
   2910   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2911     0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
   2912   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2913     0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
   2914   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2915     0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
   2916   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2917     0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
   2918   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2919     0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
   2920   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2921     0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
   2922   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2923     0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
   2924   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2925     0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
   2926   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2927     0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
   2928   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2929     0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
   2930   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2931     0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
   2932   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2933     0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
   2934   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2935     0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
   2936   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2937     0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
   2938   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2939     0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
   2940   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2941     0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
   2942   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2943     0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
   2944   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2945     0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
   2946   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2947     0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
   2948   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2949     0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
   2950   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2951     0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
   2952   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2953     0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
   2954   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2955     0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
   2956   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2957     0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
   2958   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2959     0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
   2960   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2961     0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
   2962   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2963     0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
   2964   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2965     0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
   2966   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2967     0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
   2968   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2969     0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
   2970   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2971     0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
   2972   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2973     0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
   2974   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2975     0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
   2976   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2977     0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
   2978   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2979     0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
   2980   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2981     0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
   2982   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2983     0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
   2984   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2985     0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
   2986   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2987     0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
   2988   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2989     0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
   2990   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2991     0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
   2992   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2993     0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
   2994   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2995     0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
   2996   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2997     0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
   2998   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   2999     0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
   3000   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3001     0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   3002   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3003     0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   3004   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3005     0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   3006   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3007     0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   3008   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3009     0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
   3010   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3011     0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
   3012   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3013     0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
   3014   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3015     0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
   3016   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3017     0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   3018   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3019     0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
   3020   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3021     0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
   3022   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3023     0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   3024   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3025     0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   3026   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3027     0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   3028   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3029     0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   3030   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3031     0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   3032   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3033     0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   3034   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3035     0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   3036   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3037     0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
   3038   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3039     0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
   3040   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3041     0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
   3042   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3043     0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
   3044   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3045     0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
   3046   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3047     0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
   3048   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3049     0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
   3050   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3051     0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
   3052   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3053     0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
   3054   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3055     0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
   3056   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3057     0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
   3058   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3059     0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
   3060   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3061     0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   3062   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3063     0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   3064   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3065     0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3066   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3067     0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3068   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3069     0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3070   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3071     0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3072   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3073     0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3074   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3075     0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3076   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3077     0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
   3078   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3079     0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
   3080   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3081     0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
   3082   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3083     0xf810f000, 0xff70f000, "pld%c\t%a"},
   3084   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3085     0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3086   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3087     0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3088   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3089     0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3090   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3091     0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3092   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3093     0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   3094   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3095     0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3096   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3097     0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   3098   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3099     0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
   3100   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3101     0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
   3102   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3103     0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
   3104   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3105     0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
   3106   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3107     0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
   3108   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3109     0xfb100000, 0xfff000c0,
   3110     "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   3111   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3112     0xfbc00080, 0xfff000c0,
   3113     "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   3114   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3115     0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
   3116   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3117     0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
   3118   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3119     0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
   3120   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3121     0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
   3122   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3123     0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
   3124   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3125     0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
   3126   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3127     0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
   3128   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3129     0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
   3130   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3131     0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
   3132   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3133     0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
   3134   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3135     0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
   3136   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3137     0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
   3138   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3139     0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
   3140   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3141     0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
   3142   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3143     0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
   3144   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3145     0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
   3146   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3147     0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
   3148   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3149     0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
   3150   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3151     0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
   3152   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3153     0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
   3154   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3155     0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
   3156   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3157     0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
   3158   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3159     0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
   3160   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3161     0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
   3162   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3163     0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
   3164   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3165     0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
   3166   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3167     0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
   3168   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3169     0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
   3170   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3171     0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
   3172   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3173     0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
   3174   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3175     0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
   3176   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3177     0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
   3178   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3179     0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
   3180   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3181     0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
   3182   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3183     0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
   3184   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3185     0xe9400000, 0xff500000,
   3186     "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
   3187   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3188     0xe9500000, 0xff500000,
   3189     "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
   3190   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3191     0xe8600000, 0xff700000,
   3192     "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
   3193   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3194     0xe8700000, 0xff700000,
   3195     "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
   3196   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3197     0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
   3198   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3199     0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
   3200 
   3201   /* Filter out Bcc with cond=E or F, which are used for other instructions.  */
   3202   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3203     0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
   3204   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3205     0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
   3206   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3207     0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
   3208   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3209     0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
   3210 
   3211   /* These have been 32-bit since the invention of Thumb.  */
   3212   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   3213      0xf000c000, 0xf800d001, "blx%c\t%B%x"},
   3214   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   3215      0xf000d000, 0xf800d000, "bl%c\t%B%x"},
   3216 
   3217   /* Fallback.  */
   3218   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3219       0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
   3220   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   3221 };
   3222 
   3223 static const char *const arm_conditional[] =
   3224 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
   3225  "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
   3226 
   3227 static const char *const arm_fp_const[] =
   3228 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
   3229 
   3230 static const char *const arm_shift[] =
   3231 {"lsl", "lsr", "asr", "ror"};
   3232 
   3233 typedef struct
   3234 {
   3235   const char *name;
   3236   const char *description;
   3237   const char *reg_names[16];
   3238 }
   3239 arm_regname;
   3240 
   3241 static const arm_regname regnames[] =
   3242 {
   3243   { "reg-names-raw", N_("Select raw register names"),
   3244     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
   3245   { "reg-names-gcc", N_("Select register names used by GCC"),
   3246     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   3247   { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
   3248     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp",  "lr",  "pc" }},
   3249   { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL} },
   3250   { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL} },
   3251   { "reg-names-apcs", N_("Select register names used in the APCS"),
   3252     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   3253   { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
   3254     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},
   3255   { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
   3256     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }}
   3257 };
   3258 
   3259 static const char *const iwmmxt_wwnames[] =
   3260 {"b", "h", "w", "d"};
   3261 
   3262 static const char *const iwmmxt_wwssnames[] =
   3263 {"b", "bus", "bc", "bss",
   3264  "h", "hus", "hc", "hss",
   3265  "w", "wus", "wc", "wss",
   3266  "d", "dus", "dc", "dss"
   3267 };
   3268 
   3269 static const char *const iwmmxt_regnames[] =
   3270 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
   3271   "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
   3272 };
   3273 
   3274 static const char *const iwmmxt_cregnames[] =
   3275 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
   3276   "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
   3277 };
   3278 
   3279 /* Default to GCC register name set.  */
   3280 static unsigned int regname_selected = 1;
   3281 
   3282 #define NUM_ARM_OPTIONS   ARRAY_SIZE (regnames)
   3283 #define arm_regnames      regnames[regname_selected].reg_names
   3284 
   3285 static bfd_boolean force_thumb = FALSE;
   3286 
   3287 /* Current IT instruction state.  This contains the same state as the IT
   3288    bits in the CPSR.  */
   3289 static unsigned int ifthen_state;
   3290 /* IT state for the next instruction.  */
   3291 static unsigned int ifthen_next_state;
   3292 /* The address of the insn for which the IT state is valid.  */
   3293 static bfd_vma ifthen_address;
   3294 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
   3295 /* Indicates that the current Conditional state is unconditional or outside
   3296    an IT block.  */
   3297 #define COND_UNCOND 16
   3298 
   3299 
   3300 /* Functions.  */
   3302 
   3303 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
   3304    Returns pointer to following character of the format string and
   3305    fills in *VALUEP and *WIDTHP with the extracted value and number of
   3306    bits extracted.  WIDTHP can be NULL.  */
   3307 
   3308 static const char *
   3309 arm_decode_bitfield (const char *ptr,
   3310 		     unsigned long insn,
   3311 		     unsigned long *valuep,
   3312 		     int *widthp)
   3313 {
   3314   unsigned long value = 0;
   3315   int width = 0;
   3316 
   3317   do
   3318     {
   3319       int start, end;
   3320       int bits;
   3321 
   3322       for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
   3323 	start = start * 10 + *ptr - '0';
   3324       if (*ptr == '-')
   3325 	for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
   3326 	  end = end * 10 + *ptr - '0';
   3327       else
   3328 	end = start;
   3329       bits = end - start;
   3330       if (bits < 0)
   3331 	abort ();
   3332       value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
   3333       width += bits + 1;
   3334     }
   3335   while (*ptr++ == ',');
   3336   *valuep = value;
   3337   if (widthp)
   3338     *widthp = width;
   3339   return ptr - 1;
   3340 }
   3341 
   3342 static void
   3343 arm_decode_shift (long given, fprintf_ftype func, void *stream,
   3344 		  bfd_boolean print_shift)
   3345 {
   3346   func (stream, "%s", arm_regnames[given & 0xf]);
   3347 
   3348   if ((given & 0xff0) != 0)
   3349     {
   3350       if ((given & 0x10) == 0)
   3351 	{
   3352 	  int amount = (given & 0xf80) >> 7;
   3353 	  int shift = (given & 0x60) >> 5;
   3354 
   3355 	  if (amount == 0)
   3356 	    {
   3357 	      if (shift == 3)
   3358 		{
   3359 		  func (stream, ", rrx");
   3360 		  return;
   3361 		}
   3362 
   3363 	      amount = 32;
   3364 	    }
   3365 
   3366 	  if (print_shift)
   3367 	    func (stream, ", %s #%d", arm_shift[shift], amount);
   3368 	  else
   3369 	    func (stream, ", #%d", amount);
   3370 	}
   3371       else if ((given & 0x80) == 0x80)
   3372 	func (stream, "\t; <illegal shifter operand>");
   3373       else if (print_shift)
   3374 	func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
   3375 	      arm_regnames[(given & 0xf00) >> 8]);
   3376       else
   3377 	func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
   3378     }
   3379 }
   3380 
   3381 #define W_BIT 21
   3382 #define I_BIT 22
   3383 #define U_BIT 23
   3384 #define P_BIT 24
   3385 
   3386 #define WRITEBACK_BIT_SET   (given & (1 << W_BIT))
   3387 #define IMMEDIATE_BIT_SET   (given & (1 << I_BIT))
   3388 #define NEGATIVE_BIT_SET   ((given & (1 << U_BIT)) == 0)
   3389 #define PRE_BIT_SET         (given & (1 << P_BIT))
   3390 
   3391 /* Print one coprocessor instruction on INFO->STREAM.
   3392    Return TRUE if the instuction matched, FALSE if this is not a
   3393    recognised coprocessor instruction.  */
   3394 
   3395 static bfd_boolean
   3396 print_insn_coprocessor (bfd_vma pc,
   3397 			struct disassemble_info *info,
   3398 			long given,
   3399 			bfd_boolean thumb)
   3400 {
   3401   const struct opcode32 *insn;
   3402   void *stream = info->stream;
   3403   fprintf_ftype func = info->fprintf_func;
   3404   unsigned long mask;
   3405   unsigned long value = 0;
   3406   int cond;
   3407   int cp_num;
   3408   struct arm_private_data *private_data = info->private_data;
   3409   arm_feature_set allowed_arches = ARM_ARCH_NONE;
   3410 
   3411   allowed_arches = private_data->features;
   3412 
   3413   for (insn = coprocessor_opcodes; insn->assembler; insn++)
   3414     {
   3415       unsigned long u_reg = 16;
   3416       bfd_boolean is_unpredictable = FALSE;
   3417       signed long value_in_comment = 0;
   3418       const char *c;
   3419 
   3420       if (ARM_FEATURE_ZERO (insn->arch))
   3421 	switch (insn->value)
   3422 	  {
   3423 	  case SENTINEL_IWMMXT_START:
   3424 	    if (info->mach != bfd_mach_arm_XScale
   3425 		&& info->mach != bfd_mach_arm_iWMMXt
   3426 		&& info->mach != bfd_mach_arm_iWMMXt2)
   3427 	      do
   3428 		insn++;
   3429 	      while ((! ARM_FEATURE_ZERO (insn->arch))
   3430 		     && insn->value != SENTINEL_IWMMXT_END);
   3431 	    continue;
   3432 
   3433 	  case SENTINEL_IWMMXT_END:
   3434 	    continue;
   3435 
   3436 	  case SENTINEL_GENERIC_START:
   3437 	    allowed_arches = private_data->features;
   3438 	    continue;
   3439 
   3440 	  default:
   3441 	    abort ();
   3442 	  }
   3443 
   3444       mask = insn->mask;
   3445       value = insn->value;
   3446       cp_num = (given >> 8) & 0xf;
   3447 
   3448       if (thumb)
   3449 	{
   3450 	  /* The high 4 bits are 0xe for Arm conditional instructions, and
   3451 	     0xe for arm unconditional instructions.  The rest of the
   3452 	     encoding is the same.  */
   3453 	  mask |= 0xf0000000;
   3454 	  value |= 0xe0000000;
   3455 	  if (ifthen_state)
   3456 	    cond = IFTHEN_COND;
   3457 	  else
   3458 	    cond = COND_UNCOND;
   3459 	}
   3460       else
   3461 	{
   3462 	  /* Only match unconditional instuctions against unconditional
   3463 	     patterns.  */
   3464 	  if ((given & 0xf0000000) == 0xf0000000)
   3465 	    {
   3466 	      mask |= 0xf0000000;
   3467 	      cond = COND_UNCOND;
   3468 	    }
   3469 	  else
   3470 	    {
   3471 	      cond = (given >> 28) & 0xf;
   3472 	      if (cond == 0xe)
   3473 		cond = COND_UNCOND;
   3474 	    }
   3475 	}
   3476 
   3477       if ((given & mask) != value)
   3478 	continue;
   3479 
   3480       if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches))
   3481 	continue;
   3482 
   3483       if (insn->value == 0xfe000010     /* mcr2  */
   3484 	  || insn->value == 0xfe100010  /* mrc2  */
   3485 	  || insn->value == 0xfc100000  /* ldc2  */
   3486 	  || insn->value == 0xfc000000) /* stc2  */
   3487 	{
   3488 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
   3489 	    is_unpredictable = TRUE;
   3490 	}
   3491       else if (insn->value == 0x0e000000     /* cdp  */
   3492 	       || insn->value == 0xfe000000  /* cdp2  */
   3493 	       || insn->value == 0x0e000010  /* mcr  */
   3494 	       || insn->value == 0x0e100010  /* mrc  */
   3495 	       || insn->value == 0x0c100000  /* ldc  */
   3496 	       || insn->value == 0x0c000000) /* stc  */
   3497 	{
   3498 	  /* Floating-point instructions.  */
   3499 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
   3500 	    continue;
   3501 	}
   3502 
   3503       for (c = insn->assembler; *c; c++)
   3504 	{
   3505 	  if (*c == '%')
   3506 	    {
   3507 	      switch (*++c)
   3508 		{
   3509 		case '%':
   3510 		  func (stream, "%%");
   3511 		  break;
   3512 
   3513 		case 'A':
   3514 		  {
   3515 		    int rn = (given >> 16) & 0xf;
   3516 		    bfd_vma offset = given & 0xff;
   3517 
   3518 		    func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   3519 
   3520 		    if (PRE_BIT_SET || WRITEBACK_BIT_SET)
   3521 		      {
   3522 			/* Not unindexed.  The offset is scaled.  */
   3523 			if (cp_num == 9)
   3524 			  /* vldr.16/vstr.16 will shift the address
   3525 			     left by 1 bit only.  */
   3526 			  offset = offset * 2;
   3527 			else
   3528 			  offset = offset * 4;
   3529 
   3530 			if (NEGATIVE_BIT_SET)
   3531 			  offset = - offset;
   3532 			if (rn != 15)
   3533 			  value_in_comment = offset;
   3534 		      }
   3535 
   3536 		    if (PRE_BIT_SET)
   3537 		      {
   3538 			if (offset)
   3539 			  func (stream, ", #%d]%s",
   3540 				(int) offset,
   3541 				WRITEBACK_BIT_SET ? "!" : "");
   3542 			else if (NEGATIVE_BIT_SET)
   3543 			  func (stream, ", #-0]");
   3544 			else
   3545 			  func (stream, "]");
   3546 		      }
   3547 		    else
   3548 		      {
   3549 			func (stream, "]");
   3550 
   3551 			if (WRITEBACK_BIT_SET)
   3552 			  {
   3553 			    if (offset)
   3554 			      func (stream, ", #%d", (int) offset);
   3555 			    else if (NEGATIVE_BIT_SET)
   3556 			      func (stream, ", #-0");
   3557 			  }
   3558 			else
   3559 			  {
   3560 			    func (stream, ", {%s%d}",
   3561 				  (NEGATIVE_BIT_SET && !offset) ? "-" : "",
   3562 				  (int) offset);
   3563 			    value_in_comment = offset;
   3564 			  }
   3565 		      }
   3566 		    if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET))
   3567 		      {
   3568 			func (stream, "\t; ");
   3569 			/* For unaligned PCs, apply off-by-alignment
   3570 			   correction.  */
   3571 			info->print_address_func (offset + pc
   3572 						  + info->bytes_per_chunk * 2
   3573 						  - (pc & 3),
   3574 				 		  info);
   3575 		      }
   3576 		  }
   3577 		  break;
   3578 
   3579 		case 'B':
   3580 		  {
   3581 		    int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
   3582 		    int offset = (given >> 1) & 0x3f;
   3583 
   3584 		    if (offset == 1)
   3585 		      func (stream, "{d%d}", regno);
   3586 		    else if (regno + offset > 32)
   3587 		      func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
   3588 		    else
   3589 		      func (stream, "{d%d-d%d}", regno, regno + offset - 1);
   3590 		  }
   3591 		  break;
   3592 
   3593 		case 'u':
   3594 		  if (cond != COND_UNCOND)
   3595 		    is_unpredictable = TRUE;
   3596 
   3597 		  /* Fall through.  */
   3598 		case 'c':
   3599 		  if (cond != COND_UNCOND && cp_num == 9)
   3600 		    is_unpredictable = TRUE;
   3601 
   3602 		  func (stream, "%s", arm_conditional[cond]);
   3603 		  break;
   3604 
   3605 		case 'I':
   3606 		  /* Print a Cirrus/DSP shift immediate.  */
   3607 		  /* Immediates are 7bit signed ints with bits 0..3 in
   3608 		     bits 0..3 of opcode and bits 4..6 in bits 5..7
   3609 		     of opcode.  */
   3610 		  {
   3611 		    int imm;
   3612 
   3613 		    imm = (given & 0xf) | ((given & 0xe0) >> 1);
   3614 
   3615 		    /* Is ``imm'' a negative number?  */
   3616 		    if (imm & 0x40)
   3617 		      imm -= 0x80;
   3618 
   3619 		    func (stream, "%d", imm);
   3620 		  }
   3621 
   3622 		  break;
   3623 
   3624 		case 'F':
   3625 		  switch (given & 0x00408000)
   3626 		    {
   3627 		    case 0:
   3628 		      func (stream, "4");
   3629 		      break;
   3630 		    case 0x8000:
   3631 		      func (stream, "1");
   3632 		      break;
   3633 		    case 0x00400000:
   3634 		      func (stream, "2");
   3635 		      break;
   3636 		    default:
   3637 		      func (stream, "3");
   3638 		    }
   3639 		  break;
   3640 
   3641 		case 'P':
   3642 		  switch (given & 0x00080080)
   3643 		    {
   3644 		    case 0:
   3645 		      func (stream, "s");
   3646 		      break;
   3647 		    case 0x80:
   3648 		      func (stream, "d");
   3649 		      break;
   3650 		    case 0x00080000:
   3651 		      func (stream, "e");
   3652 		      break;
   3653 		    default:
   3654 		      func (stream, _("<illegal precision>"));
   3655 		      break;
   3656 		    }
   3657 		  break;
   3658 
   3659 		case 'Q':
   3660 		  switch (given & 0x00408000)
   3661 		    {
   3662 		    case 0:
   3663 		      func (stream, "s");
   3664 		      break;
   3665 		    case 0x8000:
   3666 		      func (stream, "d");
   3667 		      break;
   3668 		    case 0x00400000:
   3669 		      func (stream, "e");
   3670 		      break;
   3671 		    default:
   3672 		      func (stream, "p");
   3673 		      break;
   3674 		    }
   3675 		  break;
   3676 
   3677 		case 'R':
   3678 		  switch (given & 0x60)
   3679 		    {
   3680 		    case 0:
   3681 		      break;
   3682 		    case 0x20:
   3683 		      func (stream, "p");
   3684 		      break;
   3685 		    case 0x40:
   3686 		      func (stream, "m");
   3687 		      break;
   3688 		    default:
   3689 		      func (stream, "z");
   3690 		      break;
   3691 		    }
   3692 		  break;
   3693 
   3694 		case '0': case '1': case '2': case '3': case '4':
   3695 		case '5': case '6': case '7': case '8': case '9':
   3696 		  {
   3697 		    int width;
   3698 
   3699 		    c = arm_decode_bitfield (c, given, &value, &width);
   3700 
   3701 		    switch (*c)
   3702 		      {
   3703 		      case 'R':
   3704 			if (value == 15)
   3705 			  is_unpredictable = TRUE;
   3706 			/* Fall through.  */
   3707 		      case 'r':
   3708 			if (c[1] == 'u')
   3709 			  {
   3710 			    /* Eat the 'u' character.  */
   3711 			    ++ c;
   3712 
   3713 			    if (u_reg == value)
   3714 			      is_unpredictable = TRUE;
   3715 			    u_reg = value;
   3716 			  }
   3717 			func (stream, "%s", arm_regnames[value]);
   3718 			break;
   3719 		      case 'V':
   3720 			if (given & (1 << 6))
   3721 			  goto Q;
   3722 			/* FALLTHROUGH */
   3723 		      case 'D':
   3724 			func (stream, "d%ld", value);
   3725 			break;
   3726 		      case 'Q':
   3727 		      Q:
   3728 			if (value & 1)
   3729 			  func (stream, "<illegal reg q%ld.5>", value >> 1);
   3730 			else
   3731 			  func (stream, "q%ld", value >> 1);
   3732 			break;
   3733 		      case 'd':
   3734 			func (stream, "%ld", value);
   3735 			value_in_comment = value;
   3736 			break;
   3737 		      case 'E':
   3738                         {
   3739 			  /* Converts immediate 8 bit back to float value.  */
   3740 			  unsigned floatVal = (value & 0x80) << 24
   3741 			    | (value & 0x3F) << 19
   3742 			    | ((value & 0x40) ? (0xF8 << 22) : (1 << 30));
   3743 
   3744 			  /* Quarter float have a maximum value of 31.0.
   3745 			     Get floating point value multiplied by 1e7.
   3746 			     The maximum value stays in limit of a 32-bit int.  */
   3747 			  unsigned decVal =
   3748 			    (78125 << (((floatVal >> 23) & 0xFF) - 124)) *
   3749 			    (16 + (value & 0xF));
   3750 
   3751 			  if (!(decVal % 1000000))
   3752 			    func (stream, "%ld\t; 0x%08x %c%u.%01u", value,
   3753 				  floatVal, value & 0x80 ? '-' : ' ',
   3754 				  decVal / 10000000,
   3755 				  decVal % 10000000 / 1000000);
   3756 			  else if (!(decVal % 10000))
   3757 			    func (stream, "%ld\t; 0x%08x %c%u.%03u", value,
   3758 				  floatVal, value & 0x80 ? '-' : ' ',
   3759 				  decVal / 10000000,
   3760 				  decVal % 10000000 / 10000);
   3761 			  else
   3762 			    func (stream, "%ld\t; 0x%08x %c%u.%07u", value,
   3763 				  floatVal, value & 0x80 ? '-' : ' ',
   3764 				  decVal / 10000000, decVal % 10000000);
   3765 			  break;
   3766 			}
   3767 		      case 'k':
   3768 			{
   3769 			  int from = (given & (1 << 7)) ? 32 : 16;
   3770 			  func (stream, "%ld", from - value);
   3771 			}
   3772 			break;
   3773 
   3774 		      case 'f':
   3775 			if (value > 7)
   3776 			  func (stream, "#%s", arm_fp_const[value & 7]);
   3777 			else
   3778 			  func (stream, "f%ld", value);
   3779 			break;
   3780 
   3781 		      case 'w':
   3782 			if (width == 2)
   3783 			  func (stream, "%s", iwmmxt_wwnames[value]);
   3784 			else
   3785 			  func (stream, "%s", iwmmxt_wwssnames[value]);
   3786 			break;
   3787 
   3788 		      case 'g':
   3789 			func (stream, "%s", iwmmxt_regnames[value]);
   3790 			break;
   3791 		      case 'G':
   3792 			func (stream, "%s", iwmmxt_cregnames[value]);
   3793 			break;
   3794 
   3795 		      case 'x':
   3796 			func (stream, "0x%lx", (value & 0xffffffffUL));
   3797 			break;
   3798 
   3799 		      case 'c':
   3800 			switch (value)
   3801 			  {
   3802 			  case 0:
   3803 			    func (stream, "eq");
   3804 			    break;
   3805 
   3806 			  case 1:
   3807 			    func (stream, "vs");
   3808 			    break;
   3809 
   3810 			  case 2:
   3811 			    func (stream, "ge");
   3812 			    break;
   3813 
   3814 			  case 3:
   3815 			    func (stream, "gt");
   3816 			    break;
   3817 
   3818 			  default:
   3819 			    func (stream, "??");
   3820 			    break;
   3821 			  }
   3822 			break;
   3823 
   3824 		      case '`':
   3825 			c++;
   3826 			if (value == 0)
   3827 			  func (stream, "%c", *c);
   3828 			break;
   3829 		      case '\'':
   3830 			c++;
   3831 			if (value == ((1ul << width) - 1))
   3832 			  func (stream, "%c", *c);
   3833 			break;
   3834 		      case '?':
   3835 			func (stream, "%c", c[(1 << width) - (int) value]);
   3836 			c += 1 << width;
   3837 			break;
   3838 		      default:
   3839 			abort ();
   3840 		      }
   3841 		    break;
   3842 
   3843 		  case 'y':
   3844 		  case 'z':
   3845 		    {
   3846 		      int single = *c++ == 'y';
   3847 		      int regno;
   3848 
   3849 		      switch (*c)
   3850 			{
   3851 			case '4': /* Sm pair */
   3852 			case '0': /* Sm, Dm */
   3853 			  regno = given & 0x0000000f;
   3854 			  if (single)
   3855 			    {
   3856 			      regno <<= 1;
   3857 			      regno += (given >> 5) & 1;
   3858 			    }
   3859 			  else
   3860 			    regno += ((given >> 5) & 1) << 4;
   3861 			  break;
   3862 
   3863 			case '1': /* Sd, Dd */
   3864 			  regno = (given >> 12) & 0x0000000f;
   3865 			  if (single)
   3866 			    {
   3867 			      regno <<= 1;
   3868 			      regno += (given >> 22) & 1;
   3869 			    }
   3870 			  else
   3871 			    regno += ((given >> 22) & 1) << 4;
   3872 			  break;
   3873 
   3874 			case '2': /* Sn, Dn */
   3875 			  regno = (given >> 16) & 0x0000000f;
   3876 			  if (single)
   3877 			    {
   3878 			      regno <<= 1;
   3879 			      regno += (given >> 7) & 1;
   3880 			    }
   3881 			  else
   3882 			    regno += ((given >> 7) & 1) << 4;
   3883 			  break;
   3884 
   3885 			case '3': /* List */
   3886 			  func (stream, "{");
   3887 			  regno = (given >> 12) & 0x0000000f;
   3888 			  if (single)
   3889 			    {
   3890 			      regno <<= 1;
   3891 			      regno += (given >> 22) & 1;
   3892 			    }
   3893 			  else
   3894 			    regno += ((given >> 22) & 1) << 4;
   3895 			  break;
   3896 
   3897 			default:
   3898 			  abort ();
   3899 			}
   3900 
   3901 		      func (stream, "%c%d", single ? 's' : 'd', regno);
   3902 
   3903 		      if (*c == '3')
   3904 			{
   3905 			  int count = given & 0xff;
   3906 
   3907 			  if (single == 0)
   3908 			    count >>= 1;
   3909 
   3910 			  if (--count)
   3911 			    {
   3912 			      func (stream, "-%c%d",
   3913 				    single ? 's' : 'd',
   3914 				    regno + count);
   3915 			    }
   3916 
   3917 			  func (stream, "}");
   3918 			}
   3919 		      else if (*c == '4')
   3920 			func (stream, ", %c%d", single ? 's' : 'd',
   3921 			      regno + 1);
   3922 		    }
   3923 		    break;
   3924 
   3925 		  case 'L':
   3926 		    switch (given & 0x00400100)
   3927 		      {
   3928 		      case 0x00000000: func (stream, "b"); break;
   3929 		      case 0x00400000: func (stream, "h"); break;
   3930 		      case 0x00000100: func (stream, "w"); break;
   3931 		      case 0x00400100: func (stream, "d"); break;
   3932 		      default:
   3933 			break;
   3934 		      }
   3935 		    break;
   3936 
   3937 		  case 'Z':
   3938 		    {
   3939 		      /* given (20, 23) | given (0, 3) */
   3940 		      value = ((given >> 16) & 0xf0) | (given & 0xf);
   3941 		      func (stream, "%d", (int) value);
   3942 		    }
   3943 		    break;
   3944 
   3945 		  case 'l':
   3946 		    /* This is like the 'A' operator, except that if
   3947 		       the width field "M" is zero, then the offset is
   3948 		       *not* multiplied by four.  */
   3949 		    {
   3950 		      int offset = given & 0xff;
   3951 		      int multiplier = (given & 0x00000100) ? 4 : 1;
   3952 
   3953 		      func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   3954 
   3955 		      if (multiplier > 1)
   3956 			{
   3957 			  value_in_comment = offset * multiplier;
   3958 			  if (NEGATIVE_BIT_SET)
   3959 			    value_in_comment = - value_in_comment;
   3960 			}
   3961 
   3962 		      if (offset)
   3963 			{
   3964 			  if (PRE_BIT_SET)
   3965 			    func (stream, ", #%s%d]%s",
   3966 				  NEGATIVE_BIT_SET ? "-" : "",
   3967 				  offset * multiplier,
   3968 				  WRITEBACK_BIT_SET ? "!" : "");
   3969 			  else
   3970 			    func (stream, "], #%s%d",
   3971 				  NEGATIVE_BIT_SET ? "-" : "",
   3972 				  offset * multiplier);
   3973 			}
   3974 		      else
   3975 			func (stream, "]");
   3976 		    }
   3977 		    break;
   3978 
   3979 		  case 'r':
   3980 		    {
   3981 		      int imm4 = (given >> 4) & 0xf;
   3982 		      int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1);
   3983 		      int ubit = ! NEGATIVE_BIT_SET;
   3984 		      const char *rm = arm_regnames [given & 0xf];
   3985 		      const char *rn = arm_regnames [(given >> 16) & 0xf];
   3986 
   3987 		      switch (puw_bits)
   3988 			{
   3989 			case 1:
   3990 			case 3:
   3991 			  func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
   3992 			  if (imm4)
   3993 			    func (stream, ", lsl #%d", imm4);
   3994 			  break;
   3995 
   3996 			case 4:
   3997 			case 5:
   3998 			case 6:
   3999 			case 7:
   4000 			  func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
   4001 			  if (imm4 > 0)
   4002 			    func (stream, ", lsl #%d", imm4);
   4003 			  func (stream, "]");
   4004 			  if (puw_bits == 5 || puw_bits == 7)
   4005 			    func (stream, "!");
   4006 			  break;
   4007 
   4008 			default:
   4009 			  func (stream, "INVALID");
   4010 			}
   4011 		    }
   4012 		    break;
   4013 
   4014 		  case 'i':
   4015 		    {
   4016 		      long imm5;
   4017 		      imm5 = ((given & 0x100) >> 4) | (given & 0xf);
   4018 		      func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
   4019 		    }
   4020 		    break;
   4021 
   4022 		  default:
   4023 		    abort ();
   4024 		  }
   4025 		}
   4026 	    }
   4027 	  else
   4028 	    func (stream, "%c", *c);
   4029 	}
   4030 
   4031       if (value_in_comment > 32 || value_in_comment < -16)
   4032 	func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
   4033 
   4034       if (is_unpredictable)
   4035 	func (stream, UNPREDICTABLE_INSTRUCTION);
   4036 
   4037       return TRUE;
   4038     }
   4039   return FALSE;
   4040 }
   4041 
   4042 /* Decodes and prints ARM addressing modes.  Returns the offset
   4043    used in the address, if any, if it is worthwhile printing the
   4044    offset as a hexadecimal value in a comment at the end of the
   4045    line of disassembly.  */
   4046 
   4047 static signed long
   4048 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
   4049 {
   4050   void *stream = info->stream;
   4051   fprintf_ftype func = info->fprintf_func;
   4052   bfd_vma offset = 0;
   4053 
   4054   if (((given & 0x000f0000) == 0x000f0000)
   4055       && ((given & 0x02000000) == 0))
   4056     {
   4057       offset = given & 0xfff;
   4058 
   4059       func (stream, "[pc");
   4060 
   4061       if (PRE_BIT_SET)
   4062 	{
   4063 	  /* Pre-indexed.  Elide offset of positive zero when
   4064 	     non-writeback.  */
   4065 	  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
   4066 	    func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4067 
   4068 	  if (NEGATIVE_BIT_SET)
   4069 	    offset = -offset;
   4070 
   4071 	  offset += pc + 8;
   4072 
   4073 	  /* Cope with the possibility of write-back
   4074 	     being used.  Probably a very dangerous thing
   4075 	     for the programmer to do, but who are we to
   4076 	     argue ?  */
   4077 	  func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : "");
   4078 	}
   4079       else  /* Post indexed.  */
   4080 	{
   4081 	  func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4082 
   4083 	  /* Ie ignore the offset.  */
   4084 	  offset = pc + 8;
   4085 	}
   4086 
   4087       func (stream, "\t; ");
   4088       info->print_address_func (offset, info);
   4089       offset = 0;
   4090     }
   4091   else
   4092     {
   4093       func (stream, "[%s",
   4094 	    arm_regnames[(given >> 16) & 0xf]);
   4095 
   4096       if (PRE_BIT_SET)
   4097 	{
   4098 	  if ((given & 0x02000000) == 0)
   4099 	    {
   4100 	      /* Elide offset of positive zero when non-writeback.  */
   4101 	      offset = given & 0xfff;
   4102 	      if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
   4103 		func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4104 	    }
   4105 	  else
   4106 	    {
   4107 	      func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : "");
   4108 	      arm_decode_shift (given, func, stream, TRUE);
   4109 	    }
   4110 
   4111 	  func (stream, "]%s",
   4112 		WRITEBACK_BIT_SET ? "!" : "");
   4113 	}
   4114       else
   4115 	{
   4116 	  if ((given & 0x02000000) == 0)
   4117 	    {
   4118 	      /* Always show offset.  */
   4119 	      offset = given & 0xfff;
   4120 	      func (stream, "], #%s%d",
   4121 		    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4122 	    }
   4123 	  else
   4124 	    {
   4125 	      func (stream, "], %s",
   4126 		    NEGATIVE_BIT_SET ? "-" : "");
   4127 	      arm_decode_shift (given, func, stream, TRUE);
   4128 	    }
   4129 	}
   4130       if (NEGATIVE_BIT_SET)
   4131 	offset = -offset;
   4132     }
   4133 
   4134   return (signed long) offset;
   4135 }
   4136 
   4137 /* Print one neon instruction on INFO->STREAM.
   4138    Return TRUE if the instuction matched, FALSE if this is not a
   4139    recognised neon instruction.  */
   4140 
   4141 static bfd_boolean
   4142 print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
   4143 {
   4144   const struct opcode32 *insn;
   4145   void *stream = info->stream;
   4146   fprintf_ftype func = info->fprintf_func;
   4147 
   4148   if (thumb)
   4149     {
   4150       if ((given & 0xef000000) == 0xef000000)
   4151 	{
   4152 	  /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding.  */
   4153 	  unsigned long bit28 = given & (1 << 28);
   4154 
   4155 	  given &= 0x00ffffff;
   4156 	  if (bit28)
   4157             given |= 0xf3000000;
   4158           else
   4159 	    given |= 0xf2000000;
   4160 	}
   4161       else if ((given & 0xff000000) == 0xf9000000)
   4162 	given ^= 0xf9000000 ^ 0xf4000000;
   4163       else
   4164 	return FALSE;
   4165     }
   4166 
   4167   for (insn = neon_opcodes; insn->assembler; insn++)
   4168     {
   4169       if ((given & insn->mask) == insn->value)
   4170 	{
   4171 	  signed long value_in_comment = 0;
   4172 	  bfd_boolean is_unpredictable = FALSE;
   4173 	  const char *c;
   4174 
   4175 	  for (c = insn->assembler; *c; c++)
   4176 	    {
   4177 	      if (*c == '%')
   4178 		{
   4179 		  switch (*++c)
   4180 		    {
   4181 		    case '%':
   4182 		      func (stream, "%%");
   4183 		      break;
   4184 
   4185 		    case 'u':
   4186 		      if (thumb && ifthen_state)
   4187 			is_unpredictable = TRUE;
   4188 
   4189 		      /* Fall through.  */
   4190 		    case 'c':
   4191 		      if (thumb && ifthen_state)
   4192 			func (stream, "%s", arm_conditional[IFTHEN_COND]);
   4193 		      break;
   4194 
   4195 		    case 'A':
   4196 		      {
   4197 			static const unsigned char enc[16] =
   4198 			{
   4199 			  0x4, 0x14, /* st4 0,1 */
   4200 			  0x4, /* st1 2 */
   4201 			  0x4, /* st2 3 */
   4202 			  0x3, /* st3 4 */
   4203 			  0x13, /* st3 5 */
   4204 			  0x3, /* st1 6 */
   4205 			  0x1, /* st1 7 */
   4206 			  0x2, /* st2 8 */
   4207 			  0x12, /* st2 9 */
   4208 			  0x2, /* st1 10 */
   4209 			  0, 0, 0, 0, 0
   4210 			};
   4211 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   4212 			int rn = ((given >> 16) & 0xf);
   4213 			int rm = ((given >> 0) & 0xf);
   4214 			int align = ((given >> 4) & 0x3);
   4215 			int type = ((given >> 8) & 0xf);
   4216 			int n = enc[type] & 0xf;
   4217 			int stride = (enc[type] >> 4) + 1;
   4218 			int ix;
   4219 
   4220 			func (stream, "{");
   4221 			if (stride > 1)
   4222 			  for (ix = 0; ix != n; ix++)
   4223 			    func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
   4224 			else if (n == 1)
   4225 			  func (stream, "d%d", rd);
   4226 			else
   4227 			  func (stream, "d%d-d%d", rd, rd + n - 1);
   4228 			func (stream, "}, [%s", arm_regnames[rn]);
   4229 			if (align)
   4230 			  func (stream, " :%d", 32 << align);
   4231 			func (stream, "]");
   4232 			if (rm == 0xd)
   4233 			  func (stream, "!");
   4234 			else if (rm != 0xf)
   4235 			  func (stream, ", %s", arm_regnames[rm]);
   4236 		      }
   4237 		      break;
   4238 
   4239 		    case 'B':
   4240 		      {
   4241 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   4242 			int rn = ((given >> 16) & 0xf);
   4243 			int rm = ((given >> 0) & 0xf);
   4244 			int idx_align = ((given >> 4) & 0xf);
   4245                         int align = 0;
   4246 			int size = ((given >> 10) & 0x3);
   4247 			int idx = idx_align >> (size + 1);
   4248                         int length = ((given >> 8) & 3) + 1;
   4249                         int stride = 1;
   4250                         int i;
   4251 
   4252                         if (length > 1 && size > 0)
   4253                           stride = (idx_align & (1 << size)) ? 2 : 1;
   4254 
   4255                         switch (length)
   4256                           {
   4257                           case 1:
   4258                             {
   4259                               int amask = (1 << size) - 1;
   4260                               if ((idx_align & (1 << size)) != 0)
   4261                                 return FALSE;
   4262                               if (size > 0)
   4263                                 {
   4264                                   if ((idx_align & amask) == amask)
   4265                                     align = 8 << size;
   4266                                   else if ((idx_align & amask) != 0)
   4267                                     return FALSE;
   4268                                 }
   4269                               }
   4270                             break;
   4271 
   4272                           case 2:
   4273                             if (size == 2 && (idx_align & 2) != 0)
   4274                               return FALSE;
   4275                             align = (idx_align & 1) ? 16 << size : 0;
   4276                             break;
   4277 
   4278                           case 3:
   4279                             if ((size == 2 && (idx_align & 3) != 0)
   4280                                 || (idx_align & 1) != 0)
   4281                               return FALSE;
   4282                             break;
   4283 
   4284                           case 4:
   4285                             if (size == 2)
   4286                               {
   4287                                 if ((idx_align & 3) == 3)
   4288                                   return FALSE;
   4289                                 align = (idx_align & 3) * 64;
   4290                               }
   4291                             else
   4292                               align = (idx_align & 1) ? 32 << size : 0;
   4293                             break;
   4294 
   4295                           default:
   4296                             abort ();
   4297                           }
   4298 
   4299 			func (stream, "{");
   4300                         for (i = 0; i < length; i++)
   4301                           func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
   4302                             rd + i * stride, idx);
   4303                         func (stream, "}, [%s", arm_regnames[rn]);
   4304 			if (align)
   4305 			  func (stream, " :%d", align);
   4306 			func (stream, "]");
   4307 			if (rm == 0xd)
   4308 			  func (stream, "!");
   4309 			else if (rm != 0xf)
   4310 			  func (stream, ", %s", arm_regnames[rm]);
   4311 		      }
   4312 		      break;
   4313 
   4314 		    case 'C':
   4315 		      {
   4316 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   4317 			int rn = ((given >> 16) & 0xf);
   4318 			int rm = ((given >> 0) & 0xf);
   4319 			int align = ((given >> 4) & 0x1);
   4320 			int size = ((given >> 6) & 0x3);
   4321 			int type = ((given >> 8) & 0x3);
   4322 			int n = type + 1;
   4323 			int stride = ((given >> 5) & 0x1);
   4324 			int ix;
   4325 
   4326 			if (stride && (n == 1))
   4327 			  n++;
   4328 			else
   4329 			  stride++;
   4330 
   4331 			func (stream, "{");
   4332 			if (stride > 1)
   4333 			  for (ix = 0; ix != n; ix++)
   4334 			    func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
   4335 			else if (n == 1)
   4336 			  func (stream, "d%d[]", rd);
   4337 			else
   4338 			  func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
   4339 			func (stream, "}, [%s", arm_regnames[rn]);
   4340 			if (align)
   4341 			  {
   4342                             align = (8 * (type + 1)) << size;
   4343                             if (type == 3)
   4344                               align = (size > 1) ? align >> 1 : align;
   4345 			    if (type == 2 || (type == 0 && !size))
   4346 			      func (stream, " :<bad align %d>", align);
   4347 			    else
   4348 			      func (stream, " :%d", align);
   4349 			  }
   4350 			func (stream, "]");
   4351 			if (rm == 0xd)
   4352 			  func (stream, "!");
   4353 			else if (rm != 0xf)
   4354 			  func (stream, ", %s", arm_regnames[rm]);
   4355 		      }
   4356 		      break;
   4357 
   4358 		    case 'D':
   4359 		      {
   4360 			int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
   4361 			int size = (given >> 20) & 3;
   4362 			int reg = raw_reg & ((4 << size) - 1);
   4363 			int ix = raw_reg >> size >> 2;
   4364 
   4365 			func (stream, "d%d[%d]", reg, ix);
   4366 		      }
   4367 		      break;
   4368 
   4369 		    case 'E':
   4370 		      /* Neon encoded constant for mov, mvn, vorr, vbic.  */
   4371 		      {
   4372 			int bits = 0;
   4373 			int cmode = (given >> 8) & 0xf;
   4374 			int op = (given >> 5) & 0x1;
   4375 			unsigned long value = 0, hival = 0;
   4376 			unsigned shift;
   4377                         int size = 0;
   4378                         int isfloat = 0;
   4379 
   4380 			bits |= ((given >> 24) & 1) << 7;
   4381 			bits |= ((given >> 16) & 7) << 4;
   4382 			bits |= ((given >> 0) & 15) << 0;
   4383 
   4384 			if (cmode < 8)
   4385 			  {
   4386 			    shift = (cmode >> 1) & 3;
   4387 			    value = (unsigned long) bits << (8 * shift);
   4388                             size = 32;
   4389 			  }
   4390 			else if (cmode < 12)
   4391 			  {
   4392 			    shift = (cmode >> 1) & 1;
   4393 			    value = (unsigned long) bits << (8 * shift);
   4394                             size = 16;
   4395 			  }
   4396 			else if (cmode < 14)
   4397 			  {
   4398 			    shift = (cmode & 1) + 1;
   4399 			    value = (unsigned long) bits << (8 * shift);
   4400 			    value |= (1ul << (8 * shift)) - 1;
   4401                             size = 32;
   4402 			  }
   4403 			else if (cmode == 14)
   4404 			  {
   4405 			    if (op)
   4406 			      {
   4407 				/* Bit replication into bytes.  */
   4408 				int ix;
   4409 				unsigned long mask;
   4410 
   4411 				value = 0;
   4412                                 hival = 0;
   4413 				for (ix = 7; ix >= 0; ix--)
   4414 				  {
   4415 				    mask = ((bits >> ix) & 1) ? 0xff : 0;
   4416                                     if (ix <= 3)
   4417 				      value = (value << 8) | mask;
   4418                                     else
   4419                                       hival = (hival << 8) | mask;
   4420 				  }
   4421                                 size = 64;
   4422 			      }
   4423                             else
   4424                               {
   4425                                 /* Byte replication.  */
   4426                                 value = (unsigned long) bits;
   4427                                 size = 8;
   4428                               }
   4429 			  }
   4430 			else if (!op)
   4431 			  {
   4432 			    /* Floating point encoding.  */
   4433 			    int tmp;
   4434 
   4435 			    value = (unsigned long)  (bits & 0x7f) << 19;
   4436 			    value |= (unsigned long) (bits & 0x80) << 24;
   4437 			    tmp = bits & 0x40 ? 0x3c : 0x40;
   4438 			    value |= (unsigned long) tmp << 24;
   4439                             size = 32;
   4440                             isfloat = 1;
   4441 			  }
   4442 			else
   4443 			  {
   4444 			    func (stream, "<illegal constant %.8x:%x:%x>",
   4445                                   bits, cmode, op);
   4446                             size = 32;
   4447 			    break;
   4448 			  }
   4449                         switch (size)
   4450                           {
   4451                           case 8:
   4452 			    func (stream, "#%ld\t; 0x%.2lx", value, value);
   4453                             break;
   4454 
   4455                           case 16:
   4456                             func (stream, "#%ld\t; 0x%.4lx", value, value);
   4457                             break;
   4458 
   4459                           case 32:
   4460                             if (isfloat)
   4461                               {
   4462                                 unsigned char valbytes[4];
   4463                                 double fvalue;
   4464 
   4465                                 /* Do this a byte at a time so we don't have to
   4466                                    worry about the host's endianness.  */
   4467                                 valbytes[0] = value & 0xff;
   4468                                 valbytes[1] = (value >> 8) & 0xff;
   4469                                 valbytes[2] = (value >> 16) & 0xff;
   4470                                 valbytes[3] = (value >> 24) & 0xff;
   4471 
   4472                                 floatformat_to_double
   4473                                   (& floatformat_ieee_single_little, valbytes,
   4474                                   & fvalue);
   4475 
   4476                                 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
   4477                                       value);
   4478                               }
   4479                             else
   4480                               func (stream, "#%ld\t; 0x%.8lx",
   4481 				    (long) (((value & 0x80000000L) != 0)
   4482 					    ? value | ~0xffffffffL : value),
   4483 				    value);
   4484                             break;
   4485 
   4486                           case 64:
   4487                             func (stream, "#0x%.8lx%.8lx", hival, value);
   4488                             break;
   4489 
   4490                           default:
   4491                             abort ();
   4492                           }
   4493 		      }
   4494 		      break;
   4495 
   4496 		    case 'F':
   4497 		      {
   4498 			int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
   4499 			int num = (given >> 8) & 0x3;
   4500 
   4501 			if (!num)
   4502 			  func (stream, "{d%d}", regno);
   4503 			else if (num + regno >= 32)
   4504 			  func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
   4505 			else
   4506 			  func (stream, "{d%d-d%d}", regno, regno + num);
   4507 		      }
   4508 		      break;
   4509 
   4510 
   4511 		    case '0': case '1': case '2': case '3': case '4':
   4512 		    case '5': case '6': case '7': case '8': case '9':
   4513 		      {
   4514 			int width;
   4515 			unsigned long value;
   4516 
   4517 			c = arm_decode_bitfield (c, given, &value, &width);
   4518 
   4519 			switch (*c)
   4520 			  {
   4521 			  case 'r':
   4522 			    func (stream, "%s", arm_regnames[value]);
   4523 			    break;
   4524 			  case 'd':
   4525 			    func (stream, "%ld", value);
   4526 			    value_in_comment = value;
   4527 			    break;
   4528 			  case 'e':
   4529 			    func (stream, "%ld", (1ul << width) - value);
   4530 			    break;
   4531 
   4532 			  case 'S':
   4533 			  case 'T':
   4534 			  case 'U':
   4535 			    /* Various width encodings.  */
   4536 			    {
   4537 			      int base = 8 << (*c - 'S'); /* 8,16 or 32 */
   4538 			      int limit;
   4539 			      unsigned low, high;
   4540 
   4541 			      c++;
   4542 			      if (*c >= '0' && *c <= '9')
   4543 				limit = *c - '0';
   4544 			      else if (*c >= 'a' && *c <= 'f')
   4545 				limit = *c - 'a' + 10;
   4546 			      else
   4547 				abort ();
   4548 			      low = limit >> 2;
   4549 			      high = limit & 3;
   4550 
   4551 			      if (value < low || value > high)
   4552 				func (stream, "<illegal width %d>", base << value);
   4553 			      else
   4554 				func (stream, "%d", base << value);
   4555 			    }
   4556 			    break;
   4557 			  case 'R':
   4558 			    if (given & (1 << 6))
   4559 			      goto Q;
   4560 			    /* FALLTHROUGH */
   4561 			  case 'D':
   4562 			    func (stream, "d%ld", value);
   4563 			    break;
   4564 			  case 'Q':
   4565 			  Q:
   4566 			    if (value & 1)
   4567 			      func (stream, "<illegal reg q%ld.5>", value >> 1);
   4568 			    else
   4569 			      func (stream, "q%ld", value >> 1);
   4570 			    break;
   4571 
   4572 			  case '`':
   4573 			    c++;
   4574 			    if (value == 0)
   4575 			      func (stream, "%c", *c);
   4576 			    break;
   4577 			  case '\'':
   4578 			    c++;
   4579 			    if (value == ((1ul << width) - 1))
   4580 			      func (stream, "%c", *c);
   4581 			    break;
   4582 			  case '?':
   4583 			    func (stream, "%c", c[(1 << width) - (int) value]);
   4584 			    c += 1 << width;
   4585 			    break;
   4586 			  default:
   4587 			    abort ();
   4588 			  }
   4589 			break;
   4590 
   4591 		      default:
   4592 			abort ();
   4593 		      }
   4594 		    }
   4595 		}
   4596 	      else
   4597 		func (stream, "%c", *c);
   4598 	    }
   4599 
   4600 	  if (value_in_comment > 32 || value_in_comment < -16)
   4601 	    func (stream, "\t; 0x%lx", value_in_comment);
   4602 
   4603 	  if (is_unpredictable)
   4604 	    func (stream, UNPREDICTABLE_INSTRUCTION);
   4605 
   4606 	  return TRUE;
   4607 	}
   4608     }
   4609   return FALSE;
   4610 }
   4611 
   4612 /* Return the name of a v7A special register.  */
   4613 
   4614 static const char *
   4615 banked_regname (unsigned reg)
   4616 {
   4617   switch (reg)
   4618     {
   4619       case 15: return "CPSR";
   4620       case 32: return "R8_usr";
   4621       case 33: return "R9_usr";
   4622       case 34: return "R10_usr";
   4623       case 35: return "R11_usr";
   4624       case 36: return "R12_usr";
   4625       case 37: return "SP_usr";
   4626       case 38: return "LR_usr";
   4627       case 40: return "R8_fiq";
   4628       case 41: return "R9_fiq";
   4629       case 42: return "R10_fiq";
   4630       case 43: return "R11_fiq";
   4631       case 44: return "R12_fiq";
   4632       case 45: return "SP_fiq";
   4633       case 46: return "LR_fiq";
   4634       case 48: return "LR_irq";
   4635       case 49: return "SP_irq";
   4636       case 50: return "LR_svc";
   4637       case 51: return "SP_svc";
   4638       case 52: return "LR_abt";
   4639       case 53: return "SP_abt";
   4640       case 54: return "LR_und";
   4641       case 55: return "SP_und";
   4642       case 60: return "LR_mon";
   4643       case 61: return "SP_mon";
   4644       case 62: return "ELR_hyp";
   4645       case 63: return "SP_hyp";
   4646       case 79: return "SPSR";
   4647       case 110: return "SPSR_fiq";
   4648       case 112: return "SPSR_irq";
   4649       case 114: return "SPSR_svc";
   4650       case 116: return "SPSR_abt";
   4651       case 118: return "SPSR_und";
   4652       case 124: return "SPSR_mon";
   4653       case 126: return "SPSR_hyp";
   4654       default: return NULL;
   4655     }
   4656 }
   4657 
   4658 /* Return the name of the DMB/DSB option.  */
   4659 static const char *
   4660 data_barrier_option (unsigned option)
   4661 {
   4662   switch (option & 0xf)
   4663     {
   4664     case 0xf: return "sy";
   4665     case 0xe: return "st";
   4666     case 0xd: return "ld";
   4667     case 0xb: return "ish";
   4668     case 0xa: return "ishst";
   4669     case 0x9: return "ishld";
   4670     case 0x7: return "un";
   4671     case 0x6: return "unst";
   4672     case 0x5: return "nshld";
   4673     case 0x3: return "osh";
   4674     case 0x2: return "oshst";
   4675     case 0x1: return "oshld";
   4676     default:  return NULL;
   4677     }
   4678 }
   4679 
   4680 /* Print one ARM instruction from PC on INFO->STREAM.  */
   4681 
   4682 static void
   4683 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
   4684 {
   4685   const struct opcode32 *insn;
   4686   void *stream = info->stream;
   4687   fprintf_ftype func = info->fprintf_func;
   4688   struct arm_private_data *private_data = info->private_data;
   4689 
   4690   if (print_insn_coprocessor (pc, info, given, FALSE))
   4691     return;
   4692 
   4693   if (print_insn_neon (info, given, FALSE))
   4694     return;
   4695 
   4696   for (insn = arm_opcodes; insn->assembler; insn++)
   4697     {
   4698       if ((given & insn->mask) != insn->value)
   4699 	continue;
   4700 
   4701       if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features))
   4702 	continue;
   4703 
   4704       /* Special case: an instruction with all bits set in the condition field
   4705 	 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
   4706 	 or by the catchall at the end of the table.  */
   4707       if ((given & 0xF0000000) != 0xF0000000
   4708 	  || (insn->mask & 0xF0000000) == 0xF0000000
   4709 	  || (insn->mask == 0 && insn->value == 0))
   4710 	{
   4711 	  unsigned long u_reg = 16;
   4712 	  unsigned long U_reg = 16;
   4713 	  bfd_boolean is_unpredictable = FALSE;
   4714 	  signed long value_in_comment = 0;
   4715 	  const char *c;
   4716 
   4717 	  for (c = insn->assembler; *c; c++)
   4718 	    {
   4719 	      if (*c == '%')
   4720 		{
   4721 		  bfd_boolean allow_unpredictable = FALSE;
   4722 
   4723 		  switch (*++c)
   4724 		    {
   4725 		    case '%':
   4726 		      func (stream, "%%");
   4727 		      break;
   4728 
   4729 		    case 'a':
   4730 		      value_in_comment = print_arm_address (pc, info, given);
   4731 		      break;
   4732 
   4733 		    case 'P':
   4734 		      /* Set P address bit and use normal address
   4735 			 printing routine.  */
   4736 		      value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT));
   4737 		      break;
   4738 
   4739 		    case 'S':
   4740 		      allow_unpredictable = TRUE;
   4741 		      /* Fall through.  */
   4742 		    case 's':
   4743                       if ((given & 0x004f0000) == 0x004f0000)
   4744 			{
   4745                           /* PC relative with immediate offset.  */
   4746 			  bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf);
   4747 
   4748 			  if (PRE_BIT_SET)
   4749 			    {
   4750 			      /* Elide positive zero offset.  */
   4751 			      if (offset || NEGATIVE_BIT_SET)
   4752 				func (stream, "[pc, #%s%d]\t; ",
   4753 				      NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4754 			      else
   4755 				func (stream, "[pc]\t; ");
   4756 			      if (NEGATIVE_BIT_SET)
   4757 				offset = -offset;
   4758 			      info->print_address_func (offset + pc + 8, info);
   4759 			    }
   4760 			  else
   4761 			    {
   4762 			      /* Always show the offset.  */
   4763 			      func (stream, "[pc], #%s%d",
   4764 				    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   4765 			      if (! allow_unpredictable)
   4766 				is_unpredictable = TRUE;
   4767 			    }
   4768 			}
   4769 		      else
   4770 			{
   4771 			  int offset = ((given & 0xf00) >> 4) | (given & 0xf);
   4772 
   4773 			  func (stream, "[%s",
   4774 				arm_regnames[(given >> 16) & 0xf]);
   4775 
   4776 			  if (PRE_BIT_SET)
   4777 			    {
   4778 			      if (IMMEDIATE_BIT_SET)
   4779 				{
   4780 				  /* Elide offset for non-writeback
   4781 				     positive zero.  */
   4782 				  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET
   4783 				      || offset)
   4784 				    func (stream, ", #%s%d",
   4785 					  NEGATIVE_BIT_SET ? "-" : "", offset);
   4786 
   4787 				  if (NEGATIVE_BIT_SET)
   4788 				    offset = -offset;
   4789 
   4790 				  value_in_comment = offset;
   4791 				}
   4792 			      else
   4793 				{
   4794 				  /* Register Offset or Register Pre-Indexed.  */
   4795 				  func (stream, ", %s%s",
   4796 					NEGATIVE_BIT_SET ? "-" : "",
   4797 					arm_regnames[given & 0xf]);
   4798 
   4799 				  /* Writing back to the register that is the source/
   4800 				     destination of the load/store is unpredictable.  */
   4801 				  if (! allow_unpredictable
   4802 				      && WRITEBACK_BIT_SET
   4803 				      && ((given & 0xf) == ((given >> 12) & 0xf)))
   4804 				    is_unpredictable = TRUE;
   4805 				}
   4806 
   4807 			      func (stream, "]%s",
   4808 				    WRITEBACK_BIT_SET ? "!" : "");
   4809 			    }
   4810 			  else
   4811 			    {
   4812 			      if (IMMEDIATE_BIT_SET)
   4813 				{
   4814 				  /* Immediate Post-indexed.  */
   4815 				  /* PR 10924: Offset must be printed, even if it is zero.  */
   4816 				  func (stream, "], #%s%d",
   4817 					NEGATIVE_BIT_SET ? "-" : "", offset);
   4818 				  if (NEGATIVE_BIT_SET)
   4819 				    offset = -offset;
   4820 				  value_in_comment = offset;
   4821 				}
   4822 			      else
   4823 				{
   4824 				  /* Register Post-indexed.  */
   4825 				  func (stream, "], %s%s",
   4826 					NEGATIVE_BIT_SET ? "-" : "",
   4827 					arm_regnames[given & 0xf]);
   4828 
   4829 				  /* Writing back to the register that is the source/
   4830 				     destination of the load/store is unpredictable.  */
   4831 				  if (! allow_unpredictable
   4832 				      && (given & 0xf) == ((given >> 12) & 0xf))
   4833 				    is_unpredictable = TRUE;
   4834 				}
   4835 
   4836 			      if (! allow_unpredictable)
   4837 				{
   4838 				  /* Writeback is automatically implied by post- addressing.
   4839 				     Setting the W bit is unnecessary and ARM specify it as
   4840 				     being unpredictable.  */
   4841 				  if (WRITEBACK_BIT_SET
   4842 				      /* Specifying the PC register as the post-indexed
   4843 					 registers is also unpredictable.  */
   4844 				      || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf)))
   4845 				    is_unpredictable = TRUE;
   4846 				}
   4847 			    }
   4848 			}
   4849 		      break;
   4850 
   4851 		    case 'b':
   4852 		      {
   4853 			bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
   4854 			info->print_address_func (disp * 4 + pc + 8, info);
   4855 		      }
   4856 		      break;
   4857 
   4858 		    case 'c':
   4859 		      if (((given >> 28) & 0xf) != 0xe)
   4860 			func (stream, "%s",
   4861 			      arm_conditional [(given >> 28) & 0xf]);
   4862 		      break;
   4863 
   4864 		    case 'm':
   4865 		      {
   4866 			int started = 0;
   4867 			int reg;
   4868 
   4869 			func (stream, "{");
   4870 			for (reg = 0; reg < 16; reg++)
   4871 			  if ((given & (1 << reg)) != 0)
   4872 			    {
   4873 			      if (started)
   4874 				func (stream, ", ");
   4875 			      started = 1;
   4876 			      func (stream, "%s", arm_regnames[reg]);
   4877 			    }
   4878 			func (stream, "}");
   4879 			if (! started)
   4880 			  is_unpredictable = TRUE;
   4881 		      }
   4882 		      break;
   4883 
   4884 		    case 'q':
   4885 		      arm_decode_shift (given, func, stream, FALSE);
   4886 		      break;
   4887 
   4888 		    case 'o':
   4889 		      if ((given & 0x02000000) != 0)
   4890 			{
   4891 			  unsigned int rotate = (given & 0xf00) >> 7;
   4892 			  unsigned int immed = (given & 0xff);
   4893 			  unsigned int a, i;
   4894 
   4895 			  a = (((immed << (32 - rotate))
   4896 				| (immed >> rotate)) & 0xffffffff);
   4897 			  /* If there is another encoding with smaller rotate,
   4898 			     the rotate should be specified directly.  */
   4899 			  for (i = 0; i < 32; i += 2)
   4900 			    if ((a << i | a >> (32 - i)) <= 0xff)
   4901 			      break;
   4902 
   4903 			  if (i != rotate)
   4904 			    func (stream, "#%d, %d", immed, rotate);
   4905 			  else
   4906 			    func (stream, "#%d", a);
   4907 			  value_in_comment = a;
   4908 			}
   4909 		      else
   4910 			arm_decode_shift (given, func, stream, TRUE);
   4911 		      break;
   4912 
   4913 		    case 'p':
   4914 		      if ((given & 0x0000f000) == 0x0000f000)
   4915 			{
   4916 			  arm_feature_set arm_ext_v6 =
   4917 			    ARM_FEATURE_CORE_LOW (ARM_EXT_V6);
   4918 
   4919 			  /* The p-variants of tst/cmp/cmn/teq are the pre-V6
   4920 			     mechanism for setting PSR flag bits.  They are
   4921 			     obsolete in V6 onwards.  */
   4922 			  if (! ARM_CPU_HAS_FEATURE (private_data->features, \
   4923 						     arm_ext_v6))
   4924 			    func (stream, "p");
   4925 			  else
   4926 			    is_unpredictable = TRUE;
   4927 			}
   4928 		      break;
   4929 
   4930 		    case 't':
   4931 		      if ((given & 0x01200000) == 0x00200000)
   4932 			func (stream, "t");
   4933 		      break;
   4934 
   4935 		    case 'A':
   4936 		      {
   4937 			int offset = given & 0xff;
   4938 
   4939 			value_in_comment = offset * 4;
   4940 			if (NEGATIVE_BIT_SET)
   4941 			  value_in_comment = - value_in_comment;
   4942 
   4943 			func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   4944 
   4945 			if (PRE_BIT_SET)
   4946 			  {
   4947 			    if (offset)
   4948 			      func (stream, ", #%d]%s",
   4949 				    (int) value_in_comment,
   4950 				    WRITEBACK_BIT_SET ? "!" : "");
   4951 			    else
   4952 			      func (stream, "]");
   4953 			  }
   4954 			else
   4955 			  {
   4956 			    func (stream, "]");
   4957 
   4958 			    if (WRITEBACK_BIT_SET)
   4959 			      {
   4960 				if (offset)
   4961 				  func (stream, ", #%d", (int) value_in_comment);
   4962 			      }
   4963 			    else
   4964 			      {
   4965 				func (stream, ", {%d}", (int) offset);
   4966 				value_in_comment = offset;
   4967 			      }
   4968 			  }
   4969 		      }
   4970 		      break;
   4971 
   4972 		    case 'B':
   4973 		      /* Print ARM V5 BLX(1) address: pc+25 bits.  */
   4974 		      {
   4975 			bfd_vma address;
   4976 			bfd_vma offset = 0;
   4977 
   4978 			if (! NEGATIVE_BIT_SET)
   4979 			  /* Is signed, hi bits should be ones.  */
   4980 			  offset = (-1) ^ 0x00ffffff;
   4981 
   4982 			/* Offset is (SignExtend(offset field)<<2).  */
   4983 			offset += given & 0x00ffffff;
   4984 			offset <<= 2;
   4985 			address = offset + pc + 8;
   4986 
   4987 			if (given & 0x01000000)
   4988 			  /* H bit allows addressing to 2-byte boundaries.  */
   4989 			  address += 2;
   4990 
   4991 		        info->print_address_func (address, info);
   4992 		      }
   4993 		      break;
   4994 
   4995 		    case 'C':
   4996 		      if ((given & 0x02000200) == 0x200)
   4997 			{
   4998 			  const char * name;
   4999 			  unsigned sysm = (given & 0x004f0000) >> 16;
   5000 
   5001 			  sysm |= (given & 0x300) >> 4;
   5002 			  name = banked_regname (sysm);
   5003 
   5004 			  if (name != NULL)
   5005 			    func (stream, "%s", name);
   5006 			  else
   5007 			    func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
   5008 			}
   5009 		      else
   5010 			{
   5011 			  func (stream, "%cPSR_",
   5012 				(given & 0x00400000) ? 'S' : 'C');
   5013 			  if (given & 0x80000)
   5014 			    func (stream, "f");
   5015 			  if (given & 0x40000)
   5016 			    func (stream, "s");
   5017 			  if (given & 0x20000)
   5018 			    func (stream, "x");
   5019 			  if (given & 0x10000)
   5020 			    func (stream, "c");
   5021 			}
   5022 		      break;
   5023 
   5024 		    case 'U':
   5025 		      if ((given & 0xf0) == 0x60)
   5026 			{
   5027 			  switch (given & 0xf)
   5028 			    {
   5029 			    case 0xf: func (stream, "sy"); break;
   5030 			    default:
   5031 			      func (stream, "#%d", (int) given & 0xf);
   5032 			      break;
   5033 			    }
   5034 			}
   5035 		      else
   5036 			{
   5037 			  const char * opt = data_barrier_option (given & 0xf);
   5038 			  if (opt != NULL)
   5039 			    func (stream, "%s", opt);
   5040 			  else
   5041 			      func (stream, "#%d", (int) given & 0xf);
   5042 			}
   5043 		      break;
   5044 
   5045 		    case '0': case '1': case '2': case '3': case '4':
   5046 		    case '5': case '6': case '7': case '8': case '9':
   5047 		      {
   5048 			int width;
   5049 			unsigned long value;
   5050 
   5051 			c = arm_decode_bitfield (c, given, &value, &width);
   5052 
   5053 			switch (*c)
   5054 			  {
   5055 			  case 'R':
   5056 			    if (value == 15)
   5057 			      is_unpredictable = TRUE;
   5058 			    /* Fall through.  */
   5059 			  case 'r':
   5060 			  case 'T':
   5061 			    /* We want register + 1 when decoding T.  */
   5062 			    if (*c == 'T')
   5063 			      ++value;
   5064 
   5065 			    if (c[1] == 'u')
   5066 			      {
   5067 				/* Eat the 'u' character.  */
   5068 				++ c;
   5069 
   5070 				if (u_reg == value)
   5071 				  is_unpredictable = TRUE;
   5072 				u_reg = value;
   5073 			      }
   5074 			    if (c[1] == 'U')
   5075 			      {
   5076 				/* Eat the 'U' character.  */
   5077 				++ c;
   5078 
   5079 				if (U_reg == value)
   5080 				  is_unpredictable = TRUE;
   5081 				U_reg = value;
   5082 			      }
   5083 			    func (stream, "%s", arm_regnames[value]);
   5084 			    break;
   5085 			  case 'd':
   5086 			    func (stream, "%ld", value);
   5087 			    value_in_comment = value;
   5088 			    break;
   5089 			  case 'b':
   5090 			    func (stream, "%ld", value * 8);
   5091 			    value_in_comment = value * 8;
   5092 			    break;
   5093 			  case 'W':
   5094 			    func (stream, "%ld", value + 1);
   5095 			    value_in_comment = value + 1;
   5096 			    break;
   5097 			  case 'x':
   5098 			    func (stream, "0x%08lx", value);
   5099 
   5100 			    /* Some SWI instructions have special
   5101 			       meanings.  */
   5102 			    if ((given & 0x0fffffff) == 0x0FF00000)
   5103 			      func (stream, "\t; IMB");
   5104 			    else if ((given & 0x0fffffff) == 0x0FF00001)
   5105 			      func (stream, "\t; IMBRange");
   5106 			    break;
   5107 			  case 'X':
   5108 			    func (stream, "%01lx", value & 0xf);
   5109 			    value_in_comment = value;
   5110 			    break;
   5111 			  case '`':
   5112 			    c++;
   5113 			    if (value == 0)
   5114 			      func (stream, "%c", *c);
   5115 			    break;
   5116 			  case '\'':
   5117 			    c++;
   5118 			    if (value == ((1ul << width) - 1))
   5119 			      func (stream, "%c", *c);
   5120 			    break;
   5121 			  case '?':
   5122 			    func (stream, "%c", c[(1 << width) - (int) value]);
   5123 			    c += 1 << width;
   5124 			    break;
   5125 			  default:
   5126 			    abort ();
   5127 			  }
   5128 			break;
   5129 
   5130 		      case 'e':
   5131 			{
   5132 			  int imm;
   5133 
   5134 			  imm = (given & 0xf) | ((given & 0xfff00) >> 4);
   5135 			  func (stream, "%d", imm);
   5136 			  value_in_comment = imm;
   5137 			}
   5138 			break;
   5139 
   5140 		      case 'E':
   5141 			/* LSB and WIDTH fields of BFI or BFC.  The machine-
   5142 			   language instruction encodes LSB and MSB.  */
   5143 			{
   5144 			  long msb = (given & 0x001f0000) >> 16;
   5145 			  long lsb = (given & 0x00000f80) >> 7;
   5146 			  long w = msb - lsb + 1;
   5147 
   5148 			  if (w > 0)
   5149 			    func (stream, "#%lu, #%lu", lsb, w);
   5150 			  else
   5151 			    func (stream, "(invalid: %lu:%lu)", lsb, msb);
   5152 			}
   5153 			break;
   5154 
   5155 		      case 'R':
   5156 			/* Get the PSR/banked register name.  */
   5157 			{
   5158 			  const char * name;
   5159 			  unsigned sysm = (given & 0x004f0000) >> 16;
   5160 
   5161 			  sysm |= (given & 0x300) >> 4;
   5162 			  name = banked_regname (sysm);
   5163 
   5164 			  if (name != NULL)
   5165 			    func (stream, "%s", name);
   5166 			  else
   5167 			    func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
   5168 			}
   5169 			break;
   5170 
   5171 		      case 'V':
   5172 			/* 16-bit unsigned immediate from a MOVT or MOVW
   5173 			   instruction, encoded in bits 0:11 and 15:19.  */
   5174 			{
   5175 			  long hi = (given & 0x000f0000) >> 4;
   5176 			  long lo = (given & 0x00000fff);
   5177 			  long imm16 = hi | lo;
   5178 
   5179 			  func (stream, "#%lu", imm16);
   5180 			  value_in_comment = imm16;
   5181 			}
   5182 			break;
   5183 
   5184 		      default:
   5185 			abort ();
   5186 		      }
   5187 		    }
   5188 		}
   5189 	      else
   5190 		func (stream, "%c", *c);
   5191 	    }
   5192 
   5193 	  if (value_in_comment > 32 || value_in_comment < -16)
   5194 	    func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
   5195 
   5196 	  if (is_unpredictable)
   5197 	    func (stream, UNPREDICTABLE_INSTRUCTION);
   5198 
   5199 	  return;
   5200 	}
   5201     }
   5202   func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
   5203   return;
   5204 }
   5205 
   5206 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM.  */
   5207 
   5208 static void
   5209 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
   5210 {
   5211   const struct opcode16 *insn;
   5212   void *stream = info->stream;
   5213   fprintf_ftype func = info->fprintf_func;
   5214 
   5215   for (insn = thumb_opcodes; insn->assembler; insn++)
   5216     if ((given & insn->mask) == insn->value)
   5217       {
   5218 	signed long value_in_comment = 0;
   5219 	const char *c = insn->assembler;
   5220 
   5221 	for (; *c; c++)
   5222 	  {
   5223 	    int domaskpc = 0;
   5224 	    int domasklr = 0;
   5225 
   5226 	    if (*c != '%')
   5227 	      {
   5228 		func (stream, "%c", *c);
   5229 		continue;
   5230 	      }
   5231 
   5232 	    switch (*++c)
   5233 	      {
   5234 	      case '%':
   5235 		func (stream, "%%");
   5236 		break;
   5237 
   5238 	      case 'c':
   5239 		if (ifthen_state)
   5240 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   5241 		break;
   5242 
   5243 	      case 'C':
   5244 		if (ifthen_state)
   5245 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   5246 		else
   5247 		  func (stream, "s");
   5248 		break;
   5249 
   5250 	      case 'I':
   5251 		{
   5252 		  unsigned int tmp;
   5253 
   5254 		  ifthen_next_state = given & 0xff;
   5255 		  for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
   5256 		    func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
   5257 		  func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
   5258 		}
   5259 		break;
   5260 
   5261 	      case 'x':
   5262 		if (ifthen_next_state)
   5263 		  func (stream, "\t; unpredictable branch in IT block\n");
   5264 		break;
   5265 
   5266 	      case 'X':
   5267 		if (ifthen_state)
   5268 		  func (stream, "\t; unpredictable <IT:%s>",
   5269 			arm_conditional[IFTHEN_COND]);
   5270 		break;
   5271 
   5272 	      case 'S':
   5273 		{
   5274 		  long reg;
   5275 
   5276 		  reg = (given >> 3) & 0x7;
   5277 		  if (given & (1 << 6))
   5278 		    reg += 8;
   5279 
   5280 		  func (stream, "%s", arm_regnames[reg]);
   5281 		}
   5282 		break;
   5283 
   5284 	      case 'D':
   5285 		{
   5286 		  long reg;
   5287 
   5288 		  reg = given & 0x7;
   5289 		  if (given & (1 << 7))
   5290 		    reg += 8;
   5291 
   5292 		  func (stream, "%s", arm_regnames[reg]);
   5293 		}
   5294 		break;
   5295 
   5296 	      case 'N':
   5297 		if (given & (1 << 8))
   5298 		  domasklr = 1;
   5299 		/* Fall through.  */
   5300 	      case 'O':
   5301 		if (*c == 'O' && (given & (1 << 8)))
   5302 		  domaskpc = 1;
   5303 		/* Fall through.  */
   5304 	      case 'M':
   5305 		{
   5306 		  int started = 0;
   5307 		  int reg;
   5308 
   5309 		  func (stream, "{");
   5310 
   5311 		  /* It would be nice if we could spot
   5312 		     ranges, and generate the rS-rE format: */
   5313 		  for (reg = 0; (reg < 8); reg++)
   5314 		    if ((given & (1 << reg)) != 0)
   5315 		      {
   5316 			if (started)
   5317 			  func (stream, ", ");
   5318 			started = 1;
   5319 			func (stream, "%s", arm_regnames[reg]);
   5320 		      }
   5321 
   5322 		  if (domasklr)
   5323 		    {
   5324 		      if (started)
   5325 			func (stream, ", ");
   5326 		      started = 1;
   5327 		      func (stream, "%s", arm_regnames[14] /* "lr" */);
   5328 		    }
   5329 
   5330 		  if (domaskpc)
   5331 		    {
   5332 		      if (started)
   5333 			func (stream, ", ");
   5334 		      func (stream, "%s", arm_regnames[15] /* "pc" */);
   5335 		    }
   5336 
   5337 		  func (stream, "}");
   5338 		}
   5339 		break;
   5340 
   5341 	      case 'W':
   5342 		/* Print writeback indicator for a LDMIA.  We are doing a
   5343 		   writeback if the base register is not in the register
   5344 		   mask.  */
   5345 		if ((given & (1 << ((given & 0x0700) >> 8))) == 0)
   5346 		  func (stream, "!");
   5347 	      	break;
   5348 
   5349 	      case 'b':
   5350 		/* Print ARM V6T2 CZB address: pc+4+6 bits.  */
   5351 		{
   5352 		  bfd_vma address = (pc + 4
   5353 				     + ((given & 0x00f8) >> 2)
   5354 				     + ((given & 0x0200) >> 3));
   5355 		  info->print_address_func (address, info);
   5356 		}
   5357 		break;
   5358 
   5359 	      case 's':
   5360 		/* Right shift immediate -- bits 6..10; 1-31 print
   5361 		   as themselves, 0 prints as 32.  */
   5362 		{
   5363 		  long imm = (given & 0x07c0) >> 6;
   5364 		  if (imm == 0)
   5365 		    imm = 32;
   5366 		  func (stream, "#%ld", imm);
   5367 		}
   5368 		break;
   5369 
   5370 	      case '0': case '1': case '2': case '3': case '4':
   5371 	      case '5': case '6': case '7': case '8': case '9':
   5372 		{
   5373 		  int bitstart = *c++ - '0';
   5374 		  int bitend = 0;
   5375 
   5376 		  while (*c >= '0' && *c <= '9')
   5377 		    bitstart = (bitstart * 10) + *c++ - '0';
   5378 
   5379 		  switch (*c)
   5380 		    {
   5381 		    case '-':
   5382 		      {
   5383 			bfd_vma reg;
   5384 
   5385 			c++;
   5386 			while (*c >= '0' && *c <= '9')
   5387 			  bitend = (bitend * 10) + *c++ - '0';
   5388 			if (!bitend)
   5389 			  abort ();
   5390 			reg = given >> bitstart;
   5391 			reg &= (2 << (bitend - bitstart)) - 1;
   5392 
   5393 			switch (*c)
   5394 			  {
   5395 			  case 'r':
   5396 			    func (stream, "%s", arm_regnames[reg]);
   5397 			    break;
   5398 
   5399 			  case 'd':
   5400 			    func (stream, "%ld", (long) reg);
   5401 			    value_in_comment = reg;
   5402 			    break;
   5403 
   5404 			  case 'H':
   5405 			    func (stream, "%ld", (long) (reg << 1));
   5406 			    value_in_comment = reg << 1;
   5407 			    break;
   5408 
   5409 			  case 'W':
   5410 			    func (stream, "%ld", (long) (reg << 2));
   5411 			    value_in_comment = reg << 2;
   5412 			    break;
   5413 
   5414 			  case 'a':
   5415 			    /* PC-relative address -- the bottom two
   5416 			       bits of the address are dropped
   5417 			       before the calculation.  */
   5418 			    info->print_address_func
   5419 			      (((pc + 4) & ~3) + (reg << 2), info);
   5420 			    value_in_comment = 0;
   5421 			    break;
   5422 
   5423 			  case 'x':
   5424 			    func (stream, "0x%04lx", (long) reg);
   5425 			    break;
   5426 
   5427 			  case 'B':
   5428 			    reg = ((reg ^ (1 << bitend)) - (1 << bitend));
   5429 			    info->print_address_func (reg * 2 + pc + 4, info);
   5430 			    value_in_comment = 0;
   5431 			    break;
   5432 
   5433 			  case 'c':
   5434 			    func (stream, "%s", arm_conditional [reg]);
   5435 			    break;
   5436 
   5437 			  default:
   5438 			    abort ();
   5439 			  }
   5440 		      }
   5441 		      break;
   5442 
   5443 		    case '\'':
   5444 		      c++;
   5445 		      if ((given & (1 << bitstart)) != 0)
   5446 			func (stream, "%c", *c);
   5447 		      break;
   5448 
   5449 		    case '?':
   5450 		      ++c;
   5451 		      if ((given & (1 << bitstart)) != 0)
   5452 			func (stream, "%c", *c++);
   5453 		      else
   5454 			func (stream, "%c", *++c);
   5455 		      break;
   5456 
   5457 		    default:
   5458 		      abort ();
   5459 		    }
   5460 		}
   5461 		break;
   5462 
   5463 	      default:
   5464 		abort ();
   5465 	      }
   5466 	  }
   5467 
   5468 	if (value_in_comment > 32 || value_in_comment < -16)
   5469 	  func (stream, "\t; 0x%lx", value_in_comment);
   5470 	return;
   5471       }
   5472 
   5473   /* No match.  */
   5474   func (stream, UNKNOWN_INSTRUCTION_16BIT, (unsigned)given);
   5475   return;
   5476 }
   5477 
   5478 /* Return the name of an V7M special register.  */
   5479 
   5480 static const char *
   5481 psr_name (int regno)
   5482 {
   5483   switch (regno)
   5484     {
   5485     case 0x0: return "APSR";
   5486     case 0x1: return "IAPSR";
   5487     case 0x2: return "EAPSR";
   5488     case 0x3: return "PSR";
   5489     case 0x5: return "IPSR";
   5490     case 0x6: return "EPSR";
   5491     case 0x7: return "IEPSR";
   5492     case 0x8: return "MSP";
   5493     case 0x9: return "PSP";
   5494     case 0xa: return "MSPLIM";
   5495     case 0xb: return "PSPLIM";
   5496     case 0x10: return "PRIMASK";
   5497     case 0x11: return "BASEPRI";
   5498     case 0x12: return "BASEPRI_MAX";
   5499     case 0x13: return "FAULTMASK";
   5500     case 0x14: return "CONTROL";
   5501     case 0x88: return "MSP_NS";
   5502     case 0x89: return "PSP_NS";
   5503     case 0x8a: return "MSPLIM_NS";
   5504     case 0x8b: return "PSPLIM_NS";
   5505     case 0x90: return "PRIMASK_NS";
   5506     case 0x91: return "BASEPRI_NS";
   5507     case 0x93: return "FAULTMASK_NS";
   5508     case 0x94: return "CONTROL_NS";
   5509     case 0x98: return "SP_NS";
   5510     default: return "<unknown>";
   5511     }
   5512 }
   5513 
   5514 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM.  */
   5515 
   5516 static void
   5517 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
   5518 {
   5519   const struct opcode32 *insn;
   5520   void *stream = info->stream;
   5521   fprintf_ftype func = info->fprintf_func;
   5522 
   5523   if (print_insn_coprocessor (pc, info, given, TRUE))
   5524     return;
   5525 
   5526   if (print_insn_neon (info, given, TRUE))
   5527     return;
   5528 
   5529   for (insn = thumb32_opcodes; insn->assembler; insn++)
   5530     if ((given & insn->mask) == insn->value)
   5531       {
   5532 	bfd_boolean is_unpredictable = FALSE;
   5533 	signed long value_in_comment = 0;
   5534 	const char *c = insn->assembler;
   5535 
   5536 	for (; *c; c++)
   5537 	  {
   5538 	    if (*c != '%')
   5539 	      {
   5540 		func (stream, "%c", *c);
   5541 		continue;
   5542 	      }
   5543 
   5544 	    switch (*++c)
   5545 	      {
   5546 	      case '%':
   5547 		func (stream, "%%");
   5548 		break;
   5549 
   5550 	      case 'c':
   5551 		if (ifthen_state)
   5552 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   5553 		break;
   5554 
   5555 	      case 'x':
   5556 		if (ifthen_next_state)
   5557 		  func (stream, "\t; unpredictable branch in IT block\n");
   5558 		break;
   5559 
   5560 	      case 'X':
   5561 		if (ifthen_state)
   5562 		  func (stream, "\t; unpredictable <IT:%s>",
   5563 			arm_conditional[IFTHEN_COND]);
   5564 		break;
   5565 
   5566 	      case 'I':
   5567 		{
   5568 		  unsigned int imm12 = 0;
   5569 
   5570 		  imm12 |= (given & 0x000000ffu);
   5571 		  imm12 |= (given & 0x00007000u) >> 4;
   5572 		  imm12 |= (given & 0x04000000u) >> 15;
   5573 		  func (stream, "#%u", imm12);
   5574 		  value_in_comment = imm12;
   5575 		}
   5576 		break;
   5577 
   5578 	      case 'M':
   5579 		{
   5580 		  unsigned int bits = 0, imm, imm8, mod;
   5581 
   5582 		  bits |= (given & 0x000000ffu);
   5583 		  bits |= (given & 0x00007000u) >> 4;
   5584 		  bits |= (given & 0x04000000u) >> 15;
   5585 		  imm8 = (bits & 0x0ff);
   5586 		  mod = (bits & 0xf00) >> 8;
   5587 		  switch (mod)
   5588 		    {
   5589 		    case 0: imm = imm8; break;
   5590 		    case 1: imm = ((imm8 << 16) | imm8); break;
   5591 		    case 2: imm = ((imm8 << 24) | (imm8 << 8)); break;
   5592 		    case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
   5593 		    default:
   5594 		      mod  = (bits & 0xf80) >> 7;
   5595 		      imm8 = (bits & 0x07f) | 0x80;
   5596 		      imm  = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
   5597 		    }
   5598 		  func (stream, "#%u", imm);
   5599 		  value_in_comment = imm;
   5600 		}
   5601 		break;
   5602 
   5603 	      case 'J':
   5604 		{
   5605 		  unsigned int imm = 0;
   5606 
   5607 		  imm |= (given & 0x000000ffu);
   5608 		  imm |= (given & 0x00007000u) >> 4;
   5609 		  imm |= (given & 0x04000000u) >> 15;
   5610 		  imm |= (given & 0x000f0000u) >> 4;
   5611 		  func (stream, "#%u", imm);
   5612 		  value_in_comment = imm;
   5613 		}
   5614 		break;
   5615 
   5616 	      case 'K':
   5617 		{
   5618 		  unsigned int imm = 0;
   5619 
   5620 		  imm |= (given & 0x000f0000u) >> 16;
   5621 		  imm |= (given & 0x00000ff0u) >> 0;
   5622 		  imm |= (given & 0x0000000fu) << 12;
   5623 		  func (stream, "#%u", imm);
   5624 		  value_in_comment = imm;
   5625 		}
   5626 		break;
   5627 
   5628 	      case 'H':
   5629 		{
   5630 		  unsigned int imm = 0;
   5631 
   5632 		  imm |= (given & 0x000f0000u) >> 4;
   5633 		  imm |= (given & 0x00000fffu) >> 0;
   5634 		  func (stream, "#%u", imm);
   5635 		  value_in_comment = imm;
   5636 		}
   5637 		break;
   5638 
   5639 	      case 'V':
   5640 		{
   5641 		  unsigned int imm = 0;
   5642 
   5643 		  imm |= (given & 0x00000fffu);
   5644 		  imm |= (given & 0x000f0000u) >> 4;
   5645 		  func (stream, "#%u", imm);
   5646 		  value_in_comment = imm;
   5647 		}
   5648 		break;
   5649 
   5650 	      case 'S':
   5651 		{
   5652 		  unsigned int reg = (given & 0x0000000fu);
   5653 		  unsigned int stp = (given & 0x00000030u) >> 4;
   5654 		  unsigned int imm = 0;
   5655 		  imm |= (given & 0x000000c0u) >> 6;
   5656 		  imm |= (given & 0x00007000u) >> 10;
   5657 
   5658 		  func (stream, "%s", arm_regnames[reg]);
   5659 		  switch (stp)
   5660 		    {
   5661 		    case 0:
   5662 		      if (imm > 0)
   5663 			func (stream, ", lsl #%u", imm);
   5664 		      break;
   5665 
   5666 		    case 1:
   5667 		      if (imm == 0)
   5668 			imm = 32;
   5669 		      func (stream, ", lsr #%u", imm);
   5670 		      break;
   5671 
   5672 		    case 2:
   5673 		      if (imm == 0)
   5674 			imm = 32;
   5675 		      func (stream, ", asr #%u", imm);
   5676 		      break;
   5677 
   5678 		    case 3:
   5679 		      if (imm == 0)
   5680 			func (stream, ", rrx");
   5681 		      else
   5682 			func (stream, ", ror #%u", imm);
   5683 		    }
   5684 		}
   5685 		break;
   5686 
   5687 	      case 'a':
   5688 		{
   5689 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   5690 		  unsigned int U   = ! NEGATIVE_BIT_SET;
   5691 		  unsigned int op  = (given & 0x00000f00) >> 8;
   5692 		  unsigned int i12 = (given & 0x00000fff);
   5693 		  unsigned int i8  = (given & 0x000000ff);
   5694 		  bfd_boolean writeback = FALSE, postind = FALSE;
   5695 		  bfd_vma offset = 0;
   5696 
   5697 		  func (stream, "[%s", arm_regnames[Rn]);
   5698 		  if (U) /* 12-bit positive immediate offset.  */
   5699 		    {
   5700 		      offset = i12;
   5701 		      if (Rn != 15)
   5702 			value_in_comment = offset;
   5703 		    }
   5704 		  else if (Rn == 15) /* 12-bit negative immediate offset.  */
   5705 		    offset = - (int) i12;
   5706 		  else if (op == 0x0) /* Shifted register offset.  */
   5707 		    {
   5708 		      unsigned int Rm = (i8 & 0x0f);
   5709 		      unsigned int sh = (i8 & 0x30) >> 4;
   5710 
   5711 		      func (stream, ", %s", arm_regnames[Rm]);
   5712 		      if (sh)
   5713 			func (stream, ", lsl #%u", sh);
   5714 		      func (stream, "]");
   5715 		      break;
   5716 		    }
   5717 		  else switch (op)
   5718 		    {
   5719 		    case 0xE:  /* 8-bit positive immediate offset.  */
   5720 		      offset = i8;
   5721 		      break;
   5722 
   5723 		    case 0xC:  /* 8-bit negative immediate offset.  */
   5724 		      offset = -i8;
   5725 		      break;
   5726 
   5727 		    case 0xF:  /* 8-bit + preindex with wb.  */
   5728 		      offset = i8;
   5729 		      writeback = TRUE;
   5730 		      break;
   5731 
   5732 		    case 0xD:  /* 8-bit - preindex with wb.  */
   5733 		      offset = -i8;
   5734 		      writeback = TRUE;
   5735 		      break;
   5736 
   5737 		    case 0xB:  /* 8-bit + postindex.  */
   5738 		      offset = i8;
   5739 		      postind = TRUE;
   5740 		      break;
   5741 
   5742 		    case 0x9:  /* 8-bit - postindex.  */
   5743 		      offset = -i8;
   5744 		      postind = TRUE;
   5745 		      break;
   5746 
   5747 		    default:
   5748 		      func (stream, ", <undefined>]");
   5749 		      goto skip;
   5750 		    }
   5751 
   5752 		  if (postind)
   5753 		    func (stream, "], #%d", (int) offset);
   5754 		  else
   5755 		    {
   5756 		      if (offset)
   5757 			func (stream, ", #%d", (int) offset);
   5758 		      func (stream, writeback ? "]!" : "]");
   5759 		    }
   5760 
   5761 		  if (Rn == 15)
   5762 		    {
   5763 		      func (stream, "\t; ");
   5764 		      info->print_address_func (((pc + 4) & ~3) + offset, info);
   5765 		    }
   5766 		}
   5767 	      skip:
   5768 		break;
   5769 
   5770 	      case 'A':
   5771 		{
   5772 		  unsigned int U   = ! NEGATIVE_BIT_SET;
   5773 		  unsigned int W   = WRITEBACK_BIT_SET;
   5774 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   5775 		  unsigned int off = (given & 0x000000ff);
   5776 
   5777 		  func (stream, "[%s", arm_regnames[Rn]);
   5778 
   5779 		  if (PRE_BIT_SET)
   5780 		    {
   5781 		      if (off || !U)
   5782 			{
   5783 			  func (stream, ", #%c%u", U ? '+' : '-', off * 4);
   5784 			  value_in_comment = off * 4 * (U ? 1 : -1);
   5785 			}
   5786 		      func (stream, "]");
   5787 		      if (W)
   5788 			func (stream, "!");
   5789 		    }
   5790 		  else
   5791 		    {
   5792 		      func (stream, "], ");
   5793 		      if (W)
   5794 			{
   5795 			  func (stream, "#%c%u", U ? '+' : '-', off * 4);
   5796 			  value_in_comment = off * 4 * (U ? 1 : -1);
   5797 			}
   5798 		      else
   5799 			{
   5800 			  func (stream, "{%u}", off);
   5801 			  value_in_comment = off;
   5802 			}
   5803 		    }
   5804 		}
   5805 		break;
   5806 
   5807 	      case 'w':
   5808 		{
   5809 		  unsigned int Sbit = (given & 0x01000000) >> 24;
   5810 		  unsigned int type = (given & 0x00600000) >> 21;
   5811 
   5812 		  switch (type)
   5813 		    {
   5814 		    case 0: func (stream, Sbit ? "sb" : "b"); break;
   5815 		    case 1: func (stream, Sbit ? "sh" : "h"); break;
   5816 		    case 2:
   5817 		      if (Sbit)
   5818 			func (stream, "??");
   5819 		      break;
   5820 		    case 3:
   5821 		      func (stream, "??");
   5822 		      break;
   5823 		    }
   5824 		}
   5825 		break;
   5826 
   5827 	      case 'm':
   5828 		{
   5829 		  int started = 0;
   5830 		  int reg;
   5831 
   5832 		  func (stream, "{");
   5833 		  for (reg = 0; reg < 16; reg++)
   5834 		    if ((given & (1 << reg)) != 0)
   5835 		      {
   5836 			if (started)
   5837 			  func (stream, ", ");
   5838 			started = 1;
   5839 			func (stream, "%s", arm_regnames[reg]);
   5840 		      }
   5841 		  func (stream, "}");
   5842 		}
   5843 		break;
   5844 
   5845 	      case 'E':
   5846 		{
   5847 		  unsigned int msb = (given & 0x0000001f);
   5848 		  unsigned int lsb = 0;
   5849 
   5850 		  lsb |= (given & 0x000000c0u) >> 6;
   5851 		  lsb |= (given & 0x00007000u) >> 10;
   5852 		  func (stream, "#%u, #%u", lsb, msb - lsb + 1);
   5853 		}
   5854 		break;
   5855 
   5856 	      case 'F':
   5857 		{
   5858 		  unsigned int width = (given & 0x0000001f) + 1;
   5859 		  unsigned int lsb = 0;
   5860 
   5861 		  lsb |= (given & 0x000000c0u) >> 6;
   5862 		  lsb |= (given & 0x00007000u) >> 10;
   5863 		  func (stream, "#%u, #%u", lsb, width);
   5864 		}
   5865 		break;
   5866 
   5867 	      case 'b':
   5868 		{
   5869 		  unsigned int S = (given & 0x04000000u) >> 26;
   5870 		  unsigned int J1 = (given & 0x00002000u) >> 13;
   5871 		  unsigned int J2 = (given & 0x00000800u) >> 11;
   5872 		  bfd_vma offset = 0;
   5873 
   5874 		  offset |= !S << 20;
   5875 		  offset |= J2 << 19;
   5876 		  offset |= J1 << 18;
   5877 		  offset |= (given & 0x003f0000) >> 4;
   5878 		  offset |= (given & 0x000007ff) << 1;
   5879 		  offset -= (1 << 20);
   5880 
   5881 		  info->print_address_func (pc + 4 + offset, info);
   5882 		}
   5883 		break;
   5884 
   5885 	      case 'B':
   5886 		{
   5887 		  unsigned int S = (given & 0x04000000u) >> 26;
   5888 		  unsigned int I1 = (given & 0x00002000u) >> 13;
   5889 		  unsigned int I2 = (given & 0x00000800u) >> 11;
   5890 		  bfd_vma offset = 0;
   5891 
   5892 		  offset |= !S << 24;
   5893 		  offset |= !(I1 ^ S) << 23;
   5894 		  offset |= !(I2 ^ S) << 22;
   5895 		  offset |= (given & 0x03ff0000u) >> 4;
   5896 		  offset |= (given & 0x000007ffu) << 1;
   5897 		  offset -= (1 << 24);
   5898 		  offset += pc + 4;
   5899 
   5900 		  /* BLX target addresses are always word aligned.  */
   5901 		  if ((given & 0x00001000u) == 0)
   5902 		      offset &= ~2u;
   5903 
   5904 		  info->print_address_func (offset, info);
   5905 		}
   5906 		break;
   5907 
   5908 	      case 's':
   5909 		{
   5910 		  unsigned int shift = 0;
   5911 
   5912 		  shift |= (given & 0x000000c0u) >> 6;
   5913 		  shift |= (given & 0x00007000u) >> 10;
   5914 		  if (WRITEBACK_BIT_SET)
   5915 		    func (stream, ", asr #%u", shift);
   5916 		  else if (shift)
   5917 		    func (stream, ", lsl #%u", shift);
   5918 		  /* else print nothing - lsl #0 */
   5919 		}
   5920 		break;
   5921 
   5922 	      case 'R':
   5923 		{
   5924 		  unsigned int rot = (given & 0x00000030) >> 4;
   5925 
   5926 		  if (rot)
   5927 		    func (stream, ", ror #%u", rot * 8);
   5928 		}
   5929 		break;
   5930 
   5931 	      case 'U':
   5932 		if ((given & 0xf0) == 0x60)
   5933 		  {
   5934 		    switch (given & 0xf)
   5935 		      {
   5936 			case 0xf: func (stream, "sy"); break;
   5937 			default:
   5938 			  func (stream, "#%d", (int) given & 0xf);
   5939 			      break;
   5940 		      }
   5941 		  }
   5942 		else
   5943 		  {
   5944 		    const char * opt = data_barrier_option (given & 0xf);
   5945 		    if (opt != NULL)
   5946 		      func (stream, "%s", opt);
   5947 		    else
   5948 		      func (stream, "#%d", (int) given & 0xf);
   5949 		   }
   5950 		break;
   5951 
   5952 	      case 'C':
   5953 		if ((given & 0xff) == 0)
   5954 		  {
   5955 		    func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
   5956 		    if (given & 0x800)
   5957 		      func (stream, "f");
   5958 		    if (given & 0x400)
   5959 		      func (stream, "s");
   5960 		    if (given & 0x200)
   5961 		      func (stream, "x");
   5962 		    if (given & 0x100)
   5963 		      func (stream, "c");
   5964 		  }
   5965 		else if ((given & 0x20) == 0x20)
   5966 		  {
   5967 		    char const* name;
   5968 		    unsigned sysm = (given & 0xf00) >> 8;
   5969 
   5970 		    sysm |= (given & 0x30);
   5971 		    sysm |= (given & 0x00100000) >> 14;
   5972 		    name = banked_regname (sysm);
   5973 
   5974 		    if (name != NULL)
   5975 		      func (stream, "%s", name);
   5976 		    else
   5977 		      func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
   5978 		  }
   5979 		else
   5980 		  {
   5981 		    func (stream, "%s", psr_name (given & 0xff));
   5982 		  }
   5983 		break;
   5984 
   5985 	      case 'D':
   5986 		if (((given & 0xff) == 0)
   5987 		    || ((given & 0x20) == 0x20))
   5988 		  {
   5989 		    char const* name;
   5990 		    unsigned sm = (given & 0xf0000) >> 16;
   5991 
   5992 		    sm |= (given & 0x30);
   5993 		    sm |= (given & 0x00100000) >> 14;
   5994 		    name = banked_regname (sm);
   5995 
   5996 		    if (name != NULL)
   5997 		      func (stream, "%s", name);
   5998 		    else
   5999 		      func (stream, "(UNDEF: %lu)", (unsigned long) sm);
   6000 		  }
   6001 		else
   6002 		  func (stream, "%s", psr_name (given & 0xff));
   6003 		break;
   6004 
   6005 	      case '0': case '1': case '2': case '3': case '4':
   6006 	      case '5': case '6': case '7': case '8': case '9':
   6007 		{
   6008 		  int width;
   6009 		  unsigned long val;
   6010 
   6011 		  c = arm_decode_bitfield (c, given, &val, &width);
   6012 
   6013 		  switch (*c)
   6014 		    {
   6015 		    case 'd':
   6016 		      func (stream, "%lu", val);
   6017 		      value_in_comment = val;
   6018 		      break;
   6019 
   6020 		    case 'D':
   6021 		      func (stream, "%lu", val + 1);
   6022 		      value_in_comment = val + 1;
   6023 		      break;
   6024 
   6025 		    case 'W':
   6026 		      func (stream, "%lu", val * 4);
   6027 		      value_in_comment = val * 4;
   6028 		      break;
   6029 
   6030 		    case 'R':
   6031 		      if (val == 15)
   6032 			is_unpredictable = TRUE;
   6033 		      /* Fall through.  */
   6034 		    case 'r':
   6035 		      func (stream, "%s", arm_regnames[val]);
   6036 		      break;
   6037 
   6038 		    case 'c':
   6039 		      func (stream, "%s", arm_conditional[val]);
   6040 		      break;
   6041 
   6042 		    case '\'':
   6043 		      c++;
   6044 		      if (val == ((1ul << width) - 1))
   6045 			func (stream, "%c", *c);
   6046 		      break;
   6047 
   6048 		    case '`':
   6049 		      c++;
   6050 		      if (val == 0)
   6051 			func (stream, "%c", *c);
   6052 		      break;
   6053 
   6054 		    case '?':
   6055 		      func (stream, "%c", c[(1 << width) - (int) val]);
   6056 		      c += 1 << width;
   6057 		      break;
   6058 
   6059 		    case 'x':
   6060 		      func (stream, "0x%lx", val & 0xffffffffUL);
   6061 		      break;
   6062 
   6063 		    default:
   6064 		      abort ();
   6065 		    }
   6066 		}
   6067 		break;
   6068 
   6069 	      case 'L':
   6070 		/* PR binutils/12534
   6071 		   If we have a PC relative offset in an LDRD or STRD
   6072 		   instructions then display the decoded address.  */
   6073 		if (((given >> 16) & 0xf) == 0xf)
   6074 		  {
   6075 		    bfd_vma offset = (given & 0xff) * 4;
   6076 
   6077 		    if ((given & (1 << 23)) == 0)
   6078 		      offset = - offset;
   6079 		    func (stream, "\t; ");
   6080 		    info->print_address_func ((pc & ~3) + 4 + offset, info);
   6081 		  }
   6082 		break;
   6083 
   6084 	      default:
   6085 		abort ();
   6086 	      }
   6087 	  }
   6088 
   6089 	if (value_in_comment > 32 || value_in_comment < -16)
   6090 	  func (stream, "\t; 0x%lx", value_in_comment);
   6091 
   6092 	if (is_unpredictable)
   6093 	  func (stream, UNPREDICTABLE_INSTRUCTION);
   6094 
   6095 	return;
   6096       }
   6097 
   6098   /* No match.  */
   6099   func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
   6100   return;
   6101 }
   6102 
   6103 /* Print data bytes on INFO->STREAM.  */
   6104 
   6105 static void
   6106 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
   6107 		 struct disassemble_info *info,
   6108 		 long given)
   6109 {
   6110   switch (info->bytes_per_chunk)
   6111     {
   6112     case 1:
   6113       info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
   6114       break;
   6115     case 2:
   6116       info->fprintf_func (info->stream, ".short\t0x%04lx", given);
   6117       break;
   6118     case 4:
   6119       info->fprintf_func (info->stream, ".word\t0x%08lx", given);
   6120       break;
   6121     default:
   6122       abort ();
   6123     }
   6124 }
   6125 
   6126 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
   6127    being displayed in symbol relative addresses.
   6128 
   6129    Also disallow private symbol, with __tagsym$$ prefix,
   6130    from ARM RVCT toolchain being displayed.  */
   6131 
   6132 bfd_boolean
   6133 arm_symbol_is_valid (asymbol * sym,
   6134 		     struct disassemble_info * info ATTRIBUTE_UNUSED)
   6135 {
   6136   const char * name;
   6137 
   6138   if (sym == NULL)
   6139     return FALSE;
   6140 
   6141   name = bfd_asymbol_name (sym);
   6142 
   6143   return (name && *name != '$' && strncmp (name, "__tagsym$$", 10));
   6144 }
   6145 
   6146 /* Parse the string of disassembler options.  */
   6147 
   6148 static void
   6149 parse_arm_disassembler_options (const char *options)
   6150 {
   6151   const char *opt;
   6152 
   6153   FOR_EACH_DISASSEMBLER_OPTION (opt, options)
   6154     {
   6155       if (CONST_STRNEQ (opt, "reg-names-"))
   6156 	{
   6157 	  unsigned int i;
   6158 	  for (i = 0; i < NUM_ARM_OPTIONS; i++)
   6159 	    if (disassembler_options_cmp (opt, regnames[i].name) == 0)
   6160 	      {
   6161 		regname_selected = i;
   6162 		break;
   6163 	      }
   6164 
   6165 	  if (i >= NUM_ARM_OPTIONS)
   6166 	    /* xgettext: c-format */
   6167 	    opcodes_error_handler (_("unrecognised register name set: %s"),
   6168 				   opt);
   6169 	}
   6170       else if (CONST_STRNEQ (opt, "force-thumb"))
   6171 	force_thumb = 1;
   6172       else if (CONST_STRNEQ (opt, "no-force-thumb"))
   6173 	force_thumb = 0;
   6174       else
   6175 	/* xgettext: c-format */
   6176 	opcodes_error_handler (_("unrecognised disassembler option: %s"), opt);
   6177     }
   6178 
   6179   return;
   6180 }
   6181 
   6182 static bfd_boolean
   6183 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
   6184 			 enum map_type *map_symbol);
   6185 
   6186 /* Search back through the insn stream to determine if this instruction is
   6187    conditionally executed.  */
   6188 
   6189 static void
   6190 find_ifthen_state (bfd_vma pc,
   6191 		   struct disassemble_info *info,
   6192 		   bfd_boolean little)
   6193 {
   6194   unsigned char b[2];
   6195   unsigned int insn;
   6196   int status;
   6197   /* COUNT is twice the number of instructions seen.  It will be odd if we
   6198      just crossed an instruction boundary.  */
   6199   int count;
   6200   int it_count;
   6201   unsigned int seen_it;
   6202   bfd_vma addr;
   6203 
   6204   ifthen_address = pc;
   6205   ifthen_state = 0;
   6206 
   6207   addr = pc;
   6208   count = 1;
   6209   it_count = 0;
   6210   seen_it = 0;
   6211   /* Scan backwards looking for IT instructions, keeping track of where
   6212      instruction boundaries are.  We don't know if something is actually an
   6213      IT instruction until we find a definite instruction boundary.  */
   6214   for (;;)
   6215     {
   6216       if (addr == 0 || info->symbol_at_address_func (addr, info))
   6217 	{
   6218 	  /* A symbol must be on an instruction boundary, and will not
   6219 	     be within an IT block.  */
   6220 	  if (seen_it && (count & 1))
   6221 	    break;
   6222 
   6223 	  return;
   6224 	}
   6225       addr -= 2;
   6226       status = info->read_memory_func (addr, (bfd_byte *) b, 2, info);
   6227       if (status)
   6228 	return;
   6229 
   6230       if (little)
   6231 	insn = (b[0]) | (b[1] << 8);
   6232       else
   6233 	insn = (b[1]) | (b[0] << 8);
   6234       if (seen_it)
   6235 	{
   6236 	  if ((insn & 0xf800) < 0xe800)
   6237 	    {
   6238 	      /* Addr + 2 is an instruction boundary.  See if this matches
   6239 	         the expected boundary based on the position of the last
   6240 		 IT candidate.  */
   6241 	      if (count & 1)
   6242 		break;
   6243 	      seen_it = 0;
   6244 	    }
   6245 	}
   6246       if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
   6247 	{
   6248 	  enum map_type type = MAP_ARM;
   6249 	  bfd_boolean found = mapping_symbol_for_insn (addr, info, &type);
   6250 
   6251 	  if (!found || (found && type == MAP_THUMB))
   6252 	    {
   6253 	      /* This could be an IT instruction.  */
   6254 	      seen_it = insn;
   6255 	      it_count = count >> 1;
   6256 	    }
   6257 	}
   6258       if ((insn & 0xf800) >= 0xe800)
   6259 	count++;
   6260       else
   6261 	count = (count + 2) | 1;
   6262       /* IT blocks contain at most 4 instructions.  */
   6263       if (count >= 8 && !seen_it)
   6264 	return;
   6265     }
   6266   /* We found an IT instruction.  */
   6267   ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
   6268   if ((ifthen_state & 0xf) == 0)
   6269     ifthen_state = 0;
   6270 }
   6271 
   6272 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
   6273    mapping symbol.  */
   6274 
   6275 static int
   6276 is_mapping_symbol (struct disassemble_info *info, int n,
   6277 		   enum map_type *map_type)
   6278 {
   6279   const char *name;
   6280 
   6281   name = bfd_asymbol_name (info->symtab[n]);
   6282   if (name[0] == '$' && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
   6283       && (name[2] == 0 || name[2] == '.'))
   6284     {
   6285       *map_type = ((name[1] == 'a') ? MAP_ARM
   6286 		   : (name[1] == 't') ? MAP_THUMB
   6287 		   : MAP_DATA);
   6288       return TRUE;
   6289     }
   6290 
   6291   return FALSE;
   6292 }
   6293 
   6294 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
   6295    Returns nonzero if *MAP_TYPE was set.  */
   6296 
   6297 static int
   6298 get_map_sym_type (struct disassemble_info *info,
   6299 		  int n,
   6300 		  enum map_type *map_type)
   6301 {
   6302   /* If the symbol is in a different section, ignore it.  */
   6303   if (info->section != NULL && info->section != info->symtab[n]->section)
   6304     return FALSE;
   6305 
   6306   return is_mapping_symbol (info, n, map_type);
   6307 }
   6308 
   6309 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
   6310    Returns nonzero if *MAP_TYPE was set.  */
   6311 
   6312 static int
   6313 get_sym_code_type (struct disassemble_info *info,
   6314 		   int n,
   6315 		   enum map_type *map_type)
   6316 {
   6317   elf_symbol_type *es;
   6318   unsigned int type;
   6319 
   6320   /* If the symbol is in a different section, ignore it.  */
   6321   if (info->section != NULL && info->section != info->symtab[n]->section)
   6322     return FALSE;
   6323 
   6324   es = *(elf_symbol_type **)(info->symtab + n);
   6325   type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
   6326 
   6327   /* If the symbol has function type then use that.  */
   6328   if (type == STT_FUNC || type == STT_GNU_IFUNC)
   6329     {
   6330       if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
   6331 	  == ST_BRANCH_TO_THUMB)
   6332 	*map_type = MAP_THUMB;
   6333       else
   6334 	*map_type = MAP_ARM;
   6335       return TRUE;
   6336     }
   6337 
   6338   return FALSE;
   6339 }
   6340 
   6341 /* Search the mapping symbol state for instruction at pc.  This is only
   6342    applicable for elf target.
   6343 
   6344    There is an assumption Here, info->private_data contains the correct AND
   6345    up-to-date information about current scan process.  The information will be
   6346    used to speed this search process.
   6347 
   6348    Return TRUE if the mapping state can be determined, and map_symbol
   6349    will be updated accordingly.  Otherwise, return FALSE.  */
   6350 
   6351 static bfd_boolean
   6352 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
   6353 			 enum map_type *map_symbol)
   6354 {
   6355   bfd_vma addr;
   6356   int n, start = 0;
   6357   bfd_boolean found = FALSE;
   6358   enum map_type type = MAP_ARM;
   6359   struct arm_private_data *private_data;
   6360 
   6361   if (info->private_data == NULL || info->symtab_size == 0
   6362       || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour)
   6363     return FALSE;
   6364 
   6365   private_data = info->private_data;
   6366   if (pc == 0)
   6367     start = 0;
   6368   else
   6369     start = private_data->last_mapping_sym;
   6370 
   6371   start = (start == -1)? 0 : start;
   6372   addr = bfd_asymbol_value (info->symtab[start]);
   6373 
   6374   if (pc >= addr)
   6375     {
   6376       if (get_map_sym_type (info, start, &type))
   6377       found = TRUE;
   6378     }
   6379   else
   6380     {
   6381       for (n = start - 1; n >= 0; n--)
   6382 	{
   6383 	  if (get_map_sym_type (info, n, &type))
   6384 	    {
   6385 	      found = TRUE;
   6386 	      break;
   6387 	    }
   6388 	}
   6389     }
   6390 
   6391   /* No mapping symbols were found.  A leading $d may be
   6392      omitted for sections which start with data; but for
   6393      compatibility with legacy and stripped binaries, only
   6394      assume the leading $d if there is at least one mapping
   6395      symbol in the file.  */
   6396   if (!found && private_data->has_mapping_symbols == 1)
   6397     {
   6398       type = MAP_DATA;
   6399       found = TRUE;
   6400     }
   6401 
   6402   *map_symbol = type;
   6403   return found;
   6404 }
   6405 
   6406 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
   6407    of the supplied arm_feature_set structure with bitmasks indicating
   6408    the supported base architectures and coprocessor extensions.
   6409 
   6410    FIXME: This could more efficiently implemented as a constant array,
   6411    although it would also be less robust.  */
   6412 
   6413 static void
   6414 select_arm_features (unsigned long mach,
   6415 		     arm_feature_set * features)
   6416 {
   6417   arm_feature_set arch_fset;
   6418   const arm_feature_set fpu_any = FPU_ANY;
   6419 
   6420 #undef ARM_SET_FEATURES
   6421 #define ARM_SET_FEATURES(FSET) \
   6422   {							\
   6423     const arm_feature_set fset = FSET;			\
   6424     arch_fset = fset;					\
   6425   }
   6426 
   6427   /* When several architecture versions share the same bfd_mach_arm_XXX value
   6428      the most featureful is chosen.  */
   6429   switch (mach)
   6430     {
   6431     case bfd_mach_arm_2:	 ARM_SET_FEATURES (ARM_ARCH_V2); break;
   6432     case bfd_mach_arm_2a:	 ARM_SET_FEATURES (ARM_ARCH_V2S); break;
   6433     case bfd_mach_arm_3:	 ARM_SET_FEATURES (ARM_ARCH_V3); break;
   6434     case bfd_mach_arm_3M:	 ARM_SET_FEATURES (ARM_ARCH_V3M); break;
   6435     case bfd_mach_arm_4:	 ARM_SET_FEATURES (ARM_ARCH_V4); break;
   6436     case bfd_mach_arm_4T:	 ARM_SET_FEATURES (ARM_ARCH_V4T); break;
   6437     case bfd_mach_arm_5:	 ARM_SET_FEATURES (ARM_ARCH_V5); break;
   6438     case bfd_mach_arm_5T:	 ARM_SET_FEATURES (ARM_ARCH_V5T); break;
   6439     case bfd_mach_arm_5TE:	 ARM_SET_FEATURES (ARM_ARCH_V5TE); break;
   6440     case bfd_mach_arm_XScale:	 ARM_SET_FEATURES (ARM_ARCH_XSCALE); break;
   6441     case bfd_mach_arm_ep9312:
   6442 	ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T,
   6443 					   ARM_CEXT_MAVERICK | FPU_MAVERICK));
   6444        break;
   6445     case bfd_mach_arm_iWMMXt:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break;
   6446     case bfd_mach_arm_iWMMXt2:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break;
   6447     case bfd_mach_arm_5TEJ:	 ARM_SET_FEATURES (ARM_ARCH_V5TEJ); break;
   6448     case bfd_mach_arm_6:	 ARM_SET_FEATURES (ARM_ARCH_V6); break;
   6449     case bfd_mach_arm_6KZ:	 ARM_SET_FEATURES (ARM_ARCH_V6KZ); break;
   6450     case bfd_mach_arm_6T2:	 ARM_SET_FEATURES (ARM_ARCH_V6KZT2); break;
   6451     case bfd_mach_arm_6K:	 ARM_SET_FEATURES (ARM_ARCH_V6K); break;
   6452     case bfd_mach_arm_7:	 ARM_SET_FEATURES (ARM_ARCH_V7VE); break;
   6453     case bfd_mach_arm_6M:	 ARM_SET_FEATURES (ARM_ARCH_V6M); break;
   6454     case bfd_mach_arm_6SM:	 ARM_SET_FEATURES (ARM_ARCH_V6SM); break;
   6455     case bfd_mach_arm_7EM:	 ARM_SET_FEATURES (ARM_ARCH_V7EM); break;
   6456     case bfd_mach_arm_8:
   6457 	{
   6458 	  /* Add bits for extensions that Armv8.5-A recognizes.  */
   6459 	  arm_feature_set armv8_5_ext_fset
   6460 	    = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
   6461 	  ARM_SET_FEATURES (ARM_ARCH_V8_5A);
   6462 	  ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, armv8_5_ext_fset);
   6463 	  break;
   6464 	}
   6465     case bfd_mach_arm_8R:	 ARM_SET_FEATURES (ARM_ARCH_V8R); break;
   6466     case bfd_mach_arm_8M_BASE:	 ARM_SET_FEATURES (ARM_ARCH_V8M_BASE); break;
   6467     case bfd_mach_arm_8M_MAIN:	 ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN); break;
   6468       /* If the machine type is unknown allow all architecture types and all
   6469 	 extensions.  */
   6470     case bfd_mach_arm_unknown:	 ARM_SET_FEATURES (ARM_FEATURE_ALL); break;
   6471     default:
   6472       abort ();
   6473     }
   6474 #undef ARM_SET_FEATURES
   6475 
   6476   /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
   6477      and thus on bfd_mach_arm_XXX value.  Therefore for a given
   6478      bfd_mach_arm_XXX value all coprocessor feature bits should be allowed.  */
   6479   ARM_MERGE_FEATURE_SETS (*features, arch_fset, fpu_any);
   6480 }
   6481 
   6482 
   6483 /* NOTE: There are no checks in these routines that
   6484    the relevant number of data bytes exist.  */
   6485 
   6486 static int
   6487 print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
   6488 {
   6489   unsigned char b[4];
   6490   long		given;
   6491   int           status;
   6492   int           is_thumb = FALSE;
   6493   int           is_data = FALSE;
   6494   int           little_code;
   6495   unsigned int	size = 4;
   6496   void	 	(*printer) (bfd_vma, struct disassemble_info *, long);
   6497   bfd_boolean   found = FALSE;
   6498   struct arm_private_data *private_data;
   6499 
   6500   if (info->disassembler_options)
   6501     {
   6502       parse_arm_disassembler_options (info->disassembler_options);
   6503 
   6504       /* To avoid repeated parsing of these options, we remove them here.  */
   6505       info->disassembler_options = NULL;
   6506     }
   6507 
   6508   /* PR 10288: Control which instructions will be disassembled.  */
   6509   if (info->private_data == NULL)
   6510     {
   6511       static struct arm_private_data private;
   6512 
   6513       if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0)
   6514 	/* If the user did not use the -m command line switch then default to
   6515 	   disassembling all types of ARM instruction.
   6516 
   6517 	   The info->mach value has to be ignored as this will be based on
   6518 	   the default archictecture for the target and/or hints in the notes
   6519 	   section, but it will never be greater than the current largest arm
   6520 	   machine value (iWMMXt2), which is only equivalent to the V5TE
   6521 	   architecture.  ARM architectures have advanced beyond the machine
   6522 	   value encoding, and these newer architectures would be ignored if
   6523 	   the machine value was used.
   6524 
   6525 	   Ie the -m switch is used to restrict which instructions will be
   6526 	   disassembled.  If it is necessary to use the -m switch to tell
   6527 	   objdump that an ARM binary is being disassembled, eg because the
   6528 	   input is a raw binary file, but it is also desired to disassemble
   6529 	   all ARM instructions then use "-marm".  This will select the
   6530 	   "unknown" arm architecture which is compatible with any ARM
   6531 	   instruction.  */
   6532 	  info->mach = bfd_mach_arm_unknown;
   6533 
   6534       /* Compute the architecture bitmask from the machine number.
   6535 	 Note: This assumes that the machine number will not change
   6536 	 during disassembly....  */
   6537       select_arm_features (info->mach, & private.features);
   6538 
   6539       private.has_mapping_symbols = -1;
   6540       private.last_mapping_sym = -1;
   6541       private.last_mapping_addr = 0;
   6542 
   6543       info->private_data = & private;
   6544     }
   6545 
   6546   private_data = info->private_data;
   6547 
   6548   /* Decide if our code is going to be little-endian, despite what the
   6549      function argument might say.  */
   6550   little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little);
   6551 
   6552   /* For ELF, consult the symbol table to determine what kind of code
   6553      or data we have.  */
   6554   if (info->symtab_size != 0
   6555       && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
   6556     {
   6557       bfd_vma addr;
   6558       int n, start;
   6559       int last_sym = -1;
   6560       enum map_type type = MAP_ARM;
   6561 
   6562       /* Start scanning at the start of the function, or wherever
   6563 	 we finished last time.  */
   6564       /* PR 14006.  When the address is 0 we are either at the start of the
   6565 	 very first function, or else the first function in a new, unlinked
   6566 	 executable section (eg because of -ffunction-sections).  Either way
   6567 	 start scanning from the beginning of the symbol table, not where we
   6568 	 left off last time.  */
   6569       if (pc == 0)
   6570 	start = 0;
   6571       else
   6572 	{
   6573 	  start = info->symtab_pos + 1;
   6574 	  if (start < private_data->last_mapping_sym)
   6575 	    start = private_data->last_mapping_sym;
   6576 	}
   6577       found = FALSE;
   6578 
   6579       /* First, look for mapping symbols.  */
   6580       if (private_data->has_mapping_symbols != 0)
   6581 	{
   6582 	  /* Scan up to the location being disassembled.  */
   6583 	  for (n = start; n < info->symtab_size; n++)
   6584 	    {
   6585 	      addr = bfd_asymbol_value (info->symtab[n]);
   6586 	      if (addr > pc)
   6587 		break;
   6588 	      if (get_map_sym_type (info, n, &type))
   6589 		{
   6590 		  last_sym = n;
   6591 		  found = TRUE;
   6592 		}
   6593 	    }
   6594 
   6595 	  if (!found)
   6596 	    {
   6597 	      /* No mapping symbol found at this address.  Look backwards
   6598 		 for a preceding one.  */
   6599 	      for (n = start - 1; n >= 0; n--)
   6600 		{
   6601 		  if (get_map_sym_type (info, n, &type))
   6602 		    {
   6603 		      last_sym = n;
   6604 		      found = TRUE;
   6605 		      break;
   6606 		    }
   6607 		}
   6608 	    }
   6609 
   6610 	  if (found)
   6611 	    private_data->has_mapping_symbols = 1;
   6612 
   6613 	  /* No mapping symbols were found.  A leading $d may be
   6614 	     omitted for sections which start with data; but for
   6615 	     compatibility with legacy and stripped binaries, only
   6616 	     assume the leading $d if there is at least one mapping
   6617 	     symbol in the file.  */
   6618 	  if (!found && private_data->has_mapping_symbols == -1)
   6619 	    {
   6620 	      /* Look for mapping symbols, in any section.  */
   6621 	      for (n = 0; n < info->symtab_size; n++)
   6622 		if (is_mapping_symbol (info, n, &type))
   6623 		  {
   6624 		    private_data->has_mapping_symbols = 1;
   6625 		    break;
   6626 		  }
   6627 	      if (private_data->has_mapping_symbols == -1)
   6628 		private_data->has_mapping_symbols = 0;
   6629 	    }
   6630 
   6631 	  if (!found && private_data->has_mapping_symbols == 1)
   6632 	    {
   6633 	      type = MAP_DATA;
   6634 	      found = TRUE;
   6635 	    }
   6636 	}
   6637 
   6638       /* Next search for function symbols to separate ARM from Thumb
   6639 	 in binaries without mapping symbols.  */
   6640       if (!found)
   6641 	{
   6642 	  /* Scan up to the location being disassembled.  */
   6643 	  for (n = start; n < info->symtab_size; n++)
   6644 	    {
   6645 	      addr = bfd_asymbol_value (info->symtab[n]);
   6646 	      if (addr > pc)
   6647 		break;
   6648 	      if (get_sym_code_type (info, n, &type))
   6649 		{
   6650 		  last_sym = n;
   6651 		  found = TRUE;
   6652 		}
   6653 	    }
   6654 
   6655 	  if (!found)
   6656 	    {
   6657 	      /* No mapping symbol found at this address.  Look backwards
   6658 		 for a preceding one.  */
   6659 	      for (n = start - 1; n >= 0; n--)
   6660 		{
   6661 		  if (get_sym_code_type (info, n, &type))
   6662 		    {
   6663 		      last_sym = n;
   6664 		      found = TRUE;
   6665 		      break;
   6666 		    }
   6667 		}
   6668 	    }
   6669 	}
   6670 
   6671       private_data->last_mapping_sym = last_sym;
   6672       private_data->last_type = type;
   6673       is_thumb = (private_data->last_type == MAP_THUMB);
   6674       is_data = (private_data->last_type == MAP_DATA);
   6675 
   6676       /* Look a little bit ahead to see if we should print out
   6677 	 two or four bytes of data.  If there's a symbol,
   6678 	 mapping or otherwise, after two bytes then don't
   6679 	 print more.  */
   6680       if (is_data)
   6681 	{
   6682 	  size = 4 - (pc & 3);
   6683 	  for (n = last_sym + 1; n < info->symtab_size; n++)
   6684 	    {
   6685 	      addr = bfd_asymbol_value (info->symtab[n]);
   6686 	      if (addr > pc
   6687 		  && (info->section == NULL
   6688 		      || info->section == info->symtab[n]->section))
   6689 		{
   6690 		  if (addr - pc < size)
   6691 		    size = addr - pc;
   6692 		  break;
   6693 		}
   6694 	    }
   6695 	  /* If the next symbol is after three bytes, we need to
   6696 	     print only part of the data, so that we can use either
   6697 	     .byte or .short.  */
   6698 	  if (size == 3)
   6699 	    size = (pc & 1) ? 1 : 2;
   6700 	}
   6701     }
   6702 
   6703   if (info->symbols != NULL)
   6704     {
   6705       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
   6706 	{
   6707 	  coff_symbol_type * cs;
   6708 
   6709 	  cs = coffsymbol (*info->symbols);
   6710 	  is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
   6711 		      || cs->native->u.syment.n_sclass == C_THUMBSTAT
   6712 		      || cs->native->u.syment.n_sclass == C_THUMBLABEL
   6713 		      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
   6714 		      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
   6715 	}
   6716       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
   6717 	       && !found)
   6718 	{
   6719 	  /* If no mapping symbol has been found then fall back to the type
   6720 	     of the function symbol.  */
   6721 	  elf_symbol_type *  es;
   6722 	  unsigned int       type;
   6723 
   6724 	  es = *(elf_symbol_type **)(info->symbols);
   6725 	  type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
   6726 
   6727 	  is_thumb =
   6728 	    ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
   6729 	      == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT);
   6730 	}
   6731       else if (bfd_asymbol_flavour (*info->symbols)
   6732 	       == bfd_target_mach_o_flavour)
   6733 	{
   6734 	  bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols;
   6735 
   6736 	  is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF);
   6737 	}
   6738     }
   6739 
   6740   if (force_thumb)
   6741     is_thumb = TRUE;
   6742 
   6743   if (is_data)
   6744     info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
   6745   else
   6746     info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
   6747 
   6748   info->bytes_per_line = 4;
   6749 
   6750   /* PR 10263: Disassemble data if requested to do so by the user.  */
   6751   if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0))
   6752     {
   6753       int i;
   6754 
   6755       /* Size was already set above.  */
   6756       info->bytes_per_chunk = size;
   6757       printer = print_insn_data;
   6758 
   6759       status = info->read_memory_func (pc, (bfd_byte *) b, size, info);
   6760       given = 0;
   6761       if (little)
   6762 	for (i = size - 1; i >= 0; i--)
   6763 	  given = b[i] | (given << 8);
   6764       else
   6765 	for (i = 0; i < (int) size; i++)
   6766 	  given = b[i] | (given << 8);
   6767     }
   6768   else if (!is_thumb)
   6769     {
   6770       /* In ARM mode endianness is a straightforward issue: the instruction
   6771 	 is four bytes long and is either ordered 0123 or 3210.  */
   6772       printer = print_insn_arm;
   6773       info->bytes_per_chunk = 4;
   6774       size = 4;
   6775 
   6776       status = info->read_memory_func (pc, (bfd_byte *) b, 4, info);
   6777       if (little_code)
   6778 	given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
   6779       else
   6780 	given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
   6781     }
   6782   else
   6783     {
   6784       /* In Thumb mode we have the additional wrinkle of two
   6785 	 instruction lengths.  Fortunately, the bits that determine
   6786 	 the length of the current instruction are always to be found
   6787 	 in the first two bytes.  */
   6788       printer = print_insn_thumb16;
   6789       info->bytes_per_chunk = 2;
   6790       size = 2;
   6791 
   6792       status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
   6793       if (little_code)
   6794 	given = (b[0]) | (b[1] << 8);
   6795       else
   6796 	given = (b[1]) | (b[0] << 8);
   6797 
   6798       if (!status)
   6799 	{
   6800 	  /* These bit patterns signal a four-byte Thumb
   6801 	     instruction.  */
   6802 	  if ((given & 0xF800) == 0xF800
   6803 	      || (given & 0xF800) == 0xF000
   6804 	      || (given & 0xF800) == 0xE800)
   6805 	    {
   6806 	      status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info);
   6807 	      if (little_code)
   6808 		given = (b[0]) | (b[1] << 8) | (given << 16);
   6809 	      else
   6810 		given = (b[1]) | (b[0] << 8) | (given << 16);
   6811 
   6812 	      printer = print_insn_thumb32;
   6813 	      size = 4;
   6814 	    }
   6815 	}
   6816 
   6817       if (ifthen_address != pc)
   6818 	find_ifthen_state (pc, info, little_code);
   6819 
   6820       if (ifthen_state)
   6821 	{
   6822 	  if ((ifthen_state & 0xf) == 0x8)
   6823 	    ifthen_next_state = 0;
   6824 	  else
   6825 	    ifthen_next_state = (ifthen_state & 0xe0)
   6826 				| ((ifthen_state & 0xf) << 1);
   6827 	}
   6828     }
   6829 
   6830   if (status)
   6831     {
   6832       info->memory_error_func (status, pc, info);
   6833       return -1;
   6834     }
   6835   if (info->flags & INSN_HAS_RELOC)
   6836     /* If the instruction has a reloc associated with it, then
   6837        the offset field in the instruction will actually be the
   6838        addend for the reloc.  (We are using REL type relocs).
   6839        In such cases, we can ignore the pc when computing
   6840        addresses, since the addend is not currently pc-relative.  */
   6841     pc = 0;
   6842 
   6843   printer (pc, info, given);
   6844 
   6845   if (is_thumb)
   6846     {
   6847       ifthen_state = ifthen_next_state;
   6848       ifthen_address += size;
   6849     }
   6850   return size;
   6851 }
   6852 
   6853 int
   6854 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
   6855 {
   6856   /* Detect BE8-ness and record it in the disassembler info.  */
   6857   if (info->flavour == bfd_target_elf_flavour
   6858       && info->section != NULL
   6859       && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8))
   6860     info->endian_code = BFD_ENDIAN_LITTLE;
   6861 
   6862   return print_insn (pc, info, FALSE);
   6863 }
   6864 
   6865 int
   6866 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info)
   6867 {
   6868   return print_insn (pc, info, TRUE);
   6869 }
   6870 
   6871 const disasm_options_and_args_t *
   6872 disassembler_options_arm (void)
   6873 {
   6874   static disasm_options_and_args_t *opts_and_args;
   6875 
   6876   if (opts_and_args == NULL)
   6877     {
   6878       disasm_options_t *opts;
   6879       unsigned int i;
   6880 
   6881       opts_and_args = XNEW (disasm_options_and_args_t);
   6882       opts_and_args->args = NULL;
   6883 
   6884       opts = &opts_and_args->options;
   6885       opts->name = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
   6886       opts->description = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
   6887       opts->arg = NULL;
   6888       for (i = 0; i < NUM_ARM_OPTIONS; i++)
   6889 	{
   6890 	  opts->name[i] = regnames[i].name;
   6891 	  if (regnames[i].description != NULL)
   6892 	    opts->description[i] = _(regnames[i].description);
   6893 	  else
   6894 	    opts->description[i] = NULL;
   6895 	}
   6896       /* The array we return must be NULL terminated.  */
   6897       opts->name[i] = NULL;
   6898       opts->description[i] = NULL;
   6899     }
   6900 
   6901   return opts_and_args;
   6902 }
   6903 
   6904 void
   6905 print_arm_disassembler_options (FILE *stream)
   6906 {
   6907   unsigned int i, max_len = 0;
   6908   fprintf (stream, _("\n\
   6909 The following ARM specific disassembler options are supported for use with\n\
   6910 the -M switch:\n"));
   6911 
   6912   for (i = 0; i < NUM_ARM_OPTIONS; i++)
   6913     {
   6914       unsigned int len = strlen (regnames[i].name);
   6915       if (max_len < len)
   6916 	max_len = len;
   6917     }
   6918 
   6919   for (i = 0, max_len++; i < NUM_ARM_OPTIONS; i++)
   6920     fprintf (stream, "  %s%*c %s\n",
   6921 	     regnames[i].name,
   6922 	     (int)(max_len - strlen (regnames[i].name)), ' ',
   6923 	     _(regnames[i].description));
   6924 }
   6925