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