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