Statistics
| Branch: | Revision:

root / cris-dis.c @ 61c04807

History | View | Annotate | Download (80.6 kB)

1
/* Disassembler code for CRIS.
2
   Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
3
   Contributed by Axis Communications AB, Lund, Sweden.
4
   Written by Hans-Peter Nilsson.
5

6
   This file is part of the GNU binutils and GDB, the GNU debugger.
7

8
   This program is free software; you can redistribute it and/or modify it
9
   under the terms of the GNU General Public License as published by the
10
   Free Software Foundation; either version 2, or (at your option) any later
11
   version.
12

13
   This program is distributed in the hope that it will be useful, but WITHOUT
14
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16
   more details.
17

18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22

    
23
#include "dis-asm.h"
24
//#include "sysdep.h"
25
#include "target-cris/opcode-cris.h"
26
//#include "libiberty.h"
27
 
28

    
29
#define FALSE 0
30
#define TRUE 1
31
#define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
32

    
33
/* cris-opc.c -- Table of opcodes for the CRIS processor.
34
   Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
35
   Contributed by Axis Communications AB, Lund, Sweden.
36
   Originally written for GAS 1.38.1 by Mikael Asker.
37
   Reorganized by Hans-Peter Nilsson.
38

39
This file is part of GAS, GDB and the GNU binutils.
40

41
GAS, GDB, and GNU binutils is free software; you can redistribute it
42
and/or modify it under the terms of the GNU General Public License as
43
published by the Free Software Foundation; either version 2, or (at your
44
option) any later version.
45

46
GAS, GDB, and GNU binutils are distributed in the hope that they will be
47
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
48
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
49
GNU General Public License for more details.
50

51
You should have received a copy of the GNU General Public License
52
along with this program; if not, write to the Free Software
53
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
54

    
55
#ifndef NULL
56
#define NULL (0)
57
#endif
58

    
59
/* This table isn't used for CRISv32 and the size of immediate operands.  */
60
const struct cris_spec_reg
61
cris_spec_regs[] =
62
{
63
  {"bz",  0,  1, cris_ver_v32p,           NULL},
64
  {"p0",  0,  1, 0,                   NULL},
65
  {"vr",  1,  1, 0,                   NULL},
66
  {"p1",  1,  1, 0,                   NULL},
67
  {"pid", 2,  1, cris_ver_v32p,    NULL},
68
  {"p2",  2,  1, cris_ver_v32p,           NULL},
69
  {"p2",  2,  1, cris_ver_warning, NULL},
70
  {"srs", 3,  1, cris_ver_v32p,    NULL},
71
  {"p3",  3,  1, cris_ver_v32p,           NULL},
72
  {"p3",  3,  1, cris_ver_warning, NULL},
73
  {"wz",  4,  2, cris_ver_v32p,           NULL},
74
  {"p4",  4,  2, 0,                   NULL},
75
  {"ccr", 5,  2, cris_ver_v0_10,   NULL},
76
  {"exs", 5,  4, cris_ver_v32p,           NULL},
77
  {"p5",  5,  2, cris_ver_v0_10,   NULL},
78
  {"p5",  5,  4, cris_ver_v32p,           NULL},
79
  {"dcr0",6,  2, cris_ver_v0_3,           NULL},
80
  {"eda", 6,  4, cris_ver_v32p,           NULL},
81
  {"p6",  6,  2, cris_ver_v0_3,           NULL},
82
  {"p6",  6,  4, cris_ver_v32p,           NULL},
83
  {"dcr1/mof", 7, 4, cris_ver_v10p,
84
   "Register `dcr1/mof' with ambiguous size specified.  Guessing 4 bytes"},
85
  {"dcr1/mof", 7, 2, cris_ver_v0_3,
86
   "Register `dcr1/mof' with ambiguous size specified.  Guessing 2 bytes"},
87
  {"mof", 7,  4, cris_ver_v10p,           NULL},
88
  {"dcr1",7,  2, cris_ver_v0_3,           NULL},
89
  {"p7",  7,  4, cris_ver_v10p,           NULL},
90
  {"p7",  7,  2, cris_ver_v0_3,           NULL},
91
  {"dz",  8,  4, cris_ver_v32p,           NULL},
92
  {"p8",  8,  4, 0,                   NULL},
93
  {"ibr", 9,  4, cris_ver_v0_10,   NULL},
94
  {"ebp", 9,  4, cris_ver_v32p,           NULL},
95
  {"p9",  9,  4, 0,                   NULL},
96
  {"irp", 10, 4, cris_ver_v0_10,   NULL},
97
  {"erp", 10, 4, cris_ver_v32p,           NULL},
98
  {"p10", 10, 4, 0,                   NULL},
99
  {"srp", 11, 4, 0,                   NULL},
100
  {"p11", 11, 4, 0,                   NULL},
101
  /* For disassembly use only.  Accept at assembly with a warning.  */
102
  {"bar/dtp0", 12, 4, cris_ver_warning,
103
   "Ambiguous register `bar/dtp0' specified"},
104
  {"nrp", 12, 4, cris_ver_v32p,           NULL},
105
  {"bar", 12, 4, cris_ver_v8_10,   NULL},
106
  {"dtp0",12, 4, cris_ver_v0_3,           NULL},
107
  {"p12", 12, 4, 0,                   NULL},
108
  /* For disassembly use only.  Accept at assembly with a warning.  */
109
  {"dccr/dtp1",13, 4, cris_ver_warning,
110
   "Ambiguous register `dccr/dtp1' specified"},
111
  {"ccs", 13, 4, cris_ver_v32p,           NULL},
112
  {"dccr",13, 4, cris_ver_v8_10,   NULL},
113
  {"dtp1",13, 4, cris_ver_v0_3,           NULL},
114
  {"p13", 13, 4, 0,                   NULL},
115
  {"brp", 14, 4, cris_ver_v3_10,   NULL},
116
  {"usp", 14, 4, cris_ver_v32p,           NULL},
117
  {"p14", 14, 4, cris_ver_v3p,           NULL},
118
  {"usp", 15, 4, cris_ver_v10,           NULL},
119
  {"spc", 15, 4, cris_ver_v32p,           NULL},
120
  {"p15", 15, 4, cris_ver_v10p,           NULL},
121
  {NULL, 0, 0, cris_ver_version_all, NULL}
122
};
123

    
124
/* Add version specifiers to this table when necessary.
125
   The (now) regular coding of register names suggests a simpler
126
   implementation.  */
127
const struct cris_support_reg cris_support_regs[] =
128
{
129
  {"s0", 0},
130
  {"s1", 1},
131
  {"s2", 2},
132
  {"s3", 3},
133
  {"s4", 4},
134
  {"s5", 5},
135
  {"s6", 6},
136
  {"s7", 7},
137
  {"s8", 8},
138
  {"s9", 9},
139
  {"s10", 10},
140
  {"s11", 11},
141
  {"s12", 12},
142
  {"s13", 13},
143
  {"s14", 14},
144
  {"s15", 15},
145
  {NULL, 0}
146
};
147

    
148
/* All CRIS opcodes are 16 bits.
149

150
   - The match component is a mask saying which bits must match a
151
     particular opcode in order for an instruction to be an instance
152
     of that opcode.
153

154
   - The args component is a string containing characters symbolically
155
     matching the operands of an instruction.  Used for both assembly
156
     and disassembly.
157

158
     Operand-matching characters:
159
     [ ] , space
160
        Verbatim.
161
     A        The string "ACR" (case-insensitive).
162
     B        Not really an operand.  It causes a "BDAP -size,SP" prefix to be
163
        output for the PUSH alias-instructions and recognizes a push-
164
        prefix at disassembly.  This letter isn't recognized for v32.
165
        Must be followed by a R or P letter.
166
     !        Non-match pattern, will not match if there's a prefix insn.
167
     b        Non-matching operand, used for branches with 16-bit
168
        displacement. Only recognized by the disassembler.
169
     c        5-bit unsigned immediate in bits <4:0>.
170
     C        4-bit unsigned immediate in bits <3:0>.
171
     d  At assembly, optionally (as in put other cases before this one)
172
        ".d" or ".D" at the start of the operands, followed by one space
173
        character.  At disassembly, nothing.
174
     D        General register in bits <15:12> and <3:0>.
175
     f        List of flags in bits <15:12> and <3:0>.
176
     i        6-bit signed immediate in bits <5:0>.
177
     I        6-bit unsigned immediate in bits <5:0>.
178
     M        Size modifier (B, W or D) for CLEAR instructions.
179
     m        Size modifier (B, W or D) in bits <5:4>
180
     N  A 32-bit dword, like in the difference between s and y.
181
        This has no effect on bits in the opcode.  Can also be expressed
182
        as "[pc+]" in input.
183
     n  As N, but PC-relative (to the start of the instruction).
184
     o        [-128..127] word offset in bits <7:1> and <0>.  Used by 8-bit
185
        branch instructions.
186
     O        [-128..127] offset in bits <7:0>.  Also matches a comma and a
187
        general register after the expression, in bits <15:12>.  Used
188
        only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
189
     P        Special register in bits <15:12>.
190
     p        Indicates that the insn is a prefix insn.  Must be first
191
        character.
192
     Q  As O, but don't relax; force an 8-bit offset.
193
     R        General register in bits <15:12>.
194
     r        General register in bits <3:0>.
195
     S        Source operand in bit <10> and a prefix; a 3-operand prefix
196
        without side-effect.
197
     s        Source operand in bits <10> and <3:0>, optionally with a
198
        side-effect prefix, except [pc] (the name, not R15 as in ACR)
199
        isn't allowed for v32 and higher.
200
     T  Support register in bits <15:12>.
201
     u  4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
202
     U  Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
203
        Not recognized at disassembly.
204
     x        Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
205
     y        Like 's' but do not allow an integer at assembly.
206
     Y        The difference s-y; only an integer is allowed.
207
     z        Size modifier (B or W) in bit <4>.  */
208

    
209

    
210
/* Please note the order of the opcodes in this table is significant.
211
   The assembler requires that all instances of the same mnemonic must
212
   be consecutive.  If they aren't, the assembler might not recognize
213
   them, or may indicate an internal error.
214

215
   The disassembler should not normally care about the order of the
216
   opcodes, but will prefer an earlier alternative if the "match-score"
217
   (see cris-dis.c) is computed as equal.
218

219
   It should not be significant for proper execution that this table is
220
   in alphabetical order, but please follow that convention for an easy
221
   overview.  */
222

    
223
const struct cris_opcode
224
cris_opcodes[] =
225
{
226
  {"abs",     0x06B0, 0x0940,                  "r,R",     0, SIZE_NONE,     0,
227
   cris_abs_op},
228

    
229
  {"add",     0x0600, 0x09c0,                  "m r,R",   0, SIZE_NONE,     0,
230
   cris_reg_mode_add_sub_cmp_and_or_move_op},
231

    
232
  {"add",     0x0A00, 0x01c0,                  "m s,R",   0, SIZE_FIELD,    0,
233
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
234

    
235
  {"add",     0x0A00, 0x01c0,                  "m S,D",   0, SIZE_NONE,
236
   cris_ver_v0_10,
237
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
238

    
239
  {"add",     0x0a00, 0x05c0,                  "m S,R,r", 0, SIZE_NONE,
240
   cris_ver_v0_10,
241
   cris_three_operand_add_sub_cmp_and_or_op},
242

    
243
  {"add",     0x0A00, 0x01c0,                  "m s,R",   0, SIZE_FIELD,
244
   cris_ver_v32p,
245
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
246

    
247
  {"addc",    0x0570, 0x0A80,                  "r,R",     0, SIZE_FIX_32,
248
   cris_ver_v32p,
249
   cris_not_implemented_op},
250

    
251
  {"addc",    0x09A0, 0x0250,                  "s,R",     0, SIZE_FIX_32,
252
   cris_ver_v32p,
253
   cris_not_implemented_op},
254

    
255
  {"addi",    0x0540, 0x0A80,                  "x,r,A",   0, SIZE_NONE,
256
   cris_ver_v32p,
257
   cris_addi_op},
258

    
259
  {"addi",    0x0500, 0x0Ac0,                  "x,r",     0, SIZE_NONE,     0,
260
   cris_addi_op},
261

    
262
  /* This collates after "addo", but we want to disassemble as "addoq",
263
     not "addo".  */
264
  {"addoq",   0x0100, 0x0E00,                  "Q,A",     0, SIZE_NONE,
265
   cris_ver_v32p,
266
   cris_not_implemented_op},
267

    
268
  {"addo",    0x0940, 0x0280,                  "m s,R,A", 0, SIZE_FIELD_SIGNED,
269
   cris_ver_v32p,
270
   cris_not_implemented_op},
271

    
272
  /* This must be located after the insn above, lest we misinterpret
273
     "addo.b -1,r0,acr" as "addo .b-1,r0,acr".  FIXME: Sounds like a
274
     parser bug.  */
275
  {"addo",   0x0100, 0x0E00,                  "O,A",     0, SIZE_NONE,
276
   cris_ver_v32p,
277
   cris_not_implemented_op},
278

    
279
  {"addq",    0x0200, 0x0Dc0,                  "I,R",     0, SIZE_NONE,     0,
280
   cris_quick_mode_add_sub_op},
281

    
282
  {"adds",    0x0420, 0x0Bc0,                  "z r,R",   0, SIZE_NONE,     0,
283
   cris_reg_mode_add_sub_cmp_and_or_move_op},
284

    
285
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
286
  {"adds",    0x0820, 0x03c0,                  "z s,R",   0, SIZE_FIELD,    0,
287
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
288

    
289
  {"adds",    0x0820, 0x03c0,                  "z S,D",   0, SIZE_NONE,
290
   cris_ver_v0_10,
291
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
292

    
293
  {"adds",    0x0820, 0x07c0,                  "z S,R,r", 0, SIZE_NONE,
294
   cris_ver_v0_10,
295
   cris_three_operand_add_sub_cmp_and_or_op},
296

    
297
  {"addu",    0x0400, 0x0be0,                  "z r,R",   0, SIZE_NONE,     0,
298
   cris_reg_mode_add_sub_cmp_and_or_move_op},
299

    
300
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
301
  {"addu",    0x0800, 0x03e0,                  "z s,R",   0, SIZE_FIELD,    0,
302
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
303

    
304
  {"addu",    0x0800, 0x03e0,                  "z S,D",   0, SIZE_NONE,
305
   cris_ver_v0_10,
306
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
307

    
308
  {"addu",    0x0800, 0x07e0,                  "z S,R,r", 0, SIZE_NONE,
309
   cris_ver_v0_10,
310
   cris_three_operand_add_sub_cmp_and_or_op},
311

    
312
  {"and",     0x0700, 0x08C0,                  "m r,R",   0, SIZE_NONE,     0,
313
   cris_reg_mode_add_sub_cmp_and_or_move_op},
314

    
315
  {"and",     0x0B00, 0x00C0,                  "m s,R",   0, SIZE_FIELD,    0,
316
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
317

    
318
  {"and",     0x0B00, 0x00C0,                  "m S,D",   0, SIZE_NONE,
319
   cris_ver_v0_10,
320
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
321

    
322
  {"and",     0x0B00, 0x04C0,                  "m S,R,r", 0, SIZE_NONE,
323
   cris_ver_v0_10,
324
   cris_three_operand_add_sub_cmp_and_or_op},
325

    
326
  {"andq",    0x0300, 0x0CC0,                  "i,R",     0, SIZE_NONE,     0,
327
   cris_quick_mode_and_cmp_move_or_op},
328

    
329
  {"asr",     0x0780, 0x0840,                  "m r,R",   0, SIZE_NONE,     0,
330
   cris_asr_op},
331

    
332
  {"asrq",    0x03a0, 0x0c40,                  "c,R",     0, SIZE_NONE,     0,
333
   cris_asrq_op},
334

    
335
  {"ax",      0x15B0, 0xEA4F,                  "",             0, SIZE_NONE,     0,
336
   cris_ax_ei_setf_op},
337

    
338
  /* FIXME: Should use branch #defines.  */
339
  {"b",              0x0dff, 0x0200,                  "b",             1, SIZE_NONE,     0,
340
   cris_sixteen_bit_offset_branch_op},
341

    
342
  {"ba",
343
   BA_QUICK_OPCODE,
344
   0x0F00+(0xF-CC_A)*0x1000,                  "o",             1, SIZE_NONE,     0,
345
   cris_eight_bit_offset_branch_op},
346

    
347
  /* Needs to come after the usual "ba o", which might be relaxed to
348
     this one.  */
349
  {"ba",     BA_DWORD_OPCODE,
350
   0xffff & (~BA_DWORD_OPCODE),                  "n",             0, SIZE_FIX_32,
351
   cris_ver_v32p,
352
   cris_none_reg_mode_jump_op},
353

    
354
  {"bas",     0x0EBF, 0x0140,                  "n,P",     0, SIZE_FIX_32,
355
   cris_ver_v32p,
356
   cris_none_reg_mode_jump_op},
357

    
358
  {"basc",     0x0EFF, 0x0100,                  "n,P",     0, SIZE_FIX_32,
359
   cris_ver_v32p,
360
   cris_none_reg_mode_jump_op},
361

    
362
  {"bcc",
363
   BRANCH_QUICK_OPCODE+CC_CC*0x1000,
364
   0x0f00+(0xF-CC_CC)*0x1000,                  "o",             1, SIZE_NONE,     0,
365
   cris_eight_bit_offset_branch_op},
366

    
367
  {"bcs",
368
   BRANCH_QUICK_OPCODE+CC_CS*0x1000,
369
   0x0f00+(0xF-CC_CS)*0x1000,                  "o",             1, SIZE_NONE,     0,
370
   cris_eight_bit_offset_branch_op},
371

    
372
  {"bdap",
373
   BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS,  "pm s,R",  0, SIZE_FIELD_SIGNED,
374
   cris_ver_v0_10,
375
   cris_bdap_prefix},
376

    
377
  {"bdap",
378
   BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS,  "pO",             0, SIZE_NONE,
379
   cris_ver_v0_10,
380
   cris_quick_mode_bdap_prefix},
381

    
382
  {"beq",
383
   BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
384
   0x0f00+(0xF-CC_EQ)*0x1000,                  "o",             1, SIZE_NONE,     0,
385
   cris_eight_bit_offset_branch_op},
386

    
387
  /* This is deliberately put before "bext" to trump it, even though not
388
     in alphabetical order, since we don't do excluding version checks
389
     for v0..v10.  */
390
  {"bwf",
391
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
392
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
393
   cris_ver_v10,
394
   cris_eight_bit_offset_branch_op},
395

    
396
  {"bext",
397
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
398
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
399
   cris_ver_v0_3,
400
   cris_eight_bit_offset_branch_op},
401

    
402
  {"bge",
403
   BRANCH_QUICK_OPCODE+CC_GE*0x1000,
404
   0x0f00+(0xF-CC_GE)*0x1000,                  "o",             1, SIZE_NONE,     0,
405
   cris_eight_bit_offset_branch_op},
406

    
407
  {"bgt",
408
   BRANCH_QUICK_OPCODE+CC_GT*0x1000,
409
   0x0f00+(0xF-CC_GT)*0x1000,                  "o",             1, SIZE_NONE,     0,
410
   cris_eight_bit_offset_branch_op},
411

    
412
  {"bhi",
413
   BRANCH_QUICK_OPCODE+CC_HI*0x1000,
414
   0x0f00+(0xF-CC_HI)*0x1000,                  "o",             1, SIZE_NONE,     0,
415
   cris_eight_bit_offset_branch_op},
416

    
417
  {"bhs",
418
   BRANCH_QUICK_OPCODE+CC_HS*0x1000,
419
   0x0f00+(0xF-CC_HS)*0x1000,                  "o",             1, SIZE_NONE,     0,
420
   cris_eight_bit_offset_branch_op},
421

    
422
  {"biap", BIAP_OPCODE, BIAP_Z_BITS,          "pm r,R",  0, SIZE_NONE,
423
   cris_ver_v0_10,
424
   cris_biap_prefix},
425

    
426
  {"ble",
427
   BRANCH_QUICK_OPCODE+CC_LE*0x1000,
428
   0x0f00+(0xF-CC_LE)*0x1000,                  "o",             1, SIZE_NONE,     0,
429
   cris_eight_bit_offset_branch_op},
430

    
431
  {"blo",
432
   BRANCH_QUICK_OPCODE+CC_LO*0x1000,
433
   0x0f00+(0xF-CC_LO)*0x1000,                  "o",             1, SIZE_NONE,     0,
434
   cris_eight_bit_offset_branch_op},
435

    
436
  {"bls",
437
   BRANCH_QUICK_OPCODE+CC_LS*0x1000,
438
   0x0f00+(0xF-CC_LS)*0x1000,                  "o",             1, SIZE_NONE,     0,
439
   cris_eight_bit_offset_branch_op},
440

    
441
  {"blt",
442
   BRANCH_QUICK_OPCODE+CC_LT*0x1000,
443
   0x0f00+(0xF-CC_LT)*0x1000,                  "o",             1, SIZE_NONE,     0,
444
   cris_eight_bit_offset_branch_op},
445

    
446
  {"bmi",
447
   BRANCH_QUICK_OPCODE+CC_MI*0x1000,
448
   0x0f00+(0xF-CC_MI)*0x1000,                  "o",             1, SIZE_NONE,     0,
449
   cris_eight_bit_offset_branch_op},
450

    
451
  {"bmod",    0x0ab0, 0x0140,                  "s,R",     0, SIZE_FIX_32,
452
   cris_ver_sim_v0_10,
453
   cris_not_implemented_op},
454

    
455
  {"bmod",    0x0ab0, 0x0140,                  "S,D",     0, SIZE_NONE,
456
   cris_ver_sim_v0_10,
457
   cris_not_implemented_op},
458

    
459
  {"bmod",    0x0ab0, 0x0540,                  "S,R,r",   0, SIZE_NONE,
460
   cris_ver_sim_v0_10,
461
   cris_not_implemented_op},
462

    
463
  {"bne",
464
   BRANCH_QUICK_OPCODE+CC_NE*0x1000,
465
   0x0f00+(0xF-CC_NE)*0x1000,                  "o",             1, SIZE_NONE,     0,
466
   cris_eight_bit_offset_branch_op},
467

    
468
  {"bound",   0x05c0, 0x0A00,                  "m r,R",   0, SIZE_NONE,     0,
469
   cris_two_operand_bound_op},
470
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
471
  {"bound",   0x09c0, 0x0200,                  "m s,R",   0, SIZE_FIELD,
472
   cris_ver_v0_10,
473
   cris_two_operand_bound_op},
474
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
475
  {"bound",   0x0dcf, 0x0200,                  "m Y,R",   0, SIZE_FIELD,    0,
476
   cris_two_operand_bound_op},
477
  {"bound",   0x09c0, 0x0200,                  "m S,D",   0, SIZE_NONE,
478
   cris_ver_v0_10,
479
   cris_two_operand_bound_op},
480
  {"bound",   0x09c0, 0x0600,                  "m S,R,r", 0, SIZE_NONE,
481
   cris_ver_v0_10,
482
   cris_three_operand_bound_op},
483

    
484
  {"bpl",
485
   BRANCH_QUICK_OPCODE+CC_PL*0x1000,
486
   0x0f00+(0xF-CC_PL)*0x1000,                  "o",             1, SIZE_NONE,     0,
487
   cris_eight_bit_offset_branch_op},
488

    
489
  {"break",   0xe930, 0x16c0,                  "C",             0, SIZE_NONE,
490
   cris_ver_v3p,
491
   cris_break_op},
492

    
493
  {"bsb",
494
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
495
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
496
   cris_ver_v32p,
497
   cris_eight_bit_offset_branch_op},
498

    
499
  {"bsr",     0xBEBF, 0x4140,                  "n",             0, SIZE_FIX_32,
500
   cris_ver_v32p,
501
   cris_none_reg_mode_jump_op},
502

    
503
  {"bsrc",     0xBEFF, 0x4100,                  "n",             0, SIZE_FIX_32,
504
   cris_ver_v32p,
505
   cris_none_reg_mode_jump_op},
506

    
507
  {"bstore",  0x0af0, 0x0100,                  "s,R",     0, SIZE_FIX_32,
508
   cris_ver_warning,
509
   cris_not_implemented_op},
510

    
511
  {"bstore",  0x0af0, 0x0100,                  "S,D",     0, SIZE_NONE,
512
   cris_ver_warning,
513
   cris_not_implemented_op},
514

    
515
  {"bstore",  0x0af0, 0x0500,                  "S,R,r",   0, SIZE_NONE,
516
   cris_ver_warning,
517
   cris_not_implemented_op},
518

    
519
  {"btst",    0x04F0, 0x0B00,                  "r,R",     0, SIZE_NONE,     0,
520
   cris_btst_nop_op},
521
  {"btstq",   0x0380, 0x0C60,                  "c,R",     0, SIZE_NONE,     0,
522
   cris_btst_nop_op},
523

    
524
  {"bvc",
525
   BRANCH_QUICK_OPCODE+CC_VC*0x1000,
526
   0x0f00+(0xF-CC_VC)*0x1000,                  "o",             1, SIZE_NONE,     0,
527
   cris_eight_bit_offset_branch_op},
528

    
529
  {"bvs",
530
   BRANCH_QUICK_OPCODE+CC_VS*0x1000,
531
   0x0f00+(0xF-CC_VS)*0x1000,                  "o",             1, SIZE_NONE,     0,
532
   cris_eight_bit_offset_branch_op},
533

    
534
  {"clear",   0x0670, 0x3980,                  "M r",     0, SIZE_NONE,     0,
535
   cris_reg_mode_clear_op},
536

    
537
  {"clear",   0x0A70, 0x3180,                  "M y",     0, SIZE_NONE,     0,
538
   cris_none_reg_mode_clear_test_op},
539

    
540
  {"clear",   0x0A70, 0x3180,                  "M S",     0, SIZE_NONE,
541
   cris_ver_v0_10,
542
   cris_none_reg_mode_clear_test_op},
543

    
544
  {"clearf",  0x05F0, 0x0A00,                  "f",             0, SIZE_NONE,     0,
545
   cris_clearf_di_op},
546

    
547
  {"cmp",     0x06C0, 0x0900,                  "m r,R",   0, SIZE_NONE,     0,
548
   cris_reg_mode_add_sub_cmp_and_or_move_op},
549

    
550
  {"cmp",     0x0Ac0, 0x0100,                  "m s,R",   0, SIZE_FIELD,    0,
551
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
552

    
553
  {"cmp",     0x0Ac0, 0x0100,                  "m S,D",   0, SIZE_NONE,
554
   cris_ver_v0_10,
555
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
556

    
557
  {"cmpq",    0x02C0, 0x0D00,                  "i,R",     0, SIZE_NONE,     0,
558
   cris_quick_mode_and_cmp_move_or_op},
559

    
560
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
561
  {"cmps",    0x08e0, 0x0300,                  "z s,R",   0, SIZE_FIELD,    0,
562
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
563

    
564
  {"cmps",    0x08e0, 0x0300,                  "z S,D",   0, SIZE_NONE,
565
   cris_ver_v0_10,
566
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
567

    
568
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
569
  {"cmpu",    0x08c0, 0x0320,                  "z s,R" ,  0, SIZE_FIELD,    0,
570
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
571

    
572
  {"cmpu",    0x08c0, 0x0320,                  "z S,D",   0, SIZE_NONE,
573
   cris_ver_v0_10,
574
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
575

    
576
  {"di",      0x25F0, 0xDA0F,                  "",             0, SIZE_NONE,     0,
577
   cris_clearf_di_op},
578

    
579
  {"dip",     DIP_OPCODE, DIP_Z_BITS,          "ps",             0, SIZE_FIX_32,
580
   cris_ver_v0_10,
581
   cris_dip_prefix},
582

    
583
  {"div",     0x0980, 0x0640,                  "m R,r",   0, SIZE_FIELD,    0,
584
   cris_not_implemented_op},
585

    
586
  {"dstep",   0x06f0, 0x0900,                  "r,R",     0, SIZE_NONE,     0,
587
   cris_dstep_logshift_mstep_neg_not_op},
588

    
589
  {"ei",      0x25B0, 0xDA4F,                  "",             0, SIZE_NONE,     0,
590
   cris_ax_ei_setf_op},
591

    
592
  {"fidxd",    0x0ab0, 0xf540,                  "[r]",     0, SIZE_NONE,
593
   cris_ver_v32p,
594
   cris_not_implemented_op},
595

    
596
  {"fidxi",    0x0d30, 0xF2C0,                  "[r]",     0, SIZE_NONE,
597
   cris_ver_v32p,
598
   cris_not_implemented_op},
599

    
600
  {"ftagd",    0x1AB0, 0xE540,                  "[r]",     0, SIZE_NONE,
601
   cris_ver_v32p,
602
   cris_not_implemented_op},
603

    
604
  {"ftagi",    0x1D30, 0xE2C0,                  "[r]",     0, SIZE_NONE,
605
   cris_ver_v32p,
606
   cris_not_implemented_op},
607

    
608
  {"halt",    0xF930, 0x06CF,                  "",             0, SIZE_NONE,
609
   cris_ver_v32p,
610
   cris_not_implemented_op},
611

    
612
  {"jas",    0x09B0, 0x0640,                  "r,P",     0, SIZE_NONE,
613
   cris_ver_v32p,
614
   cris_reg_mode_jump_op},
615

    
616
  {"jas",    0x0DBF, 0x0240,                  "N,P",     0, SIZE_FIX_32,
617
   cris_ver_v32p,
618
   cris_reg_mode_jump_op},
619

    
620
  {"jasc",    0x0B30, 0x04C0,                  "r,P",     0, SIZE_NONE,
621
   cris_ver_v32p,
622
   cris_reg_mode_jump_op},
623

    
624
  {"jasc",    0x0F3F, 0x00C0,                  "N,P",     0, SIZE_FIX_32,
625
   cris_ver_v32p,
626
   cris_reg_mode_jump_op},
627

    
628
  {"jbrc",    0x69b0, 0x9640,                  "r",             0, SIZE_NONE,
629
   cris_ver_v8_10,
630
   cris_reg_mode_jump_op},
631

    
632
  {"jbrc",    0x6930, 0x92c0,                  "s",             0, SIZE_FIX_32,
633
   cris_ver_v8_10,
634
   cris_none_reg_mode_jump_op},
635

    
636
  {"jbrc",    0x6930, 0x92c0,                  "S",             0, SIZE_NONE,
637
   cris_ver_v8_10,
638
   cris_none_reg_mode_jump_op},
639

    
640
  {"jir",     0xA9b0, 0x5640,                  "r",             0, SIZE_NONE,
641
   cris_ver_v8_10,
642
   cris_reg_mode_jump_op},
643

    
644
  {"jir",     0xA930, 0x52c0,                  "s",             0, SIZE_FIX_32,
645
   cris_ver_v8_10,
646
   cris_none_reg_mode_jump_op},
647

    
648
  {"jir",     0xA930, 0x52c0,                  "S",             0, SIZE_NONE,
649
   cris_ver_v8_10,
650
   cris_none_reg_mode_jump_op},
651

    
652
  {"jirc",    0x29b0, 0xd640,                  "r",             0, SIZE_NONE,
653
   cris_ver_v8_10,
654
   cris_reg_mode_jump_op},
655

    
656
  {"jirc",    0x2930, 0xd2c0,                  "s",             0, SIZE_FIX_32,
657
   cris_ver_v8_10,
658
   cris_none_reg_mode_jump_op},
659

    
660
  {"jirc",    0x2930, 0xd2c0,                  "S",             0, SIZE_NONE,
661
   cris_ver_v8_10,
662
   cris_none_reg_mode_jump_op},
663

    
664
  {"jsr",     0xB9b0, 0x4640,                  "r",             0, SIZE_NONE,     0,
665
   cris_reg_mode_jump_op},
666

    
667
  {"jsr",     0xB930, 0x42c0,                  "s",             0, SIZE_FIX_32,
668
   cris_ver_v0_10,
669
   cris_none_reg_mode_jump_op},
670

    
671
  {"jsr",     0xBDBF, 0x4240,                  "N",             0, SIZE_FIX_32,
672
   cris_ver_v32p,
673
   cris_none_reg_mode_jump_op},
674

    
675
  {"jsr",     0xB930, 0x42c0,                  "S",             0, SIZE_NONE,
676
   cris_ver_v0_10,
677
   cris_none_reg_mode_jump_op},
678

    
679
  {"jsrc",    0x39b0, 0xc640,                  "r",             0, SIZE_NONE,
680
   cris_ver_v8_10,
681
   cris_reg_mode_jump_op},
682

    
683
  {"jsrc",    0x3930, 0xc2c0,                  "s",             0, SIZE_FIX_32,
684
   cris_ver_v8_10,
685
   cris_none_reg_mode_jump_op},
686

    
687
  {"jsrc",    0x3930, 0xc2c0,                  "S",             0, SIZE_NONE,
688
   cris_ver_v8_10,
689
   cris_none_reg_mode_jump_op},
690

    
691
  {"jsrc",    0xBB30, 0x44C0,                  "r",       0, SIZE_NONE,
692
   cris_ver_v32p,
693
   cris_reg_mode_jump_op},
694

    
695
  {"jsrc",    0xBF3F, 0x40C0,                  "N",             0, SIZE_FIX_32,
696
   cris_ver_v32p,
697
   cris_reg_mode_jump_op},
698

    
699
  {"jump",    0x09b0, 0xF640,                  "r",             0, SIZE_NONE,     0,
700
   cris_reg_mode_jump_op},
701

    
702
  {"jump",
703
   JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "s",             0, SIZE_FIX_32,
704
   cris_ver_v0_10,
705
   cris_none_reg_mode_jump_op},
706

    
707
  {"jump",
708
   JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "S",             0, SIZE_NONE,
709
   cris_ver_v0_10,
710
   cris_none_reg_mode_jump_op},
711

    
712
  {"jump",    0x09F0, 0x060F,                  "P",             0, SIZE_NONE,
713
   cris_ver_v32p,
714
   cris_none_reg_mode_jump_op},
715

    
716
  {"jump",
717
   JUMP_PC_INCR_OPCODE_V32,
718
   (0xffff & ~JUMP_PC_INCR_OPCODE_V32),          "N",             0, SIZE_FIX_32,
719
   cris_ver_v32p,
720
   cris_none_reg_mode_jump_op},
721

    
722
  {"jmpu",    0x8930, 0x72c0,                  "s",             0, SIZE_FIX_32,
723
   cris_ver_v10,
724
   cris_none_reg_mode_jump_op},
725

    
726
  {"jmpu",    0x8930, 0x72c0,                   "S",             0, SIZE_NONE,
727
   cris_ver_v10,
728
   cris_none_reg_mode_jump_op},
729

    
730
  {"lapc",    0x0970, 0x0680,                  "U,R",    0, SIZE_NONE,
731
   cris_ver_v32p,
732
   cris_not_implemented_op},
733

    
734
  {"lapc",    0x0D7F, 0x0280,                  "dn,R",    0, SIZE_FIX_32,
735
   cris_ver_v32p,
736
   cris_not_implemented_op},
737

    
738
  {"lapcq",   0x0970, 0x0680,                  "u,R",     0, SIZE_NONE,
739
   cris_ver_v32p,
740
   cris_addi_op},
741

    
742
  {"lsl",     0x04C0, 0x0B00,                  "m r,R",   0, SIZE_NONE,     0,
743
   cris_dstep_logshift_mstep_neg_not_op},
744

    
745
  {"lslq",    0x03c0, 0x0C20,                  "c,R",     0, SIZE_NONE,     0,
746
   cris_dstep_logshift_mstep_neg_not_op},
747

    
748
  {"lsr",     0x07C0, 0x0800,                  "m r,R",   0, SIZE_NONE,     0,
749
   cris_dstep_logshift_mstep_neg_not_op},
750

    
751
  {"lsrq",    0x03e0, 0x0C00,                  "c,R",     0, SIZE_NONE,     0,
752
   cris_dstep_logshift_mstep_neg_not_op},
753

    
754
  {"lz",      0x0730, 0x08C0,                  "r,R",     0, SIZE_NONE,
755
   cris_ver_v3p,
756
   cris_not_implemented_op},
757

    
758
  {"mcp",      0x07f0, 0x0800,                  "P,r",     0, SIZE_NONE,
759
   cris_ver_v32p,
760
   cris_not_implemented_op},
761

    
762
  {"move",    0x0640, 0x0980,                  "m r,R",   0, SIZE_NONE,     0,
763
   cris_reg_mode_add_sub_cmp_and_or_move_op},
764

    
765
  {"move",    0x0A40, 0x0180,                  "m s,R",   0, SIZE_FIELD,    0,
766
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
767

    
768
  {"move",    0x0A40, 0x0180,                  "m S,D",   0, SIZE_NONE,
769
   cris_ver_v0_10,
770
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
771

    
772
  {"move",    0x0630, 0x09c0,                  "r,P",     0, SIZE_NONE,     0,
773
   cris_move_to_preg_op},
774

    
775
  {"move",    0x0670, 0x0980,                  "P,r",     0, SIZE_NONE,     0,
776
   cris_reg_mode_move_from_preg_op},
777

    
778
  {"move",    0x0BC0, 0x0000,                  "m R,y",   0, SIZE_FIELD,    0,
779
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
780

    
781
  {"move",    0x0BC0, 0x0000,                  "m D,S",   0, SIZE_NONE,
782
   cris_ver_v0_10,
783
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
784

    
785
  {"move",
786
   MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
787
   "s,P",   0, SIZE_SPEC_REG, 0,
788
   cris_move_to_preg_op},
789

    
790
  {"move",    0x0A30, 0x01c0,                  "S,P",     0, SIZE_NONE,
791
   cris_ver_v0_10,
792
   cris_move_to_preg_op},
793

    
794
  {"move",    0x0A70, 0x0180,                  "P,y",     0, SIZE_SPEC_REG, 0,
795
   cris_none_reg_mode_move_from_preg_op},
796

    
797
  {"move",    0x0A70, 0x0180,                  "P,S",     0, SIZE_NONE,
798
   cris_ver_v0_10,
799
   cris_none_reg_mode_move_from_preg_op},
800

    
801
  {"move",    0x0B70, 0x0480,                  "r,T",     0, SIZE_NONE,
802
   cris_ver_v32p,
803
   cris_not_implemented_op},
804

    
805
  {"move",    0x0F70, 0x0080,                  "T,r",     0, SIZE_NONE,
806
   cris_ver_v32p,
807
   cris_not_implemented_op},
808

    
809
  {"movem",   0x0BF0, 0x0000,                  "R,y",     0, SIZE_FIX_32,   0,
810
   cris_move_reg_to_mem_movem_op},
811

    
812
  {"movem",   0x0BF0, 0x0000,                  "D,S",     0, SIZE_NONE,
813
   cris_ver_v0_10,
814
   cris_move_reg_to_mem_movem_op},
815

    
816
  {"movem",   0x0BB0, 0x0040,                  "s,R",     0, SIZE_FIX_32,   0,
817
   cris_move_mem_to_reg_movem_op},
818

    
819
  {"movem",   0x0BB0, 0x0040,                  "S,D",     0, SIZE_NONE,
820
   cris_ver_v0_10,
821
   cris_move_mem_to_reg_movem_op},
822

    
823
  {"moveq",   0x0240, 0x0D80,                  "i,R",     0, SIZE_NONE,     0,
824
   cris_quick_mode_and_cmp_move_or_op},
825

    
826
  {"movs",    0x0460, 0x0B80,                  "z r,R",   0, SIZE_NONE,     0,
827
   cris_reg_mode_add_sub_cmp_and_or_move_op},
828

    
829
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
830
  {"movs",    0x0860, 0x0380,                  "z s,R",   0, SIZE_FIELD,    0,
831
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
832

    
833
  {"movs",    0x0860, 0x0380,                  "z S,D",   0, SIZE_NONE,
834
   cris_ver_v0_10,
835
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
836

    
837
  {"movu",    0x0440, 0x0Ba0,                  "z r,R",   0, SIZE_NONE,     0,
838
   cris_reg_mode_add_sub_cmp_and_or_move_op},
839

    
840
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
841
  {"movu",    0x0840, 0x03a0,                  "z s,R",   0, SIZE_FIELD,    0,
842
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
843

    
844
  {"movu",    0x0840, 0x03a0,                  "z S,D",   0, SIZE_NONE,
845
   cris_ver_v0_10,
846
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
847

    
848
  {"mstep",   0x07f0, 0x0800,                  "r,R",     0, SIZE_NONE,
849
   cris_ver_v0_10,
850
   cris_dstep_logshift_mstep_neg_not_op},
851

    
852
  {"muls",    0x0d00, 0x02c0,                  "m r,R",   0, SIZE_NONE,
853
   cris_ver_v10p,
854
   cris_muls_op},
855

    
856
  {"mulu",    0x0900, 0x06c0,                  "m r,R",   0, SIZE_NONE,
857
   cris_ver_v10p,
858
   cris_mulu_op},
859

    
860
  {"neg",     0x0580, 0x0A40,                  "m r,R",   0, SIZE_NONE,     0,
861
   cris_dstep_logshift_mstep_neg_not_op},
862

    
863
  {"nop",     NOP_OPCODE, NOP_Z_BITS,          "",             0, SIZE_NONE,
864
   cris_ver_v0_10,
865
   cris_btst_nop_op},
866

    
867
  {"nop",     NOP_OPCODE_V32, NOP_Z_BITS_V32, "",    0, SIZE_NONE,
868
   cris_ver_v32p,
869
   cris_btst_nop_op},
870

    
871
  {"not",     0x8770, 0x7880,                  "r",             0, SIZE_NONE,     0,
872
   cris_dstep_logshift_mstep_neg_not_op},
873

    
874
  {"or",      0x0740, 0x0880,                  "m r,R",   0, SIZE_NONE,     0,
875
   cris_reg_mode_add_sub_cmp_and_or_move_op},
876

    
877
  {"or",      0x0B40, 0x0080,                  "m s,R",   0, SIZE_FIELD,    0,
878
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
879

    
880
  {"or",      0x0B40, 0x0080,                  "m S,D",   0, SIZE_NONE,
881
   cris_ver_v0_10,
882
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
883

    
884
  {"or",      0x0B40, 0x0480,                  "m S,R,r", 0, SIZE_NONE,
885
   cris_ver_v0_10,
886
   cris_three_operand_add_sub_cmp_and_or_op},
887

    
888
  {"orq",     0x0340, 0x0C80,                  "i,R",     0, SIZE_NONE,     0,
889
   cris_quick_mode_and_cmp_move_or_op},
890

    
891
  {"pop",     0x0E6E, 0x0191,                  "!R",             0, SIZE_NONE,
892
   cris_ver_v0_10,
893
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
894

    
895
  {"pop",     0x0e3e, 0x01c1,                  "!P",             0, SIZE_NONE,
896
   cris_ver_v0_10,
897
   cris_none_reg_mode_move_from_preg_op},
898

    
899
  {"push",    0x0FEE, 0x0011,                  "BR",             0, SIZE_NONE,
900
   cris_ver_v0_10,
901
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
902

    
903
  {"push",    0x0E7E, 0x0181,                  "BP",             0, SIZE_NONE,
904
   cris_ver_v0_10,
905
   cris_move_to_preg_op},
906

    
907
  {"rbf",     0x3b30, 0xc0c0,                  "y",             0, SIZE_NONE,
908
   cris_ver_v10,
909
   cris_not_implemented_op},
910

    
911
  {"rbf",     0x3b30, 0xc0c0,                  "S",             0, SIZE_NONE,
912
   cris_ver_v10,
913
   cris_not_implemented_op},
914

    
915
  {"rfe",     0x2930, 0xD6CF,                  "",             0, SIZE_NONE,
916
   cris_ver_v32p,
917
   cris_not_implemented_op},
918

    
919
  {"rfg",     0x4930, 0xB6CF,                  "",             0, SIZE_NONE,
920
   cris_ver_v32p,
921
   cris_not_implemented_op},
922

    
923
  {"rfn",     0x5930, 0xA6CF,                  "",             0, SIZE_NONE,
924
   cris_ver_v32p,
925
   cris_not_implemented_op},
926

    
927
  {"ret",     0xB67F, 0x4980,                  "",             1, SIZE_NONE,
928
   cris_ver_v0_10,
929
   cris_reg_mode_move_from_preg_op},
930

    
931
  {"ret",     0xB9F0, 0x460F,                  "",             1, SIZE_NONE,
932
   cris_ver_v32p,
933
   cris_reg_mode_move_from_preg_op},
934

    
935
  {"retb",    0xe67f, 0x1980,                  "",             1, SIZE_NONE,
936
   cris_ver_v0_10,
937
   cris_reg_mode_move_from_preg_op},
938

    
939
  {"rete",     0xA9F0, 0x560F,                  "",             1, SIZE_NONE,
940
   cris_ver_v32p,
941
   cris_reg_mode_move_from_preg_op},
942

    
943
  {"reti",    0xA67F, 0x5980,                  "",             1, SIZE_NONE,
944
   cris_ver_v0_10,
945
   cris_reg_mode_move_from_preg_op},
946

    
947
  {"retn",     0xC9F0, 0x360F,                  "",             1, SIZE_NONE,
948
   cris_ver_v32p,
949
   cris_reg_mode_move_from_preg_op},
950

    
951
  {"sbfs",    0x3b70, 0xc080,                  "y",             0, SIZE_NONE,
952
   cris_ver_v10,
953
   cris_not_implemented_op},
954

    
955
  {"sbfs",    0x3b70, 0xc080,                  "S",             0, SIZE_NONE,
956
   cris_ver_v10,
957
   cris_not_implemented_op},
958

    
959
  {"sa",
960
   0x0530+CC_A*0x1000,
961
   0x0AC0+(0xf-CC_A)*0x1000,                  "r",             0, SIZE_NONE,     0,
962
   cris_scc_op},
963

    
964
  {"ssb",
965
   0x0530+CC_EXT*0x1000,
966
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
967
   cris_ver_v32p,
968
   cris_scc_op},
969

    
970
  {"scc",
971
   0x0530+CC_CC*0x1000,
972
   0x0AC0+(0xf-CC_CC)*0x1000,                  "r",             0, SIZE_NONE,     0,
973
   cris_scc_op},
974

    
975
  {"scs",
976
   0x0530+CC_CS*0x1000,
977
   0x0AC0+(0xf-CC_CS)*0x1000,                  "r",             0, SIZE_NONE,     0,
978
   cris_scc_op},
979

    
980
  {"seq",
981
   0x0530+CC_EQ*0x1000,
982
   0x0AC0+(0xf-CC_EQ)*0x1000,                  "r",             0, SIZE_NONE,     0,
983
   cris_scc_op},
984

    
985
  {"setf",    0x05b0, 0x0A40,                  "f",             0, SIZE_NONE,     0,
986
   cris_ax_ei_setf_op},
987

    
988
  {"sfe",    0x3930, 0xC6CF,                  "",             0, SIZE_NONE,
989
   cris_ver_v32p,
990
   cris_not_implemented_op},
991

    
992
  /* Need to have "swf" in front of "sext" so it is the one displayed in
993
     disassembly.  */
994
  {"swf",
995
   0x0530+CC_EXT*0x1000,
996
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
997
   cris_ver_v10,
998
   cris_scc_op},
999

    
1000
  {"sext",
1001
   0x0530+CC_EXT*0x1000,
1002
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
1003
   cris_ver_v0_3,
1004
   cris_scc_op},
1005

    
1006
  {"sge",
1007
   0x0530+CC_GE*0x1000,
1008
   0x0AC0+(0xf-CC_GE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1009
   cris_scc_op},
1010

    
1011
  {"sgt",
1012
   0x0530+CC_GT*0x1000,
1013
   0x0AC0+(0xf-CC_GT)*0x1000,                  "r",             0, SIZE_NONE,     0,
1014
   cris_scc_op},
1015

    
1016
  {"shi",
1017
   0x0530+CC_HI*0x1000,
1018
   0x0AC0+(0xf-CC_HI)*0x1000,                  "r",             0, SIZE_NONE,     0,
1019
   cris_scc_op},
1020

    
1021
  {"shs",
1022
   0x0530+CC_HS*0x1000,
1023
   0x0AC0+(0xf-CC_HS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1024
   cris_scc_op},
1025

    
1026
  {"sle",
1027
   0x0530+CC_LE*0x1000,
1028
   0x0AC0+(0xf-CC_LE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1029
   cris_scc_op},
1030

    
1031
  {"slo",
1032
   0x0530+CC_LO*0x1000,
1033
   0x0AC0+(0xf-CC_LO)*0x1000,                  "r",             0, SIZE_NONE,     0,
1034
   cris_scc_op},
1035

    
1036
  {"sls",
1037
   0x0530+CC_LS*0x1000,
1038
   0x0AC0+(0xf-CC_LS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1039
   cris_scc_op},
1040

    
1041
  {"slt",
1042
   0x0530+CC_LT*0x1000,
1043
   0x0AC0+(0xf-CC_LT)*0x1000,                  "r",             0, SIZE_NONE,     0,
1044
   cris_scc_op},
1045

    
1046
  {"smi",
1047
   0x0530+CC_MI*0x1000,
1048
   0x0AC0+(0xf-CC_MI)*0x1000,                  "r",             0, SIZE_NONE,     0,
1049
   cris_scc_op},
1050

    
1051
  {"sne",
1052
   0x0530+CC_NE*0x1000,
1053
   0x0AC0+(0xf-CC_NE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1054
   cris_scc_op},
1055

    
1056
  {"spl",
1057
   0x0530+CC_PL*0x1000,
1058
   0x0AC0+(0xf-CC_PL)*0x1000,                  "r",             0, SIZE_NONE,     0,
1059
   cris_scc_op},
1060

    
1061
  {"sub",     0x0680, 0x0940,                  "m r,R",   0, SIZE_NONE,     0,
1062
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1063

    
1064
  {"sub",     0x0a80, 0x0140,                  "m s,R",   0, SIZE_FIELD,    0,
1065
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1066

    
1067
  {"sub",     0x0a80, 0x0140,                  "m S,D",   0, SIZE_NONE,
1068
   cris_ver_v0_10,
1069
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1070

    
1071
  {"sub",     0x0a80, 0x0540,                  "m S,R,r", 0, SIZE_NONE,
1072
   cris_ver_v0_10,
1073
   cris_three_operand_add_sub_cmp_and_or_op},
1074

    
1075
  {"subq",    0x0280, 0x0d40,                  "I,R",     0, SIZE_NONE,     0,
1076
   cris_quick_mode_add_sub_op},
1077

    
1078
  {"subs",    0x04a0, 0x0b40,                  "z r,R",   0, SIZE_NONE,     0,
1079
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1080

    
1081
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
1082
  {"subs",    0x08a0, 0x0340,                  "z s,R",   0, SIZE_FIELD,    0,
1083
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1084

    
1085
  {"subs",    0x08a0, 0x0340,                  "z S,D",   0, SIZE_NONE,
1086
   cris_ver_v0_10,
1087
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1088

    
1089
  {"subs",    0x08a0, 0x0740,                  "z S,R,r", 0, SIZE_NONE,
1090
   cris_ver_v0_10,
1091
   cris_three_operand_add_sub_cmp_and_or_op},
1092

    
1093
  {"subu",    0x0480, 0x0b60,                  "z r,R",   0, SIZE_NONE,     0,
1094
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1095

    
1096
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
1097
  {"subu",    0x0880, 0x0360,                  "z s,R",   0, SIZE_FIELD,    0,
1098
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1099

    
1100
  {"subu",    0x0880, 0x0360,                  "z S,D",   0, SIZE_NONE,
1101
   cris_ver_v0_10,
1102
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1103

    
1104
  {"subu",    0x0880, 0x0760,                  "z S,R,r", 0, SIZE_NONE,
1105
   cris_ver_v0_10,
1106
   cris_three_operand_add_sub_cmp_and_or_op},
1107

    
1108
  {"svc",
1109
   0x0530+CC_VC*0x1000,
1110
   0x0AC0+(0xf-CC_VC)*0x1000,                  "r",             0, SIZE_NONE,     0,
1111
   cris_scc_op},
1112

    
1113
  {"svs",
1114
   0x0530+CC_VS*0x1000,
1115
   0x0AC0+(0xf-CC_VS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1116
   cris_scc_op},
1117

    
1118
  /* The insn "swapn" is the same as "not" and will be disassembled as
1119
     such, but the swap* family of mnmonics are generally v8-and-higher
1120
     only, so count it in.  */
1121
  {"swapn",   0x8770, 0x7880,                  "r",             0, SIZE_NONE,
1122
   cris_ver_v8p,
1123
   cris_not_implemented_op},
1124

    
1125
  {"swapw",   0x4770, 0xb880,                  "r",             0, SIZE_NONE,
1126
   cris_ver_v8p,
1127
   cris_not_implemented_op},
1128

    
1129
  {"swapnw",  0xc770, 0x3880,                  "r",             0, SIZE_NONE,
1130
   cris_ver_v8p,
1131
   cris_not_implemented_op},
1132

    
1133
  {"swapb",   0x2770, 0xd880,                  "r",             0, SIZE_NONE,
1134
   cris_ver_v8p,
1135
   cris_not_implemented_op},
1136

    
1137
  {"swapnb",  0xA770, 0x5880,                  "r",             0, SIZE_NONE,
1138
   cris_ver_v8p,
1139
   cris_not_implemented_op},
1140

    
1141
  {"swapwb",  0x6770, 0x9880,                  "r",             0, SIZE_NONE,
1142
   cris_ver_v8p,
1143
   cris_not_implemented_op},
1144

    
1145
  {"swapnwb", 0xE770, 0x1880,                  "r",             0, SIZE_NONE,
1146
   cris_ver_v8p,
1147
   cris_not_implemented_op},
1148

    
1149
  {"swapr",   0x1770, 0xe880,                  "r",             0, SIZE_NONE,
1150
   cris_ver_v8p,
1151
   cris_not_implemented_op},
1152

    
1153
  {"swapnr",  0x9770, 0x6880,                  "r",             0, SIZE_NONE,
1154
   cris_ver_v8p,
1155
   cris_not_implemented_op},
1156

    
1157
  {"swapwr",  0x5770, 0xa880,                  "r",             0, SIZE_NONE,
1158
   cris_ver_v8p,
1159
   cris_not_implemented_op},
1160

    
1161
  {"swapnwr", 0xd770, 0x2880,                  "r",             0, SIZE_NONE,
1162
   cris_ver_v8p,
1163
   cris_not_implemented_op},
1164

    
1165
  {"swapbr",  0x3770, 0xc880,                  "r",             0, SIZE_NONE,
1166
   cris_ver_v8p,
1167
   cris_not_implemented_op},
1168

    
1169
  {"swapnbr", 0xb770, 0x4880,                  "r",             0, SIZE_NONE,
1170
   cris_ver_v8p,
1171
   cris_not_implemented_op},
1172

    
1173
  {"swapwbr", 0x7770, 0x8880,                  "r",             0, SIZE_NONE,
1174
   cris_ver_v8p,
1175
   cris_not_implemented_op},
1176

    
1177
  {"swapnwbr", 0xf770, 0x0880,                  "r",             0, SIZE_NONE,
1178
   cris_ver_v8p,
1179
   cris_not_implemented_op},
1180

    
1181
  {"test",    0x0640, 0x0980,                  "m D",     0, SIZE_NONE,
1182
   cris_ver_v0_10,
1183
   cris_reg_mode_test_op},
1184

    
1185
  {"test",    0x0b80, 0xf040,                  "m y",     0, SIZE_FIELD,    0,
1186
   cris_none_reg_mode_clear_test_op},
1187

    
1188
  {"test",    0x0b80, 0xf040,                  "m S",     0, SIZE_NONE,
1189
   cris_ver_v0_10,
1190
   cris_none_reg_mode_clear_test_op},
1191

    
1192
  {"xor",     0x07B0, 0x0840,                  "r,R",     0, SIZE_NONE,     0,
1193
   cris_xor_op},
1194

    
1195
  {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1196
};
1197

    
1198
/* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1199
const char * const
1200
cris_cc_strings[] =
1201
{
1202
  "hs",
1203
  "lo",
1204
  "ne",
1205
  "eq",
1206
  "vc",
1207
  "vs",
1208
  "pl",
1209
  "mi",
1210
  "ls",
1211
  "hi",
1212
  "ge",
1213
  "lt",
1214
  "gt",
1215
  "le",
1216
  "a",
1217
  /* This is a placeholder.  In v0, this would be "ext".  In v32, this
1218
     is "sb".  See cris_conds15.  */
1219
  "wf"
1220
};
1221

    
1222
/* Different names and semantics for condition 1111 (0xf).  */
1223
const struct cris_cond15 cris_cond15s[] =
1224
{
1225
  /* FIXME: In what version did condition "ext" disappear?  */
1226
  {"ext", cris_ver_v0_3},
1227
  {"wf", cris_ver_v10},
1228
  {"sb", cris_ver_v32p},
1229
  {NULL, 0}
1230
};
1231

    
1232

    
1233
/*
1234
 * Local variables:
1235
 * eval: (c-set-style "gnu")
1236
 * indent-tabs-mode: t
1237
 * End:
1238
 */
1239

    
1240

    
1241
/* No instruction will be disassembled longer than this.  In theory, and
1242
   in silicon, address prefixes can be cascaded.  In practice, cascading
1243
   is not used by GCC, and not supported by the assembler.  */
1244
#ifndef MAX_BYTES_PER_CRIS_INSN
1245
#define MAX_BYTES_PER_CRIS_INSN 8
1246
#endif
1247

    
1248
/* Whether or not to decode prefixes, folding it into the following
1249
   instruction.  FIXME: Make this optional later.  */
1250
#ifndef PARSE_PREFIX
1251
#define PARSE_PREFIX 1
1252
#endif
1253

    
1254
/* Sometimes we prefix all registers with this character.  */
1255
#define REGISTER_PREFIX_CHAR '$'
1256

    
1257
/* Whether or not to trace the following sequence:
1258
   sub* X,r%d
1259
   bound* Y,r%d
1260
   adds.w [pc+r%d.w],pc
1261

1262
   This is the assembly form of a switch-statement in C.
1263
   The "sub is optional.  If there is none, then X will be zero.
1264
   X is the value of the first case,
1265
   Y is the number of cases (including default).
1266

1267
   This results in case offsets printed on the form:
1268
    case N: -> case_address
1269
   where N is an estimation on the corresponding 'case' operand in C,
1270
   and case_address is where execution of that case continues after the
1271
   sequence presented above.
1272

1273
   The old style of output was to print the offsets as instructions,
1274
   which made it hard to follow "case"-constructs in the disassembly,
1275
   and caused a lot of annoying warnings about undefined instructions.
1276

1277
   FIXME: Make this optional later.  */
1278
#ifndef TRACE_CASE
1279
#define TRACE_CASE (disdata->trace_case)
1280
#endif
1281

    
1282
enum cris_disass_family
1283
 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
1284

    
1285
/* Stored in the disasm_info->private_data member.  */
1286
struct cris_disasm_data
1287
{
1288
  /* Whether to print something less confusing if we find something
1289
     matching a switch-construct.  */
1290
  bfd_boolean trace_case;
1291

    
1292
  /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
1293
     that includes "compatible".  */
1294
  enum cris_disass_family distype;
1295
};
1296

    
1297
/* Value of first element in switch.  */
1298
static long case_offset = 0;
1299

    
1300
/* How many more case-offsets to print.  */
1301
static long case_offset_counter = 0;
1302

    
1303
/* Number of case offsets.  */
1304
static long no_of_case_offsets = 0;
1305

    
1306
/* Candidate for next case_offset.  */
1307
static long last_immediate = 0;
1308

    
1309
static int cris_constraint
1310
  (const char *, unsigned, unsigned, struct cris_disasm_data *);
1311

    
1312
/* Parse disassembler options and store state in info.  FIXME: For the
1313
   time being, we abuse static variables.  */
1314

    
1315
static bfd_boolean
1316
cris_parse_disassembler_options (disassemble_info *info,
1317
                                 enum cris_disass_family distype)
1318
{
1319
  struct cris_disasm_data *disdata;
1320

    
1321
  info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1322
  disdata = (struct cris_disasm_data *) info->private_data;
1323
  if (disdata == NULL)
1324
    return FALSE;
1325

    
1326
  /* Default true.  */
1327
  disdata->trace_case
1328
    = (info->disassembler_options == NULL
1329
       || (strcmp (info->disassembler_options, "nocase") != 0));
1330

    
1331
  disdata->distype = distype;
1332
  return TRUE;
1333
}
1334

    
1335
static const struct cris_spec_reg *
1336
spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1337
{
1338
  int i;
1339

    
1340
  for (i = 0; cris_spec_regs[i].name != NULL; i++)
1341
    {
1342
      if (cris_spec_regs[i].number == sreg)
1343
        {
1344
          if (distype == cris_dis_v32)
1345
            switch (cris_spec_regs[i].applicable_version)
1346
              {
1347
              case cris_ver_warning:
1348
              case cris_ver_version_all:
1349
              case cris_ver_v3p:
1350
              case cris_ver_v8p:
1351
              case cris_ver_v10p:
1352
              case cris_ver_v32p:
1353
                /* No ambiguous sizes or register names with CRISv32.  */
1354
                if (cris_spec_regs[i].warning == NULL)
1355
                  return &cris_spec_regs[i];
1356
              default:
1357
                ;
1358
              }
1359
          else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1360
            return &cris_spec_regs[i];
1361
        }
1362
    }
1363

    
1364
  return NULL;
1365
}
1366

    
1367
/* Return the number of bits in the argument.  */
1368

    
1369
static int
1370
number_of_bits (unsigned int val)
1371
{
1372
  int bits;
1373

    
1374
  for (bits = 0; val != 0; val &= val - 1)
1375
    bits++;
1376

    
1377
  return bits;
1378
}
1379

    
1380
/* Get an entry in the opcode-table.  */
1381

    
1382
static const struct cris_opcode *
1383
get_opcode_entry (unsigned int insn,
1384
                  unsigned int prefix_insn,
1385
                  struct cris_disasm_data *disdata)
1386
{
1387
  /* For non-prefixed insns, we keep a table of pointers, indexed by the
1388
     insn code.  Each entry is initialized when found to be NULL.  */
1389
  static const struct cris_opcode **opc_table = NULL;
1390

    
1391
  const struct cris_opcode *max_matchedp = NULL;
1392
  const struct cris_opcode **prefix_opc_table = NULL;
1393

    
1394
  /* We hold a table for each prefix that need to be handled differently.  */
1395
  static const struct cris_opcode **dip_prefixes = NULL;
1396
  static const struct cris_opcode **bdapq_m1_prefixes = NULL;
1397
  static const struct cris_opcode **bdapq_m2_prefixes = NULL;
1398
  static const struct cris_opcode **bdapq_m4_prefixes = NULL;
1399
  static const struct cris_opcode **rest_prefixes = NULL;
1400

    
1401
  /* Allocate and clear the opcode-table.  */
1402
  if (opc_table == NULL)
1403
    {
1404
      opc_table = malloc (65536 * sizeof (opc_table[0]));
1405
      if (opc_table == NULL)
1406
        return NULL;
1407

    
1408
      memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
1409

    
1410
      dip_prefixes
1411
        = malloc (65536 * sizeof (const struct cris_opcode **));
1412
      if (dip_prefixes == NULL)
1413
        return NULL;
1414

    
1415
      memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
1416

    
1417
      bdapq_m1_prefixes
1418
        = malloc (65536 * sizeof (const struct cris_opcode **));
1419
      if (bdapq_m1_prefixes == NULL)
1420
        return NULL;
1421

    
1422
      memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
1423

    
1424
      bdapq_m2_prefixes
1425
        = malloc (65536 * sizeof (const struct cris_opcode **));
1426
      if (bdapq_m2_prefixes == NULL)
1427
        return NULL;
1428

    
1429
      memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
1430

    
1431
      bdapq_m4_prefixes
1432
        = malloc (65536 * sizeof (const struct cris_opcode **));
1433
      if (bdapq_m4_prefixes == NULL)
1434
        return NULL;
1435

    
1436
      memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
1437

    
1438
      rest_prefixes
1439
        = malloc (65536 * sizeof (const struct cris_opcode **));
1440
      if (rest_prefixes == NULL)
1441
        return NULL;
1442

    
1443
      memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
1444
    }
1445

    
1446
  /* Get the right table if this is a prefix.
1447
     This code is connected to cris_constraints in that it knows what
1448
     prefixes play a role in recognition of patterns; the necessary
1449
     state is reflected by which table is used.  If constraints
1450
     involving match or non-match of prefix insns are changed, then this
1451
     probably needs changing too.  */
1452
  if (prefix_insn != NO_CRIS_PREFIX)
1453
    {
1454
      const struct cris_opcode *popcodep
1455
        = (opc_table[prefix_insn] != NULL
1456
           ? opc_table[prefix_insn]
1457
           : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
1458

    
1459
      if (popcodep == NULL)
1460
        return NULL;
1461

    
1462
      if (popcodep->match == BDAP_QUICK_OPCODE)
1463
        {
1464
          /* Since some offsets are recognized with "push" macros, we
1465
             have to have different tables for them.  */
1466
          int offset = (prefix_insn & 255);
1467

    
1468
          if (offset > 127)
1469
            offset -= 256;
1470

    
1471
          switch (offset)
1472
            {
1473
            case -4:
1474
              prefix_opc_table = bdapq_m4_prefixes;
1475
              break;
1476

    
1477
            case -2:
1478
              prefix_opc_table = bdapq_m2_prefixes;
1479
              break;
1480

    
1481
            case -1:
1482
              prefix_opc_table = bdapq_m1_prefixes;
1483
              break;
1484

    
1485
            default:
1486
              prefix_opc_table = rest_prefixes;
1487
              break;
1488
            }
1489
        }
1490
      else if (popcodep->match == DIP_OPCODE)
1491
        /* We don't allow postincrement when the prefix is DIP, so use a
1492
           different table for DIP.  */
1493
        prefix_opc_table = dip_prefixes;
1494
      else
1495
        prefix_opc_table = rest_prefixes;
1496
    }
1497

    
1498
  if (prefix_insn != NO_CRIS_PREFIX
1499
      && prefix_opc_table[insn] != NULL)
1500
    max_matchedp = prefix_opc_table[insn];
1501
  else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
1502
    max_matchedp = opc_table[insn];
1503
  else
1504
    {
1505
      const struct cris_opcode *opcodep;
1506
      int max_level_of_match = -1;
1507

    
1508
      for (opcodep = cris_opcodes;
1509
           opcodep->name != NULL;
1510
           opcodep++)
1511
        {
1512
          int level_of_match;
1513

    
1514
          if (disdata->distype == cris_dis_v32)
1515
            {
1516
              switch (opcodep->applicable_version)
1517
                {
1518
                case cris_ver_version_all:
1519
                  break;
1520

    
1521
                case cris_ver_v0_3:
1522
                case cris_ver_v0_10:
1523
                case cris_ver_v3_10:
1524
                case cris_ver_sim_v0_10:
1525
                case cris_ver_v8_10:
1526
                case cris_ver_v10:
1527
                case cris_ver_warning:
1528
                  continue;
1529

    
1530
                case cris_ver_v3p:
1531
                case cris_ver_v8p:
1532
                case cris_ver_v10p:
1533
                case cris_ver_v32p:
1534
                  break;
1535

    
1536
                case cris_ver_v8:
1537
                  abort ();
1538
                default:
1539
                  abort ();
1540
                }
1541
            }
1542
          else
1543
            {
1544
              switch (opcodep->applicable_version)
1545
                {
1546
                case cris_ver_version_all:
1547
                case cris_ver_v0_3:
1548
                case cris_ver_v3p:
1549
                case cris_ver_v0_10:
1550
                case cris_ver_v8p:
1551
                case cris_ver_v8_10:
1552
                case cris_ver_v10:
1553
                case cris_ver_sim_v0_10:
1554
                case cris_ver_v10p:
1555
                case cris_ver_warning:
1556
                  break;
1557

    
1558
                case cris_ver_v32p:
1559
                  continue;
1560

    
1561
                case cris_ver_v8:
1562
                  abort ();
1563
                default:
1564
                  abort ();
1565
                }
1566
            }
1567

    
1568
          /* We give a double lead for bits matching the template in
1569
             cris_opcodes.  Not even, because then "move p8,r10" would
1570
             be given 2 bits lead over "clear.d r10".  When there's a
1571
             tie, the first entry in the table wins.  This is
1572
             deliberate, to avoid a more complicated recognition
1573
             formula.  */
1574
          if ((opcodep->match & insn) == opcodep->match
1575
              && (opcodep->lose & insn) == 0
1576
              && ((level_of_match
1577
                   = cris_constraint (opcodep->args,
1578
                                      insn,
1579
                                      prefix_insn,
1580
                                      disdata))
1581
                  >= 0)
1582
              && ((level_of_match
1583
                   += 2 * number_of_bits (opcodep->match
1584
                                          | opcodep->lose))
1585
                          > max_level_of_match))
1586
                    {
1587
                      max_matchedp = opcodep;
1588
                      max_level_of_match = level_of_match;
1589

    
1590
                      /* If there was a full match, never mind looking
1591
                         further.  */
1592
                      if (level_of_match >= 2 * 16)
1593
                        break;
1594
                    }
1595
                }
1596
      /* Fill in the new entry.
1597

1598
         If there are changes to the opcode-table involving prefixes, and
1599
         disassembly then does not work correctly, try removing the
1600
         else-clause below that fills in the prefix-table.  If that
1601
         helps, you need to change the prefix_opc_table setting above, or
1602
         something related.  */
1603
      if (prefix_insn == NO_CRIS_PREFIX)
1604
        opc_table[insn] = max_matchedp;
1605
      else
1606
        prefix_opc_table[insn] = max_matchedp;
1607
    }
1608

    
1609
  return max_matchedp;
1610
}
1611

    
1612
/* Return -1 if the constraints of a bitwise-matched instruction say
1613
   that there is no match.  Otherwise return a nonnegative number
1614
   indicating the confidence in the match (higher is better).  */
1615

    
1616
static int
1617
cris_constraint (const char *cs,
1618
                 unsigned int insn,
1619
                 unsigned int prefix_insn,
1620
                 struct cris_disasm_data *disdata)
1621
{
1622
  int retval = 0;
1623
  int tmp;
1624
  int prefix_ok = 0;
1625
  const char *s;
1626

    
1627
  for (s = cs; *s; s++)
1628
    switch (*s)
1629
      {
1630
      case '!':
1631
        /* Do not recognize "pop" if there's a prefix and then only for
1632
           v0..v10.  */
1633
        if (prefix_insn != NO_CRIS_PREFIX
1634
            || disdata->distype != cris_dis_v0_v10)
1635
          return -1;
1636
        break;
1637

    
1638
      case 'U':
1639
        /* Not recognized at disassembly.  */
1640
        return -1;
1641

    
1642
      case 'M':
1643
        /* Size modifier for "clear", i.e. special register 0, 4 or 8.
1644
           Check that it is one of them.  Only special register 12 could
1645
           be mismatched, but checking for matches is more logical than
1646
           checking for mismatches when there are only a few cases.  */
1647
        tmp = ((insn >> 12) & 0xf);
1648
        if (tmp != 0 && tmp != 4 && tmp != 8)
1649
          return -1;
1650
        break;
1651

    
1652
      case 'm':
1653
        if ((insn & 0x30) == 0x30)
1654
          return -1;
1655
        break;
1656

    
1657
      case 'S':
1658
        /* A prefix operand without side-effect.  */
1659
        if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1660
          {
1661
            prefix_ok = 1;
1662
            break;
1663
          }
1664
        else
1665
          return -1;
1666

    
1667
      case 's':
1668
      case 'y':
1669
      case 'Y':
1670
        /* If this is a prefixed insn with postincrement (side-effect),
1671
           the prefix must not be DIP.  */
1672
        if (prefix_insn != NO_CRIS_PREFIX)
1673
          {
1674
            if (insn & 0x400)
1675
              {
1676
                const struct cris_opcode *prefix_opcodep
1677
                  = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1678

    
1679
                if (prefix_opcodep->match == DIP_OPCODE)
1680
                  return -1;
1681
              }
1682

    
1683
            prefix_ok = 1;
1684
          }
1685
        break;
1686

    
1687
      case 'B':
1688
        /* If we don't fall through, then the prefix is ok.  */
1689
        prefix_ok = 1;
1690

    
1691
        /* A "push" prefix.  Check for valid "push" size.
1692
           In case of special register, it may be != 4.  */
1693
        if (prefix_insn != NO_CRIS_PREFIX)
1694
          {
1695
            /* Match the prefix insn to BDAPQ.  */
1696
            const struct cris_opcode *prefix_opcodep
1697
              = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1698

    
1699
            if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1700
              {
1701
                int pushsize = (prefix_insn & 255);
1702

    
1703
                if (pushsize > 127)
1704
                  pushsize -= 256;
1705

    
1706
                if (s[1] == 'P')
1707
                  {
1708
                    unsigned int spec_reg = (insn >> 12) & 15;
1709
                    const struct cris_spec_reg *sregp
1710
                      = spec_reg_info (spec_reg, disdata->distype);
1711

    
1712
                    /* For a special-register, the "prefix size" must
1713
                       match the size of the register.  */
1714
                    if (sregp && sregp->reg_size == (unsigned int) -pushsize)
1715
                      break;
1716
                  }
1717
                else if (s[1] == 'R')
1718
                  {
1719
                    if ((insn & 0x30) == 0x20 && pushsize == -4)
1720
                      break;
1721
                  }
1722
                /* FIXME:  Should abort here; next constraint letter
1723
                   *must* be 'P' or 'R'.  */
1724
              }
1725
          }
1726
        return -1;
1727

    
1728
      case 'D':
1729
        retval = (((insn >> 12) & 15) == (insn & 15));
1730
        if (!retval)
1731
          return -1;
1732
        else
1733
          retval += 4;
1734
        break;
1735

    
1736
      case 'P':
1737
        {
1738
          const struct cris_spec_reg *sregp
1739
            = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1740

    
1741
          /* Since we match four bits, we will give a value of 4-1 = 3
1742
             in a match.  If there is a corresponding exact match of a
1743
             special register in another pattern, it will get a value of
1744
             4, which will be higher.  This should be correct in that an
1745
             exact pattern would match better than a general pattern.
1746

1747
             Note that there is a reason for not returning zero; the
1748
             pattern for "clear" is partly  matched in the bit-pattern
1749
             (the two lower bits must be zero), while the bit-pattern
1750
             for a move from a special register is matched in the
1751
             register constraint.  */
1752

    
1753
          if (sregp != NULL)
1754
            {
1755
              retval += 3;
1756
              break;
1757
            }
1758
          else
1759
            return -1;
1760
        }
1761
      }
1762

    
1763
  if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1764
    return -1;
1765

    
1766
  return retval;
1767
}
1768

    
1769
/* Format number as hex with a leading "0x" into outbuffer.  */
1770

    
1771
static char *
1772
format_hex (unsigned long number,
1773
            char *outbuffer,
1774
            struct cris_disasm_data *disdata)
1775
{
1776
  /* Truncate negative numbers on >32-bit hosts.  */
1777
  number &= 0xffffffff;
1778

    
1779
  sprintf (outbuffer, "0x%lx", number);
1780

    
1781
  /* Save this value for the "case" support.  */
1782
  if (TRACE_CASE)
1783
    last_immediate = number;
1784

    
1785
  return outbuffer + strlen (outbuffer);
1786
}
1787

    
1788
/* Format number as decimal into outbuffer.  Parameter signedp says
1789
   whether the number should be formatted as signed (!= 0) or
1790
   unsigned (== 0).  */
1791

    
1792
static char *
1793
format_dec (long number, char *outbuffer, int signedp)
1794
{
1795
  last_immediate = number;
1796
  sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1797

    
1798
  return outbuffer + strlen (outbuffer);
1799
}
1800

    
1801
/* Format the name of the general register regno into outbuffer.  */
1802

    
1803
static char *
1804
format_reg (struct cris_disasm_data *disdata,
1805
            int regno,
1806
            char *outbuffer_start,
1807
            bfd_boolean with_reg_prefix)
1808
{
1809
  char *outbuffer = outbuffer_start;
1810

    
1811
  if (with_reg_prefix)
1812
    *outbuffer++ = REGISTER_PREFIX_CHAR;
1813

    
1814
  switch (regno)
1815
    {
1816
    case 15:
1817
      /* For v32, there is no context in which we output PC.  */
1818
      if (disdata->distype == cris_dis_v32)
1819
        strcpy (outbuffer, "acr");
1820
      else
1821
        strcpy (outbuffer, "pc");
1822
      break;
1823

    
1824
    case 14:
1825
      strcpy (outbuffer, "sp");
1826
      break;
1827

    
1828
    default:
1829
      sprintf (outbuffer, "r%d", regno);
1830
      break;
1831
    }
1832

    
1833
  return outbuffer_start + strlen (outbuffer_start);
1834
}
1835

    
1836
/* Format the name of a support register into outbuffer.  */
1837

    
1838
static char *
1839
format_sup_reg (unsigned int regno,
1840
                char *outbuffer_start,
1841
                bfd_boolean with_reg_prefix)
1842
{
1843
  char *outbuffer = outbuffer_start;
1844
  int i;
1845

    
1846
  if (with_reg_prefix)
1847
    *outbuffer++ = REGISTER_PREFIX_CHAR;
1848

    
1849
  for (i = 0; cris_support_regs[i].name != NULL; i++)
1850
    if (cris_support_regs[i].number == regno)
1851
      {
1852
        sprintf (outbuffer, "%s", cris_support_regs[i].name);
1853
        return outbuffer_start + strlen (outbuffer_start);
1854
      }
1855

    
1856
  /* There's supposed to be register names covering all numbers, though
1857
     some may be generic names.  */
1858
  sprintf (outbuffer, "format_sup_reg-BUG");
1859
  return outbuffer_start + strlen (outbuffer_start);
1860
}
1861

    
1862
/* Return the length of an instruction.  */
1863

    
1864
static unsigned
1865
bytes_to_skip (unsigned int insn,
1866
               const struct cris_opcode *matchedp,
1867
               enum cris_disass_family distype,
1868
               const struct cris_opcode *prefix_matchedp)
1869
{
1870
  /* Each insn is a word plus "immediate" operands.  */
1871
  unsigned to_skip = 2;
1872
  const char *template = matchedp->args;
1873
  const char *s;
1874

    
1875
  for (s = template; *s; s++)
1876
    if ((*s == 's' || *s == 'N' || *s == 'Y')
1877
        && (insn & 0x400) && (insn & 15) == 15
1878
        && prefix_matchedp == NULL)
1879
      {
1880
        /* Immediate via [pc+], so we have to check the size of the
1881
           operand.  */
1882
        int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1883

    
1884
        if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1885
          to_skip += 4;
1886
        else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1887
          {
1888
            const struct cris_spec_reg *sregp
1889
              = spec_reg_info ((insn >> 12) & 15, distype);
1890

    
1891
            /* FIXME: Improve error handling; should have been caught
1892
               earlier.  */
1893
            if (sregp == NULL)
1894
              return 2;
1895

    
1896
            /* PC is incremented by two, not one, for a byte.  Except on
1897
               CRISv32, where constants are always DWORD-size for
1898
               special registers.  */
1899
            to_skip +=
1900
              distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1901
          }
1902
        else
1903
          to_skip += (mode_size + 1) & ~1;
1904
      }
1905
    else if (*s == 'n')
1906
      to_skip += 4;
1907
    else if (*s == 'b')
1908
      to_skip += 2;
1909

    
1910
  return to_skip;
1911
}
1912

    
1913
/* Print condition code flags.  */
1914

    
1915
static char *
1916
print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1917
{
1918
  /* Use the v8 (Etrax 100) flag definitions for disassembly.
1919
     The differences with v0 (Etrax 1..4) vs. Svinto are:
1920
      v0 'd' <=> v8 'm'
1921
      v0 'e' <=> v8 'b'.
1922
     FIXME: Emit v0..v3 flag names somehow.  */
1923
  static const char v8_fnames[] = "cvznxibm";
1924
  static const char v32_fnames[] = "cvznxiup";
1925
  const char *fnames
1926
    = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1927

    
1928
  unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1929
  int i;
1930

    
1931
  for (i = 0; i < 8; i++)
1932
    if (flagbits & (1 << i))
1933
      *cp++ = fnames[i];
1934

    
1935
  return cp;
1936
}
1937

    
1938
/* Print out an insn with its operands, and update the info->insn_type
1939
   fields.  The prefix_opcodep and the rest hold a prefix insn that is
1940
   supposed to be output as an address mode.  */
1941

    
1942
static void
1943
print_with_operands (const struct cris_opcode *opcodep,
1944
                     unsigned int insn,
1945
                     unsigned char *buffer,
1946
                     bfd_vma addr,
1947
                     disassemble_info *info,
1948
                     /* If a prefix insn was before this insn (and is supposed
1949
                        to be output as an address), here is a description of
1950
                        it.  */
1951
                     const struct cris_opcode *prefix_opcodep,
1952
                     unsigned int prefix_insn,
1953
                     unsigned char *prefix_buffer,
1954
                     bfd_boolean with_reg_prefix)
1955
{
1956
  /* Get a buffer of somewhat reasonable size where we store
1957
     intermediate parts of the insn.  */
1958
  char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1959
  char *tp = temp;
1960
  static const char mode_char[] = "bwd?";
1961
  const char *s;
1962
  const char *cs;
1963
  struct cris_disasm_data *disdata
1964
    = (struct cris_disasm_data *) info->private_data;
1965

    
1966
  /* Print out the name first thing we do.  */
1967
  (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1968

    
1969
  cs = opcodep->args;
1970
  s = cs;
1971

    
1972
  /* Ignore any prefix indicator.  */
1973
  if (*s == 'p')
1974
    s++;
1975

    
1976
  if (*s == 'm' || *s == 'M' || *s == 'z')
1977
    {
1978
      *tp++ = '.';
1979

    
1980
      /* Get the size-letter.  */
1981
      *tp++ = *s == 'M'
1982
        ? (insn & 0x8000 ? 'd'
1983
           : insn & 0x4000 ? 'w' : 'b')
1984
        : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1985

    
1986
      /* Ignore the size and the space character that follows.  */
1987
      s += 2;
1988
    }
1989

    
1990
  /* Add a space if this isn't a long-branch, because for those will add
1991
     the condition part of the name later.  */
1992
  if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
1993
    *tp++ = ' ';
1994

    
1995
  /* Fill in the insn-type if deducible from the name (and there's no
1996
     better way).  */
1997
  if (opcodep->name[0] == 'j')
1998
    {
1999
      if (CONST_STRNEQ (opcodep->name, "jsr"))
2000
        /* It's "jsr" or "jsrc".  */
2001
        info->insn_type = dis_jsr;
2002
      else
2003
        /* Any other jump-type insn is considered a branch.  */
2004
        info->insn_type = dis_branch;
2005
    }
2006

    
2007
  /* We might know some more fields right now.  */
2008
  info->branch_delay_insns = opcodep->delayed;
2009

    
2010
  /* Handle operands.  */
2011
  for (; *s; s++)
2012
    {
2013
    switch (*s)
2014
      {
2015
      case 'T':
2016
        tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
2017
        break;
2018

    
2019
      case 'A':
2020
        if (with_reg_prefix)
2021
          *tp++ = REGISTER_PREFIX_CHAR;
2022
        *tp++ = 'a';
2023
        *tp++ = 'c';
2024
        *tp++ = 'r';
2025
        break;
2026

    
2027
      case '[':
2028
      case ']':
2029
      case ',':
2030
        *tp++ = *s;
2031
        break;
2032

    
2033
      case '!':
2034
        /* Ignore at this point; used at earlier stages to avoid
2035
           recognition if there's a prefix at something that in other
2036
           ways looks like a "pop".  */
2037
        break;
2038

    
2039
      case 'd':
2040
        /* Ignore.  This is an optional ".d " on the large one of
2041
           relaxable insns.  */
2042
        break;
2043

    
2044
      case 'B':
2045
        /* This was the prefix that made this a "push".  We've already
2046
           handled it by recognizing it, so signal that the prefix is
2047
           handled by setting it to NULL.  */
2048
        prefix_opcodep = NULL;
2049
        break;
2050

    
2051
      case 'D':
2052
      case 'r':
2053
        tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2054
        break;
2055

    
2056
      case 'R':
2057
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2058
        break;
2059

    
2060
      case 'n':
2061
        {
2062
          /* Like N but pc-relative to the start of the insn.  */
2063
          unsigned long number
2064
            = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2065
               + buffer[5] * 0x1000000 + addr);
2066

    
2067
          /* Finish off and output previous formatted bytes.  */
2068
          *tp = 0;
2069
          if (temp[0])
2070
            (*info->fprintf_func) (info->stream, "%s", temp);
2071
          tp = temp;
2072

    
2073
          (*info->print_address_func) ((bfd_vma) number, info);
2074
        }
2075
        break;
2076

    
2077
      case 'u':
2078
        {
2079
          /* Like n but the offset is bits <3:0> in the instruction.  */
2080
          unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2081

    
2082
          /* Finish off and output previous formatted bytes.  */
2083
          *tp = 0;
2084
          if (temp[0])
2085
            (*info->fprintf_func) (info->stream, "%s", temp);
2086
          tp = temp;
2087

    
2088
          (*info->print_address_func) ((bfd_vma) number, info);
2089
        }
2090
        break;
2091

    
2092
      case 'N':
2093
      case 'y':
2094
      case 'Y':
2095
      case 'S':
2096
      case 's':
2097
        /* Any "normal" memory operand.  */
2098
        if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2099
          {
2100
            /* We're looking at [pc+], i.e. we need to output an immediate
2101
               number, where the size can depend on different things.  */
2102
            long number;
2103
            int signedp
2104
              = ((*cs == 'z' && (insn & 0x20))
2105
                 || opcodep->match == BDAP_QUICK_OPCODE);
2106
            int nbytes;
2107

    
2108
            if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2109
              nbytes = 4;
2110
            else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2111
              {
2112
                const struct cris_spec_reg *sregp
2113
                  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2114

    
2115
                /* A NULL return should have been as a non-match earlier,
2116
                   so catch it as an internal error in the error-case
2117
                   below.  */
2118
                if (sregp == NULL)
2119
                  /* Whatever non-valid size.  */
2120
                  nbytes = 42;
2121
                else
2122
                  /* PC is always incremented by a multiple of two.
2123
                     For CRISv32, immediates are always 4 bytes for
2124
                     special registers.  */
2125
                  nbytes = disdata->distype == cris_dis_v32
2126
                    ? 4 : (sregp->reg_size + 1) & ~1;
2127
              }
2128
            else
2129
              {
2130
                int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2131

    
2132
                if (mode_size == 1)
2133
                  nbytes = 2;
2134
                else
2135
                  nbytes = mode_size;
2136
              }
2137

    
2138
            switch (nbytes)
2139
              {
2140
              case 1:
2141
                number = buffer[2];
2142
                if (signedp && number > 127)
2143
                  number -= 256;
2144
                break;
2145

    
2146
              case 2:
2147
                number = buffer[2] + buffer[3] * 256;
2148
                if (signedp && number > 32767)
2149
                  number -= 65536;
2150
                break;
2151

    
2152
              case 4:
2153
                number
2154
                  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2155
                  + buffer[5] * 0x1000000;
2156
                break;
2157

    
2158
              default:
2159
                strcpy (tp, "bug");
2160
                tp += 3;
2161
                number = 42;
2162
              }
2163

    
2164
            if ((*cs == 'z' && (insn & 0x20))
2165
                || (opcodep->match == BDAP_QUICK_OPCODE
2166
                    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2167
              tp = format_dec (number, tp, signedp);
2168
            else
2169
              {
2170
                unsigned int highbyte = (number >> 24) & 0xff;
2171

    
2172
                /* Either output this as an address or as a number.  If it's
2173
                   a dword with the same high-byte as the address of the
2174
                   insn, assume it's an address, and also if it's a non-zero
2175
                   non-0xff high-byte.  If this is a jsr or a jump, then
2176
                   it's definitely an address.  */
2177
                if (nbytes == 4
2178
                    && (highbyte == ((addr >> 24) & 0xff)
2179
                        || (highbyte != 0 && highbyte != 0xff)
2180
                        || info->insn_type == dis_branch
2181
                        || info->insn_type == dis_jsr))
2182
                  {
2183
                    /* Finish off and output previous formatted bytes.  */
2184
                    *tp = 0;
2185
                    tp = temp;
2186
                    if (temp[0])
2187
                      (*info->fprintf_func) (info->stream, "%s", temp);
2188

    
2189
                    (*info->print_address_func) ((bfd_vma) number, info);
2190

    
2191
                    info->target = number;
2192
                  }
2193
                else
2194
                  tp = format_hex (number, tp, disdata);
2195
              }
2196
          }
2197
        else
2198
          {
2199
            /* Not an immediate number.  Then this is a (possibly
2200
               prefixed) memory operand.  */
2201
            if (info->insn_type != dis_nonbranch)
2202
              {
2203
                int mode_size
2204
                  = 1 << ((insn >> 4)
2205
                          & (opcodep->args[0] == 'z' ? 1 : 3));
2206
                int size;
2207
                info->insn_type = dis_dref;
2208
                info->flags |= CRIS_DIS_FLAG_MEMREF;
2209

    
2210
                if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2211
                  size = 4;
2212
                else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2213
                  {
2214
                    const struct cris_spec_reg *sregp
2215
                      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2216

    
2217
                    /* FIXME: Improve error handling; should have been caught
2218
                       earlier.  */
2219
                    if (sregp == NULL)
2220
                      size = 4;
2221
                    else
2222
                      size = sregp->reg_size;
2223
                  }
2224
                else
2225
                  size = mode_size;
2226

    
2227
                info->data_size = size;
2228
              }
2229

    
2230
            *tp++ = '[';
2231

    
2232
            if (prefix_opcodep
2233
                /* We don't match dip with a postincremented field
2234
                   as a side-effect address mode.  */
2235
                && ((insn & 0x400) == 0
2236
                    || prefix_opcodep->match != DIP_OPCODE))
2237
              {
2238
                if (insn & 0x400)
2239
                  {
2240
                    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2241
                    *tp++ = '=';
2242
                  }
2243

    
2244

    
2245
                /* We mainly ignore the prefix format string when the
2246
                   address-mode syntax is output.  */
2247
                switch (prefix_opcodep->match)
2248
                  {
2249
                  case DIP_OPCODE:
2250
                    /* It's [r], [r+] or [pc+].  */
2251
                    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2252
                      {
2253
                        /* It's [pc+].  This cannot possibly be anything
2254
                           but an address.  */
2255
                        unsigned long number
2256
                          = prefix_buffer[2] + prefix_buffer[3] * 256
2257
                          + prefix_buffer[4] * 65536
2258
                          + prefix_buffer[5] * 0x1000000;
2259

    
2260
                        info->target = (bfd_vma) number;
2261

    
2262
                        /* Finish off and output previous formatted
2263
                           data.  */
2264
                        *tp = 0;
2265
                        tp = temp;
2266
                        if (temp[0])
2267
                          (*info->fprintf_func) (info->stream, "%s", temp);
2268

    
2269
                        (*info->print_address_func) ((bfd_vma) number, info);
2270
                      }
2271
                    else
2272
                      {
2273
                        /* For a memref in an address, we use target2.
2274
                           In this case, target is zero.  */
2275
                        info->flags
2276
                          |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2277
                              | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2278

    
2279
                        info->target2 = prefix_insn & 15;
2280

    
2281
                        *tp++ = '[';
2282
                        tp = format_reg (disdata, prefix_insn & 15, tp,
2283
                                         with_reg_prefix);
2284
                        if (prefix_insn & 0x400)
2285
                          *tp++ = '+';
2286
                        *tp++ = ']';
2287
                      }
2288
                    break;
2289

    
2290
                  case BDAP_QUICK_OPCODE:
2291
                    {
2292
                      int number;
2293

    
2294
                      number = prefix_buffer[0];
2295
                      if (number > 127)
2296
                        number -= 256;
2297

    
2298
                      /* Output "reg+num" or, if num < 0, "reg-num".  */
2299
                      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2300
                                       with_reg_prefix);
2301
                      if (number >= 0)
2302
                        *tp++ = '+';
2303
                      tp = format_dec (number, tp, 1);
2304

    
2305
                      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2306
                      info->target = (prefix_insn >> 12) & 15;
2307
                      info->target2 = (bfd_vma) number;
2308
                      break;
2309
                    }
2310

    
2311
                  case BIAP_OPCODE:
2312
                    /* Output "r+R.m".  */
2313
                    tp = format_reg (disdata, prefix_insn & 15, tp,
2314
                                     with_reg_prefix);
2315
                    *tp++ = '+';
2316
                    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2317
                                     with_reg_prefix);
2318
                    *tp++ = '.';
2319
                    *tp++ = mode_char[(prefix_insn >> 4) & 3];
2320

    
2321
                    info->flags
2322
                      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2323
                          | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2324

    
2325
                          | ((prefix_insn & 0x8000)
2326
                             ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2327
                             : ((prefix_insn & 0x8000)
2328
                                ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2329

    
2330
                    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
2331
                    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
2332
                      /* Then start interpreting data as offsets.  */
2333
                      case_offset_counter = no_of_case_offsets;
2334
                    break;
2335

    
2336
                  case BDAP_INDIR_OPCODE:
2337
                    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2338
                       "r-s".  */
2339
                    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2340
                                     with_reg_prefix);
2341

    
2342
                    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2343
                      {
2344
                        long number;
2345
                        unsigned int nbytes;
2346

    
2347
                        /* It's a value.  Get its size.  */
2348
                        int mode_size = 1 << ((prefix_insn >> 4) & 3);
2349

    
2350
                        if (mode_size == 1)
2351
                          nbytes = 2;
2352
                        else
2353
                          nbytes = mode_size;
2354

    
2355
                        switch (nbytes)
2356
                          {
2357
                          case 1:
2358
                            number = prefix_buffer[2];
2359
                            if (number > 127)
2360
                              number -= 256;
2361
                            break;
2362

    
2363
                          case 2:
2364
                            number = prefix_buffer[2] + prefix_buffer[3] * 256;
2365
                            if (number > 32767)
2366
                              number -= 65536;
2367
                            break;
2368

    
2369
                          case 4:
2370
                            number
2371
                              = prefix_buffer[2] + prefix_buffer[3] * 256
2372
                              + prefix_buffer[4] * 65536
2373
                              + prefix_buffer[5] * 0x1000000;
2374
                            break;
2375

    
2376
                          default:
2377
                            strcpy (tp, "bug");
2378
                            tp += 3;
2379
                            number = 42;
2380
                          }
2381

    
2382
                        info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2383
                        info->target2 = (bfd_vma) number;
2384

    
2385
                        /* If the size is dword, then assume it's an
2386
                           address.  */
2387
                        if (nbytes == 4)
2388
                          {
2389
                            /* Finish off and output previous formatted
2390
                               bytes.  */
2391
                            *tp++ = '+';
2392
                            *tp = 0;
2393
                            tp = temp;
2394
                            (*info->fprintf_func) (info->stream, "%s", temp);
2395

    
2396
                            (*info->print_address_func) ((bfd_vma) number, info);
2397
                          }
2398
                        else
2399
                          {
2400
                            if (number >= 0)
2401
                              *tp++ = '+';
2402
                            tp = format_dec (number, tp, 1);
2403
                          }
2404
                      }
2405
                    else
2406
                      {
2407
                        /* Output "r+[R].m" or "r+[R+].m".  */
2408
                        *tp++ = '+';
2409
                        *tp++ = '[';
2410
                        tp = format_reg (disdata, prefix_insn & 15, tp,
2411
                                         with_reg_prefix);
2412
                        if (prefix_insn & 0x400)
2413
                          *tp++ = '+';
2414
                        *tp++ = ']';
2415
                        *tp++ = '.';
2416
                        *tp++ = mode_char[(prefix_insn >> 4) & 3];
2417

    
2418
                        info->flags
2419
                          |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2420
                              | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2421
                              | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2422

    
2423
                              | (((prefix_insn >> 4) == 2)
2424
                                 ? 0
2425
                                 : (((prefix_insn >> 4) & 3) == 1
2426
                                    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2427
                                    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2428
                      }
2429
                    break;
2430

    
2431
                  default:
2432
                    (*info->fprintf_func) (info->stream, "?prefix-bug");
2433
                  }
2434

    
2435
                /* To mark that the prefix is used, reset it.  */
2436
                prefix_opcodep = NULL;
2437
              }
2438
            else
2439
              {
2440
                tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2441

    
2442
                info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2443
                info->target = insn & 15;
2444

    
2445
                if (insn & 0x400)
2446
                  *tp++ = '+';
2447
              }
2448
            *tp++ = ']';
2449
          }
2450
        break;
2451

    
2452
      case 'x':
2453
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2454
        *tp++ = '.';
2455
        *tp++ = mode_char[(insn >> 4) & 3];
2456
        break;
2457

    
2458
      case 'I':
2459
        tp = format_dec (insn & 63, tp, 0);
2460
        break;
2461

    
2462
      case 'b':
2463
        {
2464
          int where = buffer[2] + buffer[3] * 256;
2465

    
2466
          if (where > 32767)
2467
            where -= 65536;
2468

    
2469
          where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2470

    
2471
          if (insn == BA_PC_INCR_OPCODE)
2472
            info->insn_type = dis_branch;
2473
          else
2474
            info->insn_type = dis_condbranch;
2475

    
2476
          info->target = (bfd_vma) where;
2477

    
2478
          *tp = 0;
2479
          tp = temp;
2480
          (*info->fprintf_func) (info->stream, "%s%s ",
2481
                                 temp, cris_cc_strings[insn >> 12]);
2482

    
2483
          (*info->print_address_func) ((bfd_vma) where, info);
2484
        }
2485
      break;
2486

    
2487
    case 'c':
2488
      tp = format_dec (insn & 31, tp, 0);
2489
      break;
2490

    
2491
    case 'C':
2492
      tp = format_dec (insn & 15, tp, 0);
2493
      break;
2494

    
2495
    case 'o':
2496
      {
2497
        long offset = insn & 0xfe;
2498
        bfd_vma target;
2499

    
2500
        if (insn & 1)
2501
          offset |= ~0xff;
2502

    
2503
        if (opcodep->match == BA_QUICK_OPCODE)
2504
          info->insn_type = dis_branch;
2505
        else
2506
          info->insn_type = dis_condbranch;
2507

    
2508
        target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2509
        info->target = target;
2510
        *tp = 0;
2511
        tp = temp;
2512
        (*info->fprintf_func) (info->stream, "%s", temp);
2513
        (*info->print_address_func) (target, info);
2514
      }
2515
      break;
2516

    
2517
    case 'Q':
2518
    case 'O':
2519
      {
2520
        long number = buffer[0];
2521

    
2522
        if (number > 127)
2523
          number = number - 256;
2524

    
2525
        tp = format_dec (number, tp, 1);
2526
        *tp++ = ',';
2527
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2528
      }
2529
      break;
2530

    
2531
    case 'f':
2532
      tp = print_flags (disdata, insn, tp);
2533
      break;
2534

    
2535
    case 'i':
2536
      tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2537
      break;
2538

    
2539
    case 'P':
2540
      {
2541
        const struct cris_spec_reg *sregp
2542
          = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2543

    
2544
        if (sregp->name == NULL)
2545
          /* Should have been caught as a non-match eariler.  */
2546
          *tp++ = '?';
2547
        else
2548
          {
2549
            if (with_reg_prefix)
2550
              *tp++ = REGISTER_PREFIX_CHAR;
2551
            strcpy (tp, sregp->name);
2552
            tp += strlen (tp);
2553
          }
2554
      }
2555
      break;
2556

    
2557
    default:
2558
      strcpy (tp, "???");
2559
      tp += 3;
2560
    }
2561
  }
2562

    
2563
  *tp = 0;
2564

    
2565
  if (prefix_opcodep)
2566
    (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2567
                           prefix_opcodep->name, prefix_opcodep->args);
2568

    
2569
  (*info->fprintf_func) (info->stream, "%s", temp);
2570

    
2571
  /* Get info for matching case-tables, if we don't have any active.
2572
     We assume that the last constant seen is used; either in the insn
2573
     itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
2574
  if (TRACE_CASE && case_offset_counter == 0)
2575
    {
2576
      if (CONST_STRNEQ (opcodep->name, "sub"))
2577
        case_offset = last_immediate;
2578

    
2579
      /* It could also be an "add", if there are negative case-values.  */
2580
      else if (CONST_STRNEQ (opcodep->name, "add"))
2581
        /* The first case is the negated operand to the add.  */
2582
        case_offset = -last_immediate;
2583

    
2584
      /* A bound insn will tell us the number of cases.  */
2585
      else if (CONST_STRNEQ (opcodep->name, "bound"))
2586
        no_of_case_offsets = last_immediate + 1;
2587

    
2588
      /* A jump or jsr or branch breaks the chain of insns for a
2589
         case-table, so assume default first-case again.  */
2590
      else if (info->insn_type == dis_jsr
2591
               || info->insn_type == dis_branch
2592
               || info->insn_type == dis_condbranch)
2593
        case_offset = 0;
2594
    }
2595
}
2596

    
2597

    
2598
/* Print the CRIS instruction at address memaddr on stream.  Returns
2599
   length of the instruction, in bytes.  Prefix register names with `$' if
2600
   WITH_REG_PREFIX.  */
2601

    
2602
static int
2603
print_insn_cris_generic (bfd_vma memaddr,
2604
                         disassemble_info *info,
2605
                         bfd_boolean with_reg_prefix)
2606
{
2607
  int nbytes;
2608
  unsigned int insn;
2609
  const struct cris_opcode *matchedp;
2610
  int advance = 0;
2611
  struct cris_disasm_data *disdata
2612
    = (struct cris_disasm_data *) info->private_data;
2613

    
2614
  /* No instruction will be disassembled as longer than this number of
2615
     bytes; stacked prefixes will not be expanded.  */
2616
  unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
2617
  unsigned char *bufp;
2618
  int status = 0;
2619
  bfd_vma addr;
2620

    
2621
  /* There will be an "out of range" error after the last instruction.
2622
     Reading pairs of bytes in decreasing number, we hope that we will get
2623
     at least the amount that we will consume.
2624

2625
     If we can't get any data, or we do not get enough data, we print
2626
     the error message.  */
2627

    
2628
  nbytes = info->buffer_length;
2629
  if (nbytes > MAX_BYTES_PER_CRIS_INSN)
2630
          nbytes = MAX_BYTES_PER_CRIS_INSN;
2631
  status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);  
2632

    
2633
  /* If we did not get all we asked for, then clear the rest.
2634
     Hopefully this makes a reproducible result in case of errors.  */
2635
  if (nbytes != MAX_BYTES_PER_CRIS_INSN)
2636
    memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
2637

    
2638
  addr = memaddr;
2639
  bufp = buffer;
2640

    
2641
  /* Set some defaults for the insn info.  */
2642
  info->insn_info_valid = 1;
2643
  info->branch_delay_insns = 0;
2644
  info->data_size = 0;
2645
  info->insn_type = dis_nonbranch;
2646
  info->flags = 0;
2647
  info->target = 0;
2648
  info->target2 = 0;
2649

    
2650
  /* If we got any data, disassemble it.  */
2651
  if (nbytes != 0)
2652
    {
2653
      matchedp = NULL;
2654

    
2655
      insn = bufp[0] + bufp[1] * 256;
2656

    
2657
      /* If we're in a case-table, don't disassemble the offsets.  */
2658
      if (TRACE_CASE && case_offset_counter != 0)
2659
        {
2660
          info->insn_type = dis_noninsn;
2661
          advance += 2;
2662

    
2663
          /* If to print data as offsets, then shortcut here.  */
2664
          (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
2665
                                 case_offset + no_of_case_offsets
2666
                                 - case_offset_counter,
2667
                                 case_offset_counter == 1 ? "/default" :
2668
                                 "");
2669

    
2670
          (*info->print_address_func) ((bfd_vma)
2671
                                       ((short) (insn)
2672
                                        + (long) (addr
2673
                                                  - (no_of_case_offsets
2674
                                                     - case_offset_counter)
2675
                                                  * 2)), info);
2676
          case_offset_counter--;
2677

    
2678
          /* The default case start (without a "sub" or "add") must be
2679
             zero.  */
2680
          if (case_offset_counter == 0)
2681
            case_offset = 0;
2682
        }
2683
      else if (insn == 0)
2684
        {
2685
          /* We're often called to disassemble zeroes.  While this is a
2686
             valid "bcc .+2" insn, it is also useless enough and enough
2687
             of a nuiscance that we will just output "bcc .+2" for it
2688
             and signal it as a noninsn.  */
2689
          (*info->fprintf_func) (info->stream,
2690
                                 disdata->distype == cris_dis_v32
2691
                                 ? "bcc ." : "bcc .+2");
2692
          info->insn_type = dis_noninsn;
2693
          advance += 2;
2694
        }
2695
      else
2696
        {
2697
          const struct cris_opcode *prefix_opcodep = NULL;
2698
          unsigned char *prefix_buffer = bufp;
2699
          unsigned int prefix_insn = insn;
2700
          int prefix_size = 0;
2701

    
2702
          matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2703

    
2704
          /* Check if we're supposed to write out prefixes as address
2705
             modes and if this was a prefix.  */
2706
          if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
2707
            {
2708
              /* If it's a prefix, put it into the prefix vars and get the
2709
                 main insn.  */
2710
              prefix_size = bytes_to_skip (prefix_insn, matchedp,
2711
                                           disdata->distype, NULL);
2712
              prefix_opcodep = matchedp;
2713

    
2714
              insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2715
              matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2716

    
2717
              if (matchedp != NULL)
2718
                {
2719
                  addr += prefix_size;
2720
                  bufp += prefix_size;
2721
                  advance += prefix_size;
2722
                }
2723
              else
2724
                {
2725
                  /* The "main" insn wasn't valid, at least not when
2726
                     prefixed.  Put back things enough to output the
2727
                     prefix insn only, as a normal insn.  */
2728
                  matchedp = prefix_opcodep;
2729
                  insn = prefix_insn;
2730
                  prefix_opcodep = NULL;
2731
                }
2732
            }
2733

    
2734
          if (matchedp == NULL)
2735
            {
2736
              (*info->fprintf_func) (info->stream, "??0x%x", insn);
2737
              advance += 2;
2738

    
2739
              info->insn_type = dis_noninsn;
2740
            }
2741
          else
2742
            {
2743
              advance
2744
                += bytes_to_skip (insn, matchedp, disdata->distype,
2745
                                  prefix_opcodep);
2746

    
2747
              /* The info_type and assorted fields will be set according
2748
                 to the operands.   */
2749
              print_with_operands (matchedp, insn, bufp, addr, info,
2750
                                   prefix_opcodep, prefix_insn,
2751
                                   prefix_buffer, with_reg_prefix);
2752
            }
2753
        }
2754
    }
2755
  else
2756
    info->insn_type = dis_noninsn;
2757

    
2758
  /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2759
     status when reading that much, and the insn decoding indicated a
2760
     length exceeding what we read, there is an error.  */
2761
  if (status != 0 && (nbytes == 0 || advance > nbytes))
2762
    {
2763
      (*info->memory_error_func) (status, memaddr, info);
2764
      return -1;
2765
    }
2766

    
2767
  /* Max supported insn size with one folded prefix insn.  */
2768
  info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2769

    
2770
  /* I would like to set this to a fixed value larger than the actual
2771
     number of bytes to print in order to avoid spaces between bytes,
2772
     but objdump.c (2.9.1) does not like that, so we print 16-bit
2773
     chunks, which is the next choice.  */
2774
  info->bytes_per_chunk = 2;
2775

    
2776
  /* Printing bytes in order of increasing addresses makes sense,
2777
     especially on a little-endian target.
2778
     This is completely the opposite of what you think; setting this to
2779
     BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2780
     we want.  */
2781
  info->display_endian = BFD_ENDIAN_BIG;
2782

    
2783
  return advance;
2784
}
2785

    
2786
/* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
2787
#if 0
2788
static int
2789
print_insn_cris_with_register_prefix (bfd_vma vma,
2790
                                      disassemble_info *info)
2791
{
2792
  if (info->private_data == NULL
2793
      && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2794
    return -1;
2795
  return print_insn_cris_generic (vma, info, TRUE);
2796
}
2797
#endif
2798
/* Disassemble, prefixing register names with `$'.  CRIS v32.  */
2799

    
2800
static int
2801
print_insn_crisv32_with_register_prefix (bfd_vma vma,
2802
                                         disassemble_info *info)
2803
{
2804
  if (info->private_data == NULL
2805
      && !cris_parse_disassembler_options (info, cris_dis_v32))
2806
    return -1;
2807
  return print_insn_cris_generic (vma, info, TRUE);
2808
}
2809

    
2810
#if 0
2811
/* Disassemble, prefixing register names with `$'.
2812
   Common v10 and v32 subset.  */
2813

2814
static int
2815
print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2816
                                             disassemble_info *info)
2817
{
2818
  if (info->private_data == NULL
2819
      && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2820
    return -1;
2821
  return print_insn_cris_generic (vma, info, TRUE);
2822
}
2823

2824
/* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
2825

2826
static int
2827
print_insn_cris_without_register_prefix (bfd_vma vma,
2828
                                         disassemble_info *info)
2829
{
2830
  if (info->private_data == NULL
2831
      && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2832
    return -1;
2833
  return print_insn_cris_generic (vma, info, FALSE);
2834
}
2835

2836
/* Disassemble, no prefixes on register names.  CRIS v32.  */
2837

2838
static int
2839
print_insn_crisv32_without_register_prefix (bfd_vma vma,
2840
                                            disassemble_info *info)
2841
{
2842
  if (info->private_data == NULL
2843
      && !cris_parse_disassembler_options (info, cris_dis_v32))
2844
    return -1;
2845
  return print_insn_cris_generic (vma, info, FALSE);
2846
}
2847

2848
/* Disassemble, no prefixes on register names.
2849
   Common v10 and v32 subset.  */
2850

2851
static int
2852
print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2853
                                                disassemble_info *info)
2854
{
2855
  if (info->private_data == NULL
2856
      && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2857
    return -1;
2858
  return print_insn_cris_generic (vma, info, FALSE);
2859
}
2860
#endif
2861

    
2862
int
2863
print_insn_crisv32 (bfd_vma vma,
2864
                    disassemble_info *info)
2865
{
2866
  return print_insn_crisv32_with_register_prefix(vma, info);
2867
}
2868

    
2869
/* Return a disassembler-function that prints registers with a `$' prefix,
2870
   or one that prints registers without a prefix.
2871
   FIXME: We should improve the solution to avoid the multitude of
2872
   functions seen above.  */
2873
#if 0
2874
disassembler_ftype
2875
cris_get_disassembler (bfd *abfd)
2876
{
2877
  /* If there's no bfd in sight, we return what is valid as input in all
2878
     contexts if fed back to the assembler: disassembly *with* register
2879
     prefix.  Unfortunately this will be totally wrong for v32.  */
2880
  if (abfd == NULL)
2881
    return print_insn_cris_with_register_prefix;
2882

2883
  if (bfd_get_symbol_leading_char (abfd) == 0)
2884
    {
2885
      if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2886
        return print_insn_crisv32_with_register_prefix;
2887
      if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2888
        return print_insn_crisv10_v32_with_register_prefix;
2889

2890
      /* We default to v10.  This may be specifically specified in the
2891
         bfd mach, but is also the default setting.  */
2892
      return print_insn_cris_with_register_prefix;
2893
    }
2894

2895
  if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2896
    return print_insn_crisv32_without_register_prefix;
2897
  if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2898
    return print_insn_crisv10_v32_without_register_prefix;
2899
  return print_insn_cris_without_register_prefix;
2900
}
2901
#endif
2902
/* Local variables:
2903
   eval: (c-set-style "gnu")
2904
   indent-tabs-mode: t
2905
   End:  */