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