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