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