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