Coverage Report

Created: 2026-07-12 09:22

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
59.7k
{
37
59.7k
  int n;
38
39
59.7k
  fprintf_fn (stream, "%s\t", op->name);
40
179k
  for (n = 0; n < 2; n++)
41
119k
    {
42
119k
      switch (op->arg[n])
43
119k
  {
44
0
  case A_IND_N:
45
5.17k
  case AX_IND_N:
46
6.16k
  case AXY_IND_N:
47
12.6k
  case AY_IND_N:
48
14.2k
  case AYX_IND_N:
49
14.2k
    fprintf_fn (stream, "@r%d", rn);
50
14.2k
    break;
51
0
  case A_INC_N:
52
11.0k
  case AX_INC_N:
53
14.7k
  case AXY_INC_N:
54
20.8k
  case AY_INC_N:
55
22.2k
  case AYX_INC_N:
56
22.2k
    fprintf_fn (stream, "@r%d+", rn);
57
22.2k
    break;
58
6.65k
  case AX_PMOD_N:
59
7.44k
  case AXY_PMOD_N:
60
7.44k
    fprintf_fn (stream, "@r%d+r8", rn);
61
7.44k
    break;
62
9.47k
  case AY_PMOD_N:
63
10.6k
  case AYX_PMOD_N:
64
10.6k
    fprintf_fn (stream, "@r%d+r9", rn);
65
10.6k
    break;
66
27.6k
  case DSP_REG_A_M:
67
27.6k
    fprintf_fn (stream, "a%c", '0' + rm);
68
27.6k
    break;
69
14.3k
  case DSP_REG_X:
70
14.3k
    fprintf_fn (stream, "x%c", '0' + rm);
71
14.3k
    break;
72
13.1k
  case DSP_REG_Y:
73
13.1k
    fprintf_fn (stream, "y%c", '0' + rm);
74
13.1k
    break;
75
3.72k
  case DSP_REG_AX:
76
3.72k
    fprintf_fn (stream, "%c%c",
77
3.72k
          (rm & 1) ? 'x' : 'a',
78
3.72k
          (rm & 2) ? '1' : '0');
79
3.72k
    break;
80
1.73k
  case DSP_REG_XY:
81
1.73k
    fprintf_fn (stream, "%c%c",
82
1.73k
          (rm & 1) ? 'y' : 'x',
83
1.73k
          (rm & 2) ? '1' : '0');
84
1.73k
    break;
85
3.07k
  case DSP_REG_AY:
86
3.07k
    fprintf_fn (stream, "%c%c",
87
3.07k
          (rm & 2) ? 'y' : 'a',
88
3.07k
          (rm & 1) ? '1' : '0');
89
3.07k
    break;
90
1.17k
  case DSP_REG_YX:
91
1.17k
    fprintf_fn (stream, "%c%c",
92
1.17k
          (rm & 2) ? 'x' : 'y',
93
1.17k
          (rm & 1) ? '1' : '0');
94
1.17k
    break;
95
0
  default:
96
0
    abort ();
97
119k
  }
98
119k
      if (n == 0)
99
59.7k
  fprintf_fn (stream, ",");
100
119k
    }
101
59.7k
}
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
51.8k
{
110
51.8k
  fprintf_ftype fprintf_fn = info->fprintf_func;
111
51.8k
  void *stream = info->stream;
112
113
  /* If this is just a nop, make sure to emit something.  */
114
51.8k
  if (insn == 0x000)
115
768
    {
116
768
      fprintf_fn (stream, "nopx\tnopy");
117
768
      return;
118
768
    }
119
120
  /* If a parallel processing insn was printed before,
121
     and we got a non-nop, emit a tab.  */
122
51.0k
  if ((insn & 0x800) && (insn & 0x3ff))
123
29.1k
    fprintf_fn (stream, "\t");
124
125
  /* Check if either the x or y part is invalid.  */
126
51.0k
  if (((insn & 3) != 0 && (insn & 0xc) == 0 && (insn & 0x2a0))
127
42.0k
      || ((insn & 3) == 0 && (insn & 0xc) != 0 && (insn & 0x150)))
128
18.0k
    if (info->mach != bfd_mach_sh_dsp
129
9.98k
        && info->mach != bfd_mach_sh3_dsp)
130
9.71k
      {
131
9.71k
  static const sh_opcode_info *first_movx, *first_movy;
132
9.71k
  const sh_opcode_info *op;
133
9.71k
  int is_movy;
134
135
9.71k
  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
9.71k
  is_movy = ((insn & 3) != 0);
144
145
9.71k
  if (is_movy)
146
4.25k
    op = first_movy;
147
5.46k
  else
148
5.46k
    op = first_movx;
149
150
81.3k
  while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
151
18.7k
         || op->nibbles[3] != (unsigned) (insn & 0xf))
152
71.6k
    op++;
153
154
9.71k
  print_movxy (op,
155
9.71k
         (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
156
9.71k
          + 2 * is_movy
157
9.71k
          + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
158
9.71k
         (insn >> 6) & 3,
159
9.71k
         fprintf_fn, stream);
160
9.71k
      }
161
8.34k
    else
162
8.34k
      fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
163
32.9k
  else
164
32.9k
    {
165
32.9k
      static const sh_opcode_info *first_movx, *first_movy;
166
32.9k
      const sh_opcode_info *opx, *opy;
167
32.9k
      unsigned int insn_x, insn_y;
168
169
32.9k
      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
32.9k
      insn_x = (insn >> 2) & 0xb;
177
32.9k
      if (insn_x)
178
25.9k
  {
179
210k
    for (opx = first_movx; opx->nibbles[2] != insn_x;)
180
184k
      opx++;
181
25.9k
    print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
182
25.9k
           fprintf_fn, stream);
183
25.9k
  }
184
32.9k
      insn_y = (insn & 3) | ((insn >> 1) & 8);
185
32.9k
      if (insn_y)
186
24.1k
  {
187
24.1k
    if (insn_x)
188
22.5k
      fprintf_fn (stream, "\t");
189
135k
    for (opy = first_movy; opy->nibbles[2] != insn_y;)
190
111k
      opy++;
191
24.1k
    print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
192
24.1k
           fprintf_fn, stream);
193
24.1k
  }
194
32.9k
      if (!insn_x && !insn_y && ((insn & 0x3ff) != 0 || (insn & 0x800) == 0))
195
3.47k
  fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
196
32.9k
    }
197
51.0k
}
198
199
static void
200
print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
201
31.8k
{
202
31.8k
  switch (rm)
203
31.8k
    {
204
1.46k
    case A_A1_NUM:
205
1.46k
      fprintf_fn (stream, "a1");
206
1.46k
      break;
207
1.61k
    case A_A0_NUM:
208
1.61k
      fprintf_fn (stream, "a0");
209
1.61k
      break;
210
1.96k
    case A_X0_NUM:
211
1.96k
      fprintf_fn (stream, "x0");
212
1.96k
      break;
213
2.52k
    case A_X1_NUM:
214
2.52k
      fprintf_fn (stream, "x1");
215
2.52k
      break;
216
2.60k
    case A_Y0_NUM:
217
2.60k
      fprintf_fn (stream, "y0");
218
2.60k
      break;
219
2.41k
    case A_Y1_NUM:
220
2.41k
      fprintf_fn (stream, "y1");
221
2.41k
      break;
222
2.05k
    case A_M0_NUM:
223
2.05k
      fprintf_fn (stream, "m0");
224
2.05k
      break;
225
893
    case A_A1G_NUM:
226
893
      fprintf_fn (stream, "a1g");
227
893
      break;
228
1.29k
    case A_M1_NUM:
229
1.29k
      fprintf_fn (stream, "m1");
230
1.29k
      break;
231
6.22k
    case A_A0G_NUM:
232
6.22k
      fprintf_fn (stream, "a0g");
233
6.22k
      break;
234
8.80k
    default:
235
8.80k
      fprintf_fn (stream, "0x%x", rm);
236
8.80k
      break;
237
31.8k
    }
238
31.8k
}
239
240
static void
241
print_insn_ppi (int field_b, struct disassemble_info *info)
242
31.1k
{
243
31.1k
  static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
244
31.1k
  static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
245
31.1k
  fprintf_ftype fprintf_fn = info->fprintf_func;
246
31.1k
  void *stream = info->stream;
247
31.1k
  unsigned int nib1, nib2, nib3;
248
31.1k
  unsigned int altnib1, nib4;
249
31.1k
  char *dc = NULL;
250
31.1k
  const sh_opcode_info *op;
251
252
31.1k
  if ((field_b & 0xe800) == 0)
253
6.72k
    {
254
6.72k
      fprintf_fn (stream, "psh%c\t#%d,",
255
6.72k
      field_b & 0x1000 ? 'a' : 'l',
256
6.72k
      (field_b >> 4) & 127);
257
6.72k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
258
6.72k
      return;
259
6.72k
    }
260
24.4k
  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
261
3.12k
    {
262
3.12k
      static char *du_tab[] = { "x0", "y0", "a0", "a1" };
263
3.12k
      static char *se_tab[] = { "x0", "x1", "y0", "a1" };
264
3.12k
      static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
265
3.12k
      static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
266
267
3.12k
      if (field_b & 0x2000)
268
1.62k
  fprintf_fn (stream, "p%s %s,%s,%s\t",
269
1.62k
        (field_b & 0x1000) ? "add" : "sub",
270
1.62k
        sx_tab[(field_b >> 6) & 3],
271
1.62k
        sy_tab[(field_b >> 4) & 3],
272
1.62k
        du_tab[(field_b >> 0) & 3]);
273
274
1.49k
      else if ((field_b & 0xf0) == 0x10
275
232
         && info->mach != bfd_mach_sh_dsp
276
91
         && info->mach != bfd_mach_sh3_dsp)
277
85
  fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
278
279
1.41k
      else if ((field_b & 0xf3) != 0)
280
1.10k
  fprintf_fn (stream, ".word 0x%x\t", field_b);
281
282
3.12k
      fprintf_fn (stream, "pmuls%c%s,%s,%s",
283
3.12k
      field_b & 0x2000 ? ' ' : '\t',
284
3.12k
      se_tab[(field_b >> 10) & 3],
285
3.12k
      sf_tab[(field_b >>  8) & 3],
286
3.12k
      sg_tab[(field_b >>  2) & 3]);
287
3.12k
      return;
288
3.12k
    }
289
290
21.3k
  nib1 = PPIC;
291
21.3k
  nib2 = field_b >> 12 & 0xf;
292
21.3k
  nib3 = field_b >> 8 & 0xf;
293
21.3k
  nib4 = field_b >> 4 & 0xf;
294
21.3k
  switch (nib3 & 0x3)
295
21.3k
    {
296
4.99k
    case 0:
297
4.99k
      dc = "";
298
4.99k
      nib1 = PPI3;
299
4.99k
      break;
300
4.74k
    case 1:
301
4.74k
      dc = "";
302
4.74k
      break;
303
5.00k
    case 2:
304
5.00k
      dc = "dct ";
305
5.00k
      nib3 -= 1;
306
5.00k
      break;
307
6.55k
    case 3:
308
6.55k
      dc = "dcf ";
309
6.55k
      nib3 -= 2;
310
6.55k
      break;
311
21.3k
    }
312
21.3k
  if (nib1 == PPI3)
313
4.99k
    altnib1 = PPI3NC;
314
16.3k
  else
315
16.3k
    altnib1 = nib1;
316
8.41M
  for (op = sh_table; op->name; op++)
317
8.40M
    {
318
8.40M
      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
319
438k
    && op->nibbles[2] == nib2
320
33.2k
    && op->nibbles[3] == nib3)
321
14.9k
  {
322
14.9k
    int n;
323
324
14.9k
    switch (op->nibbles[4])
325
14.9k
      {
326
9.68k
      case HEX_0:
327
9.68k
        break;
328
1.50k
      case HEX_XX00:
329
1.50k
        if ((nib4 & 3) != 0)
330
1.39k
    continue;
331
112
        break;
332
1.62k
      case HEX_1:
333
1.62k
        if ((nib4 & 3) != 1)
334
870
    continue;
335
758
        break;
336
975
      case HEX_00YY:
337
975
        if ((nib4 & 0xc) != 0)
338
731
    continue;
339
244
        break;
340
1.11k
      case HEX_4:
341
1.11k
        if ((nib4 & 0xc) != 4)
342
896
    continue;
343
221
        break;
344
221
      default:
345
0
        abort ();
346
14.9k
      }
347
11.0k
    fprintf_fn (stream, "%s%s\t", dc, op->name);
348
34.5k
    for (n = 0; n < 3 && op->arg[n] != A_END; n++)
349
23.5k
      {
350
23.5k
        if (n && op->arg[1] != A_END)
351
12.4k
    fprintf_fn (stream, ",");
352
23.5k
        switch (op->arg[n])
353
23.5k
    {
354
10.9k
    case DSP_REG_N:
355
10.9k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
356
10.9k
      break;
357
2.80k
    case DSP_REG_X:
358
2.80k
      fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
359
2.80k
      break;
360
7.35k
    case DSP_REG_Y:
361
7.35k
      fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
362
7.35k
      break;
363
387
    case A_MACH:
364
387
      fprintf_fn (stream, "mach");
365
387
      break;
366
1.98k
    case A_MACL:
367
1.98k
      fprintf_fn (stream, "macl");
368
1.98k
      break;
369
0
    default:
370
0
      abort ();
371
23.5k
    }
372
23.5k
      }
373
11.0k
    return;
374
11.0k
  }
375
8.40M
    }
376
  /* Not found.  */
377
10.2k
  fprintf_fn (stream, ".word 0x%x", field_b);
378
10.2k
}
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
1.98M
{
386
1.98M
  fprintf_ftype fprintf_fn = info->fprintf_func;
387
1.98M
  void *stream = info->stream;
388
1.98M
  unsigned char insn[4];
389
1.98M
  unsigned char nibs[8];
390
1.98M
  int status;
391
1.98M
  bfd_vma relmask = ~(bfd_vma) 0;
392
1.98M
  const sh_opcode_info *op;
393
1.98M
  unsigned int target_arch;
394
1.98M
  int allow_op32;
395
396
1.98M
  switch (info->mach)
397
1.98M
    {
398
149k
    case bfd_mach_sh:
399
149k
      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
149k
      if (info->symbols
404
4
    && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
405
0
  target_arch = arch_sh4;
406
149k
      break;
407
1.83M
    default:
408
1.83M
      target_arch = sh_get_arch_from_bfd_mach (info->mach);
409
1.98M
    }
410
411
1.98M
  status = info->read_memory_func (memaddr, insn, 2, info);
412
413
1.98M
  if (status != 0)
414
501
    {
415
501
      info->memory_error_func (status, memaddr, info);
416
501
      return -1;
417
501
    }
418
419
1.98M
  if (info->endian == BFD_ENDIAN_LITTLE)
420
580k
    {
421
580k
      nibs[0] = (insn[1] >> 4) & 0xf;
422
580k
      nibs[1] = insn[1] & 0xf;
423
424
580k
      nibs[2] = (insn[0] >> 4) & 0xf;
425
580k
      nibs[3] = insn[0] & 0xf;
426
580k
    }
427
1.40M
  else
428
1.40M
    {
429
1.40M
      nibs[0] = (insn[0] >> 4) & 0xf;
430
1.40M
      nibs[1] = insn[0] & 0xf;
431
432
1.40M
      nibs[2] = (insn[1] >> 4) & 0xf;
433
1.40M
      nibs[3] = insn[1] & 0xf;
434
1.40M
    }
435
1.98M
  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
436
1.98M
  if (status != 0)
437
1.66k
    allow_op32 = 0;
438
1.98M
  else
439
1.98M
    {
440
1.98M
      allow_op32 = 1;
441
442
1.98M
      if (info->endian == BFD_ENDIAN_LITTLE)
443
579k
  {
444
579k
    nibs[4] = (insn[3] >> 4) & 0xf;
445
579k
    nibs[5] = insn[3] & 0xf;
446
447
579k
    nibs[6] = (insn[2] >> 4) & 0xf;
448
579k
    nibs[7] = insn[2] & 0xf;
449
579k
  }
450
1.40M
      else
451
1.40M
  {
452
1.40M
    nibs[4] = (insn[2] >> 4) & 0xf;
453
1.40M
    nibs[5] = insn[2] & 0xf;
454
455
1.40M
    nibs[6] = (insn[3] >> 4) & 0xf;
456
1.40M
    nibs[7] = insn[3] & 0xf;
457
1.40M
  }
458
1.98M
    }
459
460
1.98M
  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
461
60.1k
      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
462
51.8k
    {
463
51.8k
      if (nibs[1] & 8)
464
31.1k
  {
465
31.1k
    int field_b;
466
467
31.1k
    status = info->read_memory_func (memaddr + 2, insn, 2, info);
468
469
31.1k
    if (status != 0)
470
29
      {
471
29
        info->memory_error_func (status, memaddr + 2, info);
472
29
        return -1;
473
29
      }
474
475
31.1k
    if (info->endian == BFD_ENDIAN_LITTLE)
476
20.3k
      field_b = insn[1] << 8 | insn[0];
477
10.7k
    else
478
10.7k
      field_b = insn[0] << 8 | insn[1];
479
480
31.1k
    print_insn_ppi (field_b, info);
481
31.1k
    print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
482
31.1k
    return 4;
483
31.1k
  }
484
20.6k
      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
485
20.6k
      return 2;
486
51.8k
    }
487
476M
  for (op = sh_table; op->name; op++)
488
475M
    {
489
475M
      int n;
490
475M
      int imm = 0;
491
475M
      int rn = 0;
492
475M
      int rm = 0;
493
475M
      int rb = 0;
494
475M
      int disp_pc;
495
475M
      bfd_vma disp_pc_addr = 0;
496
475M
      int disp = 0;
497
475M
      int has_disp = 0;
498
475M
      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
499
500
475M
      if (!allow_op32
501
364k
    && SH_MERGE_ARCH_SET (op->arch, arch_op32))
502
15.4k
  goto fail;
503
504
475M
      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
505
170M
  goto fail;
506
390M
      for (n = 0; n < max_n; n++)
507
389M
  {
508
389M
    int i = op->nibbles[n];
509
510
389M
    if (i < 16)
511
312M
      {
512
312M
        if (nibs[n] == i)
513
46.8M
    continue;
514
265M
        goto fail;
515
312M
      }
516
77.7M
    switch (i)
517
77.7M
      {
518
16.0k
      case BRANCH_8:
519
16.0k
        imm = (nibs[2] << 4) | (nibs[3]);
520
16.0k
        if (imm & 0x80)
521
6.77k
    imm |= ~0xff;
522
16.0k
        imm = ((char) imm) * 2 + 4;
523
16.0k
        goto ok;
524
89.7k
      case BRANCH_12:
525
89.7k
        imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
526
89.7k
        if (imm & 0x800)
527
45.8k
    imm |= ~0xfff;
528
89.7k
        imm = imm * 2 + 4;
529
89.7k
        goto ok;
530
2.75k
      case IMM0_3c:
531
2.75k
        if (nibs[3] & 0x8)
532
310
    goto fail;
533
2.44k
        imm = nibs[3] & 0x7;
534
2.44k
        break;
535
2.88k
      case IMM0_3s:
536
2.88k
        if (!(nibs[3] & 0x8))
537
1.79k
    goto fail;
538
1.09k
        imm = nibs[3] & 0x7;
539
1.09k
        break;
540
22.1k
      case IMM0_3Uc:
541
22.1k
        if (nibs[2] & 0x8)
542
5.70k
    goto fail;
543
16.4k
        imm = nibs[2] & 0x7;
544
16.4k
        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
274
      case DISP0_12:
551
1.72k
      case DISP1_12:
552
1.72k
        disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
553
1.72k
        has_disp = 1;
554
1.72k
        goto ok;
555
478
      case DISP0_12BY2:
556
684
      case DISP1_12BY2:
557
684
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
558
684
        relmask = ~(bfd_vma) 1;
559
684
        has_disp = 1;
560
684
        goto ok;
561
587
      case DISP0_12BY4:
562
4.49k
      case DISP1_12BY4:
563
4.49k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
564
4.49k
        relmask = ~(bfd_vma) 3;
565
4.49k
        has_disp = 1;
566
4.49k
        goto ok;
567
1.21k
      case DISP0_12BY8:
568
6.57k
      case DISP1_12BY8:
569
6.57k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
570
6.57k
        relmask = ~(bfd_vma) 7;
571
6.57k
        has_disp = 1;
572
6.57k
        goto ok;
573
112k
      case IMM0_20_4:
574
112k
        break;
575
71.1k
      case IMM0_20:
576
71.1k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
577
71.1k
         | (nibs[6] << 4) | nibs[7]);
578
71.1k
        if (imm & 0x80000)
579
2.83k
    imm -= 0x100000;
580
71.1k
        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.29k
    imm -= 0x10000000;
587
8.26k
        goto ok;
588
5.57k
      case IMM0_4:
589
17.1k
      case IMM1_4:
590
17.1k
        imm = nibs[3];
591
17.1k
        goto ok;
592
5.16k
      case IMM0_4BY2:
593
9.83k
      case IMM1_4BY2:
594
9.83k
        imm = nibs[3] << 1;
595
9.83k
        goto ok;
596
53.2k
      case IMM0_4BY4:
597
148k
      case IMM1_4BY4:
598
148k
        imm = nibs[3] << 2;
599
148k
        goto ok;
600
151k
      case IMM0_8S:
601
156k
      case IMM1_8:
602
156k
        imm = (nibs[2] << 4) | nibs[3];
603
156k
        disp = imm;
604
156k
        has_disp = 1;
605
156k
        if (imm & 0x80)
606
62.0k
    imm -= 0x100;
607
156k
        goto ok;
608
32.8k
      case IMM0_8U:
609
32.8k
        disp = imm = (nibs[2] << 4) | nibs[3];
610
32.8k
        has_disp = 1;
611
32.8k
        goto ok;
612
54.5k
      case PCRELIMM_8BY2:
613
54.5k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
614
54.5k
        relmask = ~(bfd_vma) 1;
615
54.5k
        goto ok;
616
53.0k
      case PCRELIMM_8BY4:
617
53.0k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
618
53.0k
        relmask = ~(bfd_vma) 3;
619
53.0k
        goto ok;
620
2.59k
      case IMM0_8BY2:
621
6.65k
      case IMM1_8BY2:
622
6.65k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
623
6.65k
        goto ok;
624
5.25k
      case IMM0_8BY4:
625
7.83k
      case IMM1_8BY4:
626
7.83k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
627
7.83k
        goto ok;
628
140k
      case REG_N_D:
629
140k
        if ((nibs[n] & 1) != 0)
630
122k
    goto fail;
631
        /* Fall through.  */
632
27.7M
      case REG_N:
633
27.7M
        rn = nibs[n];
634
27.7M
        break;
635
10.9M
      case REG_M:
636
10.9M
        rm = nibs[n];
637
10.9M
        break;
638
22.8k
      case REG_N_B01:
639
22.8k
        if ((nibs[n] & 0x3) != 1 /* binary 01 */)
640
21.2k
    goto fail;
641
1.59k
        rn = (nibs[n] & 0xc) >> 2;
642
1.59k
        break;
643
32.7k
      case REG_NM:
644
32.7k
        rn = (nibs[n] & 0xc) >> 2;
645
32.7k
        rm = (nibs[n] & 0x3);
646
32.7k
        break;
647
170k
      case REG_B:
648
170k
        if (!(nibs[n] & 0x08)) /* Must always be 1.  */
649
133k
    goto fail;
650
36.6k
        rb = nibs[n] & 0x07;
651
36.6k
        break;
652
1.85M
      case SDT_REG_N:
653
        /* sh-dsp: single data transfer.  */
654
1.85M
        rn = nibs[n];
655
1.85M
        if ((rn & 0xc) != 4)
656
1.74M
    goto fail;
657
102k
        rn = rn & 0x3;
658
102k
        rn |= (!(rn & 2)) << 2;
659
102k
        break;
660
34.4M
      case PPI:
661
35.9M
      case REPEAT:
662
35.9M
        goto fail;
663
0
      default:
664
0
        abort ();
665
77.7M
      }
666
77.7M
  }
667
668
1.25M
    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.25M
      if (target_arch == arch_sh2a
673
240k
    && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
674
236k
        || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
675
4.15k
  goto fail;
676
677
1.25M
      fprintf_fn (stream, "%s\t", op->name);
678
1.25M
      disp_pc = 0;
679
3.58M
      for (n = 0; n < 3 && op->arg[n] != A_END; n++)
680
2.33M
  {
681
2.33M
    if (n && op->arg[1] != A_END)
682
1.09M
      fprintf_fn (stream, ",");
683
2.33M
    switch (op->arg[n])
684
2.33M
      {
685
264k
      case A_IMM:
686
264k
        fprintf_fn (stream, "#%d", imm);
687
264k
        break;
688
73.2k
      case A_R0:
689
73.2k
        fprintf_fn (stream, "r0");
690
73.2k
        break;
691
738k
      case A_REG_N:
692
738k
        fprintf_fn (stream, "r%d", rn);
693
738k
        break;
694
33.5k
      case A_INC_N:
695
33.5k
      case AS_INC_N:
696
33.5k
        fprintf_fn (stream, "@r%d+", rn);
697
33.5k
        break;
698
23.3k
      case A_DEC_N:
699
23.3k
      case AS_DEC_N:
700
23.3k
        fprintf_fn (stream, "@-r%d", rn);
701
23.3k
        break;
702
46.0k
      case A_IND_N:
703
46.0k
      case AS_IND_N:
704
46.0k
        fprintf_fn (stream, "@r%d", rn);
705
46.0k
        break;
706
101k
      case A_DISP_REG_N:
707
101k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
708
101k
        break;
709
3.22k
      case AS_PMOD_N:
710
3.22k
        fprintf_fn (stream, "@r%d+r8", rn);
711
3.22k
        break;
712
412k
      case A_REG_M:
713
412k
        fprintf_fn (stream, "r%d", rm);
714
412k
        break;
715
46.9k
      case A_INC_M:
716
46.9k
        fprintf_fn (stream, "@r%d+", rm);
717
46.9k
        break;
718
208
      case A_DEC_M:
719
208
        fprintf_fn (stream, "@-r%d", rm);
720
208
        break;
721
31.3k
      case A_IND_M:
722
31.3k
        fprintf_fn (stream, "@r%d", rm);
723
31.3k
        break;
724
82.3k
      case A_DISP_REG_M:
725
82.3k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
726
82.3k
        break;
727
2.47k
      case A_REG_B:
728
2.47k
        fprintf_fn (stream, "r%d_bank", rb);
729
2.47k
        break;
730
107k
      case A_DISP_PC:
731
107k
        disp_pc = 1;
732
107k
        disp_pc_addr = imm + 4 + (memaddr & relmask);
733
107k
        (*info->print_address_func) (disp_pc_addr, info);
734
107k
        break;
735
62.4k
      case A_IND_R0_REG_N:
736
62.4k
        fprintf_fn (stream, "@(r0,r%d)", rn);
737
62.4k
        break;
738
43.4k
      case A_IND_R0_REG_M:
739
43.4k
        fprintf_fn (stream, "@(r0,r%d)", rm);
740
43.4k
        break;
741
21.3k
      case A_DISP_GBR:
742
21.3k
        fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
743
21.3k
        break;
744
585
      case A_TBR:
745
585
        fprintf_fn (stream, "tbr");
746
585
        break;
747
1.63k
      case A_DISP2_TBR:
748
1.63k
        fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
749
1.63k
        break;
750
299
      case A_INC_R15:
751
299
        fprintf_fn (stream, "@r15+");
752
299
        break;
753
341
      case A_DEC_R15:
754
341
        fprintf_fn (stream, "@-r15");
755
341
        break;
756
14.2k
      case A_R0_GBR:
757
14.2k
        fprintf_fn (stream, "@(r0,gbr)");
758
14.2k
        break;
759
89.7k
      case A_BDISP12:
760
105k
      case A_BDISP8:
761
105k
        (*info->print_address_func) (imm + memaddr, info);
762
105k
        break;
763
12.1k
      case A_SR:
764
12.1k
        fprintf_fn (stream, "sr");
765
12.1k
        break;
766
2.95k
      case A_GBR:
767
2.95k
        fprintf_fn (stream, "gbr");
768
2.95k
        break;
769
1.89k
      case A_VBR:
770
1.89k
        fprintf_fn (stream, "vbr");
771
1.89k
        break;
772
880
      case A_DSR:
773
880
        fprintf_fn (stream, "dsr");
774
880
        break;
775
1.36k
      case A_MOD:
776
1.36k
        fprintf_fn (stream, "mod");
777
1.36k
        break;
778
1.02k
      case A_RE:
779
1.02k
        fprintf_fn (stream, "re");
780
1.02k
        break;
781
974
      case A_RS:
782
974
        fprintf_fn (stream, "rs");
783
974
        break;
784
1.30k
      case A_A0:
785
1.30k
        fprintf_fn (stream, "a0");
786
1.30k
        break;
787
799
      case A_X0:
788
799
        fprintf_fn (stream, "x0");
789
799
        break;
790
1.17k
      case A_X1:
791
1.17k
        fprintf_fn (stream, "x1");
792
1.17k
        break;
793
1.18k
      case A_Y0:
794
1.18k
        fprintf_fn (stream, "y0");
795
1.18k
        break;
796
857
      case A_Y1:
797
857
        fprintf_fn (stream, "y1");
798
857
        break;
799
14.1k
      case DSP_REG_M:
800
14.1k
        print_dsp_reg (rm, fprintf_fn, stream);
801
14.1k
        break;
802
661
      case A_SSR:
803
661
        fprintf_fn (stream, "ssr");
804
661
        break;
805
3.46k
      case A_SPC:
806
3.46k
        fprintf_fn (stream, "spc");
807
3.46k
        break;
808
5.19k
      case A_MACH:
809
5.19k
        fprintf_fn (stream, "mach");
810
5.19k
        break;
811
1.65k
      case A_MACL:
812
1.65k
        fprintf_fn (stream, "macl");
813
1.65k
        break;
814
3.43k
      case A_PR:
815
3.43k
        fprintf_fn (stream, "pr");
816
3.43k
        break;
817
866
      case A_SGR:
818
866
        fprintf_fn (stream, "sgr");
819
866
        break;
820
1.35k
      case A_DBR:
821
1.35k
        fprintf_fn (stream, "dbr");
822
1.35k
        break;
823
23.1k
      case F_REG_N:
824
23.1k
        fprintf_fn (stream, "fr%d", rn);
825
23.1k
        break;
826
25.8k
      case F_REG_M:
827
25.8k
        fprintf_fn (stream, "fr%d", rm);
828
25.8k
        break;
829
774
      case DX_REG_N:
830
774
        if (rn & 1)
831
310
    {
832
310
      fprintf_fn (stream, "xd%d", rn & ~1);
833
310
      break;
834
310
    }
835
        /* Fall through.  */
836
682
      case D_REG_N:
837
682
        fprintf_fn (stream, "dr%d", rn);
838
682
        break;
839
1.64k
      case DX_REG_M:
840
1.64k
        if (rm & 1)
841
1.31k
    {
842
1.31k
      fprintf_fn (stream, "xd%d", rm & ~1);
843
1.31k
      break;
844
1.31k
    }
845
        /* Fall through.  */
846
331
      case D_REG_M:
847
331
        fprintf_fn (stream, "dr%d", rm);
848
331
        break;
849
181
      case FPSCR_M:
850
303
      case FPSCR_N:
851
303
        fprintf_fn (stream, "fpscr");
852
303
        break;
853
1.11k
      case FPUL_M:
854
1.82k
      case FPUL_N:
855
1.82k
        fprintf_fn (stream, "fpul");
856
1.82k
        break;
857
2.79k
      case F_FR0:
858
2.79k
        fprintf_fn (stream, "fr0");
859
2.79k
        break;
860
1.75k
      case V_REG_N:
861
1.75k
        fprintf_fn (stream, "fv%d", rn * 4);
862
1.75k
        break;
863
368
      case V_REG_M:
864
368
        fprintf_fn (stream, "fv%d", rm * 4);
865
368
        break;
866
1.38k
      case XMTRX_M4:
867
1.38k
        fprintf_fn (stream, "xmtrx");
868
1.38k
        break;
869
0
      default:
870
0
        abort ();
871
2.33M
      }
872
2.33M
  }
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.25M
      if (disp_pc && strcmp (op->name, "mova") != 0)
898
104k
  {
899
104k
    int size;
900
104k
    bfd_byte bytes[4];
901
902
104k
    if (relmask == ~(bfd_vma) 1)
903
54.5k
      size = 2;
904
49.6k
    else
905
49.6k
      size = 4;
906
    /* Not reading an instruction - disable stop_vma.  */
907
104k
    info->stop_vma = 0;
908
104k
    status = info->read_memory_func (disp_pc_addr, bytes, size, info);
909
104k
    if (status == 0)
910
91.3k
      {
911
91.3k
        unsigned int val;
912
913
91.3k
        if (size == 2)
914
50.0k
    {
915
50.0k
      if (info->endian == BFD_ENDIAN_LITTLE)
916
14.6k
        val = bfd_getl16 (bytes);
917
35.4k
      else
918
35.4k
        val = bfd_getb16 (bytes);
919
50.0k
    }
920
41.2k
        else
921
41.2k
    {
922
41.2k
      if (info->endian == BFD_ENDIAN_LITTLE)
923
9.80k
        val = bfd_getl32 (bytes);
924
31.4k
      else
925
31.4k
        val = bfd_getb32 (bytes);
926
41.2k
    }
927
91.3k
        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
91.3k
        else
933
91.3k
    fprintf_fn (stream, "\t! %x", val);
934
91.3k
      }
935
104k
  }
936
937
1.25M
      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
938
474M
    fail:
939
474M
      ;
940
941
474M
    }
942
679k
  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
943
679k
  return 2;
944
1.93M
}