qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

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 
     33 This file is part of GAS, GDB and the GNU binutils.
     34 
     35 GAS, GDB, and GNU binutils is free software; you can redistribute it
     36 and/or modify it under the terms of the GNU General Public License as
     37 published by the Free Software Foundation; either version 2, or (at your
     38 option) any later version.
     39 
     40 GAS, GDB, and GNU binutils are distributed in the hope that they will be
     41 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     42 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     43 GNU General Public License for more details.
     44 
     45 You should have received a copy of the GNU General Public License
     46 along with this program; if not, see <http://www.gnu.org/licenses/>.  */
     47 
     48 #ifndef NULL
     49 #define NULL (0)
     50 #endif
     51 
     52 /* This table isn't used for CRISv32 and the size of immediate operands.  */
     53 const struct cris_spec_reg
     54 cris_spec_regs[] =
     55 {
     56   {"bz",  0,  1, cris_ver_v32p,	   NULL},
     57   {"p0",  0,  1, 0,		   NULL},
     58   {"vr",  1,  1, 0,		   NULL},
     59   {"p1",  1,  1, 0,		   NULL},
     60   {"pid", 2,  1, cris_ver_v32p,    NULL},
     61   {"p2",  2,  1, cris_ver_v32p,	   NULL},
     62   {"p2",  2,  1, cris_ver_warning, NULL},
     63   {"srs", 3,  1, cris_ver_v32p,    NULL},
     64   {"p3",  3,  1, cris_ver_v32p,	   NULL},
     65   {"p3",  3,  1, cris_ver_warning, NULL},
     66   {"wz",  4,  2, cris_ver_v32p,	   NULL},
     67   {"p4",  4,  2, 0,		   NULL},
     68   {"ccr", 5,  2, cris_ver_v0_10,   NULL},
     69   {"exs", 5,  4, cris_ver_v32p,	   NULL},
     70   {"p5",  5,  2, cris_ver_v0_10,   NULL},
     71   {"p5",  5,  4, cris_ver_v32p,	   NULL},
     72   {"dcr0",6,  2, cris_ver_v0_3,	   NULL},
     73   {"eda", 6,  4, cris_ver_v32p,	   NULL},
     74   {"p6",  6,  2, cris_ver_v0_3,	   NULL},
     75   {"p6",  6,  4, cris_ver_v32p,	   NULL},
     76   {"dcr1/mof", 7, 4, cris_ver_v10p,
     77    "Register `dcr1/mof' with ambiguous size specified.  Guessing 4 bytes"},
     78   {"dcr1/mof", 7, 2, cris_ver_v0_3,
     79    "Register `dcr1/mof' with ambiguous size specified.  Guessing 2 bytes"},
     80   {"mof", 7,  4, cris_ver_v10p,	   NULL},
     81   {"dcr1",7,  2, cris_ver_v0_3,	   NULL},
     82   {"p7",  7,  4, cris_ver_v10p,	   NULL},
     83   {"p7",  7,  2, cris_ver_v0_3,	   NULL},
     84   {"dz",  8,  4, cris_ver_v32p,	   NULL},
     85   {"p8",  8,  4, 0,		   NULL},
     86   {"ibr", 9,  4, cris_ver_v0_10,   NULL},
     87   {"ebp", 9,  4, cris_ver_v32p,	   NULL},
     88   {"p9",  9,  4, 0,		   NULL},
     89   {"irp", 10, 4, cris_ver_v0_10,   NULL},
     90   {"erp", 10, 4, cris_ver_v32p,	   NULL},
     91   {"p10", 10, 4, 0,		   NULL},
     92   {"srp", 11, 4, 0,		   NULL},
     93   {"p11", 11, 4, 0,		   NULL},
     94   /* For disassembly use only.  Accept at assembly with a warning.  */
     95   {"bar/dtp0", 12, 4, cris_ver_warning,
     96    "Ambiguous register `bar/dtp0' specified"},
     97   {"nrp", 12, 4, cris_ver_v32p,	   NULL},
     98   {"bar", 12, 4, cris_ver_v8_10,   NULL},
     99   {"dtp0",12, 4, cris_ver_v0_3,	   NULL},
    100   {"p12", 12, 4, 0,		   NULL},
    101   /* For disassembly use only.  Accept at assembly with a warning.  */
    102   {"dccr/dtp1",13, 4, cris_ver_warning,
    103    "Ambiguous register `dccr/dtp1' specified"},
    104   {"ccs", 13, 4, cris_ver_v32p,	   NULL},
    105   {"dccr",13, 4, cris_ver_v8_10,   NULL},
    106   {"dtp1",13, 4, cris_ver_v0_3,	   NULL},
    107   {"p13", 13, 4, 0,		   NULL},
    108   {"brp", 14, 4, cris_ver_v3_10,   NULL},
    109   {"usp", 14, 4, cris_ver_v32p,	   NULL},
    110   {"p14", 14, 4, cris_ver_v3p,	   NULL},
    111   {"usp", 15, 4, cris_ver_v10,	   NULL},
    112   {"spc", 15, 4, cris_ver_v32p,	   NULL},
    113   {"p15", 15, 4, cris_ver_v10p,	   NULL},
    114   {NULL, 0, 0, cris_ver_version_all, NULL}
    115 };
    116 
    117 /* Add version specifiers to this table when necessary.
    118    The (now) regular coding of register names suggests a simpler
    119    implementation.  */
    120 const struct cris_support_reg cris_support_regs[] =
    121 {
    122   {"s0", 0},
    123   {"s1", 1},
    124   {"s2", 2},
    125   {"s3", 3},
    126   {"s4", 4},
    127   {"s5", 5},
    128   {"s6", 6},
    129   {"s7", 7},
    130   {"s8", 8},
    131   {"s9", 9},
    132   {"s10", 10},
    133   {"s11", 11},
    134   {"s12", 12},
    135   {"s13", 13},
    136   {"s14", 14},
    137   {"s15", 15},
    138   {NULL, 0}
    139 };
    140 
    141 /* All CRIS opcodes are 16 bits.
    142 
    143    - The match component is a mask saying which bits must match a
    144      particular opcode in order for an instruction to be an instance
    145      of that opcode.
    146 
    147    - The args component is a string containing characters symbolically
    148      matching the operands of an instruction.  Used for both assembly
    149      and disassembly.
    150 
    151      Operand-matching characters:
    152      [ ] , space
    153         Verbatim.
    154      A	The string "ACR" (case-insensitive).
    155      B	Not really an operand.  It causes a "BDAP -size,SP" prefix to be
    156 	output for the PUSH alias-instructions and recognizes a push-
    157 	prefix at disassembly.  This letter isn't recognized for v32.
    158 	Must be followed by a R or P letter.
    159      !	Non-match pattern, will not match if there's a prefix insn.
    160      b	Non-matching operand, used for branches with 16-bit
    161 	displacement. Only recognized by the disassembler.
    162      c	5-bit unsigned immediate in bits <4:0>.
    163      C	4-bit unsigned immediate in bits <3:0>.
    164      d  At assembly, optionally (as in put other cases before this one)
    165 	".d" or ".D" at the start of the operands, followed by one space
    166 	character.  At disassembly, nothing.
    167      D	General register in bits <15:12> and <3:0>.
    168      f	List of flags in bits <15:12> and <3:0>.
    169      i	6-bit signed immediate in bits <5:0>.
    170      I	6-bit unsigned immediate in bits <5:0>.
    171      M	Size modifier (B, W or D) for CLEAR instructions.
    172      m	Size modifier (B, W or D) in bits <5:4>
    173      N  A 32-bit dword, like in the difference between s and y.
    174         This has no effect on bits in the opcode.  Can also be expressed
    175 	as "[pc+]" in input.
    176      n  As N, but PC-relative (to the start of the instruction).
    177      o	[-128..127] word offset in bits <7:1> and <0>.  Used by 8-bit
    178 	branch instructions.
    179      O	[-128..127] offset in bits <7:0>.  Also matches a comma and a
    180 	general register after the expression, in bits <15:12>.  Used
    181 	only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
    182      P	Special register in bits <15:12>.
    183      p	Indicates that the insn is a prefix insn.  Must be first
    184 	character.
    185      Q  As O, but don't relax; force an 8-bit offset.
    186      R	General register in bits <15:12>.
    187      r	General register in bits <3:0>.
    188      S	Source operand in bit <10> and a prefix; a 3-operand prefix
    189 	without side-effect.
    190      s	Source operand in bits <10> and <3:0>, optionally with a
    191 	side-effect prefix, except [pc] (the name, not R15 as in ACR)
    192 	isn't allowed for v32 and higher.
    193      T  Support register in bits <15:12>.
    194      u  4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
    195      U  Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
    196 	Not recognized at disassembly.
    197      x	Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
    198      y	Like 's' but do not allow an integer at assembly.
    199      Y	The difference s-y; only an integer is allowed.
    200      z	Size modifier (B or W) in bit <4>.  */
    201 
    202 
    203 /* Please note the order of the opcodes in this table is significant.
    204    The assembler requires that all instances of the same mnemonic must
    205    be consecutive.  If they aren't, the assembler might not recognize
    206    them, or may indicate an internal error.
    207 
    208    The disassembler should not normally care about the order of the
    209    opcodes, but will prefer an earlier alternative if the "match-score"
    210    (see cris-dis.c) is computed as equal.
    211 
    212    It should not be significant for proper execution that this table is
    213    in alphabetical order, but please follow that convention for an easy
    214    overview.  */
    215 
    216 const struct cris_opcode
    217 cris_opcodes[] =
    218 {
    219   {"abs",     0x06B0, 0x0940,		  "r,R",     0, SIZE_NONE,     0,
    220    cris_abs_op},
    221 
    222   {"add",     0x0600, 0x09c0,		  "m r,R",   0, SIZE_NONE,     0,
    223    cris_reg_mode_add_sub_cmp_and_or_move_op},
    224 
    225   {"add",     0x0A00, 0x01c0,		  "m s,R",   0, SIZE_FIELD,    0,
    226    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    227 
    228   {"add",     0x0A00, 0x01c0,		  "m S,D",   0, SIZE_NONE,
    229    cris_ver_v0_10,
    230    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    231 
    232   {"add",     0x0a00, 0x05c0,		  "m S,R,r", 0, SIZE_NONE,
    233    cris_ver_v0_10,
    234    cris_three_operand_add_sub_cmp_and_or_op},
    235 
    236   {"add",     0x0A00, 0x01c0,		  "m s,R",   0, SIZE_FIELD,
    237    cris_ver_v32p,
    238    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    239 
    240   {"addc",    0x0570, 0x0A80,		  "r,R",     0, SIZE_FIX_32,
    241    cris_ver_v32p,
    242    cris_not_implemented_op},
    243 
    244   {"addc",    0x09A0, 0x0250,		  "s,R",     0, SIZE_FIX_32,
    245    cris_ver_v32p,
    246    cris_not_implemented_op},
    247 
    248   {"addi",    0x0540, 0x0A80,		  "x,r,A",   0, SIZE_NONE,
    249    cris_ver_v32p,
    250    cris_addi_op},
    251 
    252   {"addi",    0x0500, 0x0Ac0,		  "x,r",     0, SIZE_NONE,     0,
    253    cris_addi_op},
    254 
    255   /* This collates after "addo", but we want to disassemble as "addoq",
    256      not "addo".  */
    257   {"addoq",   0x0100, 0x0E00,		  "Q,A",     0, SIZE_NONE,
    258    cris_ver_v32p,
    259    cris_not_implemented_op},
    260 
    261   {"addo",    0x0940, 0x0280,		  "m s,R,A", 0, SIZE_FIELD_SIGNED,
    262    cris_ver_v32p,
    263    cris_not_implemented_op},
    264 
    265   /* This must be located after the insn above, lest we misinterpret
    266      "addo.b -1,r0,acr" as "addo .b-1,r0,acr".  FIXME: Sounds like a
    267      parser bug.  */
    268   {"addo",   0x0100, 0x0E00,		  "O,A",     0, SIZE_NONE,
    269    cris_ver_v32p,
    270    cris_not_implemented_op},
    271 
    272   {"addq",    0x0200, 0x0Dc0,		  "I,R",     0, SIZE_NONE,     0,
    273    cris_quick_mode_add_sub_op},
    274 
    275   {"adds",    0x0420, 0x0Bc0,		  "z r,R",   0, SIZE_NONE,     0,
    276    cris_reg_mode_add_sub_cmp_and_or_move_op},
    277 
    278   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
    279   {"adds",    0x0820, 0x03c0,		  "z s,R",   0, SIZE_FIELD,    0,
    280    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    281 
    282   {"adds",    0x0820, 0x03c0,		  "z S,D",   0, SIZE_NONE,
    283    cris_ver_v0_10,
    284    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    285 
    286   {"adds",    0x0820, 0x07c0,		  "z S,R,r", 0, SIZE_NONE,
    287    cris_ver_v0_10,
    288    cris_three_operand_add_sub_cmp_and_or_op},
    289 
    290   {"addu",    0x0400, 0x0be0,		  "z r,R",   0, SIZE_NONE,     0,
    291    cris_reg_mode_add_sub_cmp_and_or_move_op},
    292 
    293   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
    294   {"addu",    0x0800, 0x03e0,		  "z s,R",   0, SIZE_FIELD,    0,
    295    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    296 
    297   {"addu",    0x0800, 0x03e0,		  "z S,D",   0, SIZE_NONE,
    298    cris_ver_v0_10,
    299    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    300 
    301   {"addu",    0x0800, 0x07e0,		  "z S,R,r", 0, SIZE_NONE,
    302    cris_ver_v0_10,
    303    cris_three_operand_add_sub_cmp_and_or_op},
    304 
    305   {"and",     0x0700, 0x08C0,		  "m r,R",   0, SIZE_NONE,     0,
    306    cris_reg_mode_add_sub_cmp_and_or_move_op},
    307 
    308   {"and",     0x0B00, 0x00C0,		  "m s,R",   0, SIZE_FIELD,    0,
    309    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    310 
    311   {"and",     0x0B00, 0x00C0,		  "m S,D",   0, SIZE_NONE,
    312    cris_ver_v0_10,
    313    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    314 
    315   {"and",     0x0B00, 0x04C0,		  "m S,R,r", 0, SIZE_NONE,
    316    cris_ver_v0_10,
    317    cris_three_operand_add_sub_cmp_and_or_op},
    318 
    319   {"andq",    0x0300, 0x0CC0,		  "i,R",     0, SIZE_NONE,     0,
    320    cris_quick_mode_and_cmp_move_or_op},
    321 
    322   {"asr",     0x0780, 0x0840,		  "m r,R",   0, SIZE_NONE,     0,
    323    cris_asr_op},
    324 
    325   {"asrq",    0x03a0, 0x0c40,		  "c,R",     0, SIZE_NONE,     0,
    326    cris_asrq_op},
    327 
    328   {"ax",      0x15B0, 0xEA4F,		  "",	     0, SIZE_NONE,     0,
    329    cris_ax_ei_setf_op},
    330 
    331   /* FIXME: Should use branch #defines.  */
    332   {"b",	      0x0dff, 0x0200,		  "b",	     1, SIZE_NONE,     0,
    333    cris_sixteen_bit_offset_branch_op},
    334 
    335   {"ba",
    336    BA_QUICK_OPCODE,
    337    0x0F00+(0xF-CC_A)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    338    cris_eight_bit_offset_branch_op},
    339 
    340   /* Needs to come after the usual "ba o", which might be relaxed to
    341      this one.  */
    342   {"ba",     BA_DWORD_OPCODE,
    343    0xffff & (~BA_DWORD_OPCODE),		  "n",	     0, SIZE_FIX_32,
    344    cris_ver_v32p,
    345    cris_none_reg_mode_jump_op},
    346 
    347   {"bas",     0x0EBF, 0x0140,		  "n,P",     0, SIZE_FIX_32,
    348    cris_ver_v32p,
    349    cris_none_reg_mode_jump_op},
    350 
    351   {"basc",     0x0EFF, 0x0100,		  "n,P",     0, SIZE_FIX_32,
    352    cris_ver_v32p,
    353    cris_none_reg_mode_jump_op},
    354 
    355   {"bcc",
    356    BRANCH_QUICK_OPCODE+CC_CC*0x1000,
    357    0x0f00+(0xF-CC_CC)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    358    cris_eight_bit_offset_branch_op},
    359 
    360   {"bcs",
    361    BRANCH_QUICK_OPCODE+CC_CS*0x1000,
    362    0x0f00+(0xF-CC_CS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    363    cris_eight_bit_offset_branch_op},
    364 
    365   {"bdap",
    366    BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS,  "pm s,R",  0, SIZE_FIELD_SIGNED,
    367    cris_ver_v0_10,
    368    cris_bdap_prefix},
    369 
    370   {"bdap",
    371    BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS,  "pO",	     0, SIZE_NONE,
    372    cris_ver_v0_10,
    373    cris_quick_mode_bdap_prefix},
    374 
    375   {"beq",
    376    BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
    377    0x0f00+(0xF-CC_EQ)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    378    cris_eight_bit_offset_branch_op},
    379 
    380   /* This is deliberately put before "bext" to trump it, even though not
    381      in alphabetical order, since we don't do excluding version checks
    382      for v0..v10.  */
    383   {"bwf",
    384    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
    385    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
    386    cris_ver_v10,
    387    cris_eight_bit_offset_branch_op},
    388 
    389   {"bext",
    390    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
    391    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
    392    cris_ver_v0_3,
    393    cris_eight_bit_offset_branch_op},
    394 
    395   {"bge",
    396    BRANCH_QUICK_OPCODE+CC_GE*0x1000,
    397    0x0f00+(0xF-CC_GE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    398    cris_eight_bit_offset_branch_op},
    399 
    400   {"bgt",
    401    BRANCH_QUICK_OPCODE+CC_GT*0x1000,
    402    0x0f00+(0xF-CC_GT)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    403    cris_eight_bit_offset_branch_op},
    404 
    405   {"bhi",
    406    BRANCH_QUICK_OPCODE+CC_HI*0x1000,
    407    0x0f00+(0xF-CC_HI)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    408    cris_eight_bit_offset_branch_op},
    409 
    410   {"bhs",
    411    BRANCH_QUICK_OPCODE+CC_HS*0x1000,
    412    0x0f00+(0xF-CC_HS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    413    cris_eight_bit_offset_branch_op},
    414 
    415   {"biap", BIAP_OPCODE, BIAP_Z_BITS,	  "pm r,R",  0, SIZE_NONE,
    416    cris_ver_v0_10,
    417    cris_biap_prefix},
    418 
    419   {"ble",
    420    BRANCH_QUICK_OPCODE+CC_LE*0x1000,
    421    0x0f00+(0xF-CC_LE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    422    cris_eight_bit_offset_branch_op},
    423 
    424   {"blo",
    425    BRANCH_QUICK_OPCODE+CC_LO*0x1000,
    426    0x0f00+(0xF-CC_LO)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    427    cris_eight_bit_offset_branch_op},
    428 
    429   {"bls",
    430    BRANCH_QUICK_OPCODE+CC_LS*0x1000,
    431    0x0f00+(0xF-CC_LS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    432    cris_eight_bit_offset_branch_op},
    433 
    434   {"blt",
    435    BRANCH_QUICK_OPCODE+CC_LT*0x1000,
    436    0x0f00+(0xF-CC_LT)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    437    cris_eight_bit_offset_branch_op},
    438 
    439   {"bmi",
    440    BRANCH_QUICK_OPCODE+CC_MI*0x1000,
    441    0x0f00+(0xF-CC_MI)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    442    cris_eight_bit_offset_branch_op},
    443 
    444   {"bmod",    0x0ab0, 0x0140,		  "s,R",     0, SIZE_FIX_32,
    445    cris_ver_sim_v0_10,
    446    cris_not_implemented_op},
    447 
    448   {"bmod",    0x0ab0, 0x0140,		  "S,D",     0, SIZE_NONE,
    449    cris_ver_sim_v0_10,
    450    cris_not_implemented_op},
    451 
    452   {"bmod",    0x0ab0, 0x0540,		  "S,R,r",   0, SIZE_NONE,
    453    cris_ver_sim_v0_10,
    454    cris_not_implemented_op},
    455 
    456   {"bne",
    457    BRANCH_QUICK_OPCODE+CC_NE*0x1000,
    458    0x0f00+(0xF-CC_NE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    459    cris_eight_bit_offset_branch_op},
    460 
    461   {"bound",   0x05c0, 0x0A00,		  "m r,R",   0, SIZE_NONE,     0,
    462    cris_two_operand_bound_op},
    463   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
    464   {"bound",   0x09c0, 0x0200,		  "m s,R",   0, SIZE_FIELD,
    465    cris_ver_v0_10,
    466    cris_two_operand_bound_op},
    467   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
    468   {"bound",   0x0dcf, 0x0200,		  "m Y,R",   0, SIZE_FIELD,    0,
    469    cris_two_operand_bound_op},
    470   {"bound",   0x09c0, 0x0200,		  "m S,D",   0, SIZE_NONE,
    471    cris_ver_v0_10,
    472    cris_two_operand_bound_op},
    473   {"bound",   0x09c0, 0x0600,		  "m S,R,r", 0, SIZE_NONE,
    474    cris_ver_v0_10,
    475    cris_three_operand_bound_op},
    476 
    477   {"bpl",
    478    BRANCH_QUICK_OPCODE+CC_PL*0x1000,
    479    0x0f00+(0xF-CC_PL)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    480    cris_eight_bit_offset_branch_op},
    481 
    482   {"break",   0xe930, 0x16c0,		  "C",	     0, SIZE_NONE,
    483    cris_ver_v3p,
    484    cris_break_op},
    485 
    486   {"bsb",
    487    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
    488    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
    489    cris_ver_v32p,
    490    cris_eight_bit_offset_branch_op},
    491 
    492   {"bsr",     0xBEBF, 0x4140,		  "n",	     0, SIZE_FIX_32,
    493    cris_ver_v32p,
    494    cris_none_reg_mode_jump_op},
    495 
    496   {"bsrc",     0xBEFF, 0x4100,		  "n",	     0, SIZE_FIX_32,
    497    cris_ver_v32p,
    498    cris_none_reg_mode_jump_op},
    499 
    500   {"bstore",  0x0af0, 0x0100,		  "s,R",     0, SIZE_FIX_32,
    501    cris_ver_warning,
    502    cris_not_implemented_op},
    503 
    504   {"bstore",  0x0af0, 0x0100,		  "S,D",     0, SIZE_NONE,
    505    cris_ver_warning,
    506    cris_not_implemented_op},
    507 
    508   {"bstore",  0x0af0, 0x0500,		  "S,R,r",   0, SIZE_NONE,
    509    cris_ver_warning,
    510    cris_not_implemented_op},
    511 
    512   {"btst",    0x04F0, 0x0B00,		  "r,R",     0, SIZE_NONE,     0,
    513    cris_btst_nop_op},
    514   {"btstq",   0x0380, 0x0C60,		  "c,R",     0, SIZE_NONE,     0,
    515    cris_btst_nop_op},
    516 
    517   {"bvc",
    518    BRANCH_QUICK_OPCODE+CC_VC*0x1000,
    519    0x0f00+(0xF-CC_VC)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    520    cris_eight_bit_offset_branch_op},
    521 
    522   {"bvs",
    523    BRANCH_QUICK_OPCODE+CC_VS*0x1000,
    524    0x0f00+(0xF-CC_VS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
    525    cris_eight_bit_offset_branch_op},
    526 
    527   {"clear",   0x0670, 0x3980,		  "M r",     0, SIZE_NONE,     0,
    528    cris_reg_mode_clear_op},
    529 
    530   {"clear",   0x0A70, 0x3180,		  "M y",     0, SIZE_NONE,     0,
    531    cris_none_reg_mode_clear_test_op},
    532 
    533   {"clear",   0x0A70, 0x3180,		  "M S",     0, SIZE_NONE,
    534    cris_ver_v0_10,
    535    cris_none_reg_mode_clear_test_op},
    536 
    537   {"clearf",  0x05F0, 0x0A00,		  "f",	     0, SIZE_NONE,     0,
    538    cris_clearf_di_op},
    539 
    540   {"cmp",     0x06C0, 0x0900,		  "m r,R",   0, SIZE_NONE,     0,
    541    cris_reg_mode_add_sub_cmp_and_or_move_op},
    542 
    543   {"cmp",     0x0Ac0, 0x0100,		  "m s,R",   0, SIZE_FIELD,    0,
    544    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    545 
    546   {"cmp",     0x0Ac0, 0x0100,		  "m S,D",   0, SIZE_NONE,
    547    cris_ver_v0_10,
    548    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    549 
    550   {"cmpq",    0x02C0, 0x0D00,		  "i,R",     0, SIZE_NONE,     0,
    551    cris_quick_mode_and_cmp_move_or_op},
    552 
    553   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
    554   {"cmps",    0x08e0, 0x0300,		  "z s,R",   0, SIZE_FIELD,    0,
    555    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    556 
    557   {"cmps",    0x08e0, 0x0300,		  "z S,D",   0, SIZE_NONE,
    558    cris_ver_v0_10,
    559    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    560 
    561   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
    562   {"cmpu",    0x08c0, 0x0320,		  "z s,R" ,  0, SIZE_FIELD,    0,
    563    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    564 
    565   {"cmpu",    0x08c0, 0x0320,		  "z S,D",   0, SIZE_NONE,
    566    cris_ver_v0_10,
    567    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    568 
    569   {"di",      0x25F0, 0xDA0F,		  "",	     0, SIZE_NONE,     0,
    570    cris_clearf_di_op},
    571 
    572   {"dip",     DIP_OPCODE, DIP_Z_BITS,	  "ps",	     0, SIZE_FIX_32,
    573    cris_ver_v0_10,
    574    cris_dip_prefix},
    575 
    576   {"div",     0x0980, 0x0640,		  "m R,r",   0, SIZE_FIELD,    0,
    577    cris_not_implemented_op},
    578 
    579   {"dstep",   0x06f0, 0x0900,		  "r,R",     0, SIZE_NONE,     0,
    580    cris_dstep_logshift_mstep_neg_not_op},
    581 
    582   {"ei",      0x25B0, 0xDA4F,		  "",	     0, SIZE_NONE,     0,
    583    cris_ax_ei_setf_op},
    584 
    585   {"fidxd",    0x0ab0, 0xf540,		  "[r]",     0, SIZE_NONE,
    586    cris_ver_v32p,
    587    cris_not_implemented_op},
    588 
    589   {"fidxi",    0x0d30, 0xF2C0,		  "[r]",     0, SIZE_NONE,
    590    cris_ver_v32p,
    591    cris_not_implemented_op},
    592 
    593   {"ftagd",    0x1AB0, 0xE540,		  "[r]",     0, SIZE_NONE,
    594    cris_ver_v32p,
    595    cris_not_implemented_op},
    596 
    597   {"ftagi",    0x1D30, 0xE2C0,		  "[r]",     0, SIZE_NONE,
    598    cris_ver_v32p,
    599    cris_not_implemented_op},
    600 
    601   {"halt",    0xF930, 0x06CF,		  "",	     0, SIZE_NONE,
    602    cris_ver_v32p,
    603    cris_not_implemented_op},
    604 
    605   {"jas",    0x09B0, 0x0640,		  "r,P",     0, SIZE_NONE,
    606    cris_ver_v32p,
    607    cris_reg_mode_jump_op},
    608 
    609   {"jas",    0x0DBF, 0x0240,		  "N,P",     0, SIZE_FIX_32,
    610    cris_ver_v32p,
    611    cris_reg_mode_jump_op},
    612 
    613   {"jasc",    0x0B30, 0x04C0,		  "r,P",     0, SIZE_NONE,
    614    cris_ver_v32p,
    615    cris_reg_mode_jump_op},
    616 
    617   {"jasc",    0x0F3F, 0x00C0,		  "N,P",     0, SIZE_FIX_32,
    618    cris_ver_v32p,
    619    cris_reg_mode_jump_op},
    620 
    621   {"jbrc",    0x69b0, 0x9640,		  "r",	     0, SIZE_NONE,
    622    cris_ver_v8_10,
    623    cris_reg_mode_jump_op},
    624 
    625   {"jbrc",    0x6930, 0x92c0,		  "s",	     0, SIZE_FIX_32,
    626    cris_ver_v8_10,
    627    cris_none_reg_mode_jump_op},
    628 
    629   {"jbrc",    0x6930, 0x92c0,		  "S",	     0, SIZE_NONE,
    630    cris_ver_v8_10,
    631    cris_none_reg_mode_jump_op},
    632 
    633   {"jir",     0xA9b0, 0x5640,		  "r",	     0, SIZE_NONE,
    634    cris_ver_v8_10,
    635    cris_reg_mode_jump_op},
    636 
    637   {"jir",     0xA930, 0x52c0,		  "s",	     0, SIZE_FIX_32,
    638    cris_ver_v8_10,
    639    cris_none_reg_mode_jump_op},
    640 
    641   {"jir",     0xA930, 0x52c0,		  "S",	     0, SIZE_NONE,
    642    cris_ver_v8_10,
    643    cris_none_reg_mode_jump_op},
    644 
    645   {"jirc",    0x29b0, 0xd640,		  "r",	     0, SIZE_NONE,
    646    cris_ver_v8_10,
    647    cris_reg_mode_jump_op},
    648 
    649   {"jirc",    0x2930, 0xd2c0,		  "s",	     0, SIZE_FIX_32,
    650    cris_ver_v8_10,
    651    cris_none_reg_mode_jump_op},
    652 
    653   {"jirc",    0x2930, 0xd2c0,		  "S",	     0, SIZE_NONE,
    654    cris_ver_v8_10,
    655    cris_none_reg_mode_jump_op},
    656 
    657   {"jsr",     0xB9b0, 0x4640,		  "r",	     0, SIZE_NONE,     0,
    658    cris_reg_mode_jump_op},
    659 
    660   {"jsr",     0xB930, 0x42c0,		  "s",	     0, SIZE_FIX_32,
    661    cris_ver_v0_10,
    662    cris_none_reg_mode_jump_op},
    663 
    664   {"jsr",     0xBDBF, 0x4240,		  "N",	     0, SIZE_FIX_32,
    665    cris_ver_v32p,
    666    cris_none_reg_mode_jump_op},
    667 
    668   {"jsr",     0xB930, 0x42c0,		  "S",	     0, SIZE_NONE,
    669    cris_ver_v0_10,
    670    cris_none_reg_mode_jump_op},
    671 
    672   {"jsrc",    0x39b0, 0xc640,		  "r",	     0, SIZE_NONE,
    673    cris_ver_v8_10,
    674    cris_reg_mode_jump_op},
    675 
    676   {"jsrc",    0x3930, 0xc2c0,		  "s",	     0, SIZE_FIX_32,
    677    cris_ver_v8_10,
    678    cris_none_reg_mode_jump_op},
    679 
    680   {"jsrc",    0x3930, 0xc2c0,		  "S",	     0, SIZE_NONE,
    681    cris_ver_v8_10,
    682    cris_none_reg_mode_jump_op},
    683 
    684   {"jsrc",    0xBB30, 0x44C0,		  "r",       0, SIZE_NONE,
    685    cris_ver_v32p,
    686    cris_reg_mode_jump_op},
    687 
    688   {"jsrc",    0xBF3F, 0x40C0,		  "N",	     0, SIZE_FIX_32,
    689    cris_ver_v32p,
    690    cris_reg_mode_jump_op},
    691 
    692   {"jump",    0x09b0, 0xF640,		  "r",	     0, SIZE_NONE,     0,
    693    cris_reg_mode_jump_op},
    694 
    695   {"jump",
    696    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "s",	     0, SIZE_FIX_32,
    697    cris_ver_v0_10,
    698    cris_none_reg_mode_jump_op},
    699 
    700   {"jump",
    701    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "S",	     0, SIZE_NONE,
    702    cris_ver_v0_10,
    703    cris_none_reg_mode_jump_op},
    704 
    705   {"jump",    0x09F0, 0x060F,		  "P",	     0, SIZE_NONE,
    706    cris_ver_v32p,
    707    cris_none_reg_mode_jump_op},
    708 
    709   {"jump",
    710    JUMP_PC_INCR_OPCODE_V32,
    711    (0xffff & ~JUMP_PC_INCR_OPCODE_V32),	  "N",	     0, SIZE_FIX_32,
    712    cris_ver_v32p,
    713    cris_none_reg_mode_jump_op},
    714 
    715   {"jmpu",    0x8930, 0x72c0,		  "s",	     0, SIZE_FIX_32,
    716    cris_ver_v10,
    717    cris_none_reg_mode_jump_op},
    718 
    719   {"jmpu",    0x8930, 0x72c0,		   "S",	     0, SIZE_NONE,
    720    cris_ver_v10,
    721    cris_none_reg_mode_jump_op},
    722 
    723   {"lapc",    0x0970, 0x0680,		  "U,R",    0, SIZE_NONE,
    724    cris_ver_v32p,
    725    cris_not_implemented_op},
    726 
    727   {"lapc",    0x0D7F, 0x0280,		  "dn,R",    0, SIZE_FIX_32,
    728    cris_ver_v32p,
    729    cris_not_implemented_op},
    730 
    731   {"lapcq",   0x0970, 0x0680,		  "u,R",     0, SIZE_NONE,
    732    cris_ver_v32p,
    733    cris_addi_op},
    734 
    735   {"lsl",     0x04C0, 0x0B00,		  "m r,R",   0, SIZE_NONE,     0,
    736    cris_dstep_logshift_mstep_neg_not_op},
    737 
    738   {"lslq",    0x03c0, 0x0C20,		  "c,R",     0, SIZE_NONE,     0,
    739    cris_dstep_logshift_mstep_neg_not_op},
    740 
    741   {"lsr",     0x07C0, 0x0800,		  "m r,R",   0, SIZE_NONE,     0,
    742    cris_dstep_logshift_mstep_neg_not_op},
    743 
    744   {"lsrq",    0x03e0, 0x0C00,		  "c,R",     0, SIZE_NONE,     0,
    745    cris_dstep_logshift_mstep_neg_not_op},
    746 
    747   {"lz",      0x0730, 0x08C0,		  "r,R",     0, SIZE_NONE,
    748    cris_ver_v3p,
    749    cris_not_implemented_op},
    750 
    751   {"mcp",      0x07f0, 0x0800,		  "P,r",     0, SIZE_NONE,
    752    cris_ver_v32p,
    753    cris_not_implemented_op},
    754 
    755   {"move",    0x0640, 0x0980,		  "m r,R",   0, SIZE_NONE,     0,
    756    cris_reg_mode_add_sub_cmp_and_or_move_op},
    757 
    758   {"move",    0x0A40, 0x0180,		  "m s,R",   0, SIZE_FIELD,    0,
    759    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    760 
    761   {"move",    0x0A40, 0x0180,		  "m S,D",   0, SIZE_NONE,
    762    cris_ver_v0_10,
    763    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    764 
    765   {"move",    0x0630, 0x09c0,		  "r,P",     0, SIZE_NONE,     0,
    766    cris_move_to_preg_op},
    767 
    768   {"move",    0x0670, 0x0980,		  "P,r",     0, SIZE_NONE,     0,
    769    cris_reg_mode_move_from_preg_op},
    770 
    771   {"move",    0x0BC0, 0x0000,		  "m R,y",   0, SIZE_FIELD,    0,
    772    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    773 
    774   {"move",    0x0BC0, 0x0000,		  "m D,S",   0, SIZE_NONE,
    775    cris_ver_v0_10,
    776    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    777 
    778   {"move",
    779    MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
    780    "s,P",   0, SIZE_SPEC_REG, 0,
    781    cris_move_to_preg_op},
    782 
    783   {"move",    0x0A30, 0x01c0,		  "S,P",     0, SIZE_NONE,
    784    cris_ver_v0_10,
    785    cris_move_to_preg_op},
    786 
    787   {"move",    0x0A70, 0x0180,		  "P,y",     0, SIZE_SPEC_REG, 0,
    788    cris_none_reg_mode_move_from_preg_op},
    789 
    790   {"move",    0x0A70, 0x0180,		  "P,S",     0, SIZE_NONE,
    791    cris_ver_v0_10,
    792    cris_none_reg_mode_move_from_preg_op},
    793 
    794   {"move",    0x0B70, 0x0480,		  "r,T",     0, SIZE_NONE,
    795    cris_ver_v32p,
    796    cris_not_implemented_op},
    797 
    798   {"move",    0x0F70, 0x0080,		  "T,r",     0, SIZE_NONE,
    799    cris_ver_v32p,
    800    cris_not_implemented_op},
    801 
    802   {"movem",   0x0BF0, 0x0000,		  "R,y",     0, SIZE_FIX_32,   0,
    803    cris_move_reg_to_mem_movem_op},
    804 
    805   {"movem",   0x0BF0, 0x0000,		  "D,S",     0, SIZE_NONE,
    806    cris_ver_v0_10,
    807    cris_move_reg_to_mem_movem_op},
    808 
    809   {"movem",   0x0BB0, 0x0040,		  "s,R",     0, SIZE_FIX_32,   0,
    810    cris_move_mem_to_reg_movem_op},
    811 
    812   {"movem",   0x0BB0, 0x0040,		  "S,D",     0, SIZE_NONE,
    813    cris_ver_v0_10,
    814    cris_move_mem_to_reg_movem_op},
    815 
    816   {"moveq",   0x0240, 0x0D80,		  "i,R",     0, SIZE_NONE,     0,
    817    cris_quick_mode_and_cmp_move_or_op},
    818 
    819   {"movs",    0x0460, 0x0B80,		  "z r,R",   0, SIZE_NONE,     0,
    820    cris_reg_mode_add_sub_cmp_and_or_move_op},
    821 
    822   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
    823   {"movs",    0x0860, 0x0380,		  "z s,R",   0, SIZE_FIELD,    0,
    824    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    825 
    826   {"movs",    0x0860, 0x0380,		  "z S,D",   0, SIZE_NONE,
    827    cris_ver_v0_10,
    828    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    829 
    830   {"movu",    0x0440, 0x0Ba0,		  "z r,R",   0, SIZE_NONE,     0,
    831    cris_reg_mode_add_sub_cmp_and_or_move_op},
    832 
    833   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
    834   {"movu",    0x0840, 0x03a0,		  "z s,R",   0, SIZE_FIELD,    0,
    835    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    836 
    837   {"movu",    0x0840, 0x03a0,		  "z S,D",   0, SIZE_NONE,
    838    cris_ver_v0_10,
    839    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    840 
    841   {"mstep",   0x07f0, 0x0800,		  "r,R",     0, SIZE_NONE,
    842    cris_ver_v0_10,
    843    cris_dstep_logshift_mstep_neg_not_op},
    844 
    845   {"muls",    0x0d00, 0x02c0,		  "m r,R",   0, SIZE_NONE,
    846    cris_ver_v10p,
    847    cris_muls_op},
    848 
    849   {"mulu",    0x0900, 0x06c0,		  "m r,R",   0, SIZE_NONE,
    850    cris_ver_v10p,
    851    cris_mulu_op},
    852 
    853   {"neg",     0x0580, 0x0A40,		  "m r,R",   0, SIZE_NONE,     0,
    854    cris_dstep_logshift_mstep_neg_not_op},
    855 
    856   {"nop",     NOP_OPCODE, NOP_Z_BITS,	  "",	     0, SIZE_NONE,
    857    cris_ver_v0_10,
    858    cris_btst_nop_op},
    859 
    860   {"nop",     NOP_OPCODE_V32, NOP_Z_BITS_V32, "",    0, SIZE_NONE,
    861    cris_ver_v32p,
    862    cris_btst_nop_op},
    863 
    864   {"not",     0x8770, 0x7880,		  "r",	     0, SIZE_NONE,     0,
    865    cris_dstep_logshift_mstep_neg_not_op},
    866 
    867   {"or",      0x0740, 0x0880,		  "m r,R",   0, SIZE_NONE,     0,
    868    cris_reg_mode_add_sub_cmp_and_or_move_op},
    869 
    870   {"or",      0x0B40, 0x0080,		  "m s,R",   0, SIZE_FIELD,    0,
    871    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    872 
    873   {"or",      0x0B40, 0x0080,		  "m S,D",   0, SIZE_NONE,
    874    cris_ver_v0_10,
    875    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    876 
    877   {"or",      0x0B40, 0x0480,		  "m S,R,r", 0, SIZE_NONE,
    878    cris_ver_v0_10,
    879    cris_three_operand_add_sub_cmp_and_or_op},
    880 
    881   {"orq",     0x0340, 0x0C80,		  "i,R",     0, SIZE_NONE,     0,
    882    cris_quick_mode_and_cmp_move_or_op},
    883 
    884   {"pop",     0x0E6E, 0x0191,		  "!R",	     0, SIZE_NONE,
    885    cris_ver_v0_10,
    886    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    887 
    888   {"pop",     0x0e3e, 0x01c1,		  "!P",	     0, SIZE_NONE,
    889    cris_ver_v0_10,
    890    cris_none_reg_mode_move_from_preg_op},
    891 
    892   {"push",    0x0FEE, 0x0011,		  "BR",	     0, SIZE_NONE,
    893    cris_ver_v0_10,
    894    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
    895 
    896   {"push",    0x0E7E, 0x0181,		  "BP",	     0, SIZE_NONE,
    897    cris_ver_v0_10,
    898    cris_move_to_preg_op},
    899 
    900   {"rbf",     0x3b30, 0xc0c0,		  "y",	     0, SIZE_NONE,
    901    cris_ver_v10,
    902    cris_not_implemented_op},
    903 
    904   {"rbf",     0x3b30, 0xc0c0,		  "S",	     0, SIZE_NONE,
    905    cris_ver_v10,
    906    cris_not_implemented_op},
    907 
    908   {"rfe",     0x2930, 0xD6CF,		  "",	     0, SIZE_NONE,
    909    cris_ver_v32p,
    910    cris_not_implemented_op},
    911 
    912   {"rfg",     0x4930, 0xB6CF,		  "",	     0, SIZE_NONE,
    913    cris_ver_v32p,
    914    cris_not_implemented_op},
    915 
    916   {"rfn",     0x5930, 0xA6CF,		  "",	     0, SIZE_NONE,
    917    cris_ver_v32p,
    918    cris_not_implemented_op},
    919 
    920   {"ret",     0xB67F, 0x4980,		  "",	     1, SIZE_NONE,
    921    cris_ver_v0_10,
    922    cris_reg_mode_move_from_preg_op},
    923 
    924   {"ret",     0xB9F0, 0x460F,		  "",	     1, SIZE_NONE,
    925    cris_ver_v32p,
    926    cris_reg_mode_move_from_preg_op},
    927 
    928   {"retb",    0xe67f, 0x1980,		  "",	     1, SIZE_NONE,
    929    cris_ver_v0_10,
    930    cris_reg_mode_move_from_preg_op},
    931 
    932   {"rete",     0xA9F0, 0x560F,		  "",	     1, SIZE_NONE,
    933    cris_ver_v32p,
    934    cris_reg_mode_move_from_preg_op},
    935 
    936   {"reti",    0xA67F, 0x5980,		  "",	     1, SIZE_NONE,
    937    cris_ver_v0_10,
    938    cris_reg_mode_move_from_preg_op},
    939 
    940   {"retn",     0xC9F0, 0x360F,		  "",	     1, SIZE_NONE,
    941    cris_ver_v32p,
    942    cris_reg_mode_move_from_preg_op},
    943 
    944   {"sbfs",    0x3b70, 0xc080,		  "y",	     0, SIZE_NONE,
    945    cris_ver_v10,
    946    cris_not_implemented_op},
    947 
    948   {"sbfs",    0x3b70, 0xc080,		  "S",	     0, SIZE_NONE,
    949    cris_ver_v10,
    950    cris_not_implemented_op},
    951 
    952   {"sa",
    953    0x0530+CC_A*0x1000,
    954    0x0AC0+(0xf-CC_A)*0x1000,		  "r",	     0, SIZE_NONE,     0,
    955    cris_scc_op},
    956 
    957   {"ssb",
    958    0x0530+CC_EXT*0x1000,
    959    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
    960    cris_ver_v32p,
    961    cris_scc_op},
    962 
    963   {"scc",
    964    0x0530+CC_CC*0x1000,
    965    0x0AC0+(0xf-CC_CC)*0x1000,		  "r",	     0, SIZE_NONE,     0,
    966    cris_scc_op},
    967 
    968   {"scs",
    969    0x0530+CC_CS*0x1000,
    970    0x0AC0+(0xf-CC_CS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
    971    cris_scc_op},
    972 
    973   {"seq",
    974    0x0530+CC_EQ*0x1000,
    975    0x0AC0+(0xf-CC_EQ)*0x1000,		  "r",	     0, SIZE_NONE,     0,
    976    cris_scc_op},
    977 
    978   {"setf",    0x05b0, 0x0A40,		  "f",	     0, SIZE_NONE,     0,
    979    cris_ax_ei_setf_op},
    980 
    981   {"sfe",    0x3930, 0xC6CF,		  "",	     0, SIZE_NONE,
    982    cris_ver_v32p,
    983    cris_not_implemented_op},
    984 
    985   /* Need to have "swf" in front of "sext" so it is the one displayed in
    986      disassembly.  */
    987   {"swf",
    988    0x0530+CC_EXT*0x1000,
    989    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
    990    cris_ver_v10,
    991    cris_scc_op},
    992 
    993   {"sext",
    994    0x0530+CC_EXT*0x1000,
    995    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
    996    cris_ver_v0_3,
    997    cris_scc_op},
    998 
    999   {"sge",
   1000    0x0530+CC_GE*0x1000,
   1001    0x0AC0+(0xf-CC_GE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1002    cris_scc_op},
   1003 
   1004   {"sgt",
   1005    0x0530+CC_GT*0x1000,
   1006    0x0AC0+(0xf-CC_GT)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1007    cris_scc_op},
   1008 
   1009   {"shi",
   1010    0x0530+CC_HI*0x1000,
   1011    0x0AC0+(0xf-CC_HI)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1012    cris_scc_op},
   1013 
   1014   {"shs",
   1015    0x0530+CC_HS*0x1000,
   1016    0x0AC0+(0xf-CC_HS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1017    cris_scc_op},
   1018 
   1019   {"sle",
   1020    0x0530+CC_LE*0x1000,
   1021    0x0AC0+(0xf-CC_LE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1022    cris_scc_op},
   1023 
   1024   {"slo",
   1025    0x0530+CC_LO*0x1000,
   1026    0x0AC0+(0xf-CC_LO)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1027    cris_scc_op},
   1028 
   1029   {"sls",
   1030    0x0530+CC_LS*0x1000,
   1031    0x0AC0+(0xf-CC_LS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1032    cris_scc_op},
   1033 
   1034   {"slt",
   1035    0x0530+CC_LT*0x1000,
   1036    0x0AC0+(0xf-CC_LT)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1037    cris_scc_op},
   1038 
   1039   {"smi",
   1040    0x0530+CC_MI*0x1000,
   1041    0x0AC0+(0xf-CC_MI)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1042    cris_scc_op},
   1043 
   1044   {"sne",
   1045    0x0530+CC_NE*0x1000,
   1046    0x0AC0+(0xf-CC_NE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1047    cris_scc_op},
   1048 
   1049   {"spl",
   1050    0x0530+CC_PL*0x1000,
   1051    0x0AC0+(0xf-CC_PL)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1052    cris_scc_op},
   1053 
   1054   {"sub",     0x0680, 0x0940,		  "m r,R",   0, SIZE_NONE,     0,
   1055    cris_reg_mode_add_sub_cmp_and_or_move_op},
   1056 
   1057   {"sub",     0x0a80, 0x0140,		  "m s,R",   0, SIZE_FIELD,    0,
   1058    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1059 
   1060   {"sub",     0x0a80, 0x0140,		  "m S,D",   0, SIZE_NONE,
   1061    cris_ver_v0_10,
   1062    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1063 
   1064   {"sub",     0x0a80, 0x0540,		  "m S,R,r", 0, SIZE_NONE,
   1065    cris_ver_v0_10,
   1066    cris_three_operand_add_sub_cmp_and_or_op},
   1067 
   1068   {"subq",    0x0280, 0x0d40,		  "I,R",     0, SIZE_NONE,     0,
   1069    cris_quick_mode_add_sub_op},
   1070 
   1071   {"subs",    0x04a0, 0x0b40,		  "z r,R",   0, SIZE_NONE,     0,
   1072    cris_reg_mode_add_sub_cmp_and_or_move_op},
   1073 
   1074   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
   1075   {"subs",    0x08a0, 0x0340,		  "z s,R",   0, SIZE_FIELD,    0,
   1076    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1077 
   1078   {"subs",    0x08a0, 0x0340,		  "z S,D",   0, SIZE_NONE,
   1079    cris_ver_v0_10,
   1080    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1081 
   1082   {"subs",    0x08a0, 0x0740,		  "z S,R,r", 0, SIZE_NONE,
   1083    cris_ver_v0_10,
   1084    cris_three_operand_add_sub_cmp_and_or_op},
   1085 
   1086   {"subu",    0x0480, 0x0b60,		  "z r,R",   0, SIZE_NONE,     0,
   1087    cris_reg_mode_add_sub_cmp_and_or_move_op},
   1088 
   1089   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
   1090   {"subu",    0x0880, 0x0360,		  "z s,R",   0, SIZE_FIELD,    0,
   1091    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1092 
   1093   {"subu",    0x0880, 0x0360,		  "z S,D",   0, SIZE_NONE,
   1094    cris_ver_v0_10,
   1095    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
   1096 
   1097   {"subu",    0x0880, 0x0760,		  "z S,R,r", 0, SIZE_NONE,
   1098    cris_ver_v0_10,
   1099    cris_three_operand_add_sub_cmp_and_or_op},
   1100 
   1101   {"svc",
   1102    0x0530+CC_VC*0x1000,
   1103    0x0AC0+(0xf-CC_VC)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1104    cris_scc_op},
   1105 
   1106   {"svs",
   1107    0x0530+CC_VS*0x1000,
   1108    0x0AC0+(0xf-CC_VS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
   1109    cris_scc_op},
   1110 
   1111   /* The insn "swapn" is the same as "not" and will be disassembled as
   1112      such, but the swap* family of mnmonics are generally v8-and-higher
   1113      only, so count it in.  */
   1114   {"swapn",   0x8770, 0x7880,		  "r",	     0, SIZE_NONE,
   1115    cris_ver_v8p,
   1116    cris_not_implemented_op},
   1117 
   1118   {"swapw",   0x4770, 0xb880,		  "r",	     0, SIZE_NONE,
   1119    cris_ver_v8p,
   1120    cris_not_implemented_op},
   1121 
   1122   {"swapnw",  0xc770, 0x3880,		  "r",	     0, SIZE_NONE,
   1123    cris_ver_v8p,
   1124    cris_not_implemented_op},
   1125 
   1126   {"swapb",   0x2770, 0xd880,		  "r",	     0, SIZE_NONE,
   1127    cris_ver_v8p,
   1128    cris_not_implemented_op},
   1129 
   1130   {"swapnb",  0xA770, 0x5880,		  "r",	     0, SIZE_NONE,
   1131    cris_ver_v8p,
   1132    cris_not_implemented_op},
   1133 
   1134   {"swapwb",  0x6770, 0x9880,		  "r",	     0, SIZE_NONE,
   1135    cris_ver_v8p,
   1136    cris_not_implemented_op},
   1137 
   1138   {"swapnwb", 0xE770, 0x1880,		  "r",	     0, SIZE_NONE,
   1139    cris_ver_v8p,
   1140    cris_not_implemented_op},
   1141 
   1142   {"swapr",   0x1770, 0xe880,		  "r",	     0, SIZE_NONE,
   1143    cris_ver_v8p,
   1144    cris_not_implemented_op},
   1145 
   1146   {"swapnr",  0x9770, 0x6880,		  "r",	     0, SIZE_NONE,
   1147    cris_ver_v8p,
   1148    cris_not_implemented_op},
   1149 
   1150   {"swapwr",  0x5770, 0xa880,		  "r",	     0, SIZE_NONE,
   1151    cris_ver_v8p,
   1152    cris_not_implemented_op},
   1153 
   1154   {"swapnwr", 0xd770, 0x2880,		  "r",	     0, SIZE_NONE,
   1155    cris_ver_v8p,
   1156    cris_not_implemented_op},
   1157 
   1158   {"swapbr",  0x3770, 0xc880,		  "r",	     0, SIZE_NONE,
   1159    cris_ver_v8p,
   1160    cris_not_implemented_op},
   1161 
   1162   {"swapnbr", 0xb770, 0x4880,		  "r",	     0, SIZE_NONE,
   1163    cris_ver_v8p,
   1164    cris_not_implemented_op},
   1165 
   1166   {"swapwbr", 0x7770, 0x8880,		  "r",	     0, SIZE_NONE,
   1167    cris_ver_v8p,
   1168    cris_not_implemented_op},
   1169 
   1170   {"swapnwbr", 0xf770, 0x0880,		  "r",	     0, SIZE_NONE,
   1171    cris_ver_v8p,
   1172    cris_not_implemented_op},
   1173 
   1174   {"test",    0x0640, 0x0980,		  "m D",     0, SIZE_NONE,
   1175    cris_ver_v0_10,
   1176    cris_reg_mode_test_op},
   1177 
   1178   {"test",    0x0b80, 0xf040,		  "m y",     0, SIZE_FIELD,    0,
   1179    cris_none_reg_mode_clear_test_op},
   1180 
   1181   {"test",    0x0b80, 0xf040,		  "m S",     0, SIZE_NONE,
   1182    cris_ver_v0_10,
   1183    cris_none_reg_mode_clear_test_op},
   1184 
   1185   {"xor",     0x07B0, 0x0840,		  "r,R",     0, SIZE_NONE,     0,
   1186    cris_xor_op},
   1187 
   1188   {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
   1189 };
   1190 
   1191 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
   1192 const char * const
   1193 cris_cc_strings[] =
   1194 {
   1195   "hs",
   1196   "lo",
   1197   "ne",
   1198   "eq",
   1199   "vc",
   1200   "vs",
   1201   "pl",
   1202   "mi",
   1203   "ls",
   1204   "hi",
   1205   "ge",
   1206   "lt",
   1207   "gt",
   1208   "le",
   1209   "a",
   1210   /* This is a placeholder.  In v0, this would be "ext".  In v32, this
   1211      is "sb". */
   1212   "wf"
   1213 };
   1214 
   1215 /*
   1216  * Local variables:
   1217  * eval: (c-set-style "gnu")
   1218  * indent-tabs-mode: t
   1219  * End:
   1220  */
   1221 
   1222 
   1223 /* No instruction will be disassembled longer than this.  In theory, and
   1224    in silicon, address prefixes can be cascaded.  In practice, cascading
   1225    is not used by GCC, and not supported by the assembler.  */
   1226 #ifndef MAX_BYTES_PER_CRIS_INSN
   1227 #define MAX_BYTES_PER_CRIS_INSN 8
   1228 #endif
   1229 
   1230 /* Whether or not to decode prefixes, folding it into the following
   1231    instruction.  FIXME: Make this optional later.  */
   1232 #ifndef PARSE_PREFIX
   1233 #define PARSE_PREFIX 1
   1234 #endif
   1235 
   1236 /* Sometimes we prefix all registers with this character.  */
   1237 #define REGISTER_PREFIX_CHAR '$'
   1238 
   1239 /* Whether or not to trace the following sequence:
   1240    sub* X,r%d
   1241    bound* Y,r%d
   1242    adds.w [pc+r%d.w],pc
   1243 
   1244    This is the assembly form of a switch-statement in C.
   1245    The "sub is optional.  If there is none, then X will be zero.
   1246    X is the value of the first case,
   1247    Y is the number of cases (including default).
   1248 
   1249    This results in case offsets printed on the form:
   1250     case N: -> case_address
   1251    where N is an estimation on the corresponding 'case' operand in C,
   1252    and case_address is where execution of that case continues after the
   1253    sequence presented above.
   1254 
   1255    The old style of output was to print the offsets as instructions,
   1256    which made it hard to follow "case"-constructs in the disassembly,
   1257    and caused a lot of annoying warnings about undefined instructions.
   1258 
   1259    FIXME: Make this optional later.  */
   1260 #ifndef TRACE_CASE
   1261 #define TRACE_CASE (disdata->trace_case)
   1262 #endif
   1263 
   1264 enum cris_disass_family
   1265  { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
   1266 
   1267 /* Stored in the disasm_info->private_data member.  */
   1268 struct cris_disasm_data
   1269 {
   1270   /* Whether to print something less confusing if we find something
   1271      matching a switch-construct.  */
   1272   bfd_boolean trace_case;
   1273 
   1274   /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
   1275      that includes "compatible".  */
   1276   enum cris_disass_family distype;
   1277 };
   1278 
   1279 /* Value of first element in switch.  */
   1280 static long case_offset = 0;
   1281 
   1282 /* How many more case-offsets to print.  */
   1283 static long case_offset_counter = 0;
   1284 
   1285 /* Number of case offsets.  */
   1286 static long no_of_case_offsets = 0;
   1287 
   1288 /* Candidate for next case_offset.  */
   1289 static long last_immediate = 0;
   1290 
   1291 static int cris_constraint
   1292   (const char *, unsigned, unsigned, struct cris_disasm_data *);
   1293 
   1294 /* Parse disassembler options and store state in info.  FIXME: For the
   1295    time being, we abuse static variables.  */
   1296 
   1297 static void
   1298 cris_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 
   1310 static const struct cris_spec_reg *
   1311 spec_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 
   1344 static int
   1345 number_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 
   1357 static const struct cris_opcode *
   1358 get_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 
   1557 static int
   1558 cris_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 
   1712 static char *
   1713 format_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 
   1733 static char *
   1734 format_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 
   1744 static char *
   1745 format_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 
   1779 static char *
   1780 format_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 
   1805 static unsigned
   1806 bytes_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 
   1856 static char *
   1857 print_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 
   1883 static void
   1884 print_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 
   2543 static int
   2544 print_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.  */
   2728 static int
   2729 print_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 
   2740 static int
   2741 print_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 
   2755 static int
   2756 print_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 
   2768 static int
   2769 print_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 
   2781 static int
   2782 print_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 
   2795 static int
   2796 print_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 
   2807 int
   2808 print_insn_crisv10 (bfd_vma vma,
   2809 		    disassemble_info *info)
   2810 {
   2811   return print_insn_cris_with_register_prefix(vma, info);
   2812 }
   2813 
   2814 int
   2815 print_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
   2826 disassembler_ftype
   2827 cris_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:  */