1 /* Instruction printing code for the ARM
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
4 Free Software Foundation, Inc.
5 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
6 Modification by James G. Smith (jsmith@cygnus.co.uk)
8 This file is part of libopcodes.
10 This library is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 It is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
28 #include "opcode/arm.h"
30 #include "safe-ctype.h"
31 #include "floatformat.h"
33 /* FIXME: This shouldn't be done here. */
34 #include "coff/internal.h"
37 #include "elf/internal.h"
40 /* FIXME: Belongs in global header. */
42 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
46 #define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
49 /* Cached mapping symbol state. */
57 struct arm_private_data
59 /* The features to use when disassembling optional instructions. */
60 arm_feature_set features
;
62 /* Whether any mapping symbols are present in the provided symbol
63 table. -1 if we do not know yet, otherwise 0 or 1. */
64 int has_mapping_symbols
;
66 /* Track the last type (although this doesn't seem to be useful) */
67 enum map_type last_type
;
69 /* Tracking symbol table information */
71 bfd_vma last_mapping_addr
;
76 unsigned long arch
; /* Architecture defining this insn. */
77 unsigned long value
; /* If arch == 0 then value is a sentinel. */
78 unsigned long mask
; /* Recognise insn if (op & mask) == value. */
79 const char * assembler
; /* How to disassemble this insn. */
84 unsigned long arch
; /* Architecture defining this insn. */
85 unsigned short value
, mask
; /* Recognise insn if (op & mask) == value. */
86 const char *assembler
; /* How to disassemble this insn. */
89 /* print_insn_coprocessor recognizes the following format control codes:
93 %c print condition code (always bits 28-31 in ARM mode)
94 %q print shifter argument
95 %u print condition code (unconditional in ARM mode,
96 UNPREDICTABLE if not AL in Thumb)
97 %A print address for ldc/stc/ldf/stf instruction
98 %B print vstm/vldm register list
99 %I print cirrus signed shift immediate: bits 0..3|4..6
100 %F print the COUNT field of a LFM/SFM instruction.
101 %P print floating point precision in arithmetic insn
102 %Q print floating point precision in ldf/stf insn
103 %R print floating point rounding mode
105 %<bitfield>r print as an ARM register
106 %<bitfield>R as %<>r but r15 is UNPREDICTABLE
107 %<bitfield>ru as %<>r but each u register must be unique.
108 %<bitfield>d print the bitfield in decimal
109 %<bitfield>k print immediate for VFPv3 conversion instruction
110 %<bitfield>x print the bitfield in hex
111 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
112 %<bitfield>f print a floating point constant if >7 else a
113 floating point register
114 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
115 %<bitfield>g print as an iWMMXt 64-bit register
116 %<bitfield>G print as an iWMMXt general purpose or control register
117 %<bitfield>D print as a NEON D register
118 %<bitfield>Q print as a NEON Q register
120 %y<code> print a single precision VFP reg.
121 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
122 %z<code> print a double precision VFP reg
123 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
125 %<bitfield>'c print specified char iff bitfield is all ones
126 %<bitfield>`c print specified char iff bitfield is all zeroes
127 %<bitfield>?ab... select from array of values in big endian order
129 %L print as an iWMMXt N/M width field.
130 %Z print the Immediate of a WSHUFH instruction.
131 %l like 'A' except use byte offsets for 'B' & 'H'
133 %i print 5-bit immediate in bits 8,3..0
135 %r print register offset address for wldt/wstr instruction. */
137 enum opcode_sentinel_enum
139 SENTINEL_IWMMXT_START
= 1,
141 SENTINEL_GENERIC_START
144 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x"
145 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>"
147 /* Common coprocessor opcodes shared between Arm and Thumb-2. */
149 static const struct opcode32 coprocessor_opcodes
[] =
151 /* XScale instructions. */
152 {ARM_CEXT_XSCALE
, 0x0e200010, 0x0fff0ff0, "mia%c\tacc0, %0-3r, %12-15r"},
153 {ARM_CEXT_XSCALE
, 0x0e280010, 0x0fff0ff0, "miaph%c\tacc0, %0-3r, %12-15r"},
154 {ARM_CEXT_XSCALE
, 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
155 {ARM_CEXT_XSCALE
, 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
156 {ARM_CEXT_XSCALE
, 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
158 /* Intel Wireless MMX technology instructions. */
159 { 0, SENTINEL_IWMMXT_START
, 0, "" },
160 {ARM_CEXT_IWMMXT
, 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
161 {ARM_CEXT_XSCALE
, 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
162 {ARM_CEXT_XSCALE
, 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
163 {ARM_CEXT_XSCALE
, 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
164 {ARM_CEXT_XSCALE
, 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
165 {ARM_CEXT_XSCALE
, 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
166 {ARM_CEXT_XSCALE
, 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
167 {ARM_CEXT_XSCALE
, 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
168 {ARM_CEXT_XSCALE
, 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
169 {ARM_CEXT_XSCALE
, 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
170 {ARM_CEXT_XSCALE
, 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
171 {ARM_CEXT_XSCALE
, 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
172 {ARM_CEXT_XSCALE
, 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
173 {ARM_CEXT_XSCALE
, 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
174 {ARM_CEXT_XSCALE
, 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
175 {ARM_CEXT_XSCALE
, 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
176 {ARM_CEXT_XSCALE
, 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
177 {ARM_CEXT_XSCALE
, 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
178 {ARM_CEXT_XSCALE
, 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
179 {ARM_CEXT_XSCALE
, 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
180 {ARM_CEXT_XSCALE
, 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
181 {ARM_CEXT_XSCALE
, 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
182 {ARM_CEXT_XSCALE
, 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
183 {ARM_CEXT_XSCALE
, 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
184 {ARM_CEXT_XSCALE
, 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
185 {ARM_CEXT_XSCALE
, 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
186 {ARM_CEXT_XSCALE
, 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
187 {ARM_CEXT_XSCALE
, 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
188 {ARM_CEXT_XSCALE
, 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
189 {ARM_CEXT_XSCALE
, 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
190 {ARM_CEXT_XSCALE
, 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
191 {ARM_CEXT_XSCALE
, 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
192 {ARM_CEXT_XSCALE
, 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
193 {ARM_CEXT_XSCALE
, 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
194 {ARM_CEXT_XSCALE
, 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
195 {ARM_CEXT_XSCALE
, 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
196 {ARM_CEXT_XSCALE
, 0x0e800120, 0x0f800ff0, "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
197 {ARM_CEXT_XSCALE
, 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
198 {ARM_CEXT_XSCALE
, 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
199 {ARM_CEXT_XSCALE
, 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
200 {ARM_CEXT_XSCALE
, 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
201 {ARM_CEXT_XSCALE
, 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
202 {ARM_CEXT_XSCALE
, 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
203 {ARM_CEXT_XSCALE
, 0x0e8000a0, 0x0f800ff0, "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
204 {ARM_CEXT_XSCALE
, 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
205 {ARM_CEXT_XSCALE
, 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
206 {ARM_CEXT_XSCALE
, 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
207 {ARM_CEXT_XSCALE
, 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
208 {ARM_CEXT_XSCALE
, 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
209 {ARM_CEXT_XSCALE
, 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
210 {ARM_CEXT_XSCALE
, 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
211 {ARM_CEXT_XSCALE
, 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
212 {ARM_CEXT_XSCALE
, 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
213 {ARM_CEXT_XSCALE
, 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
214 {ARM_CEXT_XSCALE
, 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
215 {ARM_CEXT_XSCALE
, 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
216 {ARM_CEXT_XSCALE
, 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
217 {ARM_CEXT_XSCALE
, 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
218 {ARM_CEXT_XSCALE
, 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
219 {ARM_CEXT_XSCALE
, 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
220 {ARM_CEXT_XSCALE
, 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
221 {ARM_CEXT_XSCALE
, 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
222 {ARM_CEXT_XSCALE
, 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
223 {ARM_CEXT_XSCALE
, 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
224 {ARM_CEXT_XSCALE
, 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
225 {ARM_CEXT_XSCALE
, 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
226 {ARM_CEXT_XSCALE
, 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
227 {ARM_CEXT_XSCALE
, 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
228 {ARM_CEXT_XSCALE
, 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
229 {ARM_CEXT_XSCALE
, 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
230 {ARM_CEXT_XSCALE
, 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
231 {ARM_CEXT_XSCALE
, 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
232 {ARM_CEXT_XSCALE
, 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
233 {ARM_CEXT_XSCALE
, 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
234 {ARM_CEXT_XSCALE
, 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
235 { 0, SENTINEL_IWMMXT_END
, 0, "" },
237 /* Floating point coprocessor (FPA) instructions. */
238 {FPU_FPA_EXT_V1
, 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
239 {FPU_FPA_EXT_V1
, 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
240 {FPU_FPA_EXT_V1
, 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
241 {FPU_FPA_EXT_V1
, 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
242 {FPU_FPA_EXT_V1
, 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
243 {FPU_FPA_EXT_V1
, 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
244 {FPU_FPA_EXT_V1
, 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
245 {FPU_FPA_EXT_V1
, 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
246 {FPU_FPA_EXT_V1
, 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
247 {FPU_FPA_EXT_V1
, 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
248 {FPU_FPA_EXT_V1
, 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
249 {FPU_FPA_EXT_V1
, 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
250 {FPU_FPA_EXT_V1
, 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
251 {FPU_FPA_EXT_V1
, 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
252 {FPU_FPA_EXT_V1
, 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
253 {FPU_FPA_EXT_V1
, 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
254 {FPU_FPA_EXT_V1
, 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
255 {FPU_FPA_EXT_V1
, 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
256 {FPU_FPA_EXT_V1
, 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
257 {FPU_FPA_EXT_V1
, 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
258 {FPU_FPA_EXT_V1
, 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
259 {FPU_FPA_EXT_V1
, 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
260 {FPU_FPA_EXT_V1
, 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
261 {FPU_FPA_EXT_V1
, 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
262 {FPU_FPA_EXT_V1
, 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
263 {FPU_FPA_EXT_V1
, 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
264 {FPU_FPA_EXT_V1
, 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
265 {FPU_FPA_EXT_V1
, 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
266 {FPU_FPA_EXT_V1
, 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
267 {FPU_FPA_EXT_V1
, 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
268 {FPU_FPA_EXT_V1
, 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
269 {FPU_FPA_EXT_V1
, 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
270 {FPU_FPA_EXT_V1
, 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
271 {FPU_FPA_EXT_V1
, 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
272 {FPU_FPA_EXT_V1
, 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
273 {FPU_FPA_EXT_V1
, 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
274 {FPU_FPA_EXT_V1
, 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
275 {FPU_FPA_EXT_V1
, 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
276 {FPU_FPA_EXT_V1
, 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
277 {FPU_FPA_EXT_V1
, 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
278 {FPU_FPA_EXT_V1
, 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
279 {FPU_FPA_EXT_V2
, 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
280 {FPU_FPA_EXT_V2
, 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
282 /* Register load/store. */
283 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"},
284 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"},
285 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"},
286 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
287 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"},
288 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
289 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"},
290 {FPU_VFP_EXT_V1xD
| FPU_NEON_EXT_V1
, 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"},
291 {FPU_VFP_EXT_V1xD
, 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"},
292 {FPU_VFP_EXT_V1xD
, 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"},
293 {FPU_VFP_EXT_V1xD
, 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"},
294 {FPU_VFP_EXT_V1xD
, 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"},
295 {FPU_VFP_EXT_V1xD
, 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"},
296 {FPU_VFP_EXT_V1xD
, 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"},
297 {FPU_VFP_EXT_V1xD
, 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"},
298 {FPU_VFP_EXT_V1xD
, 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"},
300 {FPU_VFP_EXT_V1xD
, 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
301 {FPU_VFP_EXT_V1xD
, 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"},
302 {FPU_VFP_EXT_V1xD
, 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
303 {FPU_VFP_EXT_V1xD
, 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"},
305 /* Data transfer between ARM and NEON registers. */
306 {FPU_NEON_EXT_V1
, 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
307 {FPU_NEON_EXT_V1
, 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
308 {FPU_NEON_EXT_V1
, 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
309 {FPU_NEON_EXT_V1
, 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
310 {FPU_NEON_EXT_V1
, 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
311 {FPU_NEON_EXT_V1
, 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
312 {FPU_NEON_EXT_V1
, 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
313 {FPU_NEON_EXT_V1
, 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
314 {FPU_NEON_EXT_V1
, 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
315 {FPU_NEON_EXT_V1
, 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
316 {FPU_NEON_EXT_V1
, 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
317 {FPU_NEON_EXT_V1
, 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
318 {FPU_NEON_EXT_V1
, 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
319 {FPU_NEON_EXT_V1
, 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
320 /* Half-precision conversion instructions. */
321 {FPU_VFP_EXT_FP16
, 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"},
322 {FPU_VFP_EXT_FP16
, 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"},
324 /* Floating point coprocessor (VFP) instructions. */
325 {FPU_VFP_EXT_V1xD
, 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"},
326 {FPU_VFP_EXT_V1xD
, 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"},
327 {FPU_VFP_EXT_V1xD
, 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"},
328 {FPU_VFP_EXT_V1xD
, 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"},
329 {FPU_VFP_EXT_V1xD
, 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"},
330 {FPU_VFP_EXT_V1xD
, 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"},
331 {FPU_VFP_EXT_V1xD
, 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"},
332 {FPU_VFP_EXT_V1xD
, 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"},
333 {FPU_VFP_EXT_V1xD
, 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"},
334 {FPU_VFP_EXT_V1xD
, 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"},
335 {FPU_VFP_EXT_V1xD
, 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"},
336 {FPU_VFP_EXT_V1xD
, 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"},
337 {FPU_VFP_EXT_V1xD
, 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"},
338 {FPU_VFP_EXT_V1xD
, 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"},
339 {FPU_VFP_EXT_V1xD
, 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"},
340 {FPU_VFP_EXT_V1
, 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"},
341 {FPU_VFP_EXT_V1
, 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"},
342 {FPU_VFP_EXT_V1xD
, 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"},
343 {FPU_VFP_EXT_V1xD
, 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"},
344 {FPU_VFP_EXT_V1xD
, 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"},
345 {FPU_VFP_EXT_V1xD
, 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"},
346 {FPU_VFP_EXT_V1xD
, 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"},
347 {FPU_VFP_EXT_V1
, 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"},
348 {FPU_VFP_EXT_V1xD
, 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"},
349 {FPU_VFP_EXT_V1xD
, 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"},
350 {FPU_VFP_EXT_V1
, 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"},
351 {FPU_VFP_EXT_V1
, 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"},
352 {FPU_VFP_EXT_V1xD
, 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"},
353 {FPU_VFP_EXT_V1xD
, 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"},
354 {FPU_VFP_EXT_V1
, 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"},
355 {FPU_VFP_EXT_V1
, 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"},
356 {FPU_VFP_EXT_V1
, 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"},
357 {FPU_VFP_EXT_V1
, 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"},
358 {FPU_VFP_EXT_V1xD
, 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"},
359 {FPU_VFP_EXT_V1
, 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"},
360 {FPU_VFP_EXT_V1xD
, 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
361 {FPU_VFP_EXT_V1
, 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
362 {FPU_VFP_EXT_V3xD
, 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"},
363 {FPU_VFP_EXT_V3
, 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"},
364 {FPU_VFP_EXT_V1xD
, 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
365 {FPU_VFP_EXT_V1
, 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
366 {FPU_VFP_EXT_V3xD
, 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"},
367 {FPU_VFP_EXT_V3
, 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"},
368 {FPU_VFP_EXT_V1
, 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"},
369 {FPU_VFP_EXT_V3xD
, 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19d"},
370 {FPU_VFP_EXT_V3
, 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19d"},
371 {FPU_VFP_EXT_V2
, 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"},
372 {FPU_VFP_EXT_V2
, 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"},
373 {FPU_VFP_EXT_V2
, 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"},
374 {FPU_VFP_EXT_V1xD
, 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"},
375 {FPU_VFP_EXT_V1xD
, 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"},
376 {FPU_VFP_EXT_V1
, 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"},
377 {FPU_VFP_EXT_V1
, 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"},
378 {FPU_VFP_EXT_V1xD
, 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"},
379 {FPU_VFP_EXT_V1xD
, 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"},
380 {FPU_VFP_EXT_V1
, 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"},
381 {FPU_VFP_EXT_V1
, 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"},
382 {FPU_VFP_EXT_V1xD
, 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"},
383 {FPU_VFP_EXT_V1xD
, 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"},
384 {FPU_VFP_EXT_V1
, 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"},
385 {FPU_VFP_EXT_V1
, 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"},
386 {FPU_VFP_EXT_V1xD
, 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"},
387 {FPU_VFP_EXT_V1xD
, 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"},
388 {FPU_VFP_EXT_V1
, 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"},
389 {FPU_VFP_EXT_V1
, 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"},
390 {FPU_VFP_EXT_V1xD
, 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"},
391 {FPU_VFP_EXT_V1
, 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"},
393 /* Cirrus coprocessor instructions. */
394 {ARM_CEXT_MAVERICK
, 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
395 {ARM_CEXT_MAVERICK
, 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
396 {ARM_CEXT_MAVERICK
, 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
397 {ARM_CEXT_MAVERICK
, 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
398 {ARM_CEXT_MAVERICK
, 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
399 {ARM_CEXT_MAVERICK
, 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
400 {ARM_CEXT_MAVERICK
, 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
401 {ARM_CEXT_MAVERICK
, 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
402 {ARM_CEXT_MAVERICK
, 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
403 {ARM_CEXT_MAVERICK
, 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
404 {ARM_CEXT_MAVERICK
, 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
405 {ARM_CEXT_MAVERICK
, 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
406 {ARM_CEXT_MAVERICK
, 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
407 {ARM_CEXT_MAVERICK
, 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
408 {ARM_CEXT_MAVERICK
, 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
409 {ARM_CEXT_MAVERICK
, 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
410 {ARM_CEXT_MAVERICK
, 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
411 {ARM_CEXT_MAVERICK
, 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
412 {ARM_CEXT_MAVERICK
, 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
413 {ARM_CEXT_MAVERICK
, 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
414 {ARM_CEXT_MAVERICK
, 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
415 {ARM_CEXT_MAVERICK
, 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
416 {ARM_CEXT_MAVERICK
, 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
417 {ARM_CEXT_MAVERICK
, 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
418 {ARM_CEXT_MAVERICK
, 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
419 {ARM_CEXT_MAVERICK
, 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
420 {ARM_CEXT_MAVERICK
, 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
421 {ARM_CEXT_MAVERICK
, 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
422 {ARM_CEXT_MAVERICK
, 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
423 {ARM_CEXT_MAVERICK
, 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
424 {ARM_CEXT_MAVERICK
, 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
425 {ARM_CEXT_MAVERICK
, 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
426 {ARM_CEXT_MAVERICK
, 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
427 {ARM_CEXT_MAVERICK
, 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
428 {ARM_CEXT_MAVERICK
, 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
429 {ARM_CEXT_MAVERICK
, 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
430 {ARM_CEXT_MAVERICK
, 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
431 {ARM_CEXT_MAVERICK
, 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
432 {ARM_CEXT_MAVERICK
, 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
433 {ARM_CEXT_MAVERICK
, 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
434 {ARM_CEXT_MAVERICK
, 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
435 {ARM_CEXT_MAVERICK
, 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
436 {ARM_CEXT_MAVERICK
, 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
437 {ARM_CEXT_MAVERICK
, 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
438 {ARM_CEXT_MAVERICK
, 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
439 {ARM_CEXT_MAVERICK
, 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
440 {ARM_CEXT_MAVERICK
, 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
441 {ARM_CEXT_MAVERICK
, 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
442 {ARM_CEXT_MAVERICK
, 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
443 {ARM_CEXT_MAVERICK
, 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
444 {ARM_CEXT_MAVERICK
, 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
445 {ARM_CEXT_MAVERICK
, 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
446 {ARM_CEXT_MAVERICK
, 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
447 {ARM_CEXT_MAVERICK
, 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
448 {ARM_CEXT_MAVERICK
, 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
449 {ARM_CEXT_MAVERICK
, 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
450 {ARM_CEXT_MAVERICK
, 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
451 {ARM_CEXT_MAVERICK
, 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
452 {ARM_CEXT_MAVERICK
, 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
453 {ARM_CEXT_MAVERICK
, 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
454 {ARM_CEXT_MAVERICK
, 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
455 {ARM_CEXT_MAVERICK
, 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
456 {ARM_CEXT_MAVERICK
, 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
457 {ARM_CEXT_MAVERICK
, 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
458 {ARM_CEXT_MAVERICK
, 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
459 {ARM_CEXT_MAVERICK
, 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
460 {ARM_CEXT_MAVERICK
, 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
461 {ARM_CEXT_MAVERICK
, 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
462 {ARM_CEXT_MAVERICK
, 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
463 {ARM_CEXT_MAVERICK
, 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
464 {ARM_CEXT_MAVERICK
, 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
465 {ARM_CEXT_MAVERICK
, 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
466 {ARM_CEXT_MAVERICK
, 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
467 {ARM_CEXT_MAVERICK
, 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
468 {ARM_CEXT_MAVERICK
, 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
469 {ARM_CEXT_MAVERICK
, 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
470 {ARM_CEXT_MAVERICK
, 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
471 {ARM_CEXT_MAVERICK
, 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
472 {ARM_CEXT_MAVERICK
, 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
473 {ARM_CEXT_MAVERICK
, 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
474 {ARM_CEXT_MAVERICK
, 0x0e000600, 0x0ff00f10, "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
475 {ARM_CEXT_MAVERICK
, 0x0e100600, 0x0ff00f10, "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
476 {ARM_CEXT_MAVERICK
, 0x0e200600, 0x0ff00f10, "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
477 {ARM_CEXT_MAVERICK
, 0x0e300600, 0x0ff00f10, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
479 /* VFP Fused multiply add instructions. */
480 {FPU_VFP_EXT_FMA
, 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"},
481 {FPU_VFP_EXT_FMA
, 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"},
482 {FPU_VFP_EXT_FMA
, 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"},
483 {FPU_VFP_EXT_FMA
, 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"},
484 {FPU_VFP_EXT_FMA
, 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"},
485 {FPU_VFP_EXT_FMA
, 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"},
486 {FPU_VFP_EXT_FMA
, 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"},
487 {FPU_VFP_EXT_FMA
, 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"},
489 /* Generic coprocessor instructions. */
490 { 0, SENTINEL_GENERIC_START
, 0, "" },
491 {ARM_EXT_V5E
, 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"},
492 {ARM_EXT_V5E
, 0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
493 {ARM_EXT_V2
, 0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
494 {ARM_EXT_V2
, 0x0e10f010, 0x0f10f010, "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"},
495 {ARM_EXT_V2
, 0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
496 {ARM_EXT_V2
, 0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
497 {ARM_EXT_V2
, 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
498 {ARM_EXT_V2
, 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
500 /* V6 coprocessor instructions. */
501 {ARM_EXT_V6
, 0xfc500000, 0xfff00000, "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"},
502 {ARM_EXT_V6
, 0xfc400000, 0xfff00000, "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"},
504 /* V5 coprocessor instructions. */
505 {ARM_EXT_V5
, 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
506 {ARM_EXT_V5
, 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
507 {ARM_EXT_V5
, 0xfe000000, 0xff000010, "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
508 {ARM_EXT_V5
, 0xfe000010, 0xff100010, "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"},
509 {ARM_EXT_V5
, 0xfe100010, 0xff100010, "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
514 /* Neon opcode table: This does not encode the top byte -- that is
515 checked by the print_insn_neon routine, as it depends on whether we are
516 doing thumb32 or arm32 disassembly. */
518 /* print_insn_neon recognizes the following format control codes:
522 %c print condition code
523 %u print condition code (unconditional in ARM mode,
524 UNPREDICTABLE if not AL in Thumb)
525 %A print v{st,ld}[1234] operands
526 %B print v{st,ld}[1234] any one operands
527 %C print v{st,ld}[1234] single->all operands
529 %E print vmov, vmvn, vorr, vbic encoded constant
530 %F print vtbl,vtbx register list
532 %<bitfield>r print as an ARM register
533 %<bitfield>d print the bitfield in decimal
534 %<bitfield>e print the 2^N - bitfield in decimal
535 %<bitfield>D print as a NEON D register
536 %<bitfield>Q print as a NEON Q register
537 %<bitfield>R print as a NEON D or Q register
538 %<bitfield>Sn print byte scaled width limited by n
539 %<bitfield>Tn print short scaled width limited by n
540 %<bitfield>Un print long scaled width limited by n
542 %<bitfield>'c print specified char iff bitfield is all ones
543 %<bitfield>`c print specified char iff bitfield is all zeroes
544 %<bitfield>?ab... select from array of values in big endian order. */
546 static const struct opcode32 neon_opcodes
[] =
549 {FPU_NEON_EXT_V1
, 0xf2b00840, 0xffb00850, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
550 {FPU_NEON_EXT_V1
, 0xf2b00000, 0xffb00810, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
552 /* Move data element to all lanes. */
553 {FPU_NEON_EXT_V1
, 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
554 {FPU_NEON_EXT_V1
, 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
555 {FPU_NEON_EXT_V1
, 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
558 {FPU_NEON_EXT_V1
, 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
559 {FPU_NEON_EXT_V1
, 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
561 /* Half-precision conversions. */
562 {FPU_VFP_EXT_FP16
, 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"},
563 {FPU_VFP_EXT_FP16
, 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"},
565 /* NEON fused multiply add instructions. */
566 {FPU_NEON_EXT_FMA
, 0xf2000c10, 0xffa00f10, "vfma%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
567 {FPU_NEON_EXT_FMA
, 0xf2200c10, 0xffa00f10, "vfms%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
569 /* Two registers, miscellaneous. */
570 {FPU_NEON_EXT_V1
, 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
571 {FPU_NEON_EXT_V1
, 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
572 {FPU_NEON_EXT_V1
, 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
573 {FPU_NEON_EXT_V1
, 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
574 {FPU_NEON_EXT_V1
, 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
575 {FPU_NEON_EXT_V1
, 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
576 {FPU_NEON_EXT_V1
, 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
577 {FPU_NEON_EXT_V1
, 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
578 {FPU_NEON_EXT_V1
, 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
579 {FPU_NEON_EXT_V1
, 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
580 {FPU_NEON_EXT_V1
, 0xf3b20300, 0xffb30fd0, "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
581 {FPU_NEON_EXT_V1
, 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
582 {FPU_NEON_EXT_V1
, 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
583 {FPU_NEON_EXT_V1
, 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
584 {FPU_NEON_EXT_V1
, 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
585 {FPU_NEON_EXT_V1
, 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
586 {FPU_NEON_EXT_V1
, 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
587 {FPU_NEON_EXT_V1
, 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
588 {FPU_NEON_EXT_V1
, 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
589 {FPU_NEON_EXT_V1
, 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
590 {FPU_NEON_EXT_V1
, 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
591 {FPU_NEON_EXT_V1
, 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
592 {FPU_NEON_EXT_V1
, 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
593 {FPU_NEON_EXT_V1
, 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
594 {FPU_NEON_EXT_V1
, 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
595 {FPU_NEON_EXT_V1
, 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
596 {FPU_NEON_EXT_V1
, 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
597 {FPU_NEON_EXT_V1
, 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
598 {FPU_NEON_EXT_V1
, 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
599 {FPU_NEON_EXT_V1
, 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
600 {FPU_NEON_EXT_V1
, 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
601 {FPU_NEON_EXT_V1
, 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
602 {FPU_NEON_EXT_V1
, 0xf3b30600, 0xffb30e10, "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
604 /* Three registers of the same length. */
605 {FPU_NEON_EXT_V1
, 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
606 {FPU_NEON_EXT_V1
, 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
607 {FPU_NEON_EXT_V1
, 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
608 {FPU_NEON_EXT_V1
, 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
609 {FPU_NEON_EXT_V1
, 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
610 {FPU_NEON_EXT_V1
, 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
611 {FPU_NEON_EXT_V1
, 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
612 {FPU_NEON_EXT_V1
, 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
613 {FPU_NEON_EXT_V1
, 0xf2000d00, 0xffa00f10, "vadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
614 {FPU_NEON_EXT_V1
, 0xf2000d10, 0xffa00f10, "vmla%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
615 {FPU_NEON_EXT_V1
, 0xf2000e00, 0xffa00f10, "vceq%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
616 {FPU_NEON_EXT_V1
, 0xf2000f00, 0xffa00f10, "vmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
617 {FPU_NEON_EXT_V1
, 0xf2000f10, 0xffa00f10, "vrecps%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
618 {FPU_NEON_EXT_V1
, 0xf2200d00, 0xffa00f10, "vsub%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
619 {FPU_NEON_EXT_V1
, 0xf2200d10, 0xffa00f10, "vmls%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
620 {FPU_NEON_EXT_V1
, 0xf2200f00, 0xffa00f10, "vmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
621 {FPU_NEON_EXT_V1
, 0xf2200f10, 0xffa00f10, "vrsqrts%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
622 {FPU_NEON_EXT_V1
, 0xf3000d00, 0xffa00f10, "vpadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
623 {FPU_NEON_EXT_V1
, 0xf3000d10, 0xffa00f10, "vmul%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
624 {FPU_NEON_EXT_V1
, 0xf3000e00, 0xffa00f10, "vcge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
625 {FPU_NEON_EXT_V1
, 0xf3000e10, 0xffa00f10, "vacge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
626 {FPU_NEON_EXT_V1
, 0xf3000f00, 0xffa00f10, "vpmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
627 {FPU_NEON_EXT_V1
, 0xf3200d00, 0xffa00f10, "vabd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
628 {FPU_NEON_EXT_V1
, 0xf3200e00, 0xffa00f10, "vcgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
629 {FPU_NEON_EXT_V1
, 0xf3200e10, 0xffa00f10, "vacgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
630 {FPU_NEON_EXT_V1
, 0xf3200f00, 0xffa00f10, "vpmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
631 {FPU_NEON_EXT_V1
, 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
632 {FPU_NEON_EXT_V1
, 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
633 {FPU_NEON_EXT_V1
, 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
634 {FPU_NEON_EXT_V1
, 0xf2000b00, 0xff800f10, "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
635 {FPU_NEON_EXT_V1
, 0xf2000b10, 0xff800f10, "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
636 {FPU_NEON_EXT_V1
, 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
637 {FPU_NEON_EXT_V1
, 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
638 {FPU_NEON_EXT_V1
, 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
639 {FPU_NEON_EXT_V1
, 0xf3000b00, 0xff800f10, "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
640 {FPU_NEON_EXT_V1
, 0xf2000000, 0xfe800f10, "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
641 {FPU_NEON_EXT_V1
, 0xf2000010, 0xfe800f10, "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
642 {FPU_NEON_EXT_V1
, 0xf2000100, 0xfe800f10, "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
643 {FPU_NEON_EXT_V1
, 0xf2000200, 0xfe800f10, "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
644 {FPU_NEON_EXT_V1
, 0xf2000210, 0xfe800f10, "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
645 {FPU_NEON_EXT_V1
, 0xf2000300, 0xfe800f10, "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
646 {FPU_NEON_EXT_V1
, 0xf2000310, 0xfe800f10, "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
647 {FPU_NEON_EXT_V1
, 0xf2000400, 0xfe800f10, "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
648 {FPU_NEON_EXT_V1
, 0xf2000410, 0xfe800f10, "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
649 {FPU_NEON_EXT_V1
, 0xf2000500, 0xfe800f10, "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
650 {FPU_NEON_EXT_V1
, 0xf2000510, 0xfe800f10, "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
651 {FPU_NEON_EXT_V1
, 0xf2000600, 0xfe800f10, "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
652 {FPU_NEON_EXT_V1
, 0xf2000610, 0xfe800f10, "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
653 {FPU_NEON_EXT_V1
, 0xf2000700, 0xfe800f10, "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
654 {FPU_NEON_EXT_V1
, 0xf2000710, 0xfe800f10, "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
655 {FPU_NEON_EXT_V1
, 0xf2000910, 0xfe800f10, "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
656 {FPU_NEON_EXT_V1
, 0xf2000a00, 0xfe800f10, "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
657 {FPU_NEON_EXT_V1
, 0xf2000a10, 0xfe800f10, "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
659 /* One register and an immediate value. */
660 {FPU_NEON_EXT_V1
, 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
661 {FPU_NEON_EXT_V1
, 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
662 {FPU_NEON_EXT_V1
, 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
663 {FPU_NEON_EXT_V1
, 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
664 {FPU_NEON_EXT_V1
, 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
665 {FPU_NEON_EXT_V1
, 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
666 {FPU_NEON_EXT_V1
, 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
667 {FPU_NEON_EXT_V1
, 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
668 {FPU_NEON_EXT_V1
, 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
669 {FPU_NEON_EXT_V1
, 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
670 {FPU_NEON_EXT_V1
, 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
671 {FPU_NEON_EXT_V1
, 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
672 {FPU_NEON_EXT_V1
, 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
674 /* Two registers and a shift amount. */
675 {FPU_NEON_EXT_V1
, 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
676 {FPU_NEON_EXT_V1
, 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
677 {FPU_NEON_EXT_V1
, 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
678 {FPU_NEON_EXT_V1
, 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
679 {FPU_NEON_EXT_V1
, 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
680 {FPU_NEON_EXT_V1
, 0xf2880950, 0xfeb80fd0, "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
681 {FPU_NEON_EXT_V1
, 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22D, %0-3,5Q, #%16-18d"},
682 {FPU_NEON_EXT_V1
, 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
683 {FPU_NEON_EXT_V1
, 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
684 {FPU_NEON_EXT_V1
, 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
685 {FPU_NEON_EXT_V1
, 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
686 {FPU_NEON_EXT_V1
, 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
687 {FPU_NEON_EXT_V1
, 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
688 {FPU_NEON_EXT_V1
, 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
689 {FPU_NEON_EXT_V1
, 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
690 {FPU_NEON_EXT_V1
, 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
691 {FPU_NEON_EXT_V1
, 0xf2900950, 0xfeb00fd0, "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
692 {FPU_NEON_EXT_V1
, 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-19d"},
693 {FPU_NEON_EXT_V1
, 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
694 {FPU_NEON_EXT_V1
, 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
695 {FPU_NEON_EXT_V1
, 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
696 {FPU_NEON_EXT_V1
, 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
697 {FPU_NEON_EXT_V1
, 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
698 {FPU_NEON_EXT_V1
, 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
699 {FPU_NEON_EXT_V1
, 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
700 {FPU_NEON_EXT_V1
, 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
701 {FPU_NEON_EXT_V1
, 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
702 {FPU_NEON_EXT_V1
, 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
703 {FPU_NEON_EXT_V1
, 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
704 {FPU_NEON_EXT_V1
, 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-20d"},
705 {FPU_NEON_EXT_V1
, 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
706 {FPU_NEON_EXT_V1
, 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
707 {FPU_NEON_EXT_V1
, 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
708 {FPU_NEON_EXT_V1
, 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
709 {FPU_NEON_EXT_V1
, 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
710 {FPU_NEON_EXT_V1
, 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
711 {FPU_NEON_EXT_V1
, 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
712 {FPU_NEON_EXT_V1
, 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
713 {FPU_NEON_EXT_V1
, 0xf2a00950, 0xfea00fd0, "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
714 {FPU_NEON_EXT_V1
, 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
715 {FPU_NEON_EXT_V1
, 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
716 {FPU_NEON_EXT_V1
, 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
717 {FPU_NEON_EXT_V1
, 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
718 {FPU_NEON_EXT_V1
, 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
719 {FPU_NEON_EXT_V1
, 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
720 {FPU_NEON_EXT_V1
, 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
721 {FPU_NEON_EXT_V1
, 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
722 {FPU_NEON_EXT_V1
, 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
723 {FPU_NEON_EXT_V1
, 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
724 {FPU_NEON_EXT_V1
, 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
725 {FPU_NEON_EXT_V1
, 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
726 {FPU_NEON_EXT_V1
, 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
727 {FPU_NEON_EXT_V1
, 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
728 {FPU_NEON_EXT_V1
, 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
729 {FPU_NEON_EXT_V1
, 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
730 {FPU_NEON_EXT_V1
, 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
731 {FPU_NEON_EXT_V1
, 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
732 {FPU_NEON_EXT_V1
, 0xf2a00e10, 0xfea00e90, "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
734 /* Three registers of different lengths. */
735 {FPU_NEON_EXT_V1
, 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
736 {FPU_NEON_EXT_V1
, 0xf2800400, 0xff800f50, "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
737 {FPU_NEON_EXT_V1
, 0xf2800600, 0xff800f50, "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
738 {FPU_NEON_EXT_V1
, 0xf2800900, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
739 {FPU_NEON_EXT_V1
, 0xf2800b00, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
740 {FPU_NEON_EXT_V1
, 0xf2800d00, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
741 {FPU_NEON_EXT_V1
, 0xf3800400, 0xff800f50, "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
742 {FPU_NEON_EXT_V1
, 0xf3800600, 0xff800f50, "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
743 {FPU_NEON_EXT_V1
, 0xf2800000, 0xfe800f50, "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
744 {FPU_NEON_EXT_V1
, 0xf2800100, 0xfe800f50, "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
745 {FPU_NEON_EXT_V1
, 0xf2800200, 0xfe800f50, "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
746 {FPU_NEON_EXT_V1
, 0xf2800300, 0xfe800f50, "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
747 {FPU_NEON_EXT_V1
, 0xf2800500, 0xfe800f50, "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
748 {FPU_NEON_EXT_V1
, 0xf2800700, 0xfe800f50, "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
749 {FPU_NEON_EXT_V1
, 0xf2800800, 0xfe800f50, "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
750 {FPU_NEON_EXT_V1
, 0xf2800a00, 0xfe800f50, "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
751 {FPU_NEON_EXT_V1
, 0xf2800c00, 0xfe800f50, "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
753 /* Two registers and a scalar. */
754 {FPU_NEON_EXT_V1
, 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
755 {FPU_NEON_EXT_V1
, 0xf2800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
756 {FPU_NEON_EXT_V1
, 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
757 {FPU_NEON_EXT_V1
, 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
758 {FPU_NEON_EXT_V1
, 0xf2800540, 0xff800f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
759 {FPU_NEON_EXT_V1
, 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
760 {FPU_NEON_EXT_V1
, 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
761 {FPU_NEON_EXT_V1
, 0xf2800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
762 {FPU_NEON_EXT_V1
, 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
763 {FPU_NEON_EXT_V1
, 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
764 {FPU_NEON_EXT_V1
, 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
765 {FPU_NEON_EXT_V1
, 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
766 {FPU_NEON_EXT_V1
, 0xf3800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
767 {FPU_NEON_EXT_V1
, 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
768 {FPU_NEON_EXT_V1
, 0xf3800540, 0xff800f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
769 {FPU_NEON_EXT_V1
, 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
770 {FPU_NEON_EXT_V1
, 0xf3800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
771 {FPU_NEON_EXT_V1
, 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
772 {FPU_NEON_EXT_V1
, 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
773 {FPU_NEON_EXT_V1
, 0xf2800240, 0xfe800f50, "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
774 {FPU_NEON_EXT_V1
, 0xf2800640, 0xfe800f50, "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
775 {FPU_NEON_EXT_V1
, 0xf2800a40, 0xfe800f50, "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
777 /* Element and structure load/store. */
778 {FPU_NEON_EXT_V1
, 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
779 {FPU_NEON_EXT_V1
, 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
780 {FPU_NEON_EXT_V1
, 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
781 {FPU_NEON_EXT_V1
, 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
782 {FPU_NEON_EXT_V1
, 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
783 {FPU_NEON_EXT_V1
, 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
784 {FPU_NEON_EXT_V1
, 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
785 {FPU_NEON_EXT_V1
, 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
786 {FPU_NEON_EXT_V1
, 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
787 {FPU_NEON_EXT_V1
, 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
788 {FPU_NEON_EXT_V1
, 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
789 {FPU_NEON_EXT_V1
, 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
790 {FPU_NEON_EXT_V1
, 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
791 {FPU_NEON_EXT_V1
, 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
792 {FPU_NEON_EXT_V1
, 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
793 {FPU_NEON_EXT_V1
, 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
794 {FPU_NEON_EXT_V1
, 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
795 {FPU_NEON_EXT_V1
, 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
796 {FPU_NEON_EXT_V1
, 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
801 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
802 ordered: they must be searched linearly from the top to obtain a correct
805 /* print_insn_arm recognizes the following format control codes:
809 %a print address for ldr/str instruction
810 %s print address for ldr/str halfword/signextend instruction
811 %S like %s but allow UNPREDICTABLE addressing
812 %b print branch destination
813 %c print condition code (always bits 28-31)
814 %m print register mask for ldm/stm instruction
815 %o print operand2 (immediate or register + shift)
816 %p print 'p' iff bits 12-15 are 15
817 %t print 't' iff bit 21 set and bit 24 clear
818 %B print arm BLX(1) destination
819 %C print the PSR sub type.
820 %U print barrier type.
821 %P print address for pli instruction.
823 %<bitfield>r print as an ARM register
824 %<bitfield>R as %r but r15 is UNPREDICTABLE
825 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE
826 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE
827 %<bitfield>d print the bitfield in decimal
828 %<bitfield>W print the bitfield plus one in decimal
829 %<bitfield>x print the bitfield in hex
830 %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
832 %<bitfield>'c print specified char iff bitfield is all ones
833 %<bitfield>`c print specified char iff bitfield is all zeroes
834 %<bitfield>?ab... select from array of values in big endian order
836 %e print arm SMI operand (bits 0..7,8..19).
837 %E print the LSB and WIDTH fields of a BFI or BFC instruction.
838 %V print the 16-bit immediate field of a MOVT or MOVW instruction.
839 %R print the SPSR/CPSR or banked register of an MRS. */
841 static const struct opcode32 arm_opcodes
[] =
843 /* ARM instructions. */
844 {ARM_EXT_V1
, 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"},
845 {ARM_EXT_V4T
| ARM_EXT_V5
, 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
846 {ARM_EXT_V2
, 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"},
847 {ARM_EXT_V2
, 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
848 {ARM_EXT_V2S
, 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"},
849 {ARM_EXT_V3M
, 0x00800090, 0x0fa000f0, "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
850 {ARM_EXT_V3M
, 0x00a00090, 0x0fa000f0, "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
852 /* Virtualization Extension instructions. */
853 {ARM_EXT_VIRT
, 0x0160006e, 0x0fffffff, "eret%c"},
854 {ARM_EXT_VIRT
, 0x01400070, 0x0ff000f0, "hvc%c\t%e"},
856 /* Integer Divide Extension instructions. */
857 {ARM_EXT_ADIV
, 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"},
858 {ARM_EXT_ADIV
, 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"},
860 /* MP Extension instructions. */
861 {ARM_EXT_MP
, 0xf410f000, 0xfc70f000, "pldw\t%a"},
863 /* V7 instructions. */
864 {ARM_EXT_V7
, 0xf450f000, 0xfd70f000, "pli\t%P"},
865 {ARM_EXT_V7
, 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
866 {ARM_EXT_V8
, 0xf57ff051, 0xfffffff3, "dmb\t%U"},
867 {ARM_EXT_V8
, 0xf57ff041, 0xfffffff3, "dsb\t%U"},
868 {ARM_EXT_V7
, 0xf57ff050, 0xfffffff0, "dmb\t%U"},
869 {ARM_EXT_V7
, 0xf57ff040, 0xfffffff0, "dsb\t%U"},
870 {ARM_EXT_V7
, 0xf57ff060, 0xfffffff0, "isb\t%U"},
872 /* ARM V6T2 instructions. */
873 {ARM_EXT_V6T2
, 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"},
874 {ARM_EXT_V6T2
, 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
875 {ARM_EXT_V6T2
, 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
876 {ARM_EXT_V6T2
, 0x006000b0, 0x0f7000f0, "strht%c\t%12-15R, %S"},
878 {ARM_EXT_V6T2
, 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION
},
879 {ARM_EXT_V6T2
, 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"},
881 {ARM_EXT_V6T2
, 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"},
882 {ARM_EXT_V6T2
, 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"},
883 {ARM_EXT_V6T2
, 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"},
884 {ARM_EXT_V6T2
, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
886 /* ARM Security extension instructions. */
887 {ARM_EXT_SEC
, 0x01600070, 0x0ff000f0, "smc%c\t%e"},
889 /* ARM V6K instructions. */
890 {ARM_EXT_V6K
, 0xf57ff01f, 0xffffffff, "clrex"},
891 {ARM_EXT_V6K
, 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"},
892 {ARM_EXT_V6K
, 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"},
893 {ARM_EXT_V6K
, 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"},
894 {ARM_EXT_V6K
, 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"},
895 {ARM_EXT_V6K
, 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"},
896 {ARM_EXT_V6K
, 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"},
898 /* ARM V6K NOP hints. */
899 {ARM_EXT_V6K
, 0x0320f001, 0x0fffffff, "yield%c"},
900 {ARM_EXT_V6K
, 0x0320f002, 0x0fffffff, "wfe%c"},
901 {ARM_EXT_V6K
, 0x0320f003, 0x0fffffff, "wfi%c"},
902 {ARM_EXT_V6K
, 0x0320f004, 0x0fffffff, "sev%c"},
903 {ARM_EXT_V6K
, 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
905 /* ARM V6 instructions. */
906 {ARM_EXT_V6
, 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
907 {ARM_EXT_V6
, 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
908 {ARM_EXT_V6
, 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
909 {ARM_EXT_V6
, 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
910 {ARM_EXT_V6
, 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
911 {ARM_EXT_V6
, 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"},
912 {ARM_EXT_V6
, 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"},
913 {ARM_EXT_V6
, 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"},
914 {ARM_EXT_V6
, 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"},
915 {ARM_EXT_V6
, 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"},
916 {ARM_EXT_V6
, 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"},
917 {ARM_EXT_V6
, 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"},
918 {ARM_EXT_V6
, 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"},
919 {ARM_EXT_V6
, 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"},
920 {ARM_EXT_V6
, 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"},
921 {ARM_EXT_V6
, 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"},
922 {ARM_EXT_V6
, 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"},
923 {ARM_EXT_V6
, 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"},
924 {ARM_EXT_V6
, 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"},
925 {ARM_EXT_V6
, 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"},
926 {ARM_EXT_V6
, 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"},
927 {ARM_EXT_V6
, 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"},
928 {ARM_EXT_V6
, 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"},
929 {ARM_EXT_V6
, 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"},
930 {ARM_EXT_V6
, 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"},
931 {ARM_EXT_V6
, 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"},
932 {ARM_EXT_V6
, 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"},
933 {ARM_EXT_V6
, 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"},
934 {ARM_EXT_V6
, 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"},
935 {ARM_EXT_V6
, 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"},
936 {ARM_EXT_V6
, 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"},
937 {ARM_EXT_V6
, 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"},
938 {ARM_EXT_V6
, 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"},
939 {ARM_EXT_V6
, 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"},
940 {ARM_EXT_V6
, 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"},
941 {ARM_EXT_V6
, 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"},
942 {ARM_EXT_V6
, 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"},
943 {ARM_EXT_V6
, 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"},
944 {ARM_EXT_V6
, 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"},
945 {ARM_EXT_V6
, 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"},
946 {ARM_EXT_V6
, 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"},
947 {ARM_EXT_V6
, 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"},
948 {ARM_EXT_V6
, 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"},
949 {ARM_EXT_V6
, 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"},
950 {ARM_EXT_V6
, 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"},
951 {ARM_EXT_V6
, 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"},
952 {ARM_EXT_V6
, 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"},
953 {ARM_EXT_V6
, 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"},
954 {ARM_EXT_V6
, 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"},
955 {ARM_EXT_V6
, 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"},
956 {ARM_EXT_V6
, 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"},
957 {ARM_EXT_V6
, 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"},
958 {ARM_EXT_V6
, 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"},
959 {ARM_EXT_V6
, 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"},
960 {ARM_EXT_V6
, 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"},
961 {ARM_EXT_V6
, 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"},
962 {ARM_EXT_V6
, 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"},
963 {ARM_EXT_V6
, 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"},
964 {ARM_EXT_V6
, 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"},
965 {ARM_EXT_V6
, 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"},
966 {ARM_EXT_V6
, 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"},
967 {ARM_EXT_V6
, 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"},
968 {ARM_EXT_V6
, 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"},
969 {ARM_EXT_V6
, 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"},
970 {ARM_EXT_V6
, 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"},
971 {ARM_EXT_V6
, 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"},
972 {ARM_EXT_V6
, 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"},
973 {ARM_EXT_V6
, 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"},
974 {ARM_EXT_V6
, 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"},
975 {ARM_EXT_V6
, 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"},
976 {ARM_EXT_V6
, 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"},
977 {ARM_EXT_V6
, 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"},
978 {ARM_EXT_V6
, 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"},
979 {ARM_EXT_V6
, 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"},
980 {ARM_EXT_V6
, 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"},
981 {ARM_EXT_V6
, 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
982 {ARM_EXT_V6
, 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
983 {ARM_EXT_V6
, 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
984 {ARM_EXT_V6
, 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"},
985 {ARM_EXT_V6
, 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
986 {ARM_EXT_V6
, 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
987 {ARM_EXT_V6
, 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"},
988 {ARM_EXT_V6
, 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"},
989 {ARM_EXT_V6
, 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
990 {ARM_EXT_V6
, 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
991 {ARM_EXT_V6
, 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
992 {ARM_EXT_V6
, 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"},
993 {ARM_EXT_V6
, 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"},
994 {ARM_EXT_V6
, 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"},
995 {ARM_EXT_V6
, 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"},
996 {ARM_EXT_V6
, 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"},
997 {ARM_EXT_V6
, 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"},
998 {ARM_EXT_V6
, 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"},
999 {ARM_EXT_V6
, 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"},
1000 {ARM_EXT_V6
, 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"},
1001 {ARM_EXT_V6
, 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"},
1002 {ARM_EXT_V6
, 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"},
1003 {ARM_EXT_V6
, 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"},
1004 {ARM_EXT_V6
, 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"},
1005 {ARM_EXT_V6
, 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
1006 {ARM_EXT_V6
, 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"},
1007 {ARM_EXT_V6
, 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"},
1008 {ARM_EXT_V6
, 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1009 {ARM_EXT_V6
, 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1010 {ARM_EXT_V6
, 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1011 {ARM_EXT_V6
, 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1012 {ARM_EXT_V6
, 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"},
1013 {ARM_EXT_V6
, 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1014 {ARM_EXT_V6
, 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1015 {ARM_EXT_V6
, 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
1016 {ARM_EXT_V6
, 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"},
1017 {ARM_EXT_V6
, 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"},
1018 {ARM_EXT_V6
, 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"},
1019 {ARM_EXT_V6
, 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
1020 {ARM_EXT_V6
, 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"},
1021 {ARM_EXT_V6
, 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"},
1022 {ARM_EXT_V6
, 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"},
1023 {ARM_EXT_V6
, 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1024 {ARM_EXT_V6
, 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"},
1025 {ARM_EXT_V6
, 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"},
1026 {ARM_EXT_V6
, 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"},
1027 {ARM_EXT_V6
, 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"},
1029 /* V5J instruction. */
1030 {ARM_EXT_V5J
, 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"},
1032 /* V5 Instructions. */
1033 {ARM_EXT_V5
, 0xe1200070, 0xfff000f0, "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
1034 {ARM_EXT_V5
, 0xfa000000, 0xfe000000, "blx\t%B"},
1035 {ARM_EXT_V5
, 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"},
1036 {ARM_EXT_V5
, 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"},
1038 /* V5E "El Segundo" Instructions. */
1039 {ARM_EXT_V5E
, 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
1040 {ARM_EXT_V5E
, 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
1041 {ARM_EXT_V5E
, 0xf450f000, 0xfc70f000, "pld\t%a"},
1042 {ARM_EXT_V5ExP
, 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1043 {ARM_EXT_V5ExP
, 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1044 {ARM_EXT_V5ExP
, 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1045 {ARM_EXT_V5ExP
, 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"},
1047 {ARM_EXT_V5ExP
, 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
1048 {ARM_EXT_V5ExP
, 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"},
1050 {ARM_EXT_V5ExP
, 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1051 {ARM_EXT_V5ExP
, 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1052 {ARM_EXT_V5ExP
, 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1053 {ARM_EXT_V5ExP
, 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
1055 {ARM_EXT_V5ExP
, 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"},
1056 {ARM_EXT_V5ExP
, 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"},
1057 {ARM_EXT_V5ExP
, 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"},
1058 {ARM_EXT_V5ExP
, 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"},
1060 {ARM_EXT_V5ExP
, 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"},
1061 {ARM_EXT_V5ExP
, 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"},
1063 {ARM_EXT_V5ExP
, 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"},
1064 {ARM_EXT_V5ExP
, 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"},
1065 {ARM_EXT_V5ExP
, 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"},
1066 {ARM_EXT_V5ExP
, 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"},
1068 /* ARM Instructions. */
1069 {ARM_EXT_V1
, 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
1071 {ARM_EXT_V1
, 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"},
1072 {ARM_EXT_V1
, 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"},
1073 {ARM_EXT_V1
, 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"},
1074 {ARM_EXT_V1
, 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"},
1075 {ARM_EXT_V1
, 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"},
1076 {ARM_EXT_V1
, 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"},
1078 {ARM_EXT_V1
, 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"},
1079 {ARM_EXT_V1
, 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"},
1080 {ARM_EXT_V1
, 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"},
1081 {ARM_EXT_V1
, 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"},
1083 {ARM_EXT_V1
, 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION
},
1084 {ARM_EXT_V1
, 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"},
1085 {ARM_EXT_V1
, 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION
},
1086 {ARM_EXT_V1
, 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"},
1088 {ARM_EXT_V1
, 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"},
1089 {ARM_EXT_V1
, 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"},
1090 {ARM_EXT_V1
, 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"},
1092 {ARM_EXT_V1
, 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
1093 {ARM_EXT_V1
, 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"},
1094 {ARM_EXT_V1
, 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"},
1096 {ARM_EXT_V1
, 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
1097 {ARM_EXT_V1
, 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"},
1098 {ARM_EXT_V1
, 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"},
1100 {ARM_EXT_V1
, 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
1101 {ARM_EXT_V1
, 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"},
1102 {ARM_EXT_V1
, 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"},
1104 {ARM_EXT_V1
, 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"},
1105 {ARM_EXT_V1
, 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"},
1106 {ARM_EXT_V1
, 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"},
1108 {ARM_EXT_V1
, 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
1109 {ARM_EXT_V1
, 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"},
1110 {ARM_EXT_V1
, 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"},
1112 {ARM_EXT_V1
, 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
1113 {ARM_EXT_V1
, 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"},
1114 {ARM_EXT_V1
, 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"},
1116 {ARM_EXT_V1
, 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
1117 {ARM_EXT_V1
, 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"},
1118 {ARM_EXT_V1
, 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"},
1120 {ARM_EXT_VIRT
, 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"},
1121 {ARM_EXT_V3
, 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"},
1122 {ARM_EXT_V3
, 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"},
1124 {ARM_EXT_V1
, 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"},
1125 {ARM_EXT_V1
, 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"},
1126 {ARM_EXT_V1
, 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"},
1128 {ARM_EXT_V1
, 0x03200000, 0x0fe00000, "teq%p%c\t%16-19r, %o"},
1129 {ARM_EXT_V1
, 0x01200000, 0x0fe00010, "teq%p%c\t%16-19r, %o"},
1130 {ARM_EXT_V1
, 0x01200010, 0x0fe00090, "teq%p%c\t%16-19R, %o"},
1132 {ARM_EXT_V1
, 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"},
1133 {ARM_EXT_V1
, 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"},
1134 {ARM_EXT_V1
, 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"},
1136 {ARM_EXT_V1
, 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"},
1137 {ARM_EXT_V1
, 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"},
1138 {ARM_EXT_V1
, 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"},
1140 {ARM_EXT_V1
, 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
1141 {ARM_EXT_V1
, 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"},
1142 {ARM_EXT_V1
, 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"},
1144 {ARM_EXT_V1
, 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
1145 {ARM_EXT_V1
, 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
1146 {ARM_EXT_V1
, 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"},
1147 {ARM_EXT_V1
, 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"},
1148 {ARM_EXT_V1
, 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"},
1149 {ARM_EXT_V1
, 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
1150 {ARM_EXT_V1
, 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"},
1152 {ARM_EXT_V1
, 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
1153 {ARM_EXT_V1
, 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"},
1154 {ARM_EXT_V1
, 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"},
1156 {ARM_EXT_V1
, 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"},
1157 {ARM_EXT_V1
, 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"},
1158 {ARM_EXT_V1
, 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"},
1160 {ARM_EXT_V1
, 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION
},
1161 {ARM_EXT_V1
, 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
1163 {ARM_EXT_V1
, 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"},
1165 {ARM_EXT_V1
, 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"},
1166 {ARM_EXT_V1
, 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"},
1168 {ARM_EXT_V1
, 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1169 {ARM_EXT_V1
, 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1170 {ARM_EXT_V1
, 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1171 {ARM_EXT_V1
, 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1172 {ARM_EXT_V1
, 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1173 {ARM_EXT_V1
, 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1174 {ARM_EXT_V1
, 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1175 {ARM_EXT_V1
, 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1176 {ARM_EXT_V1
, 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1177 {ARM_EXT_V1
, 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1178 {ARM_EXT_V1
, 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1179 {ARM_EXT_V1
, 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1180 {ARM_EXT_V1
, 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1181 {ARM_EXT_V1
, 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1182 {ARM_EXT_V1
, 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1183 {ARM_EXT_V1
, 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"},
1184 {ARM_EXT_V1
, 0x092d0000, 0x0fff0000, "push%c\t%m"},
1185 {ARM_EXT_V1
, 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"},
1186 {ARM_EXT_V1
, 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
1188 {ARM_EXT_V1
, 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1189 {ARM_EXT_V1
, 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1190 {ARM_EXT_V1
, 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1191 {ARM_EXT_V1
, 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1192 {ARM_EXT_V1
, 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1193 {ARM_EXT_V1
, 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1194 {ARM_EXT_V1
, 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1195 {ARM_EXT_V1
, 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1196 {ARM_EXT_V1
, 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1197 {ARM_EXT_V1
, 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1198 {ARM_EXT_V1
, 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1199 {ARM_EXT_V1
, 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1200 {ARM_EXT_V1
, 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1201 {ARM_EXT_V1
, 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1202 {ARM_EXT_V1
, 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1203 {ARM_EXT_V1
, 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"},
1204 {ARM_EXT_V1
, 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
1205 {ARM_EXT_V1
, 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"},
1206 {ARM_EXT_V1
, 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"},
1208 {ARM_EXT_V1
, 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
1209 {ARM_EXT_V1
, 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
1212 {ARM_EXT_V1
, 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
1213 {0, 0x00000000, 0x00000000, 0}
1216 /* print_insn_thumb16 recognizes the following format control codes:
1218 %S print Thumb register (bits 3..5 as high number if bit 6 set)
1219 %D print Thumb register (bits 0..2 as high number if bit 7 set)
1220 %<bitfield>I print bitfield as a signed decimal
1221 (top bit of range being the sign bit)
1222 %N print Thumb register mask (with LR)
1223 %O print Thumb register mask (with PC)
1224 %M print Thumb register mask
1225 %b print CZB's 6-bit unsigned branch destination
1226 %s print Thumb right-shift immediate (6..10; 0 == 32).
1227 %c print the condition code
1228 %C print the condition code, or "s" if not conditional
1229 %x print warning if conditional an not at end of IT block"
1230 %X print "\t; unpredictable <IT:code>" if conditional
1231 %I print IT instruction suffix and operands
1232 %W print Thumb Writeback indicator for LDMIA
1233 %<bitfield>r print bitfield as an ARM register
1234 %<bitfield>d print bitfield as a decimal
1235 %<bitfield>H print (bitfield * 2) as a decimal
1236 %<bitfield>W print (bitfield * 4) as a decimal
1237 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
1238 %<bitfield>B print Thumb branch destination (signed displacement)
1239 %<bitfield>c print bitfield as a condition code
1240 %<bitnum>'c print specified char iff bit is one
1241 %<bitnum>?ab print a if bit is one else print b. */
1243 static const struct opcode16 thumb_opcodes
[] =
1245 /* Thumb instructions. */
1247 /* ARM V6K no-argument instructions. */
1248 {ARM_EXT_V6K
, 0xbf00, 0xffff, "nop%c"},
1249 {ARM_EXT_V6K
, 0xbf10, 0xffff, "yield%c"},
1250 {ARM_EXT_V6K
, 0xbf20, 0xffff, "wfe%c"},
1251 {ARM_EXT_V6K
, 0xbf30, 0xffff, "wfi%c"},
1252 {ARM_EXT_V6K
, 0xbf40, 0xffff, "sev%c"},
1253 {ARM_EXT_V6K
, 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
1255 /* ARM V6T2 instructions. */
1256 {ARM_EXT_V6T2
, 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
1257 {ARM_EXT_V6T2
, 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
1258 {ARM_EXT_V6T2
, 0xbf00, 0xff00, "it%I%X"},
1261 {ARM_EXT_V6
, 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
1262 {ARM_EXT_V6
, 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
1263 {ARM_EXT_V6
, 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
1264 {ARM_EXT_V6
, 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
1265 {ARM_EXT_V6
, 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
1266 {ARM_EXT_V6
, 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
1267 {ARM_EXT_V6
, 0xb650, 0xfff7, "setend\t%3?ble%X"},
1268 {ARM_EXT_V6
, 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
1269 {ARM_EXT_V6
, 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
1270 {ARM_EXT_V6
, 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
1271 {ARM_EXT_V6
, 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
1273 /* ARM V5 ISA extends Thumb. */
1274 {ARM_EXT_V5T
, 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
1275 /* This is BLX(2). BLX(1) is a 32-bit instruction. */
1276 {ARM_EXT_V5T
, 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
1277 /* ARM V4T ISA (Thumb v1). */
1278 {ARM_EXT_V4T
, 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"},
1280 {ARM_EXT_V4T
, 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
1281 {ARM_EXT_V4T
, 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
1282 {ARM_EXT_V4T
, 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
1283 {ARM_EXT_V4T
, 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
1284 {ARM_EXT_V4T
, 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
1285 {ARM_EXT_V4T
, 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
1286 {ARM_EXT_V4T
, 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
1287 {ARM_EXT_V4T
, 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
1288 {ARM_EXT_V4T
, 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
1289 {ARM_EXT_V4T
, 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
1290 {ARM_EXT_V4T
, 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
1291 {ARM_EXT_V4T
, 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
1292 {ARM_EXT_V4T
, 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
1293 {ARM_EXT_V4T
, 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
1294 {ARM_EXT_V4T
, 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
1295 {ARM_EXT_V4T
, 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
1297 {ARM_EXT_V4T
, 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
1298 {ARM_EXT_V4T
, 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
1300 {ARM_EXT_V4T
, 0x4700, 0xFF80, "bx%c\t%S%x"},
1301 {ARM_EXT_V4T
, 0x4400, 0xFF00, "add%c\t%D, %S"},
1302 {ARM_EXT_V4T
, 0x4500, 0xFF00, "cmp%c\t%D, %S"},
1303 {ARM_EXT_V4T
, 0x4600, 0xFF00, "mov%c\t%D, %S"},
1305 {ARM_EXT_V4T
, 0xB400, 0xFE00, "push%c\t%N"},
1306 {ARM_EXT_V4T
, 0xBC00, 0xFE00, "pop%c\t%O"},
1308 {ARM_EXT_V4T
, 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
1309 {ARM_EXT_V4T
, 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
1310 {ARM_EXT_V4T
, 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
1311 {ARM_EXT_V4T
, 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
1313 {ARM_EXT_V4T
, 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
1314 {ARM_EXT_V4T
, 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
1315 {ARM_EXT_V4T
, 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
1317 {ARM_EXT_V4T
, 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
1318 {ARM_EXT_V4T
, 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
1320 {ARM_EXT_V4T
, 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"},
1321 {ARM_EXT_V4T
, 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
1322 {ARM_EXT_V4T
, 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
1323 {ARM_EXT_V4T
, 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
1325 {ARM_EXT_V4T
, 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
1326 {ARM_EXT_V4T
, 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
1327 {ARM_EXT_V4T
, 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
1328 {ARM_EXT_V4T
, 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
1330 {ARM_EXT_V4T
, 0x4800, 0xF800, "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"}, /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
1332 {ARM_EXT_V4T
, 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
1333 {ARM_EXT_V4T
, 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
1334 {ARM_EXT_V4T
, 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
1335 {ARM_EXT_V4T
, 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
1337 {ARM_EXT_V4T
, 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
1338 {ARM_EXT_V4T
, 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
1340 {ARM_EXT_V4T
, 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
1341 {ARM_EXT_V4T
, 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
1343 {ARM_EXT_V4T
, 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"},
1344 {ARM_EXT_V4T
, 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
1346 {ARM_EXT_V4T
, 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
1347 {ARM_EXT_V4T
, 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"},
1349 {ARM_EXT_V4T
, 0xDF00, 0xFF00, "svc%c\t%0-7d"},
1351 {ARM_EXT_V4T
, 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION
},
1352 {ARM_EXT_V4T
, 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
1354 {ARM_EXT_V4T
, 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
1356 /* The E800 .. FFFF range is unconditionally redirected to the
1357 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
1358 are processed via that table. Thus, we can never encounter a
1359 bare "second half of BL/BLX(1)" instruction here. */
1360 {ARM_EXT_V1
, 0x0000, 0x0000, UNDEFINED_INSTRUCTION
},
1364 /* Thumb32 opcodes use the same table structure as the ARM opcodes.
1365 We adopt the convention that hw1 is the high 16 bits of .value and
1366 .mask, hw2 the low 16 bits.
1368 print_insn_thumb32 recognizes the following format control codes:
1372 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
1373 %M print a modified 12-bit immediate (same location)
1374 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
1375 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
1376 %H print a 16-bit immediate from hw2[3:0],hw1[11:0]
1377 %S print a possibly-shifted Rm
1379 %L print address for a ldrd/strd instruction
1380 %a print the address of a plain load/store
1381 %w print the width and signedness of a core load/store
1382 %m print register mask for ldm/stm
1384 %E print the lsb and width fields of a bfc/bfi instruction
1385 %F print the lsb and width fields of a sbfx/ubfx instruction
1386 %b print a conditional branch offset
1387 %B print an unconditional branch offset
1388 %s print the shift field of an SSAT instruction
1389 %R print the rotation field of an SXT instruction
1390 %U print barrier type.
1391 %P print address for pli instruction.
1392 %c print the condition code
1393 %x print warning if conditional an not at end of IT block"
1394 %X print "\t; unpredictable <IT:code>" if conditional
1396 %<bitfield>d print bitfield in decimal
1397 %<bitfield>W print bitfield*4 in decimal
1398 %<bitfield>r print bitfield as an ARM register
1399 %<bitfield>R as %<>r bit r15 is UNPREDICTABLE
1400 %<bitfield>c print bitfield as a condition code
1402 %<bitfield>'c print specified char iff bitfield is all ones
1403 %<bitfield>`c print specified char iff bitfield is all zeroes
1404 %<bitfield>?ab... select from array of values in big endian order
1406 With one exception at the bottom (done because BL and BLX(1) need
1407 to come dead last), this table was machine-sorted first in
1408 decreasing order of number of bits set in the mask, then in
1409 increasing numeric order of mask, then in increasing numeric order
1410 of opcode. This order is not the clearest for a human reader, but
1411 is guaranteed never to catch a special-case bit pattern with a more
1412 general mask, which is important, because this instruction encoding
1413 makes heavy use of special-case bit patterns. */
1414 static const struct opcode32 thumb32_opcodes
[] =
1416 /* V7 instructions. */
1417 {ARM_EXT_V7
, 0xf910f000, 0xff70f000, "pli%c\t%a"},
1418 {ARM_EXT_V7
, 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
1419 {ARM_EXT_V8
, 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"},
1420 {ARM_EXT_V8
, 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"},
1421 {ARM_EXT_V7
, 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
1422 {ARM_EXT_V7
, 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
1423 {ARM_EXT_V7
, 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
1424 {ARM_EXT_DIV
, 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
1425 {ARM_EXT_DIV
, 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
1427 /* Virtualization Extension instructions. */
1428 {ARM_EXT_VIRT
, 0xf7e08000, 0xfff0f000, "hvc%c\t%V"},
1429 /* We skip ERET as that is SUBS pc, lr, #0. */
1431 /* MP Extension instructions. */
1432 {ARM_EXT_MP
, 0xf830f000, 0xff70f000, "pldw%c\t%a"},
1434 /* Security extension instructions. */
1435 {ARM_EXT_SEC
, 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
1437 /* Instructions defined in the basic V6T2 set. */
1438 {ARM_EXT_V6T2
, 0xf3af8000, 0xffffffff, "nop%c.w"},
1439 {ARM_EXT_V6T2
, 0xf3af8001, 0xffffffff, "yield%c.w"},
1440 {ARM_EXT_V6T2
, 0xf3af8002, 0xffffffff, "wfe%c.w"},
1441 {ARM_EXT_V6T2
, 0xf3af8003, 0xffffffff, "wfi%c.w"},
1442 {ARM_EXT_V6T2
, 0xf3af8004, 0xffffffff, "sev%c.w"},
1443 {ARM_EXT_V6T2
, 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
1445 {ARM_EXT_V6T2
, 0xf3bf8f2f, 0xffffffff, "clrex%c"},
1446 {ARM_EXT_V6T2
, 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
1447 {ARM_EXT_V6T2
, 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
1448 {ARM_EXT_V6T2
, 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
1449 {ARM_EXT_V6T2
, 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
1450 {ARM_EXT_V6T2
, 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
1451 {ARM_EXT_V6T2
, 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"},
1452 {ARM_EXT_V6T2
, 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
1453 {ARM_EXT_V6T2
, 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
1454 {ARM_EXT_V6T2
, 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
1455 {ARM_EXT_V6T2
, 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
1456 {ARM_EXT_V6T2
, 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
1457 {ARM_EXT_V6T2
, 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
1458 {ARM_EXT_V6T2
, 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
1459 {ARM_EXT_V6T2
, 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
1460 {ARM_EXT_V6T2
, 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
1461 {ARM_EXT_V6T2
, 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
1462 {ARM_EXT_V6T2
, 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
1463 {ARM_EXT_V6T2
, 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
1464 {ARM_EXT_V6T2
, 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
1465 {ARM_EXT_V6T2
, 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
1466 {ARM_EXT_V6T2
, 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
1467 {ARM_EXT_V6T2
, 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
1468 {ARM_EXT_V6T2
, 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
1469 {ARM_EXT_V6T2
, 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
1470 {ARM_EXT_V6T2
, 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
1471 {ARM_EXT_V6T2
, 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
1472 {ARM_EXT_V6T2
, 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
1473 {ARM_EXT_V6T2
, 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
1474 {ARM_EXT_V6T2
, 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
1475 {ARM_EXT_V6T2
, 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
1476 {ARM_EXT_V6T2
, 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
1477 {ARM_EXT_V6T2
, 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
1478 {ARM_EXT_V6T2
, 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
1479 {ARM_EXT_V6T2
, 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
1480 {ARM_EXT_V6T2
, 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
1481 {ARM_EXT_V6T2
, 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
1482 {ARM_EXT_V6T2
, 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
1483 {ARM_EXT_V6T2
, 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
1484 {ARM_EXT_V6T2
, 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
1485 {ARM_EXT_V6T2
, 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
1486 {ARM_EXT_V6T2
, 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
1487 {ARM_EXT_V6T2
, 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
1488 {ARM_EXT_V6T2
, 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
1489 {ARM_EXT_V6T2
, 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
1490 {ARM_EXT_V6T2
, 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
1491 {ARM_EXT_V6T2
, 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"},
1492 {ARM_EXT_V6T2
, 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"},
1493 {ARM_EXT_V6T2
, 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"},
1494 {ARM_EXT_V6T2
, 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"},
1495 {ARM_EXT_V6T2
, 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"},
1496 {ARM_EXT_V6T2
, 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"},
1497 {ARM_EXT_V6T2
, 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
1498 {ARM_EXT_V6T2
, 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
1499 {ARM_EXT_V6T2
, 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
1500 {ARM_EXT_V6T2
, 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
1501 {ARM_EXT_V6T2
, 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
1502 {ARM_EXT_V6T2
, 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
1503 {ARM_EXT_V6T2
, 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
1504 {ARM_EXT_V6T2
, 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
1505 {ARM_EXT_V6T2
, 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
1506 {ARM_EXT_V6T2
, 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
1507 {ARM_EXT_V6T2
, 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
1508 {ARM_EXT_V6T2
, 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
1509 {ARM_EXT_V6T2
, 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
1510 {ARM_EXT_V6T2
, 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
1511 {ARM_EXT_V6T2
, 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"},
1512 {ARM_EXT_V6T2
, 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"},
1513 {ARM_EXT_V6T2
, 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"},
1514 {ARM_EXT_V6T2
, 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"},
1515 {ARM_EXT_V6T2
, 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"},
1516 {ARM_EXT_V6T2
, 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"},
1517 {ARM_EXT_V6T2
, 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
1518 {ARM_EXT_V6T2
, 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
1519 {ARM_EXT_V6T2
, 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"},
1520 {ARM_EXT_V6T2
, 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
1521 {ARM_EXT_V6T2
, 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"},
1522 {ARM_EXT_V6T2
, 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
1523 {ARM_EXT_V6T2
, 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
1524 {ARM_EXT_V6T2
, 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4d, %16-19r"},
1525 {ARM_EXT_V6T2
, 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
1526 {ARM_EXT_V6T2
, 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
1527 {ARM_EXT_V6T2
, 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
1528 {ARM_EXT_V6T2
, 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
1529 {ARM_EXT_V6T2
, 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
1530 {ARM_EXT_V6T2
, 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
1531 {ARM_EXT_V6T2
, 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
1532 {ARM_EXT_V6T2
, 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
1533 {ARM_EXT_V6T2
, 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
1534 {ARM_EXT_V6T2
, 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
1535 {ARM_EXT_V6T2
, 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
1536 {ARM_EXT_V6T2
, 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
1537 {ARM_EXT_V6T2
, 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
1538 {ARM_EXT_V6T2
, 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
1539 {ARM_EXT_V6T2
, 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
1540 {ARM_EXT_V6T2
, 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
1541 {ARM_EXT_V6T2
, 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
1542 {ARM_EXT_V6T2
, 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
1543 {ARM_EXT_V6T2
, 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
1544 {ARM_EXT_V6T2
, 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
1545 {ARM_EXT_V6T2
, 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
1546 {ARM_EXT_V6T2
, 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
1547 {ARM_EXT_V6T2
, 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
1548 {ARM_EXT_V6T2
, 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
1549 {ARM_EXT_V6T2
, 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1550 {ARM_EXT_V6T2
, 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1551 {ARM_EXT_V6T2
, 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1552 {ARM_EXT_V6T2
, 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1553 {ARM_EXT_V6T2
, 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1554 {ARM_EXT_V6T2
, 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1555 {ARM_EXT_V6T2
, 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1556 {ARM_EXT_V6T2
, 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1557 {ARM_EXT_V6T2
, 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
1558 {ARM_EXT_V6T2
, 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
1559 {ARM_EXT_V6T2
, 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
1560 {ARM_EXT_V6T2
, 0xf810f000, 0xff70f000, "pld%c\t%a"},
1561 {ARM_EXT_V6T2
, 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1562 {ARM_EXT_V6T2
, 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1563 {ARM_EXT_V6T2
, 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1564 {ARM_EXT_V6T2
, 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1565 {ARM_EXT_V6T2
, 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"},
1566 {ARM_EXT_V6T2
, 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1567 {ARM_EXT_V6T2
, 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"},
1568 {ARM_EXT_V6T2
, 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
1569 {ARM_EXT_V6T2
, 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
1570 {ARM_EXT_V6T2
, 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
1571 {ARM_EXT_V6T2
, 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
1572 {ARM_EXT_V6T2
, 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
1573 {ARM_EXT_V6T2
, 0xfb100000, 0xfff000c0, "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1574 {ARM_EXT_V6T2
, 0xfbc00080, 0xfff000c0, "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1575 {ARM_EXT_V6T2
, 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
1576 {ARM_EXT_V6T2
, 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
1577 {ARM_EXT_V6T2
, 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4d, %16-19r%s"},
1578 {ARM_EXT_V6T2
, 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
1579 {ARM_EXT_V6T2
, 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
1580 {ARM_EXT_V6T2
, 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
1581 {ARM_EXT_V6T2
, 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
1582 {ARM_EXT_V6T2
, 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
1583 {ARM_EXT_V6T2
, 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
1584 {ARM_EXT_V6T2
, 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
1585 {ARM_EXT_V6T2
, 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
1586 {ARM_EXT_V6T2
, 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
1587 {ARM_EXT_V6T2
, 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
1588 {ARM_EXT_V6T2
, 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
1589 {ARM_EXT_V6T2
, 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
1590 {ARM_EXT_V6T2
, 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
1591 {ARM_EXT_V6T2
, 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
1592 {ARM_EXT_V6T2
, 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
1593 {ARM_EXT_V6T2
, 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
1594 {ARM_EXT_V6T2
, 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
1595 {ARM_EXT_V6T2
, 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
1596 {ARM_EXT_V6T2
, 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
1597 {ARM_EXT_V6T2
, 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
1598 {ARM_EXT_V6T2
, 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
1599 {ARM_EXT_V6T2
, 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
1600 {ARM_EXT_V6T2
, 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
1601 {ARM_EXT_V6T2
, 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
1602 {ARM_EXT_V6T2
, 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
1603 {ARM_EXT_V6T2
, 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
1604 {ARM_EXT_V6T2
, 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
1605 {ARM_EXT_V6T2
, 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
1606 {ARM_EXT_V6T2
, 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
1607 {ARM_EXT_V6T2
, 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
1608 {ARM_EXT_V6T2
, 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
1609 {ARM_EXT_V6T2
, 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
1610 {ARM_EXT_V6T2
, 0xe9400000, 0xff500000, "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
1611 {ARM_EXT_V6T2
, 0xe9500000, 0xff500000, "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"},
1612 {ARM_EXT_V6T2
, 0xe8600000, 0xff700000, "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
1613 {ARM_EXT_V6T2
, 0xe8700000, 0xff700000, "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"},
1614 {ARM_EXT_V6T2
, 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
1615 {ARM_EXT_V6T2
, 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
1617 /* Filter out Bcc with cond=E or F, which are used for other instructions. */
1618 {ARM_EXT_V6T2
, 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
1619 {ARM_EXT_V6T2
, 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
1620 {ARM_EXT_V6T2
, 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
1621 {ARM_EXT_V6T2
, 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
1623 /* These have been 32-bit since the invention of Thumb. */
1624 {ARM_EXT_V4T
, 0xf000c000, 0xf800d001, "blx%c\t%B%x"},
1625 {ARM_EXT_V4T
, 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
1628 {ARM_EXT_V1
, 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION
},
1632 static const char *const arm_conditional
[] =
1633 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
1634 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
1636 static const char *const arm_fp_const
[] =
1637 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
1639 static const char *const arm_shift
[] =
1640 {"lsl", "lsr", "asr", "ror"};
1645 const char *description
;
1646 const char *reg_names
[16];
1650 static const arm_regname regnames
[] =
1652 { "raw" , "Select raw register names",
1653 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
1654 { "gcc", "Select register names used by GCC",
1655 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
1656 { "std", "Select register names used in ARM's ISA documentation",
1657 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
1658 { "apcs", "Select register names used in the APCS",
1659 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
1660 { "atpcs", "Select register names used in the ATPCS",
1661 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
1662 { "special-atpcs", "Select special register names used in the ATPCS",
1663 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
1666 static const char *const iwmmxt_wwnames
[] =
1667 {"b", "h", "w", "d"};
1669 static const char *const iwmmxt_wwssnames
[] =
1670 {"b", "bus", "bc", "bss",
1671 "h", "hus", "hc", "hss",
1672 "w", "wus", "wc", "wss",
1673 "d", "dus", "dc", "dss"
1676 static const char *const iwmmxt_regnames
[] =
1677 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
1678 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
1681 static const char *const iwmmxt_cregnames
[] =
1682 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
1683 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
1686 /* Default to GCC register name set. */
1687 static unsigned int regname_selected
= 1;
1689 #define NUM_ARM_REGNAMES NUM_ELEM (regnames)
1690 #define arm_regnames regnames[regname_selected].reg_names
1692 static bfd_boolean force_thumb
= FALSE
;
1694 /* Current IT instruction state. This contains the same state as the IT
1695 bits in the CPSR. */
1696 static unsigned int ifthen_state
;
1697 /* IT state for the next instruction. */
1698 static unsigned int ifthen_next_state
;
1699 /* The address of the insn for which the IT state is valid. */
1700 static bfd_vma ifthen_address
;
1701 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
1702 /* Indicates that the current Conditional state is unconditional or outside
1704 #define COND_UNCOND 16
1709 get_arm_regname_num_options (void)
1711 return NUM_ARM_REGNAMES
;
1715 set_arm_regname_option (int option
)
1717 int old
= regname_selected
;
1718 regname_selected
= option
;
1723 get_arm_regnames (int option
,
1724 const char **setname
,
1725 const char **setdescription
,
1726 const char *const **register_names
)
1728 *setname
= regnames
[option
].name
;
1729 *setdescription
= regnames
[option
].description
;
1730 *register_names
= regnames
[option
].reg_names
;
1734 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
1735 Returns pointer to following character of the format string and
1736 fills in *VALUEP and *WIDTHP with the extracted value and number of
1737 bits extracted. WIDTHP can be NULL. */
1740 arm_decode_bitfield (const char *ptr
,
1742 unsigned long *valuep
,
1745 unsigned long value
= 0;
1753 for (start
= 0; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
1754 start
= start
* 10 + *ptr
- '0';
1756 for (end
= 0, ptr
++; *ptr
>= '0' && *ptr
<= '9'; ptr
++)
1757 end
= end
* 10 + *ptr
- '0';
1763 value
|= ((insn
>> start
) & ((2ul << bits
) - 1)) << width
;
1766 while (*ptr
++ == ',');
1774 arm_decode_shift (long given
, fprintf_ftype func
, void *stream
,
1775 bfd_boolean print_shift
)
1777 func (stream
, "%s", arm_regnames
[given
& 0xf]);
1779 if ((given
& 0xff0) != 0)
1781 if ((given
& 0x10) == 0)
1783 int amount
= (given
& 0xf80) >> 7;
1784 int shift
= (given
& 0x60) >> 5;
1790 func (stream
, ", rrx");
1798 func (stream
, ", %s #%d", arm_shift
[shift
], amount
);
1800 func (stream
, ", #%d", amount
);
1802 else if ((given
& 0x80) == 0x80)
1803 func (stream
, "\t; <illegal shifter operand>");
1804 else if (print_shift
)
1805 func (stream
, ", %s %s", arm_shift
[(given
& 0x60) >> 5],
1806 arm_regnames
[(given
& 0xf00) >> 8]);
1808 func (stream
, ", %s", arm_regnames
[(given
& 0xf00) >> 8]);
1817 #define WRITEBACK_BIT_SET (given & (1 << W_BIT))
1818 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT))
1819 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0)
1820 #define PRE_BIT_SET (given & (1 << P_BIT))
1822 /* Print one coprocessor instruction on INFO->STREAM.
1823 Return TRUE if the instuction matched, FALSE if this is not a
1824 recognised coprocessor instruction. */
1827 print_insn_coprocessor (bfd_vma pc
,
1828 struct disassemble_info
*info
,
1832 const struct opcode32
*insn
;
1833 void *stream
= info
->stream
;
1834 fprintf_ftype func
= info
->fprintf_func
;
1836 unsigned long value
= 0;
1837 struct arm_private_data
*private_data
= info
->private_data
;
1838 unsigned long allowed_arches
= private_data
->features
.coproc
;
1841 for (insn
= coprocessor_opcodes
; insn
->assembler
; insn
++)
1843 unsigned long u_reg
= 16;
1844 bfd_boolean is_unpredictable
= FALSE
;
1845 signed long value_in_comment
= 0;
1848 if (insn
->arch
== 0)
1849 switch (insn
->value
)
1851 case SENTINEL_IWMMXT_START
:
1852 if (info
->mach
!= bfd_mach_arm_XScale
1853 && info
->mach
!= bfd_mach_arm_iWMMXt
1854 && info
->mach
!= bfd_mach_arm_iWMMXt2
)
1857 while (insn
->arch
!= 0 && insn
->value
!= SENTINEL_IWMMXT_END
);
1860 case SENTINEL_IWMMXT_END
:
1863 case SENTINEL_GENERIC_START
:
1864 allowed_arches
= private_data
->features
.core
;
1872 value
= insn
->value
;
1875 /* The high 4 bits are 0xe for Arm conditional instructions, and
1876 0xe for arm unconditional instructions. The rest of the
1877 encoding is the same. */
1879 value
|= 0xe0000000;
1887 /* Only match unconditional instuctions against unconditional
1889 if ((given
& 0xf0000000) == 0xf0000000)
1896 cond
= (given
>> 28) & 0xf;
1902 if ((given
& mask
) != value
)
1905 if ((insn
->arch
& allowed_arches
) == 0)
1908 for (c
= insn
->assembler
; *c
; c
++)
1915 func (stream
, "%%");
1920 int rn
= (given
>> 16) & 0xf;
1921 bfd_vma offset
= given
& 0xff;
1923 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
1925 if (PRE_BIT_SET
|| WRITEBACK_BIT_SET
)
1927 /* Not unindexed. The offset is scaled. */
1928 offset
= offset
* 4;
1929 if (NEGATIVE_BIT_SET
)
1932 value_in_comment
= offset
;
1938 func (stream
, ", #%d]%s",
1940 WRITEBACK_BIT_SET
? "!" : "");
1941 else if (NEGATIVE_BIT_SET
)
1942 func (stream
, ", #-0]");
1950 if (WRITEBACK_BIT_SET
)
1953 func (stream
, ", #%d", (int) offset
);
1954 else if (NEGATIVE_BIT_SET
)
1955 func (stream
, ", #-0");
1959 func (stream
, ", {%s%d}",
1960 (NEGATIVE_BIT_SET
&& !offset
) ? "-" : "",
1962 value_in_comment
= offset
;
1965 if (rn
== 15 && (PRE_BIT_SET
|| WRITEBACK_BIT_SET
))
1967 func (stream
, "\t; ");
1968 /* For unaligned PCs, apply off-by-alignment
1970 info
->print_address_func (offset
+ pc
1971 + info
->bytes_per_chunk
* 2
1980 int regno
= ((given
>> 12) & 0xf) | ((given
>> (22 - 4)) & 0x10);
1981 int offset
= (given
>> 1) & 0x3f;
1984 func (stream
, "{d%d}", regno
);
1985 else if (regno
+ offset
> 32)
1986 func (stream
, "{d%d-<overflow reg d%d>}", regno
, regno
+ offset
- 1);
1988 func (stream
, "{d%d-d%d}", regno
, regno
+ offset
- 1);
1993 if (cond
!= COND_UNCOND
)
1994 is_unpredictable
= TRUE
;
1998 func (stream
, "%s", arm_conditional
[cond
]);
2002 /* Print a Cirrus/DSP shift immediate. */
2003 /* Immediates are 7bit signed ints with bits 0..3 in
2004 bits 0..3 of opcode and bits 4..6 in bits 5..7
2009 imm
= (given
& 0xf) | ((given
& 0xe0) >> 1);
2011 /* Is ``imm'' a negative number? */
2015 func (stream
, "%d", imm
);
2021 switch (given
& 0x00408000)
2038 switch (given
& 0x00080080)
2050 func (stream
, _("<illegal precision>"));
2056 switch (given
& 0x00408000)
2074 switch (given
& 0x60)
2090 case '0': case '1': case '2': case '3': case '4':
2091 case '5': case '6': case '7': case '8': case '9':
2095 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
2101 is_unpredictable
= TRUE
;
2106 /* Eat the 'u' character. */
2110 is_unpredictable
= TRUE
;
2113 func (stream
, "%s", arm_regnames
[value
]);
2116 func (stream
, "d%ld", value
);
2120 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
2122 func (stream
, "q%ld", value
>> 1);
2125 func (stream
, "%ld", value
);
2126 value_in_comment
= value
;
2130 int from
= (given
& (1 << 7)) ? 32 : 16;
2131 func (stream
, "%ld", from
- value
);
2137 func (stream
, "#%s", arm_fp_const
[value
& 7]);
2139 func (stream
, "f%ld", value
);
2144 func (stream
, "%s", iwmmxt_wwnames
[value
]);
2146 func (stream
, "%s", iwmmxt_wwssnames
[value
]);
2150 func (stream
, "%s", iwmmxt_regnames
[value
]);
2153 func (stream
, "%s", iwmmxt_cregnames
[value
]);
2157 func (stream
, "0x%lx", (value
& 0xffffffffUL
));
2163 func (stream
, "%c", *c
);
2167 if (value
== ((1ul << width
) - 1))
2168 func (stream
, "%c", *c
);
2171 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
2182 int single
= *c
++ == 'y';
2187 case '4': /* Sm pair */
2188 case '0': /* Sm, Dm */
2189 regno
= given
& 0x0000000f;
2193 regno
+= (given
>> 5) & 1;
2196 regno
+= ((given
>> 5) & 1) << 4;
2199 case '1': /* Sd, Dd */
2200 regno
= (given
>> 12) & 0x0000000f;
2204 regno
+= (given
>> 22) & 1;
2207 regno
+= ((given
>> 22) & 1) << 4;
2210 case '2': /* Sn, Dn */
2211 regno
= (given
>> 16) & 0x0000000f;
2215 regno
+= (given
>> 7) & 1;
2218 regno
+= ((given
>> 7) & 1) << 4;
2221 case '3': /* List */
2223 regno
= (given
>> 12) & 0x0000000f;
2227 regno
+= (given
>> 22) & 1;
2230 regno
+= ((given
>> 22) & 1) << 4;
2237 func (stream
, "%c%d", single
? 's' : 'd', regno
);
2241 int count
= given
& 0xff;
2248 func (stream
, "-%c%d",
2256 func (stream
, ", %c%d", single
? 's' : 'd',
2262 switch (given
& 0x00400100)
2264 case 0x00000000: func (stream
, "b"); break;
2265 case 0x00400000: func (stream
, "h"); break;
2266 case 0x00000100: func (stream
, "w"); break;
2267 case 0x00400100: func (stream
, "d"); break;
2275 /* given (20, 23) | given (0, 3) */
2276 value
= ((given
>> 16) & 0xf0) | (given
& 0xf);
2277 func (stream
, "%d", (int) value
);
2282 /* This is like the 'A' operator, except that if
2283 the width field "M" is zero, then the offset is
2284 *not* multiplied by four. */
2286 int offset
= given
& 0xff;
2287 int multiplier
= (given
& 0x00000100) ? 4 : 1;
2289 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
2293 value_in_comment
= offset
* multiplier
;
2294 if (NEGATIVE_BIT_SET
)
2295 value_in_comment
= - value_in_comment
;
2301 func (stream
, ", #%s%d]%s",
2302 NEGATIVE_BIT_SET
? "-" : "",
2303 offset
* multiplier
,
2304 WRITEBACK_BIT_SET
? "!" : "");
2306 func (stream
, "], #%s%d",
2307 NEGATIVE_BIT_SET
? "-" : "",
2308 offset
* multiplier
);
2317 int imm4
= (given
>> 4) & 0xf;
2318 int puw_bits
= ((given
>> 22) & 6) | ((given
>> W_BIT
) & 1);
2319 int ubit
= ! NEGATIVE_BIT_SET
;
2320 const char *rm
= arm_regnames
[given
& 0xf];
2321 const char *rn
= arm_regnames
[(given
>> 16) & 0xf];
2327 func (stream
, "[%s], %c%s", rn
, ubit
? '+' : '-', rm
);
2329 func (stream
, ", lsl #%d", imm4
);
2336 func (stream
, "[%s, %c%s", rn
, ubit
? '+' : '-', rm
);
2338 func (stream
, ", lsl #%d", imm4
);
2340 if (puw_bits
== 5 || puw_bits
== 7)
2345 func (stream
, "INVALID");
2353 imm5
= ((given
& 0x100) >> 4) | (given
& 0xf);
2354 func (stream
, "%ld", (imm5
== 0) ? 32 : imm5
);
2364 func (stream
, "%c", *c
);
2367 if (value_in_comment
> 32 || value_in_comment
< -16)
2368 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
2370 if (is_unpredictable
)
2371 func (stream
, UNPREDICTABLE_INSTRUCTION
);
2378 /* Decodes and prints ARM addressing modes. Returns the offset
2379 used in the address, if any, if it is worthwhile printing the
2380 offset as a hexadecimal value in a comment at the end of the
2381 line of disassembly. */
2384 print_arm_address (bfd_vma pc
, struct disassemble_info
*info
, long given
)
2386 void *stream
= info
->stream
;
2387 fprintf_ftype func
= info
->fprintf_func
;
2390 if (((given
& 0x000f0000) == 0x000f0000)
2391 && ((given
& 0x02000000) == 0))
2393 offset
= given
& 0xfff;
2395 func (stream
, "[pc");
2399 /* Pre-indexed. Elide offset of positive zero when
2401 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
2402 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
2404 if (NEGATIVE_BIT_SET
)
2409 /* Cope with the possibility of write-back
2410 being used. Probably a very dangerous thing
2411 for the programmer to do, but who are we to
2413 func (stream
, "]%s", WRITEBACK_BIT_SET
? "!" : "");
2415 else /* Post indexed. */
2417 func (stream
, "], #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
2419 /* Ie ignore the offset. */
2423 func (stream
, "\t; ");
2424 info
->print_address_func (offset
, info
);
2429 func (stream
, "[%s",
2430 arm_regnames
[(given
>> 16) & 0xf]);
2434 if ((given
& 0x02000000) == 0)
2436 /* Elide offset of positive zero when non-writeback. */
2437 offset
= given
& 0xfff;
2438 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
|| offset
)
2439 func (stream
, ", #%s%d", NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
2443 func (stream
, ", %s", NEGATIVE_BIT_SET
? "-" : "");
2444 arm_decode_shift (given
, func
, stream
, TRUE
);
2447 func (stream
, "]%s",
2448 WRITEBACK_BIT_SET
? "!" : "");
2452 if ((given
& 0x02000000) == 0)
2454 /* Always show offset. */
2455 offset
= given
& 0xfff;
2456 func (stream
, "], #%s%d",
2457 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
2461 func (stream
, "], %s",
2462 NEGATIVE_BIT_SET
? "-" : "");
2463 arm_decode_shift (given
, func
, stream
, TRUE
);
2468 return (signed long) offset
;
2471 /* Print one neon instruction on INFO->STREAM.
2472 Return TRUE if the instuction matched, FALSE if this is not a
2473 recognised neon instruction. */
2476 print_insn_neon (struct disassemble_info
*info
, long given
, bfd_boolean thumb
)
2478 const struct opcode32
*insn
;
2479 void *stream
= info
->stream
;
2480 fprintf_ftype func
= info
->fprintf_func
;
2484 if ((given
& 0xef000000) == 0xef000000)
2486 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
2487 unsigned long bit28
= given
& (1 << 28);
2489 given
&= 0x00ffffff;
2491 given
|= 0xf3000000;
2493 given
|= 0xf2000000;
2495 else if ((given
& 0xff000000) == 0xf9000000)
2496 given
^= 0xf9000000 ^ 0xf4000000;
2501 for (insn
= neon_opcodes
; insn
->assembler
; insn
++)
2503 if ((given
& insn
->mask
) == insn
->value
)
2505 signed long value_in_comment
= 0;
2506 bfd_boolean is_unpredictable
= FALSE
;
2509 for (c
= insn
->assembler
; *c
; c
++)
2516 func (stream
, "%%");
2520 if (thumb
&& ifthen_state
)
2521 is_unpredictable
= TRUE
;
2525 if (thumb
&& ifthen_state
)
2526 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
2531 static const unsigned char enc
[16] =
2533 0x4, 0x14, /* st4 0,1 */
2545 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
2546 int rn
= ((given
>> 16) & 0xf);
2547 int rm
= ((given
>> 0) & 0xf);
2548 int align
= ((given
>> 4) & 0x3);
2549 int type
= ((given
>> 8) & 0xf);
2550 int n
= enc
[type
] & 0xf;
2551 int stride
= (enc
[type
] >> 4) + 1;
2556 for (ix
= 0; ix
!= n
; ix
++)
2557 func (stream
, "%sd%d", ix
? "," : "", rd
+ ix
* stride
);
2559 func (stream
, "d%d", rd
);
2561 func (stream
, "d%d-d%d", rd
, rd
+ n
- 1);
2562 func (stream
, "}, [%s", arm_regnames
[rn
]);
2564 func (stream
, " :%d", 32 << align
);
2569 func (stream
, ", %s", arm_regnames
[rm
]);
2575 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
2576 int rn
= ((given
>> 16) & 0xf);
2577 int rm
= ((given
>> 0) & 0xf);
2578 int idx_align
= ((given
>> 4) & 0xf);
2580 int size
= ((given
>> 10) & 0x3);
2581 int idx
= idx_align
>> (size
+ 1);
2582 int length
= ((given
>> 8) & 3) + 1;
2586 if (length
> 1 && size
> 0)
2587 stride
= (idx_align
& (1 << size
)) ? 2 : 1;
2593 int amask
= (1 << size
) - 1;
2594 if ((idx_align
& (1 << size
)) != 0)
2598 if ((idx_align
& amask
) == amask
)
2600 else if ((idx_align
& amask
) != 0)
2607 if (size
== 2 && (idx_align
& 2) != 0)
2609 align
= (idx_align
& 1) ? 16 << size
: 0;
2613 if ((size
== 2 && (idx_align
& 3) != 0)
2614 || (idx_align
& 1) != 0)
2621 if ((idx_align
& 3) == 3)
2623 align
= (idx_align
& 3) * 64;
2626 align
= (idx_align
& 1) ? 32 << size
: 0;
2634 for (i
= 0; i
< length
; i
++)
2635 func (stream
, "%sd%d[%d]", (i
== 0) ? "" : ",",
2636 rd
+ i
* stride
, idx
);
2637 func (stream
, "}, [%s", arm_regnames
[rn
]);
2639 func (stream
, " :%d", align
);
2644 func (stream
, ", %s", arm_regnames
[rm
]);
2650 int rd
= ((given
>> 12) & 0xf) | (((given
>> 22) & 1) << 4);
2651 int rn
= ((given
>> 16) & 0xf);
2652 int rm
= ((given
>> 0) & 0xf);
2653 int align
= ((given
>> 4) & 0x1);
2654 int size
= ((given
>> 6) & 0x3);
2655 int type
= ((given
>> 8) & 0x3);
2657 int stride
= ((given
>> 5) & 0x1);
2660 if (stride
&& (n
== 1))
2667 for (ix
= 0; ix
!= n
; ix
++)
2668 func (stream
, "%sd%d[]", ix
? "," : "", rd
+ ix
* stride
);
2670 func (stream
, "d%d[]", rd
);
2672 func (stream
, "d%d[]-d%d[]", rd
, rd
+ n
- 1);
2673 func (stream
, "}, [%s", arm_regnames
[rn
]);
2676 align
= (8 * (type
+ 1)) << size
;
2678 align
= (size
> 1) ? align
>> 1 : align
;
2679 if (type
== 2 || (type
== 0 && !size
))
2680 func (stream
, " :<bad align %d>", align
);
2682 func (stream
, " :%d", align
);
2688 func (stream
, ", %s", arm_regnames
[rm
]);
2694 int raw_reg
= (given
& 0xf) | ((given
>> 1) & 0x10);
2695 int size
= (given
>> 20) & 3;
2696 int reg
= raw_reg
& ((4 << size
) - 1);
2697 int ix
= raw_reg
>> size
>> 2;
2699 func (stream
, "d%d[%d]", reg
, ix
);
2704 /* Neon encoded constant for mov, mvn, vorr, vbic. */
2707 int cmode
= (given
>> 8) & 0xf;
2708 int op
= (given
>> 5) & 0x1;
2709 unsigned long value
= 0, hival
= 0;
2714 bits
|= ((given
>> 24) & 1) << 7;
2715 bits
|= ((given
>> 16) & 7) << 4;
2716 bits
|= ((given
>> 0) & 15) << 0;
2720 shift
= (cmode
>> 1) & 3;
2721 value
= (unsigned long) bits
<< (8 * shift
);
2724 else if (cmode
< 12)
2726 shift
= (cmode
>> 1) & 1;
2727 value
= (unsigned long) bits
<< (8 * shift
);
2730 else if (cmode
< 14)
2732 shift
= (cmode
& 1) + 1;
2733 value
= (unsigned long) bits
<< (8 * shift
);
2734 value
|= (1ul << (8 * shift
)) - 1;
2737 else if (cmode
== 14)
2741 /* Bit replication into bytes. */
2747 for (ix
= 7; ix
>= 0; ix
--)
2749 mask
= ((bits
>> ix
) & 1) ? 0xff : 0;
2751 value
= (value
<< 8) | mask
;
2753 hival
= (hival
<< 8) | mask
;
2759 /* Byte replication. */
2760 value
= (unsigned long) bits
;
2766 /* Floating point encoding. */
2769 value
= (unsigned long) (bits
& 0x7f) << 19;
2770 value
|= (unsigned long) (bits
& 0x80) << 24;
2771 tmp
= bits
& 0x40 ? 0x3c : 0x40;
2772 value
|= (unsigned long) tmp
<< 24;
2778 func (stream
, "<illegal constant %.8x:%x:%x>",
2786 func (stream
, "#%ld\t; 0x%.2lx", value
, value
);
2790 func (stream
, "#%ld\t; 0x%.4lx", value
, value
);
2796 unsigned char valbytes
[4];
2799 /* Do this a byte at a time so we don't have to
2800 worry about the host's endianness. */
2801 valbytes
[0] = value
& 0xff;
2802 valbytes
[1] = (value
>> 8) & 0xff;
2803 valbytes
[2] = (value
>> 16) & 0xff;
2804 valbytes
[3] = (value
>> 24) & 0xff;
2806 floatformat_to_double
2807 (& floatformat_ieee_single_little
, valbytes
,
2810 func (stream
, "#%.7g\t; 0x%.8lx", fvalue
,
2814 func (stream
, "#%ld\t; 0x%.8lx",
2815 (long) (((value
& 0x80000000L
) != 0)
2816 ? value
| ~0xffffffffL
: value
),
2821 func (stream
, "#0x%.8lx%.8lx", hival
, value
);
2832 int regno
= ((given
>> 16) & 0xf) | ((given
>> (7 - 4)) & 0x10);
2833 int num
= (given
>> 8) & 0x3;
2836 func (stream
, "{d%d}", regno
);
2837 else if (num
+ regno
>= 32)
2838 func (stream
, "{d%d-<overflow reg d%d}", regno
, regno
+ num
);
2840 func (stream
, "{d%d-d%d}", regno
, regno
+ num
);
2845 case '0': case '1': case '2': case '3': case '4':
2846 case '5': case '6': case '7': case '8': case '9':
2849 unsigned long value
;
2851 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
2856 func (stream
, "%s", arm_regnames
[value
]);
2859 func (stream
, "%ld", value
);
2860 value_in_comment
= value
;
2863 func (stream
, "%ld", (1ul << width
) - value
);
2869 /* Various width encodings. */
2871 int base
= 8 << (*c
- 'S'); /* 8,16 or 32 */
2876 if (*c
>= '0' && *c
<= '9')
2878 else if (*c
>= 'a' && *c
<= 'f')
2879 limit
= *c
- 'a' + 10;
2885 if (value
< low
|| value
> high
)
2886 func (stream
, "<illegal width %d>", base
<< value
);
2888 func (stream
, "%d", base
<< value
);
2892 if (given
& (1 << 6))
2896 func (stream
, "d%ld", value
);
2901 func (stream
, "<illegal reg q%ld.5>", value
>> 1);
2903 func (stream
, "q%ld", value
>> 1);
2909 func (stream
, "%c", *c
);
2913 if (value
== ((1ul << width
) - 1))
2914 func (stream
, "%c", *c
);
2917 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
2931 func (stream
, "%c", *c
);
2934 if (value_in_comment
> 32 || value_in_comment
< -16)
2935 func (stream
, "\t; 0x%lx", value_in_comment
);
2937 if (is_unpredictable
)
2938 func (stream
, UNPREDICTABLE_INSTRUCTION
);
2946 /* Return the name of a v7A special register. */
2949 banked_regname (unsigned reg
)
2953 case 15: return "CPSR";
2954 case 32: return "R8_usr";
2955 case 33: return "R9_usr";
2956 case 34: return "R10_usr";
2957 case 35: return "R11_usr";
2958 case 36: return "R12_usr";
2959 case 37: return "SP_usr";
2960 case 38: return "LR_usr";
2961 case 40: return "R8_fiq";
2962 case 41: return "R9_fiq";
2963 case 42: return "R10_fiq";
2964 case 43: return "R11_fiq";
2965 case 44: return "R12_fiq";
2966 case 45: return "SP_fiq";
2967 case 46: return "LR_fiq";
2968 case 48: return "LR_irq";
2969 case 49: return "SP_irq";
2970 case 50: return "LR_svc";
2971 case 51: return "SP_svc";
2972 case 52: return "LR_abt";
2973 case 53: return "SP_abt";
2974 case 54: return "LR_und";
2975 case 55: return "SP_und";
2976 case 60: return "LR_mon";
2977 case 61: return "SP_mon";
2978 case 62: return "ELR_hyp";
2979 case 63: return "SP_hyp";
2980 case 79: return "SPSR";
2981 case 110: return "SPSR_fiq";
2982 case 112: return "SPSR_irq";
2983 case 114: return "SPSR_svc";
2984 case 116: return "SPSR_abt";
2985 case 118: return "SPSR_und";
2986 case 124: return "SPSR_mon";
2987 case 126: return "SPSR_hyp";
2988 default: return NULL
;
2992 /* Return the name of the DMB/DSB option. */
2994 data_barrier_option (unsigned option
)
2996 switch (option
& 0xf)
2998 case 0xf: return "sy";
2999 case 0xe: return "st";
3000 case 0xd: return "ld";
3001 case 0xb: return "ish";
3002 case 0xa: return "ishst";
3003 case 0x9: return "ishld";
3004 case 0x7: return "un";
3005 case 0x6: return "unst";
3006 case 0x5: return "nshld";
3007 case 0x3: return "osh";
3008 case 0x2: return "oshst";
3009 case 0x1: return "oshld";
3010 default: return NULL
;
3014 /* Print one ARM instruction from PC on INFO->STREAM. */
3017 print_insn_arm (bfd_vma pc
, struct disassemble_info
*info
, long given
)
3019 const struct opcode32
*insn
;
3020 void *stream
= info
->stream
;
3021 fprintf_ftype func
= info
->fprintf_func
;
3022 struct arm_private_data
*private_data
= info
->private_data
;
3024 if (print_insn_coprocessor (pc
, info
, given
, FALSE
))
3027 if (print_insn_neon (info
, given
, FALSE
))
3030 for (insn
= arm_opcodes
; insn
->assembler
; insn
++)
3032 if ((given
& insn
->mask
) != insn
->value
)
3035 if ((insn
->arch
& private_data
->features
.core
) == 0)
3038 /* Special case: an instruction with all bits set in the condition field
3039 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
3040 or by the catchall at the end of the table. */
3041 if ((given
& 0xF0000000) != 0xF0000000
3042 || (insn
->mask
& 0xF0000000) == 0xF0000000
3043 || (insn
->mask
== 0 && insn
->value
== 0))
3045 unsigned long u_reg
= 16;
3046 unsigned long U_reg
= 16;
3047 bfd_boolean is_unpredictable
= FALSE
;
3048 signed long value_in_comment
= 0;
3051 for (c
= insn
->assembler
; *c
; c
++)
3055 bfd_boolean allow_unpredictable
= FALSE
;
3060 func (stream
, "%%");
3064 value_in_comment
= print_arm_address (pc
, info
, given
);
3068 /* Set P address bit and use normal address
3069 printing routine. */
3070 value_in_comment
= print_arm_address (pc
, info
, given
| (1 << P_BIT
));
3074 allow_unpredictable
= TRUE
;
3076 if ((given
& 0x004f0000) == 0x004f0000)
3078 /* PC relative with immediate offset. */
3079 bfd_vma offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
3083 /* Elide positive zero offset. */
3084 if (offset
|| NEGATIVE_BIT_SET
)
3085 func (stream
, "[pc, #%s%d]\t; ",
3086 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
3088 func (stream
, "[pc]\t; ");
3089 if (NEGATIVE_BIT_SET
)
3091 info
->print_address_func (offset
+ pc
+ 8, info
);
3095 /* Always show the offset. */
3096 func (stream
, "[pc], #%s%d",
3097 NEGATIVE_BIT_SET
? "-" : "", (int) offset
);
3098 if (! allow_unpredictable
)
3099 is_unpredictable
= TRUE
;
3104 int offset
= ((given
& 0xf00) >> 4) | (given
& 0xf);
3106 func (stream
, "[%s",
3107 arm_regnames
[(given
>> 16) & 0xf]);
3111 if (IMMEDIATE_BIT_SET
)
3113 /* Elide offset for non-writeback
3115 if (WRITEBACK_BIT_SET
|| NEGATIVE_BIT_SET
3117 func (stream
, ", #%s%d",
3118 NEGATIVE_BIT_SET
? "-" : "", offset
);
3120 if (NEGATIVE_BIT_SET
)
3123 value_in_comment
= offset
;
3127 /* Register Offset or Register Pre-Indexed. */
3128 func (stream
, ", %s%s",
3129 NEGATIVE_BIT_SET
? "-" : "",
3130 arm_regnames
[given
& 0xf]);
3132 /* Writing back to the register that is the source/
3133 destination of the load/store is unpredictable. */
3134 if (! allow_unpredictable
3135 && WRITEBACK_BIT_SET
3136 && ((given
& 0xf) == ((given
>> 12) & 0xf)))
3137 is_unpredictable
= TRUE
;
3140 func (stream
, "]%s",
3141 WRITEBACK_BIT_SET
? "!" : "");
3145 if (IMMEDIATE_BIT_SET
)
3147 /* Immediate Post-indexed. */
3148 /* PR 10924: Offset must be printed, even if it is zero. */
3149 func (stream
, "], #%s%d",
3150 NEGATIVE_BIT_SET
? "-" : "", offset
);
3151 if (NEGATIVE_BIT_SET
)
3153 value_in_comment
= offset
;
3157 /* Register Post-indexed. */
3158 func (stream
, "], %s%s",
3159 NEGATIVE_BIT_SET
? "-" : "",
3160 arm_regnames
[given
& 0xf]);
3162 /* Writing back to the register that is the source/
3163 destination of the load/store is unpredictable. */
3164 if (! allow_unpredictable
3165 && (given
& 0xf) == ((given
>> 12) & 0xf))
3166 is_unpredictable
= TRUE
;
3169 if (! allow_unpredictable
)
3171 /* Writeback is automatically implied by post- addressing.
3172 Setting the W bit is unnecessary and ARM specify it as
3173 being unpredictable. */
3174 if (WRITEBACK_BIT_SET
3175 /* Specifying the PC register as the post-indexed
3176 registers is also unpredictable. */
3177 || (! IMMEDIATE_BIT_SET
&& ((given
& 0xf) == 0xf)))
3178 is_unpredictable
= TRUE
;
3186 bfd_vma disp
= (((given
& 0xffffff) ^ 0x800000) - 0x800000);
3187 info
->print_address_func (disp
* 4 + pc
+ 8, info
);
3192 if (((given
>> 28) & 0xf) != 0xe)
3194 arm_conditional
[(given
>> 28) & 0xf]);
3203 for (reg
= 0; reg
< 16; reg
++)
3204 if ((given
& (1 << reg
)) != 0)
3207 func (stream
, ", ");
3209 func (stream
, "%s", arm_regnames
[reg
]);
3213 is_unpredictable
= TRUE
;
3218 arm_decode_shift (given
, func
, stream
, FALSE
);
3222 if ((given
& 0x02000000) != 0)
3224 unsigned int rotate
= (given
& 0xf00) >> 7;
3225 unsigned int immed
= (given
& 0xff);
3228 a
= (((immed
<< (32 - rotate
))
3229 | (immed
>> rotate
)) & 0xffffffff);
3230 /* If there is another encoding with smaller rotate,
3231 the rotate should be specified directly. */
3232 for (i
= 0; i
< 32; i
+= 2)
3233 if ((a
<< i
| a
>> (32 - i
)) <= 0xff)
3237 func (stream
, "#%d, %d", immed
, rotate
);
3239 func (stream
, "#%d", a
);
3240 value_in_comment
= a
;
3243 arm_decode_shift (given
, func
, stream
, TRUE
);
3247 if ((given
& 0x0000f000) == 0x0000f000)
3249 /* The p-variants of tst/cmp/cmn/teq are the pre-V6
3250 mechanism for setting PSR flag bits. They are
3251 obsolete in V6 onwards. */
3252 if ((private_data
->features
.core
& ARM_EXT_V6
) == 0)
3258 if ((given
& 0x01200000) == 0x00200000)
3264 int offset
= given
& 0xff;
3266 value_in_comment
= offset
* 4;
3267 if (NEGATIVE_BIT_SET
)
3268 value_in_comment
= - value_in_comment
;
3270 func (stream
, "[%s", arm_regnames
[(given
>> 16) & 0xf]);
3275 func (stream
, ", #%d]%s",
3276 (int) value_in_comment
,
3277 WRITEBACK_BIT_SET
? "!" : "");
3285 if (WRITEBACK_BIT_SET
)
3288 func (stream
, ", #%d", (int) value_in_comment
);
3292 func (stream
, ", {%d}", (int) offset
);
3293 value_in_comment
= offset
;
3300 /* Print ARM V5 BLX(1) address: pc+25 bits. */
3305 if (! NEGATIVE_BIT_SET
)
3306 /* Is signed, hi bits should be ones. */
3307 offset
= (-1) ^ 0x00ffffff;
3309 /* Offset is (SignExtend(offset field)<<2). */
3310 offset
+= given
& 0x00ffffff;
3312 address
= offset
+ pc
+ 8;
3314 if (given
& 0x01000000)
3315 /* H bit allows addressing to 2-byte boundaries. */
3318 info
->print_address_func (address
, info
);
3323 if ((given
& 0x02000200) == 0x200)
3326 unsigned sysm
= (given
& 0x004f0000) >> 16;
3328 sysm
|= (given
& 0x300) >> 4;
3329 name
= banked_regname (sysm
);
3332 func (stream
, "%s", name
);
3334 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
3338 func (stream
, "%cPSR_",
3339 (given
& 0x00400000) ? 'S' : 'C');
3340 if (given
& 0x80000)
3342 if (given
& 0x40000)
3344 if (given
& 0x20000)
3346 if (given
& 0x10000)
3352 if ((given
& 0xf0) == 0x60)
3354 switch (given
& 0xf)
3356 case 0xf: func (stream
, "sy"); break;
3358 func (stream
, "#%d", (int) given
& 0xf);
3364 const char * opt
= data_barrier_option (given
& 0xf);
3366 func (stream
, "%s", opt
);
3368 func (stream
, "#%d", (int) given
& 0xf);
3372 case '0': case '1': case '2': case '3': case '4':
3373 case '5': case '6': case '7': case '8': case '9':
3376 unsigned long value
;
3378 c
= arm_decode_bitfield (c
, given
, &value
, &width
);
3384 is_unpredictable
= TRUE
;
3389 /* Eat the 'u' character. */
3393 is_unpredictable
= TRUE
;
3398 /* Eat the 'U' character. */
3402 is_unpredictable
= TRUE
;
3405 func (stream
, "%s", arm_regnames
[value
]);
3408 func (stream
, "%ld", value
);
3409 value_in_comment
= value
;
3412 func (stream
, "%ld", value
* 8);
3413 value_in_comment
= value
* 8;
3416 func (stream
, "%ld", value
+ 1);
3417 value_in_comment
= value
+ 1;
3420 func (stream
, "0x%08lx", value
);
3422 /* Some SWI instructions have special
3424 if ((given
& 0x0fffffff) == 0x0FF00000)
3425 func (stream
, "\t; IMB");
3426 else if ((given
& 0x0fffffff) == 0x0FF00001)
3427 func (stream
, "\t; IMBRange");
3430 func (stream
, "%01lx", value
& 0xf);
3431 value_in_comment
= value
;
3436 func (stream
, "%c", *c
);
3440 if (value
== ((1ul << width
) - 1))
3441 func (stream
, "%c", *c
);
3444 func (stream
, "%c", c
[(1 << width
) - (int) value
]);
3456 imm
= (given
& 0xf) | ((given
& 0xfff00) >> 4);
3457 func (stream
, "%d", imm
);
3458 value_in_comment
= imm
;
3463 /* LSB and WIDTH fields of BFI or BFC. The machine-
3464 language instruction encodes LSB and MSB. */
3466 long msb
= (given
& 0x001f0000) >> 16;
3467 long lsb
= (given
& 0x00000f80) >> 7;
3468 long w
= msb
- lsb
+ 1;
3471 func (stream
, "#%lu, #%lu", lsb
, w
);
3473 func (stream
, "(invalid: %lu:%lu)", lsb
, msb
);
3478 /* Get the PSR/banked register name. */
3481 unsigned sysm
= (given
& 0x004f0000) >> 16;
3483 sysm
|= (given
& 0x300) >> 4;
3484 name
= banked_regname (sysm
);
3487 func (stream
, "%s", name
);
3489 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
3494 /* 16-bit unsigned immediate from a MOVT or MOVW
3495 instruction, encoded in bits 0:11 and 15:19. */
3497 long hi
= (given
& 0x000f0000) >> 4;
3498 long lo
= (given
& 0x00000fff);
3499 long imm16
= hi
| lo
;
3501 func (stream
, "#%lu", imm16
);
3502 value_in_comment
= imm16
;
3512 func (stream
, "%c", *c
);
3515 if (value_in_comment
> 32 || value_in_comment
< -16)
3516 func (stream
, "\t; 0x%lx", (value_in_comment
& 0xffffffffUL
));
3518 if (is_unpredictable
)
3519 func (stream
, UNPREDICTABLE_INSTRUCTION
);
3527 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
3530 print_insn_thumb16 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
3532 const struct opcode16
*insn
;
3533 void *stream
= info
->stream
;
3534 fprintf_ftype func
= info
->fprintf_func
;
3536 for (insn
= thumb_opcodes
; insn
->assembler
; insn
++)
3537 if ((given
& insn
->mask
) == insn
->value
)
3539 signed long value_in_comment
= 0;
3540 const char *c
= insn
->assembler
;
3549 func (stream
, "%c", *c
);
3556 func (stream
, "%%");
3561 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
3566 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
3575 ifthen_next_state
= given
& 0xff;
3576 for (tmp
= given
<< 1; tmp
& 0xf; tmp
<<= 1)
3577 func (stream
, ((given
^ tmp
) & 0x10) ? "e" : "t");
3578 func (stream
, "\t%s", arm_conditional
[(given
>> 4) & 0xf]);
3583 if (ifthen_next_state
)
3584 func (stream
, "\t; unpredictable branch in IT block\n");
3589 func (stream
, "\t; unpredictable <IT:%s>",
3590 arm_conditional
[IFTHEN_COND
]);
3597 reg
= (given
>> 3) & 0x7;
3598 if (given
& (1 << 6))
3601 func (stream
, "%s", arm_regnames
[reg
]);
3610 if (given
& (1 << 7))
3613 func (stream
, "%s", arm_regnames
[reg
]);
3618 if (given
& (1 << 8))
3622 if (*c
== 'O' && (given
& (1 << 8)))
3632 /* It would be nice if we could spot
3633 ranges, and generate the rS-rE format: */
3634 for (reg
= 0; (reg
< 8); reg
++)
3635 if ((given
& (1 << reg
)) != 0)
3638 func (stream
, ", ");
3640 func (stream
, "%s", arm_regnames
[reg
]);
3646 func (stream
, ", ");
3648 func (stream
, "%s", arm_regnames
[14] /* "lr" */);
3654 func (stream
, ", ");
3655 func (stream
, "%s", arm_regnames
[15] /* "pc" */);
3663 /* Print writeback indicator for a LDMIA. We are doing a
3664 writeback if the base register is not in the register
3666 if ((given
& (1 << ((given
& 0x0700) >> 8))) == 0)
3671 /* Print ARM V6T2 CZB address: pc+4+6 bits. */
3673 bfd_vma address
= (pc
+ 4
3674 + ((given
& 0x00f8) >> 2)
3675 + ((given
& 0x0200) >> 3));
3676 info
->print_address_func (address
, info
);
3681 /* Right shift immediate -- bits 6..10; 1-31 print
3682 as themselves, 0 prints as 32. */
3684 long imm
= (given
& 0x07c0) >> 6;
3687 func (stream
, "#%ld", imm
);
3691 case '0': case '1': case '2': case '3': case '4':
3692 case '5': case '6': case '7': case '8': case '9':
3694 int bitstart
= *c
++ - '0';
3697 while (*c
>= '0' && *c
<= '9')
3698 bitstart
= (bitstart
* 10) + *c
++ - '0';
3707 while (*c
>= '0' && *c
<= '9')
3708 bitend
= (bitend
* 10) + *c
++ - '0';
3711 reg
= given
>> bitstart
;
3712 reg
&= (2 << (bitend
- bitstart
)) - 1;
3717 func (stream
, "%s", arm_regnames
[reg
]);
3721 func (stream
, "%ld", (long) reg
);
3722 value_in_comment
= reg
;
3726 func (stream
, "%ld", (long) (reg
<< 1));
3727 value_in_comment
= reg
<< 1;
3731 func (stream
, "%ld", (long) (reg
<< 2));
3732 value_in_comment
= reg
<< 2;
3736 /* PC-relative address -- the bottom two
3737 bits of the address are dropped
3738 before the calculation. */
3739 info
->print_address_func
3740 (((pc
+ 4) & ~3) + (reg
<< 2), info
);
3741 value_in_comment
= 0;
3745 func (stream
, "0x%04lx", (long) reg
);
3749 reg
= ((reg
^ (1 << bitend
)) - (1 << bitend
));
3750 info
->print_address_func (reg
* 2 + pc
+ 4, info
);
3751 value_in_comment
= 0;
3755 func (stream
, "%s", arm_conditional
[reg
]);
3766 if ((given
& (1 << bitstart
)) != 0)
3767 func (stream
, "%c", *c
);
3772 if ((given
& (1 << bitstart
)) != 0)
3773 func (stream
, "%c", *c
++);
3775 func (stream
, "%c", *++c
);
3789 if (value_in_comment
> 32 || value_in_comment
< -16)
3790 func (stream
, "\t; 0x%lx", value_in_comment
);
3798 /* Return the name of an V7M special register. */
3801 psr_name (int regno
)
3805 case 0: return "APSR";
3806 case 1: return "IAPSR";
3807 case 2: return "EAPSR";
3808 case 3: return "PSR";
3809 case 5: return "IPSR";
3810 case 6: return "EPSR";
3811 case 7: return "IEPSR";
3812 case 8: return "MSP";
3813 case 9: return "PSP";
3814 case 16: return "PRIMASK";
3815 case 17: return "BASEPRI";
3816 case 18: return "BASEPRI_MAX";
3817 case 19: return "FAULTMASK";
3818 case 20: return "CONTROL";
3819 default: return "<unknown>";
3823 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
3826 print_insn_thumb32 (bfd_vma pc
, struct disassemble_info
*info
, long given
)
3828 const struct opcode32
*insn
;
3829 void *stream
= info
->stream
;
3830 fprintf_ftype func
= info
->fprintf_func
;
3832 if (print_insn_coprocessor (pc
, info
, given
, TRUE
))
3835 if (print_insn_neon (info
, given
, TRUE
))
3838 for (insn
= thumb32_opcodes
; insn
->assembler
; insn
++)
3839 if ((given
& insn
->mask
) == insn
->value
)
3841 bfd_boolean is_unpredictable
= FALSE
;
3842 signed long value_in_comment
= 0;
3843 const char *c
= insn
->assembler
;
3849 func (stream
, "%c", *c
);
3856 func (stream
, "%%");
3861 func (stream
, "%s", arm_conditional
[IFTHEN_COND
]);
3865 if (ifthen_next_state
)
3866 func (stream
, "\t; unpredictable branch in IT block\n");
3871 func (stream
, "\t; unpredictable <IT:%s>",
3872 arm_conditional
[IFTHEN_COND
]);
3877 unsigned int imm12
= 0;
3879 imm12
|= (given
& 0x000000ffu
);
3880 imm12
|= (given
& 0x00007000u
) >> 4;
3881 imm12
|= (given
& 0x04000000u
) >> 15;
3882 func (stream
, "#%u", imm12
);
3883 value_in_comment
= imm12
;
3889 unsigned int bits
= 0, imm
, imm8
, mod
;
3891 bits
|= (given
& 0x000000ffu
);
3892 bits
|= (given
& 0x00007000u
) >> 4;
3893 bits
|= (given
& 0x04000000u
) >> 15;
3894 imm8
= (bits
& 0x0ff);
3895 mod
= (bits
& 0xf00) >> 8;
3898 case 0: imm
= imm8
; break;
3899 case 1: imm
= ((imm8
<< 16) | imm8
); break;
3900 case 2: imm
= ((imm8
<< 24) | (imm8
<< 8)); break;
3901 case 3: imm
= ((imm8
<< 24) | (imm8
<< 16) | (imm8
<< 8) | imm8
); break;
3903 mod
= (bits
& 0xf80) >> 7;
3904 imm8
= (bits
& 0x07f) | 0x80;
3905 imm
= (((imm8
<< (32 - mod
)) | (imm8
>> mod
)) & 0xffffffff);
3907 func (stream
, "#%u", imm
);
3908 value_in_comment
= imm
;
3914 unsigned int imm
= 0;
3916 imm
|= (given
& 0x000000ffu
);
3917 imm
|= (given
& 0x00007000u
) >> 4;
3918 imm
|= (given
& 0x04000000u
) >> 15;
3919 imm
|= (given
& 0x000f0000u
) >> 4;
3920 func (stream
, "#%u", imm
);
3921 value_in_comment
= imm
;
3927 unsigned int imm
= 0;
3929 imm
|= (given
& 0x000f0000u
) >> 16;
3930 imm
|= (given
& 0x00000ff0u
) >> 0;
3931 imm
|= (given
& 0x0000000fu
) << 12;
3932 func (stream
, "#%u", imm
);
3933 value_in_comment
= imm
;
3939 unsigned int imm
= 0;
3941 imm
|= (given
& 0x00000fffu
);
3942 imm
|= (given
& 0x000f0000u
) >> 4;
3943 func (stream
, "#%u", imm
);
3944 value_in_comment
= imm
;
3950 unsigned int reg
= (given
& 0x0000000fu
);
3951 unsigned int stp
= (given
& 0x00000030u
) >> 4;
3952 unsigned int imm
= 0;
3953 imm
|= (given
& 0x000000c0u
) >> 6;
3954 imm
|= (given
& 0x00007000u
) >> 10;
3956 func (stream
, "%s", arm_regnames
[reg
]);
3961 func (stream
, ", lsl #%u", imm
);
3967 func (stream
, ", lsr #%u", imm
);
3973 func (stream
, ", asr #%u", imm
);
3978 func (stream
, ", rrx");
3980 func (stream
, ", ror #%u", imm
);
3987 unsigned int Rn
= (given
& 0x000f0000) >> 16;
3988 unsigned int U
= ! NEGATIVE_BIT_SET
;
3989 unsigned int op
= (given
& 0x00000f00) >> 8;
3990 unsigned int i12
= (given
& 0x00000fff);
3991 unsigned int i8
= (given
& 0x000000ff);
3992 bfd_boolean writeback
= FALSE
, postind
= FALSE
;
3995 func (stream
, "[%s", arm_regnames
[Rn
]);
3996 if (U
) /* 12-bit positive immediate offset. */
4000 value_in_comment
= offset
;
4002 else if (Rn
== 15) /* 12-bit negative immediate offset. */
4003 offset
= - (int) i12
;
4004 else if (op
== 0x0) /* Shifted register offset. */
4006 unsigned int Rm
= (i8
& 0x0f);
4007 unsigned int sh
= (i8
& 0x30) >> 4;
4009 func (stream
, ", %s", arm_regnames
[Rm
]);
4011 func (stream
, ", lsl #%u", sh
);
4017 case 0xE: /* 8-bit positive immediate offset. */
4021 case 0xC: /* 8-bit negative immediate offset. */
4025 case 0xF: /* 8-bit + preindex with wb. */
4030 case 0xD: /* 8-bit - preindex with wb. */
4035 case 0xB: /* 8-bit + postindex. */
4040 case 0x9: /* 8-bit - postindex. */
4046 func (stream
, ", <undefined>]");
4051 func (stream
, "], #%d", (int) offset
);
4055 func (stream
, ", #%d", (int) offset
);
4056 func (stream
, writeback
? "]!" : "]");
4061 func (stream
, "\t; ");
4062 info
->print_address_func (((pc
+ 4) & ~3) + offset
, info
);
4070 unsigned int U
= ! NEGATIVE_BIT_SET
;
4071 unsigned int W
= WRITEBACK_BIT_SET
;
4072 unsigned int Rn
= (given
& 0x000f0000) >> 16;
4073 unsigned int off
= (given
& 0x000000ff);
4075 func (stream
, "[%s", arm_regnames
[Rn
]);
4081 func (stream
, ", #%c%u", U
? '+' : '-', off
* 4);
4082 value_in_comment
= off
* 4 * U
? 1 : -1;
4090 func (stream
, "], ");
4093 func (stream
, "#%c%u", U
? '+' : '-', off
* 4);
4094 value_in_comment
= off
* 4 * U
? 1 : -1;
4098 func (stream
, "{%u}", off
);
4099 value_in_comment
= off
;
4107 unsigned int Sbit
= (given
& 0x01000000) >> 24;
4108 unsigned int type
= (given
& 0x00600000) >> 21;
4112 case 0: func (stream
, Sbit
? "sb" : "b"); break;
4113 case 1: func (stream
, Sbit
? "sh" : "h"); break;
4116 func (stream
, "??");
4119 func (stream
, "??");
4131 for (reg
= 0; reg
< 16; reg
++)
4132 if ((given
& (1 << reg
)) != 0)
4135 func (stream
, ", ");
4137 func (stream
, "%s", arm_regnames
[reg
]);
4145 unsigned int msb
= (given
& 0x0000001f);
4146 unsigned int lsb
= 0;
4148 lsb
|= (given
& 0x000000c0u
) >> 6;
4149 lsb
|= (given
& 0x00007000u
) >> 10;
4150 func (stream
, "#%u, #%u", lsb
, msb
- lsb
+ 1);
4156 unsigned int width
= (given
& 0x0000001f) + 1;
4157 unsigned int lsb
= 0;
4159 lsb
|= (given
& 0x000000c0u
) >> 6;
4160 lsb
|= (given
& 0x00007000u
) >> 10;
4161 func (stream
, "#%u, #%u", lsb
, width
);
4167 unsigned int S
= (given
& 0x04000000u
) >> 26;
4168 unsigned int J1
= (given
& 0x00002000u
) >> 13;
4169 unsigned int J2
= (given
& 0x00000800u
) >> 11;
4175 offset
|= (given
& 0x003f0000) >> 4;
4176 offset
|= (given
& 0x000007ff) << 1;
4177 offset
-= (1 << 20);
4179 info
->print_address_func (pc
+ 4 + offset
, info
);
4185 unsigned int S
= (given
& 0x04000000u
) >> 26;
4186 unsigned int I1
= (given
& 0x00002000u
) >> 13;
4187 unsigned int I2
= (given
& 0x00000800u
) >> 11;
4191 offset
|= !(I1
^ S
) << 23;
4192 offset
|= !(I2
^ S
) << 22;
4193 offset
|= (given
& 0x03ff0000u
) >> 4;
4194 offset
|= (given
& 0x000007ffu
) << 1;
4195 offset
-= (1 << 24);
4198 /* BLX target addresses are always word aligned. */
4199 if ((given
& 0x00001000u
) == 0)
4202 info
->print_address_func (offset
, info
);
4208 unsigned int shift
= 0;
4210 shift
|= (given
& 0x000000c0u
) >> 6;
4211 shift
|= (given
& 0x00007000u
) >> 10;
4212 if (WRITEBACK_BIT_SET
)
4213 func (stream
, ", asr #%u", shift
);
4215 func (stream
, ", lsl #%u", shift
);
4216 /* else print nothing - lsl #0 */
4222 unsigned int rot
= (given
& 0x00000030) >> 4;
4225 func (stream
, ", ror #%u", rot
* 8);
4230 if ((given
& 0xf0) == 0x60)
4232 switch (given
& 0xf)
4234 case 0xf: func (stream
, "sy"); break;
4236 func (stream
, "#%d", (int) given
& 0xf);
4242 const char * opt
= data_barrier_option (given
& 0xf);
4244 func (stream
, "%s", opt
);
4246 func (stream
, "#%d", (int) given
& 0xf);
4251 if ((given
& 0xff) == 0)
4253 func (stream
, "%cPSR_", (given
& 0x100000) ? 'S' : 'C');
4263 else if ((given
& 0x20) == 0x20)
4266 unsigned sysm
= (given
& 0xf00) >> 8;
4268 sysm
|= (given
& 0x30);
4269 sysm
|= (given
& 0x00100000) >> 14;
4270 name
= banked_regname (sysm
);
4273 func (stream
, "%s", name
);
4275 func (stream
, "(UNDEF: %lu)", (unsigned long) sysm
);
4279 func (stream
, "%s", psr_name (given
& 0xff));
4284 if (((given
& 0xff) == 0)
4285 || ((given
& 0x20) == 0x20))
4288 unsigned sm
= (given
& 0xf0000) >> 16;
4290 sm
|= (given
& 0x30);
4291 sm
|= (given
& 0x00100000) >> 14;
4292 name
= banked_regname (sm
);
4295 func (stream
, "%s", name
);
4297 func (stream
, "(UNDEF: %lu)", (unsigned long) sm
);
4300 func (stream
, "%s", psr_name (given
& 0xff));
4303 case '0': case '1': case '2': case '3': case '4':
4304 case '5': case '6': case '7': case '8': case '9':
4309 c
= arm_decode_bitfield (c
, given
, &val
, &width
);
4314 func (stream
, "%lu", val
);
4315 value_in_comment
= val
;
4319 func (stream
, "%lu", val
* 4);
4320 value_in_comment
= val
* 4;
4325 is_unpredictable
= TRUE
;
4328 func (stream
, "%s", arm_regnames
[val
]);
4332 func (stream
, "%s", arm_conditional
[val
]);
4337 if (val
== ((1ul << width
) - 1))
4338 func (stream
, "%c", *c
);
4344 func (stream
, "%c", *c
);
4348 func (stream
, "%c", c
[(1 << width
) - (int) val
]);
4353 func (stream
, "0x%lx", val
& 0xffffffffUL
);
4363 /* PR binutils/12534
4364 If we have a PC relative offset in an LDRD or STRD
4365 instructions then display the decoded address. */
4366 if (((given
>> 16) & 0xf) == 0xf)
4368 bfd_vma offset
= (given
& 0xff) * 4;
4370 if ((given
& (1 << 23)) == 0)
4372 func (stream
, "\t; ");
4373 info
->print_address_func ((pc
& ~3) + 4 + offset
, info
);
4382 if (value_in_comment
> 32 || value_in_comment
< -16)
4383 func (stream
, "\t; 0x%lx", value_in_comment
);
4385 if (is_unpredictable
)
4386 func (stream
, UNPREDICTABLE_INSTRUCTION
);
4395 /* Print data bytes on INFO->STREAM. */
4398 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED
,
4399 struct disassemble_info
*info
,
4402 switch (info
->bytes_per_chunk
)
4405 info
->fprintf_func (info
->stream
, ".byte\t0x%02lx", given
);
4408 info
->fprintf_func (info
->stream
, ".short\t0x%04lx", given
);
4411 info
->fprintf_func (info
->stream
, ".word\t0x%08lx", given
);
4418 /* Disallow mapping symbols ($a, $b, $d, $t etc) from
4419 being displayed in symbol relative addresses. */
4422 arm_symbol_is_valid (asymbol
* sym
,
4423 struct disassemble_info
* info ATTRIBUTE_UNUSED
)
4430 name
= bfd_asymbol_name (sym
);
4432 return (name
&& *name
!= '$');
4435 /* Parse an individual disassembler option. */
4438 parse_arm_disassembler_option (char *option
)
4443 if (CONST_STRNEQ (option
, "reg-names-"))
4449 for (i
= NUM_ARM_REGNAMES
; i
--;)
4450 if (strneq (option
, regnames
[i
].name
, strlen (regnames
[i
].name
)))
4452 regname_selected
= i
;
4457 /* XXX - should break 'option' at following delimiter. */
4458 fprintf (stderr
, _("Unrecognised register name set: %s\n"), option
);
4460 else if (CONST_STRNEQ (option
, "force-thumb"))
4462 else if (CONST_STRNEQ (option
, "no-force-thumb"))
4465 /* XXX - should break 'option' at following delimiter. */
4466 fprintf (stderr
, _("Unrecognised disassembler option: %s\n"), option
);
4471 /* Parse the string of disassembler options, spliting it at whitespaces
4472 or commas. (Whitespace separators supported for backwards compatibility). */
4475 parse_disassembler_options (char *options
)
4477 if (options
== NULL
)
4482 parse_arm_disassembler_option (options
);
4484 /* Skip forward to next seperator. */
4485 while ((*options
) && (! ISSPACE (*options
)) && (*options
!= ','))
4487 /* Skip forward past seperators. */
4488 while (ISSPACE (*options
) || (*options
== ','))
4493 /* Search back through the insn stream to determine if this instruction is
4494 conditionally executed. */
4497 find_ifthen_state (bfd_vma pc
,
4498 struct disassemble_info
*info
,
4504 /* COUNT is twice the number of instructions seen. It will be odd if we
4505 just crossed an instruction boundary. */
4508 unsigned int seen_it
;
4511 ifthen_address
= pc
;
4518 /* Scan backwards looking for IT instructions, keeping track of where
4519 instruction boundaries are. We don't know if something is actually an
4520 IT instruction until we find a definite instruction boundary. */
4523 if (addr
== 0 || info
->symbol_at_address_func (addr
, info
))
4525 /* A symbol must be on an instruction boundary, and will not
4526 be within an IT block. */
4527 if (seen_it
&& (count
& 1))
4533 status
= info
->read_memory_func (addr
, (bfd_byte
*) b
, 2, info
);
4538 insn
= (b
[0]) | (b
[1] << 8);
4540 insn
= (b
[1]) | (b
[0] << 8);
4543 if ((insn
& 0xf800) < 0xe800)
4545 /* Addr + 2 is an instruction boundary. See if this matches
4546 the expected boundary based on the position of the last
4553 if ((insn
& 0xff00) == 0xbf00 && (insn
& 0xf) != 0)
4555 /* This could be an IT instruction. */
4557 it_count
= count
>> 1;
4559 if ((insn
& 0xf800) >= 0xe800)
4562 count
= (count
+ 2) | 1;
4563 /* IT blocks contain at most 4 instructions. */
4564 if (count
>= 8 && !seen_it
)
4567 /* We found an IT instruction. */
4568 ifthen_state
= (seen_it
& 0xe0) | ((seen_it
<< it_count
) & 0x1f);
4569 if ((ifthen_state
& 0xf) == 0)
4573 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a
4577 is_mapping_symbol (struct disassemble_info
*info
, int n
,
4578 enum map_type
*map_type
)
4582 name
= bfd_asymbol_name (info
->symtab
[n
]);
4583 if (name
[0] == '$' && (name
[1] == 'a' || name
[1] == 't' || name
[1] == 'd')
4584 && (name
[2] == 0 || name
[2] == '.'))
4586 *map_type
= ((name
[1] == 'a') ? MAP_ARM
4587 : (name
[1] == 't') ? MAP_THUMB
4595 /* Try to infer the code type (ARM or Thumb) from a mapping symbol.
4596 Returns nonzero if *MAP_TYPE was set. */
4599 get_map_sym_type (struct disassemble_info
*info
,
4601 enum map_type
*map_type
)
4603 /* If the symbol is in a different section, ignore it. */
4604 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
4607 return is_mapping_symbol (info
, n
, map_type
);
4610 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol.
4611 Returns nonzero if *MAP_TYPE was set. */
4614 get_sym_code_type (struct disassemble_info
*info
,
4616 enum map_type
*map_type
)
4618 elf_symbol_type
*es
;
4621 /* If the symbol is in a different section, ignore it. */
4622 if (info
->section
!= NULL
&& info
->section
!= info
->symtab
[n
]->section
)
4625 es
= *(elf_symbol_type
**)(info
->symtab
+ n
);
4626 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
4628 /* If the symbol has function type then use that. */
4629 if (type
== STT_FUNC
|| type
== STT_GNU_IFUNC
)
4631 if (ARM_SYM_BRANCH_TYPE (&es
->internal_elf_sym
) == ST_BRANCH_TO_THUMB
)
4632 *map_type
= MAP_THUMB
;
4634 *map_type
= MAP_ARM
;
4641 /* Given a bfd_mach_arm_XXX value, this function fills in the fields
4642 of the supplied arm_feature_set structure with bitmasks indicating
4643 the support base architectures and coprocessor extensions.
4645 FIXME: This could more efficiently implemented as a constant array,
4646 although it would also be less robust. */
4649 select_arm_features (unsigned long mach
,
4650 arm_feature_set
* features
)
4653 #define ARM_FEATURE(ARCH,CEXT) \
4654 features->core = (ARCH); \
4655 features->coproc = (CEXT) | FPU_FPA; \
4660 case bfd_mach_arm_2
: ARM_ARCH_V2
;
4661 case bfd_mach_arm_2a
: ARM_ARCH_V2S
;
4662 case bfd_mach_arm_3
: ARM_ARCH_V3
;
4663 case bfd_mach_arm_3M
: ARM_ARCH_V3M
;
4664 case bfd_mach_arm_4
: ARM_ARCH_V4
;
4665 case bfd_mach_arm_4T
: ARM_ARCH_V4T
;
4666 case bfd_mach_arm_5
: ARM_ARCH_V5
;
4667 case bfd_mach_arm_5T
: ARM_ARCH_V5T
;
4668 case bfd_mach_arm_5TE
: ARM_ARCH_V5TE
;
4669 case bfd_mach_arm_XScale
: ARM_ARCH_XSCALE
;
4670 case bfd_mach_arm_ep9312
: ARM_FEATURE (ARM_AEXT_V4T
, ARM_CEXT_MAVERICK
| FPU_MAVERICK
);
4671 case bfd_mach_arm_iWMMXt
: ARM_ARCH_IWMMXT
;
4672 case bfd_mach_arm_iWMMXt2
: ARM_ARCH_IWMMXT2
;
4673 /* If the machine type is unknown allow all
4674 architecture types and all extensions. */
4675 case bfd_mach_arm_unknown
: ARM_FEATURE (-1UL, -1UL);
4682 /* NOTE: There are no checks in these routines that
4683 the relevant number of data bytes exist. */
4686 print_insn (bfd_vma pc
, struct disassemble_info
*info
, bfd_boolean little
)
4691 int is_thumb
= FALSE
;
4692 int is_data
= FALSE
;
4694 unsigned int size
= 4;
4695 void (*printer
) (bfd_vma
, struct disassemble_info
*, long);
4696 bfd_boolean found
= FALSE
;
4697 struct arm_private_data
*private_data
;
4699 if (info
->disassembler_options
)
4701 parse_disassembler_options (info
->disassembler_options
);
4703 /* To avoid repeated parsing of these options, we remove them here. */
4704 info
->disassembler_options
= NULL
;
4707 /* PR 10288: Control which instructions will be disassembled. */
4708 if (info
->private_data
== NULL
)
4710 static struct arm_private_data
private;
4712 if ((info
->flags
& USER_SPECIFIED_MACHINE_TYPE
) == 0)
4713 /* If the user did not use the -m command line switch then default to
4714 disassembling all types of ARM instruction.
4716 The info->mach value has to be ignored as this will be based on
4717 the default archictecture for the target and/or hints in the notes
4718 section, but it will never be greater than the current largest arm
4719 machine value (iWMMXt2), which is only equivalent to the V5TE
4720 architecture. ARM architectures have advanced beyond the machine
4721 value encoding, and these newer architectures would be ignored if
4722 the machine value was used.
4724 Ie the -m switch is used to restrict which instructions will be
4725 disassembled. If it is necessary to use the -m switch to tell
4726 objdump that an ARM binary is being disassembled, eg because the
4727 input is a raw binary file, but it is also desired to disassemble
4728 all ARM instructions then use "-marm". This will select the
4729 "unknown" arm architecture which is compatible with any ARM
4731 info
->mach
= bfd_mach_arm_unknown
;
4733 /* Compute the architecture bitmask from the machine number.
4734 Note: This assumes that the machine number will not change
4735 during disassembly.... */
4736 select_arm_features (info
->mach
, & private.features
);
4738 private.has_mapping_symbols
= -1;
4739 private.last_mapping_sym
= -1;
4740 private.last_mapping_addr
= 0;
4742 info
->private_data
= & private;
4745 private_data
= info
->private_data
;
4747 /* Decide if our code is going to be little-endian, despite what the
4748 function argument might say. */
4749 little_code
= ((info
->endian_code
== BFD_ENDIAN_LITTLE
) || little
);
4751 /* For ELF, consult the symbol table to determine what kind of code
4753 if (info
->symtab_size
!= 0
4754 && bfd_asymbol_flavour (*info
->symtab
) == bfd_target_elf_flavour
)
4759 enum map_type type
= MAP_ARM
;
4761 /* Start scanning at the start of the function, or wherever
4762 we finished last time. */
4763 /* PR 14006. When the address is 0 we are either at the start of the
4764 very first function, or else the first function in a new, unlinked
4765 executable section (eg because uf -ffunction-sections). Either way
4766 start scanning from the beginning of the symbol table, not where we
4767 left off last time. */
4772 start
= info
->symtab_pos
+ 1;
4773 if (start
< private_data
->last_mapping_sym
)
4774 start
= private_data
->last_mapping_sym
;
4778 /* First, look for mapping symbols. */
4779 if (private_data
->has_mapping_symbols
!= 0)
4781 /* Scan up to the location being disassembled. */
4782 for (n
= start
; n
< info
->symtab_size
; n
++)
4784 addr
= bfd_asymbol_value (info
->symtab
[n
]);
4787 if (get_map_sym_type (info
, n
, &type
))
4796 /* No mapping symbol found at this address. Look backwards
4797 for a preceding one. */
4798 for (n
= start
- 1; n
>= 0; n
--)
4800 if (get_map_sym_type (info
, n
, &type
))
4810 private_data
->has_mapping_symbols
= 1;
4812 /* No mapping symbols were found. A leading $d may be
4813 omitted for sections which start with data; but for
4814 compatibility with legacy and stripped binaries, only
4815 assume the leading $d if there is at least one mapping
4816 symbol in the file. */
4817 if (!found
&& private_data
->has_mapping_symbols
== -1)
4819 /* Look for mapping symbols, in any section. */
4820 for (n
= 0; n
< info
->symtab_size
; n
++)
4821 if (is_mapping_symbol (info
, n
, &type
))
4823 private_data
->has_mapping_symbols
= 1;
4826 if (private_data
->has_mapping_symbols
== -1)
4827 private_data
->has_mapping_symbols
= 0;
4830 if (!found
&& private_data
->has_mapping_symbols
== 1)
4837 /* Next search for function symbols to separate ARM from Thumb
4838 in binaries without mapping symbols. */
4841 /* Scan up to the location being disassembled. */
4842 for (n
= start
; n
< info
->symtab_size
; n
++)
4844 addr
= bfd_asymbol_value (info
->symtab
[n
]);
4847 if (get_sym_code_type (info
, n
, &type
))
4856 /* No mapping symbol found at this address. Look backwards
4857 for a preceding one. */
4858 for (n
= start
- 1; n
>= 0; n
--)
4860 if (get_sym_code_type (info
, n
, &type
))
4870 private_data
->last_mapping_sym
= last_sym
;
4871 private_data
->last_type
= type
;
4872 is_thumb
= (private_data
->last_type
== MAP_THUMB
);
4873 is_data
= (private_data
->last_type
== MAP_DATA
);
4875 /* Look a little bit ahead to see if we should print out
4876 two or four bytes of data. If there's a symbol,
4877 mapping or otherwise, after two bytes then don't
4881 size
= 4 - (pc
& 3);
4882 for (n
= last_sym
+ 1; n
< info
->symtab_size
; n
++)
4884 addr
= bfd_asymbol_value (info
->symtab
[n
]);
4886 && (info
->section
== NULL
4887 || info
->section
== info
->symtab
[n
]->section
))
4889 if (addr
- pc
< size
)
4894 /* If the next symbol is after three bytes, we need to
4895 print only part of the data, so that we can use either
4898 size
= (pc
& 1) ? 1 : 2;
4902 if (info
->symbols
!= NULL
)
4904 if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_coff_flavour
)
4906 coff_symbol_type
* cs
;
4908 cs
= coffsymbol (*info
->symbols
);
4909 is_thumb
= ( cs
->native
->u
.syment
.n_sclass
== C_THUMBEXT
4910 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTAT
4911 || cs
->native
->u
.syment
.n_sclass
== C_THUMBLABEL
4912 || cs
->native
->u
.syment
.n_sclass
== C_THUMBEXTFUNC
4913 || cs
->native
->u
.syment
.n_sclass
== C_THUMBSTATFUNC
);
4915 else if (bfd_asymbol_flavour (*info
->symbols
) == bfd_target_elf_flavour
4918 /* If no mapping symbol has been found then fall back to the type
4919 of the function symbol. */
4920 elf_symbol_type
* es
;
4923 es
= *(elf_symbol_type
**)(info
->symbols
);
4924 type
= ELF_ST_TYPE (es
->internal_elf_sym
.st_info
);
4926 is_thumb
= ((ARM_SYM_BRANCH_TYPE (&es
->internal_elf_sym
)
4927 == ST_BRANCH_TO_THUMB
)
4928 || type
== STT_ARM_16BIT
);
4936 info
->display_endian
= little
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
4938 info
->display_endian
= little_code
? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_BIG
;
4940 info
->bytes_per_line
= 4;
4942 /* PR 10263: Disassemble data if requested to do so by the user. */
4943 if (is_data
&& ((info
->flags
& DISASSEMBLE_DATA
) == 0))
4947 /* Size was already set above. */
4948 info
->bytes_per_chunk
= size
;
4949 printer
= print_insn_data
;
4951 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, size
, info
);
4954 for (i
= size
- 1; i
>= 0; i
--)
4955 given
= b
[i
] | (given
<< 8);
4957 for (i
= 0; i
< (int) size
; i
++)
4958 given
= b
[i
] | (given
<< 8);
4962 /* In ARM mode endianness is a straightforward issue: the instruction
4963 is four bytes long and is either ordered 0123 or 3210. */
4964 printer
= print_insn_arm
;
4965 info
->bytes_per_chunk
= 4;
4968 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 4, info
);
4970 given
= (b
[0]) | (b
[1] << 8) | (b
[2] << 16) | (b
[3] << 24);
4972 given
= (b
[3]) | (b
[2] << 8) | (b
[1] << 16) | (b
[0] << 24);
4976 /* In Thumb mode we have the additional wrinkle of two
4977 instruction lengths. Fortunately, the bits that determine
4978 the length of the current instruction are always to be found
4979 in the first two bytes. */
4980 printer
= print_insn_thumb16
;
4981 info
->bytes_per_chunk
= 2;
4984 status
= info
->read_memory_func (pc
, (bfd_byte
*) b
, 2, info
);
4986 given
= (b
[0]) | (b
[1] << 8);
4988 given
= (b
[1]) | (b
[0] << 8);
4992 /* These bit patterns signal a four-byte Thumb
4994 if ((given
& 0xF800) == 0xF800
4995 || (given
& 0xF800) == 0xF000
4996 || (given
& 0xF800) == 0xE800)
4998 status
= info
->read_memory_func (pc
+ 2, (bfd_byte
*) b
, 2, info
);
5000 given
= (b
[0]) | (b
[1] << 8) | (given
<< 16);
5002 given
= (b
[1]) | (b
[0] << 8) | (given
<< 16);
5004 printer
= print_insn_thumb32
;
5009 if (ifthen_address
!= pc
)
5010 find_ifthen_state (pc
, info
, little_code
);
5014 if ((ifthen_state
& 0xf) == 0x8)
5015 ifthen_next_state
= 0;
5017 ifthen_next_state
= (ifthen_state
& 0xe0)
5018 | ((ifthen_state
& 0xf) << 1);
5024 info
->memory_error_func (status
, pc
, info
);
5027 if (info
->flags
& INSN_HAS_RELOC
)
5028 /* If the instruction has a reloc associated with it, then
5029 the offset field in the instruction will actually be the
5030 addend for the reloc. (We are using REL type relocs).
5031 In such cases, we can ignore the pc when computing
5032 addresses, since the addend is not currently pc-relative. */
5035 printer (pc
, info
, given
);
5039 ifthen_state
= ifthen_next_state
;
5040 ifthen_address
+= size
;
5046 print_insn_big_arm (bfd_vma pc
, struct disassemble_info
*info
)
5048 /* Detect BE8-ness and record it in the disassembler info. */
5049 if (info
->flavour
== bfd_target_elf_flavour
5050 && info
->section
!= NULL
5051 && (elf_elfheader (info
->section
->owner
)->e_flags
& EF_ARM_BE8
))
5052 info
->endian_code
= BFD_ENDIAN_LITTLE
;
5054 return print_insn (pc
, info
, FALSE
);
5058 print_insn_little_arm (bfd_vma pc
, struct disassemble_info
*info
)
5060 return print_insn (pc
, info
, TRUE
);
5064 print_arm_disassembler_options (FILE *stream
)
5068 fprintf (stream
, _("\n\
5069 The following ARM specific disassembler options are supported for use with\n\
5070 the -M switch:\n"));
5072 for (i
= NUM_ARM_REGNAMES
; i
--;)
5073 fprintf (stream
, " reg-names-%s %*c%s\n",
5075 (int)(14 - strlen (regnames
[i
].name
)), ' ',
5076 regnames
[i
].description
);
5078 fprintf (stream
, " force-thumb Assume all insns are Thumb insns\n");
5079 fprintf (stream
, " no-force-thumb Examine preceding label to determine an insn's type\n\n");