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