cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

cris.c (81569B)


      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:  */