Coverage Report

Created: 2026-07-25 10:20

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
63.1k
{
37
63.1k
  int n;
38
39
63.1k
  fprintf_fn (stream, "%s\t", op->name);
40
189k
  for (n = 0; n < 2; n++)
41
126k
    {
42
126k
      switch (op->arg[n])
43
126k
  {
44
0
  case A_IND_N:
45
5.71k
  case AX_IND_N:
46
6.74k
  case AXY_IND_N:
47
13.9k
  case AY_IND_N:
48
15.3k
  case AYX_IND_N:
49
15.3k
    fprintf_fn (stream, "@r%d", rn);
50
15.3k
    break;
51
0
  case A_INC_N:
52
11.8k
  case AX_INC_N:
53
15.5k
  case AXY_INC_N:
54
22.1k
  case AY_INC_N:
55
23.6k
  case AYX_INC_N:
56
23.6k
    fprintf_fn (stream, "@r%d+", rn);
57
23.6k
    break;
58
6.93k
  case AX_PMOD_N:
59
7.86k
  case AXY_PMOD_N:
60
7.86k
    fprintf_fn (stream, "@r%d+r8", rn);
61
7.86k
    break;
62
9.81k
  case AY_PMOD_N:
63
10.8k
  case AYX_PMOD_N:
64
10.8k
    fprintf_fn (stream, "@r%d+r9", rn);
65
10.8k
    break;
66
29.9k
  case DSP_REG_A_M:
67
29.9k
    fprintf_fn (stream, "a%c", '0' + rm);
68
29.9k
    break;
69
14.9k
  case DSP_REG_X:
70
14.9k
    fprintf_fn (stream, "x%c", '0' + rm);
71
14.9k
    break;
72
13.9k
  case DSP_REG_Y:
73
13.9k
    fprintf_fn (stream, "y%c", '0' + rm);
74
13.9k
    break;
75
3.92k
  case DSP_REG_AX:
76
3.92k
    fprintf_fn (stream, "%c%c",
77
3.92k
          (rm & 1) ? 'x' : 'a',
78
3.92k
          (rm & 2) ? '1' : '0');
79
3.92k
    break;
80
1.70k
  case DSP_REG_XY:
81
1.70k
    fprintf_fn (stream, "%c%c",
82
1.70k
          (rm & 1) ? 'y' : 'x',
83
1.70k
          (rm & 2) ? '1' : '0');
84
1.70k
    break;
85
2.84k
  case DSP_REG_AY:
86
2.84k
    fprintf_fn (stream, "%c%c",
87
2.84k
          (rm & 2) ? 'y' : 'a',
88
2.84k
          (rm & 1) ? '1' : '0');
89
2.84k
    break;
90
1.12k
  case DSP_REG_YX:
91
1.12k
    fprintf_fn (stream, "%c%c",
92
1.12k
          (rm & 2) ? 'x' : 'y',
93
1.12k
          (rm & 1) ? '1' : '0');
94
1.12k
    break;
95
0
  default:
96
0
    abort ();
97
126k
  }
98
126k
      if (n == 0)
99
63.1k
  fprintf_fn (stream, ",");
100
126k
    }
101
63.1k
}
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.3k
{
110
54.3k
  fprintf_ftype fprintf_fn = info->fprintf_func;
111
54.3k
  void *stream = info->stream;
112
113
  /* If this is just a nop, make sure to emit something.  */
114
54.3k
  if (insn == 0x000)
115
838
    {
116
838
      fprintf_fn (stream, "nopx\tnopy");
117
838
      return;
118
838
    }
119
120
  /* If a parallel processing insn was printed before,
121
     and we got a non-nop, emit a tab.  */
122
53.5k
  if ((insn & 0x800) && (insn & 0x3ff))
123
30.7k
    fprintf_fn (stream, "\t");
124
125
  /* Check if either the x or y part is invalid.  */
126
53.5k
  if (((insn & 3) != 0 && (insn & 0xc) == 0 && (insn & 0x2a0))
127
44.4k
      || ((insn & 3) == 0 && (insn & 0xc) != 0 && (insn & 0x150)))
128
18.5k
    if (info->mach != bfd_mach_sh_dsp
129
9.99k
        && info->mach != bfd_mach_sh3_dsp)
130
9.58k
      {
131
9.58k
  static const sh_opcode_info *first_movx, *first_movy;
132
9.58k
  const sh_opcode_info *op;
133
9.58k
  int is_movy;
134
135
9.58k
  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.58k
  is_movy = ((insn & 3) != 0);
144
145
9.58k
  if (is_movy)
146
3.96k
    op = first_movy;
147
5.62k
  else
148
5.62k
    op = first_movx;
149
150
79.9k
  while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
151
18.7k
         || op->nibbles[3] != (unsigned) (insn & 0xf))
152
70.3k
    op++;
153
154
9.58k
  print_movxy (op,
155
9.58k
         (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
156
9.58k
          + 2 * is_movy
157
9.58k
          + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
158
9.58k
         (insn >> 6) & 3,
159
9.58k
         fprintf_fn, stream);
160
9.58k
      }
161
8.97k
    else
162
8.97k
      fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
163
34.9k
  else
164
34.9k
    {
165
34.9k
      static const sh_opcode_info *first_movx, *first_movy;
166
34.9k
      const sh_opcode_info *opx, *opy;
167
34.9k
      unsigned int insn_x, insn_y;
168
169
34.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
34.9k
      insn_x = (insn >> 2) & 0xb;
177
34.9k
      if (insn_x)
178
27.6k
  {
179
220k
    for (opx = first_movx; opx->nibbles[2] != insn_x;)
180
193k
      opx++;
181
27.6k
    print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
182
27.6k
           fprintf_fn, stream);
183
27.6k
  }
184
34.9k
      insn_y = (insn & 3) | ((insn >> 1) & 8);
185
34.9k
      if (insn_y)
186
25.8k
  {
187
25.8k
    if (insn_x)
188
24.0k
      fprintf_fn (stream, "\t");
189
143k
    for (opy = first_movy; opy->nibbles[2] != insn_y;)
190
118k
      opy++;
191
25.8k
    print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
192
25.8k
           fprintf_fn, stream);
193
25.8k
  }
194
34.9k
      if (!insn_x && !insn_y && ((insn & 0x3ff) != 0 || (insn & 0x800) == 0))
195
3.59k
  fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
196
34.9k
    }
197
53.5k
}
198
199
static void
200
print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
201
34.2k
{
202
34.2k
  switch (rm)
203
34.2k
    {
204
1.64k
    case A_A1_NUM:
205
1.64k
      fprintf_fn (stream, "a1");
206
1.64k
      break;
207
1.48k
    case A_A0_NUM:
208
1.48k
      fprintf_fn (stream, "a0");
209
1.48k
      break;
210
2.37k
    case A_X0_NUM:
211
2.37k
      fprintf_fn (stream, "x0");
212
2.37k
      break;
213
2.88k
    case A_X1_NUM:
214
2.88k
      fprintf_fn (stream, "x1");
215
2.88k
      break;
216
2.83k
    case A_Y0_NUM:
217
2.83k
      fprintf_fn (stream, "y0");
218
2.83k
      break;
219
2.73k
    case A_Y1_NUM:
220
2.73k
      fprintf_fn (stream, "y1");
221
2.73k
      break;
222
2.07k
    case A_M0_NUM:
223
2.07k
      fprintf_fn (stream, "m0");
224
2.07k
      break;
225
1.17k
    case A_A1G_NUM:
226
1.17k
      fprintf_fn (stream, "a1g");
227
1.17k
      break;
228
1.37k
    case A_M1_NUM:
229
1.37k
      fprintf_fn (stream, "m1");
230
1.37k
      break;
231
6.39k
    case A_A0G_NUM:
232
6.39k
      fprintf_fn (stream, "a0g");
233
6.39k
      break;
234
9.22k
    default:
235
9.22k
      fprintf_fn (stream, "0x%x", rm);
236
9.22k
      break;
237
34.2k
    }
238
34.2k
}
239
240
static void
241
print_insn_ppi (int field_b, struct disassemble_info *info)
242
32.6k
{
243
32.6k
  static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
244
32.6k
  static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
245
32.6k
  fprintf_ftype fprintf_fn = info->fprintf_func;
246
32.6k
  void *stream = info->stream;
247
32.6k
  unsigned int nib1, nib2, nib3;
248
32.6k
  unsigned int altnib1, nib4;
249
32.6k
  char *dc = NULL;
250
32.6k
  const sh_opcode_info *op;
251
252
32.6k
  if ((field_b & 0xe800) == 0)
253
6.85k
    {
254
6.85k
      fprintf_fn (stream, "psh%c\t#%d,",
255
6.85k
      field_b & 0x1000 ? 'a' : 'l',
256
6.85k
      (field_b >> 4) & 127);
257
6.85k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
258
6.85k
      return;
259
6.85k
    }
260
25.8k
  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
261
3.21k
    {
262
3.21k
      static char *du_tab[] = { "x0", "y0", "a0", "a1" };
263
3.21k
      static char *se_tab[] = { "x0", "x1", "y0", "a1" };
264
3.21k
      static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
265
3.21k
      static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
266
267
3.21k
      if (field_b & 0x2000)
268
1.63k
  fprintf_fn (stream, "p%s %s,%s,%s\t",
269
1.63k
        (field_b & 0x1000) ? "add" : "sub",
270
1.63k
        sx_tab[(field_b >> 6) & 3],
271
1.63k
        sy_tab[(field_b >> 4) & 3],
272
1.63k
        du_tab[(field_b >> 0) & 3]);
273
274
1.58k
      else if ((field_b & 0xf0) == 0x10
275
237
         && info->mach != bfd_mach_sh_dsp
276
108
         && info->mach != bfd_mach_sh3_dsp)
277
87
  fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
278
279
1.49k
      else if ((field_b & 0xf3) != 0)
280
1.17k
  fprintf_fn (stream, ".word 0x%x\t", field_b);
281
282
3.21k
      fprintf_fn (stream, "pmuls%c%s,%s,%s",
283
3.21k
      field_b & 0x2000 ? ' ' : '\t',
284
3.21k
      se_tab[(field_b >> 10) & 3],
285
3.21k
      sf_tab[(field_b >>  8) & 3],
286
3.21k
      sg_tab[(field_b >>  2) & 3]);
287
3.21k
      return;
288
3.21k
    }
289
290
22.6k
  nib1 = PPIC;
291
22.6k
  nib2 = field_b >> 12 & 0xf;
292
22.6k
  nib3 = field_b >> 8 & 0xf;
293
22.6k
  nib4 = field_b >> 4 & 0xf;
294
22.6k
  switch (nib3 & 0x3)
295
22.6k
    {
296
5.20k
    case 0:
297
5.20k
      dc = "";
298
5.20k
      nib1 = PPI3;
299
5.20k
      break;
300
5.33k
    case 1:
301
5.33k
      dc = "";
302
5.33k
      break;
303
5.20k
    case 2:
304
5.20k
      dc = "dct ";
305
5.20k
      nib3 -= 1;
306
5.20k
      break;
307
6.85k
    case 3:
308
6.85k
      dc = "dcf ";
309
6.85k
      nib3 -= 2;
310
6.85k
      break;
311
22.6k
    }
312
22.6k
  if (nib1 == PPI3)
313
5.20k
    altnib1 = PPI3NC;
314
17.4k
  else
315
17.4k
    altnib1 = nib1;
316
8.91M
  for (op = sh_table; op->name; op++)
317
8.90M
    {
318
8.90M
      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
319
466k
    && op->nibbles[2] == nib2
320
34.7k
    && op->nibbles[3] == nib3)
321
15.7k
  {
322
15.7k
    int n;
323
324
15.7k
    switch (op->nibbles[4])
325
15.7k
      {
326
10.5k
      case HEX_0:
327
10.5k
        break;
328
1.37k
      case HEX_XX00:
329
1.37k
        if ((nib4 & 3) != 0)
330
1.26k
    continue;
331
112
        break;
332
1.57k
      case HEX_1:
333
1.57k
        if ((nib4 & 3) != 1)
334
858
    continue;
335
715
        break;
336
1.11k
      case HEX_00YY:
337
1.11k
        if ((nib4 & 0xc) != 0)
338
841
    continue;
339
275
        break;
340
1.19k
      case HEX_4:
341
1.19k
        if ((nib4 & 0xc) != 4)
342
1.00k
    continue;
343
184
        break;
344
184
      default:
345
0
        abort ();
346
15.7k
      }
347
11.8k
    fprintf_fn (stream, "%s%s\t", dc, op->name);
348
36.9k
    for (n = 0; n < 3 && op->arg[n] != A_END; n++)
349
25.0k
      {
350
25.0k
        if (n && op->arg[1] != A_END)
351
13.2k
    fprintf_fn (stream, ",");
352
25.0k
        switch (op->arg[n])
353
25.0k
    {
354
11.7k
    case DSP_REG_N:
355
11.7k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
356
11.7k
      break;
357
2.79k
    case DSP_REG_X:
358
2.79k
      fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
359
2.79k
      break;
360
8.06k
    case DSP_REG_Y:
361
8.06k
      fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
362
8.06k
      break;
363
396
    case A_MACH:
364
396
      fprintf_fn (stream, "mach");
365
396
      break;
366
2.06k
    case A_MACL:
367
2.06k
      fprintf_fn (stream, "macl");
368
2.06k
      break;
369
0
    default:
370
0
      abort ();
371
25.0k
    }
372
25.0k
      }
373
11.8k
    return;
374
11.8k
  }
375
8.90M
    }
376
  /* Not found.  */
377
10.7k
  fprintf_fn (stream, ".word 0x%x", field_b);
378
10.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.22M
{
386
2.22M
  fprintf_ftype fprintf_fn = info->fprintf_func;
387
2.22M
  void *stream = info->stream;
388
2.22M
  unsigned char insn[4];
389
2.22M
  unsigned char nibs[8];
390
2.22M
  int status;
391
2.22M
  bfd_vma relmask = ~(bfd_vma) 0;
392
2.22M
  const sh_opcode_info *op;
393
2.22M
  unsigned int target_arch;
394
2.22M
  int allow_op32;
395
396
2.22M
  switch (info->mach)
397
2.22M
    {
398
168k
    case bfd_mach_sh:
399
168k
      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
168k
      if (info->symbols
404
19
    && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
405
12
  target_arch = arch_sh4;
406
168k
      break;
407
2.06M
    default:
408
2.06M
      target_arch = sh_get_arch_from_bfd_mach (info->mach);
409
2.22M
    }
410
411
2.22M
  status = info->read_memory_func (memaddr, insn, 2, info);
412
413
2.22M
  if (status != 0)
414
597
    {
415
597
      info->memory_error_func (status, memaddr, info);
416
597
      return -1;
417
597
    }
418
419
2.22M
  if (info->endian == BFD_ENDIAN_LITTLE)
420
578k
    {
421
578k
      nibs[0] = (insn[1] >> 4) & 0xf;
422
578k
      nibs[1] = insn[1] & 0xf;
423
424
578k
      nibs[2] = (insn[0] >> 4) & 0xf;
425
578k
      nibs[3] = insn[0] & 0xf;
426
578k
    }
427
1.64M
  else
428
1.64M
    {
429
1.64M
      nibs[0] = (insn[0] >> 4) & 0xf;
430
1.64M
      nibs[1] = insn[0] & 0xf;
431
432
1.64M
      nibs[2] = (insn[1] >> 4) & 0xf;
433
1.64M
      nibs[3] = insn[1] & 0xf;
434
1.64M
    }
435
2.22M
  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
436
2.22M
  if (status != 0)
437
2.00k
    allow_op32 = 0;
438
2.22M
  else
439
2.22M
    {
440
2.22M
      allow_op32 = 1;
441
442
2.22M
      if (info->endian == BFD_ENDIAN_LITTLE)
443
578k
  {
444
578k
    nibs[4] = (insn[3] >> 4) & 0xf;
445
578k
    nibs[5] = insn[3] & 0xf;
446
447
578k
    nibs[6] = (insn[2] >> 4) & 0xf;
448
578k
    nibs[7] = insn[2] & 0xf;
449
578k
  }
450
1.64M
      else
451
1.64M
  {
452
1.64M
    nibs[4] = (insn[2] >> 4) & 0xf;
453
1.64M
    nibs[5] = insn[2] & 0xf;
454
455
1.64M
    nibs[6] = (insn[3] >> 4) & 0xf;
456
1.64M
    nibs[7] = insn[3] & 0xf;
457
1.64M
  }
458
2.22M
    }
459
460
2.22M
  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
461
63.9k
      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
462
54.3k
    {
463
54.3k
      if (nibs[1] & 8)
464
32.7k
  {
465
32.7k
    int field_b;
466
467
32.7k
    status = info->read_memory_func (memaddr + 2, insn, 2, info);
468
469
32.7k
    if (status != 0)
470
28
      {
471
28
        info->memory_error_func (status, memaddr + 2, info);
472
28
        return -1;
473
28
      }
474
475
32.6k
    if (info->endian == BFD_ENDIAN_LITTLE)
476
19.8k
      field_b = insn[1] << 8 | insn[0];
477
12.8k
    else
478
12.8k
      field_b = insn[0] << 8 | insn[1];
479
480
32.6k
    print_insn_ppi (field_b, info);
481
32.6k
    print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
482
32.6k
    return 4;
483
32.7k
  }
484
21.6k
      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
485
21.6k
      return 2;
486
54.3k
    }
487
534M
  for (op = sh_table; op->name; op++)
488
533M
    {
489
533M
      int n;
490
533M
      int imm = 0;
491
533M
      int rn = 0;
492
533M
      int rm = 0;
493
533M
      int rb = 0;
494
533M
      int disp_pc;
495
533M
      bfd_vma disp_pc_addr = 0;
496
533M
      int disp = 0;
497
533M
      int has_disp = 0;
498
533M
      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
499
500
533M
      if (!allow_op32
501
432k
    && SH_MERGE_ARCH_SET (op->arch, arch_op32))
502
18.2k
  goto fail;
503
504
533M
      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
505
194M
  goto fail;
506
434M
      for (n = 0; n < max_n; n++)
507
433M
  {
508
433M
    int i = op->nibbles[n];
509
510
433M
    if (i < 16)
511
348M
      {
512
348M
        if (nibs[n] == i)
513
52.0M
    continue;
514
296M
        goto fail;
515
348M
      }
516
85.2M
    switch (i)
517
85.2M
      {
518
18.7k
      case BRANCH_8:
519
18.7k
        imm = (nibs[2] << 4) | (nibs[3]);
520
18.7k
        if (imm & 0x80)
521
8.29k
    imm |= ~0xff;
522
18.7k
        imm = ((char) imm) * 2 + 4;
523
18.7k
        goto ok;
524
100k
      case BRANCH_12:
525
100k
        imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
526
100k
        if (imm & 0x800)
527
51.5k
    imm |= ~0xfff;
528
100k
        imm = imm * 2 + 4;
529
100k
        goto ok;
530
4.02k
      case IMM0_3c:
531
4.02k
        if (nibs[3] & 0x8)
532
534
    goto fail;
533
3.48k
        imm = nibs[3] & 0x7;
534
3.48k
        break;
535
3.33k
      case IMM0_3s:
536
3.33k
        if (!(nibs[3] & 0x8))
537
2.03k
    goto fail;
538
1.29k
        imm = nibs[3] & 0x7;
539
1.29k
        break;
540
23.4k
      case IMM0_3Uc:
541
23.4k
        if (nibs[2] & 0x8)
542
6.47k
    goto fail;
543
16.9k
        imm = nibs[2] & 0x7;
544
16.9k
        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
291
      case DISP0_12:
551
1.82k
      case DISP1_12:
552
1.82k
        disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
553
1.82k
        has_disp = 1;
554
1.82k
        goto ok;
555
505
      case DISP0_12BY2:
556
719
      case DISP1_12BY2:
557
719
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
558
719
        relmask = ~(bfd_vma) 1;
559
719
        has_disp = 1;
560
719
        goto ok;
561
635
      case DISP0_12BY4:
562
4.70k
      case DISP1_12BY4:
563
4.70k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
564
4.70k
        relmask = ~(bfd_vma) 3;
565
4.70k
        has_disp = 1;
566
4.70k
        goto ok;
567
1.26k
      case DISP0_12BY8:
568
6.74k
      case DISP1_12BY8:
569
6.74k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
570
6.74k
        relmask = ~(bfd_vma) 7;
571
6.74k
        has_disp = 1;
572
6.74k
        goto ok;
573
135k
      case IMM0_20_4:
574
135k
        break;
575
87.1k
      case IMM0_20:
576
87.1k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
577
87.1k
         | (nibs[6] << 4) | nibs[7]);
578
87.1k
        if (imm & 0x80000)
579
3.51k
    imm -= 0x100000;
580
87.1k
        goto ok;
581
9.82k
      case IMM0_20BY8:
582
9.82k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
583
9.82k
         | (nibs[6] << 4) | nibs[7]);
584
9.82k
        imm <<= 8;
585
9.82k
        if (imm & 0x8000000)
586
1.63k
    imm -= 0x10000000;
587
9.82k
        goto ok;
588
6.22k
      case IMM0_4:
589
19.3k
      case IMM1_4:
590
19.3k
        imm = nibs[3];
591
19.3k
        goto ok;
592
5.69k
      case IMM0_4BY2:
593
10.5k
      case IMM1_4BY2:
594
10.5k
        imm = nibs[3] << 1;
595
10.5k
        goto ok;
596
61.5k
      case IMM0_4BY4:
597
169k
      case IMM1_4BY4:
598
169k
        imm = nibs[3] << 2;
599
169k
        goto ok;
600
171k
      case IMM0_8S:
601
176k
      case IMM1_8:
602
176k
        imm = (nibs[2] << 4) | nibs[3];
603
176k
        disp = imm;
604
176k
        has_disp = 1;
605
176k
        if (imm & 0x80)
606
70.7k
    imm -= 0x100;
607
176k
        goto ok;
608
38.7k
      case IMM0_8U:
609
38.7k
        disp = imm = (nibs[2] << 4) | nibs[3];
610
38.7k
        has_disp = 1;
611
38.7k
        goto ok;
612
61.7k
      case PCRELIMM_8BY2:
613
61.7k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
614
61.7k
        relmask = ~(bfd_vma) 1;
615
61.7k
        goto ok;
616
60.0k
      case PCRELIMM_8BY4:
617
60.0k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
618
60.0k
        relmask = ~(bfd_vma) 3;
619
60.0k
        goto ok;
620
2.95k
      case IMM0_8BY2:
621
7.54k
      case IMM1_8BY2:
622
7.54k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
623
7.54k
        goto ok;
624
5.80k
      case IMM0_8BY4:
625
8.88k
      case IMM1_8BY4:
626
8.88k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
627
8.88k
        goto ok;
628
150k
      case REG_N_D:
629
150k
        if ((nibs[n] & 1) != 0)
630
130k
    goto fail;
631
        /* Fall through.  */
632
30.7M
      case REG_N:
633
30.7M
        rn = nibs[n];
634
30.7M
        break;
635
12.2M
      case REG_M:
636
12.2M
        rm = nibs[n];
637
12.2M
        break;
638
21.0k
      case REG_N_B01:
639
21.0k
        if ((nibs[n] & 0x3) != 1 /* binary 01 */)
640
19.1k
    goto fail;
641
1.89k
        rn = (nibs[n] & 0xc) >> 2;
642
1.89k
        break;
643
30.7k
      case REG_NM:
644
30.7k
        rn = (nibs[n] & 0xc) >> 2;
645
30.7k
        rm = (nibs[n] & 0x3);
646
30.7k
        break;
647
181k
      case REG_B:
648
181k
        if (!(nibs[n] & 0x08)) /* Must always be 1.  */
649
142k
    goto fail;
650
39.0k
        rb = nibs[n] & 0x07;
651
39.0k
        break;
652
1.97M
      case SDT_REG_N:
653
        /* sh-dsp: single data transfer.  */
654
1.97M
        rn = nibs[n];
655
1.97M
        if ((rn & 0xc) != 4)
656
1.85M
    goto fail;
657
113k
        rn = rn & 0x3;
658
113k
        rn |= (!(rn & 2)) << 2;
659
113k
        break;
660
37.3M
      case PPI:
661
38.9M
      case REPEAT:
662
38.9M
        goto fail;
663
0
      default:
664
0
        abort ();
665
85.2M
      }
666
85.2M
  }
667
668
1.42M
    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.42M
      if (target_arch == arch_sh2a
673
326k
    && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
674
322k
        || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
675
4.23k
  goto fail;
676
677
1.42M
      fprintf_fn (stream, "%s\t", op->name);
678
1.42M
      disp_pc = 0;
679
4.06M
      for (n = 0; n < 3 && op->arg[n] != A_END; n++)
680
2.64M
  {
681
2.64M
    if (n && op->arg[1] != A_END)
682
1.24M
      fprintf_fn (stream, ",");
683
2.64M
    switch (op->arg[n])
684
2.64M
      {
685
309k
      case A_IMM:
686
309k
        fprintf_fn (stream, "#%d", imm);
687
309k
        break;
688
83.6k
      case A_R0:
689
83.6k
        fprintf_fn (stream, "r0");
690
83.6k
        break;
691
841k
      case A_REG_N:
692
841k
        fprintf_fn (stream, "r%d", rn);
693
841k
        break;
694
36.6k
      case A_INC_N:
695
36.6k
      case AS_INC_N:
696
36.6k
        fprintf_fn (stream, "@r%d+", rn);
697
36.6k
        break;
698
26.0k
      case A_DEC_N:
699
26.0k
      case AS_DEC_N:
700
26.0k
        fprintf_fn (stream, "@-r%d", rn);
701
26.0k
        break;
702
52.4k
      case A_IND_N:
703
52.4k
      case AS_IND_N:
704
52.4k
        fprintf_fn (stream, "@r%d", rn);
705
52.4k
        break;
706
115k
      case A_DISP_REG_N:
707
115k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
708
115k
        break;
709
3.56k
      case AS_PMOD_N:
710
3.56k
        fprintf_fn (stream, "@r%d+r8", rn);
711
3.56k
        break;
712
463k
      case A_REG_M:
713
463k
        fprintf_fn (stream, "r%d", rm);
714
463k
        break;
715
51.6k
      case A_INC_M:
716
51.6k
        fprintf_fn (stream, "@r%d+", rm);
717
51.6k
        break;
718
242
      case A_DEC_M:
719
242
        fprintf_fn (stream, "@-r%d", rm);
720
242
        break;
721
34.1k
      case A_IND_M:
722
34.1k
        fprintf_fn (stream, "@r%d", rm);
723
34.1k
        break;
724
93.7k
      case A_DISP_REG_M:
725
93.7k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
726
93.7k
        break;
727
2.53k
      case A_REG_B:
728
2.53k
        fprintf_fn (stream, "r%d_bank", rb);
729
2.53k
        break;
730
121k
      case A_DISP_PC:
731
121k
        disp_pc = 1;
732
121k
        disp_pc_addr = imm + 4 + (memaddr & relmask);
733
121k
        (*info->print_address_func) (disp_pc_addr, info);
734
121k
        break;
735
67.5k
      case A_IND_R0_REG_N:
736
67.5k
        fprintf_fn (stream, "@(r0,r%d)", rn);
737
67.5k
        break;
738
49.8k
      case A_IND_R0_REG_M:
739
49.8k
        fprintf_fn (stream, "@(r0,r%d)", rm);
740
49.8k
        break;
741
23.5k
      case A_DISP_GBR:
742
23.5k
        fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
743
23.5k
        break;
744
830
      case A_TBR:
745
830
        fprintf_fn (stream, "tbr");
746
830
        break;
747
1.90k
      case A_DISP2_TBR:
748
1.90k
        fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
749
1.90k
        break;
750
397
      case A_INC_R15:
751
397
        fprintf_fn (stream, "@r15+");
752
397
        break;
753
348
      case A_DEC_R15:
754
348
        fprintf_fn (stream, "@-r15");
755
348
        break;
756
16.0k
      case A_R0_GBR:
757
16.0k
        fprintf_fn (stream, "@(r0,gbr)");
758
16.0k
        break;
759
100k
      case A_BDISP12:
760
119k
      case A_BDISP8:
761
119k
        (*info->print_address_func) (imm + memaddr, info);
762
119k
        break;
763
14.1k
      case A_SR:
764
14.1k
        fprintf_fn (stream, "sr");
765
14.1k
        break;
766
3.35k
      case A_GBR:
767
3.35k
        fprintf_fn (stream, "gbr");
768
3.35k
        break;
769
2.23k
      case A_VBR:
770
2.23k
        fprintf_fn (stream, "vbr");
771
2.23k
        break;
772
924
      case A_DSR:
773
924
        fprintf_fn (stream, "dsr");
774
924
        break;
775
1.42k
      case A_MOD:
776
1.42k
        fprintf_fn (stream, "mod");
777
1.42k
        break;
778
1.06k
      case A_RE:
779
1.06k
        fprintf_fn (stream, "re");
780
1.06k
        break;
781
1.02k
      case A_RS:
782
1.02k
        fprintf_fn (stream, "rs");
783
1.02k
        break;
784
1.30k
      case A_A0:
785
1.30k
        fprintf_fn (stream, "a0");
786
1.30k
        break;
787
862
      case A_X0:
788
862
        fprintf_fn (stream, "x0");
789
862
        break;
790
1.32k
      case A_X1:
791
1.32k
        fprintf_fn (stream, "x1");
792
1.32k
        break;
793
1.24k
      case A_Y0:
794
1.24k
        fprintf_fn (stream, "y0");
795
1.24k
        break;
796
1.00k
      case A_Y1:
797
1.00k
        fprintf_fn (stream, "y1");
798
1.00k
        break;
799
15.5k
      case DSP_REG_M:
800
15.5k
        print_dsp_reg (rm, fprintf_fn, stream);
801
15.5k
        break;
802
735
      case A_SSR:
803
735
        fprintf_fn (stream, "ssr");
804
735
        break;
805
3.54k
      case A_SPC:
806
3.54k
        fprintf_fn (stream, "spc");
807
3.54k
        break;
808
5.73k
      case A_MACH:
809
5.73k
        fprintf_fn (stream, "mach");
810
5.73k
        break;
811
1.78k
      case A_MACL:
812
1.78k
        fprintf_fn (stream, "macl");
813
1.78k
        break;
814
3.90k
      case A_PR:
815
3.90k
        fprintf_fn (stream, "pr");
816
3.90k
        break;
817
940
      case A_SGR:
818
940
        fprintf_fn (stream, "sgr");
819
940
        break;
820
1.40k
      case A_DBR:
821
1.40k
        fprintf_fn (stream, "dbr");
822
1.40k
        break;
823
26.2k
      case F_REG_N:
824
26.2k
        fprintf_fn (stream, "fr%d", rn);
825
26.2k
        break;
826
28.8k
      case F_REG_M:
827
28.8k
        fprintf_fn (stream, "fr%d", rm);
828
28.8k
        break;
829
836
      case DX_REG_N:
830
836
        if (rn & 1)
831
331
    {
832
331
      fprintf_fn (stream, "xd%d", rn & ~1);
833
331
      break;
834
331
    }
835
        /* Fall through.  */
836
825
      case D_REG_N:
837
825
        fprintf_fn (stream, "dr%d", rn);
838
825
        break;
839
1.67k
      case DX_REG_M:
840
1.67k
        if (rm & 1)
841
1.32k
    {
842
1.32k
      fprintf_fn (stream, "xd%d", rm & ~1);
843
1.32k
      break;
844
1.32k
    }
845
        /* Fall through.  */
846
355
      case D_REG_M:
847
355
        fprintf_fn (stream, "dr%d", rm);
848
355
        break;
849
185
      case FPSCR_M:
850
314
      case FPSCR_N:
851
314
        fprintf_fn (stream, "fpscr");
852
314
        break;
853
1.26k
      case FPUL_M:
854
2.00k
      case FPUL_N:
855
2.00k
        fprintf_fn (stream, "fpul");
856
2.00k
        break;
857
2.87k
      case F_FR0:
858
2.87k
        fprintf_fn (stream, "fr0");
859
2.87k
        break;
860
2.06k
      case V_REG_N:
861
2.06k
        fprintf_fn (stream, "fv%d", rn * 4);
862
2.06k
        break;
863
367
      case V_REG_M:
864
367
        fprintf_fn (stream, "fv%d", rm * 4);
865
367
        break;
866
1.69k
      case XMTRX_M4:
867
1.69k
        fprintf_fn (stream, "xmtrx");
868
1.69k
        break;
869
0
      default:
870
0
        abort ();
871
2.64M
      }
872
2.64M
  }
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.42M
      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
61.7k
      size = 2;
904
56.0k
    else
905
56.0k
      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
56.3k
    {
915
56.3k
      if (info->endian == BFD_ENDIAN_LITTLE)
916
13.6k
        val = bfd_getl16 (bytes);
917
42.6k
      else
918
42.6k
        val = bfd_getb16 (bytes);
919
56.3k
    }
920
45.4k
        else
921
45.4k
    {
922
45.4k
      if (info->endian == BFD_ENDIAN_LITTLE)
923
8.29k
        val = bfd_getl32 (bytes);
924
37.1k
      else
925
37.1k
        val = bfd_getb32 (bytes);
926
45.4k
    }
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.42M
      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
938
531M
    fail:
939
531M
      ;
940
941
531M
    }
942
752k
  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
943
752k
  return 2;
944
2.17M
}