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