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