xref: /netbsd-src/external/gpl3/gdb/dist/opcodes/arm-dis.c (revision 4d342c046e3288fb5a1edcd33cfec48c41c80664)
1 /* Instruction printing code for the ARM
2    Copyright (C) 1994-2020 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 /* FIXME: Belongs in global header.  */
43 #ifndef strneq
44 #define strneq(a,b,n)	(strncmp ((a), (b), (n)) == 0)
45 #endif
46 
47 /* Cached mapping symbol state.  */
48 enum map_type
49 {
50   MAP_ARM,
51   MAP_THUMB,
52   MAP_DATA
53 };
54 
55 struct arm_private_data
56 {
57   /* The features to use when disassembling optional instructions.  */
58   arm_feature_set features;
59 
60   /* Track the last type (although this doesn't seem to be useful) */
61   enum map_type last_type;
62 
63   /* Tracking symbol table information */
64   int last_mapping_sym;
65 
66   /* The end range of the current range being disassembled.  */
67   bfd_vma last_stop_offset;
68   bfd_vma last_mapping_addr;
69 };
70 
71 enum mve_instructions
72 {
73   MVE_VPST,
74   MVE_VPT_FP_T1,
75   MVE_VPT_FP_T2,
76   MVE_VPT_VEC_T1,
77   MVE_VPT_VEC_T2,
78   MVE_VPT_VEC_T3,
79   MVE_VPT_VEC_T4,
80   MVE_VPT_VEC_T5,
81   MVE_VPT_VEC_T6,
82   MVE_VCMP_FP_T1,
83   MVE_VCMP_FP_T2,
84   MVE_VCMP_VEC_T1,
85   MVE_VCMP_VEC_T2,
86   MVE_VCMP_VEC_T3,
87   MVE_VCMP_VEC_T4,
88   MVE_VCMP_VEC_T5,
89   MVE_VCMP_VEC_T6,
90   MVE_VDUP,
91   MVE_VEOR,
92   MVE_VFMAS_FP_SCALAR,
93   MVE_VFMA_FP_SCALAR,
94   MVE_VFMA_FP,
95   MVE_VFMS_FP,
96   MVE_VHADD_T1,
97   MVE_VHADD_T2,
98   MVE_VHSUB_T1,
99   MVE_VHSUB_T2,
100   MVE_VRHADD,
101   MVE_VLD2,
102   MVE_VLD4,
103   MVE_VST2,
104   MVE_VST4,
105   MVE_VLDRB_T1,
106   MVE_VLDRH_T2,
107   MVE_VLDRB_T5,
108   MVE_VLDRH_T6,
109   MVE_VLDRW_T7,
110   MVE_VSTRB_T1,
111   MVE_VSTRH_T2,
112   MVE_VSTRB_T5,
113   MVE_VSTRH_T6,
114   MVE_VSTRW_T7,
115   MVE_VLDRB_GATHER_T1,
116   MVE_VLDRH_GATHER_T2,
117   MVE_VLDRW_GATHER_T3,
118   MVE_VLDRD_GATHER_T4,
119   MVE_VLDRW_GATHER_T5,
120   MVE_VLDRD_GATHER_T6,
121   MVE_VSTRB_SCATTER_T1,
122   MVE_VSTRH_SCATTER_T2,
123   MVE_VSTRW_SCATTER_T3,
124   MVE_VSTRD_SCATTER_T4,
125   MVE_VSTRW_SCATTER_T5,
126   MVE_VSTRD_SCATTER_T6,
127   MVE_VCVT_FP_FIX_VEC,
128   MVE_VCVT_BETWEEN_FP_INT,
129   MVE_VCVT_FP_HALF_FP,
130   MVE_VCVT_FROM_FP_TO_INT,
131   MVE_VRINT_FP,
132   MVE_VMOV_HFP_TO_GP,
133   MVE_VMOV_GP_TO_VEC_LANE,
134   MVE_VMOV_IMM_TO_VEC,
135   MVE_VMOV_VEC_TO_VEC,
136   MVE_VMOV2_VEC_LANE_TO_GP,
137   MVE_VMOV2_GP_TO_VEC_LANE,
138   MVE_VMOV_VEC_LANE_TO_GP,
139   MVE_VMVN_IMM,
140   MVE_VMVN_REG,
141   MVE_VORR_IMM,
142   MVE_VORR_REG,
143   MVE_VORN,
144   MVE_VBIC_IMM,
145   MVE_VBIC_REG,
146   MVE_VMOVX,
147   MVE_VMOVL,
148   MVE_VMOVN,
149   MVE_VMULL_INT,
150   MVE_VMULL_POLY,
151   MVE_VQDMULL_T1,
152   MVE_VQDMULL_T2,
153   MVE_VQMOVN,
154   MVE_VQMOVUN,
155   MVE_VADDV,
156   MVE_VMLADAV_T1,
157   MVE_VMLADAV_T2,
158   MVE_VMLALDAV,
159   MVE_VMLAS,
160   MVE_VADDLV,
161   MVE_VMLSDAV_T1,
162   MVE_VMLSDAV_T2,
163   MVE_VMLSLDAV,
164   MVE_VRMLALDAVH,
165   MVE_VRMLSLDAVH,
166   MVE_VQDMLADH,
167   MVE_VQRDMLADH,
168   MVE_VQDMLAH,
169   MVE_VQRDMLAH,
170   MVE_VQDMLASH,
171   MVE_VQRDMLASH,
172   MVE_VQDMLSDH,
173   MVE_VQRDMLSDH,
174   MVE_VQDMULH_T1,
175   MVE_VQRDMULH_T2,
176   MVE_VQDMULH_T3,
177   MVE_VQRDMULH_T4,
178   MVE_VDDUP,
179   MVE_VDWDUP,
180   MVE_VIWDUP,
181   MVE_VIDUP,
182   MVE_VCADD_FP,
183   MVE_VCADD_VEC,
184   MVE_VHCADD,
185   MVE_VCMLA_FP,
186   MVE_VCMUL_FP,
187   MVE_VQRSHL_T1,
188   MVE_VQRSHL_T2,
189   MVE_VQRSHRN,
190   MVE_VQRSHRUN,
191   MVE_VQSHL_T1,
192   MVE_VQSHL_T2,
193   MVE_VQSHLU_T3,
194   MVE_VQSHL_T4,
195   MVE_VQSHRN,
196   MVE_VQSHRUN,
197   MVE_VRSHL_T1,
198   MVE_VRSHL_T2,
199   MVE_VRSHR,
200   MVE_VRSHRN,
201   MVE_VSHL_T1,
202   MVE_VSHL_T2,
203   MVE_VSHL_T3,
204   MVE_VSHLC,
205   MVE_VSHLL_T1,
206   MVE_VSHLL_T2,
207   MVE_VSHR,
208   MVE_VSHRN,
209   MVE_VSLI,
210   MVE_VSRI,
211   MVE_VADC,
212   MVE_VABAV,
213   MVE_VABD_FP,
214   MVE_VABD_VEC,
215   MVE_VABS_FP,
216   MVE_VABS_VEC,
217   MVE_VADD_FP_T1,
218   MVE_VADD_FP_T2,
219   MVE_VADD_VEC_T1,
220   MVE_VADD_VEC_T2,
221   MVE_VSBC,
222   MVE_VSUB_FP_T1,
223   MVE_VSUB_FP_T2,
224   MVE_VSUB_VEC_T1,
225   MVE_VSUB_VEC_T2,
226   MVE_VAND,
227   MVE_VBRSR,
228   MVE_VCLS,
229   MVE_VCLZ,
230   MVE_VCTP,
231   MVE_VMAX,
232   MVE_VMAXA,
233   MVE_VMAXNM_FP,
234   MVE_VMAXNMA_FP,
235   MVE_VMAXNMV_FP,
236   MVE_VMAXNMAV_FP,
237   MVE_VMAXV,
238   MVE_VMAXAV,
239   MVE_VMIN,
240   MVE_VMINA,
241   MVE_VMINNM_FP,
242   MVE_VMINNMA_FP,
243   MVE_VMINNMV_FP,
244   MVE_VMINNMAV_FP,
245   MVE_VMINV,
246   MVE_VMINAV,
247   MVE_VMLA,
248   MVE_VMUL_FP_T1,
249   MVE_VMUL_FP_T2,
250   MVE_VMUL_VEC_T1,
251   MVE_VMUL_VEC_T2,
252   MVE_VMULH,
253   MVE_VRMULH,
254   MVE_VNEG_FP,
255   MVE_VNEG_VEC,
256   MVE_VPNOT,
257   MVE_VPSEL,
258   MVE_VQABS,
259   MVE_VQADD_T1,
260   MVE_VQADD_T2,
261   MVE_VQSUB_T1,
262   MVE_VQSUB_T2,
263   MVE_VQNEG,
264   MVE_VREV16,
265   MVE_VREV32,
266   MVE_VREV64,
267   MVE_LSLL,
268   MVE_LSLLI,
269   MVE_LSRL,
270   MVE_ASRL,
271   MVE_ASRLI,
272   MVE_SQRSHRL,
273   MVE_SQRSHR,
274   MVE_UQRSHL,
275   MVE_UQRSHLL,
276   MVE_UQSHL,
277   MVE_UQSHLL,
278   MVE_URSHRL,
279   MVE_URSHR,
280   MVE_SRSHRL,
281   MVE_SRSHR,
282   MVE_SQSHLL,
283   MVE_SQSHL,
284   MVE_CINC,
285   MVE_CINV,
286   MVE_CNEG,
287   MVE_CSINC,
288   MVE_CSINV,
289   MVE_CSET,
290   MVE_CSETM,
291   MVE_CSNEG,
292   MVE_CSEL,
293   MVE_NONE
294 };
295 
296 enum mve_unpredictable
297 {
298   UNPRED_IT_BLOCK,		/* Unpredictable because mve insn in it block.
299 				 */
300   UNPRED_FCA_0_FCB_1,		/* Unpredictable because fcA = 0 and
301 				   fcB = 1 (vpt).  */
302   UNPRED_R13,			/* Unpredictable because r13 (sp) or
303 				   r15 (sp) used.  */
304   UNPRED_R15,			/* Unpredictable because r15 (pc) is used.  */
305   UNPRED_Q_GT_4,		/* Unpredictable because
306 				   vec reg start > 4 (vld4/st4).  */
307   UNPRED_Q_GT_6,		/* Unpredictable because
308 				   vec reg start > 6 (vld2/st2).  */
309   UNPRED_R13_AND_WB,		/* Unpredictable becase gp reg = r13
310 				   and WB bit = 1.  */
311   UNPRED_Q_REGS_EQUAL,		/* Unpredictable because vector registers are
312 				   equal.  */
313   UNPRED_OS,			/* Unpredictable because offset scaled == 1.  */
314   UNPRED_GP_REGS_EQUAL,		/* Unpredictable because gp registers are the
315 				   same.  */
316   UNPRED_Q_REGS_EQ_AND_SIZE_1,	/* Unpredictable because q regs equal and
317 				   size = 1.  */
318   UNPRED_Q_REGS_EQ_AND_SIZE_2,	/* Unpredictable because q regs equal and
319 				   size = 2.  */
320   UNPRED_NONE			/* No unpredictable behavior.  */
321 };
322 
323 enum mve_undefined
324 {
325   UNDEF_SIZE,			/* undefined size.  */
326   UNDEF_SIZE_0,			/* undefined because size == 0.  */
327   UNDEF_SIZE_2,			/* undefined because size == 2.  */
328   UNDEF_SIZE_3,			/* undefined because size == 3.  */
329   UNDEF_SIZE_LE_1,		/* undefined because size <= 1.  */
330   UNDEF_SIZE_NOT_0,		/* undefined because size != 0.  */
331   UNDEF_SIZE_NOT_2,		/* undefined because size != 2.  */
332   UNDEF_SIZE_NOT_3,		/* undefined because size != 3.  */
333   UNDEF_NOT_UNS_SIZE_0,		/* undefined because U == 0 and
334 				   size == 0.  */
335   UNDEF_NOT_UNS_SIZE_1,		/* undefined because U == 0 and
336 				   size == 1.  */
337   UNDEF_NOT_UNSIGNED,		/* undefined because U == 0.  */
338   UNDEF_VCVT_IMM6,		/* imm6 < 32.  */
339   UNDEF_VCVT_FSI_IMM6,		/* fsi = 0 and 32 >= imm6 <= 47.  */
340   UNDEF_BAD_OP1_OP2,		/* undefined with op2 = 2 and
341 				   op1 == (0 or 1).  */
342   UNDEF_BAD_U_OP1_OP2,		/* undefined with U = 1 and
343 				   op2 == 0 and op1 == (0 or 1).  */
344   UNDEF_OP_0_BAD_CMODE,		/* undefined because op == 0 and cmode
345 				   in {0xx1, x0x1}.  */
346   UNDEF_XCHG_UNS,		/* undefined because X == 1 and U == 1.  */
347   UNDEF_NONE			/* no undefined behavior.  */
348 };
349 
350 struct opcode32
351 {
352   arm_feature_set arch;		/* Architecture defining this insn.  */
353   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
354   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
355   const char *  assembler;	/* How to disassemble this insn.  */
356 };
357 
358 struct cdeopcode32
359 {
360   arm_feature_set arch;		/* Architecture defining this insn.  */
361   uint8_t coproc_shift;		/* coproc is this far into op.  */
362   uint16_t coproc_mask;		/* Length of coproc field in op.  */
363   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
364   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
365   const char *  assembler;	/* How to disassemble this insn.  */
366 };
367 
368 /* MVE opcodes.  */
369 
370 struct mopcode32
371 {
372   arm_feature_set arch;		/* Architecture defining this insn.  */
373   enum mve_instructions mve_op;  /* Specific mve instruction for faster
374 				    decoding.  */
375   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
376   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
377   const char *  assembler;	/* How to disassemble this insn.  */
378 };
379 
380 enum isa {
381   ANY,
382   T32,
383   ARM
384 };
385 
386 
387 /* Shared (between Arm and Thumb mode) opcode.  */
388 struct sopcode32
389 {
390   enum isa isa;			/* Execution mode instruction availability.  */
391   arm_feature_set arch;		/* Architecture defining this insn.  */
392   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
393   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
394   const char *  assembler;	/* How to disassemble this insn.  */
395 };
396 
397 struct opcode16
398 {
399   arm_feature_set arch;		/* Architecture defining this insn.  */
400   unsigned short value, mask;	/* Recognise insn if (op & mask) == value.  */
401   const char *assembler;	/* How to disassemble this insn.  */
402 };
403 
404 /* print_insn_coprocessor recognizes the following format control codes:
405 
406    %%			%
407 
408    %c			print condition code (always bits 28-31 in ARM mode)
409    %b			print condition code allowing cp_num == 9
410    %q			print shifter argument
411    %u			print condition code (unconditional in ARM mode,
412                           UNPREDICTABLE if not AL in Thumb)
413    %A			print address for ldc/stc/ldf/stf instruction
414    %B			print vstm/vldm register list
415    %C			print vscclrm register list
416    %I                   print cirrus signed shift immediate: bits 0..3|4..6
417    %J			print register for VLDR instruction
418    %K			print address for VLDR instruction
419    %F			print the COUNT field of a LFM/SFM instruction.
420    %P			print floating point precision in arithmetic insn
421    %Q			print floating point precision in ldf/stf insn
422    %R			print floating point rounding mode
423 
424    %<bitfield>c		print as a condition code (for vsel)
425    %<bitfield>r		print as an ARM register
426    %<bitfield>R		as %<>r but r15 is UNPREDICTABLE
427    %<bitfield>ru        as %<>r but each u register must be unique.
428    %<bitfield>d		print the bitfield in decimal
429    %<bitfield>k		print immediate for VFPv3 conversion instruction
430    %<bitfield>x		print the bitfield in hex
431    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
432    %<bitfield>f		print a floating point constant if >7 else a
433 			floating point register
434    %<bitfield>w         print as an iWMMXt width field - [bhwd]ss/us
435    %<bitfield>g         print as an iWMMXt 64-bit register
436    %<bitfield>G         print as an iWMMXt general purpose or control register
437    %<bitfield>D		print as a NEON D register
438    %<bitfield>Q		print as a NEON Q register
439    %<bitfield>V		print as a NEON D or Q register
440    %<bitfield>E		print a quarter-float immediate value
441 
442    %y<code>		print a single precision VFP reg.
443 			  Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
444    %z<code>		print a double precision VFP reg
445 			  Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
446 
447    %<bitfield>'c	print specified char iff bitfield is all ones
448    %<bitfield>`c	print specified char iff bitfield is all zeroes
449    %<bitfield>?ab...    select from array of values in big endian order
450 
451    %L			print as an iWMMXt N/M width field.
452    %Z			print the Immediate of a WSHUFH instruction.
453    %l			like 'A' except use byte offsets for 'B' & 'H'
454 			versions.
455    %i			print 5-bit immediate in bits 8,3..0
456 			(print "32" when 0)
457    %r			print register offset address for wldt/wstr instruction.  */
458 
459 enum opcode_sentinel_enum
460 {
461   SENTINEL_IWMMXT_START = 1,
462   SENTINEL_IWMMXT_END,
463   SENTINEL_GENERIC_START
464 } opcode_sentinels;
465 
466 #define UNDEFINED_INSTRUCTION      "\t\t; <UNDEFINED> instruction: %0-31x"
467 #define UNKNOWN_INSTRUCTION_32BIT  "\t\t; <UNDEFINED> instruction: %08x"
468 #define UNKNOWN_INSTRUCTION_16BIT  "\t\t; <UNDEFINED> instruction: %04x"
469 #define UNPREDICTABLE_INSTRUCTION  "\t; <UNPREDICTABLE>"
470 
471 /* Common coprocessor opcodes shared between Arm and Thumb-2.  */
472 
473 /* print_insn_cde recognizes the following format control codes:
474 
475    %%			%
476 
477    %a			print 'a' iff bit 28 is 1
478    %p			print bits 8-10 as coprocessor
479    %<bitfield>d		print as decimal
480    %<bitfield>r		print as an ARM register
481    %<bitfield>n		print as an ARM register but r15 is APSR_nzcv
482    %<bitfield>T		print as an ARM register + 1
483    %<bitfield>R		as %r but r13 is UNPREDICTABLE
484    %<bitfield>S		as %r but rX where X > 10 is UNPREDICTABLE
485    %j			print immediate taken from bits (16..21,7,0..5)
486    %k			print immediate taken from bits (20..21,7,0..5).
487    %l			print immediate taken from bits (20..22,7,4..5).  */
488 
489 /* At the moment there is only one valid position for the coprocessor number,
490    and hence that's encoded in the macro below.  */
491 #define CDE_OPCODE(ARCH, VALUE, MASK, ASM) \
492   { ARCH, 8, 7, VALUE, MASK, ASM }
493 static const struct cdeopcode32 cde_opcodes[] =
494 {
495   /* Custom Datapath Extension instructions.  */
496   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
497 	      0xee000000, 0xefc00840,
498 	      "cx1%a\t%p, %12-15n, #%0-5,7,16-21d"),
499   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
500 	      0xee000040, 0xefc00840,
501 	      "cx1d%a\t%p, %12-15S, %12-15T, #%0-5,7,16-21d"),
502 
503   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
504 	      0xee400000, 0xefc00840,
505 	      "cx2%a\t%p, %12-15n, %16-19n, #%0-5,7,20-21d"),
506   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
507 	      0xee400040, 0xefc00840,
508 	      "cx2d%a\t%p, %12-15S, %12-15T, %16-19n, #%0-5,7,20-21d"),
509 
510   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
511 	      0xee800000, 0xef800840,
512 	      "cx3%a\t%p, %0-3n, %16-19n, %12-15n, #%4-5,7,20-22d"),
513   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
514 	      0xee800040, 0xef800840,
515 	     "cx3d%a\t%p, %0-3S, %0-3T, %16-19n, %12-15n, #%4-5,7,20-22d"),
516 
517   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
518 	      0xec200000, 0xeeb00840,
519 	      "vcx1%a\t%p, %12-15,22V, #%0-5,7,16-19d"),
520   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
521 	      0xec200040, 0xeeb00840,
522 	      "vcx1%a\t%p, %12-15,22V, #%0-5,7,16-19,24d"),
523 
524   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
525 	      0xec300000, 0xeeb00840,
526 	      "vcx2%a\t%p, %12-15,22V, %0-3,5V, #%4,7,16-19d"),
527   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
528 	      0xec300040, 0xeeb00840,
529 	      "vcx2%a\t%p, %12-15,22V, %0-3,5V, #%4,7,16-19,24d"),
530 
531   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
532 	      0xec800000, 0xee800840,
533 	      "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, #%4,20-21d"),
534   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
535 	      0xec800040, 0xee800840,
536 	      "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, #%4,20-21,24d"),
537 
538   CDE_OPCODE (ARM_FEATURE_CORE_LOW (0), 0, 0, 0)
539 
540 };
541 
542 static const struct sopcode32 coprocessor_opcodes[] =
543 {
544   /* XScale instructions.  */
545   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
546     0x0e200010, 0x0fff0ff0,
547     "mia%c\tacc0, %0-3r, %12-15r"},
548   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
549     0x0e280010, 0x0fff0ff0,
550     "miaph%c\tacc0, %0-3r, %12-15r"},
551   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
552     0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
553   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
554     0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
555   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
556     0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
557 
558   /* Intel Wireless MMX technology instructions.  */
559   {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" },
560   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
561     0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
562   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
563     0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
564   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
565     0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
566   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
567     0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
568   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
569     0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
570   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
571     0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
572   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
573     0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
574   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
575     0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
576   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
577     0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
578   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
579     0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
580   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
581     0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
582   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
583     0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
584   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
585     0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
586   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
587     0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
588   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
589     0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
590   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
591     0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
592   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
593     0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
594   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
595     0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
596   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
597     0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
598   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
599     0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
600   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
601     0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
602   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
603     0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
604   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
605     0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
606   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
607     0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
608   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
609     0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
610   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
611     0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
612   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
613     0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
614   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
615     0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
616   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
617     0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
618   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
619     0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
620   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
621     0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
622   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
623     0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
624   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
625     0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
626   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
627     0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
628   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
629     0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
630   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
631     0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
632   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
633     0x0e800120, 0x0f800ff0,
634     "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
635   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
636     0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
637   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
638     0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
639   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
640     0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
641   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
642     0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
643   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
644     0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
645   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
646     0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
647   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
648     0x0e8000a0, 0x0f800ff0,
649     "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
650   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
651     0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
652   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
653     0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
654   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
655     0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
656   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
657     0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
658   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
659     0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
660   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
661     0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
662   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
663     0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
664   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
665     0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
666   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
667     0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
668   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
669     0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
670   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
671     0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
672   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
673     0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
674   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
675     0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
676   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
677     0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
678   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
679     0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
680   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
681     0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
682   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
683     0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
684   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
685     0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
686   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
687     0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
688   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
689     0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
690   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
691     0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
692   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
693     0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
694   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
695     0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
696   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
697     0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
698   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
699     0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
700   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
701     0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
702   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
703     0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
704   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
705     0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
706   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
707     0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
708   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
709     0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
710   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
711     0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
712   {ANY, ARM_FEATURE_CORE_LOW (0),
713     SENTINEL_IWMMXT_END, 0, "" },
714 
715   /* Floating point coprocessor (FPA) instructions.  */
716   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
717     0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
718   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
719     0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
720   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
721     0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
722   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
723     0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
724   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
725     0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
726   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
727     0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
728   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
729     0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
730   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
731     0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
732   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
733     0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
734   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
735     0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
736   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
737     0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
738   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
739     0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
740   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
741     0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
742   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
743     0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
744   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
745     0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
746   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
747     0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
748   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
749     0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
750   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
751     0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
752   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
753     0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
754   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
755     0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
756   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
757     0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
758   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
759     0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
760   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
761     0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
762   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
763     0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
764   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
765     0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
766   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
767     0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
768   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
769     0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
770   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
771     0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
772   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
773     0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
774   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
775     0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
776   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
777     0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
778   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
779     0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
780   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
781     0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
782   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
783     0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
784   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
785     0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
786   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
787     0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
788   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
789     0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
790   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
791     0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
792   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
793     0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
794   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
795     0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
796   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1),
797     0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
798   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
799     0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
800   {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2),
801     0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
802 
803   /* Armv8.1-M Mainline instructions.  */
804   {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
805     0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
806   {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
807     0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
808 
809   /* ARMv8-M Mainline Security Extensions instructions.  */
810   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
811     0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
812   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
813     0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
814 
815   /* Register load/store.  */
816   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
817     0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
818   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
819     0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
820   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
821     0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
822   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
823     0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
824   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
825     0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
826   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
827     0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
828   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
829     0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
830   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
831     0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
832   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
833     0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
834   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
835     0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
836   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
837     0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
838   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
839     0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
840   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
841     0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
842   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
843     0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
844   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
845     0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
846   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
847     0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
848   {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
849     0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
850   {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
851     0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
852 
853   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
854     0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
855   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
856     0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
857   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
858     0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
859   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
860     0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
861 
862   /* Data transfer between ARM and NEON registers.  */
863   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
864     0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
865   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
866     0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
867   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
868     0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
869   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
870     0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
871   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
872     0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
873   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
874     0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
875   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
876     0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
877   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
878     0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
879   /* Half-precision conversion instructions.  */
880   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
881     0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
882   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
883     0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
884   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
885     0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
886   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
887     0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
888 
889   /* Floating point coprocessor (VFP) instructions.  */
890   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
891     0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
892   {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
893     0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
894   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
895     0x0ee20a10, 0x0fff0fff, "vmsr%c\tfpscr_nzcvqc, %12-15r"},
896   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
897     0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
898   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
899     0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
900   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
901     0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"},
902   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
903     0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
904   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
905     0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
906   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
907     0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
908   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
909     0x0eec0a10, 0x0fff0fff, "vmsr%c\tvpr, %12-15r"},
910   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
911     0x0eed0a10, 0x0fff0fff, "vmsr%c\tp0, %12-15r"},
912   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
913     0x0eee0a10, 0x0fff0fff, "vmsr%c\tfpcxt_ns, %12-15r"},
914   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
915     0x0eef0a10, 0x0fff0fff, "vmsr%c\tfpcxt_s, %12-15r"},
916   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
917     0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
918   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
919     0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
920   {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
921     0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
922   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
923     0x0ef20a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr_nzcvqc"},
924   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
925     0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"},
926   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
927     0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
928   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
929     0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
930   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
931     0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
932   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
933     0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
934   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
935     0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
936   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
937     0x0efc0a10, 0x0fff0fff, "vmrs%c\t%12-15r, vpr"},
938   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
939     0x0efd0a10, 0x0fff0fff, "vmrs%c\t%12-15r, p0"},
940   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
941     0x0efe0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_ns"},
942   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
943     0x0eff0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_s"},
944   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
945     0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
946   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
947     0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
948   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
949     0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
950   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
951     0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
952   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
953     0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
954   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
955     0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
956   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
957     0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
958   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
959     0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
960   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
961     0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
962   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
963     0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
964   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
965     0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
966   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
967     0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
968   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
969     0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
970   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
971     0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
972   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
973     0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
974   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
975     0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
976   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
977     0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
978   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
979     0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
980   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
981     0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
982   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
983     0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
984   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
985     0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
986   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
987     0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
988   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
989     0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
990   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
991     0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
992   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
993     0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
994   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
995     0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
996   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
997     0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
998   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
999     0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
1000   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1001     0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
1002   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
1003     0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"},
1004   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
1005     0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"},
1006   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1007     0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
1008   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1009     0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
1010   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
1011     0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
1012   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1013     0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
1014   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1015     0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
1016   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1017     0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
1018   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1019     0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
1020   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1021     0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
1022   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1023     0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
1024   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1025     0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
1026   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1027     0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
1028   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1029     0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
1030   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1031     0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
1032   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1033     0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
1034   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1035     0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
1036   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1037     0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
1038   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1039     0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
1040   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1041     0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
1042   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1043     0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
1044   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
1045     0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
1046   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
1047     0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
1048 
1049   /* Cirrus coprocessor instructions.  */
1050   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1051     0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
1052   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1053     0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
1054   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1055     0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
1056   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1057     0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
1058   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1059     0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
1060   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1061     0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
1062   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1063     0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
1064   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1065     0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
1066   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1067     0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
1068   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1069     0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
1070   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1071     0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
1072   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1073     0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
1074   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1075     0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
1076   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1077     0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
1078   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1079     0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
1080   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1081     0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
1082   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1083     0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
1084   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1085     0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
1086   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1087     0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
1088   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1089     0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
1090   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1091     0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
1092   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1093     0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
1094   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1095     0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
1096   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1097     0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
1098   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1099     0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
1100   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1101     0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
1102   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1103     0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
1104   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1105     0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
1106   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1107     0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
1108   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1109     0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
1110   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1111     0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
1112   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1113     0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
1114   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1115     0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
1116   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1117     0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
1118   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1119     0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
1120   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1121     0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
1122   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1123     0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
1124   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1125     0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
1126   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1127     0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
1128   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1129     0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
1130   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1131     0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
1132   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1133     0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
1134   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1135     0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
1136   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1137     0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
1138   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1139     0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
1140   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1141     0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
1142   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1143     0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
1144   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1145     0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
1146   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1147     0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
1148   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1149     0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
1150   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1151     0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
1152   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1153     0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
1154   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1155     0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
1156   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1157     0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
1158   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1159     0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
1160   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1161     0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
1162   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1163     0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
1164   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1165     0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
1166   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1167     0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
1168   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1169     0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
1170   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1171     0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
1172   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1173     0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
1174   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1175     0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1176   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1177     0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1178   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1179     0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1180   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1181     0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1182   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1183     0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
1184   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1185     0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
1186   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1187     0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
1188   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1189     0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
1190   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1191     0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
1192   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1193     0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
1194   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1195     0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1196   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1197     0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1198   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1199     0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1200   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1201     0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1202   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1203     0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1204   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1205     0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
1206   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1207     0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1208   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1209     0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1210   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1211     0x0e000600, 0x0ff00f10,
1212     "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1213   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1214     0x0e100600, 0x0ff00f10,
1215     "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
1216   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1217     0x0e200600, 0x0ff00f10,
1218     "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1219   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
1220     0x0e300600, 0x0ff00f10,
1221     "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
1222 
1223   /* VFP Fused multiply add instructions.  */
1224   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1225     0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
1226   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1227     0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
1228   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1229     0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
1230   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1231     0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
1232   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1233     0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
1234   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1235     0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
1236   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1237     0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
1238   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
1239     0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
1240 
1241   /* FP v5.  */
1242   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1243     0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
1244   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1245     0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
1246   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1247     0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
1248   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1249     0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
1250   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1251     0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
1252   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1253     0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
1254   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1255     0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
1256   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1257     0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
1258   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1259     0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
1260   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1261     0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
1262   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1263     0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
1264   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
1265     0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
1266 
1267   {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" },
1268   /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8.  */
1269   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1270     0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1271   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1272     0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"},
1273   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1274     0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1275   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1276     0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1277   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1278     0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"},
1279   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1280     0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"},
1281   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1282     0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"},
1283   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1284     0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"},
1285   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1286     0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"},
1287   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1288     0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
1289 
1290   /* BFloat16 instructions.  */
1291   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1292     0x0eb30940, 0x0fbf0f50, "vcvt%7?tb%b.bf16.f32\t%y1, %y0"},
1293 
1294   /* Dot Product instructions in the space of coprocessor 13.  */
1295   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
1296     0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
1297   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
1298     0xfe200d00, 0xff200f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
1299 
1300   /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8.  */
1301   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1302     0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1303   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1304     0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
1305   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1306     0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1307   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1308     0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
1309   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1310     0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1311   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1312     0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
1313   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1314     0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1315   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
1316     0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
1317 
1318   /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
1319      cp_num: bit <11:8> == 0b1001.
1320      cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE.  */
1321   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1322     0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
1323   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1324     0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
1325   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1326     0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
1327   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1328     0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"},
1329   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1330     0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
1331   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1332     0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"},
1333   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1334     0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
1335   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1336     0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
1337   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1338     0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
1339   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1340     0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
1341   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1342     0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
1343   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1344     0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
1345   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1346     0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
1347   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1348     0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
1349   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1350     0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
1351   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1352     0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
1353   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1354     0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
1355   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1356     0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
1357   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1358     0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
1359   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1360     0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
1361   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1362     0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
1363   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1364     0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
1365   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1366     0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
1367   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1368     0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
1369   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1370     0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"},
1371   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1372     0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
1373   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1374     0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
1375   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1376     0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
1377   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1378     0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
1379   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1380     0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
1381   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1382     0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
1383   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1384     0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
1385   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1386     0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
1387   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1388     0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
1389   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1390     0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
1391 
1392   /* ARMv8.3 javascript conversion instruction.  */
1393   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
1394     0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
1395 
1396   {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1397 };
1398 
1399 /* Generic coprocessor instructions.  These are only matched if a more specific
1400    SIMD or co-processor instruction does not match first.  */
1401 
1402 static const struct sopcode32 generic_coprocessor_opcodes[] =
1403 {
1404   /* Generic coprocessor instructions.  */
1405   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
1406     0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
1407   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
1408     0x0c500000, 0x0ff00000,
1409     "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1410   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1411     0x0e000000, 0x0f000010,
1412     "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1413   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1414     0x0e10f010, 0x0f10f010,
1415     "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
1416   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1417     0x0e100010, 0x0f100010,
1418     "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1419   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1420     0x0e000010, 0x0f100010,
1421     "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1422   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1423     0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
1424   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
1425     0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
1426 
1427   /* V6 coprocessor instructions.  */
1428   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
1429     0xfc500000, 0xfff00000,
1430     "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
1431   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
1432     0xfc400000, 0xfff00000,
1433     "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
1434 
1435   /* V5 coprocessor instructions.  */
1436   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1437     0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1438   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1439     0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
1440   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1441     0xfe000000, 0xff000010,
1442     "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
1443   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1444     0xfe000010, 0xff100010,
1445     "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
1446   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
1447     0xfe100010, 0xff100010,
1448     "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
1449 
1450   {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
1451 };
1452 
1453 /* Neon opcode table:  This does not encode the top byte -- that is
1454    checked by the print_insn_neon routine, as it depends on whether we are
1455    doing thumb32 or arm32 disassembly.  */
1456 
1457 /* print_insn_neon recognizes the following format control codes:
1458 
1459    %%			%
1460 
1461    %c			print condition code
1462    %u			print condition code (unconditional in ARM mode,
1463                           UNPREDICTABLE if not AL in Thumb)
1464    %A			print v{st,ld}[1234] operands
1465    %B			print v{st,ld}[1234] any one operands
1466    %C			print v{st,ld}[1234] single->all operands
1467    %D			print scalar
1468    %E			print vmov, vmvn, vorr, vbic encoded constant
1469    %F			print vtbl,vtbx register list
1470 
1471    %<bitfield>r		print as an ARM register
1472    %<bitfield>d		print the bitfield in decimal
1473    %<bitfield>e         print the 2^N - bitfield in decimal
1474    %<bitfield>D		print as a NEON D register
1475    %<bitfield>Q		print as a NEON Q register
1476    %<bitfield>R		print as a NEON D or Q register
1477    %<bitfield>Sn	print byte scaled width limited by n
1478    %<bitfield>Tn	print short scaled width limited by n
1479    %<bitfield>Un	print long scaled width limited by n
1480 
1481    %<bitfield>'c	print specified char iff bitfield is all ones
1482    %<bitfield>`c	print specified char iff bitfield is all zeroes
1483    %<bitfield>?ab...    select from array of values in big endian order.  */
1484 
1485 static const struct opcode32 neon_opcodes[] =
1486 {
1487   /* Extract.  */
1488   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1489     0xf2b00840, 0xffb00850,
1490     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1491   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1492     0xf2b00000, 0xffb00810,
1493     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
1494 
1495   /* Data transfer between ARM and NEON registers.  */
1496   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1497     0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
1498   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1499     0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
1500   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1501     0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
1502   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1503     0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
1504   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1505     0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
1506   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1507     0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
1508 
1509   /* Move data element to all lanes.  */
1510   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1511     0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
1512   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1513     0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
1514   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1515     0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
1516 
1517   /* Table lookup.  */
1518   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1519     0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
1520   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1521     0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
1522 
1523   /* Half-precision conversions.  */
1524   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
1525     0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
1526   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
1527     0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
1528 
1529   /* NEON fused multiply add instructions.  */
1530   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
1531     0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1532   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1533     0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1534   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
1535     0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1536   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1537     0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1538 
1539   /* BFloat16 instructions.  */
1540   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1541     0xfc000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1542   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1543     0xfe000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1544   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1545     0xfc000c40, 0xffb00f50, "vmmla.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1546   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1547     0xf3b60640, 0xffbf0fd0, "vcvt%c.bf16.f32\t%12-15,22D, %0-3,5Q"},
1548   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1549     0xfc300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1550   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
1551     0xfe300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-2D[%3,5d]"},
1552 
1553   /* Matrix Multiply instructions.  */
1554   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1555     0xfc200c40, 0xffb00f50, "vsmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1556   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1557     0xfc200c50, 0xffb00f50, "vummla.u8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1558   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1559     0xfca00c40, 0xffb00f50, "vusmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1560   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1561     0xfca00d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
1562   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1563     0xfe800d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1564   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
1565     0xfe800d10, 0xffb00f10, "vsudot.u8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"},
1566 
1567   /* Two registers, miscellaneous.  */
1568   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1569     0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
1570   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1571     0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
1572   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1573     0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
1574   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1575     0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
1576   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1577     0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
1578   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1579     0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
1580   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1581     0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
1582   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1583     0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
1584   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1585     0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
1586   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1587     0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
1588   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1589     0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
1590   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1591     0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
1592   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1593     0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
1594   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1595     0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
1596   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1597     0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
1598   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1599     0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
1600   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1601     0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
1602   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1603     0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
1604   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1605     0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1606   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1607     0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
1608   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1609     0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
1610   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1611     0xf3b20300, 0xffb30fd0,
1612     "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
1613   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1614     0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1615   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1616     0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1617   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1618     0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
1619   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1620     0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
1621   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1622     0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1623   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1624     0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1625   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1626     0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1627   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1628     0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1629   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1630     0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
1631   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1632     0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1633   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1634     0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
1635   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1636     0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1637   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1638     0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1639   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1640     0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
1641   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1642     0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1643   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1644     0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1645   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1646     0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1647   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1648     0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1649   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1650     0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
1651   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1652     0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1653   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1654     0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
1655   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1656     0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1657   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1658     0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
1659   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1660     0xf3bb0600, 0xffbf0e10,
1661     "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
1662   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1663     0xf3b70600, 0xffbf0e10,
1664     "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
1665 
1666   /* Three registers of the same length.  */
1667   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1668     0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1669   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1670     0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1671   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1672     0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1673   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1674     0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1675   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1676     0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1677   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1678     0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1679   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
1680     0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
1681   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1682     0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1683   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1684     0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1685   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
1686     0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1687   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1688     0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1689   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1690     0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1691   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1692     0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1693   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1694     0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1695   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1696     0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1697   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1698     0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1699   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1700     0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1701   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1702     0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1703   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1704     0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
1705   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1706     0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1707   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1708     0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1709   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1710     0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1711   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1712     0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1713   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1714     0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1715   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1716     0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1717   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1718     0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1719   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1720     0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1721   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1722     0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1723   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1724     0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1725   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1726     0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1727   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1728     0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1729   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1730     0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1731   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1732     0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1733   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1734     0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1735   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1736     0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1737   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1738     0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1739   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1740     0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1741   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1742     0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1743   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1744     0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1745   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1746     0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1747   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1748     0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1749   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1750     0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1751   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1752     0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1753   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1754     0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1755   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1756     0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1757   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1758     0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1759   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1760     0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1761   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1762     0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1763   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1764     0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1765   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1766     0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1767   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1768     0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1769   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1770     0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1771   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1772     0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1773   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1774     0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
1775   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
1776     0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
1777   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1778     0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1779   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1780     0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1781   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1782     0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1783   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1784     0xf2000b00, 0xff800f10,
1785     "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1786   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1787     0xf2000b10, 0xff800f10,
1788     "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1789   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1790     0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1791   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1792     0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1793   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1794     0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1795   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1796     0xf3000b00, 0xff800f10,
1797     "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1798   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1799     0xf2000000, 0xfe800f10,
1800     "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1801   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1802     0xf2000010, 0xfe800f10,
1803     "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1804   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1805     0xf2000100, 0xfe800f10,
1806     "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1807   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1808     0xf2000200, 0xfe800f10,
1809     "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1810   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1811     0xf2000210, 0xfe800f10,
1812     "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
1813   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1814     0xf2000300, 0xfe800f10,
1815     "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1816   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1817     0xf2000310, 0xfe800f10,
1818     "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1819   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1820     0xf2000400, 0xfe800f10,
1821     "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1822   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1823     0xf2000410, 0xfe800f10,
1824     "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1825   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1826     0xf2000500, 0xfe800f10,
1827     "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1828   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1829     0xf2000510, 0xfe800f10,
1830     "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
1831   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1832     0xf2000600, 0xfe800f10,
1833     "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1834   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1835     0xf2000610, 0xfe800f10,
1836     "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1837   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1838     0xf2000700, 0xfe800f10,
1839     "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1840   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1841     0xf2000710, 0xfe800f10,
1842     "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1843   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1844     0xf2000910, 0xfe800f10,
1845     "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1846   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1847     0xf2000a00, 0xfe800f10,
1848     "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1849   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1850     0xf2000a10, 0xfe800f10,
1851     "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
1852   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
1853     0xf3000b10, 0xff800f10,
1854     "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1855   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
1856     0xf3000c10, 0xff800f10,
1857     "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
1858 
1859   /* One register and an immediate value.  */
1860   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1861     0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
1862   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1863     0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
1864   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1865     0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
1866   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1867     0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
1868   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1869     0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
1870   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1871     0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
1872   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1873     0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
1874   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1875     0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
1876   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1877     0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
1878   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1879     0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
1880   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1881     0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
1882   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1883     0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
1884   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1885     0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
1886 
1887   /* Two registers and a shift amount.  */
1888   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1889     0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1890   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1891     0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1892   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1893     0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1894   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1895     0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1896   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1897     0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1898   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1899     0xf2880950, 0xfeb80fd0,
1900     "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
1901   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1902     0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"},
1903   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1904     0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1905   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1906     0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1907   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1908     0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1909   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1910     0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
1911   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1912     0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
1913   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1914     0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
1915   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1916     0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1917   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1918     0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1919   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1920     0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1921   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1922     0xf2900950, 0xfeb00fd0,
1923     "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
1924   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1925     0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"},
1926   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1927     0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1928   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1929     0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1930   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1931     0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1932   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1933     0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
1934   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1935     0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
1936   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1937     0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1938   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1939     0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1940   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1941     0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1942   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1943     0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
1944   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1945     0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
1946   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1947     0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
1948   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1949     0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"},
1950   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1951     0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1952   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1953     0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1954   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1955     0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1956   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1957     0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
1958   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1959     0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
1960   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1961     0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1962   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1963     0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1964   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1965     0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1966   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1967     0xf2a00950, 0xfea00fd0,
1968     "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
1969   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1970     0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1971   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1972     0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
1973   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1974     0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
1975   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1976     0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
1977   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1978     0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1979   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1980     0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1981   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1982     0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1983   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1984     0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
1985   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1986     0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
1987   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1988     0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
1989   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1990     0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
1991   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1992     0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
1993   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1994     0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
1995   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1996     0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1997   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
1998     0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
1999   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2000     0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
2001   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2002     0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
2003   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2004     0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
2005   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2006     0xf2a00e10, 0xfea00e90,
2007     "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
2008   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
2009     0xf2a00c10, 0xfea00e90,
2010     "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"},
2011 
2012   /* Three registers of different lengths.  */
2013   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
2014     0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2015   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2016     0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2017   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2018     0xf2800400, 0xff800f50,
2019     "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2020   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2021     0xf2800600, 0xff800f50,
2022     "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2023   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2024     0xf2800900, 0xff800f50,
2025     "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2026   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2027     0xf2800b00, 0xff800f50,
2028     "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2029   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2030     0xf2800d00, 0xff800f50,
2031     "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2032   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2033     0xf3800400, 0xff800f50,
2034     "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2035   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2036     0xf3800600, 0xff800f50,
2037     "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
2038   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2039     0xf2800000, 0xfe800f50,
2040     "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2041   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2042     0xf2800100, 0xfe800f50,
2043     "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
2044   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2045     0xf2800200, 0xfe800f50,
2046     "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2047   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2048     0xf2800300, 0xfe800f50,
2049     "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
2050   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2051     0xf2800500, 0xfe800f50,
2052     "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2053   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2054     0xf2800700, 0xfe800f50,
2055     "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2056   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2057     0xf2800800, 0xfe800f50,
2058     "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2059   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2060     0xf2800a00, 0xfe800f50,
2061     "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2062   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2063     0xf2800c00, 0xfe800f50,
2064     "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
2065 
2066   /* Two registers and a scalar.  */
2067   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2068     0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2069   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2070     0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
2071   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2072     0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
2073   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2074     0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2075   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2076     0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2077   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2078     0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2079   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2080     0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
2081   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2082     0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2083   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2084     0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2085   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2086     0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
2087   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2088     0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
2089   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2090     0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2091   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2092     0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2093   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2094     0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2095   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2096     0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2097   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2098     0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2099   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2100     0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2101   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2102     0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2103   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2104     0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2105   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2106     0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2107   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2108     0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2109   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2110     0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
2111   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
2112     0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
2113   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2114     0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2115   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2116     0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2117   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2118     0xf2800240, 0xfe800f50,
2119     "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2120   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2121     0xf2800640, 0xfe800f50,
2122     "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2123   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2124     0xf2800a40, 0xfe800f50,
2125     "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
2126   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2127     0xf2800e40, 0xff800f50,
2128    "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2129   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2130     0xf2800f40, 0xff800f50,
2131    "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
2132   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2133     0xf3800e40, 0xff800f50,
2134    "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
2135   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
2136     0xf3800f40, 0xff800f50,
2137    "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
2138   },
2139 
2140   /* Element and structure load/store.  */
2141   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2142     0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
2143   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2144     0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
2145   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2146     0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
2147   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2148     0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
2149   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2150     0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
2151   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2152     0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2153   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2154     0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2155   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2156     0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2157   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2158     0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
2159   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2160     0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2161   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2162     0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2163   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2164     0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2165   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2166     0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
2167   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2168     0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
2169   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2170     0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
2171   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2172     0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
2173   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2174     0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
2175   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2176     0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
2177   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
2178     0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
2179 
2180   {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
2181 };
2182 
2183 /* mve opcode table.  */
2184 
2185 /* print_insn_mve recognizes the following format control codes:
2186 
2187    %%			%
2188 
2189    %a			print '+' or '-' or imm offset in vldr[bhwd] and
2190 			vstr[bhwd]
2191    %c			print condition code
2192    %d			print addr mode of MVE vldr[bhw] and vstr[bhw]
2193    %u			print 'U' (unsigned) or 'S' for various mve instructions
2194    %i			print MVE predicate(s) for vpt and vpst
2195    %j			print a 5-bit immediate from hw2[14:12,7:6]
2196    %k			print 48 if the 7th position bit is set else print 64.
2197    %m			print rounding mode for vcvt and vrint
2198    %n			print vector comparison code for predicated instruction
2199    %s			print size for various vcvt instructions
2200    %v			print vector predicate for instruction in predicated
2201 			block
2202    %o			print offset scaled for vldr[hwd] and vstr[hwd]
2203    %w			print writeback mode for MVE v{st,ld}[24]
2204    %B			print v{st,ld}[24] any one operands
2205    %E			print vmov, vmvn, vorr, vbic encoded constant
2206    %N			print generic index for vmov
2207    %T			print bottom ('b') or top ('t') of source register
2208    %X			print exchange field in vmla* instructions
2209 
2210    %<bitfield>r		print as an ARM register
2211    %<bitfield>d		print the bitfield in decimal
2212    %<bitfield>A		print accumulate or not
2213    %<bitfield>c		print bitfield as a condition code
2214    %<bitfield>C		print bitfield as an inverted condition code
2215    %<bitfield>Q		print as a MVE Q register
2216    %<bitfield>F		print as a MVE S register
2217    %<bitfield>Z		as %<>r but r15 is ZR instead of PC and r13 is
2218 			UNPREDICTABLE
2219 
2220    %<bitfield>S		as %<>r but r15 or r13 is UNPREDICTABLE
2221    %<bitfield>s		print size for vector predicate & non VMOV instructions
2222    %<bitfield>I		print carry flag or not
2223    %<bitfield>i		print immediate for vstr/vldr reg +/- imm
2224    %<bitfield>h		print high half of 64-bit destination reg
2225    %<bitfield>k		print immediate for vector conversion instruction
2226    %<bitfield>l		print low half of 64-bit destination reg
2227    %<bitfield>o		print rotate value for vcmul
2228    %<bitfield>u		print immediate value for vddup/vdwdup
2229    %<bitfield>x		print the bitfield in hex.
2230   */
2231 
2232 static const struct mopcode32 mve_opcodes[] =
2233 {
2234   /* MVE.  */
2235 
2236   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2237    MVE_VPST,
2238    0xfe310f4d, 0xffbf1fff,
2239    "vpst%i"
2240   },
2241 
2242   /* Floating point VPT T1.  */
2243   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2244    MVE_VPT_FP_T1,
2245    0xee310f00, 0xefb10f50,
2246    "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
2247   /* Floating point VPT T2.  */
2248   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2249    MVE_VPT_FP_T2,
2250    0xee310f40, 0xefb10f50,
2251    "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
2252 
2253   /* Vector VPT T1.  */
2254   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2255    MVE_VPT_VEC_T1,
2256    0xfe010f00, 0xff811f51,
2257    "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2258   /* Vector VPT T2.  */
2259   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2260    MVE_VPT_VEC_T2,
2261    0xfe010f01, 0xff811f51,
2262    "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2263   /* Vector VPT T3.  */
2264   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2265    MVE_VPT_VEC_T3,
2266    0xfe011f00, 0xff811f50,
2267    "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2268   /* Vector VPT T4.  */
2269   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2270    MVE_VPT_VEC_T4,
2271    0xfe010f40, 0xff811f70,
2272    "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
2273   /* Vector VPT T5.  */
2274   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2275    MVE_VPT_VEC_T5,
2276    0xfe010f60, 0xff811f70,
2277    "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
2278   /* Vector VPT T6.  */
2279   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2280    MVE_VPT_VEC_T6,
2281    0xfe011f40, 0xff811f50,
2282    "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
2283 
2284   /* Vector VBIC immediate.  */
2285   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2286    MVE_VBIC_IMM,
2287    0xef800070, 0xefb81070,
2288    "vbic%v.i%8-11s\t%13-15,22Q, %E"},
2289 
2290   /* Vector VBIC register.  */
2291   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2292    MVE_VBIC_REG,
2293    0xef100150, 0xffb11f51,
2294    "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2295 
2296   /* Vector VABAV.  */
2297   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2298    MVE_VABAV,
2299    0xee800f01, 0xefc10f51,
2300    "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
2301 
2302   /* Vector VABD floating point.  */
2303   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2304    MVE_VABD_FP,
2305    0xff200d40, 0xffa11f51,
2306    "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2307 
2308   /* Vector VABD.  */
2309   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2310    MVE_VABD_VEC,
2311    0xef000740, 0xef811f51,
2312    "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2313 
2314   /* Vector VABS floating point.  */
2315   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2316    MVE_VABS_FP,
2317    0xFFB10740, 0xFFB31FD1,
2318    "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
2319   /* Vector VABS.  */
2320   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2321    MVE_VABS_VEC,
2322    0xffb10340, 0xffb31fd1,
2323    "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2324 
2325   /* Vector VADD floating point T1.  */
2326   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2327    MVE_VADD_FP_T1,
2328    0xef000d40, 0xffa11f51,
2329    "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2330   /* Vector VADD floating point T2.  */
2331   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2332    MVE_VADD_FP_T2,
2333    0xee300f40, 0xefb11f70,
2334    "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2335   /* Vector VADD T1.  */
2336   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2337    MVE_VADD_VEC_T1,
2338    0xef000840, 0xff811f51,
2339    "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2340   /* Vector VADD T2.  */
2341   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2342    MVE_VADD_VEC_T2,
2343    0xee010f40, 0xff811f70,
2344    "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2345 
2346   /* Vector VADDLV.  */
2347   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2348    MVE_VADDLV,
2349    0xee890f00, 0xef8f1fd1,
2350    "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
2351 
2352   /* Vector VADDV.  */
2353   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2354    MVE_VADDV,
2355    0xeef10f00, 0xeff31fd1,
2356    "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
2357 
2358   /* Vector VADC.  */
2359   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2360    MVE_VADC,
2361    0xee300f00, 0xffb10f51,
2362    "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2363 
2364   /* Vector VAND.  */
2365   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2366    MVE_VAND,
2367    0xef000150, 0xffb11f51,
2368    "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2369 
2370   /* Vector VBRSR register.  */
2371   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2372    MVE_VBRSR,
2373    0xfe011e60, 0xff811f70,
2374    "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2375 
2376   /* Vector VCADD floating point.  */
2377   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2378    MVE_VCADD_FP,
2379    0xfc800840, 0xfea11f51,
2380    "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"},
2381 
2382   /* Vector VCADD.  */
2383   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2384    MVE_VCADD_VEC,
2385    0xfe000f00, 0xff810f51,
2386    "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2387 
2388   /* Vector VCLS.  */
2389   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2390    MVE_VCLS,
2391    0xffb00440, 0xffb31fd1,
2392    "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2393 
2394   /* Vector VCLZ.  */
2395   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2396    MVE_VCLZ,
2397    0xffb004c0, 0xffb31fd1,
2398    "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2399 
2400   /* Vector VCMLA.  */
2401   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2402    MVE_VCMLA_FP,
2403    0xfc200840, 0xfe211f51,
2404    "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"},
2405 
2406   /* Vector VCMP floating point T1.  */
2407   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2408    MVE_VCMP_FP_T1,
2409    0xee310f00, 0xeff1ef50,
2410    "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
2411 
2412   /* Vector VCMP floating point T2.  */
2413   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2414    MVE_VCMP_FP_T2,
2415    0xee310f40, 0xeff1ef50,
2416    "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
2417 
2418   /* Vector VCMP T1.  */
2419   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2420    MVE_VCMP_VEC_T1,
2421    0xfe010f00, 0xffc1ff51,
2422    "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
2423   /* Vector VCMP T2.  */
2424   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2425    MVE_VCMP_VEC_T2,
2426    0xfe010f01, 0xffc1ff51,
2427    "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
2428   /* Vector VCMP T3.  */
2429   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2430    MVE_VCMP_VEC_T3,
2431    0xfe011f00, 0xffc1ff50,
2432    "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
2433   /* Vector VCMP T4.  */
2434   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2435    MVE_VCMP_VEC_T4,
2436    0xfe010f40, 0xffc1ff70,
2437    "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
2438   /* Vector VCMP T5.  */
2439   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2440    MVE_VCMP_VEC_T5,
2441    0xfe010f60, 0xffc1ff70,
2442    "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
2443   /* Vector VCMP T6.  */
2444   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2445    MVE_VCMP_VEC_T6,
2446    0xfe011f40, 0xffc1ff50,
2447    "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
2448 
2449   /* Vector VDUP.  */
2450   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2451    MVE_VDUP,
2452    0xeea00b10, 0xffb10f5f,
2453    "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2454 
2455   /* Vector VEOR.  */
2456   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2457    MVE_VEOR,
2458    0xff000150, 0xffd11f51,
2459    "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2460 
2461   /* Vector VFMA, vector * scalar.  */
2462   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2463    MVE_VFMA_FP_SCALAR,
2464    0xee310e40, 0xefb11f70,
2465    "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2466 
2467   /* Vector VFMA floating point.  */
2468   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2469    MVE_VFMA_FP,
2470    0xef000c50, 0xffa11f51,
2471    "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2472 
2473   /* Vector VFMS floating point.  */
2474   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2475    MVE_VFMS_FP,
2476    0xef200c50, 0xffa11f51,
2477    "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2478 
2479   /* Vector VFMAS, vector * scalar.  */
2480   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2481    MVE_VFMAS_FP_SCALAR,
2482    0xee311e40, 0xefb11f70,
2483    "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2484 
2485   /* Vector VHADD T1.  */
2486   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2487    MVE_VHADD_T1,
2488    0xef000040, 0xef811f51,
2489    "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2490 
2491   /* Vector VHADD T2.  */
2492   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2493    MVE_VHADD_T2,
2494    0xee000f40, 0xef811f70,
2495    "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2496 
2497   /* Vector VHSUB T1.  */
2498   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2499    MVE_VHSUB_T1,
2500    0xef000240, 0xef811f51,
2501    "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2502 
2503   /* Vector VHSUB T2.  */
2504   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2505    MVE_VHSUB_T2,
2506    0xee001f40, 0xef811f70,
2507    "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2508 
2509   /* Vector VCMUL.  */
2510   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2511    MVE_VCMUL_FP,
2512    0xee300e00, 0xefb10f50,
2513    "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"},
2514 
2515    /* Vector VCTP.  */
2516   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2517    MVE_VCTP,
2518    0xf000e801, 0xffc0ffff,
2519    "vctp%v.%20-21s\t%16-19r"},
2520 
2521   /* Vector VDUP.  */
2522   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2523    MVE_VDUP,
2524    0xeea00b10, 0xffb10f5f,
2525    "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
2526 
2527   /* Vector VRHADD.  */
2528   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2529    MVE_VRHADD,
2530    0xef000140, 0xef811f51,
2531    "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2532 
2533   /* Vector VCVT.  */
2534   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2535    MVE_VCVT_FP_FIX_VEC,
2536    0xef800c50, 0xef801cd1,
2537    "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"},
2538 
2539   /* Vector VCVT.  */
2540   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2541    MVE_VCVT_BETWEEN_FP_INT,
2542    0xffb30640, 0xffb31e51,
2543    "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
2544 
2545   /* Vector VCVT between single and half-precision float, bottom half.  */
2546   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2547    MVE_VCVT_FP_HALF_FP,
2548    0xee3f0e01, 0xefbf1fd1,
2549    "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
2550 
2551   /* Vector VCVT between single and half-precision float, top half.  */
2552   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2553    MVE_VCVT_FP_HALF_FP,
2554    0xee3f1e01, 0xefbf1fd1,
2555    "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
2556 
2557   /* Vector VCVT.  */
2558   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2559    MVE_VCVT_FROM_FP_TO_INT,
2560    0xffb30040, 0xffb31c51,
2561    "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
2562 
2563   /* Vector VDDUP.  */
2564   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2565    MVE_VDDUP,
2566    0xee011f6e, 0xff811f7e,
2567    "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2568 
2569   /* Vector VDWDUP.  */
2570   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2571    MVE_VDWDUP,
2572    0xee011f60, 0xff811f70,
2573    "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2574 
2575   /* Vector VHCADD.  */
2576   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2577    MVE_VHCADD,
2578    0xee000f00, 0xff810f51,
2579    "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"},
2580 
2581   /* Vector VIWDUP.  */
2582   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2583    MVE_VIWDUP,
2584    0xee010f60, 0xff811f70,
2585    "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"},
2586 
2587   /* Vector VIDUP.  */
2588   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2589    MVE_VIDUP,
2590    0xee010f6e, 0xff811f7e,
2591    "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"},
2592 
2593   /* Vector VLD2.  */
2594   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2595    MVE_VLD2,
2596    0xfc901e00, 0xff901e5f,
2597    "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
2598 
2599   /* Vector VLD4.  */
2600   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2601    MVE_VLD4,
2602    0xfc901e01, 0xff901e1f,
2603    "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
2604 
2605   /* Vector VLDRB gather load.  */
2606   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2607    MVE_VLDRB_GATHER_T1,
2608    0xec900e00, 0xefb01e50,
2609    "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
2610 
2611   /* Vector VLDRH gather load.  */
2612   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2613    MVE_VLDRH_GATHER_T2,
2614    0xec900e10, 0xefb01e50,
2615    "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2616 
2617   /* Vector VLDRW gather load.  */
2618   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2619    MVE_VLDRW_GATHER_T3,
2620    0xfc900f40, 0xffb01fd0,
2621    "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2622 
2623   /* Vector VLDRD gather load.  */
2624   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2625    MVE_VLDRD_GATHER_T4,
2626    0xec900fd0, 0xefb01fd0,
2627    "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
2628 
2629   /* Vector VLDRW gather load.  */
2630   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2631    MVE_VLDRW_GATHER_T5,
2632    0xfd101e00, 0xff111f00,
2633    "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2634 
2635   /* Vector VLDRD gather load, variant T6.  */
2636   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2637    MVE_VLDRD_GATHER_T6,
2638    0xfd101f00, 0xff111f00,
2639    "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
2640 
2641   /* Vector VLDRB.  */
2642   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2643    MVE_VLDRB_T1,
2644    0xec100e00, 0xee581e00,
2645    "vldrb%v.%u%7-8s\t%13-15Q, %d"},
2646 
2647   /* Vector VLDRH.  */
2648   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2649    MVE_VLDRH_T2,
2650    0xec180e00, 0xee581e00,
2651    "vldrh%v.%u%7-8s\t%13-15Q, %d"},
2652 
2653   /* Vector VLDRB unsigned, variant T5.  */
2654   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2655    MVE_VLDRB_T5,
2656    0xec101e00, 0xfe101f80,
2657    "vldrb%v.u8\t%13-15,22Q, %d"},
2658 
2659   /* Vector VLDRH unsigned, variant T6.  */
2660   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2661    MVE_VLDRH_T6,
2662    0xec101e80, 0xfe101f80,
2663    "vldrh%v.u16\t%13-15,22Q, %d"},
2664 
2665   /* Vector VLDRW unsigned, variant T7.  */
2666   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2667    MVE_VLDRW_T7,
2668    0xec101f00, 0xfe101f80,
2669    "vldrw%v.u32\t%13-15,22Q, %d"},
2670 
2671   /* Vector VMAX.  */
2672   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2673    MVE_VMAX,
2674    0xef000640, 0xef811f51,
2675    "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2676 
2677   /* Vector VMAXA.  */
2678   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2679    MVE_VMAXA,
2680    0xee330e81, 0xffb31fd1,
2681    "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2682 
2683   /* Vector VMAXNM floating point.  */
2684   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2685    MVE_VMAXNM_FP,
2686    0xff000f50, 0xffa11f51,
2687    "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2688 
2689   /* Vector VMAXNMA floating point.  */
2690   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2691    MVE_VMAXNMA_FP,
2692    0xee3f0e81, 0xefbf1fd1,
2693    "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2694 
2695   /* Vector VMAXNMV floating point.  */
2696   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2697    MVE_VMAXNMV_FP,
2698    0xeeee0f00, 0xefff0fd1,
2699    "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2700 
2701   /* Vector VMAXNMAV floating point.  */
2702   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2703    MVE_VMAXNMAV_FP,
2704    0xeeec0f00, 0xefff0fd1,
2705    "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2706 
2707   /* Vector VMAXV.  */
2708   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2709    MVE_VMAXV,
2710    0xeee20f00, 0xeff30fd1,
2711    "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2712 
2713   /* Vector VMAXAV.  */
2714   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2715    MVE_VMAXAV,
2716    0xeee00f00, 0xfff30fd1,
2717    "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2718 
2719   /* Vector VMIN.  */
2720   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2721    MVE_VMIN,
2722    0xef000650, 0xef811f51,
2723    "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2724 
2725   /* Vector VMINA.  */
2726   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2727    MVE_VMINA,
2728    0xee331e81, 0xffb31fd1,
2729    "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
2730 
2731   /* Vector VMINNM floating point.  */
2732   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2733    MVE_VMINNM_FP,
2734    0xff200f50, 0xffa11f51,
2735    "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
2736 
2737   /* Vector VMINNMA floating point.  */
2738   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2739    MVE_VMINNMA_FP,
2740    0xee3f1e81, 0xefbf1fd1,
2741    "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
2742 
2743   /* Vector VMINNMV floating point.  */
2744   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2745    MVE_VMINNMV_FP,
2746    0xeeee0f80, 0xefff0fd1,
2747    "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
2748 
2749   /* Vector VMINNMAV floating point.  */
2750   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2751    MVE_VMINNMAV_FP,
2752    0xeeec0f80, 0xefff0fd1,
2753    "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
2754 
2755   /* Vector VMINV.  */
2756   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2757    MVE_VMINV,
2758    0xeee20f80, 0xeff30fd1,
2759    "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
2760 
2761   /* Vector VMINAV.  */
2762   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2763    MVE_VMINAV,
2764    0xeee00f80, 0xfff30fd1,
2765    "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
2766 
2767   /* Vector VMLA.  */
2768   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2769    MVE_VMLA,
2770    0xee010e40, 0xef811f70,
2771    "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2772 
2773   /* Vector VMLALDAV.  Note must appear before VMLADAV due to instruction
2774      opcode aliasing.  */
2775   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2776    MVE_VMLALDAV,
2777    0xee801e00, 0xef801f51,
2778    "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2779 
2780   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2781    MVE_VMLALDAV,
2782    0xee800e00, 0xef801f51,
2783    "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2784 
2785   /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0.  */
2786   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2787    MVE_VMLADAV_T1,
2788    0xeef00e00, 0xeff01f51,
2789    "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2790 
2791   /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0.  */
2792   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2793    MVE_VMLADAV_T2,
2794    0xeef00f00, 0xeff11f51,
2795    "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2796 
2797   /* Vector VMLADAV T1 variant.  */
2798   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2799    MVE_VMLADAV_T1,
2800    0xeef01e00, 0xeff01f51,
2801    "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2802 
2803   /* Vector VMLADAV T2 variant.  */
2804   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2805    MVE_VMLADAV_T2,
2806    0xeef01f00, 0xeff11f51,
2807    "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
2808 
2809   /* Vector VMLAS.  */
2810   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2811    MVE_VMLAS,
2812    0xee011e40, 0xef811f70,
2813    "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
2814 
2815   /* Vector VRMLSLDAVH.  Note must appear before VMLSDAV due to instruction
2816      opcode aliasing.  */
2817   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2818    MVE_VRMLSLDAVH,
2819    0xfe800e01, 0xff810f51,
2820    "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2821 
2822   /* Vector VMLSLDAV.  Note must appear before VMLSDAV due to instruction
2823      opcdoe aliasing.  */
2824   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2825    MVE_VMLSLDAV,
2826    0xee800e01, 0xff800f51,
2827    "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
2828 
2829   /* Vector VMLSDAV T1 Variant.  */
2830   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2831    MVE_VMLSDAV_T1,
2832    0xeef00e01, 0xfff00f51,
2833    "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
2834 
2835   /* Vector VMLSDAV T2 Variant.  */
2836   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2837    MVE_VMLSDAV_T2,
2838    0xfef00e01, 0xfff10f51,
2839    "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
2840 
2841   /* Vector VMOV between gpr and half precision register, op == 0.  */
2842   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2843    MVE_VMOV_HFP_TO_GP,
2844    0xee000910, 0xfff00f7f,
2845    "vmov.f16\t%7,16-19F, %12-15r"},
2846 
2847   /* Vector VMOV between gpr and half precision register, op == 1.  */
2848   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2849    MVE_VMOV_HFP_TO_GP,
2850    0xee100910, 0xfff00f7f,
2851    "vmov.f16\t%12-15r, %7,16-19F"},
2852 
2853   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2854    MVE_VMOV_GP_TO_VEC_LANE,
2855    0xee000b10, 0xff900f1f,
2856    "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"},
2857 
2858   /* Vector VORR immediate to vector.
2859      NOTE: MVE_VORR_IMM must appear in the table
2860      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2861   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2862    MVE_VORR_IMM,
2863    0xef800050, 0xefb810f0,
2864    "vorr%v.i%8-11s\t%13-15,22Q, %E"},
2865 
2866   /* Vector VQSHL T2 Variant.
2867      NOTE: MVE_VQSHL_T2 must appear in the table before
2868      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2869   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2870    MVE_VQSHL_T2,
2871    0xef800750, 0xef801fd1,
2872    "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2873 
2874   /* Vector VQSHLU T3 Variant
2875      NOTE: MVE_VQSHL_T2 must appear in the table before
2876      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2877 
2878   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2879    MVE_VQSHLU_T3,
2880    0xff800650, 0xff801fd1,
2881    "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2882 
2883   /* Vector VRSHR
2884      NOTE: MVE_VRSHR must appear in the table before
2885      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2886   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2887    MVE_VRSHR,
2888    0xef800250, 0xef801fd1,
2889    "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2890 
2891   /* Vector VSHL.
2892      NOTE: MVE_VSHL must appear in the table before
2893      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2894   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2895    MVE_VSHL_T1,
2896    0xef800550, 0xff801fd1,
2897    "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2898 
2899   /* Vector VSHR
2900      NOTE: MVE_VSHR must appear in the table before
2901      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2902   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2903    MVE_VSHR,
2904    0xef800050, 0xef801fd1,
2905    "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2906 
2907   /* Vector VSLI
2908      NOTE: MVE_VSLI must appear in the table before
2909      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2910   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2911    MVE_VSLI,
2912    0xff800550, 0xff801fd1,
2913    "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2914 
2915   /* Vector VSRI
2916      NOTE: MVE_VSRI must appear in the table before
2917      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
2918   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2919    MVE_VSRI,
2920    0xff800450, 0xff801fd1,
2921    "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2922 
2923   /* Vector VMOV immediate to vector,
2924      undefinded for cmode == 1111 */
2925   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2926    MVE_VMVN_IMM, 0xef800f70, 0xefb81ff0, UNDEFINED_INSTRUCTION},
2927 
2928   /* Vector VMOV immediate to vector,
2929      cmode == 1101 */
2930   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2931    MVE_VMOV_IMM_TO_VEC, 0xef800d50, 0xefb81fd0,
2932    "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2933 
2934   /* Vector VMOV immediate to vector.  */
2935   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2936    MVE_VMOV_IMM_TO_VEC,
2937    0xef800050, 0xefb810d0,
2938    "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
2939 
2940   /* Vector VMOV two 32-bit lanes to two gprs, idx = 0.  */
2941   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2942    MVE_VMOV2_VEC_LANE_TO_GP,
2943    0xec000f00, 0xffb01ff0,
2944    "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"},
2945 
2946   /* Vector VMOV two 32-bit lanes to two gprs, idx = 1.  */
2947   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2948    MVE_VMOV2_VEC_LANE_TO_GP,
2949    0xec000f10, 0xffb01ff0,
2950    "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"},
2951 
2952   /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0.  */
2953   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2954    MVE_VMOV2_GP_TO_VEC_LANE,
2955    0xec100f00, 0xffb01ff0,
2956    "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2957 
2958   /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1.  */
2959   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2960    MVE_VMOV2_GP_TO_VEC_LANE,
2961    0xec100f10, 0xffb01ff0,
2962    "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
2963 
2964   /* Vector VMOV Vector lane to gpr.  */
2965   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2966    MVE_VMOV_VEC_LANE_TO_GP,
2967    0xee100b10, 0xff100f1f,
2968    "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
2969 
2970   /* Vector VSHLL T1 Variant.  Note: VSHLL T1 must appear before MVE_VMOVL due
2971      to instruction opcode aliasing.  */
2972   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2973    MVE_VSHLL_T1,
2974    0xeea00f40, 0xefa00fd1,
2975    "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
2976 
2977   /* Vector VMOVL long.  */
2978   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2979    MVE_VMOVL,
2980    0xeea00f40, 0xefa70fd1,
2981    "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
2982 
2983   /* Vector VMOV and narrow.  */
2984   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
2985    MVE_VMOVN,
2986    0xfe310e81, 0xffb30fd1,
2987    "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
2988 
2989   /* Floating point move extract.  */
2990   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2991    MVE_VMOVX,
2992    0xfeb00a40, 0xffbf0fd0,
2993    "vmovx.f16\t%22,12-15F, %5,0-3F"},
2994 
2995   /* Vector VMUL floating-point T1 variant.  */
2996   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
2997    MVE_VMUL_FP_T1,
2998    0xff000d50, 0xffa11f51,
2999    "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3000 
3001   /* Vector VMUL floating-point T2 variant.  */
3002   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3003    MVE_VMUL_FP_T2,
3004    0xee310e60, 0xefb11f70,
3005    "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3006 
3007   /* Vector VMUL T1 variant.  */
3008   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3009    MVE_VMUL_VEC_T1,
3010    0xef000950, 0xff811f51,
3011    "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3012 
3013   /* Vector VMUL T2 variant.  */
3014   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3015    MVE_VMUL_VEC_T2,
3016    0xee011e60, 0xff811f70,
3017    "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3018 
3019   /* Vector VMULH.  */
3020   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3021    MVE_VMULH,
3022    0xee010e01, 0xef811f51,
3023    "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3024 
3025   /* Vector VRMULH.  */
3026   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3027    MVE_VRMULH,
3028    0xee011e01, 0xef811f51,
3029    "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3030 
3031   /* Vector VMULL integer.  */
3032   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3033    MVE_VMULL_INT,
3034    0xee010e00, 0xef810f51,
3035    "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3036 
3037   /* Vector VMULL polynomial.  */
3038   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3039    MVE_VMULL_POLY,
3040    0xee310e00, 0xefb10f51,
3041    "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3042 
3043   /* Vector VMVN immediate to vector.  */
3044   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3045    MVE_VMVN_IMM,
3046    0xef800070, 0xefb810f0,
3047    "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
3048 
3049   /* Vector VMVN register.  */
3050   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3051    MVE_VMVN_REG,
3052    0xffb005c0, 0xffbf1fd1,
3053    "vmvn%v\t%13-15,22Q, %1-3,5Q"},
3054 
3055   /* Vector VNEG floating point.  */
3056   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3057    MVE_VNEG_FP,
3058    0xffb107c0, 0xffb31fd1,
3059    "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3060 
3061   /* Vector VNEG.  */
3062   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3063    MVE_VNEG_VEC,
3064    0xffb103c0, 0xffb31fd1,
3065    "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3066 
3067   /* Vector VORN, vector bitwise or not.  */
3068   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3069    MVE_VORN,
3070    0xef300150, 0xffb11f51,
3071    "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3072 
3073   /* Vector VORR register.  */
3074   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3075    MVE_VORR_REG,
3076    0xef200150, 0xffb11f51,
3077    "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3078 
3079   /* Vector VMOV, vector to vector move. While decoding MVE_VORR_REG if
3080      "Qm==Qn", VORR should replaced by its alias VMOV. For that to happen
3081      MVE_VMOV_VEC_TO_VEC need to placed after MVE_VORR_REG in this mve_opcodes
3082      array.  */
3083 
3084   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3085    MVE_VMOV_VEC_TO_VEC,
3086    0xef200150, 0xffb11f51,
3087    "vmov%v\t%13-15,22Q, %17-19,7Q"},
3088 
3089   /* Vector VQDMULL T1 variant.  */
3090   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3091    MVE_VQDMULL_T1,
3092    0xee300f01, 0xefb10f51,
3093    "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3094 
3095   /* Vector VPNOT.  */
3096   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3097    MVE_VPNOT,
3098    0xfe310f4d, 0xffffffff,
3099    "vpnot%v"},
3100 
3101   /* Vector VPSEL.  */
3102   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3103    MVE_VPSEL,
3104    0xfe310f01, 0xffb11f51,
3105    "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3106 
3107   /* Vector VQABS.  */
3108   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3109    MVE_VQABS,
3110    0xffb00740, 0xffb31fd1,
3111    "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3112 
3113   /* Vector VQADD T1 variant.  */
3114   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3115    MVE_VQADD_T1,
3116    0xef000050, 0xef811f51,
3117    "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3118 
3119   /* Vector VQADD T2 variant.  */
3120   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3121    MVE_VQADD_T2,
3122    0xee000f60, 0xef811f70,
3123    "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3124 
3125   /* Vector VQDMULL T2 variant.  */
3126   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3127    MVE_VQDMULL_T2,
3128    0xee300f60, 0xefb10f70,
3129    "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3130 
3131   /* Vector VQMOVN.  */
3132   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3133    MVE_VQMOVN,
3134    0xee330e01, 0xefb30fd1,
3135    "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
3136 
3137   /* Vector VQMOVUN.  */
3138   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3139    MVE_VQMOVUN,
3140    0xee310e81, 0xffb30fd1,
3141    "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3142 
3143   /* Vector VQDMLADH.  */
3144   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3145    MVE_VQDMLADH,
3146    0xee000e00, 0xff810f51,
3147    "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3148 
3149   /* Vector VQRDMLADH.  */
3150   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3151    MVE_VQRDMLADH,
3152    0xee000e01, 0xff810f51,
3153    "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3154 
3155   /* Vector VQDMLAH.  */
3156   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3157    MVE_VQDMLAH,
3158    0xee000e60, 0xff811f70,
3159    "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3160 
3161   /* Vector VQRDMLAH.  */
3162   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3163    MVE_VQRDMLAH,
3164    0xee000e40, 0xff811f70,
3165    "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3166 
3167   /* Vector VQDMLASH.  */
3168   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3169    MVE_VQDMLASH,
3170    0xee001e60, 0xff811f70,
3171    "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3172 
3173   /* Vector VQRDMLASH.  */
3174   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3175    MVE_VQRDMLASH,
3176    0xee001e40, 0xff811f70,
3177    "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3178 
3179   /* Vector VQDMLSDH.  */
3180   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3181    MVE_VQDMLSDH,
3182    0xfe000e00, 0xff810f51,
3183    "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3184 
3185   /* Vector VQRDMLSDH.  */
3186   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3187    MVE_VQRDMLSDH,
3188    0xfe000e01, 0xff810f51,
3189    "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3190 
3191   /* Vector VQDMULH T1 variant.  */
3192   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3193    MVE_VQDMULH_T1,
3194    0xef000b40, 0xff811f51,
3195    "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3196 
3197   /* Vector VQRDMULH T2 variant.  */
3198   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3199    MVE_VQRDMULH_T2,
3200    0xff000b40, 0xff811f51,
3201    "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3202 
3203   /* Vector VQDMULH T3 variant.  */
3204   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3205    MVE_VQDMULH_T3,
3206    0xee010e60, 0xff811f70,
3207    "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3208 
3209   /* Vector VQRDMULH T4 variant.  */
3210   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3211    MVE_VQRDMULH_T4,
3212    0xfe010e60, 0xff811f70,
3213    "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3214 
3215   /* Vector VQNEG.  */
3216   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3217    MVE_VQNEG,
3218    0xffb007c0, 0xffb31fd1,
3219    "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
3220 
3221   /* Vector VQRSHL T1 variant.  */
3222   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3223    MVE_VQRSHL_T1,
3224    0xef000550, 0xef811f51,
3225    "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3226 
3227   /* Vector VQRSHL T2 variant.  */
3228   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3229    MVE_VQRSHL_T2,
3230    0xee331ee0, 0xefb31ff0,
3231    "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3232 
3233   /* Vector VQRSHRN.  */
3234   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3235    MVE_VQRSHRN,
3236    0xee800f41, 0xefa00fd1,
3237    "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3238 
3239   /* Vector VQRSHRUN.  */
3240   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3241    MVE_VQRSHRUN,
3242    0xfe800fc0, 0xffa00fd1,
3243    "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3244 
3245   /* Vector VQSHL T1 Variant.  */
3246   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3247    MVE_VQSHL_T1,
3248    0xee311ee0, 0xefb31ff0,
3249    "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3250 
3251   /* Vector VQSHL T4 Variant.  */
3252   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3253    MVE_VQSHL_T4,
3254    0xef000450, 0xef811f51,
3255    "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3256 
3257   /* Vector VQSHRN.  */
3258   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3259    MVE_VQSHRN,
3260    0xee800f40, 0xefa00fd1,
3261    "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3262 
3263   /* Vector VQSHRUN.  */
3264   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3265    MVE_VQSHRUN,
3266    0xee800fc0, 0xffa00fd1,
3267    "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3268 
3269   /* Vector VQSUB T1 Variant.  */
3270   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3271    MVE_VQSUB_T1,
3272    0xef000250, 0xef811f51,
3273    "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3274 
3275   /* Vector VQSUB T2 Variant.  */
3276   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3277    MVE_VQSUB_T2,
3278    0xee001f60, 0xef811f70,
3279    "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3280 
3281   /* Vector VREV16.  */
3282   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3283    MVE_VREV16,
3284    0xffb00140, 0xffb31fd1,
3285    "vrev16%v.8\t%13-15,22Q, %1-3,5Q"},
3286 
3287   /* Vector VREV32.  */
3288   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3289    MVE_VREV32,
3290    0xffb000c0, 0xffb31fd1,
3291    "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3292 
3293   /* Vector VREV64.  */
3294   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3295    MVE_VREV64,
3296    0xffb00040, 0xffb31fd1,
3297    "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
3298 
3299   /* Vector VRINT floating point.  */
3300   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3301    MVE_VRINT_FP,
3302    0xffb20440, 0xffb31c51,
3303    "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
3304 
3305   /* Vector VRMLALDAVH.  */
3306   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3307    MVE_VRMLALDAVH,
3308    0xee800f00, 0xef811f51,
3309    "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3310 
3311   /* Vector VRMLALDAVH.  */
3312   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3313    MVE_VRMLALDAVH,
3314    0xee801f00, 0xef811f51,
3315    "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
3316 
3317   /* Vector VRSHL T1 Variant.  */
3318   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3319    MVE_VRSHL_T1,
3320    0xef000540, 0xef811f51,
3321    "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3322 
3323   /* Vector VRSHL T2 Variant.  */
3324   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3325    MVE_VRSHL_T2,
3326    0xee331e60, 0xefb31ff0,
3327    "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3328 
3329   /* Vector VRSHRN.  */
3330   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3331    MVE_VRSHRN,
3332    0xfe800fc1, 0xffa00fd1,
3333    "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3334 
3335   /* Vector VSBC.  */
3336   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3337    MVE_VSBC,
3338    0xfe300f00, 0xffb10f51,
3339    "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3340 
3341   /* Vector VSHL T2 Variant.  */
3342   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3343    MVE_VSHL_T2,
3344    0xee311e60, 0xefb31ff0,
3345    "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
3346 
3347   /* Vector VSHL T3 Variant.  */
3348   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3349    MVE_VSHL_T3,
3350    0xef000440, 0xef811f51,
3351    "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
3352 
3353   /* Vector VSHLC.  */
3354   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3355    MVE_VSHLC,
3356    0xeea00fc0, 0xffa01ff0,
3357    "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"},
3358 
3359   /* Vector VSHLL T2 Variant.  */
3360   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3361    MVE_VSHLL_T2,
3362    0xee310e01, 0xefb30fd1,
3363    "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"},
3364 
3365   /* Vector VSHRN.  */
3366   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3367    MVE_VSHRN,
3368    0xee800fc1, 0xffa00fd1,
3369    "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"},
3370 
3371   /* Vector VST2 no writeback.  */
3372   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3373    MVE_VST2,
3374    0xfc801e00, 0xffb01e5f,
3375    "vst2%5d.%7-8s\t%B, [%16-19r]"},
3376 
3377   /* Vector VST2 writeback.  */
3378   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3379    MVE_VST2,
3380    0xfca01e00, 0xffb01e5f,
3381    "vst2%5d.%7-8s\t%B, [%16-19r]!"},
3382 
3383   /* Vector VST4 no writeback.  */
3384   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3385    MVE_VST4,
3386    0xfc801e01, 0xffb01e1f,
3387    "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
3388 
3389   /* Vector VST4 writeback.  */
3390   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3391    MVE_VST4,
3392    0xfca01e01, 0xffb01e1f,
3393    "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
3394 
3395   /* Vector VSTRB scatter store, T1 variant.  */
3396   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3397    MVE_VSTRB_SCATTER_T1,
3398    0xec800e00, 0xffb01e50,
3399    "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
3400 
3401   /* Vector VSTRH scatter store, T2 variant.  */
3402   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3403    MVE_VSTRH_SCATTER_T2,
3404    0xec800e10, 0xffb01e50,
3405    "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3406 
3407   /* Vector VSTRW scatter store, T3 variant.  */
3408   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3409    MVE_VSTRW_SCATTER_T3,
3410    0xec800e40, 0xffb01e50,
3411    "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3412 
3413   /* Vector VSTRD scatter store, T4 variant.  */
3414   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3415    MVE_VSTRD_SCATTER_T4,
3416    0xec800fd0, 0xffb01fd0,
3417    "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
3418 
3419   /* Vector VSTRW scatter store, T5 variant.  */
3420   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3421    MVE_VSTRW_SCATTER_T5,
3422    0xfd001e00, 0xff111f00,
3423    "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3424 
3425   /* Vector VSTRD scatter store, T6 variant.  */
3426   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3427    MVE_VSTRD_SCATTER_T6,
3428    0xfd001f00, 0xff111f00,
3429    "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"},
3430 
3431   /* Vector VSTRB.  */
3432   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3433    MVE_VSTRB_T1,
3434    0xec000e00, 0xfe581e00,
3435    "vstrb%v.%7-8s\t%13-15Q, %d"},
3436 
3437   /* Vector VSTRH.  */
3438   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3439    MVE_VSTRH_T2,
3440    0xec080e00, 0xfe581e00,
3441    "vstrh%v.%7-8s\t%13-15Q, %d"},
3442 
3443   /* Vector VSTRB variant T5.  */
3444   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3445    MVE_VSTRB_T5,
3446    0xec001e00, 0xfe101f80,
3447    "vstrb%v.8\t%13-15,22Q, %d"},
3448 
3449   /* Vector VSTRH variant T6.  */
3450   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3451    MVE_VSTRH_T6,
3452    0xec001e80, 0xfe101f80,
3453    "vstrh%v.16\t%13-15,22Q, %d"},
3454 
3455   /* Vector VSTRW variant T7.  */
3456   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3457    MVE_VSTRW_T7,
3458    0xec001f00, 0xfe101f80,
3459    "vstrw%v.32\t%13-15,22Q, %d"},
3460 
3461   /* Vector VSUB floating point T1 variant.  */
3462   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3463    MVE_VSUB_FP_T1,
3464    0xef200d40, 0xffa11f51,
3465    "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3466 
3467   /* Vector VSUB floating point T2 variant.  */
3468   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
3469    MVE_VSUB_FP_T2,
3470    0xee301f40, 0xefb11f70,
3471    "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3472 
3473   /* Vector VSUB T1 variant.  */
3474   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3475    MVE_VSUB_VEC_T1,
3476    0xff000840, 0xff811f51,
3477    "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
3478 
3479   /* Vector VSUB T2 variant.  */
3480   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3481    MVE_VSUB_VEC_T2,
3482    0xee011f40, 0xff811f70,
3483    "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
3484 
3485   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3486    MVE_ASRLI,
3487    0xea50012f, 0xfff1813f,
3488    "asrl%c\t%17-19l, %9-11h, %j"},
3489 
3490   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3491    MVE_ASRL,
3492    0xea50012d, 0xfff101ff,
3493    "asrl%c\t%17-19l, %9-11h, %12-15S"},
3494 
3495   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3496    MVE_LSLLI,
3497    0xea50010f, 0xfff1813f,
3498    "lsll%c\t%17-19l, %9-11h, %j"},
3499 
3500   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3501    MVE_LSLL,
3502    0xea50010d, 0xfff101ff,
3503    "lsll%c\t%17-19l, %9-11h, %12-15S"},
3504 
3505   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3506    MVE_LSRL,
3507    0xea50011f, 0xfff1813f,
3508    "lsrl%c\t%17-19l, %9-11h, %j"},
3509 
3510   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3511    MVE_SQRSHRL,
3512    0xea51012d, 0xfff1017f,
3513    "sqrshrl%c\t%17-19l, %9-11h, %k, %12-15S"},
3514 
3515   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3516    MVE_SQRSHR,
3517    0xea500f2d, 0xfff00fff,
3518    "sqrshr%c\t%16-19S, %12-15S"},
3519 
3520   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3521    MVE_SQSHLL,
3522    0xea51013f, 0xfff1813f,
3523    "sqshll%c\t%17-19l, %9-11h, %j"},
3524 
3525   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3526    MVE_SQSHL,
3527    0xea500f3f, 0xfff08f3f,
3528    "sqshl%c\t%16-19S, %j"},
3529 
3530   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3531    MVE_SRSHRL,
3532    0xea51012f, 0xfff1813f,
3533    "srshrl%c\t%17-19l, %9-11h, %j"},
3534 
3535   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3536    MVE_SRSHR,
3537    0xea500f2f, 0xfff08f3f,
3538    "srshr%c\t%16-19S, %j"},
3539 
3540   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3541    MVE_UQRSHLL,
3542    0xea51010d, 0xfff1017f,
3543    "uqrshll%c\t%17-19l, %9-11h, %k, %12-15S"},
3544 
3545   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3546    MVE_UQRSHL,
3547    0xea500f0d, 0xfff00fff,
3548    "uqrshl%c\t%16-19S, %12-15S"},
3549 
3550   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3551    MVE_UQSHLL,
3552     0xea51010f, 0xfff1813f,
3553    "uqshll%c\t%17-19l, %9-11h, %j"},
3554 
3555   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3556    MVE_UQSHL,
3557    0xea500f0f, 0xfff08f3f,
3558    "uqshl%c\t%16-19S, %j"},
3559 
3560   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3561    MVE_URSHRL,
3562     0xea51011f, 0xfff1813f,
3563    "urshrl%c\t%17-19l, %9-11h, %j"},
3564 
3565   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
3566    MVE_URSHR,
3567    0xea500f1f, 0xfff08f3f,
3568    "urshr%c\t%16-19S, %j"},
3569 
3570   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3571    MVE_CSINC,
3572    0xea509000, 0xfff0f000,
3573    "csinc\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3574 
3575   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3576    MVE_CSINV,
3577    0xea50a000, 0xfff0f000,
3578    "csinv\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3579 
3580   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3581    MVE_CSET,
3582    0xea5f900f, 0xfffff00f,
3583    "cset\t%8-11S, %4-7C"},
3584 
3585   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3586    MVE_CSETM,
3587    0xea5fa00f, 0xfffff00f,
3588    "csetm\t%8-11S, %4-7C"},
3589 
3590   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3591    MVE_CSEL,
3592    0xea508000, 0xfff0f000,
3593    "csel\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3594 
3595   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3596    MVE_CSNEG,
3597    0xea50b000, 0xfff0f000,
3598    "csneg\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
3599 
3600   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3601    MVE_CINC,
3602    0xea509000, 0xfff0f000,
3603    "cinc\t%8-11S, %16-19Z, %4-7C"},
3604 
3605   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3606    MVE_CINV,
3607    0xea50a000, 0xfff0f000,
3608    "cinv\t%8-11S, %16-19Z, %4-7C"},
3609 
3610   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
3611    MVE_CNEG,
3612    0xea50b000, 0xfff0f000,
3613    "cneg\t%8-11S, %16-19Z, %4-7C"},
3614 
3615   {ARM_FEATURE_CORE_LOW (0),
3616    MVE_NONE,
3617    0x00000000, 0x00000000, 0}
3618 };
3619 
3620 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb.  All three are partially
3621    ordered: they must be searched linearly from the top to obtain a correct
3622    match.  */
3623 
3624 /* print_insn_arm recognizes the following format control codes:
3625 
3626    %%			%
3627 
3628    %a			print address for ldr/str instruction
3629    %s                   print address for ldr/str halfword/signextend instruction
3630    %S                   like %s but allow UNPREDICTABLE addressing
3631    %b			print branch destination
3632    %c			print condition code (always bits 28-31)
3633    %m			print register mask for ldm/stm instruction
3634    %o			print operand2 (immediate or register + shift)
3635    %p			print 'p' iff bits 12-15 are 15
3636    %t			print 't' iff bit 21 set and bit 24 clear
3637    %B			print arm BLX(1) destination
3638    %C			print the PSR sub type.
3639    %U			print barrier type.
3640    %P			print address for pli instruction.
3641 
3642    %<bitfield>r		print as an ARM register
3643    %<bitfield>T		print as an ARM register + 1
3644    %<bitfield>R		as %r but r15 is UNPREDICTABLE
3645    %<bitfield>{r|R}u    as %{r|R} but if matches the other %u field then is UNPREDICTABLE
3646    %<bitfield>{r|R}U    as %{r|R} but if matches the other %U field then is UNPREDICTABLE
3647    %<bitfield>d		print the bitfield in decimal
3648    %<bitfield>W         print the bitfield plus one in decimal
3649    %<bitfield>x		print the bitfield in hex
3650    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
3651 
3652    %<bitfield>'c	print specified char iff bitfield is all ones
3653    %<bitfield>`c	print specified char iff bitfield is all zeroes
3654    %<bitfield>?ab...    select from array of values in big endian order
3655 
3656    %e                   print arm SMI operand (bits 0..7,8..19).
3657    %E			print the LSB and WIDTH fields of a BFI or BFC instruction.
3658    %V                   print the 16-bit immediate field of a MOVT or MOVW instruction.
3659    %R			print the SPSR/CPSR or banked register of an MRS.  */
3660 
3661 static const struct opcode32 arm_opcodes[] =
3662 {
3663   /* ARM instructions.  */
3664   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3665     0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
3666   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3667     0xe7f000f0, 0xfff000f0, "udf\t#%e"},
3668 
3669   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5),
3670     0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
3671   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
3672     0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
3673   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
3674     0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3675   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S),
3676     0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
3677   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
3678     0x00800090, 0x0fa000f0,
3679     "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3680   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
3681     0x00a00090, 0x0fa000f0,
3682     "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
3683 
3684   /* V8.2 RAS extension instructions.  */
3685   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
3686     0xe320f010, 0xffffffff, "esb"},
3687 
3688   /* V8-R instructions.  */
3689   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
3690     0xf57ff04c, 0xffffffff, "dfb"},
3691 
3692   /* V8 instructions.  */
3693   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3694     0x0320f005, 0x0fffffff, "sevl"},
3695   /* Defined in V8 but is in NOP space so available to all arch.  */
3696   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
3697     0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"},
3698   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS),
3699     0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
3700   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3701     0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
3702   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3703     0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
3704   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
3705     0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
3706   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3707     0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
3708   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3709     0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
3710   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3711     0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
3712   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3713     0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
3714   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3715     0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
3716   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3717     0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
3718   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3719     0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
3720   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3721     0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
3722   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3723     0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
3724   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
3725     0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
3726   /* CRC32 instructions.  */
3727   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3728     0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
3729   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3730     0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
3731   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3732     0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
3733   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3734     0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
3735   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3736     0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
3737   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
3738     0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
3739 
3740   /* Privileged Access Never extension instructions.  */
3741   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
3742     0xf1100000, 0xfffffdff, "setpan\t#%9-9d"},
3743 
3744   /* Virtualization Extension instructions.  */
3745   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"},
3746   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
3747 
3748   /* Integer Divide Extension instructions.  */
3749   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
3750     0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
3751   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
3752     0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
3753 
3754   /* MP Extension instructions.  */
3755   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"},
3756 
3757   /* Speculation Barriers.  */
3758   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xe320f014, 0xffffffff, "csdb"},
3759   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff040, 0xffffffff, "ssbb"},
3760   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff044, 0xffffffff, "pssbb"},
3761 
3762   /* V7 instructions.  */
3763   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"},
3764   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
3765   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
3766   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
3767   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
3768   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
3769   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"},
3770    {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
3771     0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"},
3772 
3773   /* ARM V6T2 instructions.  */
3774   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3775     0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
3776   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3777     0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
3778   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3779     0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
3780   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3781     0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
3782 
3783   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3784     0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION },
3785   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3786     0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
3787 
3788   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
3789     0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
3790   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
3791     0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
3792   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3793     0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
3794   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
3795     0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
3796 
3797   /* ARM Security extension instructions.  */
3798   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
3799     0x01600070, 0x0ff000f0, "smc%c\t%e"},
3800 
3801   /* ARM V6K instructions.  */
3802   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3803     0xf57ff01f, 0xffffffff, "clrex"},
3804   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3805     0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
3806   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3807     0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
3808   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3809     0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
3810   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3811     0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
3812   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3813     0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
3814   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3815     0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
3816 
3817   /* ARMv8.5-A instructions.  */
3818   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf57ff070, 0xffffffff, "sb"},
3819 
3820   /* ARM V6K NOP hints.  */
3821   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3822     0x0320f001, 0x0fffffff, "yield%c"},
3823   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3824     0x0320f002, 0x0fffffff, "wfe%c"},
3825   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3826     0x0320f003, 0x0fffffff, "wfi%c"},
3827   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3828     0x0320f004, 0x0fffffff, "sev%c"},
3829   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
3830     0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
3831 
3832   /* ARM V6 instructions.  */
3833   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3834     0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
3835   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3836     0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
3837   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3838     0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
3839   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3840     0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
3841   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3842     0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
3843   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3844     0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
3845   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3846     0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
3847   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3848     0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
3849   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3850     0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
3851   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3852     0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
3853   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3854     0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
3855   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3856     0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
3857   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3858     0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
3859   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3860     0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
3861   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3862     0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
3863   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3864     0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
3865   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3866     0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
3867   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3868     0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
3869   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3870     0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
3871   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3872     0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
3873   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3874     0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
3875   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3876     0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
3877   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3878     0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
3879   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3880     0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
3881   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3882     0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
3883   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3884     0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
3885   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3886     0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
3887   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3888     0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
3889   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3890     0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
3891   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3892     0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
3893   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3894     0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
3895   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3896     0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
3897   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3898     0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
3899   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3900     0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
3901   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3902     0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
3903   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3904     0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
3905   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3906     0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
3907   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3908     0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
3909   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3910     0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
3911   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3912     0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
3913   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3914     0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
3915   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3916     0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
3917   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3918     0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
3919   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3920     0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
3921   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3922     0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
3923   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3924     0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
3925   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3926     0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
3927   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3928     0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
3929   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3930     0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
3931   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3932     0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
3933   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3934     0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
3935   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3936     0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
3937   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3938     0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
3939   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3940     0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
3941   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3942     0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
3943   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3944     0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
3945   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3946     0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
3947   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3948     0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
3949   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3950     0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
3951   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3952     0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
3953   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3954     0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
3955   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3956     0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
3957   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3958     0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
3959   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3960     0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
3961   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3962     0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
3963   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3964     0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
3965   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3966     0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
3967   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3968     0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
3969   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3970     0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
3971   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3972     0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
3973   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3974     0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
3975   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3976     0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
3977   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3978     0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
3979   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3980     0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
3981   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3982     0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
3983   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3984     0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3985   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3986     0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3987   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3988     0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3989   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3990     0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
3991   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3992     0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
3993   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3994     0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
3995   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3996     0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
3997   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
3998     0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
3999   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4000     0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4001   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4002     0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4003   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4004     0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4005   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4006     0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
4007   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4008     0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4009   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4010     0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4011   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4012     0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4013   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4014     0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
4015   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4016     0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4017   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4018     0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4019   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4020     0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
4021   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4022     0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
4023   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4024     0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
4025   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4026     0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
4027   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4028     0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
4029   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4030     0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
4031   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4032     0xf1010000, 0xfffffc00, "setend\t%9?ble"},
4033   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4034     0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
4035   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4036     0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
4037   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4038     0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4039   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4040     0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4041   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4042     0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4043   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4044     0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4045   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4046     0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
4047   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4048     0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4049   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4050     0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4051   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4052     0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
4053   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4054     0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
4055   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4056     0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
4057   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4058     0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
4059   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4060     0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
4061   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4062     0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
4063   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4064     0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
4065   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4066     0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
4067   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4068     0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4069   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4070     0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
4071   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4072     0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
4073   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4074     0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
4075   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
4076     0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
4077 
4078   /* V5J instruction.  */
4079   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J),
4080     0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
4081 
4082   /* V5 Instructions.  */
4083   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4084     0xe1200070, 0xfff000f0,
4085     "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
4086   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4087     0xfa000000, 0xfe000000, "blx\t%B"},
4088   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4089     0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
4090   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
4091     0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
4092 
4093   /* V5E "El Segundo" Instructions.  */
4094   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4095     0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
4096   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4097     0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
4098   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
4099     0xf450f000, 0xfc70f000, "pld\t%a"},
4100   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4101     0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4102   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4103     0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4104   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4105     0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4106   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4107     0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
4108 
4109   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4110     0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
4111   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4112     0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
4113 
4114   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4115     0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4116   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4117     0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4118   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4119     0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4120   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4121     0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
4122 
4123   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4124     0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
4125   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4126     0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
4127   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4128     0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
4129   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4130     0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
4131 
4132   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4133     0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
4134   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4135     0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
4136 
4137   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4138     0x01000050, 0x0ff00ff0,  "qadd%c\t%12-15R, %0-3R, %16-19R"},
4139   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4140     0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
4141   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4142     0x01200050, 0x0ff00ff0,  "qsub%c\t%12-15R, %0-3R, %16-19R"},
4143   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
4144     0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
4145 
4146   /* ARM Instructions.  */
4147   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4148     0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
4149 
4150   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4151     0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
4152   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4153     0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
4154   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4155     0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
4156   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4157     0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
4158   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4159     0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
4160   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4161     0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
4162 
4163   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4164     0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
4165   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4166     0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
4167   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4168     0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
4169   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4170     0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
4171 
4172   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4173     0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION},
4174   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4175     0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
4176   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4177     0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION},
4178   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4179     0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
4180 
4181   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4182     0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
4183   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4184     0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
4185   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4186     0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
4187 
4188   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4189     0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
4190   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4191     0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
4192   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4193     0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
4194 
4195   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4196     0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
4197   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4198     0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
4199   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4200     0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
4201 
4202   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4203     0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4204   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4205     0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
4206   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4207     0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
4208 
4209   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4210     0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
4211   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4212     0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
4213   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4214     0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
4215 
4216   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4217     0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
4218   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4219     0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
4220   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4221     0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
4222 
4223   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4224     0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4225   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4226     0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
4227   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4228     0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
4229 
4230   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4231     0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4232   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4233     0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
4234   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4235     0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
4236 
4237   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
4238     0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
4239   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
4240     0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
4241   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
4242     0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
4243 
4244   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4245     0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
4246   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4247     0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
4248   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4249     0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
4250 
4251   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4252     0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"},
4253   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4254     0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"},
4255   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4256     0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"},
4257 
4258   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4259     0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
4260   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4261     0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
4262   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4263     0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
4264 
4265   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4266     0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
4267   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4268     0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
4269   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4270     0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
4271 
4272   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4273     0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
4274   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4275     0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
4276   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4277     0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
4278 
4279   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4280     0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
4281   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4282     0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
4283   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4284     0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
4285   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4286     0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
4287   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4288     0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
4289   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4290     0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
4291   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4292     0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
4293 
4294   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4295     0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
4296   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4297     0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
4298   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4299     0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
4300 
4301   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4302     0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
4303   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4304     0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
4305   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4306     0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
4307 
4308   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4309     0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION},
4310   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4311     0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
4312 
4313   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4314     0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
4315 
4316   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4317     0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
4318   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4319     0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
4320 
4321   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4322     0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4323   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4324     0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4325   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4326     0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4327   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4328     0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4329   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4330     0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4331   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4332     0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4333   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4334     0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4335   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4336     0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4337   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4338     0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4339   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4340     0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4341   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4342     0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4343   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4344     0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4345   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4346     0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4347   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4348     0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4349   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4350     0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4351   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4352     0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
4353   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4354     0x092d0000, 0x0fff0000, "push%c\t%m"},
4355   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4356     0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
4357   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4358     0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4359 
4360   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4361     0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4362   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4363     0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4364   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4365     0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4366   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4367     0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4368   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4369     0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4370   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4371     0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4372   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4373     0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4374   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4375     0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4376   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4377     0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4378   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4379     0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4380   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4381     0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4382   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4383     0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4384   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4385     0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4386   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4387     0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4388   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4389     0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4390   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4391     0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
4392   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4393     0x08bd0000, 0x0fff0000, "pop%c\t%m"},
4394   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4395     0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
4396   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4397     0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
4398 
4399   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4400     0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
4401   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4402     0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
4403 
4404   /* The rest.  */
4405   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
4406     0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION},
4407   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
4408     0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
4409   {ARM_FEATURE_CORE_LOW (0),
4410     0x00000000, 0x00000000, 0}
4411 };
4412 
4413 /* print_insn_thumb16 recognizes the following format control codes:
4414 
4415    %S                   print Thumb register (bits 3..5 as high number if bit 6 set)
4416    %D                   print Thumb register (bits 0..2 as high number if bit 7 set)
4417    %<bitfield>I         print bitfield as a signed decimal
4418    				(top bit of range being the sign bit)
4419    %N                   print Thumb register mask (with LR)
4420    %O                   print Thumb register mask (with PC)
4421    %M                   print Thumb register mask
4422    %b			print CZB's 6-bit unsigned branch destination
4423    %s			print Thumb right-shift immediate (6..10; 0 == 32).
4424    %c			print the condition code
4425    %C			print the condition code, or "s" if not conditional
4426    %x			print warning if conditional an not at end of IT block"
4427    %X			print "\t; unpredictable <IT:code>" if conditional
4428    %I			print IT instruction suffix and operands
4429    %W			print Thumb Writeback indicator for LDMIA
4430    %<bitfield>r		print bitfield as an ARM register
4431    %<bitfield>d		print bitfield as a decimal
4432    %<bitfield>H         print (bitfield * 2) as a decimal
4433    %<bitfield>W         print (bitfield * 4) as a decimal
4434    %<bitfield>a         print (bitfield * 4) as a pc-rel offset + decoded symbol
4435    %<bitfield>B         print Thumb branch destination (signed displacement)
4436    %<bitfield>c         print bitfield as a condition code
4437    %<bitnum>'c		print specified char iff bit is one
4438    %<bitnum>?ab		print a if bit is one else print b.  */
4439 
4440 static const struct opcode16 thumb_opcodes[] =
4441 {
4442   /* Thumb instructions.  */
4443 
4444   /* ARMv8-M Security Extensions instructions.  */
4445   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"},
4446   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff87, "bxns\t%3-6r"},
4447 
4448   /* ARM V8 instructions.  */
4449   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xbf50, 0xffff, "sevl%c"},
4450   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xba80, 0xffc0, "hlt\t%0-5x"},
4451   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),  0xb610, 0xfff7, "setpan\t#%3-3d"},
4452 
4453   /* ARM V6K no-argument instructions.  */
4454   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"},
4455   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"},
4456   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"},
4457   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"},
4458   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"},
4459   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
4460 
4461   /* ARM V6T2 instructions.  */
4462   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4463     0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
4464   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4465     0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
4466   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"},
4467 
4468   /* ARM V6.  */
4469   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
4470   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
4471   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
4472   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
4473   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
4474   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
4475   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%3?ble%X"},
4476   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
4477   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
4478   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
4479   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
4480 
4481   /* ARM V5 ISA extends Thumb.  */
4482   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
4483     0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional.  */
4484   /* This is BLX(2).  BLX(1) is a 32-bit instruction.  */
4485   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
4486     0x4780, 0xff87, "blx%c\t%3-6r%x"},	/* note: 4 bit register number.  */
4487   /* ARM V4T ISA (Thumb v1).  */
4488   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4489     0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
4490   /* Format 4.  */
4491   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
4492   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
4493   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
4494   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
4495   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
4496   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
4497   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
4498   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
4499   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
4500   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
4501   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
4502   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
4503   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
4504   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
4505   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
4506   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
4507   /* format 13 */
4508   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
4509   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
4510   /* format 5 */
4511   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"},
4512   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"},
4513   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
4514   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"},
4515   /* format 14 */
4516   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"},
4517   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"},
4518   /* format 2 */
4519   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4520     0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
4521   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4522     0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
4523   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4524     0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
4525   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4526     0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
4527   /* format 8 */
4528   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4529     0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
4530   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4531     0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
4532   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4533     0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
4534   /* format 7 */
4535   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4536     0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4537   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4538     0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
4539   /* format 1 */
4540   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
4541   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4542     0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
4543   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
4544   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
4545   /* format 3 */
4546   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
4547   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
4548   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
4549   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
4550   /* format 6 */
4551   /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
4552   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4553     0x4800, 0xF800,
4554     "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"},
4555   /* format 9 */
4556   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4557     0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
4558   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4559     0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
4560   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4561     0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
4562   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4563     0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
4564   /* format 10 */
4565   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4566     0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
4567   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4568     0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
4569   /* format 11 */
4570   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4571     0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
4572   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4573     0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
4574   /* format 12 */
4575   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4576     0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
4577   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
4578     0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
4579   /* format 15 */
4580   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
4581   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
4582   /* format 17 */
4583   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
4584   /* format 16 */
4585   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t#%0-7d"},
4586   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION},
4587   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
4588   /* format 18 */
4589   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
4590 
4591   /* The E800 .. FFFF range is unconditionally redirected to the
4592      32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
4593      are processed via that table.  Thus, we can never encounter a
4594      bare "second half of BL/BLX(1)" instruction here.  */
4595   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),  0x0000, 0x0000, UNDEFINED_INSTRUCTION},
4596   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
4597 };
4598 
4599 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
4600    We adopt the convention that hw1 is the high 16 bits of .value and
4601    .mask, hw2 the low 16 bits.
4602 
4603    print_insn_thumb32 recognizes the following format control codes:
4604 
4605        %%		%
4606 
4607        %I		print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
4608        %M		print a modified 12-bit immediate (same location)
4609        %J		print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
4610        %K		print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
4611        %H		print a 16-bit immediate from hw2[3:0],hw1[11:0]
4612        %S		print a possibly-shifted Rm
4613 
4614        %L		print address for a ldrd/strd instruction
4615        %a		print the address of a plain load/store
4616        %w		print the width and signedness of a core load/store
4617        %m		print register mask for ldm/stm
4618        %n		print register mask for clrm
4619 
4620        %E		print the lsb and width fields of a bfc/bfi instruction
4621        %F		print the lsb and width fields of a sbfx/ubfx instruction
4622        %G		print a fallback offset for Branch Future instructions
4623        %W		print an offset for BF instruction
4624        %Y		print an offset for BFL instruction
4625        %Z		print an offset for BFCSEL instruction
4626        %Q		print an offset for Low Overhead Loop instructions
4627        %P		print an offset for Low Overhead Loop end instructions
4628        %b		print a conditional branch offset
4629        %B		print an unconditional branch offset
4630        %s		print the shift field of an SSAT instruction
4631        %R		print the rotation field of an SXT instruction
4632        %U		print barrier type.
4633        %P		print address for pli instruction.
4634        %c		print the condition code
4635        %x		print warning if conditional an not at end of IT block"
4636        %X		print "\t; unpredictable <IT:code>" if conditional
4637 
4638        %<bitfield>d	print bitfield in decimal
4639        %<bitfield>D     print bitfield plus one in decimal
4640        %<bitfield>W	print bitfield*4 in decimal
4641        %<bitfield>r	print bitfield as an ARM register
4642        %<bitfield>R	as %<>r but r15 is UNPREDICTABLE
4643        %<bitfield>S	as %<>r but r13 and r15 is UNPREDICTABLE
4644        %<bitfield>c	print bitfield as a condition code
4645 
4646        %<bitfield>'c	print specified char iff bitfield is all ones
4647        %<bitfield>`c	print specified char iff bitfield is all zeroes
4648        %<bitfield>?ab... select from array of values in big endian order
4649 
4650    With one exception at the bottom (done because BL and BLX(1) need
4651    to come dead last), this table was machine-sorted first in
4652    decreasing order of number of bits set in the mask, then in
4653    increasing numeric order of mask, then in increasing numeric order
4654    of opcode.  This order is not the clearest for a human reader, but
4655    is guaranteed never to catch a special-case bit pattern with a more
4656    general mask, which is important, because this instruction encoding
4657    makes heavy use of special-case bit patterns.  */
4658 static const struct opcode32 thumb32_opcodes[] =
4659 {
4660   /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
4661      instructions.  */
4662   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4663     0xf00fe001, 0xffffffff, "lctp%c"},
4664   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4665     0xf02fc001, 0xfffff001, "le\t%P"},
4666   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4667     0xf00fc001, 0xfffff001, "le\tlr, %P"},
4668   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4669     0xf01fc001, 0xfffff001, "letp\tlr, %P"},
4670   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4671     0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"},
4672   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4673     0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"},
4674   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4675     0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"},
4676   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4677     0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"},
4678 
4679   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4680     0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
4681   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4682     0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
4683   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4684     0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
4685   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4686     0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
4687   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4688     0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"},
4689 
4690   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
4691     0xe89f0000, 0xffff2000, "clrm%c\t%n"},
4692 
4693   /* ARMv8-M and ARMv8-M Security Extensions instructions.  */
4694   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"},
4695   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4696     0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
4697   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4698     0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
4699   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4700     0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
4701   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
4702     0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
4703 
4704   /* ARM V8.2 RAS extension instructions.  */
4705   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
4706     0xf3af8010, 0xffffffff, "esb"},
4707 
4708   /* V8 instructions.  */
4709   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4710     0xf3af8005, 0xffffffff, "sevl%c.w"},
4711   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4712     0xf78f8000, 0xfffffffc, "dcps%0-1d"},
4713   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4714     0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
4715   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4716     0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
4717   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4718     0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
4719   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4720     0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
4721   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4722     0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
4723   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4724     0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
4725   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4726     0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
4727   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4728     0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
4729   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4730     0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
4731   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4732     0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
4733   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4734     0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
4735   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4736     0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
4737   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4738     0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
4739   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
4740     0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
4741 
4742   /* V8-R instructions.  */
4743   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
4744     0xf3bf8f4c, 0xffffffff, "dfb%c"},
4745 
4746   /* CRC32 instructions.  */
4747   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4748     0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
4749   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4750     0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
4751   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4752     0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
4753   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4754     0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
4755   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4756     0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
4757   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
4758     0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
4759 
4760   /* Speculation Barriers.  */
4761   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8014, 0xffffffff, "csdb"},
4762   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f40, 0xffffffff, "ssbb"},
4763   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f44, 0xffffffff, "pssbb"},
4764 
4765   /* V7 instructions.  */
4766   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"},
4767   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
4768   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
4769   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
4770   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
4771   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
4772   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
4773   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
4774     0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
4775   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
4776     0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
4777 
4778   /* Virtualization Extension instructions.  */
4779   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
4780   /* We skip ERET as that is SUBS pc, lr, #0.  */
4781 
4782   /* MP Extension instructions.  */
4783   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP),   0xf830f000, 0xff70f000, "pldw%c\t%a"},
4784 
4785   /* Security extension instructions.  */
4786   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),  0xf7f08000, 0xfff0f000, "smc%c\t%K"},
4787 
4788   /* ARMv8.5-A instructions.  */
4789   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf3bf8f70, 0xffffffff, "sb"},
4790 
4791   /* Instructions defined in the basic V6T2 set.  */
4792   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"},
4793   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"},
4794   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"},
4795   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"},
4796   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"},
4797   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4798     0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
4799   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
4800 
4801   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4802     0xf3bf8f2f, 0xffffffff, "clrex%c"},
4803   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4804     0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
4805   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4806     0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
4807   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4808     0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
4809   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4810     0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
4811   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4812     0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
4813   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4814     0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
4815   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4816     0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
4817   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4818     0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
4819   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4820     0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
4821   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4822     0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
4823   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4824     0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
4825   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4826     0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
4827   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4828     0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
4829   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4830     0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
4831   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4832     0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
4833   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4834     0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
4835   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4836     0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
4837   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4838     0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
4839   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4840     0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
4841   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4842     0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
4843   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4844     0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
4845   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4846     0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
4847   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4848     0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
4849   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4850     0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
4851   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4852     0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
4853   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4854     0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
4855   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4856     0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
4857   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4858     0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
4859   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4860     0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
4861   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4862     0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
4863   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4864     0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
4865   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4866     0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
4867   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4868     0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
4869   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4870     0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
4871   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4872     0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
4873   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4874     0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
4875   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4876     0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
4877   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4878     0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
4879   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4880     0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
4881   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4882     0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
4883   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4884     0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
4885   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4886     0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
4887   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4888     0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
4889   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4890     0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
4891   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4892     0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
4893   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4894     0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
4895   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4896     0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
4897   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4898     0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
4899   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4900     0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
4901   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4902     0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
4903   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4904     0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
4905   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4906     0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
4907   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4908     0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
4909   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4910     0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
4911   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4912     0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
4913   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4914     0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
4915   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4916     0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
4917   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4918     0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
4919   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4920     0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
4921   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4922     0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
4923   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4924     0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
4925   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4926     0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
4927   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4928     0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
4929   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4930     0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
4931   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4932     0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
4933   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4934     0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
4935   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4936     0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
4937   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4938     0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
4939   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4940     0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
4941   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4942     0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
4943   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4944     0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
4945   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4946     0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
4947   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4948     0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
4949   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4950     0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4951   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4952     0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4953   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4954     0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
4955   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4956     0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
4957   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
4958     0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
4959   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4960     0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"},
4961   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4962     0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
4963   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4964     0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
4965   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4966     0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4967   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4968     0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
4969   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4970     0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
4971   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4972     0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4973   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4974     0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
4975   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4976     0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4977   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4978     0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
4979   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4980     0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4981   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4982     0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
4983   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4984     0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
4985   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4986     0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
4987   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4988     0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
4989   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4990     0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
4991   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4992     0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
4993   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4994     0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
4995   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4996     0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
4997   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
4998     0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
4999   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5000     0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
5001   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5002     0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
5003   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5004     0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
5005   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5006     0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
5007   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5008     0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
5009   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5010     0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5011   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5012     0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5013   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5014     0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5015   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5016     0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5017   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5018     0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5019   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5020     0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5021   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5022     0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5023   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5024     0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5025   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5026     0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
5027   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5028     0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
5029   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5030     0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
5031   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5032     0xf810f000, 0xff70f000, "pld%c\t%a"},
5033   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5034     0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5035   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5036     0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5037   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5038     0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5039   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5040     0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5041   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5042     0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
5043   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5044     0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5045   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5046     0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
5047   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5048     0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
5049   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5050     0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
5051   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5052     0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
5053   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5054     0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
5055   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5056     0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
5057   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5058     0xfb100000, 0xfff000c0,
5059     "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
5060   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5061     0xfbc00080, 0xfff000c0,
5062     "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
5063   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5064     0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
5065   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5066     0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
5067   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5068     0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"},
5069   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5070     0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
5071   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5072     0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
5073   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5074     0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
5075   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5076     0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
5077   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5078     0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
5079   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5080     0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
5081   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5082     0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
5083   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5084     0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
5085   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5086     0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
5087   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5088     0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
5089   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5090     0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
5091   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5092     0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
5093   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5094     0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
5095   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5096     0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
5097   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5098     0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
5099   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
5100     0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
5101   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5102     0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
5103   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5104     0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
5105   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5106     0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
5107   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5108     0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
5109   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5110     0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
5111   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5112     0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
5113   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5114     0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
5115   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5116     0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
5117   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5118     0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
5119   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5120     0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
5121   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5122     0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
5123   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5124     0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
5125   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5126     0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
5127   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5128     0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
5129   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5130     0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
5131   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5132     0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
5133   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5134     0xe9400000, 0xff500000,
5135     "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
5136   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5137     0xe9500000, 0xff500000,
5138     "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
5139   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5140     0xe8600000, 0xff700000,
5141     "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
5142   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5143     0xe8700000, 0xff700000,
5144     "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
5145   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5146     0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
5147   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5148     0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
5149 
5150   /* Filter out Bcc with cond=E or F, which are used for other instructions.  */
5151   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5152     0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
5153   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5154     0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
5155   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5156     0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
5157   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
5158     0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
5159 
5160   /* These have been 32-bit since the invention of Thumb.  */
5161   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
5162      0xf000c000, 0xf800d001, "blx%c\t%B%x"},
5163   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
5164      0xf000d000, 0xf800d000, "bl%c\t%B%x"},
5165 
5166   /* Fallback.  */
5167   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
5168       0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
5169   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
5170 };
5171 
5172 static const char *const arm_conditional[] =
5173 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
5174  "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
5175 
5176 static const char *const arm_fp_const[] =
5177 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
5178 
5179 static const char *const arm_shift[] =
5180 {"lsl", "lsr", "asr", "ror"};
5181 
5182 typedef struct
5183 {
5184   const char *name;
5185   const char *description;
5186   const char *reg_names[16];
5187 }
5188 arm_regname;
5189 
5190 static const arm_regname regnames[] =
5191 {
5192   { "reg-names-raw", N_("Select raw register names"),
5193     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
5194   { "reg-names-gcc", N_("Select register names used by GCC"),
5195     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
5196   { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
5197     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp",  "lr",  "pc" }},
5198   { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL} },
5199   { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL} },
5200   { "reg-names-apcs", N_("Select register names used in the APCS"),
5201     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
5202   { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
5203     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},
5204   { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
5205     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }},
5206   { "coproc<N>=(cde|generic)", N_("Enable CDE extensions for coprocessor N space"), { NULL } }
5207 };
5208 
5209 static const char *const iwmmxt_wwnames[] =
5210 {"b", "h", "w", "d"};
5211 
5212 static const char *const iwmmxt_wwssnames[] =
5213 {"b", "bus", "bc", "bss",
5214  "h", "hus", "hc", "hss",
5215  "w", "wus", "wc", "wss",
5216  "d", "dus", "dc", "dss"
5217 };
5218 
5219 static const char *const iwmmxt_regnames[] =
5220 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
5221   "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
5222 };
5223 
5224 static const char *const iwmmxt_cregnames[] =
5225 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
5226   "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
5227 };
5228 
5229 static const char *const vec_condnames[] =
5230 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
5231 };
5232 
5233 static const char *const mve_predicatenames[] =
5234 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
5235   "eee", "ee", "eet", "e", "ett", "et", "ete"
5236 };
5237 
5238 /* Names for 2-bit size field for mve vector isntructions.  */
5239 static const char *const mve_vec_sizename[] =
5240   { "8", "16", "32", "64"};
5241 
5242 /* Indicates whether we are processing a then predicate,
5243    else predicate or none at all.  */
5244 enum vpt_pred_state
5245 {
5246   PRED_NONE,
5247   PRED_THEN,
5248   PRED_ELSE
5249 };
5250 
5251 /* Information used to process a vpt block and subsequent instructions.  */
5252 struct vpt_block
5253 {
5254   /* Are we in a vpt block.  */
5255   bfd_boolean in_vpt_block;
5256 
5257   /* Next predicate state if in vpt block.  */
5258   enum vpt_pred_state next_pred_state;
5259 
5260   /* Mask from vpt/vpst instruction.  */
5261   long predicate_mask;
5262 
5263   /* Instruction number in vpt block.  */
5264   long current_insn_num;
5265 
5266   /* Number of instructions in vpt block..   */
5267   long num_pred_insn;
5268 };
5269 
5270 static struct vpt_block vpt_block_state =
5271 {
5272   FALSE,
5273   PRED_NONE,
5274   0,
5275   0,
5276   0
5277 };
5278 
5279 /* Default to GCC register name set.  */
5280 static unsigned int regname_selected = 1;
5281 
5282 #define NUM_ARM_OPTIONS   ARRAY_SIZE (regnames)
5283 #define arm_regnames      regnames[regname_selected].reg_names
5284 
5285 static bfd_boolean force_thumb = FALSE;
5286 static uint16_t cde_coprocs = 0;
5287 
5288 /* Current IT instruction state.  This contains the same state as the IT
5289    bits in the CPSR.  */
5290 static unsigned int ifthen_state;
5291 /* IT state for the next instruction.  */
5292 static unsigned int ifthen_next_state;
5293 /* The address of the insn for which the IT state is valid.  */
5294 static bfd_vma ifthen_address;
5295 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
5296 /* Indicates that the current Conditional state is unconditional or outside
5297    an IT block.  */
5298 #define COND_UNCOND 16
5299 
5300 
5301 /* Functions.  */
5302 /* Extract the predicate mask for a VPT or VPST instruction.
5303    The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh).  */
5304 
5305 static long
5306 mve_extract_pred_mask (long given)
5307 {
5308   return ((given & 0x00400000) >> 19) | ((given & 0xe000) >> 13);
5309 }
5310 
5311 /* Return the number of instructions in a MVE predicate block.  */
5312 static long
5313 num_instructions_vpt_block (long given)
5314 {
5315   long mask = mve_extract_pred_mask (given);
5316   if (mask == 0)
5317     return 0;
5318 
5319   if (mask == 8)
5320     return 1;
5321 
5322   if ((mask & 7) == 4)
5323     return 2;
5324 
5325   if ((mask & 3) == 2)
5326     return 3;
5327 
5328   if ((mask & 1) == 1)
5329     return 4;
5330 
5331   return 0;
5332 }
5333 
5334 static void
5335 mark_outside_vpt_block (void)
5336 {
5337   vpt_block_state.in_vpt_block = FALSE;
5338   vpt_block_state.next_pred_state = PRED_NONE;
5339   vpt_block_state.predicate_mask = 0;
5340   vpt_block_state.current_insn_num = 0;
5341   vpt_block_state.num_pred_insn = 0;
5342 }
5343 
5344 static void
5345 mark_inside_vpt_block (long given)
5346 {
5347   vpt_block_state.in_vpt_block = TRUE;
5348   vpt_block_state.next_pred_state = PRED_THEN;
5349   vpt_block_state.predicate_mask = mve_extract_pred_mask (given);
5350   vpt_block_state.current_insn_num = 0;
5351   vpt_block_state.num_pred_insn = num_instructions_vpt_block (given);
5352   assert (vpt_block_state.num_pred_insn >= 1);
5353 }
5354 
5355 static enum vpt_pred_state
5356 invert_next_predicate_state (enum vpt_pred_state astate)
5357 {
5358   if (astate == PRED_THEN)
5359     return PRED_ELSE;
5360   else if (astate == PRED_ELSE)
5361     return PRED_THEN;
5362   else
5363     return PRED_NONE;
5364 }
5365 
5366 static enum vpt_pred_state
5367 update_next_predicate_state (void)
5368 {
5369   long pred_mask = vpt_block_state.predicate_mask;
5370   long mask_for_insn = 0;
5371 
5372   switch (vpt_block_state.current_insn_num)
5373     {
5374     case 1:
5375       mask_for_insn = 8;
5376       break;
5377 
5378     case 2:
5379       mask_for_insn = 4;
5380       break;
5381 
5382     case 3:
5383       mask_for_insn = 2;
5384       break;
5385 
5386     case 4:
5387       return PRED_NONE;
5388     }
5389 
5390   if (pred_mask & mask_for_insn)
5391     return invert_next_predicate_state (vpt_block_state.next_pred_state);
5392   else
5393     return vpt_block_state.next_pred_state;
5394 }
5395 
5396 static void
5397 update_vpt_block_state (void)
5398 {
5399   vpt_block_state.current_insn_num++;
5400   if (vpt_block_state.current_insn_num == vpt_block_state.num_pred_insn)
5401     {
5402       /* No more instructions to process in vpt block.  */
5403       mark_outside_vpt_block ();
5404       return;
5405     }
5406 
5407   vpt_block_state.next_pred_state = update_next_predicate_state ();
5408 }
5409 
5410 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
5411    Returns pointer to following character of the format string and
5412    fills in *VALUEP and *WIDTHP with the extracted value and number of
5413    bits extracted.  WIDTHP can be NULL.  */
5414 
5415 static const char *
5416 arm_decode_bitfield (const char *ptr,
5417 		     unsigned long insn,
5418 		     unsigned long *valuep,
5419 		     int *widthp)
5420 {
5421   unsigned long value = 0;
5422   int width = 0;
5423 
5424   do
5425     {
5426       int start, end;
5427       int bits;
5428 
5429       for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
5430 	start = start * 10 + *ptr - '0';
5431       if (*ptr == '-')
5432 	for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
5433 	  end = end * 10 + *ptr - '0';
5434       else
5435 	end = start;
5436       bits = end - start;
5437       if (bits < 0)
5438 	abort ();
5439       value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
5440       width += bits + 1;
5441     }
5442   while (*ptr++ == ',');
5443   *valuep = value;
5444   if (widthp)
5445     *widthp = width;
5446   return ptr - 1;
5447 }
5448 
5449 static void
5450 arm_decode_shift (long given, fprintf_ftype func, void *stream,
5451 		  bfd_boolean print_shift)
5452 {
5453   func (stream, "%s", arm_regnames[given & 0xf]);
5454 
5455   if ((given & 0xff0) != 0)
5456     {
5457       if ((given & 0x10) == 0)
5458 	{
5459 	  int amount = (given & 0xf80) >> 7;
5460 	  int shift = (given & 0x60) >> 5;
5461 
5462 	  if (amount == 0)
5463 	    {
5464 	      if (shift == 3)
5465 		{
5466 		  func (stream, ", rrx");
5467 		  return;
5468 		}
5469 
5470 	      amount = 32;
5471 	    }
5472 
5473 	  if (print_shift)
5474 	    func (stream, ", %s #%d", arm_shift[shift], amount);
5475 	  else
5476 	    func (stream, ", #%d", amount);
5477 	}
5478       else if ((given & 0x80) == 0x80)
5479 	func (stream, "\t; <illegal shifter operand>");
5480       else if (print_shift)
5481 	func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
5482 	      arm_regnames[(given & 0xf00) >> 8]);
5483       else
5484 	func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
5485     }
5486 }
5487 
5488 /* Return TRUE if the MATCHED_INSN can be inside an IT block.  */
5489 
5490 static bfd_boolean
5491 is_mve_okay_in_it (enum mve_instructions matched_insn)
5492 {
5493   switch (matched_insn)
5494     {
5495     case MVE_VMOV_GP_TO_VEC_LANE:
5496     case MVE_VMOV2_VEC_LANE_TO_GP:
5497     case MVE_VMOV2_GP_TO_VEC_LANE:
5498     case MVE_VMOV_VEC_LANE_TO_GP:
5499     case MVE_LSLL:
5500     case MVE_LSLLI:
5501     case MVE_LSRL:
5502     case MVE_ASRL:
5503     case MVE_ASRLI:
5504     case MVE_SQRSHRL:
5505     case MVE_SQRSHR:
5506     case MVE_UQRSHL:
5507     case MVE_UQRSHLL:
5508     case MVE_UQSHL:
5509     case MVE_UQSHLL:
5510     case MVE_URSHRL:
5511     case MVE_URSHR:
5512     case MVE_SRSHRL:
5513     case MVE_SRSHR:
5514     case MVE_SQSHLL:
5515     case MVE_SQSHL:
5516       return TRUE;
5517     default:
5518       return FALSE;
5519     }
5520 }
5521 
5522 static bfd_boolean
5523 is_mve_architecture (struct disassemble_info *info)
5524 {
5525   struct arm_private_data *private_data = info->private_data;
5526   arm_feature_set allowed_arches = private_data->features;
5527 
5528   arm_feature_set arm_ext_v8_1m_main
5529     = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
5530 
5531   if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
5532       && !ARM_CPU_IS_ANY (allowed_arches))
5533     return TRUE;
5534   else
5535     return FALSE;
5536 }
5537 
5538 static bfd_boolean
5539 is_vpt_instruction (long given)
5540 {
5541 
5542   /* If mkh:mkl is '0000' then its not a vpt/vpst instruction.  */
5543   if ((given & 0x0040e000) == 0)
5544     return FALSE;
5545 
5546   /* VPT floating point T1 variant.  */
5547   if (((given & 0xefb10f50) == 0xee310f00 && ((given & 0x1001) != 0x1))
5548   /* VPT floating point T2 variant.  */
5549       || ((given & 0xefb10f50) == 0xee310f40)
5550   /* VPT vector T1 variant.  */
5551       || ((given & 0xff811f51) == 0xfe010f00)
5552   /* VPT vector T2 variant.  */
5553       || ((given & 0xff811f51) == 0xfe010f01
5554 	  && ((given & 0x300000) != 0x300000))
5555   /* VPT vector T3 variant.  */
5556       || ((given & 0xff811f50) == 0xfe011f00)
5557   /* VPT vector T4 variant.  */
5558       || ((given & 0xff811f70) == 0xfe010f40)
5559   /* VPT vector T5 variant.  */
5560       || ((given & 0xff811f70) == 0xfe010f60)
5561   /* VPT vector T6 variant.  */
5562       || ((given & 0xff811f50) == 0xfe011f40)
5563   /* VPST vector T variant.  */
5564       || ((given & 0xffbf1fff) == 0xfe310f4d))
5565     return TRUE;
5566   else
5567     return FALSE;
5568 }
5569 
5570 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
5571    and ending bitfield = END.  END must be greater than START.  */
5572 
5573 static unsigned long
5574 arm_decode_field (unsigned long given, unsigned int start, unsigned int end)
5575 {
5576   int bits = end - start;
5577 
5578   if (bits < 0)
5579     abort ();
5580 
5581   return ((given >> start) & ((2ul << bits) - 1));
5582 }
5583 
5584 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
5585    START:END and START2:END2.  END/END2 must be greater than
5586    START/START2.  */
5587 
5588 static unsigned long
5589 arm_decode_field_multiple (unsigned long given, unsigned int start,
5590 			   unsigned int end, unsigned int start2,
5591 			   unsigned int end2)
5592 {
5593   int bits = end - start;
5594   int bits2 = end2 - start2;
5595   unsigned long value = 0;
5596   int width = 0;
5597 
5598   if (bits2 < 0)
5599     abort ();
5600 
5601   value = arm_decode_field (given, start, end);
5602   width += bits + 1;
5603 
5604   value |= ((given >> start2) & ((2ul << bits2) - 1)) << width;
5605   return value;
5606 }
5607 
5608 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
5609    This helps us decode instructions that change mnemonic depending on specific
5610    operand values/encodings.  */
5611 
5612 static bfd_boolean
5613 is_mve_encoding_conflict (unsigned long given,
5614 			  enum mve_instructions matched_insn)
5615 {
5616   switch (matched_insn)
5617     {
5618     case MVE_VPST:
5619       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5620 	return TRUE;
5621       else
5622 	return FALSE;
5623 
5624     case MVE_VPT_FP_T1:
5625       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5626 	return TRUE;
5627       if ((arm_decode_field (given, 12, 12) == 0)
5628 	  && (arm_decode_field (given, 0, 0) == 1))
5629 	return TRUE;
5630       return FALSE;
5631 
5632     case MVE_VPT_FP_T2:
5633       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5634 	return TRUE;
5635       if (arm_decode_field (given, 0, 3) == 0xd)
5636 	return TRUE;
5637       return FALSE;
5638 
5639     case MVE_VPT_VEC_T1:
5640     case MVE_VPT_VEC_T2:
5641     case MVE_VPT_VEC_T3:
5642     case MVE_VPT_VEC_T4:
5643     case MVE_VPT_VEC_T5:
5644     case MVE_VPT_VEC_T6:
5645       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
5646 	return TRUE;
5647       if (arm_decode_field (given, 20, 21) == 3)
5648 	return TRUE;
5649       return FALSE;
5650 
5651     case MVE_VCMP_FP_T1:
5652       if ((arm_decode_field (given, 12, 12) == 0)
5653 	  && (arm_decode_field (given, 0, 0) == 1))
5654 	return TRUE;
5655       else
5656 	return FALSE;
5657 
5658     case MVE_VCMP_FP_T2:
5659       if (arm_decode_field (given, 0, 3) == 0xd)
5660 	return TRUE;
5661       else
5662 	return FALSE;
5663 
5664     case MVE_VQADD_T2:
5665     case MVE_VQSUB_T2:
5666     case MVE_VMUL_VEC_T2:
5667     case MVE_VMULH:
5668     case MVE_VRMULH:
5669     case MVE_VMLA:
5670     case MVE_VMAX:
5671     case MVE_VMIN:
5672     case MVE_VBRSR:
5673     case MVE_VADD_VEC_T2:
5674     case MVE_VSUB_VEC_T2:
5675     case MVE_VABAV:
5676     case MVE_VQRSHL_T1:
5677     case MVE_VQSHL_T4:
5678     case MVE_VRSHL_T1:
5679     case MVE_VSHL_T3:
5680     case MVE_VCADD_VEC:
5681     case MVE_VHCADD:
5682     case MVE_VDDUP:
5683     case MVE_VIDUP:
5684     case MVE_VQRDMLADH:
5685     case MVE_VQDMLAH:
5686     case MVE_VQRDMLAH:
5687     case MVE_VQDMLASH:
5688     case MVE_VQRDMLASH:
5689     case MVE_VQDMLSDH:
5690     case MVE_VQRDMLSDH:
5691     case MVE_VQDMULH_T3:
5692     case MVE_VQRDMULH_T4:
5693     case MVE_VQDMLADH:
5694     case MVE_VMLAS:
5695     case MVE_VMULL_INT:
5696     case MVE_VHADD_T2:
5697     case MVE_VHSUB_T2:
5698     case MVE_VCMP_VEC_T1:
5699     case MVE_VCMP_VEC_T2:
5700     case MVE_VCMP_VEC_T3:
5701     case MVE_VCMP_VEC_T4:
5702     case MVE_VCMP_VEC_T5:
5703     case MVE_VCMP_VEC_T6:
5704       if (arm_decode_field (given, 20, 21) == 3)
5705 	return TRUE;
5706       else
5707 	return FALSE;
5708 
5709     case MVE_VLD2:
5710     case MVE_VLD4:
5711     case MVE_VST2:
5712     case MVE_VST4:
5713       if (arm_decode_field (given, 7, 8) == 3)
5714 	return TRUE;
5715       else
5716 	return FALSE;
5717 
5718     case MVE_VSTRB_T1:
5719     case MVE_VSTRH_T2:
5720       if ((arm_decode_field (given, 24, 24) == 0)
5721 	  && (arm_decode_field (given, 21, 21) == 0))
5722 	{
5723 	    return TRUE;
5724 	}
5725       else if ((arm_decode_field (given, 7, 8) == 3))
5726 	return TRUE;
5727       else
5728 	return FALSE;
5729 
5730     case MVE_VSTRB_T5:
5731     case MVE_VSTRH_T6:
5732     case MVE_VSTRW_T7:
5733       if ((arm_decode_field (given, 24, 24) == 0)
5734 	  && (arm_decode_field (given, 21, 21) == 0))
5735 	{
5736 	    return TRUE;
5737 	}
5738       else
5739 	return FALSE;
5740 
5741     case MVE_VCVT_FP_FIX_VEC:
5742       return (arm_decode_field (given, 16, 21) & 0x38) == 0;
5743 
5744     case MVE_VBIC_IMM:
5745     case MVE_VORR_IMM:
5746       {
5747 	unsigned long cmode = arm_decode_field (given, 8, 11);
5748 
5749 	if ((cmode & 1) == 0)
5750 	  return TRUE;
5751 	else if ((cmode & 0xc) == 0xc)
5752 	  return TRUE;
5753 	else
5754 	  return FALSE;
5755       }
5756 
5757     case MVE_VMVN_IMM:
5758       {
5759 	unsigned long cmode = arm_decode_field (given, 8, 11);
5760 
5761 	if (cmode == 0xe)
5762 	  return TRUE;
5763 	else if ((cmode & 0x9) == 1)
5764 	  return TRUE;
5765 	else if ((cmode & 0xd) == 9)
5766 	  return TRUE;
5767 	else
5768 	  return FALSE;
5769       }
5770 
5771     case MVE_VMOV_IMM_TO_VEC:
5772       if ((arm_decode_field (given, 5, 5) == 1)
5773 	  && (arm_decode_field (given, 8, 11) != 0xe))
5774 	return TRUE;
5775       else
5776 	return FALSE;
5777 
5778     case MVE_VMOVL:
5779       {
5780 	unsigned long size = arm_decode_field (given, 19, 20);
5781 	if ((size == 0) || (size == 3))
5782 	  return TRUE;
5783 	else
5784 	  return FALSE;
5785       }
5786 
5787     case MVE_VMAXA:
5788     case MVE_VMINA:
5789     case MVE_VMAXV:
5790     case MVE_VMAXAV:
5791     case MVE_VMINV:
5792     case MVE_VMINAV:
5793     case MVE_VQRSHL_T2:
5794     case MVE_VQSHL_T1:
5795     case MVE_VRSHL_T2:
5796     case MVE_VSHL_T2:
5797     case MVE_VSHLL_T2:
5798     case MVE_VADDV:
5799     case MVE_VMOVN:
5800     case MVE_VQMOVUN:
5801     case MVE_VQMOVN:
5802       if (arm_decode_field (given, 18, 19) == 3)
5803 	return TRUE;
5804       else
5805 	return FALSE;
5806 
5807     case MVE_VMLSLDAV:
5808     case MVE_VRMLSLDAVH:
5809     case MVE_VMLALDAV:
5810     case MVE_VADDLV:
5811       if (arm_decode_field (given, 20, 22) == 7)
5812 	return TRUE;
5813       else
5814 	return FALSE;
5815 
5816     case MVE_VRMLALDAVH:
5817       if ((arm_decode_field (given, 20, 22) & 6) == 6)
5818 	return TRUE;
5819       else
5820 	return FALSE;
5821 
5822     case MVE_VDWDUP:
5823     case MVE_VIWDUP:
5824       if ((arm_decode_field (given, 20, 21) == 3)
5825 	  || (arm_decode_field (given, 1, 3) == 7))
5826 	return TRUE;
5827       else
5828 	return FALSE;
5829 
5830 
5831     case MVE_VSHLL_T1:
5832       if (arm_decode_field (given, 16, 18) == 0)
5833 	{
5834 	  unsigned long sz = arm_decode_field (given, 19, 20);
5835 
5836 	  if ((sz == 1) || (sz == 2))
5837 	    return TRUE;
5838 	  else
5839 	    return FALSE;
5840 	}
5841       else
5842 	return FALSE;
5843 
5844     case MVE_VQSHL_T2:
5845     case MVE_VQSHLU_T3:
5846     case MVE_VRSHR:
5847     case MVE_VSHL_T1:
5848     case MVE_VSHR:
5849     case MVE_VSLI:
5850     case MVE_VSRI:
5851       if (arm_decode_field (given, 19, 21) == 0)
5852 	return TRUE;
5853       else
5854 	return FALSE;
5855 
5856     case MVE_VCTP:
5857     if (arm_decode_field (given, 16, 19) == 0xf)
5858       return TRUE;
5859     else
5860       return FALSE;
5861 
5862     case MVE_ASRLI:
5863     case MVE_ASRL:
5864     case MVE_LSLLI:
5865     case MVE_LSLL:
5866     case MVE_LSRL:
5867     case MVE_SQRSHRL:
5868     case MVE_SQSHLL:
5869     case MVE_SRSHRL:
5870     case MVE_UQRSHLL:
5871     case MVE_UQSHLL:
5872     case MVE_URSHRL:
5873       if (arm_decode_field (given, 9, 11) == 0x7)
5874 	return TRUE;
5875       else
5876 	return FALSE;
5877 
5878     case MVE_CSINC:
5879     case MVE_CSINV:
5880       {
5881 	unsigned long rm, rn;
5882 	rm = arm_decode_field (given, 0, 3);
5883 	rn = arm_decode_field (given, 16, 19);
5884 	/* CSET/CSETM.  */
5885 	if (rm == 0xf && rn == 0xf)
5886 	  return TRUE;
5887 	/* CINC/CINV.  */
5888 	else if (rn == rm && rn != 0xf)
5889 	  return TRUE;
5890       }
5891     /* Fall through.  */
5892     case MVE_CSEL:
5893     case MVE_CSNEG:
5894       if (arm_decode_field (given, 0, 3) == 0xd)
5895 	return TRUE;
5896       /* CNEG.  */
5897       else if (matched_insn == MVE_CSNEG)
5898 	if (arm_decode_field (given, 0, 3) == arm_decode_field (given, 16, 19))
5899 	  return TRUE;
5900       return FALSE;
5901 
5902     default:
5903     case MVE_VADD_FP_T1:
5904     case MVE_VADD_FP_T2:
5905     case MVE_VADD_VEC_T1:
5906       return FALSE;
5907 
5908     }
5909 }
5910 
5911 static void
5912 print_mve_vld_str_addr (struct disassemble_info *info,
5913 			unsigned long given,
5914 			enum mve_instructions matched_insn)
5915 {
5916   void *stream = info->stream;
5917   fprintf_ftype func = info->fprintf_func;
5918 
5919   unsigned long p, w, gpr, imm, add, mod_imm;
5920 
5921   imm = arm_decode_field (given, 0, 6);
5922   mod_imm = imm;
5923 
5924   switch (matched_insn)
5925     {
5926     case MVE_VLDRB_T1:
5927     case MVE_VSTRB_T1:
5928       gpr = arm_decode_field (given, 16, 18);
5929       break;
5930 
5931     case MVE_VLDRH_T2:
5932     case MVE_VSTRH_T2:
5933       gpr = arm_decode_field (given, 16, 18);
5934       mod_imm = imm << 1;
5935       break;
5936 
5937     case MVE_VLDRH_T6:
5938     case MVE_VSTRH_T6:
5939       gpr = arm_decode_field (given, 16, 19);
5940       mod_imm = imm << 1;
5941       break;
5942 
5943     case MVE_VLDRW_T7:
5944     case MVE_VSTRW_T7:
5945       gpr = arm_decode_field (given, 16, 19);
5946       mod_imm = imm << 2;
5947       break;
5948 
5949     case MVE_VLDRB_T5:
5950     case MVE_VSTRB_T5:
5951       gpr = arm_decode_field (given, 16, 19);
5952       break;
5953 
5954     default:
5955       return;
5956     }
5957 
5958   p = arm_decode_field (given, 24, 24);
5959   w = arm_decode_field (given, 21, 21);
5960 
5961   add = arm_decode_field (given, 23, 23);
5962 
5963   char * add_sub;
5964 
5965   /* Don't print anything for '+' as it is implied.  */
5966   if (add == 1)
5967     add_sub = "";
5968   else
5969     add_sub = "-";
5970 
5971   if (p == 1)
5972     {
5973       /* Offset mode.  */
5974       if (w == 0)
5975 	func (stream, "[%s, #%s%lu]", arm_regnames[gpr], add_sub, mod_imm);
5976       /* Pre-indexed mode.  */
5977       else
5978 	func (stream, "[%s, #%s%lu]!", arm_regnames[gpr], add_sub, mod_imm);
5979     }
5980   else if ((p == 0) && (w == 1))
5981     /* Post-index mode.  */
5982     func (stream, "[%s], #%s%lu", arm_regnames[gpr], add_sub, mod_imm);
5983 }
5984 
5985 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
5986    Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
5987    this encoding is undefined.  */
5988 
5989 static bfd_boolean
5990 is_mve_undefined (unsigned long given, enum mve_instructions matched_insn,
5991 		  enum mve_undefined *undefined_code)
5992 {
5993   *undefined_code = UNDEF_NONE;
5994 
5995   switch (matched_insn)
5996     {
5997     case MVE_VDUP:
5998       if (arm_decode_field_multiple (given, 5, 5, 22, 22) == 3)
5999 	{
6000 	  *undefined_code = UNDEF_SIZE_3;
6001 	  return TRUE;
6002 	}
6003       else
6004 	return FALSE;
6005 
6006     case MVE_VQADD_T1:
6007     case MVE_VQSUB_T1:
6008     case MVE_VMUL_VEC_T1:
6009     case MVE_VABD_VEC:
6010     case MVE_VADD_VEC_T1:
6011     case MVE_VSUB_VEC_T1:
6012     case MVE_VQDMULH_T1:
6013     case MVE_VQRDMULH_T2:
6014     case MVE_VRHADD:
6015     case MVE_VHADD_T1:
6016     case MVE_VHSUB_T1:
6017       if (arm_decode_field (given, 20, 21) == 3)
6018 	{
6019 	  *undefined_code = UNDEF_SIZE_3;
6020 	  return TRUE;
6021 	}
6022       else
6023 	return FALSE;
6024 
6025     case MVE_VLDRB_T1:
6026       if (arm_decode_field (given, 7, 8) == 3)
6027 	{
6028 	  *undefined_code = UNDEF_SIZE_3;
6029 	  return TRUE;
6030 	}
6031       else
6032 	return FALSE;
6033 
6034     case MVE_VLDRH_T2:
6035       if (arm_decode_field (given, 7, 8) <= 1)
6036 	{
6037 	  *undefined_code = UNDEF_SIZE_LE_1;
6038 	  return TRUE;
6039 	}
6040       else
6041 	return FALSE;
6042 
6043     case MVE_VSTRB_T1:
6044       if ((arm_decode_field (given, 7, 8) == 0))
6045 	{
6046 	  *undefined_code = UNDEF_SIZE_0;
6047 	  return TRUE;
6048 	}
6049       else
6050 	return FALSE;
6051 
6052     case MVE_VSTRH_T2:
6053       if ((arm_decode_field (given, 7, 8) <= 1))
6054 	{
6055 	  *undefined_code = UNDEF_SIZE_LE_1;
6056 	  return TRUE;
6057 	}
6058       else
6059 	return FALSE;
6060 
6061     case MVE_VLDRB_GATHER_T1:
6062       if (arm_decode_field (given, 7, 8) == 3)
6063 	{
6064 	  *undefined_code = UNDEF_SIZE_3;
6065 	  return TRUE;
6066 	}
6067       else if ((arm_decode_field (given, 28, 28) == 0)
6068 	       && (arm_decode_field (given, 7, 8) == 0))
6069 	{
6070 	  *undefined_code = UNDEF_NOT_UNS_SIZE_0;
6071 	  return TRUE;
6072 	}
6073       else
6074 	return FALSE;
6075 
6076     case MVE_VLDRH_GATHER_T2:
6077       if (arm_decode_field (given, 7, 8) == 3)
6078 	{
6079 	  *undefined_code = UNDEF_SIZE_3;
6080 	  return TRUE;
6081 	}
6082       else if ((arm_decode_field (given, 28, 28) == 0)
6083 	       && (arm_decode_field (given, 7, 8) == 1))
6084 	{
6085 	  *undefined_code = UNDEF_NOT_UNS_SIZE_1;
6086 	  return TRUE;
6087 	}
6088       else if (arm_decode_field (given, 7, 8) == 0)
6089 	{
6090 	  *undefined_code = UNDEF_SIZE_0;
6091 	  return TRUE;
6092 	}
6093       else
6094 	return FALSE;
6095 
6096     case MVE_VLDRW_GATHER_T3:
6097       if (arm_decode_field (given, 7, 8) != 2)
6098 	{
6099 	  *undefined_code = UNDEF_SIZE_NOT_2;
6100 	  return TRUE;
6101 	}
6102       else if (arm_decode_field (given, 28, 28) == 0)
6103 	{
6104 	  *undefined_code = UNDEF_NOT_UNSIGNED;
6105 	  return TRUE;
6106 	}
6107       else
6108 	return FALSE;
6109 
6110     case MVE_VLDRD_GATHER_T4:
6111       if (arm_decode_field (given, 7, 8) != 3)
6112 	{
6113 	  *undefined_code = UNDEF_SIZE_NOT_3;
6114 	  return TRUE;
6115 	}
6116       else if (arm_decode_field (given, 28, 28) == 0)
6117 	{
6118 	  *undefined_code = UNDEF_NOT_UNSIGNED;
6119 	  return TRUE;
6120 	}
6121       else
6122 	return FALSE;
6123 
6124     case MVE_VSTRB_SCATTER_T1:
6125       if (arm_decode_field (given, 7, 8) == 3)
6126 	{
6127 	  *undefined_code = UNDEF_SIZE_3;
6128 	  return TRUE;
6129 	}
6130       else
6131 	return FALSE;
6132 
6133     case MVE_VSTRH_SCATTER_T2:
6134       {
6135 	unsigned long size = arm_decode_field (given, 7, 8);
6136 	if (size == 3)
6137 	  {
6138 	    *undefined_code = UNDEF_SIZE_3;
6139 	    return TRUE;
6140 	  }
6141 	else if (size == 0)
6142 	  {
6143 	    *undefined_code = UNDEF_SIZE_0;
6144 	    return TRUE;
6145 	  }
6146 	else
6147 	  return FALSE;
6148       }
6149 
6150     case MVE_VSTRW_SCATTER_T3:
6151       if (arm_decode_field (given, 7, 8) != 2)
6152 	{
6153 	  *undefined_code = UNDEF_SIZE_NOT_2;
6154 	  return TRUE;
6155 	}
6156       else
6157 	return FALSE;
6158 
6159     case MVE_VSTRD_SCATTER_T4:
6160       if (arm_decode_field (given, 7, 8) != 3)
6161 	{
6162 	  *undefined_code = UNDEF_SIZE_NOT_3;
6163 	  return TRUE;
6164 	}
6165       else
6166 	return FALSE;
6167 
6168     case MVE_VCVT_FP_FIX_VEC:
6169       {
6170 	unsigned long imm6 = arm_decode_field (given, 16, 21);
6171 	if ((imm6 & 0x20) == 0)
6172 	  {
6173 	    *undefined_code = UNDEF_VCVT_IMM6;
6174 	    return TRUE;
6175 	  }
6176 
6177 	if ((arm_decode_field (given, 9, 9) == 0)
6178 	    && ((imm6 & 0x30) == 0x20))
6179 	  {
6180 	    *undefined_code = UNDEF_VCVT_FSI_IMM6;
6181 	    return TRUE;
6182 	  }
6183 
6184 	return FALSE;
6185       }
6186 
6187     case MVE_VNEG_FP:
6188     case MVE_VABS_FP:
6189     case MVE_VCVT_BETWEEN_FP_INT:
6190     case MVE_VCVT_FROM_FP_TO_INT:
6191       {
6192 	unsigned long size = arm_decode_field (given, 18, 19);
6193 	if (size == 0)
6194 	  {
6195 	    *undefined_code = UNDEF_SIZE_0;
6196 	    return TRUE;
6197 	  }
6198 	else if (size == 3)
6199 	  {
6200 	    *undefined_code = UNDEF_SIZE_3;
6201 	    return TRUE;
6202 	  }
6203 	else
6204 	  return FALSE;
6205       }
6206 
6207     case MVE_VMOV_VEC_LANE_TO_GP:
6208       {
6209 	unsigned long op1 = arm_decode_field (given, 21, 22);
6210 	unsigned long op2 = arm_decode_field (given, 5, 6);
6211 	unsigned long u = arm_decode_field (given, 23, 23);
6212 
6213 	if ((op2 == 0) && (u == 1))
6214 	  {
6215 	    if ((op1 == 0) || (op1 == 1))
6216 	      {
6217 		*undefined_code = UNDEF_BAD_U_OP1_OP2;
6218 		return TRUE;
6219 	      }
6220 	    else
6221 	      return FALSE;
6222 	  }
6223 	else if (op2 == 2)
6224 	  {
6225 	    if ((op1 == 0) || (op1 == 1))
6226 	      {
6227 		*undefined_code = UNDEF_BAD_OP1_OP2;
6228 		return TRUE;
6229 	      }
6230 	    else
6231 	      return FALSE;
6232 	  }
6233 
6234 	return FALSE;
6235       }
6236 
6237     case MVE_VMOV_GP_TO_VEC_LANE:
6238       if (arm_decode_field (given, 5, 6) == 2)
6239 	{
6240 	  unsigned long op1 = arm_decode_field (given, 21, 22);
6241 	  if ((op1 == 0) || (op1 == 1))
6242 	    {
6243 	      *undefined_code = UNDEF_BAD_OP1_OP2;
6244 	      return TRUE;
6245 	    }
6246 	  else
6247 	    return FALSE;
6248 	}
6249       else
6250 	return FALSE;
6251 
6252     case MVE_VMOV_VEC_TO_VEC:
6253       if ((arm_decode_field (given, 5, 5) == 1)
6254 	  || (arm_decode_field (given, 22, 22) == 1))
6255 	  return TRUE;
6256       return FALSE;
6257 
6258     case MVE_VMOV_IMM_TO_VEC:
6259       if (arm_decode_field (given, 5, 5) == 0)
6260       {
6261 	unsigned long cmode = arm_decode_field (given, 8, 11);
6262 
6263 	if (((cmode & 9) == 1) || ((cmode & 5) == 1))
6264 	  {
6265 	    *undefined_code = UNDEF_OP_0_BAD_CMODE;
6266 	    return TRUE;
6267 	  }
6268 	else
6269 	  return FALSE;
6270       }
6271       else
6272 	return FALSE;
6273 
6274     case MVE_VSHLL_T2:
6275     case MVE_VMOVN:
6276       if (arm_decode_field (given, 18, 19) == 2)
6277 	{
6278 	  *undefined_code = UNDEF_SIZE_2;
6279 	  return TRUE;
6280 	}
6281       else
6282 	return FALSE;
6283 
6284     case MVE_VRMLALDAVH:
6285     case MVE_VMLADAV_T1:
6286     case MVE_VMLADAV_T2:
6287     case MVE_VMLALDAV:
6288       if ((arm_decode_field (given, 28, 28) == 1)
6289 	  && (arm_decode_field (given, 12, 12) == 1))
6290 	{
6291 	  *undefined_code = UNDEF_XCHG_UNS;
6292 	  return TRUE;
6293 	}
6294       else
6295 	return FALSE;
6296 
6297     case MVE_VQSHRN:
6298     case MVE_VQSHRUN:
6299     case MVE_VSHLL_T1:
6300     case MVE_VSHRN:
6301       {
6302 	unsigned long sz = arm_decode_field (given, 19, 20);
6303 	if (sz == 1)
6304 	  return FALSE;
6305 	else if ((sz & 2) == 2)
6306 	  return FALSE;
6307 	else
6308 	  {
6309 	    *undefined_code = UNDEF_SIZE;
6310 	    return TRUE;
6311 	  }
6312       }
6313       break;
6314 
6315     case MVE_VQSHL_T2:
6316     case MVE_VQSHLU_T3:
6317     case MVE_VRSHR:
6318     case MVE_VSHL_T1:
6319     case MVE_VSHR:
6320     case MVE_VSLI:
6321     case MVE_VSRI:
6322       {
6323 	unsigned long sz = arm_decode_field (given, 19, 21);
6324 	if ((sz & 7) == 1)
6325 	  return FALSE;
6326 	else if ((sz & 6) == 2)
6327 	  return FALSE;
6328 	else if ((sz & 4) == 4)
6329 	  return FALSE;
6330 	else
6331 	  {
6332 	    *undefined_code = UNDEF_SIZE;
6333 	    return TRUE;
6334 	  }
6335       }
6336 
6337     case MVE_VQRSHRN:
6338     case MVE_VQRSHRUN:
6339       if (arm_decode_field (given, 19, 20) == 0)
6340 	{
6341 	  *undefined_code = UNDEF_SIZE_0;
6342 	  return TRUE;
6343 	}
6344       else
6345 	return FALSE;
6346 
6347     case MVE_VABS_VEC:
6348 	if (arm_decode_field (given, 18, 19) == 3)
6349 	{
6350 	  *undefined_code = UNDEF_SIZE_3;
6351 	  return TRUE;
6352 	}
6353 	else
6354 	  return FALSE;
6355 
6356     case MVE_VQNEG:
6357     case MVE_VQABS:
6358     case MVE_VNEG_VEC:
6359     case MVE_VCLS:
6360     case MVE_VCLZ:
6361       if (arm_decode_field (given, 18, 19) == 3)
6362 	{
6363 	  *undefined_code = UNDEF_SIZE_3;
6364 	  return TRUE;
6365 	}
6366       else
6367 	return FALSE;
6368 
6369     case MVE_VREV16:
6370       if (arm_decode_field (given, 18, 19) == 0)
6371 	return FALSE;
6372       else
6373 	{
6374 	  *undefined_code = UNDEF_SIZE_NOT_0;
6375 	  return TRUE;
6376 	}
6377 
6378     case MVE_VREV32:
6379       {
6380 	unsigned long size = arm_decode_field (given, 18, 19);
6381 	if ((size & 2) == 2)
6382 	  {
6383 	    *undefined_code = UNDEF_SIZE_2;
6384 	    return TRUE;
6385 	  }
6386 	else
6387 	  return FALSE;
6388       }
6389 
6390     case MVE_VREV64:
6391       if (arm_decode_field (given, 18, 19) != 3)
6392 	return FALSE;
6393       else
6394 	{
6395 	  *undefined_code = UNDEF_SIZE_3;
6396 	  return TRUE;
6397 	}
6398 
6399     default:
6400       return FALSE;
6401     }
6402 }
6403 
6404 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
6405    Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
6406    why this encoding is unpredictable.  */
6407 
6408 static bfd_boolean
6409 is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn,
6410 		      enum mve_unpredictable *unpredictable_code)
6411 {
6412   *unpredictable_code = UNPRED_NONE;
6413 
6414   switch (matched_insn)
6415     {
6416     case MVE_VCMP_FP_T2:
6417     case MVE_VPT_FP_T2:
6418       if ((arm_decode_field (given, 12, 12) == 0)
6419 	  && (arm_decode_field (given, 5, 5) == 1))
6420 	{
6421 	  *unpredictable_code = UNPRED_FCA_0_FCB_1;
6422 	  return TRUE;
6423 	}
6424       else
6425 	return FALSE;
6426 
6427     case MVE_VPT_VEC_T4:
6428     case MVE_VPT_VEC_T5:
6429     case MVE_VPT_VEC_T6:
6430     case MVE_VCMP_VEC_T4:
6431     case MVE_VCMP_VEC_T5:
6432     case MVE_VCMP_VEC_T6:
6433       if (arm_decode_field (given, 0, 3) == 0xd)
6434 	{
6435 	  *unpredictable_code = UNPRED_R13;
6436 	  return TRUE;
6437 	}
6438       else
6439 	return FALSE;
6440 
6441     case MVE_VDUP:
6442       {
6443 	unsigned long gpr = arm_decode_field (given, 12, 15);
6444 	if (gpr == 0xd)
6445 	  {
6446 	    *unpredictable_code = UNPRED_R13;
6447 	    return TRUE;
6448 	  }
6449 	else if (gpr == 0xf)
6450 	  {
6451 	    *unpredictable_code = UNPRED_R15;
6452 	    return TRUE;
6453 	  }
6454 
6455 	return FALSE;
6456       }
6457 
6458     case MVE_VQADD_T2:
6459     case MVE_VQSUB_T2:
6460     case MVE_VMUL_FP_T2:
6461     case MVE_VMUL_VEC_T2:
6462     case MVE_VMLA:
6463     case MVE_VBRSR:
6464     case MVE_VADD_FP_T2:
6465     case MVE_VSUB_FP_T2:
6466     case MVE_VADD_VEC_T2:
6467     case MVE_VSUB_VEC_T2:
6468     case MVE_VQRSHL_T2:
6469     case MVE_VQSHL_T1:
6470     case MVE_VRSHL_T2:
6471     case MVE_VSHL_T2:
6472     case MVE_VSHLC:
6473     case MVE_VQDMLAH:
6474     case MVE_VQRDMLAH:
6475     case MVE_VQDMLASH:
6476     case MVE_VQRDMLASH:
6477     case MVE_VQDMULH_T3:
6478     case MVE_VQRDMULH_T4:
6479     case MVE_VMLAS:
6480     case MVE_VFMA_FP_SCALAR:
6481     case MVE_VFMAS_FP_SCALAR:
6482     case MVE_VHADD_T2:
6483     case MVE_VHSUB_T2:
6484       {
6485 	unsigned long gpr = arm_decode_field (given, 0, 3);
6486 	if (gpr == 0xd)
6487 	  {
6488 	    *unpredictable_code = UNPRED_R13;
6489 	    return TRUE;
6490 	  }
6491 	else if (gpr == 0xf)
6492 	  {
6493 	    *unpredictable_code = UNPRED_R15;
6494 	    return TRUE;
6495 	  }
6496 
6497 	return FALSE;
6498       }
6499 
6500     case MVE_VLD2:
6501     case MVE_VST2:
6502       {
6503 	unsigned long rn = arm_decode_field (given, 16, 19);
6504 
6505 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6506 	  {
6507 	    *unpredictable_code = UNPRED_R13_AND_WB;
6508 	    return TRUE;
6509 	  }
6510 
6511 	if (rn == 0xf)
6512 	  {
6513 	    *unpredictable_code = UNPRED_R15;
6514 	    return TRUE;
6515 	  }
6516 
6517 	if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 6)
6518 	  {
6519 	    *unpredictable_code = UNPRED_Q_GT_6;
6520 	    return TRUE;
6521 	  }
6522 	else
6523 	  return FALSE;
6524       }
6525 
6526     case MVE_VLD4:
6527     case MVE_VST4:
6528       {
6529 	unsigned long rn = arm_decode_field (given, 16, 19);
6530 
6531 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6532 	  {
6533 	    *unpredictable_code = UNPRED_R13_AND_WB;
6534 	    return TRUE;
6535 	  }
6536 
6537 	if (rn == 0xf)
6538 	  {
6539 	    *unpredictable_code = UNPRED_R15;
6540 	    return TRUE;
6541 	  }
6542 
6543 	if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 4)
6544 	  {
6545 	    *unpredictable_code = UNPRED_Q_GT_4;
6546 	    return TRUE;
6547 	  }
6548 	else
6549 	  return FALSE;
6550       }
6551 
6552     case MVE_VLDRB_T5:
6553     case MVE_VLDRH_T6:
6554     case MVE_VLDRW_T7:
6555     case MVE_VSTRB_T5:
6556     case MVE_VSTRH_T6:
6557     case MVE_VSTRW_T7:
6558       {
6559 	unsigned long rn = arm_decode_field (given, 16, 19);
6560 
6561 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
6562 	  {
6563 	    *unpredictable_code = UNPRED_R13_AND_WB;
6564 	    return TRUE;
6565 	  }
6566 	else if (rn == 0xf)
6567 	  {
6568 	    *unpredictable_code = UNPRED_R15;
6569 	    return TRUE;
6570 	  }
6571 	else
6572 	  return FALSE;
6573       }
6574 
6575     case MVE_VLDRB_GATHER_T1:
6576       if (arm_decode_field (given, 0, 0) == 1)
6577 	{
6578 	  *unpredictable_code = UNPRED_OS;
6579 	  return TRUE;
6580 	}
6581 
6582       /*  fall through.  */
6583       /* To handle common code with T2-T4 variants.  */
6584     case MVE_VLDRH_GATHER_T2:
6585     case MVE_VLDRW_GATHER_T3:
6586     case MVE_VLDRD_GATHER_T4:
6587       {
6588 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6589 	unsigned long qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6590 
6591 	if (qd == qm)
6592 	  {
6593 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6594 	    return TRUE;
6595 	  }
6596 
6597 	if (arm_decode_field (given, 16, 19) == 0xf)
6598 	  {
6599 	    *unpredictable_code = UNPRED_R15;
6600 	    return TRUE;
6601 	  }
6602 
6603 	return FALSE;
6604       }
6605 
6606     case MVE_VLDRW_GATHER_T5:
6607     case MVE_VLDRD_GATHER_T6:
6608       {
6609 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6610 	unsigned long qm = arm_decode_field_multiple (given, 17, 19, 7, 7);
6611 
6612 	if (qd == qm)
6613 	  {
6614 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6615 	    return TRUE;
6616 	  }
6617 	else
6618 	  return FALSE;
6619       }
6620 
6621     case MVE_VSTRB_SCATTER_T1:
6622       if (arm_decode_field (given, 16, 19) == 0xf)
6623 	{
6624 	  *unpredictable_code = UNPRED_R15;
6625 	  return TRUE;
6626 	}
6627       else if (arm_decode_field (given, 0, 0) == 1)
6628 	{
6629 	  *unpredictable_code = UNPRED_OS;
6630 	  return TRUE;
6631 	}
6632       else
6633 	return FALSE;
6634 
6635     case MVE_VSTRH_SCATTER_T2:
6636     case MVE_VSTRW_SCATTER_T3:
6637     case MVE_VSTRD_SCATTER_T4:
6638       if (arm_decode_field (given, 16, 19) == 0xf)
6639 	{
6640 	  *unpredictable_code = UNPRED_R15;
6641 	  return TRUE;
6642 	}
6643       else
6644 	return FALSE;
6645 
6646     case MVE_VMOV2_VEC_LANE_TO_GP:
6647     case MVE_VMOV2_GP_TO_VEC_LANE:
6648     case MVE_VCVT_BETWEEN_FP_INT:
6649     case MVE_VCVT_FROM_FP_TO_INT:
6650       {
6651 	unsigned long rt = arm_decode_field (given, 0, 3);
6652 	unsigned long rt2 = arm_decode_field (given, 16, 19);
6653 
6654 	if ((rt == 0xd) || (rt2 == 0xd))
6655 	  {
6656 	    *unpredictable_code = UNPRED_R13;
6657 	    return TRUE;
6658 	  }
6659 	else if ((rt == 0xf) || (rt2 == 0xf))
6660 	  {
6661 	    *unpredictable_code = UNPRED_R15;
6662 	    return TRUE;
6663 	  }
6664 	else if (rt == rt2)
6665 	  {
6666 	    *unpredictable_code = UNPRED_GP_REGS_EQUAL;
6667 	    return TRUE;
6668 	  }
6669 
6670 	return FALSE;
6671       }
6672 
6673     case MVE_VMAXV:
6674     case MVE_VMAXAV:
6675     case MVE_VMAXNMV_FP:
6676     case MVE_VMAXNMAV_FP:
6677     case MVE_VMINNMV_FP:
6678     case MVE_VMINNMAV_FP:
6679     case MVE_VMINV:
6680     case MVE_VMINAV:
6681     case MVE_VABAV:
6682     case MVE_VMOV_HFP_TO_GP:
6683     case MVE_VMOV_GP_TO_VEC_LANE:
6684     case MVE_VMOV_VEC_LANE_TO_GP:
6685       {
6686 	unsigned long rda = arm_decode_field (given, 12, 15);
6687 	if (rda == 0xd)
6688 	  {
6689 	    *unpredictable_code = UNPRED_R13;
6690 	    return TRUE;
6691 	  }
6692 	else if (rda == 0xf)
6693 	  {
6694 	    *unpredictable_code = UNPRED_R15;
6695 	    return TRUE;
6696 	  }
6697 
6698 	return FALSE;
6699       }
6700 
6701     case MVE_VMULL_INT:
6702       {
6703 	unsigned long Qd;
6704 	unsigned long Qm;
6705 	unsigned long Qn;
6706 
6707 	if (arm_decode_field (given, 20, 21) == 2)
6708 	  {
6709 	    Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6710 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6711 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6712 
6713 	    if ((Qd == Qn) || (Qd == Qm))
6714 	      {
6715 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
6716 		return TRUE;
6717 	      }
6718 	    else
6719 	      return FALSE;
6720 	  }
6721 	else
6722 	  return FALSE;
6723       }
6724 
6725     case MVE_VCMUL_FP:
6726     case MVE_VQDMULL_T1:
6727       {
6728 	unsigned long Qd;
6729 	unsigned long Qm;
6730 	unsigned long Qn;
6731 
6732 	if (arm_decode_field (given, 28, 28) == 1)
6733 	  {
6734 	    Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6735 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6736 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6737 
6738 	    if ((Qd == Qn) || (Qd == Qm))
6739 	      {
6740 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6741 		return TRUE;
6742 	      }
6743 	    else
6744 	      return FALSE;
6745 	  }
6746 	else
6747 	  return FALSE;
6748       }
6749 
6750     case MVE_VQDMULL_T2:
6751       {
6752 	unsigned long gpr = arm_decode_field (given, 0, 3);
6753 	if (gpr == 0xd)
6754 	  {
6755 	    *unpredictable_code = UNPRED_R13;
6756 	    return TRUE;
6757 	  }
6758 	else if (gpr == 0xf)
6759 	  {
6760 	    *unpredictable_code = UNPRED_R15;
6761 	    return TRUE;
6762 	  }
6763 
6764 	if (arm_decode_field (given, 28, 28) == 1)
6765 	  {
6766 	    unsigned long Qd
6767 	      = arm_decode_field_multiple (given, 13, 15, 22, 22);
6768 	    unsigned long Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6769 
6770 	    if (Qd == Qn)
6771 	      {
6772 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6773 		return TRUE;
6774 	      }
6775 	    else
6776 	      return FALSE;
6777 	  }
6778 
6779 	return FALSE;
6780       }
6781 
6782     case MVE_VMLSLDAV:
6783     case MVE_VRMLSLDAVH:
6784     case MVE_VMLALDAV:
6785     case MVE_VADDLV:
6786       if (arm_decode_field (given, 20, 22) == 6)
6787 	{
6788 	  *unpredictable_code = UNPRED_R13;
6789 	  return TRUE;
6790 	}
6791       else
6792 	return FALSE;
6793 
6794     case MVE_VDWDUP:
6795     case MVE_VIWDUP:
6796       if (arm_decode_field (given, 1, 3) == 6)
6797 	{
6798 	  *unpredictable_code = UNPRED_R13;
6799 	  return TRUE;
6800 	}
6801       else
6802 	return FALSE;
6803 
6804     case MVE_VCADD_VEC:
6805     case MVE_VHCADD:
6806       {
6807 	unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6808 	unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6809 	if ((Qd == Qm) && arm_decode_field (given, 20, 21) == 2)
6810 	  {
6811 	    *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
6812 	    return TRUE;
6813 	  }
6814 	else
6815 	  return FALSE;
6816       }
6817 
6818     case MVE_VCADD_FP:
6819       {
6820 	unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6821 	unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6822 	if ((Qd == Qm) && arm_decode_field (given, 20, 20) == 1)
6823 	  {
6824 	    *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6825 	    return TRUE;
6826 	  }
6827 	else
6828 	  return FALSE;
6829       }
6830 
6831     case MVE_VCMLA_FP:
6832       {
6833 	unsigned long Qda;
6834 	unsigned long Qm;
6835 	unsigned long Qn;
6836 
6837 	if (arm_decode_field (given, 20, 20) == 1)
6838 	  {
6839 	    Qda = arm_decode_field_multiple (given, 13, 15, 22, 22);
6840 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
6841 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
6842 
6843 	    if ((Qda == Qn) || (Qda == Qm))
6844 	      {
6845 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
6846 		return TRUE;
6847 	      }
6848 	    else
6849 	      return FALSE;
6850 	  }
6851 	else
6852 	  return FALSE;
6853 
6854       }
6855 
6856     case MVE_VCTP:
6857       if (arm_decode_field (given, 16, 19) == 0xd)
6858 	{
6859 	  *unpredictable_code = UNPRED_R13;
6860 	  return TRUE;
6861 	}
6862       else
6863 	return FALSE;
6864 
6865     case MVE_VREV64:
6866       {
6867 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
6868 	unsigned long qm = arm_decode_field_multiple (given, 1, 3, 6, 6);
6869 
6870 	if (qd == qm)
6871 	  {
6872 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
6873 	    return TRUE;
6874 	  }
6875 	else
6876 	  return FALSE;
6877       }
6878 
6879     case MVE_LSLL:
6880     case MVE_LSLLI:
6881     case MVE_LSRL:
6882     case MVE_ASRL:
6883     case MVE_ASRLI:
6884     case MVE_UQSHLL:
6885     case MVE_UQRSHLL:
6886     case MVE_URSHRL:
6887     case MVE_SRSHRL:
6888     case MVE_SQSHLL:
6889     case MVE_SQRSHRL:
6890       {
6891 	unsigned long gpr = arm_decode_field (given, 9, 11);
6892 	gpr = ((gpr << 1) | 1);
6893 	if (gpr == 0xd)
6894 	  {
6895 	    *unpredictable_code = UNPRED_R13;
6896 	    return TRUE;
6897 	  }
6898 	else if (gpr == 0xf)
6899 	  {
6900 	    *unpredictable_code = UNPRED_R15;
6901 	    return TRUE;
6902 	  }
6903 
6904 	return FALSE;
6905       }
6906 
6907     default:
6908       return FALSE;
6909     }
6910 }
6911 
6912 static void
6913 print_mve_vmov_index (struct disassemble_info *info, unsigned long given)
6914 {
6915   unsigned long op1 = arm_decode_field (given, 21, 22);
6916   unsigned long op2 = arm_decode_field (given, 5, 6);
6917   unsigned long h = arm_decode_field (given, 16, 16);
6918   unsigned long index_operand, esize, targetBeat, idx;
6919   void *stream = info->stream;
6920   fprintf_ftype func = info->fprintf_func;
6921 
6922   if ((op1 & 0x2) == 0x2)
6923     {
6924       index_operand = op2;
6925       esize = 8;
6926     }
6927   else if (((op1 & 0x2) == 0x0) && ((op2 & 0x1) == 0x1))
6928     {
6929       index_operand = op2  >> 1;
6930       esize = 16;
6931     }
6932   else if (((op1 & 0x2) == 0) && ((op2 & 0x3) == 0))
6933     {
6934       index_operand = 0;
6935       esize = 32;
6936     }
6937   else
6938     {
6939       func (stream, "<undefined index>");
6940       return;
6941     }
6942 
6943   targetBeat =  (op1 & 0x1) | (h << 1);
6944   idx = index_operand + targetBeat * (32/esize);
6945 
6946   func (stream, "%lu", idx);
6947 }
6948 
6949 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
6950    in length and integer of floating-point type.  */
6951 static void
6952 print_simd_imm8 (struct disassemble_info *info, unsigned long given,
6953 		 unsigned int ibit_loc, const struct mopcode32 *insn)
6954 {
6955   int bits = 0;
6956   int cmode = (given >> 8) & 0xf;
6957   int op = (given >> 5) & 0x1;
6958   unsigned long value = 0, hival = 0;
6959   unsigned shift;
6960   int size = 0;
6961   int isfloat = 0;
6962   void *stream = info->stream;
6963   fprintf_ftype func = info->fprintf_func;
6964 
6965   /* On Neon the 'i' bit is at bit 24, on mve it is
6966      at bit 28.  */
6967   bits |= ((given >> ibit_loc) & 1) << 7;
6968   bits |= ((given >> 16) & 7) << 4;
6969   bits |= ((given >> 0) & 15) << 0;
6970 
6971   if (cmode < 8)
6972     {
6973       shift = (cmode >> 1) & 3;
6974       value = (unsigned long) bits << (8 * shift);
6975       size = 32;
6976     }
6977   else if (cmode < 12)
6978     {
6979       shift = (cmode >> 1) & 1;
6980       value = (unsigned long) bits << (8 * shift);
6981       size = 16;
6982     }
6983   else if (cmode < 14)
6984     {
6985       shift = (cmode & 1) + 1;
6986       value = (unsigned long) bits << (8 * shift);
6987       value |= (1ul << (8 * shift)) - 1;
6988       size = 32;
6989     }
6990   else if (cmode == 14)
6991     {
6992       if (op)
6993 	{
6994 	  /* Bit replication into bytes.  */
6995 	  int ix;
6996 	  unsigned long mask;
6997 
6998 	  value = 0;
6999 	  hival = 0;
7000 	  for (ix = 7; ix >= 0; ix--)
7001 	    {
7002 	      mask = ((bits >> ix) & 1) ? 0xff : 0;
7003 	      if (ix <= 3)
7004 		value = (value << 8) | mask;
7005 	      else
7006 		hival = (hival << 8) | mask;
7007 	    }
7008 	  size = 64;
7009 	}
7010       else
7011 	{
7012 	  /* Byte replication.  */
7013 	  value = (unsigned long) bits;
7014 	  size = 8;
7015 	}
7016     }
7017   else if (!op)
7018     {
7019       /* Floating point encoding.  */
7020       int tmp;
7021 
7022       value = (unsigned long)  (bits & 0x7f) << 19;
7023       value |= (unsigned long) (bits & 0x80) << 24;
7024       tmp = bits & 0x40 ? 0x3c : 0x40;
7025       value |= (unsigned long) tmp << 24;
7026       size = 32;
7027       isfloat = 1;
7028     }
7029   else
7030     {
7031       func (stream, "<illegal constant %.8x:%x:%x>",
7032 	    bits, cmode, op);
7033       size = 32;
7034       return;
7035     }
7036 
7037   /* printU determines whether the immediate value should be printed as
7038      unsigned.  */
7039   unsigned printU = 0;
7040   switch (insn->mve_op)
7041     {
7042     default:
7043       break;
7044     /* We want this for instructions that don't have a 'signed' type.  */
7045     case MVE_VBIC_IMM:
7046     case MVE_VORR_IMM:
7047     case MVE_VMVN_IMM:
7048     case MVE_VMOV_IMM_TO_VEC:
7049       printU = 1;
7050       break;
7051     }
7052   switch (size)
7053     {
7054     case 8:
7055       func (stream, "#%ld\t; 0x%.2lx", value, value);
7056       break;
7057 
7058     case 16:
7059       func (stream,
7060 	    printU
7061 	    ? "#%lu\t; 0x%.4lx"
7062 	    : "#%ld\t; 0x%.4lx", value, value);
7063       break;
7064 
7065     case 32:
7066       if (isfloat)
7067 	{
7068 	  unsigned char valbytes[4];
7069 	  double fvalue;
7070 
7071 	  /* Do this a byte at a time so we don't have to
7072 	     worry about the host's endianness.  */
7073 	  valbytes[0] = value & 0xff;
7074 	  valbytes[1] = (value >> 8) & 0xff;
7075 	  valbytes[2] = (value >> 16) & 0xff;
7076 	  valbytes[3] = (value >> 24) & 0xff;
7077 
7078 	  floatformat_to_double
7079 	    (& floatformat_ieee_single_little, valbytes,
7080 	     & fvalue);
7081 
7082 	  func (stream, "#%.7g\t; 0x%.8lx", fvalue,
7083 		value);
7084 	}
7085       else
7086 	func (stream,
7087 	      printU
7088 	      ? "#%lu\t; 0x%.8lx"
7089 	      : "#%ld\t; 0x%.8lx",
7090 	      (long) (((value & 0x80000000L) != 0)
7091 		      && !printU
7092 		      ? value | ~0xffffffffL : value),
7093 	      value);
7094       break;
7095 
7096     case 64:
7097       func (stream, "#0x%.8lx%.8lx", hival, value);
7098       break;
7099 
7100     default:
7101       abort ();
7102     }
7103 
7104 }
7105 
7106 static void
7107 print_mve_undefined (struct disassemble_info *info,
7108 		     enum mve_undefined undefined_code)
7109 {
7110   void *stream = info->stream;
7111   fprintf_ftype func = info->fprintf_func;
7112 
7113   func (stream, "\t\tundefined instruction: ");
7114 
7115   switch (undefined_code)
7116     {
7117     case UNDEF_SIZE:
7118       func (stream, "illegal size");
7119       break;
7120 
7121     case UNDEF_SIZE_0:
7122       func (stream, "size equals zero");
7123       break;
7124 
7125     case UNDEF_SIZE_2:
7126       func (stream, "size equals two");
7127       break;
7128 
7129     case UNDEF_SIZE_3:
7130       func (stream, "size equals three");
7131       break;
7132 
7133     case UNDEF_SIZE_LE_1:
7134       func (stream, "size <= 1");
7135       break;
7136 
7137     case UNDEF_SIZE_NOT_0:
7138       func (stream, "size not equal to 0");
7139       break;
7140 
7141     case UNDEF_SIZE_NOT_2:
7142       func (stream, "size not equal to 2");
7143       break;
7144 
7145     case UNDEF_SIZE_NOT_3:
7146       func (stream, "size not equal to 3");
7147       break;
7148 
7149     case UNDEF_NOT_UNS_SIZE_0:
7150       func (stream, "not unsigned and size = zero");
7151       break;
7152 
7153     case UNDEF_NOT_UNS_SIZE_1:
7154       func (stream, "not unsigned and size = one");
7155       break;
7156 
7157     case UNDEF_NOT_UNSIGNED:
7158       func (stream, "not unsigned");
7159       break;
7160 
7161     case UNDEF_VCVT_IMM6:
7162       func (stream, "invalid imm6");
7163       break;
7164 
7165     case UNDEF_VCVT_FSI_IMM6:
7166       func (stream, "fsi = 0 and invalid imm6");
7167       break;
7168 
7169     case UNDEF_BAD_OP1_OP2:
7170       func (stream, "bad size with op2 = 2 and op1 = 0 or 1");
7171       break;
7172 
7173     case UNDEF_BAD_U_OP1_OP2:
7174       func (stream, "unsigned with op2 = 0 and op1 = 0 or 1");
7175       break;
7176 
7177     case UNDEF_OP_0_BAD_CMODE:
7178       func (stream, "op field equal 0 and bad cmode");
7179       break;
7180 
7181     case UNDEF_XCHG_UNS:
7182       func (stream, "exchange and unsigned together");
7183       break;
7184 
7185     case UNDEF_NONE:
7186       break;
7187     }
7188 
7189 }
7190 
7191 static void
7192 print_mve_unpredictable (struct disassemble_info *info,
7193 			 enum mve_unpredictable unpredict_code)
7194 {
7195   void *stream = info->stream;
7196   fprintf_ftype func = info->fprintf_func;
7197 
7198   func (stream, "%s: ", UNPREDICTABLE_INSTRUCTION);
7199 
7200   switch (unpredict_code)
7201     {
7202     case UNPRED_IT_BLOCK:
7203       func (stream, "mve instruction in it block");
7204       break;
7205 
7206     case UNPRED_FCA_0_FCB_1:
7207       func (stream, "condition bits, fca = 0 and fcb = 1");
7208       break;
7209 
7210     case UNPRED_R13:
7211       func (stream, "use of r13 (sp)");
7212       break;
7213 
7214     case UNPRED_R15:
7215       func (stream, "use of r15 (pc)");
7216       break;
7217 
7218     case UNPRED_Q_GT_4:
7219       func (stream, "start register block > r4");
7220       break;
7221 
7222     case UNPRED_Q_GT_6:
7223       func (stream, "start register block > r6");
7224       break;
7225 
7226     case UNPRED_R13_AND_WB:
7227       func (stream, "use of r13 and write back");
7228       break;
7229 
7230     case UNPRED_Q_REGS_EQUAL:
7231       func (stream,
7232 	    "same vector register used for destination and other operand");
7233       break;
7234 
7235     case UNPRED_OS:
7236       func (stream, "use of offset scaled");
7237       break;
7238 
7239     case UNPRED_GP_REGS_EQUAL:
7240       func (stream, "same general-purpose register used for both operands");
7241       break;
7242 
7243     case UNPRED_Q_REGS_EQ_AND_SIZE_1:
7244       func (stream, "use of identical q registers and size = 1");
7245       break;
7246 
7247     case UNPRED_Q_REGS_EQ_AND_SIZE_2:
7248       func (stream, "use of identical q registers and size = 1");
7249       break;
7250 
7251     case UNPRED_NONE:
7252       break;
7253     }
7254 }
7255 
7256 /* Print register block operand for mve vld2/vld4/vst2/vld4.  */
7257 
7258 static void
7259 print_mve_register_blocks (struct disassemble_info *info,
7260 			   unsigned long given,
7261 			   enum mve_instructions matched_insn)
7262 {
7263   void *stream = info->stream;
7264   fprintf_ftype func = info->fprintf_func;
7265 
7266   unsigned long q_reg_start = arm_decode_field_multiple (given,
7267 							 13, 15,
7268 							 22, 22);
7269   switch (matched_insn)
7270     {
7271     case MVE_VLD2:
7272     case MVE_VST2:
7273       if (q_reg_start <= 6)
7274 	func (stream, "{q%ld, q%ld}", q_reg_start, q_reg_start + 1);
7275       else
7276 	func (stream, "<illegal reg q%ld>", q_reg_start);
7277       break;
7278 
7279     case MVE_VLD4:
7280     case MVE_VST4:
7281       if (q_reg_start <= 4)
7282 	func (stream, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start,
7283 	      q_reg_start + 1, q_reg_start + 2,
7284 	      q_reg_start + 3);
7285       else
7286 	func (stream, "<illegal reg q%ld>", q_reg_start);
7287       break;
7288 
7289     default:
7290       break;
7291     }
7292 }
7293 
7294 static void
7295 print_mve_rounding_mode (struct disassemble_info *info,
7296 			 unsigned long given,
7297 			 enum mve_instructions matched_insn)
7298 {
7299   void *stream = info->stream;
7300   fprintf_ftype func = info->fprintf_func;
7301 
7302   switch (matched_insn)
7303     {
7304     case MVE_VCVT_FROM_FP_TO_INT:
7305       {
7306 	switch (arm_decode_field (given, 8, 9))
7307 	  {
7308 	  case 0:
7309 	    func (stream, "a");
7310 	    break;
7311 
7312 	  case 1:
7313 	    func (stream, "n");
7314 	    break;
7315 
7316 	  case 2:
7317 	    func (stream, "p");
7318 	    break;
7319 
7320 	  case 3:
7321 	    func (stream, "m");
7322 	    break;
7323 
7324 	  default:
7325 	    break;
7326 	  }
7327       }
7328       break;
7329 
7330     case MVE_VRINT_FP:
7331       {
7332 	switch (arm_decode_field (given, 7, 9))
7333 	  {
7334 	  case 0:
7335 	    func (stream, "n");
7336 	    break;
7337 
7338 	  case 1:
7339 	    func (stream, "x");
7340 	    break;
7341 
7342 	  case 2:
7343 	    func (stream, "a");
7344 	    break;
7345 
7346 	  case 3:
7347 	    func (stream, "z");
7348 	    break;
7349 
7350 	  case 5:
7351 	    func (stream, "m");
7352 	    break;
7353 
7354 	  case 7:
7355 	    func (stream, "p");
7356 
7357 	  case 4:
7358 	  case 6:
7359 	  default:
7360 	    break;
7361 	  }
7362       }
7363       break;
7364 
7365     default:
7366       break;
7367     }
7368 }
7369 
7370 static void
7371 print_mve_vcvt_size (struct disassemble_info *info,
7372 		     unsigned long given,
7373 		     enum mve_instructions matched_insn)
7374 {
7375   unsigned long mode = 0;
7376   void *stream = info->stream;
7377   fprintf_ftype func = info->fprintf_func;
7378 
7379   switch (matched_insn)
7380     {
7381     case MVE_VCVT_FP_FIX_VEC:
7382       {
7383 	mode = (((given & 0x200) >> 7)
7384 		| ((given & 0x10000000) >> 27)
7385 		| ((given & 0x100) >> 8));
7386 
7387 	switch (mode)
7388 	  {
7389 	  case 0:
7390 	    func (stream, "f16.s16");
7391 	    break;
7392 
7393 	  case 1:
7394 	    func (stream, "s16.f16");
7395 	    break;
7396 
7397 	  case 2:
7398 	    func (stream, "f16.u16");
7399 	    break;
7400 
7401 	  case 3:
7402 	    func (stream, "u16.f16");
7403 	    break;
7404 
7405 	  case 4:
7406 	    func (stream, "f32.s32");
7407 	    break;
7408 
7409 	  case 5:
7410 	    func (stream, "s32.f32");
7411 	    break;
7412 
7413 	  case 6:
7414 	    func (stream, "f32.u32");
7415 	    break;
7416 
7417 	  case 7:
7418 	    func (stream, "u32.f32");
7419 	    break;
7420 
7421 	  default:
7422 	    break;
7423 	  }
7424 	break;
7425       }
7426     case MVE_VCVT_BETWEEN_FP_INT:
7427       {
7428 	unsigned long size = arm_decode_field (given, 18, 19);
7429 	unsigned long op = arm_decode_field (given, 7, 8);
7430 
7431 	if (size == 1)
7432 	  {
7433 	    switch (op)
7434 	      {
7435 	      case 0:
7436 		func (stream, "f16.s16");
7437 		break;
7438 
7439 	      case 1:
7440 		func (stream, "f16.u16");
7441 		break;
7442 
7443 	      case 2:
7444 		func (stream, "s16.f16");
7445 		break;
7446 
7447 	      case 3:
7448 		func (stream, "u16.f16");
7449 		break;
7450 
7451 	      default:
7452 		break;
7453 	      }
7454 	  }
7455 	else if (size == 2)
7456 	  {
7457 	    switch (op)
7458 	      {
7459 	      case 0:
7460 		func (stream, "f32.s32");
7461 		break;
7462 
7463 	      case 1:
7464 		func (stream, "f32.u32");
7465 		break;
7466 
7467 	      case 2:
7468 		func (stream, "s32.f32");
7469 		break;
7470 
7471 	      case 3:
7472 		func (stream, "u32.f32");
7473 		break;
7474 	      }
7475 	  }
7476       }
7477       break;
7478 
7479     case MVE_VCVT_FP_HALF_FP:
7480       {
7481 	unsigned long op = arm_decode_field (given, 28, 28);
7482 	if (op == 0)
7483 	  func (stream, "f16.f32");
7484 	else if (op == 1)
7485 	  func (stream, "f32.f16");
7486       }
7487       break;
7488 
7489     case MVE_VCVT_FROM_FP_TO_INT:
7490       {
7491 	unsigned long size = arm_decode_field_multiple (given, 7, 7, 18, 19);
7492 
7493 	switch (size)
7494 	  {
7495 	  case 2:
7496 	    func (stream, "s16.f16");
7497 	    break;
7498 
7499 	  case 3:
7500 	    func (stream, "u16.f16");
7501 	    break;
7502 
7503 	  case 4:
7504 	    func (stream, "s32.f32");
7505 	    break;
7506 
7507 	  case 5:
7508 	    func (stream, "u32.f32");
7509 	    break;
7510 
7511 	  default:
7512 	    break;
7513 	  }
7514       }
7515       break;
7516 
7517     default:
7518       break;
7519     }
7520 }
7521 
7522 static void
7523 print_mve_rotate (struct disassemble_info *info, unsigned long rot,
7524 		  unsigned long rot_width)
7525 {
7526   void *stream = info->stream;
7527   fprintf_ftype func = info->fprintf_func;
7528 
7529   if (rot_width == 1)
7530     {
7531       switch (rot)
7532 	{
7533 	case 0:
7534 	  func (stream, "90");
7535 	  break;
7536 	case 1:
7537 	  func (stream, "270");
7538 	  break;
7539 	default:
7540 	  break;
7541 	}
7542     }
7543   else if (rot_width == 2)
7544     {
7545       switch (rot)
7546 	{
7547 	case 0:
7548 	  func (stream, "0");
7549 	  break;
7550 	case 1:
7551 	  func (stream, "90");
7552 	  break;
7553 	case 2:
7554 	  func (stream, "180");
7555 	  break;
7556 	case 3:
7557 	  func (stream, "270");
7558 	  break;
7559 	default:
7560 	  break;
7561 	}
7562     }
7563 }
7564 
7565 static void
7566 print_instruction_predicate (struct disassemble_info *info)
7567 {
7568   void *stream = info->stream;
7569   fprintf_ftype func = info->fprintf_func;
7570 
7571   if (vpt_block_state.next_pred_state == PRED_THEN)
7572     func (stream, "t");
7573   else if (vpt_block_state.next_pred_state == PRED_ELSE)
7574     func (stream, "e");
7575 }
7576 
7577 static void
7578 print_mve_size (struct disassemble_info *info,
7579 		unsigned long size,
7580 		enum mve_instructions matched_insn)
7581 {
7582   void *stream = info->stream;
7583   fprintf_ftype func = info->fprintf_func;
7584 
7585   switch (matched_insn)
7586     {
7587     case MVE_VABAV:
7588     case MVE_VABD_VEC:
7589     case MVE_VABS_FP:
7590     case MVE_VABS_VEC:
7591     case MVE_VADD_VEC_T1:
7592     case MVE_VADD_VEC_T2:
7593     case MVE_VADDV:
7594     case MVE_VBRSR:
7595     case MVE_VCADD_VEC:
7596     case MVE_VCLS:
7597     case MVE_VCLZ:
7598     case MVE_VCMP_VEC_T1:
7599     case MVE_VCMP_VEC_T2:
7600     case MVE_VCMP_VEC_T3:
7601     case MVE_VCMP_VEC_T4:
7602     case MVE_VCMP_VEC_T5:
7603     case MVE_VCMP_VEC_T6:
7604     case MVE_VCTP:
7605     case MVE_VDDUP:
7606     case MVE_VDWDUP:
7607     case MVE_VHADD_T1:
7608     case MVE_VHADD_T2:
7609     case MVE_VHCADD:
7610     case MVE_VHSUB_T1:
7611     case MVE_VHSUB_T2:
7612     case MVE_VIDUP:
7613     case MVE_VIWDUP:
7614     case MVE_VLD2:
7615     case MVE_VLD4:
7616     case MVE_VLDRB_GATHER_T1:
7617     case MVE_VLDRH_GATHER_T2:
7618     case MVE_VLDRW_GATHER_T3:
7619     case MVE_VLDRD_GATHER_T4:
7620     case MVE_VLDRB_T1:
7621     case MVE_VLDRH_T2:
7622     case MVE_VMAX:
7623     case MVE_VMAXA:
7624     case MVE_VMAXV:
7625     case MVE_VMAXAV:
7626     case MVE_VMIN:
7627     case MVE_VMINA:
7628     case MVE_VMINV:
7629     case MVE_VMINAV:
7630     case MVE_VMLA:
7631     case MVE_VMLAS:
7632     case MVE_VMUL_VEC_T1:
7633     case MVE_VMUL_VEC_T2:
7634     case MVE_VMULH:
7635     case MVE_VRMULH:
7636     case MVE_VMULL_INT:
7637     case MVE_VNEG_FP:
7638     case MVE_VNEG_VEC:
7639     case MVE_VPT_VEC_T1:
7640     case MVE_VPT_VEC_T2:
7641     case MVE_VPT_VEC_T3:
7642     case MVE_VPT_VEC_T4:
7643     case MVE_VPT_VEC_T5:
7644     case MVE_VPT_VEC_T6:
7645     case MVE_VQABS:
7646     case MVE_VQADD_T1:
7647     case MVE_VQADD_T2:
7648     case MVE_VQDMLADH:
7649     case MVE_VQRDMLADH:
7650     case MVE_VQDMLAH:
7651     case MVE_VQRDMLAH:
7652     case MVE_VQDMLASH:
7653     case MVE_VQRDMLASH:
7654     case MVE_VQDMLSDH:
7655     case MVE_VQRDMLSDH:
7656     case MVE_VQDMULH_T1:
7657     case MVE_VQRDMULH_T2:
7658     case MVE_VQDMULH_T3:
7659     case MVE_VQRDMULH_T4:
7660     case MVE_VQNEG:
7661     case MVE_VQRSHL_T1:
7662     case MVE_VQRSHL_T2:
7663     case MVE_VQSHL_T1:
7664     case MVE_VQSHL_T4:
7665     case MVE_VQSUB_T1:
7666     case MVE_VQSUB_T2:
7667     case MVE_VREV32:
7668     case MVE_VREV64:
7669     case MVE_VRHADD:
7670     case MVE_VRINT_FP:
7671     case MVE_VRSHL_T1:
7672     case MVE_VRSHL_T2:
7673     case MVE_VSHL_T2:
7674     case MVE_VSHL_T3:
7675     case MVE_VSHLL_T2:
7676     case MVE_VST2:
7677     case MVE_VST4:
7678     case MVE_VSTRB_SCATTER_T1:
7679     case MVE_VSTRH_SCATTER_T2:
7680     case MVE_VSTRW_SCATTER_T3:
7681     case MVE_VSTRB_T1:
7682     case MVE_VSTRH_T2:
7683     case MVE_VSUB_VEC_T1:
7684     case MVE_VSUB_VEC_T2:
7685       if (size <= 3)
7686 	func (stream, "%s", mve_vec_sizename[size]);
7687       else
7688 	func (stream, "<undef size>");
7689       break;
7690 
7691     case MVE_VABD_FP:
7692     case MVE_VADD_FP_T1:
7693     case MVE_VADD_FP_T2:
7694     case MVE_VSUB_FP_T1:
7695     case MVE_VSUB_FP_T2:
7696     case MVE_VCMP_FP_T1:
7697     case MVE_VCMP_FP_T2:
7698     case MVE_VFMA_FP_SCALAR:
7699     case MVE_VFMA_FP:
7700     case MVE_VFMS_FP:
7701     case MVE_VFMAS_FP_SCALAR:
7702     case MVE_VMAXNM_FP:
7703     case MVE_VMAXNMA_FP:
7704     case MVE_VMAXNMV_FP:
7705     case MVE_VMAXNMAV_FP:
7706     case MVE_VMINNM_FP:
7707     case MVE_VMINNMA_FP:
7708     case MVE_VMINNMV_FP:
7709     case MVE_VMINNMAV_FP:
7710     case MVE_VMUL_FP_T1:
7711     case MVE_VMUL_FP_T2:
7712     case MVE_VPT_FP_T1:
7713     case MVE_VPT_FP_T2:
7714       if (size == 0)
7715 	func (stream, "32");
7716       else if (size == 1)
7717 	func (stream, "16");
7718       break;
7719 
7720     case MVE_VCADD_FP:
7721     case MVE_VCMLA_FP:
7722     case MVE_VCMUL_FP:
7723     case MVE_VMLADAV_T1:
7724     case MVE_VMLALDAV:
7725     case MVE_VMLSDAV_T1:
7726     case MVE_VMLSLDAV:
7727     case MVE_VMOVN:
7728     case MVE_VQDMULL_T1:
7729     case MVE_VQDMULL_T2:
7730     case MVE_VQMOVN:
7731     case MVE_VQMOVUN:
7732       if (size == 0)
7733 	func (stream, "16");
7734       else if (size == 1)
7735 	func (stream, "32");
7736       break;
7737 
7738     case MVE_VMOVL:
7739       if (size == 1)
7740 	func (stream, "8");
7741       else if (size == 2)
7742 	func (stream, "16");
7743       break;
7744 
7745     case MVE_VDUP:
7746       switch (size)
7747 	{
7748 	case 0:
7749 	  func (stream, "32");
7750 	  break;
7751 	case 1:
7752 	  func (stream, "16");
7753 	  break;
7754 	case 2:
7755 	  func (stream, "8");
7756 	  break;
7757 	default:
7758 	  break;
7759 	}
7760       break;
7761 
7762     case MVE_VMOV_GP_TO_VEC_LANE:
7763     case MVE_VMOV_VEC_LANE_TO_GP:
7764       switch (size)
7765 	{
7766 	case 0: case 4:
7767 	  func (stream, "32");
7768 	  break;
7769 
7770 	case 1: case 3:
7771 	case 5: case 7:
7772 	  func (stream, "16");
7773 	  break;
7774 
7775 	case 8: case 9: case 10: case 11:
7776 	case 12: case 13: case 14: case 15:
7777 	  func (stream, "8");
7778 	  break;
7779 
7780 	default:
7781 	  break;
7782 	}
7783       break;
7784 
7785     case MVE_VMOV_IMM_TO_VEC:
7786       switch (size)
7787 	{
7788 	case 0: case 4: case 8:
7789 	case 12: case 24: case 26:
7790 	  func (stream, "i32");
7791 	  break;
7792 	case 16: case 20:
7793 	  func (stream, "i16");
7794 	  break;
7795 	case 28:
7796 	  func (stream, "i8");
7797 	  break;
7798 	case 29:
7799 	  func (stream, "i64");
7800 	  break;
7801 	case 30:
7802 	  func (stream, "f32");
7803 	  break;
7804 	default:
7805 	  break;
7806 	}
7807       break;
7808 
7809     case MVE_VMULL_POLY:
7810       if (size == 0)
7811 	func (stream, "p8");
7812       else if (size == 1)
7813 	func (stream, "p16");
7814       break;
7815 
7816     case MVE_VMVN_IMM:
7817       switch (size)
7818 	{
7819 	case 0: case 2: case 4:
7820 	case 6: case 12: case 13:
7821 	  func (stream, "32");
7822 	  break;
7823 
7824 	case 8: case 10:
7825 	  func (stream, "16");
7826 	  break;
7827 
7828 	default:
7829 	  break;
7830 	}
7831       break;
7832 
7833     case MVE_VBIC_IMM:
7834     case MVE_VORR_IMM:
7835       switch (size)
7836 	{
7837 	case 1: case 3:
7838 	case 5: case 7:
7839 	  func (stream, "32");
7840 	  break;
7841 
7842 	case 9: case 11:
7843 	  func (stream, "16");
7844 	  break;
7845 
7846 	default:
7847 	  break;
7848 	}
7849       break;
7850 
7851     case MVE_VQSHRN:
7852     case MVE_VQSHRUN:
7853     case MVE_VQRSHRN:
7854     case MVE_VQRSHRUN:
7855     case MVE_VRSHRN:
7856     case MVE_VSHRN:
7857       {
7858 	switch (size)
7859 	{
7860 	case 1:
7861 	  func (stream, "16");
7862 	  break;
7863 
7864 	case 2: case 3:
7865 	  func (stream, "32");
7866 	  break;
7867 
7868 	default:
7869 	  break;
7870 	}
7871       }
7872       break;
7873 
7874     case MVE_VQSHL_T2:
7875     case MVE_VQSHLU_T3:
7876     case MVE_VRSHR:
7877     case MVE_VSHL_T1:
7878     case MVE_VSHLL_T1:
7879     case MVE_VSHR:
7880     case MVE_VSLI:
7881     case MVE_VSRI:
7882       {
7883 	switch (size)
7884 	{
7885 	case 1:
7886 	  func (stream, "8");
7887 	  break;
7888 
7889 	case 2: case 3:
7890 	  func (stream, "16");
7891 	  break;
7892 
7893 	case 4: case 5: case 6: case 7:
7894 	  func (stream, "32");
7895 	  break;
7896 
7897 	default:
7898 	  break;
7899 	}
7900       }
7901       break;
7902 
7903     default:
7904       break;
7905     }
7906 }
7907 
7908 static void
7909 print_mve_shift_n (struct disassemble_info *info, long given,
7910 		   enum mve_instructions matched_insn)
7911 {
7912   void *stream = info->stream;
7913   fprintf_ftype func = info->fprintf_func;
7914 
7915   int startAt0
7916     = matched_insn == MVE_VQSHL_T2
7917       || matched_insn == MVE_VQSHLU_T3
7918       || matched_insn == MVE_VSHL_T1
7919       || matched_insn == MVE_VSHLL_T1
7920       || matched_insn == MVE_VSLI;
7921 
7922   unsigned imm6 = (given & 0x3f0000) >> 16;
7923 
7924   if (matched_insn == MVE_VSHLL_T1)
7925     imm6 &= 0x1f;
7926 
7927   unsigned shiftAmount = 0;
7928   if ((imm6 & 0x20) != 0)
7929     shiftAmount = startAt0 ? imm6 - 32 : 64 - imm6;
7930   else if ((imm6 & 0x10) != 0)
7931     shiftAmount = startAt0 ? imm6 - 16 : 32 - imm6;
7932   else if ((imm6 & 0x08) != 0)
7933     shiftAmount = startAt0 ? imm6 - 8 : 16 - imm6;
7934   else
7935     print_mve_undefined (info, UNDEF_SIZE_0);
7936 
7937   func (stream, "%u", shiftAmount);
7938 }
7939 
7940 static void
7941 print_vec_condition (struct disassemble_info *info, long given,
7942 		     enum mve_instructions matched_insn)
7943 {
7944   void *stream = info->stream;
7945   fprintf_ftype func = info->fprintf_func;
7946   long vec_cond = 0;
7947 
7948   switch (matched_insn)
7949     {
7950     case MVE_VPT_FP_T1:
7951     case MVE_VCMP_FP_T1:
7952       vec_cond = (((given & 0x1000) >> 10)
7953 		  | ((given & 1) << 1)
7954 		  | ((given & 0x0080) >> 7));
7955       func (stream, "%s",vec_condnames[vec_cond]);
7956       break;
7957 
7958     case MVE_VPT_FP_T2:
7959     case MVE_VCMP_FP_T2:
7960       vec_cond = (((given & 0x1000) >> 10)
7961 		  | ((given & 0x0020) >> 4)
7962 		  | ((given & 0x0080) >> 7));
7963       func (stream, "%s",vec_condnames[vec_cond]);
7964       break;
7965 
7966     case MVE_VPT_VEC_T1:
7967     case MVE_VCMP_VEC_T1:
7968       vec_cond = (given & 0x0080) >> 7;
7969       func (stream, "%s",vec_condnames[vec_cond]);
7970       break;
7971 
7972     case MVE_VPT_VEC_T2:
7973     case MVE_VCMP_VEC_T2:
7974       vec_cond = 2 | ((given & 0x0080) >> 7);
7975       func (stream, "%s",vec_condnames[vec_cond]);
7976       break;
7977 
7978     case MVE_VPT_VEC_T3:
7979     case MVE_VCMP_VEC_T3:
7980       vec_cond = 4 | ((given & 1) << 1) | ((given & 0x0080) >> 7);
7981       func (stream, "%s",vec_condnames[vec_cond]);
7982       break;
7983 
7984     case MVE_VPT_VEC_T4:
7985     case MVE_VCMP_VEC_T4:
7986       vec_cond = (given & 0x0080) >> 7;
7987       func (stream, "%s",vec_condnames[vec_cond]);
7988       break;
7989 
7990     case MVE_VPT_VEC_T5:
7991     case MVE_VCMP_VEC_T5:
7992       vec_cond = 2 | ((given & 0x0080) >> 7);
7993       func (stream, "%s",vec_condnames[vec_cond]);
7994       break;
7995 
7996     case MVE_VPT_VEC_T6:
7997     case MVE_VCMP_VEC_T6:
7998       vec_cond = 4 | ((given & 0x0020) >> 4) | ((given & 0x0080) >> 7);
7999       func (stream, "%s",vec_condnames[vec_cond]);
8000       break;
8001 
8002     case MVE_NONE:
8003     case MVE_VPST:
8004     default:
8005       break;
8006     }
8007 }
8008 
8009 #define W_BIT 21
8010 #define I_BIT 22
8011 #define U_BIT 23
8012 #define P_BIT 24
8013 
8014 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
8015 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
8016 #define NEGATIVE_BIT_SET  ((given & (1 << U_BIT)) == 0)
8017 #define PRE_BIT_SET	  (given & (1 << P_BIT))
8018 
8019 
8020 /* Print one coprocessor instruction on INFO->STREAM.
8021    Return TRUE if the instuction matched, FALSE if this is not a
8022    recognised coprocessor instruction.  */
8023 
8024 static bfd_boolean
8025 print_insn_coprocessor_1 (const struct sopcode32 *opcodes,
8026 			  bfd_vma pc,
8027 			  struct disassemble_info *info,
8028 			  long given,
8029 			  bfd_boolean thumb)
8030 {
8031   const struct sopcode32 *insn;
8032   void *stream = info->stream;
8033   fprintf_ftype func = info->fprintf_func;
8034   unsigned long mask;
8035   unsigned long value = 0;
8036   int cond;
8037   int cp_num;
8038   struct arm_private_data *private_data = info->private_data;
8039   arm_feature_set allowed_arches = ARM_ARCH_NONE;
8040   arm_feature_set arm_ext_v8_1m_main =
8041     ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
8042 
8043   allowed_arches = private_data->features;
8044 
8045   for (insn = opcodes; insn->assembler; insn++)
8046     {
8047       unsigned long u_reg = 16;
8048       bfd_boolean is_unpredictable = FALSE;
8049       signed long value_in_comment = 0;
8050       const char *c;
8051 
8052       if (ARM_FEATURE_ZERO (insn->arch))
8053 	switch (insn->value)
8054 	  {
8055 	  case SENTINEL_IWMMXT_START:
8056 	    if (info->mach != bfd_mach_arm_XScale
8057 		&& info->mach != bfd_mach_arm_iWMMXt
8058 		&& info->mach != bfd_mach_arm_iWMMXt2)
8059 	      do
8060 		insn++;
8061 	      while ((! ARM_FEATURE_ZERO (insn->arch))
8062 		     && insn->value != SENTINEL_IWMMXT_END);
8063 	    continue;
8064 
8065 	  case SENTINEL_IWMMXT_END:
8066 	    continue;
8067 
8068 	  case SENTINEL_GENERIC_START:
8069 	    allowed_arches = private_data->features;
8070 	    continue;
8071 
8072 	  default:
8073 	    abort ();
8074 	  }
8075 
8076       mask = insn->mask;
8077       value = insn->value;
8078       cp_num = (given >> 8) & 0xf;
8079 
8080       if (thumb)
8081 	{
8082 	  /* The high 4 bits are 0xe for Arm conditional instructions, and
8083 	     0xe for arm unconditional instructions.  The rest of the
8084 	     encoding is the same.  */
8085 	  mask |= 0xf0000000;
8086 	  value |= 0xe0000000;
8087 	  if (ifthen_state)
8088 	    cond = IFTHEN_COND;
8089 	  else
8090 	    cond = COND_UNCOND;
8091 	}
8092       else
8093 	{
8094 	  /* Only match unconditional instuctions against unconditional
8095 	     patterns.  */
8096 	  if ((given & 0xf0000000) == 0xf0000000)
8097 	    {
8098 	      mask |= 0xf0000000;
8099 	      cond = COND_UNCOND;
8100 	    }
8101 	  else
8102 	    {
8103 	      cond = (given >> 28) & 0xf;
8104 	      if (cond == 0xe)
8105 		cond = COND_UNCOND;
8106 	    }
8107 	}
8108 
8109       if ((insn->isa == T32 && !thumb)
8110 	  || (insn->isa == ARM && thumb))
8111 	continue;
8112 
8113       if ((given & mask) != value)
8114 	continue;
8115 
8116       if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches))
8117 	continue;
8118 
8119       if (insn->value == 0xfe000010     /* mcr2  */
8120 	  || insn->value == 0xfe100010  /* mrc2  */
8121 	  || insn->value == 0xfc100000  /* ldc2  */
8122 	  || insn->value == 0xfc000000) /* stc2  */
8123 	{
8124 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
8125 	    is_unpredictable = TRUE;
8126 
8127 	  /* Armv8.1-M Mainline FP & MVE instructions.  */
8128 	  if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
8129 	      && !ARM_CPU_IS_ANY (allowed_arches)
8130 	      && (cp_num == 8 || cp_num == 14 || cp_num == 15))
8131 	    continue;
8132 
8133 	}
8134       else if (insn->value == 0x0e000000     /* cdp  */
8135 	       || insn->value == 0xfe000000  /* cdp2  */
8136 	       || insn->value == 0x0e000010  /* mcr  */
8137 	       || insn->value == 0x0e100010  /* mrc  */
8138 	       || insn->value == 0x0c100000  /* ldc  */
8139 	       || insn->value == 0x0c000000) /* stc  */
8140 	{
8141 	  /* Floating-point instructions.  */
8142 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
8143 	    continue;
8144 
8145 	  /* Armv8.1-M Mainline FP & MVE instructions.  */
8146 	  if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
8147 	      && !ARM_CPU_IS_ANY (allowed_arches)
8148 	      && (cp_num == 8 || cp_num == 14 || cp_num == 15))
8149 	    continue;
8150 	}
8151       else if ((insn->value == 0xec100f80      /* vldr (system register) */
8152 		|| insn->value == 0xec000f80)  /* vstr (system register) */
8153 	       && arm_decode_field (given, 24, 24) == 0
8154 	       && arm_decode_field (given, 21, 21) == 0)
8155 	/* If the P and W bits are both 0 then these encodings match the MVE
8156 	   VLDR and VSTR instructions, these are in a different table, so we
8157 	   don't let it match here.  */
8158 	continue;
8159 
8160       for (c = insn->assembler; *c; c++)
8161 	{
8162 	  if (*c == '%')
8163 	    {
8164 	      const char mod = *++c;
8165 	      switch (mod)
8166 		{
8167 		case '%':
8168 		  func (stream, "%%");
8169 		  break;
8170 
8171 		case 'A':
8172 		case 'K':
8173 		  {
8174 		    int rn = (given >> 16) & 0xf;
8175 		    bfd_vma offset = given & 0xff;
8176 
8177 		    if (mod == 'K')
8178 		      offset = given & 0x7f;
8179 
8180 		    func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
8181 
8182 		    if (PRE_BIT_SET || WRITEBACK_BIT_SET)
8183 		      {
8184 			/* Not unindexed.  The offset is scaled.  */
8185 			if (cp_num == 9)
8186 			  /* vldr.16/vstr.16 will shift the address
8187 			     left by 1 bit only.  */
8188 			  offset = offset * 2;
8189 			else
8190 			  offset = offset * 4;
8191 
8192 			if (NEGATIVE_BIT_SET)
8193 			  offset = - offset;
8194 			if (rn != 15)
8195 			  value_in_comment = offset;
8196 		      }
8197 
8198 		    if (PRE_BIT_SET)
8199 		      {
8200 			if (offset)
8201 			  func (stream, ", #%d]%s",
8202 				(int) offset,
8203 				WRITEBACK_BIT_SET ? "!" : "");
8204 			else if (NEGATIVE_BIT_SET)
8205 			  func (stream, ", #-0]");
8206 			else
8207 			  func (stream, "]");
8208 		      }
8209 		    else
8210 		      {
8211 			func (stream, "]");
8212 
8213 			if (WRITEBACK_BIT_SET)
8214 			  {
8215 			    if (offset)
8216 			      func (stream, ", #%d", (int) offset);
8217 			    else if (NEGATIVE_BIT_SET)
8218 			      func (stream, ", #-0");
8219 			  }
8220 			else
8221 			  {
8222 			    func (stream, ", {%s%d}",
8223 				  (NEGATIVE_BIT_SET && !offset) ? "-" : "",
8224 				  (int) offset);
8225 			    value_in_comment = offset;
8226 			  }
8227 		      }
8228 		    if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET))
8229 		      {
8230 			func (stream, "\t; ");
8231 			/* For unaligned PCs, apply off-by-alignment
8232 			   correction.  */
8233 			info->print_address_func (offset + pc
8234 						  + info->bytes_per_chunk * 2
8235 						  - (pc & 3),
8236 						  info);
8237 		      }
8238 		  }
8239 		  break;
8240 
8241 		case 'B':
8242 		  {
8243 		    int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
8244 		    int offset = (given >> 1) & 0x3f;
8245 
8246 		    if (offset == 1)
8247 		      func (stream, "{d%d}", regno);
8248 		    else if (regno + offset > 32)
8249 		      func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
8250 		    else
8251 		      func (stream, "{d%d-d%d}", regno, regno + offset - 1);
8252 		  }
8253 		  break;
8254 
8255 		case 'C':
8256 		  {
8257 		    bfd_boolean single = ((given >> 8) & 1) == 0;
8258 		    char reg_prefix = single ? 's' : 'd';
8259 		    int Dreg = (given >> 22) & 0x1;
8260 		    int Vdreg = (given >> 12) & 0xf;
8261 		    int reg = single ? ((Vdreg << 1) | Dreg)
8262 				     : ((Dreg << 4) | Vdreg);
8263 		    int num = (given >> (single ? 0 : 1)) & 0x7f;
8264 		    int maxreg = single ? 31 : 15;
8265 		    int topreg = reg + num - 1;
8266 
8267 		    if (!num)
8268 		      func (stream, "{VPR}");
8269 		    else if (num == 1)
8270 		      func (stream, "{%c%d, VPR}", reg_prefix, reg);
8271 		    else if (topreg > maxreg)
8272 		      func (stream, "{%c%d-<overflow reg d%d, VPR}",
8273 			    reg_prefix, reg, single ? topreg >> 1 : topreg);
8274 		    else
8275 		      func (stream, "{%c%d-%c%d, VPR}", reg_prefix, reg,
8276 			    reg_prefix, topreg);
8277 		  }
8278 		  break;
8279 
8280 		case 'u':
8281 		  if (cond != COND_UNCOND)
8282 		    is_unpredictable = TRUE;
8283 
8284 		  /* Fall through.  */
8285 		case 'c':
8286 		  if (cond != COND_UNCOND && cp_num == 9)
8287 		    is_unpredictable = TRUE;
8288 
8289 		  /* Fall through.  */
8290 		case 'b':
8291 		  func (stream, "%s", arm_conditional[cond]);
8292 		  break;
8293 
8294 		case 'I':
8295 		  /* Print a Cirrus/DSP shift immediate.  */
8296 		  /* Immediates are 7bit signed ints with bits 0..3 in
8297 		     bits 0..3 of opcode and bits 4..6 in bits 5..7
8298 		     of opcode.  */
8299 		  {
8300 		    int imm;
8301 
8302 		    imm = (given & 0xf) | ((given & 0xe0) >> 1);
8303 
8304 		    /* Is ``imm'' a negative number?  */
8305 		    if (imm & 0x40)
8306 		      imm -= 0x80;
8307 
8308 		    func (stream, "%d", imm);
8309 		  }
8310 
8311 		  break;
8312 
8313 		case 'J':
8314 		  {
8315 		    unsigned long regno
8316 		      = arm_decode_field_multiple (given, 13, 15, 22, 22);
8317 
8318 		    switch (regno)
8319 		      {
8320 		      case 0x1:
8321 			func (stream, "FPSCR");
8322 			break;
8323 		      case 0x2:
8324 			func (stream, "FPSCR_nzcvqc");
8325 			break;
8326 		      case 0xc:
8327 			func (stream, "VPR");
8328 			break;
8329 		      case 0xd:
8330 			func (stream, "P0");
8331 			break;
8332 		      case 0xe:
8333 			func (stream, "FPCXTNS");
8334 			break;
8335 		      case 0xf:
8336 			func (stream, "FPCXTS");
8337 			break;
8338 		      default:
8339 			func (stream, "<invalid reg %lu>", regno);
8340 			break;
8341 		      }
8342 		  }
8343 		  break;
8344 
8345 		case 'F':
8346 		  switch (given & 0x00408000)
8347 		    {
8348 		    case 0:
8349 		      func (stream, "4");
8350 		      break;
8351 		    case 0x8000:
8352 		      func (stream, "1");
8353 		      break;
8354 		    case 0x00400000:
8355 		      func (stream, "2");
8356 		      break;
8357 		    default:
8358 		      func (stream, "3");
8359 		    }
8360 		  break;
8361 
8362 		case 'P':
8363 		  switch (given & 0x00080080)
8364 		    {
8365 		    case 0:
8366 		      func (stream, "s");
8367 		      break;
8368 		    case 0x80:
8369 		      func (stream, "d");
8370 		      break;
8371 		    case 0x00080000:
8372 		      func (stream, "e");
8373 		      break;
8374 		    default:
8375 		      func (stream, _("<illegal precision>"));
8376 		      break;
8377 		    }
8378 		  break;
8379 
8380 		case 'Q':
8381 		  switch (given & 0x00408000)
8382 		    {
8383 		    case 0:
8384 		      func (stream, "s");
8385 		      break;
8386 		    case 0x8000:
8387 		      func (stream, "d");
8388 		      break;
8389 		    case 0x00400000:
8390 		      func (stream, "e");
8391 		      break;
8392 		    default:
8393 		      func (stream, "p");
8394 		      break;
8395 		    }
8396 		  break;
8397 
8398 		case 'R':
8399 		  switch (given & 0x60)
8400 		    {
8401 		    case 0:
8402 		      break;
8403 		    case 0x20:
8404 		      func (stream, "p");
8405 		      break;
8406 		    case 0x40:
8407 		      func (stream, "m");
8408 		      break;
8409 		    default:
8410 		      func (stream, "z");
8411 		      break;
8412 		    }
8413 		  break;
8414 
8415 		case '0': case '1': case '2': case '3': case '4':
8416 		case '5': case '6': case '7': case '8': case '9':
8417 		  {
8418 		    int width;
8419 
8420 		    c = arm_decode_bitfield (c, given, &value, &width);
8421 
8422 		    switch (*c)
8423 		      {
8424 		      case 'R':
8425 			if (value == 15)
8426 			  is_unpredictable = TRUE;
8427 			/* Fall through.  */
8428 		      case 'r':
8429 			if (c[1] == 'u')
8430 			  {
8431 			    /* Eat the 'u' character.  */
8432 			    ++ c;
8433 
8434 			    if (u_reg == value)
8435 			      is_unpredictable = TRUE;
8436 			    u_reg = value;
8437 			  }
8438 			func (stream, "%s", arm_regnames[value]);
8439 			break;
8440 		      case 'V':
8441 			if (given & (1 << 6))
8442 			  goto Q;
8443 			/* FALLTHROUGH */
8444 		      case 'D':
8445 			func (stream, "d%ld", value);
8446 			break;
8447 		      case 'Q':
8448 		      Q:
8449 			if (value & 1)
8450 			  func (stream, "<illegal reg q%ld.5>", value >> 1);
8451 			else
8452 			  func (stream, "q%ld", value >> 1);
8453 			break;
8454 		      case 'd':
8455 			func (stream, "%ld", value);
8456 			value_in_comment = value;
8457 			break;
8458 		      case 'E':
8459                         {
8460 			  /* Converts immediate 8 bit back to float value.  */
8461 			  unsigned floatVal = (value & 0x80) << 24
8462 			    | (value & 0x3F) << 19
8463 			    | ((value & 0x40) ? (0xF8 << 22) : (1 << 30));
8464 
8465 			  /* Quarter float have a maximum value of 31.0.
8466 			     Get floating point value multiplied by 1e7.
8467 			     The maximum value stays in limit of a 32-bit int.  */
8468 			  unsigned decVal =
8469 			    (78125 << (((floatVal >> 23) & 0xFF) - 124)) *
8470 			    (16 + (value & 0xF));
8471 
8472 			  if (!(decVal % 1000000))
8473 			    func (stream, "%ld\t; 0x%08x %c%u.%01u", value,
8474 				  floatVal, value & 0x80 ? '-' : ' ',
8475 				  decVal / 10000000,
8476 				  decVal % 10000000 / 1000000);
8477 			  else if (!(decVal % 10000))
8478 			    func (stream, "%ld\t; 0x%08x %c%u.%03u", value,
8479 				  floatVal, value & 0x80 ? '-' : ' ',
8480 				  decVal / 10000000,
8481 				  decVal % 10000000 / 10000);
8482 			  else
8483 			    func (stream, "%ld\t; 0x%08x %c%u.%07u", value,
8484 				  floatVal, value & 0x80 ? '-' : ' ',
8485 				  decVal / 10000000, decVal % 10000000);
8486 			  break;
8487 			}
8488 		      case 'k':
8489 			{
8490 			  int from = (given & (1 << 7)) ? 32 : 16;
8491 			  func (stream, "%ld", from - value);
8492 			}
8493 			break;
8494 
8495 		      case 'f':
8496 			if (value > 7)
8497 			  func (stream, "#%s", arm_fp_const[value & 7]);
8498 			else
8499 			  func (stream, "f%ld", value);
8500 			break;
8501 
8502 		      case 'w':
8503 			if (width == 2)
8504 			  func (stream, "%s", iwmmxt_wwnames[value]);
8505 			else
8506 			  func (stream, "%s", iwmmxt_wwssnames[value]);
8507 			break;
8508 
8509 		      case 'g':
8510 			func (stream, "%s", iwmmxt_regnames[value]);
8511 			break;
8512 		      case 'G':
8513 			func (stream, "%s", iwmmxt_cregnames[value]);
8514 			break;
8515 
8516 		      case 'x':
8517 			func (stream, "0x%lx", (value & 0xffffffffUL));
8518 			break;
8519 
8520 		      case 'c':
8521 			switch (value)
8522 			  {
8523 			  case 0:
8524 			    func (stream, "eq");
8525 			    break;
8526 
8527 			  case 1:
8528 			    func (stream, "vs");
8529 			    break;
8530 
8531 			  case 2:
8532 			    func (stream, "ge");
8533 			    break;
8534 
8535 			  case 3:
8536 			    func (stream, "gt");
8537 			    break;
8538 
8539 			  default:
8540 			    func (stream, "??");
8541 			    break;
8542 			  }
8543 			break;
8544 
8545 		      case '`':
8546 			c++;
8547 			if (value == 0)
8548 			  func (stream, "%c", *c);
8549 			break;
8550 		      case '\'':
8551 			c++;
8552 			if (value == ((1ul << width) - 1))
8553 			  func (stream, "%c", *c);
8554 			break;
8555 		      case '?':
8556 			func (stream, "%c", c[(1 << width) - (int) value]);
8557 			c += 1 << width;
8558 			break;
8559 		      default:
8560 			abort ();
8561 		      }
8562 		  }
8563 		  break;
8564 
8565 		case 'y':
8566 		case 'z':
8567 		  {
8568 		    int single = *c++ == 'y';
8569 		    int regno;
8570 
8571 		    switch (*c)
8572 		      {
8573 		      case '4': /* Sm pair */
8574 		      case '0': /* Sm, Dm */
8575 			regno = given & 0x0000000f;
8576 			if (single)
8577 			  {
8578 			    regno <<= 1;
8579 			    regno += (given >> 5) & 1;
8580 			  }
8581 			else
8582 			  regno += ((given >> 5) & 1) << 4;
8583 			break;
8584 
8585 		      case '1': /* Sd, Dd */
8586 			regno = (given >> 12) & 0x0000000f;
8587 			if (single)
8588 			  {
8589 			    regno <<= 1;
8590 			    regno += (given >> 22) & 1;
8591 			  }
8592 			else
8593 			  regno += ((given >> 22) & 1) << 4;
8594 			break;
8595 
8596 		      case '2': /* Sn, Dn */
8597 			regno = (given >> 16) & 0x0000000f;
8598 			if (single)
8599 			  {
8600 			    regno <<= 1;
8601 			    regno += (given >> 7) & 1;
8602 			  }
8603 			else
8604 			  regno += ((given >> 7) & 1) << 4;
8605 			break;
8606 
8607 		      case '3': /* List */
8608 			func (stream, "{");
8609 			regno = (given >> 12) & 0x0000000f;
8610 			if (single)
8611 			  {
8612 			    regno <<= 1;
8613 			    regno += (given >> 22) & 1;
8614 			  }
8615 			else
8616 			  regno += ((given >> 22) & 1) << 4;
8617 			break;
8618 
8619 		      default:
8620 			abort ();
8621 		      }
8622 
8623 		    func (stream, "%c%d", single ? 's' : 'd', regno);
8624 
8625 		    if (*c == '3')
8626 		      {
8627 			int count = given & 0xff;
8628 
8629 			if (single == 0)
8630 			  count >>= 1;
8631 
8632 			if (--count)
8633 			  {
8634 			    func (stream, "-%c%d",
8635 				  single ? 's' : 'd',
8636 				  regno + count);
8637 			  }
8638 
8639 			func (stream, "}");
8640 		      }
8641 		    else if (*c == '4')
8642 		      func (stream, ", %c%d", single ? 's' : 'd',
8643 			    regno + 1);
8644 		  }
8645 		  break;
8646 
8647 		case 'L':
8648 		  switch (given & 0x00400100)
8649 		    {
8650 		    case 0x00000000: func (stream, "b"); break;
8651 		    case 0x00400000: func (stream, "h"); break;
8652 		    case 0x00000100: func (stream, "w"); break;
8653 		    case 0x00400100: func (stream, "d"); break;
8654 		    default:
8655 		      break;
8656 		    }
8657 		  break;
8658 
8659 		case 'Z':
8660 		  {
8661 		    /* given (20, 23) | given (0, 3) */
8662 		    value = ((given >> 16) & 0xf0) | (given & 0xf);
8663 		    func (stream, "%d", (int) value);
8664 		  }
8665 		  break;
8666 
8667 		case 'l':
8668 		  /* This is like the 'A' operator, except that if
8669 		     the width field "M" is zero, then the offset is
8670 		     *not* multiplied by four.  */
8671 		  {
8672 		    int offset = given & 0xff;
8673 		    int multiplier = (given & 0x00000100) ? 4 : 1;
8674 
8675 		    func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
8676 
8677 		    if (multiplier > 1)
8678 		      {
8679 			value_in_comment = offset * multiplier;
8680 			if (NEGATIVE_BIT_SET)
8681 			  value_in_comment = - value_in_comment;
8682 		      }
8683 
8684 		    if (offset)
8685 		      {
8686 			if (PRE_BIT_SET)
8687 			  func (stream, ", #%s%d]%s",
8688 				NEGATIVE_BIT_SET ? "-" : "",
8689 				offset * multiplier,
8690 				WRITEBACK_BIT_SET ? "!" : "");
8691 			else
8692 			  func (stream, "], #%s%d",
8693 				NEGATIVE_BIT_SET ? "-" : "",
8694 				offset * multiplier);
8695 		      }
8696 		    else
8697 		      func (stream, "]");
8698 		  }
8699 		  break;
8700 
8701 		case 'r':
8702 		  {
8703 		    int imm4 = (given >> 4) & 0xf;
8704 		    int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1);
8705 		    int ubit = ! NEGATIVE_BIT_SET;
8706 		    const char *rm = arm_regnames [given & 0xf];
8707 		    const char *rn = arm_regnames [(given >> 16) & 0xf];
8708 
8709 		    switch (puw_bits)
8710 		      {
8711 		      case 1:
8712 		      case 3:
8713 			func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
8714 			if (imm4)
8715 			  func (stream, ", lsl #%d", imm4);
8716 			break;
8717 
8718 		      case 4:
8719 		      case 5:
8720 		      case 6:
8721 		      case 7:
8722 			func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
8723 			if (imm4 > 0)
8724 			  func (stream, ", lsl #%d", imm4);
8725 			func (stream, "]");
8726 			if (puw_bits == 5 || puw_bits == 7)
8727 			  func (stream, "!");
8728 			break;
8729 
8730 		      default:
8731 			func (stream, "INVALID");
8732 		      }
8733 		  }
8734 		  break;
8735 
8736 		case 'i':
8737 		  {
8738 		    long imm5;
8739 		    imm5 = ((given & 0x100) >> 4) | (given & 0xf);
8740 		    func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
8741 		  }
8742 		  break;
8743 
8744 		default:
8745 		  abort ();
8746 		}
8747 	    }
8748 	  else
8749 	    func (stream, "%c", *c);
8750 	}
8751 
8752       if (value_in_comment > 32 || value_in_comment < -16)
8753 	func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
8754 
8755       if (is_unpredictable)
8756 	func (stream, UNPREDICTABLE_INSTRUCTION);
8757 
8758       return TRUE;
8759     }
8760   return FALSE;
8761 }
8762 
8763 static bfd_boolean
8764 print_insn_coprocessor (bfd_vma pc,
8765 			struct disassemble_info *info,
8766 			long given,
8767 			bfd_boolean thumb)
8768 {
8769   return print_insn_coprocessor_1 (coprocessor_opcodes,
8770 				   pc, info, given, thumb);
8771 }
8772 
8773 static bfd_boolean
8774 print_insn_generic_coprocessor (bfd_vma pc,
8775 				struct disassemble_info *info,
8776 				long given,
8777 				bfd_boolean thumb)
8778 {
8779   return print_insn_coprocessor_1 (generic_coprocessor_opcodes,
8780 				   pc, info, given, thumb);
8781 }
8782 
8783 /* Decodes and prints ARM addressing modes.  Returns the offset
8784    used in the address, if any, if it is worthwhile printing the
8785    offset as a hexadecimal value in a comment at the end of the
8786    line of disassembly.  */
8787 
8788 static signed long
8789 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
8790 {
8791   void *stream = info->stream;
8792   fprintf_ftype func = info->fprintf_func;
8793   bfd_vma offset = 0;
8794 
8795   if (((given & 0x000f0000) == 0x000f0000)
8796       && ((given & 0x02000000) == 0))
8797     {
8798       offset = given & 0xfff;
8799 
8800       func (stream, "[pc");
8801 
8802       if (PRE_BIT_SET)
8803 	{
8804 	  /* Pre-indexed.  Elide offset of positive zero when
8805 	     non-writeback.  */
8806 	  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
8807 	    func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8808 
8809 	  if (NEGATIVE_BIT_SET)
8810 	    offset = -offset;
8811 
8812 	  offset += pc + 8;
8813 
8814 	  /* Cope with the possibility of write-back
8815 	     being used.  Probably a very dangerous thing
8816 	     for the programmer to do, but who are we to
8817 	     argue ?  */
8818 	  func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : "");
8819 	}
8820       else  /* Post indexed.  */
8821 	{
8822 	  func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8823 
8824 	  /* Ie ignore the offset.  */
8825 	  offset = pc + 8;
8826 	}
8827 
8828       func (stream, "\t; ");
8829       info->print_address_func (offset, info);
8830       offset = 0;
8831     }
8832   else
8833     {
8834       func (stream, "[%s",
8835 	    arm_regnames[(given >> 16) & 0xf]);
8836 
8837       if (PRE_BIT_SET)
8838 	{
8839 	  if ((given & 0x02000000) == 0)
8840 	    {
8841 	      /* Elide offset of positive zero when non-writeback.  */
8842 	      offset = given & 0xfff;
8843 	      if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
8844 		func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8845 	    }
8846 	  else
8847 	    {
8848 	      func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : "");
8849 	      arm_decode_shift (given, func, stream, TRUE);
8850 	    }
8851 
8852 	  func (stream, "]%s",
8853 		WRITEBACK_BIT_SET ? "!" : "");
8854 	}
8855       else
8856 	{
8857 	  if ((given & 0x02000000) == 0)
8858 	    {
8859 	      /* Always show offset.  */
8860 	      offset = given & 0xfff;
8861 	      func (stream, "], #%s%d",
8862 		    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
8863 	    }
8864 	  else
8865 	    {
8866 	      func (stream, "], %s",
8867 		    NEGATIVE_BIT_SET ? "-" : "");
8868 	      arm_decode_shift (given, func, stream, TRUE);
8869 	    }
8870 	}
8871       if (NEGATIVE_BIT_SET)
8872 	offset = -offset;
8873     }
8874 
8875   return (signed long) offset;
8876 }
8877 
8878 
8879 /* Print one cde instruction on INFO->STREAM.
8880    Return TRUE if the instuction matched, FALSE if this is not a
8881    recognised cde instruction.  */
8882 static bfd_boolean
8883 print_insn_cde (struct disassemble_info *info, long given, bfd_boolean thumb)
8884 {
8885   const struct cdeopcode32 *insn;
8886   void *stream = info->stream;
8887   fprintf_ftype func = info->fprintf_func;
8888 
8889   if (thumb)
8890   {
8891     /* Manually extract the coprocessor code from a known point.
8892        This position is the same across all CDE instructions.  */
8893     for (insn = cde_opcodes; insn->assembler; insn++)
8894     {
8895       uint16_t coproc = (given >> insn->coproc_shift) & insn->coproc_mask;
8896       uint16_t coproc_mask = 1 << coproc;
8897       if (! (coproc_mask & cde_coprocs))
8898 	continue;
8899 
8900       if ((given & insn->mask) == insn->value)
8901       {
8902 	bfd_boolean is_unpredictable = FALSE;
8903 	const char *c;
8904 
8905 	for (c = insn->assembler; *c; c++)
8906 	{
8907 	  if (*c == '%')
8908 	  {
8909 	    switch (*++c)
8910 	    {
8911 	      case '%':
8912 		func (stream, "%%");
8913 		break;
8914 
8915 	      case '0': case '1': case '2': case '3': case '4':
8916 	      case '5': case '6': case '7': case '8': case '9':
8917 	      {
8918 		int width;
8919 		unsigned long value;
8920 
8921 		c = arm_decode_bitfield (c, given, &value, &width);
8922 
8923 		switch (*c)
8924 		{
8925 		  case 'S':
8926 		    if (value > 10)
8927 		      is_unpredictable = TRUE;
8928 		    /* Fall through.  */
8929 		  case 'R':
8930 		    if (value == 13)
8931 		      is_unpredictable = TRUE;
8932 		    /* Fall through.  */
8933 		  case 'r':
8934 		    func (stream, "%s", arm_regnames[value]);
8935 		    break;
8936 
8937 		  case 'n':
8938 		    if (value == 15)
8939 		      func (stream, "%s", "APSR_nzcv");
8940 		    else
8941 		      func (stream, "%s", arm_regnames[value]);
8942 		    break;
8943 
8944 		  case 'T':
8945 		    func (stream, "%s", arm_regnames[value + 1]);
8946 		    break;
8947 
8948 		  case 'd':
8949 		    func (stream, "%ld", value);
8950 		    break;
8951 
8952 		  case 'V':
8953 		    if (given & (1 << 6))
8954 		      func (stream, "q%ld", value >> 1);
8955 		    else if (given & (1 << 24))
8956 		      func (stream, "d%ld", value);
8957 		    else
8958 		      {
8959 			/* Encoding for S register is different than for D and
8960 			   Q registers.  S registers are encoded using the top
8961 			   single bit in position 22 as the lowest bit of the
8962 			   register number, while for Q and D it represents the
8963 			   highest bit of the register number.  */
8964 			uint8_t top_bit = (value >> 4) & 1;
8965 			uint8_t tmp = (value << 1) & 0x1e;
8966 			uint8_t res = tmp | top_bit;
8967 			func (stream, "s%u", res);
8968 		      }
8969 		    break;
8970 
8971 		default:
8972 		  abort ();
8973 		}
8974 	      }
8975 	    break;
8976 
8977 	    case 'p':
8978 	      {
8979 		uint8_t proc_number = (given >> 8) & 0x7;
8980 		func (stream, "p%u", proc_number);
8981 		break;
8982 	      }
8983 
8984 	    case 'a':
8985 	      {
8986 		uint8_t a_offset = 28;
8987 		if (given & (1 << a_offset))
8988 		  func (stream, "a");
8989 		break;
8990 	      }
8991 	  default:
8992 	    abort ();
8993 	  }
8994 	}
8995 	else
8996 	  func (stream, "%c", *c);
8997       }
8998 
8999       if (is_unpredictable)
9000 	func (stream, UNPREDICTABLE_INSTRUCTION);
9001 
9002       return TRUE;
9003       }
9004     }
9005     return FALSE;
9006   }
9007   else
9008     return FALSE;
9009 }
9010 
9011 
9012 /* Print one neon instruction on INFO->STREAM.
9013    Return TRUE if the instuction matched, FALSE if this is not a
9014    recognised neon instruction.  */
9015 
9016 static bfd_boolean
9017 print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
9018 {
9019   const struct opcode32 *insn;
9020   void *stream = info->stream;
9021   fprintf_ftype func = info->fprintf_func;
9022 
9023   if (thumb)
9024     {
9025       if ((given & 0xef000000) == 0xef000000)
9026 	{
9027 	  /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding.  */
9028 	  unsigned long bit28 = given & (1 << 28);
9029 
9030 	  given &= 0x00ffffff;
9031 	  if (bit28)
9032             given |= 0xf3000000;
9033           else
9034 	    given |= 0xf2000000;
9035 	}
9036       else if ((given & 0xff000000) == 0xf9000000)
9037 	given ^= 0xf9000000 ^ 0xf4000000;
9038       /* BFloat16 neon instructions without special top byte handling.  */
9039       else if ((given & 0xff000000) == 0xfe000000
9040 	       || (given & 0xff000000) == 0xfc000000)
9041 	;
9042       /* vdup is also a valid neon instruction.  */
9043       else if ((given & 0xff900f5f) != 0xee800b10)
9044 	return FALSE;
9045     }
9046 
9047   for (insn = neon_opcodes; insn->assembler; insn++)
9048     {
9049       unsigned long cond_mask = insn->mask;
9050       unsigned long cond_value = insn->value;
9051       int cond;
9052 
9053       if (thumb)
9054         {
9055           if ((cond_mask & 0xf0000000) == 0) {
9056               /* For the entries in neon_opcodes, an opcode mask/value with
9057                  the high 4 bits equal to 0 indicates a conditional
9058                  instruction. For thumb however, we need to include those
9059                  bits in the instruction matching.  */
9060               cond_mask |= 0xf0000000;
9061               /* Furthermore, the thumb encoding of a conditional instruction
9062                  will have the high 4 bits equal to 0xe.  */
9063               cond_value |= 0xe0000000;
9064           }
9065           if (ifthen_state)
9066             cond = IFTHEN_COND;
9067           else
9068             cond = COND_UNCOND;
9069         }
9070       else
9071         {
9072           if ((given & 0xf0000000) == 0xf0000000)
9073             {
9074               /* If the instruction is unconditional, update the mask to only
9075                  match against unconditional opcode values.  */
9076               cond_mask |= 0xf0000000;
9077               cond = COND_UNCOND;
9078             }
9079           else
9080             {
9081               cond = (given >> 28) & 0xf;
9082               if (cond == 0xe)
9083                 cond = COND_UNCOND;
9084             }
9085         }
9086 
9087       if ((given & cond_mask) == cond_value)
9088 	{
9089 	  signed long value_in_comment = 0;
9090 	  bfd_boolean is_unpredictable = FALSE;
9091 	  const char *c;
9092 
9093 	  for (c = insn->assembler; *c; c++)
9094 	    {
9095 	      if (*c == '%')
9096 		{
9097 		  switch (*++c)
9098 		    {
9099 		    case '%':
9100 		      func (stream, "%%");
9101 		      break;
9102 
9103 		    case 'u':
9104 		      if (thumb && ifthen_state)
9105 			is_unpredictable = TRUE;
9106 
9107 		      /* Fall through.  */
9108 		    case 'c':
9109 		      func (stream, "%s", arm_conditional[cond]);
9110 		      break;
9111 
9112 		    case 'A':
9113 		      {
9114 			static const unsigned char enc[16] =
9115 			{
9116 			  0x4, 0x14, /* st4 0,1 */
9117 			  0x4, /* st1 2 */
9118 			  0x4, /* st2 3 */
9119 			  0x3, /* st3 4 */
9120 			  0x13, /* st3 5 */
9121 			  0x3, /* st1 6 */
9122 			  0x1, /* st1 7 */
9123 			  0x2, /* st2 8 */
9124 			  0x12, /* st2 9 */
9125 			  0x2, /* st1 10 */
9126 			  0, 0, 0, 0, 0
9127 			};
9128 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9129 			int rn = ((given >> 16) & 0xf);
9130 			int rm = ((given >> 0) & 0xf);
9131 			int align = ((given >> 4) & 0x3);
9132 			int type = ((given >> 8) & 0xf);
9133 			int n = enc[type] & 0xf;
9134 			int stride = (enc[type] >> 4) + 1;
9135 			int ix;
9136 
9137 			func (stream, "{");
9138 			if (stride > 1)
9139 			  for (ix = 0; ix != n; ix++)
9140 			    func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
9141 			else if (n == 1)
9142 			  func (stream, "d%d", rd);
9143 			else
9144 			  func (stream, "d%d-d%d", rd, rd + n - 1);
9145 			func (stream, "}, [%s", arm_regnames[rn]);
9146 			if (align)
9147 			  func (stream, " :%d", 32 << align);
9148 			func (stream, "]");
9149 			if (rm == 0xd)
9150 			  func (stream, "!");
9151 			else if (rm != 0xf)
9152 			  func (stream, ", %s", arm_regnames[rm]);
9153 		      }
9154 		      break;
9155 
9156 		    case 'B':
9157 		      {
9158 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9159 			int rn = ((given >> 16) & 0xf);
9160 			int rm = ((given >> 0) & 0xf);
9161 			int idx_align = ((given >> 4) & 0xf);
9162                         int align = 0;
9163 			int size = ((given >> 10) & 0x3);
9164 			int idx = idx_align >> (size + 1);
9165                         int length = ((given >> 8) & 3) + 1;
9166                         int stride = 1;
9167                         int i;
9168 
9169                         if (length > 1 && size > 0)
9170                           stride = (idx_align & (1 << size)) ? 2 : 1;
9171 
9172                         switch (length)
9173                           {
9174                           case 1:
9175                             {
9176                               int amask = (1 << size) - 1;
9177                               if ((idx_align & (1 << size)) != 0)
9178                                 return FALSE;
9179                               if (size > 0)
9180                                 {
9181                                   if ((idx_align & amask) == amask)
9182                                     align = 8 << size;
9183                                   else if ((idx_align & amask) != 0)
9184                                     return FALSE;
9185                                 }
9186                               }
9187                             break;
9188 
9189                           case 2:
9190                             if (size == 2 && (idx_align & 2) != 0)
9191                               return FALSE;
9192                             align = (idx_align & 1) ? 16 << size : 0;
9193                             break;
9194 
9195                           case 3:
9196                             if ((size == 2 && (idx_align & 3) != 0)
9197                                 || (idx_align & 1) != 0)
9198                               return FALSE;
9199                             break;
9200 
9201                           case 4:
9202                             if (size == 2)
9203                               {
9204                                 if ((idx_align & 3) == 3)
9205                                   return FALSE;
9206                                 align = (idx_align & 3) * 64;
9207                               }
9208                             else
9209                               align = (idx_align & 1) ? 32 << size : 0;
9210                             break;
9211 
9212                           default:
9213                             abort ();
9214                           }
9215 
9216 			func (stream, "{");
9217                         for (i = 0; i < length; i++)
9218                           func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
9219                             rd + i * stride, idx);
9220                         func (stream, "}, [%s", arm_regnames[rn]);
9221 			if (align)
9222 			  func (stream, " :%d", align);
9223 			func (stream, "]");
9224 			if (rm == 0xd)
9225 			  func (stream, "!");
9226 			else if (rm != 0xf)
9227 			  func (stream, ", %s", arm_regnames[rm]);
9228 		      }
9229 		      break;
9230 
9231 		    case 'C':
9232 		      {
9233 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
9234 			int rn = ((given >> 16) & 0xf);
9235 			int rm = ((given >> 0) & 0xf);
9236 			int align = ((given >> 4) & 0x1);
9237 			int size = ((given >> 6) & 0x3);
9238 			int type = ((given >> 8) & 0x3);
9239 			int n = type + 1;
9240 			int stride = ((given >> 5) & 0x1);
9241 			int ix;
9242 
9243 			if (stride && (n == 1))
9244 			  n++;
9245 			else
9246 			  stride++;
9247 
9248 			func (stream, "{");
9249 			if (stride > 1)
9250 			  for (ix = 0; ix != n; ix++)
9251 			    func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
9252 			else if (n == 1)
9253 			  func (stream, "d%d[]", rd);
9254 			else
9255 			  func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
9256 			func (stream, "}, [%s", arm_regnames[rn]);
9257 			if (align)
9258 			  {
9259                             align = (8 * (type + 1)) << size;
9260                             if (type == 3)
9261                               align = (size > 1) ? align >> 1 : align;
9262 			    if (type == 2 || (type == 0 && !size))
9263 			      func (stream, " :<bad align %d>", align);
9264 			    else
9265 			      func (stream, " :%d", align);
9266 			  }
9267 			func (stream, "]");
9268 			if (rm == 0xd)
9269 			  func (stream, "!");
9270 			else if (rm != 0xf)
9271 			  func (stream, ", %s", arm_regnames[rm]);
9272 		      }
9273 		      break;
9274 
9275 		    case 'D':
9276 		      {
9277 			int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
9278 			int size = (given >> 20) & 3;
9279 			int reg = raw_reg & ((4 << size) - 1);
9280 			int ix = raw_reg >> size >> 2;
9281 
9282 			func (stream, "d%d[%d]", reg, ix);
9283 		      }
9284 		      break;
9285 
9286 		    case 'E':
9287 		      /* Neon encoded constant for mov, mvn, vorr, vbic.  */
9288 		      {
9289 			int bits = 0;
9290 			int cmode = (given >> 8) & 0xf;
9291 			int op = (given >> 5) & 0x1;
9292 			unsigned long value = 0, hival = 0;
9293 			unsigned shift;
9294                         int size = 0;
9295                         int isfloat = 0;
9296 
9297 			bits |= ((given >> 24) & 1) << 7;
9298 			bits |= ((given >> 16) & 7) << 4;
9299 			bits |= ((given >> 0) & 15) << 0;
9300 
9301 			if (cmode < 8)
9302 			  {
9303 			    shift = (cmode >> 1) & 3;
9304 			    value = (unsigned long) bits << (8 * shift);
9305                             size = 32;
9306 			  }
9307 			else if (cmode < 12)
9308 			  {
9309 			    shift = (cmode >> 1) & 1;
9310 			    value = (unsigned long) bits << (8 * shift);
9311                             size = 16;
9312 			  }
9313 			else if (cmode < 14)
9314 			  {
9315 			    shift = (cmode & 1) + 1;
9316 			    value = (unsigned long) bits << (8 * shift);
9317 			    value |= (1ul << (8 * shift)) - 1;
9318                             size = 32;
9319 			  }
9320 			else if (cmode == 14)
9321 			  {
9322 			    if (op)
9323 			      {
9324 				/* Bit replication into bytes.  */
9325 				int ix;
9326 				unsigned long mask;
9327 
9328 				value = 0;
9329                                 hival = 0;
9330 				for (ix = 7; ix >= 0; ix--)
9331 				  {
9332 				    mask = ((bits >> ix) & 1) ? 0xff : 0;
9333                                     if (ix <= 3)
9334 				      value = (value << 8) | mask;
9335                                     else
9336                                       hival = (hival << 8) | mask;
9337 				  }
9338                                 size = 64;
9339 			      }
9340                             else
9341                               {
9342                                 /* Byte replication.  */
9343                                 value = (unsigned long) bits;
9344                                 size = 8;
9345                               }
9346 			  }
9347 			else if (!op)
9348 			  {
9349 			    /* Floating point encoding.  */
9350 			    int tmp;
9351 
9352 			    value = (unsigned long)  (bits & 0x7f) << 19;
9353 			    value |= (unsigned long) (bits & 0x80) << 24;
9354 			    tmp = bits & 0x40 ? 0x3c : 0x40;
9355 			    value |= (unsigned long) tmp << 24;
9356                             size = 32;
9357                             isfloat = 1;
9358 			  }
9359 			else
9360 			  {
9361 			    func (stream, "<illegal constant %.8x:%x:%x>",
9362                                   bits, cmode, op);
9363                             size = 32;
9364 			    break;
9365 			  }
9366                         switch (size)
9367                           {
9368                           case 8:
9369 			    func (stream, "#%ld\t; 0x%.2lx", value, value);
9370                             break;
9371 
9372                           case 16:
9373                             func (stream, "#%ld\t; 0x%.4lx", value, value);
9374                             break;
9375 
9376                           case 32:
9377                             if (isfloat)
9378                               {
9379                                 unsigned char valbytes[4];
9380                                 double fvalue;
9381 
9382                                 /* Do this a byte at a time so we don't have to
9383                                    worry about the host's endianness.  */
9384                                 valbytes[0] = value & 0xff;
9385                                 valbytes[1] = (value >> 8) & 0xff;
9386                                 valbytes[2] = (value >> 16) & 0xff;
9387                                 valbytes[3] = (value >> 24) & 0xff;
9388 
9389                                 floatformat_to_double
9390                                   (& floatformat_ieee_single_little, valbytes,
9391                                   & fvalue);
9392 
9393                                 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
9394                                       value);
9395                               }
9396                             else
9397                               func (stream, "#%ld\t; 0x%.8lx",
9398 				    (long) (((value & 0x80000000L) != 0)
9399 					    ? value | ~0xffffffffL : value),
9400 				    value);
9401                             break;
9402 
9403                           case 64:
9404                             func (stream, "#0x%.8lx%.8lx", hival, value);
9405                             break;
9406 
9407                           default:
9408                             abort ();
9409                           }
9410 		      }
9411 		      break;
9412 
9413 		    case 'F':
9414 		      {
9415 			int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
9416 			int num = (given >> 8) & 0x3;
9417 
9418 			if (!num)
9419 			  func (stream, "{d%d}", regno);
9420 			else if (num + regno >= 32)
9421 			  func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
9422 			else
9423 			  func (stream, "{d%d-d%d}", regno, regno + num);
9424 		      }
9425 		      break;
9426 
9427 
9428 		    case '0': case '1': case '2': case '3': case '4':
9429 		    case '5': case '6': case '7': case '8': case '9':
9430 		      {
9431 			int width;
9432 			unsigned long value;
9433 
9434 			c = arm_decode_bitfield (c, given, &value, &width);
9435 
9436 			switch (*c)
9437 			  {
9438 			  case 'r':
9439 			    func (stream, "%s", arm_regnames[value]);
9440 			    break;
9441 			  case 'd':
9442 			    func (stream, "%ld", value);
9443 			    value_in_comment = value;
9444 			    break;
9445 			  case 'e':
9446 			    func (stream, "%ld", (1ul << width) - value);
9447 			    break;
9448 
9449 			  case 'S':
9450 			  case 'T':
9451 			  case 'U':
9452 			    /* Various width encodings.  */
9453 			    {
9454 			      int base = 8 << (*c - 'S'); /* 8,16 or 32 */
9455 			      int limit;
9456 			      unsigned low, high;
9457 
9458 			      c++;
9459 			      if (*c >= '0' && *c <= '9')
9460 				limit = *c - '0';
9461 			      else if (*c >= 'a' && *c <= 'f')
9462 				limit = *c - 'a' + 10;
9463 			      else
9464 				abort ();
9465 			      low = limit >> 2;
9466 			      high = limit & 3;
9467 
9468 			      if (value < low || value > high)
9469 				func (stream, "<illegal width %d>", base << value);
9470 			      else
9471 				func (stream, "%d", base << value);
9472 			    }
9473 			    break;
9474 			  case 'R':
9475 			    if (given & (1 << 6))
9476 			      goto Q;
9477 			    /* FALLTHROUGH */
9478 			  case 'D':
9479 			    func (stream, "d%ld", value);
9480 			    break;
9481 			  case 'Q':
9482 			  Q:
9483 			    if (value & 1)
9484 			      func (stream, "<illegal reg q%ld.5>", value >> 1);
9485 			    else
9486 			      func (stream, "q%ld", value >> 1);
9487 			    break;
9488 
9489 			  case '`':
9490 			    c++;
9491 			    if (value == 0)
9492 			      func (stream, "%c", *c);
9493 			    break;
9494 			  case '\'':
9495 			    c++;
9496 			    if (value == ((1ul << width) - 1))
9497 			      func (stream, "%c", *c);
9498 			    break;
9499 			  case '?':
9500 			    func (stream, "%c", c[(1 << width) - (int) value]);
9501 			    c += 1 << width;
9502 			    break;
9503 			  default:
9504 			    abort ();
9505 			  }
9506 		      }
9507 		      break;
9508 
9509 		    default:
9510 		      abort ();
9511 		    }
9512 		}
9513 	      else
9514 		func (stream, "%c", *c);
9515 	    }
9516 
9517 	  if (value_in_comment > 32 || value_in_comment < -16)
9518 	    func (stream, "\t; 0x%lx", value_in_comment);
9519 
9520 	  if (is_unpredictable)
9521 	    func (stream, UNPREDICTABLE_INSTRUCTION);
9522 
9523 	  return TRUE;
9524 	}
9525     }
9526   return FALSE;
9527 }
9528 
9529 /* Print one mve instruction on INFO->STREAM.
9530    Return TRUE if the instuction matched, FALSE if this is not a
9531    recognised mve instruction.  */
9532 
9533 static bfd_boolean
9534 print_insn_mve (struct disassemble_info *info, long given)
9535 {
9536   const struct mopcode32 *insn;
9537   void *stream = info->stream;
9538   fprintf_ftype func = info->fprintf_func;
9539 
9540   for (insn = mve_opcodes; insn->assembler; insn++)
9541     {
9542       if (((given & insn->mask) == insn->value)
9543 	  && !is_mve_encoding_conflict (given, insn->mve_op))
9544 	{
9545 	  signed long value_in_comment = 0;
9546 	  bfd_boolean is_unpredictable = FALSE;
9547 	  bfd_boolean is_undefined = FALSE;
9548 	  const char *c;
9549 	  enum mve_unpredictable unpredictable_cond = UNPRED_NONE;
9550 	  enum mve_undefined undefined_cond = UNDEF_NONE;
9551 
9552 	  /* Most vector mve instruction are illegal in a it block.
9553 	     There are a few exceptions; check for them.  */
9554 	  if (ifthen_state && !is_mve_okay_in_it (insn->mve_op))
9555 	    {
9556 	      is_unpredictable = TRUE;
9557 	      unpredictable_cond = UNPRED_IT_BLOCK;
9558 	    }
9559 	  else if (is_mve_unpredictable (given, insn->mve_op,
9560 					 &unpredictable_cond))
9561 	    is_unpredictable = TRUE;
9562 
9563 	  if (is_mve_undefined (given, insn->mve_op, &undefined_cond))
9564 	    is_undefined = TRUE;
9565 
9566 	  /* In "VORR Qd, Qm, Qn", if Qm==Qn, VORR is nothing but VMOV,
9567 	     i.e "VMOV Qd, Qm".  */
9568 	  if ((insn->mve_op == MVE_VORR_REG)
9569 	      && (arm_decode_field (given, 1, 3)
9570 		  == arm_decode_field (given, 17, 19)))
9571 	    continue;
9572 
9573 	  for (c = insn->assembler; *c; c++)
9574 	    {
9575 	      if (*c == '%')
9576 		{
9577 		  switch (*++c)
9578 		    {
9579 		    case '%':
9580 		      func (stream, "%%");
9581 		      break;
9582 
9583 		    case 'a':
9584 		      /* Don't print anything for '+' as it is implied.  */
9585 		      if (arm_decode_field (given, 23, 23) == 0)
9586 			func (stream, "-");
9587 		      break;
9588 
9589 		    case 'c':
9590 		      if (ifthen_state)
9591 			func (stream, "%s", arm_conditional[IFTHEN_COND]);
9592 		      break;
9593 
9594 		    case 'd':
9595 		      print_mve_vld_str_addr (info, given, insn->mve_op);
9596 		      break;
9597 
9598 		    case 'i':
9599 		      {
9600 			long mve_mask = mve_extract_pred_mask (given);
9601 			func (stream, "%s", mve_predicatenames[mve_mask]);
9602 		      }
9603 		      break;
9604 
9605 		    case 'j':
9606 		      {
9607 			unsigned int imm5 = 0;
9608 			imm5 |= arm_decode_field (given, 6, 7);
9609 			imm5 |= (arm_decode_field (given, 12, 14) << 2);
9610 			func (stream, "#%u", (imm5 == 0) ? 32 : imm5);
9611 		      }
9612 		      break;
9613 
9614 		    case 'k':
9615 		      func (stream, "#%u",
9616 			    (arm_decode_field (given, 7, 7) == 0) ? 64 : 48);
9617 		      break;
9618 
9619 		    case 'n':
9620 		      print_vec_condition (info, given, insn->mve_op);
9621 		      break;
9622 
9623 		    case 'o':
9624 		      if (arm_decode_field (given, 0, 0) == 1)
9625 			{
9626 			  unsigned long size
9627 			    = arm_decode_field (given, 4, 4)
9628 			      | (arm_decode_field (given, 6, 6) << 1);
9629 
9630 			  func (stream, ", uxtw #%lu", size);
9631 			}
9632 		      break;
9633 
9634 		    case 'm':
9635 		      print_mve_rounding_mode (info, given, insn->mve_op);
9636 		      break;
9637 
9638 		    case 's':
9639 		      print_mve_vcvt_size (info, given, insn->mve_op);
9640 		      break;
9641 
9642 		    case 'u':
9643 		      {
9644 			unsigned long op1 = arm_decode_field (given, 21, 22);
9645 
9646 			if ((insn->mve_op == MVE_VMOV_VEC_LANE_TO_GP))
9647 			  {
9648 			    /* Check for signed.  */
9649 			    if (arm_decode_field (given, 23, 23) == 0)
9650 			      {
9651 				/* We don't print 's' for S32.  */
9652 				if ((arm_decode_field (given, 5, 6) == 0)
9653 				    && ((op1 == 0) || (op1 == 1)))
9654 				  ;
9655 				else
9656 				  func (stream, "s");
9657 			      }
9658 			    else
9659 			      func (stream, "u");
9660 			  }
9661 			else
9662 			  {
9663 			    if (arm_decode_field (given, 28, 28) == 0)
9664 			      func (stream, "s");
9665 			    else
9666 			      func (stream, "u");
9667 			  }
9668 		      }
9669 		      break;
9670 
9671 		    case 'v':
9672 		      print_instruction_predicate (info);
9673 		      break;
9674 
9675 		    case 'w':
9676 		      if (arm_decode_field (given, 21, 21) == 1)
9677 			func (stream, "!");
9678 		      break;
9679 
9680 		    case 'B':
9681 		      print_mve_register_blocks (info, given, insn->mve_op);
9682 		      break;
9683 
9684 		    case 'E':
9685 		      /* SIMD encoded constant for mov, mvn, vorr, vbic.  */
9686 
9687 		      print_simd_imm8 (info, given, 28, insn);
9688 		      break;
9689 
9690 		    case 'N':
9691 		      print_mve_vmov_index (info, given);
9692 		      break;
9693 
9694 		    case 'T':
9695 		      if (arm_decode_field (given, 12, 12) == 0)
9696 			func (stream, "b");
9697 		      else
9698 			func (stream, "t");
9699 		      break;
9700 
9701 		    case 'X':
9702 		      if (arm_decode_field (given, 12, 12) == 1)
9703 			func (stream, "x");
9704 		      break;
9705 
9706 		    case '0': case '1': case '2': case '3': case '4':
9707 		    case '5': case '6': case '7': case '8': case '9':
9708 		      {
9709 			int width;
9710 			unsigned long value;
9711 
9712 			c = arm_decode_bitfield (c, given, &value, &width);
9713 
9714 			switch (*c)
9715 			  {
9716 			  case 'Z':
9717 			    if (value == 13)
9718 			      is_unpredictable = TRUE;
9719 			    else if (value == 15)
9720 			      func (stream, "zr");
9721 			    else
9722 			      func (stream, "%s", arm_regnames[value]);
9723 			    break;
9724 
9725 			  case 'c':
9726 			    func (stream, "%s", arm_conditional[value]);
9727 			    break;
9728 
9729 			  case 'C':
9730 			    value ^= 1;
9731 			    func (stream, "%s", arm_conditional[value]);
9732 			    break;
9733 
9734 			  case 'S':
9735 			    if (value == 13 || value == 15)
9736 			      is_unpredictable = TRUE;
9737 			    else
9738 			      func (stream, "%s", arm_regnames[value]);
9739 			    break;
9740 
9741 			  case 's':
9742 			    print_mve_size (info,
9743 					    value,
9744 					    insn->mve_op);
9745 			    break;
9746 			  case 'I':
9747 			    if (value == 1)
9748 			      func (stream, "i");
9749 			    break;
9750 			  case 'A':
9751 			    if (value == 1)
9752 			      func (stream, "a");
9753 			    break;
9754 			  case 'h':
9755 			    {
9756 			      unsigned int odd_reg = (value << 1) | 1;
9757 			      func (stream, "%s", arm_regnames[odd_reg]);
9758 			    }
9759 			    break;
9760 			  case 'i':
9761 			    {
9762 			      unsigned long imm
9763 				= arm_decode_field (given, 0, 6);
9764 			      unsigned long mod_imm = imm;
9765 
9766 			      switch (insn->mve_op)
9767 				{
9768 				case MVE_VLDRW_GATHER_T5:
9769 				case MVE_VSTRW_SCATTER_T5:
9770 				  mod_imm = mod_imm << 2;
9771 				  break;
9772 				case MVE_VSTRD_SCATTER_T6:
9773 				case MVE_VLDRD_GATHER_T6:
9774 				  mod_imm = mod_imm << 3;
9775 				  break;
9776 
9777 				default:
9778 				  break;
9779 				}
9780 
9781 			      func (stream, "%lu", mod_imm);
9782 			    }
9783 			    break;
9784 			  case 'k':
9785 			    func (stream, "%lu", 64 - value);
9786 			    break;
9787 			  case 'l':
9788 			    {
9789 			      unsigned int even_reg = value << 1;
9790 			      func (stream, "%s", arm_regnames[even_reg]);
9791 			    }
9792 			    break;
9793 			  case 'u':
9794 			    switch (value)
9795 			      {
9796 			      case 0:
9797 				func (stream, "1");
9798 				break;
9799 			      case 1:
9800 				func (stream, "2");
9801 				break;
9802 			      case 2:
9803 				func (stream, "4");
9804 				break;
9805 			      case 3:
9806 				func (stream, "8");
9807 				break;
9808 			      default:
9809 				break;
9810 			      }
9811 			    break;
9812 			  case 'o':
9813 			    print_mve_rotate (info, value, width);
9814 			    break;
9815 			  case 'r':
9816 			    func (stream, "%s", arm_regnames[value]);
9817 			    break;
9818 			  case 'd':
9819 			    if (insn->mve_op == MVE_VQSHL_T2
9820 				|| insn->mve_op == MVE_VQSHLU_T3
9821 				|| insn->mve_op == MVE_VRSHR
9822 				|| insn->mve_op == MVE_VRSHRN
9823 				|| insn->mve_op == MVE_VSHL_T1
9824 				|| insn->mve_op == MVE_VSHLL_T1
9825 				|| insn->mve_op == MVE_VSHR
9826 				|| insn->mve_op == MVE_VSHRN
9827 				|| insn->mve_op == MVE_VSLI
9828 				|| insn->mve_op == MVE_VSRI)
9829 			      print_mve_shift_n (info, given, insn->mve_op);
9830 			    else if (insn->mve_op == MVE_VSHLL_T2)
9831 			      {
9832 				switch (value)
9833 				  {
9834 				  case 0x00:
9835 				    func (stream, "8");
9836 				    break;
9837 				  case 0x01:
9838 				    func (stream, "16");
9839 				    break;
9840 				  case 0x10:
9841 				    print_mve_undefined (info, UNDEF_SIZE_0);
9842 				    break;
9843 				  default:
9844 				    assert (0);
9845 				    break;
9846 				  }
9847 			      }
9848 			    else
9849 			      {
9850 				if (insn->mve_op == MVE_VSHLC && value == 0)
9851 				  value = 32;
9852 				func (stream, "%ld", value);
9853 				value_in_comment = value;
9854 			      }
9855 			    break;
9856 			  case 'F':
9857 			    func (stream, "s%ld", value);
9858 			    break;
9859 			  case 'Q':
9860 			    if (value & 0x8)
9861 			      func (stream, "<illegal reg q%ld.5>", value);
9862 			    else
9863 			      func (stream, "q%ld", value);
9864 			    break;
9865 			  case 'x':
9866 			    func (stream, "0x%08lx", value);
9867 			    break;
9868 			  default:
9869 			    abort ();
9870 			  }
9871 			break;
9872 		      default:
9873 			abort ();
9874 		      }
9875 		    }
9876 		}
9877 	      else
9878 		func (stream, "%c", *c);
9879 	    }
9880 
9881 	  if (value_in_comment > 32 || value_in_comment < -16)
9882 	    func (stream, "\t; 0x%lx", value_in_comment);
9883 
9884 	  if (is_unpredictable)
9885 	    print_mve_unpredictable (info, unpredictable_cond);
9886 
9887 	  if (is_undefined)
9888 	    print_mve_undefined (info, undefined_cond);
9889 
9890 	  if ((vpt_block_state.in_vpt_block == FALSE)
9891 	      && !ifthen_state
9892 	      && (is_vpt_instruction (given) == TRUE))
9893 	    mark_inside_vpt_block (given);
9894 	  else if (vpt_block_state.in_vpt_block == TRUE)
9895 	    update_vpt_block_state ();
9896 
9897 	  return TRUE;
9898 	}
9899     }
9900   return FALSE;
9901 }
9902 
9903 
9904 /* Return the name of a v7A special register.  */
9905 
9906 static const char *
9907 banked_regname (unsigned reg)
9908 {
9909   switch (reg)
9910     {
9911       case 15: return "CPSR";
9912       case 32: return "R8_usr";
9913       case 33: return "R9_usr";
9914       case 34: return "R10_usr";
9915       case 35: return "R11_usr";
9916       case 36: return "R12_usr";
9917       case 37: return "SP_usr";
9918       case 38: return "LR_usr";
9919       case 40: return "R8_fiq";
9920       case 41: return "R9_fiq";
9921       case 42: return "R10_fiq";
9922       case 43: return "R11_fiq";
9923       case 44: return "R12_fiq";
9924       case 45: return "SP_fiq";
9925       case 46: return "LR_fiq";
9926       case 48: return "LR_irq";
9927       case 49: return "SP_irq";
9928       case 50: return "LR_svc";
9929       case 51: return "SP_svc";
9930       case 52: return "LR_abt";
9931       case 53: return "SP_abt";
9932       case 54: return "LR_und";
9933       case 55: return "SP_und";
9934       case 60: return "LR_mon";
9935       case 61: return "SP_mon";
9936       case 62: return "ELR_hyp";
9937       case 63: return "SP_hyp";
9938       case 79: return "SPSR";
9939       case 110: return "SPSR_fiq";
9940       case 112: return "SPSR_irq";
9941       case 114: return "SPSR_svc";
9942       case 116: return "SPSR_abt";
9943       case 118: return "SPSR_und";
9944       case 124: return "SPSR_mon";
9945       case 126: return "SPSR_hyp";
9946       default: return NULL;
9947     }
9948 }
9949 
9950 /* Return the name of the DMB/DSB option.  */
9951 static const char *
9952 data_barrier_option (unsigned option)
9953 {
9954   switch (option & 0xf)
9955     {
9956     case 0xf: return "sy";
9957     case 0xe: return "st";
9958     case 0xd: return "ld";
9959     case 0xb: return "ish";
9960     case 0xa: return "ishst";
9961     case 0x9: return "ishld";
9962     case 0x7: return "un";
9963     case 0x6: return "unst";
9964     case 0x5: return "nshld";
9965     case 0x3: return "osh";
9966     case 0x2: return "oshst";
9967     case 0x1: return "oshld";
9968     default:  return NULL;
9969     }
9970 }
9971 
9972 /* Print one ARM instruction from PC on INFO->STREAM.  */
9973 
9974 static void
9975 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
9976 {
9977   const struct opcode32 *insn;
9978   void *stream = info->stream;
9979   fprintf_ftype func = info->fprintf_func;
9980   struct arm_private_data *private_data = info->private_data;
9981 
9982   if (print_insn_coprocessor (pc, info, given, FALSE))
9983     return;
9984 
9985   if (print_insn_neon (info, given, FALSE))
9986     return;
9987 
9988   if (print_insn_generic_coprocessor (pc, info, given, FALSE))
9989     return;
9990 
9991   for (insn = arm_opcodes; insn->assembler; insn++)
9992     {
9993       if ((given & insn->mask) != insn->value)
9994 	continue;
9995 
9996       if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features))
9997 	continue;
9998 
9999       /* Special case: an instruction with all bits set in the condition field
10000 	 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
10001 	 or by the catchall at the end of the table.  */
10002       if ((given & 0xF0000000) != 0xF0000000
10003 	  || (insn->mask & 0xF0000000) == 0xF0000000
10004 	  || (insn->mask == 0 && insn->value == 0))
10005 	{
10006 	  unsigned long u_reg = 16;
10007 	  unsigned long U_reg = 16;
10008 	  bfd_boolean is_unpredictable = FALSE;
10009 	  signed long value_in_comment = 0;
10010 	  const char *c;
10011 
10012 	  for (c = insn->assembler; *c; c++)
10013 	    {
10014 	      if (*c == '%')
10015 		{
10016 		  bfd_boolean allow_unpredictable = FALSE;
10017 
10018 		  switch (*++c)
10019 		    {
10020 		    case '%':
10021 		      func (stream, "%%");
10022 		      break;
10023 
10024 		    case 'a':
10025 		      value_in_comment = print_arm_address (pc, info, given);
10026 		      break;
10027 
10028 		    case 'P':
10029 		      /* Set P address bit and use normal address
10030 			 printing routine.  */
10031 		      value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT));
10032 		      break;
10033 
10034 		    case 'S':
10035 		      allow_unpredictable = TRUE;
10036 		      /* Fall through.  */
10037 		    case 's':
10038                       if ((given & 0x004f0000) == 0x004f0000)
10039 			{
10040                           /* PC relative with immediate offset.  */
10041 			  bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf);
10042 
10043 			  if (PRE_BIT_SET)
10044 			    {
10045 			      /* Elide positive zero offset.  */
10046 			      if (offset || NEGATIVE_BIT_SET)
10047 				func (stream, "[pc, #%s%d]\t; ",
10048 				      NEGATIVE_BIT_SET ? "-" : "", (int) offset);
10049 			      else
10050 				func (stream, "[pc]\t; ");
10051 			      if (NEGATIVE_BIT_SET)
10052 				offset = -offset;
10053 			      info->print_address_func (offset + pc + 8, info);
10054 			    }
10055 			  else
10056 			    {
10057 			      /* Always show the offset.  */
10058 			      func (stream, "[pc], #%s%d",
10059 				    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
10060 			      if (! allow_unpredictable)
10061 				is_unpredictable = TRUE;
10062 			    }
10063 			}
10064 		      else
10065 			{
10066 			  int offset = ((given & 0xf00) >> 4) | (given & 0xf);
10067 
10068 			  func (stream, "[%s",
10069 				arm_regnames[(given >> 16) & 0xf]);
10070 
10071 			  if (PRE_BIT_SET)
10072 			    {
10073 			      if (IMMEDIATE_BIT_SET)
10074 				{
10075 				  /* Elide offset for non-writeback
10076 				     positive zero.  */
10077 				  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET
10078 				      || offset)
10079 				    func (stream, ", #%s%d",
10080 					  NEGATIVE_BIT_SET ? "-" : "", offset);
10081 
10082 				  if (NEGATIVE_BIT_SET)
10083 				    offset = -offset;
10084 
10085 				  value_in_comment = offset;
10086 				}
10087 			      else
10088 				{
10089 				  /* Register Offset or Register Pre-Indexed.  */
10090 				  func (stream, ", %s%s",
10091 					NEGATIVE_BIT_SET ? "-" : "",
10092 					arm_regnames[given & 0xf]);
10093 
10094 				  /* Writing back to the register that is the source/
10095 				     destination of the load/store is unpredictable.  */
10096 				  if (! allow_unpredictable
10097 				      && WRITEBACK_BIT_SET
10098 				      && ((given & 0xf) == ((given >> 12) & 0xf)))
10099 				    is_unpredictable = TRUE;
10100 				}
10101 
10102 			      func (stream, "]%s",
10103 				    WRITEBACK_BIT_SET ? "!" : "");
10104 			    }
10105 			  else
10106 			    {
10107 			      if (IMMEDIATE_BIT_SET)
10108 				{
10109 				  /* Immediate Post-indexed.  */
10110 				  /* PR 10924: Offset must be printed, even if it is zero.  */
10111 				  func (stream, "], #%s%d",
10112 					NEGATIVE_BIT_SET ? "-" : "", offset);
10113 				  if (NEGATIVE_BIT_SET)
10114 				    offset = -offset;
10115 				  value_in_comment = offset;
10116 				}
10117 			      else
10118 				{
10119 				  /* Register Post-indexed.  */
10120 				  func (stream, "], %s%s",
10121 					NEGATIVE_BIT_SET ? "-" : "",
10122 					arm_regnames[given & 0xf]);
10123 
10124 				  /* Writing back to the register that is the source/
10125 				     destination of the load/store is unpredictable.  */
10126 				  if (! allow_unpredictable
10127 				      && (given & 0xf) == ((given >> 12) & 0xf))
10128 				    is_unpredictable = TRUE;
10129 				}
10130 
10131 			      if (! allow_unpredictable)
10132 				{
10133 				  /* Writeback is automatically implied by post- addressing.
10134 				     Setting the W bit is unnecessary and ARM specify it as
10135 				     being unpredictable.  */
10136 				  if (WRITEBACK_BIT_SET
10137 				      /* Specifying the PC register as the post-indexed
10138 					 registers is also unpredictable.  */
10139 				      || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf)))
10140 				    is_unpredictable = TRUE;
10141 				}
10142 			    }
10143 			}
10144 		      break;
10145 
10146 		    case 'b':
10147 		      {
10148 			bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
10149 			bfd_vma target = disp * 4 + pc + 8;
10150 			info->print_address_func (target, info);
10151 
10152 			/* Fill in instruction information.  */
10153 			info->insn_info_valid = 1;
10154 			info->insn_type = dis_branch;
10155 			info->target = target;
10156 		      }
10157 		      break;
10158 
10159 		    case 'c':
10160 		      if (((given >> 28) & 0xf) != 0xe)
10161 			func (stream, "%s",
10162 			      arm_conditional [(given >> 28) & 0xf]);
10163 		      break;
10164 
10165 		    case 'm':
10166 		      {
10167 			int started = 0;
10168 			int reg;
10169 
10170 			func (stream, "{");
10171 			for (reg = 0; reg < 16; reg++)
10172 			  if ((given & (1 << reg)) != 0)
10173 			    {
10174 			      if (started)
10175 				func (stream, ", ");
10176 			      started = 1;
10177 			      func (stream, "%s", arm_regnames[reg]);
10178 			    }
10179 			func (stream, "}");
10180 			if (! started)
10181 			  is_unpredictable = TRUE;
10182 		      }
10183 		      break;
10184 
10185 		    case 'q':
10186 		      arm_decode_shift (given, func, stream, FALSE);
10187 		      break;
10188 
10189 		    case 'o':
10190 		      if ((given & 0x02000000) != 0)
10191 			{
10192 			  unsigned int rotate = (given & 0xf00) >> 7;
10193 			  unsigned int immed = (given & 0xff);
10194 			  unsigned int a, i;
10195 
10196 			  a = (immed << ((32 - rotate) & 31)
10197 			       | immed >> rotate) & 0xffffffff;
10198 			  /* If there is another encoding with smaller rotate,
10199 			     the rotate should be specified directly.  */
10200 			  for (i = 0; i < 32; i += 2)
10201 			    if ((a << i | a >> ((32 - i) & 31)) <= 0xff)
10202 			      break;
10203 
10204 			  if (i != rotate)
10205 			    func (stream, "#%d, %d", immed, rotate);
10206 			  else
10207 			    func (stream, "#%d", a);
10208 			  value_in_comment = a;
10209 			}
10210 		      else
10211 			arm_decode_shift (given, func, stream, TRUE);
10212 		      break;
10213 
10214 		    case 'p':
10215 		      if ((given & 0x0000f000) == 0x0000f000)
10216 			{
10217 			  arm_feature_set arm_ext_v6 =
10218 			    ARM_FEATURE_CORE_LOW (ARM_EXT_V6);
10219 
10220 			  /* The p-variants of tst/cmp/cmn/teq are the pre-V6
10221 			     mechanism for setting PSR flag bits.  They are
10222 			     obsolete in V6 onwards.  */
10223 			  if (! ARM_CPU_HAS_FEATURE (private_data->features, \
10224 						     arm_ext_v6))
10225 			    func (stream, "p");
10226 			  else
10227 			    is_unpredictable = TRUE;
10228 			}
10229 		      break;
10230 
10231 		    case 't':
10232 		      if ((given & 0x01200000) == 0x00200000)
10233 			func (stream, "t");
10234 		      break;
10235 
10236 		    case 'A':
10237 		      {
10238 			int offset = given & 0xff;
10239 
10240 			value_in_comment = offset * 4;
10241 			if (NEGATIVE_BIT_SET)
10242 			  value_in_comment = - value_in_comment;
10243 
10244 			func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
10245 
10246 			if (PRE_BIT_SET)
10247 			  {
10248 			    if (offset)
10249 			      func (stream, ", #%d]%s",
10250 				    (int) value_in_comment,
10251 				    WRITEBACK_BIT_SET ? "!" : "");
10252 			    else
10253 			      func (stream, "]");
10254 			  }
10255 			else
10256 			  {
10257 			    func (stream, "]");
10258 
10259 			    if (WRITEBACK_BIT_SET)
10260 			      {
10261 				if (offset)
10262 				  func (stream, ", #%d", (int) value_in_comment);
10263 			      }
10264 			    else
10265 			      {
10266 				func (stream, ", {%d}", (int) offset);
10267 				value_in_comment = offset;
10268 			      }
10269 			  }
10270 		      }
10271 		      break;
10272 
10273 		    case 'B':
10274 		      /* Print ARM V5 BLX(1) address: pc+25 bits.  */
10275 		      {
10276 			bfd_vma address;
10277 			bfd_vma offset = 0;
10278 
10279 			if (! NEGATIVE_BIT_SET)
10280 			  /* Is signed, hi bits should be ones.  */
10281 			  offset = (-1) ^ 0x00ffffff;
10282 
10283 			/* Offset is (SignExtend(offset field)<<2).  */
10284 			offset += given & 0x00ffffff;
10285 			offset <<= 2;
10286 			address = offset + pc + 8;
10287 
10288 			if (given & 0x01000000)
10289 			  /* H bit allows addressing to 2-byte boundaries.  */
10290 			  address += 2;
10291 
10292 		        info->print_address_func (address, info);
10293 
10294 			/* Fill in instruction information.  */
10295 			info->insn_info_valid = 1;
10296 			info->insn_type = dis_branch;
10297 			info->target = address;
10298 		      }
10299 		      break;
10300 
10301 		    case 'C':
10302 		      if ((given & 0x02000200) == 0x200)
10303 			{
10304 			  const char * name;
10305 			  unsigned sysm = (given & 0x004f0000) >> 16;
10306 
10307 			  sysm |= (given & 0x300) >> 4;
10308 			  name = banked_regname (sysm);
10309 
10310 			  if (name != NULL)
10311 			    func (stream, "%s", name);
10312 			  else
10313 			    func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
10314 			}
10315 		      else
10316 			{
10317 			  func (stream, "%cPSR_",
10318 				(given & 0x00400000) ? 'S' : 'C');
10319 			  if (given & 0x80000)
10320 			    func (stream, "f");
10321 			  if (given & 0x40000)
10322 			    func (stream, "s");
10323 			  if (given & 0x20000)
10324 			    func (stream, "x");
10325 			  if (given & 0x10000)
10326 			    func (stream, "c");
10327 			}
10328 		      break;
10329 
10330 		    case 'U':
10331 		      if ((given & 0xf0) == 0x60)
10332 			{
10333 			  switch (given & 0xf)
10334 			    {
10335 			    case 0xf: func (stream, "sy"); break;
10336 			    default:
10337 			      func (stream, "#%d", (int) given & 0xf);
10338 			      break;
10339 			    }
10340 			}
10341 		      else
10342 			{
10343 			  const char * opt = data_barrier_option (given & 0xf);
10344 			  if (opt != NULL)
10345 			    func (stream, "%s", opt);
10346 			  else
10347 			      func (stream, "#%d", (int) given & 0xf);
10348 			}
10349 		      break;
10350 
10351 		    case '0': case '1': case '2': case '3': case '4':
10352 		    case '5': case '6': case '7': case '8': case '9':
10353 		      {
10354 			int width;
10355 			unsigned long value;
10356 
10357 			c = arm_decode_bitfield (c, given, &value, &width);
10358 
10359 			switch (*c)
10360 			  {
10361 			  case 'R':
10362 			    if (value == 15)
10363 			      is_unpredictable = TRUE;
10364 			    /* Fall through.  */
10365 			  case 'r':
10366 			  case 'T':
10367 			    /* We want register + 1 when decoding T.  */
10368 			    if (*c == 'T')
10369 			      value = (value + 1) & 0xf;
10370 
10371 			    if (c[1] == 'u')
10372 			      {
10373 				/* Eat the 'u' character.  */
10374 				++ c;
10375 
10376 				if (u_reg == value)
10377 				  is_unpredictable = TRUE;
10378 				u_reg = value;
10379 			      }
10380 			    if (c[1] == 'U')
10381 			      {
10382 				/* Eat the 'U' character.  */
10383 				++ c;
10384 
10385 				if (U_reg == value)
10386 				  is_unpredictable = TRUE;
10387 				U_reg = value;
10388 			      }
10389 			    func (stream, "%s", arm_regnames[value]);
10390 			    break;
10391 			  case 'd':
10392 			    func (stream, "%ld", value);
10393 			    value_in_comment = value;
10394 			    break;
10395 			  case 'b':
10396 			    func (stream, "%ld", value * 8);
10397 			    value_in_comment = value * 8;
10398 			    break;
10399 			  case 'W':
10400 			    func (stream, "%ld", value + 1);
10401 			    value_in_comment = value + 1;
10402 			    break;
10403 			  case 'x':
10404 			    func (stream, "0x%08lx", value);
10405 
10406 			    /* Some SWI instructions have special
10407 			       meanings.  */
10408 			    if ((given & 0x0fffffff) == 0x0FF00000)
10409 			      func (stream, "\t; IMB");
10410 			    else if ((given & 0x0fffffff) == 0x0FF00001)
10411 			      func (stream, "\t; IMBRange");
10412 			    break;
10413 			  case 'X':
10414 			    func (stream, "%01lx", value & 0xf);
10415 			    value_in_comment = value;
10416 			    break;
10417 			  case '`':
10418 			    c++;
10419 			    if (value == 0)
10420 			      func (stream, "%c", *c);
10421 			    break;
10422 			  case '\'':
10423 			    c++;
10424 			    if (value == ((1ul << width) - 1))
10425 			      func (stream, "%c", *c);
10426 			    break;
10427 			  case '?':
10428 			    func (stream, "%c", c[(1 << width) - (int) value]);
10429 			    c += 1 << width;
10430 			    break;
10431 			  default:
10432 			    abort ();
10433 			  }
10434 		      }
10435 		      break;
10436 
10437 		    case 'e':
10438 		      {
10439 			int imm;
10440 
10441 			imm = (given & 0xf) | ((given & 0xfff00) >> 4);
10442 			func (stream, "%d", imm);
10443 			value_in_comment = imm;
10444 		      }
10445 		      break;
10446 
10447 		    case 'E':
10448 		      /* LSB and WIDTH fields of BFI or BFC.  The machine-
10449 			 language instruction encodes LSB and MSB.  */
10450 		      {
10451 			long msb = (given & 0x001f0000) >> 16;
10452 			long lsb = (given & 0x00000f80) >> 7;
10453 			long w = msb - lsb + 1;
10454 
10455 			if (w > 0)
10456 			  func (stream, "#%lu, #%lu", lsb, w);
10457 			else
10458 			  func (stream, "(invalid: %lu:%lu)", lsb, msb);
10459 		      }
10460 		      break;
10461 
10462 		    case 'R':
10463 		      /* Get the PSR/banked register name.  */
10464 		      {
10465 			const char * name;
10466 			unsigned sysm = (given & 0x004f0000) >> 16;
10467 
10468 			sysm |= (given & 0x300) >> 4;
10469 			name = banked_regname (sysm);
10470 
10471 			if (name != NULL)
10472 			  func (stream, "%s", name);
10473 			else
10474 			  func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
10475 		      }
10476 		      break;
10477 
10478 		    case 'V':
10479 		      /* 16-bit unsigned immediate from a MOVT or MOVW
10480 			 instruction, encoded in bits 0:11 and 15:19.  */
10481 		      {
10482 			long hi = (given & 0x000f0000) >> 4;
10483 			long lo = (given & 0x00000fff);
10484 			long imm16 = hi | lo;
10485 
10486 			func (stream, "#%lu", imm16);
10487 			value_in_comment = imm16;
10488 		      }
10489 		      break;
10490 
10491 		    default:
10492 		      abort ();
10493 		    }
10494 		}
10495 	      else
10496 		func (stream, "%c", *c);
10497 	    }
10498 
10499 	  if (value_in_comment > 32 || value_in_comment < -16)
10500 	    func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL));
10501 
10502 	  if (is_unpredictable)
10503 	    func (stream, UNPREDICTABLE_INSTRUCTION);
10504 
10505 	  return;
10506 	}
10507     }
10508   func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
10509   return;
10510 }
10511 
10512 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM.  */
10513 
10514 static void
10515 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
10516 {
10517   const struct opcode16 *insn;
10518   void *stream = info->stream;
10519   fprintf_ftype func = info->fprintf_func;
10520 
10521   for (insn = thumb_opcodes; insn->assembler; insn++)
10522     if ((given & insn->mask) == insn->value)
10523       {
10524 	signed long value_in_comment = 0;
10525 	const char *c = insn->assembler;
10526 
10527 	for (; *c; c++)
10528 	  {
10529 	    int domaskpc = 0;
10530 	    int domasklr = 0;
10531 
10532 	    if (*c != '%')
10533 	      {
10534 		func (stream, "%c", *c);
10535 		continue;
10536 	      }
10537 
10538 	    switch (*++c)
10539 	      {
10540 	      case '%':
10541 		func (stream, "%%");
10542 		break;
10543 
10544 	      case 'c':
10545 		if (ifthen_state)
10546 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
10547 		break;
10548 
10549 	      case 'C':
10550 		if (ifthen_state)
10551 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
10552 		else
10553 		  func (stream, "s");
10554 		break;
10555 
10556 	      case 'I':
10557 		{
10558 		  unsigned int tmp;
10559 
10560 		  ifthen_next_state = given & 0xff;
10561 		  for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
10562 		    func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
10563 		  func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
10564 		}
10565 		break;
10566 
10567 	      case 'x':
10568 		if (ifthen_next_state)
10569 		  func (stream, "\t; unpredictable branch in IT block\n");
10570 		break;
10571 
10572 	      case 'X':
10573 		if (ifthen_state)
10574 		  func (stream, "\t; unpredictable <IT:%s>",
10575 			arm_conditional[IFTHEN_COND]);
10576 		break;
10577 
10578 	      case 'S':
10579 		{
10580 		  long reg;
10581 
10582 		  reg = (given >> 3) & 0x7;
10583 		  if (given & (1 << 6))
10584 		    reg += 8;
10585 
10586 		  func (stream, "%s", arm_regnames[reg]);
10587 		}
10588 		break;
10589 
10590 	      case 'D':
10591 		{
10592 		  long reg;
10593 
10594 		  reg = given & 0x7;
10595 		  if (given & (1 << 7))
10596 		    reg += 8;
10597 
10598 		  func (stream, "%s", arm_regnames[reg]);
10599 		}
10600 		break;
10601 
10602 	      case 'N':
10603 		if (given & (1 << 8))
10604 		  domasklr = 1;
10605 		/* Fall through.  */
10606 	      case 'O':
10607 		if (*c == 'O' && (given & (1 << 8)))
10608 		  domaskpc = 1;
10609 		/* Fall through.  */
10610 	      case 'M':
10611 		{
10612 		  int started = 0;
10613 		  int reg;
10614 
10615 		  func (stream, "{");
10616 
10617 		  /* It would be nice if we could spot
10618 		     ranges, and generate the rS-rE format: */
10619 		  for (reg = 0; (reg < 8); reg++)
10620 		    if ((given & (1 << reg)) != 0)
10621 		      {
10622 			if (started)
10623 			  func (stream, ", ");
10624 			started = 1;
10625 			func (stream, "%s", arm_regnames[reg]);
10626 		      }
10627 
10628 		  if (domasklr)
10629 		    {
10630 		      if (started)
10631 			func (stream, ", ");
10632 		      started = 1;
10633 		      func (stream, "%s", arm_regnames[14] /* "lr" */);
10634 		    }
10635 
10636 		  if (domaskpc)
10637 		    {
10638 		      if (started)
10639 			func (stream, ", ");
10640 		      func (stream, "%s", arm_regnames[15] /* "pc" */);
10641 		    }
10642 
10643 		  func (stream, "}");
10644 		}
10645 		break;
10646 
10647 	      case 'W':
10648 		/* Print writeback indicator for a LDMIA.  We are doing a
10649 		   writeback if the base register is not in the register
10650 		   mask.  */
10651 		if ((given & (1 << ((given & 0x0700) >> 8))) == 0)
10652 		  func (stream, "!");
10653 		break;
10654 
10655 	      case 'b':
10656 		/* Print ARM V6T2 CZB address: pc+4+6 bits.  */
10657 		{
10658 		  bfd_vma address = (pc + 4
10659 				     + ((given & 0x00f8) >> 2)
10660 				     + ((given & 0x0200) >> 3));
10661 		  info->print_address_func (address, info);
10662 
10663 		  /* Fill in instruction information.  */
10664 		  info->insn_info_valid = 1;
10665 		  info->insn_type = dis_branch;
10666 		  info->target = address;
10667 		}
10668 		break;
10669 
10670 	      case 's':
10671 		/* Right shift immediate -- bits 6..10; 1-31 print
10672 		   as themselves, 0 prints as 32.  */
10673 		{
10674 		  long imm = (given & 0x07c0) >> 6;
10675 		  if (imm == 0)
10676 		    imm = 32;
10677 		  func (stream, "#%ld", imm);
10678 		}
10679 		break;
10680 
10681 	      case '0': case '1': case '2': case '3': case '4':
10682 	      case '5': case '6': case '7': case '8': case '9':
10683 		{
10684 		  int bitstart = *c++ - '0';
10685 		  int bitend = 0;
10686 
10687 		  while (*c >= '0' && *c <= '9')
10688 		    bitstart = (bitstart * 10) + *c++ - '0';
10689 
10690 		  switch (*c)
10691 		    {
10692 		    case '-':
10693 		      {
10694 			bfd_vma reg;
10695 
10696 			c++;
10697 			while (*c >= '0' && *c <= '9')
10698 			  bitend = (bitend * 10) + *c++ - '0';
10699 			if (!bitend)
10700 			  abort ();
10701 			reg = given >> bitstart;
10702 			reg &= (2 << (bitend - bitstart)) - 1;
10703 
10704 			switch (*c)
10705 			  {
10706 			  case 'r':
10707 			    func (stream, "%s", arm_regnames[reg]);
10708 			    break;
10709 
10710 			  case 'd':
10711 			    func (stream, "%ld", (long) reg);
10712 			    value_in_comment = reg;
10713 			    break;
10714 
10715 			  case 'H':
10716 			    func (stream, "%ld", (long) (reg << 1));
10717 			    value_in_comment = reg << 1;
10718 			    break;
10719 
10720 			  case 'W':
10721 			    func (stream, "%ld", (long) (reg << 2));
10722 			    value_in_comment = reg << 2;
10723 			    break;
10724 
10725 			  case 'a':
10726 			    /* PC-relative address -- the bottom two
10727 			       bits of the address are dropped
10728 			       before the calculation.  */
10729 			    info->print_address_func
10730 			      (((pc + 4) & ~3) + (reg << 2), info);
10731 			    value_in_comment = 0;
10732 			    break;
10733 
10734 			  case 'x':
10735 			    func (stream, "0x%04lx", (long) reg);
10736 			    break;
10737 
10738 			  case 'B':
10739 			    reg = ((reg ^ (1 << bitend)) - (1 << bitend));
10740 			    bfd_vma target = reg * 2 + pc + 4;
10741 			    info->print_address_func (target, info);
10742 			    value_in_comment = 0;
10743 
10744 			    /* Fill in instruction information.  */
10745 			    info->insn_info_valid = 1;
10746 			    info->insn_type = dis_branch;
10747 			    info->target = target;
10748 			    break;
10749 
10750 			  case 'c':
10751 			    func (stream, "%s", arm_conditional [reg]);
10752 			    break;
10753 
10754 			  default:
10755 			    abort ();
10756 			  }
10757 		      }
10758 		      break;
10759 
10760 		    case '\'':
10761 		      c++;
10762 		      if ((given & (1 << bitstart)) != 0)
10763 			func (stream, "%c", *c);
10764 		      break;
10765 
10766 		    case '?':
10767 		      ++c;
10768 		      if ((given & (1 << bitstart)) != 0)
10769 			func (stream, "%c", *c++);
10770 		      else
10771 			func (stream, "%c", *++c);
10772 		      break;
10773 
10774 		    default:
10775 		      abort ();
10776 		    }
10777 		}
10778 		break;
10779 
10780 	      default:
10781 		abort ();
10782 	      }
10783 	  }
10784 
10785 	if (value_in_comment > 32 || value_in_comment < -16)
10786 	  func (stream, "\t; 0x%lx", value_in_comment);
10787 	return;
10788       }
10789 
10790   /* No match.  */
10791   func (stream, UNKNOWN_INSTRUCTION_16BIT, (unsigned)given);
10792   return;
10793 }
10794 
10795 /* Return the name of an V7M special register.  */
10796 
10797 static const char *
10798 psr_name (int regno)
10799 {
10800   switch (regno)
10801     {
10802     case 0x0: return "APSR";
10803     case 0x1: return "IAPSR";
10804     case 0x2: return "EAPSR";
10805     case 0x3: return "PSR";
10806     case 0x5: return "IPSR";
10807     case 0x6: return "EPSR";
10808     case 0x7: return "IEPSR";
10809     case 0x8: return "MSP";
10810     case 0x9: return "PSP";
10811     case 0xa: return "MSPLIM";
10812     case 0xb: return "PSPLIM";
10813     case 0x10: return "PRIMASK";
10814     case 0x11: return "BASEPRI";
10815     case 0x12: return "BASEPRI_MAX";
10816     case 0x13: return "FAULTMASK";
10817     case 0x14: return "CONTROL";
10818     case 0x88: return "MSP_NS";
10819     case 0x89: return "PSP_NS";
10820     case 0x8a: return "MSPLIM_NS";
10821     case 0x8b: return "PSPLIM_NS";
10822     case 0x90: return "PRIMASK_NS";
10823     case 0x91: return "BASEPRI_NS";
10824     case 0x93: return "FAULTMASK_NS";
10825     case 0x94: return "CONTROL_NS";
10826     case 0x98: return "SP_NS";
10827     default: return "<unknown>";
10828     }
10829 }
10830 
10831 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM.  */
10832 
10833 static void
10834 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
10835 {
10836   const struct opcode32 *insn;
10837   void *stream = info->stream;
10838   fprintf_ftype func = info->fprintf_func;
10839   bfd_boolean is_mve = is_mve_architecture (info);
10840 
10841   if (print_insn_coprocessor (pc, info, given, TRUE))
10842     return;
10843 
10844   if ((is_mve == FALSE) && print_insn_neon (info, given, TRUE))
10845     return;
10846 
10847   if (is_mve && print_insn_mve (info, given))
10848     return;
10849 
10850   if (print_insn_cde (info, given, TRUE))
10851     return;
10852 
10853   if (print_insn_generic_coprocessor (pc, info, given, TRUE))
10854     return;
10855 
10856   for (insn = thumb32_opcodes; insn->assembler; insn++)
10857     if ((given & insn->mask) == insn->value)
10858       {
10859 	bfd_boolean is_clrm = FALSE;
10860 	bfd_boolean is_unpredictable = FALSE;
10861 	signed long value_in_comment = 0;
10862 	const char *c = insn->assembler;
10863 
10864 	for (; *c; c++)
10865 	  {
10866 	    if (*c != '%')
10867 	      {
10868 		func (stream, "%c", *c);
10869 		continue;
10870 	      }
10871 
10872 	    switch (*++c)
10873 	      {
10874 	      case '%':
10875 		func (stream, "%%");
10876 		break;
10877 
10878 	      case 'c':
10879 		if (ifthen_state)
10880 		  func (stream, "%s", arm_conditional[IFTHEN_COND]);
10881 		break;
10882 
10883 	      case 'x':
10884 		if (ifthen_next_state)
10885 		  func (stream, "\t; unpredictable branch in IT block\n");
10886 		break;
10887 
10888 	      case 'X':
10889 		if (ifthen_state)
10890 		  func (stream, "\t; unpredictable <IT:%s>",
10891 			arm_conditional[IFTHEN_COND]);
10892 		break;
10893 
10894 	      case 'I':
10895 		{
10896 		  unsigned int imm12 = 0;
10897 
10898 		  imm12 |= (given & 0x000000ffu);
10899 		  imm12 |= (given & 0x00007000u) >> 4;
10900 		  imm12 |= (given & 0x04000000u) >> 15;
10901 		  func (stream, "#%u", imm12);
10902 		  value_in_comment = imm12;
10903 		}
10904 		break;
10905 
10906 	      case 'M':
10907 		{
10908 		  unsigned int bits = 0, imm, imm8, mod;
10909 
10910 		  bits |= (given & 0x000000ffu);
10911 		  bits |= (given & 0x00007000u) >> 4;
10912 		  bits |= (given & 0x04000000u) >> 15;
10913 		  imm8 = (bits & 0x0ff);
10914 		  mod = (bits & 0xf00) >> 8;
10915 		  switch (mod)
10916 		    {
10917 		    case 0: imm = imm8; break;
10918 		    case 1: imm = ((imm8 << 16) | imm8); break;
10919 		    case 2: imm = ((imm8 << 24) | (imm8 << 8)); break;
10920 		    case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
10921 		    default:
10922 		      mod  = (bits & 0xf80) >> 7;
10923 		      imm8 = (bits & 0x07f) | 0x80;
10924 		      imm  = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
10925 		    }
10926 		  func (stream, "#%u", imm);
10927 		  value_in_comment = imm;
10928 		}
10929 		break;
10930 
10931 	      case 'J':
10932 		{
10933 		  unsigned int imm = 0;
10934 
10935 		  imm |= (given & 0x000000ffu);
10936 		  imm |= (given & 0x00007000u) >> 4;
10937 		  imm |= (given & 0x04000000u) >> 15;
10938 		  imm |= (given & 0x000f0000u) >> 4;
10939 		  func (stream, "#%u", imm);
10940 		  value_in_comment = imm;
10941 		}
10942 		break;
10943 
10944 	      case 'K':
10945 		{
10946 		  unsigned int imm = 0;
10947 
10948 		  imm |= (given & 0x000f0000u) >> 16;
10949 		  imm |= (given & 0x00000ff0u) >> 0;
10950 		  imm |= (given & 0x0000000fu) << 12;
10951 		  func (stream, "#%u", imm);
10952 		  value_in_comment = imm;
10953 		}
10954 		break;
10955 
10956 	      case 'H':
10957 		{
10958 		  unsigned int imm = 0;
10959 
10960 		  imm |= (given & 0x000f0000u) >> 4;
10961 		  imm |= (given & 0x00000fffu) >> 0;
10962 		  func (stream, "#%u", imm);
10963 		  value_in_comment = imm;
10964 		}
10965 		break;
10966 
10967 	      case 'V':
10968 		{
10969 		  unsigned int imm = 0;
10970 
10971 		  imm |= (given & 0x00000fffu);
10972 		  imm |= (given & 0x000f0000u) >> 4;
10973 		  func (stream, "#%u", imm);
10974 		  value_in_comment = imm;
10975 		}
10976 		break;
10977 
10978 	      case 'S':
10979 		{
10980 		  unsigned int reg = (given & 0x0000000fu);
10981 		  unsigned int stp = (given & 0x00000030u) >> 4;
10982 		  unsigned int imm = 0;
10983 		  imm |= (given & 0x000000c0u) >> 6;
10984 		  imm |= (given & 0x00007000u) >> 10;
10985 
10986 		  func (stream, "%s", arm_regnames[reg]);
10987 		  switch (stp)
10988 		    {
10989 		    case 0:
10990 		      if (imm > 0)
10991 			func (stream, ", lsl #%u", imm);
10992 		      break;
10993 
10994 		    case 1:
10995 		      if (imm == 0)
10996 			imm = 32;
10997 		      func (stream, ", lsr #%u", imm);
10998 		      break;
10999 
11000 		    case 2:
11001 		      if (imm == 0)
11002 			imm = 32;
11003 		      func (stream, ", asr #%u", imm);
11004 		      break;
11005 
11006 		    case 3:
11007 		      if (imm == 0)
11008 			func (stream, ", rrx");
11009 		      else
11010 			func (stream, ", ror #%u", imm);
11011 		    }
11012 		}
11013 		break;
11014 
11015 	      case 'a':
11016 		{
11017 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
11018 		  unsigned int U   = ! NEGATIVE_BIT_SET;
11019 		  unsigned int op  = (given & 0x00000f00) >> 8;
11020 		  unsigned int i12 = (given & 0x00000fff);
11021 		  unsigned int i8  = (given & 0x000000ff);
11022 		  bfd_boolean writeback = FALSE, postind = FALSE;
11023 		  bfd_vma offset = 0;
11024 
11025 		  func (stream, "[%s", arm_regnames[Rn]);
11026 		  if (U) /* 12-bit positive immediate offset.  */
11027 		    {
11028 		      offset = i12;
11029 		      if (Rn != 15)
11030 			value_in_comment = offset;
11031 		    }
11032 		  else if (Rn == 15) /* 12-bit negative immediate offset.  */
11033 		    offset = - (int) i12;
11034 		  else if (op == 0x0) /* Shifted register offset.  */
11035 		    {
11036 		      unsigned int Rm = (i8 & 0x0f);
11037 		      unsigned int sh = (i8 & 0x30) >> 4;
11038 
11039 		      func (stream, ", %s", arm_regnames[Rm]);
11040 		      if (sh)
11041 			func (stream, ", lsl #%u", sh);
11042 		      func (stream, "]");
11043 		      break;
11044 		    }
11045 		  else switch (op)
11046 		    {
11047 		    case 0xE:  /* 8-bit positive immediate offset.  */
11048 		      offset = i8;
11049 		      break;
11050 
11051 		    case 0xC:  /* 8-bit negative immediate offset.  */
11052 		      offset = -i8;
11053 		      break;
11054 
11055 		    case 0xF:  /* 8-bit + preindex with wb.  */
11056 		      offset = i8;
11057 		      writeback = TRUE;
11058 		      break;
11059 
11060 		    case 0xD:  /* 8-bit - preindex with wb.  */
11061 		      offset = -i8;
11062 		      writeback = TRUE;
11063 		      break;
11064 
11065 		    case 0xB:  /* 8-bit + postindex.  */
11066 		      offset = i8;
11067 		      postind = TRUE;
11068 		      break;
11069 
11070 		    case 0x9:  /* 8-bit - postindex.  */
11071 		      offset = -i8;
11072 		      postind = TRUE;
11073 		      break;
11074 
11075 		    default:
11076 		      func (stream, ", <undefined>]");
11077 		      goto skip;
11078 		    }
11079 
11080 		  if (postind)
11081 		    func (stream, "], #%d", (int) offset);
11082 		  else
11083 		    {
11084 		      if (offset)
11085 			func (stream, ", #%d", (int) offset);
11086 		      func (stream, writeback ? "]!" : "]");
11087 		    }
11088 
11089 		  if (Rn == 15)
11090 		    {
11091 		      func (stream, "\t; ");
11092 		      info->print_address_func (((pc + 4) & ~3) + offset, info);
11093 		    }
11094 		}
11095 	      skip:
11096 		break;
11097 
11098 	      case 'A':
11099 		{
11100 		  unsigned int U   = ! NEGATIVE_BIT_SET;
11101 		  unsigned int W   = WRITEBACK_BIT_SET;
11102 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
11103 		  unsigned int off = (given & 0x000000ff);
11104 
11105 		  func (stream, "[%s", arm_regnames[Rn]);
11106 
11107 		  if (PRE_BIT_SET)
11108 		    {
11109 		      if (off || !U)
11110 			{
11111 			  func (stream, ", #%c%u", U ? '+' : '-', off * 4);
11112 			  value_in_comment = off * 4 * (U ? 1 : -1);
11113 			}
11114 		      func (stream, "]");
11115 		      if (W)
11116 			func (stream, "!");
11117 		    }
11118 		  else
11119 		    {
11120 		      func (stream, "], ");
11121 		      if (W)
11122 			{
11123 			  func (stream, "#%c%u", U ? '+' : '-', off * 4);
11124 			  value_in_comment = off * 4 * (U ? 1 : -1);
11125 			}
11126 		      else
11127 			{
11128 			  func (stream, "{%u}", off);
11129 			  value_in_comment = off;
11130 			}
11131 		    }
11132 		}
11133 		break;
11134 
11135 	      case 'w':
11136 		{
11137 		  unsigned int Sbit = (given & 0x01000000) >> 24;
11138 		  unsigned int type = (given & 0x00600000) >> 21;
11139 
11140 		  switch (type)
11141 		    {
11142 		    case 0: func (stream, Sbit ? "sb" : "b"); break;
11143 		    case 1: func (stream, Sbit ? "sh" : "h"); break;
11144 		    case 2:
11145 		      if (Sbit)
11146 			func (stream, "??");
11147 		      break;
11148 		    case 3:
11149 		      func (stream, "??");
11150 		      break;
11151 		    }
11152 		}
11153 		break;
11154 
11155 	      case 'n':
11156 		is_clrm = TRUE;
11157 		/* Fall through.  */
11158 	      case 'm':
11159 		{
11160 		  int started = 0;
11161 		  int reg;
11162 
11163 		  func (stream, "{");
11164 		  for (reg = 0; reg < 16; reg++)
11165 		    if ((given & (1 << reg)) != 0)
11166 		      {
11167 			if (started)
11168 			  func (stream, ", ");
11169 			started = 1;
11170 			if (is_clrm && reg == 13)
11171 			  func (stream, "(invalid: %s)", arm_regnames[reg]);
11172 			else if (is_clrm && reg == 15)
11173 			  func (stream, "%s", "APSR");
11174 			else
11175 			  func (stream, "%s", arm_regnames[reg]);
11176 		      }
11177 		  func (stream, "}");
11178 		}
11179 		break;
11180 
11181 	      case 'E':
11182 		{
11183 		  unsigned int msb = (given & 0x0000001f);
11184 		  unsigned int lsb = 0;
11185 
11186 		  lsb |= (given & 0x000000c0u) >> 6;
11187 		  lsb |= (given & 0x00007000u) >> 10;
11188 		  func (stream, "#%u, #%u", lsb, msb - lsb + 1);
11189 		}
11190 		break;
11191 
11192 	      case 'F':
11193 		{
11194 		  unsigned int width = (given & 0x0000001f) + 1;
11195 		  unsigned int lsb = 0;
11196 
11197 		  lsb |= (given & 0x000000c0u) >> 6;
11198 		  lsb |= (given & 0x00007000u) >> 10;
11199 		  func (stream, "#%u, #%u", lsb, width);
11200 		}
11201 		break;
11202 
11203 	      case 'G':
11204 		{
11205 		  unsigned int boff = (((given & 0x07800000) >> 23) << 1);
11206 		  func (stream, "%x", boff);
11207 		}
11208 		break;
11209 
11210 	      case 'W':
11211 		{
11212 		  unsigned int immA = (given & 0x001f0000u) >> 16;
11213 		  unsigned int immB = (given & 0x000007feu) >> 1;
11214 		  unsigned int immC = (given & 0x00000800u) >> 11;
11215 		  bfd_vma offset = 0;
11216 
11217 		  offset |= immA << 12;
11218 		  offset |= immB << 2;
11219 		  offset |= immC << 1;
11220 		  /* Sign extend.  */
11221 		  offset = (offset & 0x10000) ? offset - (1 << 17) : offset;
11222 
11223 		  info->print_address_func (pc + 4 + offset, info);
11224 		}
11225 		break;
11226 
11227 	      case 'Y':
11228 		{
11229 		  unsigned int immA = (given & 0x007f0000u) >> 16;
11230 		  unsigned int immB = (given & 0x000007feu) >> 1;
11231 		  unsigned int immC = (given & 0x00000800u) >> 11;
11232 		  bfd_vma offset = 0;
11233 
11234 		  offset |= immA << 12;
11235 		  offset |= immB << 2;
11236 		  offset |= immC << 1;
11237 		  /* Sign extend.  */
11238 		  offset = (offset & 0x40000) ? offset - (1 << 19) : offset;
11239 
11240 		  info->print_address_func (pc + 4 + offset, info);
11241 		}
11242 		break;
11243 
11244 	      case 'Z':
11245 		{
11246 		  unsigned int immA = (given & 0x00010000u) >> 16;
11247 		  unsigned int immB = (given & 0x000007feu) >> 1;
11248 		  unsigned int immC = (given & 0x00000800u) >> 11;
11249 		  bfd_vma offset = 0;
11250 
11251 		  offset |= immA << 12;
11252 		  offset |= immB << 2;
11253 		  offset |= immC << 1;
11254 		  /* Sign extend.  */
11255 		  offset = (offset & 0x1000) ? offset - (1 << 13) : offset;
11256 
11257 		  info->print_address_func (pc + 4 + offset, info);
11258 
11259 		  unsigned int T    = (given & 0x00020000u) >> 17;
11260 		  unsigned int endoffset = (((given & 0x07800000) >> 23) << 1);
11261 		  unsigned int boffset   = (T == 1) ? 4 : 2;
11262 		  func (stream, ", ");
11263 		  func (stream, "%x", endoffset + boffset);
11264 		}
11265 		break;
11266 
11267 	      case 'Q':
11268 		{
11269 		  unsigned int immh = (given & 0x000007feu) >> 1;
11270 		  unsigned int imml = (given & 0x00000800u) >> 11;
11271 		  bfd_vma imm32 = 0;
11272 
11273 		  imm32 |= immh << 2;
11274 		  imm32 |= imml << 1;
11275 
11276 		  info->print_address_func (pc + 4 + imm32, info);
11277 		}
11278 		break;
11279 
11280 	      case 'P':
11281 		{
11282 		  unsigned int immh = (given & 0x000007feu) >> 1;
11283 		  unsigned int imml = (given & 0x00000800u) >> 11;
11284 		  bfd_vma imm32 = 0;
11285 
11286 		  imm32 |= immh << 2;
11287 		  imm32 |= imml << 1;
11288 
11289 		  info->print_address_func (pc + 4 - imm32, info);
11290 		}
11291 		break;
11292 
11293 	      case 'b':
11294 		{
11295 		  unsigned int S = (given & 0x04000000u) >> 26;
11296 		  unsigned int J1 = (given & 0x00002000u) >> 13;
11297 		  unsigned int J2 = (given & 0x00000800u) >> 11;
11298 		  bfd_vma offset = 0;
11299 
11300 		  offset |= !S << 20;
11301 		  offset |= J2 << 19;
11302 		  offset |= J1 << 18;
11303 		  offset |= (given & 0x003f0000) >> 4;
11304 		  offset |= (given & 0x000007ff) << 1;
11305 		  offset -= (1 << 20);
11306 
11307 		  bfd_vma target = pc + 4 + offset;
11308 		  info->print_address_func (target, info);
11309 
11310 		  /* Fill in instruction information.  */
11311 		  info->insn_info_valid = 1;
11312 		  info->insn_type = dis_branch;
11313 		  info->target = target;
11314 		}
11315 		break;
11316 
11317 	      case 'B':
11318 		{
11319 		  unsigned int S = (given & 0x04000000u) >> 26;
11320 		  unsigned int I1 = (given & 0x00002000u) >> 13;
11321 		  unsigned int I2 = (given & 0x00000800u) >> 11;
11322 		  bfd_vma offset = 0;
11323 
11324 		  offset |= !S << 24;
11325 		  offset |= !(I1 ^ S) << 23;
11326 		  offset |= !(I2 ^ S) << 22;
11327 		  offset |= (given & 0x03ff0000u) >> 4;
11328 		  offset |= (given & 0x000007ffu) << 1;
11329 		  offset -= (1 << 24);
11330 		  offset += pc + 4;
11331 
11332 		  /* BLX target addresses are always word aligned.  */
11333 		  if ((given & 0x00001000u) == 0)
11334 		      offset &= ~2u;
11335 
11336 		  info->print_address_func (offset, info);
11337 
11338 		  /* Fill in instruction information.  */
11339 		  info->insn_info_valid = 1;
11340 		  info->insn_type = dis_branch;
11341 		  info->target = offset;
11342 		}
11343 		break;
11344 
11345 	      case 's':
11346 		{
11347 		  unsigned int shift = 0;
11348 
11349 		  shift |= (given & 0x000000c0u) >> 6;
11350 		  shift |= (given & 0x00007000u) >> 10;
11351 		  if (WRITEBACK_BIT_SET)
11352 		    func (stream, ", asr #%u", shift);
11353 		  else if (shift)
11354 		    func (stream, ", lsl #%u", shift);
11355 		  /* else print nothing - lsl #0 */
11356 		}
11357 		break;
11358 
11359 	      case 'R':
11360 		{
11361 		  unsigned int rot = (given & 0x00000030) >> 4;
11362 
11363 		  if (rot)
11364 		    func (stream, ", ror #%u", rot * 8);
11365 		}
11366 		break;
11367 
11368 	      case 'U':
11369 		if ((given & 0xf0) == 0x60)
11370 		  {
11371 		    switch (given & 0xf)
11372 		      {
11373 			case 0xf: func (stream, "sy"); break;
11374 			default:
11375 			  func (stream, "#%d", (int) given & 0xf);
11376 			      break;
11377 		      }
11378 		  }
11379 		else
11380 		  {
11381 		    const char * opt = data_barrier_option (given & 0xf);
11382 		    if (opt != NULL)
11383 		      func (stream, "%s", opt);
11384 		    else
11385 		      func (stream, "#%d", (int) given & 0xf);
11386 		   }
11387 		break;
11388 
11389 	      case 'C':
11390 		if ((given & 0xff) == 0)
11391 		  {
11392 		    func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
11393 		    if (given & 0x800)
11394 		      func (stream, "f");
11395 		    if (given & 0x400)
11396 		      func (stream, "s");
11397 		    if (given & 0x200)
11398 		      func (stream, "x");
11399 		    if (given & 0x100)
11400 		      func (stream, "c");
11401 		  }
11402 		else if ((given & 0x20) == 0x20)
11403 		  {
11404 		    char const* name;
11405 		    unsigned sysm = (given & 0xf00) >> 8;
11406 
11407 		    sysm |= (given & 0x30);
11408 		    sysm |= (given & 0x00100000) >> 14;
11409 		    name = banked_regname (sysm);
11410 
11411 		    if (name != NULL)
11412 		      func (stream, "%s", name);
11413 		    else
11414 		      func (stream, "(UNDEF: %lu)", (unsigned long) sysm);
11415 		  }
11416 		else
11417 		  {
11418 		    func (stream, "%s", psr_name (given & 0xff));
11419 		  }
11420 		break;
11421 
11422 	      case 'D':
11423 		if (((given & 0xff) == 0)
11424 		    || ((given & 0x20) == 0x20))
11425 		  {
11426 		    char const* name;
11427 		    unsigned sm = (given & 0xf0000) >> 16;
11428 
11429 		    sm |= (given & 0x30);
11430 		    sm |= (given & 0x00100000) >> 14;
11431 		    name = banked_regname (sm);
11432 
11433 		    if (name != NULL)
11434 		      func (stream, "%s", name);
11435 		    else
11436 		      func (stream, "(UNDEF: %lu)", (unsigned long) sm);
11437 		  }
11438 		else
11439 		  func (stream, "%s", psr_name (given & 0xff));
11440 		break;
11441 
11442 	      case '0': case '1': case '2': case '3': case '4':
11443 	      case '5': case '6': case '7': case '8': case '9':
11444 		{
11445 		  int width;
11446 		  unsigned long val;
11447 
11448 		  c = arm_decode_bitfield (c, given, &val, &width);
11449 
11450 		  switch (*c)
11451 		    {
11452 		    case 's':
11453 		      if (val <= 3)
11454 			func (stream, "%s", mve_vec_sizename[val]);
11455 		      else
11456 			func (stream, "<undef size>");
11457 		      break;
11458 
11459 		    case 'd':
11460 		      func (stream, "%lu", val);
11461 		      value_in_comment = val;
11462 		      break;
11463 
11464 		    case 'D':
11465 		      func (stream, "%lu", val + 1);
11466 		      value_in_comment = val + 1;
11467 		      break;
11468 
11469 		    case 'W':
11470 		      func (stream, "%lu", val * 4);
11471 		      value_in_comment = val * 4;
11472 		      break;
11473 
11474 		    case 'S':
11475 		      if (val == 13)
11476 			is_unpredictable = TRUE;
11477 		      /* Fall through.  */
11478 		    case 'R':
11479 		      if (val == 15)
11480 			is_unpredictable = TRUE;
11481 		      /* Fall through.  */
11482 		    case 'r':
11483 		      func (stream, "%s", arm_regnames[val]);
11484 		      break;
11485 
11486 		    case 'c':
11487 		      func (stream, "%s", arm_conditional[val]);
11488 		      break;
11489 
11490 		    case '\'':
11491 		      c++;
11492 		      if (val == ((1ul << width) - 1))
11493 			func (stream, "%c", *c);
11494 		      break;
11495 
11496 		    case '`':
11497 		      c++;
11498 		      if (val == 0)
11499 			func (stream, "%c", *c);
11500 		      break;
11501 
11502 		    case '?':
11503 		      func (stream, "%c", c[(1 << width) - (int) val]);
11504 		      c += 1 << width;
11505 		      break;
11506 
11507 		    case 'x':
11508 		      func (stream, "0x%lx", val & 0xffffffffUL);
11509 		      break;
11510 
11511 		    default:
11512 		      abort ();
11513 		    }
11514 		}
11515 		break;
11516 
11517 	      case 'L':
11518 		/* PR binutils/12534
11519 		   If we have a PC relative offset in an LDRD or STRD
11520 		   instructions then display the decoded address.  */
11521 		if (((given >> 16) & 0xf) == 0xf)
11522 		  {
11523 		    bfd_vma offset = (given & 0xff) * 4;
11524 
11525 		    if ((given & (1 << 23)) == 0)
11526 		      offset = - offset;
11527 		    func (stream, "\t; ");
11528 		    info->print_address_func ((pc & ~3) + 4 + offset, info);
11529 		  }
11530 		break;
11531 
11532 	      default:
11533 		abort ();
11534 	      }
11535 	  }
11536 
11537 	if (value_in_comment > 32 || value_in_comment < -16)
11538 	  func (stream, "\t; 0x%lx", value_in_comment);
11539 
11540 	if (is_unpredictable)
11541 	  func (stream, UNPREDICTABLE_INSTRUCTION);
11542 
11543 	return;
11544       }
11545 
11546   /* No match.  */
11547   func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given);
11548   return;
11549 }
11550 
11551 /* Print data bytes on INFO->STREAM.  */
11552 
11553 static void
11554 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
11555 		 struct disassemble_info *info,
11556 		 long given)
11557 {
11558   switch (info->bytes_per_chunk)
11559     {
11560     case 1:
11561       info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
11562       break;
11563     case 2:
11564       info->fprintf_func (info->stream, ".short\t0x%04lx", given);
11565       break;
11566     case 4:
11567       info->fprintf_func (info->stream, ".word\t0x%08lx", given);
11568       break;
11569     default:
11570       abort ();
11571     }
11572 }
11573 
11574 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
11575    being displayed in symbol relative addresses.
11576 
11577    Also disallow private symbol, with __tagsym$$ prefix,
11578    from ARM RVCT toolchain being displayed.  */
11579 
11580 bfd_boolean
11581 arm_symbol_is_valid (asymbol * sym,
11582 		     struct disassemble_info * info ATTRIBUTE_UNUSED)
11583 {
11584   const char * name;
11585 
11586   if (sym == NULL)
11587     return FALSE;
11588 
11589   name = bfd_asymbol_name (sym);
11590 
11591   return (name && *name != '$' && strncmp (name, "__tagsym$$", 10));
11592 }
11593 
11594 /* Parse the string of disassembler options.  */
11595 
11596 static void
11597 parse_arm_disassembler_options (const char *options)
11598 {
11599   const char *opt;
11600 
11601   FOR_EACH_DISASSEMBLER_OPTION (opt, options)
11602     {
11603       if (CONST_STRNEQ (opt, "reg-names-"))
11604 	{
11605 	  unsigned int i;
11606 	  for (i = 0; i < NUM_ARM_OPTIONS; i++)
11607 	    if (disassembler_options_cmp (opt, regnames[i].name) == 0)
11608 	      {
11609 		regname_selected = i;
11610 		break;
11611 	      }
11612 
11613 	  if (i >= NUM_ARM_OPTIONS)
11614 	    /* xgettext: c-format */
11615 	    opcodes_error_handler (_("unrecognised register name set: %s"),
11616 				   opt);
11617 	}
11618       else if (CONST_STRNEQ (opt, "force-thumb"))
11619 	force_thumb = 1;
11620       else if (CONST_STRNEQ (opt, "no-force-thumb"))
11621 	force_thumb = 0;
11622       else if (CONST_STRNEQ (opt, "coproc"))
11623 	{
11624 	  const char *procptr = opt + sizeof ("coproc") - 1;
11625 	  char *endptr;
11626 	  uint8_t coproc_number = strtol (procptr, &endptr, 10);
11627 	  if (endptr != procptr + 1 || coproc_number > 7)
11628 	    {
11629 	      opcodes_error_handler (_("cde coprocessor not between 0-7: %s"),
11630 				     opt);
11631 	      continue;
11632 	    }
11633 	  if (*endptr != '=')
11634 	    {
11635 	      opcodes_error_handler (_("coproc must have an argument: %s"),
11636 				     opt);
11637 	      continue;
11638 	    }
11639 	  endptr += 1;
11640 	  if (CONST_STRNEQ (endptr, "generic"))
11641 	    cde_coprocs &= ~(1 << coproc_number);
11642 	  else if (CONST_STRNEQ (endptr, "cde")
11643 		   || CONST_STRNEQ (endptr, "CDE"))
11644 	    cde_coprocs |= (1 << coproc_number);
11645 	  else
11646 	    {
11647 	      opcodes_error_handler (
11648 		  _("coprocN argument takes options \"generic\","
11649 		    " \"cde\", or \"CDE\": %s"), opt);
11650 	    }
11651 	}
11652       else
11653 	/* xgettext: c-format */
11654 	opcodes_error_handler (_("unrecognised disassembler option: %s"), opt);
11655     }
11656 
11657   return;
11658 }
11659 
11660 static bfd_boolean
11661 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
11662 			 enum map_type *map_symbol);
11663 
11664 /* Search back through the insn stream to determine if this instruction is
11665    conditionally executed.  */
11666 
11667 static void
11668 find_ifthen_state (bfd_vma pc,
11669 		   struct disassemble_info *info,
11670 		   bfd_boolean little)
11671 {
11672   unsigned char b[2];
11673   unsigned int insn;
11674   int status;
11675   /* COUNT is twice the number of instructions seen.  It will be odd if we
11676      just crossed an instruction boundary.  */
11677   int count;
11678   int it_count;
11679   unsigned int seen_it;
11680   bfd_vma addr;
11681 
11682   ifthen_address = pc;
11683   ifthen_state = 0;
11684 
11685   addr = pc;
11686   count = 1;
11687   it_count = 0;
11688   seen_it = 0;
11689   /* Scan backwards looking for IT instructions, keeping track of where
11690      instruction boundaries are.  We don't know if something is actually an
11691      IT instruction until we find a definite instruction boundary.  */
11692   for (;;)
11693     {
11694       if (addr == 0 || info->symbol_at_address_func (addr, info))
11695 	{
11696 	  /* A symbol must be on an instruction boundary, and will not
11697 	     be within an IT block.  */
11698 	  if (seen_it && (count & 1))
11699 	    break;
11700 
11701 	  return;
11702 	}
11703       addr -= 2;
11704       status = info->read_memory_func (addr, (bfd_byte *) b, 2, info);
11705       if (status)
11706 	return;
11707 
11708       if (little)
11709 	insn = (b[0]) | (b[1] << 8);
11710       else
11711 	insn = (b[1]) | (b[0] << 8);
11712       if (seen_it)
11713 	{
11714 	  if ((insn & 0xf800) < 0xe800)
11715 	    {
11716 	      /* Addr + 2 is an instruction boundary.  See if this matches
11717 	         the expected boundary based on the position of the last
11718 		 IT candidate.  */
11719 	      if (count & 1)
11720 		break;
11721 	      seen_it = 0;
11722 	    }
11723 	}
11724       if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
11725 	{
11726 	  enum map_type type = MAP_ARM;
11727 	  bfd_boolean found = mapping_symbol_for_insn (addr, info, &type);
11728 
11729 	  if (!found || (found && type == MAP_THUMB))
11730 	    {
11731 	      /* This could be an IT instruction.  */
11732 	      seen_it = insn;
11733 	      it_count = count >> 1;
11734 	    }
11735 	}
11736       if ((insn & 0xf800) >= 0xe800)
11737 	count++;
11738       else
11739 	count = (count + 2) | 1;
11740       /* IT blocks contain at most 4 instructions.  */
11741       if (count >= 8 && !seen_it)
11742 	return;
11743     }
11744   /* We found an IT instruction.  */
11745   ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
11746   if ((ifthen_state & 0xf) == 0)
11747     ifthen_state = 0;
11748 }
11749 
11750 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
11751    mapping symbol.  */
11752 
11753 static int
11754 is_mapping_symbol (struct disassemble_info *info, int n,
11755 		   enum map_type *map_type)
11756 {
11757   const char *name;
11758 
11759   name = bfd_asymbol_name (info->symtab[n]);
11760   if (name[0] == '$' && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
11761       && (name[2] == 0 || name[2] == '.'))
11762     {
11763       *map_type = ((name[1] == 'a') ? MAP_ARM
11764 		   : (name[1] == 't') ? MAP_THUMB
11765 		   : MAP_DATA);
11766       return TRUE;
11767     }
11768 
11769   return FALSE;
11770 }
11771 
11772 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
11773    Returns nonzero if *MAP_TYPE was set.  */
11774 
11775 static int
11776 get_map_sym_type (struct disassemble_info *info,
11777 		  int n,
11778 		  enum map_type *map_type)
11779 {
11780   /* If the symbol is in a different section, ignore it.  */
11781   if (info->section != NULL && info->section != info->symtab[n]->section)
11782     return FALSE;
11783 
11784   return is_mapping_symbol (info, n, map_type);
11785 }
11786 
11787 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
11788    Returns nonzero if *MAP_TYPE was set.  */
11789 
11790 static int
11791 get_sym_code_type (struct disassemble_info *info,
11792 		   int n,
11793 		   enum map_type *map_type)
11794 {
11795   elf_symbol_type *es;
11796   unsigned int type;
11797 
11798   /* If the symbol is in a different section, ignore it.  */
11799   if (info->section != NULL && info->section != info->symtab[n]->section)
11800     return FALSE;
11801 
11802   es = *(elf_symbol_type **)(info->symtab + n);
11803   type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
11804 
11805   /* If the symbol has function type then use that.  */
11806   if (type == STT_FUNC || type == STT_GNU_IFUNC)
11807     {
11808       if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
11809 	  == ST_BRANCH_TO_THUMB)
11810 	*map_type = MAP_THUMB;
11811       else
11812 	*map_type = MAP_ARM;
11813       return TRUE;
11814     }
11815 
11816   return FALSE;
11817 }
11818 
11819 /* Search the mapping symbol state for instruction at pc.  This is only
11820    applicable for elf target.
11821 
11822    There is an assumption Here, info->private_data contains the correct AND
11823    up-to-date information about current scan process.  The information will be
11824    used to speed this search process.
11825 
11826    Return TRUE if the mapping state can be determined, and map_symbol
11827    will be updated accordingly.  Otherwise, return FALSE.  */
11828 
11829 static bfd_boolean
11830 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
11831 			 enum map_type *map_symbol)
11832 {
11833   bfd_vma addr, section_vma = 0;
11834   int n, last_sym = -1;
11835   bfd_boolean found = FALSE;
11836   bfd_boolean can_use_search_opt_p = FALSE;
11837 
11838   /* Default to DATA.  A text section is required by the ABI to contain an
11839      INSN mapping symbol at the start.  A data section has no such
11840      requirement, hence if no mapping symbol is found the section must
11841      contain only data.  This however isn't very useful if the user has
11842      fully stripped the binaries.  If this is the case use the section
11843      attributes to determine the default.  If we have no section default to
11844      INSN as well, as we may be disassembling some raw bytes on a baremetal
11845      HEX file or similar.  */
11846   enum map_type type = MAP_DATA;
11847   if ((info->section && info->section->flags & SEC_CODE) || !info->section)
11848     type = MAP_ARM;
11849   struct arm_private_data *private_data;
11850 
11851   if (info->private_data == NULL
11852       || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour)
11853     return FALSE;
11854 
11855   private_data = info->private_data;
11856 
11857   /* First, look for mapping symbols.  */
11858   if (info->symtab_size != 0)
11859   {
11860     if (pc <= private_data->last_mapping_addr)
11861       private_data->last_mapping_sym = -1;
11862 
11863     /* Start scanning at the start of the function, or wherever
11864        we finished last time.  */
11865     n = info->symtab_pos + 1;
11866 
11867     /* If the last stop offset is different from the current one it means we
11868        are disassembling a different glob of bytes.  As such the optimization
11869        would not be safe and we should start over.  */
11870     can_use_search_opt_p
11871       = private_data->last_mapping_sym >= 0
11872 	&& info->stop_offset == private_data->last_stop_offset;
11873 
11874     if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
11875       n = private_data->last_mapping_sym;
11876 
11877     /* Look down while we haven't passed the location being disassembled.
11878        The reason for this is that there's no defined order between a symbol
11879        and an mapping symbol that may be at the same address.  We may have to
11880        look at least one position ahead.  */
11881     for (; n < info->symtab_size; n++)
11882       {
11883 	addr = bfd_asymbol_value (info->symtab[n]);
11884 	if (addr > pc)
11885 	  break;
11886 	if (get_map_sym_type (info, n, &type))
11887 	  {
11888 	    last_sym = n;
11889 	    found = TRUE;
11890 	  }
11891       }
11892 
11893     if (!found)
11894       {
11895 	n = info->symtab_pos;
11896 	if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
11897 	  n = private_data->last_mapping_sym;
11898 
11899 	/* No mapping symbol found at this address.  Look backwards
11900 	   for a preceeding one, but don't go pass the section start
11901 	   otherwise a data section with no mapping symbol can pick up
11902 	   a text mapping symbol of a preceeding section.  The documentation
11903 	   says section can be NULL, in which case we will seek up all the
11904 	   way to the top.  */
11905 	if (info->section)
11906 	  section_vma = info->section->vma;
11907 
11908 	for (; n >= 0; n--)
11909 	  {
11910 	    addr = bfd_asymbol_value (info->symtab[n]);
11911 	    if (addr < section_vma)
11912 	      break;
11913 
11914 	    if (get_map_sym_type (info, n, &type))
11915 	      {
11916 		last_sym = n;
11917 		found = TRUE;
11918 		break;
11919 	      }
11920 	  }
11921       }
11922   }
11923 
11924   /* If no mapping symbol was found, try looking up without a mapping
11925      symbol.  This is done by walking up from the current PC to the nearest
11926      symbol.  We don't actually have to loop here since symtab_pos will
11927      contain the nearest symbol already.  */
11928   if (!found)
11929     {
11930       n = info->symtab_pos;
11931       if (n >= 0 && get_sym_code_type (info, n, &type))
11932 	{
11933 	  last_sym = n;
11934 	  found = TRUE;
11935 	}
11936     }
11937 
11938   private_data->last_mapping_sym = last_sym;
11939   private_data->last_type = type;
11940   private_data->last_stop_offset = info->stop_offset;
11941 
11942   *map_symbol = type;
11943   return found;
11944 }
11945 
11946 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
11947    of the supplied arm_feature_set structure with bitmasks indicating
11948    the supported base architectures and coprocessor extensions.
11949 
11950    FIXME: This could more efficiently implemented as a constant array,
11951    although it would also be less robust.  */
11952 
11953 static void
11954 select_arm_features (unsigned long mach,
11955 		     arm_feature_set * features)
11956 {
11957   arm_feature_set arch_fset;
11958   const arm_feature_set fpu_any = FPU_ANY;
11959 
11960 #undef ARM_SET_FEATURES
11961 #define ARM_SET_FEATURES(FSET) \
11962   {							\
11963     const arm_feature_set fset = FSET;			\
11964     arch_fset = fset;					\
11965   }
11966 
11967   /* When several architecture versions share the same bfd_mach_arm_XXX value
11968      the most featureful is chosen.  */
11969   switch (mach)
11970     {
11971     case bfd_mach_arm_2:	 ARM_SET_FEATURES (ARM_ARCH_V2); break;
11972     case bfd_mach_arm_2a:	 ARM_SET_FEATURES (ARM_ARCH_V2S); break;
11973     case bfd_mach_arm_3:	 ARM_SET_FEATURES (ARM_ARCH_V3); break;
11974     case bfd_mach_arm_3M:	 ARM_SET_FEATURES (ARM_ARCH_V3M); break;
11975     case bfd_mach_arm_4:	 ARM_SET_FEATURES (ARM_ARCH_V4); break;
11976     case bfd_mach_arm_4T:	 ARM_SET_FEATURES (ARM_ARCH_V4T); break;
11977     case bfd_mach_arm_5:	 ARM_SET_FEATURES (ARM_ARCH_V5); break;
11978     case bfd_mach_arm_5T:	 ARM_SET_FEATURES (ARM_ARCH_V5T); break;
11979     case bfd_mach_arm_5TE:	 ARM_SET_FEATURES (ARM_ARCH_V5TE); break;
11980     case bfd_mach_arm_XScale:	 ARM_SET_FEATURES (ARM_ARCH_XSCALE); break;
11981     case bfd_mach_arm_ep9312:
11982 	ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T,
11983 					   ARM_CEXT_MAVERICK | FPU_MAVERICK));
11984        break;
11985     case bfd_mach_arm_iWMMXt:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break;
11986     case bfd_mach_arm_iWMMXt2:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break;
11987     case bfd_mach_arm_5TEJ:	 ARM_SET_FEATURES (ARM_ARCH_V5TEJ); break;
11988     case bfd_mach_arm_6:	 ARM_SET_FEATURES (ARM_ARCH_V6); break;
11989     case bfd_mach_arm_6KZ:	 ARM_SET_FEATURES (ARM_ARCH_V6KZ); break;
11990     case bfd_mach_arm_6T2:	 ARM_SET_FEATURES (ARM_ARCH_V6KZT2); break;
11991     case bfd_mach_arm_6K:	 ARM_SET_FEATURES (ARM_ARCH_V6K); break;
11992     case bfd_mach_arm_7:	 ARM_SET_FEATURES (ARM_ARCH_V7VE); break;
11993     case bfd_mach_arm_6M:	 ARM_SET_FEATURES (ARM_ARCH_V6M); break;
11994     case bfd_mach_arm_6SM:	 ARM_SET_FEATURES (ARM_ARCH_V6SM); break;
11995     case bfd_mach_arm_7EM:	 ARM_SET_FEATURES (ARM_ARCH_V7EM); break;
11996     case bfd_mach_arm_8:
11997 	{
11998 	  /* Add bits for extensions that Armv8.6-A recognizes.  */
11999 	  arm_feature_set armv8_6_ext_fset
12000 	    = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
12001 	  ARM_SET_FEATURES (ARM_ARCH_V8_6A);
12002 	  ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, armv8_6_ext_fset);
12003 	  break;
12004 	}
12005     case bfd_mach_arm_8R:	 ARM_SET_FEATURES (ARM_ARCH_V8R); break;
12006     case bfd_mach_arm_8M_BASE:	 ARM_SET_FEATURES (ARM_ARCH_V8M_BASE); break;
12007     case bfd_mach_arm_8M_MAIN:	 ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN); break;
12008     case bfd_mach_arm_8_1M_MAIN:
12009       ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN);
12010       arm_feature_set mve_all
12011 	= ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE | ARM_EXT2_MVE_FP);
12012       ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, mve_all);
12013       force_thumb = 1;
12014       break;
12015       /* If the machine type is unknown allow all architecture types and all
12016 	 extensions, with the exception of MVE as that clashes with NEON.  */
12017     case bfd_mach_arm_unknown:
12018       ARM_SET_FEATURES (ARM_FEATURE (-1,
12019 				     -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP),
12020 				     -1));
12021       break;
12022     default:
12023       abort ();
12024     }
12025 #undef ARM_SET_FEATURES
12026 
12027   /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
12028      and thus on bfd_mach_arm_XXX value.  Therefore for a given
12029      bfd_mach_arm_XXX value all coprocessor feature bits should be allowed.  */
12030   ARM_MERGE_FEATURE_SETS (*features, arch_fset, fpu_any);
12031 }
12032 
12033 
12034 /* NOTE: There are no checks in these routines that
12035    the relevant number of data bytes exist.  */
12036 
12037 static int
12038 print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
12039 {
12040   unsigned char b[4];
12041   unsigned long given;
12042   int           status;
12043   int           is_thumb = FALSE;
12044   int           is_data = FALSE;
12045   int           little_code;
12046   unsigned int	size = 4;
12047   void	 	(*printer) (bfd_vma, struct disassemble_info *, long);
12048   bfd_boolean   found = FALSE;
12049   struct arm_private_data *private_data;
12050 
12051   /* Clear instruction information field.  */
12052   info->insn_info_valid = 0;
12053   info->branch_delay_insns = 0;
12054   info->data_size = 0;
12055   info->insn_type = dis_noninsn;
12056   info->target = 0;
12057   info->target2 = 0;
12058 
12059   if (info->disassembler_options)
12060     {
12061       parse_arm_disassembler_options (info->disassembler_options);
12062 
12063       /* To avoid repeated parsing of these options, we remove them here.  */
12064       info->disassembler_options = NULL;
12065     }
12066 
12067   /* PR 10288: Control which instructions will be disassembled.  */
12068   if (info->private_data == NULL)
12069     {
12070       static struct arm_private_data private;
12071 
12072       if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0)
12073 	/* If the user did not use the -m command line switch then default to
12074 	   disassembling all types of ARM instruction.
12075 
12076 	   The info->mach value has to be ignored as this will be based on
12077 	   the default archictecture for the target and/or hints in the notes
12078 	   section, but it will never be greater than the current largest arm
12079 	   machine value (iWMMXt2), which is only equivalent to the V5TE
12080 	   architecture.  ARM architectures have advanced beyond the machine
12081 	   value encoding, and these newer architectures would be ignored if
12082 	   the machine value was used.
12083 
12084 	   Ie the -m switch is used to restrict which instructions will be
12085 	   disassembled.  If it is necessary to use the -m switch to tell
12086 	   objdump that an ARM binary is being disassembled, eg because the
12087 	   input is a raw binary file, but it is also desired to disassemble
12088 	   all ARM instructions then use "-marm".  This will select the
12089 	   "unknown" arm architecture which is compatible with any ARM
12090 	   instruction.  */
12091 	  info->mach = bfd_mach_arm_unknown;
12092 
12093       /* Compute the architecture bitmask from the machine number.
12094 	 Note: This assumes that the machine number will not change
12095 	 during disassembly....  */
12096       select_arm_features (info->mach, & private.features);
12097 
12098       private.last_mapping_sym = -1;
12099       private.last_mapping_addr = 0;
12100       private.last_stop_offset = 0;
12101 
12102       info->private_data = & private;
12103     }
12104 
12105   private_data = info->private_data;
12106 
12107   /* Decide if our code is going to be little-endian, despite what the
12108      function argument might say.  */
12109   little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little);
12110 
12111   /* For ELF, consult the symbol table to determine what kind of code
12112      or data we have.  */
12113   if (info->symtab_size != 0
12114       && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
12115     {
12116       bfd_vma addr;
12117       int n;
12118       int last_sym = -1;
12119       enum map_type type = MAP_ARM;
12120 
12121       found = mapping_symbol_for_insn (pc, info, &type);
12122       last_sym = private_data->last_mapping_sym;
12123 
12124       is_thumb = (private_data->last_type == MAP_THUMB);
12125       is_data = (private_data->last_type == MAP_DATA);
12126 
12127       /* Look a little bit ahead to see if we should print out
12128 	 two or four bytes of data.  If there's a symbol,
12129 	 mapping or otherwise, after two bytes then don't
12130 	 print more.  */
12131       if (is_data)
12132 	{
12133 	  size = 4 - (pc & 3);
12134 	  for (n = last_sym + 1; n < info->symtab_size; n++)
12135 	    {
12136 	      addr = bfd_asymbol_value (info->symtab[n]);
12137 	      if (addr > pc
12138 		  && (info->section == NULL
12139 		      || info->section == info->symtab[n]->section))
12140 		{
12141 		  if (addr - pc < size)
12142 		    size = addr - pc;
12143 		  break;
12144 		}
12145 	    }
12146 	  /* If the next symbol is after three bytes, we need to
12147 	     print only part of the data, so that we can use either
12148 	     .byte or .short.  */
12149 	  if (size == 3)
12150 	    size = (pc & 1) ? 1 : 2;
12151 	}
12152     }
12153 
12154   if (info->symbols != NULL)
12155     {
12156       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
12157 	{
12158 	  coff_symbol_type * cs;
12159 
12160 	  cs = coffsymbol (*info->symbols);
12161 	  is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
12162 		      || cs->native->u.syment.n_sclass == C_THUMBSTAT
12163 		      || cs->native->u.syment.n_sclass == C_THUMBLABEL
12164 		      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
12165 		      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
12166 	}
12167       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
12168 	       && !found)
12169 	{
12170 	  /* If no mapping symbol has been found then fall back to the type
12171 	     of the function symbol.  */
12172 	  elf_symbol_type *  es;
12173 	  unsigned int       type;
12174 
12175 	  es = *(elf_symbol_type **)(info->symbols);
12176 	  type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
12177 
12178 	  is_thumb =
12179 	    ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
12180 	      == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT);
12181 	}
12182       else if (bfd_asymbol_flavour (*info->symbols)
12183 	       == bfd_target_mach_o_flavour)
12184 	{
12185 	  bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols;
12186 
12187 	  is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF);
12188 	}
12189     }
12190 
12191   if (force_thumb)
12192     is_thumb = TRUE;
12193 
12194   if (is_data)
12195     info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
12196   else
12197     info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
12198 
12199   info->bytes_per_line = 4;
12200 
12201   /* PR 10263: Disassemble data if requested to do so by the user.  */
12202   if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0))
12203     {
12204       int i;
12205 
12206       /* Size was already set above.  */
12207       info->bytes_per_chunk = size;
12208       printer = print_insn_data;
12209 
12210       status = info->read_memory_func (pc, (bfd_byte *) b, size, info);
12211       given = 0;
12212       if (little)
12213 	for (i = size - 1; i >= 0; i--)
12214 	  given = b[i] | (given << 8);
12215       else
12216 	for (i = 0; i < (int) size; i++)
12217 	  given = b[i] | (given << 8);
12218     }
12219   else if (!is_thumb)
12220     {
12221       /* In ARM mode endianness is a straightforward issue: the instruction
12222 	 is four bytes long and is either ordered 0123 or 3210.  */
12223       printer = print_insn_arm;
12224       info->bytes_per_chunk = 4;
12225       size = 4;
12226 
12227       status = info->read_memory_func (pc, (bfd_byte *) b, 4, info);
12228       if (little_code)
12229 	given = (b[0]) | (b[1] << 8) | (b[2] << 16) | ((unsigned) b[3] << 24);
12230       else
12231 	given = (b[3]) | (b[2] << 8) | (b[1] << 16) | ((unsigned) b[0] << 24);
12232     }
12233   else
12234     {
12235       /* In Thumb mode we have the additional wrinkle of two
12236 	 instruction lengths.  Fortunately, the bits that determine
12237 	 the length of the current instruction are always to be found
12238 	 in the first two bytes.  */
12239       printer = print_insn_thumb16;
12240       info->bytes_per_chunk = 2;
12241       size = 2;
12242 
12243       status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
12244       if (little_code)
12245 	given = (b[0]) | (b[1] << 8);
12246       else
12247 	given = (b[1]) | (b[0] << 8);
12248 
12249       if (!status)
12250 	{
12251 	  /* These bit patterns signal a four-byte Thumb
12252 	     instruction.  */
12253 	  if ((given & 0xF800) == 0xF800
12254 	      || (given & 0xF800) == 0xF000
12255 	      || (given & 0xF800) == 0xE800)
12256 	    {
12257 	      status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info);
12258 	      if (little_code)
12259 		given = (b[0]) | (b[1] << 8) | (given << 16);
12260 	      else
12261 		given = (b[1]) | (b[0] << 8) | (given << 16);
12262 
12263 	      printer = print_insn_thumb32;
12264 	      size = 4;
12265 	    }
12266 	}
12267 
12268       if (ifthen_address != pc)
12269 	find_ifthen_state (pc, info, little_code);
12270 
12271       if (ifthen_state)
12272 	{
12273 	  if ((ifthen_state & 0xf) == 0x8)
12274 	    ifthen_next_state = 0;
12275 	  else
12276 	    ifthen_next_state = (ifthen_state & 0xe0)
12277 				| ((ifthen_state & 0xf) << 1);
12278 	}
12279     }
12280 
12281   if (status)
12282     {
12283       info->memory_error_func (status, pc, info);
12284       return -1;
12285     }
12286   if (info->flags & INSN_HAS_RELOC)
12287     /* If the instruction has a reloc associated with it, then
12288        the offset field in the instruction will actually be the
12289        addend for the reloc.  (We are using REL type relocs).
12290        In such cases, we can ignore the pc when computing
12291        addresses, since the addend is not currently pc-relative.  */
12292     pc = 0;
12293 
12294   printer (pc, info, given);
12295 
12296   if (is_thumb)
12297     {
12298       ifthen_state = ifthen_next_state;
12299       ifthen_address += size;
12300     }
12301   return size;
12302 }
12303 
12304 int
12305 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
12306 {
12307   /* Detect BE8-ness and record it in the disassembler info.  */
12308   if (info->flavour == bfd_target_elf_flavour
12309       && info->section != NULL
12310       && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8))
12311     info->endian_code = BFD_ENDIAN_LITTLE;
12312 
12313   return print_insn (pc, info, FALSE);
12314 }
12315 
12316 int
12317 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info)
12318 {
12319   return print_insn (pc, info, TRUE);
12320 }
12321 
12322 const disasm_options_and_args_t *
12323 disassembler_options_arm (void)
12324 {
12325   static disasm_options_and_args_t *opts_and_args;
12326 
12327   if (opts_and_args == NULL)
12328     {
12329       disasm_options_t *opts;
12330       unsigned int i;
12331 
12332       opts_and_args = XNEW (disasm_options_and_args_t);
12333       opts_and_args->args = NULL;
12334 
12335       opts = &opts_and_args->options;
12336       opts->name = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
12337       opts->description = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
12338       opts->arg = NULL;
12339       for (i = 0; i < NUM_ARM_OPTIONS; i++)
12340 	{
12341 	  opts->name[i] = regnames[i].name;
12342 	  if (regnames[i].description != NULL)
12343 	    opts->description[i] = _(regnames[i].description);
12344 	  else
12345 	    opts->description[i] = NULL;
12346 	}
12347       /* The array we return must be NULL terminated.  */
12348       opts->name[i] = NULL;
12349       opts->description[i] = NULL;
12350     }
12351 
12352   return opts_and_args;
12353 }
12354 
12355 void
12356 print_arm_disassembler_options (FILE *stream)
12357 {
12358   unsigned int i, max_len = 0;
12359   fprintf (stream, _("\n\
12360 The following ARM specific disassembler options are supported for use with\n\
12361 the -M switch:\n"));
12362 
12363   for (i = 0; i < NUM_ARM_OPTIONS; i++)
12364     {
12365       unsigned int len = strlen (regnames[i].name);
12366       if (max_len < len)
12367 	max_len = len;
12368     }
12369 
12370   for (i = 0, max_len++; i < NUM_ARM_OPTIONS; i++)
12371     fprintf (stream, "  %s%*c %s\n",
12372 	     regnames[i].name,
12373 	     (int)(max_len - strlen (regnames[i].name)), ' ',
12374 	     _(regnames[i].description));
12375 }
12376