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