1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "dis-asm.h"
27#define FALSE 0
28#define TRUE (!FALSE)
29#define ATTRIBUTE_UNUSED __attribute__((unused))
30#define ISSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n')
31
32#define ARM_EXT_V1 0
33#define ARM_EXT_V2 0
34#define ARM_EXT_V2S 0
35#define ARM_EXT_V3 0
36#define ARM_EXT_V3M 0
37#define ARM_EXT_V4 0
38#define ARM_EXT_V4T 0
39#define ARM_EXT_V5 0
40#define ARM_EXT_V5T 0
41#define ARM_EXT_V5ExP 0
42#define ARM_EXT_V5E 0
43#define ARM_EXT_V5J 0
44#define ARM_EXT_V6 0
45#define ARM_EXT_V6K 0
46#define ARM_EXT_V6Z 0
47#define ARM_EXT_V6T2 0
48#define ARM_EXT_V7 0
49#define ARM_EXT_DIV 0
50
51
52#define ARM_CEXT_XSCALE 0
53#define ARM_CEXT_MAVERICK 0
54#define ARM_CEXT_IWMMXT 0
55
56#define FPU_FPA_EXT_V1 0
57#define FPU_FPA_EXT_V2 0
58#define FPU_VFP_EXT_NONE 0
59#define FPU_VFP_EXT_V1xD 0
60#define FPU_VFP_EXT_V1 0
61#define FPU_VFP_EXT_V2 0
62#define FPU_MAVERICK 0
63#define FPU_VFP_EXT_V3 0
64#define FPU_NEON_EXT_V1 0
65
66int floatformat_ieee_single_little;
67
68static void floatformat_to_double (int *ignored, unsigned char *data,
69 double *dest)
70{
71 union {
72 uint32_t i;
73 float f;
74 } u;
75 u.i = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
76 *dest = u.f;
77}
78
79
80
81
82#ifndef strneq
83#define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
84#endif
85
86#ifndef NUM_ELEM
87#define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
88#endif
89
90struct opcode32
91{
92 unsigned long arch;
93 unsigned long value, mask;
94 const char *assembler;
95};
96
97struct opcode16
98{
99 unsigned long arch;
100 unsigned short value, mask;
101 const char *assembler;
102};
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153static const struct opcode32 coprocessor_opcodes[] =
154{
155
156 {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0ff0, "mia%c\tacc0, %0-3r, %12-15r"},
157 {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0ff0, "miaph%c\tacc0, %0-3r, %12-15r"},
158 {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
159 {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
160 {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
161
162
163#define FIRST_IWMMXT_INSN 0x0e130130
164#define IWMMXT_INSN_COUNT 73
165 {ARM_CEXT_IWMMXT, 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
166 {ARM_CEXT_XSCALE, 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
167 {ARM_CEXT_XSCALE, 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
168 {ARM_CEXT_XSCALE, 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
169 {ARM_CEXT_XSCALE, 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
170 {ARM_CEXT_XSCALE, 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
171 {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
172 {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
173 {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
174 {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
175 {ARM_CEXT_XSCALE, 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
176 {ARM_CEXT_XSCALE, 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
177 {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
178 {ARM_CEXT_XSCALE, 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
179 {ARM_CEXT_XSCALE, 0x0e130190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
180 {ARM_CEXT_XSCALE, 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
181 {ARM_CEXT_XSCALE, 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
182 {ARM_CEXT_XSCALE, 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
183 {ARM_CEXT_XSCALE, 0x0e2001a0, 0x0f300ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
184 {ARM_CEXT_XSCALE, 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
185 {ARM_CEXT_XSCALE, 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
186 {ARM_CEXT_XSCALE, 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
187 {ARM_CEXT_XSCALE, 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
188 {ARM_CEXT_XSCALE, 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
189 {ARM_CEXT_XSCALE, 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
190 {ARM_CEXT_XSCALE, 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
191 {ARM_CEXT_XSCALE, 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
192 {ARM_CEXT_XSCALE, 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
193 {ARM_CEXT_XSCALE, 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
194 {ARM_CEXT_XSCALE, 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
195 {ARM_CEXT_XSCALE, 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
196 {ARM_CEXT_XSCALE, 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
197 {ARM_CEXT_XSCALE, 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
198 {ARM_CEXT_XSCALE, 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
199 {ARM_CEXT_XSCALE, 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
200 {ARM_CEXT_XSCALE, 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
201 {ARM_CEXT_XSCALE, 0x0e800120, 0x0f800ff0, "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
202 {ARM_CEXT_XSCALE, 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
203 {ARM_CEXT_XSCALE, 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
204 {ARM_CEXT_XSCALE, 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
205 {ARM_CEXT_XSCALE, 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
206 {ARM_CEXT_XSCALE, 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
207 {ARM_CEXT_XSCALE, 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
208 {ARM_CEXT_XSCALE, 0x0e8000a0, 0x0f800ff0, "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
209 {ARM_CEXT_XSCALE, 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
210 {ARM_CEXT_XSCALE, 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
211 {ARM_CEXT_XSCALE, 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
212 {ARM_CEXT_XSCALE, 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
213 {ARM_CEXT_XSCALE, 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
214 {ARM_CEXT_XSCALE, 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
215 {ARM_CEXT_XSCALE, 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
216 {ARM_CEXT_XSCALE, 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
217 {ARM_CEXT_XSCALE, 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
218 {ARM_CEXT_XSCALE, 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
219 {ARM_CEXT_XSCALE, 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
220 {ARM_CEXT_XSCALE, 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
221 {ARM_CEXT_XSCALE, 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
222 {ARM_CEXT_XSCALE, 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
223 {ARM_CEXT_XSCALE, 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
224 {ARM_CEXT_XSCALE, 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
225 {ARM_CEXT_XSCALE, 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
226 {ARM_CEXT_XSCALE, 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
227 {ARM_CEXT_XSCALE, 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
228 {ARM_CEXT_XSCALE, 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
229 {ARM_CEXT_XSCALE, 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
230 {ARM_CEXT_XSCALE, 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
231 {ARM_CEXT_XSCALE, 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
232 {ARM_CEXT_XSCALE, 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
233 {ARM_CEXT_XSCALE, 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
234 {ARM_CEXT_XSCALE, 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
235 {ARM_CEXT_XSCALE, 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
236 {ARM_CEXT_XSCALE, 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
237 {ARM_CEXT_XSCALE, 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
238 {ARM_CEXT_XSCALE, 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
239 {ARM_CEXT_XSCALE, 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
240
241
242 {FPU_FPA_EXT_V1, 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
243 {FPU_FPA_EXT_V1, 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
244 {FPU_FPA_EXT_V1, 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
245 {FPU_FPA_EXT_V1, 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
246 {FPU_FPA_EXT_V1, 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
247 {FPU_FPA_EXT_V1, 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
248 {FPU_FPA_EXT_V1, 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
249 {FPU_FPA_EXT_V1, 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
250 {FPU_FPA_EXT_V1, 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
251 {FPU_FPA_EXT_V1, 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
252 {FPU_FPA_EXT_V1, 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
253 {FPU_FPA_EXT_V1, 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
254 {FPU_FPA_EXT_V1, 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
255 {FPU_FPA_EXT_V1, 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
256 {FPU_FPA_EXT_V1, 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
257 {FPU_FPA_EXT_V1, 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
258 {FPU_FPA_EXT_V1, 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
259 {FPU_FPA_EXT_V1, 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
260 {FPU_FPA_EXT_V1, 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
261 {FPU_FPA_EXT_V1, 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
262 {FPU_FPA_EXT_V1, 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
263 {FPU_FPA_EXT_V1, 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
264 {FPU_FPA_EXT_V1, 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
265 {FPU_FPA_EXT_V1, 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
266 {FPU_FPA_EXT_V1, 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
267 {FPU_FPA_EXT_V1, 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
268 {FPU_FPA_EXT_V1, 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
269 {FPU_FPA_EXT_V1, 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
270 {FPU_FPA_EXT_V1, 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
271 {FPU_FPA_EXT_V1, 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
272 {FPU_FPA_EXT_V1, 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
273 {FPU_FPA_EXT_V1, 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
274 {FPU_FPA_EXT_V1, 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
275 {FPU_FPA_EXT_V1, 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
276 {FPU_FPA_EXT_V1, 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
277 {FPU_FPA_EXT_V1, 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
278 {FPU_FPA_EXT_V1, 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
279 {FPU_FPA_EXT_V1, 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
280 {FPU_FPA_EXT_V1, 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
281 {FPU_FPA_EXT_V1, 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
282 {FPU_FPA_EXT_V1, 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
283 {FPU_FPA_EXT_V2, 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
284 {FPU_FPA_EXT_V2, 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
285
286
287 {FPU_NEON_EXT_V1, 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r%21'!, %B"},
288 {FPU_NEON_EXT_V1, 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r%21'!, %B"},
289 {FPU_NEON_EXT_V1, 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
290 {FPU_NEON_EXT_V1, 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
291 {FPU_NEON_EXT_V1, 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %C"},
292 {FPU_NEON_EXT_V1, 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %C"},
293
294
295 {FPU_NEON_EXT_V1, 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
296 {FPU_NEON_EXT_V1, 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
297 {FPU_NEON_EXT_V1, 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
298 {FPU_NEON_EXT_V1, 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
299 {FPU_NEON_EXT_V1, 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
300 {FPU_NEON_EXT_V1, 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
301 {FPU_NEON_EXT_V1, 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
302 {FPU_NEON_EXT_V1, 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
303 {FPU_NEON_EXT_V1, 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
304 {FPU_NEON_EXT_V1, 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
305 {FPU_NEON_EXT_V1, 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
306 {FPU_NEON_EXT_V1, 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
307 {FPU_NEON_EXT_V1, 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
308 {FPU_NEON_EXT_V1, 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
309
310
311 {FPU_VFP_EXT_V1xD, 0x0ef1fa10, 0x0fffffff, "fmstat%c"},
312 {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0fff0fff, "fmxr%c\tfpsid, %12-15r"},
313 {FPU_VFP_EXT_V1xD, 0x0ee10a10, 0x0fff0fff, "fmxr%c\tfpscr, %12-15r"},
314 {FPU_VFP_EXT_V1xD, 0x0ee60a10, 0x0fff0fff, "fmxr%c\tmvfr1, %12-15r"},
315 {FPU_VFP_EXT_V1xD, 0x0ee70a10, 0x0fff0fff, "fmxr%c\tmvfr0, %12-15r"},
316 {FPU_VFP_EXT_V1xD, 0x0ee80a10, 0x0fff0fff, "fmxr%c\tfpexc, %12-15r"},
317 {FPU_VFP_EXT_V1xD, 0x0ee90a10, 0x0fff0fff, "fmxr%c\tfpinst, %12-15r\t@ Impl def"},
318 {FPU_VFP_EXT_V1xD, 0x0eea0a10, 0x0fff0fff, "fmxr%c\tfpinst2, %12-15r\t@ Impl def"},
319 {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpsid"},
320 {FPU_VFP_EXT_V1xD, 0x0ef10a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpscr"},
321 {FPU_VFP_EXT_V1xD, 0x0ef60a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr1"},
322 {FPU_VFP_EXT_V1xD, 0x0ef70a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr0"},
323 {FPU_VFP_EXT_V1xD, 0x0ef80a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpexc"},
324 {FPU_VFP_EXT_V1xD, 0x0ef90a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst\t@ Impl def"},
325 {FPU_VFP_EXT_V1xD, 0x0efa0a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst2\t@ Impl def"},
326 {FPU_VFP_EXT_V1, 0x0e000b10, 0x0ff00fff, "fmdlr%c\t%z2, %12-15r"},
327 {FPU_VFP_EXT_V1, 0x0e100b10, 0x0ff00fff, "fmrdl%c\t%12-15r, %z2"},
328 {FPU_VFP_EXT_V1, 0x0e200b10, 0x0ff00fff, "fmdhr%c\t%z2, %12-15r"},
329 {FPU_VFP_EXT_V1, 0x0e300b10, 0x0ff00fff, "fmrdh%c\t%12-15r, %z2"},
330 {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0ff00fff, "fmxr%c\t<impl def %16-19x>, %12-15r"},
331 {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0ff00fff, "fmrx%c\t%12-15r, <impl def %16-19x>"},
332 {FPU_VFP_EXT_V1xD, 0x0e000a10, 0x0ff00f7f, "fmsr%c\t%y2, %12-15r"},
333 {FPU_VFP_EXT_V1xD, 0x0e100a10, 0x0ff00f7f, "fmrs%c\t%12-15r, %y2"},
334 {FPU_VFP_EXT_V1xD, 0x0eb50a40, 0x0fbf0f70, "fcmp%7'ezs%c\t%y1"},
335 {FPU_VFP_EXT_V1, 0x0eb50b40, 0x0fbf0f70, "fcmp%7'ezd%c\t%z1"},
336 {FPU_VFP_EXT_V1xD, 0x0eb00a40, 0x0fbf0fd0, "fcpys%c\t%y1, %y0"},
337 {FPU_VFP_EXT_V1xD, 0x0eb00ac0, 0x0fbf0fd0, "fabss%c\t%y1, %y0"},
338 {FPU_VFP_EXT_V1, 0x0eb00b40, 0x0fbf0fd0, "fcpyd%c\t%z1, %z0"},
339 {FPU_VFP_EXT_V1, 0x0eb00bc0, 0x0fbf0fd0, "fabsd%c\t%z1, %z0"},
340 {FPU_VFP_EXT_V1xD, 0x0eb10a40, 0x0fbf0fd0, "fnegs%c\t%y1, %y0"},
341 {FPU_VFP_EXT_V1xD, 0x0eb10ac0, 0x0fbf0fd0, "fsqrts%c\t%y1, %y0"},
342 {FPU_VFP_EXT_V1, 0x0eb10b40, 0x0fbf0fd0, "fnegd%c\t%z1, %z0"},
343 {FPU_VFP_EXT_V1, 0x0eb10bc0, 0x0fbf0fd0, "fsqrtd%c\t%z1, %z0"},
344 {FPU_VFP_EXT_V1, 0x0eb70ac0, 0x0fbf0fd0, "fcvtds%c\t%z1, %y0"},
345 {FPU_VFP_EXT_V1, 0x0eb70bc0, 0x0fbf0fd0, "fcvtsd%c\t%y1, %z0"},
346 {FPU_VFP_EXT_V1xD, 0x0eb80a40, 0x0fbf0fd0, "fuitos%c\t%y1, %y0"},
347 {FPU_VFP_EXT_V1xD, 0x0eb80ac0, 0x0fbf0fd0, "fsitos%c\t%y1, %y0"},
348 {FPU_VFP_EXT_V1, 0x0eb80b40, 0x0fbf0fd0, "fuitod%c\t%z1, %y0"},
349 {FPU_VFP_EXT_V1, 0x0eb80bc0, 0x0fbf0fd0, "fsitod%c\t%z1, %y0"},
350 {FPU_VFP_EXT_V1xD, 0x0eb40a40, 0x0fbf0f50, "fcmp%7'es%c\t%y1, %y0"},
351 {FPU_VFP_EXT_V1, 0x0eb40b40, 0x0fbf0f50, "fcmp%7'ed%c\t%z1, %z0"},
352 {FPU_VFP_EXT_V3, 0x0eba0a40, 0x0fbe0f50, "f%16?us%7?lhtos%c\t%y1, #%5,0-3k"},
353 {FPU_VFP_EXT_V3, 0x0eba0b40, 0x0fbe0f50, "f%16?us%7?lhtod%c\t%z1, #%5,0-3k"},
354 {FPU_VFP_EXT_V1xD, 0x0ebc0a40, 0x0fbe0f50, "fto%16?sui%7'zs%c\t%y1, %y0"},
355 {FPU_VFP_EXT_V1, 0x0ebc0b40, 0x0fbe0f50, "fto%16?sui%7'zd%c\t%y1, %z0"},
356 {FPU_VFP_EXT_V3, 0x0ebe0a40, 0x0fbe0f50, "fto%16?us%7?lhs%c\t%y1, #%5,0-3k"},
357 {FPU_VFP_EXT_V3, 0x0ebe0b40, 0x0fbe0f50, "fto%16?us%7?lhd%c\t%z1, #%5,0-3k"},
358 {FPU_VFP_EXT_V1, 0x0c500b10, 0x0fb00ff0, "fmrrd%c\t%12-15r, %16-19r, %z0"},
359 {FPU_VFP_EXT_V3, 0x0eb00a00, 0x0fb00ff0, "fconsts%c\t%y1, #%0-3,16-19d"},
360 {FPU_VFP_EXT_V3, 0x0eb00b00, 0x0fb00ff0, "fconstd%c\t%z1, #%0-3,16-19d"},
361 {FPU_VFP_EXT_V2, 0x0c400a10, 0x0ff00fd0, "fmsrr%c\t%y4, %12-15r, %16-19r"},
362 {FPU_VFP_EXT_V2, 0x0c400b10, 0x0ff00fd0, "fmdrr%c\t%z0, %12-15r, %16-19r"},
363 {FPU_VFP_EXT_V2, 0x0c500a10, 0x0ff00fd0, "fmrrs%c\t%12-15r, %16-19r, %y4"},
364 {FPU_VFP_EXT_V1xD, 0x0e000a00, 0x0fb00f50, "fmacs%c\t%y1, %y2, %y0"},
365 {FPU_VFP_EXT_V1xD, 0x0e000a40, 0x0fb00f50, "fnmacs%c\t%y1, %y2, %y0"},
366 {FPU_VFP_EXT_V1, 0x0e000b00, 0x0fb00f50, "fmacd%c\t%z1, %z2, %z0"},
367 {FPU_VFP_EXT_V1, 0x0e000b40, 0x0fb00f50, "fnmacd%c\t%z1, %z2, %z0"},
368 {FPU_VFP_EXT_V1xD, 0x0e100a00, 0x0fb00f50, "fmscs%c\t%y1, %y2, %y0"},
369 {FPU_VFP_EXT_V1xD, 0x0e100a40, 0x0fb00f50, "fnmscs%c\t%y1, %y2, %y0"},
370 {FPU_VFP_EXT_V1, 0x0e100b00, 0x0fb00f50, "fmscd%c\t%z1, %z2, %z0"},
371 {FPU_VFP_EXT_V1, 0x0e100b40, 0x0fb00f50, "fnmscd%c\t%z1, %z2, %z0"},
372 {FPU_VFP_EXT_V1xD, 0x0e200a00, 0x0fb00f50, "fmuls%c\t%y1, %y2, %y0"},
373 {FPU_VFP_EXT_V1xD, 0x0e200a40, 0x0fb00f50, "fnmuls%c\t%y1, %y2, %y0"},
374 {FPU_VFP_EXT_V1, 0x0e200b00, 0x0fb00f50, "fmuld%c\t%z1, %z2, %z0"},
375 {FPU_VFP_EXT_V1, 0x0e200b40, 0x0fb00f50, "fnmuld%c\t%z1, %z2, %z0"},
376 {FPU_VFP_EXT_V1xD, 0x0e300a00, 0x0fb00f50, "fadds%c\t%y1, %y2, %y0"},
377 {FPU_VFP_EXT_V1xD, 0x0e300a40, 0x0fb00f50, "fsubs%c\t%y1, %y2, %y0"},
378 {FPU_VFP_EXT_V1, 0x0e300b00, 0x0fb00f50, "faddd%c\t%z1, %z2, %z0"},
379 {FPU_VFP_EXT_V1, 0x0e300b40, 0x0fb00f50, "fsubd%c\t%z1, %z2, %z0"},
380 {FPU_VFP_EXT_V1xD, 0x0e800a00, 0x0fb00f50, "fdivs%c\t%y1, %y2, %y0"},
381 {FPU_VFP_EXT_V1, 0x0e800b00, 0x0fb00f50, "fdivd%c\t%z1, %z2, %z0"},
382 {FPU_VFP_EXT_V1xD, 0x0d200a00, 0x0fb00f00, "fstmdbs%c\t%16-19r!, %y3"},
383 {FPU_VFP_EXT_V1xD, 0x0d200b00, 0x0fb00f00, "fstmdb%0?xd%c\t%16-19r!, %z3"},
384 {FPU_VFP_EXT_V1xD, 0x0d300a00, 0x0fb00f00, "fldmdbs%c\t%16-19r!, %y3"},
385 {FPU_VFP_EXT_V1xD, 0x0d300b00, 0x0fb00f00, "fldmdb%0?xd%c\t%16-19r!, %z3"},
386 {FPU_VFP_EXT_V1xD, 0x0d000a00, 0x0f300f00, "fsts%c\t%y1, %A"},
387 {FPU_VFP_EXT_V1, 0x0d000b00, 0x0f300f00, "fstd%c\t%z1, %A"},
388 {FPU_VFP_EXT_V1xD, 0x0d100a00, 0x0f300f00, "flds%c\t%y1, %A"},
389 {FPU_VFP_EXT_V1, 0x0d100b00, 0x0f300f00, "fldd%c\t%z1, %A"},
390 {FPU_VFP_EXT_V1xD, 0x0c800a00, 0x0f900f00, "fstmias%c\t%16-19r%21'!, %y3"},
391 {FPU_VFP_EXT_V1xD, 0x0c800b00, 0x0f900f00, "fstmia%0?xd%c\t%16-19r%21'!, %z3"},
392 {FPU_VFP_EXT_V1xD, 0x0c900a00, 0x0f900f00, "fldmias%c\t%16-19r%21'!, %y3"},
393 {FPU_VFP_EXT_V1xD, 0x0c900b00, 0x0f900f00, "fldmia%0?xd%c\t%16-19r%21'!, %z3"},
394
395
396 {ARM_CEXT_MAVERICK, 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
397 {ARM_CEXT_MAVERICK, 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
398 {ARM_CEXT_MAVERICK, 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
399 {ARM_CEXT_MAVERICK, 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
400 {ARM_CEXT_MAVERICK, 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
401 {ARM_CEXT_MAVERICK, 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
402 {ARM_CEXT_MAVERICK, 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
403 {ARM_CEXT_MAVERICK, 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
404 {ARM_CEXT_MAVERICK, 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
405 {ARM_CEXT_MAVERICK, 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
406 {ARM_CEXT_MAVERICK, 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
407 {ARM_CEXT_MAVERICK, 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
408 {ARM_CEXT_MAVERICK, 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
409 {ARM_CEXT_MAVERICK, 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
410 {ARM_CEXT_MAVERICK, 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
411 {ARM_CEXT_MAVERICK, 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
412 {ARM_CEXT_MAVERICK, 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
413 {ARM_CEXT_MAVERICK, 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
414 {ARM_CEXT_MAVERICK, 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
415 {ARM_CEXT_MAVERICK, 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
416 {ARM_CEXT_MAVERICK, 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
417 {ARM_CEXT_MAVERICK, 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
418 {ARM_CEXT_MAVERICK, 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
419 {ARM_CEXT_MAVERICK, 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
420 {ARM_CEXT_MAVERICK, 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
421 {ARM_CEXT_MAVERICK, 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
422 {ARM_CEXT_MAVERICK, 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
423 {ARM_CEXT_MAVERICK, 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
424 {ARM_CEXT_MAVERICK, 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
425 {ARM_CEXT_MAVERICK, 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
426 {ARM_CEXT_MAVERICK, 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
427 {ARM_CEXT_MAVERICK, 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
428 {ARM_CEXT_MAVERICK, 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
429 {ARM_CEXT_MAVERICK, 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
430 {ARM_CEXT_MAVERICK, 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
431 {ARM_CEXT_MAVERICK, 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
432 {ARM_CEXT_MAVERICK, 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
433 {ARM_CEXT_MAVERICK, 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
434 {ARM_CEXT_MAVERICK, 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
435 {ARM_CEXT_MAVERICK, 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
436 {ARM_CEXT_MAVERICK, 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
437 {ARM_CEXT_MAVERICK, 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
438 {ARM_CEXT_MAVERICK, 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
439 {ARM_CEXT_MAVERICK, 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
440 {ARM_CEXT_MAVERICK, 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
441 {ARM_CEXT_MAVERICK, 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
442 {ARM_CEXT_MAVERICK, 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
443 {ARM_CEXT_MAVERICK, 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
444 {ARM_CEXT_MAVERICK, 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
445 {ARM_CEXT_MAVERICK, 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
446 {ARM_CEXT_MAVERICK, 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
447 {ARM_CEXT_MAVERICK, 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
448 {ARM_CEXT_MAVERICK, 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
449 {ARM_CEXT_MAVERICK, 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
450 {ARM_CEXT_MAVERICK, 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
451 {ARM_CEXT_MAVERICK, 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
452 {ARM_CEXT_MAVERICK, 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
453 {ARM_CEXT_MAVERICK, 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
454 {ARM_CEXT_MAVERICK, 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
455 {ARM_CEXT_MAVERICK, 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
456 {ARM_CEXT_MAVERICK, 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
457 {ARM_CEXT_MAVERICK, 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
458 {ARM_CEXT_MAVERICK, 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
459 {ARM_CEXT_MAVERICK, 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
460 {ARM_CEXT_MAVERICK, 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
461 {ARM_CEXT_MAVERICK, 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
462 {ARM_CEXT_MAVERICK, 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
463 {ARM_CEXT_MAVERICK, 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
464 {ARM_CEXT_MAVERICK, 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
465 {ARM_CEXT_MAVERICK, 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
466 {ARM_CEXT_MAVERICK, 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
467 {ARM_CEXT_MAVERICK, 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
468 {ARM_CEXT_MAVERICK, 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
469 {ARM_CEXT_MAVERICK, 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
470 {ARM_CEXT_MAVERICK, 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
471 {ARM_CEXT_MAVERICK, 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
472 {ARM_CEXT_MAVERICK, 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
473 {ARM_CEXT_MAVERICK, 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
474 {ARM_CEXT_MAVERICK, 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
475 {ARM_CEXT_MAVERICK, 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
476 {ARM_CEXT_MAVERICK, 0x0e000600, 0x0ff00f10, "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
477 {ARM_CEXT_MAVERICK, 0x0e100600, 0x0ff00f10, "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
478 {ARM_CEXT_MAVERICK, 0x0e200600, 0x0ff00f10, "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
479 {ARM_CEXT_MAVERICK, 0x0e300600, 0x0ff00f10, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
480
481
482 {ARM_EXT_V2, 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
483 {ARM_EXT_V2, 0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
484 {ARM_EXT_V2, 0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
485 {ARM_EXT_V2, 0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
486 {ARM_EXT_V2, 0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
487 {ARM_EXT_V2, 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
488 {ARM_EXT_V2, 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
489
490
491 {ARM_EXT_V6, 0xfc500000, 0xfff00000, "mrrc2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
492 {ARM_EXT_V6, 0xfc400000, 0xfff00000, "mcrr2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
493
494
495 {ARM_EXT_V5, 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
496 {ARM_EXT_V5, 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
497 {ARM_EXT_V5, 0xfe000000, 0xff000010, "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
498 {ARM_EXT_V5, 0xfe000010, 0xff100010, "mcr2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
499 {ARM_EXT_V5, 0xfe100010, 0xff100010, "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
500
501 {0, 0, 0, 0}
502};
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534static const struct opcode32 neon_opcodes[] =
535{
536
537 {FPU_NEON_EXT_V1, 0xf2b00840, 0xffb00850, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
538 {FPU_NEON_EXT_V1, 0xf2b00000, 0xffb00810, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
539
540
541 {FPU_NEON_EXT_V1, 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
542 {FPU_NEON_EXT_V1, 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
543 {FPU_NEON_EXT_V1, 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
544
545
546 {FPU_NEON_EXT_V1, 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
547 {FPU_NEON_EXT_V1, 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
548
549
550 {FPU_NEON_EXT_V1, 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
551 {FPU_NEON_EXT_V1, 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
552 {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
553 {FPU_NEON_EXT_V1, 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
554 {FPU_NEON_EXT_V1, 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
555 {FPU_NEON_EXT_V1, 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
556 {FPU_NEON_EXT_V1, 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
557 {FPU_NEON_EXT_V1, 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
558 {FPU_NEON_EXT_V1, 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
559 {FPU_NEON_EXT_V1, 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
560 {FPU_NEON_EXT_V1, 0xf3b20300, 0xffb30fd0, "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
561 {FPU_NEON_EXT_V1, 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
562 {FPU_NEON_EXT_V1, 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
563 {FPU_NEON_EXT_V1, 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
564 {FPU_NEON_EXT_V1, 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
565 {FPU_NEON_EXT_V1, 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
566 {FPU_NEON_EXT_V1, 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
567 {FPU_NEON_EXT_V1, 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
568 {FPU_NEON_EXT_V1, 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
569 {FPU_NEON_EXT_V1, 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
570 {FPU_NEON_EXT_V1, 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
571 {FPU_NEON_EXT_V1, 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
572 {FPU_NEON_EXT_V1, 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
573 {FPU_NEON_EXT_V1, 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
574 {FPU_NEON_EXT_V1, 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
575 {FPU_NEON_EXT_V1, 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
576 {FPU_NEON_EXT_V1, 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
577 {FPU_NEON_EXT_V1, 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
578 {FPU_NEON_EXT_V1, 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
579 {FPU_NEON_EXT_V1, 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
580 {FPU_NEON_EXT_V1, 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
581 {FPU_NEON_EXT_V1, 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
582 {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"},
583
584
585 {FPU_NEON_EXT_V1, 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
586 {FPU_NEON_EXT_V1, 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
587 {FPU_NEON_EXT_V1, 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
588 {FPU_NEON_EXT_V1, 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
589 {FPU_NEON_EXT_V1, 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
590 {FPU_NEON_EXT_V1, 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
591 {FPU_NEON_EXT_V1, 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
592 {FPU_NEON_EXT_V1, 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
593 {FPU_NEON_EXT_V1, 0xf2000d00, 0xffa00f10, "vadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
594 {FPU_NEON_EXT_V1, 0xf2000d10, 0xffa00f10, "vmla%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
595 {FPU_NEON_EXT_V1, 0xf2000e00, 0xffa00f10, "vceq%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
596 {FPU_NEON_EXT_V1, 0xf2000f00, 0xffa00f10, "vmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
597 {FPU_NEON_EXT_V1, 0xf2000f10, 0xffa00f10, "vrecps%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
598 {FPU_NEON_EXT_V1, 0xf2200d00, 0xffa00f10, "vsub%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
599 {FPU_NEON_EXT_V1, 0xf2200d10, 0xffa00f10, "vmls%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
600 {FPU_NEON_EXT_V1, 0xf2200f00, 0xffa00f10, "vmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
601 {FPU_NEON_EXT_V1, 0xf2200f10, 0xffa00f10, "vrsqrts%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
602 {FPU_NEON_EXT_V1, 0xf3000d00, 0xffa00f10, "vpadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
603 {FPU_NEON_EXT_V1, 0xf3000d10, 0xffa00f10, "vmul%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
604 {FPU_NEON_EXT_V1, 0xf3000e00, 0xffa00f10, "vcge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
605 {FPU_NEON_EXT_V1, 0xf3000e10, 0xffa00f10, "vacge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
606 {FPU_NEON_EXT_V1, 0xf3000f00, 0xffa00f10, "vpmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
607 {FPU_NEON_EXT_V1, 0xf3200d00, 0xffa00f10, "vabd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
608 {FPU_NEON_EXT_V1, 0xf3200e00, 0xffa00f10, "vcgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
609 {FPU_NEON_EXT_V1, 0xf3200e10, 0xffa00f10, "vacgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
610 {FPU_NEON_EXT_V1, 0xf3200f00, 0xffa00f10, "vpmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
611 {FPU_NEON_EXT_V1, 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
612 {FPU_NEON_EXT_V1, 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
613 {FPU_NEON_EXT_V1, 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
614 {FPU_NEON_EXT_V1, 0xf2000b00, 0xff800f10, "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
615 {FPU_NEON_EXT_V1, 0xf2000b10, 0xff800f10, "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
616 {FPU_NEON_EXT_V1, 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
617 {FPU_NEON_EXT_V1, 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
618 {FPU_NEON_EXT_V1, 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
619 {FPU_NEON_EXT_V1, 0xf3000b00, 0xff800f10, "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
620 {FPU_NEON_EXT_V1, 0xf2000000, 0xfe800f10, "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
621 {FPU_NEON_EXT_V1, 0xf2000010, 0xfe800f10, "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
622 {FPU_NEON_EXT_V1, 0xf2000100, 0xfe800f10, "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
623 {FPU_NEON_EXT_V1, 0xf2000200, 0xfe800f10, "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
624 {FPU_NEON_EXT_V1, 0xf2000210, 0xfe800f10, "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
625 {FPU_NEON_EXT_V1, 0xf2000300, 0xfe800f10, "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
626 {FPU_NEON_EXT_V1, 0xf2000310, 0xfe800f10, "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
627 {FPU_NEON_EXT_V1, 0xf2000400, 0xfe800f10, "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
628 {FPU_NEON_EXT_V1, 0xf2000410, 0xfe800f10, "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
629 {FPU_NEON_EXT_V1, 0xf2000500, 0xfe800f10, "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
630 {FPU_NEON_EXT_V1, 0xf2000510, 0xfe800f10, "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
631 {FPU_NEON_EXT_V1, 0xf2000600, 0xfe800f10, "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
632 {FPU_NEON_EXT_V1, 0xf2000610, 0xfe800f10, "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
633 {FPU_NEON_EXT_V1, 0xf2000700, 0xfe800f10, "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
634 {FPU_NEON_EXT_V1, 0xf2000710, 0xfe800f10, "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
635 {FPU_NEON_EXT_V1, 0xf2000910, 0xfe800f10, "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
636 {FPU_NEON_EXT_V1, 0xf2000a00, 0xfe800f10, "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
637 {FPU_NEON_EXT_V1, 0xf2000a10, 0xfe800f10, "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
638
639
640 {FPU_NEON_EXT_V1, 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
641 {FPU_NEON_EXT_V1, 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
642 {FPU_NEON_EXT_V1, 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
643 {FPU_NEON_EXT_V1, 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
644 {FPU_NEON_EXT_V1, 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
645 {FPU_NEON_EXT_V1, 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
646 {FPU_NEON_EXT_V1, 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
647 {FPU_NEON_EXT_V1, 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
648 {FPU_NEON_EXT_V1, 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
649 {FPU_NEON_EXT_V1, 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
650 {FPU_NEON_EXT_V1, 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
651 {FPU_NEON_EXT_V1, 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
652 {FPU_NEON_EXT_V1, 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
653
654
655 {FPU_NEON_EXT_V1, 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
656 {FPU_NEON_EXT_V1, 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
657 {FPU_NEON_EXT_V1, 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
658 {FPU_NEON_EXT_V1, 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
659 {FPU_NEON_EXT_V1, 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
660 {FPU_NEON_EXT_V1, 0xf2880950, 0xfeb80fd0, "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
661 {FPU_NEON_EXT_V1, 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22D, %0-3,5Q, #%16-18d"},
662 {FPU_NEON_EXT_V1, 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
663 {FPU_NEON_EXT_V1, 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
664 {FPU_NEON_EXT_V1, 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
665 {FPU_NEON_EXT_V1, 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
666 {FPU_NEON_EXT_V1, 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
667 {FPU_NEON_EXT_V1, 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
668 {FPU_NEON_EXT_V1, 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
669 {FPU_NEON_EXT_V1, 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
670 {FPU_NEON_EXT_V1, 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
671 {FPU_NEON_EXT_V1, 0xf2900950, 0xfeb00fd0, "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
672 {FPU_NEON_EXT_V1, 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-19d"},
673 {FPU_NEON_EXT_V1, 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
674 {FPU_NEON_EXT_V1, 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
675 {FPU_NEON_EXT_V1, 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
676 {FPU_NEON_EXT_V1, 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
677 {FPU_NEON_EXT_V1, 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
678 {FPU_NEON_EXT_V1, 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
679 {FPU_NEON_EXT_V1, 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
680 {FPU_NEON_EXT_V1, 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
681 {FPU_NEON_EXT_V1, 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
682 {FPU_NEON_EXT_V1, 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
683 {FPU_NEON_EXT_V1, 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
684 {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-20d"},
685 {FPU_NEON_EXT_V1, 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
686 {FPU_NEON_EXT_V1, 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
687 {FPU_NEON_EXT_V1, 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
688 {FPU_NEON_EXT_V1, 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
689 {FPU_NEON_EXT_V1, 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
690 {FPU_NEON_EXT_V1, 0xf2800810, 0xfec00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
691 {FPU_NEON_EXT_V1, 0xf2800850, 0xfec00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
692 {FPU_NEON_EXT_V1, 0xf2800910, 0xfec00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
693 {FPU_NEON_EXT_V1, 0xf2800950, 0xfec00fd0, "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
694 {FPU_NEON_EXT_V1, 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
695 {FPU_NEON_EXT_V1, 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
696 {FPU_NEON_EXT_V1, 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
697 {FPU_NEON_EXT_V1, 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
698 {FPU_NEON_EXT_V1, 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
699 {FPU_NEON_EXT_V1, 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
700 {FPU_NEON_EXT_V1, 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
701 {FPU_NEON_EXT_V1, 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
702 {FPU_NEON_EXT_V1, 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
703 {FPU_NEON_EXT_V1, 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
704 {FPU_NEON_EXT_V1, 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
705 {FPU_NEON_EXT_V1, 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
706 {FPU_NEON_EXT_V1, 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
707 {FPU_NEON_EXT_V1, 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
708 {FPU_NEON_EXT_V1, 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
709 {FPU_NEON_EXT_V1, 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
710 {FPU_NEON_EXT_V1, 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
711 {FPU_NEON_EXT_V1, 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
712 {FPU_NEON_EXT_V1, 0xf2a00e10, 0xfea00e90, "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
713
714
715 {FPU_NEON_EXT_V1, 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
716 {FPU_NEON_EXT_V1, 0xf2800400, 0xff800f50, "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
717 {FPU_NEON_EXT_V1, 0xf2800600, 0xff800f50, "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
718 {FPU_NEON_EXT_V1, 0xf2800900, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
719 {FPU_NEON_EXT_V1, 0xf2800b00, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
720 {FPU_NEON_EXT_V1, 0xf2800d00, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
721 {FPU_NEON_EXT_V1, 0xf3800400, 0xff800f50, "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
722 {FPU_NEON_EXT_V1, 0xf3800600, 0xff800f50, "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
723 {FPU_NEON_EXT_V1, 0xf2800000, 0xfe800f50, "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
724 {FPU_NEON_EXT_V1, 0xf2800100, 0xfe800f50, "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
725 {FPU_NEON_EXT_V1, 0xf2800200, 0xfe800f50, "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
726 {FPU_NEON_EXT_V1, 0xf2800300, 0xfe800f50, "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
727 {FPU_NEON_EXT_V1, 0xf2800500, 0xfe800f50, "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
728 {FPU_NEON_EXT_V1, 0xf2800700, 0xfe800f50, "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
729 {FPU_NEON_EXT_V1, 0xf2800800, 0xfe800f50, "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
730 {FPU_NEON_EXT_V1, 0xf2800a00, 0xfe800f50, "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
731 {FPU_NEON_EXT_V1, 0xf2800c00, 0xfe800f50, "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
732
733
734 {FPU_NEON_EXT_V1, 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
735 {FPU_NEON_EXT_V1, 0xf2800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
736 {FPU_NEON_EXT_V1, 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
737 {FPU_NEON_EXT_V1, 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
738 {FPU_NEON_EXT_V1, 0xf2800540, 0xff800f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
739 {FPU_NEON_EXT_V1, 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
740 {FPU_NEON_EXT_V1, 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
741 {FPU_NEON_EXT_V1, 0xf2800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
742 {FPU_NEON_EXT_V1, 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
743 {FPU_NEON_EXT_V1, 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
744 {FPU_NEON_EXT_V1, 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
745 {FPU_NEON_EXT_V1, 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
746 {FPU_NEON_EXT_V1, 0xf3800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
747 {FPU_NEON_EXT_V1, 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
748 {FPU_NEON_EXT_V1, 0xf3800540, 0xff800f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
749 {FPU_NEON_EXT_V1, 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
750 {FPU_NEON_EXT_V1, 0xf3800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
751 {FPU_NEON_EXT_V1, 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
752 {FPU_NEON_EXT_V1, 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
753 {FPU_NEON_EXT_V1, 0xf2800240, 0xfe800f50, "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
754 {FPU_NEON_EXT_V1, 0xf2800640, 0xfe800f50, "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
755 {FPU_NEON_EXT_V1, 0xf2800a40, 0xfe800f50, "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
756
757
758 {FPU_NEON_EXT_V1, 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
759 {FPU_NEON_EXT_V1, 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
760 {FPU_NEON_EXT_V1, 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
761 {FPU_NEON_EXT_V1, 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
762 {FPU_NEON_EXT_V1, 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
763 {FPU_NEON_EXT_V1, 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
764 {FPU_NEON_EXT_V1, 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
765 {FPU_NEON_EXT_V1, 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
766 {FPU_NEON_EXT_V1, 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
767 {FPU_NEON_EXT_V1, 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
768 {FPU_NEON_EXT_V1, 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
769 {FPU_NEON_EXT_V1, 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
770 {FPU_NEON_EXT_V1, 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
771 {FPU_NEON_EXT_V1, 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
772 {FPU_NEON_EXT_V1, 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
773 {FPU_NEON_EXT_V1, 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
774 {FPU_NEON_EXT_V1, 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
775 {FPU_NEON_EXT_V1, 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
776 {FPU_NEON_EXT_V1, 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
777
778 {0,0 ,0, 0}
779};
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816static const struct opcode32 arm_opcodes[] =
817{
818
819 {ARM_EXT_V1, 0xe1a00000, 0xffffffff, "nop\t\t\t(mov r0,r0)"},
820 {ARM_EXT_V4T | ARM_EXT_V5, 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
821 {ARM_EXT_V2, 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19r, %0-3r, %8-11r"},
822 {ARM_EXT_V2, 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
823 {ARM_EXT_V2S, 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15r, %0-3r, [%16-19r]"},
824 {ARM_EXT_V3M, 0x00800090, 0x0fa000f0, "%22?sumull%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
825 {ARM_EXT_V3M, 0x00a00090, 0x0fa000f0, "%22?sumlal%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
826
827
828 {ARM_EXT_V7, 0xf450f000, 0xfd70f000, "pli\t%P"},
829 {ARM_EXT_V7, 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
830 {ARM_EXT_V7, 0xf57ff050, 0xfffffff0, "dmb\t%U"},
831 {ARM_EXT_V7, 0xf57ff040, 0xfffffff0, "dsb\t%U"},
832 {ARM_EXT_V7, 0xf57ff060, 0xfffffff0, "isb\t%U"},
833
834
835 {ARM_EXT_V6T2, 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15r, %E"},
836 {ARM_EXT_V6T2, 0x07c00010, 0x0fe00070, "bfi%c\t%12-15r, %0-3r, %E"},
837 {ARM_EXT_V6T2, 0x00600090, 0x0ff000f0, "mls%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
838 {ARM_EXT_V6T2, 0x006000b0, 0x0f7000f0, "strht%c\t%12-15r, %s"},
839 {ARM_EXT_V6T2, 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15r, %s"},
840 {ARM_EXT_V6T2, 0x03000000, 0x0ff00000, "movw%c\t%12-15r, %V"},
841 {ARM_EXT_V6T2, 0x03400000, 0x0ff00000, "movt%c\t%12-15r, %V"},
842 {ARM_EXT_V6T2, 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15r, %0-3r"},
843 {ARM_EXT_V6T2, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
844
845
846 {ARM_EXT_V6Z, 0x01600070, 0x0ff000f0, "smc%c\t%e"},
847
848
849 {ARM_EXT_V6K, 0xf57ff01f, 0xffffffff, "clrex"},
850 {ARM_EXT_V6K, 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15r, [%16-19r]"},
851 {ARM_EXT_V6K, 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19r]"},
852 {ARM_EXT_V6K, 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15r, [%16-19r]"},
853 {ARM_EXT_V6K, 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15r, %0-3r, [%16-19r]"},
854 {ARM_EXT_V6K, 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15r, %0-3r, [%16-19r]"},
855 {ARM_EXT_V6K, 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15r, %0-3r, [%16-19r]"},
856
857
858 {ARM_EXT_V6K, 0x0320f001, 0x0fffffff, "yield%c"},
859 {ARM_EXT_V6K, 0x0320f002, 0x0fffffff, "wfe%c"},
860 {ARM_EXT_V6K, 0x0320f003, 0x0fffffff, "wfi%c"},
861 {ARM_EXT_V6K, 0x0320f004, 0x0fffffff, "sev%c"},
862 {ARM_EXT_V6K, 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
863
864
865 {ARM_EXT_V6, 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
866 {ARM_EXT_V6, 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
867 {ARM_EXT_V6, 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
868 {ARM_EXT_V6, 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
869 {ARM_EXT_V6, 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
870 {ARM_EXT_V6, 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15r, %16-19r, %0-3r"},
871 {ARM_EXT_V6, 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15r, %16-19r, %0-3r, lsl #%7-11d"},
872 {ARM_EXT_V6, 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #32"},
873 {ARM_EXT_V6, 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #%7-11d"},
874 {ARM_EXT_V6, 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19r]"},
875 {ARM_EXT_V6, 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15r, %16-19r, %0-3r"},
876 {ARM_EXT_V6, 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15r, %16-19r, %0-3r"},
877 {ARM_EXT_V6, 0x06200f30, 0x0ff00ff0, "qaddsubx%c\t%12-15r, %16-19r, %0-3r"},
878 {ARM_EXT_V6, 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15r, %16-19r, %0-3r"},
879 {ARM_EXT_V6, 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15r, %16-19r, %0-3r"},
880 {ARM_EXT_V6, 0x06200f50, 0x0ff00ff0, "qsubaddx%c\t%12-15r, %16-19r, %0-3r"},
881 {ARM_EXT_V6, 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15r, %16-19r, %0-3r"},
882 {ARM_EXT_V6, 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15r, %16-19r, %0-3r"},
883 {ARM_EXT_V6, 0x06100f30, 0x0ff00ff0, "saddaddx%c\t%12-15r, %16-19r, %0-3r"},
884 {ARM_EXT_V6, 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15r, %16-19r, %0-3r"},
885 {ARM_EXT_V6, 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15r, %16-19r, %0-3r"},
886 {ARM_EXT_V6, 0x06300f30, 0x0ff00ff0, "shaddsubx%c\t%12-15r, %16-19r, %0-3r"},
887 {ARM_EXT_V6, 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15r, %16-19r, %0-3r"},
888 {ARM_EXT_V6, 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15r, %16-19r, %0-3r"},
889 {ARM_EXT_V6, 0x06300f50, 0x0ff00ff0, "shsubaddx%c\t%12-15r, %16-19r, %0-3r"},
890 {ARM_EXT_V6, 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15r, %16-19r, %0-3r"},
891 {ARM_EXT_V6, 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15r, %16-19r, %0-3r"},
892 {ARM_EXT_V6, 0x06100f50, 0x0ff00ff0, "ssubaddx%c\t%12-15r, %16-19r, %0-3r"},
893 {ARM_EXT_V6, 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15r, %16-19r, %0-3r"},
894 {ARM_EXT_V6, 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15r, %16-19r, %0-3r"},
895 {ARM_EXT_V6, 0x06500f30, 0x0ff00ff0, "uaddsubx%c\t%12-15r, %16-19r, %0-3r"},
896 {ARM_EXT_V6, 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15r, %16-19r, %0-3r"},
897 {ARM_EXT_V6, 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15r, %16-19r, %0-3r"},
898 {ARM_EXT_V6, 0x06700f30, 0x0ff00ff0, "uhaddsubx%c\t%12-15r, %16-19r, %0-3r"},
899 {ARM_EXT_V6, 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15r, %16-19r, %0-3r"},
900 {ARM_EXT_V6, 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15r, %16-19r, %0-3r"},
901 {ARM_EXT_V6, 0x06700f50, 0x0ff00ff0, "uhsubaddx%c\t%12-15r, %16-19r, %0-3r"},
902 {ARM_EXT_V6, 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15r, %16-19r, %0-3r"},
903 {ARM_EXT_V6, 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15r, %16-19r, %0-3r"},
904 {ARM_EXT_V6, 0x06600f30, 0x0ff00ff0, "uqaddsubx%c\t%12-15r, %16-19r, %0-3r"},
905 {ARM_EXT_V6, 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15r, %16-19r, %0-3r"},
906 {ARM_EXT_V6, 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15r, %16-19r, %0-3r"},
907 {ARM_EXT_V6, 0x06600f50, 0x0ff00ff0, "uqsubaddx%c\t%12-15r, %16-19r, %0-3r"},
908 {ARM_EXT_V6, 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15r, %16-19r, %0-3r"},
909 {ARM_EXT_V6, 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15r, %16-19r, %0-3r"},
910 {ARM_EXT_V6, 0x06500f50, 0x0ff00ff0, "usubaddx%c\t%12-15r, %16-19r, %0-3r"},
911 {ARM_EXT_V6, 0x06bf0f30, 0x0fff0ff0, "rev%c\t\%12-15r, %0-3r"},
912 {ARM_EXT_V6, 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t\%12-15r, %0-3r"},
913 {ARM_EXT_V6, 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t\%12-15r, %0-3r"},
914 {ARM_EXT_V6, 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t\%16-19r%21'!"},
915 {ARM_EXT_V6, 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r"},
916 {ARM_EXT_V6, 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #8"},
917 {ARM_EXT_V6, 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #16"},
918 {ARM_EXT_V6, 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #24"},
919 {ARM_EXT_V6, 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r"},
920 {ARM_EXT_V6, 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #8"},
921 {ARM_EXT_V6, 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #16"},
922 {ARM_EXT_V6, 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #24"},
923 {ARM_EXT_V6, 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r"},
924 {ARM_EXT_V6, 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #8"},
925 {ARM_EXT_V6, 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #16"},
926 {ARM_EXT_V6, 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #24"},
927 {ARM_EXT_V6, 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r"},
928 {ARM_EXT_V6, 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #8"},
929 {ARM_EXT_V6, 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #16"},
930 {ARM_EXT_V6, 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #24"},
931 {ARM_EXT_V6, 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r"},
932 {ARM_EXT_V6, 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #8"},
933 {ARM_EXT_V6, 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #16"},
934 {ARM_EXT_V6, 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #24"},
935 {ARM_EXT_V6, 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r"},
936 {ARM_EXT_V6, 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #8"},
937 {ARM_EXT_V6, 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #16"},
938 {ARM_EXT_V6, 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #24"},
939 {ARM_EXT_V6, 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r"},
940 {ARM_EXT_V6, 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
941 {ARM_EXT_V6, 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
942 {ARM_EXT_V6, 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
943 {ARM_EXT_V6, 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r"},
944 {ARM_EXT_V6, 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
945 {ARM_EXT_V6, 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
946 {ARM_EXT_V6, 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #24"},
947 {ARM_EXT_V6, 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r"},
948 {ARM_EXT_V6, 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
949 {ARM_EXT_V6, 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
950 {ARM_EXT_V6, 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
951 {ARM_EXT_V6, 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r"},
952 {ARM_EXT_V6, 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
953 {ARM_EXT_V6, 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
954 {ARM_EXT_V6, 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
955 {ARM_EXT_V6, 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r"},
956 {ARM_EXT_V6, 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
957 {ARM_EXT_V6, 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
958 {ARM_EXT_V6, 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
959 {ARM_EXT_V6, 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r"},
960 {ARM_EXT_V6, 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
961 {ARM_EXT_V6, 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
962 {ARM_EXT_V6, 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
963 {ARM_EXT_V6, 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15r, %16-19r, %0-3r"},
964 {ARM_EXT_V6, 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
965 {ARM_EXT_V6, 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19r, %0-3r, %8-11r"},
966 {ARM_EXT_V6, 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19r, %0-3r, %8-11r"},
967 {ARM_EXT_V6, 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
968 {ARM_EXT_V6, 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
969 {ARM_EXT_V6, 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
970 {ARM_EXT_V6, 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
971 {ARM_EXT_V6, 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19r, %0-3r, %8-11r"},
972 {ARM_EXT_V6, 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
973 {ARM_EXT_V6, 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
974 {ARM_EXT_V6, 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
975 {ARM_EXT_V6, 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15r, #%16-20W, %0-3r"},
976 {ARM_EXT_V6, 0x06a00010, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, lsl #%7-11d"},
977 {ARM_EXT_V6, 0x06a00050, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, asr #%7-11d"},
978 {ARM_EXT_V6, 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
979 {ARM_EXT_V6, 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15r, %0-3r, [%16-19r]"},
980 {ARM_EXT_V6, 0x00400090, 0x0ff000f0, "umaal%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
981 {ARM_EXT_V6, 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19r, %0-3r, %8-11r"},
982 {ARM_EXT_V6, 0x07800010, 0x0ff000f0, "usada8%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
983 {ARM_EXT_V6, 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15r, #%16-20d, %0-3r"},
984 {ARM_EXT_V6, 0x06e00010, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, lsl #%7-11d"},
985 {ARM_EXT_V6, 0x06e00050, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, asr #%7-11d"},
986 {ARM_EXT_V6, 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15r, #%16-19d, %0-3r"},
987
988
989 {ARM_EXT_V5J, 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3r"},
990
991
992 {ARM_EXT_V5, 0xe1200070, 0xfff000f0, "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
993 {ARM_EXT_V5, 0xfa000000, 0xfe000000, "blx\t%B"},
994 {ARM_EXT_V5, 0x012fff30, 0x0ffffff0, "blx%c\t%0-3r"},
995 {ARM_EXT_V5, 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15r, %0-3r"},
996
997
998 {ARM_EXT_V5E, 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
999 {ARM_EXT_V5E, 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
1000 {ARM_EXT_V5E, 0xf450f000, 0xfc70f000, "pld\t%a"},
1001 {ARM_EXT_V5ExP, 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1002 {ARM_EXT_V5ExP, 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1003 {ARM_EXT_V5ExP, 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1004 {ARM_EXT_V5ExP, 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1005
1006 {ARM_EXT_V5ExP, 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1007 {ARM_EXT_V5ExP, 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
1008
1009 {ARM_EXT_V5ExP, 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
1010 {ARM_EXT_V5ExP, 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
1011 {ARM_EXT_V5ExP, 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
1012 {ARM_EXT_V5ExP, 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
1013
1014 {ARM_EXT_V5ExP, 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19r, %0-3r, %8-11r"},
1015 {ARM_EXT_V5ExP, 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19r, %0-3r, %8-11r"},
1016 {ARM_EXT_V5ExP, 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19r, %0-3r, %8-11r"},
1017 {ARM_EXT_V5ExP, 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19r, %0-3r, %8-11r"},
1018
1019 {ARM_EXT_V5ExP, 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19r, %0-3r, %8-11r"},
1020 {ARM_EXT_V5ExP, 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19r, %0-3r, %8-11r"},
1021
1022 {ARM_EXT_V5ExP, 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15r, %0-3r, %16-19r"},
1023 {ARM_EXT_V5ExP, 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15r, %0-3r, %16-19r"},
1024 {ARM_EXT_V5ExP, 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15r, %0-3r, %16-19r"},
1025 {ARM_EXT_V5ExP, 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
1026
1027
1028 {ARM_EXT_V1, 0x00000090, 0x0e100090, "str%6's%5?hb%c\t%12-15r, %s"},
1029 {ARM_EXT_V1, 0x00100090, 0x0e100090, "ldr%6's%5?hb%c\t%12-15r, %s"},
1030 {ARM_EXT_V1, 0x00000000, 0x0de00000, "and%20's%c\t%12-15r, %16-19r, %o"},
1031 {ARM_EXT_V1, 0x00200000, 0x0de00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
1032 {ARM_EXT_V1, 0x00400000, 0x0de00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
1033 {ARM_EXT_V1, 0x00600000, 0x0de00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
1034 {ARM_EXT_V1, 0x00800000, 0x0de00000, "add%20's%c\t%12-15r, %16-19r, %o"},
1035 {ARM_EXT_V1, 0x00a00000, 0x0de00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
1036 {ARM_EXT_V1, 0x00c00000, 0x0de00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
1037 {ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
1038 {ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
1039 {ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
1040 {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%p%c\t%16-19r, %o"},
1041 {ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%p%c\t%16-19r, %o"},
1042 {ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%p%c\t%16-19r, %o"},
1043 {ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%p%c\t%16-19r, %o"},
1044 {ARM_EXT_V1, 0x01800000, 0x0de00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
1045 {ARM_EXT_V1, 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
1046 {ARM_EXT_V1, 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
1047 {ARM_EXT_V1, 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15r, %q"},
1048 {ARM_EXT_V1, 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15r, %q"},
1049 {ARM_EXT_V1, 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15r, %q"},
1050 {ARM_EXT_V1, 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
1051 {ARM_EXT_V1, 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15r, %q"},
1052 {ARM_EXT_V1, 0x01c00000, 0x0de00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
1053 {ARM_EXT_V1, 0x01e00000, 0x0de00000, "mvn%20's%c\t%12-15r, %o"},
1054 {ARM_EXT_V1, 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
1055 {ARM_EXT_V1, 0x04000000, 0x0e100000, "str%22'b%t%c\t%12-15r, %a"},
1056 {ARM_EXT_V1, 0x06000000, 0x0e100ff0, "str%22'b%t%c\t%12-15r, %a"},
1057 {ARM_EXT_V1, 0x04000000, 0x0c100010, "str%22'b%t%c\t%12-15r, %a"},
1058 {ARM_EXT_V1, 0x06000010, 0x0e000010, "undefined"},
1059 {ARM_EXT_V1, 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
1060 {ARM_EXT_V1, 0x04100000, 0x0c100000, "ldr%22'b%t%c\t%12-15r, %a"},
1061 {ARM_EXT_V1, 0x092d0000, 0x0fff0000, "push%c\t%m"},
1062 {ARM_EXT_V1, 0x08800000, 0x0ff00000, "stm%c\t%16-19r%21'!, %m%22'^"},
1063 {ARM_EXT_V1, 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
1064 {ARM_EXT_V1, 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
1065 {ARM_EXT_V1, 0x08900000, 0x0f900000, "ldm%c\t%16-19r%21'!, %m%22'^"},
1066 {ARM_EXT_V1, 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
1067 {ARM_EXT_V1, 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
1068 {ARM_EXT_V1, 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
1069
1070
1071 {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined instruction %0-31x"},
1072 {0, 0x00000000, 0x00000000, 0}
1073};
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101static const struct opcode16 thumb_opcodes[] =
1102{
1103
1104
1105
1106 {ARM_EXT_V6K, 0xbf00, 0xffff, "nop%c"},
1107 {ARM_EXT_V6K, 0xbf10, 0xffff, "yield%c"},
1108 {ARM_EXT_V6K, 0xbf20, 0xffff, "wfe%c"},
1109 {ARM_EXT_V6K, 0xbf30, 0xffff, "wfi%c"},
1110 {ARM_EXT_V6K, 0xbf40, 0xffff, "sev%c"},
1111 {ARM_EXT_V6K, 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
1112
1113
1114 {ARM_EXT_V6T2, 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
1115 {ARM_EXT_V6T2, 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
1116 {ARM_EXT_V6T2, 0xbf00, 0xff00, "it%I%X"},
1117
1118
1119 {ARM_EXT_V6, 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
1120 {ARM_EXT_V6, 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
1121 {ARM_EXT_V6, 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
1122 {ARM_EXT_V6, 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
1123 {ARM_EXT_V6, 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
1124 {ARM_EXT_V6, 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
1125 {ARM_EXT_V6, 0xb650, 0xfff7, "setend\t%3?ble%X"},
1126 {ARM_EXT_V6, 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
1127 {ARM_EXT_V6, 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
1128 {ARM_EXT_V6, 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
1129 {ARM_EXT_V6, 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
1130
1131
1132 {ARM_EXT_V5T, 0xbe00, 0xff00, "bkpt\t%0-7x"},
1133
1134 {ARM_EXT_V5T, 0x4780, 0xff87, "blx%c\t%3-6r%x"},
1135
1136 {ARM_EXT_V4T, 0x46C0, 0xFFFF, "nop%c\t\t\t(mov r8, r8)"},
1137
1138 {ARM_EXT_V4T, 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
1139 {ARM_EXT_V4T, 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
1140 {ARM_EXT_V4T, 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
1141 {ARM_EXT_V4T, 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
1142 {ARM_EXT_V4T, 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
1143 {ARM_EXT_V4T, 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
1144 {ARM_EXT_V4T, 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
1145 {ARM_EXT_V4T, 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
1146 {ARM_EXT_V4T, 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
1147 {ARM_EXT_V4T, 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
1148 {ARM_EXT_V4T, 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
1149 {ARM_EXT_V4T, 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
1150 {ARM_EXT_V4T, 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
1151 {ARM_EXT_V4T, 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
1152 {ARM_EXT_V4T, 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
1153 {ARM_EXT_V4T, 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
1154
1155 {ARM_EXT_V4T, 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
1156 {ARM_EXT_V4T, 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
1157
1158 {ARM_EXT_V4T, 0x4700, 0xFF80, "bx%c\t%S%x"},
1159 {ARM_EXT_V4T, 0x4400, 0xFF00, "add%c\t%D, %S"},
1160 {ARM_EXT_V4T, 0x4500, 0xFF00, "cmp%c\t%D, %S"},
1161 {ARM_EXT_V4T, 0x4600, 0xFF00, "mov%c\t%D, %S"},
1162
1163 {ARM_EXT_V4T, 0xB400, 0xFE00, "push%c\t%N"},
1164 {ARM_EXT_V4T, 0xBC00, 0xFE00, "pop%c\t%O"},
1165
1166 {ARM_EXT_V4T, 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
1167 {ARM_EXT_V4T, 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
1168 {ARM_EXT_V4T, 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
1169 {ARM_EXT_V4T, 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
1170
1171 {ARM_EXT_V4T, 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
1172 {ARM_EXT_V4T, 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
1173 {ARM_EXT_V4T, 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
1174
1175 {ARM_EXT_V4T, 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
1176 {ARM_EXT_V4T, 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
1177
1178 {ARM_EXT_V4T, 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
1179 {ARM_EXT_V4T, 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
1180 {ARM_EXT_V4T, 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
1181
1182 {ARM_EXT_V4T, 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
1183 {ARM_EXT_V4T, 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
1184 {ARM_EXT_V4T, 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
1185 {ARM_EXT_V4T, 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
1186
1187 {ARM_EXT_V4T, 0x4800, 0xF800, "ldr%c\t%8-10r, [pc, #%0-7W]\t(%0-7a)"},
1188
1189 {ARM_EXT_V4T, 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
1190 {ARM_EXT_V4T, 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
1191 {ARM_EXT_V4T, 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
1192 {ARM_EXT_V4T, 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
1193
1194 {ARM_EXT_V4T, 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
1195 {ARM_EXT_V4T, 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
1196
1197 {ARM_EXT_V4T, 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
1198 {ARM_EXT_V4T, 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
1199
1200 {ARM_EXT_V4T, 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t(adr %8-10r, %0-7a)"},
1201 {ARM_EXT_V4T, 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
1202
1203 {ARM_EXT_V4T, 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
1204 {ARM_EXT_V4T, 0xC800, 0xF800, "ldmia%c\t%8-10r!, %M"},
1205
1206 {ARM_EXT_V4T, 0xDF00, 0xFF00, "svc%c\t%0-7d"},
1207
1208 {ARM_EXT_V4T, 0xDE00, 0xFE00, "undefined"},
1209 {ARM_EXT_V4T, 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
1210
1211 {ARM_EXT_V4T, 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
1212
1213
1214
1215
1216
1217 {ARM_EXT_V1, 0x0000, 0x0000, "undefined"},
1218 {0, 0, 0, 0}
1219};
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268static const struct opcode32 thumb32_opcodes[] =
1269{
1270
1271 {ARM_EXT_V7, 0xf910f000, 0xff70f000, "pli%c\t%a"},
1272 {ARM_EXT_V7, 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
1273 {ARM_EXT_V7, 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
1274 {ARM_EXT_V7, 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
1275 {ARM_EXT_V7, 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
1276 {ARM_EXT_DIV, 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
1277 {ARM_EXT_DIV, 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
1278
1279
1280 {ARM_EXT_V6T2, 0xf3af8000, 0xffffffff, "nop%c.w"},
1281 {ARM_EXT_V6T2, 0xf3af8001, 0xffffffff, "yield%c.w"},
1282 {ARM_EXT_V6T2, 0xf3af8002, 0xffffffff, "wfe%c.w"},
1283 {ARM_EXT_V6T2, 0xf3af8003, 0xffffffff, "wfi%c.w"},
1284 {ARM_EXT_V6T2, 0xf3af9004, 0xffffffff, "sev%c.w"},
1285 {ARM_EXT_V6T2, 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
1286
1287 {ARM_EXT_V6T2, 0xf3bf8f2f, 0xffffffff, "clrex%c"},
1288 {ARM_EXT_V6T2, 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
1289 {ARM_EXT_V6T2, 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
1290 {ARM_EXT_V6T2, 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
1291 {ARM_EXT_V6T2, 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
1292 {ARM_EXT_V6T2, 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
1293 {ARM_EXT_V6T2, 0xf3ef8000, 0xffeff000, "mrs%c\t%8-11r, %D"},
1294 {ARM_EXT_V6T2, 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
1295 {ARM_EXT_V6T2, 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
1296 {ARM_EXT_V6T2, 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
1297 {ARM_EXT_V6T2, 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
1298 {ARM_EXT_V6T2, 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
1299 {ARM_EXT_V6T2, 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
1300 {ARM_EXT_V6T2, 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
1301 {ARM_EXT_V6T2, 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
1302 {ARM_EXT_V6T2, 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
1303 {ARM_EXT_V6T2, 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
1304 {ARM_EXT_V6T2, 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
1305 {ARM_EXT_V6T2, 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
1306 {ARM_EXT_V6T2, 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
1307 {ARM_EXT_V6T2, 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
1308 {ARM_EXT_V6T2, 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
1309 {ARM_EXT_V6T2, 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
1310 {ARM_EXT_V6T2, 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
1311 {ARM_EXT_V6T2, 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
1312 {ARM_EXT_V6T2, 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
1313 {ARM_EXT_V6T2, 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
1314 {ARM_EXT_V6T2, 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
1315 {ARM_EXT_V6T2, 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
1316 {ARM_EXT_V6T2, 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
1317 {ARM_EXT_V6T2, 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
1318 {ARM_EXT_V6T2, 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
1319 {ARM_EXT_V6T2, 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
1320 {ARM_EXT_V6T2, 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
1321 {ARM_EXT_V6T2, 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
1322 {ARM_EXT_V6T2, 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
1323 {ARM_EXT_V6T2, 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
1324 {ARM_EXT_V6T2, 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
1325 {ARM_EXT_V6T2, 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
1326 {ARM_EXT_V6T2, 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
1327 {ARM_EXT_V6T2, 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
1328 {ARM_EXT_V6T2, 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
1329 {ARM_EXT_V6T2, 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
1330 {ARM_EXT_V6T2, 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
1331 {ARM_EXT_V6T2, 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
1332 {ARM_EXT_V6T2, 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
1333 {ARM_EXT_V6T2, 0xfaa0f000, 0xfff0f0f0, "saddsubx%c\t%8-11r, %16-19r, %0-3r"},
1334 {ARM_EXT_V6T2, 0xfaa0f010, 0xfff0f0f0, "qaddsubx%c\t%8-11r, %16-19r, %0-3r"},
1335 {ARM_EXT_V6T2, 0xfaa0f020, 0xfff0f0f0, "shaddsubx%c\t%8-11r, %16-19r, %0-3r"},
1336 {ARM_EXT_V6T2, 0xfaa0f040, 0xfff0f0f0, "uaddsubx%c\t%8-11r, %16-19r, %0-3r"},
1337 {ARM_EXT_V6T2, 0xfaa0f050, 0xfff0f0f0, "uqaddsubx%c\t%8-11r, %16-19r, %0-3r"},
1338 {ARM_EXT_V6T2, 0xfaa0f060, 0xfff0f0f0, "uhaddsubx%c\t%8-11r, %16-19r, %0-3r"},
1339 {ARM_EXT_V6T2, 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
1340 {ARM_EXT_V6T2, 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
1341 {ARM_EXT_V6T2, 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
1342 {ARM_EXT_V6T2, 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
1343 {ARM_EXT_V6T2, 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
1344 {ARM_EXT_V6T2, 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
1345 {ARM_EXT_V6T2, 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
1346 {ARM_EXT_V6T2, 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
1347 {ARM_EXT_V6T2, 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
1348 {ARM_EXT_V6T2, 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
1349 {ARM_EXT_V6T2, 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
1350 {ARM_EXT_V6T2, 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
1351 {ARM_EXT_V6T2, 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
1352 {ARM_EXT_V6T2, 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
1353 {ARM_EXT_V6T2, 0xfae0f000, 0xfff0f0f0, "ssubaddx%c\t%8-11r, %16-19r, %0-3r"},
1354 {ARM_EXT_V6T2, 0xfae0f010, 0xfff0f0f0, "qsubaddx%c\t%8-11r, %16-19r, %0-3r"},
1355 {ARM_EXT_V6T2, 0xfae0f020, 0xfff0f0f0, "shsubaddx%c\t%8-11r, %16-19r, %0-3r"},
1356 {ARM_EXT_V6T2, 0xfae0f040, 0xfff0f0f0, "usubaddx%c\t%8-11r, %16-19r, %0-3r"},
1357 {ARM_EXT_V6T2, 0xfae0f050, 0xfff0f0f0, "uqsubaddx%c\t%8-11r, %16-19r, %0-3r"},
1358 {ARM_EXT_V6T2, 0xfae0f060, 0xfff0f0f0, "uhsubaddx%c\t%8-11r, %16-19r, %0-3r"},
1359 {ARM_EXT_V6T2, 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
1360 {ARM_EXT_V6T2, 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
1361 {ARM_EXT_V6T2, 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11r, %16-19r, %0-3r"},
1362 {ARM_EXT_V6T2, 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
1363 {ARM_EXT_V6T2, 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
1364 {ARM_EXT_V6T2, 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
1365 {ARM_EXT_V6T2, 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
1366 {ARM_EXT_V6T2, 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4d, %16-19r"},
1367 {ARM_EXT_V6T2, 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
1368 {ARM_EXT_V6T2, 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
1369 {ARM_EXT_V6T2, 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
1370 {ARM_EXT_V6T2, 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
1371 {ARM_EXT_V6T2, 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
1372 {ARM_EXT_V6T2, 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
1373 {ARM_EXT_V6T2, 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
1374 {ARM_EXT_V6T2, 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
1375 {ARM_EXT_V6T2, 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
1376 {ARM_EXT_V6T2, 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
1377 {ARM_EXT_V6T2, 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
1378 {ARM_EXT_V6T2, 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
1379 {ARM_EXT_V6T2, 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
1380 {ARM_EXT_V6T2, 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
1381 {ARM_EXT_V6T2, 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
1382 {ARM_EXT_V6T2, 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
1383 {ARM_EXT_V6T2, 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
1384 {ARM_EXT_V6T2, 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
1385 {ARM_EXT_V6T2, 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
1386 {ARM_EXT_V6T2, 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
1387 {ARM_EXT_V6T2, 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
1388 {ARM_EXT_V6T2, 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
1389 {ARM_EXT_V6T2, 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
1390 {ARM_EXT_V6T2, 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
1391 {ARM_EXT_V6T2, 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1392 {ARM_EXT_V6T2, 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1393 {ARM_EXT_V6T2, 0xfb700000, 0xfff000f0, "usada8%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1394 {ARM_EXT_V6T2, 0xfb800000, 0xfff000f0, "smull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1395 {ARM_EXT_V6T2, 0xfba00000, 0xfff000f0, "umull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1396 {ARM_EXT_V6T2, 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1397 {ARM_EXT_V6T2, 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1398 {ARM_EXT_V6T2, 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1399 {ARM_EXT_V6T2, 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
1400 {ARM_EXT_V6T2, 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
1401 {ARM_EXT_V6T2, 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
1402 {ARM_EXT_V6T2, 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
1403 {ARM_EXT_V6T2, 0xf810f000, 0xff70f000, "pld%c\t%a"},
1404 {ARM_EXT_V6T2, 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1405 {ARM_EXT_V6T2, 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1406 {ARM_EXT_V6T2, 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1407 {ARM_EXT_V6T2, 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1408 {ARM_EXT_V6T2, 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1409 {ARM_EXT_V6T2, 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1410 {ARM_EXT_V6T2, 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1411 {ARM_EXT_V6T2, 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
1412 {ARM_EXT_V6T2, 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
1413 {ARM_EXT_V6T2, 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
1414 {ARM_EXT_V6T2, 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
1415 {ARM_EXT_V6T2, 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
1416 {ARM_EXT_V6T2, 0xfb100000, 0xfff000c0, "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
1417 {ARM_EXT_V6T2, 0xfbc00080, 0xfff000c0, "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
1418 {ARM_EXT_V6T2, 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
1419 {ARM_EXT_V6T2, 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
1420 {ARM_EXT_V6T2, 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4d, %16-19r%s"},
1421 {ARM_EXT_V6T2, 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
1422 {ARM_EXT_V6T2, 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
1423 {ARM_EXT_V6T2, 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
1424 {ARM_EXT_V6T2, 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
1425 {ARM_EXT_V6T2, 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
1426 {ARM_EXT_V6T2, 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
1427 {ARM_EXT_V6T2, 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
1428 {ARM_EXT_V6T2, 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
1429 {ARM_EXT_V6T2, 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
1430 {ARM_EXT_V6T2, 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
1431 {ARM_EXT_V6T2, 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
1432 {ARM_EXT_V6T2, 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
1433 {ARM_EXT_V6T2, 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
1434 {ARM_EXT_V6T2, 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
1435 {ARM_EXT_V6T2, 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
1436 {ARM_EXT_V6T2, 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
1437 {ARM_EXT_V6T2, 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
1438 {ARM_EXT_V6T2, 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
1439 {ARM_EXT_V6T2, 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
1440 {ARM_EXT_V6T2, 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
1441 {ARM_EXT_V6T2, 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
1442 {ARM_EXT_V6T2, 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
1443 {ARM_EXT_V6T2, 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
1444 {ARM_EXT_V6T2, 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
1445 {ARM_EXT_V6T2, 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
1446 {ARM_EXT_V6T2, 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
1447 {ARM_EXT_V6T2, 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
1448 {ARM_EXT_V6T2, 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
1449 {ARM_EXT_V6T2, 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
1450 {ARM_EXT_V6T2, 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
1451 {ARM_EXT_V6T2, 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
1452 {ARM_EXT_V6T2, 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
1453 {ARM_EXT_V6T2, 0xe9400000, 0xff500000, "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
1454 {ARM_EXT_V6T2, 0xe9500000, 0xff500000, "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
1455 {ARM_EXT_V6T2, 0xe8600000, 0xff700000, "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
1456 {ARM_EXT_V6T2, 0xe8700000, 0xff700000, "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
1457 {ARM_EXT_V6T2, 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
1458 {ARM_EXT_V6T2, 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
1459
1460
1461 {ARM_EXT_V6T2, 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
1462 {ARM_EXT_V6T2, 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
1463 {ARM_EXT_V6T2, 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
1464 {ARM_EXT_V6T2, 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
1465
1466
1467 {ARM_EXT_V4T, 0xf000c000, 0xf800d000, "blx%c\t%B%x"},
1468 {ARM_EXT_V4T, 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
1469
1470
1471 {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined"},
1472 {0, 0, 0, 0}
1473};
1474
1475static const char *const arm_conditional[] =
1476{"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
1477 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
1478
1479static const char *const arm_fp_const[] =
1480{"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
1481
1482static const char *const arm_shift[] =
1483{"lsl", "lsr", "asr", "ror"};
1484
1485typedef struct
1486{
1487 const char *name;
1488 const char *description;
1489 const char *reg_names[16];
1490}
1491arm_regname;
1492
1493static const arm_regname regnames[] =
1494{
1495 { "raw" , "Select raw register names",
1496 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
1497 { "gcc", "Select register names used by GCC",
1498 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
1499 { "std", "Select register names used in ARM's ISA documentation",
1500 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
1501 { "apcs", "Select register names used in the APCS",
1502 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
1503 { "atpcs", "Select register names used in the ATPCS",
1504 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
1505 { "special-atpcs", "Select special register names used in the ATPCS",
1506 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
1507};
1508
1509static const char *const iwmmxt_wwnames[] =
1510{"b", "h", "w", "d"};
1511
1512static const char *const iwmmxt_wwssnames[] =
1513{"b", "bus", "bc", "bss",
1514 "h", "hus", "hc", "hss",
1515 "w", "wus", "wc", "wss",
1516 "d", "dus", "dc", "dss"
1517};
1518
1519static const char *const iwmmxt_regnames[] =
1520{ "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
1521 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
1522};
1523
1524static const char *const iwmmxt_cregnames[] =
1525{ "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
1526 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
1527};
1528
1529
1530static unsigned int regname_selected = 1;
1531
1532#define NUM_ARM_REGNAMES NUM_ELEM (regnames)
1533#define arm_regnames regnames[regname_selected].reg_names
1534
1535static bfd_boolean force_thumb = FALSE;
1536
1537
1538
1539static unsigned int ifthen_state;
1540
1541static unsigned int ifthen_next_state;
1542
1543static bfd_vma ifthen_address;
1544#define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
1545
1546
1547enum map_type {
1548 MAP_ARM,
1549 MAP_THUMB,
1550 MAP_DATA
1551};
1552
1553enum map_type last_type;
1554int last_mapping_sym = -1;
1555bfd_vma last_mapping_addr = 0;
1556
1557
1558
1559int
1560get_arm_regname_num_options (void)
1561{
1562 return NUM_ARM_REGNAMES;
1563}
1564
1565int
1566set_arm_regname_option (int option)
1567{
1568 int old = regname_selected;
1569 regname_selected = option;
1570 return old;
1571}
1572
1573int
1574get_arm_regnames (int option, const char **setname, const char **setdescription,
1575 const char *const **register_names)
1576{
1577 *setname = regnames[option].name;
1578 *setdescription = regnames[option].description;
1579 *register_names = regnames[option].reg_names;
1580 return 16;
1581}
1582
1583
1584
1585
1586
1587
1588static const char *
1589arm_decode_bitfield (const char *ptr, unsigned long insn,
1590 unsigned long *valuep, int *widthp)
1591{
1592 unsigned long value = 0;
1593 int width = 0;
1594
1595 do
1596 {
1597 int start, end;
1598 int bits;
1599
1600 for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
1601 start = start * 10 + *ptr - '0';
1602 if (*ptr == '-')
1603 for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
1604 end = end * 10 + *ptr - '0';
1605 else
1606 end = start;
1607 bits = end - start;
1608 if (bits < 0)
1609 abort ();
1610 value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
1611 width += bits + 1;
1612 }
1613 while (*ptr++ == ',');
1614 *valuep = value;
1615 if (widthp)
1616 *widthp = width;
1617 return ptr - 1;
1618}
1619
1620static void
1621arm_decode_shift (long given, fprintf_ftype func, void *stream,
1622 int print_shift)
1623{
1624 func (stream, "%s", arm_regnames[given & 0xf]);
1625
1626 if ((given & 0xff0) != 0)
1627 {
1628 if ((given & 0x10) == 0)
1629 {
1630 int amount = (given & 0xf80) >> 7;
1631 int shift = (given & 0x60) >> 5;
1632
1633 if (amount == 0)
1634 {
1635 if (shift == 3)
1636 {
1637 func (stream, ", rrx");
1638 return;
1639 }
1640
1641 amount = 32;
1642 }
1643
1644 if (print_shift)
1645 func (stream, ", %s #%d", arm_shift[shift], amount);
1646 else
1647 func (stream, ", #%d", amount);
1648 }
1649 else if (print_shift)
1650 func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
1651 arm_regnames[(given & 0xf00) >> 8]);
1652 else
1653 func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
1654 }
1655}
1656
1657
1658
1659
1660
1661static bfd_boolean
1662print_insn_coprocessor (bfd_vma pc, struct disassemble_info *info, long given,
1663 bfd_boolean thumb)
1664{
1665 const struct opcode32 *insn;
1666 void *stream = info->stream;
1667 fprintf_ftype func = info->fprintf_func;
1668 unsigned long mask;
1669 unsigned long value;
1670 int cond;
1671
1672 for (insn = coprocessor_opcodes; insn->assembler; insn++)
1673 {
1674 if (insn->value == FIRST_IWMMXT_INSN
1675 && info->mach != bfd_mach_arm_XScale
1676 && info->mach != bfd_mach_arm_iWMMXt
1677 && info->mach != bfd_mach_arm_iWMMXt2)
1678 insn = insn + IWMMXT_INSN_COUNT;
1679
1680 mask = insn->mask;
1681 value = insn->value;
1682 if (thumb)
1683 {
1684
1685
1686
1687 mask |= 0xf0000000;
1688 value |= 0xe0000000;
1689 if (ifthen_state)
1690 cond = IFTHEN_COND;
1691 else
1692 cond = 16;
1693 }
1694 else
1695 {
1696
1697
1698 if ((given & 0xf0000000) == 0xf0000000)
1699 {
1700 mask |= 0xf0000000;
1701 cond = 16;
1702 }
1703 else
1704 {
1705 cond = (given >> 28) & 0xf;
1706 if (cond == 0xe)
1707 cond = 16;
1708 }
1709 }
1710 if ((given & mask) == value)
1711 {
1712 const char *c;
1713
1714 for (c = insn->assembler; *c; c++)
1715 {
1716 if (*c == '%')
1717 {
1718 switch (*++c)
1719 {
1720 case '%':
1721 func (stream, "%%");
1722 break;
1723
1724 case 'A':
1725 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
1726
1727 if ((given & (1 << 24)) != 0)
1728 {
1729 int offset = given & 0xff;
1730
1731 if (offset)
1732 func (stream, ", #%s%d]%s",
1733 ((given & 0x00800000) == 0 ? "-" : ""),
1734 offset * 4,
1735 ((given & 0x00200000) != 0 ? "!" : ""));
1736 else
1737 func (stream, "]");
1738 }
1739 else
1740 {
1741 int offset = given & 0xff;
1742
1743 func (stream, "]");
1744
1745 if (given & (1 << 21))
1746 {
1747 if (offset)
1748 func (stream, ", #%s%d",
1749 ((given & 0x00800000) == 0 ? "-" : ""),
1750 offset * 4);
1751 }
1752 else
1753 func (stream, ", {%d}", offset);
1754 }
1755 break;
1756
1757 case 'B':
1758 {
1759 int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
1760 int offset = (given >> 1) & 0x3f;
1761
1762 if (offset == 1)
1763 func (stream, "{d%d}", regno);
1764 else if (regno + offset > 32)
1765 func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
1766 else
1767 func (stream, "{d%d-d%d}", regno, regno + offset - 1);
1768 }
1769 break;
1770
1771 case 'C':
1772 {
1773 int rn = (given >> 16) & 0xf;
1774 int offset = (given & 0xff) * 4;
1775 int add = (given >> 23) & 1;
1776
1777 func (stream, "[%s", arm_regnames[rn]);
1778
1779 if (offset)
1780 {
1781 if (!add)
1782 offset = -offset;
1783 func (stream, ", #%d", offset);
1784 }
1785 func (stream, "]");
1786 if (rn == 15)
1787 {
1788 func (stream, "\t; ");
1789
1790
1791 info->print_address_func (offset + pc
1792 + info->bytes_per_chunk * 2, info);
1793 }
1794 }
1795 break;
1796
1797 case 'c':
1798 func (stream, "%s", arm_conditional[cond]);
1799 break;
1800
1801 case 'I':
1802
1803
1804
1805
1806 {
1807 int imm;
1808
1809 imm = (given & 0xf) | ((given & 0xe0) >> 1);
1810
1811
1812 if (imm & 0x40)
1813 imm |= (-1 << 7);
1814
1815 func (stream, "%d", imm);
1816 }
1817
1818 break;
1819
1820 case 'F':
1821 switch (given & 0x00408000)
1822 {
1823 case 0:
1824 func (stream, "4");
1825 break;
1826 case 0x8000:
1827 func (stream, "1");
1828 break;
1829 case 0x00400000:
1830 func (stream, "2");
1831 break;
1832 default:
1833 func (stream, "3");
1834 }
1835 break;
1836
1837 case 'P':
1838 switch (given & 0x00080080)
1839 {
1840 case 0:
1841 func (stream, "s");
1842 break;
1843 case 0x80:
1844 func (stream, "d");
1845 break;
1846 case 0x00080000:
1847 func (stream, "e");
1848 break;
1849 default:
1850 func (stream, _("<illegal precision>"));
1851 break;
1852 }
1853 break;
1854 case 'Q':
1855 switch (given & 0x00408000)
1856 {
1857 case 0:
1858 func (stream, "s");
1859 break;
1860 case 0x8000:
1861 func (stream, "d");
1862 break;
1863 case 0x00400000:
1864 func (stream, "e");
1865 break;
1866 default:
1867 func (stream, "p");
1868 break;
1869 }
1870 break;
1871 case 'R':
1872 switch (given & 0x60)
1873 {
1874 case 0:
1875 break;
1876 case 0x20:
1877 func (stream, "p");
1878 break;
1879 case 0x40:
1880 func (stream, "m");
1881 break;
1882 default:
1883 func (stream, "z");
1884 break;
1885 }
1886 break;
1887
1888 case '0': case '1': case '2': case '3': case '4':
1889 case '5': case '6': case '7': case '8': case '9':
1890 {
1891 int width;
1892 unsigned long value;
1893
1894 c = arm_decode_bitfield (c, given, &value, &width);
1895
1896 switch (*c)
1897 {
1898 case 'r':
1899 func (stream, "%s", arm_regnames[value]);
1900 break;
1901 case 'D':
1902 func (stream, "d%ld", value);
1903 break;
1904 case 'Q':
1905 if (value & 1)
1906 func (stream, "<illegal reg q%ld.5>", value >> 1);
1907 else
1908 func (stream, "q%ld", value >> 1);
1909 break;
1910 case 'd':
1911 func (stream, "%ld", value);
1912 break;
1913 case 'k':
1914 {
1915 int from = (given & (1 << 7)) ? 32 : 16;
1916 func (stream, "%ld", from - value);
1917 }
1918 break;
1919
1920 case 'f':
1921 if (value > 7)
1922 func (stream, "#%s", arm_fp_const[value & 7]);
1923 else
1924 func (stream, "f%ld", value);
1925 break;
1926
1927 case 'w':
1928 if (width == 2)
1929 func (stream, "%s", iwmmxt_wwnames[value]);
1930 else
1931 func (stream, "%s", iwmmxt_wwssnames[value]);
1932 break;
1933
1934 case 'g':
1935 func (stream, "%s", iwmmxt_regnames[value]);
1936 break;
1937 case 'G':
1938 func (stream, "%s", iwmmxt_cregnames[value]);
1939 break;
1940
1941 case 'x':
1942 func (stream, "0x%lx", value);
1943 break;
1944
1945 case '`':
1946 c++;
1947 if (value == 0)
1948 func (stream, "%c", *c);
1949 break;
1950 case '\'':
1951 c++;
1952 if (value == ((1ul << width) - 1))
1953 func (stream, "%c", *c);
1954 break;
1955 case '?':
1956 func (stream, "%c", c[(1 << width) - (int)value]);
1957 c += 1 << width;
1958 break;
1959 default:
1960 abort ();
1961 }
1962 break;
1963
1964 case 'y':
1965 case 'z':
1966 {
1967 int single = *c++ == 'y';
1968 int regno;
1969
1970 switch (*c)
1971 {
1972 case '4':
1973 func (stream, "{");
1974
1975 case '0':
1976 regno = given & 0x0000000f;
1977 if (single)
1978 {
1979 regno <<= 1;
1980 regno += (given >> 5) & 1;
1981 }
1982 else
1983 regno += ((given >> 5) & 1) << 4;
1984 break;
1985
1986 case '1':
1987 regno = (given >> 12) & 0x0000000f;
1988 if (single)
1989 {
1990 regno <<= 1;
1991 regno += (given >> 22) & 1;
1992 }
1993 else
1994 regno += ((given >> 22) & 1) << 4;
1995 break;
1996
1997 case '2':
1998 regno = (given >> 16) & 0x0000000f;
1999 if (single)
2000 {
2001 regno <<= 1;
2002 regno += (given >> 7) & 1;
2003 }
2004 else
2005 regno += ((given >> 7) & 1) << 4;
2006 break;
2007
2008 case '3':
2009 func (stream, "{");
2010 regno = (given >> 12) & 0x0000000f;
2011 if (single)
2012 {
2013 regno <<= 1;
2014 regno += (given >> 22) & 1;
2015 }
2016 else
2017 regno += ((given >> 22) & 1) << 4;
2018 break;
2019
2020 default:
2021 abort ();
2022 }
2023
2024 func (stream, "%c%d", single ? 's' : 'd', regno);
2025
2026 if (*c == '3')
2027 {
2028 int count = given & 0xff;
2029
2030 if (single == 0)
2031 count >>= 1;
2032
2033 if (--count)
2034 {
2035 func (stream, "-%c%d",
2036 single ? 's' : 'd',
2037 regno + count);
2038 }
2039
2040 func (stream, "}");
2041 }
2042 else if (*c == '4')
2043 func (stream, ", %c%d}", single ? 's' : 'd',
2044 regno + 1);
2045 }
2046 break;
2047
2048 case 'L':
2049 switch (given & 0x00400100)
2050 {
2051 case 0x00000000: func (stream, "b"); break;
2052 case 0x00400000: func (stream, "h"); break;
2053 case 0x00000100: func (stream, "w"); break;
2054 case 0x00400100: func (stream, "d"); break;
2055 default:
2056 break;
2057 }
2058 break;
2059
2060 case 'Z':
2061 {
2062 int value;
2063
2064 value = ((given >> 16) & 0xf0) | (given & 0xf);
2065 func (stream, "%d", value);
2066 }
2067 break;
2068
2069 case 'l':
2070
2071
2072
2073 {
2074 int offset = given & 0xff;
2075 int multiplier = (given & 0x00000100) ? 4 : 1;
2076
2077 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
2078
2079 if (offset)
2080 {
2081 if ((given & 0x01000000) != 0)
2082 func (stream, ", #%s%d]%s",
2083 ((given & 0x00800000) == 0 ? "-" : ""),
2084 offset * multiplier,
2085 ((given & 0x00200000) != 0 ? "!" : ""));
2086 else
2087 func (stream, "], #%s%d",
2088 ((given & 0x00800000) == 0 ? "-" : ""),
2089 offset * multiplier);
2090 }
2091 else
2092 func (stream, "]");
2093 }
2094 break;
2095
2096 case 'r':
2097 {
2098 int imm4 = (given >> 4) & 0xf;
2099 int puw_bits = ((given >> 22) & 6) | ((given >> 21) & 1);
2100 int ubit = (given >> 23) & 1;
2101 const char *rm = arm_regnames [given & 0xf];
2102 const char *rn = arm_regnames [(given >> 16) & 0xf];
2103
2104 switch (puw_bits)
2105 {
2106 case 1:
2107
2108 case 3:
2109 func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
2110 if (imm4)
2111 func (stream, ", lsl #%d", imm4);
2112 break;
2113
2114 case 4:
2115
2116 case 5:
2117
2118 case 6:
2119
2120 case 7:
2121 func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
2122 if (imm4 > 0)
2123 func (stream, ", lsl #%d", imm4);
2124 func (stream, "]");
2125 if (puw_bits == 5 || puw_bits == 7)
2126 func (stream, "!");
2127 break;
2128
2129 default:
2130 func (stream, "INVALID");
2131 }
2132 }
2133 break;
2134
2135 case 'i':
2136 {
2137 long imm5;
2138 imm5 = ((given & 0x100) >> 4) | (given & 0xf);
2139 func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
2140 }
2141 break;
2142
2143 default:
2144 abort ();
2145 }
2146 }
2147 }
2148 else
2149 func (stream, "%c", *c);
2150 }
2151 return TRUE;
2152 }
2153 }
2154 return FALSE;
2155}
2156
2157static void
2158print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
2159{
2160 void *stream = info->stream;
2161 fprintf_ftype func = info->fprintf_func;
2162
2163 if (((given & 0x000f0000) == 0x000f0000)
2164 && ((given & 0x02000000) == 0))
2165 {
2166 int offset = given & 0xfff;
2167
2168 func (stream, "[pc");
2169
2170 if (given & 0x01000000)
2171 {
2172 if ((given & 0x00800000) == 0)
2173 offset = - offset;
2174
2175
2176 func (stream, ", #%d]", offset);
2177
2178 offset += pc + 8;
2179
2180
2181
2182
2183
2184 if (given & 0x00200000)
2185 func (stream, "!");
2186 }
2187 else
2188 {
2189
2190 func (stream, "], #%d", offset);
2191
2192
2193 offset = pc + 8;
2194 }
2195
2196 func (stream, "\t; ");
2197 info->print_address_func (offset, info);
2198 }
2199 else
2200 {
2201 func (stream, "[%s",
2202 arm_regnames[(given >> 16) & 0xf]);
2203 if ((given & 0x01000000) != 0)
2204 {
2205 if ((given & 0x02000000) == 0)
2206 {
2207 int offset = given & 0xfff;
2208 if (offset)
2209 func (stream, ", #%s%d",
2210 (((given & 0x00800000) == 0)
2211 ? "-" : ""), offset);
2212 }
2213 else
2214 {
2215 func (stream, ", %s",
2216 (((given & 0x00800000) == 0)
2217 ? "-" : ""));
2218 arm_decode_shift (given, func, stream, 1);
2219 }
2220
2221 func (stream, "]%s",
2222 ((given & 0x00200000) != 0) ? "!" : "");
2223 }
2224 else
2225 {
2226 if ((given & 0x02000000) == 0)
2227 {
2228 int offset = given & 0xfff;
2229 if (offset)
2230 func (stream, "], #%s%d",
2231 (((given & 0x00800000) == 0)
2232 ? "-" : ""), offset);
2233 else
2234 func (stream, "]");
2235 }
2236 else
2237 {
2238 func (stream, "], %s",
2239 (((given & 0x00800000) == 0)
2240 ? "-" : ""));
2241 arm_decode_shift (given, func, stream, 1);
2242 }
2243 }
2244 }
2245}
2246
2247
2248
2249
2250
2251static bfd_boolean
2252print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
2253{
2254 const struct opcode32 *insn;
2255 void *stream = info->stream;
2256 fprintf_ftype func = info->fprintf_func;
2257
2258 if (thumb)
2259 {
2260 if ((given & 0xef000000) == 0xef000000)
2261 {
2262
2263 unsigned long bit28 = given & (1 << 28);
2264
2265 given &= 0x00ffffff;
2266 if (bit28)
2267 given |= 0xf3000000;
2268 else
2269 given |= 0xf2000000;
2270 }
2271 else if ((given & 0xff000000) == 0xf9000000)
2272 given ^= 0xf9000000 ^ 0xf4000000;
2273 else
2274 return FALSE;
2275 }
2276
2277 for (insn = neon_opcodes; insn->assembler; insn++)
2278 {
2279 if ((given & insn->mask) == insn->value)
2280 {
2281 const char *c;
2282
2283 for (c = insn->assembler; *c; c++)
2284 {
2285 if (*c == '%')
2286 {
2287 switch (*++c)
2288 {
2289 case '%':
2290 func (stream, "%%");
2291 break;
2292
2293 case 'c':
2294 if (thumb && ifthen_state)
2295 func (stream, "%s", arm_conditional[IFTHEN_COND]);
2296 break;
2297
2298 case 'A':
2299 {
2300 static const unsigned char enc[16] =
2301 {
2302 0x4, 0x14,
2303 0x4,
2304 0x4,
2305 0x3,
2306 0x13,
2307 0x3,
2308 0x1,
2309 0x2,
2310 0x12,
2311 0x2,
2312 0, 0, 0, 0, 0
2313 };
2314 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
2315 int rn = ((given >> 16) & 0xf);
2316 int rm = ((given >> 0) & 0xf);
2317 int align = ((given >> 4) & 0x3);
2318 int type = ((given >> 8) & 0xf);
2319 int n = enc[type] & 0xf;
2320 int stride = (enc[type] >> 4) + 1;
2321 int ix;
2322
2323 func (stream, "{");
2324 if (stride > 1)
2325 for (ix = 0; ix != n; ix++)
2326 func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
2327 else if (n == 1)
2328 func (stream, "d%d", rd);
2329 else
2330 func (stream, "d%d-d%d", rd, rd + n - 1);
2331 func (stream, "}, [%s", arm_regnames[rn]);
2332 if (align)
2333 func (stream, ", :%d", 32 << align);
2334 func (stream, "]");
2335 if (rm == 0xd)
2336 func (stream, "!");
2337 else if (rm != 0xf)
2338 func (stream, ", %s", arm_regnames[rm]);
2339 }
2340 break;
2341
2342 case 'B':
2343 {
2344 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
2345 int rn = ((given >> 16) & 0xf);
2346 int rm = ((given >> 0) & 0xf);
2347 int idx_align = ((given >> 4) & 0xf);
2348 int align = 0;
2349 int size = ((given >> 10) & 0x3);
2350 int idx = idx_align >> (size + 1);
2351 int length = ((given >> 8) & 3) + 1;
2352 int stride = 1;
2353 int i;
2354
2355 if (length > 1 && size > 0)
2356 stride = (idx_align & (1 << size)) ? 2 : 1;
2357
2358 switch (length)
2359 {
2360 case 1:
2361 {
2362 int amask = (1 << size) - 1;
2363 if ((idx_align & (1 << size)) != 0)
2364 return FALSE;
2365 if (size > 0)
2366 {
2367 if ((idx_align & amask) == amask)
2368 align = 8 << size;
2369 else if ((idx_align & amask) != 0)
2370 return FALSE;
2371 }
2372 }
2373 break;
2374
2375 case 2:
2376 if (size == 2 && (idx_align & 2) != 0)
2377 return FALSE;
2378 align = (idx_align & 1) ? 16 << size : 0;
2379 break;
2380
2381 case 3:
2382 if ((size == 2 && (idx_align & 3) != 0)
2383 || (idx_align & 1) != 0)
2384 return FALSE;
2385 break;
2386
2387 case 4:
2388 if (size == 2)
2389 {
2390 if ((idx_align & 3) == 3)
2391 return FALSE;
2392 align = (idx_align & 3) * 64;
2393 }
2394 else
2395 align = (idx_align & 1) ? 32 << size : 0;
2396 break;
2397
2398 default:
2399 abort ();
2400 }
2401
2402 func (stream, "{");
2403 for (i = 0; i < length; i++)
2404 func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
2405 rd + i * stride, idx);
2406 func (stream, "}, [%s", arm_regnames[rn]);
2407 if (align)
2408 func (stream, ", :%d", align);
2409 func (stream, "]");
2410 if (rm == 0xd)
2411 func (stream, "!");
2412 else if (rm != 0xf)
2413 func (stream, ", %s", arm_regnames[rm]);
2414 }
2415 break;
2416
2417 case 'C':
2418 {
2419 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
2420 int rn = ((given >> 16) & 0xf);
2421 int rm = ((given >> 0) & 0xf);
2422 int align = ((given >> 4) & 0x1);
2423 int size = ((given >> 6) & 0x3);
2424 int type = ((given >> 8) & 0x3);
2425 int n = type + 1;
2426 int stride = ((given >> 5) & 0x1);
2427 int ix;
2428
2429 if (stride && (n == 1))
2430 n++;
2431 else
2432 stride++;
2433
2434 func (stream, "{");
2435 if (stride > 1)
2436 for (ix = 0; ix != n; ix++)
2437 func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
2438 else if (n == 1)
2439 func (stream, "d%d[]", rd);
2440 else
2441 func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
2442 func (stream, "}, [%s", arm_regnames[rn]);
2443 if (align)
2444 {
2445 int align = (8 * (type + 1)) << size;
2446 if (type == 3)
2447 align = (size > 1) ? align >> 1 : align;
2448 if (type == 2 || (type == 0 && !size))
2449 func (stream, ", :<bad align %d>", align);
2450 else
2451 func (stream, ", :%d", align);
2452 }
2453 func (stream, "]");
2454 if (rm == 0xd)
2455 func (stream, "!");
2456 else if (rm != 0xf)
2457 func (stream, ", %s", arm_regnames[rm]);
2458 }
2459 break;
2460
2461 case 'D':
2462 {
2463 int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
2464 int size = (given >> 20) & 3;
2465 int reg = raw_reg & ((4 << size) - 1);
2466 int ix = raw_reg >> size >> 2;
2467
2468 func (stream, "d%d[%d]", reg, ix);
2469 }
2470 break;
2471
2472 case 'E':
2473
2474 {
2475 int bits = 0;
2476 int cmode = (given >> 8) & 0xf;
2477 int op = (given >> 5) & 0x1;
2478 unsigned long value = 0, hival = 0;
2479 unsigned shift;
2480 int size = 0;
2481 int isfloat = 0;
2482
2483 bits |= ((given >> 24) & 1) << 7;
2484 bits |= ((given >> 16) & 7) << 4;
2485 bits |= ((given >> 0) & 15) << 0;
2486
2487 if (cmode < 8)
2488 {
2489 shift = (cmode >> 1) & 3;
2490 value = (unsigned long)bits << (8 * shift);
2491 size = 32;
2492 }
2493 else if (cmode < 12)
2494 {
2495 shift = (cmode >> 1) & 1;
2496 value = (unsigned long)bits << (8 * shift);
2497 size = 16;
2498 }
2499 else if (cmode < 14)
2500 {
2501 shift = (cmode & 1) + 1;
2502 value = (unsigned long)bits << (8 * shift);
2503 value |= (1ul << (8 * shift)) - 1;
2504 size = 32;
2505 }
2506 else if (cmode == 14)
2507 {
2508 if (op)
2509 {
2510
2511 int ix;
2512 unsigned long mask;
2513
2514 value = 0;
2515 hival = 0;
2516 for (ix = 7; ix >= 0; ix--)
2517 {
2518 mask = ((bits >> ix) & 1) ? 0xff : 0;
2519 if (ix <= 3)
2520 value = (value << 8) | mask;
2521 else
2522 hival = (hival << 8) | mask;
2523 }
2524 size = 64;
2525 }
2526 else
2527 {
2528
2529 value = (unsigned long)bits;
2530 size = 8;
2531 }
2532 }
2533 else if (!op)
2534 {
2535
2536 int tmp;
2537
2538 value = (unsigned long)(bits & 0x7f) << 19;
2539 value |= (unsigned long)(bits & 0x80) << 24;
2540 tmp = bits & 0x40 ? 0x3c : 0x40;
2541 value |= (unsigned long)tmp << 24;
2542 size = 32;
2543 isfloat = 1;
2544 }
2545 else
2546 {
2547 func (stream, "<illegal constant %.8x:%x:%x>",
2548 bits, cmode, op);
2549 size = 32;
2550 break;
2551 }
2552 switch (size)
2553 {
2554 case 8:
2555 func (stream, "#%ld\t; 0x%.2lx", value, value);
2556 break;
2557
2558 case 16:
2559 func (stream, "#%ld\t; 0x%.4lx", value, value);
2560 break;
2561
2562 case 32:
2563 if (isfloat)
2564 {
2565 unsigned char valbytes[4];
2566 double fvalue;
2567
2568
2569
2570 valbytes[0] = value & 0xff;
2571 valbytes[1] = (value >> 8) & 0xff;
2572 valbytes[2] = (value >> 16) & 0xff;
2573 valbytes[3] = (value >> 24) & 0xff;
2574
2575 floatformat_to_double
2576 (&floatformat_ieee_single_little, valbytes,
2577 &fvalue);
2578
2579 func (stream, "#%.7g\t; 0x%.8lx", fvalue,
2580 value);
2581 }
2582 else
2583 func (stream, "#%ld\t; 0x%.8lx",
2584 (long) ((value & 0x80000000)
2585 ? value | ~0xffffffffl : value), value);
2586 break;
2587
2588 case 64:
2589 func (stream, "#0x%.8lx%.8lx", hival, value);
2590 break;
2591
2592 default:
2593 abort ();
2594 }
2595 }
2596 break;
2597
2598 case 'F':
2599 {
2600 int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
2601 int num = (given >> 8) & 0x3;
2602
2603 if (!num)
2604 func (stream, "{d%d}", regno);
2605 else if (num + regno >= 32)
2606 func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
2607 else
2608 func (stream, "{d%d-d%d}", regno, regno + num);
2609 }
2610 break;
2611
2612
2613 case '0': case '1': case '2': case '3': case '4':
2614 case '5': case '6': case '7': case '8': case '9':
2615 {
2616 int width;
2617 unsigned long value;
2618
2619 c = arm_decode_bitfield (c, given, &value, &width);
2620
2621 switch (*c)
2622 {
2623 case 'r':
2624 func (stream, "%s", arm_regnames[value]);
2625 break;
2626 case 'd':
2627 func (stream, "%ld", value);
2628 break;
2629 case 'e':
2630 func (stream, "%ld", (1ul << width) - value);
2631 break;
2632
2633 case 'S':
2634 case 'T':
2635 case 'U':
2636
2637 {
2638 int base = 8 << (*c - 'S');
2639 int limit;
2640 unsigned low, high;
2641
2642 c++;
2643 if (*c >= '0' && *c <= '9')
2644 limit = *c - '0';
2645 else if (*c >= 'a' && *c <= 'f')
2646 limit = *c - 'a' + 10;
2647 else
2648 abort ();
2649 low = limit >> 2;
2650 high = limit & 3;
2651
2652 if (value < low || value > high)
2653 func (stream, "<illegal width %d>", base << value);
2654 else
2655 func (stream, "%d", base << value);
2656 }
2657 break;
2658 case 'R':
2659 if (given & (1 << 6))
2660 goto Q;
2661
2662 case 'D':
2663 func (stream, "d%ld", value);
2664 break;
2665 case 'Q':
2666 Q:
2667 if (value & 1)
2668 func (stream, "<illegal reg q%ld.5>", value >> 1);
2669 else
2670 func (stream, "q%ld", value >> 1);
2671 break;
2672
2673 case '`':
2674 c++;
2675 if (value == 0)
2676 func (stream, "%c", *c);
2677 break;
2678 case '\'':
2679 c++;
2680 if (value == ((1ul << width) - 1))
2681 func (stream, "%c", *c);
2682 break;
2683 case '?':
2684 func (stream, "%c", c[(1 << width) - (int)value]);
2685 c += 1 << width;
2686 break;
2687 default:
2688 abort ();
2689 }
2690 break;
2691
2692 default:
2693 abort ();
2694 }
2695 }
2696 }
2697 else
2698 func (stream, "%c", *c);
2699 }
2700 return TRUE;
2701 }
2702 }
2703 return FALSE;
2704}
2705
2706
2707
2708static void
2709print_insn_arm_internal (bfd_vma pc, struct disassemble_info *info, long given)
2710{
2711 const struct opcode32 *insn;
2712 void *stream = info->stream;
2713 fprintf_ftype func = info->fprintf_func;
2714
2715 if (print_insn_coprocessor (pc, info, given, FALSE))
2716 return;
2717
2718 if (print_insn_neon (info, given, FALSE))
2719 return;
2720
2721 for (insn = arm_opcodes; insn->assembler; insn++)
2722 {
2723 if (insn->value == FIRST_IWMMXT_INSN
2724 && info->mach != bfd_mach_arm_XScale
2725 && info->mach != bfd_mach_arm_iWMMXt)
2726 insn = insn + IWMMXT_INSN_COUNT;
2727
2728 if ((given & insn->mask) == insn->value
2729
2730
2731
2732 && ((given & 0xF0000000) != 0xF0000000
2733 || (insn->mask & 0xF0000000) == 0xF0000000
2734 || (insn->mask == 0 && insn->value == 0)))
2735 {
2736 const char *c;
2737
2738 for (c = insn->assembler; *c; c++)
2739 {
2740 if (*c == '%')
2741 {
2742 switch (*++c)
2743 {
2744 case '%':
2745 func (stream, "%%");
2746 break;
2747
2748 case 'a':
2749 print_arm_address (pc, info, given);
2750 break;
2751
2752 case 'P':
2753
2754
2755 print_arm_address (pc, info, given | (1 << 24));
2756 break;
2757
2758 case 's':
2759 if ((given & 0x004f0000) == 0x004f0000)
2760 {
2761
2762 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
2763
2764 if ((given & 0x00800000) == 0)
2765 offset = -offset;
2766
2767 func (stream, "[pc, #%d]\t; ", offset);
2768 info->print_address_func (offset + pc + 8, info);
2769 }
2770 else
2771 {
2772 func (stream, "[%s",
2773 arm_regnames[(given >> 16) & 0xf]);
2774 if ((given & 0x01000000) != 0)
2775 {
2776
2777 if ((given & 0x00400000) == 0x00400000)
2778 {
2779
2780 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
2781 if (offset)
2782 func (stream, ", #%s%d",
2783 (((given & 0x00800000) == 0)
2784 ? "-" : ""), offset);
2785 }
2786 else
2787 {
2788
2789 func (stream, ", %s%s",
2790 (((given & 0x00800000) == 0)
2791 ? "-" : ""),
2792 arm_regnames[given & 0xf]);
2793 }
2794
2795 func (stream, "]%s",
2796 ((given & 0x00200000) != 0) ? "!" : "");
2797 }
2798 else
2799 {
2800
2801 if ((given & 0x00400000) == 0x00400000)
2802 {
2803
2804 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
2805 if (offset)
2806 func (stream, "], #%s%d",
2807 (((given & 0x00800000) == 0)
2808 ? "-" : ""), offset);
2809 else
2810 func (stream, "]");
2811 }
2812 else
2813 {
2814
2815 func (stream, "], %s%s",
2816 (((given & 0x00800000) == 0)
2817 ? "-" : ""),
2818 arm_regnames[given & 0xf]);
2819 }
2820 }
2821 }
2822 break;
2823
2824 case 'b':
2825 {
2826 int disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
2827 info->print_address_func (disp*4 + pc + 8, info);
2828 }
2829 break;
2830
2831 case 'c':
2832 if (((given >> 28) & 0xf) != 0xe)
2833 func (stream, "%s",
2834 arm_conditional [(given >> 28) & 0xf]);
2835 break;
2836
2837 case 'm':
2838 {
2839 int started = 0;
2840 int reg;
2841
2842 func (stream, "{");
2843 for (reg = 0; reg < 16; reg++)
2844 if ((given & (1 << reg)) != 0)
2845 {
2846 if (started)
2847 func (stream, ", ");
2848 started = 1;
2849 func (stream, "%s", arm_regnames[reg]);
2850 }
2851 func (stream, "}");
2852 }
2853 break;
2854
2855 case 'q':
2856 arm_decode_shift (given, func, stream, 0);
2857 break;
2858
2859 case 'o':
2860 if ((given & 0x02000000) != 0)
2861 {
2862 int rotate = (given & 0xf00) >> 7;
2863 int immed = (given & 0xff);
2864 immed = (((immed << (32 - rotate))
2865 | (immed >> rotate)) & 0xffffffff);
2866 func (stream, "#%d\t; 0x%x", immed, immed);
2867 }
2868 else
2869 arm_decode_shift (given, func, stream, 1);
2870 break;
2871
2872 case 'p':
2873 if ((given & 0x0000f000) == 0x0000f000)
2874 func (stream, "p");
2875 break;
2876
2877 case 't':
2878 if ((given & 0x01200000) == 0x00200000)
2879 func (stream, "t");
2880 break;
2881
2882 case 'A':
2883 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
2884
2885 if ((given & (1 << 24)) != 0)
2886 {
2887 int offset = given & 0xff;
2888
2889 if (offset)
2890 func (stream, ", #%s%d]%s",
2891 ((given & 0x00800000) == 0 ? "-" : ""),
2892 offset * 4,
2893 ((given & 0x00200000) != 0 ? "!" : ""));
2894 else
2895 func (stream, "]");
2896 }
2897 else
2898 {
2899 int offset = given & 0xff;
2900
2901 func (stream, "]");
2902
2903 if (given & (1 << 21))
2904 {
2905 if (offset)
2906 func (stream, ", #%s%d",
2907 ((given & 0x00800000) == 0 ? "-" : ""),
2908 offset * 4);
2909 }
2910 else
2911 func (stream, ", {%d}", offset);
2912 }
2913 break;
2914
2915 case 'B':
2916
2917 {
2918 bfd_vma address;
2919 bfd_vma offset = 0;
2920
2921 if (given & 0x00800000)
2922
2923 offset = (-1) ^ 0x00ffffff;
2924
2925
2926 offset += given & 0x00ffffff;
2927 offset <<= 2;
2928 address = offset + pc + 8;
2929
2930 if (given & 0x01000000)
2931
2932 address += 2;
2933
2934 info->print_address_func (address, info);
2935 }
2936 break;
2937
2938 case 'C':
2939 func (stream, "_");
2940 if (given & 0x80000)
2941 func (stream, "f");
2942 if (given & 0x40000)
2943 func (stream, "s");
2944 if (given & 0x20000)
2945 func (stream, "x");
2946 if (given & 0x10000)
2947 func (stream, "c");
2948 break;
2949
2950 case 'U':
2951 switch (given & 0xf)
2952 {
2953 case 0xf: func(stream, "sy"); break;
2954 case 0x7: func(stream, "un"); break;
2955 case 0xe: func(stream, "st"); break;
2956 case 0x6: func(stream, "unst"); break;
2957 default:
2958 func(stream, "#%d", (int)given & 0xf);
2959 break;
2960 }
2961 break;
2962
2963 case '0': case '1': case '2': case '3': case '4':
2964 case '5': case '6': case '7': case '8': case '9':
2965 {
2966 int width;
2967 unsigned long value;
2968
2969 c = arm_decode_bitfield (c, given, &value, &width);
2970
2971 switch (*c)
2972 {
2973 case 'r':
2974 func (stream, "%s", arm_regnames[value]);
2975 break;
2976 case 'd':
2977 func (stream, "%ld", value);
2978 break;
2979 case 'b':
2980 func (stream, "%ld", value * 8);
2981 break;
2982 case 'W':
2983 func (stream, "%ld", value + 1);
2984 break;
2985 case 'x':
2986 func (stream, "0x%08lx", value);
2987
2988
2989
2990 if ((given & 0x0fffffff) == 0x0FF00000)
2991 func (stream, "\t; IMB");
2992 else if ((given & 0x0fffffff) == 0x0FF00001)
2993 func (stream, "\t; IMBRange");
2994 break;
2995 case 'X':
2996 func (stream, "%01lx", value & 0xf);
2997 break;
2998 case '`':
2999 c++;
3000 if (value == 0)
3001 func (stream, "%c", *c);
3002 break;
3003 case '\'':
3004 c++;
3005 if (value == ((1ul << width) - 1))
3006 func (stream, "%c", *c);
3007 break;
3008 case '?':
3009 func (stream, "%c", c[(1 << width) - (int)value]);
3010 c += 1 << width;
3011 break;
3012 default:
3013 abort ();
3014 }
3015 break;
3016
3017 case 'e':
3018 {
3019 int imm;
3020
3021 imm = (given & 0xf) | ((given & 0xfff00) >> 4);
3022 func (stream, "%d", imm);
3023 }
3024 break;
3025
3026 case 'E':
3027
3028
3029 {
3030 long msb = (given & 0x001f0000) >> 16;
3031 long lsb = (given & 0x00000f80) >> 7;
3032
3033 long width = msb - lsb + 1;
3034 if (width > 0)
3035 func (stream, "#%lu, #%lu", lsb, width);
3036 else
3037 func (stream, "(invalid: %lu:%lu)", lsb, msb);
3038 }
3039 break;
3040
3041 case 'V':
3042
3043
3044 {
3045 long hi = (given & 0x000f0000) >> 4;
3046 long lo = (given & 0x00000fff);
3047 long imm16 = hi | lo;
3048 func (stream, "#%lu\t; 0x%lx", imm16, imm16);
3049 }
3050 break;
3051
3052 default:
3053 abort ();
3054 }
3055 }
3056 }
3057 else
3058 func (stream, "%c", *c);
3059 }
3060 return;
3061 }
3062 }
3063 abort ();
3064}
3065
3066
3067
3068static void
3069print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
3070{
3071 const struct opcode16 *insn;
3072 void *stream = info->stream;
3073 fprintf_ftype func = info->fprintf_func;
3074
3075 for (insn = thumb_opcodes; insn->assembler; insn++)
3076 if ((given & insn->mask) == insn->value)
3077 {
3078 const char *c = insn->assembler;
3079 for (; *c; c++)
3080 {
3081 int domaskpc = 0;
3082 int domasklr = 0;
3083
3084 if (*c != '%')
3085 {
3086 func (stream, "%c", *c);
3087 continue;
3088 }
3089
3090 switch (*++c)
3091 {
3092 case '%':
3093 func (stream, "%%");
3094 break;
3095
3096 case 'c':
3097 if (ifthen_state)
3098 func (stream, "%s", arm_conditional[IFTHEN_COND]);
3099 break;
3100
3101 case 'C':
3102 if (ifthen_state)
3103 func (stream, "%s", arm_conditional[IFTHEN_COND]);
3104 else
3105 func (stream, "s");
3106 break;
3107
3108 case 'I':
3109 {
3110 unsigned int tmp;
3111
3112 ifthen_next_state = given & 0xff;
3113 for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
3114 func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
3115 func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
3116 }
3117 break;
3118
3119 case 'x':
3120 if (ifthen_next_state)
3121 func (stream, "\t; unpredictable branch in IT block\n");
3122 break;
3123
3124 case 'X':
3125 if (ifthen_state)
3126 func (stream, "\t; unpredictable <IT:%s>",
3127 arm_conditional[IFTHEN_COND]);
3128 break;
3129
3130 case 'S':
3131 {
3132 long reg;
3133
3134 reg = (given >> 3) & 0x7;
3135 if (given & (1 << 6))
3136 reg += 8;
3137
3138 func (stream, "%s", arm_regnames[reg]);
3139 }
3140 break;
3141
3142 case 'D':
3143 {
3144 long reg;
3145
3146 reg = given & 0x7;
3147 if (given & (1 << 7))
3148 reg += 8;
3149
3150 func (stream, "%s", arm_regnames[reg]);
3151 }
3152 break;
3153
3154 case 'N':
3155 if (given & (1 << 8))
3156 domasklr = 1;
3157
3158 case 'O':
3159 if (*c == 'O' && (given & (1 << 8)))
3160 domaskpc = 1;
3161
3162 case 'M':
3163 {
3164 int started = 0;
3165 int reg;
3166
3167 func (stream, "{");
3168
3169
3170
3171 for (reg = 0; (reg < 8); reg++)
3172 if ((given & (1 << reg)) != 0)
3173 {
3174 if (started)
3175 func (stream, ", ");
3176 started = 1;
3177 func (stream, "%s", arm_regnames[reg]);
3178 }
3179
3180 if (domasklr)
3181 {
3182 if (started)
3183 func (stream, ", ");
3184 started = 1;
3185 func (stream, arm_regnames[14] );
3186 }
3187
3188 if (domaskpc)
3189 {
3190 if (started)
3191 func (stream, ", ");
3192 func (stream, arm_regnames[15] );
3193 }
3194
3195 func (stream, "}");
3196 }
3197 break;
3198
3199 case 'b':
3200
3201 {
3202 bfd_vma address = (pc + 4
3203 + ((given & 0x00f8) >> 2)
3204 + ((given & 0x0200) >> 3));
3205 info->print_address_func (address, info);
3206 }
3207 break;
3208
3209 case 's':
3210
3211
3212 {
3213 long imm = (given & 0x07c0) >> 6;
3214 if (imm == 0)
3215 imm = 32;
3216 func (stream, "#%ld", imm);
3217 }
3218 break;
3219
3220 case '0': case '1': case '2': case '3': case '4':
3221 case '5': case '6': case '7': case '8': case '9':
3222 {
3223 int bitstart = *c++ - '0';
3224 int bitend = 0;
3225
3226 while (*c >= '0' && *c <= '9')
3227 bitstart = (bitstart * 10) + *c++ - '0';
3228
3229 switch (*c)
3230 {
3231 case '-':
3232 {
3233 long reg;
3234
3235 c++;
3236 while (*c >= '0' && *c <= '9')
3237 bitend = (bitend * 10) + *c++ - '0';
3238 if (!bitend)
3239 abort ();
3240 reg = given >> bitstart;
3241 reg &= (2 << (bitend - bitstart)) - 1;
3242 switch (*c)
3243 {
3244 case 'r':
3245 func (stream, "%s", arm_regnames[reg]);
3246 break;
3247
3248 case 'd':
3249 func (stream, "%ld", reg);
3250 break;
3251
3252 case 'H':
3253 func (stream, "%ld", reg << 1);
3254 break;
3255
3256 case 'W':
3257 func (stream, "%ld", reg << 2);
3258 break;
3259
3260 case 'a':
3261
3262
3263
3264 info->print_address_func
3265 (((pc + 4) & ~3) + (reg << 2), info);
3266 break;
3267
3268 case 'x':
3269 func (stream, "0x%04lx", reg);
3270 break;
3271
3272 case 'B':
3273 reg = ((reg ^ (1 << bitend)) - (1 << bitend));
3274 info->print_address_func (reg * 2 + pc + 4, info);
3275 break;
3276
3277 case 'c':
3278 func (stream, "%s", arm_conditional [reg]);
3279 break;
3280
3281 default:
3282 abort ();
3283 }
3284 }
3285 break;
3286
3287 case '\'':
3288 c++;
3289 if ((given & (1 << bitstart)) != 0)
3290 func (stream, "%c", *c);
3291 break;
3292
3293 case '?':
3294 ++c;
3295 if ((given & (1 << bitstart)) != 0)
3296 func (stream, "%c", *c++);
3297 else
3298 func (stream, "%c", *++c);
3299 break;
3300
3301 default:
3302 abort ();
3303 }
3304 }
3305 break;
3306
3307 default:
3308 abort ();
3309 }
3310 }
3311 return;
3312 }
3313
3314
3315 abort ();
3316}
3317
3318
3319static const char *
3320psr_name (int regno)
3321{
3322 switch (regno)
3323 {
3324 case 0: return "APSR";
3325 case 1: return "IAPSR";
3326 case 2: return "EAPSR";
3327 case 3: return "PSR";
3328 case 5: return "IPSR";
3329 case 6: return "EPSR";
3330 case 7: return "IEPSR";
3331 case 8: return "MSP";
3332 case 9: return "PSP";
3333 case 16: return "PRIMASK";
3334 case 17: return "BASEPRI";
3335 case 18: return "BASEPRI_MASK";
3336 case 19: return "FAULTMASK";
3337 case 20: return "CONTROL";
3338 default: return "<unknown>";
3339 }
3340}
3341
3342
3343
3344static void
3345print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
3346{
3347 const struct opcode32 *insn;
3348 void *stream = info->stream;
3349 fprintf_ftype func = info->fprintf_func;
3350
3351 if (print_insn_coprocessor (pc, info, given, TRUE))
3352 return;
3353
3354 if (print_insn_neon (info, given, TRUE))
3355 return;
3356
3357 for (insn = thumb32_opcodes; insn->assembler; insn++)
3358 if ((given & insn->mask) == insn->value)
3359 {
3360 const char *c = insn->assembler;
3361 for (; *c; c++)
3362 {
3363 if (*c != '%')
3364 {
3365 func (stream, "%c", *c);
3366 continue;
3367 }
3368
3369 switch (*++c)
3370 {
3371 case '%':
3372 func (stream, "%%");
3373 break;
3374
3375 case 'c':
3376 if (ifthen_state)
3377 func (stream, "%s", arm_conditional[IFTHEN_COND]);
3378 break;
3379
3380 case 'x':
3381 if (ifthen_next_state)
3382 func (stream, "\t; unpredictable branch in IT block\n");
3383 break;
3384
3385 case 'X':
3386 if (ifthen_state)
3387 func (stream, "\t; unpredictable <IT:%s>",
3388 arm_conditional[IFTHEN_COND]);
3389 break;
3390
3391 case 'I':
3392 {
3393 unsigned int imm12 = 0;
3394 imm12 |= (given & 0x000000ffu);
3395 imm12 |= (given & 0x00007000u) >> 4;
3396 imm12 |= (given & 0x04000000u) >> 15;
3397 func (stream, "#%u\t; 0x%x", imm12, imm12);
3398 }
3399 break;
3400
3401 case 'M':
3402 {
3403 unsigned int bits = 0, imm, imm8, mod;
3404 bits |= (given & 0x000000ffu);
3405 bits |= (given & 0x00007000u) >> 4;
3406 bits |= (given & 0x04000000u) >> 15;
3407 imm8 = (bits & 0x0ff);
3408 mod = (bits & 0xf00) >> 8;
3409 switch (mod)
3410 {
3411 case 0: imm = imm8; break;
3412 case 1: imm = ((imm8<<16) | imm8); break;
3413 case 2: imm = ((imm8<<24) | (imm8 << 8)); break;
3414 case 3: imm = ((imm8<<24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
3415 default:
3416 mod = (bits & 0xf80) >> 7;
3417 imm8 = (bits & 0x07f) | 0x80;
3418 imm = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
3419 }
3420 func (stream, "#%u\t; 0x%x", imm, imm);
3421 }
3422 break;
3423
3424 case 'J':
3425 {
3426 unsigned int imm = 0;
3427 imm |= (given & 0x000000ffu);
3428 imm |= (given & 0x00007000u) >> 4;
3429 imm |= (given & 0x04000000u) >> 15;
3430 imm |= (given & 0x000f0000u) >> 4;
3431 func (stream, "#%u\t; 0x%x", imm, imm);
3432 }
3433 break;
3434
3435 case 'K':
3436 {
3437 unsigned int imm = 0;
3438 imm |= (given & 0x000f0000u) >> 16;
3439 imm |= (given & 0x00000ff0u) >> 0;
3440 imm |= (given & 0x0000000fu) << 12;
3441 func (stream, "#%u\t; 0x%x", imm, imm);
3442 }
3443 break;
3444
3445 case 'S':
3446 {
3447 unsigned int reg = (given & 0x0000000fu);
3448 unsigned int stp = (given & 0x00000030u) >> 4;
3449 unsigned int imm = 0;
3450 imm |= (given & 0x000000c0u) >> 6;
3451 imm |= (given & 0x00007000u) >> 10;
3452
3453 func (stream, "%s", arm_regnames[reg]);
3454 switch (stp)
3455 {
3456 case 0:
3457 if (imm > 0)
3458 func (stream, ", lsl #%u", imm);
3459 break;
3460
3461 case 1:
3462 if (imm == 0)
3463 imm = 32;
3464 func (stream, ", lsr #%u", imm);
3465 break;
3466
3467 case 2:
3468 if (imm == 0)
3469 imm = 32;
3470 func (stream, ", asr #%u", imm);
3471 break;
3472
3473 case 3:
3474 if (imm == 0)
3475 func (stream, ", rrx");
3476 else
3477 func (stream, ", ror #%u", imm);
3478 }
3479 }
3480 break;
3481
3482 case 'a':
3483 {
3484 unsigned int Rn = (given & 0x000f0000) >> 16;
3485 unsigned int U = (given & 0x00800000) >> 23;
3486 unsigned int op = (given & 0x00000f00) >> 8;
3487 unsigned int i12 = (given & 0x00000fff);
3488 unsigned int i8 = (given & 0x000000ff);
3489 bfd_boolean writeback = FALSE, postind = FALSE;
3490 int offset = 0;
3491
3492 func (stream, "[%s", arm_regnames[Rn]);
3493 if (U)
3494 offset = i12;
3495 else if (Rn == 15)
3496 offset = -(int)i12;
3497 else if (op == 0x0)
3498 {
3499 unsigned int Rm = (i8 & 0x0f);
3500 unsigned int sh = (i8 & 0x30) >> 4;
3501 func (stream, ", %s", arm_regnames[Rm]);
3502 if (sh)
3503 func (stream, ", lsl #%u", sh);
3504 func (stream, "]");
3505 break;
3506 }
3507 else switch (op)
3508 {
3509 case 0xE:
3510 offset = i8;
3511 break;
3512
3513 case 0xC:
3514 offset = -i8;
3515 break;
3516
3517 case 0xF:
3518 offset = i8;
3519 writeback = TRUE;
3520 break;
3521
3522 case 0xD:
3523 offset = -i8;
3524 writeback = TRUE;
3525 break;
3526
3527 case 0xB:
3528 offset = i8;
3529 postind = TRUE;
3530 break;
3531
3532 case 0x9:
3533 offset = -i8;
3534 postind = TRUE;
3535 break;
3536
3537 default:
3538 func (stream, ", <undefined>]");
3539 goto skip;
3540 }
3541
3542 if (postind)
3543 func (stream, "], #%d", offset);
3544 else
3545 {
3546 if (offset)
3547 func (stream, ", #%d", offset);
3548 func (stream, writeback ? "]!" : "]");
3549 }
3550
3551 if (Rn == 15)
3552 {
3553 func (stream, "\t; ");
3554 info->print_address_func (((pc + 4) & ~3) + offset, info);
3555 }
3556 }
3557 skip:
3558 break;
3559
3560 case 'A':
3561 {
3562 unsigned int P = (given & 0x01000000) >> 24;
3563 unsigned int U = (given & 0x00800000) >> 23;
3564 unsigned int W = (given & 0x00400000) >> 21;
3565 unsigned int Rn = (given & 0x000f0000) >> 16;
3566 unsigned int off = (given & 0x000000ff);
3567
3568 func (stream, "[%s", arm_regnames[Rn]);
3569 if (P)
3570 {
3571 if (off || !U)
3572 func (stream, ", #%c%u", U ? '+' : '-', off * 4);
3573 func (stream, "]");
3574 if (W)
3575 func (stream, "!");
3576 }
3577 else
3578 {
3579 func (stream, "], ");
3580 if (W)
3581 func (stream, "#%c%u", U ? '+' : '-', off * 4);
3582 else
3583 func (stream, "{%u}", off);
3584 }
3585 }
3586 break;
3587
3588 case 'w':
3589 {
3590 unsigned int Sbit = (given & 0x01000000) >> 24;
3591 unsigned int type = (given & 0x00600000) >> 21;
3592 switch (type)
3593 {
3594 case 0: func (stream, Sbit ? "sb" : "b"); break;
3595 case 1: func (stream, Sbit ? "sh" : "h"); break;
3596 case 2:
3597 if (Sbit)
3598 func (stream, "??");
3599 break;
3600 case 3:
3601 func (stream, "??");
3602 break;
3603 }
3604 }
3605 break;
3606
3607 case 'm':
3608 {
3609 int started = 0;
3610 int reg;
3611
3612 func (stream, "{");
3613 for (reg = 0; reg < 16; reg++)
3614 if ((given & (1 << reg)) != 0)
3615 {
3616 if (started)
3617 func (stream, ", ");
3618 started = 1;
3619 func (stream, "%s", arm_regnames[reg]);
3620 }
3621 func (stream, "}");
3622 }
3623 break;
3624
3625 case 'E':
3626 {
3627 unsigned int msb = (given & 0x0000001f);
3628 unsigned int lsb = 0;
3629 lsb |= (given & 0x000000c0u) >> 6;
3630 lsb |= (given & 0x00007000u) >> 10;
3631 func (stream, "#%u, #%u", lsb, msb - lsb + 1);
3632 }
3633 break;
3634
3635 case 'F':
3636 {
3637 unsigned int width = (given & 0x0000001f) + 1;
3638 unsigned int lsb = 0;
3639 lsb |= (given & 0x000000c0u) >> 6;
3640 lsb |= (given & 0x00007000u) >> 10;
3641 func (stream, "#%u, #%u", lsb, width);
3642 }
3643 break;
3644
3645 case 'b':
3646 {
3647 unsigned int S = (given & 0x04000000u) >> 26;
3648 unsigned int J1 = (given & 0x00002000u) >> 13;
3649 unsigned int J2 = (given & 0x00000800u) >> 11;
3650 int offset = 0;
3651
3652 offset |= !S << 20;
3653 offset |= J2 << 19;
3654 offset |= J1 << 18;
3655 offset |= (given & 0x003f0000) >> 4;
3656 offset |= (given & 0x000007ff) << 1;
3657 offset -= (1 << 20);
3658
3659 info->print_address_func (pc + 4 + offset, info);
3660 }
3661 break;
3662
3663 case 'B':
3664 {
3665 unsigned int S = (given & 0x04000000u) >> 26;
3666 unsigned int I1 = (given & 0x00002000u) >> 13;
3667 unsigned int I2 = (given & 0x00000800u) >> 11;
3668 int offset = 0;
3669
3670 offset |= !S << 24;
3671 offset |= !(I1 ^ S) << 23;
3672 offset |= !(I2 ^ S) << 22;
3673 offset |= (given & 0x03ff0000u) >> 4;
3674 offset |= (given & 0x000007ffu) << 1;
3675 offset -= (1 << 24);
3676 offset += pc + 4;
3677
3678
3679 if ((given & 0x00001000u) == 0)
3680 offset &= ~2u;
3681
3682 info->print_address_func (offset, info);
3683 }
3684 break;
3685
3686 case 's':
3687 {
3688 unsigned int shift = 0;
3689 shift |= (given & 0x000000c0u) >> 6;
3690 shift |= (given & 0x00007000u) >> 10;
3691 if (given & 0x00200000u)
3692 func (stream, ", asr #%u", shift);
3693 else if (shift)
3694 func (stream, ", lsl #%u", shift);
3695
3696 }
3697 break;
3698
3699 case 'R':
3700 {
3701 unsigned int rot = (given & 0x00000030) >> 4;
3702 if (rot)
3703 func (stream, ", ror #%u", rot * 8);
3704 }
3705 break;
3706
3707 case 'U':
3708 switch (given & 0xf)
3709 {
3710 case 0xf: func(stream, "sy"); break;
3711 case 0x7: func(stream, "un"); break;
3712 case 0xe: func(stream, "st"); break;
3713 case 0x6: func(stream, "unst"); break;
3714 default:
3715 func(stream, "#%d", (int)given & 0xf);
3716 break;
3717 }
3718 break;
3719
3720 case 'C':
3721 if ((given & 0xff) == 0)
3722 {
3723 func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
3724 if (given & 0x800)
3725 func (stream, "f");
3726 if (given & 0x400)
3727 func (stream, "s");
3728 if (given & 0x200)
3729 func (stream, "x");
3730 if (given & 0x100)
3731 func (stream, "c");
3732 }
3733 else
3734 {
3735 func (stream, psr_name (given & 0xff));
3736 }
3737 break;
3738
3739 case 'D':
3740 if ((given & 0xff) == 0)
3741 func (stream, "%cPSR", (given & 0x100000) ? 'S' : 'C');
3742 else
3743 func (stream, psr_name (given & 0xff));
3744 break;
3745
3746 case '0': case '1': case '2': case '3': case '4':
3747 case '5': case '6': case '7': case '8': case '9':
3748 {
3749 int width;
3750 unsigned long val;
3751
3752 c = arm_decode_bitfield (c, given, &val, &width);
3753
3754 switch (*c)
3755 {
3756 case 'd': func (stream, "%lu", val); break;
3757 case 'W': func (stream, "%lu", val * 4); break;
3758 case 'r': func (stream, "%s", arm_regnames[val]); break;
3759
3760 case 'c':
3761 func (stream, "%s", arm_conditional[val]);
3762 break;
3763
3764 case '\'':
3765 c++;
3766 if (val == ((1ul << width) - 1))
3767 func (stream, "%c", *c);
3768 break;
3769
3770 case '`':
3771 c++;
3772 if (val == 0)
3773 func (stream, "%c", *c);
3774 break;
3775
3776 case '?':
3777 func (stream, "%c", c[(1 << width) - (int)val]);
3778 c += 1 << width;
3779 break;
3780
3781 default:
3782 abort ();
3783 }
3784 }
3785 break;
3786
3787 default:
3788 abort ();
3789 }
3790 }
3791 return;
3792 }
3793
3794
3795 abort ();
3796}
3797
3798
3799
3800static void
3801print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED, struct disassemble_info *info,
3802 long given)
3803{
3804 switch (info->bytes_per_chunk)
3805 {
3806 case 1:
3807 info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
3808 break;
3809 case 2:
3810 info->fprintf_func (info->stream, ".short\t0x%04lx", given);
3811 break;
3812 case 4:
3813 info->fprintf_func (info->stream, ".word\t0x%08lx", given);
3814 break;
3815 default:
3816 abort ();
3817 }
3818}
3819
3820
3821
3822static void
3823find_ifthen_state (bfd_vma pc, struct disassemble_info *info,
3824 bfd_boolean little)
3825{
3826 unsigned char b[2];
3827 unsigned int insn;
3828 int status;
3829
3830
3831 int count;
3832 int it_count;
3833 unsigned int seen_it;
3834 bfd_vma addr;
3835
3836 ifthen_address = pc;
3837 ifthen_state = 0;
3838
3839 addr = pc;
3840 count = 1;
3841 it_count = 0;
3842 seen_it = 0;
3843
3844
3845
3846 for (;;)
3847 {
3848 if (addr == 0 || info->symbol_at_address_func(addr, info))
3849 {
3850
3851
3852 if (seen_it && (count & 1))
3853 break;
3854
3855 return;
3856 }
3857 addr -= 2;
3858 status = info->read_memory_func (addr, (bfd_byte *)b, 2, info);
3859 if (status)
3860 return;
3861
3862 if (little)
3863 insn = (b[0]) | (b[1] << 8);
3864 else
3865 insn = (b[1]) | (b[0] << 8);
3866 if (seen_it)
3867 {
3868 if ((insn & 0xf800) < 0xe800)
3869 {
3870
3871
3872
3873 if (count & 1)
3874 break;
3875 seen_it = 0;
3876 }
3877 }
3878 if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
3879 {
3880
3881 seen_it = insn;
3882 it_count = count >> 1;
3883 }
3884 if ((insn & 0xf800) >= 0xe800)
3885 count++;
3886 else
3887 count = (count + 2) | 1;
3888
3889 if (count >= 8 && !seen_it)
3890 return;
3891 }
3892
3893 ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
3894 if ((ifthen_state & 0xf) == 0)
3895 ifthen_state = 0;
3896}
3897
3898
3899
3900
3901int
3902print_insn_arm (bfd_vma pc, struct disassemble_info *info)
3903{
3904 unsigned char b[4];
3905 long given;
3906 int status;
3907 int is_thumb = FALSE;
3908 int is_data = FALSE;
3909 unsigned int size = 4;
3910 void (*printer) (bfd_vma, struct disassemble_info *, long);
3911#if 0
3912 bfd_boolean found = FALSE;
3913
3914 if (info->disassembler_options)
3915 {
3916 parse_disassembler_options (info->disassembler_options);
3917
3918
3919 info->disassembler_options = NULL;
3920 }
3921
3922
3923
3924 if (info->symtab != NULL
3925 && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
3926 {
3927 bfd_vma addr;
3928 int n;
3929 int last_sym = -1;
3930 enum map_type type = MAP_ARM;
3931
3932 if (pc <= last_mapping_addr)
3933 last_mapping_sym = -1;
3934 is_thumb = (last_type == MAP_THUMB);
3935 found = FALSE;
3936
3937
3938 n = info->symtab_pos + 1;
3939 if (n < last_mapping_sym)
3940 n = last_mapping_sym;
3941
3942
3943 for (; n < info->symtab_size; n++)
3944 {
3945 addr = bfd_asymbol_value (info->symtab[n]);
3946 if (addr > pc)
3947 break;
3948 if ((info->section == NULL
3949 || info->section == info->symtab[n]->section)
3950 && get_sym_code_type (info, n, &type))
3951 {
3952 last_sym = n;
3953 found = TRUE;
3954 }
3955 }
3956
3957 if (!found)
3958 {
3959 n = info->symtab_pos;
3960 if (n < last_mapping_sym - 1)
3961 n = last_mapping_sym - 1;
3962
3963
3964
3965 for (; n >= 0; n--)
3966 {
3967 if (get_sym_code_type (info, n, &type))
3968 {
3969 last_sym = n;
3970 found = TRUE;
3971 break;
3972 }
3973 }
3974 }
3975
3976 last_mapping_sym = last_sym;
3977 last_type = type;
3978 is_thumb = (last_type == MAP_THUMB);
3979 is_data = (last_type == MAP_DATA);
3980
3981
3982
3983
3984
3985 if (is_data)
3986 {
3987 size = 4 - (pc & 3);
3988 for (n = last_sym + 1; n < info->symtab_size; n++)
3989 {
3990 addr = bfd_asymbol_value (info->symtab[n]);
3991 if (addr > pc)
3992 {
3993 if (addr - pc < size)
3994 size = addr - pc;
3995 break;
3996 }
3997 }
3998
3999
4000
4001 if (size == 3)
4002 size = (pc & 1) ? 1 : 2;
4003 }
4004 }
4005
4006 if (info->symbols != NULL)
4007 {
4008 if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
4009 {
4010 coff_symbol_type * cs;
4011
4012 cs = coffsymbol (*info->symbols);
4013 is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
4014 || cs->native->u.syment.n_sclass == C_THUMBSTAT
4015 || cs->native->u.syment.n_sclass == C_THUMBLABEL
4016 || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
4017 || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
4018 }
4019 else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
4020 && !found)
4021 {
4022
4023
4024 elf_symbol_type * es;
4025 unsigned int type;
4026
4027 es = *(elf_symbol_type **)(info->symbols);
4028 type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
4029
4030 is_thumb = (type == STT_ARM_TFUNC) || (type == STT_ARM_16BIT);
4031 }
4032 }
4033#else
4034 int little;
4035
4036 little = (info->endian == BFD_ENDIAN_LITTLE);
4037 is_thumb |= (pc & 1);
4038 pc &= ~(bfd_vma)1;
4039#endif
4040
4041 if (force_thumb)
4042 is_thumb = TRUE;
4043
4044 info->bytes_per_line = 4;
4045
4046 if (is_data)
4047 {
4048 int i;
4049
4050
4051 info->bytes_per_chunk = size;
4052 printer = print_insn_data;
4053
4054 status = info->read_memory_func (pc, (bfd_byte *)b, size, info);
4055 given = 0;
4056 if (little)
4057 for (i = size - 1; i >= 0; i--)
4058 given = b[i] | (given << 8);
4059 else
4060 for (i = 0; i < (int) size; i++)
4061 given = b[i] | (given << 8);
4062 }
4063 else if (!is_thumb)
4064 {
4065
4066
4067 printer = print_insn_arm_internal;
4068 info->bytes_per_chunk = 4;
4069 size = 4;
4070
4071 status = info->read_memory_func (pc, (bfd_byte *)b, 4, info);
4072 if (little)
4073 given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
4074 else
4075 given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
4076 }
4077 else
4078 {
4079
4080
4081
4082
4083 printer = print_insn_thumb16;
4084 info->bytes_per_chunk = 2;
4085 size = 2;
4086
4087 status = info->read_memory_func (pc, (bfd_byte *)b, 2, info);
4088 if (little)
4089 given = (b[0]) | (b[1] << 8);
4090 else
4091 given = (b[1]) | (b[0] << 8);
4092
4093 if (!status)
4094 {
4095
4096
4097 if ((given & 0xF800) == 0xF800
4098 || (given & 0xF800) == 0xF000
4099 || (given & 0xF800) == 0xE800)
4100 {
4101 status = info->read_memory_func (pc + 2, (bfd_byte *)b, 2, info);
4102 if (little)
4103 given = (b[0]) | (b[1] << 8) | (given << 16);
4104 else
4105 given = (b[1]) | (b[0] << 8) | (given << 16);
4106
4107 printer = print_insn_thumb32;
4108 size = 4;
4109 }
4110 }
4111
4112 if (ifthen_address != pc)
4113 find_ifthen_state(pc, info, little);
4114
4115 if (ifthen_state)
4116 {
4117 if ((ifthen_state & 0xf) == 0x8)
4118 ifthen_next_state = 0;
4119 else
4120 ifthen_next_state = (ifthen_state & 0xe0)
4121 | ((ifthen_state & 0xf) << 1);
4122 }
4123 }
4124
4125 if (status)
4126 {
4127 info->memory_error_func (status, pc, info);
4128 return -1;
4129 }
4130 if (info->flags & INSN_HAS_RELOC)
4131
4132
4133
4134
4135
4136 pc = 0;
4137
4138 printer (pc, info, given);
4139
4140 if (is_thumb)
4141 {
4142 ifthen_state = ifthen_next_state;
4143 ifthen_address += size;
4144 }
4145 return size;
4146}
4147
4148void
4149print_arm_disassembler_options (FILE *stream)
4150{
4151 int i;
4152
4153 fprintf (stream, _("\n\
4154The following ARM specific disassembler options are supported for use with\n\
4155the -M switch:\n"));
4156
4157 for (i = NUM_ARM_REGNAMES; i--;)
4158 fprintf (stream, " reg-names-%s %*c%s\n",
4159 regnames[i].name,
4160 (int)(14 - strlen (regnames[i].name)), ' ',
4161 regnames[i].description);
4162
4163 fprintf (stream, " force-thumb Assume all insns are Thumb insns\n");
4164 fprintf (stream, " no-force-thumb Examine preceeding label to determine an insn's type\n\n");
4165}
4166