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