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