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