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