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