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