Coverage Report

Created: 2026-10-02 09:53

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
4.89k
  case AX_IND_N:
46
6.25k
  case AXY_IND_N:
47
15.1k
  case AY_IND_N:
48
16.0k
  case AYX_IND_N:
49
16.0k
    fprintf_fn (stream, "@r%d", rn);
50
16.0k
    break;
51
0
  case A_INC_N:
52
12.9k
  case AX_INC_N:
53
16.2k
  case AXY_INC_N:
54
22.4k
  case AY_INC_N:
55
23.9k
  case AYX_INC_N:
56
23.9k
    fprintf_fn (stream, "@r%d+", rn);
57
23.9k
    break;
58
6.85k
  case AX_PMOD_N:
59
7.64k
  case AXY_PMOD_N:
60
7.64k
    fprintf_fn (stream, "@r%d+r8", rn);
61
7.64k
    break;
62
9.51k
  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
31.9k
  case DSP_REG_A_M:
67
31.9k
    fprintf_fn (stream, "a%c", '0' + rm);
68
31.9k
    break;
69
13.5k
  case DSP_REG_X:
70
13.5k
    fprintf_fn (stream, "x%c", '0' + rm);
71
13.5k
    break;
72
13.7k
  case DSP_REG_Y:
73
13.7k
    fprintf_fn (stream, "y%c", '0' + rm);
74
13.7k
    break;
75
3.96k
  case DSP_REG_AX:
76
3.96k
    fprintf_fn (stream, "%c%c",
77
3.96k
          (rm & 1) ? 'x' : 'a',
78
3.96k
          (rm & 2) ? '1' : '0');
79
3.96k
    break;
80
1.45k
  case DSP_REG_XY:
81
1.45k
    fprintf_fn (stream, "%c%c",
82
1.45k
          (rm & 1) ? 'y' : 'x',
83
1.45k
          (rm & 2) ? '1' : '0');
84
1.45k
    break;
85
2.36k
  case DSP_REG_AY:
86
2.36k
    fprintf_fn (stream, "%c%c",
87
2.36k
          (rm & 2) ? 'y' : 'a',
88
2.36k
          (rm & 1) ? '1' : '0');
89
2.36k
    break;
90
1.11k
  case DSP_REG_YX:
91
1.11k
    fprintf_fn (stream, "%c%c",
92
1.11k
          (rm & 2) ? 'x' : 'y',
93
1.11k
          (rm & 1) ? '1' : '0');
94
1.11k
    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
55.0k
{
110
55.0k
  fprintf_ftype fprintf_fn = info->fprintf_func;
111
55.0k
  void *stream = info->stream;
112
113
  /* If this is just a nop, make sure to emit something.  */
114
55.0k
  if (insn == 0x000)
115
805
    {
116
805
      fprintf_fn (stream, "nopx\tnopy");
117
805
      return;
118
805
    }
119
120
  /* If a parallel processing insn was printed before,
121
     and we got a non-nop, emit a tab.  */
122
54.1k
  if ((insn & 0x800) && (insn & 0x3ff))
123
33.0k
    fprintf_fn (stream, "\t");
124
125
  /* Check if either the x or y part is invalid.  */
126
54.1k
  if (((insn & 3) != 0 && (insn & 0xc) == 0 && (insn & 0x2a0))
127
45.5k
      || ((insn & 3) == 0 && (insn & 0xc) != 0 && (insn & 0x150)))
128
19.5k
    if (info->mach != bfd_mach_sh_dsp
129
9.24k
        && info->mach != bfd_mach_sh3_dsp)
130
8.88k
      {
131
8.88k
  static const sh_opcode_info *first_movx, *first_movy;
132
8.88k
  const sh_opcode_info *op;
133
8.88k
  int is_movy;
134
135
8.88k
  if (! first_movx)
136
2
    {
137
554
      for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;)
138
552
        first_movx++;
139
38
      for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;)
140
36
        first_movy++;
141
2
    }
142
143
8.88k
  is_movy = ((insn & 3) != 0);
144
145
8.88k
  if (is_movy)
146
3.47k
    op = first_movy;
147
5.41k
  else
148
5.41k
    op = first_movx;
149
150
74.7k
  while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
151
17.4k
         || op->nibbles[3] != (unsigned) (insn & 0xf))
152
65.8k
    op++;
153
154
8.88k
  print_movxy (op,
155
8.88k
         (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
156
8.88k
          + 2 * is_movy
157
8.88k
          + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
158
8.88k
         (insn >> 6) & 3,
159
8.88k
         fprintf_fn, stream);
160
8.88k
      }
161
10.7k
    else
162
10.7k
      fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
163
34.6k
  else
164
34.6k
    {
165
34.6k
      static const sh_opcode_info *first_movx, *first_movy;
166
34.6k
      const sh_opcode_info *opx, *opy;
167
34.6k
      unsigned int insn_x, insn_y;
168
169
34.6k
      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.6k
      insn_x = (insn >> 2) & 0xb;
177
34.6k
      if (insn_x)
178
27.6k
  {
179
216k
    for (opx = first_movx; opx->nibbles[2] != insn_x;)
180
188k
      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.6k
      insn_y = (insn & 3) | ((insn >> 1) & 8);
185
34.6k
      if (insn_y)
186
26.6k
  {
187
26.6k
    if (insn_x)
188
24.7k
      fprintf_fn (stream, "\t");
189
142k
    for (opy = first_movy; opy->nibbles[2] != insn_y;)
190
115k
      opy++;
191
26.6k
    print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
192
26.6k
           fprintf_fn, stream);
193
26.6k
  }
194
34.6k
      if (!insn_x && !insn_y && ((insn & 0x3ff) != 0 || (insn & 0x800) == 0))
195
3.59k
  fprintf_fn (stream, ".word 0x%x", insn | 0xf000);
196
34.6k
    }
197
54.1k
}
198
199
static void
200
print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
201
35.4k
{
202
35.4k
  switch (rm)
203
35.4k
    {
204
1.67k
    case A_A1_NUM:
205
1.67k
      fprintf_fn (stream, "a1");
206
1.67k
      break;
207
1.60k
    case A_A0_NUM:
208
1.60k
      fprintf_fn (stream, "a0");
209
1.60k
      break;
210
3.30k
    case A_X0_NUM:
211
3.30k
      fprintf_fn (stream, "x0");
212
3.30k
      break;
213
3.73k
    case A_X1_NUM:
214
3.73k
      fprintf_fn (stream, "x1");
215
3.73k
      break;
216
2.77k
    case A_Y0_NUM:
217
2.77k
      fprintf_fn (stream, "y0");
218
2.77k
      break;
219
2.50k
    case A_Y1_NUM:
220
2.50k
      fprintf_fn (stream, "y1");
221
2.50k
      break;
222
1.53k
    case A_M0_NUM:
223
1.53k
      fprintf_fn (stream, "m0");
224
1.53k
      break;
225
1.15k
    case A_A1G_NUM:
226
1.15k
      fprintf_fn (stream, "a1g");
227
1.15k
      break;
228
1.40k
    case A_M1_NUM:
229
1.40k
      fprintf_fn (stream, "m1");
230
1.40k
      break;
231
5.71k
    case A_A0G_NUM:
232
5.71k
      fprintf_fn (stream, "a0g");
233
5.71k
      break;
234
10.0k
    default:
235
10.0k
      fprintf_fn (stream, "0x%x", rm);
236
10.0k
      break;
237
35.4k
    }
238
35.4k
}
239
240
static void
241
print_insn_ppi (int field_b, struct disassemble_info *info)
242
34.5k
{
243
34.5k
  static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
244
34.5k
  static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
245
34.5k
  fprintf_ftype fprintf_fn = info->fprintf_func;
246
34.5k
  void *stream = info->stream;
247
34.5k
  unsigned int nib1, nib2, nib3;
248
34.5k
  unsigned int altnib1, nib4;
249
34.5k
  char *dc = NULL;
250
34.5k
  const sh_opcode_info *op;
251
252
34.5k
  if ((field_b & 0xe800) == 0)
253
7.01k
    {
254
7.01k
      fprintf_fn (stream, "psh%c\t#%d,",
255
7.01k
      field_b & 0x1000 ? 'a' : 'l',
256
7.01k
      (field_b >> 4) & 127);
257
7.01k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
258
7.01k
      return;
259
7.01k
    }
260
27.4k
  if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
261
3.33k
    {
262
3.33k
      static char *du_tab[] = { "x0", "y0", "a0", "a1" };
263
3.33k
      static char *se_tab[] = { "x0", "x1", "y0", "a1" };
264
3.33k
      static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
265
3.33k
      static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
266
267
3.33k
      if (field_b & 0x2000)
268
1.72k
  fprintf_fn (stream, "p%s %s,%s,%s\t",
269
1.72k
        (field_b & 0x1000) ? "add" : "sub",
270
1.72k
        sx_tab[(field_b >> 6) & 3],
271
1.72k
        sy_tab[(field_b >> 4) & 3],
272
1.72k
        du_tab[(field_b >> 0) & 3]);
273
274
1.60k
      else if ((field_b & 0xf0) == 0x10
275
420
         && info->mach != bfd_mach_sh_dsp
276
261
         && info->mach != bfd_mach_sh3_dsp)
277
230
  fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
278
279
1.37k
      else if ((field_b & 0xf3) != 0)
280
1.12k
  fprintf_fn (stream, ".word 0x%x\t", field_b);
281
282
3.33k
      fprintf_fn (stream, "pmuls%c%s,%s,%s",
283
3.33k
      field_b & 0x2000 ? ' ' : '\t',
284
3.33k
      se_tab[(field_b >> 10) & 3],
285
3.33k
      sf_tab[(field_b >>  8) & 3],
286
3.33k
      sg_tab[(field_b >>  2) & 3]);
287
3.33k
      return;
288
3.33k
    }
289
290
24.1k
  nib1 = PPIC;
291
24.1k
  nib2 = field_b >> 12 & 0xf;
292
24.1k
  nib3 = field_b >> 8 & 0xf;
293
24.1k
  nib4 = field_b >> 4 & 0xf;
294
24.1k
  switch (nib3 & 0x3)
295
24.1k
    {
296
6.20k
    case 0:
297
6.20k
      dc = "";
298
6.20k
      nib1 = PPI3;
299
6.20k
      break;
300
6.36k
    case 1:
301
6.36k
      dc = "";
302
6.36k
      break;
303
4.58k
    case 2:
304
4.58k
      dc = "dct ";
305
4.58k
      nib3 -= 1;
306
4.58k
      break;
307
7.00k
    case 3:
308
7.00k
      dc = "dcf ";
309
7.00k
      nib3 -= 2;
310
7.00k
      break;
311
24.1k
    }
312
24.1k
  if (nib1 == PPI3)
313
6.20k
    altnib1 = PPI3NC;
314
17.9k
  else
315
17.9k
    altnib1 = nib1;
316
9.54M
  for (op = sh_table; op->name; op++)
317
9.53M
    {
318
9.53M
      if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
319
483k
    && op->nibbles[2] == nib2
320
33.8k
    && op->nibbles[3] == nib3)
321
15.6k
  {
322
15.6k
    int n;
323
324
15.6k
    switch (op->nibbles[4])
325
15.6k
      {
326
11.1k
      case HEX_0:
327
11.1k
        break;
328
1.20k
      case HEX_XX00:
329
1.20k
        if ((nib4 & 3) != 0)
330
883
    continue;
331
319
        break;
332
1.43k
      case HEX_1:
333
1.43k
        if ((nib4 & 3) != 1)
334
914
    continue;
335
516
        break;
336
841
      case HEX_00YY:
337
841
        if ((nib4 & 0xc) != 0)
338
603
    continue;
339
238
        break;
340
1.03k
      case HEX_4:
341
1.03k
        if ((nib4 & 0xc) != 4)
342
752
    continue;
343
287
        break;
344
287
      default:
345
0
        abort ();
346
15.6k
      }
347
12.4k
    fprintf_fn (stream, "%s%s\t", dc, op->name);
348
38.7k
    for (n = 0; n < 3 && op->arg[n] != A_END; n++)
349
26.2k
      {
350
26.2k
        if (n && op->arg[1] != A_END)
351
13.7k
    fprintf_fn (stream, ",");
352
26.2k
        switch (op->arg[n])
353
26.2k
    {
354
12.4k
    case DSP_REG_N:
355
12.4k
      print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
356
12.4k
      break;
357
2.70k
    case DSP_REG_X:
358
2.70k
      fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
359
2.70k
      break;
360
8.61k
    case DSP_REG_Y:
361
8.61k
      fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
362
8.61k
      break;
363
531
    case A_MACH:
364
531
      fprintf_fn (stream, "mach");
365
531
      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
26.2k
    }
372
26.2k
      }
373
12.4k
    return;
374
12.4k
  }
375
9.53M
    }
376
  /* Not found.  */
377
11.6k
  fprintf_fn (stream, ".word 0x%x", field_b);
378
11.6k
}
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.31M
{
386
2.31M
  fprintf_ftype fprintf_fn = info->fprintf_func;
387
2.31M
  void *stream = info->stream;
388
2.31M
  unsigned char insn[4];
389
2.31M
  unsigned char nibs[8];
390
2.31M
  int status;
391
2.31M
  bfd_vma relmask = ~(bfd_vma) 0;
392
2.31M
  const sh_opcode_info *op;
393
2.31M
  unsigned int target_arch;
394
2.31M
  int allow_op32;
395
396
2.31M
  switch (info->mach)
397
2.31M
    {
398
133k
    case bfd_mach_sh:
399
133k
      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
133k
      if (info->symbols
404
108
    && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
405
0
  target_arch = arch_sh4;
406
133k
      break;
407
2.17M
    default:
408
2.17M
      target_arch = sh_get_arch_from_bfd_mach (info->mach);
409
2.31M
    }
410
411
2.31M
  status = info->read_memory_func (memaddr, insn, 2, info);
412
413
2.31M
  if (status != 0)
414
533
    {
415
533
      info->memory_error_func (status, memaddr, info);
416
533
      return -1;
417
533
    }
418
419
2.31M
  if (info->endian == BFD_ENDIAN_LITTLE)
420
503k
    {
421
503k
      nibs[0] = (insn[1] >> 4) & 0xf;
422
503k
      nibs[1] = insn[1] & 0xf;
423
424
503k
      nibs[2] = (insn[0] >> 4) & 0xf;
425
503k
      nibs[3] = insn[0] & 0xf;
426
503k
    }
427
1.80M
  else
428
1.80M
    {
429
1.80M
      nibs[0] = (insn[0] >> 4) & 0xf;
430
1.80M
      nibs[1] = insn[0] & 0xf;
431
432
1.80M
      nibs[2] = (insn[1] >> 4) & 0xf;
433
1.80M
      nibs[3] = insn[1] & 0xf;
434
1.80M
    }
435
2.31M
  status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
436
2.31M
  if (status != 0)
437
2.03k
    allow_op32 = 0;
438
2.30M
  else
439
2.30M
    {
440
2.30M
      allow_op32 = 1;
441
442
2.30M
      if (info->endian == BFD_ENDIAN_LITTLE)
443
503k
  {
444
503k
    nibs[4] = (insn[3] >> 4) & 0xf;
445
503k
    nibs[5] = insn[3] & 0xf;
446
447
503k
    nibs[6] = (insn[2] >> 4) & 0xf;
448
503k
    nibs[7] = insn[2] & 0xf;
449
503k
  }
450
1.80M
      else
451
1.80M
  {
452
1.80M
    nibs[4] = (insn[2] >> 4) & 0xf;
453
1.80M
    nibs[5] = insn[2] & 0xf;
454
455
1.80M
    nibs[6] = (insn[3] >> 4) & 0xf;
456
1.80M
    nibs[7] = insn[3] & 0xf;
457
1.80M
  }
458
2.30M
    }
459
460
2.31M
  if (nibs[0] == 0xf && (nibs[1] & 4) == 0
461
63.6k
      && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
462
55.0k
    {
463
55.0k
      if (nibs[1] & 8)
464
34.5k
  {
465
34.5k
    int field_b;
466
467
34.5k
    status = info->read_memory_func (memaddr + 2, insn, 2, info);
468
469
34.5k
    if (status != 0)
470
34
      {
471
34
        info->memory_error_func (status, memaddr + 2, info);
472
34
        return -1;
473
34
      }
474
475
34.5k
    if (info->endian == BFD_ENDIAN_LITTLE)
476
17.8k
      field_b = insn[1] << 8 | insn[0];
477
16.6k
    else
478
16.6k
      field_b = insn[0] << 8 | insn[1];
479
480
34.5k
    print_insn_ppi (field_b, info);
481
34.5k
    print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
482
34.5k
    return 4;
483
34.5k
  }
484
20.4k
      print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
485
20.4k
      return 2;
486
55.0k
    }
487
564M
  for (op = sh_table; op->name; op++)
488
563M
    {
489
563M
      int n;
490
563M
      int imm = 0;
491
563M
      int rn = 0;
492
563M
      int rm = 0;
493
563M
      int rb = 0;
494
563M
      int disp_pc;
495
563M
      bfd_vma disp_pc_addr = 0;
496
563M
      int disp = 0;
497
563M
      int has_disp = 0;
498
563M
      int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
499
500
563M
      if (!allow_op32
501
422k
    && SH_MERGE_ARCH_SET (op->arch, arch_op32))
502
17.6k
  goto fail;
503
504
563M
      if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
505
207M
  goto fail;
506
455M
      for (n = 0; n < max_n; n++)
507
454M
  {
508
454M
    int i = op->nibbles[n];
509
510
454M
    if (i < 16)
511
363M
      {
512
363M
        if (nibs[n] == i)
513
54.4M
    continue;
514
309M
        goto fail;
515
363M
      }
516
90.8M
    switch (i)
517
90.8M
      {
518
19.8k
      case BRANCH_8:
519
19.8k
        imm = (nibs[2] << 4) | (nibs[3]);
520
19.8k
        if (imm & 0x80)
521
8.66k
    imm |= ~0xff;
522
19.8k
        imm = ((char) imm) * 2 + 4;
523
19.8k
        goto ok;
524
101k
      case BRANCH_12:
525
101k
        imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
526
101k
        if (imm & 0x800)
527
52.0k
    imm |= ~0xfff;
528
101k
        imm = imm * 2 + 4;
529
101k
        goto ok;
530
4.42k
      case IMM0_3c:
531
4.42k
        if (nibs[3] & 0x8)
532
631
    goto fail;
533
3.79k
        imm = nibs[3] & 0x7;
534
3.79k
        break;
535
4.07k
      case IMM0_3s:
536
4.07k
        if (!(nibs[3] & 0x8))
537
2.76k
    goto fail;
538
1.31k
        imm = nibs[3] & 0x7;
539
1.31k
        break;
540
23.8k
      case IMM0_3Uc:
541
23.8k
        if (nibs[2] & 0x8)
542
6.78k
    goto fail;
543
17.0k
        imm = nibs[2] & 0x7;
544
17.0k
        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
261
      case DISP0_12:
551
1.70k
      case DISP1_12:
552
1.70k
        disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
553
1.70k
        has_disp = 1;
554
1.70k
        goto ok;
555
410
      case DISP0_12BY2:
556
599
      case DISP1_12BY2:
557
599
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
558
599
        relmask = ~(bfd_vma) 1;
559
599
        has_disp = 1;
560
599
        goto ok;
561
599
      case DISP0_12BY4:
562
2.74k
      case DISP1_12BY4:
563
2.74k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
564
2.74k
        relmask = ~(bfd_vma) 3;
565
2.74k
        has_disp = 1;
566
2.74k
        goto ok;
567
845
      case DISP0_12BY8:
568
4.42k
      case DISP1_12BY8:
569
4.42k
        disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
570
4.42k
        relmask = ~(bfd_vma) 7;
571
4.42k
        has_disp = 1;
572
4.42k
        goto ok;
573
118k
      case IMM0_20_4:
574
118k
        break;
575
77.8k
      case IMM0_20:
576
77.8k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
577
77.8k
         | (nibs[6] << 4) | nibs[7]);
578
77.8k
        if (imm & 0x80000)
579
3.35k
    imm -= 0x100000;
580
77.8k
        goto ok;
581
8.39k
      case IMM0_20BY8:
582
8.39k
        imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
583
8.39k
         | (nibs[6] << 4) | nibs[7]);
584
8.39k
        imm <<= 8;
585
8.39k
        if (imm & 0x8000000)
586
1.09k
    imm -= 0x10000000;
587
8.39k
        goto ok;
588
5.13k
      case IMM0_4:
589
19.4k
      case IMM1_4:
590
19.4k
        imm = nibs[3];
591
19.4k
        goto ok;
592
5.42k
      case IMM0_4BY2:
593
9.10k
      case IMM1_4BY2:
594
9.10k
        imm = nibs[3] << 1;
595
9.10k
        goto ok;
596
66.1k
      case IMM0_4BY4:
597
173k
      case IMM1_4BY4:
598
173k
        imm = nibs[3] << 2;
599
173k
        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
66.7k
    imm -= 0x100;
607
176k
        goto ok;
608
40.7k
      case IMM0_8U:
609
40.7k
        disp = imm = (nibs[2] << 4) | nibs[3];
610
40.7k
        has_disp = 1;
611
40.7k
        goto ok;
612
63.5k
      case PCRELIMM_8BY2:
613
63.5k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
614
63.5k
        relmask = ~(bfd_vma) 1;
615
63.5k
        goto ok;
616
59.9k
      case PCRELIMM_8BY4:
617
59.9k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
618
59.9k
        relmask = ~(bfd_vma) 3;
619
59.9k
        goto ok;
620
3.58k
      case IMM0_8BY2:
621
8.73k
      case IMM1_8BY2:
622
8.73k
        imm = ((nibs[2] << 4) | nibs[3]) << 1;
623
8.73k
        goto ok;
624
5.70k
      case IMM0_8BY4:
625
8.40k
      case IMM1_8BY4:
626
8.40k
        imm = ((nibs[2] << 4) | nibs[3]) << 2;
627
8.40k
        goto ok;
628
140k
      case REG_N_D:
629
140k
        if ((nibs[n] & 1) != 0)
630
123k
    goto fail;
631
        /* Fall through.  */
632
31.9M
      case REG_N:
633
31.9M
        rn = nibs[n];
634
31.9M
        break;
635
12.4M
      case REG_M:
636
12.4M
        rm = nibs[n];
637
12.4M
        break;
638
21.7k
      case REG_N_B01:
639
21.7k
        if ((nibs[n] & 0x3) != 1 /* binary 01 */)
640
20.3k
    goto fail;
641
1.41k
        rn = (nibs[n] & 0xc) >> 2;
642
1.41k
        break;
643
30.5k
      case REG_NM:
644
30.5k
        rn = (nibs[n] & 0xc) >> 2;
645
30.5k
        rm = (nibs[n] & 0x3);
646
30.5k
        break;
647
170k
      case REG_B:
648
170k
        if (!(nibs[n] & 0x08)) /* Must always be 1.  */
649
134k
    goto fail;
650
35.3k
        rb = nibs[n] & 0x07;
651
35.3k
        break;
652
2.24M
      case SDT_REG_N:
653
        /* sh-dsp: single data transfer.  */
654
2.24M
        rn = nibs[n];
655
2.24M
        if ((rn & 0xc) != 4)
656
2.12M
    goto fail;
657
122k
        rn = rn & 0x3;
658
122k
        rn |= (!(rn & 2)) << 2;
659
122k
        break;
660
41.1M
      case PPI:
661
42.9M
      case REPEAT:
662
42.9M
        goto fail;
663
0
      default:
664
0
        abort ();
665
90.8M
      }
666
90.8M
  }
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
267k
    && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
674
265k
        || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
675
2.19k
  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
300k
      case A_IMM:
686
300k
        fprintf_fn (stream, "#%d", imm);
687
300k
        break;
688
81.4k
      case A_R0:
689
81.4k
        fprintf_fn (stream, "r0");
690
81.4k
        break;
691
847k
      case A_REG_N:
692
847k
        fprintf_fn (stream, "r%d", rn);
693
847k
        break;
694
37.3k
      case A_INC_N:
695
37.3k
      case AS_INC_N:
696
37.3k
        fprintf_fn (stream, "@r%d+", rn);
697
37.3k
        break;
698
28.0k
      case A_DEC_N:
699
28.0k
      case AS_DEC_N:
700
28.0k
        fprintf_fn (stream, "@-r%d", rn);
701
28.0k
        break;
702
53.7k
      case A_IND_N:
703
53.7k
      case AS_IND_N:
704
53.7k
        fprintf_fn (stream, "@r%d", rn);
705
53.7k
        break;
706
112k
      case A_DISP_REG_N:
707
112k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
708
112k
        break;
709
3.26k
      case AS_PMOD_N:
710
3.26k
        fprintf_fn (stream, "@r%d+r8", rn);
711
3.26k
        break;
712
465k
      case A_REG_M:
713
465k
        fprintf_fn (stream, "r%d", rm);
714
465k
        break;
715
52.3k
      case A_INC_M:
716
52.3k
        fprintf_fn (stream, "@r%d+", rm);
717
52.3k
        break;
718
189
      case A_DEC_M:
719
189
        fprintf_fn (stream, "@-r%d", rm);
720
189
        break;
721
36.7k
      case A_IND_M:
722
36.7k
        fprintf_fn (stream, "@r%d", rm);
723
36.7k
        break;
724
96.3k
      case A_DISP_REG_M:
725
96.3k
        fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
726
96.3k
        break;
727
2.19k
      case A_REG_B:
728
2.19k
        fprintf_fn (stream, "r%d_bank", rb);
729
2.19k
        break;
730
123k
      case A_DISP_PC:
731
123k
        disp_pc = 1;
732
123k
        disp_pc_addr = imm + 4 + (memaddr & relmask);
733
123k
        (*info->print_address_func) (disp_pc_addr, info);
734
123k
        break;
735
61.0k
      case A_IND_R0_REG_N:
736
61.0k
        fprintf_fn (stream, "@(r0,r%d)", rn);
737
61.0k
        break;
738
54.8k
      case A_IND_R0_REG_M:
739
54.8k
        fprintf_fn (stream, "@(r0,r%d)", rm);
740
54.8k
        break;
741
24.2k
      case A_DISP_GBR:
742
24.2k
        fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
743
24.2k
        break;
744
1.59k
      case A_TBR:
745
1.59k
        fprintf_fn (stream, "tbr");
746
1.59k
        break;
747
1.54k
      case A_DISP2_TBR:
748
1.54k
        fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
749
1.54k
        break;
750
330
      case A_INC_R15:
751
330
        fprintf_fn (stream, "@r15+");
752
330
        break;
753
330
      case A_DEC_R15:
754
330
        fprintf_fn (stream, "@-r15");
755
330
        break;
756
17.6k
      case A_R0_GBR:
757
17.6k
        fprintf_fn (stream, "@(r0,gbr)");
758
17.6k
        break;
759
101k
      case A_BDISP12:
760
121k
      case A_BDISP8:
761
121k
        (*info->print_address_func) (imm + memaddr, info);
762
121k
        break;
763
15.7k
      case A_SR:
764
15.7k
        fprintf_fn (stream, "sr");
765
15.7k
        break;
766
3.96k
      case A_GBR:
767
3.96k
        fprintf_fn (stream, "gbr");
768
3.96k
        break;
769
1.67k
      case A_VBR:
770
1.67k
        fprintf_fn (stream, "vbr");
771
1.67k
        break;
772
961
      case A_DSR:
773
961
        fprintf_fn (stream, "dsr");
774
961
        break;
775
1.25k
      case A_MOD:
776
1.25k
        fprintf_fn (stream, "mod");
777
1.25k
        break;
778
1.10k
      case A_RE:
779
1.10k
        fprintf_fn (stream, "re");
780
1.10k
        break;
781
1.15k
      case A_RS:
782
1.15k
        fprintf_fn (stream, "rs");
783
1.15k
        break;
784
1.41k
      case A_A0:
785
1.41k
        fprintf_fn (stream, "a0");
786
1.41k
        break;
787
1.12k
      case A_X0:
788
1.12k
        fprintf_fn (stream, "x0");
789
1.12k
        break;
790
1.36k
      case A_X1:
791
1.36k
        fprintf_fn (stream, "x1");
792
1.36k
        break;
793
1.21k
      case A_Y0:
794
1.21k
        fprintf_fn (stream, "y0");
795
1.21k
        break;
796
861
      case A_Y1:
797
861
        fprintf_fn (stream, "y1");
798
861
        break;
799
15.9k
      case DSP_REG_M:
800
15.9k
        print_dsp_reg (rm, fprintf_fn, stream);
801
15.9k
        break;
802
562
      case A_SSR:
803
562
        fprintf_fn (stream, "ssr");
804
562
        break;
805
2.75k
      case A_SPC:
806
2.75k
        fprintf_fn (stream, "spc");
807
2.75k
        break;
808
5.30k
      case A_MACH:
809
5.30k
        fprintf_fn (stream, "mach");
810
5.30k
        break;
811
2.06k
      case A_MACL:
812
2.06k
        fprintf_fn (stream, "macl");
813
2.06k
        break;
814
3.80k
      case A_PR:
815
3.80k
        fprintf_fn (stream, "pr");
816
3.80k
        break;
817
782
      case A_SGR:
818
782
        fprintf_fn (stream, "sgr");
819
782
        break;
820
1.03k
      case A_DBR:
821
1.03k
        fprintf_fn (stream, "dbr");
822
1.03k
        break;
823
22.9k
      case F_REG_N:
824
22.9k
        fprintf_fn (stream, "fr%d", rn);
825
22.9k
        break;
826
23.9k
      case F_REG_M:
827
23.9k
        fprintf_fn (stream, "fr%d", rm);
828
23.9k
        break;
829
462
      case DX_REG_N:
830
462
        if (rn & 1)
831
115
    {
832
115
      fprintf_fn (stream, "xd%d", rn & ~1);
833
115
      break;
834
115
    }
835
        /* Fall through.  */
836
678
      case D_REG_N:
837
678
        fprintf_fn (stream, "dr%d", rn);
838
678
        break;
839
1.77k
      case DX_REG_M:
840
1.77k
        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
455
      case D_REG_M:
847
455
        fprintf_fn (stream, "dr%d", rm);
848
455
        break;
849
304
      case FPSCR_M:
850
405
      case FPSCR_N:
851
405
        fprintf_fn (stream, "fpscr");
852
405
        break;
853
1.26k
      case FPUL_M:
854
1.87k
      case FPUL_N:
855
1.87k
        fprintf_fn (stream, "fpul");
856
1.87k
        break;
857
2.39k
      case F_FR0:
858
2.39k
        fprintf_fn (stream, "fr0");
859
2.39k
        break;
860
1.38k
      case V_REG_N:
861
1.38k
        fprintf_fn (stream, "fv%d", rn * 4);
862
1.38k
        break;
863
182
      case V_REG_M:
864
182
        fprintf_fn (stream, "fv%d", rm * 4);
865
182
        break;
866
1.19k
      case XMTRX_M4:
867
1.19k
        fprintf_fn (stream, "xmtrx");
868
1.19k
        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
118k
  {
899
118k
    int size;
900
118k
    bfd_byte bytes[4];
901
902
118k
    if (relmask == ~(bfd_vma) 1)
903
63.5k
      size = 2;
904
54.9k
    else
905
54.9k
      size = 4;
906
    /* Not reading an instruction - disable stop_vma.  */
907
118k
    info->stop_vma = 0;
908
118k
    status = info->read_memory_func (disp_pc_addr, bytes, size, info);
909
118k
    if (status == 0)
910
102k
      {
911
102k
        unsigned int val;
912
913
102k
        if (size == 2)
914
58.0k
    {
915
58.0k
      if (info->endian == BFD_ENDIAN_LITTLE)
916
12.8k
        val = bfd_getl16 (bytes);
917
45.2k
      else
918
45.2k
        val = bfd_getb16 (bytes);
919
58.0k
    }
920
44.3k
        else
921
44.3k
    {
922
44.3k
      if (info->endian == BFD_ENDIAN_LITTLE)
923
7.11k
        val = bfd_getl32 (bytes);
924
37.2k
      else
925
37.2k
        val = bfd_getb32 (bytes);
926
44.3k
    }
927
102k
        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
102k
        else
933
102k
    fprintf_fn (stream, "\t! %x", val);
934
102k
      }
935
118k
  }
936
937
1.42M
      return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
938
562M
    fail:
939
562M
      ;
940
941
562M
    }
942
832k
  fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
943
832k
  return 2;
944
2.25M
}