xref: /openbmc/qemu/disas/cris.c (revision 37677d7d)
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 bfd_boolean
1298 cris_parse_disassembler_options (disassemble_info *info,
1299 				 enum cris_disass_family distype)
1300 {
1301   struct cris_disasm_data *disdata;
1302 
1303   info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1304   disdata = (struct cris_disasm_data *) info->private_data;
1305   if (disdata == NULL)
1306     return false;
1307 
1308   /* Default true.  */
1309   disdata->trace_case
1310     = (info->disassembler_options == NULL
1311        || (strcmp (info->disassembler_options, "nocase") != 0));
1312 
1313   disdata->distype = distype;
1314   return true;
1315 }
1316 
1317 static const struct cris_spec_reg *
1318 spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1319 {
1320   int i;
1321 
1322   for (i = 0; cris_spec_regs[i].name != NULL; i++)
1323     {
1324       if (cris_spec_regs[i].number == sreg)
1325 	{
1326 	  if (distype == cris_dis_v32)
1327 	    switch (cris_spec_regs[i].applicable_version)
1328 	      {
1329 	      case cris_ver_warning:
1330 	      case cris_ver_version_all:
1331 	      case cris_ver_v3p:
1332 	      case cris_ver_v8p:
1333 	      case cris_ver_v10p:
1334 	      case cris_ver_v32p:
1335 		/* No ambiguous sizes or register names with CRISv32.  */
1336 		if (cris_spec_regs[i].warning == NULL)
1337 		  return &cris_spec_regs[i];
1338 	      default:
1339 		;
1340 	      }
1341 	  else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1342 	    return &cris_spec_regs[i];
1343 	}
1344     }
1345 
1346   return NULL;
1347 }
1348 
1349 /* Return the number of bits in the argument.  */
1350 
1351 static int
1352 number_of_bits (unsigned int val)
1353 {
1354   int bits;
1355 
1356   for (bits = 0; val != 0; val &= val - 1)
1357     bits++;
1358 
1359   return bits;
1360 }
1361 
1362 /* Get an entry in the opcode-table.  */
1363 
1364 static const struct cris_opcode *
1365 get_opcode_entry (unsigned int insn,
1366 		  unsigned int prefix_insn,
1367 		  struct cris_disasm_data *disdata)
1368 {
1369   /* For non-prefixed insns, we keep a table of pointers, indexed by the
1370      insn code.  Each entry is initialized when found to be NULL.  */
1371   static const struct cris_opcode **opc_table = NULL;
1372 
1373   const struct cris_opcode *max_matchedp = NULL;
1374   const struct cris_opcode **prefix_opc_table = NULL;
1375 
1376   /* We hold a table for each prefix that need to be handled differently.  */
1377   static const struct cris_opcode **dip_prefixes = NULL;
1378   static const struct cris_opcode **bdapq_m1_prefixes = NULL;
1379   static const struct cris_opcode **bdapq_m2_prefixes = NULL;
1380   static const struct cris_opcode **bdapq_m4_prefixes = NULL;
1381   static const struct cris_opcode **rest_prefixes = NULL;
1382 
1383   /* Allocate and clear the opcode-table.  */
1384   if (opc_table == NULL)
1385     {
1386       opc_table = g_new0(const struct cris_opcode *, 65536);
1387       dip_prefixes = g_new0(const struct cris_opcode *, 65536);
1388       bdapq_m1_prefixes = g_new0(const struct cris_opcode *, 65536);
1389       bdapq_m2_prefixes = g_new0(const struct cris_opcode *, 65536);
1390       bdapq_m4_prefixes = g_new0(const struct cris_opcode *, 65536);
1391       rest_prefixes = g_new0(const struct cris_opcode *, 65536);
1392     }
1393 
1394   /* Get the right table if this is a prefix.
1395      This code is connected to cris_constraints in that it knows what
1396      prefixes play a role in recognition of patterns; the necessary
1397      state is reflected by which table is used.  If constraints
1398      involving match or non-match of prefix insns are changed, then this
1399      probably needs changing too.  */
1400   if (prefix_insn != NO_CRIS_PREFIX)
1401     {
1402       const struct cris_opcode *popcodep
1403 	= (opc_table[prefix_insn] != NULL
1404 	   ? opc_table[prefix_insn]
1405 	   : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
1406 
1407       if (popcodep == NULL)
1408 	return NULL;
1409 
1410       if (popcodep->match == BDAP_QUICK_OPCODE)
1411 	{
1412 	  /* Since some offsets are recognized with "push" macros, we
1413 	     have to have different tables for them.  */
1414 	  int offset = (prefix_insn & 255);
1415 
1416 	  if (offset > 127)
1417 	    offset -= 256;
1418 
1419 	  switch (offset)
1420 	    {
1421 	    case -4:
1422 	      prefix_opc_table = bdapq_m4_prefixes;
1423 	      break;
1424 
1425 	    case -2:
1426 	      prefix_opc_table = bdapq_m2_prefixes;
1427 	      break;
1428 
1429 	    case -1:
1430 	      prefix_opc_table = bdapq_m1_prefixes;
1431 	      break;
1432 
1433 	    default:
1434 	      prefix_opc_table = rest_prefixes;
1435 	      break;
1436 	    }
1437 	}
1438       else if (popcodep->match == DIP_OPCODE)
1439 	/* We don't allow postincrement when the prefix is DIP, so use a
1440 	   different table for DIP.  */
1441 	prefix_opc_table = dip_prefixes;
1442       else
1443 	prefix_opc_table = rest_prefixes;
1444     }
1445 
1446   if (prefix_insn != NO_CRIS_PREFIX
1447       && prefix_opc_table[insn] != NULL)
1448     max_matchedp = prefix_opc_table[insn];
1449   else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
1450     max_matchedp = opc_table[insn];
1451   else
1452     {
1453       const struct cris_opcode *opcodep;
1454       int max_level_of_match = -1;
1455 
1456       for (opcodep = cris_opcodes;
1457 	   opcodep->name != NULL;
1458 	   opcodep++)
1459 	{
1460 	  int level_of_match;
1461 
1462 	  if (disdata->distype == cris_dis_v32)
1463 	    {
1464 	      switch (opcodep->applicable_version)
1465 		{
1466 		case cris_ver_version_all:
1467 		  break;
1468 
1469 		case cris_ver_v0_3:
1470 		case cris_ver_v0_10:
1471 		case cris_ver_v3_10:
1472 		case cris_ver_sim_v0_10:
1473 		case cris_ver_v8_10:
1474 		case cris_ver_v10:
1475 		case cris_ver_warning:
1476 		  continue;
1477 
1478 		case cris_ver_v3p:
1479 		case cris_ver_v8p:
1480 		case cris_ver_v10p:
1481 		case cris_ver_v32p:
1482 		  break;
1483 
1484 		case cris_ver_v8:
1485 		  abort ();
1486 		default:
1487 		  abort ();
1488 		}
1489 	    }
1490 	  else
1491 	    {
1492 	      switch (opcodep->applicable_version)
1493 		{
1494 		case cris_ver_version_all:
1495 		case cris_ver_v0_3:
1496 		case cris_ver_v3p:
1497 		case cris_ver_v0_10:
1498 		case cris_ver_v8p:
1499 		case cris_ver_v8_10:
1500 		case cris_ver_v10:
1501 		case cris_ver_sim_v0_10:
1502 		case cris_ver_v10p:
1503 		case cris_ver_warning:
1504 		  break;
1505 
1506 		case cris_ver_v32p:
1507 		  continue;
1508 
1509 		case cris_ver_v8:
1510 		  abort ();
1511 		default:
1512 		  abort ();
1513 		}
1514 	    }
1515 
1516 	  /* We give a double lead for bits matching the template in
1517 	     cris_opcodes.  Not even, because then "move p8,r10" would
1518 	     be given 2 bits lead over "clear.d r10".  When there's a
1519 	     tie, the first entry in the table wins.  This is
1520 	     deliberate, to avoid a more complicated recognition
1521 	     formula.  */
1522 	  if ((opcodep->match & insn) == opcodep->match
1523 	      && (opcodep->lose & insn) == 0
1524 	      && ((level_of_match
1525 		   = cris_constraint (opcodep->args,
1526 				      insn,
1527 				      prefix_insn,
1528 				      disdata))
1529 		  >= 0)
1530 	      && ((level_of_match
1531 		   += 2 * number_of_bits (opcodep->match
1532 					  | opcodep->lose))
1533 			  > max_level_of_match))
1534 		    {
1535 		      max_matchedp = opcodep;
1536 		      max_level_of_match = level_of_match;
1537 
1538 		      /* If there was a full match, never mind looking
1539 			 further.  */
1540 		      if (level_of_match >= 2 * 16)
1541 			break;
1542 		    }
1543 		}
1544       /* Fill in the new entry.
1545 
1546 	 If there are changes to the opcode-table involving prefixes, and
1547 	 disassembly then does not work correctly, try removing the
1548 	 else-clause below that fills in the prefix-table.  If that
1549 	 helps, you need to change the prefix_opc_table setting above, or
1550 	 something related.  */
1551       if (prefix_insn == NO_CRIS_PREFIX)
1552 	opc_table[insn] = max_matchedp;
1553       else
1554 	prefix_opc_table[insn] = max_matchedp;
1555     }
1556 
1557   return max_matchedp;
1558 }
1559 
1560 /* Return -1 if the constraints of a bitwise-matched instruction say
1561    that there is no match.  Otherwise return a nonnegative number
1562    indicating the confidence in the match (higher is better).  */
1563 
1564 static int
1565 cris_constraint (const char *cs,
1566 		 unsigned int insn,
1567 		 unsigned int prefix_insn,
1568 		 struct cris_disasm_data *disdata)
1569 {
1570   int retval = 0;
1571   int tmp;
1572   int prefix_ok = 0;
1573   const char *s;
1574 
1575   for (s = cs; *s; s++)
1576     switch (*s)
1577       {
1578       case '!':
1579 	/* Do not recognize "pop" if there's a prefix and then only for
1580            v0..v10.  */
1581 	if (prefix_insn != NO_CRIS_PREFIX
1582 	    || disdata->distype != cris_dis_v0_v10)
1583 	  return -1;
1584 	break;
1585 
1586       case 'U':
1587 	/* Not recognized at disassembly.  */
1588 	return -1;
1589 
1590       case 'M':
1591 	/* Size modifier for "clear", i.e. special register 0, 4 or 8.
1592 	   Check that it is one of them.  Only special register 12 could
1593 	   be mismatched, but checking for matches is more logical than
1594 	   checking for mismatches when there are only a few cases.  */
1595 	tmp = ((insn >> 12) & 0xf);
1596 	if (tmp != 0 && tmp != 4 && tmp != 8)
1597 	  return -1;
1598 	break;
1599 
1600       case 'm':
1601 	if ((insn & 0x30) == 0x30)
1602 	  return -1;
1603 	break;
1604 
1605       case 'S':
1606 	/* A prefix operand without side-effect.  */
1607 	if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1608 	  {
1609 	    prefix_ok = 1;
1610 	    break;
1611 	  }
1612 	else
1613 	  return -1;
1614 
1615       case 's':
1616       case 'y':
1617       case 'Y':
1618 	/* If this is a prefixed insn with postincrement (side-effect),
1619 	   the prefix must not be DIP.  */
1620 	if (prefix_insn != NO_CRIS_PREFIX)
1621 	  {
1622 	    if (insn & 0x400)
1623 	      {
1624 		const struct cris_opcode *prefix_opcodep
1625 		  = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1626 
1627 		if (prefix_opcodep->match == DIP_OPCODE)
1628 		  return -1;
1629 	      }
1630 
1631 	    prefix_ok = 1;
1632 	  }
1633 	break;
1634 
1635       case 'B':
1636 	/* If we don't fall through, then the prefix is ok.  */
1637 	prefix_ok = 1;
1638 
1639 	/* A "push" prefix.  Check for valid "push" size.
1640 	   In case of special register, it may be != 4.  */
1641 	if (prefix_insn != NO_CRIS_PREFIX)
1642 	  {
1643 	    /* Match the prefix insn to BDAPQ.  */
1644 	    const struct cris_opcode *prefix_opcodep
1645 	      = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1646 
1647 	    if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1648 	      {
1649 		int pushsize = (prefix_insn & 255);
1650 
1651 		if (pushsize > 127)
1652 		  pushsize -= 256;
1653 
1654 		if (s[1] == 'P')
1655 		  {
1656 		    unsigned int spec_reg = (insn >> 12) & 15;
1657 		    const struct cris_spec_reg *sregp
1658 		      = spec_reg_info (spec_reg, disdata->distype);
1659 
1660 		    /* For a special-register, the "prefix size" must
1661 		       match the size of the register.  */
1662 		    if (sregp && sregp->reg_size == (unsigned int) -pushsize)
1663 		      break;
1664 		  }
1665 		else if (s[1] == 'R')
1666 		  {
1667 		    if ((insn & 0x30) == 0x20 && pushsize == -4)
1668 		      break;
1669 		  }
1670 		/* FIXME:  Should abort here; next constraint letter
1671 		   *must* be 'P' or 'R'.  */
1672 	      }
1673 	  }
1674 	return -1;
1675 
1676       case 'D':
1677 	retval = (((insn >> 12) & 15) == (insn & 15));
1678 	if (!retval)
1679 	  return -1;
1680 	else
1681 	  retval += 4;
1682 	break;
1683 
1684       case 'P':
1685 	{
1686 	  const struct cris_spec_reg *sregp
1687 	    = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1688 
1689 	  /* Since we match four bits, we will give a value of 4-1 = 3
1690 	     in a match.  If there is a corresponding exact match of a
1691 	     special register in another pattern, it will get a value of
1692 	     4, which will be higher.  This should be correct in that an
1693 	     exact pattern would match better than a general pattern.
1694 
1695 	     Note that there is a reason for not returning zero; the
1696 	     pattern for "clear" is partly  matched in the bit-pattern
1697 	     (the two lower bits must be zero), while the bit-pattern
1698 	     for a move from a special register is matched in the
1699 	     register constraint.  */
1700 
1701 	  if (sregp != NULL)
1702 	    {
1703 	      retval += 3;
1704 	      break;
1705 	    }
1706 	  else
1707 	    return -1;
1708 	}
1709       }
1710 
1711   if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1712     return -1;
1713 
1714   return retval;
1715 }
1716 
1717 /* Format number as hex with a leading "0x" into outbuffer.  */
1718 
1719 static char *
1720 format_hex (unsigned long number,
1721 	    char *outbuffer,
1722 	    struct cris_disasm_data *disdata)
1723 {
1724   /* Truncate negative numbers on >32-bit hosts.  */
1725   number &= 0xffffffff;
1726 
1727   sprintf (outbuffer, "0x%lx", number);
1728 
1729   /* Save this value for the "case" support.  */
1730   if (TRACE_CASE)
1731     last_immediate = number;
1732 
1733   return outbuffer + strlen (outbuffer);
1734 }
1735 
1736 /* Format number as decimal into outbuffer.  Parameter signedp says
1737    whether the number should be formatted as signed (!= 0) or
1738    unsigned (== 0).  */
1739 
1740 static char *
1741 format_dec (long number, char *outbuffer, int signedp)
1742 {
1743   last_immediate = number;
1744   sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1745 
1746   return outbuffer + strlen (outbuffer);
1747 }
1748 
1749 /* Format the name of the general register regno into outbuffer.  */
1750 
1751 static char *
1752 format_reg (struct cris_disasm_data *disdata,
1753 	    int regno,
1754 	    char *outbuffer_start,
1755 	    bfd_boolean with_reg_prefix)
1756 {
1757   char *outbuffer = outbuffer_start;
1758 
1759   if (with_reg_prefix)
1760     *outbuffer++ = REGISTER_PREFIX_CHAR;
1761 
1762   switch (regno)
1763     {
1764     case 15:
1765       /* For v32, there is no context in which we output PC.  */
1766       if (disdata->distype == cris_dis_v32)
1767 	strcpy (outbuffer, "acr");
1768       else
1769 	strcpy (outbuffer, "pc");
1770       break;
1771 
1772     case 14:
1773       strcpy (outbuffer, "sp");
1774       break;
1775 
1776     default:
1777       sprintf (outbuffer, "r%d", regno);
1778       break;
1779     }
1780 
1781   return outbuffer_start + strlen (outbuffer_start);
1782 }
1783 
1784 /* Format the name of a support register into outbuffer.  */
1785 
1786 static char *
1787 format_sup_reg (unsigned int regno,
1788 		char *outbuffer_start,
1789 		bfd_boolean with_reg_prefix)
1790 {
1791   char *outbuffer = outbuffer_start;
1792   int i;
1793 
1794   if (with_reg_prefix)
1795     *outbuffer++ = REGISTER_PREFIX_CHAR;
1796 
1797   for (i = 0; cris_support_regs[i].name != NULL; i++)
1798     if (cris_support_regs[i].number == regno)
1799       {
1800 	sprintf (outbuffer, "%s", cris_support_regs[i].name);
1801 	return outbuffer_start + strlen (outbuffer_start);
1802       }
1803 
1804   /* There's supposed to be register names covering all numbers, though
1805      some may be generic names.  */
1806   sprintf (outbuffer, "format_sup_reg-BUG");
1807   return outbuffer_start + strlen (outbuffer_start);
1808 }
1809 
1810 /* Return the length of an instruction.  */
1811 
1812 static unsigned
1813 bytes_to_skip (unsigned int insn,
1814 	       const struct cris_opcode *matchedp,
1815 	       enum cris_disass_family distype,
1816 	       const struct cris_opcode *prefix_matchedp)
1817 {
1818   /* Each insn is a word plus "immediate" operands.  */
1819   unsigned to_skip = 2;
1820   const char *template = matchedp->args;
1821   const char *s;
1822 
1823   for (s = template; *s; s++)
1824     if ((*s == 's' || *s == 'N' || *s == 'Y')
1825 	&& (insn & 0x400) && (insn & 15) == 15
1826 	&& prefix_matchedp == NULL)
1827       {
1828 	/* Immediate via [pc+], so we have to check the size of the
1829 	   operand.  */
1830 	int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1831 
1832 	if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1833 	  to_skip += 4;
1834 	else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1835 	  {
1836 	    const struct cris_spec_reg *sregp
1837 	      = spec_reg_info ((insn >> 12) & 15, distype);
1838 
1839 	    /* FIXME: Improve error handling; should have been caught
1840 	       earlier.  */
1841 	    if (sregp == NULL)
1842 	      return 2;
1843 
1844 	    /* PC is incremented by two, not one, for a byte.  Except on
1845 	       CRISv32, where constants are always DWORD-size for
1846 	       special registers.  */
1847 	    to_skip +=
1848 	      distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1849 	  }
1850 	else
1851 	  to_skip += (mode_size + 1) & ~1;
1852       }
1853     else if (*s == 'n')
1854       to_skip += 4;
1855     else if (*s == 'b')
1856       to_skip += 2;
1857 
1858   return to_skip;
1859 }
1860 
1861 /* Print condition code flags.  */
1862 
1863 static char *
1864 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1865 {
1866   /* Use the v8 (Etrax 100) flag definitions for disassembly.
1867      The differences with v0 (Etrax 1..4) vs. Svinto are:
1868       v0 'd' <=> v8 'm'
1869       v0 'e' <=> v8 'b'.
1870      FIXME: Emit v0..v3 flag names somehow.  */
1871   static const char v8_fnames[] = "cvznxibm";
1872   static const char v32_fnames[] = "cvznxiup";
1873   const char *fnames
1874     = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1875 
1876   unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1877   int i;
1878 
1879   for (i = 0; i < 8; i++)
1880     if (flagbits & (1 << i))
1881       *cp++ = fnames[i];
1882 
1883   return cp;
1884 }
1885 
1886 /* Print out an insn with its operands, and update the info->insn_type
1887    fields.  The prefix_opcodep and the rest hold a prefix insn that is
1888    supposed to be output as an address mode.  */
1889 
1890 static void
1891 print_with_operands (const struct cris_opcode *opcodep,
1892 		     unsigned int insn,
1893 		     unsigned char *buffer,
1894 		     bfd_vma addr,
1895 		     disassemble_info *info,
1896 		     /* If a prefix insn was before this insn (and is supposed
1897 			to be output as an address), here is a description of
1898 			it.  */
1899 		     const struct cris_opcode *prefix_opcodep,
1900 		     unsigned int prefix_insn,
1901 		     unsigned char *prefix_buffer,
1902 		     bfd_boolean with_reg_prefix)
1903 {
1904   /* Get a buffer of somewhat reasonable size where we store
1905      intermediate parts of the insn.  */
1906   char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1907   char *tp = temp;
1908   static const char mode_char[] = "bwd?";
1909   const char *s;
1910   const char *cs;
1911   struct cris_disasm_data *disdata
1912     = (struct cris_disasm_data *) info->private_data;
1913 
1914   /* Print out the name first thing we do.  */
1915   (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1916 
1917   cs = opcodep->args;
1918   s = cs;
1919 
1920   /* Ignore any prefix indicator.  */
1921   if (*s == 'p')
1922     s++;
1923 
1924   if (*s == 'm' || *s == 'M' || *s == 'z')
1925     {
1926       *tp++ = '.';
1927 
1928       /* Get the size-letter.  */
1929       *tp++ = *s == 'M'
1930 	? (insn & 0x8000 ? 'd'
1931 	   : insn & 0x4000 ? 'w' : 'b')
1932 	: mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1933 
1934       /* Ignore the size and the space character that follows.  */
1935       s += 2;
1936     }
1937 
1938   /* Add a space if this isn't a long-branch, because for those will add
1939      the condition part of the name later.  */
1940   if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
1941     *tp++ = ' ';
1942 
1943   /* Fill in the insn-type if deducible from the name (and there's no
1944      better way).  */
1945   if (opcodep->name[0] == 'j')
1946     {
1947       if (CONST_STRNEQ (opcodep->name, "jsr"))
1948 	/* It's "jsr" or "jsrc".  */
1949 	info->insn_type = dis_jsr;
1950       else
1951 	/* Any other jump-type insn is considered a branch.  */
1952 	info->insn_type = dis_branch;
1953     }
1954 
1955   /* We might know some more fields right now.  */
1956   info->branch_delay_insns = opcodep->delayed;
1957 
1958   /* Handle operands.  */
1959   for (; *s; s++)
1960     {
1961     switch (*s)
1962       {
1963       case 'T':
1964 	tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
1965 	break;
1966 
1967       case 'A':
1968 	if (with_reg_prefix)
1969 	  *tp++ = REGISTER_PREFIX_CHAR;
1970 	*tp++ = 'a';
1971 	*tp++ = 'c';
1972 	*tp++ = 'r';
1973 	break;
1974 
1975       case '[':
1976       case ']':
1977       case ',':
1978 	*tp++ = *s;
1979 	break;
1980 
1981       case '!':
1982 	/* Ignore at this point; used at earlier stages to avoid
1983 	   recognition if there's a prefix at something that in other
1984 	   ways looks like a "pop".  */
1985 	break;
1986 
1987       case 'd':
1988 	/* Ignore.  This is an optional ".d " on the large one of
1989 	   relaxable insns.  */
1990 	break;
1991 
1992       case 'B':
1993 	/* This was the prefix that made this a "push".  We've already
1994 	   handled it by recognizing it, so signal that the prefix is
1995 	   handled by setting it to NULL.  */
1996 	prefix_opcodep = NULL;
1997 	break;
1998 
1999       case 'D':
2000       case 'r':
2001 	tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2002 	break;
2003 
2004       case 'R':
2005 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2006 	break;
2007 
2008       case 'n':
2009 	{
2010 	  /* Like N but pc-relative to the start of the insn.  */
2011 	  uint32_t number
2012 	    = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2013 	       + buffer[5] * 0x1000000 + addr);
2014 
2015 	  /* Finish off and output previous formatted bytes.  */
2016 	  *tp = 0;
2017 	  if (temp[0])
2018 	    (*info->fprintf_func) (info->stream, "%s", temp);
2019 	  tp = temp;
2020 
2021 	  (*info->print_address_func) ((bfd_vma) number, info);
2022 	}
2023 	break;
2024 
2025       case 'u':
2026 	{
2027 	  /* Like n but the offset is bits <3:0> in the instruction.  */
2028 	  unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2029 
2030 	  /* Finish off and output previous formatted bytes.  */
2031 	  *tp = 0;
2032 	  if (temp[0])
2033 	    (*info->fprintf_func) (info->stream, "%s", temp);
2034 	  tp = temp;
2035 
2036 	  (*info->print_address_func) ((bfd_vma) number, info);
2037 	}
2038 	break;
2039 
2040       case 'N':
2041       case 'y':
2042       case 'Y':
2043       case 'S':
2044       case 's':
2045 	/* Any "normal" memory operand.  */
2046 	if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2047 	  {
2048 	    /* We're looking at [pc+], i.e. we need to output an immediate
2049 	       number, where the size can depend on different things.  */
2050 	    int32_t number;
2051 	    int signedp
2052 	      = ((*cs == 'z' && (insn & 0x20))
2053 		 || opcodep->match == BDAP_QUICK_OPCODE);
2054 	    int nbytes;
2055 
2056 	    if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2057 	      nbytes = 4;
2058 	    else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2059 	      {
2060 		const struct cris_spec_reg *sregp
2061 		  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2062 
2063 		/* A NULL return should have been as a non-match earlier,
2064 		   so catch it as an internal error in the error-case
2065 		   below.  */
2066 		if (sregp == NULL)
2067 		  /* Whatever non-valid size.  */
2068 		  nbytes = 42;
2069 		else
2070 		  /* PC is always incremented by a multiple of two.
2071 		     For CRISv32, immediates are always 4 bytes for
2072 		     special registers.  */
2073 		  nbytes = disdata->distype == cris_dis_v32
2074 		    ? 4 : (sregp->reg_size + 1) & ~1;
2075 	      }
2076 	    else
2077 	      {
2078 		int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2079 
2080 		if (mode_size == 1)
2081 		  nbytes = 2;
2082 		else
2083 		  nbytes = mode_size;
2084 	      }
2085 
2086 	    switch (nbytes)
2087 	      {
2088 	      case 1:
2089 		number = buffer[2];
2090 		if (signedp && number > 127)
2091 		  number -= 256;
2092 		break;
2093 
2094 	      case 2:
2095 		number = buffer[2] + buffer[3] * 256;
2096 		if (signedp && number > 32767)
2097 		  number -= 65536;
2098 		break;
2099 
2100 	      case 4:
2101 		number
2102 		  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2103 		  + buffer[5] * 0x1000000;
2104 		break;
2105 
2106 	      default:
2107 		strcpy (tp, "bug");
2108 		tp += 3;
2109 		number = 42;
2110 	      }
2111 
2112 	    if ((*cs == 'z' && (insn & 0x20))
2113 		|| (opcodep->match == BDAP_QUICK_OPCODE
2114 		    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2115 	      tp = format_dec (number, tp, signedp);
2116 	    else
2117 	      {
2118 		unsigned int highbyte = (number >> 24) & 0xff;
2119 
2120 		/* Either output this as an address or as a number.  If it's
2121 		   a dword with the same high-byte as the address of the
2122 		   insn, assume it's an address, and also if it's a non-zero
2123 		   non-0xff high-byte.  If this is a jsr or a jump, then
2124 		   it's definitely an address.  */
2125 		if (nbytes == 4
2126 		    && (highbyte == ((addr >> 24) & 0xff)
2127 			|| (highbyte != 0 && highbyte != 0xff)
2128 			|| info->insn_type == dis_branch
2129 			|| info->insn_type == dis_jsr))
2130 		  {
2131 		    /* Finish off and output previous formatted bytes.  */
2132 		    *tp = 0;
2133 		    tp = temp;
2134 		    if (temp[0])
2135 		      (*info->fprintf_func) (info->stream, "%s", temp);
2136 
2137 		    (*info->print_address_func) ((bfd_vma) number, info);
2138 
2139 		    info->target = number;
2140 		  }
2141 		else
2142 		  tp = format_hex (number, tp, disdata);
2143 	      }
2144 	  }
2145 	else
2146 	  {
2147 	    /* Not an immediate number.  Then this is a (possibly
2148 	       prefixed) memory operand.  */
2149 	    if (info->insn_type != dis_nonbranch)
2150 	      {
2151 		int mode_size
2152 		  = 1 << ((insn >> 4)
2153 			  & (opcodep->args[0] == 'z' ? 1 : 3));
2154 		int size;
2155 		info->insn_type = dis_dref;
2156 		info->flags |= CRIS_DIS_FLAG_MEMREF;
2157 
2158 		if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2159 		  size = 4;
2160 		else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2161 		  {
2162 		    const struct cris_spec_reg *sregp
2163 		      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2164 
2165 		    /* FIXME: Improve error handling; should have been caught
2166 		       earlier.  */
2167 		    if (sregp == NULL)
2168 		      size = 4;
2169 		    else
2170 		      size = sregp->reg_size;
2171 		  }
2172 		else
2173 		  size = mode_size;
2174 
2175 		info->data_size = size;
2176 	      }
2177 
2178 	    *tp++ = '[';
2179 
2180 	    if (prefix_opcodep
2181 		/* We don't match dip with a postincremented field
2182 		   as a side-effect address mode.  */
2183 		&& ((insn & 0x400) == 0
2184 		    || prefix_opcodep->match != DIP_OPCODE))
2185 	      {
2186 		if (insn & 0x400)
2187 		  {
2188 		    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2189 		    *tp++ = '=';
2190 		  }
2191 
2192 
2193 		/* We mainly ignore the prefix format string when the
2194 		   address-mode syntax is output.  */
2195 		switch (prefix_opcodep->match)
2196 		  {
2197 		  case DIP_OPCODE:
2198 		    /* It's [r], [r+] or [pc+].  */
2199 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2200 		      {
2201 			/* It's [pc+].  This cannot possibly be anything
2202 			   but an address.  */
2203 			uint32_t number
2204 			  = prefix_buffer[2] + prefix_buffer[3] * 256
2205 			  + prefix_buffer[4] * 65536
2206 			  + prefix_buffer[5] * 0x1000000;
2207 
2208 			info->target = (bfd_vma) number;
2209 
2210 			/* Finish off and output previous formatted
2211 			   data.  */
2212 			*tp = 0;
2213 			tp = temp;
2214 			if (temp[0])
2215 			  (*info->fprintf_func) (info->stream, "%s", temp);
2216 
2217 			(*info->print_address_func) ((bfd_vma) number, info);
2218 		      }
2219 		    else
2220 		      {
2221 			/* For a memref in an address, we use target2.
2222 			   In this case, target is zero.  */
2223 			info->flags
2224 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2225 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2226 
2227 			info->target2 = prefix_insn & 15;
2228 
2229 			*tp++ = '[';
2230 			tp = format_reg (disdata, prefix_insn & 15, tp,
2231 					 with_reg_prefix);
2232 			if (prefix_insn & 0x400)
2233 			  *tp++ = '+';
2234 			*tp++ = ']';
2235 		      }
2236 		    break;
2237 
2238 		  case BDAP_QUICK_OPCODE:
2239 		    {
2240 		      int number;
2241 
2242 		      number = prefix_buffer[0];
2243 		      if (number > 127)
2244 			number -= 256;
2245 
2246 		      /* Output "reg+num" or, if num < 0, "reg-num".  */
2247 		      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2248 				       with_reg_prefix);
2249 		      if (number >= 0)
2250 			*tp++ = '+';
2251 		      tp = format_dec (number, tp, 1);
2252 
2253 		      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2254 		      info->target = (prefix_insn >> 12) & 15;
2255 		      info->target2 = (bfd_vma) number;
2256 		      break;
2257 		    }
2258 
2259 		  case BIAP_OPCODE:
2260 		    /* Output "r+R.m".  */
2261 		    tp = format_reg (disdata, prefix_insn & 15, tp,
2262 				     with_reg_prefix);
2263 		    *tp++ = '+';
2264 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2265 				     with_reg_prefix);
2266 		    *tp++ = '.';
2267 		    *tp++ = mode_char[(prefix_insn >> 4) & 3];
2268 
2269 		    info->flags
2270 		      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2271 			  | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2272 
2273 			  | ((prefix_insn & 0x8000)
2274 			     ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2275 			     : ((prefix_insn & 0x8000)
2276 				? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2277 
2278 		    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
2279 		    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
2280 		      /* Then start interpreting data as offsets.  */
2281 		      case_offset_counter = no_of_case_offsets;
2282 		    break;
2283 
2284 		  case BDAP_INDIR_OPCODE:
2285 		    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2286 		       "r-s".  */
2287 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2288 				     with_reg_prefix);
2289 
2290 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2291 		      {
2292 			int32_t number;
2293 			unsigned int nbytes;
2294 
2295 			/* It's a value.  Get its size.  */
2296 			int mode_size = 1 << ((prefix_insn >> 4) & 3);
2297 
2298 			if (mode_size == 1)
2299 			  nbytes = 2;
2300 			else
2301 			  nbytes = mode_size;
2302 
2303 			switch (nbytes)
2304 			  {
2305 			  case 1:
2306 			    number = prefix_buffer[2];
2307 			    if (number > 127)
2308 			      number -= 256;
2309 			    break;
2310 
2311 			  case 2:
2312 			    number = prefix_buffer[2] + prefix_buffer[3] * 256;
2313 			    if (number > 32767)
2314 			      number -= 65536;
2315 			    break;
2316 
2317 			  case 4:
2318 			    number
2319 			      = prefix_buffer[2] + prefix_buffer[3] * 256
2320 			      + prefix_buffer[4] * 65536
2321 			      + prefix_buffer[5] * 0x1000000;
2322 			    break;
2323 
2324 			  default:
2325 			    strcpy (tp, "bug");
2326 			    tp += 3;
2327 			    number = 42;
2328 			  }
2329 
2330 			info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2331 			info->target2 = (bfd_vma) number;
2332 
2333 			/* If the size is dword, then assume it's an
2334 			   address.  */
2335 			if (nbytes == 4)
2336 			  {
2337 			    /* Finish off and output previous formatted
2338 			       bytes.  */
2339 			    *tp++ = '+';
2340 			    *tp = 0;
2341 			    tp = temp;
2342 			    (*info->fprintf_func) (info->stream, "%s", temp);
2343 
2344 			    (*info->print_address_func) ((bfd_vma) number, info);
2345 			  }
2346 			else
2347 			  {
2348 			    if (number >= 0)
2349 			      *tp++ = '+';
2350 			    tp = format_dec (number, tp, 1);
2351 			  }
2352 		      }
2353 		    else
2354 		      {
2355 			/* Output "r+[R].m" or "r+[R+].m".  */
2356 			*tp++ = '+';
2357 			*tp++ = '[';
2358 			tp = format_reg (disdata, prefix_insn & 15, tp,
2359 					 with_reg_prefix);
2360 			if (prefix_insn & 0x400)
2361 			  *tp++ = '+';
2362 			*tp++ = ']';
2363 			*tp++ = '.';
2364 			*tp++ = mode_char[(prefix_insn >> 4) & 3];
2365 
2366 			info->flags
2367 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2368 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2369 			      | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2370 
2371 			      | (((prefix_insn >> 4) == 2)
2372 				 ? 0
2373 				 : (((prefix_insn >> 4) & 3) == 1
2374 				    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2375 				    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2376 		      }
2377 		    break;
2378 
2379 		  default:
2380 		    (*info->fprintf_func) (info->stream, "?prefix-bug");
2381 		  }
2382 
2383 		/* To mark that the prefix is used, reset it.  */
2384 		prefix_opcodep = NULL;
2385 	      }
2386 	    else
2387 	      {
2388 		tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2389 
2390 		info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2391 		info->target = insn & 15;
2392 
2393 		if (insn & 0x400)
2394 		  *tp++ = '+';
2395 	      }
2396 	    *tp++ = ']';
2397 	  }
2398 	break;
2399 
2400       case 'x':
2401 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2402 	*tp++ = '.';
2403 	*tp++ = mode_char[(insn >> 4) & 3];
2404 	break;
2405 
2406       case 'I':
2407 	tp = format_dec (insn & 63, tp, 0);
2408 	break;
2409 
2410       case 'b':
2411 	{
2412 	  int where = buffer[2] + buffer[3] * 256;
2413 
2414 	  if (where > 32767)
2415 	    where -= 65536;
2416 
2417 	  where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2418 
2419 	  if (insn == BA_PC_INCR_OPCODE)
2420 	    info->insn_type = dis_branch;
2421 	  else
2422 	    info->insn_type = dis_condbranch;
2423 
2424 	  info->target = (bfd_vma) where;
2425 
2426 	  *tp = 0;
2427 	  tp = temp;
2428 	  (*info->fprintf_func) (info->stream, "%s%s ",
2429 				 temp, cris_cc_strings[insn >> 12]);
2430 
2431 	  (*info->print_address_func) ((bfd_vma) where, info);
2432 	}
2433       break;
2434 
2435     case 'c':
2436       tp = format_dec (insn & 31, tp, 0);
2437       break;
2438 
2439     case 'C':
2440       tp = format_dec (insn & 15, tp, 0);
2441       break;
2442 
2443     case 'o':
2444       {
2445 	long offset = insn & 0xfe;
2446 	bfd_vma target;
2447 
2448 	if (insn & 1)
2449 	  offset |= ~0xff;
2450 
2451 	if (opcodep->match == BA_QUICK_OPCODE)
2452 	  info->insn_type = dis_branch;
2453 	else
2454 	  info->insn_type = dis_condbranch;
2455 
2456 	target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2457 	info->target = target;
2458 	*tp = 0;
2459 	tp = temp;
2460 	(*info->fprintf_func) (info->stream, "%s", temp);
2461 	(*info->print_address_func) (target, info);
2462       }
2463       break;
2464 
2465     case 'Q':
2466     case 'O':
2467       {
2468 	long number = buffer[0];
2469 
2470 	if (number > 127)
2471 	  number = number - 256;
2472 
2473 	tp = format_dec (number, tp, 1);
2474 	*tp++ = ',';
2475 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2476       }
2477       break;
2478 
2479     case 'f':
2480       tp = print_flags (disdata, insn, tp);
2481       break;
2482 
2483     case 'i':
2484       tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2485       break;
2486 
2487     case 'P':
2488       {
2489 	const struct cris_spec_reg *sregp
2490 	  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2491 
2492 	if (sregp == NULL || sregp->name == NULL)
2493 	  /* Should have been caught as a non-match earlier.  */
2494 	  *tp++ = '?';
2495 	else
2496 	  {
2497 	    if (with_reg_prefix)
2498 	      *tp++ = REGISTER_PREFIX_CHAR;
2499 	    strcpy (tp, sregp->name);
2500 	    tp += strlen (tp);
2501 	  }
2502       }
2503       break;
2504 
2505     default:
2506       strcpy (tp, "???");
2507       tp += 3;
2508     }
2509   }
2510 
2511   *tp = 0;
2512 
2513   if (prefix_opcodep)
2514     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2515 			   prefix_opcodep->name, prefix_opcodep->args);
2516 
2517   (*info->fprintf_func) (info->stream, "%s", temp);
2518 
2519   /* Get info for matching case-tables, if we don't have any active.
2520      We assume that the last constant seen is used; either in the insn
2521      itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
2522   if (TRACE_CASE && case_offset_counter == 0)
2523     {
2524       if (CONST_STRNEQ (opcodep->name, "sub"))
2525 	case_offset = last_immediate;
2526 
2527       /* It could also be an "add", if there are negative case-values.  */
2528       else if (CONST_STRNEQ (opcodep->name, "add"))
2529 	/* The first case is the negated operand to the add.  */
2530 	case_offset = -last_immediate;
2531 
2532       /* A bound insn will tell us the number of cases.  */
2533       else if (CONST_STRNEQ (opcodep->name, "bound"))
2534 	no_of_case_offsets = last_immediate + 1;
2535 
2536       /* A jump or jsr or branch breaks the chain of insns for a
2537 	 case-table, so assume default first-case again.  */
2538       else if (info->insn_type == dis_jsr
2539 	       || info->insn_type == dis_branch
2540 	       || info->insn_type == dis_condbranch)
2541 	case_offset = 0;
2542     }
2543 }
2544 
2545 
2546 /* Print the CRIS instruction at address memaddr on stream.  Returns
2547    length of the instruction, in bytes.  Prefix register names with `$' if
2548    WITH_REG_PREFIX.  */
2549 
2550 static int
2551 print_insn_cris_generic (bfd_vma memaddr,
2552 			 disassemble_info *info,
2553 			 bfd_boolean with_reg_prefix)
2554 {
2555   int nbytes;
2556   unsigned int insn;
2557   const struct cris_opcode *matchedp;
2558   int advance = 0;
2559   struct cris_disasm_data *disdata
2560     = (struct cris_disasm_data *) info->private_data;
2561 
2562   /* No instruction will be disassembled as longer than this number of
2563      bytes; stacked prefixes will not be expanded.  */
2564   unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
2565   unsigned char *bufp;
2566   int status = 0;
2567   bfd_vma addr;
2568 
2569   /* There will be an "out of range" error after the last instruction.
2570      Reading pairs of bytes in decreasing number, we hope that we will get
2571      at least the amount that we will consume.
2572 
2573      If we can't get any data, or we do not get enough data, we print
2574      the error message.  */
2575 
2576   nbytes = info->buffer_length ? info->buffer_length
2577                                : MAX_BYTES_PER_CRIS_INSN;
2578   nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN);
2579   status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
2580 
2581   /* If we did not get all we asked for, then clear the rest.
2582      Hopefully this makes a reproducible result in case of errors.  */
2583   if (nbytes != MAX_BYTES_PER_CRIS_INSN)
2584     memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
2585 
2586   addr = memaddr;
2587   bufp = buffer;
2588 
2589   /* Set some defaults for the insn info.  */
2590   info->insn_info_valid = 1;
2591   info->branch_delay_insns = 0;
2592   info->data_size = 0;
2593   info->insn_type = dis_nonbranch;
2594   info->flags = 0;
2595   info->target = 0;
2596   info->target2 = 0;
2597 
2598   /* If we got any data, disassemble it.  */
2599   if (nbytes != 0)
2600     {
2601       matchedp = NULL;
2602 
2603       insn = bufp[0] + bufp[1] * 256;
2604 
2605       /* If we're in a case-table, don't disassemble the offsets.  */
2606       if (TRACE_CASE && case_offset_counter != 0)
2607 	{
2608 	  info->insn_type = dis_noninsn;
2609 	  advance += 2;
2610 
2611 	  /* If to print data as offsets, then shortcut here.  */
2612 	  (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
2613 				 case_offset + no_of_case_offsets
2614 				 - case_offset_counter,
2615 				 case_offset_counter == 1 ? "/default" :
2616 				 "");
2617 
2618 	  (*info->print_address_func) ((bfd_vma)
2619 				       ((short) (insn)
2620 					+ (long) (addr
2621 						  - (no_of_case_offsets
2622 						     - case_offset_counter)
2623 						  * 2)), info);
2624 	  case_offset_counter--;
2625 
2626 	  /* The default case start (without a "sub" or "add") must be
2627 	     zero.  */
2628 	  if (case_offset_counter == 0)
2629 	    case_offset = 0;
2630 	}
2631       else if (insn == 0)
2632 	{
2633 	  /* We're often called to disassemble zeroes.  While this is a
2634 	     valid "bcc .+2" insn, it is also useless enough and enough
2635 	     of a nuiscance that we will just output "bcc .+2" for it
2636 	     and signal it as a noninsn.  */
2637 	  (*info->fprintf_func) (info->stream,
2638 				 disdata->distype == cris_dis_v32
2639 				 ? "bcc ." : "bcc .+2");
2640 	  info->insn_type = dis_noninsn;
2641 	  advance += 2;
2642 	}
2643       else
2644 	{
2645 	  const struct cris_opcode *prefix_opcodep = NULL;
2646 	  unsigned char *prefix_buffer = bufp;
2647 	  unsigned int prefix_insn = insn;
2648 	  int prefix_size = 0;
2649 
2650 	  matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2651 
2652 	  /* Check if we're supposed to write out prefixes as address
2653 	     modes and if this was a prefix.  */
2654 	  if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
2655 	    {
2656 	      /* If it's a prefix, put it into the prefix vars and get the
2657 		 main insn.  */
2658 	      prefix_size = bytes_to_skip (prefix_insn, matchedp,
2659 					   disdata->distype, NULL);
2660 	      prefix_opcodep = matchedp;
2661 
2662 	      insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2663 	      matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2664 
2665 	      if (matchedp != NULL)
2666 		{
2667 		  addr += prefix_size;
2668 		  bufp += prefix_size;
2669 		  advance += prefix_size;
2670 		}
2671 	      else
2672 		{
2673 		  /* The "main" insn wasn't valid, at least not when
2674 		     prefixed.  Put back things enough to output the
2675 		     prefix insn only, as a normal insn.  */
2676 		  matchedp = prefix_opcodep;
2677 		  insn = prefix_insn;
2678 		  prefix_opcodep = NULL;
2679 		}
2680 	    }
2681 
2682 	  if (matchedp == NULL)
2683 	    {
2684 	      (*info->fprintf_func) (info->stream, "??0x%x", insn);
2685 	      advance += 2;
2686 
2687 	      info->insn_type = dis_noninsn;
2688 	    }
2689 	  else
2690 	    {
2691 	      advance
2692 		+= bytes_to_skip (insn, matchedp, disdata->distype,
2693 				  prefix_opcodep);
2694 
2695 	      /* The info_type and assorted fields will be set according
2696 		 to the operands.   */
2697 	      print_with_operands (matchedp, insn, bufp, addr, info,
2698 				   prefix_opcodep, prefix_insn,
2699 				   prefix_buffer, with_reg_prefix);
2700 	    }
2701 	}
2702     }
2703   else
2704     info->insn_type = dis_noninsn;
2705 
2706   /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2707      status when reading that much, and the insn decoding indicated a
2708      length exceeding what we read, there is an error.  */
2709   if (status != 0 && (nbytes == 0 || advance > nbytes))
2710     {
2711       (*info->memory_error_func) (status, memaddr, info);
2712       return -1;
2713     }
2714 
2715   /* Max supported insn size with one folded prefix insn.  */
2716   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2717 
2718   /* I would like to set this to a fixed value larger than the actual
2719      number of bytes to print in order to avoid spaces between bytes,
2720      but objdump.c (2.9.1) does not like that, so we print 16-bit
2721      chunks, which is the next choice.  */
2722   info->bytes_per_chunk = 2;
2723 
2724   /* Printing bytes in order of increasing addresses makes sense,
2725      especially on a little-endian target.
2726      This is completely the opposite of what you think; setting this to
2727      BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2728      we want.  */
2729   info->display_endian = BFD_ENDIAN_BIG;
2730 
2731   return advance;
2732 }
2733 
2734 /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
2735 static int
2736 print_insn_cris_with_register_prefix (bfd_vma vma,
2737 				      disassemble_info *info)
2738 {
2739   if (info->private_data == NULL
2740       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2741     return -1;
2742   return print_insn_cris_generic (vma, info, true);
2743 }
2744 /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
2745 
2746 static int
2747 print_insn_crisv32_with_register_prefix (bfd_vma vma,
2748 					 disassemble_info *info)
2749 {
2750   if (info->private_data == NULL
2751       && !cris_parse_disassembler_options (info, cris_dis_v32))
2752     return -1;
2753   return print_insn_cris_generic (vma, info, true);
2754 }
2755 
2756 #if 0
2757 /* Disassemble, prefixing register names with `$'.
2758    Common v10 and v32 subset.  */
2759 
2760 static int
2761 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2762 					     disassemble_info *info)
2763 {
2764   if (info->private_data == NULL
2765       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2766     return -1;
2767   return print_insn_cris_generic (vma, info, true);
2768 }
2769 
2770 /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
2771 
2772 static int
2773 print_insn_cris_without_register_prefix (bfd_vma vma,
2774 					 disassemble_info *info)
2775 {
2776   if (info->private_data == NULL
2777       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2778     return -1;
2779   return print_insn_cris_generic (vma, info, false);
2780 }
2781 
2782 /* Disassemble, no prefixes on register names.  CRIS v32.  */
2783 
2784 static int
2785 print_insn_crisv32_without_register_prefix (bfd_vma vma,
2786 					    disassemble_info *info)
2787 {
2788   if (info->private_data == NULL
2789       && !cris_parse_disassembler_options (info, cris_dis_v32))
2790     return -1;
2791   return print_insn_cris_generic (vma, info, false);
2792 }
2793 
2794 /* Disassemble, no prefixes on register names.
2795    Common v10 and v32 subset.  */
2796 
2797 static int
2798 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2799 						disassemble_info *info)
2800 {
2801   if (info->private_data == NULL
2802       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2803     return -1;
2804   return print_insn_cris_generic (vma, info, false);
2805 }
2806 #endif
2807 
2808 int
2809 print_insn_crisv10 (bfd_vma vma,
2810 		    disassemble_info *info)
2811 {
2812   return print_insn_cris_with_register_prefix(vma, info);
2813 }
2814 
2815 int
2816 print_insn_crisv32 (bfd_vma vma,
2817 		    disassemble_info *info)
2818 {
2819   return print_insn_crisv32_with_register_prefix(vma, info);
2820 }
2821 
2822 /* Return a disassembler-function that prints registers with a `$' prefix,
2823    or one that prints registers without a prefix.
2824    FIXME: We should improve the solution to avoid the multitude of
2825    functions seen above.  */
2826 #if 0
2827 disassembler_ftype
2828 cris_get_disassembler (bfd *abfd)
2829 {
2830   /* If there's no bfd in sight, we return what is valid as input in all
2831      contexts if fed back to the assembler: disassembly *with* register
2832      prefix.  Unfortunately this will be totally wrong for v32.  */
2833   if (abfd == NULL)
2834     return print_insn_cris_with_register_prefix;
2835 
2836   if (bfd_get_symbol_leading_char (abfd) == 0)
2837     {
2838       if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2839 	return print_insn_crisv32_with_register_prefix;
2840       if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2841 	return print_insn_crisv10_v32_with_register_prefix;
2842 
2843       /* We default to v10.  This may be specifically specified in the
2844 	 bfd mach, but is also the default setting.  */
2845       return print_insn_cris_with_register_prefix;
2846     }
2847 
2848   if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2849     return print_insn_crisv32_without_register_prefix;
2850   if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2851     return print_insn_crisv10_v32_without_register_prefix;
2852   return print_insn_cris_without_register_prefix;
2853 }
2854 #endif
2855 /* Local variables:
2856    eval: (c-set-style "gnu")
2857    indent-tabs-mode: t
2858    End:  */
2859