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