Home | History | Annotate | Download | only in qemu
      1 /* Instruction printing code for the ARM
      2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
      3    2007, Free Software Foundation, Inc.
      4    Contributed by Richard Earnshaw (rwe (at) pegasus.esprit.ec.org)
      5    Modification by James G. Smith (jsmith (at) cygnus.co.uk)
      6 
      7    This file is part of libopcodes.
      8 
      9    This program is free software; you can redistribute it and/or modify it under
     10    the terms of the GNU General Public License as published by the Free
     11    Software Foundation; either version 2 of the License, or (at your option)
     12    any later version.
     13 
     14    This program is distributed in the hope that it will be useful, but WITHOUT
     15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     16    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     17    more details.
     18 
     19    You should have received a copy of the GNU General Public License
     20    along with this program; if not, write to the Free Software
     21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     22 
     23 /* Start of qemu specific additions.  Mostly this is stub definitions
     24    for things we don't care about.  */
     25 
     26 #include "dis-asm.h"
     27 #define FALSE 0
     28 #define TRUE (!FALSE)
     29 #define ATTRIBUTE_UNUSED __attribute__((unused))
     30 #define ISSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n')
     31 
     32 #define ARM_EXT_V1	 0
     33 #define ARM_EXT_V2	 0
     34 #define ARM_EXT_V2S	 0
     35 #define ARM_EXT_V3	 0
     36 #define ARM_EXT_V3M	 0
     37 #define ARM_EXT_V4	 0
     38 #define ARM_EXT_V4T	 0
     39 #define ARM_EXT_V5	 0
     40 #define ARM_EXT_V5T	 0
     41 #define ARM_EXT_V5ExP	 0
     42 #define ARM_EXT_V5E	 0
     43 #define ARM_EXT_V5J	 0
     44 #define ARM_EXT_V6       0
     45 #define ARM_EXT_V6K      0
     46 #define ARM_EXT_V6Z      0
     47 #define ARM_EXT_V6T2	 0
     48 #define ARM_EXT_V7	 0
     49 #define ARM_EXT_DIV	 0
     50 
     51 /* Co-processor space extensions.  */
     52 #define ARM_CEXT_XSCALE   0
     53 #define ARM_CEXT_MAVERICK 0
     54 #define ARM_CEXT_IWMMXT   0
     55 
     56 #define FPU_FPA_EXT_V1	 0
     57 #define FPU_FPA_EXT_V2	 0
     58 #define FPU_VFP_EXT_NONE 0
     59 #define FPU_VFP_EXT_V1xD 0
     60 #define FPU_VFP_EXT_V1	 0
     61 #define FPU_VFP_EXT_V2	 0
     62 #define FPU_MAVERICK	 0
     63 #define FPU_VFP_EXT_V3	 0
     64 #define FPU_NEON_EXT_V1	 0
     65 
     66 int floatformat_ieee_single_little;
     67 /* Assume host uses ieee float.  */
     68 static void floatformat_to_double (int *ignored, unsigned char *data,
     69                                    double *dest)
     70 {
     71     union {
     72         uint32_t i;
     73         float f;
     74     } u;
     75     u.i = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
     76     *dest = u.f;
     77 }
     78 
     79 /* End of qemu specific additions.  */
     80 
     81 /* FIXME: Belongs in global header.  */
     82 #ifndef strneq
     83 #define strneq(a,b,n)	(strncmp ((a), (b), (n)) == 0)
     84 #endif
     85 
     86 #ifndef NUM_ELEM
     87 #define NUM_ELEM(a)     (sizeof (a) / sizeof (a)[0])
     88 #endif
     89 
     90 struct opcode32
     91 {
     92   unsigned long arch;		/* Architecture defining this insn.  */
     93   unsigned long value, mask;	/* Recognise insn if (op&mask)==value.  */
     94   const char *assembler;	/* How to disassemble this insn.  */
     95 };
     96 
     97 struct opcode16
     98 {
     99   unsigned long arch;		/* Architecture defining this insn.  */
    100   unsigned short value, mask;	/* Recognise insn if (op&mask)==value.  */
    101   const char *assembler;	/* How to disassemble this insn.  */
    102 };
    103 
    104 /* print_insn_coprocessor recognizes the following format control codes:
    105 
    106    %%			%
    107 
    108    %c			print condition code (always bits 28-31 in ARM mode)
    109    %q			print shifter argument
    110    %u			print condition code (unconditional in ARM mode)
    111    %A			print address for ldc/stc/ldf/stf instruction
    112    %B			print vstm/vldm register list
    113    %C			print vstr/vldr address operand
    114    %I                   print cirrus signed shift immediate: bits 0..3|4..6
    115    %F			print the COUNT field of a LFM/SFM instruction.
    116    %P			print floating point precision in arithmetic insn
    117    %Q			print floating point precision in ldf/stf insn
    118    %R			print floating point rounding mode
    119 
    120    %<bitfield>r		print as an ARM register
    121    %<bitfield>d		print the bitfield in decimal
    122    %<bitfield>k		print immediate for VFPv3 conversion instruction
    123    %<bitfield>x		print the bitfield in hex
    124    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
    125    %<bitfield>f		print a floating point constant if >7 else a
    126 			floating point register
    127    %<bitfield>w         print as an iWMMXt width field - [bhwd]ss/us
    128    %<bitfield>g         print as an iWMMXt 64-bit register
    129    %<bitfield>G         print as an iWMMXt general purpose or control register
    130    %<bitfield>D		print as a NEON D register
    131    %<bitfield>Q		print as a NEON Q register
    132 
    133    %y<code>		print a single precision VFP reg.
    134 			  Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
    135    %z<code>		print a double precision VFP reg
    136 			  Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
    137 
    138    %<bitfield>'c	print specified char iff bitfield is all ones
    139    %<bitfield>`c	print specified char iff bitfield is all zeroes
    140    %<bitfield>?ab...    select from array of values in big endian order
    141 
    142    %L			print as an iWMMXt N/M width field.
    143    %Z			print the Immediate of a WSHUFH instruction.
    144    %l			like 'A' except use byte offsets for 'B' & 'H'
    145 			versions.
    146    %i			print 5-bit immediate in bits 8,3..0
    147 			(print "32" when 0)
    148    %r			print register offset address for wldt/wstr instruction
    149 */
    150 
    151 /* Common coprocessor opcodes shared between Arm and Thumb-2.  */
    152 
    153 static const struct opcode32 coprocessor_opcodes[] =
    154 {
    155   /* XScale instructions.  */
    156   {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0ff0, "mia%c\tacc0, %0-3r, %12-15r"},
    157   {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0ff0, "miaph%c\tacc0, %0-3r, %12-15r"},
    158   {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
    159   {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
    160   {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
    161 
    162   /* Intel Wireless MMX technology instructions.  */
    163 #define FIRST_IWMMXT_INSN 0x0e130130
    164 #define IWMMXT_INSN_COUNT 73
    165   {ARM_CEXT_IWMMXT, 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
    166   {ARM_CEXT_XSCALE, 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
    167   {ARM_CEXT_XSCALE, 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
    168   {ARM_CEXT_XSCALE, 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
    169   {ARM_CEXT_XSCALE, 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
    170   {ARM_CEXT_XSCALE, 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
    171   {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
    172   {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
    173   {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
    174   {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
    175   {ARM_CEXT_XSCALE, 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
    176   {ARM_CEXT_XSCALE, 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
    177   {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
    178   {ARM_CEXT_XSCALE, 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
    179   {ARM_CEXT_XSCALE, 0x0e130190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
    180   {ARM_CEXT_XSCALE, 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
    181   {ARM_CEXT_XSCALE, 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
    182   {ARM_CEXT_XSCALE, 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    183   {ARM_CEXT_XSCALE, 0x0e2001a0, 0x0f300ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
    184   {ARM_CEXT_XSCALE, 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
    185   {ARM_CEXT_XSCALE, 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
    186   {ARM_CEXT_XSCALE, 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
    187   {ARM_CEXT_XSCALE, 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
    188   {ARM_CEXT_XSCALE, 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
    189   {ARM_CEXT_XSCALE, 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
    190   {ARM_CEXT_XSCALE, 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    191   {ARM_CEXT_XSCALE, 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    192   {ARM_CEXT_XSCALE, 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
    193   {ARM_CEXT_XSCALE, 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
    194   {ARM_CEXT_XSCALE, 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
    195   {ARM_CEXT_XSCALE, 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
    196   {ARM_CEXT_XSCALE, 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
    197   {ARM_CEXT_XSCALE, 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
    198   {ARM_CEXT_XSCALE, 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    199   {ARM_CEXT_XSCALE, 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
    200   {ARM_CEXT_XSCALE, 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    201   {ARM_CEXT_XSCALE, 0x0e800120, 0x0f800ff0, "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    202   {ARM_CEXT_XSCALE, 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    203   {ARM_CEXT_XSCALE, 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
    204   {ARM_CEXT_XSCALE, 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
    205   {ARM_CEXT_XSCALE, 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
    206   {ARM_CEXT_XSCALE, 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
    207   {ARM_CEXT_XSCALE, 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
    208   {ARM_CEXT_XSCALE, 0x0e8000a0, 0x0f800ff0, "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    209   {ARM_CEXT_XSCALE, 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    210   {ARM_CEXT_XSCALE, 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    211   {ARM_CEXT_XSCALE, 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
    212   {ARM_CEXT_XSCALE, 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    213   {ARM_CEXT_XSCALE, 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
    214   {ARM_CEXT_XSCALE, 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    215   {ARM_CEXT_XSCALE, 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
    216   {ARM_CEXT_XSCALE, 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
    217   {ARM_CEXT_XSCALE, 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
    218   {ARM_CEXT_XSCALE, 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
    219   {ARM_CEXT_XSCALE, 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    220   {ARM_CEXT_XSCALE, 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    221   {ARM_CEXT_XSCALE, 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
    222   {ARM_CEXT_XSCALE, 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    223   {ARM_CEXT_XSCALE, 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    224   {ARM_CEXT_XSCALE, 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
    225   {ARM_CEXT_XSCALE, 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    226   {ARM_CEXT_XSCALE, 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    227   {ARM_CEXT_XSCALE, 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
    228   {ARM_CEXT_XSCALE, 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
    229   {ARM_CEXT_XSCALE, 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
    230   {ARM_CEXT_XSCALE, 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    231   {ARM_CEXT_XSCALE, 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
    232   {ARM_CEXT_XSCALE, 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    233   {ARM_CEXT_XSCALE, 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
    234   {ARM_CEXT_XSCALE, 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
    235   {ARM_CEXT_XSCALE, 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
    236   {ARM_CEXT_XSCALE, 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
    237   {ARM_CEXT_XSCALE, 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    238   {ARM_CEXT_XSCALE, 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    239   {ARM_CEXT_XSCALE, 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
    240 
    241   /* Floating point coprocessor (FPA) instructions */
    242   {FPU_FPA_EXT_V1, 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    243   {FPU_FPA_EXT_V1, 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    244   {FPU_FPA_EXT_V1, 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    245   {FPU_FPA_EXT_V1, 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    246   {FPU_FPA_EXT_V1, 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    247   {FPU_FPA_EXT_V1, 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    248   {FPU_FPA_EXT_V1, 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
    249   {FPU_FPA_EXT_V1, 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
    250   {FPU_FPA_EXT_V1, 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
    251   {FPU_FPA_EXT_V1, 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
    252   {FPU_FPA_EXT_V1, 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
    253   {FPU_FPA_EXT_V1, 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
    254   {FPU_FPA_EXT_V1, 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
    255   {FPU_FPA_EXT_V1, 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
    256   {FPU_FPA_EXT_V1, 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
    257   {FPU_FPA_EXT_V1, 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
    258   {FPU_FPA_EXT_V1, 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
    259   {FPU_FPA_EXT_V1, 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
    260   {FPU_FPA_EXT_V1, 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
    261   {FPU_FPA_EXT_V1, 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
    262   {FPU_FPA_EXT_V1, 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
    263   {FPU_FPA_EXT_V1, 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
    264   {FPU_FPA_EXT_V1, 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
    265   {FPU_FPA_EXT_V1, 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
    266   {FPU_FPA_EXT_V1, 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
    267   {FPU_FPA_EXT_V1, 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
    268   {FPU_FPA_EXT_V1, 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
    269   {FPU_FPA_EXT_V1, 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
    270   {FPU_FPA_EXT_V1, 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
    271   {FPU_FPA_EXT_V1, 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
    272   {FPU_FPA_EXT_V1, 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
    273   {FPU_FPA_EXT_V1, 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
    274   {FPU_FPA_EXT_V1, 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
    275   {FPU_FPA_EXT_V1, 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
    276   {FPU_FPA_EXT_V1, 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
    277   {FPU_FPA_EXT_V1, 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
    278   {FPU_FPA_EXT_V1, 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
    279   {FPU_FPA_EXT_V1, 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
    280   {FPU_FPA_EXT_V1, 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
    281   {FPU_FPA_EXT_V1, 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
    282   {FPU_FPA_EXT_V1, 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
    283   {FPU_FPA_EXT_V2, 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
    284   {FPU_FPA_EXT_V2, 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
    285 
    286   /* Register load/store */
    287   {FPU_NEON_EXT_V1, 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r%21'!, %B"},
    288   {FPU_NEON_EXT_V1, 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r%21'!, %B"},
    289   {FPU_NEON_EXT_V1, 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
    290   {FPU_NEON_EXT_V1, 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
    291   {FPU_NEON_EXT_V1, 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %C"},
    292   {FPU_NEON_EXT_V1, 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %C"},
    293 
    294   /* Data transfer between ARM and NEON registers */
    295   {FPU_NEON_EXT_V1, 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
    296   {FPU_NEON_EXT_V1, 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
    297   {FPU_NEON_EXT_V1, 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
    298   {FPU_NEON_EXT_V1, 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
    299   {FPU_NEON_EXT_V1, 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
    300   {FPU_NEON_EXT_V1, 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
    301   {FPU_NEON_EXT_V1, 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
    302   {FPU_NEON_EXT_V1, 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
    303   {FPU_NEON_EXT_V1, 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
    304   {FPU_NEON_EXT_V1, 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
    305   {FPU_NEON_EXT_V1, 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
    306   {FPU_NEON_EXT_V1, 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
    307   {FPU_NEON_EXT_V1, 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
    308   {FPU_NEON_EXT_V1, 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
    309 
    310   /* Floating point coprocessor (VFP) instructions */
    311   {FPU_VFP_EXT_V1xD, 0x0ef1fa10, 0x0fffffff, "fmstat%c"},
    312   {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0fff0fff, "fmxr%c\tfpsid, %12-15r"},
    313   {FPU_VFP_EXT_V1xD, 0x0ee10a10, 0x0fff0fff, "fmxr%c\tfpscr, %12-15r"},
    314   {FPU_VFP_EXT_V1xD, 0x0ee60a10, 0x0fff0fff, "fmxr%c\tmvfr1, %12-15r"},
    315   {FPU_VFP_EXT_V1xD, 0x0ee70a10, 0x0fff0fff, "fmxr%c\tmvfr0, %12-15r"},
    316   {FPU_VFP_EXT_V1xD, 0x0ee80a10, 0x0fff0fff, "fmxr%c\tfpexc, %12-15r"},
    317   {FPU_VFP_EXT_V1xD, 0x0ee90a10, 0x0fff0fff, "fmxr%c\tfpinst, %12-15r\t@ Impl def"},
    318   {FPU_VFP_EXT_V1xD, 0x0eea0a10, 0x0fff0fff, "fmxr%c\tfpinst2, %12-15r\t@ Impl def"},
    319   {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpsid"},
    320   {FPU_VFP_EXT_V1xD, 0x0ef10a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpscr"},
    321   {FPU_VFP_EXT_V1xD, 0x0ef60a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr1"},
    322   {FPU_VFP_EXT_V1xD, 0x0ef70a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr0"},
    323   {FPU_VFP_EXT_V1xD, 0x0ef80a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpexc"},
    324   {FPU_VFP_EXT_V1xD, 0x0ef90a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst\t@ Impl def"},
    325   {FPU_VFP_EXT_V1xD, 0x0efa0a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst2\t@ Impl def"},
    326   {FPU_VFP_EXT_V1, 0x0e000b10, 0x0ff00fff, "fmdlr%c\t%z2, %12-15r"},
    327   {FPU_VFP_EXT_V1, 0x0e100b10, 0x0ff00fff, "fmrdl%c\t%12-15r, %z2"},
    328   {FPU_VFP_EXT_V1, 0x0e200b10, 0x0ff00fff, "fmdhr%c\t%z2, %12-15r"},
    329   {FPU_VFP_EXT_V1, 0x0e300b10, 0x0ff00fff, "fmrdh%c\t%12-15r, %z2"},
    330   {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0ff00fff, "fmxr%c\t<impl def %16-19x>, %12-15r"},
    331   {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0ff00fff, "fmrx%c\t%12-15r, <impl def %16-19x>"},
    332   {FPU_VFP_EXT_V1xD, 0x0e000a10, 0x0ff00f7f, "fmsr%c\t%y2, %12-15r"},
    333   {FPU_VFP_EXT_V1xD, 0x0e100a10, 0x0ff00f7f, "fmrs%c\t%12-15r, %y2"},
    334   {FPU_VFP_EXT_V1xD, 0x0eb50a40, 0x0fbf0f70, "fcmp%7'ezs%c\t%y1"},
    335   {FPU_VFP_EXT_V1, 0x0eb50b40, 0x0fbf0f70, "fcmp%7'ezd%c\t%z1"},
    336   {FPU_VFP_EXT_V1xD, 0x0eb00a40, 0x0fbf0fd0, "fcpys%c\t%y1, %y0"},
    337   {FPU_VFP_EXT_V1xD, 0x0eb00ac0, 0x0fbf0fd0, "fabss%c\t%y1, %y0"},
    338   {FPU_VFP_EXT_V1, 0x0eb00b40, 0x0fbf0fd0, "fcpyd%c\t%z1, %z0"},
    339   {FPU_VFP_EXT_V1, 0x0eb00bc0, 0x0fbf0fd0, "fabsd%c\t%z1, %z0"},
    340   {FPU_VFP_EXT_V1xD, 0x0eb10a40, 0x0fbf0fd0, "fnegs%c\t%y1, %y0"},
    341   {FPU_VFP_EXT_V1xD, 0x0eb10ac0, 0x0fbf0fd0, "fsqrts%c\t%y1, %y0"},
    342   {FPU_VFP_EXT_V1, 0x0eb10b40, 0x0fbf0fd0, "fnegd%c\t%z1, %z0"},
    343   {FPU_VFP_EXT_V1, 0x0eb10bc0, 0x0fbf0fd0, "fsqrtd%c\t%z1, %z0"},
    344   {FPU_VFP_EXT_V1, 0x0eb70ac0, 0x0fbf0fd0, "fcvtds%c\t%z1, %y0"},
    345   {FPU_VFP_EXT_V1, 0x0eb70bc0, 0x0fbf0fd0, "fcvtsd%c\t%y1, %z0"},
    346   {FPU_VFP_EXT_V1xD, 0x0eb80a40, 0x0fbf0fd0, "fuitos%c\t%y1, %y0"},
    347   {FPU_VFP_EXT_V1xD, 0x0eb80ac0, 0x0fbf0fd0, "fsitos%c\t%y1, %y0"},
    348   {FPU_VFP_EXT_V1, 0x0eb80b40, 0x0fbf0fd0, "fuitod%c\t%z1, %y0"},
    349   {FPU_VFP_EXT_V1, 0x0eb80bc0, 0x0fbf0fd0, "fsitod%c\t%z1, %y0"},
    350   {FPU_VFP_EXT_V1xD, 0x0eb40a40, 0x0fbf0f50, "fcmp%7'es%c\t%y1, %y0"},
    351   {FPU_VFP_EXT_V1, 0x0eb40b40, 0x0fbf0f50, "fcmp%7'ed%c\t%z1, %z0"},
    352   {FPU_VFP_EXT_V3, 0x0eba0a40, 0x0fbe0f50, "f%16?us%7?lhtos%c\t%y1, #%5,0-3k"},
    353   {FPU_VFP_EXT_V3, 0x0eba0b40, 0x0fbe0f50, "f%16?us%7?lhtod%c\t%z1, #%5,0-3k"},
    354   {FPU_VFP_EXT_V1xD, 0x0ebc0a40, 0x0fbe0f50, "fto%16?sui%7'zs%c\t%y1, %y0"},
    355   {FPU_VFP_EXT_V1, 0x0ebc0b40, 0x0fbe0f50, "fto%16?sui%7'zd%c\t%y1, %z0"},
    356   {FPU_VFP_EXT_V3, 0x0ebe0a40, 0x0fbe0f50, "fto%16?us%7?lhs%c\t%y1, #%5,0-3k"},
    357   {FPU_VFP_EXT_V3, 0x0ebe0b40, 0x0fbe0f50, "fto%16?us%7?lhd%c\t%z1, #%5,0-3k"},
    358   {FPU_VFP_EXT_V1, 0x0c500b10, 0x0fb00ff0, "fmrrd%c\t%12-15r, %16-19r, %z0"},
    359   {FPU_VFP_EXT_V3, 0x0eb00a00, 0x0fb00ff0, "fconsts%c\t%y1, #%0-3,16-19d"},
    360   {FPU_VFP_EXT_V3, 0x0eb00b00, 0x0fb00ff0, "fconstd%c\t%z1, #%0-3,16-19d"},
    361   {FPU_VFP_EXT_V2, 0x0c400a10, 0x0ff00fd0, "fmsrr%c\t%y4, %12-15r, %16-19r"},
    362   {FPU_VFP_EXT_V2, 0x0c400b10, 0x0ff00fd0, "fmdrr%c\t%z0, %12-15r, %16-19r"},
    363   {FPU_VFP_EXT_V2, 0x0c500a10, 0x0ff00fd0, "fmrrs%c\t%12-15r, %16-19r, %y4"},
    364   {FPU_VFP_EXT_V1xD, 0x0e000a00, 0x0fb00f50, "fmacs%c\t%y1, %y2, %y0"},
    365   {FPU_VFP_EXT_V1xD, 0x0e000a40, 0x0fb00f50, "fnmacs%c\t%y1, %y2, %y0"},
    366   {FPU_VFP_EXT_V1, 0x0e000b00, 0x0fb00f50, "fmacd%c\t%z1, %z2, %z0"},
    367   {FPU_VFP_EXT_V1, 0x0e000b40, 0x0fb00f50, "fnmacd%c\t%z1, %z2, %z0"},
    368   {FPU_VFP_EXT_V1xD, 0x0e100a00, 0x0fb00f50, "fmscs%c\t%y1, %y2, %y0"},
    369   {FPU_VFP_EXT_V1xD, 0x0e100a40, 0x0fb00f50, "fnmscs%c\t%y1, %y2, %y0"},
    370   {FPU_VFP_EXT_V1, 0x0e100b00, 0x0fb00f50, "fmscd%c\t%z1, %z2, %z0"},
    371   {FPU_VFP_EXT_V1, 0x0e100b40, 0x0fb00f50, "fnmscd%c\t%z1, %z2, %z0"},
    372   {FPU_VFP_EXT_V1xD, 0x0e200a00, 0x0fb00f50, "fmuls%c\t%y1, %y2, %y0"},
    373   {FPU_VFP_EXT_V1xD, 0x0e200a40, 0x0fb00f50, "fnmuls%c\t%y1, %y2, %y0"},
    374   {FPU_VFP_EXT_V1, 0x0e200b00, 0x0fb00f50, "fmuld%c\t%z1, %z2, %z0"},
    375   {FPU_VFP_EXT_V1, 0x0e200b40, 0x0fb00f50, "fnmuld%c\t%z1, %z2, %z0"},
    376   {FPU_VFP_EXT_V1xD, 0x0e300a00, 0x0fb00f50, "fadds%c\t%y1, %y2, %y0"},
    377   {FPU_VFP_EXT_V1xD, 0x0e300a40, 0x0fb00f50, "fsubs%c\t%y1, %y2, %y0"},
    378   {FPU_VFP_EXT_V1, 0x0e300b00, 0x0fb00f50, "faddd%c\t%z1, %z2, %z0"},
    379   {FPU_VFP_EXT_V1, 0x0e300b40, 0x0fb00f50, "fsubd%c\t%z1, %z2, %z0"},
    380   {FPU_VFP_EXT_V1xD, 0x0e800a00, 0x0fb00f50, "fdivs%c\t%y1, %y2, %y0"},
    381   {FPU_VFP_EXT_V1, 0x0e800b00, 0x0fb00f50, "fdivd%c\t%z1, %z2, %z0"},
    382   {FPU_VFP_EXT_V1xD, 0x0d200a00, 0x0fb00f00, "fstmdbs%c\t%16-19r!, %y3"},
    383   {FPU_VFP_EXT_V1xD, 0x0d200b00, 0x0fb00f00, "fstmdb%0?xd%c\t%16-19r!, %z3"},
    384   {FPU_VFP_EXT_V1xD, 0x0d300a00, 0x0fb00f00, "fldmdbs%c\t%16-19r!, %y3"},
    385   {FPU_VFP_EXT_V1xD, 0x0d300b00, 0x0fb00f00, "fldmdb%0?xd%c\t%16-19r!, %z3"},
    386   {FPU_VFP_EXT_V1xD, 0x0d000a00, 0x0f300f00, "fsts%c\t%y1, %A"},
    387   {FPU_VFP_EXT_V1, 0x0d000b00, 0x0f300f00, "fstd%c\t%z1, %A"},
    388   {FPU_VFP_EXT_V1xD, 0x0d100a00, 0x0f300f00, "flds%c\t%y1, %A"},
    389   {FPU_VFP_EXT_V1, 0x0d100b00, 0x0f300f00, "fldd%c\t%z1, %A"},
    390   {FPU_VFP_EXT_V1xD, 0x0c800a00, 0x0f900f00, "fstmias%c\t%16-19r%21'!, %y3"},
    391   {FPU_VFP_EXT_V1xD, 0x0c800b00, 0x0f900f00, "fstmia%0?xd%c\t%16-19r%21'!, %z3"},
    392   {FPU_VFP_EXT_V1xD, 0x0c900a00, 0x0f900f00, "fldmias%c\t%16-19r%21'!, %y3"},
    393   {FPU_VFP_EXT_V1xD, 0x0c900b00, 0x0f900f00, "fldmia%0?xd%c\t%16-19r%21'!, %z3"},
    394 
    395   /* Cirrus coprocessor instructions.  */
    396   {ARM_CEXT_MAVERICK, 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
    397   {ARM_CEXT_MAVERICK, 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
    398   {ARM_CEXT_MAVERICK, 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
    399   {ARM_CEXT_MAVERICK, 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
    400   {ARM_CEXT_MAVERICK, 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
    401   {ARM_CEXT_MAVERICK, 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
    402   {ARM_CEXT_MAVERICK, 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
    403   {ARM_CEXT_MAVERICK, 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
    404   {ARM_CEXT_MAVERICK, 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
    405   {ARM_CEXT_MAVERICK, 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
    406   {ARM_CEXT_MAVERICK, 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
    407   {ARM_CEXT_MAVERICK, 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
    408   {ARM_CEXT_MAVERICK, 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
    409   {ARM_CEXT_MAVERICK, 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
    410   {ARM_CEXT_MAVERICK, 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
    411   {ARM_CEXT_MAVERICK, 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
    412   {ARM_CEXT_MAVERICK, 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
    413   {ARM_CEXT_MAVERICK, 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
    414   {ARM_CEXT_MAVERICK, 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
    415   {ARM_CEXT_MAVERICK, 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
    416   {ARM_CEXT_MAVERICK, 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
    417   {ARM_CEXT_MAVERICK, 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
    418   {ARM_CEXT_MAVERICK, 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
    419   {ARM_CEXT_MAVERICK, 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
    420   {ARM_CEXT_MAVERICK, 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
    421   {ARM_CEXT_MAVERICK, 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
    422   {ARM_CEXT_MAVERICK, 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
    423   {ARM_CEXT_MAVERICK, 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
    424   {ARM_CEXT_MAVERICK, 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
    425   {ARM_CEXT_MAVERICK, 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
    426   {ARM_CEXT_MAVERICK, 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
    427   {ARM_CEXT_MAVERICK, 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
    428   {ARM_CEXT_MAVERICK, 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
    429   {ARM_CEXT_MAVERICK, 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
    430   {ARM_CEXT_MAVERICK, 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
    431   {ARM_CEXT_MAVERICK, 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
    432   {ARM_CEXT_MAVERICK, 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
    433   {ARM_CEXT_MAVERICK, 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
    434   {ARM_CEXT_MAVERICK, 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
    435   {ARM_CEXT_MAVERICK, 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
    436   {ARM_CEXT_MAVERICK, 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
    437   {ARM_CEXT_MAVERICK, 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
    438   {ARM_CEXT_MAVERICK, 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
    439   {ARM_CEXT_MAVERICK, 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
    440   {ARM_CEXT_MAVERICK, 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
    441   {ARM_CEXT_MAVERICK, 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
    442   {ARM_CEXT_MAVERICK, 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
    443   {ARM_CEXT_MAVERICK, 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
    444   {ARM_CEXT_MAVERICK, 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
    445   {ARM_CEXT_MAVERICK, 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
    446   {ARM_CEXT_MAVERICK, 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
    447   {ARM_CEXT_MAVERICK, 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
    448   {ARM_CEXT_MAVERICK, 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
    449   {ARM_CEXT_MAVERICK, 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
    450   {ARM_CEXT_MAVERICK, 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
    451   {ARM_CEXT_MAVERICK, 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
    452   {ARM_CEXT_MAVERICK, 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
    453   {ARM_CEXT_MAVERICK, 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
    454   {ARM_CEXT_MAVERICK, 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
    455   {ARM_CEXT_MAVERICK, 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
    456   {ARM_CEXT_MAVERICK, 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
    457   {ARM_CEXT_MAVERICK, 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
    458   {ARM_CEXT_MAVERICK, 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    459   {ARM_CEXT_MAVERICK, 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    460   {ARM_CEXT_MAVERICK, 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    461   {ARM_CEXT_MAVERICK, 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    462   {ARM_CEXT_MAVERICK, 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
    463   {ARM_CEXT_MAVERICK, 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
    464   {ARM_CEXT_MAVERICK, 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
    465   {ARM_CEXT_MAVERICK, 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
    466   {ARM_CEXT_MAVERICK, 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
    467   {ARM_CEXT_MAVERICK, 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
    468   {ARM_CEXT_MAVERICK, 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    469   {ARM_CEXT_MAVERICK, 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    470   {ARM_CEXT_MAVERICK, 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    471   {ARM_CEXT_MAVERICK, 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    472   {ARM_CEXT_MAVERICK, 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    473   {ARM_CEXT_MAVERICK, 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
    474   {ARM_CEXT_MAVERICK, 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    475   {ARM_CEXT_MAVERICK, 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    476   {ARM_CEXT_MAVERICK, 0x0e000600, 0x0ff00f10, "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    477   {ARM_CEXT_MAVERICK, 0x0e100600, 0x0ff00f10, "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
    478   {ARM_CEXT_MAVERICK, 0x0e200600, 0x0ff00f10, "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
    479   {ARM_CEXT_MAVERICK, 0x0e300600, 0x0ff00f10, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
    480 
    481   /* Generic coprocessor instructions */
    482   {ARM_EXT_V2, 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
    483   {ARM_EXT_V2, 0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
    484   {ARM_EXT_V2, 0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
    485   {ARM_EXT_V2, 0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    486   {ARM_EXT_V2, 0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    487   {ARM_EXT_V2, 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
    488   {ARM_EXT_V2, 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
    489 
    490   /* V6 coprocessor instructions */
    491   {ARM_EXT_V6, 0xfc500000, 0xfff00000, "mrrc2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
    492   {ARM_EXT_V6, 0xfc400000, 0xfff00000, "mcrr2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
    493 
    494   /* V5 coprocessor instructions */
    495   {ARM_EXT_V5, 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
    496   {ARM_EXT_V5, 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
    497   {ARM_EXT_V5, 0xfe000000, 0xff000010, "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
    498   {ARM_EXT_V5, 0xfe000010, 0xff100010, "mcr2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    499   {ARM_EXT_V5, 0xfe100010, 0xff100010, "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
    500 
    501   {0, 0, 0, 0}
    502 };
    503 
    504 /* Neon opcode table:  This does not encode the top byte -- that is
    505    checked by the print_insn_neon routine, as it depends on whether we are
    506    doing thumb32 or arm32 disassembly.  */
    507 
    508 /* print_insn_neon recognizes the following format control codes:
    509 
    510    %%			%
    511 
    512    %c			print condition code
    513    %A			print v{st,ld}[1234] operands
    514    %B			print v{st,ld}[1234] any one operands
    515    %C			print v{st,ld}[1234] single->all operands
    516    %D			print scalar
    517    %E			print vmov, vmvn, vorr, vbic encoded constant
    518    %F			print vtbl,vtbx register list
    519 
    520    %<bitfield>r		print as an ARM register
    521    %<bitfield>d		print the bitfield in decimal
    522    %<bitfield>e         print the 2^N - bitfield in decimal
    523    %<bitfield>D		print as a NEON D register
    524    %<bitfield>Q		print as a NEON Q register
    525    %<bitfield>R		print as a NEON D or Q register
    526    %<bitfield>Sn	print byte scaled width limited by n
    527    %<bitfield>Tn	print short scaled width limited by n
    528    %<bitfield>Un	print long scaled width limited by n
    529 
    530    %<bitfield>'c	print specified char iff bitfield is all ones
    531    %<bitfield>`c	print specified char iff bitfield is all zeroes
    532    %<bitfield>?ab...    select from array of values in big endian order  */
    533 
    534 static const struct opcode32 neon_opcodes[] =
    535 {
    536   /* Extract */
    537   {FPU_NEON_EXT_V1, 0xf2b00840, 0xffb00850, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
    538   {FPU_NEON_EXT_V1, 0xf2b00000, 0xffb00810, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
    539 
    540   /* Move data element to all lanes */
    541   {FPU_NEON_EXT_V1, 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
    542   {FPU_NEON_EXT_V1, 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
    543   {FPU_NEON_EXT_V1, 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
    544 
    545   /* Table lookup */
    546   {FPU_NEON_EXT_V1, 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
    547   {FPU_NEON_EXT_V1, 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
    548 
    549   /* Two registers, miscellaneous */
    550   {FPU_NEON_EXT_V1, 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
    551   {FPU_NEON_EXT_V1, 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
    552   {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
    553   {FPU_NEON_EXT_V1, 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
    554   {FPU_NEON_EXT_V1, 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
    555   {FPU_NEON_EXT_V1, 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
    556   {FPU_NEON_EXT_V1, 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
    557   {FPU_NEON_EXT_V1, 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
    558   {FPU_NEON_EXT_V1, 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
    559   {FPU_NEON_EXT_V1, 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
    560   {FPU_NEON_EXT_V1, 0xf3b20300, 0xffb30fd0, "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
    561   {FPU_NEON_EXT_V1, 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
    562   {FPU_NEON_EXT_V1, 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
    563   {FPU_NEON_EXT_V1, 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    564   {FPU_NEON_EXT_V1, 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    565   {FPU_NEON_EXT_V1, 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    566   {FPU_NEON_EXT_V1, 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
    567   {FPU_NEON_EXT_V1, 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
    568   {FPU_NEON_EXT_V1, 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
    569   {FPU_NEON_EXT_V1, 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
    570   {FPU_NEON_EXT_V1, 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    571   {FPU_NEON_EXT_V1, 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    572   {FPU_NEON_EXT_V1, 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
    573   {FPU_NEON_EXT_V1, 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
    574   {FPU_NEON_EXT_V1, 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
    575   {FPU_NEON_EXT_V1, 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
    576   {FPU_NEON_EXT_V1, 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
    577   {FPU_NEON_EXT_V1, 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
    578   {FPU_NEON_EXT_V1, 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
    579   {FPU_NEON_EXT_V1, 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
    580   {FPU_NEON_EXT_V1, 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
    581   {FPU_NEON_EXT_V1, 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
    582   {FPU_NEON_EXT_V1, 0xf3b30600, 0xffb30e10, "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
    583 
    584   /* Three registers of the same length */
    585   {FPU_NEON_EXT_V1, 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    586   {FPU_NEON_EXT_V1, 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    587   {FPU_NEON_EXT_V1, 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    588   {FPU_NEON_EXT_V1, 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    589   {FPU_NEON_EXT_V1, 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    590   {FPU_NEON_EXT_V1, 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    591   {FPU_NEON_EXT_V1, 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    592   {FPU_NEON_EXT_V1, 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
    593   {FPU_NEON_EXT_V1, 0xf2000d00, 0xffa00f10, "vadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    594   {FPU_NEON_EXT_V1, 0xf2000d10, 0xffa00f10, "vmla%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    595   {FPU_NEON_EXT_V1, 0xf2000e00, 0xffa00f10, "vceq%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    596   {FPU_NEON_EXT_V1, 0xf2000f00, 0xffa00f10, "vmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    597   {FPU_NEON_EXT_V1, 0xf2000f10, 0xffa00f10, "vrecps%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    598   {FPU_NEON_EXT_V1, 0xf2200d00, 0xffa00f10, "vsub%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    599   {FPU_NEON_EXT_V1, 0xf2200d10, 0xffa00f10, "vmls%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    600   {FPU_NEON_EXT_V1, 0xf2200f00, 0xffa00f10, "vmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    601   {FPU_NEON_EXT_V1, 0xf2200f10, 0xffa00f10, "vrsqrts%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    602   {FPU_NEON_EXT_V1, 0xf3000d00, 0xffa00f10, "vpadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    603   {FPU_NEON_EXT_V1, 0xf3000d10, 0xffa00f10, "vmul%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    604   {FPU_NEON_EXT_V1, 0xf3000e00, 0xffa00f10, "vcge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    605   {FPU_NEON_EXT_V1, 0xf3000e10, 0xffa00f10, "vacge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    606   {FPU_NEON_EXT_V1, 0xf3000f00, 0xffa00f10, "vpmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    607   {FPU_NEON_EXT_V1, 0xf3200d00, 0xffa00f10, "vabd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    608   {FPU_NEON_EXT_V1, 0xf3200e00, 0xffa00f10, "vcgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    609   {FPU_NEON_EXT_V1, 0xf3200e10, 0xffa00f10, "vacgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    610   {FPU_NEON_EXT_V1, 0xf3200f00, 0xffa00f10, "vpmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
    611   {FPU_NEON_EXT_V1, 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
    612   {FPU_NEON_EXT_V1, 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    613   {FPU_NEON_EXT_V1, 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    614   {FPU_NEON_EXT_V1, 0xf2000b00, 0xff800f10, "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
    615   {FPU_NEON_EXT_V1, 0xf2000b10, 0xff800f10, "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    616   {FPU_NEON_EXT_V1, 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
    617   {FPU_NEON_EXT_V1, 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    618   {FPU_NEON_EXT_V1, 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    619   {FPU_NEON_EXT_V1, 0xf3000b00, 0xff800f10, "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
    620   {FPU_NEON_EXT_V1, 0xf2000000, 0xfe800f10, "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    621   {FPU_NEON_EXT_V1, 0xf2000010, 0xfe800f10, "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
    622   {FPU_NEON_EXT_V1, 0xf2000100, 0xfe800f10, "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    623   {FPU_NEON_EXT_V1, 0xf2000200, 0xfe800f10, "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    624   {FPU_NEON_EXT_V1, 0xf2000210, 0xfe800f10, "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
    625   {FPU_NEON_EXT_V1, 0xf2000300, 0xfe800f10, "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    626   {FPU_NEON_EXT_V1, 0xf2000310, 0xfe800f10, "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    627   {FPU_NEON_EXT_V1, 0xf2000400, 0xfe800f10, "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
    628   {FPU_NEON_EXT_V1, 0xf2000410, 0xfe800f10, "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
    629   {FPU_NEON_EXT_V1, 0xf2000500, 0xfe800f10, "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
    630   {FPU_NEON_EXT_V1, 0xf2000510, 0xfe800f10, "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
    631   {FPU_NEON_EXT_V1, 0xf2000600, 0xfe800f10, "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    632   {FPU_NEON_EXT_V1, 0xf2000610, 0xfe800f10, "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    633   {FPU_NEON_EXT_V1, 0xf2000700, 0xfe800f10, "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    634   {FPU_NEON_EXT_V1, 0xf2000710, 0xfe800f10, "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    635   {FPU_NEON_EXT_V1, 0xf2000910, 0xfe800f10, "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    636   {FPU_NEON_EXT_V1, 0xf2000a00, 0xfe800f10, "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    637   {FPU_NEON_EXT_V1, 0xf2000a10, 0xfe800f10, "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
    638 
    639   /* One register and an immediate value */
    640   {FPU_NEON_EXT_V1, 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
    641   {FPU_NEON_EXT_V1, 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
    642   {FPU_NEON_EXT_V1, 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
    643   {FPU_NEON_EXT_V1, 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
    644   {FPU_NEON_EXT_V1, 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
    645   {FPU_NEON_EXT_V1, 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
    646   {FPU_NEON_EXT_V1, 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
    647   {FPU_NEON_EXT_V1, 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
    648   {FPU_NEON_EXT_V1, 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
    649   {FPU_NEON_EXT_V1, 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
    650   {FPU_NEON_EXT_V1, 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
    651   {FPU_NEON_EXT_V1, 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
    652   {FPU_NEON_EXT_V1, 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
    653 
    654   /* Two registers and a shift amount */
    655   {FPU_NEON_EXT_V1, 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    656   {FPU_NEON_EXT_V1, 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    657   {FPU_NEON_EXT_V1, 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    658   {FPU_NEON_EXT_V1, 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    659   {FPU_NEON_EXT_V1, 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    660   {FPU_NEON_EXT_V1, 0xf2880950, 0xfeb80fd0, "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
    661   {FPU_NEON_EXT_V1, 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22D, %0-3,5Q, #%16-18d"},
    662   {FPU_NEON_EXT_V1, 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    663   {FPU_NEON_EXT_V1, 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    664   {FPU_NEON_EXT_V1, 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
    665   {FPU_NEON_EXT_V1, 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
    666   {FPU_NEON_EXT_V1, 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
    667   {FPU_NEON_EXT_V1, 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
    668   {FPU_NEON_EXT_V1, 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    669   {FPU_NEON_EXT_V1, 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    670   {FPU_NEON_EXT_V1, 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    671   {FPU_NEON_EXT_V1, 0xf2900950, 0xfeb00fd0, "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
    672   {FPU_NEON_EXT_V1, 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-19d"},
    673   {FPU_NEON_EXT_V1, 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
    674   {FPU_NEON_EXT_V1, 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
    675   {FPU_NEON_EXT_V1, 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
    676   {FPU_NEON_EXT_V1, 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
    677   {FPU_NEON_EXT_V1, 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
    678   {FPU_NEON_EXT_V1, 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    679   {FPU_NEON_EXT_V1, 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    680   {FPU_NEON_EXT_V1, 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
    681   {FPU_NEON_EXT_V1, 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
    682   {FPU_NEON_EXT_V1, 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
    683   {FPU_NEON_EXT_V1, 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
    684   {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-20d"},
    685   {FPU_NEON_EXT_V1, 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
    686   {FPU_NEON_EXT_V1, 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
    687   {FPU_NEON_EXT_V1, 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
    688   {FPU_NEON_EXT_V1, 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
    689   {FPU_NEON_EXT_V1, 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
    690   {FPU_NEON_EXT_V1, 0xf2800810, 0xfec00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    691   {FPU_NEON_EXT_V1, 0xf2800850, 0xfec00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    692   {FPU_NEON_EXT_V1, 0xf2800910, 0xfec00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    693   {FPU_NEON_EXT_V1, 0xf2800950, 0xfec00fd0, "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
    694   {FPU_NEON_EXT_V1, 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
    695   {FPU_NEON_EXT_V1, 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
    696   {FPU_NEON_EXT_V1, 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
    697   {FPU_NEON_EXT_V1, 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
    698   {FPU_NEON_EXT_V1, 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
    699   {FPU_NEON_EXT_V1, 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
    700   {FPU_NEON_EXT_V1, 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
    701   {FPU_NEON_EXT_V1, 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
    702   {FPU_NEON_EXT_V1, 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
    703   {FPU_NEON_EXT_V1, 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
    704   {FPU_NEON_EXT_V1, 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
    705   {FPU_NEON_EXT_V1, 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
    706   {FPU_NEON_EXT_V1, 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
    707   {FPU_NEON_EXT_V1, 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
    708   {FPU_NEON_EXT_V1, 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
    709   {FPU_NEON_EXT_V1, 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
    710   {FPU_NEON_EXT_V1, 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
    711   {FPU_NEON_EXT_V1, 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
    712   {FPU_NEON_EXT_V1, 0xf2a00e10, 0xfea00e90, "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
    713 
    714   /* Three registers of different lengths */
    715   {FPU_NEON_EXT_V1, 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    716   {FPU_NEON_EXT_V1, 0xf2800400, 0xff800f50, "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
    717   {FPU_NEON_EXT_V1, 0xf2800600, 0xff800f50, "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
    718   {FPU_NEON_EXT_V1, 0xf2800900, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    719   {FPU_NEON_EXT_V1, 0xf2800b00, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    720   {FPU_NEON_EXT_V1, 0xf2800d00, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    721   {FPU_NEON_EXT_V1, 0xf3800400, 0xff800f50, "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
    722   {FPU_NEON_EXT_V1, 0xf3800600, 0xff800f50, "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
    723   {FPU_NEON_EXT_V1, 0xf2800000, 0xfe800f50, "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    724   {FPU_NEON_EXT_V1, 0xf2800100, 0xfe800f50, "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
    725   {FPU_NEON_EXT_V1, 0xf2800200, 0xfe800f50, "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    726   {FPU_NEON_EXT_V1, 0xf2800300, 0xfe800f50, "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
    727   {FPU_NEON_EXT_V1, 0xf2800500, 0xfe800f50, "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    728   {FPU_NEON_EXT_V1, 0xf2800700, 0xfe800f50, "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    729   {FPU_NEON_EXT_V1, 0xf2800800, 0xfe800f50, "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    730   {FPU_NEON_EXT_V1, 0xf2800a00, 0xfe800f50, "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    731   {FPU_NEON_EXT_V1, 0xf2800c00, 0xfe800f50, "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
    732 
    733   /* Two registers and a scalar */
    734   {FPU_NEON_EXT_V1, 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    735   {FPU_NEON_EXT_V1, 0xf2800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
    736   {FPU_NEON_EXT_V1, 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    737   {FPU_NEON_EXT_V1, 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    738   {FPU_NEON_EXT_V1, 0xf2800540, 0xff800f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    739   {FPU_NEON_EXT_V1, 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    740   {FPU_NEON_EXT_V1, 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    741   {FPU_NEON_EXT_V1, 0xf2800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
    742   {FPU_NEON_EXT_V1, 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    743   {FPU_NEON_EXT_V1, 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    744   {FPU_NEON_EXT_V1, 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
    745   {FPU_NEON_EXT_V1, 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
    746   {FPU_NEON_EXT_V1, 0xf3800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
    747   {FPU_NEON_EXT_V1, 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
    748   {FPU_NEON_EXT_V1, 0xf3800540, 0xff800f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
    749   {FPU_NEON_EXT_V1, 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
    750   {FPU_NEON_EXT_V1, 0xf3800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
    751   {FPU_NEON_EXT_V1, 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
    752   {FPU_NEON_EXT_V1, 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
    753   {FPU_NEON_EXT_V1, 0xf2800240, 0xfe800f50, "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    754   {FPU_NEON_EXT_V1, 0xf2800640, 0xfe800f50, "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    755   {FPU_NEON_EXT_V1, 0xf2800a40, 0xfe800f50, "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
    756 
    757   /* Element and structure load/store */
    758   {FPU_NEON_EXT_V1, 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
    759   {FPU_NEON_EXT_V1, 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
    760   {FPU_NEON_EXT_V1, 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
    761   {FPU_NEON_EXT_V1, 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
    762   {FPU_NEON_EXT_V1, 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
    763   {FPU_NEON_EXT_V1, 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
    764   {FPU_NEON_EXT_V1, 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
    765   {FPU_NEON_EXT_V1, 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
    766   {FPU_NEON_EXT_V1, 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
    767   {FPU_NEON_EXT_V1, 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
    768   {FPU_NEON_EXT_V1, 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
    769   {FPU_NEON_EXT_V1, 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
    770   {FPU_NEON_EXT_V1, 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
    771   {FPU_NEON_EXT_V1, 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
    772   {FPU_NEON_EXT_V1, 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
    773   {FPU_NEON_EXT_V1, 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
    774   {FPU_NEON_EXT_V1, 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
    775   {FPU_NEON_EXT_V1, 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
    776   {FPU_NEON_EXT_V1, 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
    777 
    778   {0,0 ,0, 0}
    779 };
    780 
    781 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb.  All three are partially
    782    ordered: they must be searched linearly from the top to obtain a correct
    783    match.  */
    784 
    785 /* print_insn_arm recognizes the following format control codes:
    786 
    787    %%			%
    788 
    789    %a			print address for ldr/str instruction
    790    %s                   print address for ldr/str halfword/signextend instruction
    791    %b			print branch destination
    792    %c			print condition code (always bits 28-31)
    793    %m			print register mask for ldm/stm instruction
    794    %o			print operand2 (immediate or register + shift)
    795    %p			print 'p' iff bits 12-15 are 15
    796    %t			print 't' iff bit 21 set and bit 24 clear
    797    %B			print arm BLX(1) destination
    798    %C			print the PSR sub type.
    799    %U			print barrier type.
    800    %P			print address for pli instruction.
    801 
    802    %<bitfield>r		print as an ARM register
    803    %<bitfield>d		print the bitfield in decimal
    804    %<bitfield>W         print the bitfield plus one in decimal
    805    %<bitfield>x		print the bitfield in hex
    806    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
    807 
    808    %<bitfield>'c	print specified char iff bitfield is all ones
    809    %<bitfield>`c	print specified char iff bitfield is all zeroes
    810    %<bitfield>?ab...    select from array of values in big endian order
    811 
    812    %e                   print arm SMI operand (bits 0..7,8..19).
    813    %E			print the LSB and WIDTH fields of a BFI or BFC instruction.
    814    %V                   print the 16-bit immediate field of a MOVT or MOVW instruction.  */
    815 
    816 static const struct opcode32 arm_opcodes[] =
    817 {
    818   /* ARM instructions.  */
    819   {ARM_EXT_V1, 0xe1a00000, 0xffffffff, "nop\t\t\t(mov r0,r0)"},
    820   {ARM_EXT_V4T | ARM_EXT_V5, 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
    821   {ARM_EXT_V2, 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19r, %0-3r, %8-11r"},
    822   {ARM_EXT_V2, 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    823   {ARM_EXT_V2S, 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15r, %0-3r, [%16-19r]"},
    824   {ARM_EXT_V3M, 0x00800090, 0x0fa000f0, "%22?sumull%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
    825   {ARM_EXT_V3M, 0x00a00090, 0x0fa000f0, "%22?sumlal%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
    826 
    827   /* V7 instructions.  */
    828   {ARM_EXT_V7, 0xf450f000, 0xfd70f000, "pli\t%P"},
    829   {ARM_EXT_V7, 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
    830   {ARM_EXT_V7, 0xf57ff050, 0xfffffff0, "dmb\t%U"},
    831   {ARM_EXT_V7, 0xf57ff040, 0xfffffff0, "dsb\t%U"},
    832   {ARM_EXT_V7, 0xf57ff060, 0xfffffff0, "isb\t%U"},
    833 
    834   /* ARM V6T2 instructions.  */
    835   {ARM_EXT_V6T2, 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15r, %E"},
    836   {ARM_EXT_V6T2, 0x07c00010, 0x0fe00070, "bfi%c\t%12-15r, %0-3r, %E"},
    837   {ARM_EXT_V6T2, 0x00600090, 0x0ff000f0, "mls%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    838   {ARM_EXT_V6T2, 0x006000b0, 0x0f7000f0, "strht%c\t%12-15r, %s"},
    839   {ARM_EXT_V6T2, 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15r, %s"},
    840   {ARM_EXT_V6T2, 0x03000000, 0x0ff00000, "movw%c\t%12-15r, %V"},
    841   {ARM_EXT_V6T2, 0x03400000, 0x0ff00000, "movt%c\t%12-15r, %V"},
    842   {ARM_EXT_V6T2, 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15r, %0-3r"},
    843   {ARM_EXT_V6T2, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
    844 
    845   /* ARM V6Z instructions.  */
    846   {ARM_EXT_V6Z, 0x01600070, 0x0ff000f0, "smc%c\t%e"},
    847 
    848   /* ARM V6K instructions.  */
    849   {ARM_EXT_V6K, 0xf57ff01f, 0xffffffff, "clrex"},
    850   {ARM_EXT_V6K, 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15r, [%16-19r]"},
    851   {ARM_EXT_V6K, 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19r]"},
    852   {ARM_EXT_V6K, 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15r, [%16-19r]"},
    853   {ARM_EXT_V6K, 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15r, %0-3r, [%16-19r]"},
    854   {ARM_EXT_V6K, 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15r, %0-3r, [%16-19r]"},
    855   {ARM_EXT_V6K, 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15r, %0-3r, [%16-19r]"},
    856 
    857   /* ARM V6K NOP hints.  */
    858   {ARM_EXT_V6K, 0x0320f001, 0x0fffffff, "yield%c"},
    859   {ARM_EXT_V6K, 0x0320f002, 0x0fffffff, "wfe%c"},
    860   {ARM_EXT_V6K, 0x0320f003, 0x0fffffff, "wfi%c"},
    861   {ARM_EXT_V6K, 0x0320f004, 0x0fffffff, "sev%c"},
    862   {ARM_EXT_V6K, 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
    863 
    864   /* ARM V6 instructions. */
    865   {ARM_EXT_V6, 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
    866   {ARM_EXT_V6, 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
    867   {ARM_EXT_V6, 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
    868   {ARM_EXT_V6, 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
    869   {ARM_EXT_V6, 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
    870   {ARM_EXT_V6, 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15r, %16-19r, %0-3r"},
    871   {ARM_EXT_V6, 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15r, %16-19r, %0-3r, lsl #%7-11d"},
    872   {ARM_EXT_V6, 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #32"},
    873   {ARM_EXT_V6, 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #%7-11d"},
    874   {ARM_EXT_V6, 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19r]"},
    875   {ARM_EXT_V6, 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15r, %16-19r, %0-3r"},
    876   {ARM_EXT_V6, 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15r, %16-19r, %0-3r"},
    877   {ARM_EXT_V6, 0x06200f30, 0x0ff00ff0, "qaddsubx%c\t%12-15r, %16-19r, %0-3r"},
    878   {ARM_EXT_V6, 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15r, %16-19r, %0-3r"},
    879   {ARM_EXT_V6, 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15r, %16-19r, %0-3r"},
    880   {ARM_EXT_V6, 0x06200f50, 0x0ff00ff0, "qsubaddx%c\t%12-15r, %16-19r, %0-3r"},
    881   {ARM_EXT_V6, 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15r, %16-19r, %0-3r"},
    882   {ARM_EXT_V6, 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15r, %16-19r, %0-3r"},
    883   {ARM_EXT_V6, 0x06100f30, 0x0ff00ff0, "saddaddx%c\t%12-15r, %16-19r, %0-3r"},
    884   {ARM_EXT_V6, 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15r, %16-19r, %0-3r"},
    885   {ARM_EXT_V6, 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15r, %16-19r, %0-3r"},
    886   {ARM_EXT_V6, 0x06300f30, 0x0ff00ff0, "shaddsubx%c\t%12-15r, %16-19r, %0-3r"},
    887   {ARM_EXT_V6, 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15r, %16-19r, %0-3r"},
    888   {ARM_EXT_V6, 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15r, %16-19r, %0-3r"},
    889   {ARM_EXT_V6, 0x06300f50, 0x0ff00ff0, "shsubaddx%c\t%12-15r, %16-19r, %0-3r"},
    890   {ARM_EXT_V6, 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15r, %16-19r, %0-3r"},
    891   {ARM_EXT_V6, 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15r, %16-19r, %0-3r"},
    892   {ARM_EXT_V6, 0x06100f50, 0x0ff00ff0, "ssubaddx%c\t%12-15r, %16-19r, %0-3r"},
    893   {ARM_EXT_V6, 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15r, %16-19r, %0-3r"},
    894   {ARM_EXT_V6, 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15r, %16-19r, %0-3r"},
    895   {ARM_EXT_V6, 0x06500f30, 0x0ff00ff0, "uaddsubx%c\t%12-15r, %16-19r, %0-3r"},
    896   {ARM_EXT_V6, 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15r, %16-19r, %0-3r"},
    897   {ARM_EXT_V6, 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15r, %16-19r, %0-3r"},
    898   {ARM_EXT_V6, 0x06700f30, 0x0ff00ff0, "uhaddsubx%c\t%12-15r, %16-19r, %0-3r"},
    899   {ARM_EXT_V6, 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15r, %16-19r, %0-3r"},
    900   {ARM_EXT_V6, 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15r, %16-19r, %0-3r"},
    901   {ARM_EXT_V6, 0x06700f50, 0x0ff00ff0, "uhsubaddx%c\t%12-15r, %16-19r, %0-3r"},
    902   {ARM_EXT_V6, 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15r, %16-19r, %0-3r"},
    903   {ARM_EXT_V6, 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15r, %16-19r, %0-3r"},
    904   {ARM_EXT_V6, 0x06600f30, 0x0ff00ff0, "uqaddsubx%c\t%12-15r, %16-19r, %0-3r"},
    905   {ARM_EXT_V6, 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15r, %16-19r, %0-3r"},
    906   {ARM_EXT_V6, 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15r, %16-19r, %0-3r"},
    907   {ARM_EXT_V6, 0x06600f50, 0x0ff00ff0, "uqsubaddx%c\t%12-15r, %16-19r, %0-3r"},
    908   {ARM_EXT_V6, 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15r, %16-19r, %0-3r"},
    909   {ARM_EXT_V6, 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15r, %16-19r, %0-3r"},
    910   {ARM_EXT_V6, 0x06500f50, 0x0ff00ff0, "usubaddx%c\t%12-15r, %16-19r, %0-3r"},
    911   {ARM_EXT_V6, 0x06bf0f30, 0x0fff0ff0, "rev%c\t\%12-15r, %0-3r"},
    912   {ARM_EXT_V6, 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t\%12-15r, %0-3r"},
    913   {ARM_EXT_V6, 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t\%12-15r, %0-3r"},
    914   {ARM_EXT_V6, 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t\%16-19r%21'!"},
    915   {ARM_EXT_V6, 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r"},
    916   {ARM_EXT_V6, 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #8"},
    917   {ARM_EXT_V6, 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #16"},
    918   {ARM_EXT_V6, 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #24"},
    919   {ARM_EXT_V6, 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r"},
    920   {ARM_EXT_V6, 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #8"},
    921   {ARM_EXT_V6, 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #16"},
    922   {ARM_EXT_V6, 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #24"},
    923   {ARM_EXT_V6, 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r"},
    924   {ARM_EXT_V6, 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #8"},
    925   {ARM_EXT_V6, 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #16"},
    926   {ARM_EXT_V6, 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #24"},
    927   {ARM_EXT_V6, 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r"},
    928   {ARM_EXT_V6, 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #8"},
    929   {ARM_EXT_V6, 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #16"},
    930   {ARM_EXT_V6, 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #24"},
    931   {ARM_EXT_V6, 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r"},
    932   {ARM_EXT_V6, 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #8"},
    933   {ARM_EXT_V6, 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #16"},
    934   {ARM_EXT_V6, 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #24"},
    935   {ARM_EXT_V6, 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r"},
    936   {ARM_EXT_V6, 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #8"},
    937   {ARM_EXT_V6, 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #16"},
    938   {ARM_EXT_V6, 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #24"},
    939   {ARM_EXT_V6, 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r"},
    940   {ARM_EXT_V6, 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    941   {ARM_EXT_V6, 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    942   {ARM_EXT_V6, 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
    943   {ARM_EXT_V6, 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r"},
    944   {ARM_EXT_V6, 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    945   {ARM_EXT_V6, 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    946   {ARM_EXT_V6, 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #24"},
    947   {ARM_EXT_V6, 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r"},
    948   {ARM_EXT_V6, 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    949   {ARM_EXT_V6, 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    950   {ARM_EXT_V6, 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
    951   {ARM_EXT_V6, 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r"},
    952   {ARM_EXT_V6, 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    953   {ARM_EXT_V6, 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    954   {ARM_EXT_V6, 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
    955   {ARM_EXT_V6, 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r"},
    956   {ARM_EXT_V6, 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    957   {ARM_EXT_V6, 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    958   {ARM_EXT_V6, 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
    959   {ARM_EXT_V6, 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r"},
    960   {ARM_EXT_V6, 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
    961   {ARM_EXT_V6, 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
    962   {ARM_EXT_V6, 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
    963   {ARM_EXT_V6, 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15r, %16-19r, %0-3r"},
    964   {ARM_EXT_V6, 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
    965   {ARM_EXT_V6, 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19r, %0-3r, %8-11r"},
    966   {ARM_EXT_V6, 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19r, %0-3r, %8-11r"},
    967   {ARM_EXT_V6, 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    968   {ARM_EXT_V6, 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
    969   {ARM_EXT_V6, 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    970   {ARM_EXT_V6, 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
    971   {ARM_EXT_V6, 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19r, %0-3r, %8-11r"},
    972   {ARM_EXT_V6, 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    973   {ARM_EXT_V6, 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    974   {ARM_EXT_V6, 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
    975   {ARM_EXT_V6, 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15r, #%16-20W, %0-3r"},
    976   {ARM_EXT_V6, 0x06a00010, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, lsl #%7-11d"},
    977   {ARM_EXT_V6, 0x06a00050, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, asr #%7-11d"},
    978   {ARM_EXT_V6, 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
    979   {ARM_EXT_V6, 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15r, %0-3r, [%16-19r]"},
    980   {ARM_EXT_V6, 0x00400090, 0x0ff000f0, "umaal%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
    981   {ARM_EXT_V6, 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19r, %0-3r, %8-11r"},
    982   {ARM_EXT_V6, 0x07800010, 0x0ff000f0, "usada8%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
    983   {ARM_EXT_V6, 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15r, #%16-20d, %0-3r"},
    984   {ARM_EXT_V6, 0x06e00010, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, lsl #%7-11d"},
    985   {ARM_EXT_V6, 0x06e00050, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, asr #%7-11d"},
    986   {ARM_EXT_V6, 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15r, #%16-19d, %0-3r"},
    987 
    988   /* V5J instruction.  */
    989   {ARM_EXT_V5J, 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3r"},
    990 
    991   /* V5 Instructions.  */
    992   {ARM_EXT_V5, 0xe1200070, 0xfff000f0, "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
    993   {ARM_EXT_V5, 0xfa000000, 0xfe000000, "blx\t%B"},
    994   {ARM_EXT_V5, 0x012fff30, 0x0ffffff0, "blx%c\t%0-3r"},
    995   {ARM_EXT_V5, 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15r, %0-3r"},
    996 
    997   /* V5E "El Segundo" Instructions.  */
    998   {ARM_EXT_V5E, 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
    999   {ARM_EXT_V5E, 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
   1000   {ARM_EXT_V5E, 0xf450f000, 0xfc70f000, "pld\t%a"},
   1001   {ARM_EXT_V5ExP, 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1002   {ARM_EXT_V5ExP, 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1003   {ARM_EXT_V5ExP, 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1004   {ARM_EXT_V5ExP, 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1005 
   1006   {ARM_EXT_V5ExP, 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1007   {ARM_EXT_V5ExP, 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
   1008 
   1009   {ARM_EXT_V5ExP, 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
   1010   {ARM_EXT_V5ExP, 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
   1011   {ARM_EXT_V5ExP, 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
   1012   {ARM_EXT_V5ExP, 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
   1013 
   1014   {ARM_EXT_V5ExP, 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19r, %0-3r, %8-11r"},
   1015   {ARM_EXT_V5ExP, 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19r, %0-3r, %8-11r"},
   1016   {ARM_EXT_V5ExP, 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19r, %0-3r, %8-11r"},
   1017   {ARM_EXT_V5ExP, 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19r, %0-3r, %8-11r"},
   1018 
   1019   {ARM_EXT_V5ExP, 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19r, %0-3r, %8-11r"},
   1020   {ARM_EXT_V5ExP, 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19r, %0-3r, %8-11r"},
   1021 
   1022   {ARM_EXT_V5ExP, 0x01000050, 0x0ff00ff0,  "qadd%c\t%12-15r, %0-3r, %16-19r"},
   1023   {ARM_EXT_V5ExP, 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15r, %0-3r, %16-19r"},
   1024   {ARM_EXT_V5ExP, 0x01200050, 0x0ff00ff0,  "qsub%c\t%12-15r, %0-3r, %16-19r"},
   1025   {ARM_EXT_V5ExP, 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
   1026 
   1027   /* ARM Instructions.  */
   1028   {ARM_EXT_V1, 0x00000090, 0x0e100090, "str%6's%5?hb%c\t%12-15r, %s"},
   1029   {ARM_EXT_V1, 0x00100090, 0x0e100090, "ldr%6's%5?hb%c\t%12-15r, %s"},
   1030   {ARM_EXT_V1, 0x00000000, 0x0de00000, "and%20's%c\t%12-15r, %16-19r, %o"},
   1031   {ARM_EXT_V1, 0x00200000, 0x0de00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
   1032   {ARM_EXT_V1, 0x00400000, 0x0de00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
   1033   {ARM_EXT_V1, 0x00600000, 0x0de00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
   1034   {ARM_EXT_V1, 0x00800000, 0x0de00000, "add%20's%c\t%12-15r, %16-19r, %o"},
   1035   {ARM_EXT_V1, 0x00a00000, 0x0de00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
   1036   {ARM_EXT_V1, 0x00c00000, 0x0de00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
   1037   {ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
   1038   {ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
   1039   {ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
   1040   {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%p%c\t%16-19r, %o"},
   1041   {ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%p%c\t%16-19r, %o"},
   1042   {ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%p%c\t%16-19r, %o"},
   1043   {ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%p%c\t%16-19r, %o"},
   1044   {ARM_EXT_V1, 0x01800000, 0x0de00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
   1045   {ARM_EXT_V1, 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
   1046   {ARM_EXT_V1, 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
   1047   {ARM_EXT_V1, 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15r, %q"},
   1048   {ARM_EXT_V1, 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15r, %q"},
   1049   {ARM_EXT_V1, 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15r, %q"},
   1050   {ARM_EXT_V1, 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
   1051   {ARM_EXT_V1, 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15r, %q"},
   1052   {ARM_EXT_V1, 0x01c00000, 0x0de00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
   1053   {ARM_EXT_V1, 0x01e00000, 0x0de00000, "mvn%20's%c\t%12-15r, %o"},
   1054   {ARM_EXT_V1, 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
   1055   {ARM_EXT_V1, 0x04000000, 0x0e100000, "str%22'b%t%c\t%12-15r, %a"},
   1056   {ARM_EXT_V1, 0x06000000, 0x0e100ff0, "str%22'b%t%c\t%12-15r, %a"},
   1057   {ARM_EXT_V1, 0x04000000, 0x0c100010, "str%22'b%t%c\t%12-15r, %a"},
   1058   {ARM_EXT_V1, 0x06000010, 0x0e000010, "undefined"},
   1059   {ARM_EXT_V1, 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
   1060   {ARM_EXT_V1, 0x04100000, 0x0c100000, "ldr%22'b%t%c\t%12-15r, %a"},
   1061   {ARM_EXT_V1, 0x092d0000, 0x0fff0000, "push%c\t%m"},
   1062   {ARM_EXT_V1, 0x08800000, 0x0ff00000, "stm%c\t%16-19r%21'!, %m%22'^"},
   1063   {ARM_EXT_V1, 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
   1064   {ARM_EXT_V1, 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
   1065   {ARM_EXT_V1, 0x08900000, 0x0f900000, "ldm%c\t%16-19r%21'!, %m%22'^"},
   1066   {ARM_EXT_V1, 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
   1067   {ARM_EXT_V1, 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
   1068   {ARM_EXT_V1, 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
   1069 
   1070   /* The rest.  */
   1071   {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined instruction %0-31x"},
   1072   {0, 0x00000000, 0x00000000, 0}
   1073 };
   1074 
   1075 /* print_insn_thumb16 recognizes the following format control codes:
   1076 
   1077    %S                   print Thumb register (bits 3..5 as high number if bit 6 set)
   1078    %D                   print Thumb register (bits 0..2 as high number if bit 7 set)
   1079    %<bitfield>I         print bitfield as a signed decimal
   1080    				(top bit of range being the sign bit)
   1081    %N                   print Thumb register mask (with LR)
   1082    %O                   print Thumb register mask (with PC)
   1083    %M                   print Thumb register mask
   1084    %b			print CZB's 6-bit unsigned branch destination
   1085    %s			print Thumb right-shift immediate (6..10; 0 == 32).
   1086    %c			print the condition code
   1087    %C			print the condition code, or "s" if not conditional
   1088    %x			print warning if conditional an not at end of IT block"
   1089    %X			print "\t; unpredictable <IT:code>" if conditional
   1090    %I			print IT instruction suffix and operands
   1091    %<bitfield>r		print bitfield as an ARM register
   1092    %<bitfield>d		print bitfield as a decimal
   1093    %<bitfield>H         print (bitfield * 2) as a decimal
   1094    %<bitfield>W         print (bitfield * 4) as a decimal
   1095    %<bitfield>a         print (bitfield * 4) as a pc-rel offset + decoded symbol
   1096    %<bitfield>B         print Thumb branch destination (signed displacement)
   1097    %<bitfield>c         print bitfield as a condition code
   1098    %<bitnum>'c		print specified char iff bit is one
   1099    %<bitnum>?ab		print a if bit is one else print b.  */
   1100 
   1101 static const struct opcode16 thumb_opcodes[] =
   1102 {
   1103   /* Thumb instructions.  */
   1104 
   1105   /* ARM V6K no-argument instructions.  */
   1106   {ARM_EXT_V6K, 0xbf00, 0xffff, "nop%c"},
   1107   {ARM_EXT_V6K, 0xbf10, 0xffff, "yield%c"},
   1108   {ARM_EXT_V6K, 0xbf20, 0xffff, "wfe%c"},
   1109   {ARM_EXT_V6K, 0xbf30, 0xffff, "wfi%c"},
   1110   {ARM_EXT_V6K, 0xbf40, 0xffff, "sev%c"},
   1111   {ARM_EXT_V6K, 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
   1112 
   1113   /* ARM V6T2 instructions.  */
   1114   {ARM_EXT_V6T2, 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
   1115   {ARM_EXT_V6T2, 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
   1116   {ARM_EXT_V6T2, 0xbf00, 0xff00, "it%I%X"},
   1117 
   1118   /* ARM V6.  */
   1119   {ARM_EXT_V6, 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
   1120   {ARM_EXT_V6, 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
   1121   {ARM_EXT_V6, 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
   1122   {ARM_EXT_V6, 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
   1123   {ARM_EXT_V6, 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
   1124   {ARM_EXT_V6, 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
   1125   {ARM_EXT_V6, 0xb650, 0xfff7, "setend\t%3?ble%X"},
   1126   {ARM_EXT_V6, 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
   1127   {ARM_EXT_V6, 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
   1128   {ARM_EXT_V6, 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
   1129   {ARM_EXT_V6, 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
   1130 
   1131   /* ARM V5 ISA extends Thumb.  */
   1132   {ARM_EXT_V5T, 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional.  */
   1133   /* This is BLX(2).  BLX(1) is a 32-bit instruction.  */
   1134   {ARM_EXT_V5T, 0x4780, 0xff87, "blx%c\t%3-6r%x"},	/* note: 4 bit register number.  */
   1135   /* ARM V4T ISA (Thumb v1).  */
   1136   {ARM_EXT_V4T, 0x46C0, 0xFFFF, "nop%c\t\t\t(mov r8, r8)"},
   1137   /* Format 4.  */
   1138   {ARM_EXT_V4T, 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
   1139   {ARM_EXT_V4T, 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
   1140   {ARM_EXT_V4T, 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
   1141   {ARM_EXT_V4T, 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
   1142   {ARM_EXT_V4T, 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
   1143   {ARM_EXT_V4T, 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
   1144   {ARM_EXT_V4T, 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
   1145   {ARM_EXT_V4T, 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
   1146   {ARM_EXT_V4T, 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
   1147   {ARM_EXT_V4T, 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
   1148   {ARM_EXT_V4T, 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
   1149   {ARM_EXT_V4T, 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
   1150   {ARM_EXT_V4T, 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
   1151   {ARM_EXT_V4T, 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
   1152   {ARM_EXT_V4T, 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
   1153   {ARM_EXT_V4T, 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
   1154   /* format 13 */
   1155   {ARM_EXT_V4T, 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
   1156   {ARM_EXT_V4T, 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
   1157   /* format 5 */
   1158   {ARM_EXT_V4T, 0x4700, 0xFF80, "bx%c\t%S%x"},
   1159   {ARM_EXT_V4T, 0x4400, 0xFF00, "add%c\t%D, %S"},
   1160   {ARM_EXT_V4T, 0x4500, 0xFF00, "cmp%c\t%D, %S"},
   1161   {ARM_EXT_V4T, 0x4600, 0xFF00, "mov%c\t%D, %S"},
   1162   /* format 14 */
   1163   {ARM_EXT_V4T, 0xB400, 0xFE00, "push%c\t%N"},
   1164   {ARM_EXT_V4T, 0xBC00, 0xFE00, "pop%c\t%O"},
   1165   /* format 2 */
   1166   {ARM_EXT_V4T, 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
   1167   {ARM_EXT_V4T, 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
   1168   {ARM_EXT_V4T, 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
   1169   {ARM_EXT_V4T, 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
   1170   /* format 8 */
   1171   {ARM_EXT_V4T, 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
   1172   {ARM_EXT_V4T, 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
   1173   {ARM_EXT_V4T, 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
   1174   /* format 7 */
   1175   {ARM_EXT_V4T, 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   1176   {ARM_EXT_V4T, 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   1177   /* format 1 */
   1178   {ARM_EXT_V4T, 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
   1179   {ARM_EXT_V4T, 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
   1180   {ARM_EXT_V4T, 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
   1181   /* format 3 */
   1182   {ARM_EXT_V4T, 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
   1183   {ARM_EXT_V4T, 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
   1184   {ARM_EXT_V4T, 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
   1185   {ARM_EXT_V4T, 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
   1186   /* format 6 */
   1187   {ARM_EXT_V4T, 0x4800, 0xF800, "ldr%c\t%8-10r, [pc, #%0-7W]\t(%0-7a)"},  /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
   1188   /* format 9 */
   1189   {ARM_EXT_V4T, 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
   1190   {ARM_EXT_V4T, 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
   1191   {ARM_EXT_V4T, 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
   1192   {ARM_EXT_V4T, 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
   1193   /* format 10 */
   1194   {ARM_EXT_V4T, 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
   1195   {ARM_EXT_V4T, 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
   1196   /* format 11 */
   1197   {ARM_EXT_V4T, 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
   1198   {ARM_EXT_V4T, 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
   1199   /* format 12 */
   1200   {ARM_EXT_V4T, 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t(adr %8-10r, %0-7a)"},
   1201   {ARM_EXT_V4T, 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
   1202   /* format 15 */
   1203   {ARM_EXT_V4T, 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
   1204   {ARM_EXT_V4T, 0xC800, 0xF800, "ldmia%c\t%8-10r!, %M"},
   1205   /* format 17 */
   1206   {ARM_EXT_V4T, 0xDF00, 0xFF00, "svc%c\t%0-7d"},
   1207   /* format 16 */
   1208   {ARM_EXT_V4T, 0xDE00, 0xFE00, "undefined"},
   1209   {ARM_EXT_V4T, 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
   1210   /* format 18 */
   1211   {ARM_EXT_V4T, 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
   1212 
   1213   /* The E800 .. FFFF range is unconditionally redirected to the
   1214      32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
   1215      are processed via that table.  Thus, we can never encounter a
   1216      bare "second half of BL/BLX(1)" instruction here.  */
   1217   {ARM_EXT_V1,  0x0000, 0x0000, "undefined"},
   1218   {0, 0, 0, 0}
   1219 };
   1220 
   1221 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
   1222    We adopt the convention that hw1 is the high 16 bits of .value and
   1223    .mask, hw2 the low 16 bits.
   1224 
   1225    print_insn_thumb32 recognizes the following format control codes:
   1226 
   1227        %%		%
   1228 
   1229        %I		print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
   1230        %M		print a modified 12-bit immediate (same location)
   1231        %J		print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
   1232        %K		print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
   1233        %S		print a possibly-shifted Rm
   1234 
   1235        %a		print the address of a plain load/store
   1236        %w		print the width and signedness of a core load/store
   1237        %m		print register mask for ldm/stm
   1238 
   1239        %E		print the lsb and width fields of a bfc/bfi instruction
   1240        %F		print the lsb and width fields of a sbfx/ubfx instruction
   1241        %b		print a conditional branch offset
   1242        %B		print an unconditional branch offset
   1243        %s		print the shift field of an SSAT instruction
   1244        %R		print the rotation field of an SXT instruction
   1245        %U		print barrier type.
   1246        %P		print address for pli instruction.
   1247        %c		print the condition code
   1248        %x		print warning if conditional an not at end of IT block"
   1249        %X		print "\t; unpredictable <IT:code>" if conditional
   1250 
   1251        %<bitfield>d	print bitfield in decimal
   1252        %<bitfield>W	print bitfield*4 in decimal
   1253        %<bitfield>r	print bitfield as an ARM register
   1254        %<bitfield>c	print bitfield as a condition code
   1255 
   1256        %<bitfield>'c	print specified char iff bitfield is all ones
   1257        %<bitfield>`c	print specified char iff bitfield is all zeroes
   1258        %<bitfield>?ab... select from array of values in big endian order
   1259 
   1260    With one exception at the bottom (done because BL and BLX(1) need
   1261    to come dead last), this table was machine-sorted first in
   1262    decreasing order of number of bits set in the mask, then in
   1263    increasing numeric order of mask, then in increasing numeric order
   1264    of opcode.  This order is not the clearest for a human reader, but
   1265    is guaranteed never to catch a special-case bit pattern with a more
   1266    general mask, which is important, because this instruction encoding
   1267    makes heavy use of special-case bit patterns.  */
   1268 static const struct opcode32 thumb32_opcodes[] =
   1269 {
   1270   /* V7 instructions.  */
   1271   {ARM_EXT_V7, 0xf910f000, 0xff70f000, "pli%c\t%a"},
   1272   {ARM_EXT_V7, 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
   1273   {ARM_EXT_V7, 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
   1274   {ARM_EXT_V7, 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
   1275   {ARM_EXT_V7, 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
   1276   {ARM_EXT_DIV, 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
   1277   {ARM_EXT_DIV, 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
   1278 
   1279   /* Instructions defined in the basic V6T2 set.  */
   1280   {ARM_EXT_V6T2, 0xf3af8000, 0xffffffff, "nop%c.w"},
   1281   {ARM_EXT_V6T2, 0xf3af8001, 0xffffffff, "yield%c.w"},
   1282   {ARM_EXT_V6T2, 0xf3af8002, 0xffffffff, "wfe%c.w"},
   1283   {ARM_EXT_V6T2, 0xf3af8003, 0xffffffff, "wfi%c.w"},
   1284   {ARM_EXT_V6T2, 0xf3af9004, 0xffffffff, "sev%c.w"},
   1285   {ARM_EXT_V6T2, 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
   1286 
   1287   {ARM_EXT_V6T2, 0xf3bf8f2f, 0xffffffff, "clrex%c"},
   1288   {ARM_EXT_V6T2, 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
   1289   {ARM_EXT_V6T2, 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
   1290   {ARM_EXT_V6T2, 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
   1291   {ARM_EXT_V6T2, 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
   1292   {ARM_EXT_V6T2, 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
   1293   {ARM_EXT_V6T2, 0xf3ef8000, 0xffeff000, "mrs%c\t%8-11r, %D"},
   1294   {ARM_EXT_V6T2, 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
   1295   {ARM_EXT_V6T2, 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
   1296   {ARM_EXT_V6T2, 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
   1297   {ARM_EXT_V6T2, 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
   1298   {ARM_EXT_V6T2, 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
   1299   {ARM_EXT_V6T2, 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
   1300   {ARM_EXT_V6T2, 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
   1301   {ARM_EXT_V6T2, 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
   1302   {ARM_EXT_V6T2, 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
   1303   {ARM_EXT_V6T2, 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
   1304   {ARM_EXT_V6T2, 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
   1305   {ARM_EXT_V6T2, 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
   1306   {ARM_EXT_V6T2, 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
   1307   {ARM_EXT_V6T2, 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
   1308   {ARM_EXT_V6T2, 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
   1309   {ARM_EXT_V6T2, 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
   1310   {ARM_EXT_V6T2, 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
   1311   {ARM_EXT_V6T2, 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
   1312   {ARM_EXT_V6T2, 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
   1313   {ARM_EXT_V6T2, 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
   1314   {ARM_EXT_V6T2, 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
   1315   {ARM_EXT_V6T2, 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
   1316   {ARM_EXT_V6T2, 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
   1317   {ARM_EXT_V6T2, 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
   1318   {ARM_EXT_V6T2, 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
   1319   {ARM_EXT_V6T2, 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
   1320   {ARM_EXT_V6T2, 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
   1321   {ARM_EXT_V6T2, 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
   1322   {ARM_EXT_V6T2, 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
   1323   {ARM_EXT_V6T2, 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
   1324   {ARM_EXT_V6T2, 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
   1325   {ARM_EXT_V6T2, 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
   1326   {ARM_EXT_V6T2, 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
   1327   {ARM_EXT_V6T2, 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
   1328   {ARM_EXT_V6T2, 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
   1329   {ARM_EXT_V6T2, 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
   1330   {ARM_EXT_V6T2, 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
   1331   {ARM_EXT_V6T2, 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
   1332   {ARM_EXT_V6T2, 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
   1333   {ARM_EXT_V6T2, 0xfaa0f000, 0xfff0f0f0, "saddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1334   {ARM_EXT_V6T2, 0xfaa0f010, 0xfff0f0f0, "qaddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1335   {ARM_EXT_V6T2, 0xfaa0f020, 0xfff0f0f0, "shaddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1336   {ARM_EXT_V6T2, 0xfaa0f040, 0xfff0f0f0, "uaddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1337   {ARM_EXT_V6T2, 0xfaa0f050, 0xfff0f0f0, "uqaddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1338   {ARM_EXT_V6T2, 0xfaa0f060, 0xfff0f0f0, "uhaddsubx%c\t%8-11r, %16-19r, %0-3r"},
   1339   {ARM_EXT_V6T2, 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
   1340   {ARM_EXT_V6T2, 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
   1341   {ARM_EXT_V6T2, 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
   1342   {ARM_EXT_V6T2, 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
   1343   {ARM_EXT_V6T2, 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
   1344   {ARM_EXT_V6T2, 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
   1345   {ARM_EXT_V6T2, 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
   1346   {ARM_EXT_V6T2, 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
   1347   {ARM_EXT_V6T2, 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
   1348   {ARM_EXT_V6T2, 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
   1349   {ARM_EXT_V6T2, 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
   1350   {ARM_EXT_V6T2, 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
   1351   {ARM_EXT_V6T2, 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
   1352   {ARM_EXT_V6T2, 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
   1353   {ARM_EXT_V6T2, 0xfae0f000, 0xfff0f0f0, "ssubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1354   {ARM_EXT_V6T2, 0xfae0f010, 0xfff0f0f0, "qsubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1355   {ARM_EXT_V6T2, 0xfae0f020, 0xfff0f0f0, "shsubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1356   {ARM_EXT_V6T2, 0xfae0f040, 0xfff0f0f0, "usubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1357   {ARM_EXT_V6T2, 0xfae0f050, 0xfff0f0f0, "uqsubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1358   {ARM_EXT_V6T2, 0xfae0f060, 0xfff0f0f0, "uhsubaddx%c\t%8-11r, %16-19r, %0-3r"},
   1359   {ARM_EXT_V6T2, 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
   1360   {ARM_EXT_V6T2, 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
   1361   {ARM_EXT_V6T2, 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   1362   {ARM_EXT_V6T2, 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   1363   {ARM_EXT_V6T2, 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   1364   {ARM_EXT_V6T2, 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   1365   {ARM_EXT_V6T2, 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
   1366   {ARM_EXT_V6T2, 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4d, %16-19r"},
   1367   {ARM_EXT_V6T2, 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
   1368   {ARM_EXT_V6T2, 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
   1369   {ARM_EXT_V6T2, 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   1370   {ARM_EXT_V6T2, 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
   1371   {ARM_EXT_V6T2, 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
   1372   {ARM_EXT_V6T2, 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   1373   {ARM_EXT_V6T2, 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   1374   {ARM_EXT_V6T2, 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   1375   {ARM_EXT_V6T2, 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   1376   {ARM_EXT_V6T2, 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   1377   {ARM_EXT_V6T2, 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   1378   {ARM_EXT_V6T2, 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   1379   {ARM_EXT_V6T2, 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
   1380   {ARM_EXT_V6T2, 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
   1381   {ARM_EXT_V6T2, 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
   1382   {ARM_EXT_V6T2, 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
   1383   {ARM_EXT_V6T2, 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
   1384   {ARM_EXT_V6T2, 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
   1385   {ARM_EXT_V6T2, 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
   1386   {ARM_EXT_V6T2, 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
   1387   {ARM_EXT_V6T2, 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
   1388   {ARM_EXT_V6T2, 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
   1389   {ARM_EXT_V6T2, 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
   1390   {ARM_EXT_V6T2, 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
   1391   {ARM_EXT_V6T2, 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1392   {ARM_EXT_V6T2, 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1393   {ARM_EXT_V6T2, 0xfb700000, 0xfff000f0, "usada8%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1394   {ARM_EXT_V6T2, 0xfb800000, 0xfff000f0, "smull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1395   {ARM_EXT_V6T2, 0xfba00000, 0xfff000f0, "umull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1396   {ARM_EXT_V6T2, 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1397   {ARM_EXT_V6T2, 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1398   {ARM_EXT_V6T2, 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1399   {ARM_EXT_V6T2, 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
   1400   {ARM_EXT_V6T2, 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
   1401   {ARM_EXT_V6T2, 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
   1402   {ARM_EXT_V6T2, 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
   1403   {ARM_EXT_V6T2, 0xf810f000, 0xff70f000, "pld%c\t%a"},
   1404   {ARM_EXT_V6T2, 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1405   {ARM_EXT_V6T2, 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1406   {ARM_EXT_V6T2, 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1407   {ARM_EXT_V6T2, 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1408   {ARM_EXT_V6T2, 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1409   {ARM_EXT_V6T2, 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1410   {ARM_EXT_V6T2, 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1411   {ARM_EXT_V6T2, 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
   1412   {ARM_EXT_V6T2, 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
   1413   {ARM_EXT_V6T2, 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
   1414   {ARM_EXT_V6T2, 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
   1415   {ARM_EXT_V6T2, 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
   1416   {ARM_EXT_V6T2, 0xfb100000, 0xfff000c0, "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   1417   {ARM_EXT_V6T2, 0xfbc00080, 0xfff000c0, "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   1418   {ARM_EXT_V6T2, 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
   1419   {ARM_EXT_V6T2, 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
   1420   {ARM_EXT_V6T2, 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4d, %16-19r%s"},
   1421   {ARM_EXT_V6T2, 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
   1422   {ARM_EXT_V6T2, 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
   1423   {ARM_EXT_V6T2, 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
   1424   {ARM_EXT_V6T2, 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
   1425   {ARM_EXT_V6T2, 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
   1426   {ARM_EXT_V6T2, 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
   1427   {ARM_EXT_V6T2, 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
   1428   {ARM_EXT_V6T2, 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
   1429   {ARM_EXT_V6T2, 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
   1430   {ARM_EXT_V6T2, 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
   1431   {ARM_EXT_V6T2, 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
   1432   {ARM_EXT_V6T2, 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
   1433   {ARM_EXT_V6T2, 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
   1434   {ARM_EXT_V6T2, 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
   1435   {ARM_EXT_V6T2, 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
   1436   {ARM_EXT_V6T2, 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
   1437   {ARM_EXT_V6T2, 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
   1438   {ARM_EXT_V6T2, 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
   1439   {ARM_EXT_V6T2, 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
   1440   {ARM_EXT_V6T2, 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
   1441   {ARM_EXT_V6T2, 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
   1442   {ARM_EXT_V6T2, 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
   1443   {ARM_EXT_V6T2, 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
   1444   {ARM_EXT_V6T2, 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
   1445   {ARM_EXT_V6T2, 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
   1446   {ARM_EXT_V6T2, 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
   1447   {ARM_EXT_V6T2, 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
   1448   {ARM_EXT_V6T2, 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
   1449   {ARM_EXT_V6T2, 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
   1450   {ARM_EXT_V6T2, 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
   1451   {ARM_EXT_V6T2, 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
   1452   {ARM_EXT_V6T2, 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
   1453   {ARM_EXT_V6T2, 0xe9400000, 0xff500000, "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
   1454   {ARM_EXT_V6T2, 0xe9500000, 0xff500000, "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
   1455   {ARM_EXT_V6T2, 0xe8600000, 0xff700000, "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
   1456   {ARM_EXT_V6T2, 0xe8700000, 0xff700000, "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
   1457   {ARM_EXT_V6T2, 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
   1458   {ARM_EXT_V6T2, 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
   1459 
   1460   /* Filter out Bcc with cond=E or F, which are used for other instructions.  */
   1461   {ARM_EXT_V6T2, 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
   1462   {ARM_EXT_V6T2, 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
   1463   {ARM_EXT_V6T2, 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
   1464   {ARM_EXT_V6T2, 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
   1465 
   1466   /* These have been 32-bit since the invention of Thumb.  */
   1467   {ARM_EXT_V4T,  0xf000c000, 0xf800d000, "blx%c\t%B%x"},
   1468   {ARM_EXT_V4T,  0xf000d000, 0xf800d000, "bl%c\t%B%x"},
   1469 
   1470   /* Fallback.  */
   1471   {ARM_EXT_V1,   0x00000000, 0x00000000, "undefined"},
   1472   {0, 0, 0, 0}
   1473 };
   1474 
   1475 static const char *const arm_conditional[] =
   1476 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
   1477  "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
   1478 
   1479 static const char *const arm_fp_const[] =
   1480 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
   1481 
   1482 static const char *const arm_shift[] =
   1483 {"lsl", "lsr", "asr", "ror"};
   1484 
   1485 typedef struct
   1486 {
   1487   const char *name;
   1488   const char *description;
   1489   const char *reg_names[16];
   1490 }
   1491 arm_regname;
   1492 
   1493 static const arm_regname regnames[] =
   1494 {
   1495   { "raw" , "Select raw register names",
   1496     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
   1497   { "gcc",  "Select register names used by GCC",
   1498     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   1499   { "std",  "Select register names used in ARM's ISA documentation",
   1500     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp",  "lr",  "pc" }},
   1501   { "apcs", "Select register names used in the APCS",
   1502     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   1503   { "atpcs", "Select register names used in the ATPCS",
   1504     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},
   1505   { "special-atpcs", "Select special register names used in the ATPCS",
   1506     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }},
   1507 };
   1508 
   1509 static const char *const iwmmxt_wwnames[] =
   1510 {"b", "h", "w", "d"};
   1511 
   1512 static const char *const iwmmxt_wwssnames[] =
   1513 {"b", "bus", "bc", "bss",
   1514  "h", "hus", "hc", "hss",
   1515  "w", "wus", "wc", "wss",
   1516  "d", "dus", "dc", "dss"
   1517 };
   1518 
   1519 static const char *const iwmmxt_regnames[] =
   1520 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
   1521   "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
   1522 };
   1523 
   1524 static const char *const iwmmxt_cregnames[] =
   1525 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
   1526   "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
   1527 };
   1528 
   1529 /* Default to GCC register name set.  */
   1530 static unsigned int regname_selected = 1;
   1531 
   1532 #define NUM_ARM_REGNAMES  NUM_ELEM (regnames)
   1533 #define arm_regnames      regnames[regname_selected].reg_names
   1534 
   1535 static bfd_boolean force_thumb = FALSE;
   1536 
   1537 /* Current IT instruction state.  This contains the same state as the IT
   1538    bits in the CPSR.  */
   1539 static unsigned int ifthen_state;
   1540 /* IT state for the next instruction.  */
   1541 static unsigned int ifthen_next_state;
   1542 /* The address of the insn for which the IT state is valid.  */
   1543 static bfd_vma ifthen_address;
   1544 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
   1545 
   1546 /* Cached mapping symbol state.  */
   1547 enum map_type {
   1548   MAP_ARM,
   1549   MAP_THUMB,
   1550   MAP_DATA
   1551 };
   1552 
   1553 enum map_type last_type;
   1554 int last_mapping_sym = -1;
   1555 bfd_vma last_mapping_addr = 0;
   1556 
   1557 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
   1558    Returns pointer to following character of the format string and
   1559    fills in *VALUEP and *WIDTHP with the extracted value and number of
   1560    bits extracted.  WIDTHP can be NULL. */
   1561 
   1562 static const char *
   1563 arm_decode_bitfield (const char *ptr, unsigned long insn,
   1564 		     unsigned long *valuep, int *widthp)
   1565 {
   1566   unsigned long value = 0;
   1567   int width = 0;
   1568 
   1569   do
   1570     {
   1571       int start, end;
   1572       int bits;
   1573 
   1574       for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
   1575 	start = start * 10 + *ptr - '0';
   1576       if (*ptr == '-')
   1577 	for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
   1578 	  end = end * 10 + *ptr - '0';
   1579       else
   1580 	end = start;
   1581       bits = end - start;
   1582       if (bits < 0)
   1583 	abort ();
   1584       value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
   1585       width += bits + 1;
   1586     }
   1587   while (*ptr++ == ',');
   1588   *valuep = value;
   1589   if (widthp)
   1590     *widthp = width;
   1591   return ptr - 1;
   1592 }
   1593 
   1594 static void
   1595 arm_decode_shift (long given, fprintf_ftype func, void *stream,
   1596 		  int print_shift)
   1597 {
   1598   func (stream, "%s", arm_regnames[given & 0xf]);
   1599 
   1600   if ((given & 0xff0) != 0)
   1601     {
   1602       if ((given & 0x10) == 0)
   1603 	{
   1604 	  int amount = (given & 0xf80) >> 7;
   1605 	  int shift = (given & 0x60) >> 5;
   1606 
   1607 	  if (amount == 0)
   1608 	    {
   1609 	      if (shift == 3)
   1610 		{
   1611 		  func (stream, ", rrx");
   1612 		  return;
   1613 		}
   1614 
   1615 	      amount = 32;
   1616 	    }
   1617 
   1618 	  if (print_shift)
   1619 	    func (stream, ", %s #%d", arm_shift[shift], amount);
   1620 	  else
   1621 	    func (stream, ", #%d", amount);
   1622 	}
   1623       else if (print_shift)
   1624 	func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
   1625 	      arm_regnames[(given & 0xf00) >> 8]);
   1626       else
   1627 	func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
   1628     }
   1629 }
   1630 
   1631 /* Print one coprocessor instruction on INFO->STREAM.
   1632    Return TRUE if the instuction matched, FALSE if this is not a
   1633    recognised coprocessor instruction.  */
   1634 
   1635 static bfd_boolean
   1636 print_insn_coprocessor (bfd_vma pc, struct disassemble_info *info, long given,
   1637 			bfd_boolean thumb)
   1638 {
   1639   const struct opcode32 *insn;
   1640   void *stream = info->stream;
   1641   fprintf_ftype func = info->fprintf_func;
   1642   unsigned long mask;
   1643   unsigned long value;
   1644   int cond;
   1645 
   1646   for (insn = coprocessor_opcodes; insn->assembler; insn++)
   1647     {
   1648       if (insn->value == FIRST_IWMMXT_INSN
   1649 	  && info->mach != bfd_mach_arm_XScale
   1650 	  && info->mach != bfd_mach_arm_iWMMXt
   1651 	  && info->mach != bfd_mach_arm_iWMMXt2)
   1652 	insn = insn + IWMMXT_INSN_COUNT;
   1653 
   1654       mask = insn->mask;
   1655       value = insn->value;
   1656       if (thumb)
   1657 	{
   1658 	  /* The high 4 bits are 0xe for Arm conditional instructions, and
   1659 	     0xe for arm unconditional instructions.  The rest of the
   1660 	     encoding is the same.  */
   1661 	  mask |= 0xf0000000;
   1662 	  value |= 0xe0000000;
   1663 	  if (ifthen_state)
   1664 	    cond = IFTHEN_COND;
   1665 	  else
   1666 	    cond = 16;
   1667 	}
   1668       else
   1669 	{
   1670 	  /* Only match unconditional instuctions against unconditional
   1671 	     patterns.  */
   1672 	  if ((given & 0xf0000000) == 0xf0000000)
   1673 	    {
   1674 	      mask |= 0xf0000000;
   1675 	      cond = 16;
   1676 	    }
   1677 	  else
   1678 	    {
   1679 	      cond = (given >> 28) & 0xf;
   1680 	      if (cond == 0xe)
   1681 		cond = 16;
   1682 	    }
   1683 	}
   1684       if ((given & mask) == value)
   1685 	{
   1686 	  const char *c;
   1687 
   1688 	  for (c = insn->assembler; *c; c++)
   1689 	    {
   1690 	      if (*c == '%')
   1691 		{
   1692 		  switch (*++c)
   1693 		    {
   1694 		    case '%':
   1695 		      func (stream, "%%");
   1696 		      break;
   1697 
   1698 		    case 'A':
   1699 		      func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   1700 
   1701 		      if ((given & (1 << 24)) != 0)
   1702 			{
   1703 			  int offset = given & 0xff;
   1704 
   1705 			  if (offset)
   1706 			    func (stream, ", #%s%d]%s",
   1707 				  ((given & 0x00800000) == 0 ? "-" : ""),
   1708 				  offset * 4,
   1709 				  ((given & 0x00200000) != 0 ? "!" : ""));
   1710 			  else
   1711 			    func (stream, "]");
   1712 			}
   1713 		      else
   1714 			{
   1715 			  int offset = given & 0xff;
   1716 
   1717 			  func (stream, "]");
   1718 
   1719 			  if (given & (1 << 21))
   1720 			    {
   1721 			      if (offset)
   1722 				func (stream, ", #%s%d",
   1723 				      ((given & 0x00800000) == 0 ? "-" : ""),
   1724 				      offset * 4);
   1725 			    }
   1726 			  else
   1727 			    func (stream, ", {%d}", offset);
   1728 			}
   1729 		      break;
   1730 
   1731 		    case 'B':
   1732 		      {
   1733 			int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
   1734 			int offset = (given >> 1) & 0x3f;
   1735 
   1736 			if (offset == 1)
   1737 			  func (stream, "{d%d}", regno);
   1738 			else if (regno + offset > 32)
   1739 			  func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
   1740 			else
   1741 			  func (stream, "{d%d-d%d}", regno, regno + offset - 1);
   1742 		      }
   1743 		      break;
   1744 
   1745 		    case 'C':
   1746 		      {
   1747 			int rn = (given >> 16) & 0xf;
   1748 			int offset = (given & 0xff) * 4;
   1749 			int add = (given >> 23) & 1;
   1750 
   1751 			func (stream, "[%s", arm_regnames[rn]);
   1752 
   1753 			if (offset)
   1754 			  {
   1755 			    if (!add)
   1756 			      offset = -offset;
   1757 			    func (stream, ", #%d", offset);
   1758 			  }
   1759 			func (stream, "]");
   1760 			if (rn == 15)
   1761 			  {
   1762 			    func (stream, "\t; ");
   1763                             /* FIXME: Unsure if info->bytes_per_chunk is the
   1764                                right thing to use here.  */
   1765 			    info->print_address_func (offset + pc
   1766                               + info->bytes_per_chunk * 2, info);
   1767 			  }
   1768 		      }
   1769 		      break;
   1770 
   1771 		    case 'c':
   1772 		      func (stream, "%s", arm_conditional[cond]);
   1773 		      break;
   1774 
   1775 		    case 'I':
   1776 		      /* Print a Cirrus/DSP shift immediate.  */
   1777 		      /* Immediates are 7bit signed ints with bits 0..3 in
   1778 			 bits 0..3 of opcode and bits 4..6 in bits 5..7
   1779 			 of opcode.  */
   1780 		      {
   1781 			int imm;
   1782 
   1783 			imm = (given & 0xf) | ((given & 0xe0) >> 1);
   1784 
   1785 			/* Is ``imm'' a negative number?  */
   1786 			if (imm & 0x40)
   1787 			  imm |= (-1 << 7);
   1788 
   1789 			func (stream, "%d", imm);
   1790 		      }
   1791 
   1792 		      break;
   1793 
   1794 		    case 'F':
   1795 		      switch (given & 0x00408000)
   1796 			{
   1797 			case 0:
   1798 			  func (stream, "4");
   1799 			  break;
   1800 			case 0x8000:
   1801 			  func (stream, "1");
   1802 			  break;
   1803 			case 0x00400000:
   1804 			  func (stream, "2");
   1805 			  break;
   1806 			default:
   1807 			  func (stream, "3");
   1808 			}
   1809 		      break;
   1810 
   1811 		    case 'P':
   1812 		      switch (given & 0x00080080)
   1813 			{
   1814 			case 0:
   1815 			  func (stream, "s");
   1816 			  break;
   1817 			case 0x80:
   1818 			  func (stream, "d");
   1819 			  break;
   1820 			case 0x00080000:
   1821 			  func (stream, "e");
   1822 			  break;
   1823 			default:
   1824 			  func (stream, _("<illegal precision>"));
   1825 			  break;
   1826 			}
   1827 		      break;
   1828 		    case 'Q':
   1829 		      switch (given & 0x00408000)
   1830 			{
   1831 			case 0:
   1832 			  func (stream, "s");
   1833 			  break;
   1834 			case 0x8000:
   1835 			  func (stream, "d");
   1836 			  break;
   1837 			case 0x00400000:
   1838 			  func (stream, "e");
   1839 			  break;
   1840 			default:
   1841 			  func (stream, "p");
   1842 			  break;
   1843 			}
   1844 		      break;
   1845 		    case 'R':
   1846 		      switch (given & 0x60)
   1847 			{
   1848 			case 0:
   1849 			  break;
   1850 			case 0x20:
   1851 			  func (stream, "p");
   1852 			  break;
   1853 			case 0x40:
   1854 			  func (stream, "m");
   1855 			  break;
   1856 			default:
   1857 			  func (stream, "z");
   1858 			  break;
   1859 			}
   1860 		      break;
   1861 
   1862 		    case '0': case '1': case '2': case '3': case '4':
   1863 		    case '5': case '6': case '7': case '8': case '9':
   1864 		      {
   1865 			int width;
   1866 			unsigned long value;
   1867 
   1868 			c = arm_decode_bitfield (c, given, &value, &width);
   1869 
   1870 			switch (*c)
   1871 			  {
   1872 			  case 'r':
   1873 			    func (stream, "%s", arm_regnames[value]);
   1874 			    break;
   1875 			  case 'D':
   1876 			    func (stream, "d%ld", value);
   1877 			    break;
   1878 			  case 'Q':
   1879 			    if (value & 1)
   1880 			      func (stream, "<illegal reg q%ld.5>", value >> 1);
   1881 			    else
   1882 			      func (stream, "q%ld", value >> 1);
   1883 			    break;
   1884 			  case 'd':
   1885 			    func (stream, "%ld", value);
   1886 			    break;
   1887                           case 'k':
   1888                             {
   1889                               int from = (given & (1 << 7)) ? 32 : 16;
   1890                               func (stream, "%ld", from - value);
   1891                             }
   1892                             break;
   1893 
   1894 			  case 'f':
   1895 			    if (value > 7)
   1896 			      func (stream, "#%s", arm_fp_const[value & 7]);
   1897 			    else
   1898 			      func (stream, "f%ld", value);
   1899 			    break;
   1900 
   1901 			  case 'w':
   1902 			    if (width == 2)
   1903 			      func (stream, "%s", iwmmxt_wwnames[value]);
   1904 			    else
   1905 			      func (stream, "%s", iwmmxt_wwssnames[value]);
   1906 			    break;
   1907 
   1908 			  case 'g':
   1909 			    func (stream, "%s", iwmmxt_regnames[value]);
   1910 			    break;
   1911 			  case 'G':
   1912 			    func (stream, "%s", iwmmxt_cregnames[value]);
   1913 			    break;
   1914 
   1915 			  case 'x':
   1916 			    func (stream, "0x%lx", value);
   1917 			    break;
   1918 
   1919 			  case '`':
   1920 			    c++;
   1921 			    if (value == 0)
   1922 			      func (stream, "%c", *c);
   1923 			    break;
   1924 			  case '\'':
   1925 			    c++;
   1926 			    if (value == ((1ul << width) - 1))
   1927 			      func (stream, "%c", *c);
   1928 			    break;
   1929 			  case '?':
   1930 			    func (stream, "%c", c[(1 << width) - (int)value]);
   1931 			    c += 1 << width;
   1932 			    break;
   1933 			  default:
   1934 			    abort ();
   1935 			  }
   1936 			break;
   1937 
   1938 		      case 'y':
   1939 		      case 'z':
   1940 			{
   1941 			  int single = *c++ == 'y';
   1942 			  int regno;
   1943 
   1944 			  switch (*c)
   1945 			    {
   1946 			    case '4': /* Sm pair */
   1947 			      func (stream, "{");
   1948 			      /* Fall through.  */
   1949 			    case '0': /* Sm, Dm */
   1950 			      regno = given & 0x0000000f;
   1951 			      if (single)
   1952 				{
   1953 				  regno <<= 1;
   1954 				  regno += (given >> 5) & 1;
   1955 				}
   1956                               else
   1957                                 regno += ((given >> 5) & 1) << 4;
   1958 			      break;
   1959 
   1960 			    case '1': /* Sd, Dd */
   1961 			      regno = (given >> 12) & 0x0000000f;
   1962 			      if (single)
   1963 				{
   1964 				  regno <<= 1;
   1965 				  regno += (given >> 22) & 1;
   1966 				}
   1967                               else
   1968                                 regno += ((given >> 22) & 1) << 4;
   1969 			      break;
   1970 
   1971 			    case '2': /* Sn, Dn */
   1972 			      regno = (given >> 16) & 0x0000000f;
   1973 			      if (single)
   1974 				{
   1975 				  regno <<= 1;
   1976 				  regno += (given >> 7) & 1;
   1977 				}
   1978                               else
   1979                                 regno += ((given >> 7) & 1) << 4;
   1980 			      break;
   1981 
   1982 			    case '3': /* List */
   1983 			      func (stream, "{");
   1984 			      regno = (given >> 12) & 0x0000000f;
   1985 			      if (single)
   1986 				{
   1987 				  regno <<= 1;
   1988 				  regno += (given >> 22) & 1;
   1989 				}
   1990                               else
   1991                                 regno += ((given >> 22) & 1) << 4;
   1992 			      break;
   1993 
   1994 			    default:
   1995 			      abort ();
   1996 			    }
   1997 
   1998 			  func (stream, "%c%d", single ? 's' : 'd', regno);
   1999 
   2000 			  if (*c == '3')
   2001 			    {
   2002 			      int count = given & 0xff;
   2003 
   2004 			      if (single == 0)
   2005 				count >>= 1;
   2006 
   2007 			      if (--count)
   2008 				{
   2009 				  func (stream, "-%c%d",
   2010 					single ? 's' : 'd',
   2011 					regno + count);
   2012 				}
   2013 
   2014 			      func (stream, "}");
   2015 			    }
   2016 			  else if (*c == '4')
   2017 			    func (stream, ", %c%d}", single ? 's' : 'd',
   2018 				  regno + 1);
   2019 			}
   2020 			break;
   2021 
   2022 		      case 'L':
   2023 			switch (given & 0x00400100)
   2024 			  {
   2025 			  case 0x00000000: func (stream, "b"); break;
   2026 			  case 0x00400000: func (stream, "h"); break;
   2027 			  case 0x00000100: func (stream, "w"); break;
   2028 			  case 0x00400100: func (stream, "d"); break;
   2029 			  default:
   2030 			    break;
   2031 			  }
   2032 			break;
   2033 
   2034 		      case 'Z':
   2035 			{
   2036 			  int value;
   2037 			  /* given (20, 23) | given (0, 3) */
   2038 			  value = ((given >> 16) & 0xf0) | (given & 0xf);
   2039 			  func (stream, "%d", value);
   2040 			}
   2041 			break;
   2042 
   2043 		      case 'l':
   2044 			/* This is like the 'A' operator, except that if
   2045 			   the width field "M" is zero, then the offset is
   2046 			   *not* multiplied by four.  */
   2047 			{
   2048 			  int offset = given & 0xff;
   2049 			  int multiplier = (given & 0x00000100) ? 4 : 1;
   2050 
   2051 			  func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   2052 
   2053 			  if (offset)
   2054 			    {
   2055 			      if ((given & 0x01000000) != 0)
   2056 				func (stream, ", #%s%d]%s",
   2057 				      ((given & 0x00800000) == 0 ? "-" : ""),
   2058 				      offset * multiplier,
   2059 				      ((given & 0x00200000) != 0 ? "!" : ""));
   2060 			      else
   2061 				func (stream, "], #%s%d",
   2062 				      ((given & 0x00800000) == 0 ? "-" : ""),
   2063 				      offset * multiplier);
   2064 			    }
   2065 			  else
   2066 			    func (stream, "]");
   2067 			}
   2068 			break;
   2069 
   2070 		      case 'r':
   2071 			{
   2072 			  int imm4 = (given >> 4) & 0xf;
   2073 			  int puw_bits = ((given >> 22) & 6) | ((given >> 21) & 1);
   2074 			  int ubit = (given >> 23) & 1;
   2075 			  const char *rm = arm_regnames [given & 0xf];
   2076 			  const char *rn = arm_regnames [(given >> 16) & 0xf];
   2077 
   2078 			  switch (puw_bits)
   2079 			    {
   2080 			    case 1:
   2081 			      /* fall through */
   2082 			    case 3:
   2083 			      func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
   2084 			      if (imm4)
   2085 				func (stream, ", lsl #%d", imm4);
   2086 			      break;
   2087 
   2088 			    case 4:
   2089 			      /* fall through */
   2090 			    case 5:
   2091 			      /* fall through */
   2092 			    case 6:
   2093 			      /* fall through */
   2094 			    case 7:
   2095 			      func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
   2096 			      if (imm4 > 0)
   2097 				func (stream, ", lsl #%d", imm4);
   2098 			      func (stream, "]");
   2099 			      if (puw_bits == 5 || puw_bits == 7)
   2100 				func (stream, "!");
   2101 			      break;
   2102 
   2103 			    default:
   2104 			      func (stream, "INVALID");
   2105 			    }
   2106 			}
   2107 			break;
   2108 
   2109 		      case 'i':
   2110 			{
   2111 			  long imm5;
   2112 			  imm5 = ((given & 0x100) >> 4) | (given & 0xf);
   2113 			  func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
   2114 			}
   2115 			break;
   2116 
   2117 		      default:
   2118 			abort ();
   2119 		      }
   2120 		    }
   2121 		}
   2122 	      else
   2123 		func (stream, "%c", *c);
   2124 	    }
   2125 	  return TRUE;
   2126 	}
   2127     }
   2128   return FALSE;
   2129 }
   2130 
   2131 static void
   2132 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
   2133 {
   2134   void *stream = info->stream;
   2135   fprintf_ftype func = info->fprintf_func;
   2136 
   2137   if (((given & 0x000f0000) == 0x000f0000)
   2138       && ((given & 0x02000000) == 0))
   2139     {
   2140       int offset = given & 0xfff;
   2141 
   2142       func (stream, "[pc");
   2143 
   2144       if (given & 0x01000000)
   2145 	{
   2146 	  if ((given & 0x00800000) == 0)
   2147 	    offset = - offset;
   2148 
   2149 	  /* Pre-indexed.  */
   2150 	  func (stream, ", #%d]", offset);
   2151 
   2152 	  offset += pc + 8;
   2153 
   2154 	  /* Cope with the possibility of write-back
   2155 	     being used.  Probably a very dangerous thing
   2156 	     for the programmer to do, but who are we to
   2157 	     argue ?  */
   2158 	  if (given & 0x00200000)
   2159 	    func (stream, "!");
   2160 	}
   2161       else
   2162 	{
   2163 	  /* Post indexed.  */
   2164 	  func (stream, "], #%d", offset);
   2165 
   2166 	  /* ie ignore the offset.  */
   2167 	  offset = pc + 8;
   2168 	}
   2169 
   2170       func (stream, "\t; ");
   2171       info->print_address_func (offset, info);
   2172     }
   2173   else
   2174     {
   2175       func (stream, "[%s",
   2176 	    arm_regnames[(given >> 16) & 0xf]);
   2177       if ((given & 0x01000000) != 0)
   2178 	{
   2179 	  if ((given & 0x02000000) == 0)
   2180 	    {
   2181 	      int offset = given & 0xfff;
   2182 	      if (offset)
   2183 		func (stream, ", #%s%d",
   2184 		      (((given & 0x00800000) == 0)
   2185 		       ? "-" : ""), offset);
   2186 	    }
   2187 	  else
   2188 	    {
   2189 	      func (stream, ", %s",
   2190 		    (((given & 0x00800000) == 0)
   2191 		     ? "-" : ""));
   2192 	      arm_decode_shift (given, func, stream, 1);
   2193 	    }
   2194 
   2195 	  func (stream, "]%s",
   2196 		((given & 0x00200000) != 0) ? "!" : "");
   2197 	}
   2198       else
   2199 	{
   2200 	  if ((given & 0x02000000) == 0)
   2201 	    {
   2202 	      int offset = given & 0xfff;
   2203 	      if (offset)
   2204 		func (stream, "], #%s%d",
   2205 		      (((given & 0x00800000) == 0)
   2206 		       ? "-" : ""), offset);
   2207 	      else
   2208 		func (stream, "]");
   2209 	    }
   2210 	  else
   2211 	    {
   2212 	      func (stream, "], %s",
   2213 		    (((given & 0x00800000) == 0)
   2214 		     ? "-" : ""));
   2215 	      arm_decode_shift (given, func, stream, 1);
   2216 	    }
   2217 	}
   2218     }
   2219 }
   2220 
   2221 /* Print one neon instruction on INFO->STREAM.
   2222    Return TRUE if the instuction matched, FALSE if this is not a
   2223    recognised neon instruction.  */
   2224 
   2225 static bfd_boolean
   2226 print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
   2227 {
   2228   const struct opcode32 *insn;
   2229   void *stream = info->stream;
   2230   fprintf_ftype func = info->fprintf_func;
   2231 
   2232   if (thumb)
   2233     {
   2234       if ((given & 0xef000000) == 0xef000000)
   2235 	{
   2236 	  /* move bit 28 to bit 24 to translate Thumb2 to ARM encoding.  */
   2237 	  unsigned long bit28 = given & (1 << 28);
   2238 
   2239 	  given &= 0x00ffffff;
   2240 	  if (bit28)
   2241             given |= 0xf3000000;
   2242           else
   2243 	    given |= 0xf2000000;
   2244 	}
   2245       else if ((given & 0xff000000) == 0xf9000000)
   2246 	given ^= 0xf9000000 ^ 0xf4000000;
   2247       else
   2248 	return FALSE;
   2249     }
   2250 
   2251   for (insn = neon_opcodes; insn->assembler; insn++)
   2252     {
   2253       if ((given & insn->mask) == insn->value)
   2254 	{
   2255 	  const char *c;
   2256 
   2257 	  for (c = insn->assembler; *c; c++)
   2258 	    {
   2259 	      if (*c == '%')
   2260 		{
   2261 		  switch (*++c)
   2262 		    {
   2263 		    case '%':
   2264 		      func (stream, "%%");
   2265 		      break;
   2266 
   2267 		    case 'c':
   2268 		      if (thumb && ifthen_state)
   2269 			func (stream, "%s", arm_conditional[IFTHEN_COND]);
   2270 		      break;
   2271 
   2272 		    case 'A':
   2273 		      {
   2274 			static const unsigned char enc[16] =
   2275 			{
   2276 			  0x4, 0x14, /* st4 0,1 */
   2277 			  0x4, /* st1 2 */
   2278 			  0x4, /* st2 3 */
   2279 			  0x3, /* st3 4 */
   2280 			  0x13, /* st3 5 */
   2281 			  0x3, /* st1 6 */
   2282 			  0x1, /* st1 7 */
   2283 			  0x2, /* st2 8 */
   2284 			  0x12, /* st2 9 */
   2285 			  0x2, /* st1 10 */
   2286 			  0, 0, 0, 0, 0
   2287 			};
   2288 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   2289 			int rn = ((given >> 16) & 0xf);
   2290 			int rm = ((given >> 0) & 0xf);
   2291 			int align = ((given >> 4) & 0x3);
   2292 			int type = ((given >> 8) & 0xf);
   2293 			int n = enc[type] & 0xf;
   2294 			int stride = (enc[type] >> 4) + 1;
   2295 			int ix;
   2296 
   2297 			func (stream, "{");
   2298 			if (stride > 1)
   2299 			  for (ix = 0; ix != n; ix++)
   2300 			    func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
   2301 			else if (n == 1)
   2302 			  func (stream, "d%d", rd);
   2303 			else
   2304 			  func (stream, "d%d-d%d", rd, rd + n - 1);
   2305 			func (stream, "}, [%s", arm_regnames[rn]);
   2306 			if (align)
   2307 			  func (stream, ", :%d", 32 << align);
   2308 			func (stream, "]");
   2309 			if (rm == 0xd)
   2310 			  func (stream, "!");
   2311 			else if (rm != 0xf)
   2312 			  func (stream, ", %s", arm_regnames[rm]);
   2313 		      }
   2314 		      break;
   2315 
   2316 		    case 'B':
   2317 		      {
   2318 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   2319 			int rn = ((given >> 16) & 0xf);
   2320 			int rm = ((given >> 0) & 0xf);
   2321 			int idx_align = ((given >> 4) & 0xf);
   2322                         int align = 0;
   2323 			int size = ((given >> 10) & 0x3);
   2324 			int idx = idx_align >> (size + 1);
   2325                         int length = ((given >> 8) & 3) + 1;
   2326                         int stride = 1;
   2327                         int i;
   2328 
   2329                         if (length > 1 && size > 0)
   2330                           stride = (idx_align & (1 << size)) ? 2 : 1;
   2331 
   2332                         switch (length)
   2333                           {
   2334                           case 1:
   2335                             {
   2336                               int amask = (1 << size) - 1;
   2337                               if ((idx_align & (1 << size)) != 0)
   2338                                 return FALSE;
   2339                               if (size > 0)
   2340                                 {
   2341                                   if ((idx_align & amask) == amask)
   2342                                     align = 8 << size;
   2343                                   else if ((idx_align & amask) != 0)
   2344                                     return FALSE;
   2345                                 }
   2346                               }
   2347                             break;
   2348 
   2349                           case 2:
   2350                             if (size == 2 && (idx_align & 2) != 0)
   2351                               return FALSE;
   2352                             align = (idx_align & 1) ? 16 << size : 0;
   2353                             break;
   2354 
   2355                           case 3:
   2356                             if ((size == 2 && (idx_align & 3) != 0)
   2357                                 || (idx_align & 1) != 0)
   2358                               return FALSE;
   2359                             break;
   2360 
   2361                           case 4:
   2362                             if (size == 2)
   2363                               {
   2364                                 if ((idx_align & 3) == 3)
   2365                                   return FALSE;
   2366                                 align = (idx_align & 3) * 64;
   2367                               }
   2368                             else
   2369                               align = (idx_align & 1) ? 32 << size : 0;
   2370                             break;
   2371 
   2372                           default:
   2373                             abort ();
   2374                           }
   2375 
   2376 			func (stream, "{");
   2377                         for (i = 0; i < length; i++)
   2378                           func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
   2379                             rd + i * stride, idx);
   2380                         func (stream, "}, [%s", arm_regnames[rn]);
   2381 			if (align)
   2382 			  func (stream, ", :%d", align);
   2383 			func (stream, "]");
   2384 			if (rm == 0xd)
   2385 			  func (stream, "!");
   2386 			else if (rm != 0xf)
   2387 			  func (stream, ", %s", arm_regnames[rm]);
   2388 		      }
   2389 		      break;
   2390 
   2391 		    case 'C':
   2392 		      {
   2393 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   2394 			int rn = ((given >> 16) & 0xf);
   2395 			int rm = ((given >> 0) & 0xf);
   2396 			int align = ((given >> 4) & 0x1);
   2397 			int size = ((given >> 6) & 0x3);
   2398 			int type = ((given >> 8) & 0x3);
   2399 			int n = type + 1;
   2400 			int stride = ((given >> 5) & 0x1);
   2401 			int ix;
   2402 
   2403 			if (stride && (n == 1))
   2404 			  n++;
   2405 			else
   2406 			  stride++;
   2407 
   2408 			func (stream, "{");
   2409 			if (stride > 1)
   2410 			  for (ix = 0; ix != n; ix++)
   2411 			    func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
   2412 			else if (n == 1)
   2413 			  func (stream, "d%d[]", rd);
   2414 			else
   2415 			  func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
   2416 			func (stream, "}, [%s", arm_regnames[rn]);
   2417 			if (align)
   2418 			  {
   2419                             int align = (8 * (type + 1)) << size;
   2420                             if (type == 3)
   2421                               align = (size > 1) ? align >> 1 : align;
   2422 			    if (type == 2 || (type == 0 && !size))
   2423 			      func (stream, ", :<bad align %d>", align);
   2424 			    else
   2425 			      func (stream, ", :%d", align);
   2426 			  }
   2427 			func (stream, "]");
   2428 			if (rm == 0xd)
   2429 			  func (stream, "!");
   2430 			else if (rm != 0xf)
   2431 			  func (stream, ", %s", arm_regnames[rm]);
   2432 		      }
   2433 		      break;
   2434 
   2435 		    case 'D':
   2436 		      {
   2437 			int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
   2438 			int size = (given >> 20) & 3;
   2439 			int reg = raw_reg & ((4 << size) - 1);
   2440 			int ix = raw_reg >> size >> 2;
   2441 
   2442 			func (stream, "d%d[%d]", reg, ix);
   2443 		      }
   2444 		      break;
   2445 
   2446 		    case 'E':
   2447 		      /* Neon encoded constant for mov, mvn, vorr, vbic */
   2448 		      {
   2449 			int bits = 0;
   2450 			int cmode = (given >> 8) & 0xf;
   2451 			int op = (given >> 5) & 0x1;
   2452 			unsigned long value = 0, hival = 0;
   2453 			unsigned shift;
   2454                         int size = 0;
   2455                         int isfloat = 0;
   2456 
   2457 			bits |= ((given >> 24) & 1) << 7;
   2458 			bits |= ((given >> 16) & 7) << 4;
   2459 			bits |= ((given >> 0) & 15) << 0;
   2460 
   2461 			if (cmode < 8)
   2462 			  {
   2463 			    shift = (cmode >> 1) & 3;
   2464 			    value = (unsigned long)bits << (8 * shift);
   2465                             size = 32;
   2466 			  }
   2467 			else if (cmode < 12)
   2468 			  {
   2469 			    shift = (cmode >> 1) & 1;
   2470 			    value = (unsigned long)bits << (8 * shift);
   2471                             size = 16;
   2472 			  }
   2473 			else if (cmode < 14)
   2474 			  {
   2475 			    shift = (cmode & 1) + 1;
   2476 			    value = (unsigned long)bits << (8 * shift);
   2477 			    value |= (1ul << (8 * shift)) - 1;
   2478                             size = 32;
   2479 			  }
   2480 			else if (cmode == 14)
   2481 			  {
   2482 			    if (op)
   2483 			      {
   2484 				/* bit replication into bytes */
   2485 				int ix;
   2486 				unsigned long mask;
   2487 
   2488 				value = 0;
   2489                                 hival = 0;
   2490 				for (ix = 7; ix >= 0; ix--)
   2491 				  {
   2492 				    mask = ((bits >> ix) & 1) ? 0xff : 0;
   2493                                     if (ix <= 3)
   2494 				      value = (value << 8) | mask;
   2495                                     else
   2496                                       hival = (hival << 8) | mask;
   2497 				  }
   2498                                 size = 64;
   2499 			      }
   2500                             else
   2501                               {
   2502                                 /* byte replication */
   2503                                 value = (unsigned long)bits;
   2504                                 size = 8;
   2505                               }
   2506 			  }
   2507 			else if (!op)
   2508 			  {
   2509 			    /* floating point encoding */
   2510 			    int tmp;
   2511 
   2512 			    value = (unsigned long)(bits & 0x7f) << 19;
   2513 			    value |= (unsigned long)(bits & 0x80) << 24;
   2514 			    tmp = bits & 0x40 ? 0x3c : 0x40;
   2515 			    value |= (unsigned long)tmp << 24;
   2516                             size = 32;
   2517                             isfloat = 1;
   2518 			  }
   2519 			else
   2520 			  {
   2521 			    func (stream, "<illegal constant %.8x:%x:%x>",
   2522                                   bits, cmode, op);
   2523                             size = 32;
   2524 			    break;
   2525 			  }
   2526                         switch (size)
   2527                           {
   2528                           case 8:
   2529 			    func (stream, "#%ld\t; 0x%.2lx", value, value);
   2530                             break;
   2531 
   2532                           case 16:
   2533                             func (stream, "#%ld\t; 0x%.4lx", value, value);
   2534                             break;
   2535 
   2536                           case 32:
   2537                             if (isfloat)
   2538                               {
   2539                                 unsigned char valbytes[4];
   2540                                 double fvalue;
   2541 
   2542                                 /* Do this a byte at a time so we don't have to
   2543                                    worry about the host's endianness.  */
   2544                                 valbytes[0] = value & 0xff;
   2545                                 valbytes[1] = (value >> 8) & 0xff;
   2546                                 valbytes[2] = (value >> 16) & 0xff;
   2547                                 valbytes[3] = (value >> 24) & 0xff;
   2548 
   2549                                 floatformat_to_double
   2550                                   (&floatformat_ieee_single_little, valbytes,
   2551                                   &fvalue);
   2552 
   2553                                 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
   2554                                       value);
   2555                               }
   2556                             else
   2557                               func (stream, "#%ld\t; 0x%.8lx",
   2558 				(long) ((value & 0x80000000)
   2559 					? value | ~0xffffffffl : value), value);
   2560                             break;
   2561 
   2562                           case 64:
   2563                             func (stream, "#0x%.8lx%.8lx", hival, value);
   2564                             break;
   2565 
   2566                           default:
   2567                             abort ();
   2568                           }
   2569 		      }
   2570 		      break;
   2571 
   2572 		    case 'F':
   2573 		      {
   2574 			int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
   2575 			int num = (given >> 8) & 0x3;
   2576 
   2577 			if (!num)
   2578 			  func (stream, "{d%d}", regno);
   2579 			else if (num + regno >= 32)
   2580 			  func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
   2581 			else
   2582 			  func (stream, "{d%d-d%d}", regno, regno + num);
   2583 		      }
   2584 		      break;
   2585 
   2586 
   2587 		    case '0': case '1': case '2': case '3': case '4':
   2588 		    case '5': case '6': case '7': case '8': case '9':
   2589 		      {
   2590 			int width;
   2591 			unsigned long value;
   2592 
   2593 			c = arm_decode_bitfield (c, given, &value, &width);
   2594 
   2595 			switch (*c)
   2596 			  {
   2597 			  case 'r':
   2598 			    func (stream, "%s", arm_regnames[value]);
   2599 			    break;
   2600 			  case 'd':
   2601 			    func (stream, "%ld", value);
   2602 			    break;
   2603 			  case 'e':
   2604 			    func (stream, "%ld", (1ul << width) - value);
   2605 			    break;
   2606 
   2607 			  case 'S':
   2608 			  case 'T':
   2609 			  case 'U':
   2610 			    /* various width encodings */
   2611 			    {
   2612 			      int base = 8 << (*c - 'S'); /* 8,16 or 32 */
   2613 			      int limit;
   2614 			      unsigned low, high;
   2615 
   2616 			      c++;
   2617 			      if (*c >= '0' && *c <= '9')
   2618 				limit = *c - '0';
   2619 			      else if (*c >= 'a' && *c <= 'f')
   2620 				limit = *c - 'a' + 10;
   2621 			      else
   2622 				abort ();
   2623 			      low = limit >> 2;
   2624 			      high = limit & 3;
   2625 
   2626 			      if (value < low || value > high)
   2627 				func (stream, "<illegal width %d>", base << value);
   2628 			      else
   2629 				func (stream, "%d", base << value);
   2630 			    }
   2631 			    break;
   2632 			  case 'R':
   2633 			    if (given & (1 << 6))
   2634 			      goto Q;
   2635 			    /* FALLTHROUGH */
   2636 			  case 'D':
   2637 			    func (stream, "d%ld", value);
   2638 			    break;
   2639 			  case 'Q':
   2640 			  Q:
   2641 			    if (value & 1)
   2642 			      func (stream, "<illegal reg q%ld.5>", value >> 1);
   2643 			    else
   2644 			      func (stream, "q%ld", value >> 1);
   2645 			    break;
   2646 
   2647 			  case '`':
   2648 			    c++;
   2649 			    if (value == 0)
   2650 			      func (stream, "%c", *c);
   2651 			    break;
   2652 			  case '\'':
   2653 			    c++;
   2654 			    if (value == ((1ul << width) - 1))
   2655 			      func (stream, "%c", *c);
   2656 			    break;
   2657 			  case '?':
   2658 			    func (stream, "%c", c[(1 << width) - (int)value]);
   2659 			    c += 1 << width;
   2660 			    break;
   2661 			  default:
   2662 			    abort ();
   2663 			  }
   2664 			break;
   2665 
   2666 		      default:
   2667 			abort ();
   2668 		      }
   2669 		    }
   2670 		}
   2671 	      else
   2672 		func (stream, "%c", *c);
   2673 	    }
   2674 	  return TRUE;
   2675 	}
   2676     }
   2677   return FALSE;
   2678 }
   2679 
   2680 /* Print one ARM instruction from PC on INFO->STREAM.  */
   2681 
   2682 static void
   2683 print_insn_arm_internal (bfd_vma pc, struct disassemble_info *info, long given)
   2684 {
   2685   const struct opcode32 *insn;
   2686   void *stream = info->stream;
   2687   fprintf_ftype func = info->fprintf_func;
   2688 
   2689   if (print_insn_coprocessor (pc, info, given, FALSE))
   2690     return;
   2691 
   2692   if (print_insn_neon (info, given, FALSE))
   2693     return;
   2694 
   2695   for (insn = arm_opcodes; insn->assembler; insn++)
   2696     {
   2697       if (insn->value == FIRST_IWMMXT_INSN
   2698 	  && info->mach != bfd_mach_arm_XScale
   2699 	  && info->mach != bfd_mach_arm_iWMMXt)
   2700 	insn = insn + IWMMXT_INSN_COUNT;
   2701 
   2702       if ((given & insn->mask) == insn->value
   2703 	  /* Special case: an instruction with all bits set in the condition field
   2704 	     (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
   2705 	     or by the catchall at the end of the table.  */
   2706 	  && ((given & 0xF0000000) != 0xF0000000
   2707 	      || (insn->mask & 0xF0000000) == 0xF0000000
   2708 	      || (insn->mask == 0 && insn->value == 0)))
   2709 	{
   2710 	  const char *c;
   2711 
   2712 	  for (c = insn->assembler; *c; c++)
   2713 	    {
   2714 	      if (*c == '%')
   2715 		{
   2716 		  switch (*++c)
   2717 		    {
   2718 		    case '%':
   2719 		      func (stream, "%%");
   2720 		      break;
   2721 
   2722 		    case 'a':
   2723 		      print_arm_address (pc, info, given);
   2724 		      break;
   2725 
   2726 		    case 'P':
   2727 		      /* Set P address bit and use normal address
   2728 			 printing routine.  */
   2729 		      print_arm_address (pc, info, given | (1 << 24));
   2730 		      break;
   2731 
   2732 		    case 's':
   2733                       if ((given & 0x004f0000) == 0x004f0000)
   2734 			{
   2735                           /* PC relative with immediate offset.  */
   2736 			  int offset = ((given & 0xf00) >> 4) | (given & 0xf);
   2737 
   2738 			  if ((given & 0x00800000) == 0)
   2739 			    offset = -offset;
   2740 
   2741 			  func (stream, "[pc, #%d]\t; ", offset);
   2742 			  info->print_address_func (offset + pc + 8, info);
   2743 			}
   2744 		      else
   2745 			{
   2746 			  func (stream, "[%s",
   2747 				arm_regnames[(given >> 16) & 0xf]);
   2748 			  if ((given & 0x01000000) != 0)
   2749 			    {
   2750                               /* Pre-indexed.  */
   2751 			      if ((given & 0x00400000) == 0x00400000)
   2752 				{
   2753                                   /* Immediate.  */
   2754                                   int offset = ((given & 0xf00) >> 4) | (given & 0xf);
   2755 				  if (offset)
   2756 				    func (stream, ", #%s%d",
   2757 					  (((given & 0x00800000) == 0)
   2758 					   ? "-" : ""), offset);
   2759 				}
   2760 			      else
   2761 				{
   2762                                   /* Register.  */
   2763 				  func (stream, ", %s%s",
   2764 					(((given & 0x00800000) == 0)
   2765 					 ? "-" : ""),
   2766                                         arm_regnames[given & 0xf]);
   2767 				}
   2768 
   2769 			      func (stream, "]%s",
   2770 				    ((given & 0x00200000) != 0) ? "!" : "");
   2771 			    }
   2772 			  else
   2773 			    {
   2774                               /* Post-indexed.  */
   2775 			      if ((given & 0x00400000) == 0x00400000)
   2776 				{
   2777                                   /* Immediate.  */
   2778                                   int offset = ((given & 0xf00) >> 4) | (given & 0xf);
   2779 				  if (offset)
   2780 				    func (stream, "], #%s%d",
   2781 					  (((given & 0x00800000) == 0)
   2782 					   ? "-" : ""), offset);
   2783 				  else
   2784 				    func (stream, "]");
   2785 				}
   2786 			      else
   2787 				{
   2788                                   /* Register.  */
   2789 				  func (stream, "], %s%s",
   2790 					(((given & 0x00800000) == 0)
   2791 					 ? "-" : ""),
   2792                                         arm_regnames[given & 0xf]);
   2793 				}
   2794 			    }
   2795 			}
   2796 		      break;
   2797 
   2798 		    case 'b':
   2799 		      {
   2800 			int disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
   2801 			info->print_address_func (disp*4 + pc + 8, info);
   2802 		      }
   2803 		      break;
   2804 
   2805 		    case 'c':
   2806 		      if (((given >> 28) & 0xf) != 0xe)
   2807 			func (stream, "%s",
   2808 			      arm_conditional [(given >> 28) & 0xf]);
   2809 		      break;
   2810 
   2811 		    case 'm':
   2812 		      {
   2813 			int started = 0;
   2814 			int reg;
   2815 
   2816 			func (stream, "{");
   2817 			for (reg = 0; reg < 16; reg++)
   2818 			  if ((given & (1 << reg)) != 0)
   2819 			    {
   2820 			      if (started)
   2821 				func (stream, ", ");
   2822 			      started = 1;
   2823 			      func (stream, "%s", arm_regnames[reg]);
   2824 			    }
   2825 			func (stream, "}");
   2826 		      }
   2827 		      break;
   2828 
   2829 		    case 'q':
   2830 		      arm_decode_shift (given, func, stream, 0);
   2831 		      break;
   2832 
   2833 		    case 'o':
   2834 		      if ((given & 0x02000000) != 0)
   2835 			{
   2836 			  int rotate = (given & 0xf00) >> 7;
   2837 			  int immed = (given & 0xff);
   2838 			  immed = (((immed << (32 - rotate))
   2839 				    | (immed >> rotate)) & 0xffffffff);
   2840 			  func (stream, "#%d\t; 0x%x", immed, immed);
   2841 			}
   2842 		      else
   2843 			arm_decode_shift (given, func, stream, 1);
   2844 		      break;
   2845 
   2846 		    case 'p':
   2847 		      if ((given & 0x0000f000) == 0x0000f000)
   2848 			func (stream, "p");
   2849 		      break;
   2850 
   2851 		    case 't':
   2852 		      if ((given & 0x01200000) == 0x00200000)
   2853 			func (stream, "t");
   2854 		      break;
   2855 
   2856 		    case 'A':
   2857 		      func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
   2858 
   2859 		      if ((given & (1 << 24)) != 0)
   2860 			{
   2861 			  int offset = given & 0xff;
   2862 
   2863 			  if (offset)
   2864 			    func (stream, ", #%s%d]%s",
   2865 				  ((given & 0x00800000) == 0 ? "-" : ""),
   2866 				  offset * 4,
   2867 				  ((given & 0x00200000) != 0 ? "!" : ""));
   2868 			  else
   2869 			    func (stream, "]");
   2870 			}
   2871 		      else
   2872 			{
   2873 			  int offset = given & 0xff;
   2874 
   2875 			  func (stream, "]");
   2876 
   2877 			  if (given & (1 << 21))
   2878 			    {
   2879 			      if (offset)
   2880 				func (stream, ", #%s%d",
   2881 				      ((given & 0x00800000) == 0 ? "-" : ""),
   2882 				      offset * 4);
   2883 			    }
   2884 			  else
   2885 			    func (stream, ", {%d}", offset);
   2886 			}
   2887 		      break;
   2888 
   2889 		    case 'B':
   2890 		      /* Print ARM V5 BLX(1) address: pc+25 bits.  */
   2891 		      {
   2892 			bfd_vma address;
   2893 			bfd_vma offset = 0;
   2894 
   2895 			if (given & 0x00800000)
   2896 			  /* Is signed, hi bits should be ones.  */
   2897 			  offset = (-1) ^ 0x00ffffff;
   2898 
   2899 			/* Offset is (SignExtend(offset field)<<2).  */
   2900 			offset += given & 0x00ffffff;
   2901 			offset <<= 2;
   2902 			address = offset + pc + 8;
   2903 
   2904 			if (given & 0x01000000)
   2905 			  /* H bit allows addressing to 2-byte boundaries.  */
   2906 			  address += 2;
   2907 
   2908 		        info->print_address_func (address, info);
   2909 		      }
   2910 		      break;
   2911 
   2912 		    case 'C':
   2913 		      func (stream, "_");
   2914 		      if (given & 0x80000)
   2915 			func (stream, "f");
   2916 		      if (given & 0x40000)
   2917 			func (stream, "s");
   2918 		      if (given & 0x20000)
   2919 			func (stream, "x");
   2920 		      if (given & 0x10000)
   2921 			func (stream, "c");
   2922 		      break;
   2923 
   2924 		    case 'U':
   2925 		      switch (given & 0xf)
   2926 			{
   2927 			case 0xf: func(stream, "sy"); break;
   2928 			case 0x7: func(stream, "un"); break;
   2929 			case 0xe: func(stream, "st"); break;
   2930 			case 0x6: func(stream, "unst"); break;
   2931 			default:
   2932 			  func(stream, "#%d", (int)given & 0xf);
   2933 			  break;
   2934 			}
   2935 		      break;
   2936 
   2937 		    case '0': case '1': case '2': case '3': case '4':
   2938 		    case '5': case '6': case '7': case '8': case '9':
   2939 		      {
   2940 			int width;
   2941 			unsigned long value;
   2942 
   2943 			c = arm_decode_bitfield (c, given, &value, &width);
   2944 
   2945 			switch (*c)
   2946 			  {
   2947 			  case 'r':
   2948 			    func (stream, "%s", arm_regnames[value]);
   2949 			    break;
   2950 			  case 'd':
   2951 			    func (stream, "%ld", value);
   2952 			    break;
   2953 			  case 'b':
   2954 			    func (stream, "%ld", value * 8);
   2955 			    break;
   2956 			  case 'W':
   2957 			    func (stream, "%ld", value + 1);
   2958 			    break;
   2959 			  case 'x':
   2960 			    func (stream, "0x%08lx", value);
   2961 
   2962 			    /* Some SWI instructions have special
   2963 			       meanings.  */
   2964 			    if ((given & 0x0fffffff) == 0x0FF00000)
   2965 			      func (stream, "\t; IMB");
   2966 			    else if ((given & 0x0fffffff) == 0x0FF00001)
   2967 			      func (stream, "\t; IMBRange");
   2968 			    break;
   2969 			  case 'X':
   2970 			    func (stream, "%01lx", value & 0xf);
   2971 			    break;
   2972 			  case '`':
   2973 			    c++;
   2974 			    if (value == 0)
   2975 			      func (stream, "%c", *c);
   2976 			    break;
   2977 			  case '\'':
   2978 			    c++;
   2979 			    if (value == ((1ul << width) - 1))
   2980 			      func (stream, "%c", *c);
   2981 			    break;
   2982 			  case '?':
   2983 			    func (stream, "%c", c[(1 << width) - (int)value]);
   2984 			    c += 1 << width;
   2985 			    break;
   2986 			  default:
   2987 			    abort ();
   2988 			  }
   2989 			break;
   2990 
   2991 		      case 'e':
   2992 			{
   2993 			  int imm;
   2994 
   2995 			  imm = (given & 0xf) | ((given & 0xfff00) >> 4);
   2996 			  func (stream, "%d", imm);
   2997 			}
   2998 			break;
   2999 
   3000 		      case 'E':
   3001 			/* LSB and WIDTH fields of BFI or BFC.  The machine-
   3002 			   language instruction encodes LSB and MSB.  */
   3003 			{
   3004 			  long msb = (given & 0x001f0000) >> 16;
   3005 			  long lsb = (given & 0x00000f80) >> 7;
   3006 
   3007 			  long width = msb - lsb + 1;
   3008 			  if (width > 0)
   3009 			    func (stream, "#%lu, #%lu", lsb, width);
   3010 			  else
   3011 			    func (stream, "(invalid: %lu:%lu)", lsb, msb);
   3012 			}
   3013 			break;
   3014 
   3015 		      case 'V':
   3016 			/* 16-bit unsigned immediate from a MOVT or MOVW
   3017 			   instruction, encoded in bits 0:11 and 15:19.  */
   3018 			{
   3019 			  long hi = (given & 0x000f0000) >> 4;
   3020 			  long lo = (given & 0x00000fff);
   3021 			  long imm16 = hi | lo;
   3022 			  func (stream, "#%lu\t; 0x%lx", imm16, imm16);
   3023 			}
   3024 			break;
   3025 
   3026 		      default:
   3027 			abort ();
   3028 		      }
   3029 		    }
   3030 		}
   3031 	      else
   3032 		func (stream, "%c", *c);
   3033 	    }
   3034 	  return;
   3035 	}
   3036     }
   3037   abort ();
   3038 }
   3039 
   3040 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM.  */
   3041 
   3042 static void
   3043 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
   3044 {
   3045   const struct opcode16 *insn;
   3046   void *stream = info->stream;
   3047   fprintf_ftype func = info->fprintf_func;
   3048 
   3049   for (insn = thumb_opcodes; insn->assembler; insn++)
   3050     if ((given & insn->mask) == insn->value)
   3051       {
   3052 	const char *c = insn->assembler;
   3053 	for (; *c; c++)
   3054 	  {
   3055 	    int domaskpc = 0;
   3056 	    int domasklr = 0;
   3057 
   3058 	    if (*c != '%')
   3059 	      {
   3060 		func (stream, "%c", *c);
   3061 		continue;
   3062 	      }
   3063 
   3064 	    switch (*++c)
   3065 	      {
   3066 	      case '%':
   3067 		func (stream, "%%");
   3068 		break;
   3069 
   3070 	      case 'c':
   3071 		if (ifthen_state)
   3072 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   3073 		break;
   3074 
   3075 	      case 'C':
   3076 		if (ifthen_state)
   3077 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   3078 		else
   3079 		  func (stream, "s");
   3080 		break;
   3081 
   3082 	      case 'I':
   3083 		{
   3084 		  unsigned int tmp;
   3085 
   3086 		  ifthen_next_state = given & 0xff;
   3087 		  for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
   3088 		    func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
   3089 		  func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
   3090 		}
   3091 		break;
   3092 
   3093 	      case 'x':
   3094 		if (ifthen_next_state)
   3095 		  func (stream, "\t; unpredictable branch in IT block\n");
   3096 		break;
   3097 
   3098 	      case 'X':
   3099 		if (ifthen_state)
   3100 		  func (stream, "\t; unpredictable <IT:%s>",
   3101 			arm_conditional[IFTHEN_COND]);
   3102 		break;
   3103 
   3104 	      case 'S':
   3105 		{
   3106 		  long reg;
   3107 
   3108 		  reg = (given >> 3) & 0x7;
   3109 		  if (given & (1 << 6))
   3110 		    reg += 8;
   3111 
   3112 		  func (stream, "%s", arm_regnames[reg]);
   3113 		}
   3114 		break;
   3115 
   3116 	      case 'D':
   3117 		{
   3118 		  long reg;
   3119 
   3120 		  reg = given & 0x7;
   3121 		  if (given & (1 << 7))
   3122 		    reg += 8;
   3123 
   3124 		  func (stream, "%s", arm_regnames[reg]);
   3125 		}
   3126 		break;
   3127 
   3128 	      case 'N':
   3129 		if (given & (1 << 8))
   3130 		  domasklr = 1;
   3131 		/* Fall through.  */
   3132 	      case 'O':
   3133 		if (*c == 'O' && (given & (1 << 8)))
   3134 		  domaskpc = 1;
   3135 		/* Fall through.  */
   3136 	      case 'M':
   3137 		{
   3138 		  int started = 0;
   3139 		  int reg;
   3140 
   3141 		  func (stream, "{");
   3142 
   3143 		  /* It would be nice if we could spot
   3144 		     ranges, and generate the rS-rE format: */
   3145 		  for (reg = 0; (reg < 8); reg++)
   3146 		    if ((given & (1 << reg)) != 0)
   3147 		      {
   3148 			if (started)
   3149 			  func (stream, ", ");
   3150 			started = 1;
   3151 			func (stream, "%s", arm_regnames[reg]);
   3152 		      }
   3153 
   3154 		  if (domasklr)
   3155 		    {
   3156 		      if (started)
   3157 			func (stream, ", ");
   3158 		      started = 1;
   3159 		      func (stream, arm_regnames[14] /* "lr" */);
   3160 		    }
   3161 
   3162 		  if (domaskpc)
   3163 		    {
   3164 		      if (started)
   3165 			func (stream, ", ");
   3166 		      func (stream, arm_regnames[15] /* "pc" */);
   3167 		    }
   3168 
   3169 		  func (stream, "}");
   3170 		}
   3171 		break;
   3172 
   3173 	      case 'b':
   3174 		/* Print ARM V6T2 CZB address: pc+4+6 bits.  */
   3175 		{
   3176 		  bfd_vma address = (pc + 4
   3177 				     + ((given & 0x00f8) >> 2)
   3178 				     + ((given & 0x0200) >> 3));
   3179 		  info->print_address_func (address, info);
   3180 		}
   3181 		break;
   3182 
   3183 	      case 's':
   3184 		/* Right shift immediate -- bits 6..10; 1-31 print
   3185 		   as themselves, 0 prints as 32.  */
   3186 		{
   3187 		  long imm = (given & 0x07c0) >> 6;
   3188 		  if (imm == 0)
   3189 		    imm = 32;
   3190 		  func (stream, "#%ld", imm);
   3191 		}
   3192 		break;
   3193 
   3194 	      case '0': case '1': case '2': case '3': case '4':
   3195 	      case '5': case '6': case '7': case '8': case '9':
   3196 		{
   3197 		  int bitstart = *c++ - '0';
   3198 		  int bitend = 0;
   3199 
   3200 		  while (*c >= '0' && *c <= '9')
   3201 		    bitstart = (bitstart * 10) + *c++ - '0';
   3202 
   3203 		  switch (*c)
   3204 		    {
   3205 		    case '-':
   3206 		      {
   3207 			long reg;
   3208 
   3209 			c++;
   3210 			while (*c >= '0' && *c <= '9')
   3211 			  bitend = (bitend * 10) + *c++ - '0';
   3212 			if (!bitend)
   3213 			  abort ();
   3214 			reg = given >> bitstart;
   3215 			reg &= (2 << (bitend - bitstart)) - 1;
   3216 			switch (*c)
   3217 			  {
   3218 			  case 'r':
   3219 			    func (stream, "%s", arm_regnames[reg]);
   3220 			    break;
   3221 
   3222 			  case 'd':
   3223 			    func (stream, "%ld", reg);
   3224 			    break;
   3225 
   3226 			  case 'H':
   3227 			    func (stream, "%ld", reg << 1);
   3228 			    break;
   3229 
   3230 			  case 'W':
   3231 			    func (stream, "%ld", reg << 2);
   3232 			    break;
   3233 
   3234 			  case 'a':
   3235 			    /* PC-relative address -- the bottom two
   3236 			       bits of the address are dropped
   3237 			       before the calculation.  */
   3238 			    info->print_address_func
   3239 			      (((pc + 4) & ~3) + (reg << 2), info);
   3240 			    break;
   3241 
   3242 			  case 'x':
   3243 			    func (stream, "0x%04lx", reg);
   3244 			    break;
   3245 
   3246 			  case 'B':
   3247 			    reg = ((reg ^ (1 << bitend)) - (1 << bitend));
   3248 			    info->print_address_func (reg * 2 + pc + 4, info);
   3249 			    break;
   3250 
   3251 			  case 'c':
   3252 			    func (stream, "%s", arm_conditional [reg]);
   3253 			    break;
   3254 
   3255 			  default:
   3256 			    abort ();
   3257 			  }
   3258 		      }
   3259 		      break;
   3260 
   3261 		    case '\'':
   3262 		      c++;
   3263 		      if ((given & (1 << bitstart)) != 0)
   3264 			func (stream, "%c", *c);
   3265 		      break;
   3266 
   3267 		    case '?':
   3268 		      ++c;
   3269 		      if ((given & (1 << bitstart)) != 0)
   3270 			func (stream, "%c", *c++);
   3271 		      else
   3272 			func (stream, "%c", *++c);
   3273 		      break;
   3274 
   3275 		    default:
   3276 		      abort ();
   3277 		    }
   3278 		}
   3279 		break;
   3280 
   3281 	      default:
   3282 		abort ();
   3283 	      }
   3284 	  }
   3285 	return;
   3286       }
   3287 
   3288   /* No match.  */
   3289   abort ();
   3290 }
   3291 
   3292 /* Return the name of an V7M special register.  */
   3293 static const char *
   3294 psr_name (int regno)
   3295 {
   3296   switch (regno)
   3297     {
   3298     case 0: return "APSR";
   3299     case 1: return "IAPSR";
   3300     case 2: return "EAPSR";
   3301     case 3: return "PSR";
   3302     case 5: return "IPSR";
   3303     case 6: return "EPSR";
   3304     case 7: return "IEPSR";
   3305     case 8: return "MSP";
   3306     case 9: return "PSP";
   3307     case 16: return "PRIMASK";
   3308     case 17: return "BASEPRI";
   3309     case 18: return "BASEPRI_MASK";
   3310     case 19: return "FAULTMASK";
   3311     case 20: return "CONTROL";
   3312     default: return "<unknown>";
   3313     }
   3314 }
   3315 
   3316 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM.  */
   3317 
   3318 static void
   3319 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
   3320 {
   3321   const struct opcode32 *insn;
   3322   void *stream = info->stream;
   3323   fprintf_ftype func = info->fprintf_func;
   3324 
   3325   if (print_insn_coprocessor (pc, info, given, TRUE))
   3326     return;
   3327 
   3328   if (print_insn_neon (info, given, TRUE))
   3329     return;
   3330 
   3331   for (insn = thumb32_opcodes; insn->assembler; insn++)
   3332     if ((given & insn->mask) == insn->value)
   3333       {
   3334 	const char *c = insn->assembler;
   3335 	for (; *c; c++)
   3336 	  {
   3337 	    if (*c != '%')
   3338 	      {
   3339 		func (stream, "%c", *c);
   3340 		continue;
   3341 	      }
   3342 
   3343 	    switch (*++c)
   3344 	      {
   3345 	      case '%':
   3346 		func (stream, "%%");
   3347 		break;
   3348 
   3349 	      case 'c':
   3350 		if (ifthen_state)
   3351 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
   3352 		break;
   3353 
   3354 	      case 'x':
   3355 		if (ifthen_next_state)
   3356 		  func (stream, "\t; unpredictable branch in IT block\n");
   3357 		break;
   3358 
   3359 	      case 'X':
   3360 		if (ifthen_state)
   3361 		  func (stream, "\t; unpredictable <IT:%s>",
   3362 			arm_conditional[IFTHEN_COND]);
   3363 		break;
   3364 
   3365 	      case 'I':
   3366 		{
   3367 		  unsigned int imm12 = 0;
   3368 		  imm12 |= (given & 0x000000ffu);
   3369 		  imm12 |= (given & 0x00007000u) >> 4;
   3370 		  imm12 |= (given & 0x04000000u) >> 15;
   3371 		  func (stream, "#%u\t; 0x%x", imm12, imm12);
   3372 		}
   3373 		break;
   3374 
   3375 	      case 'M':
   3376 		{
   3377 		  unsigned int bits = 0, imm, imm8, mod;
   3378 		  bits |= (given & 0x000000ffu);
   3379 		  bits |= (given & 0x00007000u) >> 4;
   3380 		  bits |= (given & 0x04000000u) >> 15;
   3381 		  imm8 = (bits & 0x0ff);
   3382 		  mod = (bits & 0xf00) >> 8;
   3383 		  switch (mod)
   3384 		    {
   3385 		    case 0: imm = imm8; break;
   3386 		    case 1: imm = ((imm8<<16) | imm8); break;
   3387 		    case 2: imm = ((imm8<<24) | (imm8 << 8)); break;
   3388 		    case 3: imm = ((imm8<<24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
   3389 		    default:
   3390 		      mod  = (bits & 0xf80) >> 7;
   3391 		      imm8 = (bits & 0x07f) | 0x80;
   3392 		      imm  = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
   3393 		    }
   3394 		  func (stream, "#%u\t; 0x%x", imm, imm);
   3395 		}
   3396 		break;
   3397 
   3398 	      case 'J':
   3399 		{
   3400 		  unsigned int imm = 0;
   3401 		  imm |= (given & 0x000000ffu);
   3402 		  imm |= (given & 0x00007000u) >> 4;
   3403 		  imm |= (given & 0x04000000u) >> 15;
   3404 		  imm |= (given & 0x000f0000u) >> 4;
   3405 		  func (stream, "#%u\t; 0x%x", imm, imm);
   3406 		}
   3407 		break;
   3408 
   3409 	      case 'K':
   3410 		{
   3411 		  unsigned int imm = 0;
   3412 		  imm |= (given & 0x000f0000u) >> 16;
   3413 		  imm |= (given & 0x00000ff0u) >> 0;
   3414 		  imm |= (given & 0x0000000fu) << 12;
   3415 		  func (stream, "#%u\t; 0x%x", imm, imm);
   3416 		}
   3417 		break;
   3418 
   3419 	      case 'S':
   3420 		{
   3421 		  unsigned int reg = (given & 0x0000000fu);
   3422 		  unsigned int stp = (given & 0x00000030u) >> 4;
   3423 		  unsigned int imm = 0;
   3424 		  imm |= (given & 0x000000c0u) >> 6;
   3425 		  imm |= (given & 0x00007000u) >> 10;
   3426 
   3427 		  func (stream, "%s", arm_regnames[reg]);
   3428 		  switch (stp)
   3429 		    {
   3430 		    case 0:
   3431 		      if (imm > 0)
   3432 			func (stream, ", lsl #%u", imm);
   3433 		      break;
   3434 
   3435 		    case 1:
   3436 		      if (imm == 0)
   3437 			imm = 32;
   3438 		      func (stream, ", lsr #%u", imm);
   3439 		      break;
   3440 
   3441 		    case 2:
   3442 		      if (imm == 0)
   3443 			imm = 32;
   3444 		      func (stream, ", asr #%u", imm);
   3445 		      break;
   3446 
   3447 		    case 3:
   3448 		      if (imm == 0)
   3449 			func (stream, ", rrx");
   3450 		      else
   3451 			func (stream, ", ror #%u", imm);
   3452 		    }
   3453 		}
   3454 		break;
   3455 
   3456 	      case 'a':
   3457 		{
   3458 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   3459 		  unsigned int U   = (given & 0x00800000) >> 23;
   3460 		  unsigned int op  = (given & 0x00000f00) >> 8;
   3461 		  unsigned int i12 = (given & 0x00000fff);
   3462 		  unsigned int i8  = (given & 0x000000ff);
   3463 		  bfd_boolean writeback = FALSE, postind = FALSE;
   3464 		  int offset = 0;
   3465 
   3466 		  func (stream, "[%s", arm_regnames[Rn]);
   3467 		  if (U) /* 12-bit positive immediate offset */
   3468 		    offset = i12;
   3469 		  else if (Rn == 15) /* 12-bit negative immediate offset */
   3470 		    offset = -(int)i12;
   3471 		  else if (op == 0x0) /* shifted register offset */
   3472 		    {
   3473 		      unsigned int Rm = (i8 & 0x0f);
   3474 		      unsigned int sh = (i8 & 0x30) >> 4;
   3475 		      func (stream, ", %s", arm_regnames[Rm]);
   3476 		      if (sh)
   3477 			func (stream, ", lsl #%u", sh);
   3478 		      func (stream, "]");
   3479 		      break;
   3480 		    }
   3481 		  else switch (op)
   3482 		    {
   3483 		    case 0xE:  /* 8-bit positive immediate offset */
   3484 		      offset = i8;
   3485 		      break;
   3486 
   3487 		    case 0xC:  /* 8-bit negative immediate offset */
   3488 		      offset = -i8;
   3489 		      break;
   3490 
   3491 		    case 0xF:  /* 8-bit + preindex with wb */
   3492 		      offset = i8;
   3493 		      writeback = TRUE;
   3494 		      break;
   3495 
   3496 		    case 0xD:  /* 8-bit - preindex with wb */
   3497 		      offset = -i8;
   3498 		      writeback = TRUE;
   3499 		      break;
   3500 
   3501 		    case 0xB:  /* 8-bit + postindex */
   3502 		      offset = i8;
   3503 		      postind = TRUE;
   3504 		      break;
   3505 
   3506 		    case 0x9:  /* 8-bit - postindex */
   3507 		      offset = -i8;
   3508 		      postind = TRUE;
   3509 		      break;
   3510 
   3511 		    default:
   3512 		      func (stream, ", <undefined>]");
   3513 		      goto skip;
   3514 		    }
   3515 
   3516 		  if (postind)
   3517 		    func (stream, "], #%d", offset);
   3518 		  else
   3519 		    {
   3520 		      if (offset)
   3521 			func (stream, ", #%d", offset);
   3522 		      func (stream, writeback ? "]!" : "]");
   3523 		    }
   3524 
   3525 		  if (Rn == 15)
   3526 		    {
   3527 		      func (stream, "\t; ");
   3528 		      info->print_address_func (((pc + 4) & ~3) + offset, info);
   3529 		    }
   3530 		}
   3531 	      skip:
   3532 		break;
   3533 
   3534 	      case 'A':
   3535 		{
   3536 		  unsigned int P   = (given & 0x01000000) >> 24;
   3537 		  unsigned int U   = (given & 0x00800000) >> 23;
   3538 		  unsigned int W   = (given & 0x00400000) >> 21;
   3539 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   3540 		  unsigned int off = (given & 0x000000ff);
   3541 
   3542 		  func (stream, "[%s", arm_regnames[Rn]);
   3543 		  if (P)
   3544 		    {
   3545 		      if (off || !U)
   3546 			func (stream, ", #%c%u", U ? '+' : '-', off * 4);
   3547 		      func (stream, "]");
   3548 		      if (W)
   3549 			func (stream, "!");
   3550 		    }
   3551 		  else
   3552 		    {
   3553 		      func (stream, "], ");
   3554 		      if (W)
   3555 			func (stream, "#%c%u", U ? '+' : '-', off * 4);
   3556 		      else
   3557 			func (stream, "{%u}", off);
   3558 		    }
   3559 		}
   3560 		break;
   3561 
   3562 	      case 'w':
   3563 		{
   3564 		  unsigned int Sbit = (given & 0x01000000) >> 24;
   3565 		  unsigned int type = (given & 0x00600000) >> 21;
   3566 		  switch (type)
   3567 		    {
   3568 		    case 0: func (stream, Sbit ? "sb" : "b"); break;
   3569 		    case 1: func (stream, Sbit ? "sh" : "h"); break;
   3570 		    case 2:
   3571 		      if (Sbit)
   3572 			func (stream, "??");
   3573 		      break;
   3574 		    case 3:
   3575 		      func (stream, "??");
   3576 		      break;
   3577 		    }
   3578 		}
   3579 		break;
   3580 
   3581 	      case 'm':
   3582 		{
   3583 		  int started = 0;
   3584 		  int reg;
   3585 
   3586 		  func (stream, "{");
   3587 		  for (reg = 0; reg < 16; reg++)
   3588 		    if ((given & (1 << reg)) != 0)
   3589 		      {
   3590 			if (started)
   3591 			  func (stream, ", ");
   3592 			started = 1;
   3593 			func (stream, "%s", arm_regnames[reg]);
   3594 		      }
   3595 		  func (stream, "}");
   3596 		}
   3597 		break;
   3598 
   3599 	      case 'E':
   3600 		{
   3601 		  unsigned int msb = (given & 0x0000001f);
   3602 		  unsigned int lsb = 0;
   3603 		  lsb |= (given & 0x000000c0u) >> 6;
   3604 		  lsb |= (given & 0x00007000u) >> 10;
   3605 		  func (stream, "#%u, #%u", lsb, msb - lsb + 1);
   3606 		}
   3607 		break;
   3608 
   3609 	      case 'F':
   3610 		{
   3611 		  unsigned int width = (given & 0x0000001f) + 1;
   3612 		  unsigned int lsb = 0;
   3613 		  lsb |= (given & 0x000000c0u) >> 6;
   3614 		  lsb |= (given & 0x00007000u) >> 10;
   3615 		  func (stream, "#%u, #%u", lsb, width);
   3616 		}
   3617 		break;
   3618 
   3619 	      case 'b':
   3620 		{
   3621 		  unsigned int S = (given & 0x04000000u) >> 26;
   3622 		  unsigned int J1 = (given & 0x00002000u) >> 13;
   3623 		  unsigned int J2 = (given & 0x00000800u) >> 11;
   3624 		  int offset = 0;
   3625 
   3626 		  offset |= !S << 20;
   3627 		  offset |= J2 << 19;
   3628 		  offset |= J1 << 18;
   3629 		  offset |= (given & 0x003f0000) >> 4;
   3630 		  offset |= (given & 0x000007ff) << 1;
   3631 		  offset -= (1 << 20);
   3632 
   3633 		  info->print_address_func (pc + 4 + offset, info);
   3634 		}
   3635 		break;
   3636 
   3637 	      case 'B':
   3638 		{
   3639 		  unsigned int S = (given & 0x04000000u) >> 26;
   3640 		  unsigned int I1 = (given & 0x00002000u) >> 13;
   3641 		  unsigned int I2 = (given & 0x00000800u) >> 11;
   3642 		  int offset = 0;
   3643 
   3644 		  offset |= !S << 24;
   3645 		  offset |= !(I1 ^ S) << 23;
   3646 		  offset |= !(I2 ^ S) << 22;
   3647 		  offset |= (given & 0x03ff0000u) >> 4;
   3648 		  offset |= (given & 0x000007ffu) << 1;
   3649 		  offset -= (1 << 24);
   3650 		  offset += pc + 4;
   3651 
   3652 		  /* BLX target addresses are always word aligned.  */
   3653 		  if ((given & 0x00001000u) == 0)
   3654 		      offset &= ~2u;
   3655 
   3656 		  info->print_address_func (offset, info);
   3657 		}
   3658 		break;
   3659 
   3660 	      case 's':
   3661 		{
   3662 		  unsigned int shift = 0;
   3663 		  shift |= (given & 0x000000c0u) >> 6;
   3664 		  shift |= (given & 0x00007000u) >> 10;
   3665 		  if (given & 0x00200000u)
   3666 		    func (stream, ", asr #%u", shift);
   3667 		  else if (shift)
   3668 		    func (stream, ", lsl #%u", shift);
   3669 		  /* else print nothing - lsl #0 */
   3670 		}
   3671 		break;
   3672 
   3673 	      case 'R':
   3674 		{
   3675 		  unsigned int rot = (given & 0x00000030) >> 4;
   3676 		  if (rot)
   3677 		    func (stream, ", ror #%u", rot * 8);
   3678 		}
   3679 		break;
   3680 
   3681 	      case 'U':
   3682 		switch (given & 0xf)
   3683 		  {
   3684 		  case 0xf: func(stream, "sy"); break;
   3685 		  case 0x7: func(stream, "un"); break;
   3686 		  case 0xe: func(stream, "st"); break;
   3687 		  case 0x6: func(stream, "unst"); break;
   3688 		  default:
   3689 		    func(stream, "#%d", (int)given & 0xf);
   3690 		    break;
   3691 		  }
   3692 		break;
   3693 
   3694 	      case 'C':
   3695 		if ((given & 0xff) == 0)
   3696 		  {
   3697 		    func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
   3698 		    if (given & 0x800)
   3699 		      func (stream, "f");
   3700 		    if (given & 0x400)
   3701 		      func (stream, "s");
   3702 		    if (given & 0x200)
   3703 		      func (stream, "x");
   3704 		    if (given & 0x100)
   3705 		      func (stream, "c");
   3706 		  }
   3707 		else
   3708 		  {
   3709 		    func (stream, psr_name (given & 0xff));
   3710 		  }
   3711 		break;
   3712 
   3713 	      case 'D':
   3714 		if ((given & 0xff) == 0)
   3715 		  func (stream, "%cPSR", (given & 0x100000) ? 'S' : 'C');
   3716 		else
   3717 		  func (stream, psr_name (given & 0xff));
   3718 		break;
   3719 
   3720 	      case '0': case '1': case '2': case '3': case '4':
   3721 	      case '5': case '6': case '7': case '8': case '9':
   3722 		{
   3723 		  int width;
   3724 		  unsigned long val;
   3725 
   3726 		  c = arm_decode_bitfield (c, given, &val, &width);
   3727 
   3728 		  switch (*c)
   3729 		    {
   3730 		    case 'd': func (stream, "%lu", val); break;
   3731 		    case 'W': func (stream, "%lu", val * 4); break;
   3732 		    case 'r': func (stream, "%s", arm_regnames[val]); break;
   3733 
   3734 		    case 'c':
   3735 		      func (stream, "%s", arm_conditional[val]);
   3736 		      break;
   3737 
   3738 		    case '\'':
   3739 		      c++;
   3740 		      if (val == ((1ul << width) - 1))
   3741 			func (stream, "%c", *c);
   3742 		      break;
   3743 
   3744 		    case '`':
   3745 		      c++;
   3746 		      if (val == 0)
   3747 			func (stream, "%c", *c);
   3748 		      break;
   3749 
   3750 		    case '?':
   3751 		      func (stream, "%c", c[(1 << width) - (int)val]);
   3752 		      c += 1 << width;
   3753 		      break;
   3754 
   3755 		    default:
   3756 		      abort ();
   3757 		    }
   3758 		}
   3759 		break;
   3760 
   3761 	      default:
   3762 		abort ();
   3763 	      }
   3764 	  }
   3765 	return;
   3766       }
   3767 
   3768   /* No match.  */
   3769   abort ();
   3770 }
   3771 
   3772 /* Print data bytes on INFO->STREAM.  */
   3773 
   3774 static void
   3775 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED, struct disassemble_info *info,
   3776 		 long given)
   3777 {
   3778   switch (info->bytes_per_chunk)
   3779     {
   3780     case 1:
   3781       info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
   3782       break;
   3783     case 2:
   3784       info->fprintf_func (info->stream, ".short\t0x%04lx", given);
   3785       break;
   3786     case 4:
   3787       info->fprintf_func (info->stream, ".word\t0x%08lx", given);
   3788       break;
   3789     default:
   3790       abort ();
   3791     }
   3792 }
   3793 
   3794 /* Search back through the insn stream to determine if this instruction is
   3795    conditionally executed.  */
   3796 static void
   3797 find_ifthen_state (bfd_vma pc, struct disassemble_info *info,
   3798 		   bfd_boolean little)
   3799 {
   3800   unsigned char b[2];
   3801   unsigned int insn;
   3802   int status;
   3803   /* COUNT is twice the number of instructions seen.  It will be odd if we
   3804      just crossed an instruction boundary.  */
   3805   int count;
   3806   int it_count;
   3807   unsigned int seen_it;
   3808   bfd_vma addr;
   3809 
   3810   ifthen_address = pc;
   3811   ifthen_state = 0;
   3812 
   3813   addr = pc;
   3814   count = 1;
   3815   it_count = 0;
   3816   seen_it = 0;
   3817   /* Scan backwards looking for IT instructions, keeping track of where
   3818      instruction boundaries are.  We don't know if something is actually an
   3819      IT instruction until we find a definite instruction boundary.  */
   3820   for (;;)
   3821     {
   3822       if (addr == 0 || info->symbol_at_address_func(addr, info))
   3823 	{
   3824 	  /* A symbol must be on an instruction boundary, and will not
   3825 	     be within an IT block.  */
   3826 	  if (seen_it && (count & 1))
   3827 	    break;
   3828 
   3829 	  return;
   3830 	}
   3831       addr -= 2;
   3832       status = info->read_memory_func (addr, (bfd_byte *)b, 2, info);
   3833       if (status)
   3834 	return;
   3835 
   3836       if (little)
   3837 	insn = (b[0]) | (b[1] << 8);
   3838       else
   3839 	insn = (b[1]) | (b[0] << 8);
   3840       if (seen_it)
   3841 	{
   3842 	  if ((insn & 0xf800) < 0xe800)
   3843 	    {
   3844 	      /* Addr + 2 is an instruction boundary.  See if this matches
   3845 	         the expected boundary based on the position of the last
   3846 		 IT candidate.  */
   3847 	      if (count & 1)
   3848 		break;
   3849 	      seen_it = 0;
   3850 	    }
   3851 	}
   3852       if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
   3853 	{
   3854 	  /* This could be an IT instruction.  */
   3855 	  seen_it = insn;
   3856 	  it_count = count >> 1;
   3857 	}
   3858       if ((insn & 0xf800) >= 0xe800)
   3859 	count++;
   3860       else
   3861 	count = (count + 2) | 1;
   3862       /* IT blocks contain at most 4 instructions.  */
   3863       if (count >= 8 && !seen_it)
   3864 	return;
   3865     }
   3866   /* We found an IT instruction.  */
   3867   ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
   3868   if ((ifthen_state & 0xf) == 0)
   3869     ifthen_state = 0;
   3870 }
   3871 
   3872 /* NOTE: There are no checks in these routines that
   3873    the relevant number of data bytes exist.  */
   3874 
   3875 int
   3876 print_insn_arm (bfd_vma pc, struct disassemble_info *info)
   3877 {
   3878   unsigned char b[4];
   3879   long		given;
   3880   int           status;
   3881   int           is_thumb = FALSE;
   3882   int           is_data = FALSE;
   3883   unsigned int	size = 4;
   3884   void	 	(*printer) (bfd_vma, struct disassemble_info *, long);
   3885 #if 0
   3886   bfd_boolean   found = FALSE;
   3887 
   3888   if (info->disassembler_options)
   3889     {
   3890       parse_disassembler_options (info->disassembler_options);
   3891 
   3892       /* To avoid repeated parsing of these options, we remove them here.  */
   3893       info->disassembler_options = NULL;
   3894     }
   3895 
   3896   /* First check the full symtab for a mapping symbol, even if there
   3897      are no usable non-mapping symbols for this address.  */
   3898   if (info->symtab != NULL
   3899       && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
   3900     {
   3901       bfd_vma addr;
   3902       int n;
   3903       int last_sym = -1;
   3904       enum map_type type = MAP_ARM;
   3905 
   3906       if (pc <= last_mapping_addr)
   3907 	last_mapping_sym = -1;
   3908       is_thumb = (last_type == MAP_THUMB);
   3909       found = FALSE;
   3910       /* Start scanning at the start of the function, or wherever
   3911 	 we finished last time.  */
   3912       n = info->symtab_pos + 1;
   3913       if (n < last_mapping_sym)
   3914 	n = last_mapping_sym;
   3915 
   3916       /* Scan up to the location being disassembled.  */
   3917       for (; n < info->symtab_size; n++)
   3918 	{
   3919 	  addr = bfd_asymbol_value (info->symtab[n]);
   3920 	  if (addr > pc)
   3921 	    break;
   3922 	  if ((info->section == NULL
   3923 	       || info->section == info->symtab[n]->section)
   3924 	      && get_sym_code_type (info, n, &type))
   3925 	    {
   3926 	      last_sym = n;
   3927 	      found = TRUE;
   3928 	    }
   3929 	}
   3930 
   3931       if (!found)
   3932 	{
   3933 	  n = info->symtab_pos;
   3934 	  if (n < last_mapping_sym - 1)
   3935 	    n = last_mapping_sym - 1;
   3936 
   3937 	  /* No mapping symbol found at this address.  Look backwards
   3938 	     for a preceeding one.  */
   3939 	  for (; n >= 0; n--)
   3940 	    {
   3941 	      if (get_sym_code_type (info, n, &type))
   3942 		{
   3943 		  last_sym = n;
   3944 		  found = TRUE;
   3945 		  break;
   3946 		}
   3947 	    }
   3948 	}
   3949 
   3950       last_mapping_sym = last_sym;
   3951       last_type = type;
   3952       is_thumb = (last_type == MAP_THUMB);
   3953       is_data = (last_type == MAP_DATA);
   3954 
   3955       /* Look a little bit ahead to see if we should print out
   3956 	 two or four bytes of data.  If there's a symbol,
   3957 	 mapping or otherwise, after two bytes then don't
   3958 	 print more.  */
   3959       if (is_data)
   3960 	{
   3961 	  size = 4 - (pc & 3);
   3962 	  for (n = last_sym + 1; n < info->symtab_size; n++)
   3963 	    {
   3964 	      addr = bfd_asymbol_value (info->symtab[n]);
   3965 	      if (addr > pc)
   3966 		{
   3967 		  if (addr - pc < size)
   3968 		    size = addr - pc;
   3969 		  break;
   3970 		}
   3971 	    }
   3972 	  /* If the next symbol is after three bytes, we need to
   3973 	     print only part of the data, so that we can use either
   3974 	     .byte or .short.  */
   3975 	  if (size == 3)
   3976 	    size = (pc & 1) ? 1 : 2;
   3977 	}
   3978     }
   3979 
   3980   if (info->symbols != NULL)
   3981     {
   3982       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
   3983 	{
   3984 	  coff_symbol_type * cs;
   3985 
   3986 	  cs = coffsymbol (*info->symbols);
   3987 	  is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
   3988 		      || cs->native->u.syment.n_sclass == C_THUMBSTAT
   3989 		      || cs->native->u.syment.n_sclass == C_THUMBLABEL
   3990 		      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
   3991 		      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
   3992 	}
   3993       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
   3994 	       && !found)
   3995 	{
   3996 	  /* If no mapping symbol has been found then fall back to the type
   3997 	     of the function symbol.  */
   3998 	  elf_symbol_type *  es;
   3999 	  unsigned int       type;
   4000 
   4001 	  es = *(elf_symbol_type **)(info->symbols);
   4002 	  type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
   4003 
   4004 	  is_thumb = (type == STT_ARM_TFUNC) || (type == STT_ARM_16BIT);
   4005 	}
   4006     }
   4007 #else
   4008   int little;
   4009 
   4010   little = (info->endian == BFD_ENDIAN_LITTLE);
   4011   is_thumb |= (pc & 1);
   4012   pc &= ~(bfd_vma)1;
   4013 #endif
   4014 
   4015   if (force_thumb)
   4016     is_thumb = TRUE;
   4017 
   4018   info->bytes_per_line = 4;
   4019 
   4020   if (is_data)
   4021     {
   4022       int i;
   4023 
   4024       /* size was already set above.  */
   4025       info->bytes_per_chunk = size;
   4026       printer = print_insn_data;
   4027 
   4028       status = info->read_memory_func (pc, (bfd_byte *)b, size, info);
   4029       given = 0;
   4030       if (little)
   4031 	for (i = size - 1; i >= 0; i--)
   4032 	  given = b[i] | (given << 8);
   4033       else
   4034 	for (i = 0; i < (int) size; i++)
   4035 	  given = b[i] | (given << 8);
   4036     }
   4037   else if (!is_thumb)
   4038     {
   4039       /* In ARM mode endianness is a straightforward issue: the instruction
   4040 	 is four bytes long and is either ordered 0123 or 3210.  */
   4041       printer = print_insn_arm_internal;
   4042       info->bytes_per_chunk = 4;
   4043       size = 4;
   4044 
   4045       status = info->read_memory_func (pc, (bfd_byte *)b, 4, info);
   4046       if (little)
   4047 	given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
   4048       else
   4049 	given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
   4050     }
   4051   else
   4052     {
   4053       /* In Thumb mode we have the additional wrinkle of two
   4054 	 instruction lengths.  Fortunately, the bits that determine
   4055 	 the length of the current instruction are always to be found
   4056 	 in the first two bytes.  */
   4057       printer = print_insn_thumb16;
   4058       info->bytes_per_chunk = 2;
   4059       size = 2;
   4060 
   4061       status = info->read_memory_func (pc, (bfd_byte *)b, 2, info);
   4062       if (little)
   4063 	given = (b[0]) | (b[1] << 8);
   4064       else
   4065 	given = (b[1]) | (b[0] << 8);
   4066 
   4067       if (!status)
   4068 	{
   4069 	  /* These bit patterns signal a four-byte Thumb
   4070 	     instruction.  */
   4071 	  if ((given & 0xF800) == 0xF800
   4072 	      || (given & 0xF800) == 0xF000
   4073 	      || (given & 0xF800) == 0xE800)
   4074 	    {
   4075 	      status = info->read_memory_func (pc + 2, (bfd_byte *)b, 2, info);
   4076 	      if (little)
   4077 		given = (b[0]) | (b[1] << 8) | (given << 16);
   4078 	      else
   4079 		given = (b[1]) | (b[0] << 8) | (given << 16);
   4080 
   4081 	      printer = print_insn_thumb32;
   4082 	      size = 4;
   4083 	    }
   4084 	}
   4085 
   4086       if (ifthen_address != pc)
   4087 	find_ifthen_state(pc, info, little);
   4088 
   4089       if (ifthen_state)
   4090 	{
   4091 	  if ((ifthen_state & 0xf) == 0x8)
   4092 	    ifthen_next_state = 0;
   4093 	  else
   4094 	    ifthen_next_state = (ifthen_state & 0xe0)
   4095 				| ((ifthen_state & 0xf) << 1);
   4096 	}
   4097     }
   4098 
   4099   if (status)
   4100     {
   4101       info->memory_error_func (status, pc, info);
   4102       return -1;
   4103     }
   4104   if (info->flags & INSN_HAS_RELOC)
   4105     /* If the instruction has a reloc associated with it, then
   4106        the offset field in the instruction will actually be the
   4107        addend for the reloc.  (We are using REL type relocs).
   4108        In such cases, we can ignore the pc when computing
   4109        addresses, since the addend is not currently pc-relative.  */
   4110     pc = 0;
   4111 
   4112   printer (pc, info, given);
   4113 
   4114   if (is_thumb)
   4115     {
   4116       ifthen_state = ifthen_next_state;
   4117       ifthen_address += size;
   4118     }
   4119   return size;
   4120 }
   4121