1/* Disassembler interface for targets using CGEN. -*- C -*-
2   CGEN: Cpu tools GENerator
3
4   THIS FILE IS MACHINE GENERATED WITH CGEN.
5   - the resultant file is machine generated, cgen-dis.in isn't
6
7   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
8   Free Software Foundation, Inc.
9
10   This file is part of the GNU Binutils and GDB, the GNU debugger.
11
12   This program is free software; you can redistribute it and/or modify
13   it under the terms of the GNU General Public License as published by
14   the Free Software Foundation; either version 2, or (at your option)
15   any later version.
16
17   This program is distributed in the hope that it will be useful,
18   but WITHOUT ANY WARRANTY; without even the implied warranty of
19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20   GNU General Public License for more details.
21
22   You should have received a copy of the GNU General Public License
23   along with this program; if not, write to the Free Software Foundation, Inc.,
24   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
25
26/* ??? Eventually more and more of this stuff can go to cpu-independent files.
27   Keep that in mind.  */
28
29#include "sysdep.h"
30#include <stdio.h>
31#include "ansidecl.h"
32#include "dis-asm.h"
33#include "bfd.h"
34#include "symcat.h"
35#include "libiberty.h"
36#include "m32c-desc.h"
37#include "m32c-opc.h"
38#include "opintl.h"
39
40/* Default text to print if an instruction isn't recognized.  */
41#define UNKNOWN_INSN_MSG _("*unknown*")
42
43static void print_normal
44  (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
45static void print_address
46  (CGEN_CPU_DESC, void *, bfd_vma, unsigned int, bfd_vma, int) ATTRIBUTE_UNUSED;
47static void print_keyword
48  (CGEN_CPU_DESC, void *, CGEN_KEYWORD *, long, unsigned int) ATTRIBUTE_UNUSED;
49static void print_insn_normal
50  (CGEN_CPU_DESC, void *, const CGEN_INSN *, CGEN_FIELDS *, bfd_vma, int);
51static int print_insn
52  (CGEN_CPU_DESC, bfd_vma,  disassemble_info *, bfd_byte *, unsigned);
53static int default_print_insn
54  (CGEN_CPU_DESC, bfd_vma, disassemble_info *) ATTRIBUTE_UNUSED;
55static int read_insn
56  (CGEN_CPU_DESC, bfd_vma, disassemble_info *, bfd_byte *, int, CGEN_EXTRACT_INFO *,
57   unsigned long *);
58
59/* -- disassembler routines inserted here.  */
60
61/* -- dis.c */
62
63#include "elf/m32c.h"
64#include "elf-bfd.h"
65
66/* Always print the short insn format suffix as ':<char>'.  */
67
68static void
69print_suffix (void * dis_info, char suffix)
70{
71  disassemble_info *info = dis_info;
72
73  (*info->fprintf_func) (info->stream, ":%c", suffix);
74}
75
76static void
77print_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
78	 void * dis_info,
79	 long value ATTRIBUTE_UNUSED,
80	 unsigned int attrs ATTRIBUTE_UNUSED,
81	 bfd_vma pc ATTRIBUTE_UNUSED,
82	 int length ATTRIBUTE_UNUSED)
83{
84  print_suffix (dis_info, 's');
85}
86
87
88static void
89print_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
90	 void * dis_info,
91	 long value ATTRIBUTE_UNUSED,
92	 unsigned int attrs ATTRIBUTE_UNUSED,
93	 bfd_vma pc ATTRIBUTE_UNUSED,
94	 int length ATTRIBUTE_UNUSED)
95{
96  print_suffix (dis_info, 'g');
97}
98
99static void
100print_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
101	 void * dis_info,
102	 long value ATTRIBUTE_UNUSED,
103	 unsigned int attrs ATTRIBUTE_UNUSED,
104	 bfd_vma pc ATTRIBUTE_UNUSED,
105	 int length ATTRIBUTE_UNUSED)
106{
107  print_suffix (dis_info, 'q');
108}
109
110static void
111print_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
112	 void * dis_info,
113	 long value ATTRIBUTE_UNUSED,
114	 unsigned int attrs ATTRIBUTE_UNUSED,
115	 bfd_vma pc ATTRIBUTE_UNUSED,
116	 int length ATTRIBUTE_UNUSED)
117{
118  print_suffix (dis_info, 'z');
119}
120
121/* Print the empty suffix.  */
122
123static void
124print_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
125	 void * dis_info ATTRIBUTE_UNUSED,
126	 long value ATTRIBUTE_UNUSED,
127	 unsigned int attrs ATTRIBUTE_UNUSED,
128	 bfd_vma pc ATTRIBUTE_UNUSED,
129	 int length ATTRIBUTE_UNUSED)
130{
131  return;
132}
133
134static void
135print_r0l_r0h (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
136	       void * dis_info,
137	       long value,
138	       unsigned int attrs ATTRIBUTE_UNUSED,
139	       bfd_vma pc ATTRIBUTE_UNUSED,
140	       int length ATTRIBUTE_UNUSED)
141{
142  disassemble_info *info = dis_info;
143
144  if (value == 0)
145    (*info->fprintf_func) (info->stream, "r0h,r0l");
146  else
147    (*info->fprintf_func) (info->stream, "r0l,r0h");
148}
149
150static void
151print_unsigned_bitbase (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
152			void * dis_info,
153			unsigned long value,
154			unsigned int attrs ATTRIBUTE_UNUSED,
155			bfd_vma pc ATTRIBUTE_UNUSED,
156			int length ATTRIBUTE_UNUSED)
157{
158  disassemble_info *info = dis_info;
159
160  (*info->fprintf_func) (info->stream, "%ld,0x%lx", value & 0x7, value >> 3);
161}
162
163static void
164print_signed_bitbase (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
165		      void * dis_info,
166		      signed long value,
167		      unsigned int attrs ATTRIBUTE_UNUSED,
168		      bfd_vma pc ATTRIBUTE_UNUSED,
169		      int length ATTRIBUTE_UNUSED)
170{
171  disassemble_info *info = dis_info;
172
173  (*info->fprintf_func) (info->stream, "%ld,%ld", value & 0x7, value >> 3);
174}
175
176static void
177print_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
178	    void * dis_info,
179	    long value ATTRIBUTE_UNUSED,
180	    unsigned int attrs ATTRIBUTE_UNUSED,
181	    bfd_vma pc ATTRIBUTE_UNUSED,
182	    int length ATTRIBUTE_UNUSED)
183{
184  /* Always print the size as '.w'.  */
185  disassemble_info *info = dis_info;
186
187  (*info->fprintf_func) (info->stream, ".w");
188}
189
190#define POP  0
191#define PUSH 1
192
193static void print_pop_regset  (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
194static void print_push_regset (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
195
196/* Print a set of registers, R0,R1,A0,A1,SB,FB.  */
197
198static void
199print_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
200	      void * dis_info,
201	      long value,
202	      unsigned int attrs ATTRIBUTE_UNUSED,
203	      bfd_vma pc ATTRIBUTE_UNUSED,
204	      int length ATTRIBUTE_UNUSED,
205	      int push)
206{
207  static char * m16c_register_names [] =
208  {
209    "r0", "r1", "r2", "r3", "a0", "a1", "sb", "fb"
210  };
211  disassemble_info *info = dis_info;
212  int mask;
213  int index = 0;
214  char* comma = "";
215
216  if (push)
217    mask = 0x80;
218  else
219    mask = 1;
220
221  if (value & mask)
222    {
223      (*info->fprintf_func) (info->stream, "%s", m16c_register_names [0]);
224      comma = ",";
225    }
226
227  for (index = 1; index <= 7; ++index)
228    {
229      if (push)
230        mask >>= 1;
231      else
232        mask <<= 1;
233
234      if (value & mask)
235        {
236          (*info->fprintf_func) (info->stream, "%s%s", comma,
237				 m16c_register_names [index]);
238          comma = ",";
239        }
240    }
241}
242
243static void
244print_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
245		  void * dis_info,
246		  long value,
247		  unsigned int attrs ATTRIBUTE_UNUSED,
248		  bfd_vma pc ATTRIBUTE_UNUSED,
249		  int length ATTRIBUTE_UNUSED)
250{
251  print_regset (cd, dis_info, value, attrs, pc, length, POP);
252}
253
254static void
255print_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
256		   void * dis_info,
257		   long value,
258		   unsigned int attrs ATTRIBUTE_UNUSED,
259		   bfd_vma pc ATTRIBUTE_UNUSED,
260		   int length ATTRIBUTE_UNUSED)
261{
262  print_regset (cd, dis_info, value, attrs, pc, length, PUSH);
263}
264
265static void
266print_signed4n (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
267		void * dis_info,
268		signed long value,
269		unsigned int attrs ATTRIBUTE_UNUSED,
270		bfd_vma pc ATTRIBUTE_UNUSED,
271		int length ATTRIBUTE_UNUSED)
272{
273  disassemble_info *info = dis_info;
274
275  (*info->fprintf_func) (info->stream, "%ld", -value);
276}
277
278void m32c_cgen_print_operand
279  (CGEN_CPU_DESC, int, PTR, CGEN_FIELDS *, void const *, bfd_vma, int);
280
281/* Main entry point for printing operands.
282   XINFO is a `void *' and not a `disassemble_info *' to not put a requirement
283   of dis-asm.h on cgen.h.
284
285   This function is basically just a big switch statement.  Earlier versions
286   used tables to look up the function to use, but
287   - if the table contains both assembler and disassembler functions then
288     the disassembler contains much of the assembler and vice-versa,
289   - there's a lot of inlining possibilities as things grow,
290   - using a switch statement avoids the function call overhead.
291
292   This function could be moved into `print_insn_normal', but keeping it
293   separate makes clear the interface between `print_insn_normal' and each of
294   the handlers.  */
295
296void
297m32c_cgen_print_operand (CGEN_CPU_DESC cd,
298			   int opindex,
299			   void * xinfo,
300			   CGEN_FIELDS *fields,
301			   void const *attrs ATTRIBUTE_UNUSED,
302			   bfd_vma pc,
303			   int length)
304{
305  disassemble_info *info = (disassemble_info *) xinfo;
306
307  switch (opindex)
308    {
309    case M32C_OPERAND_A0 :
310      print_keyword (cd, info, & m32c_cgen_opval_h_a0, 0, 0);
311      break;
312    case M32C_OPERAND_A1 :
313      print_keyword (cd, info, & m32c_cgen_opval_h_a1, 0, 0);
314      break;
315    case M32C_OPERAND_AN16_PUSH_S :
316      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_4_1, 0);
317      break;
318    case M32C_OPERAND_BIT16AN :
319      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst16_an, 0);
320      break;
321    case M32C_OPERAND_BIT16RN :
322      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_dst16_rn, 0);
323      break;
324    case M32C_OPERAND_BIT3_S :
325      print_normal (cd, info, fields->f_imm3_S, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
326      break;
327    case M32C_OPERAND_BIT32ANPREFIXED :
328      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_prefixed, 0);
329      break;
330    case M32C_OPERAND_BIT32ANUNPREFIXED :
331      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_unprefixed, 0);
332      break;
333    case M32C_OPERAND_BIT32RNPREFIXED :
334      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_dst32_rn_prefixed_QI, 0);
335      break;
336    case M32C_OPERAND_BIT32RNUNPREFIXED :
337      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_dst32_rn_unprefixed_QI, 0);
338      break;
339    case M32C_OPERAND_BITBASE16_16_S8 :
340      print_signed_bitbase (cd, info, fields->f_dsp_16_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
341      break;
342    case M32C_OPERAND_BITBASE16_16_U16 :
343      print_unsigned_bitbase (cd, info, fields->f_dsp_16_u16, 0, pc, length);
344      break;
345    case M32C_OPERAND_BITBASE16_16_U8 :
346      print_unsigned_bitbase (cd, info, fields->f_dsp_16_u8, 0, pc, length);
347      break;
348    case M32C_OPERAND_BITBASE16_8_U11_S :
349      print_unsigned_bitbase (cd, info, fields->f_bitbase16_u11_S, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
350      break;
351    case M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED :
352      print_signed_bitbase (cd, info, fields->f_bitbase32_16_s11_unprefixed, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
353      break;
354    case M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED :
355      print_signed_bitbase (cd, info, fields->f_bitbase32_16_s19_unprefixed, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
356      break;
357    case M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED :
358      print_unsigned_bitbase (cd, info, fields->f_bitbase32_16_u11_unprefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
359      break;
360    case M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED :
361      print_unsigned_bitbase (cd, info, fields->f_bitbase32_16_u19_unprefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
362      break;
363    case M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED :
364      print_unsigned_bitbase (cd, info, fields->f_bitbase32_16_u27_unprefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
365      break;
366    case M32C_OPERAND_BITBASE32_24_S11_PREFIXED :
367      print_signed_bitbase (cd, info, fields->f_bitbase32_24_s11_prefixed, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
368      break;
369    case M32C_OPERAND_BITBASE32_24_S19_PREFIXED :
370      print_signed_bitbase (cd, info, fields->f_bitbase32_24_s19_prefixed, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
371      break;
372    case M32C_OPERAND_BITBASE32_24_U11_PREFIXED :
373      print_unsigned_bitbase (cd, info, fields->f_bitbase32_24_u11_prefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
374      break;
375    case M32C_OPERAND_BITBASE32_24_U19_PREFIXED :
376      print_unsigned_bitbase (cd, info, fields->f_bitbase32_24_u19_prefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
377      break;
378    case M32C_OPERAND_BITBASE32_24_U27_PREFIXED :
379      print_unsigned_bitbase (cd, info, fields->f_bitbase32_24_u27_prefixed, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
380      break;
381    case M32C_OPERAND_BITNO16R :
382      print_normal (cd, info, fields->f_dsp_16_u8, 0, pc, length);
383      break;
384    case M32C_OPERAND_BITNO32PREFIXED :
385      print_normal (cd, info, fields->f_bitno32_prefixed, 0, pc, length);
386      break;
387    case M32C_OPERAND_BITNO32UNPREFIXED :
388      print_normal (cd, info, fields->f_bitno32_unprefixed, 0, pc, length);
389      break;
390    case M32C_OPERAND_DSP_10_U6 :
391      print_normal (cd, info, fields->f_dsp_10_u6, 0, pc, length);
392      break;
393    case M32C_OPERAND_DSP_16_S16 :
394      print_normal (cd, info, fields->f_dsp_16_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
395      break;
396    case M32C_OPERAND_DSP_16_S8 :
397      print_normal (cd, info, fields->f_dsp_16_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
398      break;
399    case M32C_OPERAND_DSP_16_U16 :
400      print_normal (cd, info, fields->f_dsp_16_u16, 0, pc, length);
401      break;
402    case M32C_OPERAND_DSP_16_U20 :
403      print_normal (cd, info, fields->f_dsp_16_u24, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
404      break;
405    case M32C_OPERAND_DSP_16_U24 :
406      print_normal (cd, info, fields->f_dsp_16_u24, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
407      break;
408    case M32C_OPERAND_DSP_16_U8 :
409      print_normal (cd, info, fields->f_dsp_16_u8, 0, pc, length);
410      break;
411    case M32C_OPERAND_DSP_24_S16 :
412      print_normal (cd, info, fields->f_dsp_24_s16, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
413      break;
414    case M32C_OPERAND_DSP_24_S8 :
415      print_normal (cd, info, fields->f_dsp_24_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
416      break;
417    case M32C_OPERAND_DSP_24_U16 :
418      print_normal (cd, info, fields->f_dsp_24_u16, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
419      break;
420    case M32C_OPERAND_DSP_24_U20 :
421      print_normal (cd, info, fields->f_dsp_24_u24, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
422      break;
423    case M32C_OPERAND_DSP_24_U24 :
424      print_normal (cd, info, fields->f_dsp_24_u24, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
425      break;
426    case M32C_OPERAND_DSP_24_U8 :
427      print_normal (cd, info, fields->f_dsp_24_u8, 0, pc, length);
428      break;
429    case M32C_OPERAND_DSP_32_S16 :
430      print_normal (cd, info, fields->f_dsp_32_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
431      break;
432    case M32C_OPERAND_DSP_32_S8 :
433      print_normal (cd, info, fields->f_dsp_32_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
434      break;
435    case M32C_OPERAND_DSP_32_U16 :
436      print_normal (cd, info, fields->f_dsp_32_u16, 0, pc, length);
437      break;
438    case M32C_OPERAND_DSP_32_U20 :
439      print_normal (cd, info, fields->f_dsp_32_u24, 0, pc, length);
440      break;
441    case M32C_OPERAND_DSP_32_U24 :
442      print_normal (cd, info, fields->f_dsp_32_u24, 0, pc, length);
443      break;
444    case M32C_OPERAND_DSP_32_U8 :
445      print_normal (cd, info, fields->f_dsp_32_u8, 0, pc, length);
446      break;
447    case M32C_OPERAND_DSP_40_S16 :
448      print_normal (cd, info, fields->f_dsp_40_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
449      break;
450    case M32C_OPERAND_DSP_40_S8 :
451      print_normal (cd, info, fields->f_dsp_40_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
452      break;
453    case M32C_OPERAND_DSP_40_U16 :
454      print_normal (cd, info, fields->f_dsp_40_u16, 0, pc, length);
455      break;
456    case M32C_OPERAND_DSP_40_U24 :
457      print_normal (cd, info, fields->f_dsp_40_u24, 0, pc, length);
458      break;
459    case M32C_OPERAND_DSP_40_U8 :
460      print_normal (cd, info, fields->f_dsp_40_u8, 0, pc, length);
461      break;
462    case M32C_OPERAND_DSP_48_S16 :
463      print_normal (cd, info, fields->f_dsp_48_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
464      break;
465    case M32C_OPERAND_DSP_48_S8 :
466      print_normal (cd, info, fields->f_dsp_48_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
467      break;
468    case M32C_OPERAND_DSP_48_U16 :
469      print_normal (cd, info, fields->f_dsp_48_u16, 0, pc, length);
470      break;
471    case M32C_OPERAND_DSP_48_U24 :
472      print_normal (cd, info, fields->f_dsp_48_u24, 0|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
473      break;
474    case M32C_OPERAND_DSP_48_U8 :
475      print_normal (cd, info, fields->f_dsp_48_u8, 0, pc, length);
476      break;
477    case M32C_OPERAND_DSP_8_S24 :
478      print_normal (cd, info, fields->f_dsp_8_s24, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
479      break;
480    case M32C_OPERAND_DSP_8_S8 :
481      print_normal (cd, info, fields->f_dsp_8_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
482      break;
483    case M32C_OPERAND_DSP_8_U16 :
484      print_normal (cd, info, fields->f_dsp_8_u16, 0, pc, length);
485      break;
486    case M32C_OPERAND_DSP_8_U24 :
487      print_normal (cd, info, fields->f_dsp_8_u24, 0, pc, length);
488      break;
489    case M32C_OPERAND_DSP_8_U6 :
490      print_normal (cd, info, fields->f_dsp_8_u6, 0, pc, length);
491      break;
492    case M32C_OPERAND_DSP_8_U8 :
493      print_normal (cd, info, fields->f_dsp_8_u8, 0, pc, length);
494      break;
495    case M32C_OPERAND_DST16AN :
496      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst16_an, 0);
497      break;
498    case M32C_OPERAND_DST16AN_S :
499      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_dst16_an_s, 0);
500      break;
501    case M32C_OPERAND_DST16ANHI :
502      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_dst16_an, 0);
503      break;
504    case M32C_OPERAND_DST16ANQI :
505      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_dst16_an, 0);
506      break;
507    case M32C_OPERAND_DST16ANQI_S :
508      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_dst16_rn_QI_s, 0);
509      break;
510    case M32C_OPERAND_DST16ANSI :
511      print_keyword (cd, info, & m32c_cgen_opval_h_ar_SI, fields->f_dst16_an, 0);
512      break;
513    case M32C_OPERAND_DST16RNEXTQI :
514      print_keyword (cd, info, & m32c_cgen_opval_h_gr_ext_QI, fields->f_dst16_rn_ext, 0);
515      break;
516    case M32C_OPERAND_DST16RNHI :
517      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_dst16_rn, 0);
518      break;
519    case M32C_OPERAND_DST16RNQI :
520      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_dst16_rn, 0);
521      break;
522    case M32C_OPERAND_DST16RNQI_S :
523      print_keyword (cd, info, & m32c_cgen_opval_h_r0l_r0h, fields->f_dst16_rn_QI_s, 0);
524      break;
525    case M32C_OPERAND_DST16RNSI :
526      print_keyword (cd, info, & m32c_cgen_opval_h_gr_SI, fields->f_dst16_rn, 0);
527      break;
528    case M32C_OPERAND_DST32ANEXTUNPREFIXED :
529      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_unprefixed, 0);
530      break;
531    case M32C_OPERAND_DST32ANPREFIXED :
532      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_prefixed, 0);
533      break;
534    case M32C_OPERAND_DST32ANPREFIXEDHI :
535      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_dst32_an_prefixed, 0);
536      break;
537    case M32C_OPERAND_DST32ANPREFIXEDQI :
538      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_dst32_an_prefixed, 0);
539      break;
540    case M32C_OPERAND_DST32ANPREFIXEDSI :
541      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_prefixed, 0);
542      break;
543    case M32C_OPERAND_DST32ANUNPREFIXED :
544      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_unprefixed, 0);
545      break;
546    case M32C_OPERAND_DST32ANUNPREFIXEDHI :
547      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_dst32_an_unprefixed, 0);
548      break;
549    case M32C_OPERAND_DST32ANUNPREFIXEDQI :
550      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_dst32_an_unprefixed, 0);
551      break;
552    case M32C_OPERAND_DST32ANUNPREFIXEDSI :
553      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_dst32_an_unprefixed, 0);
554      break;
555    case M32C_OPERAND_DST32R0HI_S :
556      print_keyword (cd, info, & m32c_cgen_opval_h_r0, 0, 0);
557      break;
558    case M32C_OPERAND_DST32R0QI_S :
559      print_keyword (cd, info, & m32c_cgen_opval_h_r0l, 0, 0);
560      break;
561    case M32C_OPERAND_DST32RNEXTUNPREFIXEDHI :
562      print_keyword (cd, info, & m32c_cgen_opval_h_gr_ext_HI, fields->f_dst32_rn_ext_unprefixed, 0);
563      break;
564    case M32C_OPERAND_DST32RNEXTUNPREFIXEDQI :
565      print_keyword (cd, info, & m32c_cgen_opval_h_gr_ext_QI, fields->f_dst32_rn_ext_unprefixed, 0);
566      break;
567    case M32C_OPERAND_DST32RNPREFIXEDHI :
568      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_dst32_rn_prefixed_HI, 0);
569      break;
570    case M32C_OPERAND_DST32RNPREFIXEDQI :
571      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_dst32_rn_prefixed_QI, 0);
572      break;
573    case M32C_OPERAND_DST32RNPREFIXEDSI :
574      print_keyword (cd, info, & m32c_cgen_opval_h_gr_SI, fields->f_dst32_rn_prefixed_SI, 0);
575      break;
576    case M32C_OPERAND_DST32RNUNPREFIXEDHI :
577      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_dst32_rn_unprefixed_HI, 0);
578      break;
579    case M32C_OPERAND_DST32RNUNPREFIXEDQI :
580      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_dst32_rn_unprefixed_QI, 0);
581      break;
582    case M32C_OPERAND_DST32RNUNPREFIXEDSI :
583      print_keyword (cd, info, & m32c_cgen_opval_h_gr_SI, fields->f_dst32_rn_unprefixed_SI, 0);
584      break;
585    case M32C_OPERAND_G :
586      print_G (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
587      break;
588    case M32C_OPERAND_IMM_12_S4 :
589      print_normal (cd, info, fields->f_imm_12_s4, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
590      break;
591    case M32C_OPERAND_IMM_12_S4N :
592      print_signed4n (cd, info, fields->f_imm_12_s4, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
593      break;
594    case M32C_OPERAND_IMM_13_U3 :
595      print_normal (cd, info, fields->f_imm_13_u3, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
596      break;
597    case M32C_OPERAND_IMM_16_HI :
598      print_normal (cd, info, fields->f_dsp_16_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
599      break;
600    case M32C_OPERAND_IMM_16_QI :
601      print_normal (cd, info, fields->f_dsp_16_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
602      break;
603    case M32C_OPERAND_IMM_16_SI :
604      print_normal (cd, info, fields->f_dsp_16_s32, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
605      break;
606    case M32C_OPERAND_IMM_20_S4 :
607      print_normal (cd, info, fields->f_imm_20_s4, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
608      break;
609    case M32C_OPERAND_IMM_24_HI :
610      print_normal (cd, info, fields->f_dsp_24_s16, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
611      break;
612    case M32C_OPERAND_IMM_24_QI :
613      print_normal (cd, info, fields->f_dsp_24_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
614      break;
615    case M32C_OPERAND_IMM_24_SI :
616      print_normal (cd, info, fields->f_dsp_24_s32, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
617      break;
618    case M32C_OPERAND_IMM_32_HI :
619      print_normal (cd, info, fields->f_dsp_32_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
620      break;
621    case M32C_OPERAND_IMM_32_QI :
622      print_normal (cd, info, fields->f_dsp_32_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
623      break;
624    case M32C_OPERAND_IMM_32_SI :
625      print_normal (cd, info, fields->f_dsp_32_s32, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
626      break;
627    case M32C_OPERAND_IMM_40_HI :
628      print_normal (cd, info, fields->f_dsp_40_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
629      break;
630    case M32C_OPERAND_IMM_40_QI :
631      print_normal (cd, info, fields->f_dsp_40_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
632      break;
633    case M32C_OPERAND_IMM_40_SI :
634      print_normal (cd, info, fields->f_dsp_40_s32, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
635      break;
636    case M32C_OPERAND_IMM_48_HI :
637      print_normal (cd, info, fields->f_dsp_48_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
638      break;
639    case M32C_OPERAND_IMM_48_QI :
640      print_normal (cd, info, fields->f_dsp_48_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
641      break;
642    case M32C_OPERAND_IMM_48_SI :
643      print_normal (cd, info, fields->f_dsp_48_s32, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
644      break;
645    case M32C_OPERAND_IMM_56_HI :
646      print_normal (cd, info, fields->f_dsp_56_s16, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
647      break;
648    case M32C_OPERAND_IMM_56_QI :
649      print_normal (cd, info, fields->f_dsp_56_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
650      break;
651    case M32C_OPERAND_IMM_64_HI :
652      print_normal (cd, info, fields->f_dsp_64_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
653      break;
654    case M32C_OPERAND_IMM_8_HI :
655      print_normal (cd, info, fields->f_dsp_8_s16, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
656      break;
657    case M32C_OPERAND_IMM_8_QI :
658      print_normal (cd, info, fields->f_dsp_8_s8, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
659      break;
660    case M32C_OPERAND_IMM_8_S4 :
661      print_normal (cd, info, fields->f_imm_8_s4, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
662      break;
663    case M32C_OPERAND_IMM_8_S4N :
664      print_normal (cd, info, fields->f_imm_8_s4, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
665      break;
666    case M32C_OPERAND_IMM_SH_12_S4 :
667      print_keyword (cd, info, & m32c_cgen_opval_h_shimm, fields->f_imm_12_s4, 0);
668      break;
669    case M32C_OPERAND_IMM_SH_20_S4 :
670      print_keyword (cd, info, & m32c_cgen_opval_h_shimm, fields->f_imm_20_s4, 0);
671      break;
672    case M32C_OPERAND_IMM_SH_8_S4 :
673      print_keyword (cd, info, & m32c_cgen_opval_h_shimm, fields->f_imm_8_s4, 0);
674      break;
675    case M32C_OPERAND_IMM1_S :
676      print_normal (cd, info, fields->f_imm1_S, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
677      break;
678    case M32C_OPERAND_IMM3_S :
679      print_normal (cd, info, fields->f_imm3_S, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
680      break;
681    case M32C_OPERAND_LAB_16_8 :
682      print_address (cd, info, fields->f_lab_16_8, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
683      break;
684    case M32C_OPERAND_LAB_24_8 :
685      print_address (cd, info, fields->f_lab_24_8, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
686      break;
687    case M32C_OPERAND_LAB_32_8 :
688      print_address (cd, info, fields->f_lab_32_8, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
689      break;
690    case M32C_OPERAND_LAB_40_8 :
691      print_address (cd, info, fields->f_lab_40_8, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
692      break;
693    case M32C_OPERAND_LAB_5_3 :
694      print_address (cd, info, fields->f_lab_5_3, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
695      break;
696    case M32C_OPERAND_LAB_8_16 :
697      print_address (cd, info, fields->f_lab_8_16, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_SIGN_OPT)|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
698      break;
699    case M32C_OPERAND_LAB_8_24 :
700      print_address (cd, info, fields->f_lab_8_24, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_ABS_ADDR), pc, length);
701      break;
702    case M32C_OPERAND_LAB_8_8 :
703      print_address (cd, info, fields->f_lab_8_8, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
704      break;
705    case M32C_OPERAND_LAB32_JMP_S :
706      print_address (cd, info, fields->f_lab32_jmp_s, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
707      break;
708    case M32C_OPERAND_Q :
709      print_Q (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
710      break;
711    case M32C_OPERAND_R0 :
712      print_keyword (cd, info, & m32c_cgen_opval_h_r0, 0, 0);
713      break;
714    case M32C_OPERAND_R0H :
715      print_keyword (cd, info, & m32c_cgen_opval_h_r0h, 0, 0);
716      break;
717    case M32C_OPERAND_R0L :
718      print_keyword (cd, info, & m32c_cgen_opval_h_r0l, 0, 0);
719      break;
720    case M32C_OPERAND_R1 :
721      print_keyword (cd, info, & m32c_cgen_opval_h_r1, 0, 0);
722      break;
723    case M32C_OPERAND_R1R2R0 :
724      print_keyword (cd, info, & m32c_cgen_opval_h_r1r2r0, 0, 0);
725      break;
726    case M32C_OPERAND_R2 :
727      print_keyword (cd, info, & m32c_cgen_opval_h_r2, 0, 0);
728      break;
729    case M32C_OPERAND_R2R0 :
730      print_keyword (cd, info, & m32c_cgen_opval_h_r2r0, 0, 0);
731      break;
732    case M32C_OPERAND_R3 :
733      print_keyword (cd, info, & m32c_cgen_opval_h_r3, 0, 0);
734      break;
735    case M32C_OPERAND_R3R1 :
736      print_keyword (cd, info, & m32c_cgen_opval_h_r3r1, 0, 0);
737      break;
738    case M32C_OPERAND_REGSETPOP :
739      print_pop_regset (cd, info, fields->f_8_8, 0, pc, length);
740      break;
741    case M32C_OPERAND_REGSETPUSH :
742      print_push_regset (cd, info, fields->f_8_8, 0, pc, length);
743      break;
744    case M32C_OPERAND_RN16_PUSH_S :
745      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_4_1, 0);
746      break;
747    case M32C_OPERAND_S :
748      print_S (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
749      break;
750    case M32C_OPERAND_SRC16AN :
751      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_src16_an, 0);
752      break;
753    case M32C_OPERAND_SRC16ANHI :
754      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_src16_an, 0);
755      break;
756    case M32C_OPERAND_SRC16ANQI :
757      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_src16_an, 0);
758      break;
759    case M32C_OPERAND_SRC16RNHI :
760      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_src16_rn, 0);
761      break;
762    case M32C_OPERAND_SRC16RNQI :
763      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_src16_rn, 0);
764      break;
765    case M32C_OPERAND_SRC32ANPREFIXED :
766      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_src32_an_prefixed, 0);
767      break;
768    case M32C_OPERAND_SRC32ANPREFIXEDHI :
769      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_src32_an_prefixed, 0);
770      break;
771    case M32C_OPERAND_SRC32ANPREFIXEDQI :
772      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_src32_an_prefixed, 0);
773      break;
774    case M32C_OPERAND_SRC32ANPREFIXEDSI :
775      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_src32_an_prefixed, 0);
776      break;
777    case M32C_OPERAND_SRC32ANUNPREFIXED :
778      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_src32_an_unprefixed, 0);
779      break;
780    case M32C_OPERAND_SRC32ANUNPREFIXEDHI :
781      print_keyword (cd, info, & m32c_cgen_opval_h_ar_HI, fields->f_src32_an_unprefixed, 0);
782      break;
783    case M32C_OPERAND_SRC32ANUNPREFIXEDQI :
784      print_keyword (cd, info, & m32c_cgen_opval_h_ar_QI, fields->f_src32_an_unprefixed, 0);
785      break;
786    case M32C_OPERAND_SRC32ANUNPREFIXEDSI :
787      print_keyword (cd, info, & m32c_cgen_opval_h_ar, fields->f_src32_an_unprefixed, 0);
788      break;
789    case M32C_OPERAND_SRC32RNPREFIXEDHI :
790      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_src32_rn_prefixed_HI, 0);
791      break;
792    case M32C_OPERAND_SRC32RNPREFIXEDQI :
793      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_src32_rn_prefixed_QI, 0);
794      break;
795    case M32C_OPERAND_SRC32RNPREFIXEDSI :
796      print_keyword (cd, info, & m32c_cgen_opval_h_gr_SI, fields->f_src32_rn_prefixed_SI, 0);
797      break;
798    case M32C_OPERAND_SRC32RNUNPREFIXEDHI :
799      print_keyword (cd, info, & m32c_cgen_opval_h_gr_HI, fields->f_src32_rn_unprefixed_HI, 0);
800      break;
801    case M32C_OPERAND_SRC32RNUNPREFIXEDQI :
802      print_keyword (cd, info, & m32c_cgen_opval_h_gr_QI, fields->f_src32_rn_unprefixed_QI, 0);
803      break;
804    case M32C_OPERAND_SRC32RNUNPREFIXEDSI :
805      print_keyword (cd, info, & m32c_cgen_opval_h_gr_SI, fields->f_src32_rn_unprefixed_SI, 0);
806      break;
807    case M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL :
808      print_r0l_r0h (cd, info, fields->f_5_1, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
809      break;
810    case M32C_OPERAND_X :
811      print_X (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
812      break;
813    case M32C_OPERAND_Z :
814      print_Z (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
815      break;
816    case M32C_OPERAND_COND16_16 :
817      print_keyword (cd, info, & m32c_cgen_opval_h_cond16, fields->f_dsp_16_u8, 0);
818      break;
819    case M32C_OPERAND_COND16_24 :
820      print_keyword (cd, info, & m32c_cgen_opval_h_cond16, fields->f_dsp_24_u8, 0);
821      break;
822    case M32C_OPERAND_COND16_32 :
823      print_keyword (cd, info, & m32c_cgen_opval_h_cond16, fields->f_dsp_32_u8, 0);
824      break;
825    case M32C_OPERAND_COND16C :
826      print_keyword (cd, info, & m32c_cgen_opval_h_cond16c, fields->f_cond16, 0);
827      break;
828    case M32C_OPERAND_COND16J :
829      print_keyword (cd, info, & m32c_cgen_opval_h_cond16j, fields->f_cond16, 0);
830      break;
831    case M32C_OPERAND_COND16J5 :
832      print_keyword (cd, info, & m32c_cgen_opval_h_cond16j_5, fields->f_cond16j_5, 0);
833      break;
834    case M32C_OPERAND_COND32 :
835      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_cond32, 0|(1<<CGEN_OPERAND_VIRTUAL));
836      break;
837    case M32C_OPERAND_COND32_16 :
838      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_dsp_16_u8, 0);
839      break;
840    case M32C_OPERAND_COND32_24 :
841      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_dsp_24_u8, 0);
842      break;
843    case M32C_OPERAND_COND32_32 :
844      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_dsp_32_u8, 0);
845      break;
846    case M32C_OPERAND_COND32_40 :
847      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_dsp_40_u8, 0);
848      break;
849    case M32C_OPERAND_COND32J :
850      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_cond32j, 0|(1<<CGEN_OPERAND_VIRTUAL));
851      break;
852    case M32C_OPERAND_CR1_PREFIXED_32 :
853      print_keyword (cd, info, & m32c_cgen_opval_h_cr1_32, fields->f_21_3, 0);
854      break;
855    case M32C_OPERAND_CR1_UNPREFIXED_32 :
856      print_keyword (cd, info, & m32c_cgen_opval_h_cr1_32, fields->f_13_3, 0);
857      break;
858    case M32C_OPERAND_CR16 :
859      print_keyword (cd, info, & m32c_cgen_opval_h_cr_16, fields->f_9_3, 0);
860      break;
861    case M32C_OPERAND_CR2_32 :
862      print_keyword (cd, info, & m32c_cgen_opval_h_cr2_32, fields->f_13_3, 0);
863      break;
864    case M32C_OPERAND_CR3_PREFIXED_32 :
865      print_keyword (cd, info, & m32c_cgen_opval_h_cr3_32, fields->f_21_3, 0);
866      break;
867    case M32C_OPERAND_CR3_UNPREFIXED_32 :
868      print_keyword (cd, info, & m32c_cgen_opval_h_cr3_32, fields->f_13_3, 0);
869      break;
870    case M32C_OPERAND_FLAGS16 :
871      print_keyword (cd, info, & m32c_cgen_opval_h_flags, fields->f_9_3, 0);
872      break;
873    case M32C_OPERAND_FLAGS32 :
874      print_keyword (cd, info, & m32c_cgen_opval_h_flags, fields->f_13_3, 0);
875      break;
876    case M32C_OPERAND_SCCOND32 :
877      print_keyword (cd, info, & m32c_cgen_opval_h_cond32, fields->f_cond16, 0);
878      break;
879    case M32C_OPERAND_SIZE :
880      print_size (cd, info, 0, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
881      break;
882
883    default :
884      /* xgettext:c-format */
885      fprintf (stderr, _("Unrecognized field %d while printing insn.\n"),
886	       opindex);
887    abort ();
888  }
889}
890
891cgen_print_fn * const m32c_cgen_print_handlers[] =
892{
893  print_insn_normal,
894};
895
896
897void
898m32c_cgen_init_dis (CGEN_CPU_DESC cd)
899{
900  m32c_cgen_init_opcode_table (cd);
901  m32c_cgen_init_ibld_table (cd);
902  cd->print_handlers = & m32c_cgen_print_handlers[0];
903  cd->print_operand = m32c_cgen_print_operand;
904}
905
906
907/* Default print handler.  */
908
909static void
910print_normal (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
911	      void *dis_info,
912	      long value,
913	      unsigned int attrs,
914	      bfd_vma pc ATTRIBUTE_UNUSED,
915	      int length ATTRIBUTE_UNUSED)
916{
917  disassemble_info *info = (disassemble_info *) dis_info;
918
919#ifdef CGEN_PRINT_NORMAL
920  CGEN_PRINT_NORMAL (cd, info, value, attrs, pc, length);
921#endif
922
923  /* Print the operand as directed by the attributes.  */
924  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
925    ; /* nothing to do */
926  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
927    (*info->fprintf_func) (info->stream, "%ld", value);
928  else
929    (*info->fprintf_func) (info->stream, "0x%lx", value);
930}
931
932/* Default address handler.  */
933
934static void
935print_address (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
936	       void *dis_info,
937	       bfd_vma value,
938	       unsigned int attrs,
939	       bfd_vma pc ATTRIBUTE_UNUSED,
940	       int length ATTRIBUTE_UNUSED)
941{
942  disassemble_info *info = (disassemble_info *) dis_info;
943
944#ifdef CGEN_PRINT_ADDRESS
945  CGEN_PRINT_ADDRESS (cd, info, value, attrs, pc, length);
946#endif
947
948  /* Print the operand as directed by the attributes.  */
949  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
950    ; /* Nothing to do.  */
951  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_PCREL_ADDR))
952    (*info->print_address_func) (value, info);
953  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_ABS_ADDR))
954    (*info->print_address_func) (value, info);
955  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
956    (*info->fprintf_func) (info->stream, "%ld", (long) value);
957  else
958    (*info->fprintf_func) (info->stream, "0x%lx", (long) value);
959}
960
961/* Keyword print handler.  */
962
963static void
964print_keyword (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
965	       void *dis_info,
966	       CGEN_KEYWORD *keyword_table,
967	       long value,
968	       unsigned int attrs ATTRIBUTE_UNUSED)
969{
970  disassemble_info *info = (disassemble_info *) dis_info;
971  const CGEN_KEYWORD_ENTRY *ke;
972
973  ke = cgen_keyword_lookup_value (keyword_table, value);
974  if (ke != NULL)
975    (*info->fprintf_func) (info->stream, "%s", ke->name);
976  else
977    (*info->fprintf_func) (info->stream, "???");
978}
979
980/* Default insn printer.
981
982   DIS_INFO is defined as `void *' so the disassembler needn't know anything
983   about disassemble_info.  */
984
985static void
986print_insn_normal (CGEN_CPU_DESC cd,
987		   void *dis_info,
988		   const CGEN_INSN *insn,
989		   CGEN_FIELDS *fields,
990		   bfd_vma pc,
991		   int length)
992{
993  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
994  disassemble_info *info = (disassemble_info *) dis_info;
995  const CGEN_SYNTAX_CHAR_TYPE *syn;
996
997  CGEN_INIT_PRINT (cd);
998
999  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
1000    {
1001      if (CGEN_SYNTAX_MNEMONIC_P (*syn))
1002	{
1003	  (*info->fprintf_func) (info->stream, "%s", CGEN_INSN_MNEMONIC (insn));
1004	  continue;
1005	}
1006      if (CGEN_SYNTAX_CHAR_P (*syn))
1007	{
1008	  (*info->fprintf_func) (info->stream, "%c", CGEN_SYNTAX_CHAR (*syn));
1009	  continue;
1010	}
1011
1012      /* We have an operand.  */
1013      m32c_cgen_print_operand (cd, CGEN_SYNTAX_FIELD (*syn), info,
1014				 fields, CGEN_INSN_ATTRS (insn), pc, length);
1015    }
1016}
1017
1018/* Subroutine of print_insn. Reads an insn into the given buffers and updates
1019   the extract info.
1020   Returns 0 if all is well, non-zero otherwise.  */
1021
1022static int
1023read_insn (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1024	   bfd_vma pc,
1025	   disassemble_info *info,
1026	   bfd_byte *buf,
1027	   int buflen,
1028	   CGEN_EXTRACT_INFO *ex_info,
1029	   unsigned long *insn_value)
1030{
1031  int status = (*info->read_memory_func) (pc, buf, buflen, info);
1032
1033  if (status != 0)
1034    {
1035      (*info->memory_error_func) (status, pc, info);
1036      return -1;
1037    }
1038
1039  ex_info->dis_info = info;
1040  ex_info->valid = (1 << buflen) - 1;
1041  ex_info->insn_bytes = buf;
1042
1043  *insn_value = bfd_get_bits (buf, buflen * 8, info->endian == BFD_ENDIAN_BIG);
1044  return 0;
1045}
1046
1047/* Utility to print an insn.
1048   BUF is the base part of the insn, target byte order, BUFLEN bytes long.
1049   The result is the size of the insn in bytes or zero for an unknown insn
1050   or -1 if an error occurs fetching data (memory_error_func will have
1051   been called).  */
1052
1053static int
1054print_insn (CGEN_CPU_DESC cd,
1055	    bfd_vma pc,
1056	    disassemble_info *info,
1057	    bfd_byte *buf,
1058	    unsigned int buflen)
1059{
1060  CGEN_INSN_INT insn_value;
1061  const CGEN_INSN_LIST *insn_list;
1062  CGEN_EXTRACT_INFO ex_info;
1063  int basesize;
1064
1065  /* Extract base part of instruction, just in case CGEN_DIS_* uses it. */
1066  basesize = cd->base_insn_bitsize < buflen * 8 ?
1067                                     cd->base_insn_bitsize : buflen * 8;
1068  insn_value = cgen_get_insn_value (cd, buf, basesize);
1069
1070
1071  /* Fill in ex_info fields like read_insn would.  Don't actually call
1072     read_insn, since the incoming buffer is already read (and possibly
1073     modified a la m32r).  */
1074  ex_info.valid = (1 << buflen) - 1;
1075  ex_info.dis_info = info;
1076  ex_info.insn_bytes = buf;
1077
1078  /* The instructions are stored in hash lists.
1079     Pick the first one and keep trying until we find the right one.  */
1080
1081  insn_list = CGEN_DIS_LOOKUP_INSN (cd, (char *) buf, insn_value);
1082  while (insn_list != NULL)
1083    {
1084      const CGEN_INSN *insn = insn_list->insn;
1085      CGEN_FIELDS fields;
1086      int length;
1087      unsigned long insn_value_cropped;
1088
1089#ifdef CGEN_VALIDATE_INSN_SUPPORTED
1090      /* Not needed as insn shouldn't be in hash lists if not supported.  */
1091      /* Supported by this cpu?  */
1092      if (! m32c_cgen_insn_supported (cd, insn))
1093        {
1094          insn_list = CGEN_DIS_NEXT_INSN (insn_list);
1095	  continue;
1096        }
1097#endif
1098
1099      /* Basic bit mask must be correct.  */
1100      /* ??? May wish to allow target to defer this check until the extract
1101	 handler.  */
1102
1103      /* Base size may exceed this instruction's size.  Extract the
1104         relevant part from the buffer. */
1105      if ((unsigned) (CGEN_INSN_BITSIZE (insn) / 8) < buflen &&
1106	  (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
1107	insn_value_cropped = bfd_get_bits (buf, CGEN_INSN_BITSIZE (insn),
1108					   info->endian == BFD_ENDIAN_BIG);
1109      else
1110	insn_value_cropped = insn_value;
1111
1112      if ((insn_value_cropped & CGEN_INSN_BASE_MASK (insn))
1113	  == CGEN_INSN_BASE_VALUE (insn))
1114	{
1115	  /* Printing is handled in two passes.  The first pass parses the
1116	     machine insn and extracts the fields.  The second pass prints
1117	     them.  */
1118
1119	  /* Make sure the entire insn is loaded into insn_value, if it
1120	     can fit.  */
1121	  if (((unsigned) CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize) &&
1122	      (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
1123	    {
1124	      unsigned long full_insn_value;
1125	      int rc = read_insn (cd, pc, info, buf,
1126				  CGEN_INSN_BITSIZE (insn) / 8,
1127				  & ex_info, & full_insn_value);
1128	      if (rc != 0)
1129		return rc;
1130	      length = CGEN_EXTRACT_FN (cd, insn)
1131		(cd, insn, &ex_info, full_insn_value, &fields, pc);
1132	    }
1133	  else
1134	    length = CGEN_EXTRACT_FN (cd, insn)
1135	      (cd, insn, &ex_info, insn_value_cropped, &fields, pc);
1136
1137	  /* Length < 0 -> error.  */
1138	  if (length < 0)
1139	    return length;
1140	  if (length > 0)
1141	    {
1142	      CGEN_PRINT_FN (cd, insn) (cd, info, insn, &fields, pc, length);
1143	      /* Length is in bits, result is in bytes.  */
1144	      return length / 8;
1145	    }
1146	}
1147
1148      insn_list = CGEN_DIS_NEXT_INSN (insn_list);
1149    }
1150
1151  return 0;
1152}
1153
1154/* Default value for CGEN_PRINT_INSN.
1155   The result is the size of the insn in bytes or zero for an unknown insn
1156   or -1 if an error occured fetching bytes.  */
1157
1158#ifndef CGEN_PRINT_INSN
1159#define CGEN_PRINT_INSN default_print_insn
1160#endif
1161
1162static int
1163default_print_insn (CGEN_CPU_DESC cd, bfd_vma pc, disassemble_info *info)
1164{
1165  bfd_byte buf[CGEN_MAX_INSN_SIZE];
1166  int buflen;
1167  int status;
1168
1169  /* Attempt to read the base part of the insn.  */
1170  buflen = cd->base_insn_bitsize / 8;
1171  status = (*info->read_memory_func) (pc, buf, buflen, info);
1172
1173  /* Try again with the minimum part, if min < base.  */
1174  if (status != 0 && (cd->min_insn_bitsize < cd->base_insn_bitsize))
1175    {
1176      buflen = cd->min_insn_bitsize / 8;
1177      status = (*info->read_memory_func) (pc, buf, buflen, info);
1178    }
1179
1180  if (status != 0)
1181    {
1182      (*info->memory_error_func) (status, pc, info);
1183      return -1;
1184    }
1185
1186  return print_insn (cd, pc, info, buf, buflen);
1187}
1188
1189/* Main entry point.
1190   Print one instruction from PC on INFO->STREAM.
1191   Return the size of the instruction (in bytes).  */
1192
1193typedef struct cpu_desc_list
1194{
1195  struct cpu_desc_list *next;
1196  CGEN_BITSET *isa;
1197  int mach;
1198  int endian;
1199  CGEN_CPU_DESC cd;
1200} cpu_desc_list;
1201
1202int
1203print_insn_m32c (bfd_vma pc, disassemble_info *info)
1204{
1205  static cpu_desc_list *cd_list = 0;
1206  cpu_desc_list *cl = 0;
1207  static CGEN_CPU_DESC cd = 0;
1208  static CGEN_BITSET *prev_isa;
1209  static int prev_mach;
1210  static int prev_endian;
1211  int length;
1212  CGEN_BITSET *isa;
1213  int mach;
1214  int endian = (info->endian == BFD_ENDIAN_BIG
1215		? CGEN_ENDIAN_BIG
1216		: CGEN_ENDIAN_LITTLE);
1217  enum bfd_architecture arch;
1218
1219  /* ??? gdb will set mach but leave the architecture as "unknown" */
1220#ifndef CGEN_BFD_ARCH
1221#define CGEN_BFD_ARCH bfd_arch_m32c
1222#endif
1223  arch = info->arch;
1224  if (arch == bfd_arch_unknown)
1225    arch = CGEN_BFD_ARCH;
1226
1227  /* There's no standard way to compute the machine or isa number
1228     so we leave it to the target.  */
1229#ifdef CGEN_COMPUTE_MACH
1230  mach = CGEN_COMPUTE_MACH (info);
1231#else
1232  mach = info->mach;
1233#endif
1234
1235#ifdef CGEN_COMPUTE_ISA
1236  {
1237    static CGEN_BITSET *permanent_isa;
1238
1239    if (!permanent_isa)
1240      permanent_isa = cgen_bitset_create (MAX_ISAS);
1241    isa = permanent_isa;
1242    cgen_bitset_clear (isa);
1243    cgen_bitset_add (isa, CGEN_COMPUTE_ISA (info));
1244  }
1245#else
1246  isa = info->insn_sets;
1247#endif
1248
1249  /* If we've switched cpu's, try to find a handle we've used before */
1250  if (cd
1251      && (cgen_bitset_compare (isa, prev_isa) != 0
1252	  || mach != prev_mach
1253	  || endian != prev_endian))
1254    {
1255      cd = 0;
1256      for (cl = cd_list; cl; cl = cl->next)
1257	{
1258	  if (cgen_bitset_compare (cl->isa, isa) == 0 &&
1259	      cl->mach == mach &&
1260	      cl->endian == endian)
1261	    {
1262	      cd = cl->cd;
1263 	      prev_isa = cd->isas;
1264	      break;
1265	    }
1266	}
1267    }
1268
1269  /* If we haven't initialized yet, initialize the opcode table.  */
1270  if (! cd)
1271    {
1272      const bfd_arch_info_type *arch_type = bfd_lookup_arch (arch, mach);
1273      const char *mach_name;
1274
1275      if (!arch_type)
1276	abort ();
1277      mach_name = arch_type->printable_name;
1278
1279      prev_isa = cgen_bitset_copy (isa);
1280      prev_mach = mach;
1281      prev_endian = endian;
1282      cd = m32c_cgen_cpu_open (CGEN_CPU_OPEN_ISAS, prev_isa,
1283				 CGEN_CPU_OPEN_BFDMACH, mach_name,
1284				 CGEN_CPU_OPEN_ENDIAN, prev_endian,
1285				 CGEN_CPU_OPEN_END);
1286      if (!cd)
1287	abort ();
1288
1289      /* Save this away for future reference.  */
1290      cl = xmalloc (sizeof (struct cpu_desc_list));
1291      cl->cd = cd;
1292      cl->isa = prev_isa;
1293      cl->mach = mach;
1294      cl->endian = endian;
1295      cl->next = cd_list;
1296      cd_list = cl;
1297
1298      m32c_cgen_init_dis (cd);
1299    }
1300
1301  /* We try to have as much common code as possible.
1302     But at this point some targets need to take over.  */
1303  /* ??? Some targets may need a hook elsewhere.  Try to avoid this,
1304     but if not possible try to move this hook elsewhere rather than
1305     have two hooks.  */
1306  length = CGEN_PRINT_INSN (cd, pc, info);
1307  if (length > 0)
1308    return length;
1309  if (length < 0)
1310    return -1;
1311
1312  (*info->fprintf_func) (info->stream, UNKNOWN_INSN_MSG);
1313  return cd->default_insn_bitsize / 8;
1314}
1315