]> git.proxmox.com Git - mirror_qemu.git/blob - disas/cris.c
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
[mirror_qemu.git] / disas / cris.c
1 /* Disassembler code for CRIS.
2 Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Axis Communications AB, Lund, Sweden.
4 Written by Hans-Peter Nilsson.
5
6 This file is part of the GNU binutils and GDB, the GNU debugger.
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, see <http://www.gnu.org/licenses/>. */
20
21 #include "qemu-common.h"
22 #include "disas/bfd.h"
23 //#include "sysdep.h"
24 #include "target-cris/opcode-cris.h"
25 //#include "libiberty.h"
26
27 #define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
28
29 /* cris-opc.c -- Table of opcodes for the CRIS processor.
30 Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
31 Contributed by Axis Communications AB, Lund, Sweden.
32 Originally written for GAS 1.38.1 by Mikael Asker.
33 Reorganized by Hans-Peter Nilsson.
34
35 This file is part of GAS, GDB and the GNU binutils.
36
37 GAS, GDB, and GNU binutils is free software; you can redistribute it
38 and/or modify it under the terms of the GNU General Public License as
39 published by the Free Software Foundation; either version 2, or (at your
40 option) any later version.
41
42 GAS, GDB, and GNU binutils are distributed in the hope that they will be
43 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
44 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45 GNU General Public License for more details.
46
47 You should have received a copy of the GNU General Public License
48 along with this program; if not, see <http://www.gnu.org/licenses/>. */
49
50 #ifndef NULL
51 #define NULL (0)
52 #endif
53
54 /* This table isn't used for CRISv32 and the size of immediate operands. */
55 const struct cris_spec_reg
56 cris_spec_regs[] =
57 {
58 {"bz", 0, 1, cris_ver_v32p, NULL},
59 {"p0", 0, 1, 0, NULL},
60 {"vr", 1, 1, 0, NULL},
61 {"p1", 1, 1, 0, NULL},
62 {"pid", 2, 1, cris_ver_v32p, NULL},
63 {"p2", 2, 1, cris_ver_v32p, NULL},
64 {"p2", 2, 1, cris_ver_warning, NULL},
65 {"srs", 3, 1, cris_ver_v32p, NULL},
66 {"p3", 3, 1, cris_ver_v32p, NULL},
67 {"p3", 3, 1, cris_ver_warning, NULL},
68 {"wz", 4, 2, cris_ver_v32p, NULL},
69 {"p4", 4, 2, 0, NULL},
70 {"ccr", 5, 2, cris_ver_v0_10, NULL},
71 {"exs", 5, 4, cris_ver_v32p, NULL},
72 {"p5", 5, 2, cris_ver_v0_10, NULL},
73 {"p5", 5, 4, cris_ver_v32p, NULL},
74 {"dcr0",6, 2, cris_ver_v0_3, NULL},
75 {"eda", 6, 4, cris_ver_v32p, NULL},
76 {"p6", 6, 2, cris_ver_v0_3, NULL},
77 {"p6", 6, 4, cris_ver_v32p, NULL},
78 {"dcr1/mof", 7, 4, cris_ver_v10p,
79 "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
80 {"dcr1/mof", 7, 2, cris_ver_v0_3,
81 "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
82 {"mof", 7, 4, cris_ver_v10p, NULL},
83 {"dcr1",7, 2, cris_ver_v0_3, NULL},
84 {"p7", 7, 4, cris_ver_v10p, NULL},
85 {"p7", 7, 2, cris_ver_v0_3, NULL},
86 {"dz", 8, 4, cris_ver_v32p, NULL},
87 {"p8", 8, 4, 0, NULL},
88 {"ibr", 9, 4, cris_ver_v0_10, NULL},
89 {"ebp", 9, 4, cris_ver_v32p, NULL},
90 {"p9", 9, 4, 0, NULL},
91 {"irp", 10, 4, cris_ver_v0_10, NULL},
92 {"erp", 10, 4, cris_ver_v32p, NULL},
93 {"p10", 10, 4, 0, NULL},
94 {"srp", 11, 4, 0, NULL},
95 {"p11", 11, 4, 0, NULL},
96 /* For disassembly use only. Accept at assembly with a warning. */
97 {"bar/dtp0", 12, 4, cris_ver_warning,
98 "Ambiguous register `bar/dtp0' specified"},
99 {"nrp", 12, 4, cris_ver_v32p, NULL},
100 {"bar", 12, 4, cris_ver_v8_10, NULL},
101 {"dtp0",12, 4, cris_ver_v0_3, NULL},
102 {"p12", 12, 4, 0, NULL},
103 /* For disassembly use only. Accept at assembly with a warning. */
104 {"dccr/dtp1",13, 4, cris_ver_warning,
105 "Ambiguous register `dccr/dtp1' specified"},
106 {"ccs", 13, 4, cris_ver_v32p, NULL},
107 {"dccr",13, 4, cris_ver_v8_10, NULL},
108 {"dtp1",13, 4, cris_ver_v0_3, NULL},
109 {"p13", 13, 4, 0, NULL},
110 {"brp", 14, 4, cris_ver_v3_10, NULL},
111 {"usp", 14, 4, cris_ver_v32p, NULL},
112 {"p14", 14, 4, cris_ver_v3p, NULL},
113 {"usp", 15, 4, cris_ver_v10, NULL},
114 {"spc", 15, 4, cris_ver_v32p, NULL},
115 {"p15", 15, 4, cris_ver_v10p, NULL},
116 {NULL, 0, 0, cris_ver_version_all, NULL}
117 };
118
119 /* Add version specifiers to this table when necessary.
120 The (now) regular coding of register names suggests a simpler
121 implementation. */
122 const struct cris_support_reg cris_support_regs[] =
123 {
124 {"s0", 0},
125 {"s1", 1},
126 {"s2", 2},
127 {"s3", 3},
128 {"s4", 4},
129 {"s5", 5},
130 {"s6", 6},
131 {"s7", 7},
132 {"s8", 8},
133 {"s9", 9},
134 {"s10", 10},
135 {"s11", 11},
136 {"s12", 12},
137 {"s13", 13},
138 {"s14", 14},
139 {"s15", 15},
140 {NULL, 0}
141 };
142
143 /* All CRIS opcodes are 16 bits.
144
145 - The match component is a mask saying which bits must match a
146 particular opcode in order for an instruction to be an instance
147 of that opcode.
148
149 - The args component is a string containing characters symbolically
150 matching the operands of an instruction. Used for both assembly
151 and disassembly.
152
153 Operand-matching characters:
154 [ ] , space
155 Verbatim.
156 A The string "ACR" (case-insensitive).
157 B Not really an operand. It causes a "BDAP -size,SP" prefix to be
158 output for the PUSH alias-instructions and recognizes a push-
159 prefix at disassembly. This letter isn't recognized for v32.
160 Must be followed by a R or P letter.
161 ! Non-match pattern, will not match if there's a prefix insn.
162 b Non-matching operand, used for branches with 16-bit
163 displacement. Only recognized by the disassembler.
164 c 5-bit unsigned immediate in bits <4:0>.
165 C 4-bit unsigned immediate in bits <3:0>.
166 d At assembly, optionally (as in put other cases before this one)
167 ".d" or ".D" at the start of the operands, followed by one space
168 character. At disassembly, nothing.
169 D General register in bits <15:12> and <3:0>.
170 f List of flags in bits <15:12> and <3:0>.
171 i 6-bit signed immediate in bits <5:0>.
172 I 6-bit unsigned immediate in bits <5:0>.
173 M Size modifier (B, W or D) for CLEAR instructions.
174 m Size modifier (B, W or D) in bits <5:4>
175 N A 32-bit dword, like in the difference between s and y.
176 This has no effect on bits in the opcode. Can also be expressed
177 as "[pc+]" in input.
178 n As N, but PC-relative (to the start of the instruction).
179 o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
180 branch instructions.
181 O [-128..127] offset in bits <7:0>. Also matches a comma and a
182 general register after the expression, in bits <15:12>. Used
183 only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
184 P Special register in bits <15:12>.
185 p Indicates that the insn is a prefix insn. Must be first
186 character.
187 Q As O, but don't relax; force an 8-bit offset.
188 R General register in bits <15:12>.
189 r General register in bits <3:0>.
190 S Source operand in bit <10> and a prefix; a 3-operand prefix
191 without side-effect.
192 s Source operand in bits <10> and <3:0>, optionally with a
193 side-effect prefix, except [pc] (the name, not R15 as in ACR)
194 isn't allowed for v32 and higher.
195 T Support register in bits <15:12>.
196 u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
197 U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
198 Not recognized at disassembly.
199 x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
200 y Like 's' but do not allow an integer at assembly.
201 Y The difference s-y; only an integer is allowed.
202 z Size modifier (B or W) in bit <4>. */
203
204
205 /* Please note the order of the opcodes in this table is significant.
206 The assembler requires that all instances of the same mnemonic must
207 be consecutive. If they aren't, the assembler might not recognize
208 them, or may indicate an internal error.
209
210 The disassembler should not normally care about the order of the
211 opcodes, but will prefer an earlier alternative if the "match-score"
212 (see cris-dis.c) is computed as equal.
213
214 It should not be significant for proper execution that this table is
215 in alphabetical order, but please follow that convention for an easy
216 overview. */
217
218 const struct cris_opcode
219 cris_opcodes[] =
220 {
221 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0,
222 cris_abs_op},
223
224 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0,
225 cris_reg_mode_add_sub_cmp_and_or_move_op},
226
227 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0,
228 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
229
230 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE,
231 cris_ver_v0_10,
232 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
233
234 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE,
235 cris_ver_v0_10,
236 cris_three_operand_add_sub_cmp_and_or_op},
237
238 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD,
239 cris_ver_v32p,
240 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
241
242 {"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32,
243 cris_ver_v32p,
244 cris_not_implemented_op},
245
246 {"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32,
247 cris_ver_v32p,
248 cris_not_implemented_op},
249
250 {"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE,
251 cris_ver_v32p,
252 cris_addi_op},
253
254 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0,
255 cris_addi_op},
256
257 /* This collates after "addo", but we want to disassemble as "addoq",
258 not "addo". */
259 {"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE,
260 cris_ver_v32p,
261 cris_not_implemented_op},
262
263 {"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED,
264 cris_ver_v32p,
265 cris_not_implemented_op},
266
267 /* This must be located after the insn above, lest we misinterpret
268 "addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a
269 parser bug. */
270 {"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE,
271 cris_ver_v32p,
272 cris_not_implemented_op},
273
274 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0,
275 cris_quick_mode_add_sub_op},
276
277 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0,
278 cris_reg_mode_add_sub_cmp_and_or_move_op},
279
280 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
281 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0,
282 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
283
284 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE,
285 cris_ver_v0_10,
286 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
287
288 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE,
289 cris_ver_v0_10,
290 cris_three_operand_add_sub_cmp_and_or_op},
291
292 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0,
293 cris_reg_mode_add_sub_cmp_and_or_move_op},
294
295 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
296 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0,
297 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
298
299 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE,
300 cris_ver_v0_10,
301 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
302
303 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE,
304 cris_ver_v0_10,
305 cris_three_operand_add_sub_cmp_and_or_op},
306
307 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0,
308 cris_reg_mode_add_sub_cmp_and_or_move_op},
309
310 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0,
311 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
312
313 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE,
314 cris_ver_v0_10,
315 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
316
317 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE,
318 cris_ver_v0_10,
319 cris_three_operand_add_sub_cmp_and_or_op},
320
321 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0,
322 cris_quick_mode_and_cmp_move_or_op},
323
324 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0,
325 cris_asr_op},
326
327 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0,
328 cris_asrq_op},
329
330 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0,
331 cris_ax_ei_setf_op},
332
333 /* FIXME: Should use branch #defines. */
334 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0,
335 cris_sixteen_bit_offset_branch_op},
336
337 {"ba",
338 BA_QUICK_OPCODE,
339 0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0,
340 cris_eight_bit_offset_branch_op},
341
342 /* Needs to come after the usual "ba o", which might be relaxed to
343 this one. */
344 {"ba", BA_DWORD_OPCODE,
345 0xffff & (~BA_DWORD_OPCODE), "n", 0, SIZE_FIX_32,
346 cris_ver_v32p,
347 cris_none_reg_mode_jump_op},
348
349 {"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32,
350 cris_ver_v32p,
351 cris_none_reg_mode_jump_op},
352
353 {"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32,
354 cris_ver_v32p,
355 cris_none_reg_mode_jump_op},
356
357 {"bcc",
358 BRANCH_QUICK_OPCODE+CC_CC*0x1000,
359 0x0f00+(0xF-CC_CC)*0x1000, "o", 1, SIZE_NONE, 0,
360 cris_eight_bit_offset_branch_op},
361
362 {"bcs",
363 BRANCH_QUICK_OPCODE+CC_CS*0x1000,
364 0x0f00+(0xF-CC_CS)*0x1000, "o", 1, SIZE_NONE, 0,
365 cris_eight_bit_offset_branch_op},
366
367 {"bdap",
368 BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD_SIGNED,
369 cris_ver_v0_10,
370 cris_bdap_prefix},
371
372 {"bdap",
373 BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE,
374 cris_ver_v0_10,
375 cris_quick_mode_bdap_prefix},
376
377 {"beq",
378 BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
379 0x0f00+(0xF-CC_EQ)*0x1000, "o", 1, SIZE_NONE, 0,
380 cris_eight_bit_offset_branch_op},
381
382 /* This is deliberately put before "bext" to trump it, even though not
383 in alphabetical order, since we don't do excluding version checks
384 for v0..v10. */
385 {"bwf",
386 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
387 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
388 cris_ver_v10,
389 cris_eight_bit_offset_branch_op},
390
391 {"bext",
392 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
393 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
394 cris_ver_v0_3,
395 cris_eight_bit_offset_branch_op},
396
397 {"bge",
398 BRANCH_QUICK_OPCODE+CC_GE*0x1000,
399 0x0f00+(0xF-CC_GE)*0x1000, "o", 1, SIZE_NONE, 0,
400 cris_eight_bit_offset_branch_op},
401
402 {"bgt",
403 BRANCH_QUICK_OPCODE+CC_GT*0x1000,
404 0x0f00+(0xF-CC_GT)*0x1000, "o", 1, SIZE_NONE, 0,
405 cris_eight_bit_offset_branch_op},
406
407 {"bhi",
408 BRANCH_QUICK_OPCODE+CC_HI*0x1000,
409 0x0f00+(0xF-CC_HI)*0x1000, "o", 1, SIZE_NONE, 0,
410 cris_eight_bit_offset_branch_op},
411
412 {"bhs",
413 BRANCH_QUICK_OPCODE+CC_HS*0x1000,
414 0x0f00+(0xF-CC_HS)*0x1000, "o", 1, SIZE_NONE, 0,
415 cris_eight_bit_offset_branch_op},
416
417 {"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE,
418 cris_ver_v0_10,
419 cris_biap_prefix},
420
421 {"ble",
422 BRANCH_QUICK_OPCODE+CC_LE*0x1000,
423 0x0f00+(0xF-CC_LE)*0x1000, "o", 1, SIZE_NONE, 0,
424 cris_eight_bit_offset_branch_op},
425
426 {"blo",
427 BRANCH_QUICK_OPCODE+CC_LO*0x1000,
428 0x0f00+(0xF-CC_LO)*0x1000, "o", 1, SIZE_NONE, 0,
429 cris_eight_bit_offset_branch_op},
430
431 {"bls",
432 BRANCH_QUICK_OPCODE+CC_LS*0x1000,
433 0x0f00+(0xF-CC_LS)*0x1000, "o", 1, SIZE_NONE, 0,
434 cris_eight_bit_offset_branch_op},
435
436 {"blt",
437 BRANCH_QUICK_OPCODE+CC_LT*0x1000,
438 0x0f00+(0xF-CC_LT)*0x1000, "o", 1, SIZE_NONE, 0,
439 cris_eight_bit_offset_branch_op},
440
441 {"bmi",
442 BRANCH_QUICK_OPCODE+CC_MI*0x1000,
443 0x0f00+(0xF-CC_MI)*0x1000, "o", 1, SIZE_NONE, 0,
444 cris_eight_bit_offset_branch_op},
445
446 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32,
447 cris_ver_sim_v0_10,
448 cris_not_implemented_op},
449
450 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE,
451 cris_ver_sim_v0_10,
452 cris_not_implemented_op},
453
454 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE,
455 cris_ver_sim_v0_10,
456 cris_not_implemented_op},
457
458 {"bne",
459 BRANCH_QUICK_OPCODE+CC_NE*0x1000,
460 0x0f00+(0xF-CC_NE)*0x1000, "o", 1, SIZE_NONE, 0,
461 cris_eight_bit_offset_branch_op},
462
463 {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE, 0,
464 cris_two_operand_bound_op},
465 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
466 {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD,
467 cris_ver_v0_10,
468 cris_two_operand_bound_op},
469 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
470 {"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD, 0,
471 cris_two_operand_bound_op},
472 {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE,
473 cris_ver_v0_10,
474 cris_two_operand_bound_op},
475 {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE,
476 cris_ver_v0_10,
477 cris_three_operand_bound_op},
478
479 {"bpl",
480 BRANCH_QUICK_OPCODE+CC_PL*0x1000,
481 0x0f00+(0xF-CC_PL)*0x1000, "o", 1, SIZE_NONE, 0,
482 cris_eight_bit_offset_branch_op},
483
484 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE,
485 cris_ver_v3p,
486 cris_break_op},
487
488 {"bsb",
489 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
490 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
491 cris_ver_v32p,
492 cris_eight_bit_offset_branch_op},
493
494 {"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32,
495 cris_ver_v32p,
496 cris_none_reg_mode_jump_op},
497
498 {"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32,
499 cris_ver_v32p,
500 cris_none_reg_mode_jump_op},
501
502 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32,
503 cris_ver_warning,
504 cris_not_implemented_op},
505
506 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE,
507 cris_ver_warning,
508 cris_not_implemented_op},
509
510 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE,
511 cris_ver_warning,
512 cris_not_implemented_op},
513
514 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0,
515 cris_btst_nop_op},
516 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0,
517 cris_btst_nop_op},
518
519 {"bvc",
520 BRANCH_QUICK_OPCODE+CC_VC*0x1000,
521 0x0f00+(0xF-CC_VC)*0x1000, "o", 1, SIZE_NONE, 0,
522 cris_eight_bit_offset_branch_op},
523
524 {"bvs",
525 BRANCH_QUICK_OPCODE+CC_VS*0x1000,
526 0x0f00+(0xF-CC_VS)*0x1000, "o", 1, SIZE_NONE, 0,
527 cris_eight_bit_offset_branch_op},
528
529 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0,
530 cris_reg_mode_clear_op},
531
532 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0,
533 cris_none_reg_mode_clear_test_op},
534
535 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE,
536 cris_ver_v0_10,
537 cris_none_reg_mode_clear_test_op},
538
539 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0,
540 cris_clearf_di_op},
541
542 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0,
543 cris_reg_mode_add_sub_cmp_and_or_move_op},
544
545 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0,
546 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
547
548 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE,
549 cris_ver_v0_10,
550 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
551
552 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0,
553 cris_quick_mode_and_cmp_move_or_op},
554
555 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
556 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0,
557 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
558
559 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE,
560 cris_ver_v0_10,
561 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
562
563 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
564 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0,
565 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
566
567 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE,
568 cris_ver_v0_10,
569 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
570
571 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0,
572 cris_clearf_di_op},
573
574 {"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32,
575 cris_ver_v0_10,
576 cris_dip_prefix},
577
578 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0,
579 cris_not_implemented_op},
580
581 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0,
582 cris_dstep_logshift_mstep_neg_not_op},
583
584 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0,
585 cris_ax_ei_setf_op},
586
587 {"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE,
588 cris_ver_v32p,
589 cris_not_implemented_op},
590
591 {"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE,
592 cris_ver_v32p,
593 cris_not_implemented_op},
594
595 {"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE,
596 cris_ver_v32p,
597 cris_not_implemented_op},
598
599 {"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE,
600 cris_ver_v32p,
601 cris_not_implemented_op},
602
603 {"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE,
604 cris_ver_v32p,
605 cris_not_implemented_op},
606
607 {"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE,
608 cris_ver_v32p,
609 cris_reg_mode_jump_op},
610
611 {"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32,
612 cris_ver_v32p,
613 cris_reg_mode_jump_op},
614
615 {"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE,
616 cris_ver_v32p,
617 cris_reg_mode_jump_op},
618
619 {"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32,
620 cris_ver_v32p,
621 cris_reg_mode_jump_op},
622
623 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE,
624 cris_ver_v8_10,
625 cris_reg_mode_jump_op},
626
627 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32,
628 cris_ver_v8_10,
629 cris_none_reg_mode_jump_op},
630
631 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE,
632 cris_ver_v8_10,
633 cris_none_reg_mode_jump_op},
634
635 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE,
636 cris_ver_v8_10,
637 cris_reg_mode_jump_op},
638
639 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32,
640 cris_ver_v8_10,
641 cris_none_reg_mode_jump_op},
642
643 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE,
644 cris_ver_v8_10,
645 cris_none_reg_mode_jump_op},
646
647 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE,
648 cris_ver_v8_10,
649 cris_reg_mode_jump_op},
650
651 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32,
652 cris_ver_v8_10,
653 cris_none_reg_mode_jump_op},
654
655 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE,
656 cris_ver_v8_10,
657 cris_none_reg_mode_jump_op},
658
659 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0,
660 cris_reg_mode_jump_op},
661
662 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32,
663 cris_ver_v0_10,
664 cris_none_reg_mode_jump_op},
665
666 {"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32,
667 cris_ver_v32p,
668 cris_none_reg_mode_jump_op},
669
670 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE,
671 cris_ver_v0_10,
672 cris_none_reg_mode_jump_op},
673
674 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE,
675 cris_ver_v8_10,
676 cris_reg_mode_jump_op},
677
678 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32,
679 cris_ver_v8_10,
680 cris_none_reg_mode_jump_op},
681
682 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE,
683 cris_ver_v8_10,
684 cris_none_reg_mode_jump_op},
685
686 {"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE,
687 cris_ver_v32p,
688 cris_reg_mode_jump_op},
689
690 {"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32,
691 cris_ver_v32p,
692 cris_reg_mode_jump_op},
693
694 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0,
695 cris_reg_mode_jump_op},
696
697 {"jump",
698 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32,
699 cris_ver_v0_10,
700 cris_none_reg_mode_jump_op},
701
702 {"jump",
703 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE,
704 cris_ver_v0_10,
705 cris_none_reg_mode_jump_op},
706
707 {"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE,
708 cris_ver_v32p,
709 cris_none_reg_mode_jump_op},
710
711 {"jump",
712 JUMP_PC_INCR_OPCODE_V32,
713 (0xffff & ~JUMP_PC_INCR_OPCODE_V32), "N", 0, SIZE_FIX_32,
714 cris_ver_v32p,
715 cris_none_reg_mode_jump_op},
716
717 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32,
718 cris_ver_v10,
719 cris_none_reg_mode_jump_op},
720
721 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE,
722 cris_ver_v10,
723 cris_none_reg_mode_jump_op},
724
725 {"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE,
726 cris_ver_v32p,
727 cris_not_implemented_op},
728
729 {"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32,
730 cris_ver_v32p,
731 cris_not_implemented_op},
732
733 {"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE,
734 cris_ver_v32p,
735 cris_addi_op},
736
737 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0,
738 cris_dstep_logshift_mstep_neg_not_op},
739
740 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0,
741 cris_dstep_logshift_mstep_neg_not_op},
742
743 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0,
744 cris_dstep_logshift_mstep_neg_not_op},
745
746 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0,
747 cris_dstep_logshift_mstep_neg_not_op},
748
749 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE,
750 cris_ver_v3p,
751 cris_not_implemented_op},
752
753 {"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE,
754 cris_ver_v32p,
755 cris_not_implemented_op},
756
757 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0,
758 cris_reg_mode_add_sub_cmp_and_or_move_op},
759
760 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0,
761 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
762
763 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE,
764 cris_ver_v0_10,
765 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
766
767 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0,
768 cris_move_to_preg_op},
769
770 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0,
771 cris_reg_mode_move_from_preg_op},
772
773 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0,
774 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
775
776 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE,
777 cris_ver_v0_10,
778 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
779
780 {"move",
781 MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
782 "s,P", 0, SIZE_SPEC_REG, 0,
783 cris_move_to_preg_op},
784
785 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE,
786 cris_ver_v0_10,
787 cris_move_to_preg_op},
788
789 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0,
790 cris_none_reg_mode_move_from_preg_op},
791
792 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE,
793 cris_ver_v0_10,
794 cris_none_reg_mode_move_from_preg_op},
795
796 {"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE,
797 cris_ver_v32p,
798 cris_not_implemented_op},
799
800 {"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE,
801 cris_ver_v32p,
802 cris_not_implemented_op},
803
804 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0,
805 cris_move_reg_to_mem_movem_op},
806
807 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE,
808 cris_ver_v0_10,
809 cris_move_reg_to_mem_movem_op},
810
811 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0,
812 cris_move_mem_to_reg_movem_op},
813
814 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE,
815 cris_ver_v0_10,
816 cris_move_mem_to_reg_movem_op},
817
818 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0,
819 cris_quick_mode_and_cmp_move_or_op},
820
821 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0,
822 cris_reg_mode_add_sub_cmp_and_or_move_op},
823
824 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
825 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0,
826 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
827
828 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE,
829 cris_ver_v0_10,
830 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
831
832 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0,
833 cris_reg_mode_add_sub_cmp_and_or_move_op},
834
835 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
836 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0,
837 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
838
839 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE,
840 cris_ver_v0_10,
841 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
842
843 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE,
844 cris_ver_v0_10,
845 cris_dstep_logshift_mstep_neg_not_op},
846
847 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE,
848 cris_ver_v10p,
849 cris_muls_op},
850
851 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE,
852 cris_ver_v10p,
853 cris_mulu_op},
854
855 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0,
856 cris_dstep_logshift_mstep_neg_not_op},
857
858 {"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE,
859 cris_ver_v0_10,
860 cris_btst_nop_op},
861
862 {"nop", NOP_OPCODE_V32, NOP_Z_BITS_V32, "", 0, SIZE_NONE,
863 cris_ver_v32p,
864 cris_btst_nop_op},
865
866 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0,
867 cris_dstep_logshift_mstep_neg_not_op},
868
869 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0,
870 cris_reg_mode_add_sub_cmp_and_or_move_op},
871
872 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0,
873 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
874
875 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE,
876 cris_ver_v0_10,
877 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
878
879 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE,
880 cris_ver_v0_10,
881 cris_three_operand_add_sub_cmp_and_or_op},
882
883 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0,
884 cris_quick_mode_and_cmp_move_or_op},
885
886 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE,
887 cris_ver_v0_10,
888 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
889
890 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE,
891 cris_ver_v0_10,
892 cris_none_reg_mode_move_from_preg_op},
893
894 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE,
895 cris_ver_v0_10,
896 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
897
898 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE,
899 cris_ver_v0_10,
900 cris_move_to_preg_op},
901
902 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE,
903 cris_ver_v10,
904 cris_not_implemented_op},
905
906 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE,
907 cris_ver_v10,
908 cris_not_implemented_op},
909
910 {"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE,
911 cris_ver_v32p,
912 cris_not_implemented_op},
913
914 {"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE,
915 cris_ver_v32p,
916 cris_not_implemented_op},
917
918 {"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE,
919 cris_ver_v32p,
920 cris_not_implemented_op},
921
922 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE,
923 cris_ver_v0_10,
924 cris_reg_mode_move_from_preg_op},
925
926 {"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE,
927 cris_ver_v32p,
928 cris_reg_mode_move_from_preg_op},
929
930 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE,
931 cris_ver_v0_10,
932 cris_reg_mode_move_from_preg_op},
933
934 {"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE,
935 cris_ver_v32p,
936 cris_reg_mode_move_from_preg_op},
937
938 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE,
939 cris_ver_v0_10,
940 cris_reg_mode_move_from_preg_op},
941
942 {"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE,
943 cris_ver_v32p,
944 cris_reg_mode_move_from_preg_op},
945
946 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE,
947 cris_ver_v10,
948 cris_not_implemented_op},
949
950 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE,
951 cris_ver_v10,
952 cris_not_implemented_op},
953
954 {"sa",
955 0x0530+CC_A*0x1000,
956 0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0,
957 cris_scc_op},
958
959 {"ssb",
960 0x0530+CC_EXT*0x1000,
961 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
962 cris_ver_v32p,
963 cris_scc_op},
964
965 {"scc",
966 0x0530+CC_CC*0x1000,
967 0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0,
968 cris_scc_op},
969
970 {"scs",
971 0x0530+CC_CS*0x1000,
972 0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0,
973 cris_scc_op},
974
975 {"seq",
976 0x0530+CC_EQ*0x1000,
977 0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0,
978 cris_scc_op},
979
980 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0,
981 cris_ax_ei_setf_op},
982
983 {"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE,
984 cris_ver_v32p,
985 cris_not_implemented_op},
986
987 /* Need to have "swf" in front of "sext" so it is the one displayed in
988 disassembly. */
989 {"swf",
990 0x0530+CC_EXT*0x1000,
991 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
992 cris_ver_v10,
993 cris_scc_op},
994
995 {"sext",
996 0x0530+CC_EXT*0x1000,
997 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
998 cris_ver_v0_3,
999 cris_scc_op},
1000
1001 {"sge",
1002 0x0530+CC_GE*0x1000,
1003 0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0,
1004 cris_scc_op},
1005
1006 {"sgt",
1007 0x0530+CC_GT*0x1000,
1008 0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0,
1009 cris_scc_op},
1010
1011 {"shi",
1012 0x0530+CC_HI*0x1000,
1013 0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0,
1014 cris_scc_op},
1015
1016 {"shs",
1017 0x0530+CC_HS*0x1000,
1018 0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0,
1019 cris_scc_op},
1020
1021 {"sle",
1022 0x0530+CC_LE*0x1000,
1023 0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0,
1024 cris_scc_op},
1025
1026 {"slo",
1027 0x0530+CC_LO*0x1000,
1028 0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0,
1029 cris_scc_op},
1030
1031 {"sls",
1032 0x0530+CC_LS*0x1000,
1033 0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0,
1034 cris_scc_op},
1035
1036 {"slt",
1037 0x0530+CC_LT*0x1000,
1038 0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0,
1039 cris_scc_op},
1040
1041 {"smi",
1042 0x0530+CC_MI*0x1000,
1043 0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0,
1044 cris_scc_op},
1045
1046 {"sne",
1047 0x0530+CC_NE*0x1000,
1048 0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0,
1049 cris_scc_op},
1050
1051 {"spl",
1052 0x0530+CC_PL*0x1000,
1053 0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0,
1054 cris_scc_op},
1055
1056 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0,
1057 cris_reg_mode_add_sub_cmp_and_or_move_op},
1058
1059 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0,
1060 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1061
1062 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE,
1063 cris_ver_v0_10,
1064 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1065
1066 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE,
1067 cris_ver_v0_10,
1068 cris_three_operand_add_sub_cmp_and_or_op},
1069
1070 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0,
1071 cris_quick_mode_add_sub_op},
1072
1073 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0,
1074 cris_reg_mode_add_sub_cmp_and_or_move_op},
1075
1076 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
1077 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0,
1078 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1079
1080 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE,
1081 cris_ver_v0_10,
1082 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1083
1084 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE,
1085 cris_ver_v0_10,
1086 cris_three_operand_add_sub_cmp_and_or_op},
1087
1088 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0,
1089 cris_reg_mode_add_sub_cmp_and_or_move_op},
1090
1091 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
1092 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0,
1093 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1094
1095 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE,
1096 cris_ver_v0_10,
1097 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1098
1099 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE,
1100 cris_ver_v0_10,
1101 cris_three_operand_add_sub_cmp_and_or_op},
1102
1103 {"svc",
1104 0x0530+CC_VC*0x1000,
1105 0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0,
1106 cris_scc_op},
1107
1108 {"svs",
1109 0x0530+CC_VS*0x1000,
1110 0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0,
1111 cris_scc_op},
1112
1113 /* The insn "swapn" is the same as "not" and will be disassembled as
1114 such, but the swap* family of mnmonics are generally v8-and-higher
1115 only, so count it in. */
1116 {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE,
1117 cris_ver_v8p,
1118 cris_not_implemented_op},
1119
1120 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE,
1121 cris_ver_v8p,
1122 cris_not_implemented_op},
1123
1124 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE,
1125 cris_ver_v8p,
1126 cris_not_implemented_op},
1127
1128 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE,
1129 cris_ver_v8p,
1130 cris_not_implemented_op},
1131
1132 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE,
1133 cris_ver_v8p,
1134 cris_not_implemented_op},
1135
1136 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE,
1137 cris_ver_v8p,
1138 cris_not_implemented_op},
1139
1140 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE,
1141 cris_ver_v8p,
1142 cris_not_implemented_op},
1143
1144 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE,
1145 cris_ver_v8p,
1146 cris_not_implemented_op},
1147
1148 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE,
1149 cris_ver_v8p,
1150 cris_not_implemented_op},
1151
1152 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE,
1153 cris_ver_v8p,
1154 cris_not_implemented_op},
1155
1156 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE,
1157 cris_ver_v8p,
1158 cris_not_implemented_op},
1159
1160 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE,
1161 cris_ver_v8p,
1162 cris_not_implemented_op},
1163
1164 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE,
1165 cris_ver_v8p,
1166 cris_not_implemented_op},
1167
1168 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE,
1169 cris_ver_v8p,
1170 cris_not_implemented_op},
1171
1172 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE,
1173 cris_ver_v8p,
1174 cris_not_implemented_op},
1175
1176 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE,
1177 cris_ver_v0_10,
1178 cris_reg_mode_test_op},
1179
1180 {"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD, 0,
1181 cris_none_reg_mode_clear_test_op},
1182
1183 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE,
1184 cris_ver_v0_10,
1185 cris_none_reg_mode_clear_test_op},
1186
1187 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0,
1188 cris_xor_op},
1189
1190 {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1191 };
1192
1193 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1194 const char * const
1195 cris_cc_strings[] =
1196 {
1197 "hs",
1198 "lo",
1199 "ne",
1200 "eq",
1201 "vc",
1202 "vs",
1203 "pl",
1204 "mi",
1205 "ls",
1206 "hi",
1207 "ge",
1208 "lt",
1209 "gt",
1210 "le",
1211 "a",
1212 /* This is a placeholder. In v0, this would be "ext". In v32, this
1213 is "sb". */
1214 "wf"
1215 };
1216
1217 /*
1218 * Local variables:
1219 * eval: (c-set-style "gnu")
1220 * indent-tabs-mode: t
1221 * End:
1222 */
1223
1224
1225 /* No instruction will be disassembled longer than this. In theory, and
1226 in silicon, address prefixes can be cascaded. In practice, cascading
1227 is not used by GCC, and not supported by the assembler. */
1228 #ifndef MAX_BYTES_PER_CRIS_INSN
1229 #define MAX_BYTES_PER_CRIS_INSN 8
1230 #endif
1231
1232 /* Whether or not to decode prefixes, folding it into the following
1233 instruction. FIXME: Make this optional later. */
1234 #ifndef PARSE_PREFIX
1235 #define PARSE_PREFIX 1
1236 #endif
1237
1238 /* Sometimes we prefix all registers with this character. */
1239 #define REGISTER_PREFIX_CHAR '$'
1240
1241 /* Whether or not to trace the following sequence:
1242 sub* X,r%d
1243 bound* Y,r%d
1244 adds.w [pc+r%d.w],pc
1245
1246 This is the assembly form of a switch-statement in C.
1247 The "sub is optional. If there is none, then X will be zero.
1248 X is the value of the first case,
1249 Y is the number of cases (including default).
1250
1251 This results in case offsets printed on the form:
1252 case N: -> case_address
1253 where N is an estimation on the corresponding 'case' operand in C,
1254 and case_address is where execution of that case continues after the
1255 sequence presented above.
1256
1257 The old style of output was to print the offsets as instructions,
1258 which made it hard to follow "case"-constructs in the disassembly,
1259 and caused a lot of annoying warnings about undefined instructions.
1260
1261 FIXME: Make this optional later. */
1262 #ifndef TRACE_CASE
1263 #define TRACE_CASE (disdata->trace_case)
1264 #endif
1265
1266 enum cris_disass_family
1267 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
1268
1269 /* Stored in the disasm_info->private_data member. */
1270 struct cris_disasm_data
1271 {
1272 /* Whether to print something less confusing if we find something
1273 matching a switch-construct. */
1274 bfd_boolean trace_case;
1275
1276 /* Whether this code is flagged as crisv32. FIXME: Should be an enum
1277 that includes "compatible". */
1278 enum cris_disass_family distype;
1279 };
1280
1281 /* Value of first element in switch. */
1282 static long case_offset = 0;
1283
1284 /* How many more case-offsets to print. */
1285 static long case_offset_counter = 0;
1286
1287 /* Number of case offsets. */
1288 static long no_of_case_offsets = 0;
1289
1290 /* Candidate for next case_offset. */
1291 static long last_immediate = 0;
1292
1293 static int cris_constraint
1294 (const char *, unsigned, unsigned, struct cris_disasm_data *);
1295
1296 /* Parse disassembler options and store state in info. FIXME: For the
1297 time being, we abuse static variables. */
1298
1299 static bfd_boolean
1300 cris_parse_disassembler_options (disassemble_info *info,
1301 enum cris_disass_family distype)
1302 {
1303 struct cris_disasm_data *disdata;
1304
1305 info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1306 disdata = (struct cris_disasm_data *) info->private_data;
1307 if (disdata == NULL)
1308 return false;
1309
1310 /* Default true. */
1311 disdata->trace_case
1312 = (info->disassembler_options == NULL
1313 || (strcmp (info->disassembler_options, "nocase") != 0));
1314
1315 disdata->distype = distype;
1316 return true;
1317 }
1318
1319 static const struct cris_spec_reg *
1320 spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1321 {
1322 int i;
1323
1324 for (i = 0; cris_spec_regs[i].name != NULL; i++)
1325 {
1326 if (cris_spec_regs[i].number == sreg)
1327 {
1328 if (distype == cris_dis_v32)
1329 switch (cris_spec_regs[i].applicable_version)
1330 {
1331 case cris_ver_warning:
1332 case cris_ver_version_all:
1333 case cris_ver_v3p:
1334 case cris_ver_v8p:
1335 case cris_ver_v10p:
1336 case cris_ver_v32p:
1337 /* No ambiguous sizes or register names with CRISv32. */
1338 if (cris_spec_regs[i].warning == NULL)
1339 return &cris_spec_regs[i];
1340 default:
1341 ;
1342 }
1343 else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1344 return &cris_spec_regs[i];
1345 }
1346 }
1347
1348 return NULL;
1349 }
1350
1351 /* Return the number of bits in the argument. */
1352
1353 static int
1354 number_of_bits (unsigned int val)
1355 {
1356 int bits;
1357
1358 for (bits = 0; val != 0; val &= val - 1)
1359 bits++;
1360
1361 return bits;
1362 }
1363
1364 /* Get an entry in the opcode-table. */
1365
1366 static const struct cris_opcode *
1367 get_opcode_entry (unsigned int insn,
1368 unsigned int prefix_insn,
1369 struct cris_disasm_data *disdata)
1370 {
1371 /* For non-prefixed insns, we keep a table of pointers, indexed by the
1372 insn code. Each entry is initialized when found to be NULL. */
1373 static const struct cris_opcode **opc_table = NULL;
1374
1375 const struct cris_opcode *max_matchedp = NULL;
1376 const struct cris_opcode **prefix_opc_table = NULL;
1377
1378 /* We hold a table for each prefix that need to be handled differently. */
1379 static const struct cris_opcode **dip_prefixes = NULL;
1380 static const struct cris_opcode **bdapq_m1_prefixes = NULL;
1381 static const struct cris_opcode **bdapq_m2_prefixes = NULL;
1382 static const struct cris_opcode **bdapq_m4_prefixes = NULL;
1383 static const struct cris_opcode **rest_prefixes = NULL;
1384
1385 /* Allocate and clear the opcode-table. */
1386 if (opc_table == NULL)
1387 {
1388 opc_table = g_new0(const struct cris_opcode *, 65536);
1389 dip_prefixes = g_new0(const struct cris_opcode *, 65536);
1390 bdapq_m1_prefixes = g_new0(const struct cris_opcode *, 65536);
1391 bdapq_m2_prefixes = g_new0(const struct cris_opcode *, 65536);
1392 bdapq_m4_prefixes = g_new0(const struct cris_opcode *, 65536);
1393 rest_prefixes = g_new0(const struct cris_opcode *, 65536);
1394 }
1395
1396 /* Get the right table if this is a prefix.
1397 This code is connected to cris_constraints in that it knows what
1398 prefixes play a role in recognition of patterns; the necessary
1399 state is reflected by which table is used. If constraints
1400 involving match or non-match of prefix insns are changed, then this
1401 probably needs changing too. */
1402 if (prefix_insn != NO_CRIS_PREFIX)
1403 {
1404 const struct cris_opcode *popcodep
1405 = (opc_table[prefix_insn] != NULL
1406 ? opc_table[prefix_insn]
1407 : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
1408
1409 if (popcodep == NULL)
1410 return NULL;
1411
1412 if (popcodep->match == BDAP_QUICK_OPCODE)
1413 {
1414 /* Since some offsets are recognized with "push" macros, we
1415 have to have different tables for them. */
1416 int offset = (prefix_insn & 255);
1417
1418 if (offset > 127)
1419 offset -= 256;
1420
1421 switch (offset)
1422 {
1423 case -4:
1424 prefix_opc_table = bdapq_m4_prefixes;
1425 break;
1426
1427 case -2:
1428 prefix_opc_table = bdapq_m2_prefixes;
1429 break;
1430
1431 case -1:
1432 prefix_opc_table = bdapq_m1_prefixes;
1433 break;
1434
1435 default:
1436 prefix_opc_table = rest_prefixes;
1437 break;
1438 }
1439 }
1440 else if (popcodep->match == DIP_OPCODE)
1441 /* We don't allow postincrement when the prefix is DIP, so use a
1442 different table for DIP. */
1443 prefix_opc_table = dip_prefixes;
1444 else
1445 prefix_opc_table = rest_prefixes;
1446 }
1447
1448 if (prefix_insn != NO_CRIS_PREFIX
1449 && prefix_opc_table[insn] != NULL)
1450 max_matchedp = prefix_opc_table[insn];
1451 else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
1452 max_matchedp = opc_table[insn];
1453 else
1454 {
1455 const struct cris_opcode *opcodep;
1456 int max_level_of_match = -1;
1457
1458 for (opcodep = cris_opcodes;
1459 opcodep->name != NULL;
1460 opcodep++)
1461 {
1462 int level_of_match;
1463
1464 if (disdata->distype == cris_dis_v32)
1465 {
1466 switch (opcodep->applicable_version)
1467 {
1468 case cris_ver_version_all:
1469 break;
1470
1471 case cris_ver_v0_3:
1472 case cris_ver_v0_10:
1473 case cris_ver_v3_10:
1474 case cris_ver_sim_v0_10:
1475 case cris_ver_v8_10:
1476 case cris_ver_v10:
1477 case cris_ver_warning:
1478 continue;
1479
1480 case cris_ver_v3p:
1481 case cris_ver_v8p:
1482 case cris_ver_v10p:
1483 case cris_ver_v32p:
1484 break;
1485
1486 case cris_ver_v8:
1487 abort ();
1488 default:
1489 abort ();
1490 }
1491 }
1492 else
1493 {
1494 switch (opcodep->applicable_version)
1495 {
1496 case cris_ver_version_all:
1497 case cris_ver_v0_3:
1498 case cris_ver_v3p:
1499 case cris_ver_v0_10:
1500 case cris_ver_v8p:
1501 case cris_ver_v8_10:
1502 case cris_ver_v10:
1503 case cris_ver_sim_v0_10:
1504 case cris_ver_v10p:
1505 case cris_ver_warning:
1506 break;
1507
1508 case cris_ver_v32p:
1509 continue;
1510
1511 case cris_ver_v8:
1512 abort ();
1513 default:
1514 abort ();
1515 }
1516 }
1517
1518 /* We give a double lead for bits matching the template in
1519 cris_opcodes. Not even, because then "move p8,r10" would
1520 be given 2 bits lead over "clear.d r10". When there's a
1521 tie, the first entry in the table wins. This is
1522 deliberate, to avoid a more complicated recognition
1523 formula. */
1524 if ((opcodep->match & insn) == opcodep->match
1525 && (opcodep->lose & insn) == 0
1526 && ((level_of_match
1527 = cris_constraint (opcodep->args,
1528 insn,
1529 prefix_insn,
1530 disdata))
1531 >= 0)
1532 && ((level_of_match
1533 += 2 * number_of_bits (opcodep->match
1534 | opcodep->lose))
1535 > max_level_of_match))
1536 {
1537 max_matchedp = opcodep;
1538 max_level_of_match = level_of_match;
1539
1540 /* If there was a full match, never mind looking
1541 further. */
1542 if (level_of_match >= 2 * 16)
1543 break;
1544 }
1545 }
1546 /* Fill in the new entry.
1547
1548 If there are changes to the opcode-table involving prefixes, and
1549 disassembly then does not work correctly, try removing the
1550 else-clause below that fills in the prefix-table. If that
1551 helps, you need to change the prefix_opc_table setting above, or
1552 something related. */
1553 if (prefix_insn == NO_CRIS_PREFIX)
1554 opc_table[insn] = max_matchedp;
1555 else
1556 prefix_opc_table[insn] = max_matchedp;
1557 }
1558
1559 return max_matchedp;
1560 }
1561
1562 /* Return -1 if the constraints of a bitwise-matched instruction say
1563 that there is no match. Otherwise return a nonnegative number
1564 indicating the confidence in the match (higher is better). */
1565
1566 static int
1567 cris_constraint (const char *cs,
1568 unsigned int insn,
1569 unsigned int prefix_insn,
1570 struct cris_disasm_data *disdata)
1571 {
1572 int retval = 0;
1573 int tmp;
1574 int prefix_ok = 0;
1575 const char *s;
1576
1577 for (s = cs; *s; s++)
1578 switch (*s)
1579 {
1580 case '!':
1581 /* Do not recognize "pop" if there's a prefix and then only for
1582 v0..v10. */
1583 if (prefix_insn != NO_CRIS_PREFIX
1584 || disdata->distype != cris_dis_v0_v10)
1585 return -1;
1586 break;
1587
1588 case 'U':
1589 /* Not recognized at disassembly. */
1590 return -1;
1591
1592 case 'M':
1593 /* Size modifier for "clear", i.e. special register 0, 4 or 8.
1594 Check that it is one of them. Only special register 12 could
1595 be mismatched, but checking for matches is more logical than
1596 checking for mismatches when there are only a few cases. */
1597 tmp = ((insn >> 12) & 0xf);
1598 if (tmp != 0 && tmp != 4 && tmp != 8)
1599 return -1;
1600 break;
1601
1602 case 'm':
1603 if ((insn & 0x30) == 0x30)
1604 return -1;
1605 break;
1606
1607 case 'S':
1608 /* A prefix operand without side-effect. */
1609 if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1610 {
1611 prefix_ok = 1;
1612 break;
1613 }
1614 else
1615 return -1;
1616
1617 case 's':
1618 case 'y':
1619 case 'Y':
1620 /* If this is a prefixed insn with postincrement (side-effect),
1621 the prefix must not be DIP. */
1622 if (prefix_insn != NO_CRIS_PREFIX)
1623 {
1624 if (insn & 0x400)
1625 {
1626 const struct cris_opcode *prefix_opcodep
1627 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1628
1629 if (prefix_opcodep->match == DIP_OPCODE)
1630 return -1;
1631 }
1632
1633 prefix_ok = 1;
1634 }
1635 break;
1636
1637 case 'B':
1638 /* If we don't fall through, then the prefix is ok. */
1639 prefix_ok = 1;
1640
1641 /* A "push" prefix. Check for valid "push" size.
1642 In case of special register, it may be != 4. */
1643 if (prefix_insn != NO_CRIS_PREFIX)
1644 {
1645 /* Match the prefix insn to BDAPQ. */
1646 const struct cris_opcode *prefix_opcodep
1647 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1648
1649 if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1650 {
1651 int pushsize = (prefix_insn & 255);
1652
1653 if (pushsize > 127)
1654 pushsize -= 256;
1655
1656 if (s[1] == 'P')
1657 {
1658 unsigned int spec_reg = (insn >> 12) & 15;
1659 const struct cris_spec_reg *sregp
1660 = spec_reg_info (spec_reg, disdata->distype);
1661
1662 /* For a special-register, the "prefix size" must
1663 match the size of the register. */
1664 if (sregp && sregp->reg_size == (unsigned int) -pushsize)
1665 break;
1666 }
1667 else if (s[1] == 'R')
1668 {
1669 if ((insn & 0x30) == 0x20 && pushsize == -4)
1670 break;
1671 }
1672 /* FIXME: Should abort here; next constraint letter
1673 *must* be 'P' or 'R'. */
1674 }
1675 }
1676 return -1;
1677
1678 case 'D':
1679 retval = (((insn >> 12) & 15) == (insn & 15));
1680 if (!retval)
1681 return -1;
1682 else
1683 retval += 4;
1684 break;
1685
1686 case 'P':
1687 {
1688 const struct cris_spec_reg *sregp
1689 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1690
1691 /* Since we match four bits, we will give a value of 4-1 = 3
1692 in a match. If there is a corresponding exact match of a
1693 special register in another pattern, it will get a value of
1694 4, which will be higher. This should be correct in that an
1695 exact pattern would match better than a general pattern.
1696
1697 Note that there is a reason for not returning zero; the
1698 pattern for "clear" is partly matched in the bit-pattern
1699 (the two lower bits must be zero), while the bit-pattern
1700 for a move from a special register is matched in the
1701 register constraint. */
1702
1703 if (sregp != NULL)
1704 {
1705 retval += 3;
1706 break;
1707 }
1708 else
1709 return -1;
1710 }
1711 }
1712
1713 if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1714 return -1;
1715
1716 return retval;
1717 }
1718
1719 /* Format number as hex with a leading "0x" into outbuffer. */
1720
1721 static char *
1722 format_hex (unsigned long number,
1723 char *outbuffer,
1724 struct cris_disasm_data *disdata)
1725 {
1726 /* Truncate negative numbers on >32-bit hosts. */
1727 number &= 0xffffffff;
1728
1729 sprintf (outbuffer, "0x%lx", number);
1730
1731 /* Save this value for the "case" support. */
1732 if (TRACE_CASE)
1733 last_immediate = number;
1734
1735 return outbuffer + strlen (outbuffer);
1736 }
1737
1738 /* Format number as decimal into outbuffer. Parameter signedp says
1739 whether the number should be formatted as signed (!= 0) or
1740 unsigned (== 0). */
1741
1742 static char *
1743 format_dec (long number, char *outbuffer, int signedp)
1744 {
1745 last_immediate = number;
1746 sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1747
1748 return outbuffer + strlen (outbuffer);
1749 }
1750
1751 /* Format the name of the general register regno into outbuffer. */
1752
1753 static char *
1754 format_reg (struct cris_disasm_data *disdata,
1755 int regno,
1756 char *outbuffer_start,
1757 bfd_boolean with_reg_prefix)
1758 {
1759 char *outbuffer = outbuffer_start;
1760
1761 if (with_reg_prefix)
1762 *outbuffer++ = REGISTER_PREFIX_CHAR;
1763
1764 switch (regno)
1765 {
1766 case 15:
1767 /* For v32, there is no context in which we output PC. */
1768 if (disdata->distype == cris_dis_v32)
1769 strcpy (outbuffer, "acr");
1770 else
1771 strcpy (outbuffer, "pc");
1772 break;
1773
1774 case 14:
1775 strcpy (outbuffer, "sp");
1776 break;
1777
1778 default:
1779 sprintf (outbuffer, "r%d", regno);
1780 break;
1781 }
1782
1783 return outbuffer_start + strlen (outbuffer_start);
1784 }
1785
1786 /* Format the name of a support register into outbuffer. */
1787
1788 static char *
1789 format_sup_reg (unsigned int regno,
1790 char *outbuffer_start,
1791 bfd_boolean with_reg_prefix)
1792 {
1793 char *outbuffer = outbuffer_start;
1794 int i;
1795
1796 if (with_reg_prefix)
1797 *outbuffer++ = REGISTER_PREFIX_CHAR;
1798
1799 for (i = 0; cris_support_regs[i].name != NULL; i++)
1800 if (cris_support_regs[i].number == regno)
1801 {
1802 sprintf (outbuffer, "%s", cris_support_regs[i].name);
1803 return outbuffer_start + strlen (outbuffer_start);
1804 }
1805
1806 /* There's supposed to be register names covering all numbers, though
1807 some may be generic names. */
1808 sprintf (outbuffer, "format_sup_reg-BUG");
1809 return outbuffer_start + strlen (outbuffer_start);
1810 }
1811
1812 /* Return the length of an instruction. */
1813
1814 static unsigned
1815 bytes_to_skip (unsigned int insn,
1816 const struct cris_opcode *matchedp,
1817 enum cris_disass_family distype,
1818 const struct cris_opcode *prefix_matchedp)
1819 {
1820 /* Each insn is a word plus "immediate" operands. */
1821 unsigned to_skip = 2;
1822 const char *template = matchedp->args;
1823 const char *s;
1824
1825 for (s = template; *s; s++)
1826 if ((*s == 's' || *s == 'N' || *s == 'Y')
1827 && (insn & 0x400) && (insn & 15) == 15
1828 && prefix_matchedp == NULL)
1829 {
1830 /* Immediate via [pc+], so we have to check the size of the
1831 operand. */
1832 int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1833
1834 if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1835 to_skip += 4;
1836 else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1837 {
1838 const struct cris_spec_reg *sregp
1839 = spec_reg_info ((insn >> 12) & 15, distype);
1840
1841 /* FIXME: Improve error handling; should have been caught
1842 earlier. */
1843 if (sregp == NULL)
1844 return 2;
1845
1846 /* PC is incremented by two, not one, for a byte. Except on
1847 CRISv32, where constants are always DWORD-size for
1848 special registers. */
1849 to_skip +=
1850 distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1851 }
1852 else
1853 to_skip += (mode_size + 1) & ~1;
1854 }
1855 else if (*s == 'n')
1856 to_skip += 4;
1857 else if (*s == 'b')
1858 to_skip += 2;
1859
1860 return to_skip;
1861 }
1862
1863 /* Print condition code flags. */
1864
1865 static char *
1866 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1867 {
1868 /* Use the v8 (Etrax 100) flag definitions for disassembly.
1869 The differences with v0 (Etrax 1..4) vs. Svinto are:
1870 v0 'd' <=> v8 'm'
1871 v0 'e' <=> v8 'b'.
1872 FIXME: Emit v0..v3 flag names somehow. */
1873 static const char v8_fnames[] = "cvznxibm";
1874 static const char v32_fnames[] = "cvznxiup";
1875 const char *fnames
1876 = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1877
1878 unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1879 int i;
1880
1881 for (i = 0; i < 8; i++)
1882 if (flagbits & (1 << i))
1883 *cp++ = fnames[i];
1884
1885 return cp;
1886 }
1887
1888 /* Print out an insn with its operands, and update the info->insn_type
1889 fields. The prefix_opcodep and the rest hold a prefix insn that is
1890 supposed to be output as an address mode. */
1891
1892 static void
1893 print_with_operands (const struct cris_opcode *opcodep,
1894 unsigned int insn,
1895 unsigned char *buffer,
1896 bfd_vma addr,
1897 disassemble_info *info,
1898 /* If a prefix insn was before this insn (and is supposed
1899 to be output as an address), here is a description of
1900 it. */
1901 const struct cris_opcode *prefix_opcodep,
1902 unsigned int prefix_insn,
1903 unsigned char *prefix_buffer,
1904 bfd_boolean with_reg_prefix)
1905 {
1906 /* Get a buffer of somewhat reasonable size where we store
1907 intermediate parts of the insn. */
1908 char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1909 char *tp = temp;
1910 static const char mode_char[] = "bwd?";
1911 const char *s;
1912 const char *cs;
1913 struct cris_disasm_data *disdata
1914 = (struct cris_disasm_data *) info->private_data;
1915
1916 /* Print out the name first thing we do. */
1917 (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1918
1919 cs = opcodep->args;
1920 s = cs;
1921
1922 /* Ignore any prefix indicator. */
1923 if (*s == 'p')
1924 s++;
1925
1926 if (*s == 'm' || *s == 'M' || *s == 'z')
1927 {
1928 *tp++ = '.';
1929
1930 /* Get the size-letter. */
1931 *tp++ = *s == 'M'
1932 ? (insn & 0x8000 ? 'd'
1933 : insn & 0x4000 ? 'w' : 'b')
1934 : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1935
1936 /* Ignore the size and the space character that follows. */
1937 s += 2;
1938 }
1939
1940 /* Add a space if this isn't a long-branch, because for those will add
1941 the condition part of the name later. */
1942 if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
1943 *tp++ = ' ';
1944
1945 /* Fill in the insn-type if deducible from the name (and there's no
1946 better way). */
1947 if (opcodep->name[0] == 'j')
1948 {
1949 if (CONST_STRNEQ (opcodep->name, "jsr"))
1950 /* It's "jsr" or "jsrc". */
1951 info->insn_type = dis_jsr;
1952 else
1953 /* Any other jump-type insn is considered a branch. */
1954 info->insn_type = dis_branch;
1955 }
1956
1957 /* We might know some more fields right now. */
1958 info->branch_delay_insns = opcodep->delayed;
1959
1960 /* Handle operands. */
1961 for (; *s; s++)
1962 {
1963 switch (*s)
1964 {
1965 case 'T':
1966 tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
1967 break;
1968
1969 case 'A':
1970 if (with_reg_prefix)
1971 *tp++ = REGISTER_PREFIX_CHAR;
1972 *tp++ = 'a';
1973 *tp++ = 'c';
1974 *tp++ = 'r';
1975 break;
1976
1977 case '[':
1978 case ']':
1979 case ',':
1980 *tp++ = *s;
1981 break;
1982
1983 case '!':
1984 /* Ignore at this point; used at earlier stages to avoid
1985 recognition if there's a prefix at something that in other
1986 ways looks like a "pop". */
1987 break;
1988
1989 case 'd':
1990 /* Ignore. This is an optional ".d " on the large one of
1991 relaxable insns. */
1992 break;
1993
1994 case 'B':
1995 /* This was the prefix that made this a "push". We've already
1996 handled it by recognizing it, so signal that the prefix is
1997 handled by setting it to NULL. */
1998 prefix_opcodep = NULL;
1999 break;
2000
2001 case 'D':
2002 case 'r':
2003 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2004 break;
2005
2006 case 'R':
2007 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2008 break;
2009
2010 case 'n':
2011 {
2012 /* Like N but pc-relative to the start of the insn. */
2013 unsigned long number
2014 = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2015 + buffer[5] * 0x1000000 + addr);
2016
2017 /* Finish off and output previous formatted bytes. */
2018 *tp = 0;
2019 if (temp[0])
2020 (*info->fprintf_func) (info->stream, "%s", temp);
2021 tp = temp;
2022
2023 (*info->print_address_func) ((bfd_vma) number, info);
2024 }
2025 break;
2026
2027 case 'u':
2028 {
2029 /* Like n but the offset is bits <3:0> in the instruction. */
2030 unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2031
2032 /* Finish off and output previous formatted bytes. */
2033 *tp = 0;
2034 if (temp[0])
2035 (*info->fprintf_func) (info->stream, "%s", temp);
2036 tp = temp;
2037
2038 (*info->print_address_func) ((bfd_vma) number, info);
2039 }
2040 break;
2041
2042 case 'N':
2043 case 'y':
2044 case 'Y':
2045 case 'S':
2046 case 's':
2047 /* Any "normal" memory operand. */
2048 if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2049 {
2050 /* We're looking at [pc+], i.e. we need to output an immediate
2051 number, where the size can depend on different things. */
2052 long number;
2053 int signedp
2054 = ((*cs == 'z' && (insn & 0x20))
2055 || opcodep->match == BDAP_QUICK_OPCODE);
2056 int nbytes;
2057
2058 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2059 nbytes = 4;
2060 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2061 {
2062 const struct cris_spec_reg *sregp
2063 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2064
2065 /* A NULL return should have been as a non-match earlier,
2066 so catch it as an internal error in the error-case
2067 below. */
2068 if (sregp == NULL)
2069 /* Whatever non-valid size. */
2070 nbytes = 42;
2071 else
2072 /* PC is always incremented by a multiple of two.
2073 For CRISv32, immediates are always 4 bytes for
2074 special registers. */
2075 nbytes = disdata->distype == cris_dis_v32
2076 ? 4 : (sregp->reg_size + 1) & ~1;
2077 }
2078 else
2079 {
2080 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2081
2082 if (mode_size == 1)
2083 nbytes = 2;
2084 else
2085 nbytes = mode_size;
2086 }
2087
2088 switch (nbytes)
2089 {
2090 case 1:
2091 number = buffer[2];
2092 if (signedp && number > 127)
2093 number -= 256;
2094 break;
2095
2096 case 2:
2097 number = buffer[2] + buffer[3] * 256;
2098 if (signedp && number > 32767)
2099 number -= 65536;
2100 break;
2101
2102 case 4:
2103 number
2104 = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2105 + buffer[5] * 0x1000000;
2106 break;
2107
2108 default:
2109 strcpy (tp, "bug");
2110 tp += 3;
2111 number = 42;
2112 }
2113
2114 if ((*cs == 'z' && (insn & 0x20))
2115 || (opcodep->match == BDAP_QUICK_OPCODE
2116 && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2117 tp = format_dec (number, tp, signedp);
2118 else
2119 {
2120 unsigned int highbyte = (number >> 24) & 0xff;
2121
2122 /* Either output this as an address or as a number. If it's
2123 a dword with the same high-byte as the address of the
2124 insn, assume it's an address, and also if it's a non-zero
2125 non-0xff high-byte. If this is a jsr or a jump, then
2126 it's definitely an address. */
2127 if (nbytes == 4
2128 && (highbyte == ((addr >> 24) & 0xff)
2129 || (highbyte != 0 && highbyte != 0xff)
2130 || info->insn_type == dis_branch
2131 || info->insn_type == dis_jsr))
2132 {
2133 /* Finish off and output previous formatted bytes. */
2134 *tp = 0;
2135 tp = temp;
2136 if (temp[0])
2137 (*info->fprintf_func) (info->stream, "%s", temp);
2138
2139 (*info->print_address_func) ((bfd_vma) number, info);
2140
2141 info->target = number;
2142 }
2143 else
2144 tp = format_hex (number, tp, disdata);
2145 }
2146 }
2147 else
2148 {
2149 /* Not an immediate number. Then this is a (possibly
2150 prefixed) memory operand. */
2151 if (info->insn_type != dis_nonbranch)
2152 {
2153 int mode_size
2154 = 1 << ((insn >> 4)
2155 & (opcodep->args[0] == 'z' ? 1 : 3));
2156 int size;
2157 info->insn_type = dis_dref;
2158 info->flags |= CRIS_DIS_FLAG_MEMREF;
2159
2160 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2161 size = 4;
2162 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2163 {
2164 const struct cris_spec_reg *sregp
2165 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2166
2167 /* FIXME: Improve error handling; should have been caught
2168 earlier. */
2169 if (sregp == NULL)
2170 size = 4;
2171 else
2172 size = sregp->reg_size;
2173 }
2174 else
2175 size = mode_size;
2176
2177 info->data_size = size;
2178 }
2179
2180 *tp++ = '[';
2181
2182 if (prefix_opcodep
2183 /* We don't match dip with a postincremented field
2184 as a side-effect address mode. */
2185 && ((insn & 0x400) == 0
2186 || prefix_opcodep->match != DIP_OPCODE))
2187 {
2188 if (insn & 0x400)
2189 {
2190 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2191 *tp++ = '=';
2192 }
2193
2194
2195 /* We mainly ignore the prefix format string when the
2196 address-mode syntax is output. */
2197 switch (prefix_opcodep->match)
2198 {
2199 case DIP_OPCODE:
2200 /* It's [r], [r+] or [pc+]. */
2201 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2202 {
2203 /* It's [pc+]. This cannot possibly be anything
2204 but an address. */
2205 unsigned long number
2206 = prefix_buffer[2] + prefix_buffer[3] * 256
2207 + prefix_buffer[4] * 65536
2208 + prefix_buffer[5] * 0x1000000;
2209
2210 info->target = (bfd_vma) number;
2211
2212 /* Finish off and output previous formatted
2213 data. */
2214 *tp = 0;
2215 tp = temp;
2216 if (temp[0])
2217 (*info->fprintf_func) (info->stream, "%s", temp);
2218
2219 (*info->print_address_func) ((bfd_vma) number, info);
2220 }
2221 else
2222 {
2223 /* For a memref in an address, we use target2.
2224 In this case, target is zero. */
2225 info->flags
2226 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2227 | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2228
2229 info->target2 = prefix_insn & 15;
2230
2231 *tp++ = '[';
2232 tp = format_reg (disdata, prefix_insn & 15, tp,
2233 with_reg_prefix);
2234 if (prefix_insn & 0x400)
2235 *tp++ = '+';
2236 *tp++ = ']';
2237 }
2238 break;
2239
2240 case BDAP_QUICK_OPCODE:
2241 {
2242 int number;
2243
2244 number = prefix_buffer[0];
2245 if (number > 127)
2246 number -= 256;
2247
2248 /* Output "reg+num" or, if num < 0, "reg-num". */
2249 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2250 with_reg_prefix);
2251 if (number >= 0)
2252 *tp++ = '+';
2253 tp = format_dec (number, tp, 1);
2254
2255 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2256 info->target = (prefix_insn >> 12) & 15;
2257 info->target2 = (bfd_vma) number;
2258 break;
2259 }
2260
2261 case BIAP_OPCODE:
2262 /* Output "r+R.m". */
2263 tp = format_reg (disdata, prefix_insn & 15, tp,
2264 with_reg_prefix);
2265 *tp++ = '+';
2266 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2267 with_reg_prefix);
2268 *tp++ = '.';
2269 *tp++ = mode_char[(prefix_insn >> 4) & 3];
2270
2271 info->flags
2272 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2273 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2274
2275 | ((prefix_insn & 0x8000)
2276 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2277 : ((prefix_insn & 0x8000)
2278 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2279
2280 /* Is it the casejump? It's a "adds.w [pc+r%d.w],pc". */
2281 if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
2282 /* Then start interpreting data as offsets. */
2283 case_offset_counter = no_of_case_offsets;
2284 break;
2285
2286 case BDAP_INDIR_OPCODE:
2287 /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2288 "r-s". */
2289 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2290 with_reg_prefix);
2291
2292 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2293 {
2294 long number;
2295 unsigned int nbytes;
2296
2297 /* It's a value. Get its size. */
2298 int mode_size = 1 << ((prefix_insn >> 4) & 3);
2299
2300 if (mode_size == 1)
2301 nbytes = 2;
2302 else
2303 nbytes = mode_size;
2304
2305 switch (nbytes)
2306 {
2307 case 1:
2308 number = prefix_buffer[2];
2309 if (number > 127)
2310 number -= 256;
2311 break;
2312
2313 case 2:
2314 number = prefix_buffer[2] + prefix_buffer[3] * 256;
2315 if (number > 32767)
2316 number -= 65536;
2317 break;
2318
2319 case 4:
2320 number
2321 = prefix_buffer[2] + prefix_buffer[3] * 256
2322 + prefix_buffer[4] * 65536
2323 + prefix_buffer[5] * 0x1000000;
2324 break;
2325
2326 default:
2327 strcpy (tp, "bug");
2328 tp += 3;
2329 number = 42;
2330 }
2331
2332 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2333 info->target2 = (bfd_vma) number;
2334
2335 /* If the size is dword, then assume it's an
2336 address. */
2337 if (nbytes == 4)
2338 {
2339 /* Finish off and output previous formatted
2340 bytes. */
2341 *tp++ = '+';
2342 *tp = 0;
2343 tp = temp;
2344 (*info->fprintf_func) (info->stream, "%s", temp);
2345
2346 (*info->print_address_func) ((bfd_vma) number, info);
2347 }
2348 else
2349 {
2350 if (number >= 0)
2351 *tp++ = '+';
2352 tp = format_dec (number, tp, 1);
2353 }
2354 }
2355 else
2356 {
2357 /* Output "r+[R].m" or "r+[R+].m". */
2358 *tp++ = '+';
2359 *tp++ = '[';
2360 tp = format_reg (disdata, prefix_insn & 15, tp,
2361 with_reg_prefix);
2362 if (prefix_insn & 0x400)
2363 *tp++ = '+';
2364 *tp++ = ']';
2365 *tp++ = '.';
2366 *tp++ = mode_char[(prefix_insn >> 4) & 3];
2367
2368 info->flags
2369 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2370 | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2371 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2372
2373 | (((prefix_insn >> 4) == 2)
2374 ? 0
2375 : (((prefix_insn >> 4) & 3) == 1
2376 ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2377 : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2378 }
2379 break;
2380
2381 default:
2382 (*info->fprintf_func) (info->stream, "?prefix-bug");
2383 }
2384
2385 /* To mark that the prefix is used, reset it. */
2386 prefix_opcodep = NULL;
2387 }
2388 else
2389 {
2390 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2391
2392 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2393 info->target = insn & 15;
2394
2395 if (insn & 0x400)
2396 *tp++ = '+';
2397 }
2398 *tp++ = ']';
2399 }
2400 break;
2401
2402 case 'x':
2403 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2404 *tp++ = '.';
2405 *tp++ = mode_char[(insn >> 4) & 3];
2406 break;
2407
2408 case 'I':
2409 tp = format_dec (insn & 63, tp, 0);
2410 break;
2411
2412 case 'b':
2413 {
2414 int where = buffer[2] + buffer[3] * 256;
2415
2416 if (where > 32767)
2417 where -= 65536;
2418
2419 where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2420
2421 if (insn == BA_PC_INCR_OPCODE)
2422 info->insn_type = dis_branch;
2423 else
2424 info->insn_type = dis_condbranch;
2425
2426 info->target = (bfd_vma) where;
2427
2428 *tp = 0;
2429 tp = temp;
2430 (*info->fprintf_func) (info->stream, "%s%s ",
2431 temp, cris_cc_strings[insn >> 12]);
2432
2433 (*info->print_address_func) ((bfd_vma) where, info);
2434 }
2435 break;
2436
2437 case 'c':
2438 tp = format_dec (insn & 31, tp, 0);
2439 break;
2440
2441 case 'C':
2442 tp = format_dec (insn & 15, tp, 0);
2443 break;
2444
2445 case 'o':
2446 {
2447 long offset = insn & 0xfe;
2448 bfd_vma target;
2449
2450 if (insn & 1)
2451 offset |= ~0xff;
2452
2453 if (opcodep->match == BA_QUICK_OPCODE)
2454 info->insn_type = dis_branch;
2455 else
2456 info->insn_type = dis_condbranch;
2457
2458 target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2459 info->target = target;
2460 *tp = 0;
2461 tp = temp;
2462 (*info->fprintf_func) (info->stream, "%s", temp);
2463 (*info->print_address_func) (target, info);
2464 }
2465 break;
2466
2467 case 'Q':
2468 case 'O':
2469 {
2470 long number = buffer[0];
2471
2472 if (number > 127)
2473 number = number - 256;
2474
2475 tp = format_dec (number, tp, 1);
2476 *tp++ = ',';
2477 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2478 }
2479 break;
2480
2481 case 'f':
2482 tp = print_flags (disdata, insn, tp);
2483 break;
2484
2485 case 'i':
2486 tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2487 break;
2488
2489 case 'P':
2490 {
2491 const struct cris_spec_reg *sregp
2492 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2493
2494 if (sregp->name == NULL)
2495 /* Should have been caught as a non-match earlier. */
2496 *tp++ = '?';
2497 else
2498 {
2499 if (with_reg_prefix)
2500 *tp++ = REGISTER_PREFIX_CHAR;
2501 strcpy (tp, sregp->name);
2502 tp += strlen (tp);
2503 }
2504 }
2505 break;
2506
2507 default:
2508 strcpy (tp, "???");
2509 tp += 3;
2510 }
2511 }
2512
2513 *tp = 0;
2514
2515 if (prefix_opcodep)
2516 (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2517 prefix_opcodep->name, prefix_opcodep->args);
2518
2519 (*info->fprintf_func) (info->stream, "%s", temp);
2520
2521 /* Get info for matching case-tables, if we don't have any active.
2522 We assume that the last constant seen is used; either in the insn
2523 itself or in a "move.d const,rN, sub.d rN,rM"-like sequence. */
2524 if (TRACE_CASE && case_offset_counter == 0)
2525 {
2526 if (CONST_STRNEQ (opcodep->name, "sub"))
2527 case_offset = last_immediate;
2528
2529 /* It could also be an "add", if there are negative case-values. */
2530 else if (CONST_STRNEQ (opcodep->name, "add"))
2531 /* The first case is the negated operand to the add. */
2532 case_offset = -last_immediate;
2533
2534 /* A bound insn will tell us the number of cases. */
2535 else if (CONST_STRNEQ (opcodep->name, "bound"))
2536 no_of_case_offsets = last_immediate + 1;
2537
2538 /* A jump or jsr or branch breaks the chain of insns for a
2539 case-table, so assume default first-case again. */
2540 else if (info->insn_type == dis_jsr
2541 || info->insn_type == dis_branch
2542 || info->insn_type == dis_condbranch)
2543 case_offset = 0;
2544 }
2545 }
2546
2547
2548 /* Print the CRIS instruction at address memaddr on stream. Returns
2549 length of the instruction, in bytes. Prefix register names with `$' if
2550 WITH_REG_PREFIX. */
2551
2552 static int
2553 print_insn_cris_generic (bfd_vma memaddr,
2554 disassemble_info *info,
2555 bfd_boolean with_reg_prefix)
2556 {
2557 int nbytes;
2558 unsigned int insn;
2559 const struct cris_opcode *matchedp;
2560 int advance = 0;
2561 struct cris_disasm_data *disdata
2562 = (struct cris_disasm_data *) info->private_data;
2563
2564 /* No instruction will be disassembled as longer than this number of
2565 bytes; stacked prefixes will not be expanded. */
2566 unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
2567 unsigned char *bufp;
2568 int status = 0;
2569 bfd_vma addr;
2570
2571 /* There will be an "out of range" error after the last instruction.
2572 Reading pairs of bytes in decreasing number, we hope that we will get
2573 at least the amount that we will consume.
2574
2575 If we can't get any data, or we do not get enough data, we print
2576 the error message. */
2577
2578 nbytes = info->buffer_length ? info->buffer_length
2579 : MAX_BYTES_PER_CRIS_INSN;
2580 nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN);
2581 status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
2582
2583 /* If we did not get all we asked for, then clear the rest.
2584 Hopefully this makes a reproducible result in case of errors. */
2585 if (nbytes != MAX_BYTES_PER_CRIS_INSN)
2586 memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
2587
2588 addr = memaddr;
2589 bufp = buffer;
2590
2591 /* Set some defaults for the insn info. */
2592 info->insn_info_valid = 1;
2593 info->branch_delay_insns = 0;
2594 info->data_size = 0;
2595 info->insn_type = dis_nonbranch;
2596 info->flags = 0;
2597 info->target = 0;
2598 info->target2 = 0;
2599
2600 /* If we got any data, disassemble it. */
2601 if (nbytes != 0)
2602 {
2603 matchedp = NULL;
2604
2605 insn = bufp[0] + bufp[1] * 256;
2606
2607 /* If we're in a case-table, don't disassemble the offsets. */
2608 if (TRACE_CASE && case_offset_counter != 0)
2609 {
2610 info->insn_type = dis_noninsn;
2611 advance += 2;
2612
2613 /* If to print data as offsets, then shortcut here. */
2614 (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
2615 case_offset + no_of_case_offsets
2616 - case_offset_counter,
2617 case_offset_counter == 1 ? "/default" :
2618 "");
2619
2620 (*info->print_address_func) ((bfd_vma)
2621 ((short) (insn)
2622 + (long) (addr
2623 - (no_of_case_offsets
2624 - case_offset_counter)
2625 * 2)), info);
2626 case_offset_counter--;
2627
2628 /* The default case start (without a "sub" or "add") must be
2629 zero. */
2630 if (case_offset_counter == 0)
2631 case_offset = 0;
2632 }
2633 else if (insn == 0)
2634 {
2635 /* We're often called to disassemble zeroes. While this is a
2636 valid "bcc .+2" insn, it is also useless enough and enough
2637 of a nuiscance that we will just output "bcc .+2" for it
2638 and signal it as a noninsn. */
2639 (*info->fprintf_func) (info->stream,
2640 disdata->distype == cris_dis_v32
2641 ? "bcc ." : "bcc .+2");
2642 info->insn_type = dis_noninsn;
2643 advance += 2;
2644 }
2645 else
2646 {
2647 const struct cris_opcode *prefix_opcodep = NULL;
2648 unsigned char *prefix_buffer = bufp;
2649 unsigned int prefix_insn = insn;
2650 int prefix_size = 0;
2651
2652 matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2653
2654 /* Check if we're supposed to write out prefixes as address
2655 modes and if this was a prefix. */
2656 if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
2657 {
2658 /* If it's a prefix, put it into the prefix vars and get the
2659 main insn. */
2660 prefix_size = bytes_to_skip (prefix_insn, matchedp,
2661 disdata->distype, NULL);
2662 prefix_opcodep = matchedp;
2663
2664 insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2665 matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2666
2667 if (matchedp != NULL)
2668 {
2669 addr += prefix_size;
2670 bufp += prefix_size;
2671 advance += prefix_size;
2672 }
2673 else
2674 {
2675 /* The "main" insn wasn't valid, at least not when
2676 prefixed. Put back things enough to output the
2677 prefix insn only, as a normal insn. */
2678 matchedp = prefix_opcodep;
2679 insn = prefix_insn;
2680 prefix_opcodep = NULL;
2681 }
2682 }
2683
2684 if (matchedp == NULL)
2685 {
2686 (*info->fprintf_func) (info->stream, "??0x%x", insn);
2687 advance += 2;
2688
2689 info->insn_type = dis_noninsn;
2690 }
2691 else
2692 {
2693 advance
2694 += bytes_to_skip (insn, matchedp, disdata->distype,
2695 prefix_opcodep);
2696
2697 /* The info_type and assorted fields will be set according
2698 to the operands. */
2699 print_with_operands (matchedp, insn, bufp, addr, info,
2700 prefix_opcodep, prefix_insn,
2701 prefix_buffer, with_reg_prefix);
2702 }
2703 }
2704 }
2705 else
2706 info->insn_type = dis_noninsn;
2707
2708 /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2709 status when reading that much, and the insn decoding indicated a
2710 length exceeding what we read, there is an error. */
2711 if (status != 0 && (nbytes == 0 || advance > nbytes))
2712 {
2713 (*info->memory_error_func) (status, memaddr, info);
2714 return -1;
2715 }
2716
2717 /* Max supported insn size with one folded prefix insn. */
2718 info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2719
2720 /* I would like to set this to a fixed value larger than the actual
2721 number of bytes to print in order to avoid spaces between bytes,
2722 but objdump.c (2.9.1) does not like that, so we print 16-bit
2723 chunks, which is the next choice. */
2724 info->bytes_per_chunk = 2;
2725
2726 /* Printing bytes in order of increasing addresses makes sense,
2727 especially on a little-endian target.
2728 This is completely the opposite of what you think; setting this to
2729 BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2730 we want. */
2731 info->display_endian = BFD_ENDIAN_BIG;
2732
2733 return advance;
2734 }
2735
2736 /* Disassemble, prefixing register names with `$'. CRIS v0..v10. */
2737 static int
2738 print_insn_cris_with_register_prefix (bfd_vma vma,
2739 disassemble_info *info)
2740 {
2741 if (info->private_data == NULL
2742 && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2743 return -1;
2744 return print_insn_cris_generic (vma, info, true);
2745 }
2746 /* Disassemble, prefixing register names with `$'. CRIS v32. */
2747
2748 static int
2749 print_insn_crisv32_with_register_prefix (bfd_vma vma,
2750 disassemble_info *info)
2751 {
2752 if (info->private_data == NULL
2753 && !cris_parse_disassembler_options (info, cris_dis_v32))
2754 return -1;
2755 return print_insn_cris_generic (vma, info, true);
2756 }
2757
2758 #if 0
2759 /* Disassemble, prefixing register names with `$'.
2760 Common v10 and v32 subset. */
2761
2762 static int
2763 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2764 disassemble_info *info)
2765 {
2766 if (info->private_data == NULL
2767 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2768 return -1;
2769 return print_insn_cris_generic (vma, info, true);
2770 }
2771
2772 /* Disassemble, no prefixes on register names. CRIS v0..v10. */
2773
2774 static int
2775 print_insn_cris_without_register_prefix (bfd_vma vma,
2776 disassemble_info *info)
2777 {
2778 if (info->private_data == NULL
2779 && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2780 return -1;
2781 return print_insn_cris_generic (vma, info, false);
2782 }
2783
2784 /* Disassemble, no prefixes on register names. CRIS v32. */
2785
2786 static int
2787 print_insn_crisv32_without_register_prefix (bfd_vma vma,
2788 disassemble_info *info)
2789 {
2790 if (info->private_data == NULL
2791 && !cris_parse_disassembler_options (info, cris_dis_v32))
2792 return -1;
2793 return print_insn_cris_generic (vma, info, false);
2794 }
2795
2796 /* Disassemble, no prefixes on register names.
2797 Common v10 and v32 subset. */
2798
2799 static int
2800 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2801 disassemble_info *info)
2802 {
2803 if (info->private_data == NULL
2804 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2805 return -1;
2806 return print_insn_cris_generic (vma, info, false);
2807 }
2808 #endif
2809
2810 int
2811 print_insn_crisv10 (bfd_vma vma,
2812 disassemble_info *info)
2813 {
2814 return print_insn_cris_with_register_prefix(vma, info);
2815 }
2816
2817 int
2818 print_insn_crisv32 (bfd_vma vma,
2819 disassemble_info *info)
2820 {
2821 return print_insn_crisv32_with_register_prefix(vma, info);
2822 }
2823
2824 /* Return a disassembler-function that prints registers with a `$' prefix,
2825 or one that prints registers without a prefix.
2826 FIXME: We should improve the solution to avoid the multitude of
2827 functions seen above. */
2828 #if 0
2829 disassembler_ftype
2830 cris_get_disassembler (bfd *abfd)
2831 {
2832 /* If there's no bfd in sight, we return what is valid as input in all
2833 contexts if fed back to the assembler: disassembly *with* register
2834 prefix. Unfortunately this will be totally wrong for v32. */
2835 if (abfd == NULL)
2836 return print_insn_cris_with_register_prefix;
2837
2838 if (bfd_get_symbol_leading_char (abfd) == 0)
2839 {
2840 if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2841 return print_insn_crisv32_with_register_prefix;
2842 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2843 return print_insn_crisv10_v32_with_register_prefix;
2844
2845 /* We default to v10. This may be specifically specified in the
2846 bfd mach, but is also the default setting. */
2847 return print_insn_cris_with_register_prefix;
2848 }
2849
2850 if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2851 return print_insn_crisv32_without_register_prefix;
2852 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2853 return print_insn_crisv10_v32_without_register_prefix;
2854 return print_insn_cris_without_register_prefix;
2855 }
2856 #endif
2857 /* Local variables:
2858 eval: (c-set-style "gnu")
2859 indent-tabs-mode: t
2860 End: */