Home | History | Annotate | Line # | Download | only in opcodes
arm-dis.c revision 1.11
      1 /* Instruction printing code for the ARM
      2    Copyright (C) 1994-2025 Free Software Foundation, Inc.
      3    Contributed by Richard Earnshaw (rwe (at) pegasus.esprit.ec.org)
      4    Modification by James G. Smith (jsmith (at) cygnus.co.uk)
      5 
      6    This file is part of libopcodes.
      7 
      8    This library is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    It is distributed in the hope that it will be useful, but WITHOUT
     14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     16    License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 #include "sysdep.h"
     24 #include <assert.h>
     25 
     26 #include "disassemble.h"
     27 #include "opcode/arm.h"
     28 #include "opintl.h"
     29 #include "safe-ctype.h"
     30 #include "libiberty.h"
     31 #include "floatformat.h"
     32 
     33 /* FIXME: This shouldn't be done here.  */
     34 #include "coff/internal.h"
     35 #include "libcoff.h"
     36 #include "bfd.h"
     37 #include "elf-bfd.h"
     38 #include "elf/internal.h"
     39 #include "elf/arm.h"
     40 #include "mach-o.h"
     41 
     42 /* Cached mapping symbol state.  */
     43 enum map_type
     44 {
     45   MAP_ARM,
     46   MAP_THUMB,
     47   MAP_DATA
     48 };
     49 
     50 struct arm_private_data
     51 {
     52   /* The features to use when disassembling optional instructions.  */
     53   arm_feature_set features;
     54 
     55   /* Track the last type (although this doesn't seem to be useful) */
     56   enum map_type last_type;
     57 
     58   /* Tracking symbol table information */
     59   int last_mapping_sym;
     60 
     61   /* The end range of the current range being disassembled.  */
     62   bfd_vma last_stop_offset;
     63   bfd_vma last_mapping_addr;
     64 };
     65 
     66 enum mve_instructions
     67 {
     68   MVE_VPST,
     69   MVE_VPT_FP_T1,
     70   MVE_VPT_FP_T2,
     71   MVE_VPT_VEC_T1,
     72   MVE_VPT_VEC_T2,
     73   MVE_VPT_VEC_T3,
     74   MVE_VPT_VEC_T4,
     75   MVE_VPT_VEC_T5,
     76   MVE_VPT_VEC_T6,
     77   MVE_VCMP_FP_T1,
     78   MVE_VCMP_FP_T2,
     79   MVE_VCMP_VEC_T1,
     80   MVE_VCMP_VEC_T2,
     81   MVE_VCMP_VEC_T3,
     82   MVE_VCMP_VEC_T4,
     83   MVE_VCMP_VEC_T5,
     84   MVE_VCMP_VEC_T6,
     85   MVE_VDUP,
     86   MVE_VEOR,
     87   MVE_VFMAS_FP_SCALAR,
     88   MVE_VFMA_FP_SCALAR,
     89   MVE_VFMA_FP,
     90   MVE_VFMS_FP,
     91   MVE_VHADD_T1,
     92   MVE_VHADD_T2,
     93   MVE_VHSUB_T1,
     94   MVE_VHSUB_T2,
     95   MVE_VRHADD,
     96   MVE_VLD2,
     97   MVE_VLD4,
     98   MVE_VST2,
     99   MVE_VST4,
    100   MVE_VLDRB_T1,
    101   MVE_VLDRH_T2,
    102   MVE_VLDRB_T5,
    103   MVE_VLDRH_T6,
    104   MVE_VLDRW_T7,
    105   MVE_VSTRB_T1,
    106   MVE_VSTRH_T2,
    107   MVE_VSTRB_T5,
    108   MVE_VSTRH_T6,
    109   MVE_VSTRW_T7,
    110   MVE_VLDRB_GATHER_T1,
    111   MVE_VLDRH_GATHER_T2,
    112   MVE_VLDRW_GATHER_T3,
    113   MVE_VLDRD_GATHER_T4,
    114   MVE_VLDRW_GATHER_T5,
    115   MVE_VLDRD_GATHER_T6,
    116   MVE_VSTRB_SCATTER_T1,
    117   MVE_VSTRH_SCATTER_T2,
    118   MVE_VSTRW_SCATTER_T3,
    119   MVE_VSTRD_SCATTER_T4,
    120   MVE_VSTRW_SCATTER_T5,
    121   MVE_VSTRD_SCATTER_T6,
    122   MVE_VCVT_FP_FIX_VEC,
    123   MVE_VCVT_BETWEEN_FP_INT,
    124   MVE_VCVT_FP_HALF_FP,
    125   MVE_VCVT_FROM_FP_TO_INT,
    126   MVE_VRINT_FP,
    127   MVE_VMOV_HFP_TO_GP,
    128   MVE_VMOV_GP_TO_VEC_LANE,
    129   MVE_VMOV_IMM_TO_VEC,
    130   MVE_VMOV_VEC_TO_VEC,
    131   MVE_VMOV2_VEC_LANE_TO_GP,
    132   MVE_VMOV2_GP_TO_VEC_LANE,
    133   MVE_VMOV_VEC_LANE_TO_GP,
    134   MVE_VMVN_IMM,
    135   MVE_VMVN_REG,
    136   MVE_VORR_IMM,
    137   MVE_VORR_REG,
    138   MVE_VORN,
    139   MVE_VBIC_IMM,
    140   MVE_VBIC_REG,
    141   MVE_VMOVX,
    142   MVE_VMOVL,
    143   MVE_VMOVN,
    144   MVE_VMULL_INT,
    145   MVE_VMULL_POLY,
    146   MVE_VQDMULL_T1,
    147   MVE_VQDMULL_T2,
    148   MVE_VQMOVN,
    149   MVE_VQMOVUN,
    150   MVE_VADDV,
    151   MVE_VMLADAV_T1,
    152   MVE_VMLADAV_T2,
    153   MVE_VMLALDAV,
    154   MVE_VMLAS,
    155   MVE_VADDLV,
    156   MVE_VMLSDAV_T1,
    157   MVE_VMLSDAV_T2,
    158   MVE_VMLSLDAV,
    159   MVE_VRMLALDAVH,
    160   MVE_VRMLSLDAVH,
    161   MVE_VQDMLADH,
    162   MVE_VQRDMLADH,
    163   MVE_VQDMLAH,
    164   MVE_VQRDMLAH,
    165   MVE_VQDMLASH,
    166   MVE_VQRDMLASH,
    167   MVE_VQDMLSDH,
    168   MVE_VQRDMLSDH,
    169   MVE_VQDMULH_T1,
    170   MVE_VQRDMULH_T2,
    171   MVE_VQDMULH_T3,
    172   MVE_VQRDMULH_T4,
    173   MVE_VDDUP,
    174   MVE_VDWDUP,
    175   MVE_VIWDUP,
    176   MVE_VIDUP,
    177   MVE_VCADD_FP,
    178   MVE_VCADD_VEC,
    179   MVE_VHCADD,
    180   MVE_VCMLA_FP,
    181   MVE_VCMUL_FP,
    182   MVE_VQRSHL_T1,
    183   MVE_VQRSHL_T2,
    184   MVE_VQRSHRN,
    185   MVE_VQRSHRUN,
    186   MVE_VQSHL_T1,
    187   MVE_VQSHL_T2,
    188   MVE_VQSHLU_T3,
    189   MVE_VQSHL_T4,
    190   MVE_VQSHRN,
    191   MVE_VQSHRUN,
    192   MVE_VRSHL_T1,
    193   MVE_VRSHL_T2,
    194   MVE_VRSHR,
    195   MVE_VRSHRN,
    196   MVE_VSHL_T1,
    197   MVE_VSHL_T2,
    198   MVE_VSHL_T3,
    199   MVE_VSHLC,
    200   MVE_VSHLL_T1,
    201   MVE_VSHLL_T2,
    202   MVE_VSHR,
    203   MVE_VSHRN,
    204   MVE_VSLI,
    205   MVE_VSRI,
    206   MVE_VADC,
    207   MVE_VABAV,
    208   MVE_VABD_FP,
    209   MVE_VABD_VEC,
    210   MVE_VABS_FP,
    211   MVE_VABS_VEC,
    212   MVE_VADD_FP_T1,
    213   MVE_VADD_FP_T2,
    214   MVE_VADD_VEC_T1,
    215   MVE_VADD_VEC_T2,
    216   MVE_VSBC,
    217   MVE_VSUB_FP_T1,
    218   MVE_VSUB_FP_T2,
    219   MVE_VSUB_VEC_T1,
    220   MVE_VSUB_VEC_T2,
    221   MVE_VAND,
    222   MVE_VBRSR,
    223   MVE_VCLS,
    224   MVE_VCLZ,
    225   MVE_VCTP,
    226   MVE_VMAX,
    227   MVE_VMAXA,
    228   MVE_VMAXNM_FP,
    229   MVE_VMAXNMA_FP,
    230   MVE_VMAXNMV_FP,
    231   MVE_VMAXNMAV_FP,
    232   MVE_VMAXV,
    233   MVE_VMAXAV,
    234   MVE_VMIN,
    235   MVE_VMINA,
    236   MVE_VMINNM_FP,
    237   MVE_VMINNMA_FP,
    238   MVE_VMINNMV_FP,
    239   MVE_VMINNMAV_FP,
    240   MVE_VMINV,
    241   MVE_VMINAV,
    242   MVE_VMLA,
    243   MVE_VMUL_FP_T1,
    244   MVE_VMUL_FP_T2,
    245   MVE_VMUL_VEC_T1,
    246   MVE_VMUL_VEC_T2,
    247   MVE_VMULH,
    248   MVE_VRMULH,
    249   MVE_VNEG_FP,
    250   MVE_VNEG_VEC,
    251   MVE_VPNOT,
    252   MVE_VPSEL,
    253   MVE_VQABS,
    254   MVE_VQADD_T1,
    255   MVE_VQADD_T2,
    256   MVE_VQSUB_T1,
    257   MVE_VQSUB_T2,
    258   MVE_VQNEG,
    259   MVE_VREV16,
    260   MVE_VREV32,
    261   MVE_VREV64,
    262   MVE_LSLL,
    263   MVE_LSLLI,
    264   MVE_LSRL,
    265   MVE_ASRL,
    266   MVE_ASRLI,
    267   MVE_SQRSHRL,
    268   MVE_SQRSHR,
    269   MVE_UQRSHL,
    270   MVE_UQRSHLL,
    271   MVE_UQSHL,
    272   MVE_UQSHLL,
    273   MVE_URSHRL,
    274   MVE_URSHR,
    275   MVE_SRSHRL,
    276   MVE_SRSHR,
    277   MVE_SQSHLL,
    278   MVE_SQSHL,
    279   MVE_CINC,
    280   MVE_CINV,
    281   MVE_CNEG,
    282   MVE_CSINC,
    283   MVE_CSINV,
    284   MVE_CSET,
    285   MVE_CSETM,
    286   MVE_CSNEG,
    287   MVE_CSEL,
    288   MVE_NONE
    289 };
    290 
    291 enum mve_unpredictable
    292 {
    293   UNPRED_IT_BLOCK,		/* Unpredictable because mve insn in it block.
    294 				 */
    295   UNPRED_FCA_0_FCB_1,		/* Unpredictable because fcA = 0 and
    296 				   fcB = 1 (vpt).  */
    297   UNPRED_R13,			/* Unpredictable because r13 (sp) or
    298 				   r15 (sp) used.  */
    299   UNPRED_R15,			/* Unpredictable because r15 (pc) is used.  */
    300   UNPRED_Q_GT_4,		/* Unpredictable because
    301 				   vec reg start > 4 (vld4/st4).  */
    302   UNPRED_Q_GT_6,		/* Unpredictable because
    303 				   vec reg start > 6 (vld2/st2).  */
    304   UNPRED_R13_AND_WB,		/* Unpredictable becase gp reg = r13
    305 				   and WB bit = 1.  */
    306   UNPRED_Q_REGS_EQUAL,		/* Unpredictable because vector registers are
    307 				   equal.  */
    308   UNPRED_OS,			/* Unpredictable because offset scaled == 1.  */
    309   UNPRED_GP_REGS_EQUAL,		/* Unpredictable because gp registers are the
    310 				   same.  */
    311   UNPRED_Q_REGS_EQ_AND_SIZE_1,	/* Unpredictable because q regs equal and
    312 				   size = 1.  */
    313   UNPRED_Q_REGS_EQ_AND_SIZE_2,	/* Unpredictable because q regs equal and
    314 				   size = 2.  */
    315   UNPRED_NONE			/* No unpredictable behavior.  */
    316 };
    317 
    318 enum mve_undefined
    319 {
    320   UNDEF_SIZE,			/* undefined size.  */
    321   UNDEF_SIZE_0,			/* undefined because size == 0.  */
    322   UNDEF_SIZE_2,			/* undefined because size == 2.  */
    323   UNDEF_SIZE_3,			/* undefined because size == 3.  */
    324   UNDEF_SIZE_LE_1,		/* undefined because size <= 1.  */
    325   UNDEF_SIZE_NOT_0,		/* undefined because size != 0.  */
    326   UNDEF_SIZE_NOT_2,		/* undefined because size != 2.  */
    327   UNDEF_SIZE_NOT_3,		/* undefined because size != 3.  */
    328   UNDEF_NOT_UNS_SIZE_0,		/* undefined because U == 0 and
    329 				   size == 0.  */
    330   UNDEF_NOT_UNS_SIZE_1,		/* undefined because U == 0 and
    331 				   size == 1.  */
    332   UNDEF_NOT_UNSIGNED,		/* undefined because U == 0.  */
    333   UNDEF_VCVT_IMM6,		/* imm6 < 32.  */
    334   UNDEF_VCVT_FSI_IMM6,		/* fsi = 0 and 32 >= imm6 <= 47.  */
    335   UNDEF_BAD_OP1_OP2,		/* undefined with op2 = 2 and
    336 				   op1 == (0 or 1).  */
    337   UNDEF_BAD_U_OP1_OP2,		/* undefined with U = 1 and
    338 				   op2 == 0 and op1 == (0 or 1).  */
    339   UNDEF_OP_0_BAD_CMODE,		/* undefined because op == 0 and cmode
    340 				   in {0xx1, x0x1}.  */
    341   UNDEF_XCHG_UNS,		/* undefined because X == 1 and U == 1.  */
    342   UNDEF_NONE			/* no undefined behavior.  */
    343 };
    344 
    345 struct opcode32
    346 {
    347   arm_feature_set arch;		/* Architecture defining this insn.  */
    348   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
    349   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
    350   const char *  assembler;	/* How to disassemble this insn.  */
    351 };
    352 
    353 struct cdeopcode32
    354 {
    355   arm_feature_set arch;		/* Architecture defining this insn.  */
    356   uint8_t coproc_shift;		/* coproc is this far into op.  */
    357   uint16_t coproc_mask;		/* Length of coproc field in op.  */
    358   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
    359   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
    360   const char *  assembler;	/* How to disassemble this insn.  */
    361 };
    362 
    363 /* MVE opcodes.  */
    364 
    365 struct mopcode32
    366 {
    367   arm_feature_set arch;		/* Architecture defining this insn.  */
    368   enum mve_instructions mve_op;  /* Specific mve instruction for faster
    369 				    decoding.  */
    370   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
    371   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
    372   const char *  assembler;	/* How to disassemble this insn.  */
    373 };
    374 
    375 enum isa {
    376   ANY,
    377   T32,
    378   ARM
    379 };
    380 
    381 
    382 /* Shared (between Arm and Thumb mode) opcode.  */
    383 struct sopcode32
    384 {
    385   enum isa isa;			/* Execution mode instruction availability.  */
    386   arm_feature_set arch;		/* Architecture defining this insn.  */
    387   unsigned long value;		/* If arch is 0 then value is a sentinel.  */
    388   unsigned long mask;		/* Recognise insn if (op & mask) == value.  */
    389   const char *  assembler;	/* How to disassemble this insn.  */
    390 };
    391 
    392 struct opcode16
    393 {
    394   arm_feature_set arch;		/* Architecture defining this insn.  */
    395   unsigned short value, mask;	/* Recognise insn if (op & mask) == value.  */
    396   const char *assembler;	/* How to disassemble this insn.  */
    397 };
    398 
    399 /* print_insn_coprocessor recognizes the following format control codes:
    400 
    401    %%			%
    402 
    403    %c			print condition code (always bits 28-31 in ARM mode)
    404    %b			print condition code allowing cp_num == 9
    405    %q			print shifter argument
    406    %u			print condition code (unconditional in ARM mode,
    407                           UNPREDICTABLE if not AL in Thumb)
    408    %A			print address for ldc/stc instruction
    409    %B			print vstm/vldm register list
    410    %C			print vscclrm register list
    411    %J			print register for VLDR instruction
    412    %K			print address for VLDR instruction
    413 
    414    %<bitfield>c		print as a condition code (for vsel)
    415    %<bitfield>r		print as an ARM register
    416    %<bitfield>R		as %<>r but r15 is UNPREDICTABLE
    417    %<bitfield>ru        as %<>r but each u register must be unique.
    418    %<bitfield>d		print the bitfield in decimal
    419    %<bitfield>k		print immediate for VFPv3 conversion instruction
    420    %<bitfield>x		print the bitfield in hex
    421    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
    422    %<bitfield>w         print as an iWMMXt width field - [bhwd]ss/us
    423    %<bitfield>g         print as an iWMMXt 64-bit register
    424    %<bitfield>G         print as an iWMMXt general purpose or control register
    425    %<bitfield>D		print as a NEON D register
    426    %<bitfield>Q		print as a NEON Q register
    427    %<bitfield>V		print as a NEON D or Q register
    428    %<bitfield>E		print a quarter-float immediate value
    429 
    430    %y<code>		print a single precision VFP reg.
    431 			  Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
    432    %z<code>		print a double precision VFP reg
    433 			  Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
    434 
    435    %<bitfield>'c	print specified char iff bitfield is all ones
    436    %<bitfield>`c	print specified char iff bitfield is all zeroes
    437    %<bitfield>?ab...    select from array of values in big endian order
    438 
    439    %L			print as an iWMMXt N/M width field.
    440    %Z			print the Immediate of a WSHUFH instruction.
    441    %l			like 'A' except use byte offsets for 'B' & 'H'
    442 			versions.
    443    %i			print 5-bit immediate in bits 8,3..0
    444 			(print "32" when 0)
    445    %r			print register offset address for wldt/wstr instruction.  */
    446 
    447 enum opcode_sentinel_enum
    448 {
    449   SENTINEL_IWMMXT_START = 1,
    450   SENTINEL_IWMMXT_END,
    451   SENTINEL_GENERIC_START
    452 } opcode_sentinels;
    453 
    454 #define UNDEFINED_INSTRUCTION      "\t\t@ <UNDEFINED> instruction: %0-31x"
    455 #define UNKNOWN_INSTRUCTION_32BIT  "\t\t@ <UNDEFINED> instruction: %08x"
    456 #define UNKNOWN_INSTRUCTION_16BIT  "\t\t@ <UNDEFINED> instruction: %04x"
    457 #define UNPREDICTABLE_INSTRUCTION  "\t@ <UNPREDICTABLE>"
    458 
    459 /* Common coprocessor opcodes shared between Arm and Thumb-2.  */
    460 
    461 /* print_insn_cde recognizes the following format control codes:
    462 
    463    %%			%
    464 
    465    %a			print 'a' iff bit 28 is 1
    466    %p			print bits 8-10 as coprocessor
    467    %<bitfield>d		print as decimal
    468    %<bitfield>r		print as an ARM register
    469    %<bitfield>n		print as an ARM register but r15 is APSR_nzcv
    470    %<bitfield>T		print as an ARM register + 1
    471    %<bitfield>R		as %r but r13 is UNPREDICTABLE
    472    %<bitfield>S		as %r but rX where X > 10 is UNPREDICTABLE
    473    %j			print immediate taken from bits (16..21,7,0..5)
    474    %k			print immediate taken from bits (20..21,7,0..5).
    475    %l			print immediate taken from bits (20..22,7,4..5).  */
    476 
    477 /* At the moment there is only one valid position for the coprocessor number,
    478    and hence that's encoded in the macro below.  */
    479 #define CDE_OPCODE(ARCH, VALUE, MASK, ASM) \
    480   { ARCH, 8, 7, VALUE, MASK, ASM }
    481 static const struct cdeopcode32 cde_opcodes[] =
    482 {
    483   /* Custom Datapath Extension instructions.  */
    484   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    485 	      0xee000000, 0xefc00840,
    486 	      "cx1%a\t%p, %12-15n, %{I:#%0-5,7,16-21d%}"),
    487   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    488 	      0xee000040, 0xefc00840,
    489 	      "cx1d%a\t%p, %12-15S, %12-15T, %{I:#%0-5,7,16-21d%}"),
    490 
    491   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    492 	      0xee400000, 0xefc00840,
    493 	      "cx2%a\t%p, %12-15n, %16-19n, %{I:#%0-5,7,20-21d%}"),
    494   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    495 	      0xee400040, 0xefc00840,
    496 	      "cx2d%a\t%p, %12-15S, %12-15T, %16-19n, %{I:#%0-5,7,20-21d%}"),
    497 
    498   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    499 	      0xee800000, 0xef800840,
    500 	      "cx3%a\t%p, %0-3n, %16-19n, %12-15n, %{I:#%4-5,7,20-22d%}"),
    501   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    502 	      0xee800040, 0xef800840,
    503 	     "cx3d%a\t%p, %0-3S, %0-3T, %16-19n, %12-15n, %{I:#%4-5,7,20-22d%}"),
    504 
    505   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    506 	      0xec200000, 0xeeb00840,
    507 	      "vcx1%a\t%p, %12-15,22V, %{I:#%0-5,7,16-19d%}"),
    508   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    509 	      0xec200040, 0xeeb00840,
    510 	      "vcx1%a\t%p, %12-15,22V, %{I:#%0-5,7,16-19,24d%}"),
    511 
    512   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    513 	      0xec300000, 0xeeb00840,
    514 	      "vcx2%a\t%p, %12-15,22V, %0-3,5V, %{I:#%4,7,16-19d%}"),
    515   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    516 	      0xec300040, 0xeeb00840,
    517 	      "vcx2%a\t%p, %12-15,22V, %0-3,5V, %{I:#%4,7,16-19,24d%}"),
    518 
    519   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    520 	      0xec800000, 0xee800840,
    521 	      "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, %{I:#%4,20-21d%}"),
    522   CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE),
    523 	      0xec800040, 0xee800840,
    524 	      "vcx3%a\t%p, %12-15,22V, %16-19,7V, %0-3,5V, %{I:#%4,20-21,24d%}"),
    525 
    526   CDE_OPCODE (ARM_FEATURE_CORE_LOW (0), 0, 0, 0)
    527 
    528 };
    529 
    530 static const struct sopcode32 coprocessor_opcodes[] =
    531 {
    532   /* XScale instructions.  */
    533   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    534     0x0e200010, 0x0fff0ff0,
    535     "mia%c\t%{R:acc0%}, %0-3r, %12-15r"},
    536   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    537     0x0e280010, 0x0fff0ff0,
    538     "miaph%c\t%{R:acc0%}, %0-3r, %12-15r"},
    539   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    540     0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\t%{R:acc0%}, %0-3r, %12-15r"},
    541   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    542     0x0c400000, 0x0ff00fff, "mar%c\t%{R:acc0%}, %12-15r, %16-19r"},
    543   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    544     0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, %{R:acc0%}"},
    545 
    546   /* Intel Wireless MMX technology instructions.  */
    547   {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" },
    548   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
    549     0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
    550   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    551     0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
    552   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    553     0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, %{I:#%0-2d%}"},
    554   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    555     0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, %{I:#%0-2d%}"},
    556   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    557     0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, %{I:#%0-2d%}"},
    558   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    559     0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
    560   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    561     0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
    562   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    563     0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
    564   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    565     0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
    566   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    567     0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
    568   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    569     0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
    570   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    571     0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
    572   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    573     0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
    574   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    575     0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
    576   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    577     0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
    578   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    579     0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
    580   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    581     0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
    582   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    583     0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    584   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    585     0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
    586   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    587     0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
    588   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    589     0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, %{I:#%20-22d%}"},
    590   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    591     0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
    592   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    593     0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
    594   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    595     0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
    596   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    597     0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
    598   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    599     0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    600   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    601     0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    602   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    603     0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
    604   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    605     0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
    606   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    607     0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
    608   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    609     0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
    610   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    611     0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
    612   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    613     0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
    614   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    615     0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    616   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    617     0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, %{I:#%21-23d%}"},
    618   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    619     0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    620   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    621     0x0e800120, 0x0f800ff0,
    622     "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    623   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    624     0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    625   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    626     0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
    627   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    628     0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
    629   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    630     0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
    631   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    632     0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
    633   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    634     0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
    635   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    636     0x0e8000a0, 0x0f800ff0,
    637     "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
    638   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    639     0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    640   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    641     0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
    642   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    643     0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
    644   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    645     0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    646   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    647     0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, %{I:#%i%}"},
    648   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    649     0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    650   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    651     0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
    652   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    653     0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
    654   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    655     0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, %{I:#%Z%}"},
    656   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    657     0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, %{I:#%i%}"},
    658   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    659     0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    660   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    661     0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    662   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    663     0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, %{I:#%i%}"},
    664   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    665     0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    666   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    667     0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    668   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    669     0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, %{I:#%i%}"},
    670   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    671     0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
    672   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    673     0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
    674   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    675     0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
    676   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    677     0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
    678   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    679     0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
    680   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    681     0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
    682   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    683     0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
    684   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    685     0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    686   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    687     0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
    688   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    689     0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
    690   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    691     0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
    692   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    693     0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
    694   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    695     0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    696   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    697     0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
    698   {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
    699     0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
    700   {ANY, ARM_FEATURE_CORE_LOW (0),
    701     SENTINEL_IWMMXT_END, 0, "" },
    702 
    703   /* Armv8.1-M Mainline instructions.  */
    704   {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    705     0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"},
    706   {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    707     0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"},
    708 
    709   /* ARMv8-M Mainline Security Extensions instructions.  */
    710   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
    711     0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"},
    712   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN),
    713     0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"},
    714 
    715   /* Register load/store.  */
    716   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    717     0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
    718   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    719     0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
    720   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    721     0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
    722   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    723     0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
    724   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    725     0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
    726   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    727     0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
    728   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    729     0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
    730   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1),
    731     0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
    732   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    733     0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
    734   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    735     0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
    736   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    737     0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
    738   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    739     0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
    740   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    741     0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
    742   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    743     0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
    744   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    745     0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
    746   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    747     0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
    748   {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
    749     0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"},
    750   {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN),
    751     0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"},
    752 
    753   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    754     0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t@ Deprecated"},
    755   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    756     0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t@ Deprecated"},
    757   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    758     0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t@ Deprecated"},
    759   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    760     0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t@ Deprecated"},
    761 
    762   /* Data transfer between ARM and NEON registers.  */
    763   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    764     0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
    765   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    766     0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
    767   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    768     0x0e000b10, 0x0fd00f70, "vmov%c.32\t%{R:%16-19,7D[%21d]%}, %12-15r"},
    769   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    770     0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %{R:%16-19,7D[%21d]%}"},
    771   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    772     0x0e000b30, 0x0fd00f30, "vmov%c.16\t%{R:%16-19,7D[%6,21d]%}, %12-15r"},
    773   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    774     0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %{R:%16-19,7D[%6,21d]%}"},
    775   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    776     0x0e400b10, 0x0fd00f10, "vmov%c.8\t%{R:%16-19,7D[%5,6,21d]%}, %12-15r"},
    777   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
    778     0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %{R:%16-19,7D[%5,6,21d]%}"},
    779   /* Half-precision conversion instructions.  */
    780   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    781     0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"},
    782   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    783     0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"},
    784   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
    785     0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
    786   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
    787     0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
    788 
    789   /* Floating point coprocessor (VFP) instructions.  */
    790   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    791     0x0ee00a10, 0x0fff0fff, "vmsr%c\t%{R:fpsid%}, %12-15r"},
    792   {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
    793     0x0ee10a10, 0x0fff0fff, "vmsr%c\t%{R:fpscr%}, %12-15r"},
    794   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    795     0x0ee20a10, 0x0fff0fff, "vmsr%c\t%{R:fpscr_nzcvqc%}, %12-15r"},
    796   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    797     0x0ee60a10, 0x0fff0fff, "vmsr%c\t%{R:mvfr1%}, %12-15r"},
    798   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    799     0x0ee70a10, 0x0fff0fff, "vmsr%c\t%{R:mvfr0%}, %12-15r"},
    800   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    801     0x0ee50a10, 0x0fff0fff, "vmsr%c\t%{R:mvfr2%}, %12-15r"},
    802   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    803     0x0ee80a10, 0x0fff0fff, "vmsr%c\t%{R:fpexc%}, %12-15r"},
    804   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    805     0x0ee90a10, 0x0fff0fff, "vmsr%c\t%{R:fpinst%}, %12-15r\t@ Impl def"},
    806   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    807     0x0eea0a10, 0x0fff0fff, "vmsr%c\t%{R:fpinst2%}, %12-15r\t@ Impl def"},
    808   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
    809     0x0eec0a10, 0x0fff0fff, "vmsr%c\t%{R:vpr%}, %12-15r"},
    810   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
    811     0x0eed0a10, 0x0fff0fff, "vmsr%c\t%{R:p0%}, %12-15r"},
    812   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    813     0x0eee0a10, 0x0fff0fff, "vmsr%c\t%{R:fpcxt_ns%}, %12-15r"},
    814   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    815     0x0eef0a10, 0x0fff0fff, "vmsr%c\t%{R:fpcxt_s%}, %12-15r"},
    816   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    817     0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpsid%}"},
    818   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    819     0x0ef1fa10, 0x0fffffff, "vmrs%c\t%{R:APSR_nzcv%}, %{R:fpscr%}"},
    820   {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD),
    821     0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpscr%}"},
    822   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    823     0x0ef20a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpscr_nzcvqc%}"},
    824   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    825     0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:mvfr2%}"},
    826   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    827     0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:mvfr1%}"},
    828   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    829     0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:mvfr0%}"},
    830   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    831     0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpexc%}"},
    832   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    833     0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpinst%}\t@ Impl def"},
    834   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    835     0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpinst2%}\t@ Impl def"},
    836   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
    837     0x0efc0a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:vpr%}"},
    838   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
    839     0x0efd0a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:p0%}"},
    840   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    841     0x0efe0a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpcxt_ns%}"},
    842   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
    843     0x0eff0a10, 0x0fff0fff, "vmrs%c\t%12-15r, %{R:fpcxt_s%}"},
    844   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    845     0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%{I:%21d%}], %12-15r"},
    846   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    847     0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%{I:%21d%}]"},
    848   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    849     0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
    850   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    851     0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
    852   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    853     0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
    854   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    855     0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
    856   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    857     0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, %{I:#0.0%}"},
    858   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    859     0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, %{I:#0.0%}"},
    860   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    861     0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
    862   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    863     0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
    864   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    865     0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
    866   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    867     0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
    868   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    869     0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
    870   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    871     0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
    872   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    873     0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
    874   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    875     0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
    876   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    877     0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
    878   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    879     0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
    880   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    881     0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
    882   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    883     0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
    884   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    885     0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
    886   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    887     0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
    888   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    889     0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, %{I:#%5,0-3k%}"},
    890   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    891     0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, %{I:#%5,0-3k%}"},
    892   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    893     0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
    894   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    895     0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
    896   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    897     0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, %{I:#%5,0-3k%}"},
    898   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    899     0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, %{I:#%5,0-3k%}"},
    900   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    901     0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
    902   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
    903     0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, %{I:#%0-3,16-19E%}"},
    904   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
    905     0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, %{I:#%0-3,16-19E%}"},
    906   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    907     0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
    908   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    909     0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
    910   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2),
    911     0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
    912   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    913     0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
    914   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    915     0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
    916   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    917     0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
    918   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    919     0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
    920   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    921     0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
    922   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    923     0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
    924   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    925     0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
    926   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    927     0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
    928   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    929     0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
    930   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    931     0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
    932   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    933     0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
    934   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    935     0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
    936   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    937     0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
    938   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    939     0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
    940   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    941     0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
    942   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    943     0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
    944   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD),
    945     0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
    946   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
    947     0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
    948 
    949   /* VFP Fused multiply add instructions.  */
    950   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    951     0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
    952   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    953     0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
    954   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    955     0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
    956   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    957     0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
    958   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    959     0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
    960   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    961     0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
    962   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    963     0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
    964   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA),
    965     0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
    966 
    967   /* FP v5.  */
    968   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    969     0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"},
    970   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    971     0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"},
    972   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    973     0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"},
    974   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    975     0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"},
    976   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    977     0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"},
    978   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    979     0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"},
    980   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    981     0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"},
    982   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    983     0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"},
    984   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    985     0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"},
    986   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    987     0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"},
    988   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    989     0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"},
    990   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8),
    991     0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"},
    992 
    993   {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" },
    994   /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8.  */
    995   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    996     0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%24?29%24'70%}"},
    997   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
    998     0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%24?29%24'70%}"},
    999   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1000     0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%23'90%}"},
   1001   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1002     0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%23?21%23?780%}"},
   1003   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1004     0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%23'90%}"},
   1005   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1006     0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, %{I:#%23?21%23?780%}"},
   1007   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1008     0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %{R:%0-3D[%5?10]%}, %{I:#%20'90%}"},
   1009   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1010     0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %{R:%0-3D[%5?10]%}, %{I:#%20?21%20?780%}"},
   1011   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1012     0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %{R:%0-3,5D[0]%}, %{I:#%20'90%}"},
   1013   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1014     0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %{R:%0-3,5D[0]%}, %{I:#%20?21%20?780%}"},
   1015 
   1016   /* BFloat16 instructions.  */
   1017   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1018     0x0eb30940, 0x0fbf0f50, "vcvt%7?tb%b.bf16.f32\t%y1, %y0"},
   1019 
   1020   /* Dot Product instructions in the space of coprocessor 13.  */
   1021   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
   1022     0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
   1023   {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
   1024     0xfe200d00, 0xff200f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %{R:%0-3D[%5?10]%}"},
   1025 
   1026   /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8.  */
   1027   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1028     0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, %{R:s%7,16-19d%}, %{R:s%5,0-3d%}"},
   1029   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1030     0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, %{R:s%7,16-19d%}, %{R:s%5,0-3d%}"},
   1031   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1032     0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, %{R:d%16-19,7d%}, %{R:d%0-3,5d%}"},
   1033   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1034     0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, %{R:d%16-19,7d%}, %{R:d%0-3,5d%}"},
   1035   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1036     0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, %{R:s%7,16-19d%}, %{R:s%5,0-2d[%3d]%}"},
   1037   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1038     0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, %{R:s%7,16-19d%}, %{R:s%5,0-2d[%3d]%}"},
   1039   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1040     0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, %{R:d%16-19,7d%}, %{R:d%0-2d[%3,5d]%}"},
   1041   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
   1042     0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, %{R:d%16-19,7d%}, %{R:d%0-2d[%3,5d]%}"},
   1043 
   1044   /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions.
   1045      cp_num: bit <11:8> == 0b1001.
   1046      cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE.  */
   1047   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1048     0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"},
   1049   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1050     0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"},
   1051   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1052     0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"},
   1053   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1054     0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, %{I:#0.0%}"},
   1055   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1056     0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, %{I:#%5,0-3k%}"},
   1057   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1058     0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, %{I:#%5,0-3k%}"},
   1059   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1060     0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"},
   1061   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1062     0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"},
   1063   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1064     0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"},
   1065   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1066     0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"},
   1067   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1068     0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"},
   1069   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1070     0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"},
   1071   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1072     0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"},
   1073   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1074     0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"},
   1075   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1076     0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"},
   1077   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1078     0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"},
   1079   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1080     0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"},
   1081   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1082     0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"},
   1083   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1084     0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"},
   1085   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1086     0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"},
   1087   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1088     0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"},
   1089   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1090     0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"},
   1091   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1092     0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"},
   1093   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1094     0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"},
   1095   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1096     0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, %{I:#%0-3,16-19E%}"},
   1097   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1098     0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"},
   1099   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1100     0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"},
   1101   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1102     0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"},
   1103   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1104     0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"},
   1105   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1106     0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"},
   1107   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1108     0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"},
   1109   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1110     0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"},
   1111   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1112     0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"},
   1113   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1114     0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"},
   1115   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1116     0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"},
   1117 
   1118   /* ARMv8.3 javascript conversion instruction.  */
   1119   {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
   1120     0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"},
   1121 
   1122   {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   1123 };
   1124 
   1125 /* Generic coprocessor instructions.  These are only matched if a more specific
   1126    SIMD or co-processor instruction does not match first.  */
   1127 
   1128 static const struct sopcode32 generic_coprocessor_opcodes[] =
   1129 {
   1130   /* Generic coprocessor instructions.  */
   1131   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   1132     0x0c400000, 0x0ff00000, "mcrr%c\t%{I:%8-11d%}, %{I:%4-7d%}, %12-15R, %16-19r, %{R:cr%0-3d%}"},
   1133   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   1134     0x0c500000, 0x0ff00000,
   1135     "mrrc%c\t%{I:%8-11d%}, %{I:%4-7d%}, %12-15Ru, %16-19Ru, %{R:cr%0-3d%}"},
   1136   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1137     0x0e000000, 0x0f000010,
   1138     "cdp%c\t%{I:%8-11d%}, %{I:%20-23d%}, %{R:cr%12-15d%}, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1139   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1140     0x0e10f010, 0x0f10f010,
   1141     "mrc%c\t%{I:%8-11d%}, %{I:%21-23d%}, %{R:APSR_nzcv%}, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1142   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1143     0x0e100010, 0x0f100010,
   1144     "mrc%c\t%{I:%8-11d%}, %{I:%21-23d%}, %12-15r, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1145   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1146     0x0e000010, 0x0f100010,
   1147     "mcr%c\t%{I:%8-11d%}, %{I:%21-23d%}, %12-15R, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1148   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1149     0x0c000000, 0x0e100000, "stc%22'l%c\t%{I:%8-11d%}, %{R:cr%12-15d%}, %A"},
   1150   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   1151     0x0c100000, 0x0e100000, "ldc%22'l%c\t%{I:%8-11d%}, %{R:cr%12-15d%}, %A"},
   1152 
   1153   /* V6 coprocessor instructions.  */
   1154   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1155     0xfc500000, 0xfff00000,
   1156     "mrrc2%c\t%{I:%8-11d%}, %{I:%4-7d%}, %12-15Ru, %16-19Ru, %{R:cr%0-3d%}"},
   1157   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   1158     0xfc400000, 0xfff00000,
   1159     "mcrr2%c\t%{I:%8-11d%}, %{I:%4-7d%}, %12-15R, %16-19R, %{R:cr%0-3d%}"},
   1160 
   1161   /* V5 coprocessor instructions.  */
   1162   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   1163     0xfc100000, 0xfe100000, "ldc2%22'l%c\t%{I:%8-11d%}, %{R:cr%12-15d%}, %A"},
   1164   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   1165     0xfc000000, 0xfe100000, "stc2%22'l%c\t%{I:%8-11d%}, %{R:cr%12-15d%}, %A"},
   1166   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   1167     0xfe000000, 0xff000010,
   1168     "cdp2%c\t%{I:%8-11d%}, %{I:%20-23d%}, %{R:cr%12-15d%}, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1169   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   1170     0xfe000010, 0xff100010,
   1171     "mcr2%c\t%{I:%8-11d%}, %{I:%21-23d%}, %12-15R, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1172   {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   1173     0xfe100010, 0xff100010,
   1174     "mrc2%c\t%{I:%8-11d%}, %{I:%21-23d%}, %12-15r, %{R:cr%16-19d%}, %{R:cr%0-3d%}, {%{I:%5-7d%}}"},
   1175 
   1176   {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   1177 };
   1178 
   1179 /* Neon opcode table:  This does not encode the top byte -- that is
   1180    checked by the print_insn_neon routine, as it depends on whether we are
   1181    doing thumb32 or arm32 disassembly.  */
   1182 
   1183 /* print_insn_neon recognizes the following format control codes:
   1184 
   1185    %%			%
   1186 
   1187    %c			print condition code
   1188    %u			print condition code (unconditional in ARM mode,
   1189                           UNPREDICTABLE if not AL in Thumb)
   1190    %A			print v{st,ld}[1234] operands
   1191    %B			print v{st,ld}[1234] any one operands
   1192    %C			print v{st,ld}[1234] single->all operands
   1193    %D			print scalar
   1194    %E			print vmov, vmvn, vorr, vbic encoded constant
   1195    %F			print vtbl,vtbx register list
   1196 
   1197    %<bitfield>r		print as an ARM register
   1198    %<bitfield>d		print the bitfield in decimal
   1199    %<bitfield>e         print the 2^N - bitfield in decimal
   1200    %<bitfield>D		print as a NEON D register
   1201    %<bitfield>Q		print as a NEON Q register
   1202    %<bitfield>R		print as a NEON D or Q register
   1203    %<bitfield>Sn	print byte scaled width limited by n
   1204    %<bitfield>Tn	print short scaled width limited by n
   1205    %<bitfield>Un	print long scaled width limited by n
   1206 
   1207    %<bitfield>'c	print specified char iff bitfield is all ones
   1208    %<bitfield>`c	print specified char iff bitfield is all zeroes
   1209    %<bitfield>?ab...    select from array of values in big endian order.  */
   1210 
   1211 static const struct opcode32 neon_opcodes[] =
   1212 {
   1213   /* Extract.  */
   1214   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1215     0xf2b00840, 0xffb00850,
   1216     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, %{I:#%8-11d%}"},
   1217   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1218     0xf2b00000, 0xffb00810,
   1219     "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, %{I:#%8-11d%}"},
   1220 
   1221   /* Data transfer between ARM and NEON registers.  */
   1222   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1223     0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
   1224   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1225     0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
   1226   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1227     0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
   1228   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1229     0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
   1230   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1231     0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
   1232   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1233     0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
   1234 
   1235   /* Move data element to all lanes.  */
   1236   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1237     0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %{R:%0-3,5D[%19d]%}"},
   1238   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1239     0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %{R:%0-3,5D[%18-19d]%}"},
   1240   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1241     0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %{R:%0-3,5D[%17-19d]%}"},
   1242 
   1243   /* Table lookup.  */
   1244   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1245     0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
   1246   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1247     0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
   1248 
   1249   /* Half-precision conversions.  */
   1250   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
   1251     0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
   1252   {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16),
   1253     0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
   1254 
   1255   /* NEON fused multiply add instructions.  */
   1256   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
   1257     0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1258   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1259     0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1260   {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA),
   1261     0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1262   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1263     0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1264 
   1265   /* BFloat16 instructions.  */
   1266   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1267     0xfc000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1268   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1269     0xfe000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, %{R:d%0-3d[%5d]%}"},
   1270   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1271     0xfc000c40, 0xffb00f50, "vmmla.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1272   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1273     0xf3b60640, 0xffbf0fd0, "vcvt%c.bf16.f32\t%12-15,22D, %0-3,5Q"},
   1274   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1275     0xfc300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1276   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16),
   1277     0xfe300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %{R:%0-2D[%3,5d]%}"},
   1278 
   1279   /* Matrix Multiply instructions.  */
   1280   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1281     0xfc200c40, 0xffb00f50, "vsmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1282   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1283     0xfc200c50, 0xffb00f50, "vummla.u8\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1284   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1285     0xfca00c40, 0xffb00f50, "vusmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1286   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1287     0xfca00d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1288   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1289     0xfe800d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, %{R:d%0-3d[%5d]%}"},
   1290   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM),
   1291     0xfe800d10, 0xffb00f10, "vsudot.u8\t%12-15,22R, %16-19,7R, %{R:d%0-3d[%5d]%}"},
   1292 
   1293   /* Two registers, miscellaneous.  */
   1294   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1295     0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"},
   1296   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1297     0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"},
   1298   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1299     0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"},
   1300   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1301     0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"},
   1302   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1303     0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"},
   1304   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1305     0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"},
   1306   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1307     0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"},
   1308   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1309     0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"},
   1310   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1311     0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"},
   1312   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1313     0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"},
   1314   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1315     0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"},
   1316   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1317     0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
   1318   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1319     0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
   1320   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1321     0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
   1322   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1323     0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
   1324   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1325     0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
   1326   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1327     0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
   1328   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1329     0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
   1330   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1331     0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
   1332   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1333     0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
   1334   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1335     0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
   1336   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1337     0xf3b20300, 0xffb30fd0,
   1338     "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, %{I:#%18-19S2%}"},
   1339   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1340     0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
   1341   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1342     0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"},
   1343   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1344     0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
   1345   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1346     0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"},
   1347   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1348     0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1349   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1350     0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1351   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1352     0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1353   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1354     0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1355   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1356     0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
   1357   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1358     0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1359   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1360     0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
   1361   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1362     0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1363   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1364     0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1365   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1366     0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
   1367   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1368     0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, %{I:#0%}"},
   1369   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1370     0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, %{I:#0%}"},
   1371   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1372     0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, %{I:#0%}"},
   1373   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1374     0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, %{I:#0%}"},
   1375   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1376     0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, %{I:#0%}"},
   1377   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1378     0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
   1379   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1380     0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
   1381   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1382     0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
   1383   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1384     0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
   1385   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1386     0xf3bb0600, 0xffbf0e10,
   1387     "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
   1388   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1389     0xf3b70600, 0xffbf0e10,
   1390     "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"},
   1391 
   1392   /* Three registers of the same length.  */
   1393   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1394     0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1395   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1396     0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1397   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1398     0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1399   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1400     0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1401   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1402     0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1403   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1404     0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1405   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1406     0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"},
   1407   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1408     0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1409   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1410     0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1411   {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8),
   1412     0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1413   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1414     0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1415   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1416     0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1417   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1418     0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1419   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1420     0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1421   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1422     0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1423   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1424     0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1425   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1426     0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1427   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1428     0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1429   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1430     0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1431   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1432     0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1433   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1434     0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1435   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1436     0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1437   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1438     0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1439   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1440     0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1441   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1442     0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1443   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1444     0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1445   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1446     0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1447   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1448     0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1449   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1450     0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1451   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1452     0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1453   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1454     0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1455   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1456     0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1457   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1458     0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1459   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1460     0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1461   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1462     0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1463   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1464     0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1465   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1466     0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1467   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1468     0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1469   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1470     0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1471   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1472     0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1473   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1474     0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1475   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1476     0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1477   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1478     0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1479   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1480     0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1481   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1482     0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1483   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1484     0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1485   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1486     0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1487   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1488     0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1489   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1490     0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1491   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1492     0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1493   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1494     0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1495   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1496     0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1497   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1498     0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1499   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1500     0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1501   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1502     0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1503   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1504     0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1505   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1506     0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1507   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1508     0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1509   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1510     0xf2000b00, 0xff800f10,
   1511     "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1512   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1513     0xf2000b10, 0xff800f10,
   1514     "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1515   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1516     0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1517   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1518     0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1519   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1520     0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1521   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1522     0xf3000b00, 0xff800f10,
   1523     "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1524   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1525     0xf2000000, 0xfe800f10,
   1526     "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1527   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1528     0xf2000010, 0xfe800f10,
   1529     "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1530   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1531     0xf2000100, 0xfe800f10,
   1532     "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1533   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1534     0xf2000200, 0xfe800f10,
   1535     "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1536   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1537     0xf2000210, 0xfe800f10,
   1538     "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1539   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1540     0xf2000300, 0xfe800f10,
   1541     "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1542   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1543     0xf2000310, 0xfe800f10,
   1544     "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1545   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1546     0xf2000400, 0xfe800f10,
   1547     "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1548   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1549     0xf2000410, 0xfe800f10,
   1550     "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1551   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1552     0xf2000500, 0xfe800f10,
   1553     "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1554   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1555     0xf2000510, 0xfe800f10,
   1556     "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
   1557   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1558     0xf2000600, 0xfe800f10,
   1559     "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1560   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1561     0xf2000610, 0xfe800f10,
   1562     "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1563   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1564     0xf2000700, 0xfe800f10,
   1565     "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1566   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1567     0xf2000710, 0xfe800f10,
   1568     "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1569   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1570     0xf2000910, 0xfe800f10,
   1571     "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1572   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1573     0xf2000a00, 0xfe800f10,
   1574     "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1575   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1576     0xf2000a10, 0xfe800f10,
   1577     "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1578   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1579     0xf3000b10, 0xff800f10,
   1580     "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1581   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1582     0xf3000c10, 0xff800f10,
   1583     "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
   1584 
   1585   /* One register and an immediate value.  */
   1586   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1587     0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
   1588   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1589     0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
   1590   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1591     0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
   1592   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1593     0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
   1594   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1595     0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
   1596   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1597     0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
   1598   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1599     0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
   1600   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1601     0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
   1602   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1603     0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
   1604   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1605     0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
   1606   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1607     0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
   1608   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1609     0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
   1610   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1611     0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
   1612 
   1613   /* Two registers and a shift amount.  */
   1614   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1615     0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1616   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1617     0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1618   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1619     0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1620   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1621     0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1622   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1623     0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1624   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1625     0xf2880950, 0xfeb80fd0,
   1626     "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, %{I:#%16-18e%}"},
   1627   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1628     0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, %{I:#%16-18d%}"},
   1629   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1630     0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1631   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1632     0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1633   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1634     0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18d%}"},
   1635   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1636     0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, %{I:#%16-18e%}"},
   1637   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1638     0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, %{I:#%16-18d%}"},
   1639   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1640     0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, %{I:#%16-18d%}"},
   1641   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1642     0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1643   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1644     0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1645   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1646     0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1647   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1648     0xf2900950, 0xfeb00fd0,
   1649     "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, %{I:#%16-19e%}"},
   1650   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1651     0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, %{I:#%16-19d%}"},
   1652   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1653     0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18e%}"},
   1654   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1655     0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18e%}"},
   1656   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1657     0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18e%}"},
   1658   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1659     0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18e%}"},
   1660   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1661     0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, %{I:#%16-18d%}"},
   1662   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1663     0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1664   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1665     0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1666   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1667     0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19d%}"},
   1668   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1669     0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, %{I:#%16-19e%}"},
   1670   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1671     0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, %{I:#%16-19d%}"},
   1672   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1673     0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, %{I:#%16-19d%}"},
   1674   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1675     0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, %{I:#%16-20d%}"},
   1676   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1677     0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19e%}"},
   1678   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1679     0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19e%}"},
   1680   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1681     0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19e%}"},
   1682   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1683     0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19e%}"},
   1684   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1685     0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, %{I:#%16-19d%}"},
   1686   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1687     0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1688   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1689     0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1690   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1691     0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1692   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1693     0xf2a00950, 0xfea00fd0,
   1694     "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, %{I:#%16-20e%}"},
   1695   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1696     0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20d%}"},
   1697   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1698     0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1699   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1700     0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, %{I:#%16-20d%}"},
   1701   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1702     0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, %{I:#%16-20d%}"},
   1703   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1704     0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1705   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1706     0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1707   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1708     0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1709   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1710     0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1711   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1712     0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, %{I:#%16-20d%}"},
   1713   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1714     0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21d%}"},
   1715   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1716     0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, %{I:#%16-21e%}"},
   1717   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1718     0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, %{I:#%16-21d%}"},
   1719   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1720     0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, %{I:#%16-21d%}"},
   1721   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1722     0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21e%}"},
   1723   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1724     0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21e%}"},
   1725   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1726     0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21e%}"},
   1727   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1728     0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21e%}"},
   1729   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1730     0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, %{I:#%16-21d%}"},
   1731   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1732     0xf2a00e10, 0xfea00e90,
   1733     "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1734   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
   1735     0xf2a00c10, 0xfea00e90,
   1736     "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, %{I:#%16-20e%}"},
   1737 
   1738   /* Three registers of different lengths.  */
   1739   {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8),
   1740     0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1741   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1742     0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1743   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1744     0xf2800400, 0xff800f50,
   1745     "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1746   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1747     0xf2800600, 0xff800f50,
   1748     "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1749   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1750     0xf2800900, 0xff800f50,
   1751     "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1752   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1753     0xf2800b00, 0xff800f50,
   1754     "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1755   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1756     0xf2800d00, 0xff800f50,
   1757     "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1758   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1759     0xf3800400, 0xff800f50,
   1760     "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1761   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1762     0xf3800600, 0xff800f50,
   1763     "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
   1764   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1765     0xf2800000, 0xfe800f50,
   1766     "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1767   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1768     0xf2800100, 0xfe800f50,
   1769     "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
   1770   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1771     0xf2800200, 0xfe800f50,
   1772     "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1773   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1774     0xf2800300, 0xfe800f50,
   1775     "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
   1776   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1777     0xf2800500, 0xfe800f50,
   1778     "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1779   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1780     0xf2800700, 0xfe800f50,
   1781     "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1782   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1783     0xf2800800, 0xfe800f50,
   1784     "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1785   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1786     0xf2800a00, 0xfe800f50,
   1787     "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1788   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1789     0xf2800c00, 0xfe800f50,
   1790     "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
   1791 
   1792   /* Two registers and a scalar.  */
   1793   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1794     0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1795   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1796     0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
   1797   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1798     0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1799   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1800     0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1801   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1802     0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1803   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1804     0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1805   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1806     0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1807   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1808     0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1809   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1810     0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1811   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1812     0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
   1813   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1814     0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"},
   1815   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1816     0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1817   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1818     0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1819   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1820     0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1821   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1822     0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1823   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1824     0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1825   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1826     0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1827   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1828     0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1829   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1830     0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1831   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1832     0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1833   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1834     0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1835   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1836     0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
   1837   {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST),
   1838     0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"},
   1839   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1840     0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1841   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1842     0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1843   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1844     0xf2800240, 0xfe800f50,
   1845     "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1846   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1847     0xf2800640, 0xfe800f50,
   1848     "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1849   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1850     0xf2800a40, 0xfe800f50,
   1851     "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
   1852   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1853     0xf2800e40, 0xff800f50,
   1854    "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1855   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1856     0xf2800f40, 0xff800f50,
   1857    "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
   1858   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1859     0xf3800e40, 0xff800f50,
   1860    "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
   1861   {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA),
   1862     0xf3800f40, 0xff800f50,
   1863    "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"
   1864   },
   1865 
   1866   /* Element and structure load/store.  */
   1867   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1868     0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
   1869   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1870     0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
   1871   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1872     0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
   1873   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1874     0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
   1875   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1876     0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
   1877   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1878     0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1879   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1880     0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1881   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1882     0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
   1883   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1884     0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
   1885   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1886     0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1887   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1888     0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1889   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1890     0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1891   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1892     0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
   1893   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1894     0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
   1895   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1896     0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
   1897   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1898     0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
   1899   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1900     0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
   1901   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1902     0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
   1903   {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1),
   1904     0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
   1905 
   1906   {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0}
   1907 };
   1908 
   1909 /* mve opcode table.  */
   1910 
   1911 /* print_insn_mve recognizes the following format control codes:
   1912 
   1913    %%			%
   1914 
   1915    %a			print '+' or '-' or imm offset in vldr[bhwd] and
   1916 			vstr[bhwd]
   1917    %c			print condition code
   1918    %d			print addr mode of MVE vldr[bhw] and vstr[bhw]
   1919    %u			print 'U' (unsigned) or 'S' for various mve instructions
   1920    %i			print MVE predicate(s) for vpt and vpst
   1921    %j			print a 5-bit immediate from hw2[14:12,7:6]
   1922    %k			print 48 if the 7th position bit is set else print 64.
   1923    %m			print rounding mode for vcvt and vrint
   1924    %n			print vector comparison code for predicated instruction
   1925    %s			print size for various vcvt instructions
   1926    %v			print vector predicate for instruction in predicated
   1927 			block
   1928    %o			print offset scaled for vldr[hwd] and vstr[hwd]
   1929    %w			print writeback mode for MVE v{st,ld}[24]
   1930    %B			print v{st,ld}[24] any one operands
   1931    %E			print vmov, vmvn, vorr, vbic encoded constant
   1932    %N			print generic index for vmov
   1933    %T			print bottom ('b') or top ('t') of source register
   1934    %X			print exchange field in vmla* instructions
   1935 
   1936    %<bitfield>r		print as an ARM register
   1937    %<bitfield>d		print the bitfield in decimal
   1938    %<bitfield>A		print accumulate or not
   1939    %<bitfield>c		print bitfield as a condition code
   1940    %<bitfield>C		print bitfield as an inverted condition code
   1941    %<bitfield>Q		print as a MVE Q register
   1942    %<bitfield>F		print as a MVE S register
   1943    %<bitfield>Z		as %<>r but r15 is ZR instead of PC and r13 is
   1944 			UNPREDICTABLE
   1945 
   1946    %<bitfield>S		as %<>r but r15 or r13 is UNPREDICTABLE
   1947    %<bitfield>s		print size for vector predicate & non VMOV instructions
   1948    %<bitfield>I		print carry flag or not
   1949    %<bitfield>i		print immediate for vstr/vldr reg +/- imm
   1950    %<bitfield>h		print high half of 64-bit destination reg
   1951    %<bitfield>k		print immediate for vector conversion instruction
   1952    %<bitfield>l		print low half of 64-bit destination reg
   1953    %<bitfield>o		print rotate value for vcmul
   1954    %<bitfield>u		print immediate value for vddup/vdwdup
   1955    %<bitfield>x		print the bitfield in hex.
   1956   */
   1957 
   1958 static const struct mopcode32 mve_opcodes[] =
   1959 {
   1960   /* MVE.  */
   1961 
   1962   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   1963    MVE_VPST,
   1964    0xfe310f4d, 0xffbf1fff,
   1965    "vpst%i"
   1966   },
   1967 
   1968   /* Floating point VPT T1.  */
   1969   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   1970    MVE_VPT_FP_T1,
   1971    0xee310f00, 0xefb10f50,
   1972    "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"},
   1973   /* Floating point VPT T2.  */
   1974   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   1975    MVE_VPT_FP_T2,
   1976    0xee310f40, 0xefb10f50,
   1977    "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"},
   1978 
   1979   /* Vector VPT T1.  */
   1980   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   1981    MVE_VPT_VEC_T1,
   1982    0xfe010f00, 0xff811f51,
   1983    "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
   1984   /* Vector VPT T2.  */
   1985   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   1986    MVE_VPT_VEC_T2,
   1987    0xfe010f01, 0xff811f51,
   1988    "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
   1989   /* Vector VPT T3.  */
   1990   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   1991    MVE_VPT_VEC_T3,
   1992    0xfe011f00, 0xff811f50,
   1993    "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
   1994   /* Vector VPT T4.  */
   1995   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   1996    MVE_VPT_VEC_T4,
   1997    0xfe010f40, 0xff811f70,
   1998    "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"},
   1999   /* Vector VPT T5.  */
   2000   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2001    MVE_VPT_VEC_T5,
   2002    0xfe010f60, 0xff811f70,
   2003    "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"},
   2004   /* Vector VPT T6.  */
   2005   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2006    MVE_VPT_VEC_T6,
   2007    0xfe011f40, 0xff811f50,
   2008    "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"},
   2009 
   2010   /* Vector VBIC immediate.  */
   2011   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2012    MVE_VBIC_IMM,
   2013    0xef800070, 0xefb81070,
   2014    "vbic%v.i%8-11s\t%13-15,22Q, %E"},
   2015 
   2016   /* Vector VBIC register.  */
   2017   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2018    MVE_VBIC_REG,
   2019    0xef100150, 0xffb11f51,
   2020    "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2021 
   2022   /* Vector VABAV.  */
   2023   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2024    MVE_VABAV,
   2025    0xee800f01, 0xefc10f51,
   2026    "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"},
   2027 
   2028   /* Vector VABD floating point.  */
   2029   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2030    MVE_VABD_FP,
   2031    0xff200d40, 0xffa11f51,
   2032    "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2033 
   2034   /* Vector VABD.  */
   2035   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2036    MVE_VABD_VEC,
   2037    0xef000740, 0xef811f51,
   2038    "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2039 
   2040   /* Vector VABS floating point.  */
   2041   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2042    MVE_VABS_FP,
   2043    0xFFB10740, 0xFFB31FD1,
   2044    "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
   2045   /* Vector VABS.  */
   2046   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2047    MVE_VABS_VEC,
   2048    0xffb10340, 0xffb31fd1,
   2049    "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2050 
   2051   /* Vector VADD floating point T1.  */
   2052   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2053    MVE_VADD_FP_T1,
   2054    0xef000d40, 0xffa11f51,
   2055    "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2056   /* Vector VADD floating point T2.  */
   2057   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2058    MVE_VADD_FP_T2,
   2059    0xee300f40, 0xefb11f70,
   2060    "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2061   /* Vector VADD T1.  */
   2062   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2063    MVE_VADD_VEC_T1,
   2064    0xef000840, 0xff811f51,
   2065    "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2066   /* Vector VADD T2.  */
   2067   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2068    MVE_VADD_VEC_T2,
   2069    0xee010f40, 0xff811f70,
   2070    "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2071 
   2072   /* Vector VADDLV.  */
   2073   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2074    MVE_VADDLV,
   2075    0xee890f00, 0xef8f1fd1,
   2076    "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"},
   2077 
   2078   /* Vector VADDV.  */
   2079   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2080    MVE_VADDV,
   2081    0xeef10f00, 0xeff31fd1,
   2082    "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"},
   2083 
   2084   /* Vector VADC.  */
   2085   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2086    MVE_VADC,
   2087    0xee300f00, 0xffb10f51,
   2088    "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2089 
   2090   /* Vector VAND.  */
   2091   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2092    MVE_VAND,
   2093    0xef000150, 0xffb11f51,
   2094    "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2095 
   2096   /* Vector VBRSR register.  */
   2097   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2098    MVE_VBRSR,
   2099    0xfe011e60, 0xff811f70,
   2100    "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2101 
   2102   /* Vector VCADD floating point.  */
   2103   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2104    MVE_VCADD_FP,
   2105    0xfc800840, 0xfea11f51,
   2106    "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, %{I:#%24o%}"},
   2107 
   2108   /* Vector VCADD.  */
   2109   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2110    MVE_VCADD_VEC,
   2111    0xfe000f00, 0xff810f51,
   2112    "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, %{I:#%12o%}"},
   2113 
   2114   /* Vector VCLS.  */
   2115   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2116    MVE_VCLS,
   2117    0xffb00440, 0xffb31fd1,
   2118    "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2119 
   2120   /* Vector VCLZ.  */
   2121   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2122    MVE_VCLZ,
   2123    0xffb004c0, 0xffb31fd1,
   2124    "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
   2125 
   2126   /* Vector VCMLA.  */
   2127   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2128    MVE_VCMLA_FP,
   2129    0xfc200840, 0xfe211f51,
   2130    "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, %{I:#%23-24o%}"},
   2131 
   2132   /* Vector VCMP floating point T1.  */
   2133   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2134    MVE_VCMP_FP_T1,
   2135    0xee310f00, 0xeff1ef50,
   2136    "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"},
   2137 
   2138   /* Vector VCMP floating point T2.  */
   2139   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2140    MVE_VCMP_FP_T2,
   2141    0xee310f40, 0xeff1ef50,
   2142    "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"},
   2143 
   2144   /* Vector VCMP T1.  */
   2145   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2146    MVE_VCMP_VEC_T1,
   2147    0xfe010f00, 0xffc1ff51,
   2148    "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"},
   2149   /* Vector VCMP T2.  */
   2150   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2151    MVE_VCMP_VEC_T2,
   2152    0xfe010f01, 0xffc1ff51,
   2153    "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"},
   2154   /* Vector VCMP T3.  */
   2155   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2156    MVE_VCMP_VEC_T3,
   2157    0xfe011f00, 0xffc1ff50,
   2158    "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"},
   2159   /* Vector VCMP T4.  */
   2160   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2161    MVE_VCMP_VEC_T4,
   2162    0xfe010f40, 0xffc1ff70,
   2163    "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"},
   2164   /* Vector VCMP T5.  */
   2165   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2166    MVE_VCMP_VEC_T5,
   2167    0xfe010f60, 0xffc1ff70,
   2168    "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"},
   2169   /* Vector VCMP T6.  */
   2170   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2171    MVE_VCMP_VEC_T6,
   2172    0xfe011f40, 0xffc1ff50,
   2173    "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"},
   2174 
   2175   /* Vector VDUP.  */
   2176   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2177    MVE_VDUP,
   2178    0xeea00b10, 0xffb10f5f,
   2179    "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
   2180 
   2181   /* Vector VEOR.  */
   2182   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2183    MVE_VEOR,
   2184    0xff000150, 0xffd11f51,
   2185    "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2186 
   2187   /* Vector VFMA, vector * scalar.  */
   2188   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2189    MVE_VFMA_FP_SCALAR,
   2190    0xee310e40, 0xefb11f70,
   2191    "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2192 
   2193   /* Vector VFMA floating point.  */
   2194   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2195    MVE_VFMA_FP,
   2196    0xef000c50, 0xffa11f51,
   2197    "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2198 
   2199   /* Vector VFMS floating point.  */
   2200   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2201    MVE_VFMS_FP,
   2202    0xef200c50, 0xffa11f51,
   2203    "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2204 
   2205   /* Vector VFMAS, vector * scalar.  */
   2206   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2207    MVE_VFMAS_FP_SCALAR,
   2208    0xee311e40, 0xefb11f70,
   2209    "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2210 
   2211   /* Vector VHADD T1.  */
   2212   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2213    MVE_VHADD_T1,
   2214    0xef000040, 0xef811f51,
   2215    "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2216 
   2217   /* Vector VHADD T2.  */
   2218   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2219    MVE_VHADD_T2,
   2220    0xee000f40, 0xef811f70,
   2221    "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2222 
   2223   /* Vector VHSUB T1.  */
   2224   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2225    MVE_VHSUB_T1,
   2226    0xef000240, 0xef811f51,
   2227    "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2228 
   2229   /* Vector VHSUB T2.  */
   2230   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2231    MVE_VHSUB_T2,
   2232    0xee001f40, 0xef811f70,
   2233    "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2234 
   2235   /* Vector VCMUL.  */
   2236   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2237    MVE_VCMUL_FP,
   2238    0xee300e00, 0xefb10f50,
   2239    "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, %{I:#%0,12o%}"},
   2240 
   2241    /* Vector VCTP.  */
   2242   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2243    MVE_VCTP,
   2244    0xf000e801, 0xffc0ffff,
   2245    "vctp%v.%20-21s\t%16-19r"},
   2246 
   2247   /* Vector VDUP.  */
   2248   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2249    MVE_VDUP,
   2250    0xeea00b10, 0xffb10f5f,
   2251    "vdup%v.%5,22s\t%17-19,7Q, %12-15r"},
   2252 
   2253   /* Vector VRHADD.  */
   2254   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2255    MVE_VRHADD,
   2256    0xef000140, 0xef811f51,
   2257    "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2258 
   2259   /* Vector VCVT.  */
   2260   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2261    MVE_VCVT_FP_FIX_VEC,
   2262    0xef800c50, 0xef801cd1,
   2263    "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, %{I:#%16-21k%}"},
   2264 
   2265   /* Vector VCVT.  */
   2266   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2267    MVE_VCVT_BETWEEN_FP_INT,
   2268    0xffb30640, 0xffb31e51,
   2269    "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"},
   2270 
   2271   /* Vector VCVT between single and half-precision float, bottom half.  */
   2272   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2273    MVE_VCVT_FP_HALF_FP,
   2274    0xee3f0e01, 0xefbf1fd1,
   2275    "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"},
   2276 
   2277   /* Vector VCVT between single and half-precision float, top half.  */
   2278   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2279    MVE_VCVT_FP_HALF_FP,
   2280    0xee3f1e01, 0xefbf1fd1,
   2281    "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"},
   2282 
   2283   /* Vector VCVT.  */
   2284   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2285    MVE_VCVT_FROM_FP_TO_INT,
   2286    0xffb30040, 0xffb31c51,
   2287    "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"},
   2288 
   2289   /* Vector VDDUP.  */
   2290   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2291    MVE_VDDUP,
   2292    0xee011f6e, 0xff811f7e,
   2293    "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, %{I:#%0,7u%}"},
   2294 
   2295   /* Vector VDWDUP.  */
   2296   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2297    MVE_VDWDUP,
   2298    0xee011f60, 0xff811f70,
   2299    "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, %{I:#%0,7u%}"},
   2300 
   2301   /* Vector VHCADD.  */
   2302   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2303    MVE_VHCADD,
   2304    0xee000f00, 0xff810f51,
   2305    "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, %{I:#%12o%}"},
   2306 
   2307   /* Vector VIWDUP.  */
   2308   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2309    MVE_VIWDUP,
   2310    0xee010f60, 0xff811f70,
   2311    "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, %{I:#%0,7u%}"},
   2312 
   2313   /* Vector VIDUP.  */
   2314   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2315    MVE_VIDUP,
   2316    0xee010f6e, 0xff811f7e,
   2317    "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, %{I:#%0,7u%}"},
   2318 
   2319   /* Vector VLD2.  */
   2320   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2321    MVE_VLD2,
   2322    0xfc901e00, 0xff901e5f,
   2323    "vld2%5d.%7-8s\t%B, [%16-19r]%w"},
   2324 
   2325   /* Vector VLD4.  */
   2326   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2327    MVE_VLD4,
   2328    0xfc901e01, 0xff901e1f,
   2329    "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"},
   2330 
   2331   /* Vector VLDRB gather load.  */
   2332   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2333    MVE_VLDRB_GATHER_T1,
   2334    0xec900e00, 0xefb01e50,
   2335    "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
   2336 
   2337   /* Vector VLDRH gather load.  */
   2338   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2339    MVE_VLDRH_GATHER_T2,
   2340    0xec900e10, 0xefb01e50,
   2341    "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   2342 
   2343   /* Vector VLDRW gather load.  */
   2344   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2345    MVE_VLDRW_GATHER_T3,
   2346    0xfc900f40, 0xffb01fd0,
   2347    "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   2348 
   2349   /* Vector VLDRD gather load.  */
   2350   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2351    MVE_VLDRD_GATHER_T4,
   2352    0xec900fd0, 0xefb01fd0,
   2353    "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   2354 
   2355   /* Vector VLDRW gather load.  */
   2356   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2357    MVE_VLDRW_GATHER_T5,
   2358    0xfd101e00, 0xff111f00,
   2359    "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, %{I:#%a%0-6i%}]%w"},
   2360 
   2361   /* Vector VLDRD gather load, variant T6.  */
   2362   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2363    MVE_VLDRD_GATHER_T6,
   2364    0xfd101f00, 0xff111f00,
   2365    "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, %{I:#%a%0-6i%}]%w"},
   2366 
   2367   /* Vector VLDRB.  */
   2368   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2369    MVE_VLDRB_T1,
   2370    0xec100e00, 0xee581e00,
   2371    "vldrb%v.%u%7-8s\t%13-15Q, %d"},
   2372 
   2373   /* Vector VLDRH.  */
   2374   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2375    MVE_VLDRH_T2,
   2376    0xec180e00, 0xee581e00,
   2377    "vldrh%v.%u%7-8s\t%13-15Q, %d"},
   2378 
   2379   /* Vector VLDRB unsigned, variant T5.  */
   2380   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2381    MVE_VLDRB_T5,
   2382    0xec101e00, 0xfe101f80,
   2383    "vldrb%v.u8\t%13-15,22Q, %d"},
   2384 
   2385   /* Vector VLDRH unsigned, variant T6.  */
   2386   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2387    MVE_VLDRH_T6,
   2388    0xec101e80, 0xfe101f80,
   2389    "vldrh%v.u16\t%13-15,22Q, %d"},
   2390 
   2391   /* Vector VLDRW unsigned, variant T7.  */
   2392   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2393    MVE_VLDRW_T7,
   2394    0xec101f00, 0xfe101f80,
   2395    "vldrw%v.u32\t%13-15,22Q, %d"},
   2396 
   2397   /* Vector VMAX.  */
   2398   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2399    MVE_VMAX,
   2400    0xef000640, 0xef811f51,
   2401    "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2402 
   2403   /* Vector VMAXA.  */
   2404   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2405    MVE_VMAXA,
   2406    0xee330e81, 0xffb31fd1,
   2407    "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2408 
   2409   /* Vector VMAXNM floating point.  */
   2410   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2411    MVE_VMAXNM_FP,
   2412    0xff000f50, 0xffa11f51,
   2413    "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2414 
   2415   /* Vector VMAXNMA floating point.  */
   2416   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2417    MVE_VMAXNMA_FP,
   2418    0xee3f0e81, 0xefbf1fd1,
   2419    "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
   2420 
   2421   /* Vector VMAXNMV floating point.  */
   2422   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2423    MVE_VMAXNMV_FP,
   2424    0xeeee0f00, 0xefff0fd1,
   2425    "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"},
   2426 
   2427   /* Vector VMAXNMAV floating point.  */
   2428   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2429    MVE_VMAXNMAV_FP,
   2430    0xeeec0f00, 0xefff0fd1,
   2431    "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"},
   2432 
   2433   /* Vector VMAXV.  */
   2434   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2435    MVE_VMAXV,
   2436    0xeee20f00, 0xeff30fd1,
   2437    "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
   2438 
   2439   /* Vector VMAXAV.  */
   2440   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2441    MVE_VMAXAV,
   2442    0xeee00f00, 0xfff30fd1,
   2443    "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"},
   2444 
   2445   /* Vector VMIN.  */
   2446   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2447    MVE_VMIN,
   2448    0xef000650, 0xef811f51,
   2449    "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2450 
   2451   /* Vector VMINA.  */
   2452   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2453    MVE_VMINA,
   2454    0xee331e81, 0xffb31fd1,
   2455    "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2456 
   2457   /* Vector VMINNM floating point.  */
   2458   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2459    MVE_VMINNM_FP,
   2460    0xff200f50, 0xffa11f51,
   2461    "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2462 
   2463   /* Vector VMINNMA floating point.  */
   2464   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2465    MVE_VMINNMA_FP,
   2466    0xee3f1e81, 0xefbf1fd1,
   2467    "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"},
   2468 
   2469   /* Vector VMINNMV floating point.  */
   2470   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2471    MVE_VMINNMV_FP,
   2472    0xeeee0f80, 0xefff0fd1,
   2473    "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"},
   2474 
   2475   /* Vector VMINNMAV floating point.  */
   2476   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2477    MVE_VMINNMAV_FP,
   2478    0xeeec0f80, 0xefff0fd1,
   2479    "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"},
   2480 
   2481   /* Vector VMINV.  */
   2482   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2483    MVE_VMINV,
   2484    0xeee20f80, 0xeff30fd1,
   2485    "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"},
   2486 
   2487   /* Vector VMINAV.  */
   2488   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2489    MVE_VMINAV,
   2490    0xeee00f80, 0xfff30fd1,
   2491    "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"},
   2492 
   2493   /* Vector VMLA.  */
   2494   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2495    MVE_VMLA,
   2496    0xee010e40, 0xef811f70,
   2497    "vmla%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2498 
   2499   /* Vector VMLALDAV.  Note must appear before VMLADAV due to instruction
   2500      opcode aliasing.  */
   2501   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2502    MVE_VMLALDAV,
   2503    0xee801e00, 0xef801f51,
   2504    "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   2505 
   2506   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2507    MVE_VMLALDAV,
   2508    0xee800e00, 0xef801f51,
   2509    "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   2510 
   2511   /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0.  */
   2512   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2513    MVE_VMLADAV_T1,
   2514    0xeef00e00, 0xeff01f51,
   2515    "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
   2516 
   2517   /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0.  */
   2518   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2519    MVE_VMLADAV_T2,
   2520    0xeef00f00, 0xeff11f51,
   2521    "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
   2522 
   2523   /* Vector VMLADAV T1 variant.  */
   2524   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2525    MVE_VMLADAV_T1,
   2526    0xeef01e00, 0xeff01f51,
   2527    "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"},
   2528 
   2529   /* Vector VMLADAV T2 variant.  */
   2530   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2531    MVE_VMLADAV_T2,
   2532    0xeef01f00, 0xeff11f51,
   2533    "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"},
   2534 
   2535   /* Vector VMLAS.  */
   2536   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2537    MVE_VMLAS,
   2538    0xee011e40, 0xef811f70,
   2539    "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2540 
   2541   /* Vector VRMLSLDAVH.  Note must appear before VMLSDAV due to instruction
   2542      opcode aliasing.  */
   2543   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2544    MVE_VRMLSLDAVH,
   2545    0xfe800e01, 0xff810f51,
   2546    "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   2547 
   2548   /* Vector VMLSLDAV.  Note must appear before VMLSDAV due to instruction
   2549      opcdoe aliasing.  */
   2550   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2551    MVE_VMLSLDAV,
   2552    0xee800e01, 0xff800f51,
   2553    "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   2554 
   2555   /* Vector VMLSDAV T1 Variant.  */
   2556   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2557    MVE_VMLSDAV_T1,
   2558    0xeef00e01, 0xfff00f51,
   2559    "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"},
   2560 
   2561   /* Vector VMLSDAV T2 Variant.  */
   2562   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2563    MVE_VMLSDAV_T2,
   2564    0xfef00e01, 0xfff10f51,
   2565    "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"},
   2566 
   2567   /* Vector VMOV between gpr and half precision register, op == 0.  */
   2568   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2569    MVE_VMOV_HFP_TO_GP,
   2570    0xee000910, 0xfff00f7f,
   2571    "vmov.f16\t%7,16-19F, %12-15r"},
   2572 
   2573   /* Vector VMOV between gpr and half precision register, op == 1.  */
   2574   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2575    MVE_VMOV_HFP_TO_GP,
   2576    0xee100910, 0xfff00f7f,
   2577    "vmov.f16\t%12-15r, %7,16-19F"},
   2578 
   2579   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2580    MVE_VMOV_GP_TO_VEC_LANE,
   2581    0xee000b10, 0xff900f1f,
   2582    "vmov%c.%5-6,21-22s\t%{R:%17-19,7Q[%N]%}, %12-15r"},
   2583 
   2584   /* Vector VORR immediate to vector.
   2585      NOTE: MVE_VORR_IMM must appear in the table
   2586      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2587   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2588    MVE_VORR_IMM,
   2589    0xef800050, 0xefb810f0,
   2590    "vorr%v.i%8-11s\t%13-15,22Q, %E"},
   2591 
   2592   /* Vector VQSHL T2 Variant.
   2593      NOTE: MVE_VQSHL_T2 must appear in the table before
   2594      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2595   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2596    MVE_VQSHL_T2,
   2597    0xef800750, 0xef801fd1,
   2598    "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2599 
   2600   /* Vector VQSHLU T3 Variant
   2601      NOTE: MVE_VQSHL_T2 must appear in the table before
   2602      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2603 
   2604   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2605    MVE_VQSHLU_T3,
   2606    0xff800650, 0xff801fd1,
   2607    "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2608 
   2609   /* Vector VRSHR
   2610      NOTE: MVE_VRSHR must appear in the table before
   2611      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2612   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2613    MVE_VRSHR,
   2614    0xef800250, 0xef801fd1,
   2615    "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2616 
   2617   /* Vector VSHL.
   2618      NOTE: MVE_VSHL must appear in the table before
   2619      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2620   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2621    MVE_VSHL_T1,
   2622    0xef800550, 0xff801fd1,
   2623    "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2624 
   2625   /* Vector VSHR
   2626      NOTE: MVE_VSHR must appear in the table before
   2627      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2628   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2629    MVE_VSHR,
   2630    0xef800050, 0xef801fd1,
   2631    "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2632 
   2633   /* Vector VSLI
   2634      NOTE: MVE_VSLI must appear in the table before
   2635      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2636   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2637    MVE_VSLI,
   2638    0xff800550, 0xff801fd1,
   2639    "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2640 
   2641   /* Vector VSRI
   2642      NOTE: MVE_VSRI must appear in the table before
   2643      before MVE_VMOV_IMM_TO_VEC due to opcode aliasing.  */
   2644   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2645    MVE_VSRI,
   2646    0xff800450, 0xff801fd1,
   2647    "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2648 
   2649   /* Vector VMOV immediate to vector,
   2650      undefinded for cmode == 1111 */
   2651   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2652    MVE_VMVN_IMM, 0xef800f70, 0xefb81ff0, UNDEFINED_INSTRUCTION},
   2653 
   2654   /* Vector VMOV immediate to vector,
   2655      cmode == 1101 */
   2656   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2657    MVE_VMOV_IMM_TO_VEC, 0xef800d50, 0xefb81fd0,
   2658    "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
   2659 
   2660   /* Vector VMOV immediate to vector.  */
   2661   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2662    MVE_VMOV_IMM_TO_VEC,
   2663    0xef800050, 0xefb810d0,
   2664    "vmov%v.%5,8-11s\t%13-15,22Q, %E"},
   2665 
   2666   /* Vector VMOV two 32-bit lanes to two gprs, idx = 0.  */
   2667   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2668    MVE_VMOV2_VEC_LANE_TO_GP,
   2669    0xec000f00, 0xffb01ff0,
   2670    "vmov%c\t%0-3r, %16-19r, %{R:%13-15,22Q[2]%}, %{R:%13-15,22Q[0]%}"},
   2671 
   2672   /* Vector VMOV two 32-bit lanes to two gprs, idx = 1.  */
   2673   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2674    MVE_VMOV2_VEC_LANE_TO_GP,
   2675    0xec000f10, 0xffb01ff0,
   2676    "vmov%c\t%0-3r, %16-19r, %{R:%13-15,22Q[3]%}, %{R:%13-15,22Q[1]%}"},
   2677 
   2678   /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0.  */
   2679   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2680    MVE_VMOV2_GP_TO_VEC_LANE,
   2681    0xec100f00, 0xffb01ff0,
   2682    "vmov%c\t%{R:%13-15,22Q[2]%}, %{R:%13-15,22Q[0]%}, %0-3r, %16-19r"},
   2683 
   2684   /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1.  */
   2685   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2686    MVE_VMOV2_GP_TO_VEC_LANE,
   2687    0xec100f10, 0xffb01ff0,
   2688    "vmov%c\t%{R:%13-15,22Q[3]%}, %{R:%13-15,22Q[1]%}, %0-3r, %16-19r"},
   2689 
   2690   /* Vector VMOV Vector lane to gpr.  */
   2691   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2692    MVE_VMOV_VEC_LANE_TO_GP,
   2693    0xee100b10, 0xff100f1f,
   2694    "vmov%c.%u%5-6,21-22s\t%12-15r, %{R:%17-19,7Q[%N]%}"},
   2695 
   2696   /* Vector VSHLL T1 Variant.  Note: VSHLL T1 must appear before MVE_VMOVL due
   2697      to instruction opcode aliasing.  */
   2698   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2699    MVE_VSHLL_T1,
   2700    0xeea00f40, 0xefa00fd1,
   2701    "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2702 
   2703   /* Vector VMOVL long.  */
   2704   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2705    MVE_VMOVL,
   2706    0xeea00f40, 0xefa70fd1,
   2707    "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
   2708 
   2709   /* Vector VMOV and narrow.  */
   2710   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2711    MVE_VMOVN,
   2712    0xfe310e81, 0xffb30fd1,
   2713    "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
   2714 
   2715   /* Floating point move extract.  */
   2716   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2717    MVE_VMOVX,
   2718    0xfeb00a40, 0xffbf0fd0,
   2719    "vmovx.f16\t%22,12-15F, %5,0-3F"},
   2720 
   2721   /* Vector VMUL floating-point T1 variant.  */
   2722   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2723    MVE_VMUL_FP_T1,
   2724    0xff000d50, 0xffa11f51,
   2725    "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2726 
   2727   /* Vector VMUL floating-point T2 variant.  */
   2728   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2729    MVE_VMUL_FP_T2,
   2730    0xee310e60, 0xefb11f70,
   2731    "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2732 
   2733   /* Vector VMUL T1 variant.  */
   2734   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2735    MVE_VMUL_VEC_T1,
   2736    0xef000950, 0xff811f51,
   2737    "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2738 
   2739   /* Vector VMUL T2 variant.  */
   2740   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2741    MVE_VMUL_VEC_T2,
   2742    0xee011e60, 0xff811f70,
   2743    "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2744 
   2745   /* Vector VMULH.  */
   2746   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2747    MVE_VMULH,
   2748    0xee010e01, 0xef811f51,
   2749    "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2750 
   2751   /* Vector VRMULH.  */
   2752   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2753    MVE_VRMULH,
   2754    0xee011e01, 0xef811f51,
   2755    "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2756 
   2757   /* Vector VMULL integer.  */
   2758   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2759    MVE_VMULL_INT,
   2760    0xee010e00, 0xef810f51,
   2761    "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2762 
   2763   /* Vector VMULL polynomial.  */
   2764   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2765    MVE_VMULL_POLY,
   2766    0xee310e00, 0xefb10f51,
   2767    "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2768 
   2769   /* Vector VMVN immediate to vector.  */
   2770   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2771    MVE_VMVN_IMM,
   2772    0xef800070, 0xefb810f0,
   2773    "vmvn%v.i%8-11s\t%13-15,22Q, %E"},
   2774 
   2775   /* Vector VMVN register.  */
   2776   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2777    MVE_VMVN_REG,
   2778    0xffb005c0, 0xffbf1fd1,
   2779    "vmvn%v\t%13-15,22Q, %1-3,5Q"},
   2780 
   2781   /* Vector VNEG floating point.  */
   2782   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   2783    MVE_VNEG_FP,
   2784    0xffb107c0, 0xffb31fd1,
   2785    "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
   2786 
   2787   /* Vector VNEG.  */
   2788   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2789    MVE_VNEG_VEC,
   2790    0xffb103c0, 0xffb31fd1,
   2791    "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2792 
   2793   /* Vector VORN, vector bitwise or not.  */
   2794   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2795    MVE_VORN,
   2796    0xef300150, 0xffb11f51,
   2797    "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2798 
   2799   /* Vector VORR register.  */
   2800   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2801    MVE_VORR_REG,
   2802    0xef200150, 0xffb11f51,
   2803    "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2804 
   2805   /* Vector VMOV, vector to vector move. While decoding MVE_VORR_REG if
   2806      "Qm==Qn", VORR should replaced by its alias VMOV. For that to happen
   2807      MVE_VMOV_VEC_TO_VEC need to placed after MVE_VORR_REG in this mve_opcodes
   2808      array.  */
   2809 
   2810   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2811    MVE_VMOV_VEC_TO_VEC,
   2812    0xef200150, 0xffb11f51,
   2813    "vmov%v\t%13-15,22Q, %17-19,7Q"},
   2814 
   2815   /* Vector VQDMULL T1 variant.  */
   2816   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2817    MVE_VQDMULL_T1,
   2818    0xee300f01, 0xefb10f51,
   2819    "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2820 
   2821   /* Vector VPNOT.  */
   2822   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2823    MVE_VPNOT,
   2824    0xfe310f4d, 0xffffffff,
   2825    "vpnot%v"},
   2826 
   2827   /* Vector VPSEL.  */
   2828   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2829    MVE_VPSEL,
   2830    0xfe310f01, 0xffb11f51,
   2831    "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2832 
   2833   /* Vector VQABS.  */
   2834   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2835    MVE_VQABS,
   2836    0xffb00740, 0xffb31fd1,
   2837    "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2838 
   2839   /* Vector VQADD T1 variant.  */
   2840   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2841    MVE_VQADD_T1,
   2842    0xef000050, 0xef811f51,
   2843    "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2844 
   2845   /* Vector VQADD T2 variant.  */
   2846   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2847    MVE_VQADD_T2,
   2848    0xee000f60, 0xef811f70,
   2849    "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2850 
   2851   /* Vector VQDMULL T2 variant.  */
   2852   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2853    MVE_VQDMULL_T2,
   2854    0xee300f60, 0xefb10f70,
   2855    "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2856 
   2857   /* Vector VQMOVN.  */
   2858   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2859    MVE_VQMOVN,
   2860    0xee330e01, 0xefb30fd1,
   2861    "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
   2862 
   2863   /* Vector VQMOVUN.  */
   2864   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2865    MVE_VQMOVUN,
   2866    0xee310e81, 0xffb30fd1,
   2867    "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2868 
   2869   /* Vector VQDMLADH.  */
   2870   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2871    MVE_VQDMLADH,
   2872    0xee000e00, 0xff810f51,
   2873    "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2874 
   2875   /* Vector VQRDMLADH.  */
   2876   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2877    MVE_VQRDMLADH,
   2878    0xee000e01, 0xff810f51,
   2879    "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2880 
   2881   /* Vector VQDMLAH.  */
   2882   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2883    MVE_VQDMLAH,
   2884    0xee000e60, 0xff811f70,
   2885    "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2886 
   2887   /* Vector VQRDMLAH.  */
   2888   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2889    MVE_VQRDMLAH,
   2890    0xee000e40, 0xff811f70,
   2891    "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2892 
   2893   /* Vector VQDMLASH.  */
   2894   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2895    MVE_VQDMLASH,
   2896    0xee001e60, 0xff811f70,
   2897    "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2898 
   2899   /* Vector VQRDMLASH.  */
   2900   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2901    MVE_VQRDMLASH,
   2902    0xee001e40, 0xff811f70,
   2903    "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2904 
   2905   /* Vector VQDMLSDH.  */
   2906   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2907    MVE_VQDMLSDH,
   2908    0xfe000e00, 0xff810f51,
   2909    "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2910 
   2911   /* Vector VQRDMLSDH.  */
   2912   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2913    MVE_VQRDMLSDH,
   2914    0xfe000e01, 0xff810f51,
   2915    "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2916 
   2917   /* Vector VQDMULH T1 variant.  */
   2918   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2919    MVE_VQDMULH_T1,
   2920    0xef000b40, 0xff811f51,
   2921    "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2922 
   2923   /* Vector VQRDMULH T2 variant.  */
   2924   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2925    MVE_VQRDMULH_T2,
   2926    0xff000b40, 0xff811f51,
   2927    "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   2928 
   2929   /* Vector VQDMULH T3 variant.  */
   2930   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2931    MVE_VQDMULH_T3,
   2932    0xee010e60, 0xff811f70,
   2933    "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2934 
   2935   /* Vector VQRDMULH T4 variant.  */
   2936   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2937    MVE_VQRDMULH_T4,
   2938    0xfe010e60, 0xff811f70,
   2939    "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   2940 
   2941   /* Vector VQNEG.  */
   2942   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2943    MVE_VQNEG,
   2944    0xffb007c0, 0xffb31fd1,
   2945    "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
   2946 
   2947   /* Vector VQRSHL T1 variant.  */
   2948   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2949    MVE_VQRSHL_T1,
   2950    0xef000550, 0xef811f51,
   2951    "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
   2952 
   2953   /* Vector VQRSHL T2 variant.  */
   2954   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2955    MVE_VQRSHL_T2,
   2956    0xee331ee0, 0xefb31ff0,
   2957    "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
   2958 
   2959   /* Vector VQRSHRN.  */
   2960   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2961    MVE_VQRSHRN,
   2962    0xee800f41, 0xefa00fd1,
   2963    "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2964 
   2965   /* Vector VQRSHRUN.  */
   2966   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2967    MVE_VQRSHRUN,
   2968    0xfe800fc0, 0xffa00fd1,
   2969    "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2970 
   2971   /* Vector VQSHL T1 Variant.  */
   2972   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2973    MVE_VQSHL_T1,
   2974    0xee311ee0, 0xefb31ff0,
   2975    "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
   2976 
   2977   /* Vector VQSHL T4 Variant.  */
   2978   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2979    MVE_VQSHL_T4,
   2980    0xef000450, 0xef811f51,
   2981    "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
   2982 
   2983   /* Vector VQSHRN.  */
   2984   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2985    MVE_VQSHRN,
   2986    0xee800f40, 0xefa00fd1,
   2987    "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2988 
   2989   /* Vector VQSHRUN.  */
   2990   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2991    MVE_VQSHRUN,
   2992    0xee800fc0, 0xffa00fd1,
   2993    "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   2994 
   2995   /* Vector VQSUB T1 Variant.  */
   2996   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   2997    MVE_VQSUB_T1,
   2998    0xef000250, 0xef811f51,
   2999    "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   3000 
   3001   /* Vector VQSUB T2 Variant.  */
   3002   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3003    MVE_VQSUB_T2,
   3004    0xee001f60, 0xef811f70,
   3005    "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   3006 
   3007   /* Vector VREV16.  */
   3008   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3009    MVE_VREV16,
   3010    0xffb00140, 0xffb31fd1,
   3011    "vrev16%v.8\t%13-15,22Q, %1-3,5Q"},
   3012 
   3013   /* Vector VREV32.  */
   3014   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3015    MVE_VREV32,
   3016    0xffb000c0, 0xffb31fd1,
   3017    "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
   3018 
   3019   /* Vector VREV64.  */
   3020   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3021    MVE_VREV64,
   3022    0xffb00040, 0xffb31fd1,
   3023    "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"},
   3024 
   3025   /* Vector VRINT floating point.  */
   3026   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   3027    MVE_VRINT_FP,
   3028    0xffb20440, 0xffb31c51,
   3029    "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"},
   3030 
   3031   /* Vector VRMLALDAVH.  */
   3032   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3033    MVE_VRMLALDAVH,
   3034    0xee800f00, 0xef811f51,
   3035    "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   3036 
   3037   /* Vector VRMLALDAVH.  */
   3038   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3039    MVE_VRMLALDAVH,
   3040    0xee801f00, 0xef811f51,
   3041    "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"},
   3042 
   3043   /* Vector VRSHL T1 Variant.  */
   3044   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3045    MVE_VRSHL_T1,
   3046    0xef000540, 0xef811f51,
   3047    "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
   3048 
   3049   /* Vector VRSHL T2 Variant.  */
   3050   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3051    MVE_VRSHL_T2,
   3052    0xee331e60, 0xefb31ff0,
   3053    "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
   3054 
   3055   /* Vector VRSHRN.  */
   3056   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3057    MVE_VRSHRN,
   3058    0xfe800fc1, 0xffa00fd1,
   3059    "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   3060 
   3061   /* Vector VSBC.  */
   3062   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3063    MVE_VSBC,
   3064    0xfe300f00, 0xffb10f51,
   3065    "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   3066 
   3067   /* Vector VSHL T2 Variant.  */
   3068   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3069    MVE_VSHL_T2,
   3070    0xee311e60, 0xefb31ff0,
   3071    "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"},
   3072 
   3073   /* Vector VSHL T3 Variant.  */
   3074   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3075    MVE_VSHL_T3,
   3076    0xef000440, 0xef811f51,
   3077    "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"},
   3078 
   3079   /* Vector VSHLC.  */
   3080   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3081    MVE_VSHLC,
   3082    0xeea00fc0, 0xffa01ff0,
   3083    "vshlc%v\t%13-15,22Q, %0-3r, %{I:#%16-20d%}"},
   3084 
   3085   /* Vector VSHLL T2 Variant.  */
   3086   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3087    MVE_VSHLL_T2,
   3088    0xee310e01, 0xefb30fd1,
   3089    "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, %{I:#%18-19d%}"},
   3090 
   3091   /* Vector VSHRN.  */
   3092   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3093    MVE_VSHRN,
   3094    0xee800fc1, 0xffa00fd1,
   3095    "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, %{I:#%16-18d%}"},
   3096 
   3097   /* Vector VST2 no writeback.  */
   3098   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3099    MVE_VST2,
   3100    0xfc801e00, 0xffb01e5f,
   3101    "vst2%5d.%7-8s\t%B, [%16-19r]"},
   3102 
   3103   /* Vector VST2 writeback.  */
   3104   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3105    MVE_VST2,
   3106    0xfca01e00, 0xffb01e5f,
   3107    "vst2%5d.%7-8s\t%B, [%16-19r]!"},
   3108 
   3109   /* Vector VST4 no writeback.  */
   3110   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3111    MVE_VST4,
   3112    0xfc801e01, 0xffb01e1f,
   3113    "vst4%5-6d.%7-8s\t%B, [%16-19r]"},
   3114 
   3115   /* Vector VST4 writeback.  */
   3116   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3117    MVE_VST4,
   3118    0xfca01e01, 0xffb01e1f,
   3119    "vst4%5-6d.%7-8s\t%B, [%16-19r]!"},
   3120 
   3121   /* Vector VSTRB scatter store, T1 variant.  */
   3122   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3123    MVE_VSTRB_SCATTER_T1,
   3124    0xec800e00, 0xffb01e50,
   3125    "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"},
   3126 
   3127   /* Vector VSTRH scatter store, T2 variant.  */
   3128   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3129    MVE_VSTRH_SCATTER_T2,
   3130    0xec800e10, 0xffb01e50,
   3131    "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   3132 
   3133   /* Vector VSTRW scatter store, T3 variant.  */
   3134   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3135    MVE_VSTRW_SCATTER_T3,
   3136    0xec800e40, 0xffb01e50,
   3137    "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   3138 
   3139   /* Vector VSTRD scatter store, T4 variant.  */
   3140   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3141    MVE_VSTRD_SCATTER_T4,
   3142    0xec800fd0, 0xffb01fd0,
   3143    "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"},
   3144 
   3145   /* Vector VSTRW scatter store, T5 variant.  */
   3146   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3147    MVE_VSTRW_SCATTER_T5,
   3148    0xfd001e00, 0xff111f00,
   3149    "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, %{I:#%a%0-6i%}]%w"},
   3150 
   3151   /* Vector VSTRD scatter store, T6 variant.  */
   3152   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3153    MVE_VSTRD_SCATTER_T6,
   3154    0xfd001f00, 0xff111f00,
   3155    "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, %{I:#%a%0-6i%}]%w"},
   3156 
   3157   /* Vector VSTRB.  */
   3158   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3159    MVE_VSTRB_T1,
   3160    0xec000e00, 0xfe581e00,
   3161    "vstrb%v.%7-8s\t%13-15Q, %d"},
   3162 
   3163   /* Vector VSTRH.  */
   3164   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3165    MVE_VSTRH_T2,
   3166    0xec080e00, 0xfe581e00,
   3167    "vstrh%v.%7-8s\t%13-15Q, %d"},
   3168 
   3169   /* Vector VSTRB variant T5.  */
   3170   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3171    MVE_VSTRB_T5,
   3172    0xec001e00, 0xfe101f80,
   3173    "vstrb%v.8\t%13-15,22Q, %d"},
   3174 
   3175   /* Vector VSTRH variant T6.  */
   3176   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3177    MVE_VSTRH_T6,
   3178    0xec001e80, 0xfe101f80,
   3179    "vstrh%v.16\t%13-15,22Q, %d"},
   3180 
   3181   /* Vector VSTRW variant T7.  */
   3182   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3183    MVE_VSTRW_T7,
   3184    0xec001f00, 0xfe101f80,
   3185    "vstrw%v.32\t%13-15,22Q, %d"},
   3186 
   3187   /* Vector VSUB floating point T1 variant.  */
   3188   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   3189    MVE_VSUB_FP_T1,
   3190    0xef200d40, 0xffa11f51,
   3191    "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   3192 
   3193   /* Vector VSUB floating point T2 variant.  */
   3194   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
   3195    MVE_VSUB_FP_T2,
   3196    0xee301f40, 0xefb11f70,
   3197    "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   3198 
   3199   /* Vector VSUB T1 variant.  */
   3200   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3201    MVE_VSUB_VEC_T1,
   3202    0xff000840, 0xff811f51,
   3203    "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
   3204 
   3205   /* Vector VSUB T2 variant.  */
   3206   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3207    MVE_VSUB_VEC_T2,
   3208    0xee011f40, 0xff811f70,
   3209    "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"},
   3210 
   3211   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3212    MVE_ASRLI,
   3213    0xea50012f, 0xfff1813f,
   3214    "asrl%c\t%17-19l, %9-11h, %j"},
   3215 
   3216   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3217    MVE_ASRL,
   3218    0xea50012d, 0xfff101ff,
   3219    "asrl%c\t%17-19l, %9-11h, %12-15S"},
   3220 
   3221   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3222    MVE_LSLLI,
   3223    0xea50010f, 0xfff1813f,
   3224    "lsll%c\t%17-19l, %9-11h, %j"},
   3225 
   3226   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3227    MVE_LSLL,
   3228    0xea50010d, 0xfff101ff,
   3229    "lsll%c\t%17-19l, %9-11h, %12-15S"},
   3230 
   3231   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3232    MVE_LSRL,
   3233    0xea50011f, 0xfff1813f,
   3234    "lsrl%c\t%17-19l, %9-11h, %j"},
   3235 
   3236   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3237    MVE_SQRSHRL,
   3238    0xea51012d, 0xfff1017f,
   3239    "sqrshrl%c\t%17-19l, %9-11h, %k, %12-15S"},
   3240 
   3241   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3242    MVE_SQRSHR,
   3243    0xea500f2d, 0xfff00fff,
   3244    "sqrshr%c\t%16-19S, %12-15S"},
   3245 
   3246   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3247    MVE_SQSHLL,
   3248    0xea51013f, 0xfff1813f,
   3249    "sqshll%c\t%17-19l, %9-11h, %j"},
   3250 
   3251   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3252    MVE_SQSHL,
   3253    0xea500f3f, 0xfff08f3f,
   3254    "sqshl%c\t%16-19S, %j"},
   3255 
   3256   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3257    MVE_SRSHRL,
   3258    0xea51012f, 0xfff1813f,
   3259    "srshrl%c\t%17-19l, %9-11h, %j"},
   3260 
   3261   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3262    MVE_SRSHR,
   3263    0xea500f2f, 0xfff08f3f,
   3264    "srshr%c\t%16-19S, %j"},
   3265 
   3266   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3267    MVE_UQRSHLL,
   3268    0xea51010d, 0xfff1017f,
   3269    "uqrshll%c\t%17-19l, %9-11h, %k, %12-15S"},
   3270 
   3271   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3272    MVE_UQRSHL,
   3273    0xea500f0d, 0xfff00fff,
   3274    "uqrshl%c\t%16-19S, %12-15S"},
   3275 
   3276   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3277    MVE_UQSHLL,
   3278     0xea51010f, 0xfff1813f,
   3279    "uqshll%c\t%17-19l, %9-11h, %j"},
   3280 
   3281   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3282    MVE_UQSHL,
   3283    0xea500f0f, 0xfff08f3f,
   3284    "uqshl%c\t%16-19S, %j"},
   3285 
   3286   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3287    MVE_URSHRL,
   3288     0xea51011f, 0xfff1813f,
   3289    "urshrl%c\t%17-19l, %9-11h, %j"},
   3290 
   3291   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
   3292    MVE_URSHR,
   3293    0xea500f1f, 0xfff08f3f,
   3294    "urshr%c\t%16-19S, %j"},
   3295 
   3296   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3297    MVE_CSINC,
   3298    0xea509000, 0xfff0f000,
   3299    "csinc\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
   3300 
   3301   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3302    MVE_CSINV,
   3303    0xea50a000, 0xfff0f000,
   3304    "csinv\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
   3305 
   3306   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3307    MVE_CSET,
   3308    0xea5f900f, 0xfffff00f,
   3309    "cset\t%8-11S, %4-7C"},
   3310 
   3311   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3312    MVE_CSETM,
   3313    0xea5fa00f, 0xfffff00f,
   3314    "csetm\t%8-11S, %4-7C"},
   3315 
   3316   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3317    MVE_CSEL,
   3318    0xea508000, 0xfff0f000,
   3319    "csel\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
   3320 
   3321   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3322    MVE_CSNEG,
   3323    0xea50b000, 0xfff0f000,
   3324    "csneg\t%8-11S, %16-19Z, %0-3Z, %4-7c"},
   3325 
   3326   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3327    MVE_CINC,
   3328    0xea509000, 0xfff0f000,
   3329    "cinc\t%8-11S, %16-19Z, %4-7C"},
   3330 
   3331   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3332    MVE_CINV,
   3333    0xea50a000, 0xfff0f000,
   3334    "cinv\t%8-11S, %16-19Z, %4-7C"},
   3335 
   3336   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   3337    MVE_CNEG,
   3338    0xea50b000, 0xfff0f000,
   3339    "cneg\t%8-11S, %16-19Z, %4-7C"},
   3340 
   3341   {ARM_FEATURE_CORE_LOW (0),
   3342    MVE_NONE,
   3343    0x00000000, 0x00000000, 0}
   3344 };
   3345 
   3346 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb.  All three are partially
   3347    ordered: they must be searched linearly from the top to obtain a correct
   3348    match.  */
   3349 
   3350 /* print_insn_arm recognizes the following format control codes:
   3351 
   3352    %%			%
   3353 
   3354    %a			print address for ldr/str instruction
   3355    %s                   print address for ldr/str halfword/signextend instruction
   3356    %S                   like %s but allow UNPREDICTABLE addressing
   3357    %b			print branch destination
   3358    %c			print condition code (always bits 28-31)
   3359    %m			print register mask for ldm/stm instruction
   3360    %o			print operand2 (immediate or register + shift)
   3361    %p			print 'p' iff bits 12-15 are 15
   3362    %O			print 'OBSOLETE' iff bits 12-15 are 15
   3363    %t			print 't' iff bit 21 set and bit 24 clear
   3364    %B			print arm BLX(1) destination
   3365    %C			print the PSR sub type.
   3366    %U			print barrier type.
   3367    %P			print address for pli instruction.
   3368    %T			print 'from Armv4T onwards'
   3369 
   3370    %<bitfield>r		print as an ARM register
   3371    %<bitfield>T		print as an ARM register + 1
   3372    %<bitfield>R		as %r but r15 is UNPREDICTABLE
   3373    %<bitfield>{r|R}u    as %{r|R} but if matches the other %u field then is UNPREDICTABLE
   3374    %<bitfield>{r|R}U    as %{r|R} but if matches the other %U field then is UNPREDICTABLE
   3375    %<bitfield>d		print the bitfield in decimal
   3376    %<bitfield>W         print the bitfield plus one in decimal
   3377    %<bitfield>x		print the bitfield in hex
   3378    %<bitfield>X		print the bitfield as 1 hex digit without leading "0x"
   3379 
   3380    %<bitfield>'c	print specified char iff bitfield is all ones
   3381    %<bitfield>`c	print specified char iff bitfield is all zeroes
   3382    %<bitfield>?ab...    select from array of values in big endian order
   3383 
   3384    %e                   print arm SMI operand (bits 0..7,8..19).
   3385    %E			print the LSB and WIDTH fields of a BFI or BFC instruction.
   3386    %V                   print the 16-bit immediate field of a MOVT or MOVW instruction.
   3387    %R			print the SPSR/CPSR or banked register of an MRS.  */
   3388 
   3389 static const struct opcode32 arm_opcodes[] =
   3390 {
   3391   /* ARM instructions.  */
   3392   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3393     0xe1a00000, 0xffffffff, "nop\t\t\t@ (mov r0, r0)"},
   3394   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3395     0xe7f000f0, 0xfff000f0, "udf\t%{I:#%e%}"},
   3396 
   3397   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4),
   3398     0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r%T"},
   3399   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   3400     0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
   3401   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2),
   3402     0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3403   {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S),
   3404     0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
   3405   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
   3406     0x00800090, 0x0fa000f0,
   3407     "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3408   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M),
   3409     0x00a00090, 0x0fa000f0,
   3410     "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3411 
   3412   /* V8.2 RAS extension instructions.  */
   3413   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
   3414     0xe320f010, 0xffffffff, "esb"},
   3415 
   3416   /* V8-R instructions.  */
   3417   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
   3418     0xf57ff04c, 0xffffffff, "dfb"},
   3419 
   3420   /* V8 instructions.  */
   3421   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   3422     0x0320f005, 0x0fffffff, "sevl"},
   3423   /* Defined in V8 but is in NOP space so available to all arch.  */
   3424   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3425     0xe1000070, 0xfff000f0, "hlt\t%{I:0x%16-19X%12-15X%8-11X%0-3X%}"},
   3426   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS),
   3427     0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"},
   3428   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3429     0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
   3430   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   3431     0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"},
   3432   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   3433     0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"},
   3434   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3435     0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"},
   3436   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3437     0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
   3438   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3439     0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"},
   3440   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3441     0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
   3442   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3443     0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"},
   3444   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3445     0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"},
   3446   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3447     0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"},
   3448   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3449     0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"},
   3450   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3451     0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"},
   3452   {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS),
   3453     0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"},
   3454   /* CRC32 instructions.  */
   3455   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3456     0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"},
   3457   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3458     0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"},
   3459   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3460     0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"},
   3461   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3462     0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"},
   3463   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3464     0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"},
   3465   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   3466     0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"},
   3467 
   3468   /* Privileged Access Never extension instructions.  */
   3469   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
   3470     0xf1100000, 0xfffffdff, "setpan\t%{I:#%9-9d%}"},
   3471 
   3472   /* Virtualization Extension instructions.  */
   3473   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"},
   3474   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
   3475 
   3476   /* Integer Divide Extension instructions.  */
   3477   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
   3478     0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
   3479   {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
   3480     0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
   3481 
   3482   /* MP Extension instructions.  */
   3483   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"},
   3484 
   3485   /* Speculation Barriers.  */
   3486   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xe320f014, 0xffffffff, "csdb"},
   3487   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff040, 0xffffffff, "ssbb"},
   3488   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff044, 0xffffffff, "pssbb"},
   3489 
   3490   /* V7 instructions.  */
   3491   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"},
   3492   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t%{I:#%0-3d%}"},
   3493   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"},
   3494   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"},
   3495   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"},
   3496   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"},
   3497   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"},
   3498    {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
   3499     0x0320f000, 0x0fffffff, "nop%c\t{%{I:%0-7d%}}"},
   3500 
   3501   /* ARM V6T2 instructions.  */
   3502   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3503     0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
   3504   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3505     0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
   3506   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3507     0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3508   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3509     0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"},
   3510 
   3511   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3512     0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION },
   3513   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3514     0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
   3515 
   3516   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3517     0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
   3518   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   3519     0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
   3520   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3521     0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
   3522   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   3523     0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, %{I:#%7-11d%}, %{I:#%16-20W%}"},
   3524 
   3525   /* ARM Security extension instructions.  */
   3526   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
   3527     0x01600070, 0x0ff000f0, "smc%c\t%e"},
   3528 
   3529   /* ARM V6K instructions.  */
   3530   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3531     0xf57ff01f, 0xffffffff, "clrex"},
   3532   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3533     0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
   3534   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3535     0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
   3536   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3537     0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
   3538   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3539     0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
   3540   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3541     0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
   3542   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3543     0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
   3544 
   3545   /* ARMv8.5-A instructions.  */
   3546   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf57ff070, 0xffffffff, "sb"},
   3547 
   3548   /* ARM V6K NOP hints.  */
   3549   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3550     0x0320f001, 0x0fffffff, "yield%c"},
   3551   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3552     0x0320f002, 0x0fffffff, "wfe%c"},
   3553   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3554     0x0320f003, 0x0fffffff, "wfi%c"},
   3555   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3556     0x0320f004, 0x0fffffff, "sev%c"},
   3557   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
   3558     0x0320f000, 0x0fffff00, "nop%c\t{%{I:%0-7d%}}"},
   3559 
   3560   /* ARM V6 instructions.  */
   3561   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3562     0xf1080000, 0xfffffe3f, "cpsie\t%{B:%8'a%7'i%6'f%}"},
   3563   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3564     0xf10a0000, 0xfffffe20, "cpsie\t%{B:%8'a%7'i%6'f%}, %{I:#%0-4d%}"},
   3565   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3566     0xf10C0000, 0xfffffe3f, "cpsid\t%{B:%8'a%7'i%6'f%}"},
   3567   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3568     0xf10e0000, 0xfffffe20, "cpsid\t%{B:%8'a%7'i%6'f%}, %{I:#%0-4d%}"},
   3569   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3570     0xf1000000, 0xfff1fe20, "cps\t%{I:#%0-4d%}"},
   3571   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3572     0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
   3573   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3574     0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, %{B:lsl%} %{I:#%7-11d%}"},
   3575   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3576     0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, %{B:asr%} %{I:#32%}"},
   3577   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3578     0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, %{B:asr%} %{I:#%7-11d%}"},
   3579   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3580     0x01900f9f, 0x0ff00fff, "ldrex%c\t%{R:r%12-15d%}, [%16-19R]"},
   3581   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3582     0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
   3583   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3584     0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
   3585   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3586     0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
   3587   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3588     0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
   3589   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3590     0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
   3591   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3592     0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
   3593   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3594     0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
   3595   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3596     0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
   3597   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3598     0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
   3599   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3600     0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
   3601   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3602     0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
   3603   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3604     0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
   3605   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3606     0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
   3607   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3608     0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
   3609   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3610     0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
   3611   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3612     0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
   3613   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3614     0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
   3615   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3616     0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
   3617   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3618     0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
   3619   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3620     0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
   3621   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3622     0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
   3623   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3624     0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
   3625   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3626     0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
   3627   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3628     0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
   3629   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3630     0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
   3631   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3632     0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
   3633   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3634     0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
   3635   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3636     0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
   3637   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3638     0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
   3639   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3640     0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
   3641   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3642     0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
   3643   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3644     0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
   3645   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3646     0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
   3647   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3648     0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
   3649   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3650     0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
   3651   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3652     0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
   3653   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3654     0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
   3655   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3656     0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
   3657   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3658     0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
   3659   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3660     0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
   3661   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3662     0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
   3663   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3664     0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3665   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3666     0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3667   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3668     0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3669   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3670     0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
   3671   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3672     0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3673   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3674     0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3675   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3676     0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3677   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3678     0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
   3679   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3680     0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3681   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3682     0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3683   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3684     0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3685   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3686     0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
   3687   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3688     0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3689   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3690     0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3691   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3692     0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3693   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3694     0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
   3695   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3696     0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3697   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3698     0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3699   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3700     0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3701   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3702     0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
   3703   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3704     0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#8%}"},
   3705   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3706     0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#16%}"},
   3707   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3708     0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, %{B:ror%} %{I:#24%}"},
   3709   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3710     0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
   3711   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3712     0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3713   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3714     0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3715   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3716     0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#24%}"},
   3717   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3718     0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
   3719   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3720     0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3721   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3722     0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3723   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3724     0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#24%}"},
   3725   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3726     0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
   3727   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3728     0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3729   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3730     0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3731   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3732     0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#24%}"},
   3733   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3734     0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
   3735   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3736     0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3737   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3738     0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3739   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3740     0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#24%}"},
   3741   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3742     0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
   3743   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3744     0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3745   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3746     0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3747   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3748     0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR %{I:#24%}"},
   3749   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3750     0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
   3751   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3752     0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#8%}"},
   3753   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3754     0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#16%}"},
   3755   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3756     0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, %{B:ror%} %{I:#24%}"},
   3757   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3758     0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
   3759   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3760     0xf1010000, 0xfffffc00, "setend\t%{B:%9?ble%}"},
   3761   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3762     0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
   3763   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3764     0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
   3765   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3766     0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3767   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3768     0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3769   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3770     0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3771   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3772     0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3773   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3774     0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
   3775   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3776     0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3777   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3778     0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3779   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3780     0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, %{I:#%0-4d%}"},
   3781   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3782     0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, %{I:#%16-20W%}, %0-3R"},
   3783   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3784     0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, %{I:#%16-20W%}, %0-3R, %{B:lsl%} %{I:#%7-11d%}"},
   3785   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3786     0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, %{I:#%16-20W%}, %0-3R, %{B:asr%} %{I:#%7-11d%}"},
   3787   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3788     0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, %{I:#%16-19W%}, %0-3r"},
   3789   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3790     0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
   3791   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3792     0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
   3793   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3794     0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
   3795   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3796     0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3797   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3798     0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, %{I:#%16-20d%}, %0-3R"},
   3799   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3800     0x06e00010, 0x0fe00070, "usat%c\t%12-15R, %{I:#%16-20d%}, %0-3R, %{B:lsl%} %{I:#%7-11d%}"},
   3801   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3802     0x06e00050, 0x0fe00070, "usat%c\t%12-15R, %{I:#%16-20d%}, %0-3R, %{B:asr%} %{I:#%7-11d%}"},
   3803   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6),
   3804     0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, %{I:#%16-19d%}, %0-3R"},
   3805 
   3806   /* V5J instruction.  */
   3807   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J),
   3808     0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
   3809 
   3810   /* V5 Instructions.  */
   3811   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   3812     0xe1200070, 0xfff000f0,
   3813     "bkpt\t%{I:0x%16-19X%12-15X%8-11X%0-3X%}"},
   3814   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   3815     0xfa000000, 0xfe000000, "blx\t%B"},
   3816   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   3817     0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
   3818   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
   3819     0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
   3820 
   3821   /* V5E "El Segundo" Instructions.  */
   3822   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   3823     0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
   3824   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   3825     0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
   3826   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E),
   3827     0xf450f000, 0xfc70f000, "pld\t%a"},
   3828   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3829     0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3830   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3831     0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3832   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3833     0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3834   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3835     0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
   3836 
   3837   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3838     0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
   3839   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3840     0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
   3841 
   3842   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3843     0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3844   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3845     0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3846   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3847     0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3848   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3849     0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
   3850 
   3851   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3852     0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
   3853   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3854     0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
   3855   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3856     0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
   3857   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3858     0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
   3859 
   3860   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3861     0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
   3862   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3863     0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
   3864 
   3865   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3866     0x01000050, 0x0ff00ff0,  "qadd%c\t%12-15R, %0-3R, %16-19R"},
   3867   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3868     0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
   3869   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3870     0x01200050, 0x0ff00ff0,  "qsub%c\t%12-15R, %0-3R, %16-19R"},
   3871   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP),
   3872     0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
   3873 
   3874   /* ARM Instructions.  */
   3875   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3876     0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t@ (str%c %12-15r, %a)"},
   3877 
   3878   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3879     0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
   3880   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3881     0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
   3882   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3883     0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
   3884   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3885     0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
   3886   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3887     0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
   3888   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3889     0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
   3890 
   3891   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3892     0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
   3893   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3894     0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
   3895   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3896     0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
   3897   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3898     0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
   3899 
   3900   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3901     0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION},
   3902   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3903     0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
   3904   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3905     0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION},
   3906   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3907     0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
   3908 
   3909   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3910     0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
   3911   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3912     0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
   3913   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3914     0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
   3915 
   3916   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3917     0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
   3918   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3919     0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
   3920   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3921     0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
   3922 
   3923   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3924     0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
   3925   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3926     0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
   3927   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3928     0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
   3929 
   3930   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3931     0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
   3932   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3933     0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
   3934   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3935     0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
   3936 
   3937   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3938     0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
   3939   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3940     0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
   3941   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3942     0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
   3943 
   3944   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3945     0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
   3946   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3947     0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
   3948   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3949     0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
   3950 
   3951   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3952     0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
   3953   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3954     0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
   3955   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3956     0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
   3957 
   3958   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3959     0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
   3960   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3961     0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
   3962   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3963     0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
   3964 
   3965   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
   3966     0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
   3967   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
   3968     0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
   3969   {ARM_FEATURE_CORE_LOW (ARM_EXT_V3),
   3970     0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
   3971 
   3972   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3973     0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o%O"},
   3974   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3975     0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o%O"},
   3976   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3977     0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o%O"},
   3978 
   3979   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3980     0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o%O"},
   3981   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3982     0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o%O"},
   3983   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3984     0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o%O"},
   3985 
   3986   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3987     0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o%O"},
   3988   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3989     0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o%O"},
   3990   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3991     0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o%O"},
   3992 
   3993   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3994     0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o%O"},
   3995   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3996     0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o%O"},
   3997   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   3998     0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o%O"},
   3999 
   4000   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4001     0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
   4002   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4003     0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
   4004   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4005     0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
   4006 
   4007   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4008     0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
   4009   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4010     0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
   4011   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4012     0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
   4013   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4014     0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
   4015   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4016     0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
   4017   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4018     0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
   4019   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4020     0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
   4021 
   4022   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4023     0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
   4024   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4025     0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
   4026   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4027     0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
   4028 
   4029   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4030     0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
   4031   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4032     0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
   4033   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4034     0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
   4035 
   4036   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4037     0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION},
   4038   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4039     0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t@ (ldr%c %12-15r, %a)"},
   4040 
   4041   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4042     0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
   4043 
   4044   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4045     0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
   4046   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4047     0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
   4048 
   4049   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4050     0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4051   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4052     0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4053   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4054     0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4055   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4056     0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4057   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4058     0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4059   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4060     0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4061   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4062     0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4063   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4064     0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4065   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4066     0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4067   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4068     0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4069   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4070     0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4071   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4072     0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4073   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4074     0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4075   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4076     0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4077   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4078     0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4079   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4080     0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
   4081   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4082     0x092d0000, 0x0fff0000, "push%c\t%m"},
   4083   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4084     0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
   4085   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4086     0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
   4087 
   4088   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4089     0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4090   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4091     0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4092   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4093     0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4094   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4095     0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4096   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4097     0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4098   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4099     0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4100   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4101     0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4102   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4103     0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4104   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4105     0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4106   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4107     0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4108   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4109     0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4110   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4111     0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4112   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4113     0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4114   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4115     0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4116   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4117     0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4118   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4119     0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
   4120   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4121     0x08bd0000, 0x0fff0000, "pop%c\t%m"},
   4122   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4123     0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
   4124   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4125     0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
   4126 
   4127   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4128     0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
   4129   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4130     0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
   4131 
   4132   /* The rest.  */
   4133   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7),
   4134     0x03200000, 0x0fff00ff, "nop%c\t{%{I:%0-7d%}}" UNPREDICTABLE_INSTRUCTION},
   4135   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4136     0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
   4137   {ARM_FEATURE_CORE_LOW (0),
   4138     0x00000000, 0x00000000, 0}
   4139 };
   4140 
   4141 /* print_insn_thumb16 recognizes the following format control codes:
   4142 
   4143    %S                   print Thumb register (bits 3..5 as high number if bit 6 set)
   4144    %D                   print Thumb register (bits 0..2 as high number if bit 7 set)
   4145    %<bitfield>I         print bitfield as a signed decimal
   4146    				(top bit of range being the sign bit)
   4147    %N                   print Thumb register mask (with LR)
   4148    %O                   print Thumb register mask (with PC)
   4149    %M                   print Thumb register mask
   4150    %b			print CZB's 6-bit unsigned branch destination
   4151    %s			print Thumb right-shift immediate (6..10; 0 == 32).
   4152    %c			print the condition code
   4153    %C			print the condition code, or "s" if not conditional
   4154    %x			print warning if conditional an not at end of IT block"
   4155    %X			print "\t@ unpredictable <IT:code>" if conditional
   4156    %I			print IT instruction suffix and operands
   4157    %W			print Thumb Writeback indicator for LDMIA
   4158    %<bitfield>r		print bitfield as an ARM register
   4159    %<bitfield>d		print bitfield as a decimal
   4160    %<bitfield>H         print (bitfield * 2) as a decimal
   4161    %<bitfield>W         print (bitfield * 4) as a decimal
   4162    %<bitfield>a         print (bitfield * 4) as a pc-rel offset + decoded symbol
   4163    %<bitfield>B         print Thumb branch destination (signed displacement)
   4164    %<bitfield>c         print bitfield as a condition code
   4165    %<bitnum>'c		print specified char iff bit is one
   4166    %<bitnum>?ab		print a if bit is one else print b.  */
   4167 
   4168 static const struct opcode16 thumb_opcodes[] =
   4169 {
   4170   /* Thumb instructions.  */
   4171 
   4172   /* ARMv8-M Security Extensions instructions.  */
   4173   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"},
   4174   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff87, "bxns\t%3-6r"},
   4175 
   4176   /* ARM V8 instructions.  */
   4177   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xbf50, 0xffff, "sevl%c"},
   4178   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),  0xba80, 0xffc0, "hlt\t%0-5x"},
   4179   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),  0xb610, 0xfff7, "setpan\t%{I:#%3-3d%}"},
   4180 
   4181   /* ARM V6K no-argument instructions.  */
   4182   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"},
   4183   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"},
   4184   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"},
   4185   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"},
   4186   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"},
   4187   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
   4188 
   4189   /* ARM V6T2 instructions.  */
   4190   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4191     0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
   4192   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4193     0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
   4194   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"},
   4195 
   4196   /* ARM V6.  */
   4197   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%{B:%2'a%1'i%0'f%}%X"},
   4198   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%{B:%2'a%1'i%0'f%}%X"},
   4199   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
   4200   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
   4201   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
   4202   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
   4203   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%{B:%3?ble%}%X"},
   4204   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
   4205   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
   4206   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
   4207   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
   4208 
   4209   /* ARM V5 ISA extends Thumb.  */
   4210   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
   4211     0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional.  */
   4212   /* This is BLX(2).  BLX(1) is a 32-bit instruction.  */
   4213   {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T),
   4214     0x4780, 0xff87, "blx%c\t%3-6r%x"},	/* note: 4 bit register number.  */
   4215   /* ARM V4T ISA (Thumb v1).  */
   4216   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4217     0x46C0, 0xFFFF, "nop%c\t\t\t@ (mov r8, r8)"},
   4218   /* Format 4.  */
   4219   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
   4220   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
   4221   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
   4222   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
   4223   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
   4224   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
   4225   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
   4226   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
   4227   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
   4228   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
   4229   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
   4230   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
   4231   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
   4232   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
   4233   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
   4234   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
   4235   /* format 13 */
   4236   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\t%{R:sp%}, %{I:#%0-6W%}"},
   4237   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\t%{R:sp%}, %{I:#%0-6W%}"},
   4238   /* format 5 */
   4239   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"},
   4240   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"},
   4241   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"},
   4242   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"},
   4243   /* format 14 */
   4244   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"},
   4245   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"},
   4246   /* format 2 */
   4247   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4248     0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
   4249   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4250     0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
   4251   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4252     0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, %{I:#%6-8d%}"},
   4253   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4254     0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, %{I:#%6-8d%}"},
   4255   /* format 8 */
   4256   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4257     0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
   4258   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4259     0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
   4260   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4261     0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
   4262   /* format 7 */
   4263   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4264     0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   4265   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4266     0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
   4267   /* format 1 */
   4268   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
   4269   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4270     0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, %{I:#%6-10d%}"},
   4271   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
   4272   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
   4273   /* format 3 */
   4274   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, %{I:#%0-7d%}"},
   4275   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, %{I:#%0-7d%}"},
   4276   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, %{I:#%0-7d%}"},
   4277   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, %{I:#%0-7d%}"},
   4278   /* format 6 */
   4279   /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
   4280   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4281     0x4800, 0xF800,
   4282     "ldr%c\t%8-10r, [%{R:pc%}, %{I:#%0-7W%}]\t@ (%0-7a)"},
   4283   /* format 9 */
   4284   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4285     0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, %{I:#%6-10W%}]"},
   4286   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4287     0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, %{I:#%6-10W%}]"},
   4288   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4289     0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, %{I:#%6-10d%}]"},
   4290   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4291     0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, %{I:#%6-10d%}]"},
   4292   /* format 10 */
   4293   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4294     0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, %{I:#%6-10H%}]"},
   4295   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4296     0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, %{I:#%6-10H%}]"},
   4297   /* format 11 */
   4298   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4299     0x9000, 0xF800, "str%c\t%8-10r, [%{R:sp%}, %{I:#%0-7W%}]"},
   4300   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4301     0x9800, 0xF800, "ldr%c\t%8-10r, [%{R:sp%}, %{I:#%0-7W%}]"},
   4302   /* format 12 */
   4303   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4304     0xA000, 0xF800, "add%c\t%8-10r, %{R:pc%}, %{I:#%0-7W%}\t@ (adr %8-10r, %0-7a)"},
   4305   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4306     0xA800, 0xF800, "add%c\t%8-10r, %{R:sp%}, %{I:#%0-7W%}"},
   4307   /* format 15 */
   4308   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
   4309   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
   4310   /* format 17 */
   4311   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"},
   4312   /* format 16 */
   4313   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t%{I:#%0-7d%}"},
   4314   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION},
   4315   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
   4316   /* format 18 */
   4317   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
   4318 
   4319   /* The E800 .. FFFF range is unconditionally redirected to the
   4320      32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
   4321      are processed via that table.  Thus, we can never encounter a
   4322      bare "second half of BL/BLX(1)" instruction here.  */
   4323   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),  0x0000, 0x0000, UNDEFINED_INSTRUCTION},
   4324   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   4325 };
   4326 
   4327 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
   4328    We adopt the convention that hw1 is the high 16 bits of .value and
   4329    .mask, hw2 the low 16 bits.
   4330 
   4331    print_insn_thumb32 recognizes the following format control codes:
   4332 
   4333        %%		%
   4334 
   4335        %I		print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
   4336        %M		print a modified 12-bit immediate (same location)
   4337        %J		print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
   4338        %K		print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
   4339        %H		print a 16-bit immediate from hw2[3:0],hw1[11:0]
   4340        %S		print a possibly-shifted Rm
   4341 
   4342        %L		print address for a ldrd/strd instruction
   4343        %a		print the address of a plain load/store
   4344        %w		print the width and signedness of a core load/store
   4345        %m		print register mask for ldm/stm
   4346        %n		print register mask for clrm
   4347 
   4348        %E		print the lsb and width fields of a bfc/bfi instruction
   4349        %F		print the lsb and width fields of a sbfx/ubfx instruction
   4350        %G		print a fallback offset for Branch Future instructions
   4351        %W		print an offset for BF instruction
   4352        %Y		print an offset for BFL instruction
   4353        %Z		print an offset for BFCSEL instruction
   4354        %Q		print an offset for Low Overhead Loop instructions
   4355        %P		print an offset for Low Overhead Loop end instructions
   4356        %b		print a conditional branch offset
   4357        %B		print an unconditional branch offset
   4358        %s		print the shift field of an SSAT instruction
   4359        %R		print the rotation field of an SXT instruction
   4360        %U		print barrier type.
   4361        %P		print address for pli instruction.
   4362        %c		print the condition code
   4363        %x		print warning if conditional an not at end of IT block"
   4364        %X		print "\t@ unpredictable <IT:code>" if conditional
   4365 
   4366        %<bitfield>d	print bitfield in decimal
   4367        %<bitfield>D     print bitfield plus one in decimal
   4368        %<bitfield>W	print bitfield*4 in decimal
   4369        %<bitfield>r	print bitfield as an ARM register
   4370        %<bitfield>R	as %<>r but r15 is UNPREDICTABLE
   4371        %<bitfield>S	as %<>r but r13 and r15 is UNPREDICTABLE
   4372        %<bitfield>c	print bitfield as a condition code
   4373 
   4374        %<bitfield>'c	print specified char iff bitfield is all ones
   4375        %<bitfield>`c	print specified char iff bitfield is all zeroes
   4376        %<bitfield>?ab... select from array of values in big endian order
   4377 
   4378    With one exception at the bottom (done because BL and BLX(1) need
   4379    to come dead last), this table was machine-sorted first in
   4380    decreasing order of number of bits set in the mask, then in
   4381    increasing numeric order of mask, then in increasing numeric order
   4382    of opcode.  This order is not the clearest for a human reader, but
   4383    is guaranteed never to catch a special-case bit pattern with a more
   4384    general mask, which is important, because this instruction encoding
   4385    makes heavy use of special-case bit patterns.  */
   4386 static const struct opcode32 thumb32_opcodes[] =
   4387 {
   4388   /* Arm v8.1-M Mainline Pointer Authentication and Branch Target
   4389      Identification Extension.  */
   4390   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4391    0xf3af802d, 0xffffffff, "aut\t%{R:r12%}, %{R:lr%}, %{R:sp%}"},
   4392   {ARM_FEATURE_CORE_HIGH_HIGH (ARM_EXT3_PACBTI),
   4393    0xfb500f00, 0xfff00ff0, "autg%c\t%12-15r, %16-19r, %0-3r"},
   4394   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4395    0xf3af800f, 0xffffffff, "bti"},
   4396   {ARM_FEATURE_CORE_HIGH_HIGH (ARM_EXT3_PACBTI),
   4397    0xfb500f10, 0xfff00ff0, "bxaut%c\t%12-15r, %16-19r, %0-3r"},
   4398   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4399    0xf3af801d, 0xffffffff, "pac\t%{R:r12%}, %{R:lr%}, %{R:sp%}"},
   4400   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4401    0xf3af800d, 0xffffffff, "pacbti\t%{R:r12%}, %{R:lr%}, %{R:sp%}"},
   4402   {ARM_FEATURE_CORE_HIGH_HIGH (ARM_EXT3_PACBTI),
   4403    0xfb60f000, 0xfff0f0f0, "pacg%c\t%8-11r, %16-19r, %0-3r"},
   4404 
   4405   /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions
   4406      instructions.  */
   4407   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4408     0xf00fe001, 0xffffffff, "lctp%c"},
   4409   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4410     0xf02fc001, 0xfffff001, "le\t%P"},
   4411   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4412     0xf00fc001, 0xfffff001, "le\t%{R:lr%}, %P"},
   4413   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4414     0xf01fc001, 0xfffff001, "letp\t%{R:lr%}, %P"},
   4415   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4416     0xf040c001, 0xfff0f001, "wls\t%{R:lr%}, %16-19S, %Q"},
   4417   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4418     0xf000c001, 0xffc0f001, "wlstp.%20-21s\t%{R:lr%}, %16-19S, %Q"},
   4419   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4420     0xf040e001, 0xfff0ffff, "dls\t%{R:lr%}, %16-19S"},
   4421   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4422     0xf000e001, 0xffc0ffff, "dlstp.%20-21s\t%{R:lr%}, %16-19S"},
   4423 
   4424   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4425     0xf040e001, 0xf860f001, "bf%c\t%G, %W"},
   4426   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4427     0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"},
   4428   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4429     0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"},
   4430   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4431     0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"},
   4432   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4433     0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %{B:%18-21c%}"},
   4434 
   4435   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN),
   4436     0xe89f0000, 0xffff2000, "clrm%c\t%n"},
   4437 
   4438   /* ARMv8-M and ARMv8-M Security Extensions instructions.  */
   4439   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"},
   4440   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   4441     0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"},
   4442   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   4443     0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"},
   4444   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   4445     0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"},
   4446   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M),
   4447     0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"},
   4448 
   4449   /* ARM V8.2 RAS extension instructions.  */
   4450   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
   4451     0xf3af8010, 0xffffffff, "esb"},
   4452 
   4453   /* V8 instructions.  */
   4454   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4455     0xf3af8005, 0xffffffff, "sevl%c.w"},
   4456   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4457     0xf78f8000, 0xfffffffc, "dcps%0-1d"},
   4458   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4459     0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"},
   4460   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4461     0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"},
   4462   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4463     0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"},
   4464   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4465     0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"},
   4466   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4467     0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"},
   4468   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4469     0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"},
   4470   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4471     0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"},
   4472   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4473     0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"},
   4474   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4475     0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"},
   4476   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4477     0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"},
   4478   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4479     0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"},
   4480   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4481     0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"},
   4482   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4483     0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"},
   4484   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
   4485     0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"},
   4486 
   4487   /* V8-R instructions.  */
   4488   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8R),
   4489     0xf3bf8f4c, 0xffffffff, "dfb%c"},
   4490 
   4491   /* CRC32 instructions.  */
   4492   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4493     0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"},
   4494   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4495     0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"},
   4496   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4497     0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"},
   4498   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4499     0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"},
   4500   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4501     0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"},
   4502   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC),
   4503     0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"},
   4504 
   4505   /* Speculation Barriers.  */
   4506   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8014, 0xffffffff, "csdb"},
   4507   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f40, 0xffffffff, "ssbb"},
   4508   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f44, 0xffffffff, "pssbb"},
   4509 
   4510   /* V7 instructions.  */
   4511   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"},
   4512   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t%{I:#%0-3d%}"},
   4513   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
   4514   {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
   4515   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
   4516   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
   4517   {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
   4518   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
   4519     0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
   4520   {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
   4521     0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
   4522 
   4523   /* Virtualization Extension instructions.  */
   4524   {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
   4525   /* We skip ERET as that is SUBS pc, lr, #0.  */
   4526 
   4527   /* MP Extension instructions.  */
   4528   {ARM_FEATURE_CORE_LOW (ARM_EXT_MP),   0xf830f000, 0xff70f000, "pldw%c\t%a"},
   4529 
   4530   /* Security extension instructions.  */
   4531   {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),  0xf7f08000, 0xfff0f000, "smc%c\t%K"},
   4532 
   4533   /* ARMv8.5-A instructions.  */
   4534   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf3bf8f70, 0xffffffff, "sb"},
   4535 
   4536   /* Instructions defined in the basic V6T2 set.  */
   4537   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"},
   4538   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"},
   4539   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"},
   4540   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"},
   4541   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"},
   4542   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4543     0xf3af8000, 0xffffff00, "nop%c.w\t{%{I:%0-7d%}}"},
   4544   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"},
   4545 
   4546   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4547     0xf3bf8f2f, 0xffffffff, "clrex%c"},
   4548   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4549     0xf3af8400, 0xffffff1f, "cpsie.w\t%{B:%7'a%6'i%5'f%}%X"},
   4550   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4551     0xf3af8600, 0xffffff1f, "cpsid.w\t%{B:%7'a%6'i%5'f%}%X"},
   4552   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4553     0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
   4554   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4555     0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
   4556   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4557     0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
   4558   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4559     0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
   4560   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4561     0xf3af8100, 0xffffffe0, "cps\t%{I:#%0-4d%}%X"},
   4562   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4563     0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
   4564   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4565     0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, %{B:lsl%} %{I:#1%}]%x"},
   4566   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4567     0xf3af8500, 0xffffff00, "cpsie\t%{B:%7'a%6'i%5'f%}, %{I:#%0-4d%}%X"},
   4568   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4569     0xf3af8700, 0xffffff00, "cpsid\t%{B:%7'a%6'i%5'f%}, %{I:#%0-4d%}%X"},
   4570   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4571     0xf3de8f00, 0xffffff00, "subs%c\t%{R:pc%}, %{R:lr%}, %{I:#%0-7d%}"},
   4572   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4573     0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
   4574   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4575     0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
   4576   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4577     0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
   4578   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4579     0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, %{I:#%0-4d%}"},
   4580   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4581     0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, %{I:#%0-4d%}"},
   4582   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4583     0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
   4584   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4585     0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
   4586   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4587     0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
   4588   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4589     0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
   4590   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4591     0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
   4592   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4593     0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
   4594   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4595     0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
   4596   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4597     0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
   4598   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4599     0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
   4600   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4601     0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
   4602   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4603     0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
   4604   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4605     0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
   4606   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4607     0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
   4608   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4609     0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
   4610   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4611     0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
   4612   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4613     0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
   4614   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4615     0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
   4616   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4617     0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
   4618   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4619     0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
   4620   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4621     0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
   4622   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4623     0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
   4624   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4625     0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
   4626   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4627     0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
   4628   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4629     0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
   4630   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4631     0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
   4632   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4633     0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
   4634   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4635     0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
   4636   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4637     0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
   4638   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4639     0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
   4640   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4641     0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
   4642   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4643     0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
   4644   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4645     0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
   4646   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4647     0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
   4648   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4649     0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
   4650   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4651     0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
   4652   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4653     0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
   4654   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4655     0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
   4656   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4657     0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
   4658   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4659     0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
   4660   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4661     0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
   4662   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4663     0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
   4664   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4665     0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
   4666   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4667     0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
   4668   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4669     0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
   4670   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4671     0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
   4672   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4673     0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
   4674   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4675     0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
   4676   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4677     0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
   4678   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4679     0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
   4680   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4681     0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
   4682   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4683     0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
   4684   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4685     0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
   4686   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4687     0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
   4688   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4689     0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
   4690   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4691     0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
   4692   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4693     0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
   4694   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4695     0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   4696   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4697     0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   4698   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4699     0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
   4700   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4701     0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
   4702   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4703     0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
   4704   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4705     0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, %{I:#%0-4D%}, %16-19r"},
   4706   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4707     0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, %{I:#%0-4d%}, %16-19r"},
   4708   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4709     0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
   4710   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4711     0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   4712   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4713     0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
   4714   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4715     0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
   4716   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4717     0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   4718   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4719     0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
   4720   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4721     0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   4722   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4723     0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
   4724   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4725     0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   4726   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4727     0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
   4728   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4729     0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
   4730   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4731     0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
   4732   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4733     0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
   4734   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4735     0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
   4736   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4737     0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
   4738   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4739     0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
   4740   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4741     0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
   4742   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4743     0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
   4744   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4745     0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
   4746   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4747     0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
   4748   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4749     0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
   4750   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4751     0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
   4752   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4753     0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
   4754   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4755     0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   4756   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4757     0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   4758   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4759     0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4760   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4761     0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4762   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4763     0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4764   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4765     0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4766   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4767     0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4768   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4769     0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4770   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4771     0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, %{I:#%0-7W%}]"},
   4772   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4773     0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
   4774   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4775     0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
   4776   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4777     0xf810f000, 0xff70f000, "pld%c\t%a"},
   4778   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4779     0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4780   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4781     0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4782   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4783     0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4784   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4785     0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4786   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4787     0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
   4788   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4789     0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4790   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4791     0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
   4792   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4793     0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
   4794   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4795     0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
   4796   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4797     0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
   4798   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4799     0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
   4800   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4801     0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
   4802   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4803     0xfb100000, 0xfff000c0,
   4804     "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
   4805   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4806     0xfbc00080, 0xfff000c0,
   4807     "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
   4808   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4809     0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
   4810   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4811     0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
   4812   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4813     0xf3000000, 0xffd08020, "ssat%c\t%8-11r, %{I:#%0-4D%}, %16-19r%s"},
   4814   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4815     0xf3800000, 0xffd08020, "usat%c\t%8-11r, %{I:#%0-4d%}, %16-19r%s"},
   4816   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4817     0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
   4818   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4819     0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
   4820   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4821     0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
   4822   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4823     0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
   4824   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4825     0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
   4826   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4827     0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
   4828   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4829     0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
   4830   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4831     0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
   4832   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4833     0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
   4834   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4835     0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
   4836   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4837     0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
   4838   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4839     0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
   4840   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4841     0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
   4842   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4843     0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
   4844   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M),
   4845     0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, %{I:#%0-7W%}]"},
   4846   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4847     0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
   4848   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4849     0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
   4850   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4851     0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
   4852   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4853     0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
   4854   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4855     0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
   4856   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4857     0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
   4858   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4859     0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
   4860   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4861     0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
   4862   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4863     0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
   4864   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4865     0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
   4866   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4867     0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
   4868   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4869     0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
   4870   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4871     0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
   4872   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4873     0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
   4874   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4875     0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
   4876   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4877     0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
   4878   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4879     0xe9400000, 0xff500000,
   4880     "strd%c\t%12-15r, %8-11r, [%16-19r, %{I:#%23`-%0-7W%}]%21'!%L"},
   4881   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4882     0xe9500000, 0xff500000,
   4883     "ldrd%c\t%12-15r, %8-11r, [%16-19r, %{I:#%23`-%0-7W%}]%21'!%L"},
   4884   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4885     0xe8600000, 0xff700000,
   4886     "strd%c\t%12-15r, %8-11r, [%16-19r], %{I:#%23`-%0-7W%}%L"},
   4887   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4888     0xe8700000, 0xff700000,
   4889     "ldrd%c\t%12-15r, %8-11r, [%16-19r], %{I:#%23`-%0-7W%}%L"},
   4890   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4891     0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
   4892   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4893     0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
   4894 
   4895   /* Filter out Bcc with cond=E or F, which are used for other instructions.  */
   4896   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4897     0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
   4898   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4899     0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
   4900   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4901     0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
   4902   {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2),
   4903     0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
   4904 
   4905   /* These have been 32-bit since the invention of Thumb.  */
   4906   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4907      0xf000c000, 0xf800d001, "blx%c\t%B%x"},
   4908   {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T),
   4909      0xf000d000, 0xf800d000, "bl%c\t%B%x"},
   4910 
   4911   /* Fallback.  */
   4912   {ARM_FEATURE_CORE_LOW (ARM_EXT_V1),
   4913       0x00000000, 0x00000000, UNDEFINED_INSTRUCTION},
   4914   {ARM_FEATURE_CORE_LOW (0), 0, 0, 0}
   4915 };
   4916 
   4917 static const char *const arm_conditional[] =
   4918 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
   4919  "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
   4920 
   4921 static const char *const arm_shift[] =
   4922 {"lsl", "lsr", "asr", "ror"};
   4923 
   4924 typedef struct
   4925 {
   4926   const char *name;
   4927   const char *description;
   4928   const char *reg_names[16];
   4929 }
   4930 arm_regname;
   4931 
   4932 static const arm_regname regnames[] =
   4933 {
   4934   { "reg-names-raw", N_("Select raw register names"),
   4935     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
   4936   { "reg-names-gcc", N_("Select register names used by GCC"),
   4937     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   4938   { "reg-names-std", N_("Select register names used in ARM's ISA documentation"),
   4939     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp",  "lr",  "pc" }},
   4940   { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL} },
   4941   { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL} },
   4942   { "reg-names-apcs", N_("Select register names used in the APCS"),
   4943     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},
   4944   { "reg-names-atpcs", N_("Select register names used in the ATPCS"),
   4945     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},
   4946   { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"),
   4947     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }},
   4948   { "coproc<N>=(cde|generic)", N_("Enable CDE extensions for coprocessor N space"), { NULL } }
   4949 };
   4950 
   4951 static const char *const iwmmxt_wwnames[] =
   4952 {"b", "h", "w", "d"};
   4953 
   4954 static const char *const iwmmxt_wwssnames[] =
   4955 {"b", "bus", "bc", "bss",
   4956  "h", "hus", "hc", "hss",
   4957  "w", "wus", "wc", "wss",
   4958  "d", "dus", "dc", "dss"
   4959 };
   4960 
   4961 static const char *const iwmmxt_regnames[] =
   4962 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
   4963   "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
   4964 };
   4965 
   4966 static const char *const iwmmxt_cregnames[] =
   4967 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
   4968   "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
   4969 };
   4970 
   4971 static const char *const vec_condnames[] =
   4972 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le"
   4973 };
   4974 
   4975 static const char *const mve_predicatenames[] =
   4976 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "",
   4977   "eee", "ee", "eet", "e", "ett", "et", "ete"
   4978 };
   4979 
   4980 /* Names for 2-bit size field for mve vector isntructions.  */
   4981 static const char *const mve_vec_sizename[] =
   4982   { "8", "16", "32", "64"};
   4983 
   4984 /* Indicates whether we are processing a then predicate,
   4985    else predicate or none at all.  */
   4986 enum vpt_pred_state
   4987 {
   4988   PRED_NONE,
   4989   PRED_THEN,
   4990   PRED_ELSE
   4991 };
   4992 
   4993 /* Information used to process a vpt block and subsequent instructions.  */
   4994 struct vpt_block
   4995 {
   4996   /* Are we in a vpt block.  */
   4997   bool in_vpt_block;
   4998 
   4999   /* Next predicate state if in vpt block.  */
   5000   enum vpt_pred_state next_pred_state;
   5001 
   5002   /* Mask from vpt/vpst instruction.  */
   5003   long predicate_mask;
   5004 
   5005   /* Instruction number in vpt block.  */
   5006   long current_insn_num;
   5007 
   5008   /* Number of instructions in vpt block..   */
   5009   long num_pred_insn;
   5010 };
   5011 
   5012 static struct vpt_block vpt_block_state =
   5013 {
   5014   false,
   5015   PRED_NONE,
   5016   0,
   5017   0,
   5018   0
   5019 };
   5020 
   5021 /* Default to GCC register name set.  */
   5022 static unsigned int regname_selected = 1;
   5023 
   5024 #define NUM_ARM_OPTIONS   ARRAY_SIZE (regnames)
   5025 #define arm_regnames      regnames[regname_selected].reg_names
   5026 
   5027 static bool force_thumb = false;
   5028 static uint16_t cde_coprocs = 0;
   5029 
   5030 /* Current IT instruction state.  This contains the same state as the IT
   5031    bits in the CPSR.  */
   5032 static unsigned int ifthen_state;
   5033 /* IT state for the next instruction.  */
   5034 static unsigned int ifthen_next_state;
   5035 /* The address of the insn for which the IT state is valid.  */
   5036 static bfd_vma ifthen_address;
   5037 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
   5038 /* Indicates that the current Conditional state is unconditional or outside
   5039    an IT block.  */
   5040 #define COND_UNCOND 16
   5041 
   5042 
   5043 /* Functions.  */
   5045 /* Extract the predicate mask for a VPT or VPST instruction.
   5046    The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh).  */
   5047 
   5048 static long
   5049 mve_extract_pred_mask (long given)
   5050 {
   5051   return ((given & 0x00400000) >> 19) | ((given & 0xe000) >> 13);
   5052 }
   5053 
   5054 /* Return the number of instructions in a MVE predicate block.  */
   5055 static long
   5056 num_instructions_vpt_block (long given)
   5057 {
   5058   long mask = mve_extract_pred_mask (given);
   5059   if (mask == 0)
   5060     return 0;
   5061 
   5062   if (mask == 8)
   5063     return 1;
   5064 
   5065   if ((mask & 7) == 4)
   5066     return 2;
   5067 
   5068   if ((mask & 3) == 2)
   5069     return 3;
   5070 
   5071   if ((mask & 1) == 1)
   5072     return 4;
   5073 
   5074   return 0;
   5075 }
   5076 
   5077 static void
   5078 mark_outside_vpt_block (void)
   5079 {
   5080   vpt_block_state.in_vpt_block = false;
   5081   vpt_block_state.next_pred_state = PRED_NONE;
   5082   vpt_block_state.predicate_mask = 0;
   5083   vpt_block_state.current_insn_num = 0;
   5084   vpt_block_state.num_pred_insn = 0;
   5085 }
   5086 
   5087 static void
   5088 mark_inside_vpt_block (long given)
   5089 {
   5090   vpt_block_state.in_vpt_block = true;
   5091   vpt_block_state.next_pred_state = PRED_THEN;
   5092   vpt_block_state.predicate_mask = mve_extract_pred_mask (given);
   5093   vpt_block_state.current_insn_num = 0;
   5094   vpt_block_state.num_pred_insn = num_instructions_vpt_block (given);
   5095   assert (vpt_block_state.num_pred_insn >= 1);
   5096 }
   5097 
   5098 static enum vpt_pred_state
   5099 invert_next_predicate_state (enum vpt_pred_state astate)
   5100 {
   5101   if (astate == PRED_THEN)
   5102     return PRED_ELSE;
   5103   else if (astate == PRED_ELSE)
   5104     return PRED_THEN;
   5105   else
   5106     return PRED_NONE;
   5107 }
   5108 
   5109 static enum vpt_pred_state
   5110 update_next_predicate_state (void)
   5111 {
   5112   long pred_mask = vpt_block_state.predicate_mask;
   5113   long mask_for_insn = 0;
   5114 
   5115   switch (vpt_block_state.current_insn_num)
   5116     {
   5117     case 1:
   5118       mask_for_insn = 8;
   5119       break;
   5120 
   5121     case 2:
   5122       mask_for_insn = 4;
   5123       break;
   5124 
   5125     case 3:
   5126       mask_for_insn = 2;
   5127       break;
   5128 
   5129     case 4:
   5130       return PRED_NONE;
   5131     }
   5132 
   5133   if (pred_mask & mask_for_insn)
   5134     return invert_next_predicate_state (vpt_block_state.next_pred_state);
   5135   else
   5136     return vpt_block_state.next_pred_state;
   5137 }
   5138 
   5139 static void
   5140 update_vpt_block_state (void)
   5141 {
   5142   vpt_block_state.current_insn_num++;
   5143   if (vpt_block_state.current_insn_num == vpt_block_state.num_pred_insn)
   5144     {
   5145       /* No more instructions to process in vpt block.  */
   5146       mark_outside_vpt_block ();
   5147       return;
   5148     }
   5149 
   5150   vpt_block_state.next_pred_state = update_next_predicate_state ();
   5151 }
   5152 
   5153 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
   5154    Returns pointer to following character of the format string and
   5155    fills in *VALUEP and *WIDTHP with the extracted value and number of
   5156    bits extracted.  WIDTHP can be NULL.  */
   5157 
   5158 static const char *
   5159 arm_decode_bitfield (const char *ptr,
   5160 		     unsigned long insn,
   5161 		     unsigned long *valuep,
   5162 		     int *widthp)
   5163 {
   5164   unsigned long value = 0;
   5165   int width = 0;
   5166 
   5167   do
   5168     {
   5169       int start, end;
   5170       int bits;
   5171 
   5172       for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
   5173 	start = start * 10 + *ptr - '0';
   5174       if (*ptr == '-')
   5175 	for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
   5176 	  end = end * 10 + *ptr - '0';
   5177       else
   5178 	end = start;
   5179       bits = end - start;
   5180       if (bits < 0)
   5181 	abort ();
   5182       value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
   5183       width += bits + 1;
   5184     }
   5185   while (*ptr++ == ',');
   5186   *valuep = value;
   5187   if (widthp)
   5188     *widthp = width;
   5189   return ptr - 1;
   5190 }
   5191 
   5192 static void
   5193 arm_decode_shift (long given, fprintf_styled_ftype func, void *stream,
   5194 		  bool print_shift)
   5195 {
   5196   func (stream, dis_style_register, "%s", arm_regnames[given & 0xf]);
   5197 
   5198   if ((given & 0xff0) != 0)
   5199     {
   5200       if ((given & 0x10) == 0)
   5201 	{
   5202 	  int amount = (given & 0xf80) >> 7;
   5203 	  int shift = (given & 0x60) >> 5;
   5204 
   5205 	  if (amount == 0)
   5206 	    {
   5207 	      if (shift == 3)
   5208 		{
   5209 		  func (stream, dis_style_text, ", ");
   5210 		  func (stream, dis_style_sub_mnemonic, "rrx");
   5211 		  return;
   5212 		}
   5213 
   5214 	      amount = 32;
   5215 	    }
   5216 
   5217 	  if (print_shift)
   5218 	    {
   5219 	      func (stream, dis_style_text, ", ");
   5220 	      func (stream, dis_style_sub_mnemonic, "%s ", arm_shift[shift]);
   5221 	      func (stream, dis_style_immediate, "#%d", amount);
   5222 	    }
   5223 	  else
   5224 	    {
   5225 	      func (stream, dis_style_text, ", ");
   5226 	      func (stream, dis_style_immediate, "#%d", amount);
   5227 	    }
   5228 	}
   5229       else if ((given & 0x80) == 0x80)
   5230 	func (stream, dis_style_comment_start,
   5231 	      "\t@ <illegal shifter operand>");
   5232       else if (print_shift)
   5233 	{
   5234 	  func (stream, dis_style_text, ", ");
   5235 	  func (stream, dis_style_sub_mnemonic, "%s ",
   5236 		arm_shift[(given & 0x60) >> 5]);
   5237 	  func (stream, dis_style_register, "%s",
   5238 		arm_regnames[(given & 0xf00) >> 8]);
   5239 	}
   5240       else
   5241 	{
   5242 	  func (stream, dis_style_text, ", ");
   5243 	  func (stream, dis_style_register, "%s",
   5244 		arm_regnames[(given & 0xf00) >> 8]);
   5245 	}
   5246     }
   5247 }
   5248 
   5249 /* Return TRUE if the MATCHED_INSN can be inside an IT block.  */
   5250 
   5251 static bool
   5252 is_mve_okay_in_it (enum mve_instructions matched_insn)
   5253 {
   5254   switch (matched_insn)
   5255     {
   5256     case MVE_VMOV_GP_TO_VEC_LANE:
   5257     case MVE_VMOV2_VEC_LANE_TO_GP:
   5258     case MVE_VMOV2_GP_TO_VEC_LANE:
   5259     case MVE_VMOV_VEC_LANE_TO_GP:
   5260     case MVE_LSLL:
   5261     case MVE_LSLLI:
   5262     case MVE_LSRL:
   5263     case MVE_ASRL:
   5264     case MVE_ASRLI:
   5265     case MVE_SQRSHRL:
   5266     case MVE_SQRSHR:
   5267     case MVE_UQRSHL:
   5268     case MVE_UQRSHLL:
   5269     case MVE_UQSHL:
   5270     case MVE_UQSHLL:
   5271     case MVE_URSHRL:
   5272     case MVE_URSHR:
   5273     case MVE_SRSHRL:
   5274     case MVE_SRSHR:
   5275     case MVE_SQSHLL:
   5276     case MVE_SQSHL:
   5277       return true;
   5278     default:
   5279       return false;
   5280     }
   5281 }
   5282 
   5283 static bool
   5284 is_v81m_architecture (struct disassemble_info *info)
   5285 {
   5286   struct arm_private_data *private_data = info->private_data;
   5287   arm_feature_set allowed_arches = private_data->features;
   5288 
   5289   arm_feature_set arm_ext_v8_1m_main
   5290     = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
   5291 
   5292   if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
   5293       && !ARM_CPU_IS_ANY (allowed_arches))
   5294     return true;
   5295   else
   5296     return false;
   5297 }
   5298 
   5299 static bool
   5300 is_vpt_instruction (long given)
   5301 {
   5302 
   5303   /* If mkh:mkl is '0000' then its not a vpt/vpst instruction.  */
   5304   if ((given & 0x0040e000) == 0)
   5305     return false;
   5306 
   5307   /* VPT floating point T1 variant.  */
   5308   if (((given & 0xefb10f50) == 0xee310f00 && ((given & 0x1001) != 0x1))
   5309   /* VPT floating point T2 variant.  */
   5310       || ((given & 0xefb10f50) == 0xee310f40)
   5311   /* VPT vector T1 variant.  */
   5312       || ((given & 0xff811f51) == 0xfe010f00)
   5313   /* VPT vector T2 variant.  */
   5314       || ((given & 0xff811f51) == 0xfe010f01
   5315 	  && ((given & 0x300000) != 0x300000))
   5316   /* VPT vector T3 variant.  */
   5317       || ((given & 0xff811f50) == 0xfe011f00)
   5318   /* VPT vector T4 variant.  */
   5319       || ((given & 0xff811f70) == 0xfe010f40)
   5320   /* VPT vector T5 variant.  */
   5321       || ((given & 0xff811f70) == 0xfe010f60)
   5322   /* VPT vector T6 variant.  */
   5323       || ((given & 0xff811f50) == 0xfe011f40)
   5324   /* VPST vector T variant.  */
   5325       || ((given & 0xffbf1fff) == 0xfe310f4d))
   5326     return true;
   5327   else
   5328     return false;
   5329 }
   5330 
   5331 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START
   5332    and ending bitfield = END.  END must be greater than START.  */
   5333 
   5334 static unsigned long
   5335 arm_decode_field (unsigned long given, unsigned int start, unsigned int end)
   5336 {
   5337   int bits = end - start;
   5338 
   5339   if (bits < 0)
   5340     abort ();
   5341 
   5342   return ((given >> start) & ((2ul << bits) - 1));
   5343 }
   5344 
   5345 /* Decode a bitfield from opcode GIVEN, with multiple bitfields:
   5346    START:END and START2:END2.  END/END2 must be greater than
   5347    START/START2.  */
   5348 
   5349 static unsigned long
   5350 arm_decode_field_multiple (unsigned long given, unsigned int start,
   5351 			   unsigned int end, unsigned int start2,
   5352 			   unsigned int end2)
   5353 {
   5354   int bits = end - start;
   5355   int bits2 = end2 - start2;
   5356   unsigned long value = 0;
   5357   int width = 0;
   5358 
   5359   if (bits2 < 0)
   5360     abort ();
   5361 
   5362   value = arm_decode_field (given, start, end);
   5363   width += bits + 1;
   5364 
   5365   value |= ((given >> start2) & ((2ul << bits2) - 1)) << width;
   5366   return value;
   5367 }
   5368 
   5369 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN.
   5370    This helps us decode instructions that change mnemonic depending on specific
   5371    operand values/encodings.  */
   5372 
   5373 static bool
   5374 is_mve_encoding_conflict (unsigned long given,
   5375 			  enum mve_instructions matched_insn)
   5376 {
   5377   switch (matched_insn)
   5378     {
   5379     case MVE_VPST:
   5380       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
   5381 	return true;
   5382       else
   5383 	return false;
   5384 
   5385     case MVE_VPT_FP_T1:
   5386       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
   5387 	return true;
   5388       if ((arm_decode_field (given, 12, 12) == 0)
   5389 	  && (arm_decode_field (given, 0, 0) == 1))
   5390 	return true;
   5391       return false;
   5392 
   5393     case MVE_VPT_FP_T2:
   5394       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
   5395 	return true;
   5396       if (arm_decode_field (given, 0, 3) == 0xd)
   5397 	return true;
   5398       return false;
   5399 
   5400     case MVE_VPT_VEC_T1:
   5401     case MVE_VPT_VEC_T2:
   5402     case MVE_VPT_VEC_T3:
   5403     case MVE_VPT_VEC_T4:
   5404     case MVE_VPT_VEC_T5:
   5405     case MVE_VPT_VEC_T6:
   5406       if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0)
   5407 	return true;
   5408       if (arm_decode_field (given, 20, 21) == 3)
   5409 	return true;
   5410       return false;
   5411 
   5412     case MVE_VCMP_FP_T1:
   5413       if ((arm_decode_field (given, 12, 12) == 0)
   5414 	  && (arm_decode_field (given, 0, 0) == 1))
   5415 	return true;
   5416       else
   5417 	return false;
   5418 
   5419     case MVE_VCMP_FP_T2:
   5420       if (arm_decode_field (given, 0, 3) == 0xd)
   5421 	return true;
   5422       else
   5423 	return false;
   5424 
   5425     case MVE_VQADD_T2:
   5426     case MVE_VQSUB_T2:
   5427     case MVE_VMUL_VEC_T2:
   5428     case MVE_VMULH:
   5429     case MVE_VRMULH:
   5430     case MVE_VMLA:
   5431     case MVE_VMAX:
   5432     case MVE_VMIN:
   5433     case MVE_VBRSR:
   5434     case MVE_VADD_VEC_T2:
   5435     case MVE_VSUB_VEC_T2:
   5436     case MVE_VABAV:
   5437     case MVE_VQRSHL_T1:
   5438     case MVE_VQSHL_T4:
   5439     case MVE_VRSHL_T1:
   5440     case MVE_VSHL_T3:
   5441     case MVE_VCADD_VEC:
   5442     case MVE_VHCADD:
   5443     case MVE_VDDUP:
   5444     case MVE_VIDUP:
   5445     case MVE_VQRDMLADH:
   5446     case MVE_VQDMLAH:
   5447     case MVE_VQRDMLAH:
   5448     case MVE_VQDMLASH:
   5449     case MVE_VQRDMLASH:
   5450     case MVE_VQDMLSDH:
   5451     case MVE_VQRDMLSDH:
   5452     case MVE_VQDMULH_T3:
   5453     case MVE_VQRDMULH_T4:
   5454     case MVE_VQDMLADH:
   5455     case MVE_VMLAS:
   5456     case MVE_VMULL_INT:
   5457     case MVE_VHADD_T2:
   5458     case MVE_VHSUB_T2:
   5459     case MVE_VCMP_VEC_T1:
   5460     case MVE_VCMP_VEC_T2:
   5461     case MVE_VCMP_VEC_T3:
   5462     case MVE_VCMP_VEC_T4:
   5463     case MVE_VCMP_VEC_T5:
   5464     case MVE_VCMP_VEC_T6:
   5465       if (arm_decode_field (given, 20, 21) == 3)
   5466 	return true;
   5467       else
   5468 	return false;
   5469 
   5470     case MVE_VLD2:
   5471     case MVE_VLD4:
   5472     case MVE_VST2:
   5473     case MVE_VST4:
   5474       if (arm_decode_field (given, 7, 8) == 3)
   5475 	return true;
   5476       else
   5477 	return false;
   5478 
   5479     case MVE_VSTRB_T1:
   5480     case MVE_VSTRH_T2:
   5481       if ((arm_decode_field (given, 24, 24) == 0)
   5482 	  && (arm_decode_field (given, 21, 21) == 0))
   5483 	{
   5484 	    return true;
   5485 	}
   5486       else if ((arm_decode_field (given, 7, 8) == 3))
   5487 	return true;
   5488       else
   5489 	return false;
   5490 
   5491     case MVE_VLDRB_T1:
   5492     case MVE_VLDRH_T2:
   5493     case MVE_VLDRW_T7:
   5494     case MVE_VSTRB_T5:
   5495     case MVE_VSTRH_T6:
   5496     case MVE_VSTRW_T7:
   5497       if ((arm_decode_field (given, 24, 24) == 0)
   5498 	  && (arm_decode_field (given, 21, 21) == 0))
   5499 	{
   5500 	    return true;
   5501 	}
   5502       else
   5503 	return false;
   5504 
   5505     case MVE_VCVT_FP_FIX_VEC:
   5506       return (arm_decode_field (given, 16, 21) & 0x38) == 0;
   5507 
   5508     case MVE_VBIC_IMM:
   5509     case MVE_VORR_IMM:
   5510       {
   5511 	unsigned long cmode = arm_decode_field (given, 8, 11);
   5512 
   5513 	if ((cmode & 1) == 0)
   5514 	  return true;
   5515 	else if ((cmode & 0xc) == 0xc)
   5516 	  return true;
   5517 	else
   5518 	  return false;
   5519       }
   5520 
   5521     case MVE_VMVN_IMM:
   5522       {
   5523 	unsigned long cmode = arm_decode_field (given, 8, 11);
   5524 
   5525 	if (cmode == 0xe)
   5526 	  return true;
   5527 	else if ((cmode & 0x9) == 1)
   5528 	  return true;
   5529 	else if ((cmode & 0xd) == 9)
   5530 	  return true;
   5531 	else
   5532 	  return false;
   5533       }
   5534 
   5535     case MVE_VMOV_IMM_TO_VEC:
   5536       if ((arm_decode_field (given, 5, 5) == 1)
   5537 	  && (arm_decode_field (given, 8, 11) != 0xe))
   5538 	return true;
   5539       else
   5540 	return false;
   5541 
   5542     case MVE_VMOVL:
   5543       {
   5544 	unsigned long size = arm_decode_field (given, 19, 20);
   5545 	if ((size == 0) || (size == 3))
   5546 	  return true;
   5547 	else
   5548 	  return false;
   5549       }
   5550 
   5551     case MVE_VMAXA:
   5552     case MVE_VMINA:
   5553     case MVE_VMAXV:
   5554     case MVE_VMAXAV:
   5555     case MVE_VMINV:
   5556     case MVE_VMINAV:
   5557     case MVE_VQRSHL_T2:
   5558     case MVE_VQSHL_T1:
   5559     case MVE_VRSHL_T2:
   5560     case MVE_VSHL_T2:
   5561     case MVE_VSHLL_T2:
   5562     case MVE_VADDV:
   5563     case MVE_VMOVN:
   5564     case MVE_VQMOVUN:
   5565     case MVE_VQMOVN:
   5566       if (arm_decode_field (given, 18, 19) == 3)
   5567 	return true;
   5568       else
   5569 	return false;
   5570 
   5571     case MVE_VMLSLDAV:
   5572     case MVE_VRMLSLDAVH:
   5573     case MVE_VMLALDAV:
   5574     case MVE_VADDLV:
   5575       if (arm_decode_field (given, 20, 22) == 7)
   5576 	return true;
   5577       else
   5578 	return false;
   5579 
   5580     case MVE_VRMLALDAVH:
   5581       if ((arm_decode_field (given, 20, 22) & 6) == 6)
   5582 	return true;
   5583       else
   5584 	return false;
   5585 
   5586     case MVE_VDWDUP:
   5587     case MVE_VIWDUP:
   5588       if ((arm_decode_field (given, 20, 21) == 3)
   5589 	  || (arm_decode_field (given, 1, 3) == 7))
   5590 	return true;
   5591       else
   5592 	return false;
   5593 
   5594 
   5595     case MVE_VSHLL_T1:
   5596       if (arm_decode_field (given, 16, 18) == 0)
   5597 	{
   5598 	  unsigned long sz = arm_decode_field (given, 19, 20);
   5599 
   5600 	  if ((sz == 1) || (sz == 2))
   5601 	    return true;
   5602 	  else
   5603 	    return false;
   5604 	}
   5605       else
   5606 	return false;
   5607 
   5608     case MVE_VQSHL_T2:
   5609     case MVE_VQSHLU_T3:
   5610     case MVE_VRSHR:
   5611     case MVE_VSHL_T1:
   5612     case MVE_VSHR:
   5613     case MVE_VSLI:
   5614     case MVE_VSRI:
   5615       if (arm_decode_field (given, 19, 21) == 0)
   5616 	return true;
   5617       else
   5618 	return false;
   5619 
   5620     case MVE_VCTP:
   5621     if (arm_decode_field (given, 16, 19) == 0xf)
   5622       return true;
   5623     else
   5624       return false;
   5625 
   5626     case MVE_ASRLI:
   5627     case MVE_ASRL:
   5628     case MVE_LSLLI:
   5629     case MVE_LSLL:
   5630     case MVE_LSRL:
   5631     case MVE_SQRSHRL:
   5632     case MVE_SQSHLL:
   5633     case MVE_SRSHRL:
   5634     case MVE_UQRSHLL:
   5635     case MVE_UQSHLL:
   5636     case MVE_URSHRL:
   5637       if (arm_decode_field (given, 9, 11) == 0x7)
   5638 	return true;
   5639       else
   5640 	return false;
   5641 
   5642     case MVE_CSINC:
   5643     case MVE_CSINV:
   5644       {
   5645 	unsigned long rm, rn;
   5646 	rm = arm_decode_field (given, 0, 3);
   5647 	rn = arm_decode_field (given, 16, 19);
   5648 	/* CSET/CSETM.  */
   5649 	if (rm == 0xf && rn == 0xf)
   5650 	  return true;
   5651 	/* CINC/CINV.  */
   5652 	else if (rn == rm && rn != 0xf)
   5653 	  return true;
   5654       }
   5655     /* Fall through.  */
   5656     case MVE_CSEL:
   5657     case MVE_CSNEG:
   5658       if (arm_decode_field (given, 0, 3) == 0xd)
   5659 	return true;
   5660       /* CNEG.  */
   5661       else if (matched_insn == MVE_CSNEG)
   5662 	if (arm_decode_field (given, 0, 3) == arm_decode_field (given, 16, 19))
   5663 	  return true;
   5664       return false;
   5665 
   5666     default:
   5667     case MVE_VADD_FP_T1:
   5668     case MVE_VADD_FP_T2:
   5669     case MVE_VADD_VEC_T1:
   5670       return false;
   5671 
   5672     }
   5673 }
   5674 
   5675 static void
   5676 print_mve_vld_str_addr (struct disassemble_info *info,
   5677 			unsigned long given,
   5678 			enum mve_instructions matched_insn)
   5679 {
   5680   void *stream = info->stream;
   5681   fprintf_styled_ftype func = info->fprintf_styled_func;
   5682 
   5683   unsigned long p, w, gpr, imm, add, mod_imm;
   5684 
   5685   imm = arm_decode_field (given, 0, 6);
   5686   mod_imm = imm;
   5687 
   5688   switch (matched_insn)
   5689     {
   5690     case MVE_VLDRB_T1:
   5691     case MVE_VSTRB_T1:
   5692       gpr = arm_decode_field (given, 16, 18);
   5693       break;
   5694 
   5695     case MVE_VLDRH_T2:
   5696     case MVE_VSTRH_T2:
   5697       gpr = arm_decode_field (given, 16, 18);
   5698       mod_imm = imm << 1;
   5699       break;
   5700 
   5701     case MVE_VLDRH_T6:
   5702     case MVE_VSTRH_T6:
   5703       gpr = arm_decode_field (given, 16, 19);
   5704       mod_imm = imm << 1;
   5705       break;
   5706 
   5707     case MVE_VLDRW_T7:
   5708     case MVE_VSTRW_T7:
   5709       gpr = arm_decode_field (given, 16, 19);
   5710       mod_imm = imm << 2;
   5711       break;
   5712 
   5713     case MVE_VLDRB_T5:
   5714     case MVE_VSTRB_T5:
   5715       gpr = arm_decode_field (given, 16, 19);
   5716       break;
   5717 
   5718     default:
   5719       return;
   5720     }
   5721 
   5722   p = arm_decode_field (given, 24, 24);
   5723   w = arm_decode_field (given, 21, 21);
   5724 
   5725   add = arm_decode_field (given, 23, 23);
   5726 
   5727   char * add_sub;
   5728 
   5729   /* Don't print anything for '+' as it is implied.  */
   5730   if (add == 1)
   5731     add_sub = "";
   5732   else
   5733     add_sub = "-";
   5734 
   5735   func (stream, dis_style_text, "[");
   5736   func (stream, dis_style_register, "%s", arm_regnames[gpr]);
   5737   if (p == 1)
   5738     {
   5739       func (stream, dis_style_text, ", ");
   5740       func (stream, dis_style_immediate, "#%s%lu", add_sub, mod_imm);
   5741       /* Offset mode.  */
   5742       if (w == 0)
   5743 	func (stream, dis_style_text, "]");
   5744       /* Pre-indexed mode.  */
   5745       else
   5746 	func (stream, dis_style_text, "]!");
   5747     }
   5748   else if ((p == 0) && (w == 1))
   5749     {
   5750       /* Post-index mode.  */
   5751       func (stream, dis_style_text, "], ");
   5752       func (stream, dis_style_immediate, "#%s%lu", add_sub, mod_imm);
   5753     }
   5754 }
   5755 
   5756 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN.
   5757    Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why
   5758    this encoding is undefined.  */
   5759 
   5760 static bool
   5761 is_mve_undefined (unsigned long given, enum mve_instructions matched_insn,
   5762 		  enum mve_undefined *undefined_code)
   5763 {
   5764   *undefined_code = UNDEF_NONE;
   5765 
   5766   switch (matched_insn)
   5767     {
   5768     case MVE_VDUP:
   5769       if (arm_decode_field_multiple (given, 5, 5, 22, 22) == 3)
   5770 	{
   5771 	  *undefined_code = UNDEF_SIZE_3;
   5772 	  return true;
   5773 	}
   5774       else
   5775 	return false;
   5776 
   5777     case MVE_VQADD_T1:
   5778     case MVE_VQSUB_T1:
   5779     case MVE_VMUL_VEC_T1:
   5780     case MVE_VABD_VEC:
   5781     case MVE_VADD_VEC_T1:
   5782     case MVE_VSUB_VEC_T1:
   5783     case MVE_VQDMULH_T1:
   5784     case MVE_VQRDMULH_T2:
   5785     case MVE_VRHADD:
   5786     case MVE_VHADD_T1:
   5787     case MVE_VHSUB_T1:
   5788       if (arm_decode_field (given, 20, 21) == 3)
   5789 	{
   5790 	  *undefined_code = UNDEF_SIZE_3;
   5791 	  return true;
   5792 	}
   5793       else
   5794 	return false;
   5795 
   5796     case MVE_VLDRB_T1:
   5797       if (arm_decode_field (given, 7, 8) == 3)
   5798 	{
   5799 	  *undefined_code = UNDEF_SIZE_3;
   5800 	  return true;
   5801 	}
   5802       else
   5803 	return false;
   5804 
   5805     case MVE_VLDRH_T2:
   5806       if (arm_decode_field (given, 7, 8) <= 1)
   5807 	{
   5808 	  *undefined_code = UNDEF_SIZE_LE_1;
   5809 	  return true;
   5810 	}
   5811       else
   5812 	return false;
   5813 
   5814     case MVE_VSTRB_T1:
   5815       if ((arm_decode_field (given, 7, 8) == 0))
   5816 	{
   5817 	  *undefined_code = UNDEF_SIZE_0;
   5818 	  return true;
   5819 	}
   5820       else
   5821 	return false;
   5822 
   5823     case MVE_VSTRH_T2:
   5824       if ((arm_decode_field (given, 7, 8) <= 1))
   5825 	{
   5826 	  *undefined_code = UNDEF_SIZE_LE_1;
   5827 	  return true;
   5828 	}
   5829       else
   5830 	return false;
   5831 
   5832     case MVE_VLDRB_GATHER_T1:
   5833       if (arm_decode_field (given, 7, 8) == 3)
   5834 	{
   5835 	  *undefined_code = UNDEF_SIZE_3;
   5836 	  return true;
   5837 	}
   5838       else if ((arm_decode_field (given, 28, 28) == 0)
   5839 	       && (arm_decode_field (given, 7, 8) == 0))
   5840 	{
   5841 	  *undefined_code = UNDEF_NOT_UNS_SIZE_0;
   5842 	  return true;
   5843 	}
   5844       else
   5845 	return false;
   5846 
   5847     case MVE_VLDRH_GATHER_T2:
   5848       if (arm_decode_field (given, 7, 8) == 3)
   5849 	{
   5850 	  *undefined_code = UNDEF_SIZE_3;
   5851 	  return true;
   5852 	}
   5853       else if ((arm_decode_field (given, 28, 28) == 0)
   5854 	       && (arm_decode_field (given, 7, 8) == 1))
   5855 	{
   5856 	  *undefined_code = UNDEF_NOT_UNS_SIZE_1;
   5857 	  return true;
   5858 	}
   5859       else if (arm_decode_field (given, 7, 8) == 0)
   5860 	{
   5861 	  *undefined_code = UNDEF_SIZE_0;
   5862 	  return true;
   5863 	}
   5864       else
   5865 	return false;
   5866 
   5867     case MVE_VLDRW_GATHER_T3:
   5868       if (arm_decode_field (given, 7, 8) != 2)
   5869 	{
   5870 	  *undefined_code = UNDEF_SIZE_NOT_2;
   5871 	  return true;
   5872 	}
   5873       else if (arm_decode_field (given, 28, 28) == 0)
   5874 	{
   5875 	  *undefined_code = UNDEF_NOT_UNSIGNED;
   5876 	  return true;
   5877 	}
   5878       else
   5879 	return false;
   5880 
   5881     case MVE_VLDRD_GATHER_T4:
   5882       if (arm_decode_field (given, 7, 8) != 3)
   5883 	{
   5884 	  *undefined_code = UNDEF_SIZE_NOT_3;
   5885 	  return true;
   5886 	}
   5887       else if (arm_decode_field (given, 28, 28) == 0)
   5888 	{
   5889 	  *undefined_code = UNDEF_NOT_UNSIGNED;
   5890 	  return true;
   5891 	}
   5892       else
   5893 	return false;
   5894 
   5895     case MVE_VSTRB_SCATTER_T1:
   5896       if (arm_decode_field (given, 7, 8) == 3)
   5897 	{
   5898 	  *undefined_code = UNDEF_SIZE_3;
   5899 	  return true;
   5900 	}
   5901       else
   5902 	return false;
   5903 
   5904     case MVE_VSTRH_SCATTER_T2:
   5905       {
   5906 	unsigned long size = arm_decode_field (given, 7, 8);
   5907 	if (size == 3)
   5908 	  {
   5909 	    *undefined_code = UNDEF_SIZE_3;
   5910 	    return true;
   5911 	  }
   5912 	else if (size == 0)
   5913 	  {
   5914 	    *undefined_code = UNDEF_SIZE_0;
   5915 	    return true;
   5916 	  }
   5917 	else
   5918 	  return false;
   5919       }
   5920 
   5921     case MVE_VSTRW_SCATTER_T3:
   5922       if (arm_decode_field (given, 7, 8) != 2)
   5923 	{
   5924 	  *undefined_code = UNDEF_SIZE_NOT_2;
   5925 	  return true;
   5926 	}
   5927       else
   5928 	return false;
   5929 
   5930     case MVE_VSTRD_SCATTER_T4:
   5931       if (arm_decode_field (given, 7, 8) != 3)
   5932 	{
   5933 	  *undefined_code = UNDEF_SIZE_NOT_3;
   5934 	  return true;
   5935 	}
   5936       else
   5937 	return false;
   5938 
   5939     case MVE_VCVT_FP_FIX_VEC:
   5940       {
   5941 	unsigned long imm6 = arm_decode_field (given, 16, 21);
   5942 	if ((imm6 & 0x20) == 0)
   5943 	  {
   5944 	    *undefined_code = UNDEF_VCVT_IMM6;
   5945 	    return true;
   5946 	  }
   5947 
   5948 	if ((arm_decode_field (given, 9, 9) == 0)
   5949 	    && ((imm6 & 0x30) == 0x20))
   5950 	  {
   5951 	    *undefined_code = UNDEF_VCVT_FSI_IMM6;
   5952 	    return true;
   5953 	  }
   5954 
   5955 	return false;
   5956       }
   5957 
   5958     case MVE_VNEG_FP:
   5959     case MVE_VABS_FP:
   5960     case MVE_VCVT_BETWEEN_FP_INT:
   5961     case MVE_VCVT_FROM_FP_TO_INT:
   5962       {
   5963 	unsigned long size = arm_decode_field (given, 18, 19);
   5964 	if (size == 0)
   5965 	  {
   5966 	    *undefined_code = UNDEF_SIZE_0;
   5967 	    return true;
   5968 	  }
   5969 	else if (size == 3)
   5970 	  {
   5971 	    *undefined_code = UNDEF_SIZE_3;
   5972 	    return true;
   5973 	  }
   5974 	else
   5975 	  return false;
   5976       }
   5977 
   5978     case MVE_VMOV_VEC_LANE_TO_GP:
   5979       {
   5980 	unsigned long op1 = arm_decode_field (given, 21, 22);
   5981 	unsigned long op2 = arm_decode_field (given, 5, 6);
   5982 	unsigned long u = arm_decode_field (given, 23, 23);
   5983 
   5984 	if ((op2 == 0) && (u == 1))
   5985 	  {
   5986 	    if ((op1 == 0) || (op1 == 1))
   5987 	      {
   5988 		*undefined_code = UNDEF_BAD_U_OP1_OP2;
   5989 		return true;
   5990 	      }
   5991 	    else
   5992 	      return false;
   5993 	  }
   5994 	else if (op2 == 2)
   5995 	  {
   5996 	    if ((op1 == 0) || (op1 == 1))
   5997 	      {
   5998 		*undefined_code = UNDEF_BAD_OP1_OP2;
   5999 		return true;
   6000 	      }
   6001 	    else
   6002 	      return false;
   6003 	  }
   6004 
   6005 	return false;
   6006       }
   6007 
   6008     case MVE_VMOV_GP_TO_VEC_LANE:
   6009       if (arm_decode_field (given, 5, 6) == 2)
   6010 	{
   6011 	  unsigned long op1 = arm_decode_field (given, 21, 22);
   6012 	  if ((op1 == 0) || (op1 == 1))
   6013 	    {
   6014 	      *undefined_code = UNDEF_BAD_OP1_OP2;
   6015 	      return true;
   6016 	    }
   6017 	  else
   6018 	    return false;
   6019 	}
   6020       else
   6021 	return false;
   6022 
   6023     case MVE_VMOV_VEC_TO_VEC:
   6024       if ((arm_decode_field (given, 5, 5) == 1)
   6025 	  || (arm_decode_field (given, 22, 22) == 1))
   6026 	  return true;
   6027       return false;
   6028 
   6029     case MVE_VMOV_IMM_TO_VEC:
   6030       if (arm_decode_field (given, 5, 5) == 0)
   6031       {
   6032 	unsigned long cmode = arm_decode_field (given, 8, 11);
   6033 
   6034 	if (((cmode & 9) == 1) || ((cmode & 5) == 1))
   6035 	  {
   6036 	    *undefined_code = UNDEF_OP_0_BAD_CMODE;
   6037 	    return true;
   6038 	  }
   6039 	else
   6040 	  return false;
   6041       }
   6042       else
   6043 	return false;
   6044 
   6045     case MVE_VSHLL_T2:
   6046     case MVE_VMOVN:
   6047       if (arm_decode_field (given, 18, 19) == 2)
   6048 	{
   6049 	  *undefined_code = UNDEF_SIZE_2;
   6050 	  return true;
   6051 	}
   6052       else
   6053 	return false;
   6054 
   6055     case MVE_VRMLALDAVH:
   6056     case MVE_VMLADAV_T1:
   6057     case MVE_VMLADAV_T2:
   6058     case MVE_VMLALDAV:
   6059       if ((arm_decode_field (given, 28, 28) == 1)
   6060 	  && (arm_decode_field (given, 12, 12) == 1))
   6061 	{
   6062 	  *undefined_code = UNDEF_XCHG_UNS;
   6063 	  return true;
   6064 	}
   6065       else
   6066 	return false;
   6067 
   6068     case MVE_VQSHRN:
   6069     case MVE_VQSHRUN:
   6070     case MVE_VSHLL_T1:
   6071     case MVE_VSHRN:
   6072       {
   6073 	unsigned long sz = arm_decode_field (given, 19, 20);
   6074 	if (sz == 1)
   6075 	  return false;
   6076 	else if ((sz & 2) == 2)
   6077 	  return false;
   6078 	else
   6079 	  {
   6080 	    *undefined_code = UNDEF_SIZE;
   6081 	    return true;
   6082 	  }
   6083       }
   6084       break;
   6085 
   6086     case MVE_VQSHL_T2:
   6087     case MVE_VQSHLU_T3:
   6088     case MVE_VRSHR:
   6089     case MVE_VSHL_T1:
   6090     case MVE_VSHR:
   6091     case MVE_VSLI:
   6092     case MVE_VSRI:
   6093       {
   6094 	unsigned long sz = arm_decode_field (given, 19, 21);
   6095 	if ((sz & 7) == 1)
   6096 	  return false;
   6097 	else if ((sz & 6) == 2)
   6098 	  return false;
   6099 	else if ((sz & 4) == 4)
   6100 	  return false;
   6101 	else
   6102 	  {
   6103 	    *undefined_code = UNDEF_SIZE;
   6104 	    return true;
   6105 	  }
   6106       }
   6107 
   6108     case MVE_VQRSHRN:
   6109     case MVE_VQRSHRUN:
   6110       if (arm_decode_field (given, 19, 20) == 0)
   6111 	{
   6112 	  *undefined_code = UNDEF_SIZE_0;
   6113 	  return true;
   6114 	}
   6115       else
   6116 	return false;
   6117 
   6118     case MVE_VABS_VEC:
   6119 	if (arm_decode_field (given, 18, 19) == 3)
   6120 	{
   6121 	  *undefined_code = UNDEF_SIZE_3;
   6122 	  return true;
   6123 	}
   6124 	else
   6125 	  return false;
   6126 
   6127     case MVE_VQNEG:
   6128     case MVE_VQABS:
   6129     case MVE_VNEG_VEC:
   6130     case MVE_VCLS:
   6131     case MVE_VCLZ:
   6132       if (arm_decode_field (given, 18, 19) == 3)
   6133 	{
   6134 	  *undefined_code = UNDEF_SIZE_3;
   6135 	  return true;
   6136 	}
   6137       else
   6138 	return false;
   6139 
   6140     case MVE_VREV16:
   6141       if (arm_decode_field (given, 18, 19) == 0)
   6142 	return false;
   6143       else
   6144 	{
   6145 	  *undefined_code = UNDEF_SIZE_NOT_0;
   6146 	  return true;
   6147 	}
   6148 
   6149     case MVE_VREV32:
   6150       {
   6151 	unsigned long size = arm_decode_field (given, 18, 19);
   6152 	if ((size & 2) == 2)
   6153 	  {
   6154 	    *undefined_code = UNDEF_SIZE_2;
   6155 	    return true;
   6156 	  }
   6157 	else
   6158 	  return false;
   6159       }
   6160 
   6161     case MVE_VREV64:
   6162       if (arm_decode_field (given, 18, 19) != 3)
   6163 	return false;
   6164       else
   6165 	{
   6166 	  *undefined_code = UNDEF_SIZE_3;
   6167 	  return true;
   6168 	}
   6169 
   6170     default:
   6171       return false;
   6172     }
   6173 }
   6174 
   6175 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN.
   6176    Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to
   6177    why this encoding is unpredictable.  */
   6178 
   6179 static bool
   6180 is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn,
   6181 		      enum mve_unpredictable *unpredictable_code)
   6182 {
   6183   *unpredictable_code = UNPRED_NONE;
   6184 
   6185   switch (matched_insn)
   6186     {
   6187     case MVE_VCMP_FP_T2:
   6188     case MVE_VPT_FP_T2:
   6189       if ((arm_decode_field (given, 12, 12) == 0)
   6190 	  && (arm_decode_field (given, 5, 5) == 1))
   6191 	{
   6192 	  *unpredictable_code = UNPRED_FCA_0_FCB_1;
   6193 	  return true;
   6194 	}
   6195       else
   6196 	return false;
   6197 
   6198     case MVE_VPT_VEC_T4:
   6199     case MVE_VPT_VEC_T5:
   6200     case MVE_VPT_VEC_T6:
   6201     case MVE_VCMP_VEC_T4:
   6202     case MVE_VCMP_VEC_T5:
   6203     case MVE_VCMP_VEC_T6:
   6204       if (arm_decode_field (given, 0, 3) == 0xd)
   6205 	{
   6206 	  *unpredictable_code = UNPRED_R13;
   6207 	  return true;
   6208 	}
   6209       else
   6210 	return false;
   6211 
   6212     case MVE_VDUP:
   6213       {
   6214 	unsigned long gpr = arm_decode_field (given, 12, 15);
   6215 	if (gpr == 0xd)
   6216 	  {
   6217 	    *unpredictable_code = UNPRED_R13;
   6218 	    return true;
   6219 	  }
   6220 	else if (gpr == 0xf)
   6221 	  {
   6222 	    *unpredictable_code = UNPRED_R15;
   6223 	    return true;
   6224 	  }
   6225 
   6226 	return false;
   6227       }
   6228 
   6229     case MVE_VQADD_T2:
   6230     case MVE_VQSUB_T2:
   6231     case MVE_VMUL_FP_T2:
   6232     case MVE_VMUL_VEC_T2:
   6233     case MVE_VMLA:
   6234     case MVE_VBRSR:
   6235     case MVE_VADD_FP_T2:
   6236     case MVE_VSUB_FP_T2:
   6237     case MVE_VADD_VEC_T2:
   6238     case MVE_VSUB_VEC_T2:
   6239     case MVE_VQRSHL_T2:
   6240     case MVE_VQSHL_T1:
   6241     case MVE_VRSHL_T2:
   6242     case MVE_VSHL_T2:
   6243     case MVE_VSHLC:
   6244     case MVE_VQDMLAH:
   6245     case MVE_VQRDMLAH:
   6246     case MVE_VQDMLASH:
   6247     case MVE_VQRDMLASH:
   6248     case MVE_VQDMULH_T3:
   6249     case MVE_VQRDMULH_T4:
   6250     case MVE_VMLAS:
   6251     case MVE_VFMA_FP_SCALAR:
   6252     case MVE_VFMAS_FP_SCALAR:
   6253     case MVE_VHADD_T2:
   6254     case MVE_VHSUB_T2:
   6255       {
   6256 	unsigned long gpr = arm_decode_field (given, 0, 3);
   6257 	if (gpr == 0xd)
   6258 	  {
   6259 	    *unpredictable_code = UNPRED_R13;
   6260 	    return true;
   6261 	  }
   6262 	else if (gpr == 0xf)
   6263 	  {
   6264 	    *unpredictable_code = UNPRED_R15;
   6265 	    return true;
   6266 	  }
   6267 
   6268 	return false;
   6269       }
   6270 
   6271     case MVE_VLD2:
   6272     case MVE_VST2:
   6273       {
   6274 	unsigned long rn = arm_decode_field (given, 16, 19);
   6275 
   6276 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
   6277 	  {
   6278 	    *unpredictable_code = UNPRED_R13_AND_WB;
   6279 	    return true;
   6280 	  }
   6281 
   6282 	if (rn == 0xf)
   6283 	  {
   6284 	    *unpredictable_code = UNPRED_R15;
   6285 	    return true;
   6286 	  }
   6287 
   6288 	if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 6)
   6289 	  {
   6290 	    *unpredictable_code = UNPRED_Q_GT_6;
   6291 	    return true;
   6292 	  }
   6293 	else
   6294 	  return false;
   6295       }
   6296 
   6297     case MVE_VLD4:
   6298     case MVE_VST4:
   6299       {
   6300 	unsigned long rn = arm_decode_field (given, 16, 19);
   6301 
   6302 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
   6303 	  {
   6304 	    *unpredictable_code = UNPRED_R13_AND_WB;
   6305 	    return true;
   6306 	  }
   6307 
   6308 	if (rn == 0xf)
   6309 	  {
   6310 	    *unpredictable_code = UNPRED_R15;
   6311 	    return true;
   6312 	  }
   6313 
   6314 	if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 4)
   6315 	  {
   6316 	    *unpredictable_code = UNPRED_Q_GT_4;
   6317 	    return true;
   6318 	  }
   6319 	else
   6320 	  return false;
   6321       }
   6322 
   6323     case MVE_VLDRB_T5:
   6324     case MVE_VLDRH_T6:
   6325     case MVE_VLDRW_T7:
   6326     case MVE_VSTRB_T5:
   6327     case MVE_VSTRH_T6:
   6328     case MVE_VSTRW_T7:
   6329       {
   6330 	unsigned long rn = arm_decode_field (given, 16, 19);
   6331 
   6332 	if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1))
   6333 	  {
   6334 	    *unpredictable_code = UNPRED_R13_AND_WB;
   6335 	    return true;
   6336 	  }
   6337 	else if (rn == 0xf)
   6338 	  {
   6339 	    *unpredictable_code = UNPRED_R15;
   6340 	    return true;
   6341 	  }
   6342 	else
   6343 	  return false;
   6344       }
   6345 
   6346     case MVE_VLDRB_GATHER_T1:
   6347       if (arm_decode_field (given, 0, 0) == 1)
   6348 	{
   6349 	  *unpredictable_code = UNPRED_OS;
   6350 	  return true;
   6351 	}
   6352 
   6353       /*  fall through.  */
   6354       /* To handle common code with T2-T4 variants.  */
   6355     case MVE_VLDRH_GATHER_T2:
   6356     case MVE_VLDRW_GATHER_T3:
   6357     case MVE_VLDRD_GATHER_T4:
   6358       {
   6359 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6360 	unsigned long qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6361 
   6362 	if (qd == qm)
   6363 	  {
   6364 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
   6365 	    return true;
   6366 	  }
   6367 
   6368 	if (arm_decode_field (given, 16, 19) == 0xf)
   6369 	  {
   6370 	    *unpredictable_code = UNPRED_R15;
   6371 	    return true;
   6372 	  }
   6373 
   6374 	return false;
   6375       }
   6376 
   6377     case MVE_VLDRW_GATHER_T5:
   6378     case MVE_VLDRD_GATHER_T6:
   6379       {
   6380 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6381 	unsigned long qm = arm_decode_field_multiple (given, 17, 19, 7, 7);
   6382 
   6383 	if (qd == qm)
   6384 	  {
   6385 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
   6386 	    return true;
   6387 	  }
   6388 	else
   6389 	  return false;
   6390       }
   6391 
   6392     case MVE_VSTRB_SCATTER_T1:
   6393       if (arm_decode_field (given, 16, 19) == 0xf)
   6394 	{
   6395 	  *unpredictable_code = UNPRED_R15;
   6396 	  return true;
   6397 	}
   6398       else if (arm_decode_field (given, 0, 0) == 1)
   6399 	{
   6400 	  *unpredictable_code = UNPRED_OS;
   6401 	  return true;
   6402 	}
   6403       else
   6404 	return false;
   6405 
   6406     case MVE_VSTRH_SCATTER_T2:
   6407     case MVE_VSTRW_SCATTER_T3:
   6408     case MVE_VSTRD_SCATTER_T4:
   6409       if (arm_decode_field (given, 16, 19) == 0xf)
   6410 	{
   6411 	  *unpredictable_code = UNPRED_R15;
   6412 	  return true;
   6413 	}
   6414       else
   6415 	return false;
   6416 
   6417     case MVE_VMOV2_VEC_LANE_TO_GP:
   6418     case MVE_VMOV2_GP_TO_VEC_LANE:
   6419     case MVE_VCVT_BETWEEN_FP_INT:
   6420     case MVE_VCVT_FROM_FP_TO_INT:
   6421       {
   6422 	unsigned long rt = arm_decode_field (given, 0, 3);
   6423 	unsigned long rt2 = arm_decode_field (given, 16, 19);
   6424 
   6425 	if ((rt == 0xd) || (rt2 == 0xd))
   6426 	  {
   6427 	    *unpredictable_code = UNPRED_R13;
   6428 	    return true;
   6429 	  }
   6430 	else if ((rt == 0xf) || (rt2 == 0xf))
   6431 	  {
   6432 	    *unpredictable_code = UNPRED_R15;
   6433 	    return true;
   6434 	  }
   6435 	else if (rt == rt2 && matched_insn != MVE_VMOV2_GP_TO_VEC_LANE)
   6436 	  {
   6437 	    *unpredictable_code = UNPRED_GP_REGS_EQUAL;
   6438 	    return true;
   6439 	  }
   6440 
   6441 	return false;
   6442       }
   6443 
   6444     case MVE_VMAXV:
   6445     case MVE_VMAXAV:
   6446     case MVE_VMAXNMV_FP:
   6447     case MVE_VMAXNMAV_FP:
   6448     case MVE_VMINNMV_FP:
   6449     case MVE_VMINNMAV_FP:
   6450     case MVE_VMINV:
   6451     case MVE_VMINAV:
   6452     case MVE_VABAV:
   6453     case MVE_VMOV_HFP_TO_GP:
   6454     case MVE_VMOV_GP_TO_VEC_LANE:
   6455     case MVE_VMOV_VEC_LANE_TO_GP:
   6456       {
   6457 	unsigned long rda = arm_decode_field (given, 12, 15);
   6458 	if (rda == 0xd)
   6459 	  {
   6460 	    *unpredictable_code = UNPRED_R13;
   6461 	    return true;
   6462 	  }
   6463 	else if (rda == 0xf)
   6464 	  {
   6465 	    *unpredictable_code = UNPRED_R15;
   6466 	    return true;
   6467 	  }
   6468 
   6469 	return false;
   6470       }
   6471 
   6472     case MVE_VMULL_INT:
   6473       {
   6474 	unsigned long Qd;
   6475 	unsigned long Qm;
   6476 	unsigned long Qn;
   6477 
   6478 	if (arm_decode_field (given, 20, 21) == 2)
   6479 	  {
   6480 	    Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6481 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6482 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
   6483 
   6484 	    if ((Qd == Qn) || (Qd == Qm))
   6485 	      {
   6486 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
   6487 		return true;
   6488 	      }
   6489 	    else
   6490 	      return false;
   6491 	  }
   6492 	else
   6493 	  return false;
   6494       }
   6495 
   6496     case MVE_VCMUL_FP:
   6497     case MVE_VQDMULL_T1:
   6498       {
   6499 	unsigned long Qd;
   6500 	unsigned long Qm;
   6501 	unsigned long Qn;
   6502 
   6503 	if (arm_decode_field (given, 28, 28) == 1)
   6504 	  {
   6505 	    Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6506 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6507 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
   6508 
   6509 	    if ((Qd == Qn) || (Qd == Qm))
   6510 	      {
   6511 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
   6512 		return true;
   6513 	      }
   6514 	    else
   6515 	      return false;
   6516 	  }
   6517 	else
   6518 	  return false;
   6519       }
   6520 
   6521     case MVE_VQDMULL_T2:
   6522       {
   6523 	unsigned long gpr = arm_decode_field (given, 0, 3);
   6524 	if (gpr == 0xd)
   6525 	  {
   6526 	    *unpredictable_code = UNPRED_R13;
   6527 	    return true;
   6528 	  }
   6529 	else if (gpr == 0xf)
   6530 	  {
   6531 	    *unpredictable_code = UNPRED_R15;
   6532 	    return true;
   6533 	  }
   6534 
   6535 	if (arm_decode_field (given, 28, 28) == 1)
   6536 	  {
   6537 	    unsigned long Qd
   6538 	      = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6539 	    unsigned long Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
   6540 
   6541 	    if (Qd == Qn)
   6542 	      {
   6543 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
   6544 		return true;
   6545 	      }
   6546 	    else
   6547 	      return false;
   6548 	  }
   6549 
   6550 	return false;
   6551       }
   6552 
   6553     case MVE_VMLSLDAV:
   6554     case MVE_VRMLSLDAVH:
   6555     case MVE_VMLALDAV:
   6556     case MVE_VADDLV:
   6557       if (arm_decode_field (given, 20, 22) == 6)
   6558 	{
   6559 	  *unpredictable_code = UNPRED_R13;
   6560 	  return true;
   6561 	}
   6562       else
   6563 	return false;
   6564 
   6565     case MVE_VDWDUP:
   6566     case MVE_VIWDUP:
   6567       if (arm_decode_field (given, 1, 3) == 6)
   6568 	{
   6569 	  *unpredictable_code = UNPRED_R13;
   6570 	  return true;
   6571 	}
   6572       else
   6573 	return false;
   6574 
   6575     case MVE_VCADD_VEC:
   6576     case MVE_VHCADD:
   6577       {
   6578 	unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6579 	unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6580 	if ((Qd == Qm) && arm_decode_field (given, 20, 21) == 2)
   6581 	  {
   6582 	    *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
   6583 	    return true;
   6584 	  }
   6585 	else
   6586 	  return false;
   6587       }
   6588 
   6589     case MVE_VCADD_FP:
   6590       {
   6591 	unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6592 	unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6593 	if ((Qd == Qm) && arm_decode_field (given, 20, 20) == 1)
   6594 	  {
   6595 	    *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
   6596 	    return true;
   6597 	  }
   6598 	else
   6599 	  return false;
   6600       }
   6601 
   6602     case MVE_VCMLA_FP:
   6603       {
   6604 	unsigned long Qda;
   6605 	unsigned long Qm;
   6606 	unsigned long Qn;
   6607 
   6608 	if (arm_decode_field (given, 20, 20) == 1)
   6609 	  {
   6610 	    Qda = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6611 	    Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
   6612 	    Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
   6613 
   6614 	    if ((Qda == Qn) || (Qda == Qm))
   6615 	      {
   6616 		*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
   6617 		return true;
   6618 	      }
   6619 	    else
   6620 	      return false;
   6621 	  }
   6622 	else
   6623 	  return false;
   6624 
   6625       }
   6626 
   6627     case MVE_VCTP:
   6628       if (arm_decode_field (given, 16, 19) == 0xd)
   6629 	{
   6630 	  *unpredictable_code = UNPRED_R13;
   6631 	  return true;
   6632 	}
   6633       else
   6634 	return false;
   6635 
   6636     case MVE_VREV64:
   6637       {
   6638 	unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
   6639 	unsigned long qm = arm_decode_field_multiple (given, 1, 3, 6, 6);
   6640 
   6641 	if (qd == qm)
   6642 	  {
   6643 	    *unpredictable_code = UNPRED_Q_REGS_EQUAL;
   6644 	    return true;
   6645 	  }
   6646 	else
   6647 	  return false;
   6648       }
   6649 
   6650     case MVE_LSLL:
   6651     case MVE_LSLLI:
   6652     case MVE_LSRL:
   6653     case MVE_ASRL:
   6654     case MVE_ASRLI:
   6655     case MVE_UQSHLL:
   6656     case MVE_UQRSHLL:
   6657     case MVE_URSHRL:
   6658     case MVE_SRSHRL:
   6659     case MVE_SQSHLL:
   6660     case MVE_SQRSHRL:
   6661       {
   6662 	unsigned long gpr = arm_decode_field (given, 9, 11);
   6663 	gpr = ((gpr << 1) | 1);
   6664 	if (gpr == 0xd)
   6665 	  {
   6666 	    *unpredictable_code = UNPRED_R13;
   6667 	    return true;
   6668 	  }
   6669 	else if (gpr == 0xf)
   6670 	  {
   6671 	    *unpredictable_code = UNPRED_R15;
   6672 	    return true;
   6673 	  }
   6674 
   6675 	return false;
   6676       }
   6677 
   6678     default:
   6679       return false;
   6680     }
   6681 }
   6682 
   6683 static void
   6684 print_mve_vmov_index (struct disassemble_info *info, unsigned long given)
   6685 {
   6686   unsigned long op1 = arm_decode_field (given, 21, 22);
   6687   unsigned long op2 = arm_decode_field (given, 5, 6);
   6688   unsigned long h = arm_decode_field (given, 16, 16);
   6689   unsigned long index_operand, esize, targetBeat, idx;
   6690   void *stream = info->stream;
   6691   fprintf_styled_ftype func = info->fprintf_styled_func;
   6692 
   6693   if ((op1 & 0x2) == 0x2)
   6694     {
   6695       index_operand = op2;
   6696       esize = 8;
   6697     }
   6698   else if (((op1 & 0x2) == 0x0) && ((op2 & 0x1) == 0x1))
   6699     {
   6700       index_operand = op2  >> 1;
   6701       esize = 16;
   6702     }
   6703   else if (((op1 & 0x2) == 0) && ((op2 & 0x3) == 0))
   6704     {
   6705       index_operand = 0;
   6706       esize = 32;
   6707     }
   6708   else
   6709     {
   6710       func (stream, dis_style_text, "<undefined index>");
   6711       return;
   6712     }
   6713 
   6714   targetBeat =  (op1 & 0x1) | (h << 1);
   6715   idx = index_operand + targetBeat * (32/esize);
   6716 
   6717   func (stream, dis_style_immediate, "%lu", idx);
   6718 }
   6719 
   6720 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits
   6721    in length and integer of floating-point type.  */
   6722 static void
   6723 print_simd_imm8 (struct disassemble_info *info, unsigned long given,
   6724 		 unsigned int ibit_loc, const struct mopcode32 *insn)
   6725 {
   6726   int bits = 0;
   6727   int cmode = (given >> 8) & 0xf;
   6728   int op = (given >> 5) & 0x1;
   6729   unsigned long value = 0, hival = 0;
   6730   unsigned shift;
   6731   int size = 0;
   6732   int isfloat = 0;
   6733   void *stream = info->stream;
   6734   fprintf_styled_ftype func = info->fprintf_styled_func;
   6735 
   6736   /* On Neon the 'i' bit is at bit 24, on mve it is
   6737      at bit 28.  */
   6738   bits |= ((given >> ibit_loc) & 1) << 7;
   6739   bits |= ((given >> 16) & 7) << 4;
   6740   bits |= ((given >> 0) & 15) << 0;
   6741 
   6742   if (cmode < 8)
   6743     {
   6744       shift = (cmode >> 1) & 3;
   6745       value = (unsigned long) bits << (8 * shift);
   6746       size = 32;
   6747     }
   6748   else if (cmode < 12)
   6749     {
   6750       shift = (cmode >> 1) & 1;
   6751       value = (unsigned long) bits << (8 * shift);
   6752       size = 16;
   6753     }
   6754   else if (cmode < 14)
   6755     {
   6756       shift = (cmode & 1) + 1;
   6757       value = (unsigned long) bits << (8 * shift);
   6758       value |= (1ul << (8 * shift)) - 1;
   6759       size = 32;
   6760     }
   6761   else if (cmode == 14)
   6762     {
   6763       if (op)
   6764 	{
   6765 	  /* Bit replication into bytes.  */
   6766 	  int ix;
   6767 	  unsigned long mask;
   6768 
   6769 	  value = 0;
   6770 	  hival = 0;
   6771 	  for (ix = 7; ix >= 0; ix--)
   6772 	    {
   6773 	      mask = ((bits >> ix) & 1) ? 0xff : 0;
   6774 	      if (ix <= 3)
   6775 		value = (value << 8) | mask;
   6776 	      else
   6777 		hival = (hival << 8) | mask;
   6778 	    }
   6779 	  size = 64;
   6780 	}
   6781       else
   6782 	{
   6783 	  /* Byte replication.  */
   6784 	  value = (unsigned long) bits;
   6785 	  size = 8;
   6786 	}
   6787     }
   6788   else if (!op)
   6789     {
   6790       /* Floating point encoding.  */
   6791       int tmp;
   6792 
   6793       value = (unsigned long)  (bits & 0x7f) << 19;
   6794       value |= (unsigned long) (bits & 0x80) << 24;
   6795       tmp = bits & 0x40 ? 0x3c : 0x40;
   6796       value |= (unsigned long) tmp << 24;
   6797       size = 32;
   6798       isfloat = 1;
   6799     }
   6800   else
   6801     {
   6802       func (stream, dis_style_text, "<illegal constant %.8x:%x:%x>",
   6803 	    bits, cmode, op);
   6804       size = 32;
   6805       return;
   6806     }
   6807 
   6808   /* printU determines whether the immediate value should be printed as
   6809      unsigned.  */
   6810   unsigned printU = 0;
   6811   switch (insn->mve_op)
   6812     {
   6813     default:
   6814       break;
   6815     /* We want this for instructions that don't have a 'signed' type.  */
   6816     case MVE_VBIC_IMM:
   6817     case MVE_VORR_IMM:
   6818     case MVE_VMVN_IMM:
   6819     case MVE_VMOV_IMM_TO_VEC:
   6820       printU = 1;
   6821       break;
   6822     }
   6823   switch (size)
   6824     {
   6825     case 8:
   6826       func (stream, dis_style_immediate, "#%ld", value);
   6827       func (stream, dis_style_comment_start, "\t@ 0x%.2lx", value);
   6828       break;
   6829 
   6830     case 16:
   6831       func (stream, dis_style_immediate, printU ? "#%lu" : "#%ld", value);
   6832       func (stream, dis_style_comment_start, "\t@ 0x%.4lx", value);
   6833       break;
   6834 
   6835     case 32:
   6836       if (isfloat)
   6837 	{
   6838 	  unsigned char valbytes[4];
   6839 	  double fvalue;
   6840 
   6841 	  /* Do this a byte at a time so we don't have to
   6842 	     worry about the host's endianness.  */
   6843 	  valbytes[0] = value & 0xff;
   6844 	  valbytes[1] = (value >> 8) & 0xff;
   6845 	  valbytes[2] = (value >> 16) & 0xff;
   6846 	  valbytes[3] = (value >> 24) & 0xff;
   6847 
   6848 	  floatformat_to_double
   6849 	    (& floatformat_ieee_single_little, valbytes,
   6850 	     & fvalue);
   6851 
   6852 	  func (stream, dis_style_immediate, "#%.7g", fvalue);
   6853 	  func (stream, dis_style_comment_start, "\t@ 0x%.8lx", value);
   6854 	}
   6855       else
   6856 	{
   6857 	  func (stream, dis_style_immediate,
   6858 		printU ? "#%lu" : "#%ld",
   6859 		(long) (((value & 0x80000000L) != 0)
   6860 			&& !printU
   6861 			? value | ~0xffffffffL : value));
   6862 	  func (stream, dis_style_comment_start, "\t@ 0x%.8lx", value);
   6863 	}
   6864       break;
   6865 
   6866     case 64:
   6867       func (stream, dis_style_immediate, "#0x%.8lx%.8lx", hival, value);
   6868       break;
   6869 
   6870     default:
   6871       abort ();
   6872     }
   6873 
   6874 }
   6875 
   6876 static void
   6877 print_mve_undefined (struct disassemble_info *info,
   6878 		     enum mve_undefined undefined_code)
   6879 {
   6880   void *stream = info->stream;
   6881   fprintf_styled_ftype func = info->fprintf_styled_func;
   6882   /* Initialize REASON to avoid compiler warning about uninitialized
   6883      usage, though such usage should be impossible.  */
   6884   const char *reason = "??";
   6885 
   6886   switch (undefined_code)
   6887     {
   6888     case UNDEF_SIZE:
   6889       reason = "illegal size";
   6890       break;
   6891 
   6892     case UNDEF_SIZE_0:
   6893       reason = "size equals zero";
   6894       break;
   6895 
   6896     case UNDEF_SIZE_2:
   6897       reason = "size equals two";
   6898       break;
   6899 
   6900     case UNDEF_SIZE_3:
   6901       reason = "size equals three";
   6902       break;
   6903 
   6904     case UNDEF_SIZE_LE_1:
   6905       reason = "size <= 1";
   6906       break;
   6907 
   6908     case UNDEF_SIZE_NOT_0:
   6909       reason = "size not equal to 0";
   6910       break;
   6911 
   6912     case UNDEF_SIZE_NOT_2:
   6913       reason = "size not equal to 2";
   6914       break;
   6915 
   6916     case UNDEF_SIZE_NOT_3:
   6917       reason = "size not equal to 3";
   6918       break;
   6919 
   6920     case UNDEF_NOT_UNS_SIZE_0:
   6921       reason = "not unsigned and size = zero";
   6922       break;
   6923 
   6924     case UNDEF_NOT_UNS_SIZE_1:
   6925       reason = "not unsigned and size = one";
   6926       break;
   6927 
   6928     case UNDEF_NOT_UNSIGNED:
   6929       reason = "not unsigned";
   6930       break;
   6931 
   6932     case UNDEF_VCVT_IMM6:
   6933       reason = "invalid imm6";
   6934       break;
   6935 
   6936     case UNDEF_VCVT_FSI_IMM6:
   6937       reason = "fsi = 0 and invalid imm6";
   6938       break;
   6939 
   6940     case UNDEF_BAD_OP1_OP2:
   6941       reason = "bad size with op2 = 2 and op1 = 0 or 1";
   6942       break;
   6943 
   6944     case UNDEF_BAD_U_OP1_OP2:
   6945       reason = "unsigned with op2 = 0 and op1 = 0 or 1";
   6946       break;
   6947 
   6948     case UNDEF_OP_0_BAD_CMODE:
   6949       reason = "op field equal 0 and bad cmode";
   6950       break;
   6951 
   6952     case UNDEF_XCHG_UNS:
   6953       reason = "exchange and unsigned together";
   6954       break;
   6955 
   6956     case UNDEF_NONE:
   6957       reason = "";
   6958       break;
   6959     }
   6960 
   6961   func (stream, dis_style_text, "\t\tundefined instruction: %s", reason);
   6962 }
   6963 
   6964 static void
   6965 print_mve_unpredictable (struct disassemble_info *info,
   6966 			 enum mve_unpredictable unpredict_code)
   6967 {
   6968   void *stream = info->stream;
   6969   fprintf_styled_ftype func = info->fprintf_styled_func;
   6970   /* Initialize REASON to avoid compiler warning about uninitialized
   6971      usage, though such usage should be impossible.  */
   6972   const char *reason = "??";
   6973 
   6974   switch (unpredict_code)
   6975     {
   6976     case UNPRED_IT_BLOCK:
   6977       reason = "mve instruction in it block";
   6978       break;
   6979 
   6980     case UNPRED_FCA_0_FCB_1:
   6981       reason = "condition bits, fca = 0 and fcb = 1";
   6982       break;
   6983 
   6984     case UNPRED_R13:
   6985       reason = "use of r13 (sp)";
   6986       break;
   6987 
   6988     case UNPRED_R15:
   6989       reason = "use of r15 (pc)";
   6990       break;
   6991 
   6992     case UNPRED_Q_GT_4:
   6993       reason = "start register block > r4";
   6994       break;
   6995 
   6996     case UNPRED_Q_GT_6:
   6997       reason = "start register block > r6";
   6998       break;
   6999 
   7000     case UNPRED_R13_AND_WB:
   7001       reason = "use of r13 and write back";
   7002       break;
   7003 
   7004     case UNPRED_Q_REGS_EQUAL:
   7005       reason = "same vector register used for destination and other operand";
   7006       break;
   7007 
   7008     case UNPRED_OS:
   7009       reason = "use of offset scaled";
   7010       break;
   7011 
   7012     case UNPRED_GP_REGS_EQUAL:
   7013       reason = "same general-purpose register used for both operands";
   7014       break;
   7015 
   7016     case UNPRED_Q_REGS_EQ_AND_SIZE_1:
   7017       reason = "use of identical q registers and size = 1";
   7018       break;
   7019 
   7020     case UNPRED_Q_REGS_EQ_AND_SIZE_2:
   7021       reason = "use of identical q registers and size = 1";
   7022       break;
   7023 
   7024     case UNPRED_NONE:
   7025       reason = "";
   7026       break;
   7027     }
   7028 
   7029   func (stream, dis_style_comment_start, "%s: %s",
   7030 	UNPREDICTABLE_INSTRUCTION, reason);
   7031 }
   7032 
   7033 /* Print register block operand for mve vld2/vld4/vst2/vld4.  */
   7034 
   7035 static void
   7036 print_mve_register_blocks (struct disassemble_info *info,
   7037 			   unsigned long given,
   7038 			   enum mve_instructions matched_insn)
   7039 {
   7040   void *stream = info->stream;
   7041   fprintf_styled_ftype func = info->fprintf_styled_func;
   7042 
   7043   unsigned long q_reg_start = arm_decode_field_multiple (given,
   7044 							 13, 15,
   7045 							 22, 22);
   7046   switch (matched_insn)
   7047     {
   7048     case MVE_VLD2:
   7049     case MVE_VST2:
   7050       if (q_reg_start <= 6)
   7051 	{
   7052 	  func (stream, dis_style_text, "{");
   7053 	  func (stream, dis_style_register, "q%ld", q_reg_start);
   7054 	  func (stream, dis_style_text, ", ");
   7055 	  func (stream, dis_style_register, "q%ld", q_reg_start + 1);
   7056 	  func (stream, dis_style_text, "}");
   7057 	}
   7058       else
   7059 	func (stream, dis_style_text, "<illegal reg q%ld>", q_reg_start);
   7060       break;
   7061 
   7062     case MVE_VLD4:
   7063     case MVE_VST4:
   7064       if (q_reg_start <= 4)
   7065 	{
   7066 	  func (stream, dis_style_text, "{");
   7067 	  func (stream, dis_style_register, "q%ld", q_reg_start);
   7068 	  func (stream, dis_style_text, ", ");
   7069 	  func (stream, dis_style_register, "q%ld", q_reg_start + 1);
   7070 	  func (stream, dis_style_text, ", ");
   7071 	  func (stream, dis_style_register, "q%ld", q_reg_start + 2);
   7072 	  func (stream, dis_style_text, ", ");
   7073 	  func (stream, dis_style_register, "q%ld", q_reg_start + 3);
   7074 	  func (stream, dis_style_text, "}");
   7075 	}
   7076       else
   7077 	func (stream, dis_style_text, "<illegal reg q%ld>", q_reg_start);
   7078       break;
   7079 
   7080     default:
   7081       break;
   7082     }
   7083 }
   7084 
   7085 static void
   7086 print_mve_rounding_mode (struct disassemble_info *info,
   7087 			 unsigned long given,
   7088 			 enum mve_instructions matched_insn)
   7089 {
   7090   void *stream = info->stream;
   7091   fprintf_styled_ftype func = info->fprintf_styled_func;
   7092 
   7093   switch (matched_insn)
   7094     {
   7095     case MVE_VCVT_FROM_FP_TO_INT:
   7096       {
   7097 	switch (arm_decode_field (given, 8, 9))
   7098 	  {
   7099 	  case 0:
   7100 	    func (stream, dis_style_mnemonic, "a");
   7101 	    break;
   7102 
   7103 	  case 1:
   7104 	    func (stream, dis_style_mnemonic, "n");
   7105 	    break;
   7106 
   7107 	  case 2:
   7108 	    func (stream, dis_style_mnemonic, "p");
   7109 	    break;
   7110 
   7111 	  case 3:
   7112 	    func (stream, dis_style_mnemonic, "m");
   7113 	    break;
   7114 
   7115 	  default:
   7116 	    break;
   7117 	  }
   7118       }
   7119       break;
   7120 
   7121     case MVE_VRINT_FP:
   7122       {
   7123 	switch (arm_decode_field (given, 7, 9))
   7124 	  {
   7125 	  case 0:
   7126 	    func (stream, dis_style_mnemonic, "n");
   7127 	    break;
   7128 
   7129 	  case 1:
   7130 	    func (stream, dis_style_mnemonic, "x");
   7131 	    break;
   7132 
   7133 	  case 2:
   7134 	    func (stream, dis_style_mnemonic, "a");
   7135 	    break;
   7136 
   7137 	  case 3:
   7138 	    func (stream, dis_style_mnemonic, "z");
   7139 	    break;
   7140 
   7141 	  case 5:
   7142 	    func (stream, dis_style_mnemonic, "m");
   7143 	    break;
   7144 
   7145 	  case 7:
   7146 	    func (stream, dis_style_mnemonic, "p");
   7147 
   7148 	  case 4:
   7149 	  case 6:
   7150 	  default:
   7151 	    break;
   7152 	  }
   7153       }
   7154       break;
   7155 
   7156     default:
   7157       break;
   7158     }
   7159 }
   7160 
   7161 static void
   7162 print_mve_vcvt_size (struct disassemble_info *info,
   7163 		     unsigned long given,
   7164 		     enum mve_instructions matched_insn)
   7165 {
   7166   unsigned long mode = 0;
   7167   void *stream = info->stream;
   7168   fprintf_styled_ftype func = info->fprintf_styled_func;
   7169 
   7170   switch (matched_insn)
   7171     {
   7172     case MVE_VCVT_FP_FIX_VEC:
   7173       {
   7174 	mode = (((given & 0x200) >> 7)
   7175 		| ((given & 0x10000000) >> 27)
   7176 		| ((given & 0x100) >> 8));
   7177 
   7178 	switch (mode)
   7179 	  {
   7180 	  case 0:
   7181 	    func (stream, dis_style_mnemonic, "f16.s16");
   7182 	    break;
   7183 
   7184 	  case 1:
   7185 	    func (stream, dis_style_mnemonic, "s16.f16");
   7186 	    break;
   7187 
   7188 	  case 2:
   7189 	    func (stream, dis_style_mnemonic, "f16.u16");
   7190 	    break;
   7191 
   7192 	  case 3:
   7193 	    func (stream, dis_style_mnemonic, "u16.f16");
   7194 	    break;
   7195 
   7196 	  case 4:
   7197 	    func (stream, dis_style_mnemonic, "f32.s32");
   7198 	    break;
   7199 
   7200 	  case 5:
   7201 	    func (stream, dis_style_mnemonic, "s32.f32");
   7202 	    break;
   7203 
   7204 	  case 6:
   7205 	    func (stream, dis_style_mnemonic, "f32.u32");
   7206 	    break;
   7207 
   7208 	  case 7:
   7209 	    func (stream, dis_style_mnemonic, "u32.f32");
   7210 	    break;
   7211 
   7212 	  default:
   7213 	    break;
   7214 	  }
   7215 	break;
   7216       }
   7217     case MVE_VCVT_BETWEEN_FP_INT:
   7218       {
   7219 	unsigned long size = arm_decode_field (given, 18, 19);
   7220 	unsigned long op = arm_decode_field (given, 7, 8);
   7221 
   7222 	if (size == 1)
   7223 	  {
   7224 	    switch (op)
   7225 	      {
   7226 	      case 0:
   7227 		func (stream, dis_style_mnemonic, "f16.s16");
   7228 		break;
   7229 
   7230 	      case 1:
   7231 		func (stream, dis_style_mnemonic, "f16.u16");
   7232 		break;
   7233 
   7234 	      case 2:
   7235 		func (stream, dis_style_mnemonic, "s16.f16");
   7236 		break;
   7237 
   7238 	      case 3:
   7239 		func (stream, dis_style_mnemonic, "u16.f16");
   7240 		break;
   7241 
   7242 	      default:
   7243 		break;
   7244 	      }
   7245 	  }
   7246 	else if (size == 2)
   7247 	  {
   7248 	    switch (op)
   7249 	      {
   7250 	      case 0:
   7251 		func (stream, dis_style_mnemonic, "f32.s32");
   7252 		break;
   7253 
   7254 	      case 1:
   7255 		func (stream, dis_style_mnemonic, "f32.u32");
   7256 		break;
   7257 
   7258 	      case 2:
   7259 		func (stream, dis_style_mnemonic, "s32.f32");
   7260 		break;
   7261 
   7262 	      case 3:
   7263 		func (stream, dis_style_mnemonic, "u32.f32");
   7264 		break;
   7265 	      }
   7266 	  }
   7267       }
   7268       break;
   7269 
   7270     case MVE_VCVT_FP_HALF_FP:
   7271       {
   7272 	unsigned long op = arm_decode_field (given, 28, 28);
   7273 	if (op == 0)
   7274 	  func (stream, dis_style_mnemonic, "f16.f32");
   7275 	else if (op == 1)
   7276 	  func (stream, dis_style_mnemonic, "f32.f16");
   7277       }
   7278       break;
   7279 
   7280     case MVE_VCVT_FROM_FP_TO_INT:
   7281       {
   7282 	unsigned long size = arm_decode_field_multiple (given, 7, 7, 18, 19);
   7283 
   7284 	switch (size)
   7285 	  {
   7286 	  case 2:
   7287 	    func (stream, dis_style_mnemonic, "s16.f16");
   7288 	    break;
   7289 
   7290 	  case 3:
   7291 	    func (stream, dis_style_mnemonic, "u16.f16");
   7292 	    break;
   7293 
   7294 	  case 4:
   7295 	    func (stream, dis_style_mnemonic, "s32.f32");
   7296 	    break;
   7297 
   7298 	  case 5:
   7299 	    func (stream, dis_style_mnemonic, "u32.f32");
   7300 	    break;
   7301 
   7302 	  default:
   7303 	    break;
   7304 	  }
   7305       }
   7306       break;
   7307 
   7308     default:
   7309       break;
   7310     }
   7311 }
   7312 
   7313 static void
   7314 print_mve_rotate (struct disassemble_info *info, unsigned long rot,
   7315 		  unsigned long rot_width)
   7316 {
   7317   void *stream = info->stream;
   7318   fprintf_styled_ftype func = info->fprintf_styled_func;
   7319 
   7320   if (rot_width == 1)
   7321     {
   7322       switch (rot)
   7323 	{
   7324 	case 0:
   7325 	  func (stream, dis_style_immediate, "90");
   7326 	  break;
   7327 	case 1:
   7328 	  func (stream, dis_style_immediate, "270");
   7329 	  break;
   7330 	default:
   7331 	  break;
   7332 	}
   7333     }
   7334   else if (rot_width == 2)
   7335     {
   7336       switch (rot)
   7337 	{
   7338 	case 0:
   7339 	  func (stream, dis_style_immediate, "0");
   7340 	  break;
   7341 	case 1:
   7342 	  func (stream, dis_style_immediate, "90");
   7343 	  break;
   7344 	case 2:
   7345 	  func (stream, dis_style_immediate, "180");
   7346 	  break;
   7347 	case 3:
   7348 	  func (stream, dis_style_immediate, "270");
   7349 	  break;
   7350 	default:
   7351 	  break;
   7352 	}
   7353     }
   7354 }
   7355 
   7356 static void
   7357 print_instruction_predicate (struct disassemble_info *info)
   7358 {
   7359   void *stream = info->stream;
   7360   fprintf_styled_ftype func = info->fprintf_styled_func;
   7361 
   7362   if (vpt_block_state.next_pred_state == PRED_THEN)
   7363     func (stream, dis_style_mnemonic, "t");
   7364   else if (vpt_block_state.next_pred_state == PRED_ELSE)
   7365     func (stream, dis_style_mnemonic, "e");
   7366 }
   7367 
   7368 static void
   7369 print_mve_size (struct disassemble_info *info,
   7370 		unsigned long size,
   7371 		enum mve_instructions matched_insn)
   7372 {
   7373   void *stream = info->stream;
   7374   fprintf_styled_ftype func = info->fprintf_styled_func;
   7375 
   7376   switch (matched_insn)
   7377     {
   7378     case MVE_VABAV:
   7379     case MVE_VABD_VEC:
   7380     case MVE_VABS_FP:
   7381     case MVE_VABS_VEC:
   7382     case MVE_VADD_VEC_T1:
   7383     case MVE_VADD_VEC_T2:
   7384     case MVE_VADDV:
   7385     case MVE_VBRSR:
   7386     case MVE_VCADD_VEC:
   7387     case MVE_VCLS:
   7388     case MVE_VCLZ:
   7389     case MVE_VCMP_VEC_T1:
   7390     case MVE_VCMP_VEC_T2:
   7391     case MVE_VCMP_VEC_T3:
   7392     case MVE_VCMP_VEC_T4:
   7393     case MVE_VCMP_VEC_T5:
   7394     case MVE_VCMP_VEC_T6:
   7395     case MVE_VCTP:
   7396     case MVE_VDDUP:
   7397     case MVE_VDWDUP:
   7398     case MVE_VHADD_T1:
   7399     case MVE_VHADD_T2:
   7400     case MVE_VHCADD:
   7401     case MVE_VHSUB_T1:
   7402     case MVE_VHSUB_T2:
   7403     case MVE_VIDUP:
   7404     case MVE_VIWDUP:
   7405     case MVE_VLD2:
   7406     case MVE_VLD4:
   7407     case MVE_VLDRB_GATHER_T1:
   7408     case MVE_VLDRH_GATHER_T2:
   7409     case MVE_VLDRW_GATHER_T3:
   7410     case MVE_VLDRD_GATHER_T4:
   7411     case MVE_VLDRB_T1:
   7412     case MVE_VLDRH_T2:
   7413     case MVE_VMAX:
   7414     case MVE_VMAXA:
   7415     case MVE_VMAXV:
   7416     case MVE_VMAXAV:
   7417     case MVE_VMIN:
   7418     case MVE_VMINA:
   7419     case MVE_VMINV:
   7420     case MVE_VMINAV:
   7421     case MVE_VMLA:
   7422     case MVE_VMLAS:
   7423     case MVE_VMUL_VEC_T1:
   7424     case MVE_VMUL_VEC_T2:
   7425     case MVE_VMULH:
   7426     case MVE_VRMULH:
   7427     case MVE_VMULL_INT:
   7428     case MVE_VNEG_FP:
   7429     case MVE_VNEG_VEC:
   7430     case MVE_VPT_VEC_T1:
   7431     case MVE_VPT_VEC_T2:
   7432     case MVE_VPT_VEC_T3:
   7433     case MVE_VPT_VEC_T4:
   7434     case MVE_VPT_VEC_T5:
   7435     case MVE_VPT_VEC_T6:
   7436     case MVE_VQABS:
   7437     case MVE_VQADD_T1:
   7438     case MVE_VQADD_T2:
   7439     case MVE_VQDMLADH:
   7440     case MVE_VQRDMLADH:
   7441     case MVE_VQDMLAH:
   7442     case MVE_VQRDMLAH:
   7443     case MVE_VQDMLASH:
   7444     case MVE_VQRDMLASH:
   7445     case MVE_VQDMLSDH:
   7446     case MVE_VQRDMLSDH:
   7447     case MVE_VQDMULH_T1:
   7448     case MVE_VQRDMULH_T2:
   7449     case MVE_VQDMULH_T3:
   7450     case MVE_VQRDMULH_T4:
   7451     case MVE_VQNEG:
   7452     case MVE_VQRSHL_T1:
   7453     case MVE_VQRSHL_T2:
   7454     case MVE_VQSHL_T1:
   7455     case MVE_VQSHL_T4:
   7456     case MVE_VQSUB_T1:
   7457     case MVE_VQSUB_T2:
   7458     case MVE_VREV32:
   7459     case MVE_VREV64:
   7460     case MVE_VRHADD:
   7461     case MVE_VRINT_FP:
   7462     case MVE_VRSHL_T1:
   7463     case MVE_VRSHL_T2:
   7464     case MVE_VSHL_T2:
   7465     case MVE_VSHL_T3:
   7466     case MVE_VSHLL_T2:
   7467     case MVE_VST2:
   7468     case MVE_VST4:
   7469     case MVE_VSTRB_SCATTER_T1:
   7470     case MVE_VSTRH_SCATTER_T2:
   7471     case MVE_VSTRW_SCATTER_T3:
   7472     case MVE_VSTRB_T1:
   7473     case MVE_VSTRH_T2:
   7474     case MVE_VSUB_VEC_T1:
   7475     case MVE_VSUB_VEC_T2:
   7476       if (size <= 3)
   7477 	func (stream, dis_style_mnemonic, "%s", mve_vec_sizename[size]);
   7478       else
   7479 	func (stream, dis_style_text, "<undef size>");
   7480       break;
   7481 
   7482     case MVE_VABD_FP:
   7483     case MVE_VADD_FP_T1:
   7484     case MVE_VADD_FP_T2:
   7485     case MVE_VSUB_FP_T1:
   7486     case MVE_VSUB_FP_T2:
   7487     case MVE_VCMP_FP_T1:
   7488     case MVE_VCMP_FP_T2:
   7489     case MVE_VFMA_FP_SCALAR:
   7490     case MVE_VFMA_FP:
   7491     case MVE_VFMS_FP:
   7492     case MVE_VFMAS_FP_SCALAR:
   7493     case MVE_VMAXNM_FP:
   7494     case MVE_VMAXNMA_FP:
   7495     case MVE_VMAXNMV_FP:
   7496     case MVE_VMAXNMAV_FP:
   7497     case MVE_VMINNM_FP:
   7498     case MVE_VMINNMA_FP:
   7499     case MVE_VMINNMV_FP:
   7500     case MVE_VMINNMAV_FP:
   7501     case MVE_VMUL_FP_T1:
   7502     case MVE_VMUL_FP_T2:
   7503     case MVE_VPT_FP_T1:
   7504     case MVE_VPT_FP_T2:
   7505       if (size == 0)
   7506 	func (stream, dis_style_mnemonic, "32");
   7507       else if (size == 1)
   7508 	func (stream, dis_style_mnemonic, "16");
   7509       break;
   7510 
   7511     case MVE_VCADD_FP:
   7512     case MVE_VCMLA_FP:
   7513     case MVE_VCMUL_FP:
   7514     case MVE_VMLADAV_T1:
   7515     case MVE_VMLALDAV:
   7516     case MVE_VMLSDAV_T1:
   7517     case MVE_VMLSLDAV:
   7518     case MVE_VMOVN:
   7519     case MVE_VQDMULL_T1:
   7520     case MVE_VQDMULL_T2:
   7521     case MVE_VQMOVN:
   7522     case MVE_VQMOVUN:
   7523       if (size == 0)
   7524 	func (stream, dis_style_mnemonic, "16");
   7525       else if (size == 1)
   7526 	func (stream, dis_style_mnemonic, "32");
   7527       break;
   7528 
   7529     case MVE_VMOVL:
   7530       if (size == 1)
   7531 	func (stream, dis_style_mnemonic, "8");
   7532       else if (size == 2)
   7533 	func (stream, dis_style_mnemonic, "16");
   7534       break;
   7535 
   7536     case MVE_VDUP:
   7537       switch (size)
   7538 	{
   7539 	case 0:
   7540 	  func (stream, dis_style_mnemonic, "32");
   7541 	  break;
   7542 	case 1:
   7543 	  func (stream, dis_style_mnemonic, "16");
   7544 	  break;
   7545 	case 2:
   7546 	  func (stream, dis_style_mnemonic, "8");
   7547 	  break;
   7548 	default:
   7549 	  break;
   7550 	}
   7551       break;
   7552 
   7553     case MVE_VMOV_GP_TO_VEC_LANE:
   7554     case MVE_VMOV_VEC_LANE_TO_GP:
   7555       switch (size)
   7556 	{
   7557 	case 0: case 4:
   7558 	  func (stream, dis_style_mnemonic, "32");
   7559 	  break;
   7560 
   7561 	case 1: case 3:
   7562 	case 5: case 7:
   7563 	  func (stream, dis_style_mnemonic, "16");
   7564 	  break;
   7565 
   7566 	case 8: case 9: case 10: case 11:
   7567 	case 12: case 13: case 14: case 15:
   7568 	  func (stream, dis_style_mnemonic, "8");
   7569 	  break;
   7570 
   7571 	default:
   7572 	  break;
   7573 	}
   7574       break;
   7575 
   7576     case MVE_VMOV_IMM_TO_VEC:
   7577       switch (size)
   7578 	{
   7579 	case 0: case 4: case 8:
   7580 	case 12: case 24: case 26:
   7581 	  func (stream, dis_style_mnemonic, "i32");
   7582 	  break;
   7583 	case 16: case 20:
   7584 	  func (stream, dis_style_mnemonic, "i16");
   7585 	  break;
   7586 	case 28:
   7587 	  func (stream, dis_style_mnemonic, "i8");
   7588 	  break;
   7589 	case 29:
   7590 	  func (stream, dis_style_mnemonic, "i64");
   7591 	  break;
   7592 	case 30:
   7593 	  func (stream, dis_style_mnemonic, "f32");
   7594 	  break;
   7595 	default:
   7596 	  break;
   7597 	}
   7598       break;
   7599 
   7600     case MVE_VMULL_POLY:
   7601       if (size == 0)
   7602 	func (stream, dis_style_mnemonic, "p8");
   7603       else if (size == 1)
   7604 	func (stream, dis_style_mnemonic, "p16");
   7605       break;
   7606 
   7607     case MVE_VMVN_IMM:
   7608       switch (size)
   7609 	{
   7610 	case 0: case 2: case 4:
   7611 	case 6: case 12: case 13:
   7612 	  func (stream, dis_style_mnemonic, "32");
   7613 	  break;
   7614 
   7615 	case 8: case 10:
   7616 	  func (stream, dis_style_mnemonic, "16");
   7617 	  break;
   7618 
   7619 	default:
   7620 	  break;
   7621 	}
   7622       break;
   7623 
   7624     case MVE_VBIC_IMM:
   7625     case MVE_VORR_IMM:
   7626       switch (size)
   7627 	{
   7628 	case 1: case 3:
   7629 	case 5: case 7:
   7630 	  func (stream, dis_style_mnemonic, "32");
   7631 	  break;
   7632 
   7633 	case 9: case 11:
   7634 	  func (stream, dis_style_mnemonic, "16");
   7635 	  break;
   7636 
   7637 	default:
   7638 	  break;
   7639 	}
   7640       break;
   7641 
   7642     case MVE_VQSHRN:
   7643     case MVE_VQSHRUN:
   7644     case MVE_VQRSHRN:
   7645     case MVE_VQRSHRUN:
   7646     case MVE_VRSHRN:
   7647     case MVE_VSHRN:
   7648       {
   7649 	switch (size)
   7650 	{
   7651 	case 1:
   7652 	  func (stream, dis_style_mnemonic, "16");
   7653 	  break;
   7654 
   7655 	case 2: case 3:
   7656 	  func (stream, dis_style_mnemonic, "32");
   7657 	  break;
   7658 
   7659 	default:
   7660 	  break;
   7661 	}
   7662       }
   7663       break;
   7664 
   7665     case MVE_VQSHL_T2:
   7666     case MVE_VQSHLU_T3:
   7667     case MVE_VRSHR:
   7668     case MVE_VSHL_T1:
   7669     case MVE_VSHLL_T1:
   7670     case MVE_VSHR:
   7671     case MVE_VSLI:
   7672     case MVE_VSRI:
   7673       {
   7674 	switch (size)
   7675 	{
   7676 	case 1:
   7677 	  func (stream, dis_style_mnemonic, "8");
   7678 	  break;
   7679 
   7680 	case 2: case 3:
   7681 	  func (stream, dis_style_mnemonic, "16");
   7682 	  break;
   7683 
   7684 	case 4: case 5: case 6: case 7:
   7685 	  func (stream, dis_style_mnemonic, "32");
   7686 	  break;
   7687 
   7688 	default:
   7689 	  break;
   7690 	}
   7691       }
   7692       break;
   7693 
   7694     default:
   7695       break;
   7696     }
   7697 }
   7698 
   7699 /* Return true if INSN is a shift insn with an immediate shift amount
   7700    which needs decoding as per print_mve_shift_n.  */
   7701 
   7702 static bool
   7703 mve_shift_insn_p (enum mve_instructions insn)
   7704 {
   7705   switch (insn)
   7706     {
   7707     case MVE_VQSHL_T2:
   7708     case MVE_VQSHLU_T3:
   7709     case MVE_VQSHRN:
   7710     case MVE_VQSHRUN:
   7711     case MVE_VQRSHRN:
   7712     case MVE_VQRSHRUN:
   7713     case MVE_VRSHR:
   7714     case MVE_VRSHRN:
   7715     case MVE_VSHL_T1:
   7716     case MVE_VSHLL_T1:
   7717     case MVE_VSHR:
   7718     case MVE_VSHRN:
   7719     case MVE_VSLI:
   7720     case MVE_VSRI:
   7721       return true;
   7722     default:
   7723       return false;
   7724     }
   7725 }
   7726 
   7727 static void
   7728 print_mve_shift_n (struct disassemble_info *info, long given,
   7729 		   enum mve_instructions matched_insn)
   7730 {
   7731   void *stream = info->stream;
   7732   fprintf_styled_ftype func = info->fprintf_styled_func;
   7733 
   7734   int startAt0
   7735     = matched_insn == MVE_VQSHL_T2
   7736       || matched_insn == MVE_VQSHLU_T3
   7737       || matched_insn == MVE_VSHL_T1
   7738       || matched_insn == MVE_VSHLL_T1
   7739       || matched_insn == MVE_VSLI;
   7740 
   7741   unsigned imm6 = (given & 0x3f0000) >> 16;
   7742 
   7743   if (matched_insn == MVE_VSHLL_T1)
   7744     imm6 &= 0x1f;
   7745 
   7746   unsigned shiftAmount = 0;
   7747   if ((imm6 & 0x20) != 0)
   7748     shiftAmount = startAt0 ? imm6 - 32 : 64 - imm6;
   7749   else if ((imm6 & 0x10) != 0)
   7750     shiftAmount = startAt0 ? imm6 - 16 : 32 - imm6;
   7751   else if ((imm6 & 0x08) != 0)
   7752     shiftAmount = startAt0 ? imm6 - 8 : 16 - imm6;
   7753   else
   7754     print_mve_undefined (info, UNDEF_SIZE_0);
   7755 
   7756   func (stream, dis_style_immediate, "%u", shiftAmount);
   7757 }
   7758 
   7759 static void
   7760 print_vec_condition (struct disassemble_info *info, long given,
   7761 		     enum mve_instructions matched_insn)
   7762 {
   7763   void *stream = info->stream;
   7764   fprintf_styled_ftype func = info->fprintf_styled_func;
   7765   long vec_cond = 0;
   7766 
   7767   switch (matched_insn)
   7768     {
   7769     case MVE_VPT_FP_T1:
   7770     case MVE_VCMP_FP_T1:
   7771       vec_cond = (((given & 0x1000) >> 10)
   7772 		  | ((given & 1) << 1)
   7773 		  | ((given & 0x0080) >> 7));
   7774       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7775       break;
   7776 
   7777     case MVE_VPT_FP_T2:
   7778     case MVE_VCMP_FP_T2:
   7779       vec_cond = (((given & 0x1000) >> 10)
   7780 		  | ((given & 0x0020) >> 4)
   7781 		  | ((given & 0x0080) >> 7));
   7782       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7783       break;
   7784 
   7785     case MVE_VPT_VEC_T1:
   7786     case MVE_VCMP_VEC_T1:
   7787       vec_cond = (given & 0x0080) >> 7;
   7788       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7789       break;
   7790 
   7791     case MVE_VPT_VEC_T2:
   7792     case MVE_VCMP_VEC_T2:
   7793       vec_cond = 2 | ((given & 0x0080) >> 7);
   7794       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7795       break;
   7796 
   7797     case MVE_VPT_VEC_T3:
   7798     case MVE_VCMP_VEC_T3:
   7799       vec_cond = 4 | ((given & 1) << 1) | ((given & 0x0080) >> 7);
   7800       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7801       break;
   7802 
   7803     case MVE_VPT_VEC_T4:
   7804     case MVE_VCMP_VEC_T4:
   7805       vec_cond = (given & 0x0080) >> 7;
   7806       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7807       break;
   7808 
   7809     case MVE_VPT_VEC_T5:
   7810     case MVE_VCMP_VEC_T5:
   7811       vec_cond = 2 | ((given & 0x0080) >> 7);
   7812       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7813       break;
   7814 
   7815     case MVE_VPT_VEC_T6:
   7816     case MVE_VCMP_VEC_T6:
   7817       vec_cond = 4 | ((given & 0x0020) >> 4) | ((given & 0x0080) >> 7);
   7818       func (stream, dis_style_sub_mnemonic, "%s", vec_condnames[vec_cond]);
   7819       break;
   7820 
   7821     case MVE_NONE:
   7822     case MVE_VPST:
   7823     default:
   7824       break;
   7825     }
   7826 }
   7827 
   7828 #define W_BIT 21
   7829 #define I_BIT 22
   7830 #define U_BIT 23
   7831 #define P_BIT 24
   7832 
   7833 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
   7834 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
   7835 #define NEGATIVE_BIT_SET  ((given & (1 << U_BIT)) == 0)
   7836 #define PRE_BIT_SET	  (given & (1 << P_BIT))
   7837 
   7838 /* The assembler string for an instruction can include %{X:...%} patterns,
   7839    where the 'X' is one of the characters understood by this function.
   7840 
   7841    This function takes the X character, and returns a new style.  This new
   7842    style will be used by the caller to temporarily change the current base
   7843    style.  */
   7844 
   7845 static enum disassembler_style
   7846 decode_base_style (const char x)
   7847 {
   7848   switch (x)
   7849     {
   7850     case 'A': return dis_style_address;
   7851     case 'B': return dis_style_sub_mnemonic;
   7852     case 'C': return dis_style_comment_start;
   7853     case 'D': return dis_style_assembler_directive;
   7854     case 'I': return dis_style_immediate;
   7855     case 'M': return dis_style_mnemonic;
   7856     case 'O': return dis_style_address_offset;
   7857     case 'R': return dis_style_register;
   7858     case 'S': return dis_style_symbol;
   7859     case 'T': return dis_style_text;
   7860     default:
   7861       abort ();
   7862     }
   7863 }
   7864 
   7865 /* Print one coprocessor instruction on INFO->STREAM.
   7866    Return TRUE if the instuction matched, FALSE if this is not a
   7867    recognised coprocessor instruction.  */
   7868 
   7869 static bool
   7870 print_insn_coprocessor_1 (const struct sopcode32 *opcodes,
   7871 			  bfd_vma pc,
   7872 			  struct disassemble_info *info,
   7873 			  long given,
   7874 			  bool thumb)
   7875 {
   7876   const struct sopcode32 *insn;
   7877   void *stream = info->stream;
   7878   fprintf_styled_ftype func = info->fprintf_styled_func;
   7879   unsigned long mask;
   7880   unsigned long value = 0;
   7881   int cond;
   7882   int cp_num;
   7883   struct arm_private_data *private_data = info->private_data;
   7884   arm_feature_set allowed_arches = ARM_ARCH_NONE;
   7885   arm_feature_set arm_ext_v8_1m_main =
   7886     ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
   7887   enum disassembler_style base_style = dis_style_mnemonic;
   7888   enum disassembler_style old_base_style = base_style;
   7889 
   7890   allowed_arches = private_data->features;
   7891 
   7892   for (insn = opcodes; insn->assembler; insn++)
   7893     {
   7894       unsigned long u_reg = 16;
   7895       bool is_unpredictable = false;
   7896       signed long value_in_comment = 0;
   7897       const char *c;
   7898 
   7899       if (ARM_FEATURE_ZERO (insn->arch))
   7900 	switch (insn->value)
   7901 	  {
   7902 	  case SENTINEL_IWMMXT_START:
   7903 	    if (info->mach != bfd_mach_arm_XScale
   7904 		&& info->mach != bfd_mach_arm_iWMMXt
   7905 		&& info->mach != bfd_mach_arm_iWMMXt2)
   7906 	      do
   7907 		insn++;
   7908 	      while ((! ARM_FEATURE_ZERO (insn->arch))
   7909 		     && insn->value != SENTINEL_IWMMXT_END);
   7910 	    continue;
   7911 
   7912 	  case SENTINEL_IWMMXT_END:
   7913 	    continue;
   7914 
   7915 	  case SENTINEL_GENERIC_START:
   7916 	    allowed_arches = private_data->features;
   7917 	    continue;
   7918 
   7919 	  default:
   7920 	    abort ();
   7921 	  }
   7922 
   7923       mask = insn->mask;
   7924       value = insn->value;
   7925       cp_num = (given >> 8) & 0xf;
   7926 
   7927       if (thumb)
   7928 	{
   7929 	  /* The high 4 bits are 0xe for Arm conditional instructions, and
   7930 	     0xe for arm unconditional instructions.  The rest of the
   7931 	     encoding is the same.  */
   7932 	  mask |= 0xf0000000;
   7933 	  value |= 0xe0000000;
   7934 	  if (ifthen_state)
   7935 	    cond = IFTHEN_COND;
   7936 	  else
   7937 	    cond = COND_UNCOND;
   7938 	}
   7939       else
   7940 	{
   7941 	  /* Only match unconditional instuctions against unconditional
   7942 	     patterns.  */
   7943 	  if ((given & 0xf0000000) == 0xf0000000)
   7944 	    {
   7945 	      mask |= 0xf0000000;
   7946 	      cond = COND_UNCOND;
   7947 	    }
   7948 	  else
   7949 	    {
   7950 	      cond = (given >> 28) & 0xf;
   7951 	      if (cond == 0xe)
   7952 		cond = COND_UNCOND;
   7953 	    }
   7954 	}
   7955 
   7956       if ((insn->isa == T32 && !thumb)
   7957 	  || (insn->isa == ARM && thumb))
   7958 	continue;
   7959 
   7960       if ((given & mask) != value)
   7961 	continue;
   7962 
   7963       if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches))
   7964 	continue;
   7965 
   7966       if (insn->value == 0xfe000010     /* mcr2  */
   7967 	  || insn->value == 0xfe100010  /* mrc2  */
   7968 	  || insn->value == 0xfc100000  /* ldc2  */
   7969 	  || insn->value == 0xfc000000) /* stc2  */
   7970 	{
   7971 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
   7972 	    is_unpredictable = true;
   7973 
   7974 	  /* Armv8.1-M Mainline FP & MVE instructions.  */
   7975 	  if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
   7976 	      && !ARM_CPU_IS_ANY (allowed_arches)
   7977 	      && (cp_num == 8 || cp_num == 14 || cp_num == 15))
   7978 	    continue;
   7979 
   7980 	}
   7981       else if (insn->value == 0x0e000000     /* cdp  */
   7982 	       || insn->value == 0xfe000000  /* cdp2  */
   7983 	       || insn->value == 0x0e000010  /* mcr  */
   7984 	       || insn->value == 0x0e100010  /* mrc  */
   7985 	       || insn->value == 0x0c100000  /* ldc  */
   7986 	       || insn->value == 0x0c000000) /* stc  */
   7987 	{
   7988 	  /* Floating-point instructions.  */
   7989 	  if (cp_num == 9 || cp_num == 10 || cp_num == 11)
   7990 	    continue;
   7991 
   7992 	  /* Armv8.1-M Mainline FP & MVE instructions.  */
   7993 	  if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches)
   7994 	      && !ARM_CPU_IS_ANY (allowed_arches)
   7995 	      && (cp_num == 8 || cp_num == 14 || cp_num == 15))
   7996 	    continue;
   7997 	}
   7998       else if ((insn->value == 0xec100f80      /* vldr (system register) */
   7999 		|| insn->value == 0xec000f80)  /* vstr (system register) */
   8000 	       && arm_decode_field (given, 24, 24) == 0
   8001 	       && arm_decode_field (given, 21, 21) == 0)
   8002 	/* If the P and W bits are both 0 then these encodings match the MVE
   8003 	   VLDR and VSTR instructions, these are in a different table, so we
   8004 	   don't let it match here.  */
   8005 	continue;
   8006 
   8007       for (c = insn->assembler; *c; c++)
   8008 	{
   8009 	  if (*c == '%')
   8010 	    {
   8011 	      const char mod = *++c;
   8012 
   8013 	      switch (mod)
   8014 		{
   8015 		case '{':
   8016 		  ++c;
   8017 		  if (*c == '\0')
   8018 		    abort ();
   8019 		  old_base_style = base_style;
   8020 		  base_style = decode_base_style (*c);
   8021 		  ++c;
   8022 		  if (*c != ':')
   8023 		    abort ();
   8024 		  break;
   8025 
   8026 		case '}':
   8027 		  base_style = old_base_style;
   8028 		  break;
   8029 
   8030 		case '%':
   8031 		  func (stream, base_style, "%%");
   8032 		  break;
   8033 
   8034 		case 'A':
   8035 		case 'K':
   8036 		  {
   8037 		    int rn = (given >> 16) & 0xf;
   8038 		    bfd_vma offset = given & 0xff;
   8039 
   8040 		    if (mod == 'K')
   8041 		      offset = given & 0x7f;
   8042 
   8043 		    func (stream, dis_style_text, "[");
   8044 		    func (stream, dis_style_register, "%s",
   8045 			  arm_regnames [(given >> 16) & 0xf]);
   8046 
   8047 		    if (PRE_BIT_SET || WRITEBACK_BIT_SET)
   8048 		      {
   8049 			/* Not unindexed.  The offset is scaled.  */
   8050 			if (cp_num == 9)
   8051 			  /* vldr.16/vstr.16 will shift the address
   8052 			     left by 1 bit only.  */
   8053 			  offset = offset * 2;
   8054 			else
   8055 			  offset = offset * 4;
   8056 
   8057 			if (NEGATIVE_BIT_SET)
   8058 			  offset = - offset;
   8059 			if (rn != 15)
   8060 			  value_in_comment = offset;
   8061 		      }
   8062 
   8063 		    if (PRE_BIT_SET)
   8064 		      {
   8065 			if (offset)
   8066 			  {
   8067 			    func (stream, dis_style_text, ", ");
   8068 			    func (stream, dis_style_immediate, "#%d",
   8069 				  (int) offset);
   8070 			    func (stream, dis_style_text, "]%s",
   8071 				  WRITEBACK_BIT_SET ? "!" : "");
   8072 			  }
   8073 			else if (NEGATIVE_BIT_SET)
   8074 			  {
   8075 			    func (stream, dis_style_text, ", ");
   8076 			    func (stream, dis_style_immediate, "#-0");
   8077 			    func (stream, dis_style_text, "]");
   8078 			  }
   8079 			else
   8080 			  func (stream, dis_style_text, "]");
   8081 		      }
   8082 		    else
   8083 		      {
   8084 			func (stream, dis_style_text, "]");
   8085 
   8086 			if (WRITEBACK_BIT_SET)
   8087 			  {
   8088 			    if (offset)
   8089 			      {
   8090 				func (stream, dis_style_text, ", ");
   8091 				func (stream, dis_style_immediate,
   8092 				      "#%d", (int) offset);
   8093 			      }
   8094 			    else if (NEGATIVE_BIT_SET)
   8095 			      {
   8096 				func (stream, dis_style_text, ", ");
   8097 				func (stream, dis_style_immediate, "#-0");
   8098 			      }
   8099 			  }
   8100 			else
   8101 			  {
   8102 			    func (stream, dis_style_text, ", {");
   8103 			    func (stream, dis_style_immediate, "%s%d",
   8104 				  (NEGATIVE_BIT_SET && !offset) ? "-" : "",
   8105 				  (int) offset);
   8106 			    func (stream, dis_style_text, "}");
   8107 			    value_in_comment = offset;
   8108 			  }
   8109 		      }
   8110 		    if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET))
   8111 		      {
   8112 			func (stream, dis_style_comment_start, "\t@ ");
   8113 			/* For unaligned PCs, apply off-by-alignment
   8114 			   correction.  */
   8115 			info->print_address_func (offset + pc
   8116 						  + info->bytes_per_chunk * 2
   8117 						  - (pc & 3),
   8118 						  info);
   8119 		      }
   8120 		  }
   8121 		  break;
   8122 
   8123 		case 'B':
   8124 		  {
   8125 		    int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
   8126 		    int offset = (given >> 1) & 0x3f;
   8127 
   8128 		    func (stream, dis_style_text, "{");
   8129 		    if (offset == 1)
   8130 		      func (stream, dis_style_register, "d%d", regno);
   8131 		    else if (regno + offset > 32)
   8132 		      {
   8133 			func (stream, dis_style_register, "d%d", regno);
   8134 			func (stream, dis_style_text, "-<overflow reg d%d>",
   8135 			      regno + offset - 1);
   8136 		      }
   8137 		    else
   8138 		      {
   8139 			func (stream, dis_style_register, "d%d", regno);
   8140 			func (stream, dis_style_text, "-");
   8141 			func (stream, dis_style_register, "d%d",
   8142 			      regno + offset - 1);
   8143 		      }
   8144 		    func (stream, dis_style_text, "}");
   8145 		  }
   8146 		  break;
   8147 
   8148 		case 'C':
   8149 		  {
   8150 		    bool single = ((given >> 8) & 1) == 0;
   8151 		    char reg_prefix = single ? 's' : 'd';
   8152 		    int Dreg = (given >> 22) & 0x1;
   8153 		    int Vdreg = (given >> 12) & 0xf;
   8154 		    int reg = single ? ((Vdreg << 1) | Dreg)
   8155 				     : ((Dreg << 4) | Vdreg);
   8156 		    int num = (given >> (single ? 0 : 1)) & 0x7f;
   8157 		    int maxreg = single ? 31 : 15;
   8158 		    int topreg = reg + num - 1;
   8159 
   8160 		    func (stream, dis_style_text, "{");
   8161 		    if (!num)
   8162 		      {
   8163 			/* Nothing.  */
   8164 		      }
   8165 		    else if (num == 1)
   8166 		      {
   8167 			func (stream, dis_style_register,
   8168 			      "%c%d", reg_prefix, reg);
   8169 			func (stream, dis_style_text, ", ");
   8170 		      }
   8171 		    else if (topreg > maxreg)
   8172 		      {
   8173 			func (stream, dis_style_register, "%c%d",
   8174 			      reg_prefix, reg);
   8175 			func (stream, dis_style_text, "-<overflow reg d%d, ",
   8176 			      single ? topreg >> 1 : topreg);
   8177 		      }
   8178 		    else
   8179 		      {
   8180 			func (stream, dis_style_register,
   8181 			      "%c%d", reg_prefix, reg);
   8182 			func (stream, dis_style_text, "-");
   8183 			func (stream, dis_style_register, "%c%d",
   8184 			      reg_prefix, topreg);
   8185 			func (stream, dis_style_text, ", ");
   8186 		      }
   8187 		    func (stream, dis_style_register, "VPR");
   8188 		    func (stream, dis_style_text, "}");
   8189 		  }
   8190 		  break;
   8191 
   8192 		case 'u':
   8193 		  if (cond != COND_UNCOND)
   8194 		    is_unpredictable = true;
   8195 
   8196 		  /* Fall through.  */
   8197 		case 'c':
   8198 		  if (cond != COND_UNCOND && cp_num == 9)
   8199 		    is_unpredictable = true;
   8200 
   8201 		  /* Fall through.  */
   8202 		case 'b':
   8203 		  func (stream, dis_style_mnemonic, "%s",
   8204 			arm_conditional[cond]);
   8205 		  break;
   8206 
   8207 		case 'J':
   8208 		  {
   8209 		    unsigned long regno
   8210 		      = arm_decode_field_multiple (given, 13, 15, 22, 22);
   8211 
   8212 		    switch (regno)
   8213 		      {
   8214 		      case 0x1:
   8215 			func (stream, dis_style_register, "FPSCR");
   8216 			break;
   8217 		      case 0x2:
   8218 			func (stream, dis_style_register, "FPSCR_nzcvqc");
   8219 			break;
   8220 		      case 0xc:
   8221 			func (stream, dis_style_register, "VPR");
   8222 			break;
   8223 		      case 0xd:
   8224 			func (stream, dis_style_register, "P0");
   8225 			break;
   8226 		      case 0xe:
   8227 			func (stream, dis_style_register, "FPCXTNS");
   8228 			break;
   8229 		      case 0xf:
   8230 			func (stream, dis_style_register, "FPCXTS");
   8231 			break;
   8232 		      default:
   8233 			func (stream, dis_style_text, "<invalid reg %lu>",
   8234 			      regno);
   8235 			break;
   8236 		      }
   8237 		  }
   8238 		  break;
   8239 
   8240 		case '0': case '1': case '2': case '3': case '4':
   8241 		case '5': case '6': case '7': case '8': case '9':
   8242 		  {
   8243 		    int width;
   8244 
   8245 		    c = arm_decode_bitfield (c, given, &value, &width);
   8246 
   8247 		    switch (*c)
   8248 		      {
   8249 		      case 'R':
   8250 			if (value == 15)
   8251 			  is_unpredictable = true;
   8252 			/* Fall through.  */
   8253 		      case 'r':
   8254 			if (c[1] == 'u')
   8255 			  {
   8256 			    /* Eat the 'u' character.  */
   8257 			    ++ c;
   8258 
   8259 			    if (u_reg == value)
   8260 			      is_unpredictable = true;
   8261 			    u_reg = value;
   8262 			  }
   8263 			func (stream, dis_style_register, "%s",
   8264 			      arm_regnames[value]);
   8265 			break;
   8266 		      case 'V':
   8267 			if (given & (1 << 6))
   8268 			  goto Q;
   8269 			/* FALLTHROUGH */
   8270 		      case 'D':
   8271 			func (stream, dis_style_register, "d%ld", value);
   8272 			break;
   8273 		      case 'Q':
   8274 		      Q:
   8275 			if (value & 1)
   8276 			  func (stream, dis_style_text,
   8277 				"<illegal reg q%ld.5>", value >> 1);
   8278 			else
   8279 			  func (stream, dis_style_register,
   8280 				"q%ld", value >> 1);
   8281 			break;
   8282 		      case 'd':
   8283 			func (stream, base_style, "%ld", value);
   8284 			value_in_comment = value;
   8285 			break;
   8286 		      case 'E':
   8287                         {
   8288 			  /* Converts immediate 8 bit back to float value.  */
   8289 			  unsigned floatVal = (value & 0x80) << 24
   8290 			    | (value & 0x3F) << 19
   8291 			    | ((value & 0x40) ? (0xF8 << 22) : (1 << 30));
   8292 
   8293 			  /* Quarter float have a maximum value of 31.0.
   8294 			     Get floating point value multiplied by 1e7.
   8295 			     The maximum value stays in limit of a 32-bit int.  */
   8296 			  unsigned decVal =
   8297 			    (78125 << (((floatVal >> 23) & 0xFF) - 124)) *
   8298 			    (16 + (value & 0xF));
   8299 
   8300 			  if (!(decVal % 1000000))
   8301 			    {
   8302 			      func (stream, dis_style_immediate, "%ld", value);
   8303 			      func (stream, dis_style_comment_start,
   8304 				    "\t@ 0x%08x %c%u.%01u",
   8305 				    floatVal, value & 0x80 ? '-' : ' ',
   8306 				    decVal / 10000000,
   8307 				    decVal % 10000000 / 1000000);
   8308 			    }
   8309 			  else if (!(decVal % 10000))
   8310 			    {
   8311 			      func (stream, dis_style_immediate, "%ld", value);
   8312 			      func (stream, dis_style_comment_start,
   8313 				    "\t@ 0x%08x %c%u.%03u",
   8314 				    floatVal, value & 0x80 ? '-' : ' ',
   8315 				    decVal / 10000000,
   8316 				    decVal % 10000000 / 10000);
   8317 			    }
   8318 			  else
   8319 			    {
   8320 			      func (stream, dis_style_immediate, "%ld", value);
   8321 			      func (stream, dis_style_comment_start,
   8322 				    "\t@ 0x%08x %c%u.%07u",
   8323 				    floatVal, value & 0x80 ? '-' : ' ',
   8324 				    decVal / 10000000, decVal % 10000000);
   8325 			    }
   8326 			  break;
   8327 			}
   8328 		      case 'k':
   8329 			{
   8330 			  int from = (given & (1 << 7)) ? 32 : 16;
   8331 			  func (stream, dis_style_immediate, "%ld",
   8332 				from - value);
   8333 			}
   8334 			break;
   8335 
   8336 		      case 'w':
   8337 			if (width == 2)
   8338 			  func (stream, dis_style_mnemonic, "%s",
   8339 				iwmmxt_wwnames[value]);
   8340 			else
   8341 			  func (stream, dis_style_mnemonic, "%s",
   8342 				iwmmxt_wwssnames[value]);
   8343 			break;
   8344 
   8345 		      case 'g':
   8346 			func (stream, dis_style_register, "%s",
   8347 			      iwmmxt_regnames[value]);
   8348 			break;
   8349 		      case 'G':
   8350 			func (stream, dis_style_register, "%s",
   8351 			      iwmmxt_cregnames[value]);
   8352 			break;
   8353 
   8354 		      case 'x':
   8355 			func (stream, dis_style_immediate, "0x%lx",
   8356 			      (value & 0xffffffffUL));
   8357 			break;
   8358 
   8359 		      case 'c':
   8360 			switch (value)
   8361 			  {
   8362 			  case 0:
   8363 			    func (stream, dis_style_mnemonic, "eq");
   8364 			    break;
   8365 
   8366 			  case 1:
   8367 			    func (stream, dis_style_mnemonic, "vs");
   8368 			    break;
   8369 
   8370 			  case 2:
   8371 			    func (stream, dis_style_mnemonic, "ge");
   8372 			    break;
   8373 
   8374 			  case 3:
   8375 			    func (stream, dis_style_mnemonic, "gt");
   8376 			    break;
   8377 
   8378 			  default:
   8379 			    func (stream, dis_style_text, "??");
   8380 			    break;
   8381 			  }
   8382 			break;
   8383 
   8384 		      case '`':
   8385 			c++;
   8386 			if (value == 0)
   8387 			  func (stream, dis_style_mnemonic, "%c", *c);
   8388 			break;
   8389 		      case '\'':
   8390 			c++;
   8391 			if (value == ((1ul << width) - 1))
   8392 			  func (stream, base_style, "%c", *c);
   8393 			break;
   8394 		      case '?':
   8395 			func (stream, base_style, "%c",
   8396 			      c[(1 << width) - (int) value]);
   8397 			c += 1 << width;
   8398 			break;
   8399 		      default:
   8400 			abort ();
   8401 		      }
   8402 		  }
   8403 		  break;
   8404 
   8405 		case 'y':
   8406 		case 'z':
   8407 		  {
   8408 		    int single = *c++ == 'y';
   8409 		    int regno;
   8410 
   8411 		    switch (*c)
   8412 		      {
   8413 		      case '4': /* Sm pair */
   8414 		      case '0': /* Sm, Dm */
   8415 			regno = given & 0x0000000f;
   8416 			if (single)
   8417 			  {
   8418 			    regno <<= 1;
   8419 			    regno += (given >> 5) & 1;
   8420 			  }
   8421 			else
   8422 			  regno += ((given >> 5) & 1) << 4;
   8423 			break;
   8424 
   8425 		      case '1': /* Sd, Dd */
   8426 			regno = (given >> 12) & 0x0000000f;
   8427 			if (single)
   8428 			  {
   8429 			    regno <<= 1;
   8430 			    regno += (given >> 22) & 1;
   8431 			  }
   8432 			else
   8433 			  regno += ((given >> 22) & 1) << 4;
   8434 			break;
   8435 
   8436 		      case '2': /* Sn, Dn */
   8437 			regno = (given >> 16) & 0x0000000f;
   8438 			if (single)
   8439 			  {
   8440 			    regno <<= 1;
   8441 			    regno += (given >> 7) & 1;
   8442 			  }
   8443 			else
   8444 			  regno += ((given >> 7) & 1) << 4;
   8445 			break;
   8446 
   8447 		      case '3': /* List */
   8448 			func (stream, dis_style_text, "{");
   8449 			regno = (given >> 12) & 0x0000000f;
   8450 			if (single)
   8451 			  {
   8452 			    regno <<= 1;
   8453 			    regno += (given >> 22) & 1;
   8454 			  }
   8455 			else
   8456 			  regno += ((given >> 22) & 1) << 4;
   8457 			break;
   8458 
   8459 		      default:
   8460 			abort ();
   8461 		      }
   8462 
   8463 		    func (stream, dis_style_register, "%c%d",
   8464 			  single ? 's' : 'd', regno);
   8465 
   8466 		    if (*c == '3')
   8467 		      {
   8468 			int count = given & 0xff;
   8469 
   8470 			if (single == 0)
   8471 			  count >>= 1;
   8472 
   8473 			if (--count)
   8474 			  {
   8475 			    func (stream, dis_style_text, "-");
   8476 			    func (stream, dis_style_register, "%c%d",
   8477 				  single ? 's' : 'd',
   8478 				  regno + count);
   8479 			  }
   8480 
   8481 			func (stream, dis_style_text, "}");
   8482 		      }
   8483 		    else if (*c == '4')
   8484 		      {
   8485 			func (stream, dis_style_text, ", ");
   8486 			func (stream, dis_style_register, "%c%d",
   8487 			      single ? 's' : 'd', regno + 1);
   8488 		      }
   8489 		  }
   8490 		  break;
   8491 
   8492 		case 'L':
   8493 		  switch (given & 0x00400100)
   8494 		    {
   8495 		    case 0x00000000:
   8496 		      func (stream, dis_style_mnemonic, "b");
   8497 		      break;
   8498 		    case 0x00400000:
   8499 		      func (stream, dis_style_mnemonic, "h");
   8500 		      break;
   8501 		    case 0x00000100:
   8502 		      func (stream, dis_style_mnemonic, "w");
   8503 		      break;
   8504 		    case 0x00400100:
   8505 		      func (stream, dis_style_mnemonic, "d");
   8506 		      break;
   8507 		    default:
   8508 		      break;
   8509 		    }
   8510 		  break;
   8511 
   8512 		case 'Z':
   8513 		  {
   8514 		    /* given (20, 23) | given (0, 3) */
   8515 		    value = ((given >> 16) & 0xf0) | (given & 0xf);
   8516 		    func (stream, dis_style_immediate, "%d", (int) value);
   8517 		  }
   8518 		  break;
   8519 
   8520 		case 'l':
   8521 		  /* This is like the 'A' operator, except that if
   8522 		     the width field "M" is zero, then the offset is
   8523 		     *not* multiplied by four.  */
   8524 		  {
   8525 		    int offset = given & 0xff;
   8526 		    int multiplier = (given & 0x00000100) ? 4 : 1;
   8527 
   8528 		    func (stream, dis_style_text, "[");
   8529 		    func (stream, dis_style_register, "%s",
   8530 			  arm_regnames [(given >> 16) & 0xf]);
   8531 
   8532 		    if (multiplier > 1)
   8533 		      {
   8534 			value_in_comment = offset * multiplier;
   8535 			if (NEGATIVE_BIT_SET)
   8536 			  value_in_comment = - value_in_comment;
   8537 		      }
   8538 
   8539 		    if (offset)
   8540 		      {
   8541 			if (PRE_BIT_SET)
   8542 			  {
   8543 			    func (stream, dis_style_text, ", ");
   8544 			    func (stream, dis_style_immediate, "#%s%d",
   8545 				  NEGATIVE_BIT_SET ? "-" : "",
   8546 				  offset * multiplier);
   8547 			    func (stream, dis_style_text, "]%s",
   8548 				  WRITEBACK_BIT_SET ? "!" : "");
   8549 			  }
   8550 			else
   8551 			  {
   8552 			    func (stream, dis_style_text, "], ");
   8553 			    func (stream, dis_style_immediate, "#%s%d",
   8554 				  NEGATIVE_BIT_SET ? "-" : "",
   8555 				  offset * multiplier);
   8556 			  }
   8557 		      }
   8558 		    else
   8559 		      func (stream, dis_style_text, "]");
   8560 		  }
   8561 		  break;
   8562 
   8563 		case 'r':
   8564 		  {
   8565 		    int imm4 = (given >> 4) & 0xf;
   8566 		    int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1);
   8567 		    int ubit = ! NEGATIVE_BIT_SET;
   8568 		    const char *rm = arm_regnames [given & 0xf];
   8569 		    const char *rn = arm_regnames [(given >> 16) & 0xf];
   8570 
   8571 		    switch (puw_bits)
   8572 		      {
   8573 		      case 1:
   8574 		      case 3:
   8575 			func (stream, dis_style_text, "[");
   8576 			func (stream, dis_style_register, "%s", rn);
   8577 			func (stream, dis_style_text, "], ");
   8578 			func (stream, dis_style_text, "%c", ubit ? '+' : '-');
   8579 			func (stream, dis_style_register, "%s", rm);
   8580 			if (imm4)
   8581 			  {
   8582 			    func (stream, dis_style_text, ", ");
   8583 			    func (stream, dis_style_sub_mnemonic, "lsl ");
   8584 			    func (stream, dis_style_immediate, "#%d", imm4);
   8585 			  }
   8586 			break;
   8587 
   8588 		      case 4:
   8589 		      case 5:
   8590 		      case 6:
   8591 		      case 7:
   8592 			func (stream, dis_style_text, "[");
   8593 			func (stream, dis_style_register, "%s", rn);
   8594 			func (stream, dis_style_text, ", ");
   8595 			func (stream, dis_style_text, "%c", ubit ? '+' : '-');
   8596 			func (stream, dis_style_register, "%s", rm);
   8597 			if (imm4 > 0)
   8598 			  {
   8599 			    func (stream, dis_style_text, ", ");
   8600 			    func (stream, dis_style_sub_mnemonic, "lsl ");
   8601 			    func (stream, dis_style_immediate, "#%d", imm4);
   8602 			  }
   8603 			func (stream, dis_style_text, "]");
   8604 			if (puw_bits == 5 || puw_bits == 7)
   8605 			  func (stream, dis_style_text, "!");
   8606 			break;
   8607 
   8608 		      default:
   8609 			func (stream, dis_style_text, "INVALID");
   8610 		      }
   8611 		  }
   8612 		  break;
   8613 
   8614 		case 'i':
   8615 		  {
   8616 		    long imm5;
   8617 		    imm5 = ((given & 0x100) >> 4) | (given & 0xf);
   8618 		    func (stream, dis_style_immediate, "%ld",
   8619 			  (imm5 == 0) ? 32 : imm5);
   8620 		  }
   8621 		  break;
   8622 
   8623 		default:
   8624 		  abort ();
   8625 		}
   8626 	    }
   8627 	  else
   8628 	    {
   8629 	      if (*c == '@')
   8630 		base_style = dis_style_comment_start;
   8631 
   8632 	      if (*c == '\t')
   8633 		base_style = dis_style_text;
   8634 
   8635 	      func (stream, base_style, "%c", *c);
   8636 	    }
   8637 	}
   8638 
   8639       if (value_in_comment > 32 || value_in_comment < -16)
   8640 	func (stream, dis_style_comment_start, "\t@ 0x%lx",
   8641 	      (value_in_comment & 0xffffffffUL));
   8642 
   8643       if (is_unpredictable)
   8644 	func (stream, dis_style_comment_start, UNPREDICTABLE_INSTRUCTION);
   8645 
   8646       return true;
   8647     }
   8648   return false;
   8649 }
   8650 
   8651 static bool
   8652 print_insn_coprocessor (bfd_vma pc,
   8653 			struct disassemble_info *info,
   8654 			long given,
   8655 			bool thumb)
   8656 {
   8657   return print_insn_coprocessor_1 (coprocessor_opcodes,
   8658 				   pc, info, given, thumb);
   8659 }
   8660 
   8661 static bool
   8662 print_insn_generic_coprocessor (bfd_vma pc,
   8663 				struct disassemble_info *info,
   8664 				long given,
   8665 				bool thumb)
   8666 {
   8667   return print_insn_coprocessor_1 (generic_coprocessor_opcodes,
   8668 				   pc, info, given, thumb);
   8669 }
   8670 
   8671 /* Decodes and prints ARM addressing modes.  Returns the offset
   8672    used in the address, if any, if it is worthwhile printing the
   8673    offset as a hexadecimal value in a comment at the end of the
   8674    line of disassembly.  */
   8675 
   8676 static signed long
   8677 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
   8678 {
   8679   void *stream = info->stream;
   8680   fprintf_styled_ftype func = info->fprintf_styled_func;
   8681   bfd_vma offset = 0;
   8682 
   8683   if (((given & 0x000f0000) == 0x000f0000)
   8684       && ((given & 0x02000000) == 0))
   8685     {
   8686       offset = given & 0xfff;
   8687 
   8688       func (stream, dis_style_text, "[");
   8689       func (stream, dis_style_register, "pc");
   8690 
   8691       if (PRE_BIT_SET)
   8692 	{
   8693 	  /* Pre-indexed.  Elide offset of positive zero when
   8694 	     non-writeback.  */
   8695 	  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
   8696 	    {
   8697 	      func (stream, dis_style_text, ", ");
   8698 	      func (stream, dis_style_immediate, "#%s%d",
   8699 		    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   8700 	    }
   8701 
   8702 	  if (NEGATIVE_BIT_SET)
   8703 	    offset = -offset;
   8704 
   8705 	  offset += pc + 8;
   8706 
   8707 	  /* Cope with the possibility of write-back
   8708 	     being used.  Probably a very dangerous thing
   8709 	     for the programmer to do, but who are we to
   8710 	     argue ?  */
   8711 	  func (stream, dis_style_text, "]%s", WRITEBACK_BIT_SET ? "!" : "");
   8712 	}
   8713       else  /* Post indexed.  */
   8714 	{
   8715 	  func (stream, dis_style_text, "], ");
   8716 	  func (stream, dis_style_immediate, "#%s%d",
   8717 		NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   8718 
   8719 	  /* Ie ignore the offset.  */
   8720 	  offset = pc + 8;
   8721 	}
   8722 
   8723       func (stream, dis_style_comment_start, "\t@ ");
   8724       info->print_address_func (offset, info);
   8725       offset = 0;
   8726     }
   8727   else
   8728     {
   8729       func (stream, dis_style_text, "[");
   8730       func (stream, dis_style_register, "%s",
   8731 	    arm_regnames[(given >> 16) & 0xf]);
   8732 
   8733       if (PRE_BIT_SET)
   8734 	{
   8735 	  if ((given & 0x02000000) == 0)
   8736 	    {
   8737 	      /* Elide offset of positive zero when non-writeback.  */
   8738 	      offset = given & 0xfff;
   8739 	      if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
   8740 		{
   8741 		  func (stream, dis_style_text, ", ");
   8742 		  func (stream, dis_style_immediate, "#%s%d",
   8743 			NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   8744 		}
   8745 	    }
   8746 	  else
   8747 	    {
   8748 	      func (stream, dis_style_text, ", %s",
   8749 		    NEGATIVE_BIT_SET ? "-" : "");
   8750 	      arm_decode_shift (given, func, stream, true);
   8751 	    }
   8752 
   8753 	  func (stream, dis_style_text, "]%s",
   8754 		WRITEBACK_BIT_SET ? "!" : "");
   8755 	}
   8756       else
   8757 	{
   8758 	  if ((given & 0x02000000) == 0)
   8759 	    {
   8760 	      /* Always show offset.  */
   8761 	      offset = given & 0xfff;
   8762 	      func (stream, dis_style_text, "], ");
   8763 	      func (stream, dis_style_immediate, "#%s%d",
   8764 		    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   8765 	    }
   8766 	  else
   8767 	    {
   8768 	      func (stream, dis_style_text, "], %s",
   8769 		    NEGATIVE_BIT_SET ? "-" : "");
   8770 	      arm_decode_shift (given, func, stream, true);
   8771 	    }
   8772 	}
   8773       if (NEGATIVE_BIT_SET)
   8774 	offset = -offset;
   8775     }
   8776 
   8777   return (signed long) offset;
   8778 }
   8779 
   8780 
   8781 /* Print one cde instruction on INFO->STREAM.
   8782    Return TRUE if the instuction matched, FALSE if this is not a
   8783    recognised cde instruction.  */
   8784 static bool
   8785 print_insn_cde (struct disassemble_info *info, long given, bool thumb)
   8786 {
   8787   const struct cdeopcode32 *insn;
   8788   void *stream = info->stream;
   8789   fprintf_styled_ftype func = info->fprintf_styled_func;
   8790   enum disassembler_style base_style = dis_style_mnemonic;
   8791   enum disassembler_style old_base_style = base_style;
   8792 
   8793   if (thumb)
   8794   {
   8795     /* Manually extract the coprocessor code from a known point.
   8796        This position is the same across all CDE instructions.  */
   8797     for (insn = cde_opcodes; insn->assembler; insn++)
   8798     {
   8799       uint16_t coproc = (given >> insn->coproc_shift) & insn->coproc_mask;
   8800       uint16_t coproc_mask = 1 << coproc;
   8801       if (! (coproc_mask & cde_coprocs))
   8802 	continue;
   8803 
   8804       if ((given & insn->mask) == insn->value)
   8805       {
   8806 	bool is_unpredictable = false;
   8807 	const char *c;
   8808 
   8809 	for (c = insn->assembler; *c; c++)
   8810 	{
   8811 	  if (*c == '%')
   8812 	  {
   8813 	    switch (*++c)
   8814 	    {
   8815 	      case '{':
   8816 		++c;
   8817 		if (*c == '\0')
   8818 		  abort ();
   8819 		old_base_style = base_style;
   8820 		base_style = decode_base_style (*c);
   8821 		++c;
   8822 		if (*c != ':')
   8823 		  abort ();
   8824 		break;
   8825 
   8826 	      case '}':
   8827 		base_style = old_base_style;
   8828 		break;
   8829 
   8830 	      case '%':
   8831 		func (stream, base_style, "%%");
   8832 		break;
   8833 
   8834 	      case '0': case '1': case '2': case '3': case '4':
   8835 	      case '5': case '6': case '7': case '8': case '9':
   8836 	      {
   8837 		int width;
   8838 		unsigned long value;
   8839 
   8840 		c = arm_decode_bitfield (c, given, &value, &width);
   8841 
   8842 		switch (*c)
   8843 		{
   8844 		  case 'S':
   8845 		    if (value > 10)
   8846 		      is_unpredictable = true;
   8847 		    /* Fall through.  */
   8848 		  case 'R':
   8849 		    if (value == 13)
   8850 		      is_unpredictable = true;
   8851 		    /* Fall through.  */
   8852 		  case 'r':
   8853 		    func (stream, dis_style_register, "%s",
   8854 			  arm_regnames[value]);
   8855 		    break;
   8856 
   8857 		  case 'n':
   8858 		    if (value == 15)
   8859 		      func (stream, dis_style_register, "%s", "APSR_nzcv");
   8860 		    else
   8861 		      func (stream, dis_style_register, "%s",
   8862 			    arm_regnames[value]);
   8863 		    break;
   8864 
   8865 		  case 'T':
   8866 		    func (stream, dis_style_register, "%s",
   8867 			  arm_regnames[(value + 1) & 15]);
   8868 		    break;
   8869 
   8870 		  case 'd':
   8871 		    func (stream, dis_style_immediate, "%ld", value);
   8872 		    break;
   8873 
   8874 		  case 'V':
   8875 		    if (given & (1 << 6))
   8876 		      func (stream, dis_style_register, "q%ld", value >> 1);
   8877 		    else if (given & (1 << 24))
   8878 		      func (stream, dis_style_register, "d%ld", value);
   8879 		    else
   8880 		      {
   8881 			/* Encoding for S register is different than for D and
   8882 			   Q registers.  S registers are encoded using the top
   8883 			   single bit in position 22 as the lowest bit of the
   8884 			   register number, while for Q and D it represents the
   8885 			   highest bit of the register number.  */
   8886 			uint8_t top_bit = (value >> 4) & 1;
   8887 			uint8_t tmp = (value << 1) & 0x1e;
   8888 			uint8_t res = tmp | top_bit;
   8889 			func (stream, dis_style_register, "s%u", res);
   8890 		      }
   8891 		    break;
   8892 
   8893 		default:
   8894 		  abort ();
   8895 		}
   8896 	      }
   8897 	    break;
   8898 
   8899 	    case 'p':
   8900 	      {
   8901 		uint8_t proc_number = (given >> 8) & 0x7;
   8902 		func (stream, dis_style_register, "p%u", proc_number);
   8903 		break;
   8904 	      }
   8905 
   8906 	    case 'a':
   8907 	      {
   8908 		uint8_t a_offset = 28;
   8909 		if (given & (1 << a_offset))
   8910 		  func (stream, dis_style_mnemonic, "a");
   8911 		break;
   8912 	      }
   8913 	  default:
   8914 	    abort ();
   8915 	  }
   8916 	}
   8917 	else
   8918 	  {
   8919 	    if (*c == '@')
   8920 	      base_style = dis_style_comment_start;
   8921 	    if (*c == '\t')
   8922 	      base_style = dis_style_text;
   8923 
   8924 	    func (stream, base_style, "%c", *c);
   8925 	  }
   8926       }
   8927 
   8928       if (is_unpredictable)
   8929 	func (stream, dis_style_comment_start, UNPREDICTABLE_INSTRUCTION);
   8930 
   8931       return true;
   8932       }
   8933     }
   8934     return false;
   8935   }
   8936   else
   8937     return false;
   8938 }
   8939 
   8940 
   8941 /* Print one neon instruction on INFO->STREAM.
   8942    Return TRUE if the instuction matched, FALSE if this is not a
   8943    recognised neon instruction.  */
   8944 
   8945 static bool
   8946 print_insn_neon (struct disassemble_info *info, long given, bool thumb)
   8947 {
   8948   const struct opcode32 *insn;
   8949   void *stream = info->stream;
   8950   fprintf_styled_ftype func = info->fprintf_styled_func;
   8951   enum disassembler_style base_style = dis_style_mnemonic;
   8952   enum disassembler_style old_base_style = base_style;
   8953 
   8954   if (thumb)
   8955     {
   8956       if ((given & 0xef000000) == 0xef000000)
   8957 	{
   8958 	  /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding.  */
   8959 	  unsigned long bit28 = given & (1 << 28);
   8960 
   8961 	  given &= 0x00ffffff;
   8962 	  if (bit28)
   8963             given |= 0xf3000000;
   8964           else
   8965 	    given |= 0xf2000000;
   8966 	}
   8967       else if ((given & 0xff000000) == 0xf9000000)
   8968 	given ^= 0xf9000000 ^ 0xf4000000;
   8969       /* BFloat16 neon instructions without special top byte handling.  */
   8970       else if ((given & 0xff000000) == 0xfe000000
   8971 	       || (given & 0xff000000) == 0xfc000000)
   8972 	;
   8973       /* vdup is also a valid neon instruction.  */
   8974       else if ((given & 0xff900f5f) != 0xee800b10)
   8975 	return false;
   8976     }
   8977 
   8978   for (insn = neon_opcodes; insn->assembler; insn++)
   8979     {
   8980       unsigned long cond_mask = insn->mask;
   8981       unsigned long cond_value = insn->value;
   8982       int cond;
   8983 
   8984       if (thumb)
   8985         {
   8986           if ((cond_mask & 0xf0000000) == 0) {
   8987               /* For the entries in neon_opcodes, an opcode mask/value with
   8988                  the high 4 bits equal to 0 indicates a conditional
   8989                  instruction. For thumb however, we need to include those
   8990                  bits in the instruction matching.  */
   8991               cond_mask |= 0xf0000000;
   8992               /* Furthermore, the thumb encoding of a conditional instruction
   8993                  will have the high 4 bits equal to 0xe.  */
   8994               cond_value |= 0xe0000000;
   8995           }
   8996           if (ifthen_state)
   8997             cond = IFTHEN_COND;
   8998           else
   8999             cond = COND_UNCOND;
   9000         }
   9001       else
   9002         {
   9003           if ((given & 0xf0000000) == 0xf0000000)
   9004             {
   9005               /* If the instruction is unconditional, update the mask to only
   9006                  match against unconditional opcode values.  */
   9007               cond_mask |= 0xf0000000;
   9008               cond = COND_UNCOND;
   9009             }
   9010           else
   9011             {
   9012               cond = (given >> 28) & 0xf;
   9013               if (cond == 0xe)
   9014                 cond = COND_UNCOND;
   9015             }
   9016         }
   9017 
   9018       if ((given & cond_mask) == cond_value)
   9019 	{
   9020 	  signed long value_in_comment = 0;
   9021 	  bool is_unpredictable = false;
   9022 	  const char *c;
   9023 
   9024 	  for (c = insn->assembler; *c; c++)
   9025 	    {
   9026 	      if (*c == '%')
   9027 		{
   9028 		  switch (*++c)
   9029 		    {
   9030 		    case '{':
   9031 		      ++c;
   9032 		      if (*c == '\0')
   9033 			abort ();
   9034 		      old_base_style = base_style;
   9035 		      base_style = decode_base_style (*c);
   9036 		      ++c;
   9037 		      if (*c != ':')
   9038 			abort ();
   9039 		      break;
   9040 
   9041 		    case '}':
   9042 		      base_style = old_base_style;
   9043 		      break;
   9044 
   9045 		    case '%':
   9046 		      func (stream, base_style, "%%");
   9047 		      break;
   9048 
   9049 		    case 'u':
   9050 		      if (thumb && ifthen_state)
   9051 			is_unpredictable = true;
   9052 
   9053 		      /* Fall through.  */
   9054 		    case 'c':
   9055 		      func (stream, dis_style_mnemonic, "%s",
   9056 			    arm_conditional[cond]);
   9057 		      break;
   9058 
   9059 		    case 'A':
   9060 		      {
   9061 			static const unsigned char enc[16] =
   9062 			{
   9063 			  0x4, 0x14, /* st4 0,1 */
   9064 			  0x4, /* st1 2 */
   9065 			  0x4, /* st2 3 */
   9066 			  0x3, /* st3 4 */
   9067 			  0x13, /* st3 5 */
   9068 			  0x3, /* st1 6 */
   9069 			  0x1, /* st1 7 */
   9070 			  0x2, /* st2 8 */
   9071 			  0x12, /* st2 9 */
   9072 			  0x2, /* st1 10 */
   9073 			  0, 0, 0, 0, 0
   9074 			};
   9075 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   9076 			int rn = ((given >> 16) & 0xf);
   9077 			int rm = ((given >> 0) & 0xf);
   9078 			int align = ((given >> 4) & 0x3);
   9079 			int type = ((given >> 8) & 0xf);
   9080 			int n = enc[type] & 0xf;
   9081 			int stride = (enc[type] >> 4) + 1;
   9082 			int ix;
   9083 
   9084 			func (stream, dis_style_text, "{");
   9085 			if (stride > 1)
   9086 			  for (ix = 0; ix != n; ix++)
   9087 			    {
   9088 			      if (ix > 0)
   9089 				func (stream, dis_style_text, ",");
   9090 			      func (stream, dis_style_register, "d%d",
   9091 				    rd + ix * stride);
   9092 			    }
   9093 			else if (n == 1)
   9094 			  func (stream, dis_style_register, "d%d", rd);
   9095 			else
   9096 			  {
   9097 			    func (stream, dis_style_register, "d%d", rd);
   9098 			    func (stream, dis_style_text, "-");
   9099 			    func (stream, dis_style_register, "d%d",
   9100 				  rd + n - 1);
   9101 			  }
   9102 			func (stream, dis_style_text, "}, [");
   9103 			func (stream, dis_style_register, "%s",
   9104 			      arm_regnames[rn]);
   9105 			if (align)
   9106 			  {
   9107 			    func (stream, dis_style_text, " :");
   9108 			    func (stream, dis_style_immediate, "%d",
   9109 				  32 << align);
   9110 			  }
   9111 			func (stream, dis_style_text, "]");
   9112 			if (rm == 0xd)
   9113 			  func (stream, dis_style_text, "!");
   9114 			else if (rm != 0xf)
   9115 			  {
   9116 			    func (stream, dis_style_text, ", ");
   9117 			    func (stream, dis_style_register, "%s",
   9118 				  arm_regnames[rm]);
   9119 			  }
   9120 		      }
   9121 		      break;
   9122 
   9123 		    case 'B':
   9124 		      {
   9125 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   9126 			int rn = ((given >> 16) & 0xf);
   9127 			int rm = ((given >> 0) & 0xf);
   9128 			int idx_align = ((given >> 4) & 0xf);
   9129                         int align = 0;
   9130 			int size = ((given >> 10) & 0x3);
   9131 			int idx = idx_align >> (size + 1);
   9132                         int length = ((given >> 8) & 3) + 1;
   9133                         int stride = 1;
   9134                         int i;
   9135 
   9136                         if (length > 1 && size > 0)
   9137                           stride = (idx_align & (1 << size)) ? 2 : 1;
   9138 
   9139                         switch (length)
   9140                           {
   9141                           case 1:
   9142                             {
   9143                               int amask = (1 << size) - 1;
   9144                               if ((idx_align & (1 << size)) != 0)
   9145                                 return false;
   9146                               if (size > 0)
   9147                                 {
   9148                                   if ((idx_align & amask) == amask)
   9149                                     align = 8 << size;
   9150                                   else if ((idx_align & amask) != 0)
   9151                                     return false;
   9152                                 }
   9153                               }
   9154                             break;
   9155 
   9156                           case 2:
   9157                             if (size == 2 && (idx_align & 2) != 0)
   9158                               return false;
   9159                             align = (idx_align & 1) ? 16 << size : 0;
   9160                             break;
   9161 
   9162                           case 3:
   9163                             if ((size == 2 && (idx_align & 3) != 0)
   9164                                 || (idx_align & 1) != 0)
   9165                               return false;
   9166                             break;
   9167 
   9168                           case 4:
   9169                             if (size == 2)
   9170                               {
   9171                                 if ((idx_align & 3) == 3)
   9172                                   return false;
   9173                                 align = (idx_align & 3) * 64;
   9174                               }
   9175                             else
   9176                               align = (idx_align & 1) ? 32 << size : 0;
   9177                             break;
   9178 
   9179                           default:
   9180                             abort ();
   9181                           }
   9182 
   9183 			func (stream, dis_style_text, "{");
   9184                         for (i = 0; i < length; i++)
   9185 			  {
   9186 			    if (i > 0)
   9187 			      func (stream, dis_style_text, ",");
   9188 			    func (stream, dis_style_register, "d%d[%d]",
   9189 				  rd + i * stride, idx);
   9190 			  }
   9191 			func (stream, dis_style_text, "}, [");
   9192 			func (stream, dis_style_register, "%s",
   9193 			      arm_regnames[rn]);
   9194 			if (align)
   9195 			  {
   9196 			    func (stream, dis_style_text, " :");
   9197 			    func (stream, dis_style_immediate, "%d", align);
   9198 			  }
   9199 			func (stream, dis_style_text, "]");
   9200 			if (rm == 0xd)
   9201 			  func (stream, dis_style_text, "!");
   9202 			else if (rm != 0xf)
   9203 			  {
   9204 			    func (stream, dis_style_text, ", ");
   9205 			    func (stream, dis_style_register, "%s",
   9206 				  arm_regnames[rm]);
   9207 			  }
   9208 		      }
   9209 		      break;
   9210 
   9211 		    case 'C':
   9212 		      {
   9213 			int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
   9214 			int rn = ((given >> 16) & 0xf);
   9215 			int rm = ((given >> 0) & 0xf);
   9216 			int align = ((given >> 4) & 0x1);
   9217 			int size = ((given >> 6) & 0x3);
   9218 			int type = ((given >> 8) & 0x3);
   9219 			int n = type + 1;
   9220 			int stride = ((given >> 5) & 0x1);
   9221 			int ix;
   9222 
   9223 			if (stride && (n == 1))
   9224 			  n++;
   9225 			else
   9226 			  stride++;
   9227 
   9228 			func (stream, dis_style_text, "{");
   9229 			if (stride > 1)
   9230 			  for (ix = 0; ix != n; ix++)
   9231 			    {
   9232 			      if (ix > 0)
   9233 				func (stream, dis_style_text, ",");
   9234 			      func (stream, dis_style_register, "d%d[]",
   9235 				    rd + ix * stride);
   9236 			    }
   9237 			else if (n == 1)
   9238 			  func (stream, dis_style_register, "d%d[]", rd);
   9239 			else
   9240 			  {
   9241 			    func (stream, dis_style_register, "d%d[]", rd);
   9242 			    func (stream, dis_style_text, "-");
   9243 			    func (stream, dis_style_register, "d%d[]",
   9244 				  rd + n - 1);
   9245 			  }
   9246 			func (stream, dis_style_text, "}, [");
   9247 			func (stream, dis_style_register, "%s",
   9248 			      arm_regnames[rn]);
   9249 			if (align)
   9250 			  {
   9251                             align = (8 * (type + 1)) << size;
   9252                             if (type == 3)
   9253                               align = (size > 1) ? align >> 1 : align;
   9254 			    if (type == 2 || (type == 0 && !size))
   9255 			      func (stream, dis_style_text,
   9256 				    " :<bad align %d>", align);
   9257 			    else
   9258 			      {
   9259 				func (stream, dis_style_text, " :");
   9260 				func (stream, dis_style_immediate,
   9261 				      "%d", align);
   9262 			      }
   9263 			  }
   9264 			func (stream, dis_style_text, "]");
   9265 			if (rm == 0xd)
   9266 			  func (stream, dis_style_text, "!");
   9267 			else if (rm != 0xf)
   9268 			  {
   9269 			    func (stream, dis_style_text, ", ");
   9270 			    func (stream, dis_style_register, "%s",
   9271 				  arm_regnames[rm]);
   9272 			  }
   9273 		      }
   9274 		      break;
   9275 
   9276 		    case 'D':
   9277 		      {
   9278 			int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
   9279 			int size = (given >> 20) & 3;
   9280 			int reg = raw_reg & ((4 << size) - 1);
   9281 			int ix = raw_reg >> size >> 2;
   9282 
   9283 			func (stream, dis_style_register, "d%d[%d]", reg, ix);
   9284 		      }
   9285 		      break;
   9286 
   9287 		    case 'E':
   9288 		      /* Neon encoded constant for mov, mvn, vorr, vbic.  */
   9289 		      {
   9290 			int bits = 0;
   9291 			int cmode = (given >> 8) & 0xf;
   9292 			int op = (given >> 5) & 0x1;
   9293 			unsigned long value = 0, hival = 0;
   9294 			unsigned shift;
   9295                         int size = 0;
   9296                         int isfloat = 0;
   9297 
   9298 			bits |= ((given >> 24) & 1) << 7;
   9299 			bits |= ((given >> 16) & 7) << 4;
   9300 			bits |= ((given >> 0) & 15) << 0;
   9301 
   9302 			if (cmode < 8)
   9303 			  {
   9304 			    shift = (cmode >> 1) & 3;
   9305 			    value = (unsigned long) bits << (8 * shift);
   9306                             size = 32;
   9307 			  }
   9308 			else if (cmode < 12)
   9309 			  {
   9310 			    shift = (cmode >> 1) & 1;
   9311 			    value = (unsigned long) bits << (8 * shift);
   9312                             size = 16;
   9313 			  }
   9314 			else if (cmode < 14)
   9315 			  {
   9316 			    shift = (cmode & 1) + 1;
   9317 			    value = (unsigned long) bits << (8 * shift);
   9318 			    value |= (1ul << (8 * shift)) - 1;
   9319                             size = 32;
   9320 			  }
   9321 			else if (cmode == 14)
   9322 			  {
   9323 			    if (op)
   9324 			      {
   9325 				/* Bit replication into bytes.  */
   9326 				int ix;
   9327 				unsigned long mask;
   9328 
   9329 				value = 0;
   9330                                 hival = 0;
   9331 				for (ix = 7; ix >= 0; ix--)
   9332 				  {
   9333 				    mask = ((bits >> ix) & 1) ? 0xff : 0;
   9334                                     if (ix <= 3)
   9335 				      value = (value << 8) | mask;
   9336                                     else
   9337                                       hival = (hival << 8) | mask;
   9338 				  }
   9339                                 size = 64;
   9340 			      }
   9341                             else
   9342                               {
   9343                                 /* Byte replication.  */
   9344                                 value = (unsigned long) bits;
   9345                                 size = 8;
   9346                               }
   9347 			  }
   9348 			else if (!op)
   9349 			  {
   9350 			    /* Floating point encoding.  */
   9351 			    int tmp;
   9352 
   9353 			    value = (unsigned long)  (bits & 0x7f) << 19;
   9354 			    value |= (unsigned long) (bits & 0x80) << 24;
   9355 			    tmp = bits & 0x40 ? 0x3c : 0x40;
   9356 			    value |= (unsigned long) tmp << 24;
   9357                             size = 32;
   9358                             isfloat = 1;
   9359 			  }
   9360 			else
   9361 			  {
   9362 			    func (stream, dis_style_text,
   9363 				  "<illegal constant %.8x:%x:%x>",
   9364                                   bits, cmode, op);
   9365                             size = 32;
   9366 			    break;
   9367 			  }
   9368                         switch (size)
   9369                           {
   9370                           case 8:
   9371 			    func (stream, dis_style_immediate, "#%ld", value);
   9372 			    func (stream, dis_style_comment_start,
   9373 				  "\t@ 0x%.2lx", value);
   9374                             break;
   9375 
   9376                           case 16:
   9377 			    func (stream, dis_style_immediate, "#%ld", value);
   9378 			    func (stream, dis_style_comment_start,
   9379 				  "\t@ 0x%.4lx", value);
   9380                             break;
   9381 
   9382                           case 32:
   9383                             if (isfloat)
   9384                               {
   9385                                 unsigned char valbytes[4];
   9386                                 double fvalue;
   9387 
   9388                                 /* Do this a byte at a time so we don't have to
   9389                                    worry about the host's endianness.  */
   9390                                 valbytes[0] = value & 0xff;
   9391                                 valbytes[1] = (value >> 8) & 0xff;
   9392                                 valbytes[2] = (value >> 16) & 0xff;
   9393                                 valbytes[3] = (value >> 24) & 0xff;
   9394 
   9395                                 floatformat_to_double
   9396                                   (& floatformat_ieee_single_little, valbytes,
   9397                                   & fvalue);
   9398 
   9399 				func (stream, dis_style_immediate,
   9400 				      "#%.7g", fvalue);
   9401 				func (stream, dis_style_comment_start,
   9402 				      "\t@ 0x%.8lx", value);
   9403                               }
   9404                             else
   9405 			      {
   9406 				func (stream, dis_style_immediate, "#%ld",
   9407 				      (long) (((value & 0x80000000L) != 0)
   9408 					      ? value | ~0xffffffffL : value));
   9409 				func (stream, dis_style_comment_start,
   9410 				      "\t@ 0x%.8lx", value);
   9411 			      }
   9412                             break;
   9413 
   9414                           case 64:
   9415 			    func (stream, dis_style_immediate,
   9416 				  "#0x%.8lx%.8lx", hival, value);
   9417                             break;
   9418 
   9419                           default:
   9420                             abort ();
   9421                           }
   9422 		      }
   9423 		      break;
   9424 
   9425 		    case 'F':
   9426 		      {
   9427 			int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
   9428 			int num = (given >> 8) & 0x3;
   9429 
   9430 			func (stream, dis_style_text, "{");
   9431 			if (!num)
   9432 			  func (stream, dis_style_register, "d%d", regno);
   9433 			else if (num + regno >= 32)
   9434 			  {
   9435 			    func (stream, dis_style_register, "d%d", regno);
   9436 			    func (stream, dis_style_text, "-<overflow reg d%d",
   9437 				  regno + num);
   9438 			  }
   9439 			else
   9440 			  {
   9441 			    func (stream, dis_style_register, "d%d", regno);
   9442 			    func (stream, dis_style_text, "-");
   9443 			    func (stream, dis_style_register, "d%d",
   9444 				  regno + num);
   9445 			  }
   9446 			func (stream, dis_style_text, "}");
   9447 		      }
   9448 		      break;
   9449 
   9450 
   9451 		    case '0': case '1': case '2': case '3': case '4':
   9452 		    case '5': case '6': case '7': case '8': case '9':
   9453 		      {
   9454 			int width;
   9455 			unsigned long value;
   9456 
   9457 			c = arm_decode_bitfield (c, given, &value, &width);
   9458 
   9459 			switch (*c)
   9460 			  {
   9461 			  case 'r':
   9462 			    func (stream, dis_style_register, "%s",
   9463 				  arm_regnames[value]);
   9464 			    break;
   9465 			  case 'd':
   9466 			    func (stream, base_style, "%ld", value);
   9467 			    value_in_comment = value;
   9468 			    break;
   9469 			  case 'e':
   9470 			    func (stream, dis_style_immediate, "%ld",
   9471 				  (1ul << width) - value);
   9472 			    break;
   9473 
   9474 			  case 'S':
   9475 			  case 'T':
   9476 			  case 'U':
   9477 			    /* Various width encodings.  */
   9478 			    {
   9479 			      int base = 8 << (*c - 'S'); /* 8,16 or 32 */
   9480 			      int limit;
   9481 			      unsigned low, high;
   9482 
   9483 			      c++;
   9484 			      if (*c >= '0' && *c <= '9')
   9485 				limit = *c - '0';
   9486 			      else if (*c >= 'a' && *c <= 'f')
   9487 				limit = *c - 'a' + 10;
   9488 			      else
   9489 				abort ();
   9490 			      low = limit >> 2;
   9491 			      high = limit & 3;
   9492 
   9493 			      if (value < low || value > high)
   9494 				func (stream, dis_style_text,
   9495 				      "<illegal width %d>", base << value);
   9496 			      else
   9497 				func (stream, base_style, "%d",
   9498 				      base << value);
   9499 			    }
   9500 			    break;
   9501 			  case 'R':
   9502 			    if (given & (1 << 6))
   9503 			      goto Q;
   9504 			    /* FALLTHROUGH */
   9505 			  case 'D':
   9506 			    func (stream, dis_style_register, "d%ld", value);
   9507 			    break;
   9508 			  case 'Q':
   9509 			  Q:
   9510 			    if (value & 1)
   9511 			      func (stream, dis_style_text,
   9512 				    "<illegal reg q%ld.5>", value >> 1);
   9513 			    else
   9514 			      func (stream, dis_style_register,
   9515 				    "q%ld", value >> 1);
   9516 			    break;
   9517 
   9518 			  case '`':
   9519 			    c++;
   9520 			    if (value == 0)
   9521 			      func (stream, dis_style_text, "%c", *c);
   9522 			    break;
   9523 			  case '\'':
   9524 			    c++;
   9525 			    if (value == ((1ul << width) - 1))
   9526 			      func (stream, dis_style_text, "%c", *c);
   9527 			    break;
   9528 			  case '?':
   9529 			    func (stream, dis_style_mnemonic, "%c",
   9530 				  c[(1 << width) - (int) value]);
   9531 			    c += 1 << width;
   9532 			    break;
   9533 			  default:
   9534 			    abort ();
   9535 			  }
   9536 		      }
   9537 		      break;
   9538 
   9539 		    default:
   9540 		      abort ();
   9541 		    }
   9542 		}
   9543 	      else
   9544 		{
   9545 		  if (*c == '@')
   9546 		    base_style = dis_style_comment_start;
   9547 
   9548 		  if (*c == '\t')
   9549 		    base_style = dis_style_text;
   9550 
   9551 		  func (stream, base_style, "%c", *c);
   9552 
   9553 		}
   9554 	    }
   9555 
   9556 	  if (value_in_comment > 32 || value_in_comment < -16)
   9557 	    func (stream, dis_style_comment_start, "\t@ 0x%lx",
   9558 		  value_in_comment);
   9559 
   9560 	  if (is_unpredictable)
   9561 	    func (stream, dis_style_comment_start, UNPREDICTABLE_INSTRUCTION);
   9562 
   9563 	  return true;
   9564 	}
   9565     }
   9566   return false;
   9567 }
   9568 
   9569 /* Print one mve instruction on INFO->STREAM.
   9570    Return TRUE if the instuction matched, FALSE if this is not a
   9571    recognised mve instruction.  */
   9572 
   9573 static bool
   9574 print_insn_mve (struct disassemble_info *info, long given)
   9575 {
   9576   const struct mopcode32 *insn;
   9577   void *stream = info->stream;
   9578   fprintf_styled_ftype func = info->fprintf_styled_func;
   9579   enum disassembler_style base_style = dis_style_mnemonic;
   9580   enum disassembler_style old_base_style = base_style;
   9581 
   9582   for (insn = mve_opcodes; insn->assembler; insn++)
   9583     {
   9584       if (((given & insn->mask) == insn->value)
   9585 	  && !is_mve_encoding_conflict (given, insn->mve_op))
   9586 	{
   9587 	  signed long value_in_comment = 0;
   9588 	  bool is_unpredictable = false;
   9589 	  bool is_undefined = false;
   9590 	  const char *c;
   9591 	  enum mve_unpredictable unpredictable_cond = UNPRED_NONE;
   9592 	  enum mve_undefined undefined_cond = UNDEF_NONE;
   9593 
   9594 	  /* Most vector mve instruction are illegal in a it block.
   9595 	     There are a few exceptions; check for them.  */
   9596 	  if (ifthen_state && !is_mve_okay_in_it (insn->mve_op))
   9597 	    {
   9598 	      is_unpredictable = true;
   9599 	      unpredictable_cond = UNPRED_IT_BLOCK;
   9600 	    }
   9601 	  else if (is_mve_unpredictable (given, insn->mve_op,
   9602 					 &unpredictable_cond))
   9603 	    is_unpredictable = true;
   9604 
   9605 	  if (is_mve_undefined (given, insn->mve_op, &undefined_cond))
   9606 	    is_undefined = true;
   9607 
   9608 	  /* In "VORR Qd, Qm, Qn", if Qm==Qn, VORR is nothing but VMOV,
   9609 	     i.e "VMOV Qd, Qm".  */
   9610 	  if ((insn->mve_op == MVE_VORR_REG)
   9611 	      && (arm_decode_field (given, 1, 3)
   9612 		  == arm_decode_field (given, 17, 19)))
   9613 	    continue;
   9614 
   9615 	  for (c = insn->assembler; *c; c++)
   9616 	    {
   9617 	      if (*c == '%')
   9618 		{
   9619 		  switch (*++c)
   9620 		    {
   9621 		    case '{':
   9622 		      ++c;
   9623 		      if (*c == '\0')
   9624 			abort ();
   9625 		      old_base_style = base_style;
   9626 		      base_style = decode_base_style (*c);
   9627 		      ++c;
   9628 		      if (*c != ':')
   9629 			abort ();
   9630 		      break;
   9631 
   9632 		    case '}':
   9633 		      base_style = old_base_style;
   9634 		      break;
   9635 
   9636 		    case '%':
   9637 		      func (stream, base_style, "%%");
   9638 		      break;
   9639 
   9640 		    case 'a':
   9641 		      /* Don't print anything for '+' as it is implied.  */
   9642 		      if (arm_decode_field (given, 23, 23) == 0)
   9643 			func (stream, dis_style_immediate, "-");
   9644 		      break;
   9645 
   9646 		    case 'c':
   9647 		      if (ifthen_state)
   9648 			func (stream, dis_style_mnemonic, "%s",
   9649 			      arm_conditional[IFTHEN_COND]);
   9650 		      break;
   9651 
   9652 		    case 'd':
   9653 		      print_mve_vld_str_addr (info, given, insn->mve_op);
   9654 		      break;
   9655 
   9656 		    case 'i':
   9657 		      {
   9658 			long mve_mask = mve_extract_pred_mask (given);
   9659 			func (stream, dis_style_mnemonic, "%s",
   9660 			      mve_predicatenames[mve_mask]);
   9661 		      }
   9662 		      break;
   9663 
   9664 		    case 'j':
   9665 		      {
   9666 			unsigned int imm5 = 0;
   9667 			imm5 |= arm_decode_field (given, 6, 7);
   9668 			imm5 |= (arm_decode_field (given, 12, 14) << 2);
   9669 			func (stream, dis_style_immediate, "#%u",
   9670 			      (imm5 == 0) ? 32 : imm5);
   9671 		      }
   9672 		      break;
   9673 
   9674 		    case 'k':
   9675 		      func (stream, dis_style_immediate, "#%u",
   9676 			    (arm_decode_field (given, 7, 7) == 0) ? 64 : 48);
   9677 		      break;
   9678 
   9679 		    case 'n':
   9680 		      print_vec_condition (info, given, insn->mve_op);
   9681 		      break;
   9682 
   9683 		    case 'o':
   9684 		      if (arm_decode_field (given, 0, 0) == 1)
   9685 			{
   9686 			  unsigned long size
   9687 			    = arm_decode_field (given, 4, 4)
   9688 			      | (arm_decode_field (given, 6, 6) << 1);
   9689 
   9690 			  func (stream, dis_style_text, ", ");
   9691 			  func (stream, dis_style_sub_mnemonic, "uxtw ");
   9692 			  func (stream, dis_style_immediate, "#%lu", size);
   9693 			}
   9694 		      break;
   9695 
   9696 		    case 'm':
   9697 		      print_mve_rounding_mode (info, given, insn->mve_op);
   9698 		      break;
   9699 
   9700 		    case 's':
   9701 		      print_mve_vcvt_size (info, given, insn->mve_op);
   9702 		      break;
   9703 
   9704 		    case 'u':
   9705 		      {
   9706 			unsigned long op1 = arm_decode_field (given, 21, 22);
   9707 
   9708 			if ((insn->mve_op == MVE_VMOV_VEC_LANE_TO_GP))
   9709 			  {
   9710 			    /* Check for signed.  */
   9711 			    if (arm_decode_field (given, 23, 23) == 0)
   9712 			      {
   9713 				/* We don't print 's' for S32.  */
   9714 				if ((arm_decode_field (given, 5, 6) == 0)
   9715 				    && ((op1 == 0) || (op1 == 1)))
   9716 				  ;
   9717 				else
   9718 				  func (stream, dis_style_mnemonic, "s");
   9719 			      }
   9720 			    else
   9721 			      func (stream, dis_style_mnemonic, "u");
   9722 			  }
   9723 			else
   9724 			  {
   9725 			    if (arm_decode_field (given, 28, 28) == 0)
   9726 			      func (stream, dis_style_mnemonic, "s");
   9727 			    else
   9728 			      func (stream, dis_style_mnemonic, "u");
   9729 			  }
   9730 		      }
   9731 		      break;
   9732 
   9733 		    case 'v':
   9734 		      print_instruction_predicate (info);
   9735 		      break;
   9736 
   9737 		    case 'w':
   9738 		      if (arm_decode_field (given, 21, 21) == 1)
   9739 			func (stream, dis_style_text, "!");
   9740 		      break;
   9741 
   9742 		    case 'B':
   9743 		      print_mve_register_blocks (info, given, insn->mve_op);
   9744 		      break;
   9745 
   9746 		    case 'E':
   9747 		      /* SIMD encoded constant for mov, mvn, vorr, vbic.  */
   9748 
   9749 		      print_simd_imm8 (info, given, 28, insn);
   9750 		      break;
   9751 
   9752 		    case 'N':
   9753 		      print_mve_vmov_index (info, given);
   9754 		      break;
   9755 
   9756 		    case 'T':
   9757 		      if (arm_decode_field (given, 12, 12) == 0)
   9758 			func (stream, dis_style_mnemonic, "b");
   9759 		      else
   9760 			func (stream, dis_style_mnemonic, "t");
   9761 		      break;
   9762 
   9763 		    case 'X':
   9764 		      if (arm_decode_field (given, 12, 12) == 1)
   9765 			func (stream, dis_style_mnemonic, "x");
   9766 		      break;
   9767 
   9768 		    case '0': case '1': case '2': case '3': case '4':
   9769 		    case '5': case '6': case '7': case '8': case '9':
   9770 		      {
   9771 			int width;
   9772 			unsigned long value;
   9773 
   9774 			c = arm_decode_bitfield (c, given, &value, &width);
   9775 
   9776 			switch (*c)
   9777 			  {
   9778 			  case 'Z':
   9779 			    if (value == 13)
   9780 			      is_unpredictable = true;
   9781 			    else if (value == 15)
   9782 			      func (stream, dis_style_register, "zr");
   9783 			    else
   9784 			      func (stream, dis_style_register, "%s",
   9785 				    arm_regnames[value]);
   9786 			    break;
   9787 
   9788 			  case 'c':
   9789 			    func (stream, dis_style_sub_mnemonic, "%s",
   9790 				  arm_conditional[value]);
   9791 			    break;
   9792 
   9793 			  case 'C':
   9794 			    value ^= 1;
   9795 			    func (stream, dis_style_sub_mnemonic, "%s",
   9796 				  arm_conditional[value]);
   9797 			    break;
   9798 
   9799 			  case 'S':
   9800 			    if (value == 13 || value == 15)
   9801 			      is_unpredictable = true;
   9802 			    else
   9803 			      func (stream, dis_style_register, "%s",
   9804 				    arm_regnames[value]);
   9805 			    break;
   9806 
   9807 			  case 's':
   9808 			    print_mve_size (info,
   9809 					    value,
   9810 					    insn->mve_op);
   9811 			    break;
   9812 			  case 'I':
   9813 			    if (value == 1)
   9814 			      func (stream, dis_style_mnemonic, "i");
   9815 			    break;
   9816 			  case 'A':
   9817 			    if (value == 1)
   9818 			      func (stream, dis_style_mnemonic, "a");
   9819 			    break;
   9820 			  case 'h':
   9821 			    {
   9822 			      unsigned int odd_reg = (value << 1) | 1;
   9823 			      func (stream, dis_style_register, "%s",
   9824 				    arm_regnames[odd_reg]);
   9825 			    }
   9826 			    break;
   9827 			  case 'i':
   9828 			    {
   9829 			      unsigned long imm
   9830 				= arm_decode_field (given, 0, 6);
   9831 			      unsigned long mod_imm = imm;
   9832 
   9833 			      switch (insn->mve_op)
   9834 				{
   9835 				case MVE_VLDRW_GATHER_T5:
   9836 				case MVE_VSTRW_SCATTER_T5:
   9837 				  mod_imm = mod_imm << 2;
   9838 				  break;
   9839 				case MVE_VSTRD_SCATTER_T6:
   9840 				case MVE_VLDRD_GATHER_T6:
   9841 				  mod_imm = mod_imm << 3;
   9842 				  break;
   9843 
   9844 				default:
   9845 				  break;
   9846 				}
   9847 
   9848 			      func (stream, dis_style_immediate, "%lu",
   9849 				    mod_imm);
   9850 			    }
   9851 			    break;
   9852 			  case 'k':
   9853 			    func (stream, dis_style_immediate, "%lu",
   9854 				  64 - value);
   9855 			    break;
   9856 			  case 'l':
   9857 			    {
   9858 			      unsigned int even_reg = value << 1;
   9859 			      func (stream, dis_style_register, "%s",
   9860 				    arm_regnames[even_reg]);
   9861 			    }
   9862 			    break;
   9863 			  case 'u':
   9864 			    switch (value)
   9865 			      {
   9866 			      case 0:
   9867 				func (stream, dis_style_immediate, "1");
   9868 				break;
   9869 			      case 1:
   9870 				func (stream, dis_style_immediate, "2");
   9871 				break;
   9872 			      case 2:
   9873 				func (stream, dis_style_immediate, "4");
   9874 				break;
   9875 			      case 3:
   9876 				func (stream, dis_style_immediate, "8");
   9877 				break;
   9878 			      default:
   9879 				break;
   9880 			      }
   9881 			    break;
   9882 			  case 'o':
   9883 			    print_mve_rotate (info, value, width);
   9884 			    break;
   9885 			  case 'r':
   9886 			    func (stream, dis_style_register, "%s",
   9887 				  arm_regnames[value]);
   9888 			    break;
   9889 			  case 'd':
   9890 			    if (mve_shift_insn_p (insn->mve_op))
   9891 			      print_mve_shift_n (info, given, insn->mve_op);
   9892 			    else if (insn->mve_op == MVE_VSHLL_T2)
   9893 			      func (stream, dis_style_immediate, "%s",
   9894 				    mve_vec_sizename[value]);
   9895 			    else
   9896 			      {
   9897 				if (insn->mve_op == MVE_VSHLC && value == 0)
   9898 				  value = 32;
   9899 				func (stream, base_style, "%ld", value);
   9900 				value_in_comment = value;
   9901 			      }
   9902 			    break;
   9903 			  case 'F':
   9904 			    func (stream, dis_style_register, "s%ld", value);
   9905 			    break;
   9906 			  case 'Q':
   9907 			    if (value & 0x8)
   9908 			      func (stream, dis_style_text,
   9909 				    "<illegal reg q%ld.5>", value);
   9910 			    else
   9911 			      func (stream, dis_style_register, "q%ld", value);
   9912 			    break;
   9913 			  case 'x':
   9914 			    func (stream, dis_style_immediate,
   9915 				  "0x%08lx", value);
   9916 			    break;
   9917 			  default:
   9918 			    abort ();
   9919 			  }
   9920 			break;
   9921 		      default:
   9922 			abort ();
   9923 		      }
   9924 		    }
   9925 		}
   9926 	      else
   9927 		{
   9928 		  if (*c == '@')
   9929 		    base_style = dis_style_comment_start;
   9930 
   9931 		  if (*c == '\t')
   9932 		    base_style = dis_style_text;
   9933 
   9934 		  func (stream, base_style, "%c", *c);
   9935 		}
   9936 	    }
   9937 
   9938 	  if (value_in_comment > 32 || value_in_comment < -16)
   9939 	    func (stream, dis_style_comment_start, "\t@ 0x%lx",
   9940 		  value_in_comment);
   9941 
   9942 	  if (is_unpredictable)
   9943 	    print_mve_unpredictable (info, unpredictable_cond);
   9944 
   9945 	  if (is_undefined)
   9946 	    print_mve_undefined (info, undefined_cond);
   9947 
   9948 	  if (!vpt_block_state.in_vpt_block
   9949 	      && !ifthen_state
   9950 	      && is_vpt_instruction (given))
   9951 	    mark_inside_vpt_block (given);
   9952 	  else if (vpt_block_state.in_vpt_block)
   9953 	    update_vpt_block_state ();
   9954 
   9955 	  return true;
   9956 	}
   9957     }
   9958   return false;
   9959 }
   9960 
   9961 
   9962 /* Return the name of a v7A special register.  */
   9963 
   9964 static const char *
   9965 banked_regname (unsigned reg)
   9966 {
   9967   switch (reg)
   9968     {
   9969       case 15: return "CPSR";
   9970       case 32: return "R8_usr";
   9971       case 33: return "R9_usr";
   9972       case 34: return "R10_usr";
   9973       case 35: return "R11_usr";
   9974       case 36: return "R12_usr";
   9975       case 37: return "SP_usr";
   9976       case 38: return "LR_usr";
   9977       case 40: return "R8_fiq";
   9978       case 41: return "R9_fiq";
   9979       case 42: return "R10_fiq";
   9980       case 43: return "R11_fiq";
   9981       case 44: return "R12_fiq";
   9982       case 45: return "SP_fiq";
   9983       case 46: return "LR_fiq";
   9984       case 48: return "LR_irq";
   9985       case 49: return "SP_irq";
   9986       case 50: return "LR_svc";
   9987       case 51: return "SP_svc";
   9988       case 52: return "LR_abt";
   9989       case 53: return "SP_abt";
   9990       case 54: return "LR_und";
   9991       case 55: return "SP_und";
   9992       case 60: return "LR_mon";
   9993       case 61: return "SP_mon";
   9994       case 62: return "ELR_hyp";
   9995       case 63: return "SP_hyp";
   9996       case 79: return "SPSR";
   9997       case 110: return "SPSR_fiq";
   9998       case 112: return "SPSR_irq";
   9999       case 114: return "SPSR_svc";
   10000       case 116: return "SPSR_abt";
   10001       case 118: return "SPSR_und";
   10002       case 124: return "SPSR_mon";
   10003       case 126: return "SPSR_hyp";
   10004       default: return NULL;
   10005     }
   10006 }
   10007 
   10008 /* Return the name of the DMB/DSB option.  */
   10009 static const char *
   10010 data_barrier_option (unsigned option)
   10011 {
   10012   switch (option & 0xf)
   10013     {
   10014     case 0xf: return "sy";
   10015     case 0xe: return "st";
   10016     case 0xd: return "ld";
   10017     case 0xb: return "ish";
   10018     case 0xa: return "ishst";
   10019     case 0x9: return "ishld";
   10020     case 0x7: return "un";
   10021     case 0x6: return "unst";
   10022     case 0x5: return "nshld";
   10023     case 0x3: return "osh";
   10024     case 0x2: return "oshst";
   10025     case 0x1: return "oshld";
   10026     default:  return NULL;
   10027     }
   10028 }
   10029 
   10030 /* Print one ARM instruction from PC on INFO->STREAM.  */
   10031 
   10032 static void
   10033 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
   10034 {
   10035   const struct opcode32 *insn;
   10036   void *stream = info->stream;
   10037   fprintf_styled_ftype func = info->fprintf_styled_func;
   10038   struct arm_private_data *private_data = info->private_data;
   10039   enum disassembler_style base_style = dis_style_mnemonic;
   10040   enum disassembler_style old_base_style = base_style;
   10041 
   10042   if (print_insn_coprocessor (pc, info, given, false))
   10043     return;
   10044 
   10045   if (print_insn_neon (info, given, false))
   10046     return;
   10047 
   10048   if (print_insn_generic_coprocessor (pc, info, given, false))
   10049     return;
   10050 
   10051   for (insn = arm_opcodes; insn->assembler; insn++)
   10052     {
   10053       if ((given & insn->mask) != insn->value)
   10054 	continue;
   10055 
   10056       if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features))
   10057 	continue;
   10058 
   10059       /* Special case: an instruction with all bits set in the condition field
   10060 	 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
   10061 	 or by the catchall at the end of the table.  */
   10062       if ((given & 0xF0000000) != 0xF0000000
   10063 	  || (insn->mask & 0xF0000000) == 0xF0000000
   10064 	  || (insn->mask == 0 && insn->value == 0))
   10065 	{
   10066 	  unsigned long u_reg = 16;
   10067 	  unsigned long U_reg = 16;
   10068 	  bool is_unpredictable = false;
   10069 	  signed long value_in_comment = 0;
   10070 	  const char *c;
   10071 
   10072 	  for (c = insn->assembler; *c; c++)
   10073 	    {
   10074 	      if (*c == '%')
   10075 		{
   10076 		  bool allow_unpredictable = false;
   10077 
   10078 		  switch (*++c)
   10079 		    {
   10080 		    case '{':
   10081 		      ++c;
   10082 		      if (*c == '\0')
   10083 			abort ();
   10084 		      old_base_style = base_style;
   10085 		      base_style = decode_base_style (*c);
   10086 		      ++c;
   10087 		      if (*c != ':')
   10088 			abort ();
   10089 		      break;
   10090 
   10091 		    case '}':
   10092 		      base_style = old_base_style;
   10093 		      break;
   10094 
   10095 		    case '%':
   10096 		      func (stream, base_style, "%%");
   10097 		      break;
   10098 
   10099 		    case 'a':
   10100 		      value_in_comment = print_arm_address (pc, info, given);
   10101 		      break;
   10102 
   10103 		    case 'P':
   10104 		      /* Set P address bit and use normal address
   10105 			 printing routine.  */
   10106 		      value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT));
   10107 		      break;
   10108 
   10109 		    case 'T':
   10110 		      /* Armv4 does not have a BX instruction, however, when
   10111 			 assembled with the --fix-v4bx option GAS will accept
   10112 			 and assemble a BX instruction when assembling for
   10113 			 Armv4.  When disassembling we also disassemble it as a
   10114 			 BX instruction, but do make the user aware that this
   10115 			 instruction is only supported on HW from Armv4T
   10116 			 onwards.  */
   10117 		      if (info->mach == bfd_mach_arm_4)
   10118 			func (stream, dis_style_text, "\t@ from Armv4T onwards");
   10119 		      break;
   10120 
   10121 		    case 'S':
   10122 		      allow_unpredictable = true;
   10123 		      /* Fall through.  */
   10124 		    case 's':
   10125                       if ((given & 0x004f0000) == 0x004f0000)
   10126 			{
   10127                           /* PC relative with immediate offset.  */
   10128 			  bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf);
   10129 
   10130 			  if (PRE_BIT_SET)
   10131 			    {
   10132 			      /* Elide positive zero offset.  */
   10133 			      if (offset || NEGATIVE_BIT_SET)
   10134 				{
   10135 				  func (stream, dis_style_text, "[");
   10136 				  func (stream, dis_style_register, "pc");
   10137 				  func (stream, dis_style_text, ", ");
   10138 				  func (stream, dis_style_immediate, "#%s%d",
   10139 					(NEGATIVE_BIT_SET ? "-" : ""),
   10140 					(int) offset);
   10141 				  func (stream, dis_style_text, "]");
   10142 				}
   10143 			      else
   10144 				{
   10145 				  func (stream, dis_style_text, "[");
   10146 				  func (stream, dis_style_register, "pc");
   10147 				  func (stream, dis_style_text, "]");
   10148 				}
   10149 			      if (NEGATIVE_BIT_SET)
   10150 				offset = -offset;
   10151 			      func (stream, dis_style_comment_start, "\t@ ");
   10152 			      info->print_address_func (offset + pc + 8, info);
   10153 			    }
   10154 			  else
   10155 			    {
   10156 			      /* Always show the offset.  */
   10157 			      func (stream, dis_style_text, "[");
   10158 			      func (stream, dis_style_register, "pc");
   10159 			      func (stream, dis_style_text, "], ");
   10160 			      func (stream, dis_style_immediate, "#%s%d",
   10161 				    NEGATIVE_BIT_SET ? "-" : "", (int) offset);
   10162 			      if (! allow_unpredictable)
   10163 				is_unpredictable = true;
   10164 			    }
   10165 			}
   10166 		      else
   10167 			{
   10168 			  int offset = ((given & 0xf00) >> 4) | (given & 0xf);
   10169 
   10170 			  func (stream, dis_style_text, "[");
   10171 			  func (stream, dis_style_register, "%s",
   10172 				arm_regnames[(given >> 16) & 0xf]);
   10173 
   10174 			  if (PRE_BIT_SET)
   10175 			    {
   10176 			      if (IMMEDIATE_BIT_SET)
   10177 				{
   10178 				  /* Elide offset for non-writeback
   10179 				     positive zero.  */
   10180 				  if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET
   10181 				      || offset)
   10182 				    {
   10183 				      func (stream, dis_style_text, ", ");
   10184 				      func (stream, dis_style_immediate,
   10185 					    "#%s%d",
   10186 					    (NEGATIVE_BIT_SET ? "-" : ""),
   10187 					    offset);
   10188 				    }
   10189 
   10190 				  if (NEGATIVE_BIT_SET)
   10191 				    offset = -offset;
   10192 
   10193 				  value_in_comment = offset;
   10194 				}
   10195 			      else
   10196 				{
   10197 				  /* Register Offset or Register Pre-Indexed.  */
   10198 				  func (stream, dis_style_text, ", %s",
   10199 					NEGATIVE_BIT_SET ? "-" : "");
   10200 				  func (stream, dis_style_register, "%s",
   10201 					arm_regnames[given & 0xf]);
   10202 
   10203 				  /* Writing back to the register that is the source/
   10204 				     destination of the load/store is unpredictable.  */
   10205 				  if (! allow_unpredictable
   10206 				      && WRITEBACK_BIT_SET
   10207 				      && ((given & 0xf) == ((given >> 12) & 0xf)))
   10208 				    is_unpredictable = true;
   10209 				}
   10210 
   10211 			      func (stream, dis_style_text, "]%s",
   10212 				    WRITEBACK_BIT_SET ? "!" : "");
   10213 			    }
   10214 			  else
   10215 			    {
   10216 			      if (IMMEDIATE_BIT_SET)
   10217 				{
   10218 				  /* Immediate Post-indexed.  */
   10219 				  /* PR 10924: Offset must be printed, even if it is zero.  */
   10220 				  func (stream, dis_style_text, "], ");
   10221 				  func (stream, dis_style_immediate, "#%s%d",
   10222 					NEGATIVE_BIT_SET ? "-" : "", offset);
   10223 				  if (NEGATIVE_BIT_SET)
   10224 				    offset = -offset;
   10225 				  value_in_comment = offset;
   10226 				}
   10227 			      else
   10228 				{
   10229 				  /* Register Post-indexed.  */
   10230 				  func (stream, dis_style_text, "], %s",
   10231 					NEGATIVE_BIT_SET ? "-" : "");
   10232 				  func (stream, dis_style_register, "%s",
   10233 					arm_regnames[given & 0xf]);
   10234 
   10235 				  /* Writing back to the register that is the source/
   10236 				     destination of the load/store is unpredictable.  */
   10237 				  if (! allow_unpredictable
   10238 				      && (given & 0xf) == ((given >> 12) & 0xf))
   10239 				    is_unpredictable = true;
   10240 				}
   10241 
   10242 			      if (! allow_unpredictable)
   10243 				{
   10244 				  /* Writeback is automatically implied by post- addressing.
   10245 				     Setting the W bit is unnecessary and ARM specify it as
   10246 				     being unpredictable.  */
   10247 				  if (WRITEBACK_BIT_SET
   10248 				      /* Specifying the PC register as the post-indexed
   10249 					 registers is also unpredictable.  */
   10250 				      || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf)))
   10251 				    is_unpredictable = true;
   10252 				}
   10253 			    }
   10254 			}
   10255 		      break;
   10256 
   10257 		    case 'b':
   10258 		      {
   10259 			bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
   10260 			bfd_vma target = disp * 4 + pc + 8;
   10261 			info->print_address_func (target, info);
   10262 
   10263 			/* Fill in instruction information.  */
   10264 			info->insn_info_valid = 1;
   10265 			info->insn_type = dis_branch;
   10266 			info->target = target;
   10267 		      }
   10268 		      break;
   10269 
   10270 		    case 'c':
   10271 		      if (((given >> 28) & 0xf) != 0xe)
   10272 			func (stream, dis_style_mnemonic, "%s",
   10273 			      arm_conditional [(given >> 28) & 0xf]);
   10274 		      break;
   10275 
   10276 		    case 'm':
   10277 		      {
   10278 			int started = 0;
   10279 			int reg;
   10280 
   10281 			func (stream, dis_style_text, "{");
   10282 			for (reg = 0; reg < 16; reg++)
   10283 			  if ((given & (1 << reg)) != 0)
   10284 			    {
   10285 			      if (started)
   10286 				func (stream, dis_style_text, ", ");
   10287 			      started = 1;
   10288 			      func (stream, dis_style_register, "%s",
   10289 				    arm_regnames[reg]);
   10290 			    }
   10291 			func (stream, dis_style_text, "}");
   10292 			if (! started)
   10293 			  is_unpredictable = true;
   10294 		      }
   10295 		      break;
   10296 
   10297 		    case 'q':
   10298 		      arm_decode_shift (given, func, stream, false);
   10299 		      break;
   10300 
   10301 		    case 'o':
   10302 		      if ((given & 0x02000000) != 0)
   10303 			{
   10304 			  unsigned int rotate = (given & 0xf00) >> 7;
   10305 			  unsigned int immed = (given & 0xff);
   10306 			  unsigned int a, i;
   10307 
   10308 			  a = (immed << ((32 - rotate) & 31)
   10309 			       | immed >> rotate) & 0xffffffff;
   10310 			  /* If there is another encoding with smaller rotate,
   10311 			     the rotate should be specified directly.  */
   10312 			  for (i = 0; i < 32; i += 2)
   10313 			    if ((a << i | a >> ((32 - i) & 31)) <= 0xff)
   10314 			      break;
   10315 
   10316 			  if (i != rotate)
   10317 			    {
   10318 			      func (stream, dis_style_immediate, "#%d", immed);
   10319 			      func (stream, dis_style_text, ", ");
   10320 			      func (stream, dis_style_immediate, "%d", rotate);
   10321 			    }
   10322 			  else
   10323 			    func (stream, dis_style_immediate, "#%d", a);
   10324 			  value_in_comment = a;
   10325 			}
   10326 		      else
   10327 			arm_decode_shift (given, func, stream, true);
   10328 		      break;
   10329 
   10330 		    case 'p':
   10331 		      if ((given & 0x0000f000) == 0x0000f000)
   10332 			func (stream, dis_style_mnemonic, "p");
   10333 		      break;
   10334 		    case 'O':
   10335 		      if ((given & 0x0000f000) == 0x0000f000)
   10336 			func (stream, dis_style_text,
   10337 			      "\t@ p-variant is OBSOLETE");
   10338 		      break;
   10339 
   10340 		    case 't':
   10341 		      if ((given & 0x01200000) == 0x00200000)
   10342 			func (stream, dis_style_mnemonic, "t");
   10343 		      break;
   10344 
   10345 		    case 'A':
   10346 		      {
   10347 			int offset = given & 0xff;
   10348 
   10349 			value_in_comment = offset * 4;
   10350 			if (NEGATIVE_BIT_SET)
   10351 			  value_in_comment = - value_in_comment;
   10352 
   10353 			func (stream, dis_style_text, "[%s",
   10354 			      arm_regnames [(given >> 16) & 0xf]);
   10355 
   10356 			if (PRE_BIT_SET)
   10357 			  {
   10358 			    if (offset)
   10359 			      func (stream, dis_style_text, ", #%d]%s",
   10360 				    (int) value_in_comment,
   10361 				    WRITEBACK_BIT_SET ? "!" : "");
   10362 			    else
   10363 			      func (stream, dis_style_text, "]");
   10364 			  }
   10365 			else
   10366 			  {
   10367 			    func (stream, dis_style_text, "]");
   10368 
   10369 			    if (WRITEBACK_BIT_SET)
   10370 			      {
   10371 				if (offset)
   10372 				  func (stream, dis_style_text,
   10373 					", #%d", (int) value_in_comment);
   10374 			      }
   10375 			    else
   10376 			      {
   10377 				func (stream, dis_style_text,
   10378 				      ", {%d}", (int) offset);
   10379 				value_in_comment = offset;
   10380 			      }
   10381 			  }
   10382 		      }
   10383 		      break;
   10384 
   10385 		    case 'B':
   10386 		      /* Print ARM V5 BLX(1) address: pc+25 bits.  */
   10387 		      {
   10388 			bfd_vma address;
   10389 			bfd_vma offset = 0;
   10390 
   10391 			if (! NEGATIVE_BIT_SET)
   10392 			  /* Is signed, hi bits should be ones.  */
   10393 			  offset = (-1) ^ 0x00ffffff;
   10394 
   10395 			/* Offset is (SignExtend(offset field)<<2).  */
   10396 			offset += given & 0x00ffffff;
   10397 			offset <<= 2;
   10398 			address = offset + pc + 8;
   10399 
   10400 			if (given & 0x01000000)
   10401 			  /* H bit allows addressing to 2-byte boundaries.  */
   10402 			  address += 2;
   10403 
   10404 		        info->print_address_func (address, info);
   10405 
   10406 			/* Fill in instruction information.  */
   10407 			info->insn_info_valid = 1;
   10408 			info->insn_type = dis_branch;
   10409 			info->target = address;
   10410 		      }
   10411 		      break;
   10412 
   10413 		    case 'C':
   10414 		      if ((given & 0x02000200) == 0x200)
   10415 			{
   10416 			  const char * name;
   10417 			  unsigned sysm = (given & 0x004f0000) >> 16;
   10418 
   10419 			  sysm |= (given & 0x300) >> 4;
   10420 			  name = banked_regname (sysm);
   10421 
   10422 			  if (name != NULL)
   10423 			    func (stream, dis_style_register, "%s", name);
   10424 			  else
   10425 			    func (stream, dis_style_text,
   10426 				  "(UNDEF: %lu)", (unsigned long) sysm);
   10427 			}
   10428 		      else
   10429 			{
   10430 			  func (stream, dis_style_register, "%cPSR_",
   10431 				(given & 0x00400000) ? 'S' : 'C');
   10432 
   10433 			  if (given & 0x80000)
   10434 			    func (stream, dis_style_register, "f");
   10435 			  if (given & 0x40000)
   10436 			    func (stream, dis_style_register, "s");
   10437 			  if (given & 0x20000)
   10438 			    func (stream, dis_style_register, "x");
   10439 			  if (given & 0x10000)
   10440 			    func (stream, dis_style_register, "c");
   10441 			}
   10442 		      break;
   10443 
   10444 		    case 'U':
   10445 		      if ((given & 0xf0) == 0x60)
   10446 			{
   10447 			  switch (given & 0xf)
   10448 			    {
   10449 			    case 0xf:
   10450 			      func (stream, dis_style_sub_mnemonic, "sy");
   10451 			      break;
   10452 			    default:
   10453 			      func (stream, dis_style_immediate, "#%d",
   10454 				    (int) given & 0xf);
   10455 			      break;
   10456 			    }
   10457 			}
   10458 		      else
   10459 			{
   10460 			  const char * opt = data_barrier_option (given & 0xf);
   10461 			  if (opt != NULL)
   10462 			    func (stream, dis_style_sub_mnemonic, "%s", opt);
   10463 			  else
   10464 			    func (stream, dis_style_immediate,
   10465 				  "#%d", (int) given & 0xf);
   10466 			}
   10467 		      break;
   10468 
   10469 		    case '0': case '1': case '2': case '3': case '4':
   10470 		    case '5': case '6': case '7': case '8': case '9':
   10471 		      {
   10472 			int width;
   10473 			unsigned long value;
   10474 
   10475 			c = arm_decode_bitfield (c, given, &value, &width);
   10476 
   10477 			switch (*c)
   10478 			  {
   10479 			  case 'R':
   10480 			    if (value == 15)
   10481 			      is_unpredictable = true;
   10482 			    /* Fall through.  */
   10483 			  case 'r':
   10484 			  case 'T':
   10485 			    /* We want register + 1 when decoding T.  */
   10486 			    if (*c == 'T')
   10487 			      value = (value + 1) & 0xf;
   10488 
   10489 			    if (c[1] == 'u')
   10490 			      {
   10491 				/* Eat the 'u' character.  */
   10492 				++ c;
   10493 
   10494 				if (u_reg == value)
   10495 				  is_unpredictable = true;
   10496 				u_reg = value;
   10497 			      }
   10498 			    if (c[1] == 'U')
   10499 			      {
   10500 				/* Eat the 'U' character.  */
   10501 				++ c;
   10502 
   10503 				if (U_reg == value)
   10504 				  is_unpredictable = true;
   10505 				U_reg = value;
   10506 			      }
   10507 			    func (stream, dis_style_register, "%s",
   10508 				  arm_regnames[value]);
   10509 			    break;
   10510 			  case 'd':
   10511 			    func (stream, base_style, "%ld", value);
   10512 			    value_in_comment = value;
   10513 			    break;
   10514 			  case 'b':
   10515 			    func (stream, dis_style_immediate,
   10516 				  "%ld", value * 8);
   10517 			    value_in_comment = value * 8;
   10518 			    break;
   10519 			  case 'W':
   10520 			    func (stream, dis_style_immediate,
   10521 				  "%ld", value + 1);
   10522 			    value_in_comment = value + 1;
   10523 			    break;
   10524 			  case 'x':
   10525 			    func (stream, dis_style_immediate,
   10526 				  "0x%08lx", value);
   10527 
   10528 			    /* Some SWI instructions have special
   10529 			       meanings.  */
   10530 			    if ((given & 0x0fffffff) == 0x0FF00000)
   10531 			      func (stream, dis_style_comment_start,
   10532 				    "\t@ IMB");
   10533 			    else if ((given & 0x0fffffff) == 0x0FF00001)
   10534 			      func (stream, dis_style_comment_start,
   10535 				    "\t@ IMBRange");
   10536 			    break;
   10537 			  case 'X':
   10538 			    func (stream, dis_style_immediate,
   10539 				  "%01lx", value & 0xf);
   10540 			    value_in_comment = value;
   10541 			    break;
   10542 			  case '`':
   10543 			    c++;
   10544 			    if (value == 0)
   10545 			      func (stream, dis_style_text, "%c", *c);
   10546 			    break;
   10547 			  case '\'':
   10548 			    c++;
   10549 			    if (value == ((1ul << width) - 1))
   10550 			      func (stream, base_style, "%c", *c);
   10551 			    break;
   10552 			  case '?':
   10553 			    func (stream, base_style, "%c",
   10554 				  c[(1 << width) - (int) value]);
   10555 			    c += 1 << width;
   10556 			    break;
   10557 			  default:
   10558 			    abort ();
   10559 			  }
   10560 		      }
   10561 		      break;
   10562 
   10563 		    case 'e':
   10564 		      {
   10565 			int imm;
   10566 
   10567 			imm = (given & 0xf) | ((given & 0xfff00) >> 4);
   10568 			func (stream, dis_style_immediate, "%d", imm);
   10569 			value_in_comment = imm;
   10570 		      }
   10571 		      break;
   10572 
   10573 		    case 'E':
   10574 		      /* LSB and WIDTH fields of BFI or BFC.  The machine-
   10575 			 language instruction encodes LSB and MSB.  */
   10576 		      {
   10577 			long msb = (given & 0x001f0000) >> 16;
   10578 			long lsb = (given & 0x00000f80) >> 7;
   10579 			long w = msb - lsb + 1;
   10580 
   10581 			if (w > 0)
   10582 			  {
   10583 			    func (stream, dis_style_immediate, "#%lu", lsb);
   10584 			    func (stream, dis_style_text, ", ");
   10585 			    func (stream, dis_style_immediate, "#%lu", w);
   10586 			  }
   10587 			else
   10588 			  func (stream, dis_style_text,
   10589 				"(invalid: %lu:%lu)", lsb, msb);
   10590 		      }
   10591 		      break;
   10592 
   10593 		    case 'R':
   10594 		      /* Get the PSR/banked register name.  */
   10595 		      {
   10596 			const char * name;
   10597 			unsigned sysm = (given & 0x004f0000) >> 16;
   10598 
   10599 			sysm |= (given & 0x300) >> 4;
   10600 			name = banked_regname (sysm);
   10601 
   10602 			if (name != NULL)
   10603 			  func (stream, dis_style_register, "%s", name);
   10604 			else
   10605 			  func (stream, dis_style_text,
   10606 				"(UNDEF: %lu)", (unsigned long) sysm);
   10607 		      }
   10608 		      break;
   10609 
   10610 		    case 'V':
   10611 		      /* 16-bit unsigned immediate from a MOVT or MOVW
   10612 			 instruction, encoded in bits 0:11 and 15:19.  */
   10613 		      {
   10614 			long hi = (given & 0x000f0000) >> 4;
   10615 			long lo = (given & 0x00000fff);
   10616 			long imm16 = hi | lo;
   10617 
   10618 			func (stream, dis_style_immediate, "#%lu", imm16);
   10619 			value_in_comment = imm16;
   10620 		      }
   10621 		      break;
   10622 
   10623 		    default:
   10624 		      abort ();
   10625 		    }
   10626 		}
   10627 	      else
   10628 		{
   10629 
   10630 		  if (*c == '@')
   10631 		    base_style = dis_style_comment_start;
   10632 
   10633 		  if (*c == '\t')
   10634 		    base_style = dis_style_text;
   10635 
   10636 		  func (stream, base_style, "%c", *c);
   10637 		}
   10638 	    }
   10639 
   10640 	  if (value_in_comment > 32 || value_in_comment < -16)
   10641 	    func (stream, dis_style_comment_start, "\t@ 0x%lx",
   10642 		  (value_in_comment & 0xffffffffUL));
   10643 
   10644 	  if (is_unpredictable)
   10645 	    func (stream, dis_style_comment_start, UNPREDICTABLE_INSTRUCTION);
   10646 
   10647 	  return;
   10648 	}
   10649     }
   10650   func (stream, dis_style_comment_start, UNKNOWN_INSTRUCTION_32BIT,
   10651 	(unsigned) given);
   10652   return;
   10653 }
   10654 
   10655 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM.  */
   10656 
   10657 static void
   10658 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
   10659 {
   10660   const struct opcode16 *insn;
   10661   void *stream = info->stream;
   10662   fprintf_styled_ftype func = info->fprintf_styled_func;
   10663   enum disassembler_style base_style = dis_style_mnemonic;
   10664   enum disassembler_style old_base_style = base_style;
   10665 
   10666   for (insn = thumb_opcodes; insn->assembler; insn++)
   10667     if ((given & insn->mask) == insn->value)
   10668       {
   10669 	signed long value_in_comment = 0;
   10670 	const char *c = insn->assembler;
   10671 
   10672 	for (; *c; c++)
   10673 	  {
   10674 	    int domaskpc = 0;
   10675 	    int domasklr = 0;
   10676 
   10677 	    if (*c != '%')
   10678 	      {
   10679 		if (*c == '@')
   10680 		  base_style = dis_style_comment_start;
   10681 
   10682 		if (*c == '\t')
   10683 		  base_style = dis_style_text;
   10684 
   10685 		func (stream, base_style, "%c", *c);
   10686 
   10687 		continue;
   10688 	      }
   10689 
   10690 	    switch (*++c)
   10691 	      {
   10692 		case '{':
   10693 		  ++c;
   10694 		  if (*c == '\0')
   10695 		    abort ();
   10696 		  old_base_style = base_style;
   10697 		  base_style = decode_base_style (*c);
   10698 		  ++c;
   10699 		  if (*c != ':')
   10700 		    abort ();
   10701 		  break;
   10702 
   10703 		case '}':
   10704 		  base_style = old_base_style;
   10705 		  break;
   10706 
   10707 	      case '%':
   10708 		func (stream, base_style, "%%");
   10709 		break;
   10710 
   10711 	      case 'c':
   10712 		if (ifthen_state)
   10713 		  func (stream, dis_style_mnemonic, "%s",
   10714 			arm_conditional[IFTHEN_COND]);
   10715 		break;
   10716 
   10717 	      case 'C':
   10718 		if (ifthen_state)
   10719 		  func (stream, dis_style_mnemonic, "%s",
   10720 			arm_conditional[IFTHEN_COND]);
   10721 		else
   10722 		  func (stream, dis_style_mnemonic, "s");
   10723 		break;
   10724 
   10725 	      case 'I':
   10726 		{
   10727 		  unsigned int tmp;
   10728 
   10729 		  ifthen_next_state = given & 0xff;
   10730 		  for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
   10731 		    func (stream, dis_style_mnemonic,
   10732 			  ((given ^ tmp) & 0x10) ? "e" : "t");
   10733 		  func (stream, dis_style_text, "\t");
   10734 		  func (stream, dis_style_sub_mnemonic, "%s",
   10735 			arm_conditional[(given >> 4) & 0xf]);
   10736 		}
   10737 		break;
   10738 
   10739 	      case 'x':
   10740 		if (ifthen_next_state)
   10741 		  func (stream, dis_style_comment_start,
   10742 			"\t@ unpredictable branch in IT block\n");
   10743 		break;
   10744 
   10745 	      case 'X':
   10746 		if (ifthen_state)
   10747 		  func (stream, dis_style_comment_start,
   10748 			"\t@ unpredictable <IT:%s>",
   10749 			arm_conditional[IFTHEN_COND]);
   10750 		break;
   10751 
   10752 	      case 'S':
   10753 		{
   10754 		  long reg;
   10755 
   10756 		  reg = (given >> 3) & 0x7;
   10757 		  if (given & (1 << 6))
   10758 		    reg += 8;
   10759 
   10760 		  func (stream, dis_style_register, "%s", arm_regnames[reg]);
   10761 		}
   10762 		break;
   10763 
   10764 	      case 'D':
   10765 		{
   10766 		  long reg;
   10767 
   10768 		  reg = given & 0x7;
   10769 		  if (given & (1 << 7))
   10770 		    reg += 8;
   10771 
   10772 		  func (stream, dis_style_register, "%s", arm_regnames[reg]);
   10773 		}
   10774 		break;
   10775 
   10776 	      case 'N':
   10777 		if (given & (1 << 8))
   10778 		  domasklr = 1;
   10779 		/* Fall through.  */
   10780 	      case 'O':
   10781 		if (*c == 'O' && (given & (1 << 8)))
   10782 		  domaskpc = 1;
   10783 		/* Fall through.  */
   10784 	      case 'M':
   10785 		{
   10786 		  int started = 0;
   10787 		  int reg;
   10788 
   10789 		  func (stream, dis_style_text, "{");
   10790 
   10791 		  /* It would be nice if we could spot
   10792 		     ranges, and generate the rS-rE format: */
   10793 		  for (reg = 0; (reg < 8); reg++)
   10794 		    if ((given & (1 << reg)) != 0)
   10795 		      {
   10796 			if (started)
   10797 			  func (stream, dis_style_text, ", ");
   10798 			started = 1;
   10799 			func (stream, dis_style_register, "%s",
   10800 			      arm_regnames[reg]);
   10801 		      }
   10802 
   10803 		  if (domasklr)
   10804 		    {
   10805 		      if (started)
   10806 			func (stream, dis_style_text, ", ");
   10807 		      started = 1;
   10808 		      func (stream, dis_style_register, "%s",
   10809 			    arm_regnames[14] /* "lr" */);
   10810 		    }
   10811 
   10812 		  if (domaskpc)
   10813 		    {
   10814 		      if (started)
   10815 			func (stream, dis_style_text, ", ");
   10816 		      func (stream, dis_style_register, "%s",
   10817 			    arm_regnames[15] /* "pc" */);
   10818 		    }
   10819 
   10820 		  func (stream, dis_style_text, "}");
   10821 		}
   10822 		break;
   10823 
   10824 	      case 'W':
   10825 		/* Print writeback indicator for a LDMIA.  We are doing a
   10826 		   writeback if the base register is not in the register
   10827 		   mask.  */
   10828 		if ((given & (1 << ((given & 0x0700) >> 8))) == 0)
   10829 		  func (stream, dis_style_text, "!");
   10830 		break;
   10831 
   10832 	      case 'b':
   10833 		/* Print ARM V6T2 CZB address: pc+4+6 bits.  */
   10834 		{
   10835 		  bfd_vma address = (pc + 4
   10836 				     + ((given & 0x00f8) >> 2)
   10837 				     + ((given & 0x0200) >> 3));
   10838 		  info->print_address_func (address, info);
   10839 
   10840 		  /* Fill in instruction information.  */
   10841 		  info->insn_info_valid = 1;
   10842 		  info->insn_type = dis_branch;
   10843 		  info->target = address;
   10844 		}
   10845 		break;
   10846 
   10847 	      case 's':
   10848 		/* Right shift immediate -- bits 6..10; 1-31 print
   10849 		   as themselves, 0 prints as 32.  */
   10850 		{
   10851 		  long imm = (given & 0x07c0) >> 6;
   10852 		  if (imm == 0)
   10853 		    imm = 32;
   10854 		  func (stream, dis_style_immediate, "#%ld", imm);
   10855 		}
   10856 		break;
   10857 
   10858 	      case '0': case '1': case '2': case '3': case '4':
   10859 	      case '5': case '6': case '7': case '8': case '9':
   10860 		{
   10861 		  int bitstart = *c++ - '0';
   10862 		  int bitend = 0;
   10863 
   10864 		  while (*c >= '0' && *c <= '9')
   10865 		    bitstart = (bitstart * 10) + *c++ - '0';
   10866 
   10867 		  switch (*c)
   10868 		    {
   10869 		    case '-':
   10870 		      {
   10871 			bfd_vma reg;
   10872 
   10873 			c++;
   10874 			while (*c >= '0' && *c <= '9')
   10875 			  bitend = (bitend * 10) + *c++ - '0';
   10876 			if (!bitend)
   10877 			  abort ();
   10878 			reg = given >> bitstart;
   10879 			reg &= ((bfd_vma) 2 << (bitend - bitstart)) - 1;
   10880 
   10881 			switch (*c)
   10882 			  {
   10883 			  case 'r':
   10884 			    func (stream, dis_style_register, "%s",
   10885 				  arm_regnames[reg]);
   10886 			    break;
   10887 
   10888 			  case 'd':
   10889 			    func (stream, dis_style_immediate, "%ld",
   10890 				  (long) reg);
   10891 			    value_in_comment = reg;
   10892 			    break;
   10893 
   10894 			  case 'H':
   10895 			    func (stream, dis_style_immediate, "%ld",
   10896 				  (long) (reg << 1));
   10897 			    value_in_comment = reg << 1;
   10898 			    break;
   10899 
   10900 			  case 'W':
   10901 			    func (stream, dis_style_immediate, "%ld",
   10902 				  (long) (reg << 2));
   10903 			    value_in_comment = reg << 2;
   10904 			    break;
   10905 
   10906 			  case 'a':
   10907 			    /* PC-relative address -- the bottom two
   10908 			       bits of the address are dropped
   10909 			       before the calculation.  */
   10910 			    info->print_address_func
   10911 			      (((pc + 4) & ~3) + (reg << 2), info);
   10912 			    value_in_comment = 0;
   10913 			    break;
   10914 
   10915 			  case 'x':
   10916 			    func (stream, dis_style_immediate, "0x%04lx",
   10917 				  (long) reg);
   10918 			    break;
   10919 
   10920 			  case 'B':
   10921 			    reg = ((reg ^ (1 << bitend)) - (1 << bitend));
   10922 			    bfd_vma target = reg * 2 + pc + 4;
   10923 			    info->print_address_func (target, info);
   10924 			    value_in_comment = 0;
   10925 
   10926 			    /* Fill in instruction information.  */
   10927 			    info->insn_info_valid = 1;
   10928 			    info->insn_type = dis_branch;
   10929 			    info->target = target;
   10930 			    break;
   10931 
   10932 			  case 'c':
   10933 			    func (stream, dis_style_mnemonic, "%s",
   10934 				  arm_conditional [reg]);
   10935 			    break;
   10936 
   10937 			  default:
   10938 			    abort ();
   10939 			  }
   10940 		      }
   10941 		      break;
   10942 
   10943 		    case '\'':
   10944 		      c++;
   10945 		      if ((given & (1 << bitstart)) != 0)
   10946 			func (stream, base_style, "%c", *c);
   10947 		      break;
   10948 
   10949 		    case '?':
   10950 		      ++c;
   10951 		      if ((given & (1 << bitstart)) != 0)
   10952 			func (stream, base_style, "%c", *c++);
   10953 		      else
   10954 			func (stream, base_style, "%c", *++c);
   10955 		      break;
   10956 
   10957 		    default:
   10958 		      abort ();
   10959 		    }
   10960 		}
   10961 		break;
   10962 
   10963 	      default:
   10964 		abort ();
   10965 	      }
   10966 	  }
   10967 
   10968 	if (value_in_comment > 32 || value_in_comment < -16)
   10969 	  func (stream, dis_style_comment_start,
   10970 		"\t@ 0x%lx", value_in_comment);
   10971 	return;
   10972       }
   10973 
   10974   /* No match.  */
   10975   func (stream, dis_style_comment_start, UNKNOWN_INSTRUCTION_16BIT,
   10976 	(unsigned) given);
   10977   return;
   10978 }
   10979 
   10980 /* Return the name of an V7M special register.  */
   10981 
   10982 static const char *
   10983 psr_name (int regno)
   10984 {
   10985   switch (regno)
   10986     {
   10987     case 0x0: return "APSR";
   10988     case 0x1: return "IAPSR";
   10989     case 0x2: return "EAPSR";
   10990     case 0x3: return "PSR";
   10991     case 0x5: return "IPSR";
   10992     case 0x6: return "EPSR";
   10993     case 0x7: return "IEPSR";
   10994     case 0x8: return "MSP";
   10995     case 0x9: return "PSP";
   10996     case 0xa: return "MSPLIM";
   10997     case 0xb: return "PSPLIM";
   10998     case 0x10: return "PRIMASK";
   10999     case 0x11: return "BASEPRI";
   11000     case 0x12: return "BASEPRI_MAX";
   11001     case 0x13: return "FAULTMASK";
   11002     case 0x14: return "CONTROL";
   11003     case 0x20: return "PAC_KEY_P_0";
   11004     case 0x21: return "PAC_KEY_P_1";
   11005     case 0x22: return "PAC_KEY_P_2";
   11006     case 0x23: return "PAC_KEY_P_3";
   11007     case 0x24: return "PAC_KEY_U_0";
   11008     case 0x25: return "PAC_KEY_U_1";
   11009     case 0x26: return "PAC_KEY_U_2";
   11010     case 0x27: return "PAC_KEY_U_3";
   11011     case 0x88: return "MSP_NS";
   11012     case 0x89: return "PSP_NS";
   11013     case 0x8a: return "MSPLIM_NS";
   11014     case 0x8b: return "PSPLIM_NS";
   11015     case 0x90: return "PRIMASK_NS";
   11016     case 0x91: return "BASEPRI_NS";
   11017     case 0x93: return "FAULTMASK_NS";
   11018     case 0x94: return "CONTROL_NS";
   11019     case 0x98: return "SP_NS";
   11020     case 0xa0: return "PAC_KEY_P_0_NS";
   11021     case 0xa1: return "PAC_KEY_P_1_NS";
   11022     case 0xa2: return "PAC_KEY_P_2_NS";
   11023     case 0xa3: return "PAC_KEY_P_3_NS";
   11024     case 0xa4: return "PAC_KEY_U_0_NS";
   11025     case 0xa5: return "PAC_KEY_U_1_NS";
   11026     case 0xa6: return "PAC_KEY_U_2_NS";
   11027     case 0xa7: return "PAC_KEY_U_3_NS";
   11028     default: return "<unknown>";
   11029     }
   11030 }
   11031 
   11032 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM.  */
   11033 
   11034 static void
   11035 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
   11036 {
   11037   const struct opcode32 *insn;
   11038   void *stream = info->stream;
   11039   fprintf_styled_ftype func = info->fprintf_styled_func;
   11040   bool is_mve = is_v81m_architecture (info);
   11041   enum disassembler_style base_style = dis_style_mnemonic;
   11042   enum disassembler_style old_base_style = base_style;
   11043 
   11044   if (print_insn_coprocessor (pc, info, given, true))
   11045     return;
   11046 
   11047   if (!is_mve && print_insn_neon (info, given, true))
   11048     return;
   11049 
   11050   if (is_mve && print_insn_mve (info, given))
   11051     return;
   11052 
   11053   if (print_insn_cde (info, given, true))
   11054     return;
   11055 
   11056   if (print_insn_generic_coprocessor (pc, info, given, true))
   11057     return;
   11058 
   11059   for (insn = thumb32_opcodes; insn->assembler; insn++)
   11060     if ((given & insn->mask) == insn->value)
   11061       {
   11062 	bool is_clrm = false;
   11063 	bool is_unpredictable = false;
   11064 	signed long value_in_comment = 0;
   11065 	const char *c = insn->assembler;
   11066 
   11067 	for (; *c; c++)
   11068 	  {
   11069 	    if (*c != '%')
   11070 	      {
   11071 		if (*c == '@')
   11072 		  base_style = dis_style_comment_start;
   11073 		if (*c == '\t')
   11074 		  base_style = dis_style_text;
   11075 		func (stream, base_style, "%c", *c);
   11076 		continue;
   11077 	      }
   11078 
   11079 	    switch (*++c)
   11080 	      {
   11081 	      case '{':
   11082 		++c;
   11083 		if (*c == '\0')
   11084 		  abort ();
   11085 		old_base_style = base_style;
   11086 		base_style = decode_base_style (*c);
   11087 		++c;
   11088 		if (*c != ':')
   11089 		  abort ();
   11090 		break;
   11091 
   11092 	      case '}':
   11093 		base_style = old_base_style;
   11094 		break;
   11095 
   11096 	      case '%':
   11097 		func (stream, base_style, "%%");
   11098 		break;
   11099 
   11100 	      case 'c':
   11101 		if (ifthen_state)
   11102 		  func (stream, dis_style_mnemonic, "%s",
   11103 			arm_conditional[IFTHEN_COND]);
   11104 		break;
   11105 
   11106 	      case 'x':
   11107 		if (ifthen_next_state)
   11108 		  func (stream, dis_style_comment_start,
   11109 			"\t@ unpredictable branch in IT block\n");
   11110 		break;
   11111 
   11112 	      case 'X':
   11113 		if (ifthen_state)
   11114 		  func (stream, dis_style_comment_start,
   11115 			"\t@ unpredictable <IT:%s>",
   11116 			arm_conditional[IFTHEN_COND]);
   11117 		break;
   11118 
   11119 	      case 'I':
   11120 		{
   11121 		  unsigned int imm12 = 0;
   11122 
   11123 		  imm12 |= (given & 0x000000ffu);
   11124 		  imm12 |= (given & 0x00007000u) >> 4;
   11125 		  imm12 |= (given & 0x04000000u) >> 15;
   11126 		  func (stream, dis_style_immediate, "#%u", imm12);
   11127 		  value_in_comment = imm12;
   11128 		}
   11129 		break;
   11130 
   11131 	      case 'M':
   11132 		{
   11133 		  unsigned int bits = 0, imm, imm8, mod;
   11134 
   11135 		  bits |= (given & 0x000000ffu);
   11136 		  bits |= (given & 0x00007000u) >> 4;
   11137 		  bits |= (given & 0x04000000u) >> 15;
   11138 		  imm8 = (bits & 0x0ff);
   11139 		  mod = (bits & 0xf00) >> 8;
   11140 		  switch (mod)
   11141 		    {
   11142 		    case 0: imm = imm8; break;
   11143 		    case 1: imm = ((imm8 << 16) | imm8); break;
   11144 		    case 2: imm = ((imm8 << 24) | (imm8 << 8)); break;
   11145 		    case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
   11146 		    default:
   11147 		      mod  = (bits & 0xf80) >> 7;
   11148 		      imm8 = (bits & 0x07f) | 0x80;
   11149 		      imm  = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
   11150 		    }
   11151 		  func (stream, dis_style_immediate, "#%u", imm);
   11152 		  value_in_comment = imm;
   11153 		}
   11154 		break;
   11155 
   11156 	      case 'J':
   11157 		{
   11158 		  unsigned int imm = 0;
   11159 
   11160 		  imm |= (given & 0x000000ffu);
   11161 		  imm |= (given & 0x00007000u) >> 4;
   11162 		  imm |= (given & 0x04000000u) >> 15;
   11163 		  imm |= (given & 0x000f0000u) >> 4;
   11164 		  func (stream, dis_style_immediate, "#%u", imm);
   11165 		  value_in_comment = imm;
   11166 		}
   11167 		break;
   11168 
   11169 	      case 'K':
   11170 		{
   11171 		  unsigned int imm = 0;
   11172 
   11173 		  imm |= (given & 0x000f0000u) >> 16;
   11174 		  imm |= (given & 0x00000ff0u) >> 0;
   11175 		  imm |= (given & 0x0000000fu) << 12;
   11176 		  func (stream, dis_style_immediate, "#%u", imm);
   11177 		  value_in_comment = imm;
   11178 		}
   11179 		break;
   11180 
   11181 	      case 'H':
   11182 		{
   11183 		  unsigned int imm = 0;
   11184 
   11185 		  imm |= (given & 0x000f0000u) >> 4;
   11186 		  imm |= (given & 0x00000fffu) >> 0;
   11187 		  func (stream, dis_style_immediate, "#%u", imm);
   11188 		  value_in_comment = imm;
   11189 		}
   11190 		break;
   11191 
   11192 	      case 'V':
   11193 		{
   11194 		  unsigned int imm = 0;
   11195 
   11196 		  imm |= (given & 0x00000fffu);
   11197 		  imm |= (given & 0x000f0000u) >> 4;
   11198 		  func (stream, dis_style_immediate, "#%u", imm);
   11199 		  value_in_comment = imm;
   11200 		}
   11201 		break;
   11202 
   11203 	      case 'S':
   11204 		{
   11205 		  unsigned int reg = (given & 0x0000000fu);
   11206 		  unsigned int stp = (given & 0x00000030u) >> 4;
   11207 		  unsigned int imm = 0;
   11208 		  imm |= (given & 0x000000c0u) >> 6;
   11209 		  imm |= (given & 0x00007000u) >> 10;
   11210 
   11211 		  func (stream, dis_style_register, "%s", arm_regnames[reg]);
   11212 		  switch (stp)
   11213 		    {
   11214 		    case 0:
   11215 		      if (imm > 0)
   11216 			{
   11217 			  func (stream, dis_style_text, ", ");
   11218 			  func (stream, dis_style_sub_mnemonic, "lsl ");
   11219 			  func (stream, dis_style_immediate, "#%u", imm);
   11220 			}
   11221 		      break;
   11222 
   11223 		    case 1:
   11224 		      if (imm == 0)
   11225 			imm = 32;
   11226 		      func (stream, dis_style_text, ", ");
   11227 		      func (stream, dis_style_sub_mnemonic, "lsr ");
   11228 		      func (stream, dis_style_immediate, "#%u", imm);
   11229 		      break;
   11230 
   11231 		    case 2:
   11232 		      if (imm == 0)
   11233 			imm = 32;
   11234 		      func (stream, dis_style_text, ", ");
   11235 		      func (stream, dis_style_sub_mnemonic, "asr ");
   11236 		      func (stream, dis_style_immediate, "#%u", imm);
   11237 		      break;
   11238 
   11239 		    case 3:
   11240 		      if (imm == 0)
   11241 			{
   11242 			  func (stream, dis_style_text, ", ");
   11243 			  func (stream, dis_style_sub_mnemonic, "rrx");
   11244 			}
   11245 		      else
   11246 			{
   11247 			  func (stream, dis_style_text, ", ");
   11248 			  func (stream, dis_style_sub_mnemonic, "ror ");
   11249 			  func (stream, dis_style_immediate, "#%u", imm);
   11250 			}
   11251 		    }
   11252 		}
   11253 		break;
   11254 
   11255 	      case 'a':
   11256 		{
   11257 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   11258 		  unsigned int U   = ! NEGATIVE_BIT_SET;
   11259 		  unsigned int op  = (given & 0x00000f00) >> 8;
   11260 		  unsigned int i12 = (given & 0x00000fff);
   11261 		  unsigned int i8  = (given & 0x000000ff);
   11262 		  bool writeback = false, postind = false;
   11263 		  bfd_vma offset = 0;
   11264 
   11265 		  func (stream, dis_style_text, "[");
   11266 		  func (stream, dis_style_register, "%s", arm_regnames[Rn]);
   11267 		  if (U) /* 12-bit positive immediate offset.  */
   11268 		    {
   11269 		      offset = i12;
   11270 		      if (Rn != 15)
   11271 			value_in_comment = offset;
   11272 		    }
   11273 		  else if (Rn == 15) /* 12-bit negative immediate offset.  */
   11274 		    offset = - (int) i12;
   11275 		  else if (op == 0x0) /* Shifted register offset.  */
   11276 		    {
   11277 		      unsigned int Rm = (i8 & 0x0f);
   11278 		      unsigned int sh = (i8 & 0x30) >> 4;
   11279 
   11280 		      func (stream, dis_style_text, ", ");
   11281 		      func (stream, dis_style_register, "%s",
   11282 			    arm_regnames[Rm]);
   11283 		      if (sh)
   11284 			{
   11285 			  func (stream, dis_style_text, ", ");
   11286 			  func (stream, dis_style_sub_mnemonic, "lsl ");
   11287 			  func (stream, dis_style_immediate, "#%u", sh);
   11288 			}
   11289 		      func (stream, dis_style_text, "]");
   11290 		      break;
   11291 		    }
   11292 		  else switch (op)
   11293 		    {
   11294 		    case 0xE:  /* 8-bit positive immediate offset.  */
   11295 		      offset = i8;
   11296 		      break;
   11297 
   11298 		    case 0xC:  /* 8-bit negative immediate offset.  */
   11299 		      offset = -i8;
   11300 		      break;
   11301 
   11302 		    case 0xF:  /* 8-bit + preindex with wb.  */
   11303 		      offset = i8;
   11304 		      writeback = true;
   11305 		      break;
   11306 
   11307 		    case 0xD:  /* 8-bit - preindex with wb.  */
   11308 		      offset = -i8;
   11309 		      writeback = true;
   11310 		      break;
   11311 
   11312 		    case 0xB:  /* 8-bit + postindex.  */
   11313 		      offset = i8;
   11314 		      postind = true;
   11315 		      break;
   11316 
   11317 		    case 0x9:  /* 8-bit - postindex.  */
   11318 		      offset = -i8;
   11319 		      postind = true;
   11320 		      break;
   11321 
   11322 		    default:
   11323 		      func (stream, dis_style_text, ", <undefined>]");
   11324 		      goto skip;
   11325 		    }
   11326 
   11327 		  if (postind)
   11328 		    {
   11329 		      func (stream, dis_style_text, "], ");
   11330 		      func (stream, dis_style_immediate, "#%d", (int) offset);
   11331 		    }
   11332 		  else
   11333 		    {
   11334 		      if (offset)
   11335 			{
   11336 			  func (stream, dis_style_text, ", ");
   11337 			  func (stream, dis_style_immediate, "#%d",
   11338 				(int) offset);
   11339 			}
   11340 		      func (stream, dis_style_text, writeback ? "]!" : "]");
   11341 		    }
   11342 
   11343 		  if (Rn == 15)
   11344 		    {
   11345 		      func (stream, dis_style_comment_start, "\t@ ");
   11346 		      info->print_address_func (((pc + 4) & ~3) + offset, info);
   11347 		    }
   11348 		}
   11349 	      skip:
   11350 		break;
   11351 
   11352 	      case 'A':
   11353 		{
   11354 		  unsigned int U   = ! NEGATIVE_BIT_SET;
   11355 		  unsigned int W   = WRITEBACK_BIT_SET;
   11356 		  unsigned int Rn  = (given & 0x000f0000) >> 16;
   11357 		  unsigned int off = (given & 0x000000ff);
   11358 
   11359 		  func (stream, dis_style_text, "[");
   11360 		  func (stream, dis_style_register, "%s", arm_regnames[Rn]);
   11361 
   11362 		  if (PRE_BIT_SET)
   11363 		    {
   11364 		      if (off || !U)
   11365 			{
   11366 			  func (stream, dis_style_text, ", ");
   11367 			  func (stream, dis_style_immediate, "#%c%u",
   11368 				U ? '+' : '-', off * 4);
   11369 			  value_in_comment = off * 4 * (U ? 1 : -1);
   11370 			}
   11371 		      func (stream, dis_style_text, "]");
   11372 		      if (W)
   11373 			func (stream, dis_style_text, "!");
   11374 		    }
   11375 		  else
   11376 		    {
   11377 		      func (stream, dis_style_text, "], ");
   11378 		      if (W)
   11379 			{
   11380 			  func (stream, dis_style_immediate, "#%c%u",
   11381 				U ? '+' : '-', off * 4);
   11382 			  value_in_comment = off * 4 * (U ? 1 : -1);
   11383 			}
   11384 		      else
   11385 			{
   11386 			  func (stream, dis_style_text, "{");
   11387 			  func (stream, dis_style_immediate, "%u", off);
   11388 			  func (stream, dis_style_text, "}");
   11389 			  value_in_comment = off;
   11390 			}
   11391 		    }
   11392 		}
   11393 		break;
   11394 
   11395 	      case 'w':
   11396 		{
   11397 		  unsigned int Sbit = (given & 0x01000000) >> 24;
   11398 		  unsigned int type = (given & 0x00600000) >> 21;
   11399 
   11400 		  switch (type)
   11401 		    {
   11402 		    case 0:
   11403 		      func (stream, dis_style_mnemonic, Sbit ? "sb" : "b");
   11404 		      break;
   11405 		    case 1:
   11406 		      func (stream, dis_style_mnemonic, Sbit ? "sh" : "h");
   11407 		      break;
   11408 		    case 2:
   11409 		      if (Sbit)
   11410 			func (stream, dis_style_text, "??");
   11411 		      break;
   11412 		    case 3:
   11413 		      func (stream, dis_style_text, "??");
   11414 		      break;
   11415 		    }
   11416 		}
   11417 		break;
   11418 
   11419 	      case 'n':
   11420 		is_clrm = true;
   11421 		/* Fall through.  */
   11422 	      case 'm':
   11423 		{
   11424 		  int started = 0;
   11425 		  int reg;
   11426 
   11427 		  func (stream, dis_style_text, "{");
   11428 		  for (reg = 0; reg < 16; reg++)
   11429 		    if ((given & (1 << reg)) != 0)
   11430 		      {
   11431 			if (started)
   11432 			  func (stream, dis_style_text, ", ");
   11433 			started = 1;
   11434 			if (is_clrm && reg == 13)
   11435 			  func (stream, dis_style_text, "(invalid: %s)",
   11436 				arm_regnames[reg]);
   11437 			else if (is_clrm && reg == 15)
   11438 			  func (stream, dis_style_register, "%s", "APSR");
   11439 			else
   11440 			  func (stream, dis_style_register, "%s",
   11441 				arm_regnames[reg]);
   11442 		      }
   11443 		  func (stream, dis_style_text, "}");
   11444 		}
   11445 		break;
   11446 
   11447 	      case 'E':
   11448 		{
   11449 		  unsigned int msb = (given & 0x0000001f);
   11450 		  unsigned int lsb = 0;
   11451 
   11452 		  lsb |= (given & 0x000000c0u) >> 6;
   11453 		  lsb |= (given & 0x00007000u) >> 10;
   11454 		  func (stream, dis_style_immediate, "#%u", lsb);
   11455 		  func (stream, dis_style_text, ", ");
   11456 		  func (stream, dis_style_immediate, "#%u", msb - lsb + 1);
   11457 		}
   11458 		break;
   11459 
   11460 	      case 'F':
   11461 		{
   11462 		  unsigned int width = (given & 0x0000001f) + 1;
   11463 		  unsigned int lsb = 0;
   11464 
   11465 		  lsb |= (given & 0x000000c0u) >> 6;
   11466 		  lsb |= (given & 0x00007000u) >> 10;
   11467 		  func (stream, dis_style_immediate, "#%u", lsb);
   11468 		  func (stream, dis_style_text, ", ");
   11469 		  func (stream, dis_style_immediate, "#%u", width);
   11470 		}
   11471 		break;
   11472 
   11473 	      case 'G':
   11474 		{
   11475 		  unsigned int boff = (((given & 0x07800000) >> 23) << 1);
   11476 		  func (stream, dis_style_immediate, "%x", boff);
   11477 		}
   11478 		break;
   11479 
   11480 	      case 'W':
   11481 		{
   11482 		  unsigned int immA = (given & 0x001f0000u) >> 16;
   11483 		  unsigned int immB = (given & 0x000007feu) >> 1;
   11484 		  unsigned int immC = (given & 0x00000800u) >> 11;
   11485 		  bfd_vma offset = 0;
   11486 
   11487 		  offset |= immA << 12;
   11488 		  offset |= immB << 2;
   11489 		  offset |= immC << 1;
   11490 		  /* Sign extend.  */
   11491 		  offset = (offset & 0x10000) ? offset - (1 << 17) : offset;
   11492 
   11493 		  info->print_address_func (pc + 4 + offset, info);
   11494 		}
   11495 		break;
   11496 
   11497 	      case 'Y':
   11498 		{
   11499 		  unsigned int immA = (given & 0x007f0000u) >> 16;
   11500 		  unsigned int immB = (given & 0x000007feu) >> 1;
   11501 		  unsigned int immC = (given & 0x00000800u) >> 11;
   11502 		  bfd_vma offset = 0;
   11503 
   11504 		  offset |= immA << 12;
   11505 		  offset |= immB << 2;
   11506 		  offset |= immC << 1;
   11507 		  /* Sign extend.  */
   11508 		  offset = (offset & 0x40000) ? offset - (1 << 19) : offset;
   11509 
   11510 		  info->print_address_func (pc + 4 + offset, info);
   11511 		}
   11512 		break;
   11513 
   11514 	      case 'Z':
   11515 		{
   11516 		  unsigned int immA = (given & 0x00010000u) >> 16;
   11517 		  unsigned int immB = (given & 0x000007feu) >> 1;
   11518 		  unsigned int immC = (given & 0x00000800u) >> 11;
   11519 		  bfd_vma offset = 0;
   11520 
   11521 		  offset |= immA << 12;
   11522 		  offset |= immB << 2;
   11523 		  offset |= immC << 1;
   11524 		  /* Sign extend.  */
   11525 		  offset = (offset & 0x1000) ? offset - (1 << 13) : offset;
   11526 
   11527 		  info->print_address_func (pc + 4 + offset, info);
   11528 
   11529 		  unsigned int T    = (given & 0x00020000u) >> 17;
   11530 		  unsigned int endoffset = (((given & 0x07800000) >> 23) << 1);
   11531 		  unsigned int boffset   = (T == 1) ? 4 : 2;
   11532 		  func (stream, dis_style_text, ", ");
   11533 		  func (stream, dis_style_immediate, "%x",
   11534 			endoffset + boffset);
   11535 		}
   11536 		break;
   11537 
   11538 	      case 'Q':
   11539 		{
   11540 		  unsigned int immh = (given & 0x000007feu) >> 1;
   11541 		  unsigned int imml = (given & 0x00000800u) >> 11;
   11542 		  bfd_vma imm32 = 0;
   11543 
   11544 		  imm32 |= immh << 2;
   11545 		  imm32 |= imml << 1;
   11546 
   11547 		  info->print_address_func (pc + 4 + imm32, info);
   11548 		}
   11549 		break;
   11550 
   11551 	      case 'P':
   11552 		{
   11553 		  unsigned int immh = (given & 0x000007feu) >> 1;
   11554 		  unsigned int imml = (given & 0x00000800u) >> 11;
   11555 		  bfd_vma imm32 = 0;
   11556 
   11557 		  imm32 |= immh << 2;
   11558 		  imm32 |= imml << 1;
   11559 
   11560 		  info->print_address_func (pc + 4 - imm32, info);
   11561 		}
   11562 		break;
   11563 
   11564 	      case 'b':
   11565 		{
   11566 		  unsigned int S = (given & 0x04000000u) >> 26;
   11567 		  unsigned int J1 = (given & 0x00002000u) >> 13;
   11568 		  unsigned int J2 = (given & 0x00000800u) >> 11;
   11569 		  bfd_vma offset = 0;
   11570 
   11571 		  offset |= !S << 20;
   11572 		  offset |= J2 << 19;
   11573 		  offset |= J1 << 18;
   11574 		  offset |= (given & 0x003f0000) >> 4;
   11575 		  offset |= (given & 0x000007ff) << 1;
   11576 		  offset -= (1 << 20);
   11577 
   11578 		  bfd_vma target = pc + 4 + offset;
   11579 		  info->print_address_func (target, info);
   11580 
   11581 		  /* Fill in instruction information.  */
   11582 		  info->insn_info_valid = 1;
   11583 		  info->insn_type = dis_branch;
   11584 		  info->target = target;
   11585 		}
   11586 		break;
   11587 
   11588 	      case 'B':
   11589 		{
   11590 		  unsigned int S = (given & 0x04000000u) >> 26;
   11591 		  unsigned int I1 = (given & 0x00002000u) >> 13;
   11592 		  unsigned int I2 = (given & 0x00000800u) >> 11;
   11593 		  bfd_vma offset = 0;
   11594 
   11595 		  offset |= !S << 24;
   11596 		  offset |= !(I1 ^ S) << 23;
   11597 		  offset |= !(I2 ^ S) << 22;
   11598 		  offset |= (given & 0x03ff0000u) >> 4;
   11599 		  offset |= (given & 0x000007ffu) << 1;
   11600 		  offset -= (1 << 24);
   11601 		  offset += pc + 4;
   11602 
   11603 		  /* BLX target addresses are always word aligned.  */
   11604 		  if ((given & 0x00001000u) == 0)
   11605 		      offset &= ~2u;
   11606 
   11607 		  info->print_address_func (offset, info);
   11608 
   11609 		  /* Fill in instruction information.  */
   11610 		  info->insn_info_valid = 1;
   11611 		  info->insn_type = dis_branch;
   11612 		  info->target = offset;
   11613 		}
   11614 		break;
   11615 
   11616 	      case 's':
   11617 		{
   11618 		  unsigned int shift = 0;
   11619 
   11620 		  shift |= (given & 0x000000c0u) >> 6;
   11621 		  shift |= (given & 0x00007000u) >> 10;
   11622 		  if (WRITEBACK_BIT_SET)
   11623 		    {
   11624 		      func (stream, dis_style_text, ", ");
   11625 		      func (stream, dis_style_sub_mnemonic, "asr ");
   11626 		      func (stream, dis_style_immediate, "#%u", shift);
   11627 		    }
   11628 		  else if (shift)
   11629 		    {
   11630 		      func (stream, dis_style_text, ", ");
   11631 		      func (stream, dis_style_sub_mnemonic, "lsl ");
   11632 		      func (stream, dis_style_immediate, "#%u", shift);
   11633 		    }
   11634 		  /* else print nothing - lsl #0 */
   11635 		}
   11636 		break;
   11637 
   11638 	      case 'R':
   11639 		{
   11640 		  unsigned int rot = (given & 0x00000030) >> 4;
   11641 
   11642 		  if (rot)
   11643 		    {
   11644 		      func (stream, dis_style_text, ", ");
   11645 		      func (stream, dis_style_sub_mnemonic, "ror ");
   11646 		      func (stream, dis_style_immediate, "#%u", rot * 8);
   11647 		    }
   11648 		}
   11649 		break;
   11650 
   11651 	      case 'U':
   11652 		if ((given & 0xf0) == 0x60)
   11653 		  {
   11654 		    switch (given & 0xf)
   11655 		      {
   11656 		      case 0xf:
   11657 			func (stream, dis_style_sub_mnemonic, "sy");
   11658 			break;
   11659 		      default:
   11660 			func (stream, dis_style_immediate, "#%d",
   11661 			      (int) given & 0xf);
   11662 			break;
   11663 		      }
   11664 		  }
   11665 		else
   11666 		  {
   11667 		    const char * opt = data_barrier_option (given & 0xf);
   11668 		    if (opt != NULL)
   11669 		      func (stream, dis_style_sub_mnemonic, "%s", opt);
   11670 		    else
   11671 		      func (stream, dis_style_immediate, "#%d",
   11672 			    (int) given & 0xf);
   11673 		   }
   11674 		break;
   11675 
   11676 	      case 'C':
   11677 		if ((given & 0xff) == 0)
   11678 		  {
   11679 		    func (stream, dis_style_register, "%cPSR_",
   11680 			  (given & 0x100000) ? 'S' : 'C');
   11681 
   11682 		    if (given & 0x800)
   11683 		      func (stream, dis_style_register, "f");
   11684 		    if (given & 0x400)
   11685 		      func (stream, dis_style_register, "s");
   11686 		    if (given & 0x200)
   11687 		      func (stream, dis_style_register, "x");
   11688 		    if (given & 0x100)
   11689 		      func (stream, dis_style_register, "c");
   11690 		  }
   11691 		else if (is_v81m_architecture (info))
   11692 		  func (stream, dis_style_register, "%s",
   11693 			psr_name (given & 0xff));
   11694 
   11695 		else if ((given & 0x20) == 0x20)
   11696 		  {
   11697 		    char const* name;
   11698 		    unsigned sysm = (given & 0xf00) >> 8;
   11699 
   11700 		    sysm |= (given & 0x30);
   11701 		    sysm |= (given & 0x00100000) >> 14;
   11702 		    name = banked_regname (sysm);
   11703 
   11704 		    if (name != NULL)
   11705 		      func (stream, dis_style_register, "%s", name);
   11706 		    else
   11707 		      func (stream, dis_style_text,
   11708 			    "(UNDEF: %lu)", (unsigned long) sysm);
   11709 		  }
   11710 		else
   11711 		  {
   11712 		    func (stream, dis_style_register, "%s",
   11713 			  psr_name (given & 0xff));
   11714 		  }
   11715 		break;
   11716 
   11717 	      case 'D':
   11718 		if (is_v81m_architecture (info))
   11719 		  func (stream, dis_style_register, "%s",
   11720 			psr_name (given & 0xff));
   11721 		else if (((given & 0xff) == 0)
   11722 			 || ((given & 0x20) == 0x20))
   11723 		  {
   11724 		    char const* name;
   11725 		    unsigned sm = (given & 0xf0000) >> 16;
   11726 
   11727 		    sm |= (given & 0x30);
   11728 		    sm |= (given & 0x00100000) >> 14;
   11729 		    name = banked_regname (sm);
   11730 
   11731 		    if (name != NULL)
   11732 		      func (stream, dis_style_register, "%s", name);
   11733 		    else
   11734 		      func (stream, dis_style_text,
   11735 			    "(UNDEF: %lu)", (unsigned long) sm);
   11736 		  }
   11737 		else
   11738 		  func (stream, dis_style_register, "%s",
   11739 			psr_name (given & 0xff));
   11740 		break;
   11741 
   11742 	      case '0': case '1': case '2': case '3': case '4':
   11743 	      case '5': case '6': case '7': case '8': case '9':
   11744 		{
   11745 		  int width;
   11746 		  unsigned long val;
   11747 
   11748 		  c = arm_decode_bitfield (c, given, &val, &width);
   11749 
   11750 		  switch (*c)
   11751 		    {
   11752 		    case 's':
   11753 		      if (val <= 3)
   11754 			func (stream, dis_style_mnemonic, "%s",
   11755 			      mve_vec_sizename[val]);
   11756 		      else
   11757 			func (stream, dis_style_text, "<undef size>");
   11758 		      break;
   11759 
   11760 		    case 'd':
   11761 		      func (stream, base_style, "%lu", val);
   11762 		      value_in_comment = val;
   11763 		      break;
   11764 
   11765 		    case 'D':
   11766 		      func (stream, dis_style_immediate, "%lu", val + 1);
   11767 		      value_in_comment = val + 1;
   11768 		      break;
   11769 
   11770 		    case 'W':
   11771 		      func (stream, dis_style_immediate, "%lu", val * 4);
   11772 		      value_in_comment = val * 4;
   11773 		      break;
   11774 
   11775 		    case 'S':
   11776 		      if (val == 13)
   11777 			is_unpredictable = true;
   11778 		      /* Fall through.  */
   11779 		    case 'R':
   11780 		      if (val == 15)
   11781 			is_unpredictable = true;
   11782 		      /* Fall through.  */
   11783 		    case 'r':
   11784 		      func (stream, dis_style_register, "%s",
   11785 			    arm_regnames[val]);
   11786 		      break;
   11787 
   11788 		    case 'c':
   11789 		      func (stream, base_style, "%s", arm_conditional[val]);
   11790 		      break;
   11791 
   11792 		    case '\'':
   11793 		      c++;
   11794 		      if (val == ((1ul << width) - 1))
   11795 			func (stream, base_style, "%c", *c);
   11796 		      break;
   11797 
   11798 		    case '`':
   11799 		      c++;
   11800 		      if (val == 0)
   11801 			func (stream, dis_style_immediate, "%c", *c);
   11802 		      break;
   11803 
   11804 		    case '?':
   11805 		      func (stream, dis_style_mnemonic, "%c",
   11806 			    c[(1 << width) - (int) val]);
   11807 		      c += 1 << width;
   11808 		      break;
   11809 
   11810 		    case 'x':
   11811 		      func (stream, dis_style_immediate, "0x%lx",
   11812 			    val & 0xffffffffUL);
   11813 		      break;
   11814 
   11815 		    default:
   11816 		      abort ();
   11817 		    }
   11818 		}
   11819 		break;
   11820 
   11821 	      case 'L':
   11822 		/* PR binutils/12534
   11823 		   If we have a PC relative offset in an LDRD or STRD
   11824 		   instructions then display the decoded address.  */
   11825 		if (((given >> 16) & 0xf) == 0xf)
   11826 		  {
   11827 		    bfd_vma offset = (given & 0xff) * 4;
   11828 
   11829 		    if ((given & (1 << 23)) == 0)
   11830 		      offset = - offset;
   11831 		    func (stream, dis_style_comment_start, "\t@ ");
   11832 		    info->print_address_func ((pc & ~3) + 4 + offset, info);
   11833 		  }
   11834 		break;
   11835 
   11836 	      default:
   11837 		abort ();
   11838 	      }
   11839 	  }
   11840 
   11841 	if (value_in_comment > 32 || value_in_comment < -16)
   11842 	  func (stream, dis_style_comment_start, "\t@ 0x%lx",
   11843 		value_in_comment);
   11844 
   11845 	if (is_unpredictable)
   11846 	  func (stream, dis_style_comment_start, UNPREDICTABLE_INSTRUCTION);
   11847 
   11848 	return;
   11849       }
   11850 
   11851   /* No match.  */
   11852   func (stream, dis_style_comment_start, UNKNOWN_INSTRUCTION_32BIT,
   11853 	(unsigned) given);
   11854   return;
   11855 }
   11856 
   11857 /* Print data bytes on INFO->STREAM.  */
   11858 
   11859 static void
   11860 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
   11861 		 struct disassemble_info *info,
   11862 		 long given)
   11863 {
   11864   fprintf_styled_ftype func = info->fprintf_styled_func;
   11865 
   11866   switch (info->bytes_per_chunk)
   11867     {
   11868     case 1:
   11869       func (info->stream, dis_style_assembler_directive, ".byte");
   11870       func (info->stream, dis_style_text, "\t");
   11871       func (info->stream, dis_style_immediate, "0x%02lx", given);
   11872       break;
   11873     case 2:
   11874       func (info->stream, dis_style_assembler_directive, ".short");
   11875       func (info->stream, dis_style_text, "\t");
   11876       func (info->stream, dis_style_immediate, "0x%04lx", given);
   11877       break;
   11878     case 4:
   11879       func (info->stream, dis_style_assembler_directive, ".word");
   11880       func (info->stream, dis_style_text, "\t");
   11881       func (info->stream, dis_style_immediate, "0x%08lx", given);
   11882       break;
   11883     default:
   11884       abort ();
   11885     }
   11886 }
   11887 
   11888 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
   11889    being displayed in symbol relative addresses.
   11890 
   11891    Also disallow private symbol, with __tagsym$$ prefix,
   11892    from ARM RVCT toolchain being displayed.  */
   11893 
   11894 bool
   11895 arm_symbol_is_valid (asymbol * sym,
   11896 		     struct disassemble_info * info ATTRIBUTE_UNUSED)
   11897 {
   11898   const char * name;
   11899 
   11900   if (sym == NULL)
   11901     return false;
   11902 
   11903   name = bfd_asymbol_name (sym);
   11904 
   11905   return (name && *name != '$' && strncmp (name, "__tagsym$$", 10));
   11906 }
   11907 
   11908 /* Parse the string of disassembler options.  */
   11909 
   11910 static void
   11911 parse_arm_disassembler_options (const char *options)
   11912 {
   11913   const char *opt;
   11914 
   11915   force_thumb = false;
   11916   FOR_EACH_DISASSEMBLER_OPTION (opt, options)
   11917     {
   11918       if (startswith (opt, "reg-names-"))
   11919 	{
   11920 	  unsigned int i;
   11921 	  for (i = 0; i < NUM_ARM_OPTIONS; i++)
   11922 	    if (disassembler_options_cmp (opt, regnames[i].name) == 0)
   11923 	      {
   11924 		regname_selected = i;
   11925 		break;
   11926 	      }
   11927 
   11928 	  if (i >= NUM_ARM_OPTIONS)
   11929 	    /* xgettext: c-format */
   11930 	    opcodes_error_handler (_("unrecognised register name set: %s"),
   11931 				   opt);
   11932 	}
   11933       else if (startswith (opt, "force-thumb"))
   11934 	force_thumb = 1;
   11935       else if (startswith (opt, "no-force-thumb"))
   11936 	force_thumb = 0;
   11937       else if (startswith (opt, "coproc"))
   11938 	{
   11939 	  const char *procptr = opt + sizeof ("coproc") - 1;
   11940 	  char *endptr;
   11941 	  uint8_t coproc_number = strtol (procptr, &endptr, 10);
   11942 	  if (endptr != procptr + 1 || coproc_number > 7)
   11943 	    {
   11944 	      opcodes_error_handler (_("cde coprocessor not between 0-7: %s"),
   11945 				     opt);
   11946 	      continue;
   11947 	    }
   11948 	  if (*endptr != '=')
   11949 	    {
   11950 	      opcodes_error_handler (_("coproc must have an argument: %s"),
   11951 				     opt);
   11952 	      continue;
   11953 	    }
   11954 	  endptr += 1;
   11955 	  if (startswith (endptr, "generic"))
   11956 	    cde_coprocs &= ~(1 << coproc_number);
   11957 	  else if (startswith (endptr, "cde")
   11958 		   || startswith (endptr, "CDE"))
   11959 	    cde_coprocs |= (1 << coproc_number);
   11960 	  else
   11961 	    {
   11962 	      opcodes_error_handler (
   11963 		  _("coprocN argument takes options \"generic\","
   11964 		    " \"cde\", or \"CDE\": %s"), opt);
   11965 	    }
   11966 	}
   11967       else
   11968 	/* xgettext: c-format */
   11969 	opcodes_error_handler (_("unrecognised disassembler option: %s"), opt);
   11970     }
   11971 
   11972   return;
   11973 }
   11974 
   11975 static bool
   11976 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
   11977 			 enum map_type *map_symbol);
   11978 
   11979 /* Search back through the insn stream to determine if this instruction is
   11980    conditionally executed.  */
   11981 
   11982 static void
   11983 find_ifthen_state (bfd_vma pc,
   11984 		   struct disassemble_info *info,
   11985 		   bool little)
   11986 {
   11987   unsigned char b[2];
   11988   unsigned int insn;
   11989   int status;
   11990   /* COUNT is twice the number of instructions seen.  It will be odd if we
   11991      just crossed an instruction boundary.  */
   11992   int count;
   11993   int it_count;
   11994   unsigned int seen_it;
   11995   bfd_vma addr;
   11996 
   11997   ifthen_address = pc;
   11998   ifthen_state = 0;
   11999 
   12000   addr = pc;
   12001   count = 1;
   12002   it_count = 0;
   12003   seen_it = 0;
   12004   /* Scan backwards looking for IT instructions, keeping track of where
   12005      instruction boundaries are.  We don't know if something is actually an
   12006      IT instruction until we find a definite instruction boundary.  */
   12007   for (;;)
   12008     {
   12009       if (addr == 0 || info->symbol_at_address_func (addr, info))
   12010 	{
   12011 	  /* A symbol must be on an instruction boundary, and will not
   12012 	     be within an IT block.  */
   12013 	  if (seen_it && (count & 1))
   12014 	    break;
   12015 
   12016 	  return;
   12017 	}
   12018       addr -= 2;
   12019       status = info->read_memory_func (addr, (bfd_byte *) b, 2, info);
   12020       if (status)
   12021 	return;
   12022 
   12023       if (little)
   12024 	insn = (b[0]) | (b[1] << 8);
   12025       else
   12026 	insn = (b[1]) | (b[0] << 8);
   12027       if (seen_it)
   12028 	{
   12029 	  if ((insn & 0xf800) < 0xe800)
   12030 	    {
   12031 	      /* Addr + 2 is an instruction boundary.  See if this matches
   12032 	         the expected boundary based on the position of the last
   12033 		 IT candidate.  */
   12034 	      if (count & 1)
   12035 		break;
   12036 	      seen_it = 0;
   12037 	    }
   12038 	}
   12039       if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
   12040 	{
   12041 	  enum map_type type = MAP_ARM;
   12042 	  bool found = mapping_symbol_for_insn (addr, info, &type);
   12043 
   12044 	  if (!found || (found && type == MAP_THUMB))
   12045 	    {
   12046 	      /* This could be an IT instruction.  */
   12047 	      seen_it = insn;
   12048 	      it_count = count >> 1;
   12049 	    }
   12050 	}
   12051       if ((insn & 0xf800) >= 0xe800)
   12052 	count++;
   12053       else
   12054 	count = (count + 2) | 1;
   12055       /* IT blocks contain at most 4 instructions.  */
   12056       if (count >= 8 && !seen_it)
   12057 	return;
   12058     }
   12059   /* We found an IT instruction.  */
   12060   ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
   12061   if ((ifthen_state & 0xf) == 0)
   12062     ifthen_state = 0;
   12063 }
   12064 
   12065 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
   12066    mapping symbol.  */
   12067 
   12068 static int
   12069 is_mapping_symbol (struct disassemble_info *info,
   12070 		   int n,
   12071 		   enum map_type *map_type)
   12072 {
   12073   const char *name = bfd_asymbol_name (info->symtab[n]);
   12074 
   12075   if (name[0] == '$'
   12076       && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
   12077       && (name[2] == 0 || name[2] == '.'))
   12078     {
   12079       *map_type = ((name[1] == 'a') ? MAP_ARM
   12080 		   : (name[1] == 't') ? MAP_THUMB
   12081 		   : MAP_DATA);
   12082       return true;
   12083     }
   12084 
   12085   return false;
   12086 }
   12087 
   12088 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
   12089    Returns nonzero if *MAP_TYPE was set.  */
   12090 
   12091 static int
   12092 get_map_sym_type (struct disassemble_info *info,
   12093 		  int n,
   12094 		  enum map_type *map_type)
   12095 {
   12096   /* If the symbol is in a different section, ignore it.  */
   12097   if (info->section != NULL && info->section != info->symtab[n]->section)
   12098     return false;
   12099 
   12100   return is_mapping_symbol (info, n, map_type);
   12101 }
   12102 
   12103 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
   12104    Returns nonzero if *MAP_TYPE was set.  */
   12105 
   12106 static int
   12107 get_sym_code_type (struct disassemble_info *info,
   12108 		   int n,
   12109 		   enum map_type *map_type)
   12110 {
   12111   elf_symbol_type *es;
   12112   unsigned int type;
   12113   asymbol * sym;
   12114 
   12115   /* If the symbol is in a different section, ignore it.  */
   12116   if (info->section != NULL && info->section != info->symtab[n]->section)
   12117     return false;
   12118 
   12119   /* PR 30230: Reject non-ELF symbols, eg synthetic ones.  */
   12120   sym = info->symtab[n];
   12121   if (bfd_asymbol_flavour (sym) != bfd_target_elf_flavour)
   12122     return false;
   12123 
   12124   es = (elf_symbol_type *) sym;
   12125   type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
   12126 
   12127   /* If the symbol has function type then use that.  */
   12128   if (type == STT_FUNC || type == STT_GNU_IFUNC)
   12129     {
   12130       if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
   12131 	  == ST_BRANCH_TO_THUMB)
   12132 	*map_type = MAP_THUMB;
   12133       else
   12134 	*map_type = MAP_ARM;
   12135       return true;
   12136     }
   12137 
   12138   return false;
   12139 }
   12140 
   12141 /* Search the mapping symbol state for instruction at pc.  This is only
   12142    applicable for elf target.
   12143 
   12144    There is an assumption Here, info->private_data contains the correct AND
   12145    up-to-date information about current scan process.  The information will be
   12146    used to speed this search process.
   12147 
   12148    Return TRUE if the mapping state can be determined, and map_symbol
   12149    will be updated accordingly.  Otherwise, return FALSE.  */
   12150 
   12151 static bool
   12152 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info,
   12153 			 enum map_type *map_symbol)
   12154 {
   12155   bfd_vma addr, section_vma = 0;
   12156   int n, last_sym = -1;
   12157   bool found = false;
   12158   bool can_use_search_opt_p = false;
   12159 
   12160   /* Sanity check.  */
   12161   if (info == NULL)
   12162     return false;
   12163 
   12164   /* Default to DATA.  A text section is required by the ABI to contain an
   12165      INSN mapping symbol at the start.  A data section has no such
   12166      requirement, hence if no mapping symbol is found the section must
   12167      contain only data.  This however isn't very useful if the user has
   12168      fully stripped the binaries.  If this is the case use the section
   12169      attributes to determine the default.  If we have no section default to
   12170      INSN as well, as we may be disassembling some raw bytes on a baremetal
   12171      HEX file or similar.  */
   12172   enum map_type type = MAP_DATA;
   12173   if ((info->section && info->section->flags & SEC_CODE) || !info->section)
   12174     type = MAP_ARM;
   12175   struct arm_private_data *private_data;
   12176 
   12177   if (info->private_data == NULL || info->symtab == NULL
   12178       || info->symtab_size == 0
   12179       || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour)
   12180     return false;
   12181 
   12182   private_data = info->private_data;
   12183 
   12184   /* First, look for mapping symbols.  */
   12185   if (pc <= private_data->last_mapping_addr)
   12186     private_data->last_mapping_sym = -1;
   12187 
   12188   /* Start scanning at the start of the function, or wherever
   12189      we finished last time.  */
   12190   n = info->symtab_pos + 1;
   12191 
   12192   /* If the last stop offset is different from the current one it means we
   12193      are disassembling a different glob of bytes.  As such the optimization
   12194      would not be safe and we should start over.  */
   12195   can_use_search_opt_p
   12196     = (private_data->last_mapping_sym >= 0
   12197        && info->stop_offset == private_data->last_stop_offset);
   12198 
   12199   if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
   12200     n = private_data->last_mapping_sym;
   12201 
   12202   /* Look down while we haven't passed the location being disassembled.
   12203      The reason for this is that there's no defined order between a symbol
   12204      and an mapping symbol that may be at the same address.  We may have to
   12205      look at least one position ahead.  */
   12206   for (; n < info->symtab_size; n++)
   12207     {
   12208       addr = bfd_asymbol_value (info->symtab[n]);
   12209       if (addr > pc)
   12210 	break;
   12211       if (get_map_sym_type (info, n, &type))
   12212 	{
   12213 	  last_sym = n;
   12214 	  found = true;
   12215 	}
   12216     }
   12217 
   12218   if (!found)
   12219     {
   12220       n = info->symtab_pos;
   12221       if (n >= private_data->last_mapping_sym && can_use_search_opt_p)
   12222 	n = private_data->last_mapping_sym;
   12223 
   12224       /* No mapping symbol found at this address.  Look backwards
   12225 	 for a preceeding one, but don't go pass the section start
   12226 	 otherwise a data section with no mapping symbol can pick up
   12227 	 a text mapping symbol of a preceeding section.  The documentation
   12228 	 says section can be NULL, in which case we will seek up all the
   12229 	 way to the top.  */
   12230       if (info->section)
   12231 	section_vma = info->section->vma;
   12232 
   12233       for (; n >= 0; n--)
   12234 	{
   12235 	  addr = bfd_asymbol_value (info->symtab[n]);
   12236 	  if (addr < section_vma)
   12237 	    break;
   12238 
   12239 	  if (get_map_sym_type (info, n, &type))
   12240 	    {
   12241 	      last_sym = n;
   12242 	      found = true;
   12243 	      break;
   12244 	    }
   12245 	}
   12246     }
   12247 
   12248   /* If no mapping symbol was found, try looking up without a mapping
   12249      symbol.  This is done by walking up from the current PC to the nearest
   12250      symbol.  We don't actually have to loop here since symtab_pos will
   12251      contain the nearest symbol already.  */
   12252   if (!found)
   12253     {
   12254       n = info->symtab_pos;
   12255       if (n >= 0 && get_sym_code_type (info, n, &type))
   12256 	{
   12257 	  last_sym = n;
   12258 	  found = true;
   12259 	}
   12260     }
   12261 
   12262   private_data->last_mapping_sym = last_sym;
   12263   private_data->last_type = type;
   12264   private_data->last_stop_offset = info->stop_offset;
   12265 
   12266   *map_symbol = type;
   12267   return found;
   12268 }
   12269 
   12270 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
   12271    of the supplied arm_feature_set structure with bitmasks indicating
   12272    the supported base architectures and coprocessor extensions.
   12273 
   12274    FIXME: This could more efficiently implemented as a constant array,
   12275    although it would also be less robust.  */
   12276 
   12277 static void
   12278 select_arm_features (unsigned long mach,
   12279 		     arm_feature_set * features)
   12280 {
   12281   arm_feature_set arch_fset;
   12282   const arm_feature_set fpu_any = FPU_ANY;
   12283 
   12284 #undef ARM_SET_FEATURES
   12285 #define ARM_SET_FEATURES(FSET) \
   12286   {							\
   12287     const arm_feature_set fset = FSET;			\
   12288     arch_fset = fset;					\
   12289   }
   12290 
   12291   /* When several architecture versions share the same bfd_mach_arm_XXX value
   12292      the most featureful is chosen.  */
   12293   switch (mach)
   12294     {
   12295     case bfd_mach_arm_2:	 ARM_SET_FEATURES (ARM_ARCH_V2); break;
   12296     case bfd_mach_arm_2a:	 ARM_SET_FEATURES (ARM_ARCH_V2S); break;
   12297     case bfd_mach_arm_3:	 ARM_SET_FEATURES (ARM_ARCH_V3); break;
   12298     case bfd_mach_arm_3M:	 ARM_SET_FEATURES (ARM_ARCH_V3M); break;
   12299     case bfd_mach_arm_4:	 ARM_SET_FEATURES (ARM_ARCH_V4); break;
   12300     case bfd_mach_arm_ep9312:
   12301     case bfd_mach_arm_4T:	 ARM_SET_FEATURES (ARM_ARCH_V4T); break;
   12302     case bfd_mach_arm_5:	 ARM_SET_FEATURES (ARM_ARCH_V5); break;
   12303     case bfd_mach_arm_5T:	 ARM_SET_FEATURES (ARM_ARCH_V5T); break;
   12304     case bfd_mach_arm_5TE:	 ARM_SET_FEATURES (ARM_ARCH_V5TE); break;
   12305     case bfd_mach_arm_XScale:	 ARM_SET_FEATURES (ARM_ARCH_XSCALE); break;
   12306     case bfd_mach_arm_iWMMXt:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break;
   12307     case bfd_mach_arm_iWMMXt2:	 ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break;
   12308     case bfd_mach_arm_5TEJ:	 ARM_SET_FEATURES (ARM_ARCH_V5TEJ); break;
   12309     case bfd_mach_arm_6:	 ARM_SET_FEATURES (ARM_ARCH_V6); break;
   12310     case bfd_mach_arm_6KZ:	 ARM_SET_FEATURES (ARM_ARCH_V6KZ); break;
   12311     case bfd_mach_arm_6T2:	 ARM_SET_FEATURES (ARM_ARCH_V6KZT2); break;
   12312     case bfd_mach_arm_6K:	 ARM_SET_FEATURES (ARM_ARCH_V6K); break;
   12313     case bfd_mach_arm_7:	 ARM_SET_FEATURES (ARM_ARCH_V7VE); break;
   12314     case bfd_mach_arm_6M:	 ARM_SET_FEATURES (ARM_ARCH_V6M); break;
   12315     case bfd_mach_arm_6SM:	 ARM_SET_FEATURES (ARM_ARCH_V6SM); break;
   12316     case bfd_mach_arm_7EM:	 ARM_SET_FEATURES (ARM_ARCH_V7EM); break;
   12317     case bfd_mach_arm_8:
   12318 	{
   12319 	  /* Add bits for extensions that Armv8.6-A recognizes.  */
   12320 	  arm_feature_set armv8_6_ext_fset
   12321 	    = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
   12322 	  ARM_SET_FEATURES (ARM_ARCH_V8_6A);
   12323 	  ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, armv8_6_ext_fset);
   12324 	  break;
   12325 	}
   12326     case bfd_mach_arm_8R:	 ARM_SET_FEATURES (ARM_ARCH_V8R_CRC); break;
   12327     case bfd_mach_arm_8M_BASE:	 ARM_SET_FEATURES (ARM_ARCH_V8M_BASE); break;
   12328     case bfd_mach_arm_8M_MAIN:	 ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN); break;
   12329     case bfd_mach_arm_8_1M_MAIN:
   12330       ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN);
   12331       arm_feature_set mve_all
   12332 	= ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE | ARM_EXT2_MVE_FP);
   12333       ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, mve_all);
   12334       force_thumb = 1;
   12335       break;
   12336     case bfd_mach_arm_9:         ARM_SET_FEATURES (ARM_ARCH_V9A); break;
   12337       /* If the machine type is unknown allow all architecture types and all
   12338 	 extensions, with the exception of MVE as that clashes with NEON.  */
   12339     case bfd_mach_arm_unknown:
   12340       ARM_SET_FEATURES (ARM_ARCH_UNKNOWN);
   12341       break;
   12342     default:
   12343       abort ();
   12344     }
   12345 #undef ARM_SET_FEATURES
   12346 
   12347   /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch
   12348      and thus on bfd_mach_arm_XXX value.  Therefore for a given
   12349      bfd_mach_arm_XXX value all coprocessor feature bits should be allowed.  */
   12350   ARM_MERGE_FEATURE_SETS (*features, arch_fset, fpu_any);
   12351 }
   12352 
   12353 
   12354 /* NOTE: There are no checks in these routines that
   12355    the relevant number of data bytes exist.  */
   12356 
   12357 static int
   12358 print_insn (bfd_vma pc, struct disassemble_info *info, bool little)
   12359 {
   12360   unsigned char b[4];
   12361   unsigned long given;
   12362   int status;
   12363   int is_thumb = false;
   12364   int is_data = false;
   12365   int little_code;
   12366   unsigned int	size = 4;
   12367   void (*printer) (bfd_vma, struct disassemble_info *, long);
   12368   bool found = false;
   12369   struct arm_private_data *private_data;
   12370 
   12371   /* Clear instruction information field.  */
   12372   info->insn_info_valid = 0;
   12373   info->branch_delay_insns = 0;
   12374   info->data_size = 0;
   12375   info->insn_type = dis_noninsn;
   12376   info->target = 0;
   12377   info->target2 = 0;
   12378 
   12379   if (info->disassembler_options)
   12380     {
   12381       parse_arm_disassembler_options (info->disassembler_options);
   12382 
   12383       /* To avoid repeated parsing of these options, we remove them here.  */
   12384       info->disassembler_options = NULL;
   12385     }
   12386 
   12387   /* PR 10288: Control which instructions will be disassembled.  */
   12388   if (info->private_data == NULL)
   12389     {
   12390       static struct arm_private_data private;
   12391 
   12392       if (info->flavour != bfd_target_elf_flavour
   12393 	  && (info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0)
   12394 	/* If the user did not use the -m command line switch then default to
   12395 	   disassembling all types of ARM instruction.
   12396 
   12397 	   If this is an arm elf target, build attributes will be used to
   12398 	   determine info->mach, which enable us to be more accurate when
   12399 	   disassembling since we know what the target architecture version is.
   12400 	   For any other target see the comment below:
   12401 
   12402 	   The info->mach value has to be ignored as this will be based on
   12403 	   the default archictecture for the target and/or hints in the notes
   12404 	   section, but it will never be greater than the current largest arm
   12405 	   machine value (iWMMXt2), which is only equivalent to the V5TE
   12406 	   architecture.  ARM architectures have advanced beyond the machine
   12407 	   value encoding, and these newer architectures would be ignored if
   12408 	   the machine value was used.
   12409 
   12410 	   Ie the -m switch is used to restrict which instructions will be
   12411 	   disassembled.  If it is necessary to use the -m switch to tell
   12412 	   objdump that an ARM binary is being disassembled, eg because the
   12413 	   input is a raw binary file, but it is also desired to disassemble
   12414 	   all ARM instructions then use "-marm".  This will select the
   12415 	   "unknown" arm architecture which is compatible with any ARM
   12416 	   instruction.  */
   12417 	  info->mach = bfd_mach_arm_unknown;
   12418 
   12419       /* Compute the architecture bitmask from the machine number.
   12420 	 Note: This assumes that the machine number will not change
   12421 	 during disassembly....  */
   12422       select_arm_features (info->mach, & private.features);
   12423 
   12424       private.last_mapping_sym = -1;
   12425       private.last_mapping_addr = 0;
   12426       private.last_stop_offset = 0;
   12427 
   12428       info->private_data = & private;
   12429     }
   12430 
   12431   private_data = info->private_data;
   12432 
   12433   /* Decide if our code is going to be little-endian, despite what the
   12434      function argument might say.  */
   12435   little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little);
   12436 
   12437   /* For ELF, consult the symbol table to determine what kind of code
   12438      or data we have.  */
   12439   if (info->symtab_size != 0
   12440       && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
   12441     {
   12442       bfd_vma addr;
   12443       int n;
   12444       int last_sym = -1;
   12445       enum map_type type = MAP_ARM;
   12446 
   12447       found = mapping_symbol_for_insn (pc, info, &type);
   12448       last_sym = private_data->last_mapping_sym;
   12449 
   12450       is_thumb = (private_data->last_type == MAP_THUMB);
   12451       is_data = (private_data->last_type == MAP_DATA);
   12452 
   12453       /* Look a little bit ahead to see if we should print out
   12454 	 two or four bytes of data.  If there's a symbol,
   12455 	 mapping or otherwise, after two bytes then don't
   12456 	 print more.  */
   12457       if (is_data)
   12458 	{
   12459 	  size = 4 - (pc & 3);
   12460 	  for (n = last_sym + 1; n < info->symtab_size; n++)
   12461 	    {
   12462 	      addr = bfd_asymbol_value (info->symtab[n]);
   12463 	      if (addr > pc
   12464 		  && (info->section == NULL
   12465 		      || info->section == info->symtab[n]->section))
   12466 		{
   12467 		  if (addr - pc < size)
   12468 		    size = addr - pc;
   12469 		  break;
   12470 		}
   12471 	    }
   12472 	  /* If the next symbol is after three bytes, we need to
   12473 	     print only part of the data, so that we can use either
   12474 	     .byte or .short.  */
   12475 	  if (size == 3)
   12476 	    size = (pc & 1) ? 1 : 2;
   12477 	}
   12478     }
   12479 
   12480   if (info->symbols != NULL)
   12481     {
   12482       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
   12483 	{
   12484 	  coff_symbol_type * cs;
   12485 
   12486 	  cs = coffsymbol (*info->symbols);
   12487 	  is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
   12488 		      || cs->native->u.syment.n_sclass == C_THUMBSTAT
   12489 		      || cs->native->u.syment.n_sclass == C_THUMBLABEL
   12490 		      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
   12491 		      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
   12492 	}
   12493       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
   12494 	       && !found)
   12495 	{
   12496 	  /* If no mapping symbol has been found then fall back to the type
   12497 	     of the function symbol.  */
   12498 	  elf_symbol_type *  es;
   12499 	  unsigned int       type;
   12500 
   12501 	  es = *(elf_symbol_type **)(info->symbols);
   12502 	  type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
   12503 
   12504 	  is_thumb =
   12505 	    ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal)
   12506 	      == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT);
   12507 	}
   12508       else if (bfd_asymbol_flavour (*info->symbols)
   12509 	       == bfd_target_mach_o_flavour)
   12510 	{
   12511 	  bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols;
   12512 
   12513 	  is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF);
   12514 	}
   12515     }
   12516 
   12517   if (force_thumb)
   12518     is_thumb = true;
   12519 
   12520   if (is_data)
   12521     info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
   12522   else
   12523     info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
   12524 
   12525   info->bytes_per_line = 4;
   12526 
   12527   /* PR 10263: Disassemble data if requested to do so by the user.  */
   12528   if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0))
   12529     {
   12530       int i;
   12531 
   12532       /* Size was already set above.  */
   12533       info->bytes_per_chunk = size;
   12534       printer = print_insn_data;
   12535 
   12536       status = info->read_memory_func (pc, (bfd_byte *) b, size, info);
   12537       given = 0;
   12538       if (little)
   12539 	for (i = size - 1; i >= 0; i--)
   12540 	  given = b[i] | (given << 8);
   12541       else
   12542 	for (i = 0; i < (int) size; i++)
   12543 	  given = b[i] | (given << 8);
   12544     }
   12545   else if (!is_thumb)
   12546     {
   12547       /* In ARM mode endianness is a straightforward issue: the instruction
   12548 	 is four bytes long and is either ordered 0123 or 3210.  */
   12549       printer = print_insn_arm;
   12550       info->bytes_per_chunk = 4;
   12551       size = 4;
   12552 
   12553       status = info->read_memory_func (pc, (bfd_byte *) b, 4, info);
   12554       if (little_code)
   12555 	given = (b[0]) | (b[1] << 8) | (b[2] << 16) | ((unsigned) b[3] << 24);
   12556       else
   12557 	given = (b[3]) | (b[2] << 8) | (b[1] << 16) | ((unsigned) b[0] << 24);
   12558     }
   12559   else
   12560     {
   12561       /* In Thumb mode we have the additional wrinkle of two
   12562 	 instruction lengths.  Fortunately, the bits that determine
   12563 	 the length of the current instruction are always to be found
   12564 	 in the first two bytes.  */
   12565       printer = print_insn_thumb16;
   12566       info->bytes_per_chunk = 2;
   12567       size = 2;
   12568 
   12569       status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
   12570       if (little_code)
   12571 	given = (b[0]) | (b[1] << 8);
   12572       else
   12573 	given = (b[1]) | (b[0] << 8);
   12574 
   12575       if (!status)
   12576 	{
   12577 	  /* These bit patterns signal a four-byte Thumb
   12578 	     instruction.  */
   12579 	  if ((given & 0xF800) == 0xF800
   12580 	      || (given & 0xF800) == 0xF000
   12581 	      || (given & 0xF800) == 0xE800)
   12582 	    {
   12583 	      status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info);
   12584 	      if (little_code)
   12585 		given = (b[0]) | (b[1] << 8) | (given << 16);
   12586 	      else
   12587 		given = (b[1]) | (b[0] << 8) | (given << 16);
   12588 
   12589 	      printer = print_insn_thumb32;
   12590 	      size = 4;
   12591 	    }
   12592 	}
   12593 
   12594       if (ifthen_address != pc)
   12595 	find_ifthen_state (pc, info, little_code);
   12596 
   12597       if (ifthen_state)
   12598 	{
   12599 	  if ((ifthen_state & 0xf) == 0x8)
   12600 	    ifthen_next_state = 0;
   12601 	  else
   12602 	    ifthen_next_state = (ifthen_state & 0xe0)
   12603 				| ((ifthen_state & 0xf) << 1);
   12604 	}
   12605     }
   12606 
   12607   if (status)
   12608     {
   12609       info->memory_error_func (status, pc, info);
   12610       return -1;
   12611     }
   12612   if (info->flags & INSN_HAS_RELOC)
   12613     /* If the instruction has a reloc associated with it, then
   12614        the offset field in the instruction will actually be the
   12615        addend for the reloc.  (We are using REL type relocs).
   12616        In such cases, we can ignore the pc when computing
   12617        addresses, since the addend is not currently pc-relative.  */
   12618     pc = 0;
   12619 
   12620   printer (pc, info, given);
   12621 
   12622   if (is_thumb)
   12623     {
   12624       ifthen_state = ifthen_next_state;
   12625       ifthen_address += size;
   12626     }
   12627   return size;
   12628 }
   12629 
   12630 int
   12631 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
   12632 {
   12633   /* Detect BE8-ness and record it in the disassembler info.  */
   12634   if (info->flavour == bfd_target_elf_flavour
   12635       && info->section != NULL
   12636       && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8))
   12637     info->endian_code = BFD_ENDIAN_LITTLE;
   12638 
   12639   return print_insn (pc, info, false);
   12640 }
   12641 
   12642 int
   12643 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info)
   12644 {
   12645   return print_insn (pc, info, true);
   12646 }
   12647 
   12648 const disasm_options_and_args_t *
   12649 disassembler_options_arm (void)
   12650 {
   12651   static disasm_options_and_args_t *opts_and_args;
   12652 
   12653   if (opts_and_args == NULL)
   12654     {
   12655       disasm_options_t *opts;
   12656       unsigned int i;
   12657 
   12658       opts_and_args = XNEW (disasm_options_and_args_t);
   12659       opts_and_args->args = NULL;
   12660 
   12661       opts = &opts_and_args->options;
   12662       opts->name = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
   12663       opts->description = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1);
   12664       opts->arg = NULL;
   12665       for (i = 0; i < NUM_ARM_OPTIONS; i++)
   12666 	{
   12667 	  opts->name[i] = regnames[i].name;
   12668 	  if (regnames[i].description != NULL)
   12669 	    opts->description[i] = _(regnames[i].description);
   12670 	  else
   12671 	    opts->description[i] = NULL;
   12672 	}
   12673       /* The array we return must be NULL terminated.  */
   12674       opts->name[i] = NULL;
   12675       opts->description[i] = NULL;
   12676     }
   12677 
   12678   return opts_and_args;
   12679 }
   12680 
   12681 void
   12682 print_arm_disassembler_options (FILE *stream)
   12683 {
   12684   unsigned int i, max_len = 0;
   12685   fprintf (stream, _("\n\
   12686 The following ARM specific disassembler options are supported for use with\n\
   12687 the -M switch:\n"));
   12688 
   12689   for (i = 0; i < NUM_ARM_OPTIONS; i++)
   12690     {
   12691       unsigned int len = strlen (regnames[i].name);
   12692       if (max_len < len)
   12693 	max_len = len;
   12694     }
   12695 
   12696   for (i = 0, max_len++; i < NUM_ARM_OPTIONS; i++)
   12697     fprintf (stream, "  %s%*c %s\n",
   12698 	     regnames[i].name,
   12699 	     (int)(max_len - strlen (regnames[i].name)), ' ',
   12700 	     _(regnames[i].description));
   12701 }
   12702