Coverage Report

Created: 2026-09-14 08:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/sh-dis.c
Line
Count
Source
1
/* Disassemble SH instructions.
2
   Copyright (C) 1993-2026 Free Software Foundation, Inc.
3
4
   This file is part of the GNU opcodes library.
5
6
   This library is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3, or (at your option)
9
   any later version.
10
11
   It is distributed in the hope that it will be useful, but WITHOUT
12
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14
   License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this file; see the file COPYING.  If not, write to the
18
   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include <stdio.h>
23
24
#define STATIC_TABLE
25
#define DEFINE_TABLE
26
27
#include "sh-opc.h"
28
#include "disassemble.h"
29
30
static void
31
print_movxy (const sh_opcode_info *op,
32
       int rn,
33
       int rm,
34
       fprintf_ftype fprintf_fn,
35
       void *stream)
36
62.9k
{
37
62.9k
  int n;
38
39
62.9k
  fprintf_fn (stream, "%s\t", op->name);
40
188k
  for (n = 0; n < 2; n++)
41
125k
    {
42
125k
      switch (op->arg[n])
43
125k
  {
44
0
  case A_IND_N:
45
4.94k
  case AX_IND_N:
46
6.30k
  case AXY_IND_N:
47
15.0k
  case AY_IND_N:
48
15.8k
  case AYX_IND_N:
49
15.8k
    fprintf_fn (stream, "@r%d", rn);
50
15.8k
    break;
51
0
  case A_INC_N:
52
12.9k
  case AX_INC_N:
53
16.2k
  case AXY_INC_N:
54
22.6k
  case AY_INC_N:
55
24.1k
  case AYX_INC_N:
56
24.1k
    fprintf_fn (stream, "@r%d+", rn);
57
24.1k
    break;
58
6.78k
  case AX_PMOD_N:
59
7.55k
  case AXY_PMOD_N:
60
7.55k
    fprintf_fn (stream, "@r%d+r8", rn);
61
7.55k
    break;
62
9.45k
  case AY_PMOD_N:
63
10.5k
  case AYX_PMOD_N:
64
10.5k
    fprintf_fn (stream, "@r%d+r9", rn);
65
10.5k
    break;
66
31.6k
  case DSP_REG_A_M:
67
31.6k
    fprintf_fn (stream, "a%c", '0' + rm);
68
31.6k
    break;
69
13.5k
  case DSP_REG_X:
70
13.5k
    fprintf_fn (stream, "x%c", '0' + rm);
71
13.5k
    break;
72
13.7k
  case DSP_REG_Y:
73
13.7k
    fprintf_fn (stream, "y%c", '0' + rm);
74
13.7k
    break;
75
4.02k
  case DSP_REG_AX:
76
4.02k
    fprintf_fn (stream, "%c%c",
77
4.02k
          (rm & 1) ? 'x' : 'a',
78
4.02k
          (rm & 2) ? '1' : '0');
79
4.02k
    break;
80
1.45k
  case DSP_REG_XY:
81
1.45k
    fprintf_fn (stream, "%c%c",
82
1.45k
          (rm & 1) ? 'y' : 'x',
83
1.45k
          (rm & 2) ? '1' : '0');
84
1.45k
    break;
85
2.43k
  case DSP_REG_AY:
86
2.43k
    fprintf_fn (stream, "%c%c",
87
2.43k
          (rm & 2) ? 'y' : 'a',
88
2.43k
          (rm & 1) ? '1' : '0');
89
2.43k
    break;
90
1.06k
  case DSP_REG_YX:
91
1.06k
    fprintf_fn (stream, "%c%c",
92
1.06k
          (rm & 2) ? 'x' : 'y',
93
1.06k
          (rm & 1) ? '1' : '0');
94
1.06k
    break;
95
0
  default:
96
0
    abort ();
97
125k
  }
98
125k
      if (n == 0)
99
62.9k
  fprintf_fn (stream, ",");
100
125k
    }
101
62.9k
}
102
103
/* Print a double data transfer insn.  INSN is just the lower three
104
   nibbles of the insn, i.e. field a and the bit that indicates if
105
   a parallel processing insn follows.  */
106
107
static void
108
print_insn_ddt (int insn, struct disassemble_info *info)
109
54.7k
{
110
54.7k
  fprintf_ftype fprintf_fn = info->fprintf_func;
111
54.7k
  void *stream = info->stream;
112
113
  /* If this is just a nop, make sure to emit something.  */
114
54.7k
  if (insn == 0x000)
115
809
    {
116
809
      fprintf_fn (stream, "nopx\tnopy");
117
809
      return;
118
809
    }
119
120
  /* If a parallel processing insn was printed before,
121
     and we got a non-nop, emit a tab.  */
122
53.9k
  if ((insn & 0x800) && (insn & 0x3ff))
123
33.0k
    fprintf_fn (stream, "\t");
124
125
  /* Check if either the x or y part is invalid.  */
126
53.9k
  if (((insn & 3) != 0 && (insn & 0xc) == 0 && (insn & 0x2a0))
127
45.4k
      || ((insn & 3) == 0 && (insn & 0xc) != 0 && (insn & 0x150)))
128
19.5k
    if (info->mach != bfd_mach_sh_dsp
129
9.33k
        && info->mach != bfd_mach_sh3_dsp)
130
8.97k
      {
131
8.97k
  static const sh_opcode_info *first_movx, *first_movy;
132
8.97k
  const sh_opcode_info *op;
133
8.97k
  int is_movy;
134
135
8.97k
  if (! first_movx)
136
2
    {
137
554
      for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;)
138
552
        first_movx++;
139
38
      for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;)
140
36
        first_movy++;
141
2
    }
142
143
8.97k
  is_movy = ((insn & 3) != 0);
144
145
8.97k
  if (is_movy)
146
3.49k
    op = first_movy;
147
5.47k
  else
148
5.47k
    op = first_movx;
149
150
75.7k
  while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
151
17.7k
         || op->nibbles[3] != (unsigned) (insn & 0xf))
152
66.8k
    op++;
153
154
8.97k
  print_movxy (op,
155
8.97k
         (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
156
8.97k
          + 2 * is_movy
157
8.97k
          + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
158
8.97k
         (insn >> 6) & 3,
159
8.97k
         fprintf_fn, stream);
160
8.97k
      }
161
10.5k
    else
162
10.5k
      fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
163
34.4k
  else
164
34.4k
    {
165
34.4k
      static const sh_opcode_info *first_movx, *first_movy;
166
34.4k
      const sh_opcode_info *opx, *opy;
167
34.4k
      unsigned int insn_x, insn_y;
168
169
34.4k
      if (! first_movx)
170
2
  {
171
542
    for (first_movx = sh_table; first_movx->nibbles[1] != MOVX;)
172
540
      first_movx++;
173
38
    for (first_movy = first_movx; first_movy->nibbles[1] != MOVY;)
174
36
      first_movy++;
175
2
  }
176
34.4k
      insn_x = (insn >> 2) & 0xb;
177
34.4k
      if (insn_x)
178
27.5k
  {
179
213k
    for (opx = first_movx; opx->nibbles[2] != insn_x;)
180
185k
      opx++;
181
27.5k
    print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
182
27.5k
           fprintf_fn, stream);
183
27.5k
  }
184
34.4k
      insn_y = (insn & 3) | ((insn >> 1) & 8);
185
34.4k
      if (insn_y)
186
26.5k
  {
187
26.5k
    if (insn_x)
188
24.6k
      fprintf_fn (stream, "\t");
189
140k
    for (opy = first_movy; opy->nibbles[2] != insn_y;)
190
113k
      opy++;
191
26.5k
    print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
192
26.5k
           fprintf_fn, stream);
193
26.5k
  }
194
34.4k
      if (!insn_x && !insn_y && ((insn & 0x3ff) != 0 || (insn & 0x800) == 0))
195
3.58k
  fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
196
34.4k
    }
197
53.9k
}
198
199
static void
200
print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
201
35.2k
{
202
35.2k
  switch (rm)
203
35.2k
    {
204
1.69k
    case A_A1_NUM:
205
1.69k
      fprintf_fn (stream, "a1");
206
1.69k
      break;
207
1.60k
    case A_A0_NUM:
208
1.60k
      fprintf_fn (stream, "a0");
209
1.60k
      break;
210
3.32k
    case A_X0_NUM:
211
3.32k
      fprintf_fn (stream, "x0");
212
3.32k
      break;
213
3.69k
    case A_X1_NUM:
214
3.69k
      fprintf_fn (stream, "x1");
215
3.69k
      break;
216
2.82k
    case A_Y0_NUM:
217
2.82k
      fprintf_fn (stream, "y0");
218
2.82k
      break;
219
2.43k
    case A_Y1_NUM:
220
2.43k
      fprintf_fn (stream, "y1");
221
2.43k
      break;
222
1.43k
    case A_M0_NUM:
223
1.43k
      fprintf_fn (stream, "m0");
224
1.43k
      break;
225
1.16k
    case A_A1G_NUM:
226
1.16k
      fprintf_fn (stream, "a1g");
227
1.16k
      break;
228
1.38k
    case A_M1_NUM:
229
1.38k
      fprintf_fn (stream, "m1");
230
1.38k
      break;
231
5.79k
    case A_A0G_NUM:
232
5.79k
      fprintf_fn (stream, "a0g");
233
5.79k
      break;
234
9.90k
    default:
235
9.90k
      fprintf_fn (stream, "0x%x", rm);
236
9.90k
      break;
237
35.2k
    }
238
35.2k
}
239
240
static void
241
print_insn_ppi (int field_b, struct disassemble_info *info)
242
34.5k
{
243
34.5k
  static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
244
34.5k
  static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
245
34.5k
  fprintf_ftype fprintf_fn = info->fprintf_func;
246
34.5k
  void *stream = info->stream;
247
34.5k
  unsigned int nib1, nib2, nib3;
248
34.5k
  unsigned int altnib1, nib4;
249
34.5k
  char *dc = NULL;
250
34.5k
  const sh_opcode_info *op;
251
252
34.5k
  if ((field_b & 0xe800) == 0)
253
6.94k
    {
254
6.94k
      fprintf_fn (stream, "psh%c\t#%d,",
255
6.94k
      field_b & 0x1000 ? 'a' : 'l',
256
6.94k
      (field_b >> 4) & 127);
257
6.94k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
258
6.94k
      return;
259
6.94k
    }
260
27.6k
  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
261
3.32k
    {
262
3.32k
      static char *du_tab[] = { "x0", "y0", "a0", "a1" };
263
3.32k
      static char *se_tab[] = { "x0", "x1", "y0", "a1" };
264
3.32k
      static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
265
3.32k
      static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
266
267
3.32k
      if (field_b & 0x2000)
268
1.68k
  fprintf_fn (stream, "p%s %s,%s,%s\t",
269
1.68k
        (field_b & 0x1000) ? "add" : "sub",
270
1.68k
        sx_tab[(field_b >> 6) & 3],
271
1.68k
        sy_tab[(field_b >> 4) & 3],
272
1.68k
        du_tab[(field_b >> 0) & 3]);
273
274
1.64k
      else if ((field_b & 0xf0) == 0x10
275
436
         && info->mach != bfd_mach_sh_dsp
276
277
         && info->mach != bfd_mach_sh3_dsp)
277
243
  fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
278
279
1.40k
      else if ((field_b & 0xf3) != 0)
280
1.12k
  fprintf_fn (stream, ".word 0x%x\t", field_b);
281
282
3.32k
      fprintf_fn (stream, "pmuls%c%s,%s,%s",
283
3.32k
      field_b & 0x2000 ? ' ' : '\t',
284
3.32k
      se_tab[(field_b >> 10) & 3],
285
3.32k
      sf_tab[(field_b >>  8) & 3],
286
3.32k
      sg_tab[(field_b >>  2) & 3]);
287
3.32k
      return;
288
3.32k
    }
289
290
24.3k
  nib1 = PPIC;
291
24.3k
  nib2 = field_b >> 12 & 0xf;
292
24.3k
  nib3 = field_b >> 8 & 0xf;
293
24.3k
  nib4 = field_b >> 4 & 0xf;
294
24.3k
  switch (nib3 & 0x3)
295
24.3k
    {
296
6.27k
    case 0:
297
6.27k
      dc = "";
298
6.27k
      nib1 = PPI3;
299
6.27k
      break;
300
6.25k
    case 1:
301
6.25k
      dc = "";
302
6.25k
      break;
303
4.78k
    case 2:
304
4.78k
      dc = "dct ";
305
4.78k
      nib3 -= 1;
306
4.78k
      break;
307
7.01k
    case 3:
308
7.01k
      dc = "dcf ";
309
7.01k
      nib3 -= 2;
310
7.01k
      break;
311
24.3k
    }
312
24.3k
  if (nib1 == PPI3)
313
6.27k
    altnib1 = PPI3NC;
314
18.0k
  else
315
18.0k
    altnib1 = nib1;
316
9.61M
  for (op = sh_table; op->name; op++)
317
9.60M
    {
318
9.60M
      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
319
486k
    && op->nibbles[2] == nib2
320
34.5k
    && op->nibbles[3] == nib3)
321
15.8k
  {
322
15.8k
    int n;
323
324
15.8k
    switch (op->nibbles[4])
325
15.8k
      {
326
11.1k
      case HEX_0:
327
11.1k
        break;
328
1.30k
      case HEX_XX00:
329
1.30k
        if ((nib4 & 3) != 0)
330
987
    continue;
331
320
        break;
332
1.53k
      case HEX_1:
333
1.53k
        if ((nib4 & 3) != 1)
334
964
    continue;
335
569
        break;
336
846
      case HEX_00YY:
337
846
        if ((nib4 & 0xc) != 0)
338
605
    continue;
339
241
        break;
340
1.04k
      case HEX_4:
341
1.04k
        if ((nib4 & 0xc) != 4)
342
758
    continue;
343
286
        break;
344
286
      default:
345
0
        abort ();
346
15.8k
      }
347
12.5k
    fprintf_fn (stream, "%s%s\t", dc, op->name);
348
38.8k
    for (n = 0; n < 3 && op->arg[n] != A_END; n++)
349
26.3k
      {
350
26.3k
        if (n && op->arg[1] != A_END)
351
13.8k
    fprintf_fn (stream, ",");
352
26.3k
        switch (op->arg[n])
353
26.3k
    {
354
12.4k
    case DSP_REG_N:
355
12.4k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
356
12.4k
      break;
357
2.78k
    case DSP_REG_X:
358
2.78k
      fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
359
2.78k
      break;
360
8.61k
    case DSP_REG_Y:
361
8.61k
      fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
362
8.61k
      break;
363
541
    case A_MACH:
364
541
      fprintf_fn (stream, "mach");
365
541
      break;
366
1.95k
    case A_MACL:
367
1.95k
      fprintf_fn (stream, "macl");
368
1.95k
      break;
369
0
    default:
370
0
      abort ();
371
26.3k
    }
372
26.3k
      }
373
12.5k
    return;
374
12.5k
  }
375
9.60M
    }
376
  /* Not found.  */
377
11.7k
  fprintf_fn (stream, ".word 0x%x", field_b);
378
11.7k
}
379
380
/* FIXME mvs: movx insns print as ".word 0x%03x", insn & 0xfff
381
   (ie. the upper nibble is missing).  */
382
383
int
384
print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
385
2.29M
{
386
2.29M
  fprintf_ftype fprintf_fn = info->fprintf_func;
387
2.29M
  void *stream = info->stream;
388
2.29M
  unsigned char insn[4];
389
2.29M
  unsigned char nibs[8];
390
2.29M
  int status;
391
2.29M
  bfd_vma relmask = ~(bfd_vma) 0;
392
2.29M
  const sh_opcode_info *op;
393
2.29M
  unsigned int target_arch;
394
2.29M
  int allow_op32;
395
396
2.29M
  switch (info->mach)
397
2.29M
    {
398
135k
    case bfd_mach_sh:
399
135k
      target_arch = arch_sh1;
400
      /* SH coff object files lack information about the machine type, so
401
         we end up with bfd_mach_sh unless it was set explicitly (which
402
   could have happended if this is a call from gdb or the simulator.)  */
403
135k
      if (info->symbols
404
112
    && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
405
0
  target_arch = arch_sh4;
406
135k
      break;
407
2.16M
    default:
408
2.16M
      target_arch = sh_get_arch_from_bfd_mach (info->mach);
409
2.29M
    }
410
411
2.29M
  status = info->read_memory_func (memaddr, insn, 2, info);
412
413
2.29M
  if (status != 0)
414
532
    {
415
532
      info->memory_error_func (status, memaddr, info);
416
532
      return -1;
417
532
    }
418
419
2.29M
  if (info->endian == BFD_ENDIAN_LITTLE)
420
502k
    {
421
502k
      nibs[0] = (insn[1] >> 4) & 0xf;
422
502k
      nibs[1] = insn[1] & 0xf;
423
424
502k
      nibs[2] = (insn[0] >> 4) & 0xf;
425
502k
      nibs[3] = insn[0] & 0xf;
426
502k
    }
427
1.79M
  else
428
1.79M
    {
429
1.79M
      nibs[0] = (insn[0] >> 4) & 0xf;
430
1.79M
      nibs[1] = insn[0] & 0xf;
431
432
1.79M
      nibs[2] = (insn[1] >> 4) & 0xf;
433
1.79M
      nibs[3] = insn[1] & 0xf;
434
1.79M
    }
435
2.29M
  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
436
2.29M
  if (status != 0)
437
2.00k
    allow_op32 = 0;
438
2.29M
  else
439
2.29M
    {
440
2.29M
      allow_op32 = 1;
441
442
2.29M
      if (info->endian == BFD_ENDIAN_LITTLE)
443
501k
  {
444
501k
    nibs[4] = (insn[3] >> 4) & 0xf;
445
501k
    nibs[5] = insn[3] & 0xf;
446
447
501k
    nibs[6] = (insn[2] >> 4) & 0xf;
448
501k
    nibs[7] = insn[2] & 0xf;
449
501k
  }
450
1.79M
      else
451
1.79M
  {
452
1.79M
    nibs[4] = (insn[2] >> 4) & 0xf;
453
1.79M
    nibs[5] = insn[2] & 0xf;
454
455
1.79M
    nibs[6] = (insn[3] >> 4) & 0xf;
456
1.79M
    nibs[7] = insn[3] & 0xf;
457
1.79M
  }
458
2.29M
    }
459
460
2.29M
  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
461
63.7k
      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
462
54.8k
    {
463
54.8k
      if (nibs[1] & 8)
464
34.6k
  {
465
34.6k
    int field_b;
466
467
34.6k
    status = info->read_memory_func (memaddr + 2, insn, 2, info);
468
469
34.6k
    if (status != 0)
470
35
      {
471
35
        info->memory_error_func (status, memaddr + 2, info);
472
35
        return -1;
473
35
      }
474
475
34.5k
    if (info->endian == BFD_ENDIAN_LITTLE)
476
18.0k
      field_b = insn[1] << 8 | insn[0];
477
16.5k
    else
478
16.5k
      field_b = insn[0] << 8 | insn[1];
479
480
34.5k
    print_insn_ppi (field_b, info);
481
34.5k
    print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
482
34.5k
    return 4;
483
34.6k
  }
484
20.1k
      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
485
20.1k
      return 2;
486
54.8k
    }
487
561M
  for (op = sh_table; op->name; op++)
488
560M
    {
489
560M
      int n;
490
560M
      int imm = 0;
491
560M
      int rn = 0;
492
560M
      int rm = 0;
493
560M
      int rb = 0;
494
560M
      int disp_pc;
495
560M
      bfd_vma disp_pc_addr = 0;
496
560M
      int disp = 0;
497
560M
      int has_disp = 0;
498
560M
      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
499
500
560M
      if (!allow_op32
501
413k
    && SH_MERGE_ARCH_SET (op->arch, arch_op32))
502
17.2k
  goto fail;
503
504
560M
      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
505
207M
  goto fail;
506
451M
      for (n = 0; n < max_n; n++)
507
450M
  {
508
450M
    int i = op->nibbles[n];
509
510
450M
    if (i < 16)
511
360M
      {
512
360M
        if (nibs[n] == i)
513
53.9M
    continue;
514
306M
        goto fail;
515
360M
      }
516
90.1M
    switch (i)
517
90.1M
      {
518
19.5k
      case BRANCH_8:
519
19.5k
        imm = (nibs[2] << 4) | (nibs[3]);
520
19.5k
        if (imm & 0x80)
521
8.52k
    imm |= ~0xff;
522
19.5k
        imm = ((char) imm) * 2 + 4;
523
19.5k
        goto ok;
524
101k
      case BRANCH_12:
525
101k
        imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
526
101k
        if (imm & 0x800)
527
51.6k
    imm |= ~0xfff;
528
101k
        imm = imm * 2 + 4;
529
101k
        goto ok;
530
4.48k
      case IMM0_3c:
531
4.48k
        if (nibs[3] & 0x8)
532
504
    goto fail;
533
3.98k
        imm = nibs[3] & 0x7;
534
3.98k
        break;
535
3.87k
      case IMM0_3s:
536
3.87k
        if (!(nibs[3] & 0x8))
537
2.76k
    goto fail;
538
1.10k
        imm = nibs[3] & 0x7;
539
1.10k
        break;
540
21.2k
      case IMM0_3Uc:
541
21.2k
        if (nibs[2] & 0x8)
542
5.00k
    goto fail;
543
16.2k
        imm = nibs[2] & 0x7;
544
16.2k
        break;
545
0
      case IMM0_3Us:
546
0
        if (!(nibs[2] & 0x8))
547
0
    goto fail;
548
0
        imm = nibs[2] & 0x7;
549
0
        break;
550
194
      case DISP0_12:
551
1.60k
      case DISP1_12:
552
1.60k
        disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
553
1.60k
        has_disp = 1;
554
1.60k
        goto ok;
555
329
      case DISP0_12BY2:
556
522
      case DISP1_12BY2:
557
522
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
558
522
        relmask = ~(bfd_vma) 1;
559
522
        has_disp = 1;
560
522
        goto ok;
561
595
      case DISP0_12BY4:
562
2.60k
      case DISP1_12BY4:
563
2.60k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
564
2.60k
        relmask = ~(bfd_vma) 3;
565
2.60k
        has_disp = 1;
566
2.60k
        goto ok;
567
802
      case DISP0_12BY8:
568
4.25k
      case DISP1_12BY8:
569
4.25k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
570
4.25k
        relmask = ~(bfd_vma) 7;
571
4.25k
        has_disp = 1;
572
4.25k
        goto ok;
573
117k
      case IMM0_20_4:
574
117k
        break;
575
78.0k
      case IMM0_20:
576
78.0k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
577
78.0k
         | (nibs[6] << 4) | nibs[7]);
578
78.0k
        if (imm & 0x80000)
579
3.41k
    imm -= 0x100000;
580
78.0k
        goto ok;
581
8.26k
      case IMM0_20BY8:
582
8.26k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
583
8.26k
         | (nibs[6] << 4) | nibs[7]);
584
8.26k
        imm <<= 8;
585
8.26k
        if (imm & 0x8000000)
586
1.05k
    imm -= 0x10000000;
587
8.26k
        goto ok;
588
5.16k
      case IMM0_4:
589
19.4k
      case IMM1_4:
590
19.4k
        imm = nibs[3];
591
19.4k
        goto ok;
592
5.51k
      case IMM0_4BY2:
593
9.23k
      case IMM1_4BY2:
594
9.23k
        imm = nibs[3] << 1;
595
9.23k
        goto ok;
596
66.0k
      case IMM0_4BY4:
597
172k
      case IMM1_4BY4:
598
172k
        imm = nibs[3] << 2;
599
172k
        goto ok;
600
169k
      case IMM0_8S:
601
174k
      case IMM1_8:
602
174k
        imm = (nibs[2] << 4) | nibs[3];
603
174k
        disp = imm;
604
174k
        has_disp = 1;
605
174k
        if (imm & 0x80)
606
66.1k
    imm -= 0x100;
607
174k
        goto ok;
608
39.9k
      case IMM0_8U:
609
39.9k
        disp = imm = (nibs[2] << 4) | nibs[3];
610
39.9k
        has_disp = 1;
611
39.9k
        goto ok;
612
62.8k
      case PCRELIMM_8BY2:
613
62.8k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
614
62.8k
        relmask = ~(bfd_vma) 1;
615
62.8k
        goto ok;
616
59.6k
      case PCRELIMM_8BY4:
617
59.6k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
618
59.6k
        relmask = ~(bfd_vma) 3;
619
59.6k
        goto ok;
620
3.62k
      case IMM0_8BY2:
621
7.94k
      case IMM1_8BY2:
622
7.94k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
623
7.94k
        goto ok;
624
5.55k
      case IMM0_8BY4:
625
8.26k
      case IMM1_8BY4:
626
8.26k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
627
8.26k
        goto ok;
628
135k
      case REG_N_D:
629
135k
        if ((nibs[n] & 1) != 0)
630
118k
    goto fail;
631
        /* Fall through.  */
632
31.6M
      case REG_N:
633
31.6M
        rn = nibs[n];
634
31.6M
        break;
635
12.3M
      case REG_M:
636
12.3M
        rm = nibs[n];
637
12.3M
        break;
638
20.4k
      case REG_N_B01:
639
20.4k
        if ((nibs[n] & 0x3) != 1 /* binary 01 */)
640
18.6k
    goto fail;
641
1.72k
        rn = (nibs[n] & 0xc) >> 2;
642
1.72k
        break;
643
28.6k
      case REG_NM:
644
28.6k
        rn = (nibs[n] & 0xc) >> 2;
645
28.6k
        rm = (nibs[n] & 0x3);
646
28.6k
        break;
647
165k
      case REG_B:
648
165k
        if (!(nibs[n] & 0x08)) /* Must always be 1.  */
649
131k
    goto fail;
650
34.0k
        rb = nibs[n] & 0x07;
651
34.0k
        break;
652
2.22M
      case SDT_REG_N:
653
        /* sh-dsp: single data transfer.  */
654
2.22M
        rn = nibs[n];
655
2.22M
        if ((rn & 0xc) != 4)
656
2.10M
    goto fail;
657
122k
        rn = rn & 0x3;
658
122k
        rn |= (!(rn & 2)) << 2;
659
122k
        break;
660
40.8M
      case PPI:
661
42.6M
      case REPEAT:
662
42.6M
        goto fail;
663
0
      default:
664
0
        abort ();
665
90.1M
      }
666
90.1M
  }
667
668
1.41M
    ok:
669
      /* sh2a has D_REG but not X_REG.  We don't know the pattern
670
   doesn't match unless we check the output args to see if they
671
   make sense.  */
672
1.41M
      if (target_arch == arch_sh2a
673
269k
    && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
674
267k
        || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
675
2.04k
  goto fail;
676
677
1.41M
      fprintf_fn (stream, "%s\t", op->name);
678
1.41M
      disp_pc = 0;
679
4.04M
      for (n = 0; n < 3 && op->arg[n] != A_END; n++)
680
2.63M
  {
681
2.63M
    if (n && op->arg[1] != A_END)
682
1.23M
      fprintf_fn (stream, ",");
683
2.63M
    switch (op->arg[n])
684
2.63M
      {
685
298k
      case A_IMM:
686
298k
        fprintf_fn (stream, "#%d", imm);
687
298k
        break;
688
80.2k
      case A_R0:
689
80.2k
        fprintf_fn (stream, "r0");
690
80.2k
        break;
691
844k
      case A_REG_N:
692
844k
        fprintf_fn (stream, "r%d", rn);
693
844k
        break;
694
37.0k
      case A_INC_N:
695
37.0k
      case AS_INC_N:
696
37.0k
        fprintf_fn (stream, "@r%d+", rn);
697
37.0k
        break;
698
27.5k
      case A_DEC_N:
699
27.5k
      case AS_DEC_N:
700
27.5k
        fprintf_fn (stream, "@-r%d", rn);
701
27.5k
        break;
702
53.6k
      case A_IND_N:
703
53.6k
      case AS_IND_N:
704
53.6k
        fprintf_fn (stream, "@r%d", rn);
705
53.6k
        break;
706
112k
      case A_DISP_REG_N:
707
112k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
708
112k
        break;
709
3.27k
      case AS_PMOD_N:
710
3.27k
        fprintf_fn (stream, "@r%d+r8", rn);
711
3.27k
        break;
712
463k
      case A_REG_M:
713
463k
        fprintf_fn (stream, "r%d", rm);
714
463k
        break;
715
51.8k
      case A_INC_M:
716
51.8k
        fprintf_fn (stream, "@r%d+", rm);
717
51.8k
        break;
718
185
      case A_DEC_M:
719
185
        fprintf_fn (stream, "@-r%d", rm);
720
185
        break;
721
36.6k
      case A_IND_M:
722
36.6k
        fprintf_fn (stream, "@r%d", rm);
723
36.6k
        break;
724
96.2k
      case A_DISP_REG_M:
725
96.2k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
726
96.2k
        break;
727
2.03k
      case A_REG_B:
728
2.03k
        fprintf_fn (stream, "r%d_bank", rb);
729
2.03k
        break;
730
122k
      case A_DISP_PC:
731
122k
        disp_pc = 1;
732
122k
        disp_pc_addr = imm + 4 + (memaddr & relmask);
733
122k
        (*info->print_address_func) (disp_pc_addr, info);
734
122k
        break;
735
60.4k
      case A_IND_R0_REG_N:
736
60.4k
        fprintf_fn (stream, "@(r0,r%d)", rn);
737
60.4k
        break;
738
54.4k
      case A_IND_R0_REG_M:
739
54.4k
        fprintf_fn (stream, "@(r0,r%d)", rm);
740
54.4k
        break;
741
23.2k
      case A_DISP_GBR:
742
23.2k
        fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
743
23.2k
        break;
744
1.62k
      case A_TBR:
745
1.62k
        fprintf_fn (stream, "tbr");
746
1.62k
        break;
747
1.46k
      case A_DISP2_TBR:
748
1.46k
        fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
749
1.46k
        break;
750
311
      case A_INC_R15:
751
311
        fprintf_fn (stream, "@r15+");
752
311
        break;
753
298
      case A_DEC_R15:
754
298
        fprintf_fn (stream, "@-r15");
755
298
        break;
756
16.9k
      case A_R0_GBR:
757
16.9k
        fprintf_fn (stream, "@(r0,gbr)");
758
16.9k
        break;
759
101k
      case A_BDISP12:
760
121k
      case A_BDISP8:
761
121k
        (*info->print_address_func) (imm + memaddr, info);
762
121k
        break;
763
15.5k
      case A_SR:
764
15.5k
        fprintf_fn (stream, "sr");
765
15.5k
        break;
766
3.87k
      case A_GBR:
767
3.87k
        fprintf_fn (stream, "gbr");
768
3.87k
        break;
769
1.66k
      case A_VBR:
770
1.66k
        fprintf_fn (stream, "vbr");
771
1.66k
        break;
772
980
      case A_DSR:
773
980
        fprintf_fn (stream, "dsr");
774
980
        break;
775
1.13k
      case A_MOD:
776
1.13k
        fprintf_fn (stream, "mod");
777
1.13k
        break;
778
1.09k
      case A_RE:
779
1.09k
        fprintf_fn (stream, "re");
780
1.09k
        break;
781
1.01k
      case A_RS:
782
1.01k
        fprintf_fn (stream, "rs");
783
1.01k
        break;
784
1.42k
      case A_A0:
785
1.42k
        fprintf_fn (stream, "a0");
786
1.42k
        break;
787
1.11k
      case A_X0:
788
1.11k
        fprintf_fn (stream, "x0");
789
1.11k
        break;
790
1.34k
      case A_X1:
791
1.34k
        fprintf_fn (stream, "x1");
792
1.34k
        break;
793
1.21k
      case A_Y0:
794
1.21k
        fprintf_fn (stream, "y0");
795
1.21k
        break;
796
860
      case A_Y1:
797
860
        fprintf_fn (stream, "y1");
798
860
        break;
799
15.8k
      case DSP_REG_M:
800
15.8k
        print_dsp_reg (rm, fprintf_fn, stream);
801
15.8k
        break;
802
566
      case A_SSR:
803
566
        fprintf_fn (stream, "ssr");
804
566
        break;
805
2.74k
      case A_SPC:
806
2.74k
        fprintf_fn (stream, "spc");
807
2.74k
        break;
808
5.25k
      case A_MACH:
809
5.25k
        fprintf_fn (stream, "mach");
810
5.25k
        break;
811
1.94k
      case A_MACL:
812
1.94k
        fprintf_fn (stream, "macl");
813
1.94k
        break;
814
3.80k
      case A_PR:
815
3.80k
        fprintf_fn (stream, "pr");
816
3.80k
        break;
817
793
      case A_SGR:
818
793
        fprintf_fn (stream, "sgr");
819
793
        break;
820
1.05k
      case A_DBR:
821
1.05k
        fprintf_fn (stream, "dbr");
822
1.05k
        break;
823
22.7k
      case F_REG_N:
824
22.7k
        fprintf_fn (stream, "fr%d", rn);
825
22.7k
        break;
826
24.0k
      case F_REG_M:
827
24.0k
        fprintf_fn (stream, "fr%d", rm);
828
24.0k
        break;
829
423
      case DX_REG_N:
830
423
        if (rn & 1)
831
107
    {
832
107
      fprintf_fn (stream, "xd%d", rn & ~1);
833
107
      break;
834
107
    }
835
        /* Fall through.  */
836
618
      case D_REG_N:
837
618
        fprintf_fn (stream, "dr%d", rn);
838
618
        break;
839
1.78k
      case DX_REG_M:
840
1.78k
        if (rm & 1)
841
1.34k
    {
842
1.34k
      fprintf_fn (stream, "xd%d", rm & ~1);
843
1.34k
      break;
844
1.34k
    }
845
        /* Fall through.  */
846
448
      case D_REG_M:
847
448
        fprintf_fn (stream, "dr%d", rm);
848
448
        break;
849
320
      case FPSCR_M:
850
467
      case FPSCR_N:
851
467
        fprintf_fn (stream, "fpscr");
852
467
        break;
853
1.31k
      case FPUL_M:
854
1.80k
      case FPUL_N:
855
1.80k
        fprintf_fn (stream, "fpul");
856
1.80k
        break;
857
2.21k
      case F_FR0:
858
2.21k
        fprintf_fn (stream, "fr0");
859
2.21k
        break;
860
1.71k
      case V_REG_N:
861
1.71k
        fprintf_fn (stream, "fv%d", rn * 4);
862
1.71k
        break;
863
186
      case V_REG_M:
864
186
        fprintf_fn (stream, "fv%d", rm * 4);
865
186
        break;
866
1.53k
      case XMTRX_M4:
867
1.53k
        fprintf_fn (stream, "xmtrx");
868
1.53k
        break;
869
0
      default:
870
0
        abort ();
871
2.63M
      }
872
2.63M
  }
873
874
#if 0
875
      /* This code prints instructions in delay slots on the same line
876
         as the instruction which needs the delay slots.  This can be
877
         confusing, since other disassembler don't work this way, and
878
         it means that the instructions are not all in a line.  So I
879
         disabled it.  Ian.  */
880
      if (!(info->flags & 1)
881
    && (op->name[0] == 'j'
882
        || (op->name[0] == 'b'
883
      && (op->name[1] == 'r'
884
          || op->name[1] == 's'))
885
        || (op->name[0] == 'r' && op->name[1] == 't')
886
        || (op->name[0] == 'b' && op->name[2] == '.')))
887
  {
888
    info->flags |= 1;
889
    fprintf_fn (stream, "\t(slot ");
890
    print_insn_sh (memaddr + 2, info);
891
    info->flags &= ~1;
892
    fprintf_fn (stream, ")");
893
    return 4;
894
  }
895
#endif
896
897
1.41M
      if (disp_pc && strcmp (op->name, "mova") != 0)
898
117k
  {
899
117k
    int size;
900
117k
    bfd_byte bytes[4];
901
902
117k
    if (relmask == ~(bfd_vma) 1)
903
62.8k
      size = 2;
904
54.8k
    else
905
54.8k
      size = 4;
906
    /* Not reading an instruction - disable stop_vma.  */
907
117k
    info->stop_vma = 0;
908
117k
    status = info->read_memory_func (disp_pc_addr, bytes, size, info);
909
117k
    if (status == 0)
910
101k
      {
911
101k
        unsigned int val;
912
913
101k
        if (size == 2)
914
57.5k
    {
915
57.5k
      if (info->endian == BFD_ENDIAN_LITTLE)
916
12.4k
        val = bfd_getl16 (bytes);
917
45.0k
      else
918
45.0k
        val = bfd_getb16 (bytes);
919
57.5k
    }
920
44.3k
        else
921
44.3k
    {
922
44.3k
      if (info->endian == BFD_ENDIAN_LITTLE)
923
7.21k
        val = bfd_getl32 (bytes);
924
37.1k
      else
925
37.1k
        val = bfd_getb32 (bytes);
926
44.3k
    }
927
101k
        if ((*info->symbol_at_address_func) (val, info))
928
0
    {
929
0
      fprintf_fn (stream, "\t! ");
930
0
      (*info->print_address_func) (val, info);
931
0
    }
932
101k
        else
933
101k
    fprintf_fn (stream, "\t! %x", val);
934
101k
      }
935
117k
  }
936
937
1.41M
      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
938
559M
    fail:
939
559M
      ;
940
941
559M
    }
942
827k
  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
943
827k
  return 2;
944
2.24M
}