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