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