Automatic date update in version.in
[deliverable/binutils-gdb.git] / opcodes / arm-dis.c
1 /* Instruction printing code for the ARM
2 Copyright (C) 1994-2021 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 #include <assert.h>
25
26 #include "disassemble.h"
27 #include "opcode/arm.h"
28 #include "opintl.h"
29 #include "safe-ctype.h"
30 #include "libiberty.h"
31 #include "floatformat.h"
32
33 /* FIXME: This shouldn't be done here. */
34 #include "coff/internal.h"
35 #include "libcoff.h"
36 #include "bfd.h"
37 #include "elf-bfd.h"
38 #include "elf/internal.h"
39 #include "elf/arm.h"
40 #include "mach-o.h"
41
42 /* Cached mapping symbol state. */
43 enum map_type
44 {
45 MAP_ARM,
46 MAP_THUMB,
47 MAP_DATA
48 };
49
50 struct arm_private_data
51 {
52 /* The features to use when disassembling optional instructions. */
53 arm_feature_set features;
54
55 /* Track the last type (although this doesn't seem to be useful) */
56 enum map_type last_type;
57
58 /* Tracking symbol table information */
59 int last_mapping_sym;
60
61 /* The end range of the current range being disassembled. */
62 bfd_vma last_stop_offset;
63 bfd_vma last_mapping_addr;
64 };
65
66 enum mve_instructions
67 {
68 MVE_VPST,
69 MVE_VPT_FP_T1,
70 MVE_VPT_FP_T2,
71 MVE_VPT_VEC_T1,
72 MVE_VPT_VEC_T2,
73 MVE_VPT_VEC_T3,
74 MVE_VPT_VEC_T4,
75 MVE_VPT_VEC_T5,
76 MVE_VPT_VEC_T6,
77 MVE_VCMP_FP_T1,
78 MVE_VCMP_FP_T2,
79 MVE_VCMP_VEC_T1,
80 MVE_VCMP_VEC_T2,
81 MVE_VCMP_VEC_T3,
82 MVE_VCMP_VEC_T4,
83 MVE_VCMP_VEC_T5,
84 MVE_VCMP_VEC_T6,
85 MVE_VDUP,
86 MVE_VEOR,
87 MVE_VFMAS_FP_SCALAR,
88 MVE_VFMA_FP_SCALAR,
89 MVE_VFMA_FP,
90 MVE_VFMS_FP,
91 MVE_VHADD_T1,
92 MVE_VHADD_T2,
93 MVE_VHSUB_T1,
94 MVE_VHSUB_T2,
95 MVE_VRHADD,
96 MVE_VLD2,
97 MVE_VLD4,
98 MVE_VST2,
99 MVE_VST4,
100 MVE_VLDRB_T1,
101 MVE_VLDRH_T2,
102 MVE_VLDRB_T5,
103 MVE_VLDRH_T6,
104 MVE_VLDRW_T7,
105 MVE_VSTRB_T1,
106 MVE_VSTRH_T2,
107 MVE_VSTRB_T5,
108 MVE_VSTRH_T6,
109 MVE_VSTRW_T7,
110 MVE_VLDRB_GATHER_T1,
111 MVE_VLDRH_GATHER_T2,
112 MVE_VLDRW_GATHER_T3,
113 MVE_VLDRD_GATHER_T4,
114 MVE_VLDRW_GATHER_T5,
115 MVE_VLDRD_GATHER_T6,
116 MVE_VSTRB_SCATTER_T1,
117 MVE_VSTRH_SCATTER_T2,
118 MVE_VSTRW_SCATTER_T3,
119 MVE_VSTRD_SCATTER_T4,
120 MVE_VSTRW_SCATTER_T5,
121 MVE_VSTRD_SCATTER_T6,
122 MVE_VCVT_FP_FIX_VEC,
123 MVE_VCVT_BETWEEN_FP_INT,
124 MVE_VCVT_FP_HALF_FP,
125 MVE_VCVT_FROM_FP_TO_INT,
126 MVE_VRINT_FP,
127 MVE_VMOV_HFP_TO_GP,
128 MVE_VMOV_GP_TO_VEC_LANE,
129 MVE_VMOV_IMM_TO_VEC,
130 MVE_VMOV_VEC_TO_VEC,
131 MVE_VMOV2_VEC_LANE_TO_GP,
132 MVE_VMOV2_GP_TO_VEC_LANE,
133 MVE_VMOV_VEC_LANE_TO_GP,
134 MVE_VMVN_IMM,
135 MVE_VMVN_REG,
136 MVE_VORR_IMM,
137 MVE_VORR_REG,
138 MVE_VORN,
139 MVE_VBIC_IMM,
140 MVE_VBIC_REG,
141 MVE_VMOVX,
142 MVE_VMOVL,
143 MVE_VMOVN,
144 MVE_VMULL_INT,
145 MVE_VMULL_POLY,
146 MVE_VQDMULL_T1,
147 MVE_VQDMULL_T2,
148 MVE_VQMOVN,
149 MVE_VQMOVUN,
150 MVE_VADDV,
151 MVE_VMLADAV_T1,
152 MVE_VMLADAV_T2,
153 MVE_VMLALDAV,
154 MVE_VMLAS,
155 MVE_VADDLV,
156 MVE_VMLSDAV_T1,
157 MVE_VMLSDAV_T2,
158 MVE_VMLSLDAV,
159 MVE_VRMLALDAVH,
160 MVE_VRMLSLDAVH,
161 MVE_VQDMLADH,
162 MVE_VQRDMLADH,
163 MVE_VQDMLAH,
164 MVE_VQRDMLAH,
165 MVE_VQDMLASH,
166 MVE_VQRDMLASH,
167 MVE_VQDMLSDH,
168 MVE_VQRDMLSDH,
169 MVE_VQDMULH_T1,
170 MVE_VQRDMULH_T2,
171 MVE_VQDMULH_T3,
172 MVE_VQRDMULH_T4,
173 MVE_VDDUP,
174 MVE_VDWDUP,
175 MVE_VIWDUP,
176 MVE_VIDUP,
177 MVE_VCADD_FP,
178 MVE_VCADD_VEC,
179 MVE_VHCADD,
180 MVE_VCMLA_FP,
181 MVE_VCMUL_FP,
182 MVE_VQRSHL_T1,
183 MVE_VQRSHL_T2,
184 MVE_VQRSHRN,
185 MVE_VQRSHRUN,
186 MVE_VQSHL_T1,
187 MVE_VQSHL_T2,
188 MVE_VQSHLU_T3,
189 MVE_VQSHL_T4,
190 MVE_VQSHRN,
191 MVE_VQSHRUN,
192 MVE_VRSHL_T1,
193 MVE_VRSHL_T2,
194 MVE_VRSHR,
195 MVE_VRSHRN,
196 MVE_VSHL_T1,
197 MVE_VSHL_T2,
198 MVE_VSHL_T3,
199 MVE_VSHLC,
200 MVE_VSHLL_T1,
201 MVE_VSHLL_T2,
202 MVE_VSHR,
203 MVE_VSHRN,
204 MVE_VSLI,
205 MVE_VSRI,
206 MVE_VADC,
207 MVE_VABAV,
208 MVE_VABD_FP,
209 MVE_VABD_VEC,
210 MVE_VABS_FP,
211 MVE_VABS_VEC,
212 MVE_VADD_FP_T1,
213 MVE_VADD_FP_T2,
214 MVE_VADD_VEC_T1,
215 MVE_VADD_VEC_T2,
216 MVE_VSBC,
217 MVE_VSUB_FP_T1,
218 MVE_VSUB_FP_T2,
219 MVE_VSUB_VEC_T1,
220 MVE_VSUB_VEC_T2,
221 MVE_VAND,
222 MVE_VBRSR,
223 MVE_VCLS,
224 MVE_VCLZ,
225 MVE_VCTP,
226 MVE_VMAX,
227 MVE_VMAXA,
228 MVE_VMAXNM_FP,
229 MVE_VMAXNMA_FP,
230 MVE_VMAXNMV_FP,
231 MVE_VMAXNMAV_FP,
232 MVE_VMAXV,
233 MVE_VMAXAV,
234 MVE_VMIN,
235 MVE_VMINA,
236 MVE_VMINNM_FP,
237 MVE_VMINNMA_FP,
238 MVE_VMINNMV_FP,
239 MVE_VMINNMAV_FP,
240 MVE_VMINV,
241 MVE_VMINAV,
242 MVE_VMLA,
243 MVE_VMUL_FP_T1,
244 MVE_VMUL_FP_T2,
245 MVE_VMUL_VEC_T1,
246 MVE_VMUL_VEC_T2,
247 MVE_VMULH,
248 MVE_VRMULH,
249 MVE_VNEG_FP,
250 MVE_VNEG_VEC,
251 MVE_VPNOT,
252 MVE_VPSEL,
253 MVE_VQABS,
254 MVE_VQADD_T1,
255 MVE_VQADD_T2,
256 MVE_VQSUB_T1,
257 MVE_VQSUB_T2,
258 MVE_VQNEG,
259 MVE_VREV16,
260 MVE_VREV32,
261 MVE_VREV64,
262 MVE_LSLL,
263 MVE_LSLLI,
264 MVE_LSRL,
265 MVE_ASRL,
266 MVE_ASRLI,
267 MVE_SQRSHRL,
268 MVE_SQRSHR,
269 MVE_UQRSHL,
270 MVE_UQRSHLL,
271 MVE_UQSHL,
272 MVE_UQSHLL,
273 MVE_URSHRL,
274 MVE_URSHR,
275 MVE_SRSHRL,
276 MVE_SRSHR,
277 MVE_SQSHLL,
278 MVE_SQSHL,
279 MVE_CINC,
280 MVE_CINV,
281 MVE_CNEG,
282 MVE_CSINC,
283 MVE_CSINV,
284 MVE_CSET,
285 MVE_CSETM,
286 MVE_CSNEG,
287 MVE_CSEL,
288 MVE_NONE
289 };
290
291 enum mve_unpredictable
292 {
293 UNPRED_IT_BLOCK, /* Unpredictable because mve insn in it block.
294 */
295 UNPRED_FCA_0_FCB_1, /* Unpredictable because fcA = 0 and
296 fcB = 1 (vpt). */
297 UNPRED_R13, /* Unpredictable because r13 (sp) or
298 r15 (sp) used. */
299 UNPRED_R15, /* Unpredictable because r15 (pc) is used. */
300 UNPRED_Q_GT_4, /* Unpredictable because
301 vec reg start > 4 (vld4/st4). */
302 UNPRED_Q_GT_6, /* Unpredictable because
303 vec reg start > 6 (vld2/st2). */
304 UNPRED_R13_AND_WB, /* Unpredictable becase gp reg = r13
305 and WB bit = 1. */
306 UNPRED_Q_REGS_EQUAL, /* Unpredictable because vector registers are
307 equal. */
308 UNPRED_OS, /* Unpredictable because offset scaled == 1. */
309 UNPRED_GP_REGS_EQUAL, /* Unpredictable because gp registers are the
310 same. */
311 UNPRED_Q_REGS_EQ_AND_SIZE_1, /* Unpredictable because q regs equal and
312 size = 1. */
313 UNPRED_Q_REGS_EQ_AND_SIZE_2, /* Unpredictable because q regs equal and
314 size = 2. */
315 UNPRED_NONE /* No unpredictable behavior. */
316 };
317
318 enum mve_undefined
319 {
320 UNDEF_SIZE, /* undefined size. */
321 UNDEF_SIZE_0, /* undefined because size == 0. */
322 UNDEF_SIZE_2, /* undefined because size == 2. */
323 UNDEF_SIZE_3, /* undefined because size == 3. */
324 UNDEF_SIZE_LE_1, /* undefined because size <= 1. */
325 UNDEF_SIZE_NOT_0, /* undefined because size != 0. */
326 UNDEF_SIZE_NOT_2, /* undefined because size != 2. */
327 UNDEF_SIZE_NOT_3, /* undefined because size != 3. */
328 UNDEF_NOT_UNS_SIZE_0, /* undefined because U == 0 and
329 size == 0. */
330 UNDEF_NOT_UNS_SIZE_1, /* undefined because U == 0 and
331 size == 1. */
332 UNDEF_NOT_UNSIGNED, /* undefined because U == 0. */
333 UNDEF_VCVT_IMM6, /* imm6 < 32. */
334 UNDEF_VCVT_FSI_IMM6, /* fsi = 0 and 32 >= imm6 <= 47. */
335 UNDEF_BAD_OP1_OP2, /* undefined with op2 = 2 and
336 op1 == (0 or 1). */
337 UNDEF_BAD_U_OP1_OP2, /* undefined with U = 1 and
338 op2 == 0 and op1 == (0 or 1). */
339 UNDEF_OP_0_BAD_CMODE, /* undefined because op == 0 and cmode
340 in {0xx1, x0x1}. */
341 UNDEF_XCHG_UNS, /* undefined because X == 1 and U == 1. */
342 UNDEF_NONE /* no undefined behavior. */
343 };
344
345 struct opcode32
346 {
347 arm_feature_set arch; /* Architecture defining this insn. */
348 unsigned long value; /* If arch is 0 then value is a sentinel. */
349 unsigned long mask; /* Recognise insn if (op & mask) == value. */
350 const char * assembler; /* How to disassemble this insn. */
351 };
352
353 struct cdeopcode32
354 {
355 arm_feature_set arch; /* Architecture defining this insn. */
356 uint8_t coproc_shift; /* coproc is this far into op. */
357 uint16_t coproc_mask; /* Length of coproc field in op. */
358 unsigned long value; /* If arch is 0 then value is a sentinel. */
359 unsigned long mask; /* Recognise insn if (op & mask) == value. */
360 const char * assembler; /* How to disassemble this insn. */
361 };
362
363 /* MVE opcodes. */
364
365 struct mopcode32
366 {
367 arm_feature_set arch; /* Architecture defining this insn. */
368 enum mve_instructions mve_op; /* Specific mve instruction for faster
369 decoding. */
370 unsigned long value; /* If arch is 0 then value is a sentinel. */
371 unsigned long mask; /* Recognise insn if (op & mask) == value. */
372 const char * assembler; /* How to disassemble this insn. */
373 };
374
375 enum isa {
376 ANY,
377 T32,
378 ARM
379 };
380
381
382 /* Shared (between Arm and Thumb mode) opcode. */
383 struct sopcode32
384 {
385 enum isa isa; /* Execution mode instruction availability. */
386 arm_feature_set arch; /* Architecture defining this insn. */
387 unsigned long value; /* If arch is 0 then value is a sentinel. */
388 unsigned long mask; /* Recognise insn if (op & mask) == value. */
389 const char * assembler; /* How to disassemble this insn. */
390 };
391
392 struct opcode16
393 {
394 arm_feature_set arch; /* Architecture defining this insn. */
395 unsigned short value, mask; /* Recognise insn if (op & mask) == value. */
396 const char *assembler; /* How to disassemble this insn. */
397 };
398
399 /* print_insn_coprocessor recognizes the following format control codes:
400
401 %% %
402
403 %c print condition code (always bits 28-31 in ARM mode)
404 %b print condition code allowing cp_num == 9
405 %q print shifter argument
406 %u print condition code (unconditional in ARM mode,
407 UNPREDICTABLE if not AL in Thumb)
408 %A print address for ldc/stc/ldf/stf instruction
409 %B print vstm/vldm register list
410 %C print vscclrm register list
411 %I print cirrus signed shift immediate: bits 0..3|4..6
412 %J print register for VLDR instruction
413 %K print address for VLDR instruction
414 %F print the COUNT field of a LFM/SFM instruction.
415 %P print floating point precision in arithmetic insn
416 %Q print floating point precision in ldf/stf insn
417 %R print floating point rounding mode
418
419 %<bitfield>c print as a condition code (for vsel)
420 %<bitfield>r print as an ARM register
421 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
422 %<bitfield>ru as %<>r but each u register must be unique.
423 %<bitfield>d print the bitfield in decimal
424 %<bitfield>k print immediate for VFPv3 conversion instruction
425 %<bitfield>x print the bitfield in hex
426 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
427 %<bitfield>f print a floating point constant if >7 else a
428 floating point register
429 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
430 %<bitfield>g print as an iWMMXt 64-bit register
431 %<bitfield>G print as an iWMMXt general purpose or control register
432 %<bitfield>D print as a NEON D register
433 %<bitfield>Q print as a NEON Q register
434 %<bitfield>V print as a NEON D or Q register
435 %<bitfield>E print a quarter-float immediate value
436
437 %y<code> print a single precision VFP reg.
438 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
439 %z<code> print a double precision VFP reg
440 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
441
442 %<bitfield>'c print specified char iff bitfield is all ones
443 %<bitfield>`c print specified char iff bitfield is all zeroes
444 %<bitfield>?ab... select from array of values in big endian order
445
446 %L print as an iWMMXt N/M width field.
447 %Z print the Immediate of a WSHUFH instruction.
448 %l like 'A' except use byte offsets for 'B' & 'H'
449 versions.
450 %i print 5-bit immediate in bits 8,3..0
451 (print "32" when 0)
452 %r print register offset address for wldt/wstr instruction. */
453
454 enum opcode_sentinel_enum
455 {
456 SENTINEL_IWMMXT_START = 1,
457 SENTINEL_IWMMXT_END,
458 SENTINEL_GENERIC_START
459 } opcode_sentinels;
460
461 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x"
462 #define UNKNOWN_INSTRUCTION_32BIT "\t\t; <UNDEFINED> instruction: %08x"
463 #define UNKNOWN_INSTRUCTION_16BIT "\t\t; <UNDEFINED> instruction: %04x"
464 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>"
465
466 /* Common coprocessor opcodes shared between Arm and Thumb-2. */
467
468 /* print_insn_cde recognizes the following format control codes:
469
470 %% %
471
472 %a print 'a' iff bit 28 is 1
473 %p print bits 8-10 as coprocessor
474 %<bitfield>d print as decimal
475 %<bitfield>r print as an ARM register
476 %<bitfield>n print as an ARM register but r15 is APSR_nzcv
477 %<bitfield>T print as an ARM register + 1
478 %<bitfield>R as %r but r13 is UNPREDICTABLE
479 %<bitfield>S as %r but rX where X > 10 is UNPREDICTABLE
480 %j print immediate taken from bits (16..21,7,0..5)
481 %k print immediate taken from bits (20..21,7,0..5).
482 %l print immediate taken from bits (20..22,7,4..5). */
483
484 /* At the moment there is only one valid position for the coprocessor number,
485 and hence that's encoded in the macro below. */
486 #define CDE_OPCODE(ARCH, VALUE, MASK, ASM) \
487 { ARCH, 8, 7, VALUE, MASK, ASM }
488 static const struct cdeopcode32 cde_opcodes[] =
489 {
490 /* Custom Datapath Extension instructions. */
491 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
492 0xee000000, 0xefc00840,
493 "cx1%a\t%p, %12-15n, #%0-5,7,16-21d"),
494 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
495 0xee000040, 0xefc00840,
496 "cx1d%a\t%p, %12-15S, %12-15T, #%0-5,7,16-21d"),
497
498 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
499 0xee400000, 0xefc00840,
500 "cx2%a\t%p, %12-15n, %16-19n, #%0-5,7,20-21d"),
501 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
502 0xee400040, 0xefc00840,
503 "cx2d%a\t%p, %12-15S, %12-15T, %16-19n, #%0-5,7,20-21d"),
504
505 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
506 0xee800000, 0xef800840,
507 "cx3%a\t%p, %0-3n, %16-19n, %12-15n, #%4-5,7,20-22d"),
508 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
509 0xee800040, 0xef800840,
510 "cx3d%a\t%p, %0-3S, %0-3T, %16-19n, %12-15n, #%4-5,7,20-22d"),
511
512 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
513 0xec200000, 0xeeb00840,
514 "vcx1%a\t%p, %12-15,22V, #%0-5,7,16-19d"),
515 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
516 0xec200040, 0xeeb00840,
517 "vcx1%a\t%p, %12-15,22V, #%0-5,7,16-19,24d"),
518
519 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
520 0xec300000, 0xeeb00840,
521 "vcx2%a\t%p, %12-15,22V, %0-3,5V, #%4,7,16-19d"),
522 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
523 0xec300040, 0xeeb00840,
524 "vcx2%a\t%p, %12-15,22V, %0-3,5V, #%4,7,16-19,24d"),
525
526 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
527 0xec800000, 0xee800840,
528 "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, #%4,20-21d"),
529 CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
530 0xec800040, 0xee800840,
531 "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, #%4,20-21,24d"),
532
533 CDE_OPCODE (ARM_FEATURE_CORE_LOW (0), 0, 0, 0)
534
535 };
536
537 static const struct sopcode32 coprocessor_opcodes[] =
538 {
539 /* XScale instructions. */
540 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
541 0x0e200010, 0x0fff0ff0,
542 "mia%c\tacc0, %0-3r, %12-15r"},
543 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
544 0x0e280010, 0x0fff0ff0,
545 "miaph%c\tacc0, %0-3r, %12-15r"},
546 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
547 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
548 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
549 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
550 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
551 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
552
553 /* Intel Wireless MMX technology instructions. */
554 {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" },
555 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
556 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
557 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
558 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
559 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
560 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
561 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
562 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
563 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
564 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
565 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
566 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
567 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
568 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
569 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
570 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
571 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
572 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
573 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
574 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
575 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
576 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
577 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
578 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
579 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
580 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
581 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
582 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
583 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
584 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
585 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
586 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
587 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
588 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
589 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
590 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
591 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
592 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
593 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
594 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
595 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
596 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
597 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
598 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
599 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
600 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
601 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
602 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
603 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
604 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
605 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
606 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
607 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
608 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
609 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
610 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
611 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
612 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
613 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
614 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
615 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
616 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
617 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
618 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
619 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
620 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
621 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
622 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
623 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
624 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
625 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
626 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
627 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
628 0x0e800120, 0x0f800ff0,
629 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
630 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
631 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
632 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
633 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
634 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
635 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
636 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
637 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
638 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
639 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
640 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
641 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
642 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
643 0x0e8000a0, 0x0f800ff0,
644 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
645 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
646 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
647 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
648 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
649 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
650 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
651 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
652 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
653 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
654 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
655 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
656 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
657 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
658 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
659 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
660 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
661 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
662 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
663 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
664 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
665 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
666 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
667 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
668 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
669 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
670 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
671 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
672 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
673 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
674 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
675 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
676 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
677 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
678 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
679 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
680 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
681 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
682 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
683 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
684 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
685 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
686 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
687 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
688 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
689 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
690 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
691 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
692 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
693 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
694 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
695 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
696 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
697 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
698 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
699 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
700 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
701 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
702 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
703 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
704 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
705 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
706 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
707 {ANY, ARM_FEATURE_CORE_LOW (0),
708 SENTINEL_IWMMXT_END, 0, "" },
709
710 /* Floating point coprocessor (FPA) instructions. */
711 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
712 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
713 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
714 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
715 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
716 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
717 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
718 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
719 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
720 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
721 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
722 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
723 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
724 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
725 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
726 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
727 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
728 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
729 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
730 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
731 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
732 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
733 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
734 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
735 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
736 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
737 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
738 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
739 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
740 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
741 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
742 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
743 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
744 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
745 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
746 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
747 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
748 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
749 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
750 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
751 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
752 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
753 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
754 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
755 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
756 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
757 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
758 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
759 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
760 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
761 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
762 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
763 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
764 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
765 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
766 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
767 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
768 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
769 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
770 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
771 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
772 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
773 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
774 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
775 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
776 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
777 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
778 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
779 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
780 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
781 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
782 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
783 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
784 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
785 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
786 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
787 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
788 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
789 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
790 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
791 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
792 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
793 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
794 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
795 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
796 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
797
798 /* Armv8.1-M Mainline instructions. */
799 {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
800 0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
801 {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
802 0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
803
804 /* ARMv8-M Mainline Security Extensions instructions. */
805 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
806 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
807 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
808 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
809
810 /* Register load/store. */
811 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
812 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
813 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
814 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
815 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
816 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
817 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
818 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
819 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
820 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
821 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
822 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
823 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
824 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
825 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
826 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
827 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
828 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
829 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
830 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
831 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
832 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
833 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
834 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
835 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
836 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
837 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
838 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
839 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
840 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
841 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
842 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
843 {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
844 0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
845 {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
846 0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
847
848 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
849 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
850 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
851 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
852 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
853 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
854 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
855 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
856
857 /* Data transfer between ARM and NEON registers. */
858 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
859 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
860 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
861 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
862 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
863 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
864 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
865 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
866 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
867 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
868 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
869 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
870 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
871 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
872 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
873 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
874 /* Half-precision conversion instructions. */
875 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
876 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
877 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
878 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
879 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
880 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
881 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
882 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
883
884 /* Floating point coprocessor (VFP) instructions. */
885 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
886 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
887 {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
888 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
889 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
890 0x0ee20a10, 0x0fff0fff, "vmsr%c\tfpscr_nzcvqc, %12-15r"},
891 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
892 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
893 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
894 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
895 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
896 0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
897 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
898 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
899 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
900 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
901 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
902 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
903 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
904 0x0eec0a10, 0x0fff0fff, "vmsr%c\tvpr, %12-15r"},
905 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
906 0x0eed0a10, 0x0fff0fff, "vmsr%c\tp0, %12-15r"},
907 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
908 0x0eee0a10, 0x0fff0fff, "vmsr%c\tfpcxt_ns, %12-15r"},
909 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
910 0x0eef0a10, 0x0fff0fff, "vmsr%c\tfpcxt_s, %12-15r"},
911 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
912 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
913 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
914 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
915 {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
916 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
917 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
918 0x0ef20a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr_nzcvqc"},
919 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
920 0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
921 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
922 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
923 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
924 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
925 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
926 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
927 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
928 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
929 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
930 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
931 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
932 0x0efc0a10, 0x0fff0fff, "vmrs%c\t%12-15r, vpr"},
933 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
934 0x0efd0a10, 0x0fff0fff, "vmrs%c\t%12-15r, p0"},
935 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
936 0x0efe0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_ns"},
937 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
938 0x0eff0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_s"},
939 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
940 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
941 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
942 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
943 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
944 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
945 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
946 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
947 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
948 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
949 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
950 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
951 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
952 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
953 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
954 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
955 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
956 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
957 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
958 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
959 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
960 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
961 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
962 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
963 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
964 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
965 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
966 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
967 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
968 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
969 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
970 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
971 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
972 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
973 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
974 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
975 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
976 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
977 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
978 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
979 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
980 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
981 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
982 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
983 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
984 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
985 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
986 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
987 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
988 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
989 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
990 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
991 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
992 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
993 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
994 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
995 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
996 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
997 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
998 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
999 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
1000 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
1001 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1002 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
1003 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1004 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
1005 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1006 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
1007 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1008 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
1009 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1010 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
1011 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1012 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
1013 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1014 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
1015 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1016 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
1017 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1018 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
1019 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1020 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
1021 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1022 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
1023 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1024 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
1025 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1026 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
1027 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1028 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
1029 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1030 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
1031 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1032 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
1033 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1034 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
1035 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1036 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
1037 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1038 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
1039 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1040 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
1041 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1042 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
1043
1044 /* Cirrus coprocessor instructions. */
1045 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1046 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
1047 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1048 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
1049 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1050 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
1051 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1052 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
1053 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1054 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
1055 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1056 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
1057 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1058 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
1059 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1060 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
1061 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1062 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
1063 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1064 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
1065 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1066 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
1067 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1068 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
1069 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1070 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
1071 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1072 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
1073 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1074 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
1075 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1076 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
1077 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1078 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
1079 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1080 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
1081 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1082 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
1083 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1084 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
1085 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1086 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
1087 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1088 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
1089 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1090 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
1091 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1092 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
1093 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1094 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
1095 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1096 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
1097 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1098 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
1099 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1100 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
1101 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1102 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
1103 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1104 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
1105 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1106 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
1107 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1108 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
1109 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1110 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
1111 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1112 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
1113 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1114 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
1115 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1116 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
1117 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1118 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
1119 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1120 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
1121 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1122 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
1123 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1124 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
1125 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1126 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
1127 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1128 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
1129 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1130 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
1131 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1132 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
1133 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1134 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
1135 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1136 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
1137 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1138 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
1139 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1140 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
1141 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1142 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
1143 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1144 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
1145 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1146 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
1147 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1148 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
1149 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1150 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
1151 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1152 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
1153 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1154 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
1155 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1156 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
1157 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1158 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
1159 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1160 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
1161 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1162 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
1163 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1164 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
1165 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1166 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
1167 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1168 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
1169 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1170 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1171 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1172 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1173 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1174 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1175 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1176 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1177 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1178 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1179 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1180 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1181 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1182 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
1183 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1184 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
1185 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1186 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
1187 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1188 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
1189 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1190 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1191 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1192 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1193 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1194 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1195 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1196 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1197 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1198 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1199 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1200 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1201 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1202 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1203 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1204 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1205 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1206 0x0e000600, 0x0ff00f10,
1207 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1208 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1209 0x0e100600, 0x0ff00f10,
1210 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1211 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1212 0x0e200600, 0x0ff00f10,
1213 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1214 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1215 0x0e300600, 0x0ff00f10,
1216 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1217
1218 /* VFP Fused multiply add instructions. */
1219 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1220 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
1221 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1222 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
1223 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1224 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
1225 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1226 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
1227 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1228 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
1229 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1230 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
1231 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1232 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
1233 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1234 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
1235
1236 /* FP v5. */
1237 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1238 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
1239 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1240 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
1241 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1242 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
1243 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1244 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
1245 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1246 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
1247 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1248 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
1249 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1250 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
1251 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1252 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
1253 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1254 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
1255 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1256 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
1257 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1258 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
1259 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1260 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
1261
1262 {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" },
1263 /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8. */
1264 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1265 0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1266 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1267 0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1268 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1269 0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1270 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1271 0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1272 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1273 0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1274 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1275 0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1276 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1277 0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
1278 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1279 0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
1280 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1281 0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
1282 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1283 0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
1284
1285 /* BFloat16 instructions. */
1286 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1287 0x0eb30940, 0x0fbf0f50, "vcvt%7?tb%b.bf16.f32\t%y1, %y0"},
1288
1289 /* Dot Product instructions in the space of coprocessor 13. */
1290 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
1291 0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
1292 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
1293 0xfe200d00, 0xff200f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
1294
1295 /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */
1296 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1297 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1298 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1299 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1300 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1301 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1302 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1303 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1304 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1305 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1306 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1307 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1308 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1309 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1310 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1311 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1312
1313 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
1314 cp_num: bit <11:8> == 0b1001.
1315 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */
1316 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1317 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
1318 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1319 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
1320 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1321 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
1322 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1323 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
1324 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1325 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
1326 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1327 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
1328 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1329 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
1330 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1331 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
1332 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1333 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
1334 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1335 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
1336 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1337 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
1338 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1339 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
1340 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1341 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
1342 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1343 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
1344 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1345 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
1346 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1347 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
1348 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1349 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
1350 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1351 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
1352 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1353 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
1354 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1355 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
1356 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1357 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
1358 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1359 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
1360 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1361 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
1362 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1363 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
1364 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1365 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
1366 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1367 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
1368 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1369 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
1370 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1371 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
1372 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1373 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
1374 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1375 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
1376 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1377 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
1378 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1379 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
1380 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1381 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
1382 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1383 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
1384 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1385 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
1386
1387 /* ARMv8.3 javascript conversion instruction. */
1388 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1389 0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
1390
1391 {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1392 };
1393
1394 /* Generic coprocessor instructions. These are only matched if a more specific
1395 SIMD or co-processor instruction does not match first. */
1396
1397 static const struct sopcode32 generic_coprocessor_opcodes[] =
1398 {
1399 /* Generic coprocessor instructions. */
1400 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
1401 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
1402 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
1403 0x0c500000, 0x0ff00000,
1404 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1405 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1406 0x0e000000, 0x0f000010,
1407 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1408 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1409 0x0e10f010, 0x0f10f010,
1410 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
1411 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1412 0x0e100010, 0x0f100010,
1413 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1414 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1415 0x0e000010, 0x0f100010,
1416 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1417 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1418 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
1419 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1420 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
1421
1422 /* V6 coprocessor instructions. */
1423 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
1424 0xfc500000, 0xfff00000,
1425 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1426 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
1427 0xfc400000, 0xfff00000,
1428 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
1429
1430 /* V5 coprocessor instructions. */
1431 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1432 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1433 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1434 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1435 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1436 0xfe000000, 0xff000010,
1437 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1438 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1439 0xfe000010, 0xff100010,
1440 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1441 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1442 0xfe100010, 0xff100010,
1443 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1444
1445 {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1446 };
1447
1448 /* Neon opcode table: This does not encode the top byte -- that is
1449 checked by the print_insn_neon routine, as it depends on whether we are
1450 doing thumb32 or arm32 disassembly. */
1451
1452 /* print_insn_neon recognizes the following format control codes:
1453
1454 %% %
1455
1456 %c print condition code
1457 %u print condition code (unconditional in ARM mode,
1458 UNPREDICTABLE if not AL in Thumb)
1459 %A print v{st,ld}[1234] operands
1460 %B print v{st,ld}[1234] any one operands
1461 %C print v{st,ld}[1234] single->all operands
1462 %D print scalar
1463 %E print vmov, vmvn, vorr, vbic encoded constant
1464 %F print vtbl,vtbx register list
1465
1466 %<bitfield>r print as an ARM register
1467 %<bitfield>d print the bitfield in decimal
1468 %<bitfield>e print the 2^N - bitfield in decimal
1469 %<bitfield>D print as a NEON D register
1470 %<bitfield>Q print as a NEON Q register
1471 %<bitfield>R print as a NEON D or Q register
1472 %<bitfield>Sn print byte scaled width limited by n
1473 %<bitfield>Tn print short scaled width limited by n
1474 %<bitfield>Un print long scaled width limited by n
1475
1476 %<bitfield>'c print specified char iff bitfield is all ones
1477 %<bitfield>`c print specified char iff bitfield is all zeroes
1478 %<bitfield>?ab... select from array of values in big endian order. */
1479
1480 static const struct opcode32 neon_opcodes[] =
1481 {
1482 /* Extract. */
1483 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1484 0xf2b00840, 0xffb00850,
1485 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1486 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1487 0xf2b00000, 0xffb00810,
1488 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1489
1490 /* Data transfer between ARM and NEON registers. */
1491 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1492 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
1493 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1494 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
1495 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1496 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
1497 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1498 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
1499 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1500 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
1501 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1502 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
1503
1504 /* Move data element to all lanes. */
1505 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1506 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
1507 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1508 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
1509 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1510 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
1511
1512 /* Table lookup. */
1513 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1514 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
1515 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1516 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
1517
1518 /* Half-precision conversions. */
1519 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
1520 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
1521 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
1522 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
1523
1524 /* NEON fused multiply add instructions. */
1525 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
1526 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1527 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1528 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1529 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
1530 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1531 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1532 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1533
1534 /* BFloat16 instructions. */
1535 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1536 0xfc000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1537 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1538 0xfe000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1539 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1540 0xfc000c40, 0xffb00f50, "vmmla.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1541 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1542 0xf3b60640, 0xffbf0fd0, "vcvt%c.bf16.f32\t%12-15,22D, %0-3,5Q"},
1543 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1544 0xfc300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1545 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1546 0xfe300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-2D[%3,5d]"},
1547
1548 /* Matrix Multiply instructions. */
1549 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1550 0xfc200c40, 0xffb00f50, "vsmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1551 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1552 0xfc200c50, 0xffb00f50, "vummla.u8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1553 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1554 0xfca00c40, 0xffb00f50, "vusmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1555 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1556 0xfca00d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1557 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1558 0xfe800d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1559 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1560 0xfe800d10, 0xffb00f10, "vsudot.u8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1561
1562 /* Two registers, miscellaneous. */
1563 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1564 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
1565 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1566 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
1567 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1568 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
1569 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1570 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
1571 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1572 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
1573 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1574 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
1575 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1576 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
1577 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1578 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
1579 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1580 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
1581 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1582 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
1583 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1584 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
1585 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1586 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
1587 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1588 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
1589 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1590 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
1591 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1592 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
1593 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1594 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
1595 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1596 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
1597 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1598 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
1599 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1600 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1601 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1602 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1603 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1604 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
1605 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1606 0xf3b20300, 0xffb30fd0,
1607 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
1608 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1609 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1610 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1611 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1612 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1613 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1614 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1615 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1616 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1617 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1618 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1619 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1620 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1621 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1622 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1623 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1624 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1625 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
1626 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1627 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1628 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1629 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1630 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1631 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1632 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1633 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1634 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1635 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1636 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1637 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1638 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1639 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1640 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1641 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1642 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1643 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1644 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1645 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1646 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1647 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1648 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1649 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1650 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1651 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1652 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1653 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1654 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1655 0xf3bb0600, 0xffbf0e10,
1656 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
1657 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1658 0xf3b70600, 0xffbf0e10,
1659 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
1660
1661 /* Three registers of the same length. */
1662 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1663 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1664 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1665 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1666 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1667 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1668 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1669 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1670 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1671 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1672 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1673 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1674 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1675 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1676 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1677 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1678 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1679 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1680 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1681 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1682 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1683 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1684 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1685 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1686 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1687 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1688 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1689 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1690 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1691 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1692 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1693 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1694 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1695 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1696 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1697 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1698 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1699 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1700 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1701 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1702 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1703 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1704 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1705 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1706 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1707 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1708 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1709 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1710 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1711 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1712 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1713 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1714 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1715 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1716 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1717 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1718 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1719 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1720 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1721 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1722 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1723 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1724 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1725 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1726 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1727 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1728 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1729 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1730 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1731 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1732 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1733 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1734 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1735 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1736 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1737 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1738 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1739 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1740 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1741 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1742 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1743 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1744 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1745 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1746 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1747 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1748 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1749 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1750 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1751 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1752 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1753 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1754 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1755 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1756 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1757 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1758 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1759 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1760 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1761 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1762 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1763 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1764 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1765 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1766 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1767 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1768 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1769 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1770 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1771 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1772 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1773 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1774 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1775 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1776 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1777 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1778 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1779 0xf2000b00, 0xff800f10,
1780 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1781 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1782 0xf2000b10, 0xff800f10,
1783 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1784 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1785 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1786 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1787 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1788 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1789 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1790 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1791 0xf3000b00, 0xff800f10,
1792 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1793 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1794 0xf2000000, 0xfe800f10,
1795 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1796 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1797 0xf2000010, 0xfe800f10,
1798 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1799 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1800 0xf2000100, 0xfe800f10,
1801 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1802 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1803 0xf2000200, 0xfe800f10,
1804 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1805 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1806 0xf2000210, 0xfe800f10,
1807 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1808 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1809 0xf2000300, 0xfe800f10,
1810 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1811 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1812 0xf2000310, 0xfe800f10,
1813 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1814 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1815 0xf2000400, 0xfe800f10,
1816 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1817 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1818 0xf2000410, 0xfe800f10,
1819 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1820 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1821 0xf2000500, 0xfe800f10,
1822 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1823 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1824 0xf2000510, 0xfe800f10,
1825 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1826 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1827 0xf2000600, 0xfe800f10,
1828 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1829 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1830 0xf2000610, 0xfe800f10,
1831 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1832 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1833 0xf2000700, 0xfe800f10,
1834 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1835 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1836 0xf2000710, 0xfe800f10,
1837 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1838 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1839 0xf2000910, 0xfe800f10,
1840 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1841 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1842 0xf2000a00, 0xfe800f10,
1843 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1844 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1845 0xf2000a10, 0xfe800f10,
1846 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1847 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
1848 0xf3000b10, 0xff800f10,
1849 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1850 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
1851 0xf3000c10, 0xff800f10,
1852 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1853
1854 /* One register and an immediate value. */
1855 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1856 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
1857 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1858 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
1859 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1860 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
1861 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1862 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
1863 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1864 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
1865 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1866 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
1867 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1868 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
1869 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1870 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
1871 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1872 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
1873 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1874 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
1875 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1876 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
1877 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1878 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
1879 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1880 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
1881
1882 /* Two registers and a shift amount. */
1883 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1884 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1885 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1886 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1887 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1888 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1889 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1890 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1891 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1892 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1893 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1894 0xf2880950, 0xfeb80fd0,
1895 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1896 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1897 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
1898 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1899 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1900 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1901 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1902 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1903 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1904 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1905 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
1906 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1907 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
1908 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1909 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
1910 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1911 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1912 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1913 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1914 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1915 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1916 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1917 0xf2900950, 0xfeb00fd0,
1918 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1919 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1920 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
1921 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1922 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1923 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1924 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1925 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1926 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1927 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1928 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1929 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1930 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1931 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1932 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1933 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1934 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1935 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1936 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1937 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1938 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
1939 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1940 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
1941 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1942 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
1943 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1944 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
1945 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1946 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1947 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1948 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1949 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1950 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1951 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1952 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1953 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1954 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1955 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1956 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1957 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1958 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1959 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1960 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1961 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1962 0xf2a00950, 0xfea00fd0,
1963 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1964 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1965 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1966 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1967 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
1968 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1969 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
1970 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1971 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
1972 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1973 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1974 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1975 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1976 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1977 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1978 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1979 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1980 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1981 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1982 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1983 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1984 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1985 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
1986 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1987 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
1988 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1989 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
1990 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1991 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1992 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1993 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1994 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1995 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1996 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1997 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1998 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1999 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
2000 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2001 0xf2a00e10, 0xfea00e90,
2002 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
2003 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
2004 0xf2a00c10, 0xfea00e90,
2005 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
2006
2007 /* Three registers of different lengths. */
2008 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
2009 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2010 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2011 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2012 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2013 0xf2800400, 0xff800f50,
2014 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2015 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2016 0xf2800600, 0xff800f50,
2017 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2018 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2019 0xf2800900, 0xff800f50,
2020 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2021 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2022 0xf2800b00, 0xff800f50,
2023 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2024 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2025 0xf2800d00, 0xff800f50,
2026 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2027 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2028 0xf3800400, 0xff800f50,
2029 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2030 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2031 0xf3800600, 0xff800f50,
2032 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2033 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2034 0xf2800000, 0xfe800f50,
2035 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2036 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2037 0xf2800100, 0xfe800f50,
2038 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
2039 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2040 0xf2800200, 0xfe800f50,
2041 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2042 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2043 0xf2800300, 0xfe800f50,
2044 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
2045 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2046 0xf2800500, 0xfe800f50,
2047 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2048 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2049 0xf2800700, 0xfe800f50,
2050 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2051 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2052 0xf2800800, 0xfe800f50,
2053 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2054 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2055 0xf2800a00, 0xfe800f50,
2056 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2057 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2058 0xf2800c00, 0xfe800f50,
2059 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2060
2061 /* Two registers and a scalar. */
2062 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2063 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2064 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2065 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
2066 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2067 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
2068 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2069 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2070 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2071 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2072 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2073 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2074 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2075 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
2076 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2077 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2078 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2079 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2080 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2081 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
2082 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2083 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
2084 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2085 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2086 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2087 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2088 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2089 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2090 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2091 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2092 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2093 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2094 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2095 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2096 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2097 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2098 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2099 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2100 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2101 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2102 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2103 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2104 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2105 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2106 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2107 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2108 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2109 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2110 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2111 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2112 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2113 0xf2800240, 0xfe800f50,
2114 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2115 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2116 0xf2800640, 0xfe800f50,
2117 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2118 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2119 0xf2800a40, 0xfe800f50,
2120 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2121 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2122 0xf2800e40, 0xff800f50,
2123 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2124 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2125 0xf2800f40, 0xff800f50,
2126 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2127 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2128 0xf3800e40, 0xff800f50,
2129 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2130 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2131 0xf3800f40, 0xff800f50,
2132 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
2133 },
2134
2135 /* Element and structure load/store. */
2136 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2137 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
2138 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2139 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
2140 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2141 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
2142 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2143 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
2144 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2145 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
2146 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2147 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2148 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2149 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2150 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2151 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2152 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2153 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2154 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2155 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2156 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2157 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2158 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2159 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2160 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2161 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2162 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2163 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2164 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2165 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
2166 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2167 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
2168 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2169 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
2170 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2171 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
2172 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2173 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
2174
2175 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
2176 };
2177
2178 /* mve opcode table. */
2179
2180 /* print_insn_mve recognizes the following format control codes:
2181
2182 %% %
2183
2184 %a print '+' or '-' or imm offset in vldr[bhwd] and
2185 vstr[bhwd]
2186 %c print condition code
2187 %d print addr mode of MVE vldr[bhw] and vstr[bhw]
2188 %u print 'U' (unsigned) or 'S' for various mve instructions
2189 %i print MVE predicate(s) for vpt and vpst
2190 %j print a 5-bit immediate from hw2[14:12,7:6]
2191 %k print 48 if the 7th position bit is set else print 64.
2192 %m print rounding mode for vcvt and vrint
2193 %n print vector comparison code for predicated instruction
2194 %s print size for various vcvt instructions
2195 %v print vector predicate for instruction in predicated
2196 block
2197 %o print offset scaled for vldr[hwd] and vstr[hwd]
2198 %w print writeback mode for MVE v{st,ld}[24]
2199 %B print v{st,ld}[24] any one operands
2200 %E print vmov, vmvn, vorr, vbic encoded constant
2201 %N print generic index for vmov
2202 %T print bottom ('b') or top ('t') of source register
2203 %X print exchange field in vmla* instructions
2204
2205 %<bitfield>r print as an ARM register
2206 %<bitfield>d print the bitfield in decimal
2207 %<bitfield>A print accumulate or not
2208 %<bitfield>c print bitfield as a condition code
2209 %<bitfield>C print bitfield as an inverted condition code
2210 %<bitfield>Q print as a MVE Q register
2211 %<bitfield>F print as a MVE S register
2212 %<bitfield>Z as %<>r but r15 is ZR instead of PC and r13 is
2213 UNPREDICTABLE
2214
2215 %<bitfield>S as %<>r but r15 or r13 is UNPREDICTABLE
2216 %<bitfield>s print size for vector predicate & non VMOV instructions
2217 %<bitfield>I print carry flag or not
2218 %<bitfield>i print immediate for vstr/vldr reg +/- imm
2219 %<bitfield>h print high half of 64-bit destination reg
2220 %<bitfield>k print immediate for vector conversion instruction
2221 %<bitfield>l print low half of 64-bit destination reg
2222 %<bitfield>o print rotate value for vcmul
2223 %<bitfield>u print immediate value for vddup/vdwdup
2224 %<bitfield>x print the bitfield in hex.
2225 */
2226
2227 static const struct mopcode32 mve_opcodes[] =
2228 {
2229 /* MVE. */
2230
2231 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2232 MVE_VPST,
2233 0xfe310f4d, 0xffbf1fff,
2234 "vpst%i"
2235 },
2236
2237 /* Floating point VPT T1. */
2238 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2239 MVE_VPT_FP_T1,
2240 0xee310f00, 0xefb10f50,
2241 "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
2242 /* Floating point VPT T2. */
2243 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2244 MVE_VPT_FP_T2,
2245 0xee310f40, 0xefb10f50,
2246 "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
2247
2248 /* Vector VPT T1. */
2249 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2250 MVE_VPT_VEC_T1,
2251 0xfe010f00, 0xff811f51,
2252 "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2253 /* Vector VPT T2. */
2254 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2255 MVE_VPT_VEC_T2,
2256 0xfe010f01, 0xff811f51,
2257 "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2258 /* Vector VPT T3. */
2259 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2260 MVE_VPT_VEC_T3,
2261 0xfe011f00, 0xff811f50,
2262 "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2263 /* Vector VPT T4. */
2264 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2265 MVE_VPT_VEC_T4,
2266 0xfe010f40, 0xff811f70,
2267 "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
2268 /* Vector VPT T5. */
2269 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2270 MVE_VPT_VEC_T5,
2271 0xfe010f60, 0xff811f70,
2272 "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
2273 /* Vector VPT T6. */
2274 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2275 MVE_VPT_VEC_T6,
2276 0xfe011f40, 0xff811f50,
2277 "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
2278
2279 /* Vector VBIC immediate. */
2280 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2281 MVE_VBIC_IMM,
2282 0xef800070, 0xefb81070,
2283 "vbic%v.i%8-11s\t%13-15,22Q, %E"},
2284
2285 /* Vector VBIC register. */
2286 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2287 MVE_VBIC_REG,
2288 0xef100150, 0xffb11f51,
2289 "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2290
2291 /* Vector VABAV. */
2292 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2293 MVE_VABAV,
2294 0xee800f01, 0xefc10f51,
2295 "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
2296
2297 /* Vector VABD floating point. */
2298 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2299 MVE_VABD_FP,
2300 0xff200d40, 0xffa11f51,
2301 "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2302
2303 /* Vector VABD. */
2304 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2305 MVE_VABD_VEC,
2306 0xef000740, 0xef811f51,
2307 "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2308
2309 /* Vector VABS floating point. */
2310 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2311 MVE_VABS_FP,
2312 0xFFB10740, 0xFFB31FD1,
2313 "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2314 /* Vector VABS. */
2315 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2316 MVE_VABS_VEC,
2317 0xffb10340, 0xffb31fd1,
2318 "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2319
2320 /* Vector VADD floating point T1. */
2321 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2322 MVE_VADD_FP_T1,
2323 0xef000d40, 0xffa11f51,
2324 "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2325 /* Vector VADD floating point T2. */
2326 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2327 MVE_VADD_FP_T2,
2328 0xee300f40, 0xefb11f70,
2329 "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2330 /* Vector VADD T1. */
2331 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2332 MVE_VADD_VEC_T1,
2333 0xef000840, 0xff811f51,
2334 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2335 /* Vector VADD T2. */
2336 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2337 MVE_VADD_VEC_T2,
2338 0xee010f40, 0xff811f70,
2339 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2340
2341 /* Vector VADDLV. */
2342 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2343 MVE_VADDLV,
2344 0xee890f00, 0xef8f1fd1,
2345 "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
2346
2347 /* Vector VADDV. */
2348 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2349 MVE_VADDV,
2350 0xeef10f00, 0xeff31fd1,
2351 "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
2352
2353 /* Vector VADC. */
2354 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2355 MVE_VADC,
2356 0xee300f00, 0xffb10f51,
2357 "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2358
2359 /* Vector VAND. */
2360 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2361 MVE_VAND,
2362 0xef000150, 0xffb11f51,
2363 "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2364
2365 /* Vector VBRSR register. */
2366 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2367 MVE_VBRSR,
2368 0xfe011e60, 0xff811f70,
2369 "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2370
2371 /* Vector VCADD floating point. */
2372 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2373 MVE_VCADD_FP,
2374 0xfc800840, 0xfea11f51,
2375 "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"},
2376
2377 /* Vector VCADD. */
2378 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2379 MVE_VCADD_VEC,
2380 0xfe000f00, 0xff810f51,
2381 "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2382
2383 /* Vector VCLS. */
2384 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2385 MVE_VCLS,
2386 0xffb00440, 0xffb31fd1,
2387 "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2388
2389 /* Vector VCLZ. */
2390 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2391 MVE_VCLZ,
2392 0xffb004c0, 0xffb31fd1,
2393 "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2394
2395 /* Vector VCMLA. */
2396 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2397 MVE_VCMLA_FP,
2398 0xfc200840, 0xfe211f51,
2399 "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"},
2400
2401 /* Vector VCMP floating point T1. */
2402 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2403 MVE_VCMP_FP_T1,
2404 0xee310f00, 0xeff1ef50,
2405 "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
2406
2407 /* Vector VCMP floating point T2. */
2408 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2409 MVE_VCMP_FP_T2,
2410 0xee310f40, 0xeff1ef50,
2411 "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
2412
2413 /* Vector VCMP T1. */
2414 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2415 MVE_VCMP_VEC_T1,
2416 0xfe010f00, 0xffc1ff51,
2417 "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2418 /* Vector VCMP T2. */
2419 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2420 MVE_VCMP_VEC_T2,
2421 0xfe010f01, 0xffc1ff51,
2422 "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2423 /* Vector VCMP T3. */
2424 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2425 MVE_VCMP_VEC_T3,
2426 0xfe011f00, 0xffc1ff50,
2427 "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2428 /* Vector VCMP T4. */
2429 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2430 MVE_VCMP_VEC_T4,
2431 0xfe010f40, 0xffc1ff70,
2432 "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
2433 /* Vector VCMP T5. */
2434 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2435 MVE_VCMP_VEC_T5,
2436 0xfe010f60, 0xffc1ff70,
2437 "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
2438 /* Vector VCMP T6. */
2439 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2440 MVE_VCMP_VEC_T6,
2441 0xfe011f40, 0xffc1ff50,
2442 "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
2443
2444 /* Vector VDUP. */
2445 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2446 MVE_VDUP,
2447 0xeea00b10, 0xffb10f5f,
2448 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2449
2450 /* Vector VEOR. */
2451 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2452 MVE_VEOR,
2453 0xff000150, 0xffd11f51,
2454 "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2455
2456 /* Vector VFMA, vector * scalar. */
2457 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2458 MVE_VFMA_FP_SCALAR,
2459 0xee310e40, 0xefb11f70,
2460 "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2461
2462 /* Vector VFMA floating point. */
2463 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2464 MVE_VFMA_FP,
2465 0xef000c50, 0xffa11f51,
2466 "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2467
2468 /* Vector VFMS floating point. */
2469 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2470 MVE_VFMS_FP,
2471 0xef200c50, 0xffa11f51,
2472 "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2473
2474 /* Vector VFMAS, vector * scalar. */
2475 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2476 MVE_VFMAS_FP_SCALAR,
2477 0xee311e40, 0xefb11f70,
2478 "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2479
2480 /* Vector VHADD T1. */
2481 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2482 MVE_VHADD_T1,
2483 0xef000040, 0xef811f51,
2484 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2485
2486 /* Vector VHADD T2. */
2487 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2488 MVE_VHADD_T2,
2489 0xee000f40, 0xef811f70,
2490 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2491
2492 /* Vector VHSUB T1. */
2493 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2494 MVE_VHSUB_T1,
2495 0xef000240, 0xef811f51,
2496 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2497
2498 /* Vector VHSUB T2. */
2499 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2500 MVE_VHSUB_T2,
2501 0xee001f40, 0xef811f70,
2502 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2503
2504 /* Vector VCMUL. */
2505 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2506 MVE_VCMUL_FP,
2507 0xee300e00, 0xefb10f50,
2508 "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"},
2509
2510 /* Vector VCTP. */
2511 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2512 MVE_VCTP,
2513 0xf000e801, 0xffc0ffff,
2514 "vctp%v.%20-21s\t%16-19r"},
2515
2516 /* Vector VDUP. */
2517 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2518 MVE_VDUP,
2519 0xeea00b10, 0xffb10f5f,
2520 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2521
2522 /* Vector VRHADD. */
2523 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2524 MVE_VRHADD,
2525 0xef000140, 0xef811f51,
2526 "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2527
2528 /* Vector VCVT. */
2529 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2530 MVE_VCVT_FP_FIX_VEC,
2531 0xef800c50, 0xef801cd1,
2532 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"},
2533
2534 /* Vector VCVT. */
2535 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2536 MVE_VCVT_BETWEEN_FP_INT,
2537 0xffb30640, 0xffb31e51,
2538 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
2539
2540 /* Vector VCVT between single and half-precision float, bottom half. */
2541 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2542 MVE_VCVT_FP_HALF_FP,
2543 0xee3f0e01, 0xefbf1fd1,
2544 "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
2545
2546 /* Vector VCVT between single and half-precision float, top half. */
2547 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2548 MVE_VCVT_FP_HALF_FP,
2549 0xee3f1e01, 0xefbf1fd1,
2550 "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
2551
2552 /* Vector VCVT. */
2553 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2554 MVE_VCVT_FROM_FP_TO_INT,
2555 0xffb30040, 0xffb31c51,
2556 "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
2557
2558 /* Vector VDDUP. */
2559 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2560 MVE_VDDUP,
2561 0xee011f6e, 0xff811f7e,
2562 "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2563
2564 /* Vector VDWDUP. */
2565 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2566 MVE_VDWDUP,
2567 0xee011f60, 0xff811f70,
2568 "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2569
2570 /* Vector VHCADD. */
2571 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2572 MVE_VHCADD,
2573 0xee000f00, 0xff810f51,
2574 "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2575
2576 /* Vector VIWDUP. */
2577 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2578 MVE_VIWDUP,
2579 0xee010f60, 0xff811f70,
2580 "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2581
2582 /* Vector VIDUP. */
2583 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2584 MVE_VIDUP,
2585 0xee010f6e, 0xff811f7e,
2586 "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2587
2588 /* Vector VLD2. */
2589 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2590 MVE_VLD2,
2591 0xfc901e00, 0xff901e5f,
2592 "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
2593
2594 /* Vector VLD4. */
2595 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2596 MVE_VLD4,
2597 0xfc901e01, 0xff901e1f,
2598 "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
2599
2600 /* Vector VLDRB gather load. */
2601 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2602 MVE_VLDRB_GATHER_T1,
2603 0xec900e00, 0xefb01e50,
2604 "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
2605
2606 /* Vector VLDRH gather load. */
2607 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2608 MVE_VLDRH_GATHER_T2,
2609 0xec900e10, 0xefb01e50,
2610 "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2611
2612 /* Vector VLDRW gather load. */
2613 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2614 MVE_VLDRW_GATHER_T3,
2615 0xfc900f40, 0xffb01fd0,
2616 "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2617
2618 /* Vector VLDRD gather load. */
2619 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2620 MVE_VLDRD_GATHER_T4,
2621 0xec900fd0, 0xefb01fd0,
2622 "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2623
2624 /* Vector VLDRW gather load. */
2625 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2626 MVE_VLDRW_GATHER_T5,
2627 0xfd101e00, 0xff111f00,
2628 "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2629
2630 /* Vector VLDRD gather load, variant T6. */
2631 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2632 MVE_VLDRD_GATHER_T6,
2633 0xfd101f00, 0xff111f00,
2634 "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2635
2636 /* Vector VLDRB. */
2637 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2638 MVE_VLDRB_T1,
2639 0xec100e00, 0xee581e00,
2640 "vldrb%v.%u%7-8s\t%13-15Q, %d"},
2641
2642 /* Vector VLDRH. */
2643 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2644 MVE_VLDRH_T2,
2645 0xec180e00, 0xee581e00,
2646 "vldrh%v.%u%7-8s\t%13-15Q, %d"},
2647
2648 /* Vector VLDRB unsigned, variant T5. */
2649 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2650 MVE_VLDRB_T5,
2651 0xec101e00, 0xfe101f80,
2652 "vldrb%v.u8\t%13-15,22Q, %d"},
2653
2654 /* Vector VLDRH unsigned, variant T6. */
2655 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2656 MVE_VLDRH_T6,
2657 0xec101e80, 0xfe101f80,
2658 "vldrh%v.u16\t%13-15,22Q, %d"},
2659
2660 /* Vector VLDRW unsigned, variant T7. */
2661 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2662 MVE_VLDRW_T7,
2663 0xec101f00, 0xfe101f80,
2664 "vldrw%v.u32\t%13-15,22Q, %d"},
2665
2666 /* Vector VMAX. */
2667 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2668 MVE_VMAX,
2669 0xef000640, 0xef811f51,
2670 "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2671
2672 /* Vector VMAXA. */
2673 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2674 MVE_VMAXA,
2675 0xee330e81, 0xffb31fd1,
2676 "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2677
2678 /* Vector VMAXNM floating point. */
2679 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2680 MVE_VMAXNM_FP,
2681 0xff000f50, 0xffa11f51,
2682 "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2683
2684 /* Vector VMAXNMA floating point. */
2685 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2686 MVE_VMAXNMA_FP,
2687 0xee3f0e81, 0xefbf1fd1,
2688 "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2689
2690 /* Vector VMAXNMV floating point. */
2691 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2692 MVE_VMAXNMV_FP,
2693 0xeeee0f00, 0xefff0fd1,
2694 "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2695
2696 /* Vector VMAXNMAV floating point. */
2697 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2698 MVE_VMAXNMAV_FP,
2699 0xeeec0f00, 0xefff0fd1,
2700 "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2701
2702 /* Vector VMAXV. */
2703 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2704 MVE_VMAXV,
2705 0xeee20f00, 0xeff30fd1,
2706 "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2707
2708 /* Vector VMAXAV. */
2709 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2710 MVE_VMAXAV,
2711 0xeee00f00, 0xfff30fd1,
2712 "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2713
2714 /* Vector VMIN. */
2715 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2716 MVE_VMIN,
2717 0xef000650, 0xef811f51,
2718 "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2719
2720 /* Vector VMINA. */
2721 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2722 MVE_VMINA,
2723 0xee331e81, 0xffb31fd1,
2724 "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2725
2726 /* Vector VMINNM floating point. */
2727 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2728 MVE_VMINNM_FP,
2729 0xff200f50, 0xffa11f51,
2730 "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2731
2732 /* Vector VMINNMA floating point. */
2733 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2734 MVE_VMINNMA_FP,
2735 0xee3f1e81, 0xefbf1fd1,
2736 "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2737
2738 /* Vector VMINNMV floating point. */
2739 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2740 MVE_VMINNMV_FP,
2741 0xeeee0f80, 0xefff0fd1,
2742 "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2743
2744 /* Vector VMINNMAV floating point. */
2745 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2746 MVE_VMINNMAV_FP,
2747 0xeeec0f80, 0xefff0fd1,
2748 "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2749
2750 /* Vector VMINV. */
2751 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2752 MVE_VMINV,
2753 0xeee20f80, 0xeff30fd1,
2754 "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2755
2756 /* Vector VMINAV. */
2757 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2758 MVE_VMINAV,
2759 0xeee00f80, 0xfff30fd1,
2760 "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2761
2762 /* Vector VMLA. */
2763 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2764 MVE_VMLA,
2765 0xee010e40, 0xef811f70,
2766 "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2767
2768 /* Vector VMLALDAV. Note must appear before VMLADAV due to instruction
2769 opcode aliasing. */
2770 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2771 MVE_VMLALDAV,
2772 0xee801e00, 0xef801f51,
2773 "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2774
2775 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2776 MVE_VMLALDAV,
2777 0xee800e00, 0xef801f51,
2778 "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2779
2780 /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0. */
2781 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2782 MVE_VMLADAV_T1,
2783 0xeef00e00, 0xeff01f51,
2784 "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2785
2786 /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0. */
2787 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2788 MVE_VMLADAV_T2,
2789 0xeef00f00, 0xeff11f51,
2790 "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2791
2792 /* Vector VMLADAV T1 variant. */
2793 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2794 MVE_VMLADAV_T1,
2795 0xeef01e00, 0xeff01f51,
2796 "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2797
2798 /* Vector VMLADAV T2 variant. */
2799 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2800 MVE_VMLADAV_T2,
2801 0xeef01f00, 0xeff11f51,
2802 "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2803
2804 /* Vector VMLAS. */
2805 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2806 MVE_VMLAS,
2807 0xee011e40, 0xef811f70,
2808 "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2809
2810 /* Vector VRMLSLDAVH. Note must appear before VMLSDAV due to instruction
2811 opcode aliasing. */
2812 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2813 MVE_VRMLSLDAVH,
2814 0xfe800e01, 0xff810f51,
2815 "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2816
2817 /* Vector VMLSLDAV. Note must appear before VMLSDAV due to instruction
2818 opcdoe aliasing. */
2819 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2820 MVE_VMLSLDAV,
2821 0xee800e01, 0xff800f51,
2822 "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2823
2824 /* Vector VMLSDAV T1 Variant. */
2825 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2826 MVE_VMLSDAV_T1,
2827 0xeef00e01, 0xfff00f51,
2828 "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2829
2830 /* Vector VMLSDAV T2 Variant. */
2831 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2832 MVE_VMLSDAV_T2,
2833 0xfef00e01, 0xfff10f51,
2834 "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
2835
2836 /* Vector VMOV between gpr and half precision register, op == 0. */
2837 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2838 MVE_VMOV_HFP_TO_GP,
2839 0xee000910, 0xfff00f7f,
2840 "vmov.f16\t%7,16-19F, %12-15r"},
2841
2842 /* Vector VMOV between gpr and half precision register, op == 1. */
2843 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2844 MVE_VMOV_HFP_TO_GP,
2845 0xee100910, 0xfff00f7f,
2846 "vmov.f16\t%12-15r, %7,16-19F"},
2847
2848 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2849 MVE_VMOV_GP_TO_VEC_LANE,
2850 0xee000b10, 0xff900f1f,
2851 "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"},
2852
2853 /* Vector VORR immediate to vector.
2854 NOTE: MVE_VORR_IMM must appear in the table
2855 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2856 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2857 MVE_VORR_IMM,
2858 0xef800050, 0xefb810f0,
2859 "vorr%v.i%8-11s\t%13-15,22Q, %E"},
2860
2861 /* Vector VQSHL T2 Variant.
2862 NOTE: MVE_VQSHL_T2 must appear in the table before
2863 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2864 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2865 MVE_VQSHL_T2,
2866 0xef800750, 0xef801fd1,
2867 "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2868
2869 /* Vector VQSHLU T3 Variant
2870 NOTE: MVE_VQSHL_T2 must appear in the table before
2871 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2872
2873 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2874 MVE_VQSHLU_T3,
2875 0xff800650, 0xff801fd1,
2876 "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2877
2878 /* Vector VRSHR
2879 NOTE: MVE_VRSHR must appear in the table before
2880 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2881 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2882 MVE_VRSHR,
2883 0xef800250, 0xef801fd1,
2884 "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2885
2886 /* Vector VSHL.
2887 NOTE: MVE_VSHL must appear in the table before
2888 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2889 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2890 MVE_VSHL_T1,
2891 0xef800550, 0xff801fd1,
2892 "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2893
2894 /* Vector VSHR
2895 NOTE: MVE_VSHR must appear in the table before
2896 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2897 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2898 MVE_VSHR,
2899 0xef800050, 0xef801fd1,
2900 "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2901
2902 /* Vector VSLI
2903 NOTE: MVE_VSLI must appear in the table before
2904 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2905 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2906 MVE_VSLI,
2907 0xff800550, 0xff801fd1,
2908 "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2909
2910 /* Vector VSRI
2911 NOTE: MVE_VSRI must appear in the table before
2912 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */
2913 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2914 MVE_VSRI,
2915 0xff800450, 0xff801fd1,
2916 "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2917
2918 /* Vector VMOV immediate to vector,
2919 undefinded for cmode == 1111 */
2920 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2921 MVE_VMVN_IMM, 0xef800f70, 0xefb81ff0, UNDEFINED_INSTRUCTION},
2922
2923 /* Vector VMOV immediate to vector,
2924 cmode == 1101 */
2925 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2926 MVE_VMOV_IMM_TO_VEC, 0xef800d50, 0xefb81fd0,
2927 "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2928
2929 /* Vector VMOV immediate to vector. */
2930 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2931 MVE_VMOV_IMM_TO_VEC,
2932 0xef800050, 0xefb810d0,
2933 "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2934
2935 /* Vector VMOV two 32-bit lanes to two gprs, idx = 0. */
2936 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2937 MVE_VMOV2_VEC_LANE_TO_GP,
2938 0xec000f00, 0xffb01ff0,
2939 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"},
2940
2941 /* Vector VMOV two 32-bit lanes to two gprs, idx = 1. */
2942 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2943 MVE_VMOV2_VEC_LANE_TO_GP,
2944 0xec000f10, 0xffb01ff0,
2945 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"},
2946
2947 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0. */
2948 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2949 MVE_VMOV2_GP_TO_VEC_LANE,
2950 0xec100f00, 0xffb01ff0,
2951 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2952
2953 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1. */
2954 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2955 MVE_VMOV2_GP_TO_VEC_LANE,
2956 0xec100f10, 0xffb01ff0,
2957 "vmov%c\t%13-15,22Q[3], %13-15,22Q[1], %0-3r, %16-19r"},
2958
2959 /* Vector VMOV Vector lane to gpr. */
2960 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2961 MVE_VMOV_VEC_LANE_TO_GP,
2962 0xee100b10, 0xff100f1f,
2963 "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
2964
2965 /* Vector VSHLL T1 Variant. Note: VSHLL T1 must appear before MVE_VMOVL due
2966 to instruction opcode aliasing. */
2967 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2968 MVE_VSHLL_T1,
2969 0xeea00f40, 0xefa00fd1,
2970 "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2971
2972 /* Vector VMOVL long. */
2973 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2974 MVE_VMOVL,
2975 0xeea00f40, 0xefa70fd1,
2976 "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
2977
2978 /* Vector VMOV and narrow. */
2979 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2980 MVE_VMOVN,
2981 0xfe310e81, 0xffb30fd1,
2982 "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2983
2984 /* Floating point move extract. */
2985 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2986 MVE_VMOVX,
2987 0xfeb00a40, 0xffbf0fd0,
2988 "vmovx.f16\t%22,12-15F, %5,0-3F"},
2989
2990 /* Vector VMUL floating-point T1 variant. */
2991 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2992 MVE_VMUL_FP_T1,
2993 0xff000d50, 0xffa11f51,
2994 "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2995
2996 /* Vector VMUL floating-point T2 variant. */
2997 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2998 MVE_VMUL_FP_T2,
2999 0xee310e60, 0xefb11f70,
3000 "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3001
3002 /* Vector VMUL T1 variant. */
3003 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3004 MVE_VMUL_VEC_T1,
3005 0xef000950, 0xff811f51,
3006 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3007
3008 /* Vector VMUL T2 variant. */
3009 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3010 MVE_VMUL_VEC_T2,
3011 0xee011e60, 0xff811f70,
3012 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3013
3014 /* Vector VMULH. */
3015 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3016 MVE_VMULH,
3017 0xee010e01, 0xef811f51,
3018 "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3019
3020 /* Vector VRMULH. */
3021 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3022 MVE_VRMULH,
3023 0xee011e01, 0xef811f51,
3024 "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3025
3026 /* Vector VMULL integer. */
3027 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3028 MVE_VMULL_INT,
3029 0xee010e00, 0xef810f51,
3030 "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3031
3032 /* Vector VMULL polynomial. */
3033 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3034 MVE_VMULL_POLY,
3035 0xee310e00, 0xefb10f51,
3036 "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3037
3038 /* Vector VMVN immediate to vector. */
3039 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3040 MVE_VMVN_IMM,
3041 0xef800070, 0xefb810f0,
3042 "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
3043
3044 /* Vector VMVN register. */
3045 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3046 MVE_VMVN_REG,
3047 0xffb005c0, 0xffbf1fd1,
3048 "vmvn%v\t%13-15,22Q, %1-3,5Q"},
3049
3050 /* Vector VNEG floating point. */
3051 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3052 MVE_VNEG_FP,
3053 0xffb107c0, 0xffb31fd1,
3054 "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3055
3056 /* Vector VNEG. */
3057 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3058 MVE_VNEG_VEC,
3059 0xffb103c0, 0xffb31fd1,
3060 "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3061
3062 /* Vector VORN, vector bitwise or not. */
3063 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3064 MVE_VORN,
3065 0xef300150, 0xffb11f51,
3066 "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3067
3068 /* Vector VORR register. */
3069 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3070 MVE_VORR_REG,
3071 0xef200150, 0xffb11f51,
3072 "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3073
3074 /* Vector VMOV, vector to vector move. While decoding MVE_VORR_REG if
3075 "Qm==Qn", VORR should replaced by its alias VMOV. For that to happen
3076 MVE_VMOV_VEC_TO_VEC need to placed after MVE_VORR_REG in this mve_opcodes
3077 array. */
3078
3079 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3080 MVE_VMOV_VEC_TO_VEC,
3081 0xef200150, 0xffb11f51,
3082 "vmov%v\t%13-15,22Q, %17-19,7Q"},
3083
3084 /* Vector VQDMULL T1 variant. */
3085 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3086 MVE_VQDMULL_T1,
3087 0xee300f01, 0xefb10f51,
3088 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3089
3090 /* Vector VPNOT. */
3091 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3092 MVE_VPNOT,
3093 0xfe310f4d, 0xffffffff,
3094 "vpnot%v"},
3095
3096 /* Vector VPSEL. */
3097 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3098 MVE_VPSEL,
3099 0xfe310f01, 0xffb11f51,
3100 "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3101
3102 /* Vector VQABS. */
3103 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3104 MVE_VQABS,
3105 0xffb00740, 0xffb31fd1,
3106 "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3107
3108 /* Vector VQADD T1 variant. */
3109 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3110 MVE_VQADD_T1,
3111 0xef000050, 0xef811f51,
3112 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3113
3114 /* Vector VQADD T2 variant. */
3115 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3116 MVE_VQADD_T2,
3117 0xee000f60, 0xef811f70,
3118 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3119
3120 /* Vector VQDMULL T2 variant. */
3121 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3122 MVE_VQDMULL_T2,
3123 0xee300f60, 0xefb10f70,
3124 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3125
3126 /* Vector VQMOVN. */
3127 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3128 MVE_VQMOVN,
3129 0xee330e01, 0xefb30fd1,
3130 "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
3131
3132 /* Vector VQMOVUN. */
3133 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3134 MVE_VQMOVUN,
3135 0xee310e81, 0xffb30fd1,
3136 "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3137
3138 /* Vector VQDMLADH. */
3139 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3140 MVE_VQDMLADH,
3141 0xee000e00, 0xff810f51,
3142 "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3143
3144 /* Vector VQRDMLADH. */
3145 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3146 MVE_VQRDMLADH,
3147 0xee000e01, 0xff810f51,
3148 "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3149
3150 /* Vector VQDMLAH. */
3151 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3152 MVE_VQDMLAH,
3153 0xee000e60, 0xff811f70,
3154 "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3155
3156 /* Vector VQRDMLAH. */
3157 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3158 MVE_VQRDMLAH,
3159 0xee000e40, 0xff811f70,
3160 "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3161
3162 /* Vector VQDMLASH. */
3163 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3164 MVE_VQDMLASH,
3165 0xee001e60, 0xff811f70,
3166 "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3167
3168 /* Vector VQRDMLASH. */
3169 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3170 MVE_VQRDMLASH,
3171 0xee001e40, 0xff811f70,
3172 "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3173
3174 /* Vector VQDMLSDH. */
3175 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3176 MVE_VQDMLSDH,
3177 0xfe000e00, 0xff810f51,
3178 "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3179
3180 /* Vector VQRDMLSDH. */
3181 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3182 MVE_VQRDMLSDH,
3183 0xfe000e01, 0xff810f51,
3184 "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3185
3186 /* Vector VQDMULH T1 variant. */
3187 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3188 MVE_VQDMULH_T1,
3189 0xef000b40, 0xff811f51,
3190 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3191
3192 /* Vector VQRDMULH T2 variant. */
3193 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3194 MVE_VQRDMULH_T2,
3195 0xff000b40, 0xff811f51,
3196 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3197
3198 /* Vector VQDMULH T3 variant. */
3199 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3200 MVE_VQDMULH_T3,
3201 0xee010e60, 0xff811f70,
3202 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3203
3204 /* Vector VQRDMULH T4 variant. */
3205 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3206 MVE_VQRDMULH_T4,
3207 0xfe010e60, 0xff811f70,
3208 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3209
3210 /* Vector VQNEG. */
3211 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3212 MVE_VQNEG,
3213 0xffb007c0, 0xffb31fd1,
3214 "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3215
3216 /* Vector VQRSHL T1 variant. */
3217 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3218 MVE_VQRSHL_T1,
3219 0xef000550, 0xef811f51,
3220 "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3221
3222 /* Vector VQRSHL T2 variant. */
3223 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3224 MVE_VQRSHL_T2,
3225 0xee331ee0, 0xefb31ff0,
3226 "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3227
3228 /* Vector VQRSHRN. */
3229 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3230 MVE_VQRSHRN,
3231 0xee800f41, 0xefa00fd1,
3232 "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3233
3234 /* Vector VQRSHRUN. */
3235 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3236 MVE_VQRSHRUN,
3237 0xfe800fc0, 0xffa00fd1,
3238 "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3239
3240 /* Vector VQSHL T1 Variant. */
3241 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3242 MVE_VQSHL_T1,
3243 0xee311ee0, 0xefb31ff0,
3244 "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3245
3246 /* Vector VQSHL T4 Variant. */
3247 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3248 MVE_VQSHL_T4,
3249 0xef000450, 0xef811f51,
3250 "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3251
3252 /* Vector VQSHRN. */
3253 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3254 MVE_VQSHRN,
3255 0xee800f40, 0xefa00fd1,
3256 "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3257
3258 /* Vector VQSHRUN. */
3259 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3260 MVE_VQSHRUN,
3261 0xee800fc0, 0xffa00fd1,
3262 "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3263
3264 /* Vector VQSUB T1 Variant. */
3265 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3266 MVE_VQSUB_T1,
3267 0xef000250, 0xef811f51,
3268 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3269
3270 /* Vector VQSUB T2 Variant. */
3271 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3272 MVE_VQSUB_T2,
3273 0xee001f60, 0xef811f70,
3274 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3275
3276 /* Vector VREV16. */
3277 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3278 MVE_VREV16,
3279 0xffb00140, 0xffb31fd1,
3280 "vrev16%v.8\t%13-15,22Q, %1-3,5Q"},
3281
3282 /* Vector VREV32. */
3283 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3284 MVE_VREV32,
3285 0xffb000c0, 0xffb31fd1,
3286 "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3287
3288 /* Vector VREV64. */
3289 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3290 MVE_VREV64,
3291 0xffb00040, 0xffb31fd1,
3292 "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3293
3294 /* Vector VRINT floating point. */
3295 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3296 MVE_VRINT_FP,
3297 0xffb20440, 0xffb31c51,
3298 "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3299
3300 /* Vector VRMLALDAVH. */
3301 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3302 MVE_VRMLALDAVH,
3303 0xee800f00, 0xef811f51,
3304 "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3305
3306 /* Vector VRMLALDAVH. */
3307 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3308 MVE_VRMLALDAVH,
3309 0xee801f00, 0xef811f51,
3310 "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3311
3312 /* Vector VRSHL T1 Variant. */
3313 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3314 MVE_VRSHL_T1,
3315 0xef000540, 0xef811f51,
3316 "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3317
3318 /* Vector VRSHL T2 Variant. */
3319 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3320 MVE_VRSHL_T2,
3321 0xee331e60, 0xefb31ff0,
3322 "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3323
3324 /* Vector VRSHRN. */
3325 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3326 MVE_VRSHRN,
3327 0xfe800fc1, 0xffa00fd1,
3328 "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3329
3330 /* Vector VSBC. */
3331 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3332 MVE_VSBC,
3333 0xfe300f00, 0xffb10f51,
3334 "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3335
3336 /* Vector VSHL T2 Variant. */
3337 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3338 MVE_VSHL_T2,
3339 0xee311e60, 0xefb31ff0,
3340 "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3341
3342 /* Vector VSHL T3 Variant. */
3343 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3344 MVE_VSHL_T3,
3345 0xef000440, 0xef811f51,
3346 "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3347
3348 /* Vector VSHLC. */
3349 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3350 MVE_VSHLC,
3351 0xeea00fc0, 0xffa01ff0,
3352 "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"},
3353
3354 /* Vector VSHLL T2 Variant. */
3355 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3356 MVE_VSHLL_T2,
3357 0xee310e01, 0xefb30fd1,
3358 "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"},
3359
3360 /* Vector VSHRN. */
3361 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3362 MVE_VSHRN,
3363 0xee800fc1, 0xffa00fd1,
3364 "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3365
3366 /* Vector VST2 no writeback. */
3367 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3368 MVE_VST2,
3369 0xfc801e00, 0xffb01e5f,
3370 "vst2%5d.%7-8s\t%B, [%16-19r]"},
3371
3372 /* Vector VST2 writeback. */
3373 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3374 MVE_VST2,
3375 0xfca01e00, 0xffb01e5f,
3376 "vst2%5d.%7-8s\t%B, [%16-19r]!"},
3377
3378 /* Vector VST4 no writeback. */
3379 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3380 MVE_VST4,
3381 0xfc801e01, 0xffb01e1f,
3382 "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
3383
3384 /* Vector VST4 writeback. */
3385 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3386 MVE_VST4,
3387 0xfca01e01, 0xffb01e1f,
3388 "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
3389
3390 /* Vector VSTRB scatter store, T1 variant. */
3391 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3392 MVE_VSTRB_SCATTER_T1,
3393 0xec800e00, 0xffb01e50,
3394 "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
3395
3396 /* Vector VSTRH scatter store, T2 variant. */
3397 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3398 MVE_VSTRH_SCATTER_T2,
3399 0xec800e10, 0xffb01e50,
3400 "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3401
3402 /* Vector VSTRW scatter store, T3 variant. */
3403 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3404 MVE_VSTRW_SCATTER_T3,
3405 0xec800e40, 0xffb01e50,
3406 "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3407
3408 /* Vector VSTRD scatter store, T4 variant. */
3409 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3410 MVE_VSTRD_SCATTER_T4,
3411 0xec800fd0, 0xffb01fd0,
3412 "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3413
3414 /* Vector VSTRW scatter store, T5 variant. */
3415 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3416 MVE_VSTRW_SCATTER_T5,
3417 0xfd001e00, 0xff111f00,
3418 "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3419
3420 /* Vector VSTRD scatter store, T6 variant. */
3421 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3422 MVE_VSTRD_SCATTER_T6,
3423 0xfd001f00, 0xff111f00,
3424 "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3425
3426 /* Vector VSTRB. */
3427 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3428 MVE_VSTRB_T1,
3429 0xec000e00, 0xfe581e00,
3430 "vstrb%v.%7-8s\t%13-15Q, %d"},
3431
3432 /* Vector VSTRH. */
3433 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3434 MVE_VSTRH_T2,
3435 0xec080e00, 0xfe581e00,
3436 "vstrh%v.%7-8s\t%13-15Q, %d"},
3437
3438 /* Vector VSTRB variant T5. */
3439 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3440 MVE_VSTRB_T5,
3441 0xec001e00, 0xfe101f80,
3442 "vstrb%v.8\t%13-15,22Q, %d"},
3443
3444 /* Vector VSTRH variant T6. */
3445 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3446 MVE_VSTRH_T6,
3447 0xec001e80, 0xfe101f80,
3448 "vstrh%v.16\t%13-15,22Q, %d"},
3449
3450 /* Vector VSTRW variant T7. */
3451 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3452 MVE_VSTRW_T7,
3453 0xec001f00, 0xfe101f80,
3454 "vstrw%v.32\t%13-15,22Q, %d"},
3455
3456 /* Vector VSUB floating point T1 variant. */
3457 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3458 MVE_VSUB_FP_T1,
3459 0xef200d40, 0xffa11f51,
3460 "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3461
3462 /* Vector VSUB floating point T2 variant. */
3463 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3464 MVE_VSUB_FP_T2,
3465 0xee301f40, 0xefb11f70,
3466 "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3467
3468 /* Vector VSUB T1 variant. */
3469 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3470 MVE_VSUB_VEC_T1,
3471 0xff000840, 0xff811f51,
3472 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3473
3474 /* Vector VSUB T2 variant. */
3475 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3476 MVE_VSUB_VEC_T2,
3477 0xee011f40, 0xff811f70,
3478 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3479
3480 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3481 MVE_ASRLI,
3482 0xea50012f, 0xfff1813f,
3483 "asrl%c\t%17-19l, %9-11h, %j"},
3484
3485 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3486 MVE_ASRL,
3487 0xea50012d, 0xfff101ff,
3488 "asrl%c\t%17-19l, %9-11h, %12-15S"},
3489
3490 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3491 MVE_LSLLI,
3492 0xea50010f, 0xfff1813f,
3493 "lsll%c\t%17-19l, %9-11h, %j"},
3494
3495 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3496 MVE_LSLL,
3497 0xea50010d, 0xfff101ff,
3498 "lsll%c\t%17-19l, %9-11h, %12-15S"},
3499
3500 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3501 MVE_LSRL,
3502 0xea50011f, 0xfff1813f,
3503 "lsrl%c\t%17-19l, %9-11h, %j"},
3504
3505 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3506 MVE_SQRSHRL,
3507 0xea51012d, 0xfff1017f,
3508 "sqrshrl%c\t%17-19l, %9-11h, %k, %12-15S"},
3509
3510 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3511 MVE_SQRSHR,
3512 0xea500f2d, 0xfff00fff,
3513 "sqrshr%c\t%16-19S, %12-15S"},
3514
3515 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3516 MVE_SQSHLL,
3517 0xea51013f, 0xfff1813f,
3518 "sqshll%c\t%17-19l, %9-11h, %j"},
3519
3520 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3521 MVE_SQSHL,
3522 0xea500f3f, 0xfff08f3f,
3523 "sqshl%c\t%16-19S, %j"},
3524
3525 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3526 MVE_SRSHRL,
3527 0xea51012f, 0xfff1813f,
3528 "srshrl%c\t%17-19l, %9-11h, %j"},
3529
3530 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3531 MVE_SRSHR,
3532 0xea500f2f, 0xfff08f3f,
3533 "srshr%c\t%16-19S, %j"},
3534
3535 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3536 MVE_UQRSHLL,
3537 0xea51010d, 0xfff1017f,
3538 "uqrshll%c\t%17-19l, %9-11h, %k, %12-15S"},
3539
3540 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3541 MVE_UQRSHL,
3542 0xea500f0d, 0xfff00fff,
3543 "uqrshl%c\t%16-19S, %12-15S"},
3544
3545 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3546 MVE_UQSHLL,
3547 0xea51010f, 0xfff1813f,
3548 "uqshll%c\t%17-19l, %9-11h, %j"},
3549
3550 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3551 MVE_UQSHL,
3552 0xea500f0f, 0xfff08f3f,
3553 "uqshl%c\t%16-19S, %j"},
3554
3555 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3556 MVE_URSHRL,
3557 0xea51011f, 0xfff1813f,
3558 "urshrl%c\t%17-19l, %9-11h, %j"},
3559
3560 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3561 MVE_URSHR,
3562 0xea500f1f, 0xfff08f3f,
3563 "urshr%c\t%16-19S, %j"},
3564
3565 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3566 MVE_CSINC,
3567 0xea509000, 0xfff0f000,
3568 "csinc\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3569
3570 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3571 MVE_CSINV,
3572 0xea50a000, 0xfff0f000,
3573 "csinv\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3574
3575 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3576 MVE_CSET,
3577 0xea5f900f, 0xfffff00f,
3578 "cset\t%8-11S, %4-7C"},
3579
3580 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3581 MVE_CSETM,
3582 0xea5fa00f, 0xfffff00f,
3583 "csetm\t%8-11S, %4-7C"},
3584
3585 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3586 MVE_CSEL,
3587 0xea508000, 0xfff0f000,
3588 "csel\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3589
3590 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3591 MVE_CSNEG,
3592 0xea50b000, 0xfff0f000,
3593 "csneg\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3594
3595 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3596 MVE_CINC,
3597 0xea509000, 0xfff0f000,
3598 "cinc\t%8-11S, %16-19Z, %4-7C"},
3599
3600 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3601 MVE_CINV,
3602 0xea50a000, 0xfff0f000,
3603 "cinv\t%8-11S, %16-19Z, %4-7C"},
3604
3605 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3606 MVE_CNEG,
3607 0xea50b000, 0xfff0f000,
3608 "cneg\t%8-11S, %16-19Z, %4-7C"},
3609
3610 {ARM_FEATURE_CORE_LOW (0),
3611 MVE_NONE,
3612 0x00000000, 0x00000000, 0}
3613 };
3614
3615 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
3616 ordered: they must be searched linearly from the top to obtain a correct
3617 match. */
3618
3619 /* print_insn_arm recognizes the following format control codes:
3620
3621 %% %
3622
3623 %a print address for ldr/str instruction
3624 %s print address for ldr/str halfword/signextend instruction
3625 %S like %s but allow UNPREDICTABLE addressing
3626 %b print branch destination
3627 %c print condition code (always bits 28-31)
3628 %m print register mask for ldm/stm instruction
3629 %o print operand2 (immediate or register + shift)
3630 %p print 'p' iff bits 12-15 are 15
3631 %t print 't' iff bit 21 set and bit 24 clear
3632 %B print arm BLX(1) destination
3633 %C print the PSR sub type.
3634 %U print barrier type.
3635 %P print address for pli instruction.
3636
3637 %<bitfield>r print as an ARM register
3638 %<bitfield>T print as an ARM register + 1
3639 %<bitfield>R as %r but r15 is UNPREDICTABLE
3640 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE
3641 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE
3642 %<bitfield>d print the bitfield in decimal
3643 %<bitfield>W print the bitfield plus one in decimal
3644 %<bitfield>x print the bitfield in hex
3645 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
3646
3647 %<bitfield>'c print specified char iff bitfield is all ones
3648 %<bitfield>`c print specified char iff bitfield is all zeroes
3649 %<bitfield>?ab... select from array of values in big endian order
3650
3651 %e print arm SMI operand (bits 0..7,8..19).
3652 %E print the LSB and WIDTH fields of a BFI or BFC instruction.
3653 %V print the 16-bit immediate field of a MOVT or MOVW instruction.
3654 %R print the SPSR/CPSR or banked register of an MRS. */
3655
3656 static const struct opcode32 arm_opcodes[] =
3657 {
3658 /* ARM instructions. */
3659 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3660 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
3661 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3662 0xe7f000f0, 0xfff000f0, "udf\t#%e"},
3663
3664 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5),
3665 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
3666 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
3667 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
3668 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
3669 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3670 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S),
3671 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
3672 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
3673 0x00800090, 0x0fa000f0,
3674 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
3676 0x00a00090, 0x0fa000f0,
3677 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3678
3679 /* V8.2 RAS extension instructions. */
3680 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
3681 0xe320f010, 0xffffffff, "esb"},
3682
3683 /* V8-R instructions. */
3684 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
3685 0xf57ff04c, 0xffffffff, "dfb"},
3686
3687 /* V8 instructions. */
3688 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3689 0x0320f005, 0x0fffffff, "sevl"},
3690 /* Defined in V8 but is in NOP space so available to all arch. */
3691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3692 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
3693 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS),
3694 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
3695 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3696 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
3697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3698 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
3699 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3700 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
3701 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3702 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
3703 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3704 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
3705 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3706 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
3707 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3708 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
3709 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3710 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
3711 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3712 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
3713 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3714 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
3715 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3716 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
3717 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3718 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
3719 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3720 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
3721 /* CRC32 instructions. */
3722 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3723 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
3724 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3725 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
3726 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3727 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
3728 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3729 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
3730 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3731 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
3732 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3733 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
3734
3735 /* Privileged Access Never extension instructions. */
3736 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
3737 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
3738
3739 /* Virtualization Extension instructions. */
3740 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"},
3741 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
3742
3743 /* Integer Divide Extension instructions. */
3744 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
3745 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
3746 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
3747 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
3748
3749 /* MP Extension instructions. */
3750 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"},
3751
3752 /* Speculation Barriers. */
3753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xe320f014, 0xffffffff, "csdb"},
3754 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff040, 0xffffffff, "ssbb"},
3755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff044, 0xffffffff, "pssbb"},
3756
3757 /* V7 instructions. */
3758 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"},
3759 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
3760 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
3761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
3762 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
3763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
3764 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"},
3765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
3766 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
3767
3768 /* ARM V6T2 instructions. */
3769 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3770 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
3771 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3772 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
3773 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3774 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3776 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
3777
3778 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3779 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION },
3780 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3781 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
3782
3783 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
3784 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
3785 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
3786 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
3787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3788 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
3789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3790 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
3791
3792 /* ARM Security extension instructions. */
3793 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
3794 0x01600070, 0x0ff000f0, "smc%c\t%e"},
3795
3796 /* ARM V6K instructions. */
3797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3798 0xf57ff01f, 0xffffffff, "clrex"},
3799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3800 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
3801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3802 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
3803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3804 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
3805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3806 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
3807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3808 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
3809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3810 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
3811
3812 /* ARMv8.5-A instructions. */
3813 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf57ff070, 0xffffffff, "sb"},
3814
3815 /* ARM V6K NOP hints. */
3816 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3817 0x0320f001, 0x0fffffff, "yield%c"},
3818 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3819 0x0320f002, 0x0fffffff, "wfe%c"},
3820 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3821 0x0320f003, 0x0fffffff, "wfi%c"},
3822 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3823 0x0320f004, 0x0fffffff, "sev%c"},
3824 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3825 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
3826
3827 /* ARM V6 instructions. */
3828 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3829 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
3830 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3831 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
3832 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3833 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
3834 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3835 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
3836 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3837 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
3838 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3839 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
3840 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3841 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
3842 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3843 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
3844 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3845 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
3846 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3847 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
3848 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3849 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
3850 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3851 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
3852 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3853 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
3854 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3855 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
3856 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3857 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
3858 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3859 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
3860 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3861 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
3862 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3863 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
3864 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3865 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
3866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3867 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
3868 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3869 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
3870 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3871 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
3872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3873 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
3874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3875 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
3876 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3877 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
3878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3879 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
3880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3881 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
3882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3883 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
3884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3885 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
3886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3887 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
3888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3889 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
3890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3891 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
3892 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3893 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
3894 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3895 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
3896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3897 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
3898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3899 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
3900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3901 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
3902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3903 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
3904 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3905 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
3906 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3907 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
3908 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3909 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
3910 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3911 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
3912 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3913 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
3914 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3915 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
3916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3917 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
3918 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3919 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
3920 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3921 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
3922 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3923 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
3924 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3925 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
3926 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3927 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
3928 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3929 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
3930 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3931 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
3932 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3933 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
3934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3935 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
3936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3937 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
3938 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3939 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
3940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3941 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
3942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3943 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
3944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3945 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
3946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3947 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
3948 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3949 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
3950 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3951 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
3952 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3953 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
3954 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3955 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
3956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3957 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
3958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3959 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
3960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3961 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
3962 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3963 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
3964 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3965 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
3966 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3967 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
3968 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3969 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
3970 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3971 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
3972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3973 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
3974 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3975 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
3976 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3977 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
3978 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3979 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3980 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3981 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3982 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3983 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3984 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3985 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
3986 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3987 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3988 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3989 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3990 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3991 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3992 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3993 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
3994 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3995 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3996 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3997 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3998 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3999 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4001 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
4002 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4003 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4004 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4005 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4006 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4007 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4008 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4009 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
4010 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4011 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4012 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4013 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4015 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
4016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4017 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
4018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4019 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4020 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4021 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4022 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4023 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4024 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4025 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
4026 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4027 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
4028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4029 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
4030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4031 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
4032 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4033 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4034 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4035 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4036 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4037 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4038 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4039 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4040 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4041 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
4042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4043 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4045 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4047 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
4048 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4049 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
4050 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4051 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
4052 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4053 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
4054 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4055 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
4056 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4057 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
4058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4059 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
4060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4061 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
4062 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4063 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4064 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4065 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
4066 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4067 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
4068 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4069 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
4070 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4071 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
4072
4073 /* V5J instruction. */
4074 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J),
4075 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
4076
4077 /* V5 Instructions. */
4078 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4079 0xe1200070, 0xfff000f0,
4080 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
4081 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4082 0xfa000000, 0xfe000000, "blx\t%B"},
4083 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4084 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
4085 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4086 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
4087
4088 /* V5E "El Segundo" Instructions. */
4089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4090 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
4091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4092 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
4093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4094 0xf450f000, 0xfc70f000, "pld\t%a"},
4095 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4096 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4097 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4098 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4099 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4100 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4101 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4102 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
4103
4104 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4105 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4106 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4107 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
4108
4109 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4110 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4111 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4112 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4113 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4114 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4115 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4116 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4117
4118 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4119 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
4120 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4121 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
4122 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4123 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
4124 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4125 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
4126
4127 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4128 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
4129 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4130 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
4131
4132 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4133 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"},
4134 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4135 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
4136 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4137 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"},
4138 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4139 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
4140
4141 /* ARM Instructions. */
4142 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4143 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
4144
4145 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4146 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
4147 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4148 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
4149 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4150 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
4151 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4152 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
4153 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4154 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
4155 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4156 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
4157
4158 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4159 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
4160 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4161 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
4162 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4163 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
4164 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4165 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
4166
4167 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4168 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION},
4169 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4170 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
4171 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4172 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION},
4173 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4174 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
4175
4176 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4177 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
4178 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4179 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
4180 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4181 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
4182
4183 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4184 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
4185 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4186 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
4187 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4188 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
4189
4190 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4191 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
4192 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4193 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
4194 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4195 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
4196
4197 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4198 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4199 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4200 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4201 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4202 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
4203
4204 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4205 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
4206 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4207 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
4208 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4209 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
4210
4211 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4212 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
4213 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4214 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
4215 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4216 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
4217
4218 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4219 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4220 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4221 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4222 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4223 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
4224
4225 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4226 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4227 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4228 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4229 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4230 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
4231
4232 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
4233 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
4234 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
4235 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
4236 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
4237 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
4238
4239 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4240 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
4241 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4242 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
4243 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4244 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
4245
4246 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4247 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
4248 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4249 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
4250 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4251 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
4252
4253 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4254 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
4255 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4256 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
4257 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4258 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
4259
4260 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4261 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
4262 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4263 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
4264 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4265 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
4266
4267 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4268 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
4269 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4270 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
4271 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4272 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
4273
4274 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4275 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
4276 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4277 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
4278 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4279 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
4280 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4281 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
4282 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4283 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
4284 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4285 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
4286 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4287 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
4288
4289 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4290 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
4291 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4292 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
4293 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4294 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
4295
4296 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4297 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
4298 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4299 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
4300 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4301 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
4302
4303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4304 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION},
4305 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4306 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
4307
4308 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4309 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
4310
4311 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4312 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
4313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4314 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
4315
4316 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4317 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4318 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4319 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4320 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4321 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4322 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4323 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4324 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4325 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4326 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4327 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4328 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4329 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4330 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4331 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4332 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4333 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4334 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4335 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4336 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4337 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4338 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4339 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4340 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4341 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4342 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4343 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4344 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4345 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4346 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4347 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4348 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4349 0x092d0000, 0x0fff0000, "push%c\t%m"},
4350 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4351 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
4352 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4353 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4354
4355 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4356 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4357 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4358 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4359 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4360 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4361 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4362 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4363 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4364 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4365 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4366 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4367 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4368 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4369 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4370 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4371 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4372 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4373 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4374 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4375 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4376 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4377 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4378 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4379 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4380 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4381 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4382 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4383 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4384 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4385 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4386 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4387 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4388 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
4389 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4390 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
4391 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4392 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4393
4394 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4395 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
4396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4397 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
4398
4399 /* The rest. */
4400 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
4401 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION},
4402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4403 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
4404 {ARM_FEATURE_CORE_LOW (0),
4405 0x00000000, 0x00000000, 0}
4406 };
4407
4408 /* print_insn_thumb16 recognizes the following format control codes:
4409
4410 %S print Thumb register (bits 3..5 as high number if bit 6 set)
4411 %D print Thumb register (bits 0..2 as high number if bit 7 set)
4412 %<bitfield>I print bitfield as a signed decimal
4413 (top bit of range being the sign bit)
4414 %N print Thumb register mask (with LR)
4415 %O print Thumb register mask (with PC)
4416 %M print Thumb register mask
4417 %b print CZB's 6-bit unsigned branch destination
4418 %s print Thumb right-shift immediate (6..10; 0 == 32).
4419 %c print the condition code
4420 %C print the condition code, or "s" if not conditional
4421 %x print warning if conditional an not at end of IT block"
4422 %X print "\t; unpredictable <IT:code>" if conditional
4423 %I print IT instruction suffix and operands
4424 %W print Thumb Writeback indicator for LDMIA
4425 %<bitfield>r print bitfield as an ARM register
4426 %<bitfield>d print bitfield as a decimal
4427 %<bitfield>H print (bitfield * 2) as a decimal
4428 %<bitfield>W print (bitfield * 4) as a decimal
4429 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
4430 %<bitfield>B print Thumb branch destination (signed displacement)
4431 %<bitfield>c print bitfield as a condition code
4432 %<bitnum>'c print specified char iff bit is one
4433 %<bitnum>?ab print a if bit is one else print b. */
4434
4435 static const struct opcode16 thumb_opcodes[] =
4436 {
4437 /* Thumb instructions. */
4438
4439 /* ARMv8-M Security Extensions instructions. */
4440 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"},
4441 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff87, "bxns\t%3-6r"},
4442
4443 /* ARM V8 instructions. */
4444 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xbf50, 0xffff, "sevl%c"},
4445 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xba80, 0xffc0, "hlt\t%0-5x"},
4446 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN), 0xb610, 0xfff7, "setpan\t#%3-3d"},
4447
4448 /* ARM V6K no-argument instructions. */
4449 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"},
4450 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"},
4451 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"},
4452 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"},
4453 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"},
4454 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
4455
4456 /* ARM V6T2 instructions. */
4457 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4458 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
4459 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4460 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
4461 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"},
4462
4463 /* ARM V6. */
4464 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
4465 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
4466 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
4467 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
4468 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
4469 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
4470 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%3?ble%X"},
4471 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
4472 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
4473 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
4474 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
4475
4476 /* ARM V5 ISA extends Thumb. */
4477 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
4478 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
4479 /* This is BLX(2). BLX(1) is a 32-bit instruction. */
4480 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
4481 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
4482 /* ARM V4T ISA (Thumb v1). */
4483 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4484 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
4485 /* Format 4. */
4486 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
4487 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
4488 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
4489 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
4490 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
4491 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
4492 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
4493 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
4494 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
4495 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
4496 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
4497 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
4498 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
4499 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
4500 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
4501 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
4502 /* format 13 */
4503 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
4504 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
4505 /* format 5 */
4506 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"},
4507 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"},
4508 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
4509 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"},
4510 /* format 14 */
4511 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"},
4512 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"},
4513 /* format 2 */
4514 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4515 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
4516 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4517 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
4518 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4519 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
4520 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4521 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
4522 /* format 8 */
4523 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4524 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
4525 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4526 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
4527 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4528 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
4529 /* format 7 */
4530 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4531 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4532 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4533 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4534 /* format 1 */
4535 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
4536 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4537 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
4538 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
4539 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
4540 /* format 3 */
4541 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
4542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
4543 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
4544 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
4545 /* format 6 */
4546 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
4547 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4548 0x4800, 0xF800,
4549 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
4550 /* format 9 */
4551 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4552 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
4553 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4554 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
4555 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4556 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
4557 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4558 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
4559 /* format 10 */
4560 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4561 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
4562 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4563 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
4564 /* format 11 */
4565 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4566 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
4567 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4568 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
4569 /* format 12 */
4570 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4571 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
4572 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4573 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
4574 /* format 15 */
4575 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
4576 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
4577 /* format 17 */
4578 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
4579 /* format 16 */
4580 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
4581 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION},
4582 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
4583 /* format 18 */
4584 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
4585
4586 /* The E800 .. FFFF range is unconditionally redirected to the
4587 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
4588 are processed via that table. Thus, we can never encounter a
4589 bare "second half of BL/BLX(1)" instruction here. */
4590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 0x0000, 0x0000, UNDEFINED_INSTRUCTION},
4591 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4592 };
4593
4594 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
4595 We adopt the convention that hw1 is the high 16 bits of .value and
4596 .mask, hw2 the low 16 bits.
4597
4598 print_insn_thumb32 recognizes the following format control codes:
4599
4600 %% %
4601
4602 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
4603 %M print a modified 12-bit immediate (same location)
4604 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
4605 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
4606 %H print a 16-bit immediate from hw2[3:0],hw1[11:0]
4607 %S print a possibly-shifted Rm
4608
4609 %L print address for a ldrd/strd instruction
4610 %a print the address of a plain load/store
4611 %w print the width and signedness of a core load/store
4612 %m print register mask for ldm/stm
4613 %n print register mask for clrm
4614
4615 %E print the lsb and width fields of a bfc/bfi instruction
4616 %F print the lsb and width fields of a sbfx/ubfx instruction
4617 %G print a fallback offset for Branch Future instructions
4618 %W print an offset for BF instruction
4619 %Y print an offset for BFL instruction
4620 %Z print an offset for BFCSEL instruction
4621 %Q print an offset for Low Overhead Loop instructions
4622 %P print an offset for Low Overhead Loop end instructions
4623 %b print a conditional branch offset
4624 %B print an unconditional branch offset
4625 %s print the shift field of an SSAT instruction
4626 %R print the rotation field of an SXT instruction
4627 %U print barrier type.
4628 %P print address for pli instruction.
4629 %c print the condition code
4630 %x print warning if conditional an not at end of IT block"
4631 %X print "\t; unpredictable <IT:code>" if conditional
4632
4633 %<bitfield>d print bitfield in decimal
4634 %<bitfield>D print bitfield plus one in decimal
4635 %<bitfield>W print bitfield*4 in decimal
4636 %<bitfield>r print bitfield as an ARM register
4637 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
4638 %<bitfield>S as %<>r but r13 and r15 is UNPREDICTABLE
4639 %<bitfield>c print bitfield as a condition code
4640
4641 %<bitfield>'c print specified char iff bitfield is all ones
4642 %<bitfield>`c print specified char iff bitfield is all zeroes
4643 %<bitfield>?ab... select from array of values in big endian order
4644
4645 With one exception at the bottom (done because BL and BLX(1) need
4646 to come dead last), this table was machine-sorted first in
4647 decreasing order of number of bits set in the mask, then in
4648 increasing numeric order of mask, then in increasing numeric order
4649 of opcode. This order is not the clearest for a human reader, but
4650 is guaranteed never to catch a special-case bit pattern with a more
4651 general mask, which is important, because this instruction encoding
4652 makes heavy use of special-case bit patterns. */
4653 static const struct opcode32 thumb32_opcodes[] =
4654 {
4655 /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
4656 instructions. */
4657 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4658 0xf00fe001, 0xffffffff, "lctp%c"},
4659 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4660 0xf02fc001, 0xfffff001, "le\t%P"},
4661 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4662 0xf00fc001, 0xfffff001, "le\tlr, %P"},
4663 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4664 0xf01fc001, 0xfffff001, "letp\tlr, %P"},
4665 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4666 0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"},
4667 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4668 0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"},
4669 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4670 0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"},
4671 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4672 0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"},
4673
4674 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4675 0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
4676 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4677 0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
4678 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4679 0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
4680 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4681 0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
4682 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4683 0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"},
4684
4685 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4686 0xe89f0000, 0xffff2000, "clrm%c\t%n"},
4687
4688 /* ARMv8-M and ARMv8-M Security Extensions instructions. */
4689 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"},
4690 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4691 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
4692 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4693 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
4694 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4695 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
4696 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4697 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
4698
4699 /* ARM V8.2 RAS extension instructions. */
4700 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
4701 0xf3af8010, 0xffffffff, "esb"},
4702
4703 /* V8 instructions. */
4704 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4705 0xf3af8005, 0xffffffff, "sevl%c.w"},
4706 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4707 0xf78f8000, 0xfffffffc, "dcps%0-1d"},
4708 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4709 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
4710 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4711 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
4712 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4713 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
4714 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4715 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
4716 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4717 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
4718 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4719 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
4720 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4721 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
4722 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4723 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
4724 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4725 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
4726 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4727 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
4728 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4729 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
4730 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4731 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
4732 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4733 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
4734 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4735 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
4736
4737 /* V8-R instructions. */
4738 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
4739 0xf3bf8f4c, 0xffffffff, "dfb%c"},
4740
4741 /* CRC32 instructions. */
4742 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4743 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
4744 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4745 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
4746 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4747 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
4748 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4749 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
4750 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4751 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
4752 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4753 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
4754
4755 /* Speculation Barriers. */
4756 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8014, 0xffffffff, "csdb"},
4757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f40, 0xffffffff, "ssbb"},
4758 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f44, 0xffffffff, "pssbb"},
4759
4760 /* V7 instructions. */
4761 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"},
4762 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
4763 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
4764 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
4765 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
4766 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
4767 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
4768 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
4769 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
4770 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
4771 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
4772
4773 /* Virtualization Extension instructions. */
4774 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
4775 /* We skip ERET as that is SUBS pc, lr, #0. */
4776
4777 /* MP Extension instructions. */
4778 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf830f000, 0xff70f000, "pldw%c\t%a"},
4779
4780 /* Security extension instructions. */
4781 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC), 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
4782
4783 /* ARMv8.5-A instructions. */
4784 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf3bf8f70, 0xffffffff, "sb"},
4785
4786 /* Instructions defined in the basic V6T2 set. */
4787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"},
4788 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"},
4789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"},
4790 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"},
4791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"},
4792 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4793 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
4794 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
4795
4796 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4797 0xf3bf8f2f, 0xffffffff, "clrex%c"},
4798 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4799 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
4800 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4801 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
4802 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4803 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
4804 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4805 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
4806 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4807 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
4808 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4809 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
4810 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4811 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
4812 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4813 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
4814 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4815 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
4816 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4817 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
4818 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4819 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
4820 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4821 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
4822 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4823 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
4824 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4825 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
4826 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4827 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
4828 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4829 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
4830 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4831 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
4832 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4833 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
4834 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4835 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
4836 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4837 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
4838 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4839 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
4840 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4841 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
4842 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4843 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
4844 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4845 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
4846 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4847 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
4848 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4849 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
4850 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4851 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
4852 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4853 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
4854 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4855 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
4856 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4857 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
4858 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4859 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
4860 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4861 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
4862 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4863 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
4864 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4865 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
4866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4867 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
4868 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4869 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
4870 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4871 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
4872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4873 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
4874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4875 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
4876 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4877 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
4878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4879 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
4880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4881 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
4882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4883 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
4884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4885 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
4886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4887 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
4888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4889 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
4890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4891 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
4892 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4893 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
4894 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4895 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
4896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4897 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
4898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4899 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
4900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4901 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
4902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4903 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
4904 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4905 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
4906 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4907 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
4908 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4909 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
4910 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4911 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
4912 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4913 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
4914 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4915 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
4916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4917 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
4918 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4919 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
4920 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4921 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
4922 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4923 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
4924 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4925 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
4926 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4927 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
4928 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4929 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
4930 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4931 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
4932 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4933 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
4934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4935 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
4936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4937 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
4938 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4939 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
4940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4941 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
4942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4943 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
4944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4945 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4947 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4948 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4949 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4950 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4951 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
4952 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4953 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
4954 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4955 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
4956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4957 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
4958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4959 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
4960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4961 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4962 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4963 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
4964 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4965 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
4966 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4967 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4968 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4969 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4970 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4971 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4973 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4974 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4975 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4976 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4977 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4978 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4979 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4980 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4981 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
4982 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4983 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
4984 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4985 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
4986 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4987 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
4988 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4989 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
4990 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4991 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
4992 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4993 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
4994 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4995 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
4996 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4997 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
4998 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4999 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
5000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5001 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
5002 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5003 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
5004 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5005 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5006 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5007 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5008 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5009 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5010 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5011 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5012 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5013 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5015 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5017 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5019 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5020 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5021 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
5022 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5023 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
5024 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5025 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
5026 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5027 0xf810f000, 0xff70f000, "pld%c\t%a"},
5028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5029 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5031 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5032 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5033 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5034 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5035 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5036 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5037 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5038 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5039 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5040 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5041 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5043 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
5044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5045 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
5046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5047 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
5048 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5049 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
5050 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5051 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
5052 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5053 0xfb100000, 0xfff000c0,
5054 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5055 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5056 0xfbc00080, 0xfff000c0,
5057 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
5058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5059 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
5060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5061 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
5062 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5063 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
5064 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5065 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
5066 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5067 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
5068 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5069 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
5070 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5071 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
5072 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5073 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
5074 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5075 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
5076 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5077 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
5078 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5079 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
5080 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5081 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
5082 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5083 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
5084 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5085 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
5086 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5087 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
5088 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5089 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
5090 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5091 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
5092 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5093 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
5094 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5095 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
5096 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5097 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
5098 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5099 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
5100 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5101 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
5102 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5103 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
5104 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5105 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
5106 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5107 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
5108 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5109 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
5110 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5111 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
5112 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5113 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
5114 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5115 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
5116 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5117 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
5118 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5119 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
5120 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5121 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
5122 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5123 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
5124 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5125 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
5126 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5127 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
5128 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5129 0xe9400000, 0xff500000,
5130 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
5131 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5132 0xe9500000, 0xff500000,
5133 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
5134 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5135 0xe8600000, 0xff700000,
5136 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
5137 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5138 0xe8700000, 0xff700000,
5139 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
5140 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5141 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
5142 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5143 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
5144
5145 /* Filter out Bcc with cond=E or F, which are used for other instructions. */
5146 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5147 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
5148 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5149 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
5150 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5151 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
5152 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5153 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
5154
5155 /* These have been 32-bit since the invention of Thumb. */
5156 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
5157 0xf000c000, 0xf800d001, "blx%c\t%B%x"},
5158 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
5159 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
5160
5161 /* Fallback. */
5162 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
5163 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
5164 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
5165 };
5166
5167 static const char *const arm_conditional[] =
5168 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
5169 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
5170
5171 static const char *const arm_fp_const[] =
5172 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
5173
5174 static const char *const arm_shift[] =
5175 {"lsl", "lsr", "asr", "ror"};
5176
5177 typedef struct
5178 {
5179 const char *name;
5180 const char *description;
5181 const char *reg_names[16];
5182 }
5183 arm_regname;
5184
5185 static const arm_regname regnames[] =
5186 {
5187 { "reg-names-raw", N_("Select raw register names"),
5188 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
5189 { "reg-names-gcc", N_("Select register names used by GCC"),
5190 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
5191 { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
5192 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
5193 { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL} },
5194 { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL} },
5195 { "reg-names-apcs", N_("Select register names used in the APCS"),
5196 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
5197 { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
5198 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
5199 { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
5200 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
5201 { "coproc<N>=(cde|generic)", N_("Enable CDE extensions for coprocessor N space"), { NULL } }
5202 };
5203
5204 static const char *const iwmmxt_wwnames[] =
5205 {"b", "h", "w", "d"};
5206
5207 static const char *const iwmmxt_wwssnames[] =
5208 {"b", "bus", "bc", "bss",
5209 "h", "hus", "hc", "hss",
5210 "w", "wus", "wc", "wss",
5211 "d", "dus", "dc", "dss"
5212 };
5213
5214 static const char *const iwmmxt_regnames[] =
5215 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
5216 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
5217 };
5218
5219 static const char *const iwmmxt_cregnames[] =
5220 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
5221 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
5222 };
5223
5224 static const char *const vec_condnames[] =
5225 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
5226 };
5227
5228 static const char *const mve_predicatenames[] =
5229 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
5230 "eee", "ee", "eet", "e", "ett", "et", "ete"
5231 };
5232
5233 /* Names for 2-bit size field for mve vector isntructions. */
5234 static const char *const mve_vec_sizename[] =
5235 { "8", "16", "32", "64"};
5236
5237 /* Indicates whether we are processing a then predicate,
5238 else predicate or none at all. */
5239 enum vpt_pred_state
5240 {
5241 PRED_NONE,
5242 PRED_THEN,
5243 PRED_ELSE
5244 };
5245
5246 /* Information used to process a vpt block and subsequent instructions. */
5247 struct vpt_block
5248 {
5249 /* Are we in a vpt block. */
5250 bool in_vpt_block;
5251
5252 /* Next predicate state if in vpt block. */
5253 enum vpt_pred_state next_pred_state;
5254
5255 /* Mask from vpt/vpst instruction. */
5256 long predicate_mask;
5257
5258 /* Instruction number in vpt block. */
5259 long current_insn_num;
5260
5261 /* Number of instructions in vpt block.. */
5262 long num_pred_insn;
5263 };
5264
5265 static struct vpt_block vpt_block_state =
5266 {
5267 false,
5268 PRED_NONE,
5269 0,
5270 0,
5271 0
5272 };
5273
5274 /* Default to GCC register name set. */
5275 static unsigned int regname_selected = 1;
5276
5277 #define NUM_ARM_OPTIONS ARRAY_SIZE (regnames)
5278 #define arm_regnames regnames[regname_selected].reg_names
5279
5280 static bool force_thumb = false;
5281 static uint16_t cde_coprocs = 0;
5282
5283 /* Current IT instruction state. This contains the same state as the IT
5284 bits in the CPSR. */
5285 static unsigned int ifthen_state;
5286 /* IT state for the next instruction. */
5287 static unsigned int ifthen_next_state;
5288 /* The address of the insn for which the IT state is valid. */
5289 static bfd_vma ifthen_address;
5290 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
5291 /* Indicates that the current Conditional state is unconditional or outside
5292 an IT block. */
5293 #define COND_UNCOND 16
5294
5295 \f
5296 /* Functions. */
5297 /* Extract the predicate mask for a VPT or VPST instruction.
5298 The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh). */
5299
5300 static long
5301 mve_extract_pred_mask (long given)
5302 {
5303 return ((given & 0x00400000) >> 19) | ((given & 0xe000) >> 13);
5304 }
5305
5306 /* Return the number of instructions in a MVE predicate block. */
5307 static long
5308 num_instructions_vpt_block (long given)
5309 {
5310 long mask = mve_extract_pred_mask (given);
5311 if (mask == 0)
5312 return 0;
5313
5314 if (mask == 8)
5315 return 1;
5316
5317 if ((mask & 7) == 4)
5318 return 2;
5319
5320 if ((mask & 3) == 2)
5321 return 3;
5322
5323 if ((mask & 1) == 1)
5324 return 4;
5325
5326 return 0;
5327 }
5328
5329 static void
5330 mark_outside_vpt_block (void)
5331 {
5332 vpt_block_state.in_vpt_block = false;
5333 vpt_block_state.next_pred_state = PRED_NONE;
5334 vpt_block_state.predicate_mask = 0;
5335 vpt_block_state.current_insn_num = 0;
5336 vpt_block_state.num_pred_insn = 0;
5337 }
5338
5339 static void
5340 mark_inside_vpt_block (long given)
5341 {
5342 vpt_block_state.in_vpt_block = true;
5343 vpt_block_state.next_pred_state = PRED_THEN;
5344 vpt_block_state.predicate_mask = mve_extract_pred_mask (given);
5345 vpt_block_state.current_insn_num = 0;
5346 vpt_block_state.num_pred_insn = num_instructions_vpt_block (given);
5347 assert (vpt_block_state.num_pred_insn >= 1);
5348 }
5349
5350 static enum vpt_pred_state
5351 invert_next_predicate_state (enum vpt_pred_state astate)
5352 {
5353 if (astate == PRED_THEN)
5354 return PRED_ELSE;
5355 else if (astate == PRED_ELSE)
5356 return PRED_THEN;
5357 else
5358 return PRED_NONE;
5359 }
5360
5361 static enum vpt_pred_state
5362 update_next_predicate_state (void)
5363 {
5364 long pred_mask = vpt_block_state.predicate_mask;
5365 long mask_for_insn = 0;
5366
5367 switch (vpt_block_state.current_insn_num)
5368 {
5369 case 1:
5370 mask_for_insn = 8;
5371 break;
5372
5373 case 2:
5374 mask_for_insn = 4;
5375 break;
5376
5377 case 3:
5378 mask_for_insn = 2;
5379 break;
5380
5381 case 4:
5382 return PRED_NONE;
5383 }
5384
5385 if (pred_mask & mask_for_insn)
5386 return invert_next_predicate_state (vpt_block_state.next_pred_state);
5387 else
5388 return vpt_block_state.next_pred_state;
5389 }
5390
5391 static void
5392 update_vpt_block_state (void)
5393 {
5394 vpt_block_state.current_insn_num++;
5395 if (vpt_block_state.current_insn_num == vpt_block_state.num_pred_insn)
5396 {
5397 /* No more instructions to process in vpt block. */
5398 mark_outside_vpt_block ();
5399 return;
5400 }
5401
5402 vpt_block_state.next_pred_state = update_next_predicate_state ();
5403 }
5404
5405 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
5406 Returns pointer to following character of the format string and
5407 fills in *VALUEP and *WIDTHP with the extracted value and number of
5408 bits extracted. WIDTHP can be NULL. */
5409
5410 static const char *
5411 arm_decode_bitfield (const char *ptr,
5412 unsigned long insn,
5413 unsigned long *valuep,
5414 int *widthp)
5415 {
5416 unsigned long value = 0;
5417 int width = 0;
5418
5419 do
5420 {
5421 int start, end;
5422 int bits;
5423
5424 for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
5425 start = start * 10 + *ptr - '0';
5426 if (*ptr == '-')
5427 for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
5428 end = end * 10 + *ptr - '0';
5429 else
5430 end = start;
5431 bits = end - start;
5432 if (bits < 0)
5433 abort ();
5434 value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
5435 width += bits + 1;
5436 }
5437 while (*ptr++ == ',');
5438 *valuep = value;
5439 if (widthp)
5440 *widthp = width;
5441 return ptr - 1;
5442 }
5443
5444 static void
5445 arm_decode_shift (long given, fprintf_ftype func, void *stream,
5446 bool print_shift)
5447 {
5448 func (stream, "%s", arm_regnames[given & 0xf]);
5449
5450 if ((given & 0xff0) != 0)
5451 {
5452 if ((given & 0x10) == 0)
5453 {
5454 int amount = (given & 0xf80) >> 7;
5455 int shift = (given & 0x60) >> 5;
5456
5457 if (amount == 0)
5458 {
5459 if (shift == 3)
5460 {
5461 func (stream, ", rrx");
5462 return;
5463 }
5464
5465 amount = 32;
5466 }
5467
5468 if (print_shift)
5469 func (stream, ", %s #%d", arm_shift[shift], amount);
5470 else
5471 func (stream, ", #%d", amount);
5472 }
5473 else if ((given & 0x80) == 0x80)
5474 func (stream, "\t; <illegal shifter operand>");
5475 else if (print_shift)
5476 func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
5477 arm_regnames[(given & 0xf00) >> 8]);
5478 else
5479 func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
5480 }
5481 }
5482
5483 /* Return TRUE if the MATCHED_INSN can be inside an IT block. */
5484
5485 static bool
5486 is_mve_okay_in_it (enum mve_instructions matched_insn)
5487 {
5488 switch (matched_insn)
5489 {
5490 case MVE_VMOV_GP_TO_VEC_LANE:
5491 case MVE_VMOV2_VEC_LANE_TO_GP:
5492 case MVE_VMOV2_GP_TO_VEC_LANE:
5493 case MVE_VMOV_VEC_LANE_TO_GP:
5494 case MVE_LSLL:
5495 case MVE_LSLLI:
5496 case MVE_LSRL:
5497 case MVE_ASRL:
5498 case MVE_ASRLI:
5499 case MVE_SQRSHRL:
5500 case MVE_SQRSHR:
5501 case MVE_UQRSHL:
5502 case MVE_UQRSHLL:
5503 case MVE_UQSHL:
5504 case MVE_UQSHLL:
5505 case MVE_URSHRL:
5506 case MVE_URSHR:
5507 case MVE_SRSHRL:
5508 case MVE_SRSHR:
5509 case MVE_SQSHLL:
5510 case MVE_SQSHL:
5511 return true;
5512 default:
5513 return false;
5514 }
5515 }
5516
5517 static bool
5518 is_mve_architecture (struct disassemble_info *info)
5519 {
5520 struct arm_private_data *private_data = info->private_data;
5521 arm_feature_set allowed_arches = private_data->features;
5522
5523 arm_feature_set arm_ext_v8_1m_main
5524 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
5525
5526 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
5527 && !ARM_CPU_IS_ANY (allowed_arches))
5528 return true;
5529 else
5530 return false;
5531 }
5532
5533 static bool
5534 is_vpt_instruction (long given)
5535 {
5536
5537 /* If mkh:mkl is '0000' then its not a vpt/vpst instruction. */
5538 if ((given & 0x0040e000) == 0)
5539 return false;
5540
5541 /* VPT floating point T1 variant. */
5542 if (((given & 0xefb10f50) == 0xee310f00 && ((given & 0x1001) != 0x1))
5543 /* VPT floating point T2 variant. */
5544 || ((given & 0xefb10f50) == 0xee310f40)
5545 /* VPT vector T1 variant. */
5546 || ((given & 0xff811f51) == 0xfe010f00)
5547 /* VPT vector T2 variant. */
5548 || ((given & 0xff811f51) == 0xfe010f01
5549 && ((given & 0x300000) != 0x300000))
5550 /* VPT vector T3 variant. */
5551 || ((given & 0xff811f50) == 0xfe011f00)
5552 /* VPT vector T4 variant. */
5553 || ((given & 0xff811f70) == 0xfe010f40)
5554 /* VPT vector T5 variant. */
5555 || ((given & 0xff811f70) == 0xfe010f60)
5556 /* VPT vector T6 variant. */
5557 || ((given & 0xff811f50) == 0xfe011f40)
5558 /* VPST vector T variant. */
5559 || ((given & 0xffbf1fff) == 0xfe310f4d))
5560 return true;
5561 else
5562 return false;
5563 }
5564
5565 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
5566 and ending bitfield = END. END must be greater than START. */
5567
5568 static unsigned long
5569 arm_decode_field (unsigned long given, unsigned int start, unsigned int end)
5570 {
5571 int bits = end - start;
5572
5573 if (bits < 0)
5574 abort ();
5575
5576 return ((given >> start) & ((2ul << bits) - 1));
5577 }
5578
5579 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
5580 START:END and START2:END2. END/END2 must be greater than
5581 START/START2. */
5582
5583 static unsigned long
5584 arm_decode_field_multiple (unsigned long given, unsigned int start,
5585 unsigned int end, unsigned int start2,
5586 unsigned int end2)
5587 {
5588 int bits = end - start;
5589 int bits2 = end2 - start2;
5590 unsigned long value = 0;
5591 int width = 0;
5592
5593 if (bits2 < 0)
5594 abort ();
5595
5596 value = arm_decode_field (given, start, end);
5597 width += bits + 1;
5598
5599 value |= ((given >> start2) & ((2ul << bits2) - 1)) << width;
5600 return value;
5601 }
5602
5603 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
5604 This helps us decode instructions that change mnemonic depending on specific
5605 operand values/encodings. */
5606
5607 static bool
5608 is_mve_encoding_conflict (unsigned long given,
5609 enum mve_instructions matched_insn)
5610 {
5611 switch (matched_insn)
5612 {
5613 case MVE_VPST:
5614 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5615 return true;
5616 else
5617 return false;
5618
5619 case MVE_VPT_FP_T1:
5620 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5621 return true;
5622 if ((arm_decode_field (given, 12, 12) == 0)
5623 && (arm_decode_field (given, 0, 0) == 1))
5624 return true;
5625 return false;
5626
5627 case MVE_VPT_FP_T2:
5628 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5629 return true;
5630 if (arm_decode_field (given, 0, 3) == 0xd)
5631 return true;
5632 return false;
5633
5634 case MVE_VPT_VEC_T1:
5635 case MVE_VPT_VEC_T2:
5636 case MVE_VPT_VEC_T3:
5637 case MVE_VPT_VEC_T4:
5638 case MVE_VPT_VEC_T5:
5639 case MVE_VPT_VEC_T6:
5640 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5641 return true;
5642 if (arm_decode_field (given, 20, 21) == 3)
5643 return true;
5644 return false;
5645
5646 case MVE_VCMP_FP_T1:
5647 if ((arm_decode_field (given, 12, 12) == 0)
5648 && (arm_decode_field (given, 0, 0) == 1))
5649 return true;
5650 else
5651 return false;
5652
5653 case MVE_VCMP_FP_T2:
5654 if (arm_decode_field (given, 0, 3) == 0xd)
5655 return true;
5656 else
5657 return false;
5658
5659 case MVE_VQADD_T2:
5660 case MVE_VQSUB_T2:
5661 case MVE_VMUL_VEC_T2:
5662 case MVE_VMULH:
5663 case MVE_VRMULH:
5664 case MVE_VMLA:
5665 case MVE_VMAX:
5666 case MVE_VMIN:
5667 case MVE_VBRSR:
5668 case MVE_VADD_VEC_T2:
5669 case MVE_VSUB_VEC_T2:
5670 case MVE_VABAV:
5671 case MVE_VQRSHL_T1:
5672 case MVE_VQSHL_T4:
5673 case MVE_VRSHL_T1:
5674 case MVE_VSHL_T3:
5675 case MVE_VCADD_VEC:
5676 case MVE_VHCADD:
5677 case MVE_VDDUP:
5678 case MVE_VIDUP:
5679 case MVE_VQRDMLADH:
5680 case MVE_VQDMLAH:
5681 case MVE_VQRDMLAH:
5682 case MVE_VQDMLASH:
5683 case MVE_VQRDMLASH:
5684 case MVE_VQDMLSDH:
5685 case MVE_VQRDMLSDH:
5686 case MVE_VQDMULH_T3:
5687 case MVE_VQRDMULH_T4:
5688 case MVE_VQDMLADH:
5689 case MVE_VMLAS:
5690 case MVE_VMULL_INT:
5691 case MVE_VHADD_T2:
5692 case MVE_VHSUB_T2:
5693 case MVE_VCMP_VEC_T1:
5694 case MVE_VCMP_VEC_T2:
5695 case MVE_VCMP_VEC_T3:
5696 case MVE_VCMP_VEC_T4:
5697 case MVE_VCMP_VEC_T5:
5698 case MVE_VCMP_VEC_T6:
5699 if (arm_decode_field (given, 20, 21) == 3)
5700 return true;
5701 else
5702 return false;
5703
5704 case MVE_VLD2:
5705 case MVE_VLD4:
5706 case MVE_VST2:
5707 case MVE_VST4:
5708 if (arm_decode_field (given, 7, 8) == 3)
5709 return true;
5710 else
5711 return false;
5712
5713 case MVE_VSTRB_T1:
5714 case MVE_VSTRH_T2:
5715 if ((arm_decode_field (given, 24, 24) == 0)
5716 && (arm_decode_field (given, 21, 21) == 0))
5717 {
5718 return true;
5719 }
5720 else if ((arm_decode_field (given, 7, 8) == 3))
5721 return true;
5722 else
5723 return false;
5724
5725 case MVE_VLDRB_T1:
5726 case MVE_VLDRH_T2:
5727 case MVE_VLDRW_T7:
5728 case MVE_VSTRB_T5:
5729 case MVE_VSTRH_T6:
5730 case MVE_VSTRW_T7:
5731 if ((arm_decode_field (given, 24, 24) == 0)
5732 && (arm_decode_field (given, 21, 21) == 0))
5733 {
5734 return true;
5735 }
5736 else
5737 return false;
5738
5739 case MVE_VCVT_FP_FIX_VEC:
5740 return (arm_decode_field (given, 16, 21) & 0x38) == 0;
5741
5742 case MVE_VBIC_IMM:
5743 case MVE_VORR_IMM:
5744 {
5745 unsigned long cmode = arm_decode_field (given, 8, 11);
5746
5747 if ((cmode & 1) == 0)
5748 return true;
5749 else if ((cmode & 0xc) == 0xc)
5750 return true;
5751 else
5752 return false;
5753 }
5754
5755 case MVE_VMVN_IMM:
5756 {
5757 unsigned long cmode = arm_decode_field (given, 8, 11);
5758
5759 if (cmode == 0xe)
5760 return true;
5761 else if ((cmode & 0x9) == 1)
5762 return true;
5763 else if ((cmode & 0xd) == 9)
5764 return true;
5765 else
5766 return false;
5767 }
5768
5769 case MVE_VMOV_IMM_TO_VEC:
5770 if ((arm_decode_field (given, 5, 5) == 1)
5771 && (arm_decode_field (given, 8, 11) != 0xe))
5772 return true;
5773 else
5774 return false;
5775
5776 case MVE_VMOVL:
5777 {
5778 unsigned long size = arm_decode_field (given, 19, 20);
5779 if ((size == 0) || (size == 3))
5780 return true;
5781 else
5782 return false;
5783 }
5784
5785 case MVE_VMAXA:
5786 case MVE_VMINA:
5787 case MVE_VMAXV:
5788 case MVE_VMAXAV:
5789 case MVE_VMINV:
5790 case MVE_VMINAV:
5791 case MVE_VQRSHL_T2:
5792 case MVE_VQSHL_T1:
5793 case MVE_VRSHL_T2:
5794 case MVE_VSHL_T2:
5795 case MVE_VSHLL_T2:
5796 case MVE_VADDV:
5797 case MVE_VMOVN:
5798 case MVE_VQMOVUN:
5799 case MVE_VQMOVN:
5800 if (arm_decode_field (given, 18, 19) == 3)
5801 return true;
5802 else
5803 return false;
5804
5805 case MVE_VMLSLDAV:
5806 case MVE_VRMLSLDAVH:
5807 case MVE_VMLALDAV:
5808 case MVE_VADDLV:
5809 if (arm_decode_field (given, 20, 22) == 7)
5810 return true;
5811 else
5812 return false;
5813
5814 case MVE_VRMLALDAVH:
5815 if ((arm_decode_field (given, 20, 22) & 6) == 6)
5816 return true;
5817 else
5818 return false;
5819
5820 case MVE_VDWDUP:
5821 case MVE_VIWDUP:
5822 if ((arm_decode_field (given, 20, 21) == 3)
5823 || (arm_decode_field (given, 1, 3) == 7))
5824 return true;
5825 else
5826 return false;
5827
5828
5829 case MVE_VSHLL_T1:
5830 if (arm_decode_field (given, 16, 18) == 0)
5831 {
5832 unsigned long sz = arm_decode_field (given, 19, 20);
5833
5834 if ((sz == 1) || (sz == 2))
5835 return true;
5836 else
5837 return false;
5838 }
5839 else
5840 return false;
5841
5842 case MVE_VQSHL_T2:
5843 case MVE_VQSHLU_T3:
5844 case MVE_VRSHR:
5845 case MVE_VSHL_T1:
5846 case MVE_VSHR:
5847 case MVE_VSLI:
5848 case MVE_VSRI:
5849 if (arm_decode_field (given, 19, 21) == 0)
5850 return true;
5851 else
5852 return false;
5853
5854 case MVE_VCTP:
5855 if (arm_decode_field (given, 16, 19) == 0xf)
5856 return true;
5857 else
5858 return false;
5859
5860 case MVE_ASRLI:
5861 case MVE_ASRL:
5862 case MVE_LSLLI:
5863 case MVE_LSLL:
5864 case MVE_LSRL:
5865 case MVE_SQRSHRL:
5866 case MVE_SQSHLL:
5867 case MVE_SRSHRL:
5868 case MVE_UQRSHLL:
5869 case MVE_UQSHLL:
5870 case MVE_URSHRL:
5871 if (arm_decode_field (given, 9, 11) == 0x7)
5872 return true;
5873 else
5874 return false;
5875
5876 case MVE_CSINC:
5877 case MVE_CSINV:
5878 {
5879 unsigned long rm, rn;
5880 rm = arm_decode_field (given, 0, 3);
5881 rn = arm_decode_field (given, 16, 19);
5882 /* CSET/CSETM. */
5883 if (rm == 0xf && rn == 0xf)
5884 return true;
5885 /* CINC/CINV. */
5886 else if (rn == rm && rn != 0xf)
5887 return true;
5888 }
5889 /* Fall through. */
5890 case MVE_CSEL:
5891 case MVE_CSNEG:
5892 if (arm_decode_field (given, 0, 3) == 0xd)
5893 return true;
5894 /* CNEG. */
5895 else if (matched_insn == MVE_CSNEG)
5896 if (arm_decode_field (given, 0, 3) == arm_decode_field (given, 16, 19))
5897 return true;
5898 return false;
5899
5900 default:
5901 case MVE_VADD_FP_T1:
5902 case MVE_VADD_FP_T2:
5903 case MVE_VADD_VEC_T1:
5904 return false;
5905
5906 }
5907 }
5908
5909 static void
5910 print_mve_vld_str_addr (struct disassemble_info *info,
5911 unsigned long given,
5912 enum mve_instructions matched_insn)
5913 {
5914 void *stream = info->stream;
5915 fprintf_ftype func = info->fprintf_func;
5916
5917 unsigned long p, w, gpr, imm, add, mod_imm;
5918
5919 imm = arm_decode_field (given, 0, 6);
5920 mod_imm = imm;
5921
5922 switch (matched_insn)
5923 {
5924 case MVE_VLDRB_T1:
5925 case MVE_VSTRB_T1:
5926 gpr = arm_decode_field (given, 16, 18);
5927 break;
5928
5929 case MVE_VLDRH_T2:
5930 case MVE_VSTRH_T2:
5931 gpr = arm_decode_field (given, 16, 18);
5932 mod_imm = imm << 1;
5933 break;
5934
5935 case MVE_VLDRH_T6:
5936 case MVE_VSTRH_T6:
5937 gpr = arm_decode_field (given, 16, 19);
5938 mod_imm = imm << 1;
5939 break;
5940
5941 case MVE_VLDRW_T7:
5942 case MVE_VSTRW_T7:
5943 gpr = arm_decode_field (given, 16, 19);
5944 mod_imm = imm << 2;
5945 break;
5946
5947 case MVE_VLDRB_T5:
5948 case MVE_VSTRB_T5:
5949 gpr = arm_decode_field (given, 16, 19);
5950 break;
5951
5952 default:
5953 return;
5954 }
5955
5956 p = arm_decode_field (given, 24, 24);
5957 w = arm_decode_field (given, 21, 21);
5958
5959 add = arm_decode_field (given, 23, 23);
5960
5961 char * add_sub;
5962
5963 /* Don't print anything for '+' as it is implied. */
5964 if (add == 1)
5965 add_sub = "";
5966 else
5967 add_sub = "-";
5968
5969 if (p == 1)
5970 {
5971 /* Offset mode. */
5972 if (w == 0)
5973 func (stream, "[%s, #%s%lu]", arm_regnames[gpr], add_sub, mod_imm);
5974 /* Pre-indexed mode. */
5975 else
5976 func (stream, "[%s, #%s%lu]!", arm_regnames[gpr], add_sub, mod_imm);
5977 }
5978 else if ((p == 0) && (w == 1))
5979 /* Post-index mode. */
5980 func (stream, "[%s], #%s%lu", arm_regnames[gpr], add_sub, mod_imm);
5981 }
5982
5983 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
5984 Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
5985 this encoding is undefined. */
5986
5987 static bool
5988 is_mve_undefined (unsigned long given, enum mve_instructions matched_insn,
5989 enum mve_undefined *undefined_code)
5990 {
5991 *undefined_code = UNDEF_NONE;
5992
5993 switch (matched_insn)
5994 {
5995 case MVE_VDUP:
5996 if (arm_decode_field_multiple (given, 5, 5, 22, 22) == 3)
5997 {
5998 *undefined_code = UNDEF_SIZE_3;
5999 return true;
6000 }
6001 else
6002 return false;
6003
6004 case MVE_VQADD_T1:
6005 case MVE_VQSUB_T1:
6006 case MVE_VMUL_VEC_T1:
6007 case MVE_VABD_VEC:
6008 case MVE_VADD_VEC_T1:
6009 case MVE_VSUB_VEC_T1:
6010 case MVE_VQDMULH_T1:
6011 case MVE_VQRDMULH_T2:
6012 case MVE_VRHADD:
6013 case MVE_VHADD_T1:
6014 case MVE_VHSUB_T1:
6015 if (arm_decode_field (given, 20, 21) == 3)
6016 {
6017 *undefined_code = UNDEF_SIZE_3;
6018 return true;
6019 }
6020 else
6021 return false;
6022
6023 case MVE_VLDRB_T1:
6024 if (arm_decode_field (given, 7, 8) == 3)
6025 {
6026 *undefined_code = UNDEF_SIZE_3;
6027 return true;
6028 }
6029 else
6030 return false;
6031
6032 case MVE_VLDRH_T2:
6033 if (arm_decode_field (given, 7, 8) <= 1)
6034 {
6035 *undefined_code = UNDEF_SIZE_LE_1;
6036 return true;
6037 }
6038 else
6039 return false;
6040
6041 case MVE_VSTRB_T1:
6042 if ((arm_decode_field (given, 7, 8) == 0))
6043 {
6044 *undefined_code = UNDEF_SIZE_0;
6045 return true;
6046 }
6047 else
6048 return false;
6049
6050 case MVE_VSTRH_T2:
6051 if ((arm_decode_field (given, 7, 8) <= 1))
6052 {
6053 *undefined_code = UNDEF_SIZE_LE_1;
6054 return true;
6055 }
6056 else
6057 return false;
6058
6059 case MVE_VLDRB_GATHER_T1:
6060 if (arm_decode_field (given, 7, 8) == 3)
6061 {
6062 *undefined_code = UNDEF_SIZE_3;
6063 return true;
6064 }
6065 else if ((arm_decode_field (given, 28, 28) == 0)
6066 && (arm_decode_field (given, 7, 8) == 0))
6067 {
6068 *undefined_code = UNDEF_NOT_UNS_SIZE_0;
6069 return true;
6070 }
6071 else
6072 return false;
6073
6074 case MVE_VLDRH_GATHER_T2:
6075 if (arm_decode_field (given, 7, 8) == 3)
6076 {
6077 *undefined_code = UNDEF_SIZE_3;
6078 return true;
6079 }
6080 else if ((arm_decode_field (given, 28, 28) == 0)
6081 && (arm_decode_field (given, 7, 8) == 1))
6082 {
6083 *undefined_code = UNDEF_NOT_UNS_SIZE_1;
6084 return true;
6085 }
6086 else if (arm_decode_field (given, 7, 8) == 0)
6087 {
6088 *undefined_code = UNDEF_SIZE_0;
6089 return true;
6090 }
6091 else
6092 return false;
6093
6094 case MVE_VLDRW_GATHER_T3:
6095 if (arm_decode_field (given, 7, 8) != 2)
6096 {
6097 *undefined_code = UNDEF_SIZE_NOT_2;
6098 return true;
6099 }
6100 else if (arm_decode_field (given, 28, 28) == 0)
6101 {
6102 *undefined_code = UNDEF_NOT_UNSIGNED;
6103 return true;
6104 }
6105 else
6106 return false;
6107
6108 case MVE_VLDRD_GATHER_T4:
6109 if (arm_decode_field (given, 7, 8) != 3)
6110 {
6111 *undefined_code = UNDEF_SIZE_NOT_3;
6112 return true;
6113 }
6114 else if (arm_decode_field (given, 28, 28) == 0)
6115 {
6116 *undefined_code = UNDEF_NOT_UNSIGNED;
6117 return true;
6118 }
6119 else
6120 return false;
6121
6122 case MVE_VSTRB_SCATTER_T1:
6123 if (arm_decode_field (given, 7, 8) == 3)
6124 {
6125 *undefined_code = UNDEF_SIZE_3;
6126 return true;
6127 }
6128 else
6129 return false;
6130
6131 case MVE_VSTRH_SCATTER_T2:
6132 {
6133 unsigned long size = arm_decode_field (given, 7, 8);
6134 if (size == 3)
6135 {
6136 *undefined_code = UNDEF_SIZE_3;
6137 return true;
6138 }
6139 else if (size == 0)
6140 {
6141 *undefined_code = UNDEF_SIZE_0;
6142 return true;
6143 }
6144 else
6145 return false;
6146 }
6147
6148 case MVE_VSTRW_SCATTER_T3:
6149 if (arm_decode_field (given, 7, 8) != 2)
6150 {
6151 *undefined_code = UNDEF_SIZE_NOT_2;
6152 return true;
6153 }
6154 else
6155 return false;
6156
6157 case MVE_VSTRD_SCATTER_T4:
6158 if (arm_decode_field (given, 7, 8) != 3)
6159 {
6160 *undefined_code = UNDEF_SIZE_NOT_3;
6161 return true;
6162 }
6163 else
6164 return false;
6165
6166 case MVE_VCVT_FP_FIX_VEC:
6167 {
6168 unsigned long imm6 = arm_decode_field (given, 16, 21);
6169 if ((imm6 & 0x20) == 0)
6170 {
6171 *undefined_code = UNDEF_VCVT_IMM6;
6172 return true;
6173 }
6174
6175 if ((arm_decode_field (given, 9, 9) == 0)
6176 && ((imm6 & 0x30) == 0x20))
6177 {
6178 *undefined_code = UNDEF_VCVT_FSI_IMM6;
6179 return true;
6180 }
6181
6182 return false;
6183 }
6184
6185 case MVE_VNEG_FP:
6186 case MVE_VABS_FP:
6187 case MVE_VCVT_BETWEEN_FP_INT:
6188 case MVE_VCVT_FROM_FP_TO_INT:
6189 {
6190 unsigned long size = arm_decode_field (given, 18, 19);
6191 if (size == 0)
6192 {
6193 *undefined_code = UNDEF_SIZE_0;
6194 return true;
6195 }
6196 else if (size == 3)
6197 {
6198 *undefined_code = UNDEF_SIZE_3;
6199 return true;
6200 }
6201 else
6202 return false;
6203 }
6204
6205 case MVE_VMOV_VEC_LANE_TO_GP:
6206 {
6207 unsigned long op1 = arm_decode_field (given, 21, 22);
6208 unsigned long op2 = arm_decode_field (given, 5, 6);
6209 unsigned long u = arm_decode_field (given, 23, 23);
6210
6211 if ((op2 == 0) && (u == 1))
6212 {
6213 if ((op1 == 0) || (op1 == 1))
6214 {
6215 *undefined_code = UNDEF_BAD_U_OP1_OP2;
6216 return true;
6217 }
6218 else
6219 return false;
6220 }
6221 else if (op2 == 2)
6222 {
6223 if ((op1 == 0) || (op1 == 1))
6224 {
6225 *undefined_code = UNDEF_BAD_OP1_OP2;
6226 return true;
6227 }
6228 else
6229 return false;
6230 }
6231
6232 return false;
6233 }
6234
6235 case MVE_VMOV_GP_TO_VEC_LANE:
6236 if (arm_decode_field (given, 5, 6) == 2)
6237 {
6238 unsigned long op1 = arm_decode_field (given, 21, 22);
6239 if ((op1 == 0) || (op1 == 1))
6240 {
6241 *undefined_code = UNDEF_BAD_OP1_OP2;
6242 return true;
6243 }
6244 else
6245 return false;
6246 }
6247 else
6248 return false;
6249
6250 case MVE_VMOV_VEC_TO_VEC:
6251 if ((arm_decode_field (given, 5, 5) == 1)
6252 || (arm_decode_field (given, 22, 22) == 1))
6253 return true;
6254 return false;
6255
6256 case MVE_VMOV_IMM_TO_VEC:
6257 if (arm_decode_field (given, 5, 5) == 0)
6258 {
6259 unsigned long cmode = arm_decode_field (given, 8, 11);
6260
6261 if (((cmode & 9) == 1) || ((cmode & 5) == 1))
6262 {
6263 *undefined_code = UNDEF_OP_0_BAD_CMODE;
6264 return true;
6265 }
6266 else
6267 return false;
6268 }
6269 else
6270 return false;
6271
6272 case MVE_VSHLL_T2:
6273 case MVE_VMOVN:
6274 if (arm_decode_field (given, 18, 19) == 2)
6275 {
6276 *undefined_code = UNDEF_SIZE_2;
6277 return true;
6278 }
6279 else
6280 return false;
6281
6282 case MVE_VRMLALDAVH:
6283 case MVE_VMLADAV_T1:
6284 case MVE_VMLADAV_T2:
6285 case MVE_VMLALDAV:
6286 if ((arm_decode_field (given, 28, 28) == 1)
6287 && (arm_decode_field (given, 12, 12) == 1))
6288 {
6289 *undefined_code = UNDEF_XCHG_UNS;
6290 return true;
6291 }
6292 else
6293 return false;
6294
6295 case MVE_VQSHRN:
6296 case MVE_VQSHRUN:
6297 case MVE_VSHLL_T1:
6298 case MVE_VSHRN:
6299 {
6300 unsigned long sz = arm_decode_field (given, 19, 20);
6301 if (sz == 1)
6302 return false;
6303 else if ((sz & 2) == 2)
6304 return false;
6305 else
6306 {
6307 *undefined_code = UNDEF_SIZE;
6308 return true;
6309 }
6310 }
6311 break;
6312
6313 case MVE_VQSHL_T2:
6314 case MVE_VQSHLU_T3:
6315 case MVE_VRSHR:
6316 case MVE_VSHL_T1:
6317 case MVE_VSHR:
6318 case MVE_VSLI:
6319 case MVE_VSRI:
6320 {
6321 unsigned long sz = arm_decode_field (given, 19, 21);
6322 if ((sz & 7) == 1)
6323 return false;
6324 else if ((sz & 6) == 2)
6325 return false;
6326 else if ((sz & 4) == 4)
6327 return false;
6328 else
6329 {
6330 *undefined_code = UNDEF_SIZE;
6331 return true;
6332 }
6333 }
6334
6335 case MVE_VQRSHRN:
6336 case MVE_VQRSHRUN:
6337 if (arm_decode_field (given, 19, 20) == 0)
6338 {
6339 *undefined_code = UNDEF_SIZE_0;
6340 return true;
6341 }
6342 else
6343 return false;
6344
6345 case MVE_VABS_VEC:
6346 if (arm_decode_field (given, 18, 19) == 3)
6347 {
6348 *undefined_code = UNDEF_SIZE_3;
6349 return true;
6350 }
6351 else
6352 return false;
6353
6354 case MVE_VQNEG:
6355 case MVE_VQABS:
6356 case MVE_VNEG_VEC:
6357 case MVE_VCLS:
6358 case MVE_VCLZ:
6359 if (arm_decode_field (given, 18, 19) == 3)
6360 {
6361 *undefined_code = UNDEF_SIZE_3;
6362 return true;
6363 }
6364 else
6365 return false;
6366
6367 case MVE_VREV16:
6368 if (arm_decode_field (given, 18, 19) == 0)
6369 return false;
6370 else
6371 {
6372 *undefined_code = UNDEF_SIZE_NOT_0;
6373 return true;
6374 }
6375
6376 case MVE_VREV32:
6377 {
6378 unsigned long size = arm_decode_field (given, 18, 19);
6379 if ((size & 2) == 2)
6380 {
6381 *undefined_code = UNDEF_SIZE_2;
6382 return true;
6383 }
6384 else
6385 return false;
6386 }
6387
6388 case MVE_VREV64:
6389 if (arm_decode_field (given, 18, 19) != 3)
6390 return false;
6391 else
6392 {
6393 *undefined_code = UNDEF_SIZE_3;
6394 return true;
6395 }
6396
6397 default:
6398 return false;
6399 }
6400 }
6401
6402 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
6403 Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
6404 why this encoding is unpredictable. */
6405
6406 static bool
6407 is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn,
6408 enum mve_unpredictable *unpredictable_code)
6409 {
6410 *unpredictable_code = UNPRED_NONE;
6411
6412 switch (matched_insn)
6413 {
6414 case MVE_VCMP_FP_T2:
6415 case MVE_VPT_FP_T2:
6416 if ((arm_decode_field (given, 12, 12) == 0)
6417 && (arm_decode_field (given, 5, 5) == 1))
6418 {
6419 *unpredictable_code = UNPRED_FCA_0_FCB_1;
6420 return true;
6421 }
6422 else
6423 return false;
6424
6425 case MVE_VPT_VEC_T4:
6426 case MVE_VPT_VEC_T5:
6427 case MVE_VPT_VEC_T6:
6428 case MVE_VCMP_VEC_T4:
6429 case MVE_VCMP_VEC_T5:
6430 case MVE_VCMP_VEC_T6:
6431 if (arm_decode_field (given, 0, 3) == 0xd)
6432 {
6433 *unpredictable_code = UNPRED_R13;
6434 return true;
6435 }
6436 else
6437 return false;
6438
6439 case MVE_VDUP:
6440 {
6441 unsigned long gpr = arm_decode_field (given, 12, 15);
6442 if (gpr == 0xd)
6443 {
6444 *unpredictable_code = UNPRED_R13;
6445 return true;
6446 }
6447 else if (gpr == 0xf)
6448 {
6449 *unpredictable_code = UNPRED_R15;
6450 return true;
6451 }
6452
6453 return false;
6454 }
6455
6456 case MVE_VQADD_T2:
6457 case MVE_VQSUB_T2:
6458 case MVE_VMUL_FP_T2:
6459 case MVE_VMUL_VEC_T2:
6460 case MVE_VMLA:
6461 case MVE_VBRSR:
6462 case MVE_VADD_FP_T2:
6463 case MVE_VSUB_FP_T2:
6464 case MVE_VADD_VEC_T2:
6465 case MVE_VSUB_VEC_T2:
6466 case MVE_VQRSHL_T2:
6467 case MVE_VQSHL_T1:
6468 case MVE_VRSHL_T2:
6469 case MVE_VSHL_T2:
6470 case MVE_VSHLC:
6471 case MVE_VQDMLAH:
6472 case MVE_VQRDMLAH:
6473 case MVE_VQDMLASH:
6474 case MVE_VQRDMLASH:
6475 case MVE_VQDMULH_T3:
6476 case MVE_VQRDMULH_T4:
6477 case MVE_VMLAS:
6478 case MVE_VFMA_FP_SCALAR:
6479 case MVE_VFMAS_FP_SCALAR:
6480 case MVE_VHADD_T2:
6481 case MVE_VHSUB_T2:
6482 {
6483 unsigned long gpr = arm_decode_field (given, 0, 3);
6484 if (gpr == 0xd)
6485 {
6486 *unpredictable_code = UNPRED_R13;
6487 return true;
6488 }
6489 else if (gpr == 0xf)
6490 {
6491 *unpredictable_code = UNPRED_R15;
6492 return true;
6493 }
6494
6495 return false;
6496 }
6497
6498 case MVE_VLD2:
6499 case MVE_VST2:
6500 {
6501 unsigned long rn = arm_decode_field (given, 16, 19);
6502
6503 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6504 {
6505 *unpredictable_code = UNPRED_R13_AND_WB;
6506 return true;
6507 }
6508
6509 if (rn == 0xf)
6510 {
6511 *unpredictable_code = UNPRED_R15;
6512 return true;
6513 }
6514
6515 if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 6)
6516 {
6517 *unpredictable_code = UNPRED_Q_GT_6;
6518 return true;
6519 }
6520 else
6521 return false;
6522 }
6523
6524 case MVE_VLD4:
6525 case MVE_VST4:
6526 {
6527 unsigned long rn = arm_decode_field (given, 16, 19);
6528
6529 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6530 {
6531 *unpredictable_code = UNPRED_R13_AND_WB;
6532 return true;
6533 }
6534
6535 if (rn == 0xf)
6536 {
6537 *unpredictable_code = UNPRED_R15;
6538 return true;
6539 }
6540
6541 if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 4)
6542 {
6543 *unpredictable_code = UNPRED_Q_GT_4;
6544 return true;
6545 }
6546 else
6547 return false;
6548 }
6549
6550 case MVE_VLDRB_T5:
6551 case MVE_VLDRH_T6:
6552 case MVE_VLDRW_T7:
6553 case MVE_VSTRB_T5:
6554 case MVE_VSTRH_T6:
6555 case MVE_VSTRW_T7:
6556 {
6557 unsigned long rn = arm_decode_field (given, 16, 19);
6558
6559 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6560 {
6561 *unpredictable_code = UNPRED_R13_AND_WB;
6562 return true;
6563 }
6564 else if (rn == 0xf)
6565 {
6566 *unpredictable_code = UNPRED_R15;
6567 return true;
6568 }
6569 else
6570 return false;
6571 }
6572
6573 case MVE_VLDRB_GATHER_T1:
6574 if (arm_decode_field (given, 0, 0) == 1)
6575 {
6576 *unpredictable_code = UNPRED_OS;
6577 return true;
6578 }
6579
6580 /* fall through. */
6581 /* To handle common code with T2-T4 variants. */
6582 case MVE_VLDRH_GATHER_T2:
6583 case MVE_VLDRW_GATHER_T3:
6584 case MVE_VLDRD_GATHER_T4:
6585 {
6586 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6587 unsigned long qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6588
6589 if (qd == qm)
6590 {
6591 *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6592 return true;
6593 }
6594
6595 if (arm_decode_field (given, 16, 19) == 0xf)
6596 {
6597 *unpredictable_code = UNPRED_R15;
6598 return true;
6599 }
6600
6601 return false;
6602 }
6603
6604 case MVE_VLDRW_GATHER_T5:
6605 case MVE_VLDRD_GATHER_T6:
6606 {
6607 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6608 unsigned long qm = arm_decode_field_multiple (given, 17, 19, 7, 7);
6609
6610 if (qd == qm)
6611 {
6612 *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6613 return true;
6614 }
6615 else
6616 return false;
6617 }
6618
6619 case MVE_VSTRB_SCATTER_T1:
6620 if (arm_decode_field (given, 16, 19) == 0xf)
6621 {
6622 *unpredictable_code = UNPRED_R15;
6623 return true;
6624 }
6625 else if (arm_decode_field (given, 0, 0) == 1)
6626 {
6627 *unpredictable_code = UNPRED_OS;
6628 return true;
6629 }
6630 else
6631 return false;
6632
6633 case MVE_VSTRH_SCATTER_T2:
6634 case MVE_VSTRW_SCATTER_T3:
6635 case MVE_VSTRD_SCATTER_T4:
6636 if (arm_decode_field (given, 16, 19) == 0xf)
6637 {
6638 *unpredictable_code = UNPRED_R15;
6639 return true;
6640 }
6641 else
6642 return false;
6643
6644 case MVE_VMOV2_VEC_LANE_TO_GP:
6645 case MVE_VMOV2_GP_TO_VEC_LANE:
6646 case MVE_VCVT_BETWEEN_FP_INT:
6647 case MVE_VCVT_FROM_FP_TO_INT:
6648 {
6649 unsigned long rt = arm_decode_field (given, 0, 3);
6650 unsigned long rt2 = arm_decode_field (given, 16, 19);
6651
6652 if ((rt == 0xd) || (rt2 == 0xd))
6653 {
6654 *unpredictable_code = UNPRED_R13;
6655 return true;
6656 }
6657 else if ((rt == 0xf) || (rt2 == 0xf))
6658 {
6659 *unpredictable_code = UNPRED_R15;
6660 return true;
6661 }
6662 else if (rt == rt2 && matched_insn != MVE_VMOV2_GP_TO_VEC_LANE)
6663 {
6664 *unpredictable_code = UNPRED_GP_REGS_EQUAL;
6665 return true;
6666 }
6667
6668 return false;
6669 }
6670
6671 case MVE_VMAXV:
6672 case MVE_VMAXAV:
6673 case MVE_VMAXNMV_FP:
6674 case MVE_VMAXNMAV_FP:
6675 case MVE_VMINNMV_FP:
6676 case MVE_VMINNMAV_FP:
6677 case MVE_VMINV:
6678 case MVE_VMINAV:
6679 case MVE_VABAV:
6680 case MVE_VMOV_HFP_TO_GP:
6681 case MVE_VMOV_GP_TO_VEC_LANE:
6682 case MVE_VMOV_VEC_LANE_TO_GP:
6683 {
6684 unsigned long rda = arm_decode_field (given, 12, 15);
6685 if (rda == 0xd)
6686 {
6687 *unpredictable_code = UNPRED_R13;
6688 return true;
6689 }
6690 else if (rda == 0xf)
6691 {
6692 *unpredictable_code = UNPRED_R15;
6693 return true;
6694 }
6695
6696 return false;
6697 }
6698
6699 case MVE_VMULL_INT:
6700 {
6701 unsigned long Qd;
6702 unsigned long Qm;
6703 unsigned long Qn;
6704
6705 if (arm_decode_field (given, 20, 21) == 2)
6706 {
6707 Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6708 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6709 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6710
6711 if ((Qd == Qn) || (Qd == Qm))
6712 {
6713 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
6714 return true;
6715 }
6716 else
6717 return false;
6718 }
6719 else
6720 return false;
6721 }
6722
6723 case MVE_VCMUL_FP:
6724 case MVE_VQDMULL_T1:
6725 {
6726 unsigned long Qd;
6727 unsigned long Qm;
6728 unsigned long Qn;
6729
6730 if (arm_decode_field (given, 28, 28) == 1)
6731 {
6732 Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6733 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6734 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6735
6736 if ((Qd == Qn) || (Qd == Qm))
6737 {
6738 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6739 return true;
6740 }
6741 else
6742 return false;
6743 }
6744 else
6745 return false;
6746 }
6747
6748 case MVE_VQDMULL_T2:
6749 {
6750 unsigned long gpr = arm_decode_field (given, 0, 3);
6751 if (gpr == 0xd)
6752 {
6753 *unpredictable_code = UNPRED_R13;
6754 return true;
6755 }
6756 else if (gpr == 0xf)
6757 {
6758 *unpredictable_code = UNPRED_R15;
6759 return true;
6760 }
6761
6762 if (arm_decode_field (given, 28, 28) == 1)
6763 {
6764 unsigned long Qd
6765 = arm_decode_field_multiple (given, 13, 15, 22, 22);
6766 unsigned long Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6767
6768 if (Qd == Qn)
6769 {
6770 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6771 return true;
6772 }
6773 else
6774 return false;
6775 }
6776
6777 return false;
6778 }
6779
6780 case MVE_VMLSLDAV:
6781 case MVE_VRMLSLDAVH:
6782 case MVE_VMLALDAV:
6783 case MVE_VADDLV:
6784 if (arm_decode_field (given, 20, 22) == 6)
6785 {
6786 *unpredictable_code = UNPRED_R13;
6787 return true;
6788 }
6789 else
6790 return false;
6791
6792 case MVE_VDWDUP:
6793 case MVE_VIWDUP:
6794 if (arm_decode_field (given, 1, 3) == 6)
6795 {
6796 *unpredictable_code = UNPRED_R13;
6797 return true;
6798 }
6799 else
6800 return false;
6801
6802 case MVE_VCADD_VEC:
6803 case MVE_VHCADD:
6804 {
6805 unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6806 unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6807 if ((Qd == Qm) && arm_decode_field (given, 20, 21) == 2)
6808 {
6809 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
6810 return true;
6811 }
6812 else
6813 return false;
6814 }
6815
6816 case MVE_VCADD_FP:
6817 {
6818 unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6819 unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6820 if ((Qd == Qm) && arm_decode_field (given, 20, 20) == 1)
6821 {
6822 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6823 return true;
6824 }
6825 else
6826 return false;
6827 }
6828
6829 case MVE_VCMLA_FP:
6830 {
6831 unsigned long Qda;
6832 unsigned long Qm;
6833 unsigned long Qn;
6834
6835 if (arm_decode_field (given, 20, 20) == 1)
6836 {
6837 Qda = arm_decode_field_multiple (given, 13, 15, 22, 22);
6838 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6839 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6840
6841 if ((Qda == Qn) || (Qda == Qm))
6842 {
6843 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6844 return true;
6845 }
6846 else
6847 return false;
6848 }
6849 else
6850 return false;
6851
6852 }
6853
6854 case MVE_VCTP:
6855 if (arm_decode_field (given, 16, 19) == 0xd)
6856 {
6857 *unpredictable_code = UNPRED_R13;
6858 return true;
6859 }
6860 else
6861 return false;
6862
6863 case MVE_VREV64:
6864 {
6865 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6866 unsigned long qm = arm_decode_field_multiple (given, 1, 3, 6, 6);
6867
6868 if (qd == qm)
6869 {
6870 *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6871 return true;
6872 }
6873 else
6874 return false;
6875 }
6876
6877 case MVE_LSLL:
6878 case MVE_LSLLI:
6879 case MVE_LSRL:
6880 case MVE_ASRL:
6881 case MVE_ASRLI:
6882 case MVE_UQSHLL:
6883 case MVE_UQRSHLL:
6884 case MVE_URSHRL:
6885 case MVE_SRSHRL:
6886 case MVE_SQSHLL:
6887 case MVE_SQRSHRL:
6888 {
6889 unsigned long gpr = arm_decode_field (given, 9, 11);
6890 gpr = ((gpr << 1) | 1);
6891 if (gpr == 0xd)
6892 {
6893 *unpredictable_code = UNPRED_R13;
6894 return true;
6895 }
6896 else if (gpr == 0xf)
6897 {
6898 *unpredictable_code = UNPRED_R15;
6899 return true;
6900 }
6901
6902 return false;
6903 }
6904
6905 default:
6906 return false;
6907 }
6908 }
6909
6910 static void
6911 print_mve_vmov_index (struct disassemble_info *info, unsigned long given)
6912 {
6913 unsigned long op1 = arm_decode_field (given, 21, 22);
6914 unsigned long op2 = arm_decode_field (given, 5, 6);
6915 unsigned long h = arm_decode_field (given, 16, 16);
6916 unsigned long index_operand, esize, targetBeat, idx;
6917 void *stream = info->stream;
6918 fprintf_ftype func = info->fprintf_func;
6919
6920 if ((op1 & 0x2) == 0x2)
6921 {
6922 index_operand = op2;
6923 esize = 8;
6924 }
6925 else if (((op1 & 0x2) == 0x0) && ((op2 & 0x1) == 0x1))
6926 {
6927 index_operand = op2 >> 1;
6928 esize = 16;
6929 }
6930 else if (((op1 & 0x2) == 0) && ((op2 & 0x3) == 0))
6931 {
6932 index_operand = 0;
6933 esize = 32;
6934 }
6935 else
6936 {
6937 func (stream, "<undefined index>");
6938 return;
6939 }
6940
6941 targetBeat = (op1 & 0x1) | (h << 1);
6942 idx = index_operand + targetBeat * (32/esize);
6943
6944 func (stream, "%lu", idx);
6945 }
6946
6947 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
6948 in length and integer of floating-point type. */
6949 static void
6950 print_simd_imm8 (struct disassemble_info *info, unsigned long given,
6951 unsigned int ibit_loc, const struct mopcode32 *insn)
6952 {
6953 int bits = 0;
6954 int cmode = (given >> 8) & 0xf;
6955 int op = (given >> 5) & 0x1;
6956 unsigned long value = 0, hival = 0;
6957 unsigned shift;
6958 int size = 0;
6959 int isfloat = 0;
6960 void *stream = info->stream;
6961 fprintf_ftype func = info->fprintf_func;
6962
6963 /* On Neon the 'i' bit is at bit 24, on mve it is
6964 at bit 28. */
6965 bits |= ((given >> ibit_loc) & 1) << 7;
6966 bits |= ((given >> 16) & 7) << 4;
6967 bits |= ((given >> 0) & 15) << 0;
6968
6969 if (cmode < 8)
6970 {
6971 shift = (cmode >> 1) & 3;
6972 value = (unsigned long) bits << (8 * shift);
6973 size = 32;
6974 }
6975 else if (cmode < 12)
6976 {
6977 shift = (cmode >> 1) & 1;
6978 value = (unsigned long) bits << (8 * shift);
6979 size = 16;
6980 }
6981 else if (cmode < 14)
6982 {
6983 shift = (cmode & 1) + 1;
6984 value = (unsigned long) bits << (8 * shift);
6985 value |= (1ul << (8 * shift)) - 1;
6986 size = 32;
6987 }
6988 else if (cmode == 14)
6989 {
6990 if (op)
6991 {
6992 /* Bit replication into bytes. */
6993 int ix;
6994 unsigned long mask;
6995
6996 value = 0;
6997 hival = 0;
6998 for (ix = 7; ix >= 0; ix--)
6999 {
7000 mask = ((bits >> ix) & 1) ? 0xff : 0;
7001 if (ix <= 3)
7002 value = (value << 8) | mask;
7003 else
7004 hival = (hival << 8) | mask;
7005 }
7006 size = 64;
7007 }
7008 else
7009 {
7010 /* Byte replication. */
7011 value = (unsigned long) bits;
7012 size = 8;
7013 }
7014 }
7015 else if (!op)
7016 {
7017 /* Floating point encoding. */
7018 int tmp;
7019
7020 value = (unsigned long) (bits & 0x7f) << 19;
7021 value |= (unsigned long) (bits & 0x80) << 24;
7022 tmp = bits & 0x40 ? 0x3c : 0x40;
7023 value |= (unsigned long) tmp << 24;
7024 size = 32;
7025 isfloat = 1;
7026 }
7027 else
7028 {
7029 func (stream, "<illegal constant %.8x:%x:%x>",
7030 bits, cmode, op);
7031 size = 32;
7032 return;
7033 }
7034
7035 /* printU determines whether the immediate value should be printed as
7036 unsigned. */
7037 unsigned printU = 0;
7038 switch (insn->mve_op)
7039 {
7040 default:
7041 break;
7042 /* We want this for instructions that don't have a 'signed' type. */
7043 case MVE_VBIC_IMM:
7044 case MVE_VORR_IMM:
7045 case MVE_VMVN_IMM:
7046 case MVE_VMOV_IMM_TO_VEC:
7047 printU = 1;
7048 break;
7049 }
7050 switch (size)
7051 {
7052 case 8:
7053 func (stream, "#%ld\t; 0x%.2lx", value, value);
7054 break;
7055
7056 case 16:
7057 func (stream,
7058 printU
7059 ? "#%lu\t; 0x%.4lx"
7060 : "#%ld\t; 0x%.4lx", value, value);
7061 break;
7062
7063 case 32:
7064 if (isfloat)
7065 {
7066 unsigned char valbytes[4];
7067 double fvalue;
7068
7069 /* Do this a byte at a time so we don't have to
7070 worry about the host's endianness. */
7071 valbytes[0] = value & 0xff;
7072 valbytes[1] = (value >> 8) & 0xff;
7073 valbytes[2] = (value >> 16) & 0xff;
7074 valbytes[3] = (value >> 24) & 0xff;
7075
7076 floatformat_to_double
7077 (& floatformat_ieee_single_little, valbytes,
7078 & fvalue);
7079
7080 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
7081 value);
7082 }
7083 else
7084 func (stream,
7085 printU
7086 ? "#%lu\t; 0x%.8lx"
7087 : "#%ld\t; 0x%.8lx",
7088 (long) (((value & 0x80000000L) != 0)
7089 && !printU
7090 ? value | ~0xffffffffL : value),
7091 value);
7092 break;
7093
7094 case 64:
7095 func (stream, "#0x%.8lx%.8lx", hival, value);
7096 break;
7097
7098 default:
7099 abort ();
7100 }
7101
7102 }
7103
7104 static void
7105 print_mve_undefined (struct disassemble_info *info,
7106 enum mve_undefined undefined_code)
7107 {
7108 void *stream = info->stream;
7109 fprintf_ftype func = info->fprintf_func;
7110
7111 func (stream, "\t\tundefined instruction: ");
7112
7113 switch (undefined_code)
7114 {
7115 case UNDEF_SIZE:
7116 func (stream, "illegal size");
7117 break;
7118
7119 case UNDEF_SIZE_0:
7120 func (stream, "size equals zero");
7121 break;
7122
7123 case UNDEF_SIZE_2:
7124 func (stream, "size equals two");
7125 break;
7126
7127 case UNDEF_SIZE_3:
7128 func (stream, "size equals three");
7129 break;
7130
7131 case UNDEF_SIZE_LE_1:
7132 func (stream, "size <= 1");
7133 break;
7134
7135 case UNDEF_SIZE_NOT_0:
7136 func (stream, "size not equal to 0");
7137 break;
7138
7139 case UNDEF_SIZE_NOT_2:
7140 func (stream, "size not equal to 2");
7141 break;
7142
7143 case UNDEF_SIZE_NOT_3:
7144 func (stream, "size not equal to 3");
7145 break;
7146
7147 case UNDEF_NOT_UNS_SIZE_0:
7148 func (stream, "not unsigned and size = zero");
7149 break;
7150
7151 case UNDEF_NOT_UNS_SIZE_1:
7152 func (stream, "not unsigned and size = one");
7153 break;
7154
7155 case UNDEF_NOT_UNSIGNED:
7156 func (stream, "not unsigned");
7157 break;
7158
7159 case UNDEF_VCVT_IMM6:
7160 func (stream, "invalid imm6");
7161 break;
7162
7163 case UNDEF_VCVT_FSI_IMM6:
7164 func (stream, "fsi = 0 and invalid imm6");
7165 break;
7166
7167 case UNDEF_BAD_OP1_OP2:
7168 func (stream, "bad size with op2 = 2 and op1 = 0 or 1");
7169 break;
7170
7171 case UNDEF_BAD_U_OP1_OP2:
7172 func (stream, "unsigned with op2 = 0 and op1 = 0 or 1");
7173 break;
7174
7175 case UNDEF_OP_0_BAD_CMODE:
7176 func (stream, "op field equal 0 and bad cmode");
7177 break;
7178
7179 case UNDEF_XCHG_UNS:
7180 func (stream, "exchange and unsigned together");
7181 break;
7182
7183 case UNDEF_NONE:
7184 break;
7185 }
7186
7187 }
7188
7189 static void
7190 print_mve_unpredictable (struct disassemble_info *info,
7191 enum mve_unpredictable unpredict_code)
7192 {
7193 void *stream = info->stream;
7194 fprintf_ftype func = info->fprintf_func;
7195
7196 func (stream, "%s: ", UNPREDICTABLE_INSTRUCTION);
7197
7198 switch (unpredict_code)
7199 {
7200 case UNPRED_IT_BLOCK:
7201 func (stream, "mve instruction in it block");
7202 break;
7203
7204 case UNPRED_FCA_0_FCB_1:
7205 func (stream, "condition bits, fca = 0 and fcb = 1");
7206 break;
7207
7208 case UNPRED_R13:
7209 func (stream, "use of r13 (sp)");
7210 break;
7211
7212 case UNPRED_R15:
7213 func (stream, "use of r15 (pc)");
7214 break;
7215
7216 case UNPRED_Q_GT_4:
7217 func (stream, "start register block > r4");
7218 break;
7219
7220 case UNPRED_Q_GT_6:
7221 func (stream, "start register block > r6");
7222 break;
7223
7224 case UNPRED_R13_AND_WB:
7225 func (stream, "use of r13 and write back");
7226 break;
7227
7228 case UNPRED_Q_REGS_EQUAL:
7229 func (stream,
7230 "same vector register used for destination and other operand");
7231 break;
7232
7233 case UNPRED_OS:
7234 func (stream, "use of offset scaled");
7235 break;
7236
7237 case UNPRED_GP_REGS_EQUAL:
7238 func (stream, "same general-purpose register used for both operands");
7239 break;
7240
7241 case UNPRED_Q_REGS_EQ_AND_SIZE_1:
7242 func (stream, "use of identical q registers and size = 1");
7243 break;
7244
7245 case UNPRED_Q_REGS_EQ_AND_SIZE_2:
7246 func (stream, "use of identical q registers and size = 1");
7247 break;
7248
7249 case UNPRED_NONE:
7250 break;
7251 }
7252 }
7253
7254 /* Print register block operand for mve vld2/vld4/vst2/vld4. */
7255
7256 static void
7257 print_mve_register_blocks (struct disassemble_info *info,
7258 unsigned long given,
7259 enum mve_instructions matched_insn)
7260 {
7261 void *stream = info->stream;
7262 fprintf_ftype func = info->fprintf_func;
7263
7264 unsigned long q_reg_start = arm_decode_field_multiple (given,
7265 13, 15,
7266 22, 22);
7267 switch (matched_insn)
7268 {
7269 case MVE_VLD2:
7270 case MVE_VST2:
7271 if (q_reg_start <= 6)
7272 func (stream, "{q%ld, q%ld}", q_reg_start, q_reg_start + 1);
7273 else
7274 func (stream, "<illegal reg q%ld>", q_reg_start);
7275 break;
7276
7277 case MVE_VLD4:
7278 case MVE_VST4:
7279 if (q_reg_start <= 4)
7280 func (stream, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start,
7281 q_reg_start + 1, q_reg_start + 2,
7282 q_reg_start + 3);
7283 else
7284 func (stream, "<illegal reg q%ld>", q_reg_start);
7285 break;
7286
7287 default:
7288 break;
7289 }
7290 }
7291
7292 static void
7293 print_mve_rounding_mode (struct disassemble_info *info,
7294 unsigned long given,
7295 enum mve_instructions matched_insn)
7296 {
7297 void *stream = info->stream;
7298 fprintf_ftype func = info->fprintf_func;
7299
7300 switch (matched_insn)
7301 {
7302 case MVE_VCVT_FROM_FP_TO_INT:
7303 {
7304 switch (arm_decode_field (given, 8, 9))
7305 {
7306 case 0:
7307 func (stream, "a");
7308 break;
7309
7310 case 1:
7311 func (stream, "n");
7312 break;
7313
7314 case 2:
7315 func (stream, "p");
7316 break;
7317
7318 case 3:
7319 func (stream, "m");
7320 break;
7321
7322 default:
7323 break;
7324 }
7325 }
7326 break;
7327
7328 case MVE_VRINT_FP:
7329 {
7330 switch (arm_decode_field (given, 7, 9))
7331 {
7332 case 0:
7333 func (stream, "n");
7334 break;
7335
7336 case 1:
7337 func (stream, "x");
7338 break;
7339
7340 case 2:
7341 func (stream, "a");
7342 break;
7343
7344 case 3:
7345 func (stream, "z");
7346 break;
7347
7348 case 5:
7349 func (stream, "m");
7350 break;
7351
7352 case 7:
7353 func (stream, "p");
7354
7355 case 4:
7356 case 6:
7357 default:
7358 break;
7359 }
7360 }
7361 break;
7362
7363 default:
7364 break;
7365 }
7366 }
7367
7368 static void
7369 print_mve_vcvt_size (struct disassemble_info *info,
7370 unsigned long given,
7371 enum mve_instructions matched_insn)
7372 {
7373 unsigned long mode = 0;
7374 void *stream = info->stream;
7375 fprintf_ftype func = info->fprintf_func;
7376
7377 switch (matched_insn)
7378 {
7379 case MVE_VCVT_FP_FIX_VEC:
7380 {
7381 mode = (((given & 0x200) >> 7)
7382 | ((given & 0x10000000) >> 27)
7383 | ((given & 0x100) >> 8));
7384
7385 switch (mode)
7386 {
7387 case 0:
7388 func (stream, "f16.s16");
7389 break;
7390
7391 case 1:
7392 func (stream, "s16.f16");
7393 break;
7394
7395 case 2:
7396 func (stream, "f16.u16");
7397 break;
7398
7399 case 3:
7400 func (stream, "u16.f16");
7401 break;
7402
7403 case 4:
7404 func (stream, "f32.s32");
7405 break;
7406
7407 case 5:
7408 func (stream, "s32.f32");
7409 break;
7410
7411 case 6:
7412 func (stream, "f32.u32");
7413 break;
7414
7415 case 7:
7416 func (stream, "u32.f32");
7417 break;
7418
7419 default:
7420 break;
7421 }
7422 break;
7423 }
7424 case MVE_VCVT_BETWEEN_FP_INT:
7425 {
7426 unsigned long size = arm_decode_field (given, 18, 19);
7427 unsigned long op = arm_decode_field (given, 7, 8);
7428
7429 if (size == 1)
7430 {
7431 switch (op)
7432 {
7433 case 0:
7434 func (stream, "f16.s16");
7435 break;
7436
7437 case 1:
7438 func (stream, "f16.u16");
7439 break;
7440
7441 case 2:
7442 func (stream, "s16.f16");
7443 break;
7444
7445 case 3:
7446 func (stream, "u16.f16");
7447 break;
7448
7449 default:
7450 break;
7451 }
7452 }
7453 else if (size == 2)
7454 {
7455 switch (op)
7456 {
7457 case 0:
7458 func (stream, "f32.s32");
7459 break;
7460
7461 case 1:
7462 func (stream, "f32.u32");
7463 break;
7464
7465 case 2:
7466 func (stream, "s32.f32");
7467 break;
7468
7469 case 3:
7470 func (stream, "u32.f32");
7471 break;
7472 }
7473 }
7474 }
7475 break;
7476
7477 case MVE_VCVT_FP_HALF_FP:
7478 {
7479 unsigned long op = arm_decode_field (given, 28, 28);
7480 if (op == 0)
7481 func (stream, "f16.f32");
7482 else if (op == 1)
7483 func (stream, "f32.f16");
7484 }
7485 break;
7486
7487 case MVE_VCVT_FROM_FP_TO_INT:
7488 {
7489 unsigned long size = arm_decode_field_multiple (given, 7, 7, 18, 19);
7490
7491 switch (size)
7492 {
7493 case 2:
7494 func (stream, "s16.f16");
7495 break;
7496
7497 case 3:
7498 func (stream, "u16.f16");
7499 break;
7500
7501 case 4:
7502 func (stream, "s32.f32");
7503 break;
7504
7505 case 5:
7506 func (stream, "u32.f32");
7507 break;
7508
7509 default:
7510 break;
7511 }
7512 }
7513 break;
7514
7515 default:
7516 break;
7517 }
7518 }
7519
7520 static void
7521 print_mve_rotate (struct disassemble_info *info, unsigned long rot,
7522 unsigned long rot_width)
7523 {
7524 void *stream = info->stream;
7525 fprintf_ftype func = info->fprintf_func;
7526
7527 if (rot_width == 1)
7528 {
7529 switch (rot)
7530 {
7531 case 0:
7532 func (stream, "90");
7533 break;
7534 case 1:
7535 func (stream, "270");
7536 break;
7537 default:
7538 break;
7539 }
7540 }
7541 else if (rot_width == 2)
7542 {
7543 switch (rot)
7544 {
7545 case 0:
7546 func (stream, "0");
7547 break;
7548 case 1:
7549 func (stream, "90");
7550 break;
7551 case 2:
7552 func (stream, "180");
7553 break;
7554 case 3:
7555 func (stream, "270");
7556 break;
7557 default:
7558 break;
7559 }
7560 }
7561 }
7562
7563 static void
7564 print_instruction_predicate (struct disassemble_info *info)
7565 {
7566 void *stream = info->stream;
7567 fprintf_ftype func = info->fprintf_func;
7568
7569 if (vpt_block_state.next_pred_state == PRED_THEN)
7570 func (stream, "t");
7571 else if (vpt_block_state.next_pred_state == PRED_ELSE)
7572 func (stream, "e");
7573 }
7574
7575 static void
7576 print_mve_size (struct disassemble_info *info,
7577 unsigned long size,
7578 enum mve_instructions matched_insn)
7579 {
7580 void *stream = info->stream;
7581 fprintf_ftype func = info->fprintf_func;
7582
7583 switch (matched_insn)
7584 {
7585 case MVE_VABAV:
7586 case MVE_VABD_VEC:
7587 case MVE_VABS_FP:
7588 case MVE_VABS_VEC:
7589 case MVE_VADD_VEC_T1:
7590 case MVE_VADD_VEC_T2:
7591 case MVE_VADDV:
7592 case MVE_VBRSR:
7593 case MVE_VCADD_VEC:
7594 case MVE_VCLS:
7595 case MVE_VCLZ:
7596 case MVE_VCMP_VEC_T1:
7597 case MVE_VCMP_VEC_T2:
7598 case MVE_VCMP_VEC_T3:
7599 case MVE_VCMP_VEC_T4:
7600 case MVE_VCMP_VEC_T5:
7601 case MVE_VCMP_VEC_T6:
7602 case MVE_VCTP:
7603 case MVE_VDDUP:
7604 case MVE_VDWDUP:
7605 case MVE_VHADD_T1:
7606 case MVE_VHADD_T2:
7607 case MVE_VHCADD:
7608 case MVE_VHSUB_T1:
7609 case MVE_VHSUB_T2:
7610 case MVE_VIDUP:
7611 case MVE_VIWDUP:
7612 case MVE_VLD2:
7613 case MVE_VLD4:
7614 case MVE_VLDRB_GATHER_T1:
7615 case MVE_VLDRH_GATHER_T2:
7616 case MVE_VLDRW_GATHER_T3:
7617 case MVE_VLDRD_GATHER_T4:
7618 case MVE_VLDRB_T1:
7619 case MVE_VLDRH_T2:
7620 case MVE_VMAX:
7621 case MVE_VMAXA:
7622 case MVE_VMAXV:
7623 case MVE_VMAXAV:
7624 case MVE_VMIN:
7625 case MVE_VMINA:
7626 case MVE_VMINV:
7627 case MVE_VMINAV:
7628 case MVE_VMLA:
7629 case MVE_VMLAS:
7630 case MVE_VMUL_VEC_T1:
7631 case MVE_VMUL_VEC_T2:
7632 case MVE_VMULH:
7633 case MVE_VRMULH:
7634 case MVE_VMULL_INT:
7635 case MVE_VNEG_FP:
7636 case MVE_VNEG_VEC:
7637 case MVE_VPT_VEC_T1:
7638 case MVE_VPT_VEC_T2:
7639 case MVE_VPT_VEC_T3:
7640 case MVE_VPT_VEC_T4:
7641 case MVE_VPT_VEC_T5:
7642 case MVE_VPT_VEC_T6:
7643 case MVE_VQABS:
7644 case MVE_VQADD_T1:
7645 case MVE_VQADD_T2:
7646 case MVE_VQDMLADH:
7647 case MVE_VQRDMLADH:
7648 case MVE_VQDMLAH:
7649 case MVE_VQRDMLAH:
7650 case MVE_VQDMLASH:
7651 case MVE_VQRDMLASH:
7652 case MVE_VQDMLSDH:
7653 case MVE_VQRDMLSDH:
7654 case MVE_VQDMULH_T1:
7655 case MVE_VQRDMULH_T2:
7656 case MVE_VQDMULH_T3:
7657 case MVE_VQRDMULH_T4:
7658 case MVE_VQNEG:
7659 case MVE_VQRSHL_T1:
7660 case MVE_VQRSHL_T2:
7661 case MVE_VQSHL_T1:
7662 case MVE_VQSHL_T4:
7663 case MVE_VQSUB_T1:
7664 case MVE_VQSUB_T2:
7665 case MVE_VREV32:
7666 case MVE_VREV64:
7667 case MVE_VRHADD:
7668 case MVE_VRINT_FP:
7669 case MVE_VRSHL_T1:
7670 case MVE_VRSHL_T2:
7671 case MVE_VSHL_T2:
7672 case MVE_VSHL_T3:
7673 case MVE_VSHLL_T2:
7674 case MVE_VST2:
7675 case MVE_VST4:
7676 case MVE_VSTRB_SCATTER_T1:
7677 case MVE_VSTRH_SCATTER_T2:
7678 case MVE_VSTRW_SCATTER_T3:
7679 case MVE_VSTRB_T1:
7680 case MVE_VSTRH_T2:
7681 case MVE_VSUB_VEC_T1:
7682 case MVE_VSUB_VEC_T2:
7683 if (size <= 3)
7684 func (stream, "%s", mve_vec_sizename[size]);
7685 else
7686 func (stream, "<undef size>");
7687 break;
7688
7689 case MVE_VABD_FP:
7690 case MVE_VADD_FP_T1:
7691 case MVE_VADD_FP_T2:
7692 case MVE_VSUB_FP_T1:
7693 case MVE_VSUB_FP_T2:
7694 case MVE_VCMP_FP_T1:
7695 case MVE_VCMP_FP_T2:
7696 case MVE_VFMA_FP_SCALAR:
7697 case MVE_VFMA_FP:
7698 case MVE_VFMS_FP:
7699 case MVE_VFMAS_FP_SCALAR:
7700 case MVE_VMAXNM_FP:
7701 case MVE_VMAXNMA_FP:
7702 case MVE_VMAXNMV_FP:
7703 case MVE_VMAXNMAV_FP:
7704 case MVE_VMINNM_FP:
7705 case MVE_VMINNMA_FP:
7706 case MVE_VMINNMV_FP:
7707 case MVE_VMINNMAV_FP:
7708 case MVE_VMUL_FP_T1:
7709 case MVE_VMUL_FP_T2:
7710 case MVE_VPT_FP_T1:
7711 case MVE_VPT_FP_T2:
7712 if (size == 0)
7713 func (stream, "32");
7714 else if (size == 1)
7715 func (stream, "16");
7716 break;
7717
7718 case MVE_VCADD_FP:
7719 case MVE_VCMLA_FP:
7720 case MVE_VCMUL_FP:
7721 case MVE_VMLADAV_T1:
7722 case MVE_VMLALDAV:
7723 case MVE_VMLSDAV_T1:
7724 case MVE_VMLSLDAV:
7725 case MVE_VMOVN:
7726 case MVE_VQDMULL_T1:
7727 case MVE_VQDMULL_T2:
7728 case MVE_VQMOVN:
7729 case MVE_VQMOVUN:
7730 if (size == 0)
7731 func (stream, "16");
7732 else if (size == 1)
7733 func (stream, "32");
7734 break;
7735
7736 case MVE_VMOVL:
7737 if (size == 1)
7738 func (stream, "8");
7739 else if (size == 2)
7740 func (stream, "16");
7741 break;
7742
7743 case MVE_VDUP:
7744 switch (size)
7745 {
7746 case 0:
7747 func (stream, "32");
7748 break;
7749 case 1:
7750 func (stream, "16");
7751 break;
7752 case 2:
7753 func (stream, "8");
7754 break;
7755 default:
7756 break;
7757 }
7758 break;
7759
7760 case MVE_VMOV_GP_TO_VEC_LANE:
7761 case MVE_VMOV_VEC_LANE_TO_GP:
7762 switch (size)
7763 {
7764 case 0: case 4:
7765 func (stream, "32");
7766 break;
7767
7768 case 1: case 3:
7769 case 5: case 7:
7770 func (stream, "16");
7771 break;
7772
7773 case 8: case 9: case 10: case 11:
7774 case 12: case 13: case 14: case 15:
7775 func (stream, "8");
7776 break;
7777
7778 default:
7779 break;
7780 }
7781 break;
7782
7783 case MVE_VMOV_IMM_TO_VEC:
7784 switch (size)
7785 {
7786 case 0: case 4: case 8:
7787 case 12: case 24: case 26:
7788 func (stream, "i32");
7789 break;
7790 case 16: case 20:
7791 func (stream, "i16");
7792 break;
7793 case 28:
7794 func (stream, "i8");
7795 break;
7796 case 29:
7797 func (stream, "i64");
7798 break;
7799 case 30:
7800 func (stream, "f32");
7801 break;
7802 default:
7803 break;
7804 }
7805 break;
7806
7807 case MVE_VMULL_POLY:
7808 if (size == 0)
7809 func (stream, "p8");
7810 else if (size == 1)
7811 func (stream, "p16");
7812 break;
7813
7814 case MVE_VMVN_IMM:
7815 switch (size)
7816 {
7817 case 0: case 2: case 4:
7818 case 6: case 12: case 13:
7819 func (stream, "32");
7820 break;
7821
7822 case 8: case 10:
7823 func (stream, "16");
7824 break;
7825
7826 default:
7827 break;
7828 }
7829 break;
7830
7831 case MVE_VBIC_IMM:
7832 case MVE_VORR_IMM:
7833 switch (size)
7834 {
7835 case 1: case 3:
7836 case 5: case 7:
7837 func (stream, "32");
7838 break;
7839
7840 case 9: case 11:
7841 func (stream, "16");
7842 break;
7843
7844 default:
7845 break;
7846 }
7847 break;
7848
7849 case MVE_VQSHRN:
7850 case MVE_VQSHRUN:
7851 case MVE_VQRSHRN:
7852 case MVE_VQRSHRUN:
7853 case MVE_VRSHRN:
7854 case MVE_VSHRN:
7855 {
7856 switch (size)
7857 {
7858 case 1:
7859 func (stream, "16");
7860 break;
7861
7862 case 2: case 3:
7863 func (stream, "32");
7864 break;
7865
7866 default:
7867 break;
7868 }
7869 }
7870 break;
7871
7872 case MVE_VQSHL_T2:
7873 case MVE_VQSHLU_T3:
7874 case MVE_VRSHR:
7875 case MVE_VSHL_T1:
7876 case MVE_VSHLL_T1:
7877 case MVE_VSHR:
7878 case MVE_VSLI:
7879 case MVE_VSRI:
7880 {
7881 switch (size)
7882 {
7883 case 1:
7884 func (stream, "8");
7885 break;
7886
7887 case 2: case 3:
7888 func (stream, "16");
7889 break;
7890
7891 case 4: case 5: case 6: case 7:
7892 func (stream, "32");
7893 break;
7894
7895 default:
7896 break;
7897 }
7898 }
7899 break;
7900
7901 default:
7902 break;
7903 }
7904 }
7905
7906 static void
7907 print_mve_shift_n (struct disassemble_info *info, long given,
7908 enum mve_instructions matched_insn)
7909 {
7910 void *stream = info->stream;
7911 fprintf_ftype func = info->fprintf_func;
7912
7913 int startAt0
7914 = matched_insn == MVE_VQSHL_T2
7915 || matched_insn == MVE_VQSHLU_T3
7916 || matched_insn == MVE_VSHL_T1
7917 || matched_insn == MVE_VSHLL_T1
7918 || matched_insn == MVE_VSLI;
7919
7920 unsigned imm6 = (given & 0x3f0000) >> 16;
7921
7922 if (matched_insn == MVE_VSHLL_T1)
7923 imm6 &= 0x1f;
7924
7925 unsigned shiftAmount = 0;
7926 if ((imm6 & 0x20) != 0)
7927 shiftAmount = startAt0 ? imm6 - 32 : 64 - imm6;
7928 else if ((imm6 & 0x10) != 0)
7929 shiftAmount = startAt0 ? imm6 - 16 : 32 - imm6;
7930 else if ((imm6 & 0x08) != 0)
7931 shiftAmount = startAt0 ? imm6 - 8 : 16 - imm6;
7932 else
7933 print_mve_undefined (info, UNDEF_SIZE_0);
7934
7935 func (stream, "%u", shiftAmount);
7936 }
7937
7938 static void
7939 print_vec_condition (struct disassemble_info *info, long given,
7940 enum mve_instructions matched_insn)
7941 {
7942 void *stream = info->stream;
7943 fprintf_ftype func = info->fprintf_func;
7944 long vec_cond = 0;
7945
7946 switch (matched_insn)
7947 {
7948 case MVE_VPT_FP_T1:
7949 case MVE_VCMP_FP_T1:
7950 vec_cond = (((given & 0x1000) >> 10)
7951 | ((given & 1) << 1)
7952 | ((given & 0x0080) >> 7));
7953 func (stream, "%s",vec_condnames[vec_cond]);
7954 break;
7955
7956 case MVE_VPT_FP_T2:
7957 case MVE_VCMP_FP_T2:
7958 vec_cond = (((given & 0x1000) >> 10)
7959 | ((given & 0x0020) >> 4)
7960 | ((given & 0x0080) >> 7));
7961 func (stream, "%s",vec_condnames[vec_cond]);
7962 break;
7963
7964 case MVE_VPT_VEC_T1:
7965 case MVE_VCMP_VEC_T1:
7966 vec_cond = (given & 0x0080) >> 7;
7967 func (stream, "%s",vec_condnames[vec_cond]);
7968 break;
7969
7970 case MVE_VPT_VEC_T2:
7971 case MVE_VCMP_VEC_T2:
7972 vec_cond = 2 | ((given & 0x0080) >> 7);
7973 func (stream, "%s",vec_condnames[vec_cond]);
7974 break;
7975
7976 case MVE_VPT_VEC_T3:
7977 case MVE_VCMP_VEC_T3:
7978 vec_cond = 4 | ((given & 1) << 1) | ((given & 0x0080) >> 7);
7979 func (stream, "%s",vec_condnames[vec_cond]);
7980 break;
7981
7982 case MVE_VPT_VEC_T4:
7983 case MVE_VCMP_VEC_T4:
7984 vec_cond = (given & 0x0080) >> 7;
7985 func (stream, "%s",vec_condnames[vec_cond]);
7986 break;
7987
7988 case MVE_VPT_VEC_T5:
7989 case MVE_VCMP_VEC_T5:
7990 vec_cond = 2 | ((given & 0x0080) >> 7);
7991 func (stream, "%s",vec_condnames[vec_cond]);
7992 break;
7993
7994 case MVE_VPT_VEC_T6:
7995 case MVE_VCMP_VEC_T6:
7996 vec_cond = 4 | ((given & 0x0020) >> 4) | ((given & 0x0080) >> 7);
7997 func (stream, "%s",vec_condnames[vec_cond]);
7998 break;
7999
8000 case MVE_NONE:
8001 case MVE_VPST:
8002 default:
8003 break;
8004 }
8005 }
8006
8007 #define W_BIT 21
8008 #define I_BIT 22
8009 #define U_BIT 23
8010 #define P_BIT 24
8011
8012 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
8013 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
8014 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0)
8015 #define PRE_BIT_SET (given & (1 << P_BIT))
8016
8017
8018 /* Print one coprocessor instruction on INFO->STREAM.
8019 Return TRUE if the instuction matched, FALSE if this is not a
8020 recognised coprocessor instruction. */
8021
8022 static bool
8023 print_insn_coprocessor_1 (const struct sopcode32 *opcodes,
8024 bfd_vma pc,
8025 struct disassemble_info *info,
8026 long given,
8027 bool thumb)
8028 {
8029 const struct sopcode32 *insn;
8030 void *stream = info->stream;
8031 fprintf_ftype func = info->fprintf_func;
8032 unsigned long mask;
8033 unsigned long value = 0;
8034 int cond;
8035 int cp_num;
8036 struct arm_private_data *private_data = info->private_data;
8037 arm_feature_set allowed_arches = ARM_ARCH_NONE;
8038 arm_feature_set arm_ext_v8_1m_main =
8039 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
8040
8041 allowed_arches = private_data->features;
8042
8043 for (insn = opcodes; insn->assembler; insn++)
8044 {
8045 unsigned long u_reg = 16;
8046 bool is_unpredictable = false;
8047 signed long value_in_comment = 0;
8048 const char *c;
8049
8050 if (ARM_FEATURE_ZERO (insn->arch))
8051 switch (insn->value)
8052 {
8053 case SENTINEL_IWMMXT_START:
8054 if (info->mach != bfd_mach_arm_XScale
8055 && info->mach != bfd_mach_arm_iWMMXt
8056 && info->mach != bfd_mach_arm_iWMMXt2)
8057 do
8058 insn++;
8059 while ((! ARM_FEATURE_ZERO (insn->arch))
8060 && insn->value != SENTINEL_IWMMXT_END);
8061 continue;
8062
8063 case SENTINEL_IWMMXT_END:
8064 continue;
8065
8066 case SENTINEL_GENERIC_START:
8067 allowed_arches = private_data->features;
8068 continue;
8069
8070 default:
8071 abort ();
8072 }
8073
8074 mask = insn->mask;
8075 value = insn->value;
8076 cp_num = (given >> 8) & 0xf;
8077
8078 if (thumb)
8079 {
8080 /* The high 4 bits are 0xe for Arm conditional instructions, and
8081 0xe for arm unconditional instructions. The rest of the
8082 encoding is the same. */
8083 mask |= 0xf0000000;
8084 value |= 0xe0000000;
8085 if (ifthen_state)
8086 cond = IFTHEN_COND;
8087 else
8088 cond = COND_UNCOND;
8089 }
8090 else
8091 {
8092 /* Only match unconditional instuctions against unconditional
8093 patterns. */
8094 if ((given & 0xf0000000) == 0xf0000000)
8095 {
8096 mask |= 0xf0000000;
8097 cond = COND_UNCOND;
8098 }
8099 else
8100 {
8101 cond = (given >> 28) & 0xf;
8102 if (cond == 0xe)
8103 cond = COND_UNCOND;
8104 }
8105 }
8106
8107 if ((insn->isa == T32 && !thumb)
8108 || (insn->isa == ARM && thumb))
8109 continue;
8110
8111 if ((given & mask) != value)
8112 continue;
8113
8114 if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches))
8115 continue;
8116
8117 if (insn->value == 0xfe000010 /* mcr2 */
8118 || insn->value == 0xfe100010 /* mrc2 */
8119 || insn->value == 0xfc100000 /* ldc2 */
8120 || insn->value == 0xfc000000) /* stc2 */
8121 {
8122 if (cp_num == 9 || cp_num == 10 || cp_num == 11)
8123 is_unpredictable = true;
8124
8125 /* Armv8.1-M Mainline FP & MVE instructions. */
8126 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
8127 && !ARM_CPU_IS_ANY (allowed_arches)
8128 && (cp_num == 8 || cp_num == 14 || cp_num == 15))
8129 continue;
8130
8131 }
8132 else if (insn->value == 0x0e000000 /* cdp */
8133 || insn->value == 0xfe000000 /* cdp2 */
8134 || insn->value == 0x0e000010 /* mcr */
8135 || insn->value == 0x0e100010 /* mrc */
8136 || insn->value == 0x0c100000 /* ldc */
8137 || insn->value == 0x0c000000) /* stc */
8138 {
8139 /* Floating-point instructions. */
8140 if (cp_num == 9 || cp_num == 10 || cp_num == 11)
8141 continue;
8142
8143 /* Armv8.1-M Mainline FP & MVE instructions. */
8144 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
8145 && !ARM_CPU_IS_ANY (allowed_arches)
8146 && (cp_num == 8 || cp_num == 14 || cp_num == 15))
8147 continue;
8148 }
8149 else if ((insn->value == 0xec100f80 /* vldr (system register) */
8150 || insn->value == 0xec000f80) /* vstr (system register) */
8151 && arm_decode_field (given, 24, 24) == 0
8152 && arm_decode_field (given, 21, 21) == 0)
8153 /* If the P and W bits are both 0 then these encodings match the MVE
8154 VLDR and VSTR instructions, these are in a different table, so we
8155 don't let it match here. */
8156 continue;
8157
8158 for (c = insn->assembler; *c; c++)
8159 {
8160 if (*c == '%')
8161 {
8162 const char mod = *++c;
8163 switch (mod)
8164 {
8165 case '%':
8166 func (stream, "%%");
8167 break;
8168
8169 case 'A':
8170 case 'K':
8171 {
8172 int rn = (given >> 16) & 0xf;
8173 bfd_vma offset = given & 0xff;
8174
8175 if (mod == 'K')
8176 offset = given & 0x7f;
8177
8178 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
8179
8180 if (PRE_BIT_SET || WRITEBACK_BIT_SET)
8181 {
8182 /* Not unindexed. The offset is scaled. */
8183 if (cp_num == 9)
8184 /* vldr.16/vstr.16 will shift the address
8185 left by 1 bit only. */
8186 offset = offset * 2;
8187 else
8188 offset = offset * 4;
8189
8190 if (NEGATIVE_BIT_SET)
8191 offset = - offset;
8192 if (rn != 15)
8193 value_in_comment = offset;
8194 }
8195
8196 if (PRE_BIT_SET)
8197 {
8198 if (offset)
8199 func (stream, ", #%d]%s",
8200 (int) offset,
8201 WRITEBACK_BIT_SET ? "!" : "");
8202 else if (NEGATIVE_BIT_SET)
8203 func (stream, ", #-0]");
8204 else
8205 func (stream, "]");
8206 }
8207 else
8208 {
8209 func (stream, "]");
8210
8211 if (WRITEBACK_BIT_SET)
8212 {
8213 if (offset)
8214 func (stream, ", #%d", (int) offset);
8215 else if (NEGATIVE_BIT_SET)
8216 func (stream, ", #-0");
8217 }
8218 else
8219 {
8220 func (stream, ", {%s%d}",
8221 (NEGATIVE_BIT_SET && !offset) ? "-" : "",
8222 (int) offset);
8223 value_in_comment = offset;
8224 }
8225 }
8226 if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET))
8227 {
8228 func (stream, "\t; ");
8229 /* For unaligned PCs, apply off-by-alignment
8230 correction. */
8231 info->print_address_func (offset + pc
8232 + info->bytes_per_chunk * 2
8233 - (pc & 3),
8234 info);
8235 }
8236 }
8237 break;
8238
8239 case 'B':
8240 {
8241 int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
8242 int offset = (given >> 1) & 0x3f;
8243
8244 if (offset == 1)
8245 func (stream, "{d%d}", regno);
8246 else if (regno + offset > 32)
8247 func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
8248 else
8249 func (stream, "{d%d-d%d}", regno, regno + offset - 1);
8250 }
8251 break;
8252
8253 case 'C':
8254 {
8255 bool single = ((given >> 8) & 1) == 0;
8256 char reg_prefix = single ? 's' : 'd';
8257 int Dreg = (given >> 22) & 0x1;
8258 int Vdreg = (given >> 12) & 0xf;
8259 int reg = single ? ((Vdreg << 1) | Dreg)
8260 : ((Dreg << 4) | Vdreg);
8261 int num = (given >> (single ? 0 : 1)) & 0x7f;
8262 int maxreg = single ? 31 : 15;
8263 int topreg = reg + num - 1;
8264
8265 if (!num)
8266 func (stream, "{VPR}");
8267 else if (num == 1)
8268 func (stream, "{%c%d, VPR}", reg_prefix, reg);
8269 else if (topreg > maxreg)
8270 func (stream, "{%c%d-<overflow reg d%d, VPR}",
8271 reg_prefix, reg, single ? topreg >> 1 : topreg);
8272 else
8273 func (stream, "{%c%d-%c%d, VPR}", reg_prefix, reg,
8274 reg_prefix, topreg);
8275 }
8276 break;
8277
8278 case 'u':
8279 if (cond != COND_UNCOND)
8280 is_unpredictable = true;
8281
8282 /* Fall through. */
8283 case 'c':
8284 if (cond != COND_UNCOND && cp_num == 9)
8285 is_unpredictable = true;
8286
8287 /* Fall through. */
8288 case 'b':
8289 func (stream, "%s", arm_conditional[cond]);
8290 break;
8291
8292 case 'I':
8293 /* Print a Cirrus/DSP shift immediate. */
8294 /* Immediates are 7bit signed ints with bits 0..3 in
8295 bits 0..3 of opcode and bits 4..6 in bits 5..7
8296 of opcode. */
8297 {
8298 int imm;
8299
8300 imm = (given & 0xf) | ((given & 0xe0) >> 1);
8301
8302 /* Is ``imm'' a negative number? */
8303 if (imm & 0x40)
8304 imm -= 0x80;
8305
8306 func (stream, "%d", imm);
8307 }
8308
8309 break;
8310
8311 case 'J':
8312 {
8313 unsigned long regno
8314 = arm_decode_field_multiple (given, 13, 15, 22, 22);
8315
8316 switch (regno)
8317 {
8318 case 0x1:
8319 func (stream, "FPSCR");
8320 break;
8321 case 0x2:
8322 func (stream, "FPSCR_nzcvqc");
8323 break;
8324 case 0xc:
8325 func (stream, "VPR");
8326 break;
8327 case 0xd:
8328 func (stream, "P0");
8329 break;
8330 case 0xe:
8331 func (stream, "FPCXTNS");
8332 break;
8333 case 0xf:
8334 func (stream, "FPCXTS");
8335 break;
8336 default:
8337 func (stream, "<invalid reg %lu>", regno);
8338 break;
8339 }
8340 }
8341 break;
8342
8343 case 'F':
8344 switch (given & 0x00408000)
8345 {
8346 case 0:
8347 func (stream, "4");
8348 break;
8349 case 0x8000:
8350 func (stream, "1");
8351 break;
8352 case 0x00400000:
8353 func (stream, "2");
8354 break;
8355 default:
8356 func (stream, "3");
8357 }
8358 break;
8359
8360 case 'P':
8361 switch (given & 0x00080080)
8362 {
8363 case 0:
8364 func (stream, "s");
8365 break;
8366 case 0x80:
8367 func (stream, "d");
8368 break;
8369 case 0x00080000:
8370 func (stream, "e");
8371 break;
8372 default:
8373 func (stream, _("<illegal precision>"));
8374 break;
8375 }
8376 break;
8377
8378 case 'Q':
8379 switch (given & 0x00408000)
8380 {
8381 case 0:
8382 func (stream, "s");
8383 break;
8384 case 0x8000:
8385 func (stream, "d");
8386 break;
8387 case 0x00400000:
8388 func (stream, "e");
8389 break;
8390 default:
8391 func (stream, "p");
8392 break;
8393 }
8394 break;
8395
8396 case 'R':
8397 switch (given & 0x60)
8398 {
8399 case 0:
8400 break;
8401 case 0x20:
8402 func (stream, "p");
8403 break;
8404 case 0x40:
8405 func (stream, "m");
8406 break;
8407 default:
8408 func (stream, "z");
8409 break;
8410 }
8411 break;
8412
8413 case '0': case '1': case '2': case '3': case '4':
8414 case '5': case '6': case '7': case '8': case '9':
8415 {
8416 int width;
8417
8418 c = arm_decode_bitfield (c, given, &value, &width);
8419
8420 switch (*c)
8421 {
8422 case 'R':
8423 if (value == 15)
8424 is_unpredictable = true;
8425 /* Fall through. */
8426 case 'r':
8427 if (c[1] == 'u')
8428 {
8429 /* Eat the 'u' character. */
8430 ++ c;
8431
8432 if (u_reg == value)
8433 is_unpredictable = true;
8434 u_reg = value;
8435 }
8436 func (stream, "%s", arm_regnames[value]);
8437 break;
8438 case 'V':
8439 if (given & (1 << 6))
8440 goto Q;
8441 /* FALLTHROUGH */
8442 case 'D':
8443 func (stream, "d%ld", value);
8444 break;
8445 case 'Q':
8446 Q:
8447 if (value & 1)
8448 func (stream, "<illegal reg q%ld.5>", value >> 1);
8449 else
8450 func (stream, "q%ld", value >> 1);
8451 break;
8452 case 'd':
8453 func (stream, "%ld", value);
8454 value_in_comment = value;
8455 break;
8456 case 'E':
8457 {
8458 /* Converts immediate 8 bit back to float value. */
8459 unsigned floatVal = (value & 0x80) << 24
8460 | (value & 0x3F) << 19
8461 | ((value & 0x40) ? (0xF8 << 22) : (1 << 30));
8462
8463 /* Quarter float have a maximum value of 31.0.
8464 Get floating point value multiplied by 1e7.
8465 The maximum value stays in limit of a 32-bit int. */
8466 unsigned decVal =
8467 (78125 << (((floatVal >> 23) & 0xFF) - 124)) *
8468 (16 + (value & 0xF));
8469
8470 if (!(decVal % 1000000))
8471 func (stream, "%ld\t; 0x%08x %c%u.%01u", value,
8472 floatVal, value & 0x80 ? '-' : ' ',
8473 decVal / 10000000,
8474 decVal % 10000000 / 1000000);
8475 else if (!(decVal % 10000))
8476 func (stream, "%ld\t; 0x%08x %c%u.%03u", value,
8477 floatVal, value & 0x80 ? '-' : ' ',
8478 decVal / 10000000,
8479 decVal % 10000000 / 10000);
8480 else
8481 func (stream, "%ld\t; 0x%08x %c%u.%07u", value,
8482 floatVal, value & 0x80 ? '-' : ' ',
8483 decVal / 10000000, decVal % 10000000);
8484 break;
8485 }
8486 case 'k':
8487 {
8488 int from = (given & (1 << 7)) ? 32 : 16;
8489 func (stream, "%ld", from - value);
8490 }
8491 break;
8492
8493 case 'f':
8494 if (value > 7)
8495 func (stream, "#%s", arm_fp_const[value & 7]);
8496 else
8497 func (stream, "f%ld", value);
8498 break;
8499
8500 case 'w':
8501 if (width == 2)
8502 func (stream, "%s", iwmmxt_wwnames[value]);
8503 else
8504 func (stream, "%s", iwmmxt_wwssnames[value]);
8505 break;
8506
8507 case 'g':
8508 func (stream, "%s", iwmmxt_regnames[value]);
8509 break;
8510 case 'G':
8511 func (stream, "%s", iwmmxt_cregnames[value]);
8512 break;
8513
8514 case 'x':
8515 func (stream, "0x%lx", (value & 0xffffffffUL));
8516 break;
8517
8518 case 'c':
8519 switch (value)
8520 {
8521 case 0:
8522 func (stream, "eq");
8523 break;
8524
8525 case 1:
8526 func (stream, "vs");
8527 break;
8528
8529 case 2:
8530 func (stream, "ge");
8531 break;
8532
8533 case 3:
8534 func (stream, "gt");
8535 break;
8536
8537 default:
8538 func (stream, "??");
8539 break;
8540 }
8541 break;
8542
8543 case '`':
8544 c++;
8545 if (value == 0)
8546 func (stream, "%c", *c);
8547 break;
8548 case '\'':
8549 c++;
8550 if (value == ((1ul << width) - 1))
8551 func (stream, "%c", *c);
8552 break;
8553 case '?':
8554 func (stream, "%c", c[(1 << width) - (int) value]);
8555 c += 1 << width;
8556 break;
8557 default:
8558 abort ();
8559 }
8560 }
8561 break;
8562
8563 case 'y':
8564 case 'z':
8565 {
8566 int single = *c++ == 'y';
8567 int regno;
8568
8569 switch (*c)
8570 {
8571 case '4': /* Sm pair */
8572 case '0': /* Sm, Dm */
8573 regno = given & 0x0000000f;
8574 if (single)
8575 {
8576 regno <<= 1;
8577 regno += (given >> 5) & 1;
8578 }
8579 else
8580 regno += ((given >> 5) & 1) << 4;
8581 break;
8582
8583 case '1': /* Sd, Dd */
8584 regno = (given >> 12) & 0x0000000f;
8585 if (single)
8586 {
8587 regno <<= 1;
8588 regno += (given >> 22) & 1;
8589 }
8590 else
8591 regno += ((given >> 22) & 1) << 4;
8592 break;
8593
8594 case '2': /* Sn, Dn */
8595 regno = (given >> 16) & 0x0000000f;
8596 if (single)
8597 {
8598 regno <<= 1;
8599 regno += (given >> 7) & 1;
8600 }
8601 else
8602 regno += ((given >> 7) & 1) << 4;
8603 break;
8604
8605 case '3': /* List */
8606 func (stream, "{");
8607 regno = (given >> 12) & 0x0000000f;
8608 if (single)
8609 {
8610 regno <<= 1;
8611 regno += (given >> 22) & 1;
8612 }
8613 else
8614 regno += ((given >> 22) & 1) << 4;
8615 break;
8616
8617 default:
8618 abort ();
8619 }
8620
8621 func (stream, "%c%d", single ? 's' : 'd', regno);
8622
8623 if (*c == '3')
8624 {
8625 int count = given & 0xff;
8626
8627 if (single == 0)
8628 count >>= 1;
8629
8630 if (--count)
8631 {
8632 func (stream, "-%c%d",
8633 single ? 's' : 'd',
8634 regno + count);
8635 }
8636
8637 func (stream, "}");
8638 }
8639 else if (*c == '4')
8640 func (stream, ", %c%d", single ? 's' : 'd',
8641 regno + 1);
8642 }
8643 break;
8644
8645 case 'L':
8646 switch (given & 0x00400100)
8647 {
8648 case 0x00000000: func (stream, "b"); break;
8649 case 0x00400000: func (stream, "h"); break;
8650 case 0x00000100: func (stream, "w"); break;
8651 case 0x00400100: func (stream, "d"); break;
8652 default:
8653 break;
8654 }
8655 break;
8656
8657 case 'Z':
8658 {
8659 /* given (20, 23) | given (0, 3) */
8660 value = ((given >> 16) & 0xf0) | (given & 0xf);
8661 func (stream, "%d", (int) value);
8662 }
8663 break;
8664
8665 case 'l':
8666 /* This is like the 'A' operator, except that if
8667 the width field "M" is zero, then the offset is
8668 *not* multiplied by four. */
8669 {
8670 int offset = given & 0xff;
8671 int multiplier = (given & 0x00000100) ? 4 : 1;
8672
8673 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
8674
8675 if (multiplier > 1)
8676 {
8677 value_in_comment = offset * multiplier;
8678 if (NEGATIVE_BIT_SET)
8679 value_in_comment = - value_in_comment;
8680 }
8681
8682 if (offset)
8683 {
8684 if (PRE_BIT_SET)
8685 func (stream, ", #%s%d]%s",
8686 NEGATIVE_BIT_SET ? "-" : "",
8687 offset * multiplier,
8688 WRITEBACK_BIT_SET ? "!" : "");
8689 else
8690 func (stream, "], #%s%d",
8691 NEGATIVE_BIT_SET ? "-" : "",
8692 offset * multiplier);
8693 }
8694 else
8695 func (stream, "]");
8696 }
8697 break;
8698
8699 case 'r':
8700 {
8701 int imm4 = (given >> 4) & 0xf;
8702 int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1);
8703 int ubit = ! NEGATIVE_BIT_SET;
8704 const char *rm = arm_regnames [given & 0xf];
8705 const char *rn = arm_regnames [(given >> 16) & 0xf];
8706
8707 switch (puw_bits)
8708 {
8709 case 1:
8710 case 3:
8711 func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
8712 if (imm4)
8713 func (stream, ", lsl #%d", imm4);
8714 break;
8715
8716 case 4:
8717 case 5:
8718 case 6:
8719 case 7:
8720 func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
8721 if (imm4 > 0)
8722 func (stream, ", lsl #%d", imm4);
8723 func (stream, "]");
8724 if (puw_bits == 5 || puw_bits == 7)
8725 func (stream, "!");
8726 break;
8727
8728 default:
8729 func (stream, "INVALID");
8730 }
8731 }
8732 break;
8733
8734 case 'i':
8735 {
8736 long imm5;
8737 imm5 = ((given & 0x100) >> 4) | (given & 0xf);
8738 func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
8739 }
8740 break;
8741
8742 default:
8743 abort ();
8744 }
8745 }
8746 else
8747 func (stream, "%c", *c);
8748 }
8749
8750 if (value_in_comment > 32 || value_in_comment < -16)
8751 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
8752
8753 if (is_unpredictable)
8754 func (stream, UNPREDICTABLE_INSTRUCTION);
8755
8756 return true;
8757 }
8758 return false;
8759 }
8760
8761 static bool
8762 print_insn_coprocessor (bfd_vma pc,
8763 struct disassemble_info *info,
8764 long given,
8765 bool thumb)
8766 {
8767 return print_insn_coprocessor_1 (coprocessor_opcodes,
8768 pc, info, given, thumb);
8769 }
8770
8771 static bool
8772 print_insn_generic_coprocessor (bfd_vma pc,
8773 struct disassemble_info *info,
8774 long given,
8775 bool thumb)
8776 {
8777 return print_insn_coprocessor_1 (generic_coprocessor_opcodes,
8778 pc, info, given, thumb);
8779 }
8780
8781 /* Decodes and prints ARM addressing modes. Returns the offset
8782 used in the address, if any, if it is worthwhile printing the
8783 offset as a hexadecimal value in a comment at the end of the
8784 line of disassembly. */
8785
8786 static signed long
8787 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
8788 {
8789 void *stream = info->stream;
8790 fprintf_ftype func = info->fprintf_func;
8791 bfd_vma offset = 0;
8792
8793 if (((given & 0x000f0000) == 0x000f0000)
8794 && ((given & 0x02000000) == 0))
8795 {
8796 offset = given & 0xfff;
8797
8798 func (stream, "[pc");
8799
8800 if (PRE_BIT_SET)
8801 {
8802 /* Pre-indexed. Elide offset of positive zero when
8803 non-writeback. */
8804 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
8805 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8806
8807 if (NEGATIVE_BIT_SET)
8808 offset = -offset;
8809
8810 offset += pc + 8;
8811
8812 /* Cope with the possibility of write-back
8813 being used. Probably a very dangerous thing
8814 for the programmer to do, but who are we to
8815 argue ? */
8816 func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : "");
8817 }
8818 else /* Post indexed. */
8819 {
8820 func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8821
8822 /* Ie ignore the offset. */
8823 offset = pc + 8;
8824 }
8825
8826 func (stream, "\t; ");
8827 info->print_address_func (offset, info);
8828 offset = 0;
8829 }
8830 else
8831 {
8832 func (stream, "[%s",
8833 arm_regnames[(given >> 16) & 0xf]);
8834
8835 if (PRE_BIT_SET)
8836 {
8837 if ((given & 0x02000000) == 0)
8838 {
8839 /* Elide offset of positive zero when non-writeback. */
8840 offset = given & 0xfff;
8841 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
8842 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8843 }
8844 else
8845 {
8846 func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : "");
8847 arm_decode_shift (given, func, stream, true);
8848 }
8849
8850 func (stream, "]%s",
8851 WRITEBACK_BIT_SET ? "!" : "");
8852 }
8853 else
8854 {
8855 if ((given & 0x02000000) == 0)
8856 {
8857 /* Always show offset. */
8858 offset = given & 0xfff;
8859 func (stream, "], #%s%d",
8860 NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8861 }
8862 else
8863 {
8864 func (stream, "], %s",
8865 NEGATIVE_BIT_SET ? "-" : "");
8866 arm_decode_shift (given, func, stream, true);
8867 }
8868 }
8869 if (NEGATIVE_BIT_SET)
8870 offset = -offset;
8871 }
8872
8873 return (signed long) offset;
8874 }
8875
8876
8877 /* Print one cde instruction on INFO->STREAM.
8878 Return TRUE if the instuction matched, FALSE if this is not a
8879 recognised cde instruction. */
8880 static bool
8881 print_insn_cde (struct disassemble_info *info, long given, bool thumb)
8882 {
8883 const struct cdeopcode32 *insn;
8884 void *stream = info->stream;
8885 fprintf_ftype func = info->fprintf_func;
8886
8887 if (thumb)
8888 {
8889 /* Manually extract the coprocessor code from a known point.
8890 This position is the same across all CDE instructions. */
8891 for (insn = cde_opcodes; insn->assembler; insn++)
8892 {
8893 uint16_t coproc = (given >> insn->coproc_shift) & insn->coproc_mask;
8894 uint16_t coproc_mask = 1 << coproc;
8895 if (! (coproc_mask & cde_coprocs))
8896 continue;
8897
8898 if ((given & insn->mask) == insn->value)
8899 {
8900 bool is_unpredictable = false;
8901 const char *c;
8902
8903 for (c = insn->assembler; *c; c++)
8904 {
8905 if (*c == '%')
8906 {
8907 switch (*++c)
8908 {
8909 case '%':
8910 func (stream, "%%");
8911 break;
8912
8913 case '0': case '1': case '2': case '3': case '4':
8914 case '5': case '6': case '7': case '8': case '9':
8915 {
8916 int width;
8917 unsigned long value;
8918
8919 c = arm_decode_bitfield (c, given, &value, &width);
8920
8921 switch (*c)
8922 {
8923 case 'S':
8924 if (value > 10)
8925 is_unpredictable = true;
8926 /* Fall through. */
8927 case 'R':
8928 if (value == 13)
8929 is_unpredictable = true;
8930 /* Fall through. */
8931 case 'r':
8932 func (stream, "%s", arm_regnames[value]);
8933 break;
8934
8935 case 'n':
8936 if (value == 15)
8937 func (stream, "%s", "APSR_nzcv");
8938 else
8939 func (stream, "%s", arm_regnames[value]);
8940 break;
8941
8942 case 'T':
8943 func (stream, "%s", arm_regnames[value + 1]);
8944 break;
8945
8946 case 'd':
8947 func (stream, "%ld", value);
8948 break;
8949
8950 case 'V':
8951 if (given & (1 << 6))
8952 func (stream, "q%ld", value >> 1);
8953 else if (given & (1 << 24))
8954 func (stream, "d%ld", value);
8955 else
8956 {
8957 /* Encoding for S register is different than for D and
8958 Q registers. S registers are encoded using the top
8959 single bit in position 22 as the lowest bit of the
8960 register number, while for Q and D it represents the
8961 highest bit of the register number. */
8962 uint8_t top_bit = (value >> 4) & 1;
8963 uint8_t tmp = (value << 1) & 0x1e;
8964 uint8_t res = tmp | top_bit;
8965 func (stream, "s%u", res);
8966 }
8967 break;
8968
8969 default:
8970 abort ();
8971 }
8972 }
8973 break;
8974
8975 case 'p':
8976 {
8977 uint8_t proc_number = (given >> 8) & 0x7;
8978 func (stream, "p%u", proc_number);
8979 break;
8980 }
8981
8982 case 'a':
8983 {
8984 uint8_t a_offset = 28;
8985 if (given & (1 << a_offset))
8986 func (stream, "a");
8987 break;
8988 }
8989 default:
8990 abort ();
8991 }
8992 }
8993 else
8994 func (stream, "%c", *c);
8995 }
8996
8997 if (is_unpredictable)
8998 func (stream, UNPREDICTABLE_INSTRUCTION);
8999
9000 return true;
9001 }
9002 }
9003 return false;
9004 }
9005 else
9006 return false;
9007 }
9008
9009
9010 /* Print one neon instruction on INFO->STREAM.
9011 Return TRUE if the instuction matched, FALSE if this is not a
9012 recognised neon instruction. */
9013
9014 static bool
9015 print_insn_neon (struct disassemble_info *info, long given, bool thumb)
9016 {
9017 const struct opcode32 *insn;
9018 void *stream = info->stream;
9019 fprintf_ftype func = info->fprintf_func;
9020
9021 if (thumb)
9022 {
9023 if ((given & 0xef000000) == 0xef000000)
9024 {
9025 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
9026 unsigned long bit28 = given & (1 << 28);
9027
9028 given &= 0x00ffffff;
9029 if (bit28)
9030 given |= 0xf3000000;
9031 else
9032 given |= 0xf2000000;
9033 }
9034 else if ((given & 0xff000000) == 0xf9000000)
9035 given ^= 0xf9000000 ^ 0xf4000000;
9036 /* BFloat16 neon instructions without special top byte handling. */
9037 else if ((given & 0xff000000) == 0xfe000000
9038 || (given & 0xff000000) == 0xfc000000)
9039 ;
9040 /* vdup is also a valid neon instruction. */
9041 else if ((given & 0xff900f5f) != 0xee800b10)
9042 return false;
9043 }
9044
9045 for (insn = neon_opcodes; insn->assembler; insn++)
9046 {
9047 unsigned long cond_mask = insn->mask;
9048 unsigned long cond_value = insn->value;
9049 int cond;
9050
9051 if (thumb)
9052 {
9053 if ((cond_mask & 0xf0000000) == 0) {
9054 /* For the entries in neon_opcodes, an opcode mask/value with
9055 the high 4 bits equal to 0 indicates a conditional
9056 instruction. For thumb however, we need to include those
9057 bits in the instruction matching. */
9058 cond_mask |= 0xf0000000;
9059 /* Furthermore, the thumb encoding of a conditional instruction
9060 will have the high 4 bits equal to 0xe. */
9061 cond_value |= 0xe0000000;
9062 }
9063 if (ifthen_state)
9064 cond = IFTHEN_COND;
9065 else
9066 cond = COND_UNCOND;
9067 }
9068 else
9069 {
9070 if ((given & 0xf0000000) == 0xf0000000)
9071 {
9072 /* If the instruction is unconditional, update the mask to only
9073 match against unconditional opcode values. */
9074 cond_mask |= 0xf0000000;
9075 cond = COND_UNCOND;
9076 }
9077 else
9078 {
9079 cond = (given >> 28) & 0xf;
9080 if (cond == 0xe)
9081 cond = COND_UNCOND;
9082 }
9083 }
9084
9085 if ((given & cond_mask) == cond_value)
9086 {
9087 signed long value_in_comment = 0;
9088 bool is_unpredictable = false;
9089 const char *c;
9090
9091 for (c = insn->assembler; *c; c++)
9092 {
9093 if (*c == '%')
9094 {
9095 switch (*++c)
9096 {
9097 case '%':
9098 func (stream, "%%");
9099 break;
9100
9101 case 'u':
9102 if (thumb && ifthen_state)
9103 is_unpredictable = true;
9104
9105 /* Fall through. */
9106 case 'c':
9107 func (stream, "%s", arm_conditional[cond]);
9108 break;
9109
9110 case 'A':
9111 {
9112 static const unsigned char enc[16] =
9113 {
9114 0x4, 0x14, /* st4 0,1 */
9115 0x4, /* st1 2 */
9116 0x4, /* st2 3 */
9117 0x3, /* st3 4 */
9118 0x13, /* st3 5 */
9119 0x3, /* st1 6 */
9120 0x1, /* st1 7 */
9121 0x2, /* st2 8 */
9122 0x12, /* st2 9 */
9123 0x2, /* st1 10 */
9124 0, 0, 0, 0, 0
9125 };
9126 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9127 int rn = ((given >> 16) & 0xf);
9128 int rm = ((given >> 0) & 0xf);
9129 int align = ((given >> 4) & 0x3);
9130 int type = ((given >> 8) & 0xf);
9131 int n = enc[type] & 0xf;
9132 int stride = (enc[type] >> 4) + 1;
9133 int ix;
9134
9135 func (stream, "{");
9136 if (stride > 1)
9137 for (ix = 0; ix != n; ix++)
9138 func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
9139 else if (n == 1)
9140 func (stream, "d%d", rd);
9141 else
9142 func (stream, "d%d-d%d", rd, rd + n - 1);
9143 func (stream, "}, [%s", arm_regnames[rn]);
9144 if (align)
9145 func (stream, " :%d", 32 << align);
9146 func (stream, "]");
9147 if (rm == 0xd)
9148 func (stream, "!");
9149 else if (rm != 0xf)
9150 func (stream, ", %s", arm_regnames[rm]);
9151 }
9152 break;
9153
9154 case 'B':
9155 {
9156 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9157 int rn = ((given >> 16) & 0xf);
9158 int rm = ((given >> 0) & 0xf);
9159 int idx_align = ((given >> 4) & 0xf);
9160 int align = 0;
9161 int size = ((given >> 10) & 0x3);
9162 int idx = idx_align >> (size + 1);
9163 int length = ((given >> 8) & 3) + 1;
9164 int stride = 1;
9165 int i;
9166
9167 if (length > 1 && size > 0)
9168 stride = (idx_align & (1 << size)) ? 2 : 1;
9169
9170 switch (length)
9171 {
9172 case 1:
9173 {
9174 int amask = (1 << size) - 1;
9175 if ((idx_align & (1 << size)) != 0)
9176 return false;
9177 if (size > 0)
9178 {
9179 if ((idx_align & amask) == amask)
9180 align = 8 << size;
9181 else if ((idx_align & amask) != 0)
9182 return false;
9183 }
9184 }
9185 break;
9186
9187 case 2:
9188 if (size == 2 && (idx_align & 2) != 0)
9189 return false;
9190 align = (idx_align & 1) ? 16 << size : 0;
9191 break;
9192
9193 case 3:
9194 if ((size == 2 && (idx_align & 3) != 0)
9195 || (idx_align & 1) != 0)
9196 return false;
9197 break;
9198
9199 case 4:
9200 if (size == 2)
9201 {
9202 if ((idx_align & 3) == 3)
9203 return false;
9204 align = (idx_align & 3) * 64;
9205 }
9206 else
9207 align = (idx_align & 1) ? 32 << size : 0;
9208 break;
9209
9210 default:
9211 abort ();
9212 }
9213
9214 func (stream, "{");
9215 for (i = 0; i < length; i++)
9216 func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
9217 rd + i * stride, idx);
9218 func (stream, "}, [%s", arm_regnames[rn]);
9219 if (align)
9220 func (stream, " :%d", align);
9221 func (stream, "]");
9222 if (rm == 0xd)
9223 func (stream, "!");
9224 else if (rm != 0xf)
9225 func (stream, ", %s", arm_regnames[rm]);
9226 }
9227 break;
9228
9229 case 'C':
9230 {
9231 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9232 int rn = ((given >> 16) & 0xf);
9233 int rm = ((given >> 0) & 0xf);
9234 int align = ((given >> 4) & 0x1);
9235 int size = ((given >> 6) & 0x3);
9236 int type = ((given >> 8) & 0x3);
9237 int n = type + 1;
9238 int stride = ((given >> 5) & 0x1);
9239 int ix;
9240
9241 if (stride && (n == 1))
9242 n++;
9243 else
9244 stride++;
9245
9246 func (stream, "{");
9247 if (stride > 1)
9248 for (ix = 0; ix != n; ix++)
9249 func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
9250 else if (n == 1)
9251 func (stream, "d%d[]", rd);
9252 else
9253 func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
9254 func (stream, "}, [%s", arm_regnames[rn]);
9255 if (align)
9256 {
9257 align = (8 * (type + 1)) << size;
9258 if (type == 3)
9259 align = (size > 1) ? align >> 1 : align;
9260 if (type == 2 || (type == 0 && !size))
9261 func (stream, " :<bad align %d>", align);
9262 else
9263 func (stream, " :%d", align);
9264 }
9265 func (stream, "]");
9266 if (rm == 0xd)
9267 func (stream, "!");
9268 else if (rm != 0xf)
9269 func (stream, ", %s", arm_regnames[rm]);
9270 }
9271 break;
9272
9273 case 'D':
9274 {
9275 int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
9276 int size = (given >> 20) & 3;
9277 int reg = raw_reg & ((4 << size) - 1);
9278 int ix = raw_reg >> size >> 2;
9279
9280 func (stream, "d%d[%d]", reg, ix);
9281 }
9282 break;
9283
9284 case 'E':
9285 /* Neon encoded constant for mov, mvn, vorr, vbic. */
9286 {
9287 int bits = 0;
9288 int cmode = (given >> 8) & 0xf;
9289 int op = (given >> 5) & 0x1;
9290 unsigned long value = 0, hival = 0;
9291 unsigned shift;
9292 int size = 0;
9293 int isfloat = 0;
9294
9295 bits |= ((given >> 24) & 1) << 7;
9296 bits |= ((given >> 16) & 7) << 4;
9297 bits |= ((given >> 0) & 15) << 0;
9298
9299 if (cmode < 8)
9300 {
9301 shift = (cmode >> 1) & 3;
9302 value = (unsigned long) bits << (8 * shift);
9303 size = 32;
9304 }
9305 else if (cmode < 12)
9306 {
9307 shift = (cmode >> 1) & 1;
9308 value = (unsigned long) bits << (8 * shift);
9309 size = 16;
9310 }
9311 else if (cmode < 14)
9312 {
9313 shift = (cmode & 1) + 1;
9314 value = (unsigned long) bits << (8 * shift);
9315 value |= (1ul << (8 * shift)) - 1;
9316 size = 32;
9317 }
9318 else if (cmode == 14)
9319 {
9320 if (op)
9321 {
9322 /* Bit replication into bytes. */
9323 int ix;
9324 unsigned long mask;
9325
9326 value = 0;
9327 hival = 0;
9328 for (ix = 7; ix >= 0; ix--)
9329 {
9330 mask = ((bits >> ix) & 1) ? 0xff : 0;
9331 if (ix <= 3)
9332 value = (value << 8) | mask;
9333 else
9334 hival = (hival << 8) | mask;
9335 }
9336 size = 64;
9337 }
9338 else
9339 {
9340 /* Byte replication. */
9341 value = (unsigned long) bits;
9342 size = 8;
9343 }
9344 }
9345 else if (!op)
9346 {
9347 /* Floating point encoding. */
9348 int tmp;
9349
9350 value = (unsigned long) (bits & 0x7f) << 19;
9351 value |= (unsigned long) (bits & 0x80) << 24;
9352 tmp = bits & 0x40 ? 0x3c : 0x40;
9353 value |= (unsigned long) tmp << 24;
9354 size = 32;
9355 isfloat = 1;
9356 }
9357 else
9358 {
9359 func (stream, "<illegal constant %.8x:%x:%x>",
9360 bits, cmode, op);
9361 size = 32;
9362 break;
9363 }
9364 switch (size)
9365 {
9366 case 8:
9367 func (stream, "#%ld\t; 0x%.2lx", value, value);
9368 break;
9369
9370 case 16:
9371 func (stream, "#%ld\t; 0x%.4lx", value, value);
9372 break;
9373
9374 case 32:
9375 if (isfloat)
9376 {
9377 unsigned char valbytes[4];
9378 double fvalue;
9379
9380 /* Do this a byte at a time so we don't have to
9381 worry about the host's endianness. */
9382 valbytes[0] = value & 0xff;
9383 valbytes[1] = (value >> 8) & 0xff;
9384 valbytes[2] = (value >> 16) & 0xff;
9385 valbytes[3] = (value >> 24) & 0xff;
9386
9387 floatformat_to_double
9388 (& floatformat_ieee_single_little, valbytes,
9389 & fvalue);
9390
9391 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
9392 value);
9393 }
9394 else
9395 func (stream, "#%ld\t; 0x%.8lx",
9396 (long) (((value & 0x80000000L) != 0)
9397 ? value | ~0xffffffffL : value),
9398 value);
9399 break;
9400
9401 case 64:
9402 func (stream, "#0x%.8lx%.8lx", hival, value);
9403 break;
9404
9405 default:
9406 abort ();
9407 }
9408 }
9409 break;
9410
9411 case 'F':
9412 {
9413 int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
9414 int num = (given >> 8) & 0x3;
9415
9416 if (!num)
9417 func (stream, "{d%d}", regno);
9418 else if (num + regno >= 32)
9419 func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
9420 else
9421 func (stream, "{d%d-d%d}", regno, regno + num);
9422 }
9423 break;
9424
9425
9426 case '0': case '1': case '2': case '3': case '4':
9427 case '5': case '6': case '7': case '8': case '9':
9428 {
9429 int width;
9430 unsigned long value;
9431
9432 c = arm_decode_bitfield (c, given, &value, &width);
9433
9434 switch (*c)
9435 {
9436 case 'r':
9437 func (stream, "%s", arm_regnames[value]);
9438 break;
9439 case 'd':
9440 func (stream, "%ld", value);
9441 value_in_comment = value;
9442 break;
9443 case 'e':
9444 func (stream, "%ld", (1ul << width) - value);
9445 break;
9446
9447 case 'S':
9448 case 'T':
9449 case 'U':
9450 /* Various width encodings. */
9451 {
9452 int base = 8 << (*c - 'S'); /* 8,16 or 32 */
9453 int limit;
9454 unsigned low, high;
9455
9456 c++;
9457 if (*c >= '0' && *c <= '9')
9458 limit = *c - '0';
9459 else if (*c >= 'a' && *c <= 'f')
9460 limit = *c - 'a' + 10;
9461 else
9462 abort ();
9463 low = limit >> 2;
9464 high = limit & 3;
9465
9466 if (value < low || value > high)
9467 func (stream, "<illegal width %d>", base << value);
9468 else
9469 func (stream, "%d", base << value);
9470 }
9471 break;
9472 case 'R':
9473 if (given & (1 << 6))
9474 goto Q;
9475 /* FALLTHROUGH */
9476 case 'D':
9477 func (stream, "d%ld", value);
9478 break;
9479 case 'Q':
9480 Q:
9481 if (value & 1)
9482 func (stream, "<illegal reg q%ld.5>", value >> 1);
9483 else
9484 func (stream, "q%ld", value >> 1);
9485 break;
9486
9487 case '`':
9488 c++;
9489 if (value == 0)
9490 func (stream, "%c", *c);
9491 break;
9492 case '\'':
9493 c++;
9494 if (value == ((1ul << width) - 1))
9495 func (stream, "%c", *c);
9496 break;
9497 case '?':
9498 func (stream, "%c", c[(1 << width) - (int) value]);
9499 c += 1 << width;
9500 break;
9501 default:
9502 abort ();
9503 }
9504 }
9505 break;
9506
9507 default:
9508 abort ();
9509 }
9510 }
9511 else
9512 func (stream, "%c", *c);
9513 }
9514
9515 if (value_in_comment > 32 || value_in_comment < -16)
9516 func (stream, "\t; 0x%lx", value_in_comment);
9517
9518 if (is_unpredictable)
9519 func (stream, UNPREDICTABLE_INSTRUCTION);
9520
9521 return true;
9522 }
9523 }
9524 return false;
9525 }
9526
9527 /* Print one mve instruction on INFO->STREAM.
9528 Return TRUE if the instuction matched, FALSE if this is not a
9529 recognised mve instruction. */
9530
9531 static bool
9532 print_insn_mve (struct disassemble_info *info, long given)
9533 {
9534 const struct mopcode32 *insn;
9535 void *stream = info->stream;
9536 fprintf_ftype func = info->fprintf_func;
9537
9538 for (insn = mve_opcodes; insn->assembler; insn++)
9539 {
9540 if (((given & insn->mask) == insn->value)
9541 && !is_mve_encoding_conflict (given, insn->mve_op))
9542 {
9543 signed long value_in_comment = 0;
9544 bool is_unpredictable = false;
9545 bool is_undefined = false;
9546 const char *c;
9547 enum mve_unpredictable unpredictable_cond = UNPRED_NONE;
9548 enum mve_undefined undefined_cond = UNDEF_NONE;
9549
9550 /* Most vector mve instruction are illegal in a it block.
9551 There are a few exceptions; check for them. */
9552 if (ifthen_state && !is_mve_okay_in_it (insn->mve_op))
9553 {
9554 is_unpredictable = true;
9555 unpredictable_cond = UNPRED_IT_BLOCK;
9556 }
9557 else if (is_mve_unpredictable (given, insn->mve_op,
9558 &unpredictable_cond))
9559 is_unpredictable = true;
9560
9561 if (is_mve_undefined (given, insn->mve_op, &undefined_cond))
9562 is_undefined = true;
9563
9564 /* In "VORR Qd, Qm, Qn", if Qm==Qn, VORR is nothing but VMOV,
9565 i.e "VMOV Qd, Qm". */
9566 if ((insn->mve_op == MVE_VORR_REG)
9567 && (arm_decode_field (given, 1, 3)
9568 == arm_decode_field (given, 17, 19)))
9569 continue;
9570
9571 for (c = insn->assembler; *c; c++)
9572 {
9573 if (*c == '%')
9574 {
9575 switch (*++c)
9576 {
9577 case '%':
9578 func (stream, "%%");
9579 break;
9580
9581 case 'a':
9582 /* Don't print anything for '+' as it is implied. */
9583 if (arm_decode_field (given, 23, 23) == 0)
9584 func (stream, "-");
9585 break;
9586
9587 case 'c':
9588 if (ifthen_state)
9589 func (stream, "%s", arm_conditional[IFTHEN_COND]);
9590 break;
9591
9592 case 'd':
9593 print_mve_vld_str_addr (info, given, insn->mve_op);
9594 break;
9595
9596 case 'i':
9597 {
9598 long mve_mask = mve_extract_pred_mask (given);
9599 func (stream, "%s", mve_predicatenames[mve_mask]);
9600 }
9601 break;
9602
9603 case 'j':
9604 {
9605 unsigned int imm5 = 0;
9606 imm5 |= arm_decode_field (given, 6, 7);
9607 imm5 |= (arm_decode_field (given, 12, 14) << 2);
9608 func (stream, "#%u", (imm5 == 0) ? 32 : imm5);
9609 }
9610 break;
9611
9612 case 'k':
9613 func (stream, "#%u",
9614 (arm_decode_field (given, 7, 7) == 0) ? 64 : 48);
9615 break;
9616
9617 case 'n':
9618 print_vec_condition (info, given, insn->mve_op);
9619 break;
9620
9621 case 'o':
9622 if (arm_decode_field (given, 0, 0) == 1)
9623 {
9624 unsigned long size
9625 = arm_decode_field (given, 4, 4)
9626 | (arm_decode_field (given, 6, 6) << 1);
9627
9628 func (stream, ", uxtw #%lu", size);
9629 }
9630 break;
9631
9632 case 'm':
9633 print_mve_rounding_mode (info, given, insn->mve_op);
9634 break;
9635
9636 case 's':
9637 print_mve_vcvt_size (info, given, insn->mve_op);
9638 break;
9639
9640 case 'u':
9641 {
9642 unsigned long op1 = arm_decode_field (given, 21, 22);
9643
9644 if ((insn->mve_op == MVE_VMOV_VEC_LANE_TO_GP))
9645 {
9646 /* Check for signed. */
9647 if (arm_decode_field (given, 23, 23) == 0)
9648 {
9649 /* We don't print 's' for S32. */
9650 if ((arm_decode_field (given, 5, 6) == 0)
9651 && ((op1 == 0) || (op1 == 1)))
9652 ;
9653 else
9654 func (stream, "s");
9655 }
9656 else
9657 func (stream, "u");
9658 }
9659 else
9660 {
9661 if (arm_decode_field (given, 28, 28) == 0)
9662 func (stream, "s");
9663 else
9664 func (stream, "u");
9665 }
9666 }
9667 break;
9668
9669 case 'v':
9670 print_instruction_predicate (info);
9671 break;
9672
9673 case 'w':
9674 if (arm_decode_field (given, 21, 21) == 1)
9675 func (stream, "!");
9676 break;
9677
9678 case 'B':
9679 print_mve_register_blocks (info, given, insn->mve_op);
9680 break;
9681
9682 case 'E':
9683 /* SIMD encoded constant for mov, mvn, vorr, vbic. */
9684
9685 print_simd_imm8 (info, given, 28, insn);
9686 break;
9687
9688 case 'N':
9689 print_mve_vmov_index (info, given);
9690 break;
9691
9692 case 'T':
9693 if (arm_decode_field (given, 12, 12) == 0)
9694 func (stream, "b");
9695 else
9696 func (stream, "t");
9697 break;
9698
9699 case 'X':
9700 if (arm_decode_field (given, 12, 12) == 1)
9701 func (stream, "x");
9702 break;
9703
9704 case '0': case '1': case '2': case '3': case '4':
9705 case '5': case '6': case '7': case '8': case '9':
9706 {
9707 int width;
9708 unsigned long value;
9709
9710 c = arm_decode_bitfield (c, given, &value, &width);
9711
9712 switch (*c)
9713 {
9714 case 'Z':
9715 if (value == 13)
9716 is_unpredictable = true;
9717 else if (value == 15)
9718 func (stream, "zr");
9719 else
9720 func (stream, "%s", arm_regnames[value]);
9721 break;
9722
9723 case 'c':
9724 func (stream, "%s", arm_conditional[value]);
9725 break;
9726
9727 case 'C':
9728 value ^= 1;
9729 func (stream, "%s", arm_conditional[value]);
9730 break;
9731
9732 case 'S':
9733 if (value == 13 || value == 15)
9734 is_unpredictable = true;
9735 else
9736 func (stream, "%s", arm_regnames[value]);
9737 break;
9738
9739 case 's':
9740 print_mve_size (info,
9741 value,
9742 insn->mve_op);
9743 break;
9744 case 'I':
9745 if (value == 1)
9746 func (stream, "i");
9747 break;
9748 case 'A':
9749 if (value == 1)
9750 func (stream, "a");
9751 break;
9752 case 'h':
9753 {
9754 unsigned int odd_reg = (value << 1) | 1;
9755 func (stream, "%s", arm_regnames[odd_reg]);
9756 }
9757 break;
9758 case 'i':
9759 {
9760 unsigned long imm
9761 = arm_decode_field (given, 0, 6);
9762 unsigned long mod_imm = imm;
9763
9764 switch (insn->mve_op)
9765 {
9766 case MVE_VLDRW_GATHER_T5:
9767 case MVE_VSTRW_SCATTER_T5:
9768 mod_imm = mod_imm << 2;
9769 break;
9770 case MVE_VSTRD_SCATTER_T6:
9771 case MVE_VLDRD_GATHER_T6:
9772 mod_imm = mod_imm << 3;
9773 break;
9774
9775 default:
9776 break;
9777 }
9778
9779 func (stream, "%lu", mod_imm);
9780 }
9781 break;
9782 case 'k':
9783 func (stream, "%lu", 64 - value);
9784 break;
9785 case 'l':
9786 {
9787 unsigned int even_reg = value << 1;
9788 func (stream, "%s", arm_regnames[even_reg]);
9789 }
9790 break;
9791 case 'u':
9792 switch (value)
9793 {
9794 case 0:
9795 func (stream, "1");
9796 break;
9797 case 1:
9798 func (stream, "2");
9799 break;
9800 case 2:
9801 func (stream, "4");
9802 break;
9803 case 3:
9804 func (stream, "8");
9805 break;
9806 default:
9807 break;
9808 }
9809 break;
9810 case 'o':
9811 print_mve_rotate (info, value, width);
9812 break;
9813 case 'r':
9814 func (stream, "%s", arm_regnames[value]);
9815 break;
9816 case 'd':
9817 if (insn->mve_op == MVE_VQSHL_T2
9818 || insn->mve_op == MVE_VQSHLU_T3
9819 || insn->mve_op == MVE_VRSHR
9820 || insn->mve_op == MVE_VRSHRN
9821 || insn->mve_op == MVE_VSHL_T1
9822 || insn->mve_op == MVE_VSHLL_T1
9823 || insn->mve_op == MVE_VSHR
9824 || insn->mve_op == MVE_VSHRN
9825 || insn->mve_op == MVE_VSLI
9826 || insn->mve_op == MVE_VSRI)
9827 print_mve_shift_n (info, given, insn->mve_op);
9828 else if (insn->mve_op == MVE_VSHLL_T2)
9829 {
9830 switch (value)
9831 {
9832 case 0x00:
9833 func (stream, "8");
9834 break;
9835 case 0x01:
9836 func (stream, "16");
9837 break;
9838 case 0x10:
9839 print_mve_undefined (info, UNDEF_SIZE_0);
9840 break;
9841 default:
9842 assert (0);
9843 break;
9844 }
9845 }
9846 else
9847 {
9848 if (insn->mve_op == MVE_VSHLC && value == 0)
9849 value = 32;
9850 func (stream, "%ld", value);
9851 value_in_comment = value;
9852 }
9853 break;
9854 case 'F':
9855 func (stream, "s%ld", value);
9856 break;
9857 case 'Q':
9858 if (value & 0x8)
9859 func (stream, "<illegal reg q%ld.5>", value);
9860 else
9861 func (stream, "q%ld", value);
9862 break;
9863 case 'x':
9864 func (stream, "0x%08lx", value);
9865 break;
9866 default:
9867 abort ();
9868 }
9869 break;
9870 default:
9871 abort ();
9872 }
9873 }
9874 }
9875 else
9876 func (stream, "%c", *c);
9877 }
9878
9879 if (value_in_comment > 32 || value_in_comment < -16)
9880 func (stream, "\t; 0x%lx", value_in_comment);
9881
9882 if (is_unpredictable)
9883 print_mve_unpredictable (info, unpredictable_cond);
9884
9885 if (is_undefined)
9886 print_mve_undefined (info, undefined_cond);
9887
9888 if (!vpt_block_state.in_vpt_block
9889 && !ifthen_state
9890 && is_vpt_instruction (given))
9891 mark_inside_vpt_block (given);
9892 else if (vpt_block_state.in_vpt_block)
9893 update_vpt_block_state ();
9894
9895 return true;
9896 }
9897 }
9898 return false;
9899 }
9900
9901
9902 /* Return the name of a v7A special register. */
9903
9904 static const char *
9905 banked_regname (unsigned reg)
9906 {
9907 switch (reg)
9908 {
9909 case 15: return "CPSR";
9910 case 32: return "R8_usr";
9911 case 33: return "R9_usr";
9912 case 34: return "R10_usr";
9913 case 35: return "R11_usr";
9914 case 36: return "R12_usr";
9915 case 37: return "SP_usr";
9916 case 38: return "LR_usr";
9917 case 40: return "R8_fiq";
9918 case 41: return "R9_fiq";
9919 case 42: return "R10_fiq";
9920 case 43: return "R11_fiq";
9921 case 44: return "R12_fiq";
9922 case 45: return "SP_fiq";
9923 case 46: return "LR_fiq";
9924 case 48: return "LR_irq";
9925 case 49: return "SP_irq";
9926 case 50: return "LR_svc";
9927 case 51: return "SP_svc";
9928 case 52: return "LR_abt";
9929 case 53: return "SP_abt";
9930 case 54: return "LR_und";
9931 case 55: return "SP_und";
9932 case 60: return "LR_mon";
9933 case 61: return "SP_mon";
9934 case 62: return "ELR_hyp";
9935 case 63: return "SP_hyp";
9936 case 79: return "SPSR";
9937 case 110: return "SPSR_fiq";
9938 case 112: return "SPSR_irq";
9939 case 114: return "SPSR_svc";
9940 case 116: return "SPSR_abt";
9941 case 118: return "SPSR_und";
9942 case 124: return "SPSR_mon";
9943 case 126: return "SPSR_hyp";
9944 default: return NULL;
9945 }
9946 }
9947
9948 /* Return the name of the DMB/DSB option. */
9949 static const char *
9950 data_barrier_option (unsigned option)
9951 {
9952 switch (option & 0xf)
9953 {
9954 case 0xf: return "sy";
9955 case 0xe: return "st";
9956 case 0xd: return "ld";
9957 case 0xb: return "ish";
9958 case 0xa: return "ishst";
9959 case 0x9: return "ishld";
9960 case 0x7: return "un";
9961 case 0x6: return "unst";
9962 case 0x5: return "nshld";
9963 case 0x3: return "osh";
9964 case 0x2: return "oshst";
9965 case 0x1: return "oshld";
9966 default: return NULL;
9967 }
9968 }
9969
9970 /* Print one ARM instruction from PC on INFO->STREAM. */
9971
9972 static void
9973 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
9974 {
9975 const struct opcode32 *insn;
9976 void *stream = info->stream;
9977 fprintf_ftype func = info->fprintf_func;
9978 struct arm_private_data *private_data = info->private_data;
9979
9980 if (print_insn_coprocessor (pc, info, given, false))
9981 return;
9982
9983 if (print_insn_neon (info, given, false))
9984 return;
9985
9986 if (print_insn_generic_coprocessor (pc, info, given, false))
9987 return;
9988
9989 for (insn = arm_opcodes; insn->assembler; insn++)
9990 {
9991 if ((given & insn->mask) != insn->value)
9992 continue;
9993
9994 if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features))
9995 continue;
9996
9997 /* Special case: an instruction with all bits set in the condition field
9998 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
9999 or by the catchall at the end of the table. */
10000 if ((given & 0xF0000000) != 0xF0000000
10001 || (insn->mask & 0xF0000000) == 0xF0000000
10002 || (insn->mask == 0 && insn->value == 0))
10003 {
10004 unsigned long u_reg = 16;
10005 unsigned long U_reg = 16;
10006 bool is_unpredictable = false;
10007 signed long value_in_comment = 0;
10008 const char *c;
10009
10010 for (c = insn->assembler; *c; c++)
10011 {
10012 if (*c == '%')
10013 {
10014 bool allow_unpredictable = false;
10015
10016 switch (*++c)
10017 {
10018 case '%':
10019 func (stream, "%%");
10020 break;
10021
10022 case 'a':
10023 value_in_comment = print_arm_address (pc, info, given);
10024 break;
10025
10026 case 'P':
10027 /* Set P address bit and use normal address
10028 printing routine. */
10029 value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT));
10030 break;
10031
10032 case 'S':
10033 allow_unpredictable = true;
10034 /* Fall through. */
10035 case 's':
10036 if ((given & 0x004f0000) == 0x004f0000)
10037 {
10038 /* PC relative with immediate offset. */
10039 bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf);
10040
10041 if (PRE_BIT_SET)
10042 {
10043 /* Elide positive zero offset. */
10044 if (offset || NEGATIVE_BIT_SET)
10045 func (stream, "[pc, #%s%d]\t; ",
10046 NEGATIVE_BIT_SET ? "-" : "", (int) offset);
10047 else
10048 func (stream, "[pc]\t; ");
10049 if (NEGATIVE_BIT_SET)
10050 offset = -offset;
10051 info->print_address_func (offset + pc + 8, info);
10052 }
10053 else
10054 {
10055 /* Always show the offset. */
10056 func (stream, "[pc], #%s%d",
10057 NEGATIVE_BIT_SET ? "-" : "", (int) offset);
10058 if (! allow_unpredictable)
10059 is_unpredictable = true;
10060 }
10061 }
10062 else
10063 {
10064 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
10065
10066 func (stream, "[%s",
10067 arm_regnames[(given >> 16) & 0xf]);
10068
10069 if (PRE_BIT_SET)
10070 {
10071 if (IMMEDIATE_BIT_SET)
10072 {
10073 /* Elide offset for non-writeback
10074 positive zero. */
10075 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET
10076 || offset)
10077 func (stream, ", #%s%d",
10078 NEGATIVE_BIT_SET ? "-" : "", offset);
10079
10080 if (NEGATIVE_BIT_SET)
10081 offset = -offset;
10082
10083 value_in_comment = offset;
10084 }
10085 else
10086 {
10087 /* Register Offset or Register Pre-Indexed. */
10088 func (stream, ", %s%s",
10089 NEGATIVE_BIT_SET ? "-" : "",
10090 arm_regnames[given & 0xf]);
10091
10092 /* Writing back to the register that is the source/
10093 destination of the load/store is unpredictable. */
10094 if (! allow_unpredictable
10095 && WRITEBACK_BIT_SET
10096 && ((given & 0xf) == ((given >> 12) & 0xf)))
10097 is_unpredictable = true;
10098 }
10099
10100 func (stream, "]%s",
10101 WRITEBACK_BIT_SET ? "!" : "");
10102 }
10103 else
10104 {
10105 if (IMMEDIATE_BIT_SET)
10106 {
10107 /* Immediate Post-indexed. */
10108 /* PR 10924: Offset must be printed, even if it is zero. */
10109 func (stream, "], #%s%d",
10110 NEGATIVE_BIT_SET ? "-" : "", offset);
10111 if (NEGATIVE_BIT_SET)
10112 offset = -offset;
10113 value_in_comment = offset;
10114 }
10115 else
10116 {
10117 /* Register Post-indexed. */
10118 func (stream, "], %s%s",
10119 NEGATIVE_BIT_SET ? "-" : "",
10120 arm_regnames[given & 0xf]);
10121
10122 /* Writing back to the register that is the source/
10123 destination of the load/store is unpredictable. */
10124 if (! allow_unpredictable
10125 && (given & 0xf) == ((given >> 12) & 0xf))
10126 is_unpredictable = true;
10127 }
10128
10129 if (! allow_unpredictable)
10130 {
10131 /* Writeback is automatically implied by post- addressing.
10132 Setting the W bit is unnecessary and ARM specify it as
10133 being unpredictable. */
10134 if (WRITEBACK_BIT_SET
10135 /* Specifying the PC register as the post-indexed
10136 registers is also unpredictable. */
10137 || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf)))
10138 is_unpredictable = true;
10139 }
10140 }
10141 }
10142 break;
10143
10144 case 'b':
10145 {
10146 bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
10147 bfd_vma target = disp * 4 + pc + 8;
10148 info->print_address_func (target, info);
10149
10150 /* Fill in instruction information. */
10151 info->insn_info_valid = 1;
10152 info->insn_type = dis_branch;
10153 info->target = target;
10154 }
10155 break;
10156
10157 case 'c':
10158 if (((given >> 28) & 0xf) != 0xe)
10159 func (stream, "%s",
10160 arm_conditional [(given >> 28) & 0xf]);
10161 break;
10162
10163 case 'm':
10164 {
10165 int started = 0;
10166 int reg;
10167
10168 func (stream, "{");
10169 for (reg = 0; reg < 16; reg++)
10170 if ((given & (1 << reg)) != 0)
10171 {
10172 if (started)
10173 func (stream, ", ");
10174 started = 1;
10175 func (stream, "%s", arm_regnames[reg]);
10176 }
10177 func (stream, "}");
10178 if (! started)
10179 is_unpredictable = true;
10180 }
10181 break;
10182
10183 case 'q':
10184 arm_decode_shift (given, func, stream, false);
10185 break;
10186
10187 case 'o':
10188 if ((given & 0x02000000) != 0)
10189 {
10190 unsigned int rotate = (given & 0xf00) >> 7;
10191 unsigned int immed = (given & 0xff);
10192 unsigned int a, i;
10193
10194 a = (immed << ((32 - rotate) & 31)
10195 | immed >> rotate) & 0xffffffff;
10196 /* If there is another encoding with smaller rotate,
10197 the rotate should be specified directly. */
10198 for (i = 0; i < 32; i += 2)
10199 if ((a << i | a >> ((32 - i) & 31)) <= 0xff)
10200 break;
10201
10202 if (i != rotate)
10203 func (stream, "#%d, %d", immed, rotate);
10204 else
10205 func (stream, "#%d", a);
10206 value_in_comment = a;
10207 }
10208 else
10209 arm_decode_shift (given, func, stream, true);
10210 break;
10211
10212 case 'p':
10213 if ((given & 0x0000f000) == 0x0000f000)
10214 {
10215 arm_feature_set arm_ext_v6 =
10216 ARM_FEATURE_CORE_LOW (ARM_EXT_V6);
10217
10218 /* The p-variants of tst/cmp/cmn/teq are the pre-V6
10219 mechanism for setting PSR flag bits. They are
10220 obsolete in V6 onwards. */
10221 if (! ARM_CPU_HAS_FEATURE (private_data->features, \
10222 arm_ext_v6))
10223 func (stream, "p");
10224 else
10225 is_unpredictable = true;
10226 }
10227 break;
10228
10229 case 't':
10230 if ((given & 0x01200000) == 0x00200000)
10231 func (stream, "t");
10232 break;
10233
10234 case 'A':
10235 {
10236 int offset = given & 0xff;
10237
10238 value_in_comment = offset * 4;
10239 if (NEGATIVE_BIT_SET)
10240 value_in_comment = - value_in_comment;
10241
10242 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
10243
10244 if (PRE_BIT_SET)
10245 {
10246 if (offset)
10247 func (stream, ", #%d]%s",
10248 (int) value_in_comment,
10249 WRITEBACK_BIT_SET ? "!" : "");
10250 else
10251 func (stream, "]");
10252 }
10253 else
10254 {
10255 func (stream, "]");
10256
10257 if (WRITEBACK_BIT_SET)
10258 {
10259 if (offset)
10260 func (stream, ", #%d", (int) value_in_comment);
10261 }
10262 else
10263 {
10264 func (stream, ", {%d}", (int) offset);
10265 value_in_comment = offset;
10266 }
10267 }
10268 }
10269 break;
10270
10271 case 'B':
10272 /* Print ARM V5 BLX(1) address: pc+25 bits. */
10273 {
10274 bfd_vma address;
10275 bfd_vma offset = 0;
10276
10277 if (! NEGATIVE_BIT_SET)
10278 /* Is signed, hi bits should be ones. */
10279 offset = (-1) ^ 0x00ffffff;
10280
10281 /* Offset is (SignExtend(offset field)<<2). */
10282 offset += given & 0x00ffffff;
10283 offset <<= 2;
10284 address = offset + pc + 8;
10285
10286 if (given & 0x01000000)
10287 /* H bit allows addressing to 2-byte boundaries. */
10288 address += 2;
10289
10290 info->print_address_func (address, info);
10291
10292 /* Fill in instruction information. */
10293 info->insn_info_valid = 1;
10294 info->insn_type = dis_branch;
10295 info->target = address;
10296 }
10297 break;
10298
10299 case 'C':
10300 if ((given & 0x02000200) == 0x200)
10301 {
10302 const char * name;
10303 unsigned sysm = (given & 0x004f0000) >> 16;
10304
10305 sysm |= (given & 0x300) >> 4;
10306 name = banked_regname (sysm);
10307
10308 if (name != NULL)
10309 func (stream, "%s", name);
10310 else
10311 func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
10312 }
10313 else
10314 {
10315 func (stream, "%cPSR_",
10316 (given & 0x00400000) ? 'S' : 'C');
10317 if (given & 0x80000)
10318 func (stream, "f");
10319 if (given & 0x40000)
10320 func (stream, "s");
10321 if (given & 0x20000)
10322 func (stream, "x");
10323 if (given & 0x10000)
10324 func (stream, "c");
10325 }
10326 break;
10327
10328 case 'U':
10329 if ((given & 0xf0) == 0x60)
10330 {
10331 switch (given & 0xf)
10332 {
10333 case 0xf: func (stream, "sy"); break;
10334 default:
10335 func (stream, "#%d", (int) given & 0xf);
10336 break;
10337 }
10338 }
10339 else
10340 {
10341 const char * opt = data_barrier_option (given & 0xf);
10342 if (opt != NULL)
10343 func (stream, "%s", opt);
10344 else
10345 func (stream, "#%d", (int) given & 0xf);
10346 }
10347 break;
10348
10349 case '0': case '1': case '2': case '3': case '4':
10350 case '5': case '6': case '7': case '8': case '9':
10351 {
10352 int width;
10353 unsigned long value;
10354
10355 c = arm_decode_bitfield (c, given, &value, &width);
10356
10357 switch (*c)
10358 {
10359 case 'R':
10360 if (value == 15)
10361 is_unpredictable = true;
10362 /* Fall through. */
10363 case 'r':
10364 case 'T':
10365 /* We want register + 1 when decoding T. */
10366 if (*c == 'T')
10367 value = (value + 1) & 0xf;
10368
10369 if (c[1] == 'u')
10370 {
10371 /* Eat the 'u' character. */
10372 ++ c;
10373
10374 if (u_reg == value)
10375 is_unpredictable = true;
10376 u_reg = value;
10377 }
10378 if (c[1] == 'U')
10379 {
10380 /* Eat the 'U' character. */
10381 ++ c;
10382
10383 if (U_reg == value)
10384 is_unpredictable = true;
10385 U_reg = value;
10386 }
10387 func (stream, "%s", arm_regnames[value]);
10388 break;
10389 case 'd':
10390 func (stream, "%ld", value);
10391 value_in_comment = value;
10392 break;
10393 case 'b':
10394 func (stream, "%ld", value * 8);
10395 value_in_comment = value * 8;
10396 break;
10397 case 'W':
10398 func (stream, "%ld", value + 1);
10399 value_in_comment = value + 1;
10400 break;
10401 case 'x':
10402 func (stream, "0x%08lx", value);
10403
10404 /* Some SWI instructions have special
10405 meanings. */
10406 if ((given & 0x0fffffff) == 0x0FF00000)
10407 func (stream, "\t; IMB");
10408 else if ((given & 0x0fffffff) == 0x0FF00001)
10409 func (stream, "\t; IMBRange");
10410 break;
10411 case 'X':
10412 func (stream, "%01lx", value & 0xf);
10413 value_in_comment = value;
10414 break;
10415 case '`':
10416 c++;
10417 if (value == 0)
10418 func (stream, "%c", *c);
10419 break;
10420 case '\'':
10421 c++;
10422 if (value == ((1ul << width) - 1))
10423 func (stream, "%c", *c);
10424 break;
10425 case '?':
10426 func (stream, "%c", c[(1 << width) - (int) value]);
10427 c += 1 << width;
10428 break;
10429 default:
10430 abort ();
10431 }
10432 }
10433 break;
10434
10435 case 'e':
10436 {
10437 int imm;
10438
10439 imm = (given & 0xf) | ((given & 0xfff00) >> 4);
10440 func (stream, "%d", imm);
10441 value_in_comment = imm;
10442 }
10443 break;
10444
10445 case 'E':
10446 /* LSB and WIDTH fields of BFI or BFC. The machine-
10447 language instruction encodes LSB and MSB. */
10448 {
10449 long msb = (given & 0x001f0000) >> 16;
10450 long lsb = (given & 0x00000f80) >> 7;
10451 long w = msb - lsb + 1;
10452
10453 if (w > 0)
10454 func (stream, "#%lu, #%lu", lsb, w);
10455 else
10456 func (stream, "(invalid: %lu:%lu)", lsb, msb);
10457 }
10458 break;
10459
10460 case 'R':
10461 /* Get the PSR/banked register name. */
10462 {
10463 const char * name;
10464 unsigned sysm = (given & 0x004f0000) >> 16;
10465
10466 sysm |= (given & 0x300) >> 4;
10467 name = banked_regname (sysm);
10468
10469 if (name != NULL)
10470 func (stream, "%s", name);
10471 else
10472 func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
10473 }
10474 break;
10475
10476 case 'V':
10477 /* 16-bit unsigned immediate from a MOVT or MOVW
10478 instruction, encoded in bits 0:11 and 15:19. */
10479 {
10480 long hi = (given & 0x000f0000) >> 4;
10481 long lo = (given & 0x00000fff);
10482 long imm16 = hi | lo;
10483
10484 func (stream, "#%lu", imm16);
10485 value_in_comment = imm16;
10486 }
10487 break;
10488
10489 default:
10490 abort ();
10491 }
10492 }
10493 else
10494 func (stream, "%c", *c);
10495 }
10496
10497 if (value_in_comment > 32 || value_in_comment < -16)
10498 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
10499
10500 if (is_unpredictable)
10501 func (stream, UNPREDICTABLE_INSTRUCTION);
10502
10503 return;
10504 }
10505 }
10506 func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
10507 return;
10508 }
10509
10510 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
10511
10512 static void
10513 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
10514 {
10515 const struct opcode16 *insn;
10516 void *stream = info->stream;
10517 fprintf_ftype func = info->fprintf_func;
10518
10519 for (insn = thumb_opcodes; insn->assembler; insn++)
10520 if ((given & insn->mask) == insn->value)
10521 {
10522 signed long value_in_comment = 0;
10523 const char *c = insn->assembler;
10524
10525 for (; *c; c++)
10526 {
10527 int domaskpc = 0;
10528 int domasklr = 0;
10529
10530 if (*c != '%')
10531 {
10532 func (stream, "%c", *c);
10533 continue;
10534 }
10535
10536 switch (*++c)
10537 {
10538 case '%':
10539 func (stream, "%%");
10540 break;
10541
10542 case 'c':
10543 if (ifthen_state)
10544 func (stream, "%s", arm_conditional[IFTHEN_COND]);
10545 break;
10546
10547 case 'C':
10548 if (ifthen_state)
10549 func (stream, "%s", arm_conditional[IFTHEN_COND]);
10550 else
10551 func (stream, "s");
10552 break;
10553
10554 case 'I':
10555 {
10556 unsigned int tmp;
10557
10558 ifthen_next_state = given & 0xff;
10559 for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
10560 func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
10561 func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
10562 }
10563 break;
10564
10565 case 'x':
10566 if (ifthen_next_state)
10567 func (stream, "\t; unpredictable branch in IT block\n");
10568 break;
10569
10570 case 'X':
10571 if (ifthen_state)
10572 func (stream, "\t; unpredictable <IT:%s>",
10573 arm_conditional[IFTHEN_COND]);
10574 break;
10575
10576 case 'S':
10577 {
10578 long reg;
10579
10580 reg = (given >> 3) & 0x7;
10581 if (given & (1 << 6))
10582 reg += 8;
10583
10584 func (stream, "%s", arm_regnames[reg]);
10585 }
10586 break;
10587
10588 case 'D':
10589 {
10590 long reg;
10591
10592 reg = given & 0x7;
10593 if (given & (1 << 7))
10594 reg += 8;
10595
10596 func (stream, "%s", arm_regnames[reg]);
10597 }
10598 break;
10599
10600 case 'N':
10601 if (given & (1 << 8))
10602 domasklr = 1;
10603 /* Fall through. */
10604 case 'O':
10605 if (*c == 'O' && (given & (1 << 8)))
10606 domaskpc = 1;
10607 /* Fall through. */
10608 case 'M':
10609 {
10610 int started = 0;
10611 int reg;
10612
10613 func (stream, "{");
10614
10615 /* It would be nice if we could spot
10616 ranges, and generate the rS-rE format: */
10617 for (reg = 0; (reg < 8); reg++)
10618 if ((given & (1 << reg)) != 0)
10619 {
10620 if (started)
10621 func (stream, ", ");
10622 started = 1;
10623 func (stream, "%s", arm_regnames[reg]);
10624 }
10625
10626 if (domasklr)
10627 {
10628 if (started)
10629 func (stream, ", ");
10630 started = 1;
10631 func (stream, "%s", arm_regnames[14] /* "lr" */);
10632 }
10633
10634 if (domaskpc)
10635 {
10636 if (started)
10637 func (stream, ", ");
10638 func (stream, "%s", arm_regnames[15] /* "pc" */);
10639 }
10640
10641 func (stream, "}");
10642 }
10643 break;
10644
10645 case 'W':
10646 /* Print writeback indicator for a LDMIA. We are doing a
10647 writeback if the base register is not in the register
10648 mask. */
10649 if ((given & (1 << ((given & 0x0700) >> 8))) == 0)
10650 func (stream, "!");
10651 break;
10652
10653 case 'b':
10654 /* Print ARM V6T2 CZB address: pc+4+6 bits. */
10655 {
10656 bfd_vma address = (pc + 4
10657 + ((given & 0x00f8) >> 2)
10658 + ((given & 0x0200) >> 3));
10659 info->print_address_func (address, info);
10660
10661 /* Fill in instruction information. */
10662 info->insn_info_valid = 1;
10663 info->insn_type = dis_branch;
10664 info->target = address;
10665 }
10666 break;
10667
10668 case 's':
10669 /* Right shift immediate -- bits 6..10; 1-31 print
10670 as themselves, 0 prints as 32. */
10671 {
10672 long imm = (given & 0x07c0) >> 6;
10673 if (imm == 0)
10674 imm = 32;
10675 func (stream, "#%ld", imm);
10676 }
10677 break;
10678
10679 case '0': case '1': case '2': case '3': case '4':
10680 case '5': case '6': case '7': case '8': case '9':
10681 {
10682 int bitstart = *c++ - '0';
10683 int bitend = 0;
10684
10685 while (*c >= '0' && *c <= '9')
10686 bitstart = (bitstart * 10) + *c++ - '0';
10687
10688 switch (*c)
10689 {
10690 case '-':
10691 {
10692 bfd_vma reg;
10693
10694 c++;
10695 while (*c >= '0' && *c <= '9')
10696 bitend = (bitend * 10) + *c++ - '0';
10697 if (!bitend)
10698 abort ();
10699 reg = given >> bitstart;
10700 reg &= (2 << (bitend - bitstart)) - 1;
10701
10702 switch (*c)
10703 {
10704 case 'r':
10705 func (stream, "%s", arm_regnames[reg]);
10706 break;
10707
10708 case 'd':
10709 func (stream, "%ld", (long) reg);
10710 value_in_comment = reg;
10711 break;
10712
10713 case 'H':
10714 func (stream, "%ld", (long) (reg << 1));
10715 value_in_comment = reg << 1;
10716 break;
10717
10718 case 'W':
10719 func (stream, "%ld", (long) (reg << 2));
10720 value_in_comment = reg << 2;
10721 break;
10722
10723 case 'a':
10724 /* PC-relative address -- the bottom two
10725 bits of the address are dropped
10726 before the calculation. */
10727 info->print_address_func
10728 (((pc + 4) & ~3) + (reg << 2), info);
10729 value_in_comment = 0;
10730 break;
10731
10732 case 'x':
10733 func (stream, "0x%04lx", (long) reg);
10734 break;
10735
10736 case 'B':
10737 reg = ((reg ^ (1 << bitend)) - (1 << bitend));
10738 bfd_vma target = reg * 2 + pc + 4;
10739 info->print_address_func (target, info);
10740 value_in_comment = 0;
10741
10742 /* Fill in instruction information. */
10743 info->insn_info_valid = 1;
10744 info->insn_type = dis_branch;
10745 info->target = target;
10746 break;
10747
10748 case 'c':
10749 func (stream, "%s", arm_conditional [reg]);
10750 break;
10751
10752 default:
10753 abort ();
10754 }
10755 }
10756 break;
10757
10758 case '\'':
10759 c++;
10760 if ((given & (1 << bitstart)) != 0)
10761 func (stream, "%c", *c);
10762 break;
10763
10764 case '?':
10765 ++c;
10766 if ((given & (1 << bitstart)) != 0)
10767 func (stream, "%c", *c++);
10768 else
10769 func (stream, "%c", *++c);
10770 break;
10771
10772 default:
10773 abort ();
10774 }
10775 }
10776 break;
10777
10778 default:
10779 abort ();
10780 }
10781 }
10782
10783 if (value_in_comment > 32 || value_in_comment < -16)
10784 func (stream, "\t; 0x%lx", value_in_comment);
10785 return;
10786 }
10787
10788 /* No match. */
10789 func (stream, UNKNOWN_INSTRUCTION_16BIT, (unsigned)given);
10790 return;
10791 }
10792
10793 /* Return the name of an V7M special register. */
10794
10795 static const char *
10796 psr_name (int regno)
10797 {
10798 switch (regno)
10799 {
10800 case 0x0: return "APSR";
10801 case 0x1: return "IAPSR";
10802 case 0x2: return "EAPSR";
10803 case 0x3: return "PSR";
10804 case 0x5: return "IPSR";
10805 case 0x6: return "EPSR";
10806 case 0x7: return "IEPSR";
10807 case 0x8: return "MSP";
10808 case 0x9: return "PSP";
10809 case 0xa: return "MSPLIM";
10810 case 0xb: return "PSPLIM";
10811 case 0x10: return "PRIMASK";
10812 case 0x11: return "BASEPRI";
10813 case 0x12: return "BASEPRI_MAX";
10814 case 0x13: return "FAULTMASK";
10815 case 0x14: return "CONTROL";
10816 case 0x88: return "MSP_NS";
10817 case 0x89: return "PSP_NS";
10818 case 0x8a: return "MSPLIM_NS";
10819 case 0x8b: return "PSPLIM_NS";
10820 case 0x90: return "PRIMASK_NS";
10821 case 0x91: return "BASEPRI_NS";
10822 case 0x93: return "FAULTMASK_NS";
10823 case 0x94: return "CONTROL_NS";
10824 case 0x98: return "SP_NS";
10825 default: return "<unknown>";
10826 }
10827 }
10828
10829 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
10830
10831 static void
10832 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
10833 {
10834 const struct opcode32 *insn;
10835 void *stream = info->stream;
10836 fprintf_ftype func = info->fprintf_func;
10837 bool is_mve = is_mve_architecture (info);
10838
10839 if (print_insn_coprocessor (pc, info, given, true))
10840 return;
10841
10842 if (!is_mve && print_insn_neon (info, given, true))
10843 return;
10844
10845 if (is_mve && print_insn_mve (info, given))
10846 return;
10847
10848 if (print_insn_cde (info, given, true))
10849 return;
10850
10851 if (print_insn_generic_coprocessor (pc, info, given, true))
10852 return;
10853
10854 for (insn = thumb32_opcodes; insn->assembler; insn++)
10855 if ((given & insn->mask) == insn->value)
10856 {
10857 bool is_clrm = false;
10858 bool is_unpredictable = false;
10859 signed long value_in_comment = 0;
10860 const char *c = insn->assembler;
10861
10862 for (; *c; c++)
10863 {
10864 if (*c != '%')
10865 {
10866 func (stream, "%c", *c);
10867 continue;
10868 }
10869
10870 switch (*++c)
10871 {
10872 case '%':
10873 func (stream, "%%");
10874 break;
10875
10876 case 'c':
10877 if (ifthen_state)
10878 func (stream, "%s", arm_conditional[IFTHEN_COND]);
10879 break;
10880
10881 case 'x':
10882 if (ifthen_next_state)
10883 func (stream, "\t; unpredictable branch in IT block\n");
10884 break;
10885
10886 case 'X':
10887 if (ifthen_state)
10888 func (stream, "\t; unpredictable <IT:%s>",
10889 arm_conditional[IFTHEN_COND]);
10890 break;
10891
10892 case 'I':
10893 {
10894 unsigned int imm12 = 0;
10895
10896 imm12 |= (given & 0x000000ffu);
10897 imm12 |= (given & 0x00007000u) >> 4;
10898 imm12 |= (given & 0x04000000u) >> 15;
10899 func (stream, "#%u", imm12);
10900 value_in_comment = imm12;
10901 }
10902 break;
10903
10904 case 'M':
10905 {
10906 unsigned int bits = 0, imm, imm8, mod;
10907
10908 bits |= (given & 0x000000ffu);
10909 bits |= (given & 0x00007000u) >> 4;
10910 bits |= (given & 0x04000000u) >> 15;
10911 imm8 = (bits & 0x0ff);
10912 mod = (bits & 0xf00) >> 8;
10913 switch (mod)
10914 {
10915 case 0: imm = imm8; break;
10916 case 1: imm = ((imm8 << 16) | imm8); break;
10917 case 2: imm = ((imm8 << 24) | (imm8 << 8)); break;
10918 case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
10919 default:
10920 mod = (bits & 0xf80) >> 7;
10921 imm8 = (bits & 0x07f) | 0x80;
10922 imm = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
10923 }
10924 func (stream, "#%u", imm);
10925 value_in_comment = imm;
10926 }
10927 break;
10928
10929 case 'J':
10930 {
10931 unsigned int imm = 0;
10932
10933 imm |= (given & 0x000000ffu);
10934 imm |= (given & 0x00007000u) >> 4;
10935 imm |= (given & 0x04000000u) >> 15;
10936 imm |= (given & 0x000f0000u) >> 4;
10937 func (stream, "#%u", imm);
10938 value_in_comment = imm;
10939 }
10940 break;
10941
10942 case 'K':
10943 {
10944 unsigned int imm = 0;
10945
10946 imm |= (given & 0x000f0000u) >> 16;
10947 imm |= (given & 0x00000ff0u) >> 0;
10948 imm |= (given & 0x0000000fu) << 12;
10949 func (stream, "#%u", imm);
10950 value_in_comment = imm;
10951 }
10952 break;
10953
10954 case 'H':
10955 {
10956 unsigned int imm = 0;
10957
10958 imm |= (given & 0x000f0000u) >> 4;
10959 imm |= (given & 0x00000fffu) >> 0;
10960 func (stream, "#%u", imm);
10961 value_in_comment = imm;
10962 }
10963 break;
10964
10965 case 'V':
10966 {
10967 unsigned int imm = 0;
10968
10969 imm |= (given & 0x00000fffu);
10970 imm |= (given & 0x000f0000u) >> 4;
10971 func (stream, "#%u", imm);
10972 value_in_comment = imm;
10973 }
10974 break;
10975
10976 case 'S':
10977 {
10978 unsigned int reg = (given & 0x0000000fu);
10979 unsigned int stp = (given & 0x00000030u) >> 4;
10980 unsigned int imm = 0;
10981 imm |= (given & 0x000000c0u) >> 6;
10982 imm |= (given & 0x00007000u) >> 10;
10983
10984 func (stream, "%s", arm_regnames[reg]);
10985 switch (stp)
10986 {
10987 case 0:
10988 if (imm > 0)
10989 func (stream, ", lsl #%u", imm);
10990 break;
10991
10992 case 1:
10993 if (imm == 0)
10994 imm = 32;
10995 func (stream, ", lsr #%u", imm);
10996 break;
10997
10998 case 2:
10999 if (imm == 0)
11000 imm = 32;
11001 func (stream, ", asr #%u", imm);
11002 break;
11003
11004 case 3:
11005 if (imm == 0)
11006 func (stream, ", rrx");
11007 else
11008 func (stream, ", ror #%u", imm);
11009 }
11010 }
11011 break;
11012
11013 case 'a':
11014 {
11015 unsigned int Rn = (given & 0x000f0000) >> 16;
11016 unsigned int U = ! NEGATIVE_BIT_SET;
11017 unsigned int op = (given & 0x00000f00) >> 8;
11018 unsigned int i12 = (given & 0x00000fff);
11019 unsigned int i8 = (given & 0x000000ff);
11020 bool writeback = false, postind = false;
11021 bfd_vma offset = 0;
11022
11023 func (stream, "[%s", arm_regnames[Rn]);
11024 if (U) /* 12-bit positive immediate offset. */
11025 {
11026 offset = i12;
11027 if (Rn != 15)
11028 value_in_comment = offset;
11029 }
11030 else if (Rn == 15) /* 12-bit negative immediate offset. */
11031 offset = - (int) i12;
11032 else if (op == 0x0) /* Shifted register offset. */
11033 {
11034 unsigned int Rm = (i8 & 0x0f);
11035 unsigned int sh = (i8 & 0x30) >> 4;
11036
11037 func (stream, ", %s", arm_regnames[Rm]);
11038 if (sh)
11039 func (stream, ", lsl #%u", sh);
11040 func (stream, "]");
11041 break;
11042 }
11043 else switch (op)
11044 {
11045 case 0xE: /* 8-bit positive immediate offset. */
11046 offset = i8;
11047 break;
11048
11049 case 0xC: /* 8-bit negative immediate offset. */
11050 offset = -i8;
11051 break;
11052
11053 case 0xF: /* 8-bit + preindex with wb. */
11054 offset = i8;
11055 writeback = true;
11056 break;
11057
11058 case 0xD: /* 8-bit - preindex with wb. */
11059 offset = -i8;
11060 writeback = true;
11061 break;
11062
11063 case 0xB: /* 8-bit + postindex. */
11064 offset = i8;
11065 postind = true;
11066 break;
11067
11068 case 0x9: /* 8-bit - postindex. */
11069 offset = -i8;
11070 postind = true;
11071 break;
11072
11073 default:
11074 func (stream, ", <undefined>]");
11075 goto skip;
11076 }
11077
11078 if (postind)
11079 func (stream, "], #%d", (int) offset);
11080 else
11081 {
11082 if (offset)
11083 func (stream, ", #%d", (int) offset);
11084 func (stream, writeback ? "]!" : "]");
11085 }
11086
11087 if (Rn == 15)
11088 {
11089 func (stream, "\t; ");
11090 info->print_address_func (((pc + 4) & ~3) + offset, info);
11091 }
11092 }
11093 skip:
11094 break;
11095
11096 case 'A':
11097 {
11098 unsigned int U = ! NEGATIVE_BIT_SET;
11099 unsigned int W = WRITEBACK_BIT_SET;
11100 unsigned int Rn = (given & 0x000f0000) >> 16;
11101 unsigned int off = (given & 0x000000ff);
11102
11103 func (stream, "[%s", arm_regnames[Rn]);
11104
11105 if (PRE_BIT_SET)
11106 {
11107 if (off || !U)
11108 {
11109 func (stream, ", #%c%u", U ? '+' : '-', off * 4);
11110 value_in_comment = off * 4 * (U ? 1 : -1);
11111 }
11112 func (stream, "]");
11113 if (W)
11114 func (stream, "!");
11115 }
11116 else
11117 {
11118 func (stream, "], ");
11119 if (W)
11120 {
11121 func (stream, "#%c%u", U ? '+' : '-', off * 4);
11122 value_in_comment = off * 4 * (U ? 1 : -1);
11123 }
11124 else
11125 {
11126 func (stream, "{%u}", off);
11127 value_in_comment = off;
11128 }
11129 }
11130 }
11131 break;
11132
11133 case 'w':
11134 {
11135 unsigned int Sbit = (given & 0x01000000) >> 24;
11136 unsigned int type = (given & 0x00600000) >> 21;
11137
11138 switch (type)
11139 {
11140 case 0: func (stream, Sbit ? "sb" : "b"); break;
11141 case 1: func (stream, Sbit ? "sh" : "h"); break;
11142 case 2:
11143 if (Sbit)
11144 func (stream, "??");
11145 break;
11146 case 3:
11147 func (stream, "??");
11148 break;
11149 }
11150 }
11151 break;
11152
11153 case 'n':
11154 is_clrm = true;
11155 /* Fall through. */
11156 case 'm':
11157 {
11158 int started = 0;
11159 int reg;
11160
11161 func (stream, "{");
11162 for (reg = 0; reg < 16; reg++)
11163 if ((given & (1 << reg)) != 0)
11164 {
11165 if (started)
11166 func (stream, ", ");
11167 started = 1;
11168 if (is_clrm && reg == 13)
11169 func (stream, "(invalid: %s)", arm_regnames[reg]);
11170 else if (is_clrm && reg == 15)
11171 func (stream, "%s", "APSR");
11172 else
11173 func (stream, "%s", arm_regnames[reg]);
11174 }
11175 func (stream, "}");
11176 }
11177 break;
11178
11179 case 'E':
11180 {
11181 unsigned int msb = (given & 0x0000001f);
11182 unsigned int lsb = 0;
11183
11184 lsb |= (given & 0x000000c0u) >> 6;
11185 lsb |= (given & 0x00007000u) >> 10;
11186 func (stream, "#%u, #%u", lsb, msb - lsb + 1);
11187 }
11188 break;
11189
11190 case 'F':
11191 {
11192 unsigned int width = (given & 0x0000001f) + 1;
11193 unsigned int lsb = 0;
11194
11195 lsb |= (given & 0x000000c0u) >> 6;
11196 lsb |= (given & 0x00007000u) >> 10;
11197 func (stream, "#%u, #%u", lsb, width);
11198 }
11199 break;
11200
11201 case 'G':
11202 {
11203 unsigned int boff = (((given & 0x07800000) >> 23) << 1);
11204 func (stream, "%x", boff);
11205 }
11206 break;
11207
11208 case 'W':
11209 {
11210 unsigned int immA = (given & 0x001f0000u) >> 16;
11211 unsigned int immB = (given & 0x000007feu) >> 1;
11212 unsigned int immC = (given & 0x00000800u) >> 11;
11213 bfd_vma offset = 0;
11214
11215 offset |= immA << 12;
11216 offset |= immB << 2;
11217 offset |= immC << 1;
11218 /* Sign extend. */
11219 offset = (offset & 0x10000) ? offset - (1 << 17) : offset;
11220
11221 info->print_address_func (pc + 4 + offset, info);
11222 }
11223 break;
11224
11225 case 'Y':
11226 {
11227 unsigned int immA = (given & 0x007f0000u) >> 16;
11228 unsigned int immB = (given & 0x000007feu) >> 1;
11229 unsigned int immC = (given & 0x00000800u) >> 11;
11230 bfd_vma offset = 0;
11231
11232 offset |= immA << 12;
11233 offset |= immB << 2;
11234 offset |= immC << 1;
11235 /* Sign extend. */
11236 offset = (offset & 0x40000) ? offset - (1 << 19) : offset;
11237
11238 info->print_address_func (pc + 4 + offset, info);
11239 }
11240 break;
11241
11242 case 'Z':
11243 {
11244 unsigned int immA = (given & 0x00010000u) >> 16;
11245 unsigned int immB = (given & 0x000007feu) >> 1;
11246 unsigned int immC = (given & 0x00000800u) >> 11;
11247 bfd_vma offset = 0;
11248
11249 offset |= immA << 12;
11250 offset |= immB << 2;
11251 offset |= immC << 1;
11252 /* Sign extend. */
11253 offset = (offset & 0x1000) ? offset - (1 << 13) : offset;
11254
11255 info->print_address_func (pc + 4 + offset, info);
11256
11257 unsigned int T = (given & 0x00020000u) >> 17;
11258 unsigned int endoffset = (((given & 0x07800000) >> 23) << 1);
11259 unsigned int boffset = (T == 1) ? 4 : 2;
11260 func (stream, ", ");
11261 func (stream, "%x", endoffset + boffset);
11262 }
11263 break;
11264
11265 case 'Q':
11266 {
11267 unsigned int immh = (given & 0x000007feu) >> 1;
11268 unsigned int imml = (given & 0x00000800u) >> 11;
11269 bfd_vma imm32 = 0;
11270
11271 imm32 |= immh << 2;
11272 imm32 |= imml << 1;
11273
11274 info->print_address_func (pc + 4 + imm32, info);
11275 }
11276 break;
11277
11278 case 'P':
11279 {
11280 unsigned int immh = (given & 0x000007feu) >> 1;
11281 unsigned int imml = (given & 0x00000800u) >> 11;
11282 bfd_vma imm32 = 0;
11283
11284 imm32 |= immh << 2;
11285 imm32 |= imml << 1;
11286
11287 info->print_address_func (pc + 4 - imm32, info);
11288 }
11289 break;
11290
11291 case 'b':
11292 {
11293 unsigned int S = (given & 0x04000000u) >> 26;
11294 unsigned int J1 = (given & 0x00002000u) >> 13;
11295 unsigned int J2 = (given & 0x00000800u) >> 11;
11296 bfd_vma offset = 0;
11297
11298 offset |= !S << 20;
11299 offset |= J2 << 19;
11300 offset |= J1 << 18;
11301 offset |= (given & 0x003f0000) >> 4;
11302 offset |= (given & 0x000007ff) << 1;
11303 offset -= (1 << 20);
11304
11305 bfd_vma target = pc + 4 + offset;
11306 info->print_address_func (target, info);
11307
11308 /* Fill in instruction information. */
11309 info->insn_info_valid = 1;
11310 info->insn_type = dis_branch;
11311 info->target = target;
11312 }
11313 break;
11314
11315 case 'B':
11316 {
11317 unsigned int S = (given & 0x04000000u) >> 26;
11318 unsigned int I1 = (given & 0x00002000u) >> 13;
11319 unsigned int I2 = (given & 0x00000800u) >> 11;
11320 bfd_vma offset = 0;
11321
11322 offset |= !S << 24;
11323 offset |= !(I1 ^ S) << 23;
11324 offset |= !(I2 ^ S) << 22;
11325 offset |= (given & 0x03ff0000u) >> 4;
11326 offset |= (given & 0x000007ffu) << 1;
11327 offset -= (1 << 24);
11328 offset += pc + 4;
11329
11330 /* BLX target addresses are always word aligned. */
11331 if ((given & 0x00001000u) == 0)
11332 offset &= ~2u;
11333
11334 info->print_address_func (offset, info);
11335
11336 /* Fill in instruction information. */
11337 info->insn_info_valid = 1;
11338 info->insn_type = dis_branch;
11339 info->target = offset;
11340 }
11341 break;
11342
11343 case 's':
11344 {
11345 unsigned int shift = 0;
11346
11347 shift |= (given & 0x000000c0u) >> 6;
11348 shift |= (given & 0x00007000u) >> 10;
11349 if (WRITEBACK_BIT_SET)
11350 func (stream, ", asr #%u", shift);
11351 else if (shift)
11352 func (stream, ", lsl #%u", shift);
11353 /* else print nothing - lsl #0 */
11354 }
11355 break;
11356
11357 case 'R':
11358 {
11359 unsigned int rot = (given & 0x00000030) >> 4;
11360
11361 if (rot)
11362 func (stream, ", ror #%u", rot * 8);
11363 }
11364 break;
11365
11366 case 'U':
11367 if ((given & 0xf0) == 0x60)
11368 {
11369 switch (given & 0xf)
11370 {
11371 case 0xf: func (stream, "sy"); break;
11372 default:
11373 func (stream, "#%d", (int) given & 0xf);
11374 break;
11375 }
11376 }
11377 else
11378 {
11379 const char * opt = data_barrier_option (given & 0xf);
11380 if (opt != NULL)
11381 func (stream, "%s", opt);
11382 else
11383 func (stream, "#%d", (int) given & 0xf);
11384 }
11385 break;
11386
11387 case 'C':
11388 if ((given & 0xff) == 0)
11389 {
11390 func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
11391 if (given & 0x800)
11392 func (stream, "f");
11393 if (given & 0x400)
11394 func (stream, "s");
11395 if (given & 0x200)
11396 func (stream, "x");
11397 if (given & 0x100)
11398 func (stream, "c");
11399 }
11400 else if ((given & 0x20) == 0x20)
11401 {
11402 char const* name;
11403 unsigned sysm = (given & 0xf00) >> 8;
11404
11405 sysm |= (given & 0x30);
11406 sysm |= (given & 0x00100000) >> 14;
11407 name = banked_regname (sysm);
11408
11409 if (name != NULL)
11410 func (stream, "%s", name);
11411 else
11412 func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
11413 }
11414 else
11415 {
11416 func (stream, "%s", psr_name (given & 0xff));
11417 }
11418 break;
11419
11420 case 'D':
11421 if (((given & 0xff) == 0)
11422 || ((given & 0x20) == 0x20))
11423 {
11424 char const* name;
11425 unsigned sm = (given & 0xf0000) >> 16;
11426
11427 sm |= (given & 0x30);
11428 sm |= (given & 0x00100000) >> 14;
11429 name = banked_regname (sm);
11430
11431 if (name != NULL)
11432 func (stream, "%s", name);
11433 else
11434 func (stream, "(UNDEF: %lu)", (unsigned long) sm);
11435 }
11436 else
11437 func (stream, "%s", psr_name (given & 0xff));
11438 break;
11439
11440 case '0': case '1': case '2': case '3': case '4':
11441 case '5': case '6': case '7': case '8': case '9':
11442 {
11443 int width;
11444 unsigned long val;
11445
11446 c = arm_decode_bitfield (c, given, &val, &width);
11447
11448 switch (*c)
11449 {
11450 case 's':
11451 if (val <= 3)
11452 func (stream, "%s", mve_vec_sizename[val]);
11453 else
11454 func (stream, "<undef size>");
11455 break;
11456
11457 case 'd':
11458 func (stream, "%lu", val);
11459 value_in_comment = val;
11460 break;
11461
11462 case 'D':
11463 func (stream, "%lu", val + 1);
11464 value_in_comment = val + 1;
11465 break;
11466
11467 case 'W':
11468 func (stream, "%lu", val * 4);
11469 value_in_comment = val * 4;
11470 break;
11471
11472 case 'S':
11473 if (val == 13)
11474 is_unpredictable = true;
11475 /* Fall through. */
11476 case 'R':
11477 if (val == 15)
11478 is_unpredictable = true;
11479 /* Fall through. */
11480 case 'r':
11481 func (stream, "%s", arm_regnames[val]);
11482 break;
11483
11484 case 'c':
11485 func (stream, "%s", arm_conditional[val]);
11486 break;
11487
11488 case '\'':
11489 c++;
11490 if (val == ((1ul << width) - 1))
11491 func (stream, "%c", *c);
11492 break;
11493
11494 case '`':
11495 c++;
11496 if (val == 0)
11497 func (stream, "%c", *c);
11498 break;
11499
11500 case '?':
11501 func (stream, "%c", c[(1 << width) - (int) val]);
11502 c += 1 << width;
11503 break;
11504
11505 case 'x':
11506 func (stream, "0x%lx", val & 0xffffffffUL);
11507 break;
11508
11509 default:
11510 abort ();
11511 }
11512 }
11513 break;
11514
11515 case 'L':
11516 /* PR binutils/12534
11517 If we have a PC relative offset in an LDRD or STRD
11518 instructions then display the decoded address. */
11519 if (((given >> 16) & 0xf) == 0xf)
11520 {
11521 bfd_vma offset = (given & 0xff) * 4;
11522
11523 if ((given & (1 << 23)) == 0)
11524 offset = - offset;
11525 func (stream, "\t; ");
11526 info->print_address_func ((pc & ~3) + 4 + offset, info);
11527 }
11528 break;
11529
11530 default:
11531 abort ();
11532 }
11533 }
11534
11535 if (value_in_comment > 32 || value_in_comment < -16)
11536 func (stream, "\t; 0x%lx", value_in_comment);
11537
11538 if (is_unpredictable)
11539 func (stream, UNPREDICTABLE_INSTRUCTION);
11540
11541 return;
11542 }
11543
11544 /* No match. */
11545 func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
11546 return;
11547 }
11548
11549 /* Print data bytes on INFO->STREAM. */
11550
11551 static void
11552 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
11553 struct disassemble_info *info,
11554 long given)
11555 {
11556 switch (info->bytes_per_chunk)
11557 {
11558 case 1:
11559 info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
11560 break;
11561 case 2:
11562 info->fprintf_func (info->stream, ".short\t0x%04lx", given);
11563 break;
11564 case 4:
11565 info->fprintf_func (info->stream, ".word\t0x%08lx", given);
11566 break;
11567 default:
11568 abort ();
11569 }
11570 }
11571
11572 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
11573 being displayed in symbol relative addresses.
11574
11575 Also disallow private symbol, with __tagsym$$ prefix,
11576 from ARM RVCT toolchain being displayed. */
11577
11578 bool
11579 arm_symbol_is_valid (asymbol * sym,
11580 struct disassemble_info * info ATTRIBUTE_UNUSED)
11581 {
11582 const char * name;
11583
11584 if (sym == NULL)
11585 return false;
11586
11587 name = bfd_asymbol_name (sym);
11588
11589 return (name && *name != '$' && strncmp (name, "__tagsym$$", 10));
11590 }
11591
11592 /* Parse the string of disassembler options. */
11593
11594 static void
11595 parse_arm_disassembler_options (const char *options)
11596 {
11597 const char *opt;
11598
11599 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
11600 {
11601 if (startswith (opt, "reg-names-"))
11602 {
11603 unsigned int i;
11604 for (i = 0; i < NUM_ARM_OPTIONS; i++)
11605 if (disassembler_options_cmp (opt, regnames[i].name) == 0)
11606 {
11607 regname_selected = i;
11608 break;
11609 }
11610
11611 if (i >= NUM_ARM_OPTIONS)
11612 /* xgettext: c-format */
11613 opcodes_error_handler (_("unrecognised register name set: %s"),
11614 opt);
11615 }
11616 else if (startswith (opt, "force-thumb"))
11617 force_thumb = 1;
11618 else if (startswith (opt, "no-force-thumb"))
11619 force_thumb = 0;
11620 else if (startswith (opt, "coproc"))
11621 {
11622 const char *procptr = opt + sizeof ("coproc") - 1;
11623 char *endptr;
11624 uint8_t coproc_number = strtol (procptr, &endptr, 10);
11625 if (endptr != procptr + 1 || coproc_number > 7)
11626 {
11627 opcodes_error_handler (_("cde coprocessor not between 0-7: %s"),
11628 opt);
11629 continue;
11630 }
11631 if (*endptr != '=')
11632 {
11633 opcodes_error_handler (_("coproc must have an argument: %s"),
11634 opt);
11635 continue;
11636 }
11637 endptr += 1;
11638 if (startswith (endptr, "generic"))
11639 cde_coprocs &= ~(1 << coproc_number);
11640 else if (startswith (endptr, "cde")
11641 || startswith (endptr, "CDE"))
11642 cde_coprocs |= (1 << coproc_number);
11643 else
11644 {
11645 opcodes_error_handler (
11646 _("coprocN argument takes options \"generic\","
11647 " \"cde\", or \"CDE\": %s"), opt);
11648 }
11649 }
11650 else
11651 /* xgettext: c-format */
11652 opcodes_error_handler (_("unrecognised disassembler option: %s"), opt);
11653 }
11654
11655 return;
11656 }
11657
11658 static bool
11659 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
11660 enum map_type *map_symbol);
11661
11662 /* Search back through the insn stream to determine if this instruction is
11663 conditionally executed. */
11664
11665 static void
11666 find_ifthen_state (bfd_vma pc,
11667 struct disassemble_info *info,
11668 bool little)
11669 {
11670 unsigned char b[2];
11671 unsigned int insn;
11672 int status;
11673 /* COUNT is twice the number of instructions seen. It will be odd if we
11674 just crossed an instruction boundary. */
11675 int count;
11676 int it_count;
11677 unsigned int seen_it;
11678 bfd_vma addr;
11679
11680 ifthen_address = pc;
11681 ifthen_state = 0;
11682
11683 addr = pc;
11684 count = 1;
11685 it_count = 0;
11686 seen_it = 0;
11687 /* Scan backwards looking for IT instructions, keeping track of where
11688 instruction boundaries are. We don't know if something is actually an
11689 IT instruction until we find a definite instruction boundary. */
11690 for (;;)
11691 {
11692 if (addr == 0 || info->symbol_at_address_func (addr, info))
11693 {
11694 /* A symbol must be on an instruction boundary, and will not
11695 be within an IT block. */
11696 if (seen_it && (count & 1))
11697 break;
11698
11699 return;
11700 }
11701 addr -= 2;
11702 status = info->read_memory_func (addr, (bfd_byte *) b, 2, info);
11703 if (status)
11704 return;
11705
11706 if (little)
11707 insn = (b[0]) | (b[1] << 8);
11708 else
11709 insn = (b[1]) | (b[0] << 8);
11710 if (seen_it)
11711 {
11712 if ((insn & 0xf800) < 0xe800)
11713 {
11714 /* Addr + 2 is an instruction boundary. See if this matches
11715 the expected boundary based on the position of the last
11716 IT candidate. */
11717 if (count & 1)
11718 break;
11719 seen_it = 0;
11720 }
11721 }
11722 if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
11723 {
11724 enum map_type type = MAP_ARM;
11725 bool found = mapping_symbol_for_insn (addr, info, &type);
11726
11727 if (!found || (found && type == MAP_THUMB))
11728 {
11729 /* This could be an IT instruction. */
11730 seen_it = insn;
11731 it_count = count >> 1;
11732 }
11733 }
11734 if ((insn & 0xf800) >= 0xe800)
11735 count++;
11736 else
11737 count = (count + 2) | 1;
11738 /* IT blocks contain at most 4 instructions. */
11739 if (count >= 8 && !seen_it)
11740 return;
11741 }
11742 /* We found an IT instruction. */
11743 ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
11744 if ((ifthen_state & 0xf) == 0)
11745 ifthen_state = 0;
11746 }
11747
11748 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
11749 mapping symbol. */
11750
11751 static int
11752 is_mapping_symbol (struct disassemble_info *info, int n,
11753 enum map_type *map_type)
11754 {
11755 const char *name;
11756
11757 name = bfd_asymbol_name (info->symtab[n]);
11758 if (name[0] == '$' && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
11759 && (name[2] == 0 || name[2] == '.'))
11760 {
11761 *map_type = ((name[1] == 'a') ? MAP_ARM
11762 : (name[1] == 't') ? MAP_THUMB
11763 : MAP_DATA);
11764 return true;
11765 }
11766
11767 return false;
11768 }
11769
11770 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
11771 Returns nonzero if *MAP_TYPE was set. */
11772
11773 static int
11774 get_map_sym_type (struct disassemble_info *info,
11775 int n,
11776 enum map_type *map_type)
11777 {
11778 /* If the symbol is in a different section, ignore it. */
11779 if (info->section != NULL && info->section != info->symtab[n]->section)
11780 return false;
11781
11782 return is_mapping_symbol (info, n, map_type);
11783 }
11784
11785 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
11786 Returns nonzero if *MAP_TYPE was set. */
11787
11788 static int
11789 get_sym_code_type (struct disassemble_info *info,
11790 int n,
11791 enum map_type *map_type)
11792 {
11793 elf_symbol_type *es;
11794 unsigned int type;
11795
11796 /* If the symbol is in a different section, ignore it. */
11797 if (info->section != NULL && info->section != info->symtab[n]->section)
11798 return false;
11799
11800 es = *(elf_symbol_type **)(info->symtab + n);
11801 type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
11802
11803 /* If the symbol has function type then use that. */
11804 if (type == STT_FUNC || type == STT_GNU_IFUNC)
11805 {
11806 if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
11807 == ST_BRANCH_TO_THUMB)
11808 *map_type = MAP_THUMB;
11809 else
11810 *map_type = MAP_ARM;
11811 return true;
11812 }
11813
11814 return false;
11815 }
11816
11817 /* Search the mapping symbol state for instruction at pc. This is only
11818 applicable for elf target.
11819
11820 There is an assumption Here, info->private_data contains the correct AND
11821 up-to-date information about current scan process. The information will be
11822 used to speed this search process.
11823
11824 Return TRUE if the mapping state can be determined, and map_symbol
11825 will be updated accordingly. Otherwise, return FALSE. */
11826
11827 static bool
11828 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
11829 enum map_type *map_symbol)
11830 {
11831 bfd_vma addr, section_vma = 0;
11832 int n, last_sym = -1;
11833 bool found = false;
11834 bool can_use_search_opt_p = false;
11835
11836 /* Default to DATA. A text section is required by the ABI to contain an
11837 INSN mapping symbol at the start. A data section has no such
11838 requirement, hence if no mapping symbol is found the section must
11839 contain only data. This however isn't very useful if the user has
11840 fully stripped the binaries. If this is the case use the section
11841 attributes to determine the default. If we have no section default to
11842 INSN as well, as we may be disassembling some raw bytes on a baremetal
11843 HEX file or similar. */
11844 enum map_type type = MAP_DATA;
11845 if ((info->section && info->section->flags & SEC_CODE) || !info->section)
11846 type = MAP_ARM;
11847 struct arm_private_data *private_data;
11848
11849 if (info->private_data == NULL
11850 || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour)
11851 return false;
11852
11853 private_data = info->private_data;
11854
11855 /* First, look for mapping symbols. */
11856 if (info->symtab_size != 0)
11857 {
11858 if (pc <= private_data->last_mapping_addr)
11859 private_data->last_mapping_sym = -1;
11860
11861 /* Start scanning at the start of the function, or wherever
11862 we finished last time. */
11863 n = info->symtab_pos + 1;
11864
11865 /* If the last stop offset is different from the current one it means we
11866 are disassembling a different glob of bytes. As such the optimization
11867 would not be safe and we should start over. */
11868 can_use_search_opt_p
11869 = private_data->last_mapping_sym >= 0
11870 && info->stop_offset == private_data->last_stop_offset;
11871
11872 if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
11873 n = private_data->last_mapping_sym;
11874
11875 /* Look down while we haven't passed the location being disassembled.
11876 The reason for this is that there's no defined order between a symbol
11877 and an mapping symbol that may be at the same address. We may have to
11878 look at least one position ahead. */
11879 for (; n < info->symtab_size; n++)
11880 {
11881 addr = bfd_asymbol_value (info->symtab[n]);
11882 if (addr > pc)
11883 break;
11884 if (get_map_sym_type (info, n, &type))
11885 {
11886 last_sym = n;
11887 found = true;
11888 }
11889 }
11890
11891 if (!found)
11892 {
11893 n = info->symtab_pos;
11894 if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
11895 n = private_data->last_mapping_sym;
11896
11897 /* No mapping symbol found at this address. Look backwards
11898 for a preceeding one, but don't go pass the section start
11899 otherwise a data section with no mapping symbol can pick up
11900 a text mapping symbol of a preceeding section. The documentation
11901 says section can be NULL, in which case we will seek up all the
11902 way to the top. */
11903 if (info->section)
11904 section_vma = info->section->vma;
11905
11906 for (; n >= 0; n--)
11907 {
11908 addr = bfd_asymbol_value (info->symtab[n]);
11909 if (addr < section_vma)
11910 break;
11911
11912 if (get_map_sym_type (info, n, &type))
11913 {
11914 last_sym = n;
11915 found = true;
11916 break;
11917 }
11918 }
11919 }
11920 }
11921
11922 /* If no mapping symbol was found, try looking up without a mapping
11923 symbol. This is done by walking up from the current PC to the nearest
11924 symbol. We don't actually have to loop here since symtab_pos will
11925 contain the nearest symbol already. */
11926 if (!found)
11927 {
11928 n = info->symtab_pos;
11929 if (n >= 0 && get_sym_code_type (info, n, &type))
11930 {
11931 last_sym = n;
11932 found = true;
11933 }
11934 }
11935
11936 private_data->last_mapping_sym = last_sym;
11937 private_data->last_type = type;
11938 private_data->last_stop_offset = info->stop_offset;
11939
11940 *map_symbol = type;
11941 return found;
11942 }
11943
11944 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
11945 of the supplied arm_feature_set structure with bitmasks indicating
11946 the supported base architectures and coprocessor extensions.
11947
11948 FIXME: This could more efficiently implemented as a constant array,
11949 although it would also be less robust. */
11950
11951 static void
11952 select_arm_features (unsigned long mach,
11953 arm_feature_set * features)
11954 {
11955 arm_feature_set arch_fset;
11956 const arm_feature_set fpu_any = FPU_ANY;
11957
11958 #undef ARM_SET_FEATURES
11959 #define ARM_SET_FEATURES(FSET) \
11960 { \
11961 const arm_feature_set fset = FSET; \
11962 arch_fset = fset; \
11963 }
11964
11965 /* When several architecture versions share the same bfd_mach_arm_XXX value
11966 the most featureful is chosen. */
11967 switch (mach)
11968 {
11969 case bfd_mach_arm_2: ARM_SET_FEATURES (ARM_ARCH_V2); break;
11970 case bfd_mach_arm_2a: ARM_SET_FEATURES (ARM_ARCH_V2S); break;
11971 case bfd_mach_arm_3: ARM_SET_FEATURES (ARM_ARCH_V3); break;
11972 case bfd_mach_arm_3M: ARM_SET_FEATURES (ARM_ARCH_V3M); break;
11973 case bfd_mach_arm_4: ARM_SET_FEATURES (ARM_ARCH_V4); break;
11974 case bfd_mach_arm_4T: ARM_SET_FEATURES (ARM_ARCH_V4T); break;
11975 case bfd_mach_arm_5: ARM_SET_FEATURES (ARM_ARCH_V5); break;
11976 case bfd_mach_arm_5T: ARM_SET_FEATURES (ARM_ARCH_V5T); break;
11977 case bfd_mach_arm_5TE: ARM_SET_FEATURES (ARM_ARCH_V5TE); break;
11978 case bfd_mach_arm_XScale: ARM_SET_FEATURES (ARM_ARCH_XSCALE); break;
11979 case bfd_mach_arm_ep9312:
11980 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T,
11981 ARM_CEXT_MAVERICK | FPU_MAVERICK));
11982 break;
11983 case bfd_mach_arm_iWMMXt: ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break;
11984 case bfd_mach_arm_iWMMXt2: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break;
11985 case bfd_mach_arm_5TEJ: ARM_SET_FEATURES (ARM_ARCH_V5TEJ); break;
11986 case bfd_mach_arm_6: ARM_SET_FEATURES (ARM_ARCH_V6); break;
11987 case bfd_mach_arm_6KZ: ARM_SET_FEATURES (ARM_ARCH_V6KZ); break;
11988 case bfd_mach_arm_6T2: ARM_SET_FEATURES (ARM_ARCH_V6KZT2); break;
11989 case bfd_mach_arm_6K: ARM_SET_FEATURES (ARM_ARCH_V6K); break;
11990 case bfd_mach_arm_7: ARM_SET_FEATURES (ARM_ARCH_V7VE); break;
11991 case bfd_mach_arm_6M: ARM_SET_FEATURES (ARM_ARCH_V6M); break;
11992 case bfd_mach_arm_6SM: ARM_SET_FEATURES (ARM_ARCH_V6SM); break;
11993 case bfd_mach_arm_7EM: ARM_SET_FEATURES (ARM_ARCH_V7EM); break;
11994 case bfd_mach_arm_8:
11995 {
11996 /* Add bits for extensions that Armv8.6-A recognizes. */
11997 arm_feature_set armv8_6_ext_fset
11998 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
11999 ARM_SET_FEATURES (ARM_ARCH_V8_6A);
12000 ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, armv8_6_ext_fset);
12001 break;
12002 }
12003 case bfd_mach_arm_8R: ARM_SET_FEATURES (ARM_ARCH_V8R); break;
12004 case bfd_mach_arm_8M_BASE: ARM_SET_FEATURES (ARM_ARCH_V8M_BASE); break;
12005 case bfd_mach_arm_8M_MAIN: ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN); break;
12006 case bfd_mach_arm_8_1M_MAIN:
12007 ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN);
12008 arm_feature_set mve_all
12009 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE | ARM_EXT2_MVE_FP);
12010 ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, mve_all);
12011 force_thumb = 1;
12012 break;
12013 /* If the machine type is unknown allow all architecture types and all
12014 extensions, with the exception of MVE as that clashes with NEON. */
12015 case bfd_mach_arm_unknown:
12016 ARM_SET_FEATURES (ARM_FEATURE (-1,
12017 -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP),
12018 -1));
12019 break;
12020 default:
12021 abort ();
12022 }
12023 #undef ARM_SET_FEATURES
12024
12025 /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
12026 and thus on bfd_mach_arm_XXX value. Therefore for a given
12027 bfd_mach_arm_XXX value all coprocessor feature bits should be allowed. */
12028 ARM_MERGE_FEATURE_SETS (*features, arch_fset, fpu_any);
12029 }
12030
12031
12032 /* NOTE: There are no checks in these routines that
12033 the relevant number of data bytes exist. */
12034
12035 static int
12036 print_insn (bfd_vma pc, struct disassemble_info *info, bool little)
12037 {
12038 unsigned char b[4];
12039 unsigned long given;
12040 int status;
12041 int is_thumb = false;
12042 int is_data = false;
12043 int little_code;
12044 unsigned int size = 4;
12045 void (*printer) (bfd_vma, struct disassemble_info *, long);
12046 bool found = false;
12047 struct arm_private_data *private_data;
12048
12049 /* Clear instruction information field. */
12050 info->insn_info_valid = 0;
12051 info->branch_delay_insns = 0;
12052 info->data_size = 0;
12053 info->insn_type = dis_noninsn;
12054 info->target = 0;
12055 info->target2 = 0;
12056
12057 if (info->disassembler_options)
12058 {
12059 parse_arm_disassembler_options (info->disassembler_options);
12060
12061 /* To avoid repeated parsing of these options, we remove them here. */
12062 info->disassembler_options = NULL;
12063 }
12064
12065 /* PR 10288: Control which instructions will be disassembled. */
12066 if (info->private_data == NULL)
12067 {
12068 static struct arm_private_data private;
12069
12070 if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0)
12071 /* If the user did not use the -m command line switch then default to
12072 disassembling all types of ARM instruction.
12073
12074 The info->mach value has to be ignored as this will be based on
12075 the default archictecture for the target and/or hints in the notes
12076 section, but it will never be greater than the current largest arm
12077 machine value (iWMMXt2), which is only equivalent to the V5TE
12078 architecture. ARM architectures have advanced beyond the machine
12079 value encoding, and these newer architectures would be ignored if
12080 the machine value was used.
12081
12082 Ie the -m switch is used to restrict which instructions will be
12083 disassembled. If it is necessary to use the -m switch to tell
12084 objdump that an ARM binary is being disassembled, eg because the
12085 input is a raw binary file, but it is also desired to disassemble
12086 all ARM instructions then use "-marm". This will select the
12087 "unknown" arm architecture which is compatible with any ARM
12088 instruction. */
12089 info->mach = bfd_mach_arm_unknown;
12090
12091 /* Compute the architecture bitmask from the machine number.
12092 Note: This assumes that the machine number will not change
12093 during disassembly.... */
12094 select_arm_features (info->mach, & private.features);
12095
12096 private.last_mapping_sym = -1;
12097 private.last_mapping_addr = 0;
12098 private.last_stop_offset = 0;
12099
12100 info->private_data = & private;
12101 }
12102
12103 private_data = info->private_data;
12104
12105 /* Decide if our code is going to be little-endian, despite what the
12106 function argument might say. */
12107 little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little);
12108
12109 /* For ELF, consult the symbol table to determine what kind of code
12110 or data we have. */
12111 if (info->symtab_size != 0
12112 && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
12113 {
12114 bfd_vma addr;
12115 int n;
12116 int last_sym = -1;
12117 enum map_type type = MAP_ARM;
12118
12119 found = mapping_symbol_for_insn (pc, info, &type);
12120 last_sym = private_data->last_mapping_sym;
12121
12122 is_thumb = (private_data->last_type == MAP_THUMB);
12123 is_data = (private_data->last_type == MAP_DATA);
12124
12125 /* Look a little bit ahead to see if we should print out
12126 two or four bytes of data. If there's a symbol,
12127 mapping or otherwise, after two bytes then don't
12128 print more. */
12129 if (is_data)
12130 {
12131 size = 4 - (pc & 3);
12132 for (n = last_sym + 1; n < info->symtab_size; n++)
12133 {
12134 addr = bfd_asymbol_value (info->symtab[n]);
12135 if (addr > pc
12136 && (info->section == NULL
12137 || info->section == info->symtab[n]->section))
12138 {
12139 if (addr - pc < size)
12140 size = addr - pc;
12141 break;
12142 }
12143 }
12144 /* If the next symbol is after three bytes, we need to
12145 print only part of the data, so that we can use either
12146 .byte or .short. */
12147 if (size == 3)
12148 size = (pc & 1) ? 1 : 2;
12149 }
12150 }
12151
12152 if (info->symbols != NULL)
12153 {
12154 if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
12155 {
12156 coff_symbol_type * cs;
12157
12158 cs = coffsymbol (*info->symbols);
12159 is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
12160 || cs->native->u.syment.n_sclass == C_THUMBSTAT
12161 || cs->native->u.syment.n_sclass == C_THUMBLABEL
12162 || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
12163 || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
12164 }
12165 else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
12166 && !found)
12167 {
12168 /* If no mapping symbol has been found then fall back to the type
12169 of the function symbol. */
12170 elf_symbol_type * es;
12171 unsigned int type;
12172
12173 es = *(elf_symbol_type **)(info->symbols);
12174 type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
12175
12176 is_thumb =
12177 ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
12178 == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT);
12179 }
12180 else if (bfd_asymbol_flavour (*info->symbols)
12181 == bfd_target_mach_o_flavour)
12182 {
12183 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols;
12184
12185 is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF);
12186 }
12187 }
12188
12189 if (force_thumb)
12190 is_thumb = true;
12191
12192 if (is_data)
12193 info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
12194 else
12195 info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
12196
12197 info->bytes_per_line = 4;
12198
12199 /* PR 10263: Disassemble data if requested to do so by the user. */
12200 if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0))
12201 {
12202 int i;
12203
12204 /* Size was already set above. */
12205 info->bytes_per_chunk = size;
12206 printer = print_insn_data;
12207
12208 status = info->read_memory_func (pc, (bfd_byte *) b, size, info);
12209 given = 0;
12210 if (little)
12211 for (i = size - 1; i >= 0; i--)
12212 given = b[i] | (given << 8);
12213 else
12214 for (i = 0; i < (int) size; i++)
12215 given = b[i] | (given << 8);
12216 }
12217 else if (!is_thumb)
12218 {
12219 /* In ARM mode endianness is a straightforward issue: the instruction
12220 is four bytes long and is either ordered 0123 or 3210. */
12221 printer = print_insn_arm;
12222 info->bytes_per_chunk = 4;
12223 size = 4;
12224
12225 status = info->read_memory_func (pc, (bfd_byte *) b, 4, info);
12226 if (little_code)
12227 given = (b[0]) | (b[1] << 8) | (b[2] << 16) | ((unsigned) b[3] << 24);
12228 else
12229 given = (b[3]) | (b[2] << 8) | (b[1] << 16) | ((unsigned) b[0] << 24);
12230 }
12231 else
12232 {
12233 /* In Thumb mode we have the additional wrinkle of two
12234 instruction lengths. Fortunately, the bits that determine
12235 the length of the current instruction are always to be found
12236 in the first two bytes. */
12237 printer = print_insn_thumb16;
12238 info->bytes_per_chunk = 2;
12239 size = 2;
12240
12241 status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
12242 if (little_code)
12243 given = (b[0]) | (b[1] << 8);
12244 else
12245 given = (b[1]) | (b[0] << 8);
12246
12247 if (!status)
12248 {
12249 /* These bit patterns signal a four-byte Thumb
12250 instruction. */
12251 if ((given & 0xF800) == 0xF800
12252 || (given & 0xF800) == 0xF000
12253 || (given & 0xF800) == 0xE800)
12254 {
12255 status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info);
12256 if (little_code)
12257 given = (b[0]) | (b[1] << 8) | (given << 16);
12258 else
12259 given = (b[1]) | (b[0] << 8) | (given << 16);
12260
12261 printer = print_insn_thumb32;
12262 size = 4;
12263 }
12264 }
12265
12266 if (ifthen_address != pc)
12267 find_ifthen_state (pc, info, little_code);
12268
12269 if (ifthen_state)
12270 {
12271 if ((ifthen_state & 0xf) == 0x8)
12272 ifthen_next_state = 0;
12273 else
12274 ifthen_next_state = (ifthen_state & 0xe0)
12275 | ((ifthen_state & 0xf) << 1);
12276 }
12277 }
12278
12279 if (status)
12280 {
12281 info->memory_error_func (status, pc, info);
12282 return -1;
12283 }
12284 if (info->flags & INSN_HAS_RELOC)
12285 /* If the instruction has a reloc associated with it, then
12286 the offset field in the instruction will actually be the
12287 addend for the reloc. (We are using REL type relocs).
12288 In such cases, we can ignore the pc when computing
12289 addresses, since the addend is not currently pc-relative. */
12290 pc = 0;
12291
12292 printer (pc, info, given);
12293
12294 if (is_thumb)
12295 {
12296 ifthen_state = ifthen_next_state;
12297 ifthen_address += size;
12298 }
12299 return size;
12300 }
12301
12302 int
12303 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
12304 {
12305 /* Detect BE8-ness and record it in the disassembler info. */
12306 if (info->flavour == bfd_target_elf_flavour
12307 && info->section != NULL
12308 && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8))
12309 info->endian_code = BFD_ENDIAN_LITTLE;
12310
12311 return print_insn (pc, info, false);
12312 }
12313
12314 int
12315 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info)
12316 {
12317 return print_insn (pc, info, true);
12318 }
12319
12320 const disasm_options_and_args_t *
12321 disassembler_options_arm (void)
12322 {
12323 static disasm_options_and_args_t *opts_and_args;
12324
12325 if (opts_and_args == NULL)
12326 {
12327 disasm_options_t *opts;
12328 unsigned int i;
12329
12330 opts_and_args = XNEW (disasm_options_and_args_t);
12331 opts_and_args->args = NULL;
12332
12333 opts = &opts_and_args->options;
12334 opts->name = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
12335 opts->description = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
12336 opts->arg = NULL;
12337 for (i = 0; i < NUM_ARM_OPTIONS; i++)
12338 {
12339 opts->name[i] = regnames[i].name;
12340 if (regnames[i].description != NULL)
12341 opts->description[i] = _(regnames[i].description);
12342 else
12343 opts->description[i] = NULL;
12344 }
12345 /* The array we return must be NULL terminated. */
12346 opts->name[i] = NULL;
12347 opts->description[i] = NULL;
12348 }
12349
12350 return opts_and_args;
12351 }
12352
12353 void
12354 print_arm_disassembler_options (FILE *stream)
12355 {
12356 unsigned int i, max_len = 0;
12357 fprintf (stream, _("\n\
12358 The following ARM specific disassembler options are supported for use with\n\
12359 the -M switch:\n"));
12360
12361 for (i = 0; i < NUM_ARM_OPTIONS; i++)
12362 {
12363 unsigned int len = strlen (regnames[i].name);
12364 if (max_len < len)
12365 max_len = len;
12366 }
12367
12368 for (i = 0, max_len++; i < NUM_ARM_OPTIONS; i++)
12369 fprintf (stream, " %s%*c %s\n",
12370 regnames[i].name,
12371 (int)(max_len - strlen (regnames[i].name)), ' ',
12372 _(regnames[i].description));
12373 }
This page took 0.553232 seconds and 4 git commands to generate.