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