Statistics
| Branch: | Revision:

root / sh4-dis.c @ 153859be

History | View | Annotate | Download (83.2 kB)

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

    
25
typedef 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
  }
98
sh_nibble_type;
99

    
100
typedef 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
  }
194
sh_arg_type;
195

    
196
typedef 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
  }
203
sh_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 .  */
270
unsigned int sh_get_arch_from_bfd_mach (unsigned long mach);
271
unsigned int sh_get_arch_up_from_bfd_mach (unsigned long mach);
272
unsigned 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
  /              |                      \
283
SH-DSP          SH3-nommu               SH2E
284
 |               |`--------.             |
285
 |               |          \            |
286
 |              SH3     SH4-nommu-nofpu  |
287
 |               |           |           |
288
 | .------------'|`----------+---------. |
289
 |/                         /           \|
290
 |               | .-------'             |
291
 |               |/                      |
292
SH3-dsp         SH4-nofpu               SH3E
293
 |               |`--------------------. |
294
 |               |                      \|
295
 |              SH4A-nofpu              SH4
296
 | .------------' `--------------------. |
297
 |/                                     \|
298
SH4AL-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

    
327
typedef 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

    
337
const 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

    
1168
static void print_movxy
1169
  PARAMS ((const sh_opcode_info *, int, int, fprintf_ftype, void *));
1170
static void print_insn_ddt PARAMS ((int, struct disassemble_info *));
1171
static void print_dsp_reg PARAMS ((int, fprintf_ftype, void *));
1172
static void print_insn_ppi PARAMS ((int, struct disassemble_info *));
1173

    
1174
static void
1175
print_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

    
1252
static void
1253
print_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

    
1341
static void
1342
print_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

    
1385
static void
1386
print_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).  */
1532
int
1533
print_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
}