Coverage Report

Created: 2025-07-08 11:15

/src/binutils-gdb/opcodes/sh-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Disassemble SH instructions.
2
   Copyright (C) 1993-2025 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
48.6k
{
37
48.6k
  int n;
38
39
48.6k
  fprintf_fn (stream, "%s\t", op->name);
40
146k
  for (n = 0; n < 2; n++)
41
97.3k
    {
42
97.3k
      switch (op->arg[n])
43
97.3k
  {
44
0
  case A_IND_N:
45
3.65k
  case AX_IND_N:
46
4.75k
  case AXY_IND_N:
47
10.6k
  case AY_IND_N:
48
11.8k
  case AYX_IND_N:
49
11.8k
    fprintf_fn (stream, "@r%d", rn);
50
11.8k
    break;
51
0
  case A_INC_N:
52
9.23k
  case AX_INC_N:
53
11.8k
  case AXY_INC_N:
54
17.4k
  case AY_INC_N:
55
18.7k
  case AYX_INC_N:
56
18.7k
    fprintf_fn (stream, "@r%d+", rn);
57
18.7k
    break;
58
4.61k
  case AX_PMOD_N:
59
5.24k
  case AXY_PMOD_N:
60
5.24k
    fprintf_fn (stream, "@r%d+r8", rn);
61
5.24k
    break;
62
6.10k
  case AY_PMOD_N:
63
7.23k
  case AYX_PMOD_N:
64
7.23k
    fprintf_fn (stream, "@r%d+r9", rn);
65
7.23k
    break;
66
23.1k
  case DSP_REG_A_M:
67
23.1k
    fprintf_fn (stream, "a%c", '0' + rm);
68
23.1k
    break;
69
11.7k
  case DSP_REG_X:
70
11.7k
    fprintf_fn (stream, "x%c", '0' + rm);
71
11.7k
    break;
72
11.3k
  case DSP_REG_Y:
73
11.3k
    fprintf_fn (stream, "y%c", '0' + rm);
74
11.3k
    break;
75
3.15k
  case DSP_REG_AX:
76
3.15k
    fprintf_fn (stream, "%c%c",
77
3.15k
          (rm & 1) ? 'x' : 'a',
78
3.15k
          (rm & 2) ? '1' : '0');
79
3.15k
    break;
80
1.15k
  case DSP_REG_XY:
81
1.15k
    fprintf_fn (stream, "%c%c",
82
1.15k
          (rm & 1) ? 'y' : 'x',
83
1.15k
          (rm & 2) ? '1' : '0');
84
1.15k
    break;
85
2.10k
  case DSP_REG_AY:
86
2.10k
    fprintf_fn (stream, "%c%c",
87
2.10k
          (rm & 2) ? 'y' : 'a',
88
2.10k
          (rm & 1) ? '1' : '0');
89
2.10k
    break;
90
1.58k
  case DSP_REG_YX:
91
1.58k
    fprintf_fn (stream, "%c%c",
92
1.58k
          (rm & 2) ? 'x' : 'y',
93
1.58k
          (rm & 1) ? '1' : '0');
94
1.58k
    break;
95
0
  default:
96
0
    abort ();
97
97.3k
  }
98
97.3k
      if (n == 0)
99
48.6k
  fprintf_fn (stream, ",");
100
97.3k
    }
101
48.6k
}
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
36.5k
{
110
36.5k
  fprintf_ftype fprintf_fn = info->fprintf_func;
111
36.5k
  void *stream = info->stream;
112
113
  /* If this is just a nop, make sure to emit something.  */
114
36.5k
  if (insn == 0x000)
115
474
    {
116
474
      fprintf_fn (stream, "nopx\tnopy");
117
474
      return;
118
474
    }
119
120
  /* If a parallel processing insn was printed before,
121
     and we got a non-nop, emit a tab.  */
122
36.0k
  if ((insn & 0x800) && (insn & 0x3ff))
123
22.5k
    fprintf_fn (stream, "\t");
124
125
  /* Check if either the x or y part is invalid.  */
126
36.0k
  if (((insn & 3) != 0 && (insn & 0xc) == 0 && (insn & 0x2a0))
127
36.0k
      || ((insn & 3) == 0 && (insn & 0xc) != 0 && (insn & 0x150)))
128
11.7k
    if (info->mach != bfd_mach_sh_dsp
129
11.7k
        && info->mach != bfd_mach_sh3_dsp)
130
7.99k
      {
131
7.99k
  static const sh_opcode_info *first_movx, *first_movy;
132
7.99k
  const sh_opcode_info *op;
133
7.99k
  int is_movy;
134
135
7.99k
  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
7.99k
  is_movy = ((insn & 3) != 0);
144
145
7.99k
  if (is_movy)
146
3.68k
    op = first_movy;
147
4.30k
  else
148
4.30k
    op = first_movx;
149
150
65.2k
  while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
151
65.2k
         || op->nibbles[3] != (unsigned) (insn & 0xf))
152
57.2k
    op++;
153
154
7.99k
  print_movxy (op,
155
7.99k
         (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
156
7.99k
          + 2 * is_movy
157
7.99k
          + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
158
7.99k
         (insn >> 6) & 3,
159
7.99k
         fprintf_fn, stream);
160
7.99k
      }
161
3.78k
    else
162
3.78k
      fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
163
24.2k
  else
164
24.2k
    {
165
24.2k
      static const sh_opcode_info *first_movx, *first_movy;
166
24.2k
      const sh_opcode_info *opx, *opy;
167
24.2k
      unsigned int insn_x, insn_y;
168
169
24.2k
      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
24.2k
      insn_x = (insn >> 2) & 0xb;
177
24.2k
      if (insn_x)
178
20.4k
  {
179
186k
    for (opx = first_movx; opx->nibbles[2] != insn_x;)
180
165k
      opx++;
181
20.4k
    print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
182
20.4k
           fprintf_fn, stream);
183
20.4k
  }
184
24.2k
      insn_y = (insn & 3) | ((insn >> 1) & 8);
185
24.2k
      if (insn_y)
186
20.2k
  {
187
20.2k
    if (insn_x)
188
18.8k
      fprintf_fn (stream, "\t");
189
129k
    for (opy = first_movy; opy->nibbles[2] != insn_y;)
190
109k
      opy++;
191
20.2k
    print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
192
20.2k
           fprintf_fn, stream);
193
20.2k
  }
194
24.2k
      if (!insn_x && !insn_y && ((insn & 0x3ff) != 0 || (insn & 0x800) == 0))
195
1.82k
  fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
196
24.2k
    }
197
36.0k
}
198
199
static void
200
print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
201
23.0k
{
202
23.0k
  switch (rm)
203
23.0k
    {
204
611
    case A_A1_NUM:
205
611
      fprintf_fn (stream, "a1");
206
611
      break;
207
1.03k
    case A_A0_NUM:
208
1.03k
      fprintf_fn (stream, "a0");
209
1.03k
      break;
210
1.37k
    case A_X0_NUM:
211
1.37k
      fprintf_fn (stream, "x0");
212
1.37k
      break;
213
1.99k
    case A_X1_NUM:
214
1.99k
      fprintf_fn (stream, "x1");
215
1.99k
      break;
216
2.80k
    case A_Y0_NUM:
217
2.80k
      fprintf_fn (stream, "y0");
218
2.80k
      break;
219
1.20k
    case A_Y1_NUM:
220
1.20k
      fprintf_fn (stream, "y1");
221
1.20k
      break;
222
896
    case A_M0_NUM:
223
896
      fprintf_fn (stream, "m0");
224
896
      break;
225
755
    case A_A1G_NUM:
226
755
      fprintf_fn (stream, "a1g");
227
755
      break;
228
938
    case A_M1_NUM:
229
938
      fprintf_fn (stream, "m1");
230
938
      break;
231
4.16k
    case A_A0G_NUM:
232
4.16k
      fprintf_fn (stream, "a0g");
233
4.16k
      break;
234
7.32k
    default:
235
7.32k
      fprintf_fn (stream, "0x%x", rm);
236
7.32k
      break;
237
23.0k
    }
238
23.0k
}
239
240
static void
241
print_insn_ppi (int field_b, struct disassemble_info *info)
242
23.0k
{
243
23.0k
  static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
244
23.0k
  static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
245
23.0k
  fprintf_ftype fprintf_fn = info->fprintf_func;
246
23.0k
  void *stream = info->stream;
247
23.0k
  unsigned int nib1, nib2, nib3;
248
23.0k
  unsigned int altnib1, nib4;
249
23.0k
  char *dc = NULL;
250
23.0k
  const sh_opcode_info *op;
251
252
23.0k
  if ((field_b & 0xe800) == 0)
253
3.89k
    {
254
3.89k
      fprintf_fn (stream, "psh%c\t#%d,",
255
3.89k
      field_b & 0x1000 ? 'a' : 'l',
256
3.89k
      (field_b >> 4) & 127);
257
3.89k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
258
3.89k
      return;
259
3.89k
    }
260
19.2k
  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
261
2.15k
    {
262
2.15k
      static char *du_tab[] = { "x0", "y0", "a0", "a1" };
263
2.15k
      static char *se_tab[] = { "x0", "x1", "y0", "a1" };
264
2.15k
      static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
265
2.15k
      static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
266
267
2.15k
      if (field_b & 0x2000)
268
1.23k
  fprintf_fn (stream, "p%s %s,%s,%s\t",
269
1.23k
        (field_b & 0x1000) ? "add" : "sub",
270
1.23k
        sx_tab[(field_b >> 6) & 3],
271
1.23k
        sy_tab[(field_b >> 4) & 3],
272
1.23k
        du_tab[(field_b >> 0) & 3]);
273
274
920
      else if ((field_b & 0xf0) == 0x10
275
920
         && info->mach != bfd_mach_sh_dsp
276
920
         && info->mach != bfd_mach_sh3_dsp)
277
38
  fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
278
279
882
      else if ((field_b & 0xf3) != 0)
280
749
  fprintf_fn (stream, ".word 0x%x\t", field_b);
281
282
2.15k
      fprintf_fn (stream, "pmuls%c%s,%s,%s",
283
2.15k
      field_b & 0x2000 ? ' ' : '\t',
284
2.15k
      se_tab[(field_b >> 10) & 3],
285
2.15k
      sf_tab[(field_b >>  8) & 3],
286
2.15k
      sg_tab[(field_b >>  2) & 3]);
287
2.15k
      return;
288
2.15k
    }
289
290
17.0k
  nib1 = PPIC;
291
17.0k
  nib2 = field_b >> 12 & 0xf;
292
17.0k
  nib3 = field_b >> 8 & 0xf;
293
17.0k
  nib4 = field_b >> 4 & 0xf;
294
17.0k
  switch (nib3 & 0x3)
295
17.0k
    {
296
4.54k
    case 0:
297
4.54k
      dc = "";
298
4.54k
      nib1 = PPI3;
299
4.54k
      break;
300
3.95k
    case 1:
301
3.95k
      dc = "";
302
3.95k
      break;
303
4.30k
    case 2:
304
4.30k
      dc = "dct ";
305
4.30k
      nib3 -= 1;
306
4.30k
      break;
307
4.24k
    case 3:
308
4.24k
      dc = "dcf ";
309
4.24k
      nib3 -= 2;
310
4.24k
      break;
311
17.0k
    }
312
17.0k
  if (nib1 == PPI3)
313
4.54k
    altnib1 = PPI3NC;
314
12.5k
  else
315
12.5k
    altnib1 = nib1;
316
6.73M
  for (op = sh_table; op->name; op++)
317
6.72M
    {
318
6.72M
      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
319
6.72M
    && op->nibbles[2] == nib2
320
6.72M
    && op->nibbles[3] == nib3)
321
11.0k
  {
322
11.0k
    int n;
323
324
11.0k
    switch (op->nibbles[4])
325
11.0k
      {
326
8.07k
      case HEX_0:
327
8.07k
        break;
328
855
      case HEX_XX00:
329
855
        if ((nib4 & 3) != 0)
330
702
    continue;
331
153
        break;
332
995
      case HEX_1:
333
995
        if ((nib4 & 3) != 1)
334
644
    continue;
335
351
        break;
336
552
      case HEX_00YY:
337
552
        if ((nib4 & 0xc) != 0)
338
417
    continue;
339
135
        break;
340
536
      case HEX_4:
341
536
        if ((nib4 & 0xc) != 4)
342
468
    continue;
343
68
        break;
344
68
      default:
345
0
        abort ();
346
11.0k
      }
347
8.78k
    fprintf_fn (stream, "%s%s\t", dc, op->name);
348
27.3k
    for (n = 0; n < 3 && op->arg[n] != A_END; n++)
349
18.5k
      {
350
18.5k
        if (n && op->arg[1] != A_END)
351
9.75k
    fprintf_fn (stream, ",");
352
18.5k
        switch (op->arg[n])
353
18.5k
    {
354
8.68k
    case DSP_REG_N:
355
8.68k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
356
8.68k
      break;
357
1.96k
    case DSP_REG_X:
358
1.96k
      fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
359
1.96k
      break;
360
6.26k
    case DSP_REG_Y:
361
6.26k
      fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
362
6.26k
      break;
363
294
    case A_MACH:
364
294
      fprintf_fn (stream, "mach");
365
294
      break;
366
1.33k
    case A_MACL:
367
1.33k
      fprintf_fn (stream, "macl");
368
1.33k
      break;
369
0
    default:
370
0
      abort ();
371
18.5k
    }
372
18.5k
      }
373
8.78k
    return;
374
8.78k
  }
375
6.72M
    }
376
  /* Not found.  */
377
8.26k
  fprintf_fn (stream, ".word 0x%x", field_b);
378
8.26k
}
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
4.44M
{
386
4.44M
  fprintf_ftype fprintf_fn = info->fprintf_func;
387
4.44M
  void *stream = info->stream;
388
4.44M
  unsigned char insn[4];
389
4.44M
  unsigned char nibs[8];
390
4.44M
  int status;
391
4.44M
  bfd_vma relmask = ~(bfd_vma) 0;
392
4.44M
  const sh_opcode_info *op;
393
4.44M
  unsigned int target_arch;
394
4.44M
  int allow_op32;
395
396
4.44M
  switch (info->mach)
397
4.44M
    {
398
613k
    case bfd_mach_sh:
399
613k
      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
613k
      if (info->symbols
404
613k
    && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
405
0
  target_arch = arch_sh4;
406
613k
      break;
407
3.82M
    default:
408
3.82M
      target_arch = sh_get_arch_from_bfd_mach (info->mach);
409
4.44M
    }
410
411
4.44M
  status = info->read_memory_func (memaddr, insn, 2, info);
412
413
4.44M
  if (status != 0)
414
520
    {
415
520
      info->memory_error_func (status, memaddr, info);
416
520
      return -1;
417
520
    }
418
419
4.44M
  if (info->endian == BFD_ENDIAN_LITTLE)
420
3.40M
    {
421
3.40M
      nibs[0] = (insn[1] >> 4) & 0xf;
422
3.40M
      nibs[1] = insn[1] & 0xf;
423
424
3.40M
      nibs[2] = (insn[0] >> 4) & 0xf;
425
3.40M
      nibs[3] = insn[0] & 0xf;
426
3.40M
    }
427
1.03M
  else
428
1.03M
    {
429
1.03M
      nibs[0] = (insn[0] >> 4) & 0xf;
430
1.03M
      nibs[1] = insn[0] & 0xf;
431
432
1.03M
      nibs[2] = (insn[1] >> 4) & 0xf;
433
1.03M
      nibs[3] = insn[1] & 0xf;
434
1.03M
    }
435
4.44M
  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
436
4.44M
  if (status != 0)
437
1.45k
    allow_op32 = 0;
438
4.43M
  else
439
4.43M
    {
440
4.43M
      allow_op32 = 1;
441
442
4.43M
      if (info->endian == BFD_ENDIAN_LITTLE)
443
3.40M
  {
444
3.40M
    nibs[4] = (insn[3] >> 4) & 0xf;
445
3.40M
    nibs[5] = insn[3] & 0xf;
446
447
3.40M
    nibs[6] = (insn[2] >> 4) & 0xf;
448
3.40M
    nibs[7] = insn[2] & 0xf;
449
3.40M
  }
450
1.03M
      else
451
1.03M
  {
452
1.03M
    nibs[4] = (insn[2] >> 4) & 0xf;
453
1.03M
    nibs[5] = insn[2] & 0xf;
454
455
1.03M
    nibs[6] = (insn[3] >> 4) & 0xf;
456
1.03M
    nibs[7] = insn[3] & 0xf;
457
1.03M
  }
458
4.43M
    }
459
460
4.44M
  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
461
4.44M
      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
462
36.5k
    {
463
36.5k
      if (nibs[1] & 8)
464
23.1k
  {
465
23.1k
    int field_b;
466
467
23.1k
    status = info->read_memory_func (memaddr + 2, insn, 2, info);
468
469
23.1k
    if (status != 0)
470
14
      {
471
14
        info->memory_error_func (status, memaddr + 2, info);
472
14
        return -1;
473
14
      }
474
475
23.0k
    if (info->endian == BFD_ENDIAN_LITTLE)
476
14.7k
      field_b = insn[1] << 8 | insn[0];
477
8.31k
    else
478
8.31k
      field_b = insn[0] << 8 | insn[1];
479
480
23.0k
    print_insn_ppi (field_b, info);
481
23.0k
    print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
482
23.0k
    return 4;
483
23.1k
  }
484
13.4k
      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
485
13.4k
      return 2;
486
36.5k
    }
487
857M
  for (op = sh_table; op->name; op++)
488
856M
    {
489
856M
      int n;
490
856M
      int imm = 0;
491
856M
      int rn = 0;
492
856M
      int rm = 0;
493
856M
      int rb = 0;
494
856M
      int disp_pc;
495
856M
      bfd_vma disp_pc_addr = 0;
496
856M
      int disp = 0;
497
856M
      int has_disp = 0;
498
856M
      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
499
500
856M
      if (!allow_op32
501
856M
    && SH_MERGE_ARCH_SET (op->arch, arch_op32))
502
15.2k
  goto fail;
503
504
856M
      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
505
371M
  goto fail;
506
627M
      for (n = 0; n < max_n; n++)
507
625M
  {
508
625M
    int i = op->nibbles[n];
509
510
625M
    if (i < 16)
511
533M
      {
512
533M
        if (nibs[n] == i)
513
76.0M
    continue;
514
457M
        goto fail;
515
533M
      }
516
91.8M
    switch (i)
517
91.8M
      {
518
117k
      case BRANCH_8:
519
117k
        imm = (nibs[2] << 4) | (nibs[3]);
520
117k
        if (imm & 0x80)
521
25.6k
    imm |= ~0xff;
522
117k
        imm = ((char) imm) * 2 + 4;
523
117k
        goto ok;
524
168k
      case BRANCH_12:
525
168k
        imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
526
168k
        if (imm & 0x800)
527
92.9k
    imm |= ~0xfff;
528
168k
        imm = imm * 2 + 4;
529
168k
        goto ok;
530
2.76k
      case IMM0_3c:
531
2.76k
        if (nibs[3] & 0x8)
532
198
    goto fail;
533
2.56k
        imm = nibs[3] & 0x7;
534
2.56k
        break;
535
3.09k
      case IMM0_3s:
536
3.09k
        if (!(nibs[3] & 0x8))
537
2.08k
    goto fail;
538
1.01k
        imm = nibs[3] & 0x7;
539
1.01k
        break;
540
29.4k
      case IMM0_3Uc:
541
29.4k
        if (nibs[2] & 0x8)
542
10.1k
    goto fail;
543
19.2k
        imm = nibs[2] & 0x7;
544
19.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
437
      case DISP0_12:
551
2.86k
      case DISP1_12:
552
2.86k
        disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
553
2.86k
        has_disp = 1;
554
2.86k
        goto ok;
555
468
      case DISP0_12BY2:
556
948
      case DISP1_12BY2:
557
948
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
558
948
        relmask = ~(bfd_vma) 1;
559
948
        has_disp = 1;
560
948
        goto ok;
561
480
      case DISP0_12BY4:
562
2.52k
      case DISP1_12BY4:
563
2.52k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
564
2.52k
        relmask = ~(bfd_vma) 3;
565
2.52k
        has_disp = 1;
566
2.52k
        goto ok;
567
697
      case DISP0_12BY8:
568
4.41k
      case DISP1_12BY8:
569
4.41k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
570
4.41k
        relmask = ~(bfd_vma) 7;
571
4.41k
        has_disp = 1;
572
4.41k
        goto ok;
573
151k
      case IMM0_20_4:
574
151k
        break;
575
84.7k
      case IMM0_20:
576
84.7k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
577
84.7k
         | (nibs[6] << 4) | nibs[7]);
578
84.7k
        if (imm & 0x80000)
579
2.76k
    imm -= 0x100000;
580
84.7k
        goto ok;
581
10.0k
      case IMM0_20BY8:
582
10.0k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
583
10.0k
         | (nibs[6] << 4) | nibs[7]);
584
10.0k
        imm <<= 8;
585
10.0k
        if (imm & 0x8000000)
586
2.16k
    imm -= 0x10000000;
587
10.0k
        goto ok;
588
5.26k
      case IMM0_4:
589
17.2k
      case IMM1_4:
590
17.2k
        imm = nibs[3];
591
17.2k
        goto ok;
592
4.74k
      case IMM0_4BY2:
593
9.30k
      case IMM1_4BY2:
594
9.30k
        imm = nibs[3] << 1;
595
9.30k
        goto ok;
596
152k
      case IMM0_4BY4:
597
297k
      case IMM1_4BY4:
598
297k
        imm = nibs[3] << 2;
599
297k
        goto ok;
600
410k
      case IMM0_8S:
601
418k
      case IMM1_8:
602
418k
        imm = (nibs[2] << 4) | nibs[3];
603
418k
        disp = imm;
604
418k
        has_disp = 1;
605
418k
        if (imm & 0x80)
606
91.5k
    imm -= 0x100;
607
418k
        goto ok;
608
53.4k
      case IMM0_8U:
609
53.4k
        disp = imm = (nibs[2] << 4) | nibs[3];
610
53.4k
        has_disp = 1;
611
53.4k
        goto ok;
612
76.2k
      case PCRELIMM_8BY2:
613
76.2k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
614
76.2k
        relmask = ~(bfd_vma) 1;
615
76.2k
        goto ok;
616
175k
      case PCRELIMM_8BY4:
617
175k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
618
175k
        relmask = ~(bfd_vma) 3;
619
175k
        goto ok;
620
5.08k
      case IMM0_8BY2:
621
12.3k
      case IMM1_8BY2:
622
12.3k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
623
12.3k
        goto ok;
624
6.18k
      case IMM0_8BY4:
625
10.1k
      case IMM1_8BY4:
626
10.1k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
627
10.1k
        goto ok;
628
177k
      case REG_N_D:
629
177k
        if ((nibs[n] & 1) != 0)
630
149k
    goto fail;
631
        /* Fall through.  */
632
43.3M
      case REG_N:
633
43.3M
        rn = nibs[n];
634
43.3M
        break;
635
22.5M
      case REG_M:
636
22.5M
        rm = nibs[n];
637
22.5M
        break;
638
24.6k
      case REG_N_B01:
639
24.6k
        if ((nibs[n] & 0x3) != 1 /* binary 01 */)
640
22.9k
    goto fail;
641
1.68k
        rn = (nibs[n] & 0xc) >> 2;
642
1.68k
        break;
643
32.3k
      case REG_NM:
644
32.3k
        rn = (nibs[n] & 0xc) >> 2;
645
32.3k
        rm = (nibs[n] & 0x3);
646
32.3k
        break;
647
149k
      case REG_B:
648
149k
        if (!(nibs[n] & 0x08)) /* Must always be 1.  */
649
116k
    goto fail;
650
32.8k
        rb = nibs[n] & 0x07;
651
32.8k
        break;
652
1.22M
      case SDT_REG_N:
653
        /* sh-dsp: single data transfer.  */
654
1.22M
        rn = nibs[n];
655
1.22M
        if ((rn & 0xc) != 4)
656
1.14M
    goto fail;
657
78.4k
        rn = rn & 0x3;
658
78.4k
        rn |= (!(rn & 2)) << 2;
659
78.4k
        break;
660
21.8M
      case PPI:
661
22.7M
      case REPEAT:
662
22.7M
        goto fail;
663
0
      default:
664
0
        abort ();
665
91.8M
      }
666
91.8M
  }
667
668
3.39M
    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
3.39M
      if (target_arch == arch_sh2a
673
3.39M
    && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
674
336k
        || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
675
2.24k
  goto fail;
676
677
3.39M
      fprintf_fn (stream, "%s\t", op->name);
678
3.39M
      disp_pc = 0;
679
8.81M
      for (n = 0; n < 3 && op->arg[n] != A_END; n++)
680
5.41M
  {
681
5.41M
    if (n && op->arg[1] != A_END)
682
2.49M
      fprintf_fn (stream, ",");
683
5.41M
    switch (op->arg[n])
684
5.41M
      {
685
561k
      case A_IMM:
686
561k
        fprintf_fn (stream, "#%d", imm);
687
561k
        break;
688
115k
      case A_R0:
689
115k
        fprintf_fn (stream, "r0");
690
115k
        break;
691
1.86M
      case A_REG_N:
692
1.86M
        fprintf_fn (stream, "r%d", rn);
693
1.86M
        break;
694
46.1k
      case A_INC_N:
695
46.1k
      case AS_INC_N:
696
46.1k
        fprintf_fn (stream, "@r%d+", rn);
697
46.1k
        break;
698
83.2k
      case A_DEC_N:
699
83.2k
      case AS_DEC_N:
700
83.2k
        fprintf_fn (stream, "@-r%d", rn);
701
83.2k
        break;
702
183k
      case A_IND_N:
703
183k
      case AS_IND_N:
704
183k
        fprintf_fn (stream, "@r%d", rn);
705
183k
        break;
706
152k
      case A_DISP_REG_N:
707
152k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
708
152k
        break;
709
2.46k
      case AS_PMOD_N:
710
2.46k
        fprintf_fn (stream, "@r%d+r8", rn);
711
2.46k
        break;
712
967k
      case A_REG_M:
713
967k
        fprintf_fn (stream, "r%d", rm);
714
967k
        break;
715
137k
      case A_INC_M:
716
137k
        fprintf_fn (stream, "@r%d+", rm);
717
137k
        break;
718
316
      case A_DEC_M:
719
316
        fprintf_fn (stream, "@-r%d", rm);
720
316
        break;
721
150k
      case A_IND_M:
722
150k
        fprintf_fn (stream, "@r%d", rm);
723
150k
        break;
724
180k
      case A_DISP_REG_M:
725
180k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
726
180k
        break;
727
2.36k
      case A_REG_B:
728
2.36k
        fprintf_fn (stream, "r%d_bank", rb);
729
2.36k
        break;
730
251k
      case A_DISP_PC:
731
251k
        disp_pc = 1;
732
251k
        disp_pc_addr = imm + 4 + (memaddr & relmask);
733
251k
        (*info->print_address_func) (disp_pc_addr, info);
734
251k
        break;
735
112k
      case A_IND_R0_REG_N:
736
112k
        fprintf_fn (stream, "@(r0,r%d)", rn);
737
112k
        break;
738
71.7k
      case A_IND_R0_REG_M:
739
71.7k
        fprintf_fn (stream, "@(r0,r%d)", rm);
740
71.7k
        break;
741
31.0k
      case A_DISP_GBR:
742
31.0k
        fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
743
31.0k
        break;
744
796
      case A_TBR:
745
796
        fprintf_fn (stream, "tbr");
746
796
        break;
747
2.71k
      case A_DISP2_TBR:
748
2.71k
        fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
749
2.71k
        break;
750
167
      case A_INC_R15:
751
167
        fprintf_fn (stream, "@r15+");
752
167
        break;
753
351
      case A_DEC_R15:
754
351
        fprintf_fn (stream, "@-r15");
755
351
        break;
756
19.7k
      case A_R0_GBR:
757
19.7k
        fprintf_fn (stream, "@(r0,gbr)");
758
19.7k
        break;
759
168k
      case A_BDISP12:
760
285k
      case A_BDISP8:
761
285k
        (*info->print_address_func) (imm + memaddr, info);
762
285k
        break;
763
21.0k
      case A_SR:
764
21.0k
        fprintf_fn (stream, "sr");
765
21.0k
        break;
766
12.9k
      case A_GBR:
767
12.9k
        fprintf_fn (stream, "gbr");
768
12.9k
        break;
769
1.82k
      case A_VBR:
770
1.82k
        fprintf_fn (stream, "vbr");
771
1.82k
        break;
772
1.08k
      case A_DSR:
773
1.08k
        fprintf_fn (stream, "dsr");
774
1.08k
        break;
775
541
      case A_MOD:
776
541
        fprintf_fn (stream, "mod");
777
541
        break;
778
690
      case A_RE:
779
690
        fprintf_fn (stream, "re");
780
690
        break;
781
662
      case A_RS:
782
662
        fprintf_fn (stream, "rs");
783
662
        break;
784
1.35k
      case A_A0:
785
1.35k
        fprintf_fn (stream, "a0");
786
1.35k
        break;
787
504
      case A_X0:
788
504
        fprintf_fn (stream, "x0");
789
504
        break;
790
945
      case A_X1:
791
945
        fprintf_fn (stream, "x1");
792
945
        break;
793
609
      case A_Y0:
794
609
        fprintf_fn (stream, "y0");
795
609
        break;
796
682
      case A_Y1:
797
682
        fprintf_fn (stream, "y1");
798
682
        break;
799
10.5k
      case DSP_REG_M:
800
10.5k
        print_dsp_reg (rm, fprintf_fn, stream);
801
10.5k
        break;
802
742
      case A_SSR:
803
742
        fprintf_fn (stream, "ssr");
804
742
        break;
805
1.95k
      case A_SPC:
806
1.95k
        fprintf_fn (stream, "spc");
807
1.95k
        break;
808
8.14k
      case A_MACH:
809
8.14k
        fprintf_fn (stream, "mach");
810
8.14k
        break;
811
3.64k
      case A_MACL:
812
3.64k
        fprintf_fn (stream, "macl");
813
3.64k
        break;
814
23.0k
      case A_PR:
815
23.0k
        fprintf_fn (stream, "pr");
816
23.0k
        break;
817
797
      case A_SGR:
818
797
        fprintf_fn (stream, "sgr");
819
797
        break;
820
761
      case A_DBR:
821
761
        fprintf_fn (stream, "dbr");
822
761
        break;
823
42.7k
      case F_REG_N:
824
42.7k
        fprintf_fn (stream, "fr%d", rn);
825
42.7k
        break;
826
41.1k
      case F_REG_M:
827
41.1k
        fprintf_fn (stream, "fr%d", rm);
828
41.1k
        break;
829
343
      case DX_REG_N:
830
343
        if (rn & 1)
831
130
    {
832
130
      fprintf_fn (stream, "xd%d", rn & ~1);
833
130
      break;
834
130
    }
835
        /* Fall through.  */
836
342
      case D_REG_N:
837
342
        fprintf_fn (stream, "dr%d", rn);
838
342
        break;
839
1.82k
      case DX_REG_M:
840
1.82k
        if (rm & 1)
841
1.30k
    {
842
1.30k
      fprintf_fn (stream, "xd%d", rm & ~1);
843
1.30k
      break;
844
1.30k
    }
845
        /* Fall through.  */
846
523
      case D_REG_M:
847
523
        fprintf_fn (stream, "dr%d", rm);
848
523
        break;
849
667
      case FPSCR_M:
850
858
      case FPSCR_N:
851
858
        fprintf_fn (stream, "fpscr");
852
858
        break;
853
1.49k
      case FPUL_M:
854
1.90k
      case FPUL_N:
855
1.90k
        fprintf_fn (stream, "fpul");
856
1.90k
        break;
857
3.48k
      case F_FR0:
858
3.48k
        fprintf_fn (stream, "fr0");
859
3.48k
        break;
860
1.72k
      case V_REG_N:
861
1.72k
        fprintf_fn (stream, "fv%d", rn * 4);
862
1.72k
        break;
863
201
      case V_REG_M:
864
201
        fprintf_fn (stream, "fv%d", rm * 4);
865
201
        break;
866
1.52k
      case XMTRX_M4:
867
1.52k
        fprintf_fn (stream, "xmtrx");
868
1.52k
        break;
869
0
      default:
870
0
        abort ();
871
5.41M
      }
872
5.41M
  }
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
3.39M
      if (disp_pc && strcmp (op->name, "mova") != 0)
898
247k
  {
899
247k
    int size;
900
247k
    bfd_byte bytes[4];
901
902
247k
    if (relmask == ~(bfd_vma) 1)
903
76.2k
      size = 2;
904
171k
    else
905
171k
      size = 4;
906
    /* Not reading an instruction - disable stop_vma.  */
907
247k
    info->stop_vma = 0;
908
247k
    status = info->read_memory_func (disp_pc_addr, bytes, size, info);
909
247k
    if (status == 0)
910
238k
      {
911
238k
        unsigned int val;
912
913
238k
        if (size == 2)
914
73.2k
    {
915
73.2k
      if (info->endian == BFD_ENDIAN_LITTLE)
916
42.5k
        val = bfd_getl16 (bytes);
917
30.6k
      else
918
30.6k
        val = bfd_getb16 (bytes);
919
73.2k
    }
920
165k
        else
921
165k
    {
922
165k
      if (info->endian == BFD_ENDIAN_LITTLE)
923
137k
        val = bfd_getl32 (bytes);
924
28.1k
      else
925
28.1k
        val = bfd_getb32 (bytes);
926
165k
    }
927
238k
        if ((*info->symbol_at_address_func) (val, info))
928
59.4k
    {
929
59.4k
      fprintf_fn (stream, "\t! ");
930
59.4k
      (*info->print_address_func) (val, info);
931
59.4k
    }
932
178k
        else
933
178k
    fprintf_fn (stream, "\t! %x", val);
934
238k
      }
935
247k
  }
936
937
3.39M
      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
938
852M
    fail:
939
852M
      ;
940
941
852M
    }
942
1.01M
  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
943
1.01M
  return 2;
944
4.40M
}