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