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