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