[opcodes, ARM, 14/16] Add mode availability to coprocessor table entries
[binutils-gdb.git] / opcodes / sh-dis.c
blob126cb5ba992ef4c8a514c013f4f7ae8ad89b3e93
1 /* Disassemble SH instructions.
2 Copyright (C) 1993-2019 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
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.
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.
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. */
21 #include "sysdep.h"
22 #include <stdio.h>
24 #define STATIC_TABLE
25 #define DEFINE_TABLE
27 #include "sh-opc.h"
28 #include "disassemble.h"
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)
37 int n;
39 fprintf_fn (stream, "%s\t", op->name);
40 for (n = 0; n < 2; n++)
42 switch (op->arg[n])
44 case A_IND_N:
45 case AX_IND_N:
46 case AXY_IND_N:
47 case AY_IND_N:
48 case AYX_IND_N:
49 fprintf_fn (stream, "@r%d", rn);
50 break;
51 case A_INC_N:
52 case AX_INC_N:
53 case AXY_INC_N:
54 case AY_INC_N:
55 case AYX_INC_N:
56 fprintf_fn (stream, "@r%d+", rn);
57 break;
58 case AX_PMOD_N:
59 case AXY_PMOD_N:
60 fprintf_fn (stream, "@r%d+r8", rn);
61 break;
62 case AY_PMOD_N:
63 case AYX_PMOD_N:
64 fprintf_fn (stream, "@r%d+r9", rn);
65 break;
66 case DSP_REG_A_M:
67 fprintf_fn (stream, "a%c", '0' + rm);
68 break;
69 case DSP_REG_X:
70 fprintf_fn (stream, "x%c", '0' + rm);
71 break;
72 case DSP_REG_Y:
73 fprintf_fn (stream, "y%c", '0' + rm);
74 break;
75 case DSP_REG_AX:
76 fprintf_fn (stream, "%c%c",
77 (rm & 1) ? 'x' : 'a',
78 (rm & 2) ? '1' : '0');
79 break;
80 case DSP_REG_XY:
81 fprintf_fn (stream, "%c%c",
82 (rm & 1) ? 'y' : 'x',
83 (rm & 2) ? '1' : '0');
84 break;
85 case DSP_REG_AY:
86 fprintf_fn (stream, "%c%c",
87 (rm & 2) ? 'y' : 'a',
88 (rm & 1) ? '1' : '0');
89 break;
90 case DSP_REG_YX:
91 fprintf_fn (stream, "%c%c",
92 (rm & 2) ? 'x' : 'y',
93 (rm & 1) ? '1' : '0');
94 break;
95 default:
96 abort ();
98 if (n == 0)
99 fprintf_fn (stream, ",");
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 Return nonzero if a field b of a parallel processing insns follows. */
108 static void
109 print_insn_ddt (int insn, struct disassemble_info *info)
111 fprintf_ftype fprintf_fn = info->fprintf_func;
112 void *stream = info->stream;
114 /* If this is just a nop, make sure to emit something. */
115 if (insn == 0x000)
116 fprintf_fn (stream, "nopx\tnopy");
118 /* If a parallel processing insn was printed before,
119 and we got a non-nop, emit a tab. */
120 if ((insn & 0x800) && (insn & 0x3ff))
121 fprintf_fn (stream, "\t");
123 /* Check if either the x or y part is invalid. */
124 if (((insn & 0xc) == 0 && (insn & 0x2a0))
125 || ((insn & 3) == 0 && (insn & 0x150)))
126 if (info->mach != bfd_mach_sh_dsp
127 && info->mach != bfd_mach_sh3_dsp)
129 static const sh_opcode_info *first_movx, *first_movy;
130 const sh_opcode_info *op;
131 int is_movy;
133 if (! first_movx)
135 for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;)
136 first_movx++;
137 for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;)
138 first_movy++;
141 is_movy = ((insn & 3) != 0);
143 if (is_movy)
144 op = first_movy;
145 else
146 op = first_movx;
148 while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
149 || op->nibbles[3] != (unsigned) (insn & 0xf))
150 op++;
152 print_movxy (op,
153 (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
154 + 2 * is_movy
155 + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
156 (insn >> 6) & 3,
157 fprintf_fn, stream);
159 else
160 fprintf_fn (stream, ".word 0x%x", insn);
161 else
163 static const sh_opcode_info *first_movx, *first_movy;
164 const sh_opcode_info *opx, *opy;
165 unsigned int insn_x, insn_y;
167 if (! first_movx)
169 for (first_movx = sh_table; first_movx->nibbles[1] != MOVX;)
170 first_movx++;
171 for (first_movy = first_movx; first_movy->nibbles[1] != MOVY;)
172 first_movy++;
174 insn_x = (insn >> 2) & 0xb;
175 if (insn_x)
177 for (opx = first_movx; opx->nibbles[2] != insn_x;)
178 opx++;
179 print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
180 fprintf_fn, stream);
182 insn_y = (insn & 3) | ((insn >> 1) & 8);
183 if (insn_y)
185 if (insn_x)
186 fprintf_fn (stream, "\t");
187 for (opy = first_movy; opy->nibbles[2] != insn_y;)
188 opy++;
189 print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
190 fprintf_fn, stream);
195 static void
196 print_dsp_reg (int rm, fprintf_ftype fprintf_fn, void *stream)
198 switch (rm)
200 case A_A1_NUM:
201 fprintf_fn (stream, "a1");
202 break;
203 case A_A0_NUM:
204 fprintf_fn (stream, "a0");
205 break;
206 case A_X0_NUM:
207 fprintf_fn (stream, "x0");
208 break;
209 case A_X1_NUM:
210 fprintf_fn (stream, "x1");
211 break;
212 case A_Y0_NUM:
213 fprintf_fn (stream, "y0");
214 break;
215 case A_Y1_NUM:
216 fprintf_fn (stream, "y1");
217 break;
218 case A_M0_NUM:
219 fprintf_fn (stream, "m0");
220 break;
221 case A_A1G_NUM:
222 fprintf_fn (stream, "a1g");
223 break;
224 case A_M1_NUM:
225 fprintf_fn (stream, "m1");
226 break;
227 case A_A0G_NUM:
228 fprintf_fn (stream, "a0g");
229 break;
230 default:
231 fprintf_fn (stream, "0x%x", rm);
232 break;
236 static void
237 print_insn_ppi (int field_b, struct disassemble_info *info)
239 static char *sx_tab[] = { "x0", "x1", "a0", "a1" };
240 static char *sy_tab[] = { "y0", "y1", "m0", "m1" };
241 fprintf_ftype fprintf_fn = info->fprintf_func;
242 void *stream = info->stream;
243 unsigned int nib1, nib2, nib3;
244 unsigned int altnib1, nib4;
245 char *dc = NULL;
246 const sh_opcode_info *op;
248 if ((field_b & 0xe800) == 0)
250 fprintf_fn (stream, "psh%c\t#%d,",
251 field_b & 0x1000 ? 'a' : 'l',
252 (field_b >> 4) & 127);
253 print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
254 return;
256 if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
258 static char *du_tab[] = { "x0", "y0", "a0", "a1" };
259 static char *se_tab[] = { "x0", "x1", "y0", "a1" };
260 static char *sf_tab[] = { "y0", "y1", "x0", "a1" };
261 static char *sg_tab[] = { "m0", "m1", "a0", "a1" };
263 if (field_b & 0x2000)
264 fprintf_fn (stream, "p%s %s,%s,%s\t",
265 (field_b & 0x1000) ? "add" : "sub",
266 sx_tab[(field_b >> 6) & 3],
267 sy_tab[(field_b >> 4) & 3],
268 du_tab[(field_b >> 0) & 3]);
270 else if ((field_b & 0xf0) == 0x10
271 && info->mach != bfd_mach_sh_dsp
272 && info->mach != bfd_mach_sh3_dsp)
273 fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
275 else if ((field_b & 0xf3) != 0)
276 fprintf_fn (stream, ".word 0x%x\t", field_b);
278 fprintf_fn (stream, "pmuls%c%s,%s,%s",
279 field_b & 0x2000 ? ' ' : '\t',
280 se_tab[(field_b >> 10) & 3],
281 sf_tab[(field_b >> 8) & 3],
282 sg_tab[(field_b >> 2) & 3]);
283 return;
286 nib1 = PPIC;
287 nib2 = field_b >> 12 & 0xf;
288 nib3 = field_b >> 8 & 0xf;
289 nib4 = field_b >> 4 & 0xf;
290 switch (nib3 & 0x3)
292 case 0:
293 dc = "";
294 nib1 = PPI3;
295 break;
296 case 1:
297 dc = "";
298 break;
299 case 2:
300 dc = "dct ";
301 nib3 -= 1;
302 break;
303 case 3:
304 dc = "dcf ";
305 nib3 -= 2;
306 break;
308 if (nib1 == PPI3)
309 altnib1 = PPI3NC;
310 else
311 altnib1 = nib1;
312 for (op = sh_table; op->name; op++)
314 if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
315 && op->nibbles[2] == nib2
316 && op->nibbles[3] == nib3)
318 int n;
320 switch (op->nibbles[4])
322 case HEX_0:
323 break;
324 case HEX_XX00:
325 if ((nib4 & 3) != 0)
326 continue;
327 break;
328 case HEX_1:
329 if ((nib4 & 3) != 1)
330 continue;
331 break;
332 case HEX_00YY:
333 if ((nib4 & 0xc) != 0)
334 continue;
335 break;
336 case HEX_4:
337 if ((nib4 & 0xc) != 4)
338 continue;
339 break;
340 default:
341 abort ();
343 fprintf_fn (stream, "%s%s\t", dc, op->name);
344 for (n = 0; n < 3 && op->arg[n] != A_END; n++)
346 if (n && op->arg[1] != A_END)
347 fprintf_fn (stream, ",");
348 switch (op->arg[n])
350 case DSP_REG_N:
351 print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
352 break;
353 case DSP_REG_X:
354 fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
355 break;
356 case DSP_REG_Y:
357 fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
358 break;
359 case A_MACH:
360 fprintf_fn (stream, "mach");
361 break;
362 case A_MACL:
363 fprintf_fn (stream, "macl");
364 break;
365 default:
366 abort ();
369 return;
372 /* Not found. */
373 fprintf_fn (stream, ".word 0x%x", field_b);
376 /* FIXME mvs: movx insns print as ".word 0x%03x", insn & 0xfff
377 (ie. the upper nibble is missing). */
380 print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
382 fprintf_ftype fprintf_fn = info->fprintf_func;
383 void *stream = info->stream;
384 unsigned char insn[4];
385 unsigned char nibs[8];
386 int status;
387 bfd_vma relmask = ~(bfd_vma) 0;
388 const sh_opcode_info *op;
389 unsigned int target_arch;
390 int allow_op32;
392 switch (info->mach)
394 case bfd_mach_sh:
395 target_arch = arch_sh1;
396 /* SH coff object files lack information about the machine type, so
397 we end up with bfd_mach_sh unless it was set explicitly (which
398 could have happended if this is a call from gdb or the simulator.) */
399 if (info->symbols
400 && bfd_asymbol_flavour(*info->symbols) == bfd_target_coff_flavour)
401 target_arch = arch_sh4;
402 break;
403 default:
404 target_arch = sh_get_arch_from_bfd_mach (info->mach);
407 status = info->read_memory_func (memaddr, insn, 2, info);
409 if (status != 0)
411 info->memory_error_func (status, memaddr, info);
412 return -1;
415 if (info->endian == BFD_ENDIAN_LITTLE)
417 nibs[0] = (insn[1] >> 4) & 0xf;
418 nibs[1] = insn[1] & 0xf;
420 nibs[2] = (insn[0] >> 4) & 0xf;
421 nibs[3] = insn[0] & 0xf;
423 else
425 nibs[0] = (insn[0] >> 4) & 0xf;
426 nibs[1] = insn[0] & 0xf;
428 nibs[2] = (insn[1] >> 4) & 0xf;
429 nibs[3] = insn[1] & 0xf;
431 status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
432 if (status != 0)
433 allow_op32 = 0;
434 else
436 allow_op32 = 1;
438 if (info->endian == BFD_ENDIAN_LITTLE)
440 nibs[4] = (insn[3] >> 4) & 0xf;
441 nibs[5] = insn[3] & 0xf;
443 nibs[6] = (insn[2] >> 4) & 0xf;
444 nibs[7] = insn[2] & 0xf;
446 else
448 nibs[4] = (insn[2] >> 4) & 0xf;
449 nibs[5] = insn[2] & 0xf;
451 nibs[6] = (insn[3] >> 4) & 0xf;
452 nibs[7] = insn[3] & 0xf;
456 if (nibs[0] == 0xf && (nibs[1] & 4) == 0
457 && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
459 if (nibs[1] & 8)
461 int field_b;
463 status = info->read_memory_func (memaddr + 2, insn, 2, info);
465 if (status != 0)
467 info->memory_error_func (status, memaddr + 2, info);
468 return -1;
471 if (info->endian == BFD_ENDIAN_LITTLE)
472 field_b = insn[1] << 8 | insn[0];
473 else
474 field_b = insn[0] << 8 | insn[1];
476 print_insn_ppi (field_b, info);
477 print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
478 return 4;
480 print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
481 return 2;
483 for (op = sh_table; op->name; op++)
485 int n;
486 int imm = 0;
487 int rn = 0;
488 int rm = 0;
489 int rb = 0;
490 int disp_pc;
491 bfd_vma disp_pc_addr = 0;
492 int disp = 0;
493 int has_disp = 0;
494 int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
496 if (!allow_op32
497 && SH_MERGE_ARCH_SET (op->arch, arch_op32))
498 goto fail;
500 if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
501 goto fail;
502 for (n = 0; n < max_n; n++)
504 int i = op->nibbles[n];
506 if (i < 16)
508 if (nibs[n] == i)
509 continue;
510 goto fail;
512 switch (i)
514 case BRANCH_8:
515 imm = (nibs[2] << 4) | (nibs[3]);
516 if (imm & 0x80)
517 imm |= ~0xff;
518 imm = ((char) imm) * 2 + 4;
519 goto ok;
520 case BRANCH_12:
521 imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
522 if (imm & 0x800)
523 imm |= ~0xfff;
524 imm = imm * 2 + 4;
525 goto ok;
526 case IMM0_3c:
527 if (nibs[3] & 0x8)
528 goto fail;
529 imm = nibs[3] & 0x7;
530 break;
531 case IMM0_3s:
532 if (!(nibs[3] & 0x8))
533 goto fail;
534 imm = nibs[3] & 0x7;
535 break;
536 case IMM0_3Uc:
537 if (nibs[2] & 0x8)
538 goto fail;
539 imm = nibs[2] & 0x7;
540 break;
541 case IMM0_3Us:
542 if (!(nibs[2] & 0x8))
543 goto fail;
544 imm = nibs[2] & 0x7;
545 break;
546 case DISP0_12:
547 case DISP1_12:
548 disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
549 has_disp = 1;
550 goto ok;
551 case DISP0_12BY2:
552 case DISP1_12BY2:
553 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
554 relmask = ~(bfd_vma) 1;
555 has_disp = 1;
556 goto ok;
557 case DISP0_12BY4:
558 case DISP1_12BY4:
559 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
560 relmask = ~(bfd_vma) 3;
561 has_disp = 1;
562 goto ok;
563 case DISP0_12BY8:
564 case DISP1_12BY8:
565 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
566 relmask = ~(bfd_vma) 7;
567 has_disp = 1;
568 goto ok;
569 case IMM0_20_4:
570 break;
571 case IMM0_20:
572 imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
573 | (nibs[6] << 4) | nibs[7]);
574 if (imm & 0x80000)
575 imm -= 0x100000;
576 goto ok;
577 case IMM0_20BY8:
578 imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
579 | (nibs[6] << 4) | nibs[7]);
580 imm <<= 8;
581 if (imm & 0x8000000)
582 imm -= 0x10000000;
583 goto ok;
584 case IMM0_4:
585 case IMM1_4:
586 imm = nibs[3];
587 goto ok;
588 case IMM0_4BY2:
589 case IMM1_4BY2:
590 imm = nibs[3] << 1;
591 goto ok;
592 case IMM0_4BY4:
593 case IMM1_4BY4:
594 imm = nibs[3] << 2;
595 goto ok;
596 case IMM0_8:
597 case IMM1_8:
598 imm = (nibs[2] << 4) | nibs[3];
599 disp = imm;
600 has_disp = 1;
601 if (imm & 0x80)
602 imm -= 0x100;
603 goto ok;
604 case PCRELIMM_8BY2:
605 imm = ((nibs[2] << 4) | nibs[3]) << 1;
606 relmask = ~(bfd_vma) 1;
607 goto ok;
608 case PCRELIMM_8BY4:
609 imm = ((nibs[2] << 4) | nibs[3]) << 2;
610 relmask = ~(bfd_vma) 3;
611 goto ok;
612 case IMM0_8BY2:
613 case IMM1_8BY2:
614 imm = ((nibs[2] << 4) | nibs[3]) << 1;
615 goto ok;
616 case IMM0_8BY4:
617 case IMM1_8BY4:
618 imm = ((nibs[2] << 4) | nibs[3]) << 2;
619 goto ok;
620 case REG_N_D:
621 if ((nibs[n] & 1) != 0)
622 goto fail;
623 /* Fall through. */
624 case REG_N:
625 rn = nibs[n];
626 break;
627 case REG_M:
628 rm = nibs[n];
629 break;
630 case REG_N_B01:
631 if ((nibs[n] & 0x3) != 1 /* binary 01 */)
632 goto fail;
633 rn = (nibs[n] & 0xc) >> 2;
634 break;
635 case REG_NM:
636 rn = (nibs[n] & 0xc) >> 2;
637 rm = (nibs[n] & 0x3);
638 break;
639 case REG_B:
640 rb = nibs[n] & 0x07;
641 break;
642 case SDT_REG_N:
643 /* sh-dsp: single data transfer. */
644 rn = nibs[n];
645 if ((rn & 0xc) != 4)
646 goto fail;
647 rn = rn & 0x3;
648 rn |= (!(rn & 2)) << 2;
649 break;
650 case PPI:
651 case REPEAT:
652 goto fail;
653 default:
654 abort ();
659 /* sh2a has D_REG but not X_REG. We don't know the pattern
660 doesn't match unless we check the output args to see if they
661 make sense. */
662 if (target_arch == arch_sh2a
663 && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
664 || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
665 goto fail;
667 fprintf_fn (stream, "%s\t", op->name);
668 disp_pc = 0;
669 for (n = 0; n < 3 && op->arg[n] != A_END; n++)
671 if (n && op->arg[1] != A_END)
672 fprintf_fn (stream, ",");
673 switch (op->arg[n])
675 case A_IMM:
676 fprintf_fn (stream, "#%d", imm);
677 break;
678 case A_R0:
679 fprintf_fn (stream, "r0");
680 break;
681 case A_REG_N:
682 fprintf_fn (stream, "r%d", rn);
683 break;
684 case A_INC_N:
685 case AS_INC_N:
686 fprintf_fn (stream, "@r%d+", rn);
687 break;
688 case A_DEC_N:
689 case AS_DEC_N:
690 fprintf_fn (stream, "@-r%d", rn);
691 break;
692 case A_IND_N:
693 case AS_IND_N:
694 fprintf_fn (stream, "@r%d", rn);
695 break;
696 case A_DISP_REG_N:
697 fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
698 break;
699 case AS_PMOD_N:
700 fprintf_fn (stream, "@r%d+r8", rn);
701 break;
702 case A_REG_M:
703 fprintf_fn (stream, "r%d", rm);
704 break;
705 case A_INC_M:
706 fprintf_fn (stream, "@r%d+", rm);
707 break;
708 case A_DEC_M:
709 fprintf_fn (stream, "@-r%d", rm);
710 break;
711 case A_IND_M:
712 fprintf_fn (stream, "@r%d", rm);
713 break;
714 case A_DISP_REG_M:
715 fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
716 break;
717 case A_REG_B:
718 fprintf_fn (stream, "r%d_bank", rb);
719 break;
720 case A_DISP_PC:
721 disp_pc = 1;
722 disp_pc_addr = imm + 4 + (memaddr & relmask);
723 (*info->print_address_func) (disp_pc_addr, info);
724 break;
725 case A_IND_R0_REG_N:
726 fprintf_fn (stream, "@(r0,r%d)", rn);
727 break;
728 case A_IND_R0_REG_M:
729 fprintf_fn (stream, "@(r0,r%d)", rm);
730 break;
731 case A_DISP_GBR:
732 fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
733 break;
734 case A_TBR:
735 fprintf_fn (stream, "tbr");
736 break;
737 case A_DISP2_TBR:
738 fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
739 break;
740 case A_INC_R15:
741 fprintf_fn (stream, "@r15+");
742 break;
743 case A_DEC_R15:
744 fprintf_fn (stream, "@-r15");
745 break;
746 case A_R0_GBR:
747 fprintf_fn (stream, "@(r0,gbr)");
748 break;
749 case A_BDISP12:
750 case A_BDISP8:
751 (*info->print_address_func) (imm + memaddr, info);
752 break;
753 case A_SR:
754 fprintf_fn (stream, "sr");
755 break;
756 case A_GBR:
757 fprintf_fn (stream, "gbr");
758 break;
759 case A_VBR:
760 fprintf_fn (stream, "vbr");
761 break;
762 case A_DSR:
763 fprintf_fn (stream, "dsr");
764 break;
765 case A_MOD:
766 fprintf_fn (stream, "mod");
767 break;
768 case A_RE:
769 fprintf_fn (stream, "re");
770 break;
771 case A_RS:
772 fprintf_fn (stream, "rs");
773 break;
774 case A_A0:
775 fprintf_fn (stream, "a0");
776 break;
777 case A_X0:
778 fprintf_fn (stream, "x0");
779 break;
780 case A_X1:
781 fprintf_fn (stream, "x1");
782 break;
783 case A_Y0:
784 fprintf_fn (stream, "y0");
785 break;
786 case A_Y1:
787 fprintf_fn (stream, "y1");
788 break;
789 case DSP_REG_M:
790 print_dsp_reg (rm, fprintf_fn, stream);
791 break;
792 case A_SSR:
793 fprintf_fn (stream, "ssr");
794 break;
795 case A_SPC:
796 fprintf_fn (stream, "spc");
797 break;
798 case A_MACH:
799 fprintf_fn (stream, "mach");
800 break;
801 case A_MACL:
802 fprintf_fn (stream, "macl");
803 break;
804 case A_PR:
805 fprintf_fn (stream, "pr");
806 break;
807 case A_SGR:
808 fprintf_fn (stream, "sgr");
809 break;
810 case A_DBR:
811 fprintf_fn (stream, "dbr");
812 break;
813 case F_REG_N:
814 fprintf_fn (stream, "fr%d", rn);
815 break;
816 case F_REG_M:
817 fprintf_fn (stream, "fr%d", rm);
818 break;
819 case DX_REG_N:
820 if (rn & 1)
822 fprintf_fn (stream, "xd%d", rn & ~1);
823 break;
825 /* Fall through. */
826 case D_REG_N:
827 fprintf_fn (stream, "dr%d", rn);
828 break;
829 case DX_REG_M:
830 if (rm & 1)
832 fprintf_fn (stream, "xd%d", rm & ~1);
833 break;
835 /* Fall through. */
836 case D_REG_M:
837 fprintf_fn (stream, "dr%d", rm);
838 break;
839 case FPSCR_M:
840 case FPSCR_N:
841 fprintf_fn (stream, "fpscr");
842 break;
843 case FPUL_M:
844 case FPUL_N:
845 fprintf_fn (stream, "fpul");
846 break;
847 case F_FR0:
848 fprintf_fn (stream, "fr0");
849 break;
850 case V_REG_N:
851 fprintf_fn (stream, "fv%d", rn * 4);
852 break;
853 case V_REG_M:
854 fprintf_fn (stream, "fv%d", rm * 4);
855 break;
856 case XMTRX_M4:
857 fprintf_fn (stream, "xmtrx");
858 break;
859 default:
860 abort ();
864 #if 0
865 /* This code prints instructions in delay slots on the same line
866 as the instruction which needs the delay slots. This can be
867 confusing, since other disassembler don't work this way, and
868 it means that the instructions are not all in a line. So I
869 disabled it. Ian. */
870 if (!(info->flags & 1)
871 && (op->name[0] == 'j'
872 || (op->name[0] == 'b'
873 && (op->name[1] == 'r'
874 || op->name[1] == 's'))
875 || (op->name[0] == 'r' && op->name[1] == 't')
876 || (op->name[0] == 'b' && op->name[2] == '.')))
878 info->flags |= 1;
879 fprintf_fn (stream, "\t(slot ");
880 print_insn_sh (memaddr + 2, info);
881 info->flags &= ~1;
882 fprintf_fn (stream, ")");
883 return 4;
885 #endif
887 if (disp_pc && strcmp (op->name, "mova") != 0)
889 int size;
890 bfd_byte bytes[4];
892 if (relmask == ~(bfd_vma) 1)
893 size = 2;
894 else
895 size = 4;
896 /* Not reading an instruction - disable stop_vma. */
897 info->stop_vma = 0;
898 status = info->read_memory_func (disp_pc_addr, bytes, size, info);
899 if (status == 0)
901 unsigned int val;
903 if (size == 2)
905 if (info->endian == BFD_ENDIAN_LITTLE)
906 val = bfd_getl16 (bytes);
907 else
908 val = bfd_getb16 (bytes);
910 else
912 if (info->endian == BFD_ENDIAN_LITTLE)
913 val = bfd_getl32 (bytes);
914 else
915 val = bfd_getb32 (bytes);
917 if ((*info->symbol_at_address_func) (val, info))
919 fprintf_fn (stream, "\t! ");
920 (*info->print_address_func) (val, info);
922 else
923 fprintf_fn (stream, "\t! %x", val);
927 return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
928 fail:
932 fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
933 return 2;