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