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