qemu/disas/sh4.c
<<
>>
Prefs
   1/* Disassemble SH instructions.
   2   Copyright 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2003, 2004
   3   Free Software Foundation, Inc.
   4
   5   This program is free software; you can redistribute it and/or modify
   6   it under the terms of the GNU General Public License as published by
   7   the Free Software Foundation; either version 2 of the License, or
   8   (at your option) any later version.
   9
  10   This program is distributed in the hope that it will be useful,
  11   but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13   GNU General Public License for more details.
  14
  15   You should have received a copy of the GNU General Public License
  16   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
  17
  18#include "qemu/osdep.h"
  19#include "disas/bfd.h"
  20
  21#define DEFINE_TABLE
  22
  23typedef enum
  24  {
  25    HEX_0,
  26    HEX_1,
  27    HEX_2,
  28    HEX_3,
  29    HEX_4,
  30    HEX_5,
  31    HEX_6,
  32    HEX_7,
  33    HEX_8,
  34    HEX_9,
  35    HEX_A,
  36    HEX_B,
  37    HEX_C,
  38    HEX_D,
  39    HEX_E,
  40    HEX_F,
  41    HEX_XX00,
  42    HEX_00YY,
  43    REG_N,
  44    REG_N_D,     /* nnn0 */
  45    REG_N_B01,   /* nn01 */
  46    REG_M,
  47    SDT_REG_N,
  48    REG_NM,
  49    REG_B,
  50    BRANCH_12,
  51    BRANCH_8,
  52    IMM0_4,
  53    IMM0_4BY2,
  54    IMM0_4BY4,
  55    IMM1_4,
  56    IMM1_4BY2,
  57    IMM1_4BY4,
  58    PCRELIMM_8BY2,
  59    PCRELIMM_8BY4,
  60    IMM0_8,
  61    IMM0_8BY2,
  62    IMM0_8BY4,
  63    IMM1_8,
  64    IMM1_8BY2,
  65    IMM1_8BY4,
  66    PPI,
  67    NOPX,
  68    NOPY,
  69    MOVX,
  70    MOVY,
  71    MOVX_NOPY,
  72    MOVY_NOPX,
  73    PSH,
  74    PMUL,
  75    PPI3,
  76    PPI3NC,
  77    PDC,
  78    PPIC,
  79    REPEAT,
  80    IMM0_3c,    /* xxxx 0iii */
  81    IMM0_3s,    /* xxxx 1iii */
  82    IMM0_3Uc,   /* 0iii xxxx */
  83    IMM0_3Us,   /* 1iii xxxx */
  84    IMM0_20_4,
  85    IMM0_20,    /* follows IMM0_20_4 */
  86    IMM0_20BY8, /* follows IMM0_20_4 */
  87    DISP0_12,
  88    DISP0_12BY2,
  89    DISP0_12BY4,
  90    DISP0_12BY8,
  91    DISP1_12,
  92    DISP1_12BY2,
  93    DISP1_12BY4,
  94    DISP1_12BY8
  95  }
  96sh_nibble_type;
  97
  98typedef enum
  99  {
 100    A_END,
 101    A_BDISP12,
 102    A_BDISP8,
 103    A_DEC_M,
 104    A_DEC_N,
 105    A_DISP_GBR,
 106    A_PC,
 107    A_DISP_PC,
 108    A_DISP_PC_ABS,
 109    A_DISP_REG_M,
 110    A_DISP_REG_N,
 111    A_GBR,
 112    A_IMM,
 113    A_INC_M,
 114    A_INC_N,
 115    A_IND_M,
 116    A_IND_N,
 117    A_IND_R0_REG_M,
 118    A_IND_R0_REG_N,
 119    A_MACH,
 120    A_MACL,
 121    A_PR,
 122    A_R0,
 123    A_R0_GBR,
 124    A_REG_M,
 125    A_REG_N,
 126    A_REG_B,
 127    A_SR,
 128    A_VBR,
 129    A_TBR,
 130    A_DISP_TBR,
 131    A_DISP2_TBR,
 132    A_DEC_R15,
 133    A_INC_R15,
 134    A_MOD,
 135    A_RE,
 136    A_RS,
 137    A_DSR,
 138    DSP_REG_M,
 139    DSP_REG_N,
 140    DSP_REG_X,
 141    DSP_REG_Y,
 142    DSP_REG_E,
 143    DSP_REG_F,
 144    DSP_REG_G,
 145    DSP_REG_A_M,
 146    DSP_REG_AX,
 147    DSP_REG_XY,
 148    DSP_REG_AY,
 149    DSP_REG_YX,
 150    AX_INC_N,
 151    AY_INC_N,
 152    AXY_INC_N,
 153    AYX_INC_N,
 154    AX_IND_N,
 155    AY_IND_N,
 156    AXY_IND_N,
 157    AYX_IND_N,
 158    AX_PMOD_N,
 159    AXY_PMOD_N,
 160    AY_PMOD_N,
 161    AYX_PMOD_N,
 162    AS_DEC_N,
 163    AS_INC_N,
 164    AS_IND_N,
 165    AS_PMOD_N,
 166    A_A0,
 167    A_X0,
 168    A_X1,
 169    A_Y0,
 170    A_Y1,
 171    A_SSR,
 172    A_SPC,
 173    A_SGR,
 174    A_DBR,
 175    F_REG_N,
 176    F_REG_M,
 177    D_REG_N,
 178    D_REG_M,
 179    X_REG_N, /* Only used for argument parsing.  */
 180    X_REG_M, /* Only used for argument parsing.  */
 181    DX_REG_N,
 182    DX_REG_M,
 183    V_REG_N,
 184    V_REG_M,
 185    XMTRX_M4,
 186    F_FR0,
 187    FPUL_N,
 188    FPUL_M,
 189    FPSCR_N,
 190    FPSCR_M
 191  }
 192sh_arg_type;
 193
 194typedef enum
 195  {
 196    A_A1_NUM =   5,
 197    A_A0_NUM =   7,
 198    A_X0_NUM, A_X1_NUM, A_Y0_NUM, A_Y1_NUM,
 199    A_M0_NUM, A_A1G_NUM, A_M1_NUM, A_A0G_NUM
 200  }
 201sh_dsp_reg_nums;
 202
 203#define arch_sh1_base   0x0001
 204#define arch_sh2_base   0x0002
 205#define arch_sh3_base   0x0004
 206#define arch_sh4_base   0x0008
 207#define arch_sh4a_base  0x0010
 208#define arch_sh2a_base  0x0020
 209
 210/* This is an annotation on instruction types, but we abuse the arch
 211   field in instructions to denote it.  */
 212#define arch_op32       0x00100000 /* This is a 32-bit opcode.  */
 213
 214#define arch_sh_no_mmu  0x04000000
 215#define arch_sh_has_mmu 0x08000000
 216#define arch_sh_no_co   0x10000000 /* neither FPU nor DSP co-processor */
 217#define arch_sh_sp_fpu  0x20000000 /* single precision FPU */
 218#define arch_sh_dp_fpu  0x40000000 /* double precision FPU */
 219#define arch_sh_has_dsp 0x80000000
 220
 221
 222#define arch_sh_base_mask 0x0000003f
 223#define arch_opann_mask   0x00100000
 224#define arch_sh_mmu_mask  0x0c000000
 225#define arch_sh_co_mask   0xf0000000
 226
 227
 228#define arch_sh1        (arch_sh1_base|arch_sh_no_mmu|arch_sh_no_co)
 229#define arch_sh2        (arch_sh2_base|arch_sh_no_mmu|arch_sh_no_co)
 230#define arch_sh2a       (arch_sh2a_base|arch_sh_no_mmu|arch_sh_dp_fpu)
 231#define arch_sh2a_nofpu (arch_sh2a_base|arch_sh_no_mmu|arch_sh_no_co)
 232#define arch_sh2e       (arch_sh2_base|arch_sh2a_base|arch_sh_no_mmu|arch_sh_sp_fpu)
 233#define arch_sh_dsp     (arch_sh2_base|arch_sh_no_mmu|arch_sh_has_dsp)
 234#define arch_sh3_nommu  (arch_sh3_base|arch_sh_no_mmu|arch_sh_no_co)
 235#define arch_sh3        (arch_sh3_base|arch_sh_has_mmu|arch_sh_no_co)
 236#define arch_sh3e       (arch_sh3_base|arch_sh_has_mmu|arch_sh_sp_fpu)
 237#define arch_sh3_dsp    (arch_sh3_base|arch_sh_has_mmu|arch_sh_has_dsp)
 238#define arch_sh4        (arch_sh4_base|arch_sh_has_mmu|arch_sh_dp_fpu)
 239#define arch_sh4a       (arch_sh4a_base|arch_sh_has_mmu|arch_sh_dp_fpu)
 240#define arch_sh4al_dsp  (arch_sh4a_base|arch_sh_has_mmu|arch_sh_has_dsp)
 241#define arch_sh4_nofpu  (arch_sh4_base|arch_sh_has_mmu|arch_sh_no_co)
 242#define arch_sh4a_nofpu (arch_sh4a_base|arch_sh_has_mmu|arch_sh_no_co)
 243#define arch_sh4_nommu_nofpu (arch_sh4_base|arch_sh_no_mmu|arch_sh_no_co)
 244
 245#define SH_MERGE_ARCH_SET(SET1, SET2) ((SET1) & (SET2))
 246#define SH_VALID_BASE_ARCH_SET(SET) (((SET) & arch_sh_base_mask) != 0)
 247#define SH_VALID_MMU_ARCH_SET(SET)  (((SET) & arch_sh_mmu_mask) != 0)
 248#define SH_VALID_CO_ARCH_SET(SET)   (((SET) & arch_sh_co_mask) != 0)
 249#define SH_VALID_ARCH_SET(SET) \
 250  (SH_VALID_BASE_ARCH_SET (SET) \
 251   && SH_VALID_MMU_ARCH_SET (SET) \
 252   && SH_VALID_CO_ARCH_SET (SET))
 253#define SH_MERGE_ARCH_SET_VALID(SET1, SET2) \
 254  SH_VALID_ARCH_SET (SH_MERGE_ARCH_SET (SET1, SET2))
 255
 256#define SH_ARCH_SET_HAS_FPU(SET) \
 257  (((SET) & (arch_sh_sp_fpu | arch_sh_dp_fpu)) != 0)
 258#define SH_ARCH_SET_HAS_DSP(SET) \
 259  (((SET) & arch_sh_has_dsp) != 0)
 260
 261/* This is returned from the functions below when an error occurs
 262   (in addition to a call to BFD_FAIL). The value should allow
 263   the tools to continue to function in most cases - there may
 264   be some confusion between DSP and FPU etc.  */
 265#define SH_ARCH_UNKNOWN_ARCH 0xffffffff
 266
 267/* These are defined in bfd/cpu-sh.c .  */
 268unsigned int sh_get_arch_from_bfd_mach (unsigned long mach);
 269unsigned int sh_get_arch_up_from_bfd_mach (unsigned long mach);
 270unsigned long sh_get_bfd_mach_from_arch_set (unsigned int arch_set);
 271/* bfd_boolean sh_merge_bfd_arch (bfd *ibfd, bfd *obfd); */
 272
 273/* Below are the 'architecture sets'.
 274   They describe the following inheritance graph:
 275
 276                SH1
 277                 |
 278                SH2
 279   .------------'|`--------------------.
 280  /              |                      \
 281SH-DSP          SH3-nommu               SH2E
 282 |               |`--------.             |
 283 |               |          \            |
 284 |              SH3     SH4-nommu-nofpu  |
 285 |               |           |           |
 286 | .------------'|`----------+---------. |
 287 |/                         /           \|
 288 |               | .-------'             |
 289 |               |/                      |
 290SH3-dsp         SH4-nofpu               SH3E
 291 |               |`--------------------. |
 292 |               |                      \|
 293 |              SH4A-nofpu              SH4
 294 | .------------' `--------------------. |
 295 |/                                     \|
 296SH4AL-dsp                               SH4A
 297
 298*/
 299
 300/* Central branches */
 301#define arch_sh1_up       (arch_sh1 | arch_sh2_up)
 302#define arch_sh2_up       (arch_sh2 | arch_sh2e_up | arch_sh2a_nofpu_up | arch_sh3_nommu_up | arch_sh_dsp_up)
 303#define arch_sh3_nommu_up (arch_sh3_nommu | arch_sh3_up | arch_sh4_nommu_nofpu_up)
 304#define arch_sh3_up       (arch_sh3 | arch_sh3e_up | arch_sh3_dsp_up | arch_sh4_nofp_up)
 305#define arch_sh4_nommu_nofpu_up (arch_sh4_nommu_nofpu | arch_sh4_nofp_up)
 306#define arch_sh4_nofp_up  (arch_sh4_nofpu | arch_sh4_up | arch_sh4a_nofp_up)
 307#define arch_sh4a_nofp_up (arch_sh4a_nofpu | arch_sh4a_up | arch_sh4al_dsp_up)
 308
 309/* Right branch */
 310#define arch_sh2e_up (arch_sh2e | arch_sh2a_up | arch_sh3e_up)
 311#define arch_sh3e_up (arch_sh3e | arch_sh4_up)
 312#define arch_sh4_up  (arch_sh4 | arch_sh4a_up)
 313#define arch_sh4a_up (arch_sh4a)
 314
 315/* Left branch */
 316#define arch_sh_dsp_up    (arch_sh_dsp | arch_sh3_dsp_up)
 317#define arch_sh3_dsp_up   (arch_sh3_dsp | arch_sh4al_dsp_up)
 318#define arch_sh4al_dsp_up (arch_sh4al_dsp)
 319
 320/* SH 2a branched off SH2e, adding a lot but not all of SH4 and SH4a.  */
 321#define arch_sh2a_up        (arch_sh2a)
 322#define arch_sh2a_nofpu_up  (arch_sh2a_nofpu | arch_sh2a_up)
 323
 324
 325typedef struct
 326{
 327  const char *name;
 328  sh_arg_type arg[4];
 329  sh_nibble_type nibbles[9];
 330  unsigned int arch;
 331} sh_opcode_info;
 332
 333#ifdef DEFINE_TABLE
 334
 335static const sh_opcode_info sh_table[] =
 336  {
 337/* 0111nnnni8*1.... add #<imm>,<REG_N>  */{"add",{A_IMM,A_REG_N},{HEX_7,REG_N,IMM0_8}, arch_sh1_up},
 338
 339/* 0011nnnnmmmm1100 add <REG_M>,<REG_N> */{"add",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_C}, arch_sh1_up},
 340
 341/* 0011nnnnmmmm1110 addc <REG_M>,<REG_N>*/{"addc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_E}, arch_sh1_up},
 342
 343/* 0011nnnnmmmm1111 addv <REG_M>,<REG_N>*/{"addv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_F}, arch_sh1_up},
 344
 345/* 11001001i8*1.... and #<imm>,R0       */{"and",{A_IMM,A_R0},{HEX_C,HEX_9,IMM0_8}, arch_sh1_up},
 346
 347/* 0010nnnnmmmm1001 and <REG_M>,<REG_N> */{"and",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_9}, arch_sh1_up},
 348
 349/* 11001101i8*1.... and.b #<imm>,@(R0,GBR)*/{"and.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_D,IMM0_8}, arch_sh1_up},
 350
 351/* 1010i12......... bra <bdisp12>       */{"bra",{A_BDISP12},{HEX_A,BRANCH_12}, arch_sh1_up},
 352
 353/* 1011i12......... bsr <bdisp12>       */{"bsr",{A_BDISP12},{HEX_B,BRANCH_12}, arch_sh1_up},
 354
 355/* 10001001i8p1.... bt <bdisp8>         */{"bt",{A_BDISP8},{HEX_8,HEX_9,BRANCH_8}, arch_sh1_up},
 356
 357/* 10001011i8p1.... bf <bdisp8>         */{"bf",{A_BDISP8},{HEX_8,HEX_B,BRANCH_8}, arch_sh1_up},
 358
 359/* 10001101i8p1.... bt.s <bdisp8>       */{"bt.s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up},
 360
 361/* 10001101i8p1.... bt/s <bdisp8>       */{"bt/s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up},
 362
 363/* 10001111i8p1.... bf.s <bdisp8>       */{"bf.s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up},
 364
 365/* 10001111i8p1.... bf/s <bdisp8>       */{"bf/s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up},
 366
 367/* 0000000010001000 clrdmxy             */{"clrdmxy",{0},{HEX_0,HEX_0,HEX_8,HEX_8}, arch_sh4al_dsp_up},
 368
 369/* 0000000000101000 clrmac              */{"clrmac",{0},{HEX_0,HEX_0,HEX_2,HEX_8}, arch_sh1_up},
 370
 371/* 0000000001001000 clrs                */{"clrs",{0},{HEX_0,HEX_0,HEX_4,HEX_8}, arch_sh1_up},
 372
 373/* 0000000000001000 clrt                */{"clrt",{0},{HEX_0,HEX_0,HEX_0,HEX_8}, arch_sh1_up},
 374
 375/* 10001000i8*1.... cmp/eq #<imm>,R0    */{"cmp/eq",{A_IMM,A_R0},{HEX_8,HEX_8,IMM0_8}, arch_sh1_up},
 376
 377/* 0011nnnnmmmm0000 cmp/eq <REG_M>,<REG_N>*/{"cmp/eq",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_0}, arch_sh1_up},
 378
 379/* 0011nnnnmmmm0011 cmp/ge <REG_M>,<REG_N>*/{"cmp/ge",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_3}, arch_sh1_up},
 380
 381/* 0011nnnnmmmm0111 cmp/gt <REG_M>,<REG_N>*/{"cmp/gt",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_7}, arch_sh1_up},
 382
 383/* 0011nnnnmmmm0110 cmp/hi <REG_M>,<REG_N>*/{"cmp/hi",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_6}, arch_sh1_up},
 384
 385/* 0011nnnnmmmm0010 cmp/hs <REG_M>,<REG_N>*/{"cmp/hs",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_2}, arch_sh1_up},
 386
 387/* 0100nnnn00010101 cmp/pl <REG_N>      */{"cmp/pl",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_5}, arch_sh1_up},
 388
 389/* 0100nnnn00010001 cmp/pz <REG_N>      */{"cmp/pz",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_1}, arch_sh1_up},
 390
 391/* 0010nnnnmmmm1100 cmp/str <REG_M>,<REG_N>*/{"cmp/str",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_C}, arch_sh1_up},
 392
 393/* 0010nnnnmmmm0111 div0s <REG_M>,<REG_N>*/{"div0s",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_7}, arch_sh1_up},
 394
 395/* 0000000000011001 div0u               */{"div0u",{0},{HEX_0,HEX_0,HEX_1,HEX_9}, arch_sh1_up},
 396
 397/* 0011nnnnmmmm0100 div1 <REG_M>,<REG_N>*/{"div1",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_4}, arch_sh1_up},
 398
 399/* 0110nnnnmmmm1110 exts.b <REG_M>,<REG_N>*/{"exts.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_E}, arch_sh1_up},
 400
 401/* 0110nnnnmmmm1111 exts.w <REG_M>,<REG_N>*/{"exts.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_F}, arch_sh1_up},
 402
 403/* 0110nnnnmmmm1100 extu.b <REG_M>,<REG_N>*/{"extu.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_C}, arch_sh1_up},
 404
 405/* 0110nnnnmmmm1101 extu.w <REG_M>,<REG_N>*/{"extu.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_D}, arch_sh1_up},
 406
 407/* 0000nnnn11100011 icbi @<REG_N>       */{"icbi",{A_IND_N},{HEX_0,REG_N,HEX_E,HEX_3}, arch_sh4a_nofp_up},
 408
 409/* 0100nnnn00101011 jmp @<REG_N>        */{"jmp",{A_IND_N},{HEX_4,REG_N,HEX_2,HEX_B}, arch_sh1_up},
 410
 411/* 0100nnnn00001011 jsr @<REG_N>        */{"jsr",{A_IND_N},{HEX_4,REG_N,HEX_0,HEX_B}, arch_sh1_up},
 412
 413/* 0100nnnn00001110 ldc <REG_N>,SR      */{"ldc",{A_REG_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_E}, arch_sh1_up},
 414
 415/* 0100nnnn00011110 ldc <REG_N>,GBR     */{"ldc",{A_REG_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_E}, arch_sh1_up},
 416
 417/* 0100nnnn00111010 ldc <REG_N>,SGR     */{"ldc",{A_REG_N,A_SGR},{HEX_4,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up},
 418
 419/* 0100mmmm01001010 ldc <REG_M>,TBR     */{"ldc",{A_REG_M,A_TBR},{HEX_4,REG_M,HEX_4,HEX_A}, arch_sh2a_nofpu_up},
 420
 421/* 0100nnnn00101110 ldc <REG_N>,VBR     */{"ldc",{A_REG_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_E}, arch_sh1_up},
 422
 423/* 0100nnnn01011110 ldc <REG_N>,MOD     */{"ldc",{A_REG_N,A_MOD},{HEX_4,REG_N,HEX_5,HEX_E}, arch_sh_dsp_up},
 424
 425/* 0100nnnn01111110 ldc <REG_N>,RE     */{"ldc",{A_REG_N,A_RE},{HEX_4,REG_N,HEX_7,HEX_E}, arch_sh_dsp_up},
 426
 427/* 0100nnnn01101110 ldc <REG_N>,RS     */{"ldc",{A_REG_N,A_RS},{HEX_4,REG_N,HEX_6,HEX_E}, arch_sh_dsp_up},
 428
 429/* 0100nnnn00111110 ldc <REG_N>,SSR     */{"ldc",{A_REG_N,A_SSR},{HEX_4,REG_N,HEX_3,HEX_E}, arch_sh3_nommu_up},
 430
 431/* 0100nnnn01001110 ldc <REG_N>,SPC     */{"ldc",{A_REG_N,A_SPC},{HEX_4,REG_N,HEX_4,HEX_E}, arch_sh3_nommu_up},
 432
 433/* 0100nnnn11111010 ldc <REG_N>,DBR     */{"ldc",{A_REG_N,A_DBR},{HEX_4,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up},
 434
 435/* 0100nnnn1xxx1110 ldc <REG_N>,Rn_BANK */{"ldc",{A_REG_N,A_REG_B},{HEX_4,REG_N,REG_B,HEX_E}, arch_sh3_nommu_up},
 436
 437/* 0100nnnn00000111 ldc.l @<REG_N>+,SR  */{"ldc.l",{A_INC_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_7}, arch_sh1_up},
 438
 439/* 0100nnnn00010111 ldc.l @<REG_N>+,GBR */{"ldc.l",{A_INC_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_7}, arch_sh1_up},
 440
 441/* 0100nnnn00100111 ldc.l @<REG_N>+,VBR */{"ldc.l",{A_INC_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_7}, arch_sh1_up},
 442
 443/* 0100nnnn00110110 ldc.l @<REG_N>+,SGR */{"ldc.l",{A_INC_N,A_SGR},{HEX_4,REG_N,HEX_3,HEX_6}, arch_sh4_nommu_nofpu_up},
 444
 445/* 0100nnnn01010111 ldc.l @<REG_N>+,MOD */{"ldc.l",{A_INC_N,A_MOD},{HEX_4,REG_N,HEX_5,HEX_7}, arch_sh_dsp_up},
 446
 447/* 0100nnnn01110111 ldc.l @<REG_N>+,RE */{"ldc.l",{A_INC_N,A_RE},{HEX_4,REG_N,HEX_7,HEX_7}, arch_sh_dsp_up},
 448
 449/* 0100nnnn01100111 ldc.l @<REG_N>+,RS */{"ldc.l",{A_INC_N,A_RS},{HEX_4,REG_N,HEX_6,HEX_7}, arch_sh_dsp_up},
 450
 451/* 0100nnnn00110111 ldc.l @<REG_N>+,SSR */{"ldc.l",{A_INC_N,A_SSR},{HEX_4,REG_N,HEX_3,HEX_7}, arch_sh3_nommu_up},
 452
 453/* 0100nnnn01000111 ldc.l @<REG_N>+,SPC */{"ldc.l",{A_INC_N,A_SPC},{HEX_4,REG_N,HEX_4,HEX_7}, arch_sh3_nommu_up},
 454
 455/* 0100nnnn11110110 ldc.l @<REG_N>+,DBR */{"ldc.l",{A_INC_N,A_DBR},{HEX_4,REG_N,HEX_F,HEX_6}, arch_sh4_nommu_nofpu_up},
 456
 457/* 0100nnnn1xxx0111 ldc.l <REG_N>,Rn_BANK */{"ldc.l",{A_INC_N,A_REG_B},{HEX_4,REG_N,REG_B,HEX_7}, arch_sh3_nommu_up},
 458
 459/* 0100mmmm00110100 ldrc <REG_M>        */{"ldrc",{A_REG_M},{HEX_4,REG_M,HEX_3,HEX_4}, arch_sh4al_dsp_up},
 460/* 10001010i8*1.... ldrc #<imm>         */{"ldrc",{A_IMM},{HEX_8,HEX_A,IMM0_8}, arch_sh4al_dsp_up},
 461
 462/* 10001110i8p2.... ldre @(<disp>,PC)   */{"ldre",{A_DISP_PC},{HEX_8,HEX_E,PCRELIMM_8BY2}, arch_sh_dsp_up},
 463
 464/* 10001100i8p2.... ldrs @(<disp>,PC)   */{"ldrs",{A_DISP_PC},{HEX_8,HEX_C,PCRELIMM_8BY2}, arch_sh_dsp_up},
 465
 466/* 0100nnnn00001010 lds <REG_N>,MACH    */{"lds",{A_REG_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_A}, arch_sh1_up},
 467
 468/* 0100nnnn00011010 lds <REG_N>,MACL    */{"lds",{A_REG_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_A}, arch_sh1_up},
 469
 470/* 0100nnnn00101010 lds <REG_N>,PR      */{"lds",{A_REG_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_A}, arch_sh1_up},
 471
 472/* 0100nnnn01101010 lds <REG_N>,DSR     */{"lds",{A_REG_N,A_DSR},{HEX_4,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up},
 473
 474/* 0100nnnn01111010 lds <REG_N>,A0      */{"lds",{A_REG_N,A_A0},{HEX_4,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up},
 475
 476/* 0100nnnn10001010 lds <REG_N>,X0      */{"lds",{A_REG_N,A_X0},{HEX_4,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up},
 477
 478/* 0100nnnn10011010 lds <REG_N>,X1      */{"lds",{A_REG_N,A_X1},{HEX_4,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up},
 479
 480/* 0100nnnn10101010 lds <REG_N>,Y0      */{"lds",{A_REG_N,A_Y0},{HEX_4,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up},
 481
 482/* 0100nnnn10111010 lds <REG_N>,Y1      */{"lds",{A_REG_N,A_Y1},{HEX_4,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up},
 483
 484/* 0100nnnn01011010 lds <REG_N>,FPUL    */{"lds",{A_REG_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_A}, arch_sh2e_up},
 485
 486/* 0100nnnn01101010 lds <REG_M>,FPSCR   */{"lds",{A_REG_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_A}, arch_sh2e_up},
 487
 488/* 0100nnnn00000110 lds.l @<REG_N>+,MACH*/{"lds.l",{A_INC_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_6}, arch_sh1_up},
 489
 490/* 0100nnnn00010110 lds.l @<REG_N>+,MACL*/{"lds.l",{A_INC_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_6}, arch_sh1_up},
 491
 492/* 0100nnnn00100110 lds.l @<REG_N>+,PR  */{"lds.l",{A_INC_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_6}, arch_sh1_up},
 493
 494/* 0100nnnn01100110 lds.l @<REG_N>+,DSR */{"lds.l",{A_INC_N,A_DSR},{HEX_4,REG_N,HEX_6,HEX_6}, arch_sh_dsp_up},
 495
 496/* 0100nnnn01110110 lds.l @<REG_N>+,A0  */{"lds.l",{A_INC_N,A_A0},{HEX_4,REG_N,HEX_7,HEX_6}, arch_sh_dsp_up},
 497
 498/* 0100nnnn10000110 lds.l @<REG_N>+,X0  */{"lds.l",{A_INC_N,A_X0},{HEX_4,REG_N,HEX_8,HEX_6}, arch_sh_dsp_up},
 499
 500/* 0100nnnn10010110 lds.l @<REG_N>+,X1  */{"lds.l",{A_INC_N,A_X1},{HEX_4,REG_N,HEX_9,HEX_6}, arch_sh_dsp_up},
 501
 502/* 0100nnnn10100110 lds.l @<REG_N>+,Y0  */{"lds.l",{A_INC_N,A_Y0},{HEX_4,REG_N,HEX_A,HEX_6}, arch_sh_dsp_up},
 503
 504/* 0100nnnn10110110 lds.l @<REG_N>+,Y1  */{"lds.l",{A_INC_N,A_Y1},{HEX_4,REG_N,HEX_B,HEX_6}, arch_sh_dsp_up},
 505
 506/* 0100nnnn01010110 lds.l @<REG_M>+,FPUL*/{"lds.l",{A_INC_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_6}, arch_sh2e_up},
 507
 508/* 0100nnnn01100110 lds.l @<REG_M>+,FPSCR*/{"lds.l",{A_INC_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_6}, arch_sh2e_up},
 509
 510/* 0000000000111000 ldtlb               */{"ldtlb",{0},{HEX_0,HEX_0,HEX_3,HEX_8}, arch_sh3_up},
 511
 512/* 0100nnnnmmmm1111 mac.w @<REG_M>+,@<REG_N>+*/{"mac.w",{A_INC_M,A_INC_N},{HEX_4,REG_N,REG_M,HEX_F}, arch_sh1_up},
 513
 514/* 1110nnnni8*1.... mov #<imm>,<REG_N>  */{"mov",{A_IMM,A_REG_N},{HEX_E,REG_N,IMM0_8}, arch_sh1_up},
 515
 516/* 0110nnnnmmmm0011 mov <REG_M>,<REG_N> */{"mov",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_3}, arch_sh1_up},
 517
 518/* 0000nnnnmmmm0100 mov.b <REG_M>,@(R0,<REG_N>)*/{"mov.b",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_4}, arch_sh1_up},
 519
 520/* 0010nnnnmmmm0100 mov.b <REG_M>,@-<REG_N>*/{"mov.b",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_4}, arch_sh1_up},
 521
 522/* 0010nnnnmmmm0000 mov.b <REG_M>,@<REG_N>*/{"mov.b",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_0}, arch_sh1_up},
 523
 524/* 10000100mmmmi4*1 mov.b @(<disp>,<REG_M>),R0*/{"mov.b",{A_DISP_REG_M,A_R0},{HEX_8,HEX_4,REG_M,IMM0_4}, arch_sh1_up},
 525
 526/* 11000100i8*1.... mov.b @(<disp>,GBR),R0*/{"mov.b",{A_DISP_GBR,A_R0},{HEX_C,HEX_4,IMM0_8}, arch_sh1_up},
 527
 528/* 0000nnnnmmmm1100 mov.b @(R0,<REG_M>),<REG_N>*/{"mov.b",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_C}, arch_sh1_up},
 529
 530/* 0110nnnnmmmm0100 mov.b @<REG_M>+,<REG_N>*/{"mov.b",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_4}, arch_sh1_up},
 531
 532/* 0110nnnnmmmm0000 mov.b @<REG_M>,<REG_N>*/{"mov.b",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_0}, arch_sh1_up},
 533
 534/* 10000000mmmmi4*1 mov.b R0,@(<disp>,<REG_M>)*/{"mov.b",{A_R0,A_DISP_REG_M},{HEX_8,HEX_0,REG_M,IMM1_4}, arch_sh1_up},
 535
 536/* 11000000i8*1.... mov.b R0,@(<disp>,GBR)*/{"mov.b",{A_R0,A_DISP_GBR},{HEX_C,HEX_0,IMM1_8}, arch_sh1_up},
 537
 538/* 0100nnnn10001011 mov.b R0,@<REG_N>+ */{"mov.b",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_8,HEX_B}, arch_sh2a_nofpu_up},
 539/* 0100nnnn11001011 mov.b @-<REG_M>,R0 */{"mov.b",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_C,HEX_B}, arch_sh2a_nofpu_up},
 540/* 0011nnnnmmmm0001 0000dddddddddddd mov.b <REG_M>,@(<DISP12>,<REG_N>) */
 541{"mov.b",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_0,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
 542/* 0011nnnnmmmm0001 0100dddddddddddd mov.b @(<DISP12>,<REG_M>),<REG_N> */
 543{"mov.b",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_4,DISP0_12}, arch_sh2a_nofpu_up | arch_op32},
 544/* 0001nnnnmmmmi4*4 mov.l <REG_M>,@(<disp>,<REG_N>)*/{"mov.l",{ A_REG_M,A_DISP_REG_N},{HEX_1,REG_N,REG_M,IMM1_4BY4}, arch_sh1_up},
 545
 546/* 0000nnnnmmmm0110 mov.l <REG_M>,@(R0,<REG_N>)*/{"mov.l",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_6}, arch_sh1_up},
 547
 548/* 0010nnnnmmmm0110 mov.l <REG_M>,@-<REG_N>*/{"mov.l",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_6}, arch_sh1_up},
 549
 550/* 0010nnnnmmmm0010 mov.l <REG_M>,@<REG_N>*/{"mov.l",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_2}, arch_sh1_up},
 551
 552/* 0101nnnnmmmmi4*4 mov.l @(<disp>,<REG_M>),<REG_N>*/{"mov.l",{A_DISP_REG_M,A_REG_N},{HEX_5,REG_N,REG_M,IMM0_4BY4}, arch_sh1_up},
 553
 554/* 11000110i8*4.... mov.l @(<disp>,GBR),R0*/{"mov.l",{A_DISP_GBR,A_R0},{HEX_C,HEX_6,IMM0_8BY4}, arch_sh1_up},
 555
 556/* 1101nnnni8p4.... mov.l @(<disp>,PC),<REG_N>*/{"mov.l",{A_DISP_PC,A_REG_N},{HEX_D,REG_N,PCRELIMM_8BY4}, arch_sh1_up},
 557
 558/* 0000nnnnmmmm1110 mov.l @(R0,<REG_M>),<REG_N>*/{"mov.l",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_E}, arch_sh1_up},
 559
 560/* 0110nnnnmmmm0110 mov.l @<REG_M>+,<REG_N>*/{"mov.l",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_6}, arch_sh1_up},
 561
 562/* 0110nnnnmmmm0010 mov.l @<REG_M>,<REG_N>*/{"mov.l",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_2}, arch_sh1_up},
 563
 564/* 11000010i8*4.... mov.l R0,@(<disp>,GBR)*/{"mov.l",{A_R0,A_DISP_GBR},{HEX_C,HEX_2,IMM1_8BY4}, arch_sh1_up},
 565
 566/* 0100nnnn10101011 mov.l R0,@<REG_N>+ */{"mov.l",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_A,HEX_B}, arch_sh2a_nofpu_up},
 567/* 0100nnnn11001011 mov.l @-<REG_M>,R0 */{"mov.l",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_B}, arch_sh2a_nofpu_up},
 568/* 0011nnnnmmmm0001 0010dddddddddddd mov.l <REG_M>,@(<DISP12>,<REG_N>) */
 569{"mov.l",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_2,DISP1_12BY4}, arch_sh2a_nofpu_up | arch_op32},
 570/* 0011nnnnmmmm0001 0110dddddddddddd mov.l @(<DISP12>,<REG_M>),<REG_N> */
 571{"mov.l",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_6,DISP0_12BY4}, arch_sh2a_nofpu_up | arch_op32},
 572/* 0000nnnnmmmm0101 mov.w <REG_M>,@(R0,<REG_N>)*/{"mov.w",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_5}, arch_sh1_up},
 573
 574/* 0010nnnnmmmm0101 mov.w <REG_M>,@-<REG_N>*/{"mov.w",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_5}, arch_sh1_up},
 575
 576/* 0010nnnnmmmm0001 mov.w <REG_M>,@<REG_N>*/{"mov.w",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_1}, arch_sh1_up},
 577
 578/* 10000101mmmmi4*2 mov.w @(<disp>,<REG_M>),R0*/{"mov.w",{A_DISP_REG_M,A_R0},{HEX_8,HEX_5,REG_M,IMM0_4BY2}, arch_sh1_up},
 579
 580/* 11000101i8*2.... mov.w @(<disp>,GBR),R0*/{"mov.w",{A_DISP_GBR,A_R0},{HEX_C,HEX_5,IMM0_8BY2}, arch_sh1_up},
 581
 582/* 1001nnnni8p2.... mov.w @(<disp>,PC),<REG_N>*/{"mov.w",{A_DISP_PC,A_REG_N},{HEX_9,REG_N,PCRELIMM_8BY2}, arch_sh1_up},
 583
 584/* 0000nnnnmmmm1101 mov.w @(R0,<REG_M>),<REG_N>*/{"mov.w",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_D}, arch_sh1_up},
 585
 586/* 0110nnnnmmmm0101 mov.w @<REG_M>+,<REG_N>*/{"mov.w",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_5}, arch_sh1_up},
 587
 588/* 0110nnnnmmmm0001 mov.w @<REG_M>,<REG_N>*/{"mov.w",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_1}, arch_sh1_up},
 589
 590/* 10000001mmmmi4*2 mov.w R0,@(<disp>,<REG_M>)*/{"mov.w",{A_R0,A_DISP_REG_M},{HEX_8,HEX_1,REG_M,IMM1_4BY2}, arch_sh1_up},
 591
 592/* 11000001i8*2.... mov.w R0,@(<disp>,GBR)*/{"mov.w",{A_R0,A_DISP_GBR},{HEX_C,HEX_1,IMM1_8BY2}, arch_sh1_up},
 593
 594/* 0100nnnn10011011 mov.w R0,@<REG_N>+ */{"mov.w",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_9,HEX_B}, arch_sh2a_nofpu_up},
 595/* 0100nnnn11011011 mov.w @-<REG_M>,R0 */{"mov.w",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_D,HEX_B}, arch_sh2a_nofpu_up},
 596/* 0011nnnnmmmm0001 0001dddddddddddd mov.w <REG_M>,@(<DISP12>,<REG_N>) */
 597{"mov.w",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_1,DISP1_12BY2}, arch_sh2a_nofpu_up | arch_op32},
 598/* 0011nnnnmmmm0001 0101dddddddddddd mov.w @(<DISP12>,<REG_M>),<REG_N> */
 599{"mov.w",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_5,DISP0_12BY2}, arch_sh2a_nofpu_up | arch_op32},
 600/* 11000111i8p4.... mova @(<disp>,PC),R0*/{"mova",{A_DISP_PC,A_R0},{HEX_C,HEX_7,PCRELIMM_8BY4}, arch_sh1_up},
 601/* 0000nnnn11000011 movca.l R0,@<REG_N> */{"movca.l",{A_R0,A_IND_N},{HEX_0,REG_N,HEX_C,HEX_3}, arch_sh4_nommu_nofpu_up},
 602
 603/* 0000nnnn01110011 movco.l r0,@<REG_N> */{"movco.l",{A_R0,A_IND_N},{HEX_0,REG_N,HEX_7,HEX_3}, arch_sh4a_nofp_up},
 604/* 0000mmmm01100011 movli.l @<REG_M>,r0 */{"movli.l",{A_IND_M,A_R0},{HEX_0,REG_M,HEX_6,HEX_3}, arch_sh4a_nofp_up},
 605
 606/* 0000nnnn00101001 movt <REG_N>        */{"movt",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_9}, arch_sh1_up},
 607
 608/* 0100mmmm10101001 movua.l @<REG_M>,r0 */{"movua.l",{A_IND_M,A_R0},{HEX_4,REG_M,HEX_A,HEX_9}, arch_sh4a_nofp_up},
 609/* 0100mmmm11101001 movua.l @<REG_M>+,r0 */{"movua.l",{A_INC_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_9}, arch_sh4a_nofp_up},
 610
 611/* 0010nnnnmmmm1111 muls.w <REG_M>,<REG_N>*/{"muls.w",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_F}, arch_sh1_up},
 612/* 0010nnnnmmmm1111 muls <REG_M>,<REG_N>*/{"muls",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_F}, arch_sh1_up},
 613
 614/* 0000nnnnmmmm0111 mul.l <REG_M>,<REG_N>*/{"mul.l",{ A_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_7}, arch_sh2_up},
 615
 616/* 0010nnnnmmmm1110 mulu.w <REG_M>,<REG_N>*/{"mulu.w",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_E}, arch_sh1_up},
 617/* 0010nnnnmmmm1110 mulu <REG_M>,<REG_N>*/{"mulu",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_E}, arch_sh1_up},
 618
 619/* 0110nnnnmmmm1011 neg <REG_M>,<REG_N> */{"neg",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_B}, arch_sh1_up},
 620
 621/* 0110nnnnmmmm1010 negc <REG_M>,<REG_N>*/{"negc",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_A}, arch_sh1_up},
 622
 623/* 0000000000001001 nop                 */{"nop",{0},{HEX_0,HEX_0,HEX_0,HEX_9}, arch_sh1_up},
 624
 625/* 0110nnnnmmmm0111 not <REG_M>,<REG_N> */{"not",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_7}, arch_sh1_up},
 626/* 0000nnnn10010011 ocbi @<REG_N>       */{"ocbi",{A_IND_N},{HEX_0,REG_N,HEX_9,HEX_3}, arch_sh4_nommu_nofpu_up},
 627
 628/* 0000nnnn10100011 ocbp @<REG_N>       */{"ocbp",{A_IND_N},{HEX_0,REG_N,HEX_A,HEX_3}, arch_sh4_nommu_nofpu_up},
 629
 630/* 0000nnnn10110011 ocbwb @<REG_N>      */{"ocbwb",{A_IND_N},{HEX_0,REG_N,HEX_B,HEX_3}, arch_sh4_nommu_nofpu_up},
 631
 632
 633/* 11001011i8*1.... or #<imm>,R0        */{"or",{A_IMM,A_R0},{HEX_C,HEX_B,IMM0_8}, arch_sh1_up},
 634
 635/* 0010nnnnmmmm1011 or <REG_M>,<REG_N>  */{"or",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_B}, arch_sh1_up},
 636
 637/* 11001111i8*1.... or.b #<imm>,@(R0,GBR)*/{"or.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_F,IMM0_8}, arch_sh1_up},
 638
 639/* 0000nnnn10000011 pref @<REG_N>       */{"pref",{A_IND_N},{HEX_0,REG_N,HEX_8,HEX_3}, arch_sh4_nommu_nofpu_up | arch_sh2a_nofpu_up},
 640
 641/* 0000nnnn11010011 prefi @<REG_N>      */{"prefi",{A_IND_N},{HEX_0,REG_N,HEX_D,HEX_3}, arch_sh4a_nofp_up},
 642
 643/* 0100nnnn00100100 rotcl <REG_N>       */{"rotcl",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_4}, arch_sh1_up},
 644
 645/* 0100nnnn00100101 rotcr <REG_N>       */{"rotcr",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_5}, arch_sh1_up},
 646
 647/* 0100nnnn00000100 rotl <REG_N>        */{"rotl",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_4}, arch_sh1_up},
 648
 649/* 0100nnnn00000101 rotr <REG_N>        */{"rotr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_5}, arch_sh1_up},
 650
 651/* 0000000000101011 rte                 */{"rte",{0},{HEX_0,HEX_0,HEX_2,HEX_B}, arch_sh1_up},
 652
 653/* 0000000000001011 rts                 */{"rts",{0},{HEX_0,HEX_0,HEX_0,HEX_B}, arch_sh1_up},
 654
 655/* 0000000010011000 setdmx              */{"setdmx",{0},{HEX_0,HEX_0,HEX_9,HEX_8}, arch_sh4al_dsp_up},
 656/* 0000000011001000 setdmy              */{"setdmy",{0},{HEX_0,HEX_0,HEX_C,HEX_8}, arch_sh4al_dsp_up},
 657
 658/* 0000000001011000 sets                */{"sets",{0},{HEX_0,HEX_0,HEX_5,HEX_8}, arch_sh1_up},
 659/* 0000000000011000 sett                */{"sett",{0},{HEX_0,HEX_0,HEX_1,HEX_8}, arch_sh1_up},
 660
 661/* 0100nnnn00010100 setrc <REG_N>       */{"setrc",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_4}, arch_sh_dsp_up},
 662
 663/* 10000010i8*1.... setrc #<imm>        */{"setrc",{A_IMM},{HEX_8,HEX_2,IMM0_8}, arch_sh_dsp_up},
 664
 665/* repeat start end <REG_N>             */{"repeat",{A_DISP_PC,A_DISP_PC,A_REG_N},{REPEAT,REG_N,HEX_1,HEX_4}, arch_sh_dsp_up},
 666
 667/* repeat start end #<imm>              */{"repeat",{A_DISP_PC,A_DISP_PC,A_IMM},{REPEAT,HEX_2,IMM0_8,HEX_8}, arch_sh_dsp_up},
 668
 669/* 0100nnnnmmmm1100 shad <REG_M>,<REG_N>*/{"shad",{ A_REG_M,A_REG_N},{HEX_4,REG_N,REG_M,HEX_C}, arch_sh3_nommu_up | arch_sh2a_nofpu_up},
 670
 671/* 0100nnnnmmmm1101 shld <REG_M>,<REG_N>*/{"shld",{ A_REG_M,A_REG_N},{HEX_4,REG_N,REG_M,HEX_D}, arch_sh3_nommu_up | arch_sh2a_nofpu_up},
 672
 673/* 0100nnnn00100000 shal <REG_N>        */{"shal",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_0}, arch_sh1_up},
 674
 675/* 0100nnnn00100001 shar <REG_N>        */{"shar",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_1}, arch_sh1_up},
 676
 677/* 0100nnnn00000000 shll <REG_N>        */{"shll",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_0}, arch_sh1_up},
 678
 679/* 0100nnnn00101000 shll16 <REG_N>      */{"shll16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_8}, arch_sh1_up},
 680
 681/* 0100nnnn00001000 shll2 <REG_N>       */{"shll2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_8}, arch_sh1_up},
 682
 683/* 0100nnnn00011000 shll8 <REG_N>       */{"shll8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_8}, arch_sh1_up},
 684
 685/* 0100nnnn00000001 shlr <REG_N>        */{"shlr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_1}, arch_sh1_up},
 686
 687/* 0100nnnn00101001 shlr16 <REG_N>      */{"shlr16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_9}, arch_sh1_up},
 688
 689/* 0100nnnn00001001 shlr2 <REG_N>       */{"shlr2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_9}, arch_sh1_up},
 690
 691/* 0100nnnn00011001 shlr8 <REG_N>       */{"shlr8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_9}, arch_sh1_up},
 692
 693/* 0000000000011011 sleep               */{"sleep",{0},{HEX_0,HEX_0,HEX_1,HEX_B}, arch_sh1_up},
 694
 695/* 0000nnnn00000010 stc SR,<REG_N>      */{"stc",{A_SR,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_2}, arch_sh1_up},
 696
 697/* 0000nnnn00010010 stc GBR,<REG_N>     */{"stc",{A_GBR,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_2}, arch_sh1_up},
 698
 699/* 0000nnnn00100010 stc VBR,<REG_N>     */{"stc",{A_VBR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_2}, arch_sh1_up},
 700
 701/* 0000nnnn01010010 stc MOD,<REG_N>     */{"stc",{A_MOD,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_2}, arch_sh_dsp_up},
 702
 703/* 0000nnnn01110010 stc RE,<REG_N>     */{"stc",{A_RE,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_2}, arch_sh_dsp_up},
 704
 705/* 0000nnnn01100010 stc RS,<REG_N>     */{"stc",{A_RS,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_2}, arch_sh_dsp_up},
 706
 707/* 0000nnnn00110010 stc SSR,<REG_N>     */{"stc",{A_SSR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_2}, arch_sh3_nommu_up},
 708
 709/* 0000nnnn01000010 stc SPC,<REG_N>     */{"stc",{A_SPC,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_2}, arch_sh3_nommu_up},
 710
 711/* 0000nnnn00111010 stc SGR,<REG_N>     */{"stc",{A_SGR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up},
 712
 713/* 0000nnnn11111010 stc DBR,<REG_N>     */{"stc",{A_DBR,A_REG_N},{HEX_0,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up},
 714
 715/* 0000nnnn1xxx0010 stc Rn_BANK,<REG_N> */{"stc",{A_REG_B,A_REG_N},{HEX_0,REG_N,REG_B,HEX_2}, arch_sh3_nommu_up},
 716
 717/* 0000nnnn01001010 stc TBR,<REG_N> */ {"stc",{A_TBR,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_A}, arch_sh2a_nofpu_up},
 718
 719/* 0100nnnn00000011 stc.l SR,@-<REG_N>  */{"stc.l",{A_SR,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_3}, arch_sh1_up},
 720
 721/* 0100nnnn00100011 stc.l VBR,@-<REG_N> */{"stc.l",{A_VBR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_3}, arch_sh1_up},
 722
 723/* 0100nnnn01010011 stc.l MOD,@-<REG_N> */{"stc.l",{A_MOD,A_DEC_N},{HEX_4,REG_N,HEX_5,HEX_3}, arch_sh_dsp_up},
 724
 725/* 0100nnnn01110011 stc.l RE,@-<REG_N>  */{"stc.l",{A_RE,A_DEC_N},{HEX_4,REG_N,HEX_7,HEX_3}, arch_sh_dsp_up},
 726
 727/* 0100nnnn01100011 stc.l RS,@-<REG_N>  */{"stc.l",{A_RS,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_3}, arch_sh_dsp_up},
 728
 729/* 0100nnnn00110011 stc.l SSR,@-<REG_N> */{"stc.l",{A_SSR,A_DEC_N},{HEX_4,REG_N,HEX_3,HEX_3}, arch_sh3_nommu_up},
 730
 731/* 0100nnnn01000011 stc.l SPC,@-<REG_N> */{"stc.l",{A_SPC,A_DEC_N},{HEX_4,REG_N,HEX_4,HEX_3}, arch_sh3_nommu_up},
 732
 733/* 0100nnnn00010011 stc.l GBR,@-<REG_N> */{"stc.l",{A_GBR,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_3}, arch_sh1_up},
 734
 735/* 0100nnnn00110010 stc.l SGR,@-<REG_N> */{"stc.l",{A_SGR,A_DEC_N},{HEX_4,REG_N,HEX_3,HEX_2}, arch_sh4_nommu_nofpu_up},
 736
 737/* 0100nnnn11110010 stc.l DBR,@-<REG_N> */{"stc.l",{A_DBR,A_DEC_N},{HEX_4,REG_N,HEX_F,HEX_2}, arch_sh4_nommu_nofpu_up},
 738
 739/* 0100nnnn1xxx0011 stc.l Rn_BANK,@-<REG_N> */{"stc.l",{A_REG_B,A_DEC_N},{HEX_4,REG_N,REG_B,HEX_3}, arch_sh3_nommu_up},
 740
 741/* 0000nnnn00001010 sts MACH,<REG_N>    */{"sts",{A_MACH,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_A}, arch_sh1_up},
 742
 743/* 0000nnnn00011010 sts MACL,<REG_N>    */{"sts",{A_MACL,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_A}, arch_sh1_up},
 744
 745/* 0000nnnn00101010 sts PR,<REG_N>      */{"sts",{A_PR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_A}, arch_sh1_up},
 746
 747/* 0000nnnn01101010 sts DSR,<REG_N>     */{"sts",{A_DSR,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up},
 748
 749/* 0000nnnn01111010 sts A0,<REG_N>      */{"sts",{A_A0,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up},
 750
 751/* 0000nnnn10001010 sts X0,<REG_N>      */{"sts",{A_X0,A_REG_N},{HEX_0,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up},
 752
 753/* 0000nnnn10011010 sts X1,<REG_N>      */{"sts",{A_X1,A_REG_N},{HEX_0,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up},
 754
 755/* 0000nnnn10101010 sts Y0,<REG_N>      */{"sts",{A_Y0,A_REG_N},{HEX_0,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up},
 756
 757/* 0000nnnn10111010 sts Y1,<REG_N>      */{"sts",{A_Y1,A_REG_N},{HEX_0,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up},
 758
 759/* 0000nnnn01011010 sts FPUL,<REG_N>    */{"sts",{FPUL_M,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_A}, arch_sh2e_up},
 760
 761/* 0000nnnn01101010 sts FPSCR,<REG_N>   */{"sts",{FPSCR_M,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh2e_up},
 762
 763/* 0100nnnn00000010 sts.l MACH,@-<REG_N>*/{"sts.l",{A_MACH,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_2}, arch_sh1_up},
 764
 765/* 0100nnnn00010010 sts.l MACL,@-<REG_N>*/{"sts.l",{A_MACL,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_2}, arch_sh1_up},
 766
 767/* 0100nnnn00100010 sts.l PR,@-<REG_N>  */{"sts.l",{A_PR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_2}, arch_sh1_up},
 768
 769/* 0100nnnn01100110 sts.l DSR,@-<REG_N> */{"sts.l",{A_DSR,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_2}, arch_sh_dsp_up},
 770
 771/* 0100nnnn01110110 sts.l A0,@-<REG_N>  */{"sts.l",{A_A0,A_DEC_N},{HEX_4,REG_N,HEX_7,HEX_2}, arch_sh_dsp_up},
 772
 773/* 0100nnnn10000110 sts.l X0,@-<REG_N>  */{"sts.l",{A_X0,A_DEC_N},{HEX_4,REG_N,HEX_8,HEX_2}, arch_sh_dsp_up},
 774
 775/* 0100nnnn10010110 sts.l X1,@-<REG_N>  */{"sts.l",{A_X1,A_DEC_N},{HEX_4,REG_N,HEX_9,HEX_2}, arch_sh_dsp_up},
 776
 777/* 0100nnnn10100110 sts.l Y0,@-<REG_N>  */{"sts.l",{A_Y0,A_DEC_N},{HEX_4,REG_N,HEX_A,HEX_2}, arch_sh_dsp_up},
 778
 779/* 0100nnnn10110110 sts.l Y1,@-<REG_N>  */{"sts.l",{A_Y1,A_DEC_N},{HEX_4,REG_N,HEX_B,HEX_2}, arch_sh_dsp_up},
 780
 781/* 0100nnnn01010010 sts.l FPUL,@-<REG_N>*/{"sts.l",{FPUL_M,A_DEC_N},{HEX_4,REG_N,HEX_5,HEX_2}, arch_sh2e_up},
 782
 783/* 0100nnnn01100010 sts.l FPSCR,@-<REG_N>*/{"sts.l",{FPSCR_M,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_2}, arch_sh2e_up},
 784
 785/* 0011nnnnmmmm1000 sub <REG_M>,<REG_N> */{"sub",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_8}, arch_sh1_up},
 786
 787/* 0011nnnnmmmm1010 subc <REG_M>,<REG_N>*/{"subc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_A}, arch_sh1_up},
 788
 789/* 0011nnnnmmmm1011 subv <REG_M>,<REG_N>*/{"subv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_B}, arch_sh1_up},
 790
 791/* 0110nnnnmmmm1000 swap.b <REG_M>,<REG_N>*/{"swap.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_8}, arch_sh1_up},
 792
 793/* 0110nnnnmmmm1001 swap.w <REG_M>,<REG_N>*/{"swap.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_9}, arch_sh1_up},
 794
 795/* 0000000010101011 synco               */{"synco",{0},{HEX_0,HEX_0,HEX_A,HEX_B}, arch_sh4a_nofp_up},
 796
 797/* 0100nnnn00011011 tas.b @<REG_N>      */{"tas.b",{A_IND_N},{HEX_4,REG_N,HEX_1,HEX_B}, arch_sh1_up},
 798
 799/* 11000011i8*1.... trapa #<imm>        */{"trapa",{A_IMM},{HEX_C,HEX_3,IMM0_8}, arch_sh1_up},
 800
 801/* 11001000i8*1.... tst #<imm>,R0       */{"tst",{A_IMM,A_R0},{HEX_C,HEX_8,IMM0_8}, arch_sh1_up},
 802
 803/* 0010nnnnmmmm1000 tst <REG_M>,<REG_N> */{"tst",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_8}, arch_sh1_up},
 804
 805/* 11001100i8*1.... tst.b #<imm>,@(R0,GBR)*/{"tst.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_C,IMM0_8}, arch_sh1_up},
 806
 807/* 11001010i8*1.... xor #<imm>,R0       */{"xor",{A_IMM,A_R0},{HEX_C,HEX_A,IMM0_8}, arch_sh1_up},
 808
 809/* 0010nnnnmmmm1010 xor <REG_M>,<REG_N> */{"xor",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_A}, arch_sh1_up},
 810
 811/* 11001110i8*1.... xor.b #<imm>,@(R0,GBR)*/{"xor.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_E,IMM0_8}, arch_sh1_up},
 812
 813/* 0010nnnnmmmm1101 xtrct <REG_M>,<REG_N>*/{"xtrct",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_D}, arch_sh1_up},
 814
 815/* 0000nnnnmmmm0111 mul.l <REG_M>,<REG_N>*/{"mul.l",{ A_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_7}, arch_sh1_up},
 816
 817/* 0100nnnn00010000 dt <REG_N>          */{"dt",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_0}, arch_sh2_up},
 818
 819/* 0011nnnnmmmm1101 dmuls.l <REG_M>,<REG_N>*/{"dmuls.l",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_D}, arch_sh2_up},
 820
 821/* 0011nnnnmmmm0101 dmulu.l <REG_M>,<REG_N>*/{"dmulu.l",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_5}, arch_sh2_up},
 822
 823/* 0000nnnnmmmm1111 mac.l @<REG_M>+,@<REG_N>+*/{"mac.l",{A_INC_M,A_INC_N},{HEX_0,REG_N,REG_M,HEX_F}, arch_sh2_up},
 824
 825/* 0000nnnn00100011 braf <REG_N>       */{"braf",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_3}, arch_sh2_up},
 826
 827/* 0000nnnn00000011 bsrf <REG_N>       */{"bsrf",{A_REG_N},{HEX_0,REG_N,HEX_0,HEX_3}, arch_sh2_up},
 828
 829/* 111101nnmmmm0000 movs.w @-<REG_N>,<DSP_REG_M> */   {"movs.w",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_0}, arch_sh_dsp_up},
 830
 831/* 111101nnmmmm0001 movs.w @<REG_N>,<DSP_REG_M> */    {"movs.w",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_4}, arch_sh_dsp_up},
 832
 833/* 111101nnmmmm0010 movs.w @<REG_N>+,<DSP_REG_M> */   {"movs.w",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_8}, arch_sh_dsp_up},
 834
 835/* 111101nnmmmm0011 movs.w @<REG_N>+r8,<DSP_REG_M> */ {"movs.w",{AS_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_C}, arch_sh_dsp_up},
 836
 837/* 111101nnmmmm0100 movs.w <DSP_REG_M>,@-<REG_N> */   {"movs.w",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_1}, arch_sh_dsp_up},
 838
 839/* 111101nnmmmm0101 movs.w <DSP_REG_M>,@<REG_N> */    {"movs.w",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_5}, arch_sh_dsp_up},
 840
 841/* 111101nnmmmm0110 movs.w <DSP_REG_M>,@<REG_N>+ */   {"movs.w",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_9}, arch_sh_dsp_up},
 842
 843/* 111101nnmmmm0111 movs.w <DSP_REG_M>,@<REG_N>+r8 */ {"movs.w",{DSP_REG_M,AS_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_D}, arch_sh_dsp_up},
 844
 845/* 111101nnmmmm1000 movs.l @-<REG_N>,<DSP_REG_M> */   {"movs.l",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_2}, arch_sh_dsp_up},
 846
 847/* 111101nnmmmm1001 movs.l @<REG_N>,<DSP_REG_M> */    {"movs.l",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_6}, arch_sh_dsp_up},
 848
 849/* 111101nnmmmm1010 movs.l @<REG_N>+,<DSP_REG_M> */   {"movs.l",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_A}, arch_sh_dsp_up},
 850
 851/* 111101nnmmmm1011 movs.l @<REG_N>+r8,<DSP_REG_M> */ {"movs.l",{AS_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_E}, arch_sh_dsp_up},
 852
 853/* 111101nnmmmm1100 movs.l <DSP_REG_M>,@-<REG_N> */   {"movs.l",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_3}, arch_sh_dsp_up},
 854
 855/* 111101nnmmmm1101 movs.l <DSP_REG_M>,@<REG_N> */    {"movs.l",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_7}, arch_sh_dsp_up},
 856
 857/* 111101nnmmmm1110 movs.l <DSP_REG_M>,@<REG_N>+ */   {"movs.l",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_B}, arch_sh_dsp_up},
 858
 859/* 111101nnmmmm1111 movs.l <DSP_REG_M>,@<REG_N>+r8 */ {"movs.l",{DSP_REG_M,AS_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_F}, arch_sh_dsp_up},
 860
 861/* 0*0*0*00** nopx */ {"nopx",{0},{PPI,NOPX}, arch_sh_dsp_up},
 862/* *0*0*0**00 nopy */ {"nopy",{0},{PPI,NOPY}, arch_sh_dsp_up},
 863/* n*m*0*01** movx.w @<REG_N>,<DSP_REG_X> */    {"movx.w",{AX_IND_N,DSP_REG_X},{PPI,MOVX,HEX_1}, arch_sh_dsp_up},
 864/* n*m*0*10** movx.w @<REG_N>+,<DSP_REG_X> */   {"movx.w",{AX_INC_N,DSP_REG_X},{PPI,MOVX,HEX_2}, arch_sh_dsp_up},
 865/* n*m*0*11** movx.w @<REG_N>+r8,<DSP_REG_X> */ {"movx.w",{AX_PMOD_N,DSP_REG_X},{PPI,MOVX,HEX_3}, arch_sh_dsp_up},
 866/* n*m*1*01** movx.w <DSP_REG_M>,@<REG_N> */    {"movx.w",{DSP_REG_A_M,AX_IND_N},{PPI,MOVX,HEX_9}, arch_sh_dsp_up},
 867/* n*m*1*10** movx.w <DSP_REG_M>,@<REG_N>+ */   {"movx.w",{DSP_REG_A_M,AX_INC_N},{PPI,MOVX,HEX_A}, arch_sh_dsp_up},
 868/* n*m*1*11** movx.w <DSP_REG_M>,@<REG_N>+r8 */ {"movx.w",{DSP_REG_A_M,AX_PMOD_N},{PPI,MOVX,HEX_B}, arch_sh_dsp_up},
 869
 870/* nnmm000100 movx.w @<REG_Axy>,<DSP_REG_XY> */ {"movx.w",{AXY_IND_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_4}, arch_sh4al_dsp_up},
 871/* nnmm001000 movx.w @<REG_Axy>+,<DSP_REG_XY> */{"movx.w",{AXY_INC_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_8}, arch_sh4al_dsp_up},
 872/* nnmm001100 movx.w @<REG_Axy>+r8,<DSP_REG_XY> */{"movx.w",{AXY_PMOD_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_C}, arch_sh4al_dsp_up},
 873/* nnmm100100 movx.w <DSP_REG_AX>,@<REG_Axy> */ {"movx.w",{DSP_REG_AX,AXY_IND_N},{PPI,MOVX_NOPY,HEX_2,HEX_4}, arch_sh4al_dsp_up},
 874/* nnmm101000 movx.w <DSP_REG_AX>,@<REG_Axy>+ */{"movx.w",{DSP_REG_AX,AXY_INC_N},{PPI,MOVX_NOPY,HEX_2,HEX_8}, arch_sh4al_dsp_up},
 875/* nnmm101100 movx.w <DSP_REG_AX>,@<REG_Axy>+r8 */{"movx.w",{DSP_REG_AX,AXY_PMOD_N},{PPI,MOVX_NOPY,HEX_2,HEX_C}, arch_sh4al_dsp_up},
 876
 877/* nnmm010100 movx.l @<REG_Axy>,<DSP_REG_XY> */ {"movx.l",{AXY_IND_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_4}, arch_sh4al_dsp_up},
 878/* nnmm011000 movx.l @<REG_Axy>+,<DSP_REG_XY> */{"movx.l",{AXY_INC_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_8}, arch_sh4al_dsp_up},
 879/* nnmm011100 movx.l @<REG_Axy>+r8,<DSP_REG_XY> */{"movx.l",{AXY_PMOD_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_C}, arch_sh4al_dsp_up},
 880/* nnmm110100 movx.l <DSP_REG_AX>,@<REG_Axy> */ {"movx.l",{DSP_REG_AX,AXY_IND_N},{PPI,MOVX_NOPY,HEX_3,HEX_4}, arch_sh4al_dsp_up},
 881/* nnmm111000 movx.l <DSP_REG_AX>,@<REG_Axy>+ */{"movx.l",{DSP_REG_AX,AXY_INC_N},{PPI,MOVX_NOPY,HEX_3,HEX_8}, arch_sh4al_dsp_up},
 882/* nnmm111100 movx.l <DSP_REG_AX>,@<REG_Axy>+r8 */{"movx.l",{DSP_REG_AX,AXY_PMOD_N},{PPI,MOVX_NOPY,HEX_3,HEX_C}, arch_sh4al_dsp_up},
 883
 884/* *n*m*0**01 movy.w @<REG_N>,<DSP_REG_Y> */    {"movy.w",{AY_IND_N,DSP_REG_Y},{PPI,MOVY,HEX_1}, arch_sh_dsp_up},
 885/* *n*m*0**10 movy.w @<REG_N>+,<DSP_REG_Y> */   {"movy.w",{AY_INC_N,DSP_REG_Y},{PPI,MOVY,HEX_2}, arch_sh_dsp_up},
 886/* *n*m*0**11 movy.w @<REG_N>+r9,<DSP_REG_Y> */ {"movy.w",{AY_PMOD_N,DSP_REG_Y},{PPI,MOVY,HEX_3}, arch_sh_dsp_up},
 887/* *n*m*1**01 movy.w <DSP_REG_M>,@<REG_N> */    {"movy.w",{DSP_REG_A_M,AY_IND_N},{PPI,MOVY,HEX_9}, arch_sh_dsp_up},
 888/* *n*m*1**10 movy.w <DSP_REG_M>,@<REG_N>+ */   {"movy.w",{DSP_REG_A_M,AY_INC_N},{PPI,MOVY,HEX_A}, arch_sh_dsp_up},
 889/* *n*m*1**11 movy.w <DSP_REG_M>,@<REG_N>+r9 */ {"movy.w",{DSP_REG_A_M,AY_PMOD_N},{PPI,MOVY,HEX_B}, arch_sh_dsp_up},
 890
 891/* nnmm000001 movy.w @<REG_Ayx>,<DSP_REG_YX> */ {"movy.w",{AYX_IND_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_1}, arch_sh4al_dsp_up},
 892/* nnmm000010 movy.w @<REG_Ayx>+,<DSP_REG_YX> */{"movy.w",{AYX_INC_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_2}, arch_sh4al_dsp_up},
 893/* nnmm000011 movy.w @<REG_Ayx>+r8,<DSP_REG_YX> */{"movy.w",{AYX_PMOD_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_3}, arch_sh4al_dsp_up},
 894/* nnmm010001 movy.w <DSP_REG_AY>,@<REG_Ayx> */ {"movy.w",{DSP_REG_AY,AYX_IND_N},{PPI,MOVY_NOPX,HEX_1,HEX_1}, arch_sh4al_dsp_up},
 895/* nnmm010010 movy.w <DSP_REG_AY>,@<REG_Ayx>+ */{"movy.w",{DSP_REG_AY,AYX_INC_N},{PPI,MOVY_NOPX,HEX_1,HEX_2}, arch_sh4al_dsp_up},
 896/* nnmm010011 movy.w <DSP_REG_AY>,@<REG_Ayx>+r8 */{"movy.w",{DSP_REG_AY,AYX_PMOD_N},{PPI,MOVY_NOPX,HEX_1,HEX_3}, arch_sh4al_dsp_up},
 897
 898/* nnmm100001 movy.l @<REG_Ayx>,<DSP_REG_YX> */ {"movy.l",{AYX_IND_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_1}, arch_sh4al_dsp_up},
 899/* nnmm100010 movy.l @<REG_Ayx>+,<DSP_REG_YX> */{"movy.l",{AYX_INC_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_2}, arch_sh4al_dsp_up},
 900/* nnmm100011 movy.l @<REG_Ayx>+r8,<DSP_REG_YX> */{"movy.l",{AYX_PMOD_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_3}, arch_sh4al_dsp_up},
 901/* nnmm110001 movy.l <DSP_REG_AY>,@<REG_Ayx> */ {"movy.l",{DSP_REG_AY,AYX_IND_N},{PPI,MOVY_NOPX,HEX_3,HEX_1}, arch_sh4al_dsp_up},
 902/* nnmm110010 movy.l <DSP_REG_AY>,@<REG_Ayx>+ */{"movy.l",{DSP_REG_AY,AYX_INC_N},{PPI,MOVY_NOPX,HEX_3,HEX_2}, arch_sh4al_dsp_up},
 903/* nnmm110011 movy.l <DSP_REG_AY>,@<REG_Ayx>+r8 */{"movy.l",{DSP_REG_AY,AYX_PMOD_N},{PPI,MOVY_NOPX,HEX_3,HEX_3}, arch_sh4al_dsp_up},
 904
 905/* 01aaeeffxxyyggnn pmuls Se,Sf,Dg */ {"pmuls",{DSP_REG_E,DSP_REG_F,DSP_REG_G},{PPI,PMUL}, arch_sh_dsp_up},
 906/* 10100000xxyynnnn psubc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 907{"psubc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_0}, arch_sh_dsp_up},
 908/* 10110000xxyynnnn paddc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 909{"paddc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_0}, arch_sh_dsp_up},
 910/* 10000100xxyynnnn pcmp <DSP_REG_X>,<DSP_REG_Y> */
 911{"pcmp", {DSP_REG_X,DSP_REG_Y},{PPI,PPI3,HEX_8,HEX_4}, arch_sh_dsp_up},
 912/* 10100100xxyynnnn pwsb <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 913{"pwsb", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_4}, arch_sh_dsp_up},
 914/* 10110100xxyynnnn pwad <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 915{"pwad", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_4}, arch_sh_dsp_up},
 916/* 10001000xxyynnnn pabs <DSP_REG_X>,<DSP_REG_N> */
 917{"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_8,HEX_8}, arch_sh_dsp_up},
 918/* 1000100!xx01nnnn pabs <DSP_REG_X>,<DSP_REG_N> */
 919{"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9,HEX_1}, arch_sh4al_dsp_up},
 920/* 10101000xxyynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */
 921{"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_A,HEX_8}, arch_sh_dsp_up},
 922/* 1010100!01yynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */
 923{"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9,HEX_4}, arch_sh4al_dsp_up},
 924/* 10011000xxyynnnn prnd <DSP_REG_X>,<DSP_REG_N> */
 925{"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_9,HEX_8}, arch_sh_dsp_up},
 926/* 1001100!xx01nnnn prnd <DSP_REG_X>,<DSP_REG_N> */
 927{"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_1}, arch_sh4al_dsp_up},
 928/* 10111000xxyynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */
 929{"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_B,HEX_8}, arch_sh_dsp_up},
 930/* 1011100!01yynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */
 931{"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_4}, arch_sh4al_dsp_up},
 932
 933{"dct",{0},{PPI,PDC,HEX_1}, arch_sh_dsp_up},
 934{"dcf",{0},{PPI,PDC,HEX_2}, arch_sh_dsp_up},
 935
 936/* 10000001xxyynnnn pshl <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 937{"pshl", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_1}, arch_sh_dsp_up},
 938/* 00000iiiiiiinnnn pshl #<imm>,<DSP_REG_N> */ {"pshl",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_0}, arch_sh_dsp_up},
 939/* 10010001xxyynnnn psha <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 940{"psha", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_1}, arch_sh_dsp_up},
 941/* 00010iiiiiiinnnn psha #<imm>,<DSP_REG_N> */ {"psha",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_1}, arch_sh_dsp_up},
 942/* 10100001xxyynnnn psub <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 943{"psub", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_1}, arch_sh_dsp_up},
 944/* 10000101xxyynnnn psub <DSP_REG_Y>,<DSP_REG_X>,<DSP_REG_N> */
 945{"psub", {DSP_REG_Y,DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_5}, arch_sh4al_dsp_up},
 946/* 10110001xxyynnnn padd <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 947{"padd", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_1}, arch_sh_dsp_up},
 948/* 10010101xxyynnnn pand <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 949{"pand", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_5}, arch_sh_dsp_up},
 950/* 10100101xxyynnnn pxor <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 951{"pxor", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_5}, arch_sh_dsp_up},
 952/* 10110101xxyynnnn por  <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
 953{"por",  {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_5}, arch_sh_dsp_up},
 954/* 10001001xxyynnnn pdec <DSP_REG_X>,<DSP_REG_N> */
 955{"pdec", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9}, arch_sh_dsp_up},
 956/* 10101001xxyynnnn pdec <DSP_REG_Y>,<DSP_REG_N> */
 957{"pdec", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9}, arch_sh_dsp_up},
 958/* 10011001xx00nnnn pinc <DSP_REG_X>,<DSP_REG_N> */
 959{"pinc", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_XX00}, arch_sh_dsp_up},
 960/* 1011100100yynnnn pinc <DSP_REG_Y>,<DSP_REG_N> */
 961{"pinc", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_00YY}, arch_sh_dsp_up},
 962/* 10001101xxyynnnn pclr <DSP_REG_N> */
 963{"pclr", {DSP_REG_N},{PPI,PPIC,HEX_8,HEX_D}, arch_sh_dsp_up},
 964/* 10011101xx00nnnn pdmsb <DSP_REG_X>,<DSP_REG_N> */
 965{"pdmsb", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_XX00}, arch_sh_dsp_up},
 966/* 1011110100yynnnn pdmsb <DSP_REG_Y>,<DSP_REG_N> */
 967{"pdmsb", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_00YY}, arch_sh_dsp_up},
 968/* 11001001xxyynnnn pneg  <DSP_REG_X>,<DSP_REG_N> */
 969{"pneg",  {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_9}, arch_sh_dsp_up},
 970/* 11101001xxyynnnn pneg  <DSP_REG_Y>,<DSP_REG_N> */
 971{"pneg",  {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_E,HEX_9}, arch_sh_dsp_up},
 972/* 11011001xxyynnnn pcopy <DSP_REG_X>,<DSP_REG_N> */
 973{"pcopy", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_9}, arch_sh_dsp_up},
 974/* 11111001xxyynnnn pcopy <DSP_REG_Y>,<DSP_REG_N> */
 975{"pcopy", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_F,HEX_9}, arch_sh_dsp_up},
 976/* 11001101xxyynnnn psts MACH,<DSP_REG_N> */
 977{"psts", {A_MACH,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_D}, arch_sh_dsp_up},
 978/* 11011101xxyynnnn psts MACL,<DSP_REG_N> */
 979{"psts", {A_MACL,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_D}, arch_sh_dsp_up},
 980/* 11101101xxyynnnn plds <DSP_REG_N>,MACH */
 981{"plds", {DSP_REG_N,A_MACH},{PPI,PPIC,HEX_E,HEX_D}, arch_sh_dsp_up},
 982/* 11111101xxyynnnn plds <DSP_REG_N>,MACL */
 983{"plds", {DSP_REG_N,A_MACL},{PPI,PPIC,HEX_F,HEX_D}, arch_sh_dsp_up},
 984/* 10011101xx01zzzz pswap <DSP_REG_X>,<DSP_REG_N> */
 985{"pswap", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_1}, arch_sh4al_dsp_up},
 986/* 1011110101yyzzzz pswap <DSP_REG_Y>,<DSP_REG_N> */
 987{"pswap", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_4}, arch_sh4al_dsp_up},
 988
 989/* 1111nnnn01011101 fabs <F_REG_N>     */{"fabs",{F_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh2e_up},
 990/* 1111nnn001011101 fabs <D_REG_N>     */{"fabs",{D_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh4_up | arch_sh2a_up},
 991
 992/* 1111nnnnmmmm0000 fadd <F_REG_M>,<F_REG_N>*/{"fadd",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_0}, arch_sh2e_up},
 993/* 1111nnn0mmm00000 fadd <D_REG_M>,<D_REG_N>*/{"fadd",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_0}, arch_sh4_up | arch_sh2a_up},
 994
 995/* 1111nnnnmmmm0100 fcmp/eq <F_REG_M>,<F_REG_N>*/{"fcmp/eq",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_4}, arch_sh2e_up},
 996/* 1111nnn0mmm00100 fcmp/eq <D_REG_M>,<D_REG_N>*/{"fcmp/eq",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_4}, arch_sh4_up | arch_sh2a_up},
 997
 998/* 1111nnnnmmmm0101 fcmp/gt <F_REG_M>,<F_REG_N>*/{"fcmp/gt",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_5}, arch_sh2e_up},
 999/* 1111nnn0mmm00101 fcmp/gt <D_REG_M>,<D_REG_N>*/{"fcmp/gt",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_5}, arch_sh4_up | arch_sh2a_up},
1000
1001/* 1111nnn010111101 fcnvds <D_REG_N>,FPUL*/{"fcnvds",{D_REG_N,FPUL_M},{HEX_F,REG_N_D,HEX_B,HEX_D}, arch_sh4_up | arch_sh2a_up},
1002
1003/* 1111nnn010101101 fcnvsd FPUL,<D_REG_N>*/{"fcnvsd",{FPUL_M,D_REG_N},{HEX_F,REG_N_D,HEX_A,HEX_D}, arch_sh4_up | arch_sh2a_up},
1004
1005/* 1111nnnnmmmm0011 fdiv <F_REG_M>,<F_REG_N>*/{"fdiv",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_3}, arch_sh2e_up},
1006/* 1111nnn0mmm00011 fdiv <D_REG_M>,<D_REG_N>*/{"fdiv",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_3}, arch_sh4_up | arch_sh2a_up},
1007
1008/* 1111nnmm11101101 fipr <V_REG_M>,<V_REG_N>*/{"fipr",{V_REG_M,V_REG_N},{HEX_F,REG_NM,HEX_E,HEX_D}, arch_sh4_up},
1009
1010/* 1111nnnn10001101 fldi0 <F_REG_N>    */{"fldi0",{F_REG_N},{HEX_F,REG_N,HEX_8,HEX_D}, arch_sh2e_up},
1011
1012/* 1111nnnn10011101 fldi1 <F_REG_N>    */{"fldi1",{F_REG_N},{HEX_F,REG_N,HEX_9,HEX_D}, arch_sh2e_up},
1013
1014/* 1111nnnn00011101 flds <F_REG_N>,FPUL*/{"flds",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_1,HEX_D}, arch_sh2e_up},
1015
1016/* 1111nnnn00101101 float FPUL,<F_REG_N>*/{"float",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_2,HEX_D}, arch_sh2e_up},
1017/* 1111nnn000101101 float FPUL,<D_REG_N>*/{"float",{FPUL_M,D_REG_N},{HEX_F,REG_N,HEX_2,HEX_D}, arch_sh4_up | arch_sh2a_up},
1018
1019/* 1111nnnnmmmm1110 fmac FR0,<F_REG_M>,<F_REG_N>*/{"fmac",{F_FR0,F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_E}, arch_sh2e_up},
1020
1021/* 1111nnnnmmmm1100 fmov <F_REG_M>,<F_REG_N>*/{"fmov",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_C}, arch_sh2e_up},
1022/* 1111nnn1mmmm1100 fmov <DX_REG_M>,<DX_REG_N>*/{"fmov",{DX_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_C}, arch_sh4_up | arch_sh2a_up},
1023
1024/* 1111nnnnmmmm1000 fmov @<REG_M>,<F_REG_N>*/{"fmov",{A_IND_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh2e_up},
1025/* 1111nnn1mmmm1000 fmov @<REG_M>,<DX_REG_N>*/{"fmov",{A_IND_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh4_up | arch_sh2a_up},
1026
1027/* 1111nnnnmmmm1010 fmov <F_REG_M>,@<REG_N>*/{"fmov",{F_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh2e_up},
1028/* 1111nnnnmmm11010 fmov <DX_REG_M>,@<REG_N>*/{"fmov",{DX_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh4_up | arch_sh2a_up},
1029
1030/* 1111nnnnmmmm1001 fmov @<REG_M>+,<F_REG_N>*/{"fmov",{A_INC_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh2e_up},
1031/* 1111nnn1mmmm1001 fmov @<REG_M>+,<DX_REG_N>*/{"fmov",{A_INC_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh4_up | arch_sh2a_up},
1032
1033/* 1111nnnnmmmm1011 fmov <F_REG_M>,@-<REG_N>*/{"fmov",{F_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh2e_up},
1034/* 1111nnnnmmm11011 fmov <DX_REG_M>,@-<REG_N>*/{"fmov",{DX_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh4_up | arch_sh2a_up},
1035
1036/* 1111nnnnmmmm0110 fmov @(R0,<REG_M>),<F_REG_N>*/{"fmov",{A_IND_R0_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh2e_up},
1037/* 1111nnn1mmmm0110 fmov @(R0,<REG_M>),<DX_REG_N>*/{"fmov",{A_IND_R0_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh4_up | arch_sh2a_up},
1038
1039/* 1111nnnnmmmm0111 fmov <F_REG_M>,@(R0,<REG_N>)*/{"fmov",{F_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh2e_up},
1040/* 1111nnnnmmm10111 fmov <DX_REG_M>,@(R0,<REG_N>)*/{"fmov",{DX_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh4_up | arch_sh2a_up},
1041
1042/* 1111nnn1mmmm1000 fmov.d @<REG_M>,<DX_REG_N>*/{"fmov.d",{A_IND_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh4_up | arch_sh2a_up},
1043
1044/* 1111nnnnmmm11010 fmov.d <DX_REG_M>,@<REG_N>*/{"fmov.d",{DX_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh4_up | arch_sh2a_up},
1045
1046/* 1111nnn1mmmm1001 fmov.d @<REG_M>+,<DX_REG_N>*/{"fmov.d",{A_INC_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh4_up | arch_sh2a_up},
1047
1048/* 1111nnnnmmm11011 fmov.d <DX_REG_M>,@-<REG_N>*/{"fmov.d",{DX_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh4_up | arch_sh2a_up},
1049
1050/* 1111nnn1mmmm0110 fmov.d @(R0,<REG_M>),<DX_REG_N>*/{"fmov.d",{A_IND_R0_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh4_up | arch_sh2a_up},
1051
1052/* 1111nnnnmmm10111 fmov.d <DX_REG_M>,@(R0,<REG_N>)*/{"fmov.d",{DX_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh4_up | arch_sh2a_up},
1053/* 0011nnnnmmmm0001 0011dddddddddddd fmov.d <F_REG_M>,@(<DISP12>,<REG_N>) */
1054{"fmov.d",{DX_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_3,DISP1_12BY8}, arch_sh2a_up | arch_op32},
1055/* 0011nnnnmmmm0001 0111dddddddddddd fmov.d @(<DISP12>,<REG_M>),F_REG_N */
1056{"fmov.d",{A_DISP_REG_M,DX_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_7,DISP0_12BY8}, arch_sh2a_up | arch_op32},
1057
1058/* 1111nnnnmmmm1000 fmov.s @<REG_M>,<F_REG_N>*/{"fmov.s",{A_IND_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh2e_up},
1059
1060/* 1111nnnnmmmm1010 fmov.s <F_REG_M>,@<REG_N>*/{"fmov.s",{F_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh2e_up},
1061
1062/* 1111nnnnmmmm1001 fmov.s @<REG_M>+,<F_REG_N>*/{"fmov.s",{A_INC_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh2e_up},
1063
1064/* 1111nnnnmmmm1011 fmov.s <F_REG_M>,@-<REG_N>*/{"fmov.s",{F_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh2e_up},
1065
1066/* 1111nnnnmmmm0110 fmov.s @(R0,<REG_M>),<F_REG_N>*/{"fmov.s",{A_IND_R0_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh2e_up},
1067
1068/* 1111nnnnmmmm0111 fmov.s <F_REG_M>,@(R0,<REG_N>)*/{"fmov.s",{F_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh2e_up},
1069/* 0011nnnnmmmm0001 0011dddddddddddd fmov.s <F_REG_M>,@(<DISP12>,<REG_N>) */
1070{"fmov.s",{F_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_3,DISP1_12BY4}, arch_sh2a_up | arch_op32},
1071/* 0011nnnnmmmm0001 0111dddddddddddd fmov.s @(<DISP12>,<REG_M>),F_REG_N */
1072{"fmov.s",{A_DISP_REG_M,F_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_7,DISP0_12BY4}, arch_sh2a_up | arch_op32},
1073
1074/* 1111nnnnmmmm0010 fmul <F_REG_M>,<F_REG_N>*/{"fmul",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_2}, arch_sh2e_up},
1075/* 1111nnn0mmm00010 fmul <D_REG_M>,<D_REG_N>*/{"fmul",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_2}, arch_sh4_up | arch_sh2a_up},
1076
1077/* 1111nnnn01001101 fneg <F_REG_N>     */{"fneg",{F_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh2e_up},
1078/* 1111nnn001001101 fneg <D_REG_N>     */{"fneg",{D_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh4_up | arch_sh2a_up},
1079
1080/* 1111011111111101 fpchg               */{"fpchg",{0},{HEX_F,HEX_7,HEX_F,HEX_D}, arch_sh4a_up},
1081
1082/* 1111101111111101 frchg               */{"frchg",{0},{HEX_F,HEX_B,HEX_F,HEX_D}, arch_sh4_up},
1083
1084/* 1111nnn011111101 fsca FPUL,<D_REG_N> */{"fsca",{FPUL_M,D_REG_N},{HEX_F,REG_N_D,HEX_F,HEX_D}, arch_sh4_up},
1085
1086/* 1111001111111101 fschg               */{"fschg",{0},{HEX_F,HEX_3,HEX_F,HEX_D}, arch_sh4_up | arch_sh2a_up},
1087
1088/* 1111nnnn01101101 fsqrt <F_REG_N>    */{"fsqrt",{F_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh3e_up | arch_sh2a_up},
1089/* 1111nnn001101101 fsqrt <D_REG_N>    */{"fsqrt",{D_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh4_up | arch_sh2a_up},
1090
1091/* 1111nnnn01111101 fsrra <F_REG_N>    */{"fsrra",{F_REG_N},{HEX_F,REG_N,HEX_7,HEX_D}, arch_sh4_up},
1092
1093/* 1111nnnn00001101 fsts FPUL,<F_REG_N>*/{"fsts",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_0,HEX_D}, arch_sh2e_up},
1094
1095/* 1111nnnnmmmm0001 fsub <F_REG_M>,<F_REG_N>*/{"fsub",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_1}, arch_sh2e_up},
1096/* 1111nnn0mmm00001 fsub <D_REG_M>,<D_REG_N>*/{"fsub",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_1}, arch_sh4_up | arch_sh2a_up},
1097
1098/* 1111nnnn00111101 ftrc <F_REG_N>,FPUL*/{"ftrc",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_3,HEX_D}, arch_sh2e_up},
1099/* 1111nnnn00111101 ftrc <D_REG_N>,FPUL*/{"ftrc",{D_REG_N,FPUL_M},{HEX_F,REG_N,HEX_3,HEX_D}, arch_sh4_up | arch_sh2a_up},
1100
1101/* 1111nn0111111101 ftrv XMTRX_M4,<V_REG_n>*/{"ftrv",{XMTRX_M4,V_REG_N},{HEX_F,REG_N_B01,HEX_F,HEX_D}, arch_sh4_up},
1102
1103  /* 10000110nnnn0iii bclr #<imm>, <REG_N> */  {"bclr",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3c}, arch_sh2a_nofpu_up},
1104  /* 0011nnnn0iii1001 0000dddddddddddd bclr.b #<imm>,@(<DISP12>,<REG_N>) */
1105{"bclr.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_0,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1106  /* 10000111nnnn1iii bld #<imm>, <REG_N> */   {"bld",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3s}, arch_sh2a_nofpu_up},
1107  /* 0011nnnn0iii1001 0011dddddddddddd bld.b #<imm>,@(<DISP12>,<REG_N>) */
1108{"bld.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_3,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1109  /* 10000110nnnn1iii bset #<imm>, <REG_N> */  {"bset",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3s}, arch_sh2a_nofpu_up},
1110  /* 0011nnnn0iii1001 0001dddddddddddd bset.b #<imm>,@(<DISP12>,<REG_N>) */
1111{"bset.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_1,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1112  /* 10000111nnnn0iii bst #<imm>, <REG_N> */   {"bst",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3c}, arch_sh2a_nofpu_up},
1113  /* 0011nnnn0iii1001 0010dddddddddddd bst.b #<imm>,@(<DISP12>,<REG_N>) */
1114{"bst.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_2,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1115  /* 0100nnnn10010001 clips.b <REG_N> */       {"clips.b",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_1}, arch_sh2a_nofpu_up},
1116  /* 0100nnnn10010101 clips.w <REG_N> */       {"clips.w",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_5}, arch_sh2a_nofpu_up},
1117  /* 0100nnnn10000001 clipu.b <REG_N> */       {"clipu.b",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_1}, arch_sh2a_nofpu_up},
1118  /* 0100nnnn10000101 clipu.w <REG_N> */       {"clipu.w",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_5}, arch_sh2a_nofpu_up},
1119  /* 0100nnnn10010100 divs R0,<REG_N> */       {"divs",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_9,HEX_4}, arch_sh2a_nofpu_up},
1120  /* 0100nnnn10000100 divu R0,<REG_N> */       {"divu",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_4}, arch_sh2a_nofpu_up},
1121  /* 0100mmmm01001011 jsr/n @<REG_M>  */       {"jsr/n",{A_IND_M},{HEX_4,REG_M,HEX_4,HEX_B}, arch_sh2a_nofpu_up},
1122  /* 10000011dddddddd jsr/n @@(<disp>,TBR) */  {"jsr/n",{A_DISP2_TBR},{HEX_8,HEX_3,IMM0_8BY4}, arch_sh2a_nofpu_up},
1123  /* 0100mmmm11100101 ldbank @<REG_M>,R0 */    {"ldbank",{A_IND_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_5}, arch_sh2a_nofpu_up},
1124  /* 0100mmmm11110001 movml.l <REG_M>,@-R15 */ {"movml.l",{A_REG_M,A_DEC_R15},{HEX_4,REG_M,HEX_F,HEX_1}, arch_sh2a_nofpu_up},
1125  /* 0100mmmm11110101 movml.l @R15+,<REG_M> */ {"movml.l",{A_INC_R15,A_REG_M},{HEX_4,REG_M,HEX_F,HEX_5}, arch_sh2a_nofpu_up},
1126  /* 0100mmmm11110000 movml.l <REG_M>,@-R15 */ {"movmu.l",{A_REG_M,A_DEC_R15},{HEX_4,REG_M,HEX_F,HEX_0}, arch_sh2a_nofpu_up},
1127  /* 0100mmmm11110100 movml.l @R15+,<REG_M> */ {"movmu.l",{A_INC_R15,A_REG_M},{HEX_4,REG_M,HEX_F,HEX_4}, arch_sh2a_nofpu_up},
1128  /* 0000nnnn00111001 movrt <REG_N> */         {"movrt",{A_REG_N},{HEX_0,REG_N,HEX_3,HEX_9}, arch_sh2a_nofpu_up},
1129  /* 0100nnnn10000000 mulr R0,<REG_N> */       {"mulr",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_0}, arch_sh2a_nofpu_up},
1130  /* 0000000001101000 nott */                  {"nott",{A_END},{HEX_0,HEX_0,HEX_6,HEX_8}, arch_sh2a_nofpu_up},
1131  /* 0000000001011011 resbank */               {"resbank",{A_END},{HEX_0,HEX_0,HEX_5,HEX_B}, arch_sh2a_nofpu_up},
1132  /* 0000000001101011 rts/n */                 {"rts/n",{A_END},{HEX_0,HEX_0,HEX_6,HEX_B}, arch_sh2a_nofpu_up},
1133  /* 0000mmmm01111011 rtv/n <REG_M>*/          {"rtv/n",{A_REG_M},{HEX_0,REG_M,HEX_7,HEX_B}, arch_sh2a_nofpu_up},
1134  /* 0100nnnn11100001 stbank R0,@<REG_N>*/     {"stbank",{A_R0,A_IND_N},{HEX_4,REG_N,HEX_E,HEX_1}, arch_sh2a_nofpu_up},
1135
1136/* 0011nnnn0iii1001 0100dddddddddddd band.b #<imm>,@(<DISP12>,<REG_N>) */
1137{"band.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_4,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1138/* 0011nnnn0iii1001 1100dddddddddddd bandnot.b #<imm>,@(<DISP12>,<REG_N>) */
1139{"bandnot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_C,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1140/* 0011nnnn0iii1001 1011dddddddddddd bldnot.b #<imm>,@(<DISP12>,<REG_N>) */
1141{"bldnot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_B,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1142/* 0011nnnn0iii1001 0101dddddddddddd bor.b #<imm>,@(<DISP12>,<REG_N>) */
1143{"bor.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_5,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1144/* 0011nnnn0iii1001 1101dddddddddddd bornot.b #<imm>,@(<DISP12>,<REG_N>) */
1145{"bornot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_D,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1146/* 0011nnnn0iii1001 0110dddddddddddd bxor.b #<imm>,@(<DISP12>,<REG_N>) */
1147{"bxor.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_6,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
1148/* 0000nnnniiii0000 iiiiiiiiiiiiiiii movi20 #<imm>,<REG_N> */
1149{"movi20",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_0,IMM0_20}, arch_sh2a_nofpu_up | arch_op32},
1150/* 0000nnnniiii0001 iiiiiiiiiiiiiiii movi20s #<imm>,<REG_N> */
1151{"movi20s",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_1,IMM0_20BY8}, arch_sh2a_nofpu_up | arch_op32},
1152/* 0011nnnnmmmm0001 1000dddddddddddd movu.b @(<DISP12>,<REG_M>),<REG_N> */
1153{"movu.b",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_8,DISP0_12}, arch_sh2a_nofpu_up | arch_op32},
1154/* 0011nnnnmmmm0001 1001dddddddddddd movu.w @(<DISP12>,<REG_M>),<REG_N> */
1155{"movu.w",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_9,DISP0_12BY2}, arch_sh2a_nofpu_up | arch_op32},
1156
1157{ 0, {0}, {0}, 0 }
1158};
1159
1160#endif
1161
1162#ifdef ARCH_all
1163#define INCLUDE_SHMEDIA
1164#endif
1165
1166static void
1167print_movxy (const sh_opcode_info *op, int rn, int rm,
1168             fprintf_function fprintf_fn, void *stream)
1169{
1170  int n;
1171
1172  fprintf_fn (stream, "%s\t", op->name);
1173  for (n = 0; n < 2; n++)
1174    {
1175      switch (op->arg[n])
1176        {
1177        case A_IND_N:
1178        case AX_IND_N:
1179        case AXY_IND_N:
1180        case AY_IND_N:
1181        case AYX_IND_N:
1182          fprintf_fn (stream, "@r%d", rn);
1183          break;
1184        case A_INC_N:
1185        case AX_INC_N:
1186        case AXY_INC_N:
1187        case AY_INC_N:
1188        case AYX_INC_N:
1189          fprintf_fn (stream, "@r%d+", rn);
1190          break;
1191        case AX_PMOD_N:
1192        case AXY_PMOD_N:
1193          fprintf_fn (stream, "@r%d+r8", rn);
1194          break;
1195        case AY_PMOD_N:
1196        case AYX_PMOD_N:
1197          fprintf_fn (stream, "@r%d+r9", rn);
1198          break;
1199        case DSP_REG_A_M:
1200          fprintf_fn (stream, "a%c", '0' + rm);
1201          break;
1202        case DSP_REG_X:
1203          fprintf_fn (stream, "x%c", '0' + rm);
1204          break;
1205        case DSP_REG_Y:
1206          fprintf_fn (stream, "y%c", '0' + rm);
1207          break;
1208        case DSP_REG_AX:
1209          fprintf_fn (stream, "%c%c",
1210                      (rm & 1) ? 'x' : 'a',
1211                      (rm & 2) ? '1' : '0');
1212          break;
1213        case DSP_REG_XY:
1214          fprintf_fn (stream, "%c%c",
1215                      (rm & 1) ? 'y' : 'x',
1216                      (rm & 2) ? '1' : '0');
1217          break;
1218        case DSP_REG_AY:
1219          fprintf_fn (stream, "%c%c",
1220                      (rm & 2) ? 'y' : 'a',
1221                      (rm & 1) ? '1' : '0');
1222          break;
1223        case DSP_REG_YX:
1224          fprintf_fn (stream, "%c%c",
1225                      (rm & 2) ? 'x' : 'y',
1226                      (rm & 1) ? '1' : '0');
1227          break;
1228        default:
1229          abort ();
1230        }
1231      if (n == 0)
1232        fprintf_fn (stream, ",");
1233    }
1234}
1235
1236/* Print a double data transfer insn.  INSN is just the lower three
1237   nibbles of the insn, i.e. field a and the bit that indicates if
1238   a parallel processing insn follows.
1239   Return nonzero if a field b of a parallel processing insns follows.  */
1240
1241static void
1242print_insn_ddt (int insn, struct disassemble_info *info)
1243{
1244  fprintf_function fprintf_fn = info->fprintf_func;
1245  void *stream = info->stream;
1246
1247  /* If this is just a nop, make sure to emit something.  */
1248  if (insn == 0x000)
1249    fprintf_fn (stream, "nopx\tnopy");
1250
1251  /* If a parallel processing insn was printed before,
1252     and we got a non-nop, emit a tab.  */
1253  if ((insn & 0x800) && (insn & 0x3ff))
1254    fprintf_fn (stream, "\t");
1255
1256  /* Check if either the x or y part is invalid.  */
1257  if (((insn & 0xc) == 0 && (insn & 0x2a0))
1258      || ((insn & 3) == 0 && (insn & 0x150)))
1259    if (info->mach != bfd_mach_sh_dsp
1260        && info->mach != bfd_mach_sh3_dsp)
1261      {
1262        static const sh_opcode_info *first_movx, *first_movy;
1263        const sh_opcode_info *op;
1264        int is_movy;
1265
1266        if (! first_movx)
1267          {
1268            for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;)
1269              first_movx++;
1270            for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;)
1271              first_movy++;
1272          }
1273
1274        is_movy = ((insn & 3) != 0);
1275
1276        if (is_movy)
1277          op = first_movy;
1278        else
1279          op = first_movx;
1280
1281        while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
1282               || op->nibbles[3] != (unsigned) (insn & 0xf))
1283          op++;
1284
1285        print_movxy (op,
1286                     (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
1287                      + 2 * is_movy
1288                      + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
1289                     (insn >> 6) & 3,
1290                     fprintf_fn, stream);
1291      }
1292    else
1293      fprintf_fn (stream, ".word 0x%x", insn);
1294  else
1295    {
1296      static const sh_opcode_info *first_movx, *first_movy;
1297      const sh_opcode_info *opx, *opy;
1298      unsigned int insn_x, insn_y;
1299
1300      if (! first_movx)
1301        {
1302          for (first_movx = sh_table; first_movx->nibbles[1] != MOVX;)
1303            first_movx++;
1304          for (first_movy = first_movx; first_movy->nibbles[1] != MOVY;)
1305            first_movy++;
1306        }
1307      insn_x = (insn >> 2) & 0xb;
1308      if (insn_x)
1309        {
1310          for (opx = first_movx; opx->nibbles[2] != insn_x;)
1311            opx++;
1312          print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
1313                       fprintf_fn, stream);
1314        }
1315      insn_y = (insn & 3) | ((insn >> 1) & 8);
1316      if (insn_y)
1317        {
1318          if (insn_x)
1319            fprintf_fn (stream, "\t");
1320          for (opy = first_movy; opy->nibbles[2] != insn_y;)
1321            opy++;
1322          print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
1323                       fprintf_fn, stream);
1324        }
1325    }
1326}
1327
1328static void
1329print_dsp_reg (int rm, fprintf_function fprintf_fn, void *stream)
1330{
1331  switch (rm)
1332    {
1333    case A_A1_NUM:
1334      fprintf_fn (stream, "a1");
1335      break;
1336    case A_A0_NUM:
1337      fprintf_fn (stream, "a0");
1338      break;
1339    case A_X0_NUM:
1340      fprintf_fn (stream, "x0");
1341      break;
1342    case A_X1_NUM:
1343      fprintf_fn (stream, "x1");
1344      break;
1345    case A_Y0_NUM:
1346      fprintf_fn (stream, "y0");
1347      break;
1348    case A_Y1_NUM:
1349      fprintf_fn (stream, "y1");
1350      break;
1351    case A_M0_NUM:
1352      fprintf_fn (stream, "m0");
1353      break;
1354    case A_A1G_NUM:
1355      fprintf_fn (stream, "a1g");
1356      break;
1357    case A_M1_NUM:
1358      fprintf_fn (stream, "m1");
1359      break;
1360    case A_A0G_NUM:
1361      fprintf_fn (stream, "a0g");
1362      break;
1363    default:
1364      fprintf_fn (stream, "0x%x", rm);
1365      break;
1366    }
1367}
1368
1369static void
1370print_insn_ppi (int field_b, struct disassemble_info *info)
1371{
1372  static const char *sx_tab[] = { "x0", "x1", "a0", "a1" };
1373  static const char *sy_tab[] = { "y0", "y1", "m0", "m1" };
1374  fprintf_function fprintf_fn = info->fprintf_func;
1375  void *stream = info->stream;
1376  unsigned int nib1, nib2, nib3;
1377  unsigned int altnib1, nib4;
1378  const char *dc = NULL;
1379  const sh_opcode_info *op;
1380
1381  if ((field_b & 0xe800) == 0)
1382    {
1383      fprintf_fn (stream, "psh%c\t#%d,",
1384                  field_b & 0x1000 ? 'a' : 'l',
1385                  (field_b >> 4) & 127);
1386      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
1387      return;
1388    }
1389  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
1390    {
1391      static const char *du_tab[] = { "x0", "y0", "a0", "a1" };
1392      static const char *se_tab[] = { "x0", "x1", "y0", "a1" };
1393      static const char *sf_tab[] = { "y0", "y1", "x0", "a1" };
1394      static const char *sg_tab[] = { "m0", "m1", "a0", "a1" };
1395
1396      if (field_b & 0x2000)
1397        {
1398          fprintf_fn (stream, "p%s %s,%s,%s\t",
1399                      (field_b & 0x1000) ? "add" : "sub",
1400                      sx_tab[(field_b >> 6) & 3],
1401                      sy_tab[(field_b >> 4) & 3],
1402                      du_tab[(field_b >> 0) & 3]);
1403        }
1404      else if ((field_b & 0xf0) == 0x10
1405               && info->mach != bfd_mach_sh_dsp
1406               && info->mach != bfd_mach_sh3_dsp)
1407        {
1408          fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
1409        }
1410      else if ((field_b & 0xf3) != 0)
1411        {
1412          fprintf_fn (stream, ".word 0x%x\t", field_b);
1413        }
1414      fprintf_fn (stream, "pmuls%c%s,%s,%s",
1415                  field_b & 0x2000 ? ' ' : '\t',
1416                  se_tab[(field_b >> 10) & 3],
1417                  sf_tab[(field_b >>  8) & 3],
1418                  sg_tab[(field_b >>  2) & 3]);
1419      return;
1420    }
1421
1422  nib1 = PPIC;
1423  nib2 = field_b >> 12 & 0xf;
1424  nib3 = field_b >> 8 & 0xf;
1425  nib4 = field_b >> 4 & 0xf;
1426  switch (nib3 & 0x3)
1427    {
1428    case 0:
1429      dc = "";
1430      nib1 = PPI3;
1431      break;
1432    case 1:
1433      dc = "";
1434      break;
1435    case 2:
1436      dc = "dct ";
1437      nib3 -= 1;
1438      break;
1439    case 3:
1440      dc = "dcf ";
1441      nib3 -= 2;
1442      break;
1443    }
1444  if (nib1 == PPI3)
1445    altnib1 = PPI3NC;
1446  else
1447    altnib1 = nib1;
1448  for (op = sh_table; op->name; op++)
1449    {
1450      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
1451          && op->nibbles[2] == nib2
1452          && op->nibbles[3] == nib3)
1453        {
1454          int n;
1455
1456          switch (op->nibbles[4])
1457            {
1458            case HEX_0:
1459              break;
1460            case HEX_XX00:
1461              if ((nib4 & 3) != 0)
1462                continue;
1463              break;
1464            case HEX_1:
1465              if ((nib4 & 3) != 1)
1466                continue;
1467              break;
1468            case HEX_00YY:
1469              if ((nib4 & 0xc) != 0)
1470                continue;
1471              break;
1472            case HEX_4:
1473              if ((nib4 & 0xc) != 4)
1474                continue;
1475              break;
1476            default:
1477              abort ();
1478            }
1479          fprintf_fn (stream, "%s%s\t", dc, op->name);
1480          for (n = 0; n < 3 && op->arg[n] != A_END; n++)
1481            {
1482              if (n && op->arg[1] != A_END)
1483                fprintf_fn (stream, ",");
1484              switch (op->arg[n])
1485                {
1486                case DSP_REG_N:
1487                  print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
1488                  break;
1489                case DSP_REG_X:
1490                  fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
1491                  break;
1492                case DSP_REG_Y:
1493                  fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
1494                  break;
1495                case A_MACH:
1496                  fprintf_fn (stream, "mach");
1497                  break;
1498                case A_MACL:
1499                  fprintf_fn (stream, "macl");
1500                  break;
1501                default:
1502                  abort ();
1503                }
1504            }
1505          return;
1506        }
1507    }
1508  /* Not found.  */
1509  fprintf_fn (stream, ".word 0x%x", field_b);
1510}
1511
1512/* FIXME mvs: movx insns print as ".word 0x%03x", insn & 0xfff
1513   (ie. the upper nibble is missing).  */
1514int
1515print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
1516{
1517  fprintf_function fprintf_fn = info->fprintf_func;
1518  void *stream = info->stream;
1519  unsigned char insn[4];
1520  unsigned char nibs[8];
1521  int status;
1522  bfd_vma relmask = ~(bfd_vma) 0;
1523  const sh_opcode_info *op;
1524  unsigned int target_arch;
1525  int allow_op32;
1526
1527  switch (info->mach)
1528    {
1529    case bfd_mach_sh:
1530      target_arch = arch_sh1;
1531      break;
1532    case bfd_mach_sh4:
1533      target_arch = arch_sh4;
1534      break;
1535    case bfd_mach_sh5:
1536#ifdef INCLUDE_SHMEDIA
1537      status = print_insn_sh64 (memaddr, info);
1538      if (status != -2)
1539        return status;
1540#endif
1541      /* When we get here for sh64, it's because we want to disassemble
1542         SHcompact, i.e. arch_sh4.  */
1543      target_arch = arch_sh4;
1544      break;
1545    default:
1546      fprintf (stderr, "sh architecture not supported\n");
1547      return -1;
1548    }
1549
1550  status = info->read_memory_func (memaddr, insn, 2, info);
1551
1552  if (status != 0)
1553    {
1554      info->memory_error_func (status, memaddr, info);
1555      return -1;
1556    }
1557
1558  if (info->endian == BFD_ENDIAN_LITTLE)
1559    {
1560      nibs[0] = (insn[1] >> 4) & 0xf;
1561      nibs[1] = insn[1] & 0xf;
1562
1563      nibs[2] = (insn[0] >> 4) & 0xf;
1564      nibs[3] = insn[0] & 0xf;
1565    }
1566  else
1567    {
1568      nibs[0] = (insn[0] >> 4) & 0xf;
1569      nibs[1] = insn[0] & 0xf;
1570
1571      nibs[2] = (insn[1] >> 4) & 0xf;
1572      nibs[3] = insn[1] & 0xf;
1573    }
1574  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
1575  if (status != 0)
1576    allow_op32 = 0;
1577  else
1578    {
1579      allow_op32 = 1;
1580
1581      if (info->endian == BFD_ENDIAN_LITTLE)
1582        {
1583          nibs[4] = (insn[3] >> 4) & 0xf;
1584          nibs[5] = insn[3] & 0xf;
1585
1586          nibs[6] = (insn[2] >> 4) & 0xf;
1587          nibs[7] = insn[2] & 0xf;
1588        }
1589      else
1590        {
1591          nibs[4] = (insn[2] >> 4) & 0xf;
1592          nibs[5] = insn[2] & 0xf;
1593
1594          nibs[6] = (insn[3] >> 4) & 0xf;
1595          nibs[7] = insn[3] & 0xf;
1596        }
1597    }
1598
1599  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
1600      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
1601    {
1602      if (nibs[1] & 8)
1603        {
1604          int field_b;
1605
1606          status = info->read_memory_func (memaddr + 2, insn, 2, info);
1607
1608          if (status != 0)
1609            {
1610              info->memory_error_func (status, memaddr + 2, info);
1611              return -1;
1612            }
1613
1614          if (info->endian == BFD_ENDIAN_LITTLE)
1615            field_b = insn[1] << 8 | insn[0];
1616          else
1617            field_b = insn[0] << 8 | insn[1];
1618
1619          print_insn_ppi (field_b, info);
1620          print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
1621          return 4;
1622        }
1623      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
1624      return 2;
1625    }
1626  for (op = sh_table; op->name; op++)
1627    {
1628      int n;
1629      int imm = 0;
1630      int rn = 0;
1631      int rm = 0;
1632      int rb = 0;
1633      int disp_pc;
1634      bfd_vma disp_pc_addr = 0;
1635      int disp = 0;
1636      int has_disp = 0;
1637      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
1638
1639      if (!allow_op32
1640          && SH_MERGE_ARCH_SET (op->arch, arch_op32))
1641        goto fail;
1642
1643      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
1644        goto fail;
1645      for (n = 0; n < max_n; n++)
1646        {
1647          int i = op->nibbles[n];
1648
1649          if (i < 16)
1650            {
1651              if (nibs[n] == i)
1652                continue;
1653              goto fail;
1654            }
1655          switch (i)
1656            {
1657            case BRANCH_8:
1658              imm = (nibs[2] << 4) | (nibs[3]);
1659              if (imm & 0x80)
1660                imm |= ~0xff;
1661              imm = ((char) imm) * 2 + 4;
1662              goto ok;
1663            case BRANCH_12:
1664              imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
1665              if (imm & 0x800)
1666                imm |= ~0xfff;
1667              imm = imm * 2 + 4;
1668              goto ok;
1669            case IMM0_3c:
1670              if (nibs[3] & 0x8)
1671                goto fail;
1672              imm = nibs[3] & 0x7;
1673              break;
1674            case IMM0_3s:
1675              if (!(nibs[3] & 0x8))
1676                goto fail;
1677              imm = nibs[3] & 0x7;
1678              break;
1679            case IMM0_3Uc:
1680              if (nibs[2] & 0x8)
1681                goto fail;
1682              imm = nibs[2] & 0x7;
1683              break;
1684            case IMM0_3Us:
1685              if (!(nibs[2] & 0x8))
1686                goto fail;
1687              imm = nibs[2] & 0x7;
1688              break;
1689            case DISP0_12:
1690            case DISP1_12:
1691              disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
1692              has_disp = 1;
1693              goto ok;
1694            case DISP0_12BY2:
1695            case DISP1_12BY2:
1696              disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
1697              relmask = ~(bfd_vma) 1;
1698              has_disp = 1;
1699              goto ok;
1700            case DISP0_12BY4:
1701            case DISP1_12BY4:
1702              disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
1703              relmask = ~(bfd_vma) 3;
1704              has_disp = 1;
1705              goto ok;
1706            case DISP0_12BY8:
1707            case DISP1_12BY8:
1708              disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
1709              relmask = ~(bfd_vma) 7;
1710              has_disp = 1;
1711              goto ok;
1712            case IMM0_20_4:
1713              break;
1714            case IMM0_20:
1715              imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
1716                     | (nibs[6] << 4) | nibs[7]);
1717              if (imm & 0x80000)
1718                imm -= 0x100000;
1719              goto ok;
1720            case IMM0_20BY8:
1721              imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
1722                     | (nibs[6] << 4) | nibs[7]);
1723              imm <<= 8;
1724              if (imm & 0x8000000)
1725                imm -= 0x10000000;
1726              goto ok;
1727            case IMM0_4:
1728            case IMM1_4:
1729              imm = nibs[3];
1730              goto ok;
1731            case IMM0_4BY2:
1732            case IMM1_4BY2:
1733              imm = nibs[3] << 1;
1734              goto ok;
1735            case IMM0_4BY4:
1736            case IMM1_4BY4:
1737              imm = nibs[3] << 2;
1738              goto ok;
1739            case IMM0_8:
1740            case IMM1_8:
1741              imm = (nibs[2] << 4) | nibs[3];
1742              disp = imm;
1743              has_disp = 1;
1744              if (imm & 0x80)
1745                imm -= 0x100;
1746              goto ok;
1747            case PCRELIMM_8BY2:
1748              imm = ((nibs[2] << 4) | nibs[3]) << 1;
1749              relmask = ~(bfd_vma) 1;
1750              goto ok;
1751            case PCRELIMM_8BY4:
1752              imm = ((nibs[2] << 4) | nibs[3]) << 2;
1753              relmask = ~(bfd_vma) 3;
1754              goto ok;
1755            case IMM0_8BY2:
1756            case IMM1_8BY2:
1757              imm = ((nibs[2] << 4) | nibs[3]) << 1;
1758              goto ok;
1759            case IMM0_8BY4:
1760            case IMM1_8BY4:
1761              imm = ((nibs[2] << 4) | nibs[3]) << 2;
1762              goto ok;
1763            case REG_N_D:
1764              if ((nibs[n] & 1) != 0)
1765                goto fail;
1766              /* fall through */
1767            case REG_N:
1768              rn = nibs[n];
1769              break;
1770            case REG_M:
1771              rm = nibs[n];
1772              break;
1773            case REG_N_B01:
1774              if ((nibs[n] & 0x3) != 1 /* binary 01 */)
1775                goto fail;
1776              rn = (nibs[n] & 0xc) >> 2;
1777              break;
1778            case REG_NM:
1779              rn = (nibs[n] & 0xc) >> 2;
1780              rm = (nibs[n] & 0x3);
1781              break;
1782            case REG_B:
1783              rb = nibs[n] & 0x07;
1784              break;
1785            case SDT_REG_N:
1786              /* sh-dsp: single data transfer.  */
1787              rn = nibs[n];
1788              if ((rn & 0xc) != 4)
1789                goto fail;
1790              rn = rn & 0x3;
1791              rn |= (!(rn & 2)) << 2;
1792              break;
1793            case PPI:
1794            case REPEAT:
1795              goto fail;
1796            default:
1797              abort ();
1798            }
1799        }
1800
1801    ok:
1802      /* sh2a has D_REG but not X_REG.  We don't know the pattern
1803         doesn't match unless we check the output args to see if they
1804         make sense.  */
1805      if (target_arch == arch_sh2a
1806          && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
1807              || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
1808        goto fail;
1809
1810      fprintf_fn (stream, "%s\t", op->name);
1811      disp_pc = 0;
1812      for (n = 0; n < 3 && op->arg[n] != A_END; n++)
1813        {
1814          if (n && op->arg[1] != A_END)
1815            fprintf_fn (stream, ",");
1816          switch (op->arg[n])
1817            {
1818            case A_IMM:
1819              fprintf_fn (stream, "#%d", imm);
1820              break;
1821            case A_R0:
1822              fprintf_fn (stream, "r0");
1823              break;
1824            case A_REG_N:
1825              fprintf_fn (stream, "r%d", rn);
1826              break;
1827            case A_INC_N:
1828            case AS_INC_N:
1829              fprintf_fn (stream, "@r%d+", rn);
1830              break;
1831            case A_DEC_N:
1832            case AS_DEC_N:
1833              fprintf_fn (stream, "@-r%d", rn);
1834              break;
1835            case A_IND_N:
1836            case AS_IND_N:
1837              fprintf_fn (stream, "@r%d", rn);
1838              break;
1839            case A_DISP_REG_N:
1840              fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
1841              break;
1842            case AS_PMOD_N:
1843              fprintf_fn (stream, "@r%d+r8", rn);
1844              break;
1845            case A_REG_M:
1846              fprintf_fn (stream, "r%d", rm);
1847              break;
1848            case A_INC_M:
1849              fprintf_fn (stream, "@r%d+", rm);
1850              break;
1851            case A_DEC_M:
1852              fprintf_fn (stream, "@-r%d", rm);
1853              break;
1854            case A_IND_M:
1855              fprintf_fn (stream, "@r%d", rm);
1856              break;
1857            case A_DISP_REG_M:
1858              fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
1859              break;
1860            case A_REG_B:
1861              fprintf_fn (stream, "r%d_bank", rb);
1862              break;
1863            case A_DISP_PC:
1864              disp_pc = 1;
1865              disp_pc_addr = imm + 4 + (memaddr & relmask);
1866              (*info->print_address_func) (disp_pc_addr, info);
1867              break;
1868            case A_IND_R0_REG_N:
1869              fprintf_fn (stream, "@(r0,r%d)", rn);
1870              break;
1871            case A_IND_R0_REG_M:
1872              fprintf_fn (stream, "@(r0,r%d)", rm);
1873              break;
1874            case A_DISP_GBR:
1875              fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
1876              break;
1877            case A_TBR:
1878              fprintf_fn (stream, "tbr");
1879              break;
1880            case A_DISP2_TBR:
1881              fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
1882              break;
1883            case A_INC_R15:
1884              fprintf_fn (stream, "@r15+");
1885              break;
1886            case A_DEC_R15:
1887              fprintf_fn (stream, "@-r15");
1888              break;
1889            case A_R0_GBR:
1890              fprintf_fn (stream, "@(r0,gbr)");
1891              break;
1892            case A_BDISP12:
1893            case A_BDISP8:
1894                {
1895                    bfd_vma addr;
1896                    addr = imm + memaddr;
1897                    (*info->print_address_func) (addr, info);
1898                }
1899              break;
1900            case A_SR:
1901              fprintf_fn (stream, "sr");
1902              break;
1903            case A_GBR:
1904              fprintf_fn (stream, "gbr");
1905              break;
1906            case A_VBR:
1907              fprintf_fn (stream, "vbr");
1908              break;
1909            case A_DSR:
1910              fprintf_fn (stream, "dsr");
1911              break;
1912            case A_MOD:
1913              fprintf_fn (stream, "mod");
1914              break;
1915            case A_RE:
1916              fprintf_fn (stream, "re");
1917              break;
1918            case A_RS:
1919              fprintf_fn (stream, "rs");
1920              break;
1921            case A_A0:
1922              fprintf_fn (stream, "a0");
1923              break;
1924            case A_X0:
1925              fprintf_fn (stream, "x0");
1926              break;
1927            case A_X1:
1928              fprintf_fn (stream, "x1");
1929              break;
1930            case A_Y0:
1931              fprintf_fn (stream, "y0");
1932              break;
1933            case A_Y1:
1934              fprintf_fn (stream, "y1");
1935              break;
1936            case DSP_REG_M:
1937              print_dsp_reg (rm, fprintf_fn, stream);
1938              break;
1939            case A_SSR:
1940              fprintf_fn (stream, "ssr");
1941              break;
1942            case A_SPC:
1943              fprintf_fn (stream, "spc");
1944              break;
1945            case A_MACH:
1946              fprintf_fn (stream, "mach");
1947              break;
1948            case A_MACL:
1949              fprintf_fn (stream, "macl");
1950              break;
1951            case A_PR:
1952              fprintf_fn (stream, "pr");
1953              break;
1954            case A_SGR:
1955              fprintf_fn (stream, "sgr");
1956              break;
1957            case A_DBR:
1958              fprintf_fn (stream, "dbr");
1959              break;
1960            case F_REG_N:
1961              fprintf_fn (stream, "fr%d", rn);
1962              break;
1963            case F_REG_M:
1964              fprintf_fn (stream, "fr%d", rm);
1965              break;
1966            case DX_REG_N:
1967              if (rn & 1)
1968                {
1969                  fprintf_fn (stream, "xd%d", rn & ~1);
1970                  break;
1971                }
1972            case D_REG_N:
1973              fprintf_fn (stream, "dr%d", rn);
1974              break;
1975            case DX_REG_M:
1976              if (rm & 1)
1977                {
1978                  fprintf_fn (stream, "xd%d", rm & ~1);
1979                  break;
1980                }
1981            case D_REG_M:
1982              fprintf_fn (stream, "dr%d", rm);
1983              break;
1984            case FPSCR_M:
1985            case FPSCR_N:
1986              fprintf_fn (stream, "fpscr");
1987              break;
1988            case FPUL_M:
1989            case FPUL_N:
1990              fprintf_fn (stream, "fpul");
1991              break;
1992            case F_FR0:
1993              fprintf_fn (stream, "fr0");
1994              break;
1995            case V_REG_N:
1996              fprintf_fn (stream, "fv%d", rn * 4);
1997              break;
1998            case V_REG_M:
1999              fprintf_fn (stream, "fv%d", rm * 4);
2000              break;
2001            case XMTRX_M4:
2002              fprintf_fn (stream, "xmtrx");
2003              break;
2004            default:
2005              abort ();
2006            }
2007        }
2008
2009#if 0
2010      /* This code prints instructions in delay slots on the same line
2011         as the instruction which needs the delay slots.  This can be
2012         confusing, since other disassembler don't work this way, and
2013         it means that the instructions are not all in a line.  So I
2014         disabled it.  Ian.  */
2015      if (!(info->flags & 1)
2016          && (op->name[0] == 'j'
2017              || (op->name[0] == 'b'
2018                  && (op->name[1] == 'r'
2019                      || op->name[1] == 's'))
2020              || (op->name[0] == 'r' && op->name[1] == 't')
2021              || (op->name[0] == 'b' && op->name[2] == '.')))
2022        {
2023          info->flags |= 1;
2024          fprintf_fn (stream, "\t(slot ");
2025          print_insn_sh (memaddr + 2, info);
2026          info->flags &= ~1;
2027          fprintf_fn (stream, ")");
2028          return 4;
2029        }
2030#endif
2031
2032      if (disp_pc && strcmp (op->name, "mova") != 0)
2033        {
2034          int size;
2035          bfd_byte bytes[4];
2036
2037          if (relmask == ~(bfd_vma) 1)
2038            size = 2;
2039          else
2040            size = 4;
2041          status = info->read_memory_func (disp_pc_addr, bytes, size, info);
2042          if (status == 0)
2043            {
2044              unsigned int val;
2045
2046              if (size == 2)
2047                {
2048                  if (info->endian == BFD_ENDIAN_LITTLE)
2049                    val = bfd_getl16 (bytes);
2050                  else
2051                    val = bfd_getb16 (bytes);
2052                }
2053              else
2054                {
2055                  if (info->endian == BFD_ENDIAN_LITTLE)
2056                    val = bfd_getl32 (bytes);
2057                  else
2058                    val = bfd_getb32 (bytes);
2059                }
2060              if ((*info->symbol_at_address_func) (val, info))
2061                {
2062                  fprintf_fn (stream, "\t! ");
2063                  (*info->print_address_func) (val, info);
2064                }
2065              else
2066                fprintf_fn (stream, "\t! 0x%x", val);
2067            }
2068        }
2069
2070      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
2071    fail:
2072      ;
2073
2074    }
2075  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
2076  return 2;
2077}
2078