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