ChangeLog:
[external/binutils.git] / opcodes / m32c-asm.c
1 /* Assembler 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-asm.in isn't
6
7 Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
8
9 This file is part of the GNU Binutils and GDB, the GNU debugger.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
24
25 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
26    Keep that in mind.  */
27
28 #include "sysdep.h"
29 #include <stdio.h>
30 #include "ansidecl.h"
31 #include "bfd.h"
32 #include "symcat.h"
33 #include "m32c-desc.h"
34 #include "m32c-opc.h"
35 #include "opintl.h"
36 #include "xregex.h"
37 #include "libiberty.h"
38 #include "safe-ctype.h"
39
40 #undef  min
41 #define min(a,b) ((a) < (b) ? (a) : (b))
42 #undef  max
43 #define max(a,b) ((a) > (b) ? (a) : (b))
44
45 static const char * parse_insn_normal
46   (CGEN_CPU_DESC, const CGEN_INSN *, const char **, CGEN_FIELDS *);
47 \f
48 /* -- assembler routines inserted here.  */
49
50 /* -- asm.c */
51 #include <ctype.h>
52
53 #define MACH_M32C 5             /* Must match md_begin.  */
54
55 static int
56 m32c_cgen_isa_register (const char **strp)
57  {
58    int u;
59    const char *s = *strp;
60    static char * m32c_register_names [] = 
61      {
62        "r0", "r1", "r2", "r3", "r0l", "r0h", "r1l", "r1h",
63        "a0", "a1", "r2r0", "r3r1", "sp", "fb", "dct0", "dct1", "flg", "svf",
64        "drc0", "drc1", "dmd0", "dmd1", "intb", "svp", "vct", "isp", "dma0",
65        "dma1", "dra0", "dra1", "dsa0", "dsa1", 0
66      };
67  
68    for (u = 0; m32c_register_names[u]; u++)
69      {
70        int len = strlen (m32c_register_names[u]);
71
72        if (memcmp (m32c_register_names[u], s, len) == 0
73            && (s[len] == 0 || ! ISALNUM (s[len])))
74         return 1;
75      }
76    return 0;
77 }
78
79 static const char *
80 parse_unsigned6 (CGEN_CPU_DESC cd, const char **strp,
81                  int opindex, unsigned long *valuep)
82 {
83   const char *errmsg = 0;
84   unsigned long value;
85   long have_zero = 0;
86
87   /* Don't successfully parse literals beginning with '[' */
88   if (**strp == '[')
89     return "Invalid literal"; /* anything -- will not be seen */
90
91   if (strncmp (*strp, "0x0", 3) == 0 
92       || (**strp == '0' && *(*strp + 1) != 'x'))
93     have_zero = 1;
94
95   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
96   if (errmsg)
97     return errmsg;
98
99   if (value > 0x3f)
100     return _("imm:6 immediate is out of range");
101
102   *valuep = value;
103   return 0;
104 }
105
106 static const char *
107 parse_unsigned8 (CGEN_CPU_DESC cd, const char **strp,
108                  int opindex, unsigned long *valuep)
109 {
110   const char *errmsg = 0;
111   unsigned long value;
112   long have_zero = 0;
113
114   /* Don't successfully parse literals beginning with '[' */
115   if (**strp == '[')
116     return "Invalid literal"; /* anything -- will not be seen */
117
118   if (strncmp (*strp, "0x0", 3) == 0 
119       || (**strp == '0' && *(*strp + 1) != 'x'))
120     have_zero = 1;
121
122   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
123   if (errmsg)
124     return errmsg;
125
126   if (value > 0xff)
127     return _("dsp:8 immediate is out of range");
128
129   /* If this field may require a relocation then use larger dsp16.  */
130   if (! have_zero && value == 0)
131     return _("dsp:8 immediate is out of range");
132
133   *valuep = value;
134   return 0;
135 }
136
137 static const char *
138 parse_signed4 (CGEN_CPU_DESC cd, const char **strp,
139                int opindex, signed long *valuep)
140 {
141   const char *errmsg = 0;
142   signed long value;
143   long have_zero = 0;
144   
145   /* Don't successfully parse literals beginning with '[' */
146   if (**strp == '[')
147     return "Invalid literal"; /* anything -- will not be seen */
148
149   if (strncmp (*strp, "0x0", 3) == 0 
150       || (**strp == '0' && *(*strp + 1) != 'x'))
151     have_zero = 1;
152
153   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
154   if (errmsg)
155     return errmsg;
156
157   if (value < -8 || value > 7)
158     return _("Immediate is out of range -8 to 7");
159
160   /* If this field may require a relocation then use larger dsp16.  */
161   if (! have_zero && value == 0)
162     return _("Immediate is out of range -8 to 7");
163
164   *valuep = value;
165   return 0;
166 }
167
168 static const char *
169 parse_signed8 (CGEN_CPU_DESC cd, const char **strp,
170                int opindex, signed long *valuep)
171 {
172   const char *errmsg = 0;
173   signed long value;
174   
175   /* Don't successfully parse literals beginning with '[' */
176   if (**strp == '[')
177     return "Invalid literal"; /* anything -- will not be seen */
178
179   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
180   if (errmsg)
181     return errmsg;
182
183   if (value <= 255 && value > 127)
184     value -= 0x100;
185
186   if (value < -128 || value > 127)
187     return _("dsp:8 immediate is out of range");
188
189   *valuep = value;
190   return 0;
191 }
192
193 static const char *
194 parse_unsigned16 (CGEN_CPU_DESC cd, const char **strp,
195                  int opindex, unsigned long *valuep)
196 {
197   const char *errmsg = 0;
198   unsigned long value;
199   long have_zero = 0;
200  
201   /* Don't successfully parse literals beginning with '[' */
202   if (**strp == '[')
203     return "Invalid literal"; /* anything -- will not be seen */
204
205   /* Don't successfully parse register names */
206   if (m32c_cgen_isa_register (strp))
207     return "Invalid literal"; /* anything -- will not be seen */
208
209   if (strncmp (*strp, "0x0", 3) == 0 
210       || (**strp == '0' && *(*strp + 1) != 'x'))
211     have_zero = 1;
212   
213   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
214   if (errmsg)
215     return errmsg;
216
217   if (value > 0xffff)
218     return _("dsp:16 immediate is out of range");
219
220   /* If this field may require a relocation then use larger dsp24.  */
221   if (cd->machs == MACH_M32C && ! have_zero && value == 0
222       && (strncmp (*strp, "[a", 2) == 0
223           || **strp == ','
224           || **strp == 0))
225     return _("dsp:16 immediate is out of range");
226
227   *valuep = value;
228   return 0;
229 }
230
231 static const char *
232 parse_signed16 (CGEN_CPU_DESC cd, const char **strp,
233                int opindex, signed long *valuep)
234 {
235   const char *errmsg = 0;
236   signed long value;
237   
238   /* Don't successfully parse literals beginning with '[' */
239   if (**strp == '[')
240     return "Invalid literal"; /* anything -- will not be seen */
241
242   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
243   if (errmsg)
244     return errmsg;
245
246   if (value <= 65535 && value > 32767)
247     value -= 0x10000;
248
249   if (value < -32768 || value > 32767)
250     return _("dsp:16 immediate is out of range");
251
252   *valuep = value;
253   return 0;
254 }
255
256 static const char *
257 parse_unsigned20 (CGEN_CPU_DESC cd, const char **strp,
258                  int opindex, unsigned long *valuep)
259 {
260   const char *errmsg = 0;
261   unsigned long value;
262   
263   /* Don't successfully parse literals beginning with '[' */
264   if (**strp == '[')
265     return "Invalid literal"; /* anything -- will not be seen */
266
267   /* Don't successfully parse register names */
268   if (m32c_cgen_isa_register (strp))
269     return "Invalid literal"; /* anything -- will not be seen */
270
271   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
272   if (errmsg)
273     return errmsg;
274
275   if (value > 0xfffff)
276     return _("dsp:20 immediate is out of range");
277
278   *valuep = value;
279   return 0;
280 }
281
282 static const char *
283 parse_unsigned24 (CGEN_CPU_DESC cd, const char **strp,
284                  int opindex, unsigned long *valuep)
285 {
286   const char *errmsg = 0;
287   unsigned long value;
288   
289   /* Don't successfully parse literals beginning with '[' */
290   if (**strp == '[')
291     return "Invalid literal"; /* anything -- will not be seen */
292
293   /* Don't successfully parse register names */
294   if (m32c_cgen_isa_register (strp))
295     return "Invalid literal"; /* anything -- will not be seen */
296
297   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
298   if (errmsg)
299     return errmsg;
300
301   if (value > 0xffffff)
302     return _("dsp:24 immediate is out of range");
303
304   *valuep = value;
305   return 0;
306 }
307
308 static const char *
309 parse_signed32 (CGEN_CPU_DESC cd, const char **strp,
310                  int opindex, signed long *valuep)
311 {
312   const char *errmsg = 0;
313   signed long value;
314   
315 #if 0
316   /* Don't successfully parse literals beginning with '[' */
317   if (**strp == '[')
318     return "Invalid literal"; /* anything -- will not be seen */
319
320   /* Don't successfully parse register names */
321   if (m32c_cgen_isa_register (strp))
322     return "Invalid literal"; /* anything -- will not be seen */
323 #endif
324
325   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
326   if (errmsg)
327     return errmsg;
328
329   *valuep = value;
330   return 0;
331 }
332
333 static const char *
334 parse_imm1_S (CGEN_CPU_DESC cd, const char **strp,
335              int opindex, signed long *valuep)
336 {
337   const char *errmsg = 0;
338   signed long value;
339   
340 #if 0
341   /* Don't successfully parse literals beginning with '[' */
342   if (**strp == '[')
343     return "Invalid literal"; /* anything -- will not be seen */
344
345   /* Don't successfully parse register names */
346   if (m32c_cgen_isa_register (strp))
347     return "Invalid literal"; /* anything -- will not be seen */
348 #endif
349
350   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
351   if (errmsg)
352     return errmsg;
353
354   if (value < 1 || value > 2)
355     return _("immediate is out of range 1-2");
356
357   *valuep = value;
358   return 0;
359 }
360
361 static const char *
362 parse_imm3_S (CGEN_CPU_DESC cd, const char **strp,
363              int opindex, signed long *valuep)
364 {
365   const char *errmsg = 0;
366   signed long value;
367   
368 #if 0
369   /* Don't successfully parse literals beginning with '[' */
370   if (**strp == '[')
371     return "Invalid literal"; /* anything -- will not be seen */
372
373   /* Don't successfully parse register names */
374   if (m32c_cgen_isa_register (strp))
375     return "Invalid literal"; /* anything -- will not be seen */
376 #endif
377
378   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
379   if (errmsg)
380     return errmsg;
381
382   if (value < 1 || value > 8)
383     return _("immediate is out of range 1-8");
384
385   *valuep = value;
386   return 0;
387 }
388
389 static const char *
390 parse_Bitno16R (CGEN_CPU_DESC cd, const char **strp,
391                 int opindex, unsigned long *valuep)
392 {
393   const char *errmsg = 0;
394   unsigned long value;
395
396 #if 0
397   /* Don't successfully parse literals beginning with '[' */
398   if (**strp == '[')
399     return "Invalid literal"; /* anything -- will not be seen */
400 #endif
401
402   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
403   if (errmsg)
404     return errmsg;
405
406   if (value > 15)
407     return _("Bit number for indexing general register is out of range 0-15");
408
409   *valuep = value;
410   return 0;
411 }
412
413 static const char *
414 parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp,
415                         int opindex, unsigned long *valuep,
416                         unsigned bits)
417 {
418   const char *errmsg = 0;
419   unsigned long bit;
420   unsigned long base;
421   const char *newp = *strp;
422   unsigned long long bitbase;
423
424 #if 0
425   /* Don't successfully parse literals beginning with '[' */
426   if (**strp == '[')
427     return "Invalid literal"; /* anything -- will not be seen */
428 #endif
429
430   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
431   if (errmsg)
432     return errmsg;
433
434   if (*newp != ',')
435     return "Missing base for bit,base:8";
436
437   ++newp;
438   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & base);
439   if (errmsg)
440     return errmsg;
441
442   bitbase = (unsigned long long)bit + ((unsigned long long)base * 8);
443
444   if (bitbase >= (1ull << bits))
445     return _("bit,base is out of range");
446
447   *valuep = bitbase;
448   *strp = newp;
449   return 0;
450 }
451
452 static const char *
453 parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp,
454                       int opindex, signed long *valuep,
455                       unsigned bits)
456 {
457   const char *errmsg = 0;
458   unsigned long bit;
459   signed long base;
460   const char *newp = *strp;
461   long long bitbase;
462   long long limit;
463
464 #if 0
465   /* Don't successfully parse literals beginning with '[' */
466   if (**strp == '[')
467     return "Invalid literal"; /* anything -- will not be seen */
468 #endif
469
470   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
471   if (errmsg)
472     return errmsg;
473
474   if (*newp != ',')
475     return "Missing base for bit,base:8";
476
477   ++newp;
478   errmsg = cgen_parse_signed_integer (cd, & newp, opindex, & base);
479   if (errmsg)
480     return errmsg;
481
482   bitbase = (long long)bit + ((long long)base * 8);
483
484   limit = 1ll << (bits - 1);
485   if (bitbase < -limit || bitbase >= limit)
486     return _("bit,base is out of range");
487
488   *valuep = bitbase;
489   *strp = newp;
490   return 0;
491 }
492
493 static const char *
494 parse_unsigned_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
495                          int opindex, unsigned long *valuep)
496 {
497   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 8);
498 }
499
500 static const char *
501 parse_unsigned_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
502                          int opindex, unsigned long *valuep)
503 {
504   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 11);
505 }
506
507 static const char *
508 parse_unsigned_bitbase16 (CGEN_CPU_DESC cd, const char **strp,
509                           int opindex, unsigned long *valuep)
510 {
511   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 16);
512 }
513
514 static const char *
515 parse_unsigned_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
516                          int opindex, unsigned long *valuep)
517 {
518   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 19);
519 }
520
521 static const char *
522 parse_unsigned_bitbase27 (CGEN_CPU_DESC cd, const char **strp,
523                          int opindex, unsigned long *valuep)
524 {
525   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 27);
526 }
527
528 static const char *
529 parse_signed_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
530                        int opindex, signed long *valuep)
531 {
532   return parse_signed_bitbase (cd, strp, opindex, valuep, 8);
533 }
534
535 static const char *
536 parse_signed_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
537                        int opindex, signed long *valuep)
538 {
539   return parse_signed_bitbase (cd, strp, opindex, valuep, 11);
540 }
541
542 static const char *
543 parse_signed_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
544                        int opindex, signed long *valuep)
545 {
546   return parse_signed_bitbase (cd, strp, opindex, valuep, 19);
547 }
548
549 /* Parse the suffix as :<char> or as nothing followed by a whitespace.  */
550 static const char *
551 parse_suffix (const char **strp, char suffix)
552 {
553   const char *newp = *strp;
554   
555   if (**strp == ':' && tolower (*(*strp + 1)) == suffix)
556     newp = *strp + 2;
557
558   if (isspace (*newp))
559     {
560       *strp = newp;
561       return 0;
562     }
563         
564   return "Invalid suffix"; /* anything -- will not be seen */
565 }
566
567 static const char *
568 parse_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
569          int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
570 {
571   return parse_suffix (strp, 's');
572 }
573
574 static const char *
575 parse_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
576          int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
577 {
578   return parse_suffix (strp, 'g');
579 }
580
581 static const char *
582 parse_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
583          int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
584 {
585   return parse_suffix (strp, 'q');
586 }
587
588 static const char *
589 parse_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
590          int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
591 {
592   return parse_suffix (strp, 'z');
593 }
594
595 /* Parse an empty suffix. Fail if the next char is ':'.  */
596 static const char *
597 parse_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
598          int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
599 {
600   if (**strp == ':')
601     return "Unexpected suffix";
602   return 0;
603 }
604
605 static const char *
606 parse_r0l_r0h (CGEN_CPU_DESC cd, const char **strp,
607                int opindex ATTRIBUTE_UNUSED, signed long *valuep)
608 {
609   const char *errmsg;
610   signed long value;
611   signed long junk;
612   const char *newp = *strp;
613
614   /* Parse r0[hl] */
615   errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l_r0h, & value);
616   if (errmsg)
617     return errmsg;
618
619   if (*newp != ',')
620     return "not a valid r0l/r0h pair";
621   ++newp;
622
623   /* Parse the second register in the pair */
624   if (value == 0) /* r0l */
625     errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0h, & junk);
626   else
627     errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l, & junk);
628   if (errmsg)
629     return errmsg;
630
631   *strp = newp;
632   *valuep = ! value;
633   return 0;
634 }
635
636 /* Accept .b or .w in any case */
637 static const char *
638 parse_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
639             int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
640 {
641   if (**strp == '.'
642       && (*(*strp + 1) == 'b' || *(*strp + 1) == 'B'
643           || *(*strp + 1) == 'w' || *(*strp + 1) == 'W'))
644     {
645       *strp += 2;
646       return 0;
647     }
648   return "Invalid size specifier";
649 }
650
651 /* static const char * parse_abs (CGEN_CPU_DESC, const char **, int, */
652 /*                             unsigned long *, unsigned long); */
653 /* static const char * parse_abs16 (CGEN_CPU_DESC, const char **, int, */
654 /*                               int ATTRIBUTE_UNUSED, */
655 /*                               enum cgen_parse_operand_result * ATTRIBUTE_UNUSED, */
656 /*                               unsigned long * ); */
657 /* static const char * parse_abs24 (CGEN_CPU_DESC, const char **, int, */
658 /*                               int ATTRIBUTE_UNUSED, */
659 /*                               enum cgen_parse_operand_result  * ATTRIBUTE_UNUSED, */
660 /*                               unsigned long *); */
661
662 /* /\* Parse absolute  *\/ */
663
664 /* static const char * */
665 /* parse_abs16 (CGEN_CPU_DESC cd, const char **strp, int opindex, */
666 /*           int reloc ATTRIBUTE_UNUSED, */
667 /*           enum cgen_parse_operand_result *type_addr ATTRIBUTE_UNUSED, */
668 /*           unsigned long *valuep) */
669 /* { */
670 /*   return parse_abs (cd, strp, opindex, valuep, 16); */
671 /* } */
672
673 /* static const char * */
674 /* parse_abs24 (CGEN_CPU_DESC cd, const char **strp, int opindex, */
675 /*           int reloc ATTRIBUTE_UNUSED, */
676 /*           enum cgen_parse_operand_result *type_addr ATTRIBUTE_UNUSED, */
677 /*           unsigned long *valuep) */
678 /* { */
679 /*   return parse_abs (cd, strp, opindex, valuep, 24); */
680 /* } */
681
682 /* static const char * */
683 /* parse_abs (CGEN_CPU_DESC cd, const char **strp, int opindex, */
684 /*         unsigned long *valuep, */
685 /*         unsigned long length) */
686 /* { */
687 /*   const char *errmsg = 0; */
688 /*   const char *op; */
689 /*   int has_register = 0; */
690     
691 /*   for (op = *strp; *op != '\0'; op++) */
692 /*     { */
693 /*       if (*op == '[') */
694 /*      { */
695 /*        has_register = 1; */
696 /*        break; */
697 /*      } */
698 /*       else if (*op == ',') */
699 /*      break; */
700 /*     } */
701   
702 /*   if (has_register || m32c_cgen_isa_register (strp)) */
703 /*     errmsg = _("immediate value cannot be register"); */
704 /*   else */
705 /*     { */
706 /*       enum cgen_parse_operand_result result_type; */
707 /*       bfd_vma value; */
708 /*       const char *errmsg; */
709  
710 /*       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16, */
711 /*                                    &result_type, &value); */
712 /*       *valuep = value; */
713 /*     } */
714 /*   return errmsg; */
715 /* } */
716 /* /\* Handle signed/unsigned literal.  *\/ */
717
718 /* static const char * */
719 /* parse_imm8 (cd, strp, opindex, valuep) */
720 /*      CGEN_CPU_DESC cd; */
721 /*      const char **strp; */
722 /*      int opindex; */
723 /*      unsigned long *valuep; */
724 /* { */
725 /*   const char *errmsg = 0; */
726 /*   long value; */
727 /*   long have_zero = 0; */
728   
729 /*   if (strncmp (*strp, "0x0", 3) == 0  */
730 /*       || (**strp == '0' && *(*strp + 1) != 'x')) */
731 /*     have_zero = 1; */
732 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
733 /*   *valuep = value; */
734 /*   /\* If this field may require a relocation then use larger dsp16.  *\/ */
735 /*   if (! have_zero && value == 0) */
736 /*     errmsg = _("immediate value may not fit in dsp8 field"); */
737     
738 /*   return errmsg; */
739 /* } */
740
741 /* static const char * */
742 /* parse_imm16 (cd, strp, opindex, valuep) */
743 /*      CGEN_CPU_DESC cd; */
744 /*      const char **strp; */
745 /*      int opindex; */
746 /*      unsigned long *valuep; */
747 /* { */
748 /*   const char *errmsg; */
749 /*   long value; */
750  
751 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
752 /*   *valuep = value; */
753 /*   return errmsg; */
754 /* } */
755
756 /* static const char * */
757 /* parse_imm24 (cd, strp, opindex, valuep) */
758 /*      CGEN_CPU_DESC cd; */
759 /*      const char **strp; */
760 /*      int opindex; */
761 /*      unsigned long *valuep; */
762 /* { */
763 /*   const char *errmsg; */
764 /*   long value; */
765  
766 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
767 /*   *valuep = value; */
768 /*   return errmsg; */
769 /* } */
770
771 /* static const char * */
772 /* parse_imm32 (cd, strp, opindex, valuep) */
773 /*      CGEN_CPU_DESC cd; */
774 /*      const char **strp; */
775 /*      int opindex; */
776 /*      unsigned long *valuep; */
777 /* { */
778 /*   const char *errmsg; */
779 /*   long value; */
780  
781 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
782 /*   *valuep = value; */
783 /*   return errmsg; */
784 /* } */
785
786 /* /\* Handle bitfields.  *\/ */
787
788 /* static const char * */
789 /* parse_boff8 (cd, strp, opindex, valuep) */
790 /*      CGEN_CPU_DESC cd; */
791 /*      const char **strp; */
792 /*      int opindex; */
793 /*      unsigned long *valuep; */
794 /* { */
795 /*   const char *errmsg; */
796 /*   long bit_value, value; */
797  
798 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & bit_value); */
799 /*   if (errmsg == 0) */
800 /*     { */
801 /*       *strp = *strp + 1; */
802 /*       errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
803 /*     } */
804 /*   value = value * 8 + bit_value; */
805 /*   *valuep = value; */
806 /*   if (value > 0x100) */
807 /*     errmsg = _("Operand out of range. Must be between 0 and 255."); */
808 /*   return errmsg; */
809 /* } */
810
811 /* static const char * */
812 /* parse_boff16 (cd, strp, opindex, valuep) */
813 /*      CGEN_CPU_DESC cd; */
814 /*      const char **strp; */
815 /*      int opindex; */
816 /*      unsigned long *valuep; */
817 /* { */
818 /*   const char *errmsg; */
819 /*   long bit_value, value; */
820  
821 /*   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & bit_value); */
822 /*   if (errmsg == 0) */
823 /*     { */
824 /*       *strp = *strp + 1; */
825 /*       errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); */
826 /*     } */
827 /*   value = value * 8 + bit_value; */
828 /*   *valuep = value; */
829 /*   if (value > 0x1000) */
830 /*     errmsg = _("Operand out of range. Must be between 0 and 65535."); */
831 /*   return errmsg; */
832 /* } */
833
834
835 /* Special check to ensure that instruction exists for given machine */
836 int
837 m32c_cgen_insn_supported (CGEN_CPU_DESC cd,
838                           const CGEN_INSN *insn)
839 {
840   int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
841   int isas = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_ISA);
842
843   /* If attributes are absent, assume no restriction. */
844   if (machs == 0)
845     machs = ~0;
846
847   return ((machs & cd->machs)
848           && (isas & cd->isas));
849 }
850
851 /* Parse a set of registers, R0,R1,A0,A1,SB,FB.  */
852
853 static const char *
854 parse_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
855               const char **strp,
856               int opindex ATTRIBUTE_UNUSED,
857               unsigned long *valuep,
858               int push
859               )
860 {
861   const char *errmsg = 0;
862   int regno = 0;
863  
864   *valuep = 0;
865   while (**strp && **strp != ')')
866     {
867       if (**strp == 'r' || **strp == 'R')
868         {
869           ++*strp;
870           regno = **strp - '0';
871           if (regno > 4)
872             errmsg = _("Register number is not valid");
873         }
874       else if (**strp == 'a' || **strp == 'A')
875         {
876           ++*strp;
877           regno = **strp - '0';
878           if (regno > 2)
879             errmsg = _("Register number is not valid");
880           regno = **strp - '0' + 4;
881         }
882       
883       else if (strncasecmp (*strp, "sb", 2) == 0 || strncasecmp (*strp, "SB", 2) == 0)
884         {
885           regno = 6;
886           ++*strp;
887         }
888       
889       else if (strncasecmp (*strp, "fb", 2) == 0 || strncasecmp (*strp, "FB", 2) == 0)
890         {
891           regno = 7;
892           ++*strp;
893         }
894       
895       if (push) /* Mask is reversed for push.  */
896         *valuep |= 0x80 >> regno;
897       else
898         *valuep |= 1 << regno;
899
900       ++*strp;
901       if (**strp == ',')
902         {
903           if (*(*strp + 1) == ')')
904             break;
905           ++*strp;
906         }
907     }
908
909   if (!*strp)
910     errmsg = _("Register list is not valid");
911
912   return errmsg;
913 }
914
915 #define POP 0
916 #define PUSH 1
917
918 static const char *
919 parse_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
920                      const char **strp,
921                      int opindex ATTRIBUTE_UNUSED,
922                      unsigned long *valuep)
923 {
924   return parse_regset (cd, strp, opindex, valuep, POP);
925 }
926
927 static const char *
928 parse_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
929                      const char **strp,
930                      int opindex ATTRIBUTE_UNUSED,
931                      unsigned long *valuep)
932 {
933   return parse_regset (cd, strp, opindex, valuep, PUSH);
934 }
935
936 /* -- dis.c */
937
938 const char * m32c_cgen_parse_operand
939   PARAMS ((CGEN_CPU_DESC, int, const char **, CGEN_FIELDS *));
940
941 /* Main entry point for operand parsing.
942
943    This function is basically just a big switch statement.  Earlier versions
944    used tables to look up the function to use, but
945    - if the table contains both assembler and disassembler functions then
946      the disassembler contains much of the assembler and vice-versa,
947    - there's a lot of inlining possibilities as things grow,
948    - using a switch statement avoids the function call overhead.
949
950    This function could be moved into `parse_insn_normal', but keeping it
951    separate makes clear the interface between `parse_insn_normal' and each of
952    the handlers.  */
953
954 const char *
955 m32c_cgen_parse_operand (cd, opindex, strp, fields)
956      CGEN_CPU_DESC cd;
957      int opindex;
958      const char ** strp;
959      CGEN_FIELDS * fields;
960 {
961   const char * errmsg = NULL;
962   /* Used by scalar operands that still need to be parsed.  */
963   long junk ATTRIBUTE_UNUSED;
964
965   switch (opindex)
966     {
967     case M32C_OPERAND_A0 :
968       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_a0, & junk);
969       break;
970     case M32C_OPERAND_A1 :
971       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_a1, & junk);
972       break;
973     case M32C_OPERAND_AN16_PUSH_S :
974       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_4_1);
975       break;
976     case M32C_OPERAND_BIT16AN :
977       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst16_an);
978       break;
979     case M32C_OPERAND_BIT16RN :
980       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst16_rn);
981       break;
982     case M32C_OPERAND_BIT32ANPREFIXED :
983       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
984       break;
985     case M32C_OPERAND_BIT32ANUNPREFIXED :
986       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
987       break;
988     case M32C_OPERAND_BIT32RNPREFIXED :
989       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_prefixed_QI);
990       break;
991     case M32C_OPERAND_BIT32RNUNPREFIXED :
992       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_unprefixed_QI);
993       break;
994     case M32C_OPERAND_BITBASE16_16_S8 :
995       errmsg = parse_signed_bitbase8 (cd, strp, M32C_OPERAND_BITBASE16_16_S8, (unsigned long *) (& fields->f_dsp_16_s8));
996       break;
997     case M32C_OPERAND_BITBASE16_16_U16 :
998       errmsg = parse_unsigned_bitbase16 (cd, strp, M32C_OPERAND_BITBASE16_16_U16, (unsigned long *) (& fields->f_dsp_16_u16));
999       break;
1000     case M32C_OPERAND_BITBASE16_16_U8 :
1001       errmsg = parse_unsigned_bitbase8 (cd, strp, M32C_OPERAND_BITBASE16_16_U8, (unsigned long *) (& fields->f_dsp_16_u8));
1002       break;
1003     case M32C_OPERAND_BITBASE16_8_U11_S :
1004       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE16_8_U11_S, (long *) (& fields->f_bitbase16_u11_S));
1005       break;
1006     case M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED :
1007       errmsg = parse_signed_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED, (long *) (& fields->f_bitbase32_16_s11_unprefixed));
1008       break;
1009     case M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED :
1010       errmsg = parse_signed_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED, (long *) (& fields->f_bitbase32_16_s19_unprefixed));
1011       break;
1012     case M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED :
1013       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u11_unprefixed));
1014       break;
1015     case M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED :
1016       errmsg = parse_unsigned_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u19_unprefixed));
1017       break;
1018     case M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED :
1019       errmsg = parse_unsigned_bitbase27 (cd, strp, M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u27_unprefixed));
1020       break;
1021     case M32C_OPERAND_BITBASE32_24_S11_PREFIXED :
1022       errmsg = parse_signed_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_24_S11_PREFIXED, (long *) (& fields->f_bitbase32_24_s11_prefixed));
1023       break;
1024     case M32C_OPERAND_BITBASE32_24_S19_PREFIXED :
1025       errmsg = parse_signed_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_24_S19_PREFIXED, (long *) (& fields->f_bitbase32_24_s19_prefixed));
1026       break;
1027     case M32C_OPERAND_BITBASE32_24_U11_PREFIXED :
1028       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_24_U11_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u11_prefixed));
1029       break;
1030     case M32C_OPERAND_BITBASE32_24_U19_PREFIXED :
1031       errmsg = parse_unsigned_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_24_U19_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u19_prefixed));
1032       break;
1033     case M32C_OPERAND_BITBASE32_24_U27_PREFIXED :
1034       errmsg = parse_unsigned_bitbase27 (cd, strp, M32C_OPERAND_BITBASE32_24_U27_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u27_prefixed));
1035       break;
1036     case M32C_OPERAND_BITNO16R :
1037       errmsg = parse_Bitno16R (cd, strp, M32C_OPERAND_BITNO16R, (unsigned long *) (& fields->f_dsp_16_u8));
1038       break;
1039     case M32C_OPERAND_BITNO32PREFIXED :
1040       errmsg = cgen_parse_unsigned_integer (cd, strp, M32C_OPERAND_BITNO32PREFIXED, (unsigned long *) (& fields->f_bitno32_prefixed));
1041       break;
1042     case M32C_OPERAND_BITNO32UNPREFIXED :
1043       errmsg = cgen_parse_unsigned_integer (cd, strp, M32C_OPERAND_BITNO32UNPREFIXED, (unsigned long *) (& fields->f_bitno32_unprefixed));
1044       break;
1045     case M32C_OPERAND_DSP_10_U6 :
1046       errmsg = parse_unsigned6 (cd, strp, M32C_OPERAND_DSP_10_U6, (unsigned long *) (& fields->f_dsp_10_u6));
1047       break;
1048     case M32C_OPERAND_DSP_16_S16 :
1049       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_16_S16, (long *) (& fields->f_dsp_16_s16));
1050       break;
1051     case M32C_OPERAND_DSP_16_S8 :
1052       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_16_S8, (long *) (& fields->f_dsp_16_s8));
1053       break;
1054     case M32C_OPERAND_DSP_16_U16 :
1055       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_16_U16, (unsigned long *) (& fields->f_dsp_16_u16));
1056       break;
1057     case M32C_OPERAND_DSP_16_U20 :
1058       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_16_U20, (unsigned long *) (& fields->f_dsp_16_u24));
1059       break;
1060     case M32C_OPERAND_DSP_16_U24 :
1061       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_16_U24, (unsigned long *) (& fields->f_dsp_16_u24));
1062       break;
1063     case M32C_OPERAND_DSP_16_U8 :
1064       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_16_U8, (unsigned long *) (& fields->f_dsp_16_u8));
1065       break;
1066     case M32C_OPERAND_DSP_24_S16 :
1067       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_24_S16, (long *) (& fields->f_dsp_24_s16));
1068       break;
1069     case M32C_OPERAND_DSP_24_S8 :
1070       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_24_S8, (long *) (& fields->f_dsp_24_s8));
1071       break;
1072     case M32C_OPERAND_DSP_24_U16 :
1073       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_24_U16, (unsigned long *) (& fields->f_dsp_24_u16));
1074       break;
1075     case M32C_OPERAND_DSP_24_U20 :
1076       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_24_U20, (unsigned long *) (& fields->f_dsp_24_u24));
1077       break;
1078     case M32C_OPERAND_DSP_24_U24 :
1079       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_24_U24, (unsigned long *) (& fields->f_dsp_24_u24));
1080       break;
1081     case M32C_OPERAND_DSP_24_U8 :
1082       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_24_U8, (unsigned long *) (& fields->f_dsp_24_u8));
1083       break;
1084     case M32C_OPERAND_DSP_32_S16 :
1085       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_32_S16, (long *) (& fields->f_dsp_32_s16));
1086       break;
1087     case M32C_OPERAND_DSP_32_S8 :
1088       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_32_S8, (long *) (& fields->f_dsp_32_s8));
1089       break;
1090     case M32C_OPERAND_DSP_32_U16 :
1091       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_32_U16, (unsigned long *) (& fields->f_dsp_32_u16));
1092       break;
1093     case M32C_OPERAND_DSP_32_U20 :
1094       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_32_U20, (unsigned long *) (& fields->f_dsp_32_u24));
1095       break;
1096     case M32C_OPERAND_DSP_32_U24 :
1097       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_32_U24, (unsigned long *) (& fields->f_dsp_32_u24));
1098       break;
1099     case M32C_OPERAND_DSP_32_U8 :
1100       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_32_U8, (unsigned long *) (& fields->f_dsp_32_u8));
1101       break;
1102     case M32C_OPERAND_DSP_40_S16 :
1103       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_40_S16, (unsigned long *) (& fields->f_dsp_40_s16));
1104       break;
1105     case M32C_OPERAND_DSP_40_S8 :
1106       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_40_S8, (unsigned long *) (& fields->f_dsp_40_s8));
1107       break;
1108     case M32C_OPERAND_DSP_40_U16 :
1109       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_40_U16, (unsigned long *) (& fields->f_dsp_40_u16));
1110       break;
1111     case M32C_OPERAND_DSP_40_U24 :
1112       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_40_U24, (unsigned long *) (& fields->f_dsp_40_u24));
1113       break;
1114     case M32C_OPERAND_DSP_40_U8 :
1115       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_40_U8, (unsigned long *) (& fields->f_dsp_40_u8));
1116       break;
1117     case M32C_OPERAND_DSP_48_S16 :
1118       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_48_S16, (unsigned long *) (& fields->f_dsp_48_s16));
1119       break;
1120     case M32C_OPERAND_DSP_48_S8 :
1121       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_48_S8, (unsigned long *) (& fields->f_dsp_48_s8));
1122       break;
1123     case M32C_OPERAND_DSP_48_U16 :
1124       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_48_U16, (unsigned long *) (& fields->f_dsp_48_u16));
1125       break;
1126     case M32C_OPERAND_DSP_48_U24 :
1127       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_48_U24, (unsigned long *) (& fields->f_dsp_48_u24));
1128       break;
1129     case M32C_OPERAND_DSP_48_U8 :
1130       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_48_U8, (unsigned long *) (& fields->f_dsp_48_u8));
1131       break;
1132     case M32C_OPERAND_DSP_8_S8 :
1133       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_8_S8, (long *) (& fields->f_dsp_8_s8));
1134       break;
1135     case M32C_OPERAND_DSP_8_U16 :
1136       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_8_U16, (unsigned long *) (& fields->f_dsp_8_u16));
1137       break;
1138     case M32C_OPERAND_DSP_8_U6 :
1139       errmsg = parse_unsigned6 (cd, strp, M32C_OPERAND_DSP_8_U6, (unsigned long *) (& fields->f_dsp_8_u6));
1140       break;
1141     case M32C_OPERAND_DSP_8_U8 :
1142       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_8_U8, (unsigned long *) (& fields->f_dsp_8_u8));
1143       break;
1144     case M32C_OPERAND_DST16AN :
1145       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst16_an);
1146       break;
1147     case M32C_OPERAND_DST16AN_S :
1148       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst16_an_s);
1149       break;
1150     case M32C_OPERAND_DST16ANHI :
1151       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst16_an);
1152       break;
1153     case M32C_OPERAND_DST16ANQI :
1154       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst16_an);
1155       break;
1156     case M32C_OPERAND_DST16ANQI_S :
1157       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst16_rn_QI_s);
1158       break;
1159     case M32C_OPERAND_DST16ANSI :
1160       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_SI, & fields->f_dst16_an);
1161       break;
1162     case M32C_OPERAND_DST16RNEXTQI :
1163       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_QI, & fields->f_dst16_rn_ext);
1164       break;
1165     case M32C_OPERAND_DST16RNHI :
1166       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst16_rn);
1167       break;
1168     case M32C_OPERAND_DST16RNQI :
1169       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst16_rn);
1170       break;
1171     case M32C_OPERAND_DST16RNQI_S :
1172       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l_r0h, & fields->f_dst16_rn_QI_s);
1173       break;
1174     case M32C_OPERAND_DST16RNSI :
1175       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst16_rn);
1176       break;
1177     case M32C_OPERAND_DST32ANEXTUNPREFIXED :
1178       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
1179       break;
1180     case M32C_OPERAND_DST32ANPREFIXED :
1181       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
1182       break;
1183     case M32C_OPERAND_DST32ANPREFIXEDHI :
1184       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst32_an_prefixed);
1185       break;
1186     case M32C_OPERAND_DST32ANPREFIXEDQI :
1187       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst32_an_prefixed);
1188       break;
1189     case M32C_OPERAND_DST32ANPREFIXEDSI :
1190       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
1191       break;
1192     case M32C_OPERAND_DST32ANUNPREFIXED :
1193       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
1194       break;
1195     case M32C_OPERAND_DST32ANUNPREFIXEDHI :
1196       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst32_an_unprefixed);
1197       break;
1198     case M32C_OPERAND_DST32ANUNPREFIXEDQI :
1199       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst32_an_unprefixed);
1200       break;
1201     case M32C_OPERAND_DST32ANUNPREFIXEDSI :
1202       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
1203       break;
1204     case M32C_OPERAND_DST32R0HI_S :
1205       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0, & junk);
1206       break;
1207     case M32C_OPERAND_DST32R0QI_S :
1208       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l, & junk);
1209       break;
1210     case M32C_OPERAND_DST32RNEXTUNPREFIXEDHI :
1211       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_HI, & fields->f_dst32_rn_ext_unprefixed);
1212       break;
1213     case M32C_OPERAND_DST32RNEXTUNPREFIXEDQI :
1214       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_QI, & fields->f_dst32_rn_ext_unprefixed);
1215       break;
1216     case M32C_OPERAND_DST32RNPREFIXEDHI :
1217       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst32_rn_prefixed_HI);
1218       break;
1219     case M32C_OPERAND_DST32RNPREFIXEDQI :
1220       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_prefixed_QI);
1221       break;
1222     case M32C_OPERAND_DST32RNPREFIXEDSI :
1223       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst32_rn_prefixed_SI);
1224       break;
1225     case M32C_OPERAND_DST32RNUNPREFIXEDHI :
1226       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst32_rn_unprefixed_HI);
1227       break;
1228     case M32C_OPERAND_DST32RNUNPREFIXEDQI :
1229       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_unprefixed_QI);
1230       break;
1231     case M32C_OPERAND_DST32RNUNPREFIXEDSI :
1232       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst32_rn_unprefixed_SI);
1233       break;
1234     case M32C_OPERAND_G :
1235       errmsg = parse_G (cd, strp, M32C_OPERAND_G, (long *) (& junk));
1236       break;
1237     case M32C_OPERAND_IMM_12_S4 :
1238       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_12_S4, (long *) (& fields->f_imm_12_s4));
1239       break;
1240     case M32C_OPERAND_IMM_13_U3 :
1241       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_13_U3, (unsigned long *) (& fields->f_imm_13_u3));
1242       break;
1243     case M32C_OPERAND_IMM_16_HI :
1244       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_16_HI, (long *) (& fields->f_dsp_16_s16));
1245       break;
1246     case M32C_OPERAND_IMM_16_QI :
1247       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_16_QI, (long *) (& fields->f_dsp_16_s8));
1248       break;
1249     case M32C_OPERAND_IMM_16_SI :
1250       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_16_SI, (long *) (& fields->f_dsp_16_s32));
1251       break;
1252     case M32C_OPERAND_IMM_20_S4 :
1253       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_20_S4, (long *) (& fields->f_imm_20_s4));
1254       break;
1255     case M32C_OPERAND_IMM_24_HI :
1256       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_24_HI, (long *) (& fields->f_dsp_24_s16));
1257       break;
1258     case M32C_OPERAND_IMM_24_QI :
1259       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_24_QI, (long *) (& fields->f_dsp_24_s8));
1260       break;
1261     case M32C_OPERAND_IMM_24_SI :
1262       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_24_SI, (long *) (& fields->f_dsp_24_s32));
1263       break;
1264     case M32C_OPERAND_IMM_32_HI :
1265       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_32_HI, (long *) (& fields->f_dsp_32_s16));
1266       break;
1267     case M32C_OPERAND_IMM_32_QI :
1268       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_32_QI, (long *) (& fields->f_dsp_32_s8));
1269       break;
1270     case M32C_OPERAND_IMM_32_SI :
1271       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_32_SI, (long *) (& fields->f_dsp_32_s32));
1272       break;
1273     case M32C_OPERAND_IMM_40_HI :
1274       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_40_HI, (long *) (& fields->f_dsp_40_s16));
1275       break;
1276     case M32C_OPERAND_IMM_40_QI :
1277       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_40_QI, (long *) (& fields->f_dsp_40_s8));
1278       break;
1279     case M32C_OPERAND_IMM_40_SI :
1280       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_40_SI, (long *) (& fields->f_dsp_40_s32));
1281       break;
1282     case M32C_OPERAND_IMM_48_HI :
1283       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_48_HI, (long *) (& fields->f_dsp_48_s16));
1284       break;
1285     case M32C_OPERAND_IMM_48_QI :
1286       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_48_QI, (long *) (& fields->f_dsp_48_s8));
1287       break;
1288     case M32C_OPERAND_IMM_48_SI :
1289       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_48_SI, (long *) (& fields->f_dsp_48_s32));
1290       break;
1291     case M32C_OPERAND_IMM_56_HI :
1292       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_56_HI, (long *) (& fields->f_dsp_56_s16));
1293       break;
1294     case M32C_OPERAND_IMM_56_QI :
1295       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_56_QI, (long *) (& fields->f_dsp_56_s8));
1296       break;
1297     case M32C_OPERAND_IMM_64_HI :
1298       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_64_HI, (long *) (& fields->f_dsp_64_s16));
1299       break;
1300     case M32C_OPERAND_IMM_8_HI :
1301       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_8_HI, (long *) (& fields->f_dsp_8_s16));
1302       break;
1303     case M32C_OPERAND_IMM_8_QI :
1304       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_8_QI, (long *) (& fields->f_dsp_8_s8));
1305       break;
1306     case M32C_OPERAND_IMM_8_S4 :
1307       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_8_S4, (long *) (& fields->f_imm_8_s4));
1308       break;
1309     case M32C_OPERAND_IMM_SH_12_S4 :
1310       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_12_s4);
1311       break;
1312     case M32C_OPERAND_IMM_SH_20_S4 :
1313       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_20_s4);
1314       break;
1315     case M32C_OPERAND_IMM_SH_8_S4 :
1316       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_8_s4);
1317       break;
1318     case M32C_OPERAND_IMM1_S :
1319       errmsg = parse_imm1_S (cd, strp, M32C_OPERAND_IMM1_S, (long *) (& fields->f_imm1_S));
1320       break;
1321     case M32C_OPERAND_IMM3_S :
1322       errmsg = parse_imm3_S (cd, strp, M32C_OPERAND_IMM3_S, (long *) (& fields->f_imm3_S));
1323       break;
1324     case M32C_OPERAND_LAB_16_8 :
1325       {
1326         bfd_vma value = 0;
1327         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_16_8, 0, NULL,  & value);
1328         fields->f_lab_16_8 = value;
1329       }
1330       break;
1331     case M32C_OPERAND_LAB_24_8 :
1332       {
1333         bfd_vma value = 0;
1334         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_24_8, 0, NULL,  & value);
1335         fields->f_lab_24_8 = value;
1336       }
1337       break;
1338     case M32C_OPERAND_LAB_32_8 :
1339       {
1340         bfd_vma value = 0;
1341         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_32_8, 0, NULL,  & value);
1342         fields->f_lab_32_8 = value;
1343       }
1344       break;
1345     case M32C_OPERAND_LAB_40_8 :
1346       {
1347         bfd_vma value = 0;
1348         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_40_8, 0, NULL,  & value);
1349         fields->f_lab_40_8 = value;
1350       }
1351       break;
1352     case M32C_OPERAND_LAB_5_3 :
1353       {
1354         bfd_vma value = 0;
1355         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_5_3, 0, NULL,  & value);
1356         fields->f_lab_5_3 = value;
1357       }
1358       break;
1359     case M32C_OPERAND_LAB_8_16 :
1360       {
1361         bfd_vma value = 0;
1362         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_16, 0, NULL,  & value);
1363         fields->f_lab_8_16 = value;
1364       }
1365       break;
1366     case M32C_OPERAND_LAB_8_24 :
1367       {
1368         bfd_vma value = 0;
1369         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_24, 0, NULL,  & value);
1370         fields->f_lab_8_24 = value;
1371       }
1372       break;
1373     case M32C_OPERAND_LAB_8_8 :
1374       {
1375         bfd_vma value = 0;
1376         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_8, 0, NULL,  & value);
1377         fields->f_lab_8_8 = value;
1378       }
1379       break;
1380     case M32C_OPERAND_LAB32_JMP_S :
1381       {
1382         bfd_vma value = 0;
1383         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB32_JMP_S, 0, NULL,  & value);
1384         fields->f_lab32_jmp_s = value;
1385       }
1386       break;
1387     case M32C_OPERAND_Q :
1388       errmsg = parse_Q (cd, strp, M32C_OPERAND_Q, (long *) (& junk));
1389       break;
1390     case M32C_OPERAND_R0 :
1391       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0, & junk);
1392       break;
1393     case M32C_OPERAND_R0H :
1394       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0h, & junk);
1395       break;
1396     case M32C_OPERAND_R0L :
1397       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l, & junk);
1398       break;
1399     case M32C_OPERAND_R1 :
1400       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r1, & junk);
1401       break;
1402     case M32C_OPERAND_R1R2R0 :
1403       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r1r2r0, & junk);
1404       break;
1405     case M32C_OPERAND_R2 :
1406       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r2, & junk);
1407       break;
1408     case M32C_OPERAND_R2R0 :
1409       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r2r0, & junk);
1410       break;
1411     case M32C_OPERAND_R3 :
1412       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r3, & junk);
1413       break;
1414     case M32C_OPERAND_R3R1 :
1415       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r3r1, & junk);
1416       break;
1417     case M32C_OPERAND_REGSETPOP :
1418       errmsg = parse_pop_regset (cd, strp, M32C_OPERAND_REGSETPOP, (unsigned long *) (& fields->f_8_8));
1419       break;
1420     case M32C_OPERAND_REGSETPUSH :
1421       errmsg = parse_push_regset (cd, strp, M32C_OPERAND_REGSETPUSH, (unsigned long *) (& fields->f_8_8));
1422       break;
1423     case M32C_OPERAND_RN16_PUSH_S :
1424       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_4_1);
1425       break;
1426     case M32C_OPERAND_S :
1427       errmsg = parse_S (cd, strp, M32C_OPERAND_S, (long *) (& junk));
1428       break;
1429     case M32C_OPERAND_SRC16AN :
1430       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src16_an);
1431       break;
1432     case M32C_OPERAND_SRC16ANHI :
1433       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src16_an);
1434       break;
1435     case M32C_OPERAND_SRC16ANQI :
1436       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src16_an);
1437       break;
1438     case M32C_OPERAND_SRC16RNHI :
1439       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src16_rn);
1440       break;
1441     case M32C_OPERAND_SRC16RNQI :
1442       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src16_rn);
1443       break;
1444     case M32C_OPERAND_SRC32ANPREFIXED :
1445       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_prefixed);
1446       break;
1447     case M32C_OPERAND_SRC32ANPREFIXEDHI :
1448       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src32_an_prefixed);
1449       break;
1450     case M32C_OPERAND_SRC32ANPREFIXEDQI :
1451       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src32_an_prefixed);
1452       break;
1453     case M32C_OPERAND_SRC32ANPREFIXEDSI :
1454       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_prefixed);
1455       break;
1456     case M32C_OPERAND_SRC32ANUNPREFIXED :
1457       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_unprefixed);
1458       break;
1459     case M32C_OPERAND_SRC32ANUNPREFIXEDHI :
1460       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src32_an_unprefixed);
1461       break;
1462     case M32C_OPERAND_SRC32ANUNPREFIXEDQI :
1463       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src32_an_unprefixed);
1464       break;
1465     case M32C_OPERAND_SRC32ANUNPREFIXEDSI :
1466       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_unprefixed);
1467       break;
1468     case M32C_OPERAND_SRC32RNPREFIXEDHI :
1469       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src32_rn_prefixed_HI);
1470       break;
1471     case M32C_OPERAND_SRC32RNPREFIXEDQI :
1472       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src32_rn_prefixed_QI);
1473       break;
1474     case M32C_OPERAND_SRC32RNPREFIXEDSI :
1475       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_src32_rn_prefixed_SI);
1476       break;
1477     case M32C_OPERAND_SRC32RNUNPREFIXEDHI :
1478       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src32_rn_unprefixed_HI);
1479       break;
1480     case M32C_OPERAND_SRC32RNUNPREFIXEDQI :
1481       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src32_rn_unprefixed_QI);
1482       break;
1483     case M32C_OPERAND_SRC32RNUNPREFIXEDSI :
1484       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_src32_rn_unprefixed_SI);
1485       break;
1486     case M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL :
1487       errmsg = parse_r0l_r0h (cd, strp, M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL, (long *) (& fields->f_5_1));
1488       break;
1489     case M32C_OPERAND_X :
1490       errmsg = parse_X (cd, strp, M32C_OPERAND_X, (long *) (& junk));
1491       break;
1492     case M32C_OPERAND_Z :
1493       errmsg = parse_Z (cd, strp, M32C_OPERAND_Z, (long *) (& junk));
1494       break;
1495     case M32C_OPERAND_COND16_16 :
1496       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_16_u8);
1497       break;
1498     case M32C_OPERAND_COND16_24 :
1499       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_24_u8);
1500       break;
1501     case M32C_OPERAND_COND16_32 :
1502       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_32_u8);
1503       break;
1504     case M32C_OPERAND_COND16C :
1505       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16c, & fields->f_cond16);
1506       break;
1507     case M32C_OPERAND_COND16J :
1508       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16j, & fields->f_cond16);
1509       break;
1510     case M32C_OPERAND_COND16J5 :
1511       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16j_5, & fields->f_cond16j_5);
1512       break;
1513     case M32C_OPERAND_COND32 :
1514       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond32);
1515       break;
1516     case M32C_OPERAND_COND32_16 :
1517       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_16_u8);
1518       break;
1519     case M32C_OPERAND_COND32_24 :
1520       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_24_u8);
1521       break;
1522     case M32C_OPERAND_COND32_32 :
1523       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_32_u8);
1524       break;
1525     case M32C_OPERAND_COND32_40 :
1526       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_40_u8);
1527       break;
1528     case M32C_OPERAND_COND32J :
1529       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond32j);
1530       break;
1531     case M32C_OPERAND_CR1_PREFIXED_32 :
1532       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr1_32, & fields->f_21_3);
1533       break;
1534     case M32C_OPERAND_CR1_UNPREFIXED_32 :
1535       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr1_32, & fields->f_13_3);
1536       break;
1537     case M32C_OPERAND_CR16 :
1538       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr_16, & fields->f_9_3);
1539       break;
1540     case M32C_OPERAND_CR2_32 :
1541       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr2_32, & fields->f_13_3);
1542       break;
1543     case M32C_OPERAND_CR3_PREFIXED_32 :
1544       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr3_32, & fields->f_21_3);
1545       break;
1546     case M32C_OPERAND_CR3_UNPREFIXED_32 :
1547       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr3_32, & fields->f_13_3);
1548       break;
1549     case M32C_OPERAND_FLAGS16 :
1550       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_flags, & fields->f_9_3);
1551       break;
1552     case M32C_OPERAND_FLAGS32 :
1553       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_flags, & fields->f_13_3);
1554       break;
1555     case M32C_OPERAND_SCCOND32 :
1556       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond16);
1557       break;
1558     case M32C_OPERAND_SIZE :
1559       errmsg = parse_size (cd, strp, M32C_OPERAND_SIZE, (long *) (& junk));
1560       break;
1561
1562     default :
1563       /* xgettext:c-format */
1564       fprintf (stderr, _("Unrecognized field %d while parsing.\n"), opindex);
1565       abort ();
1566   }
1567
1568   return errmsg;
1569 }
1570
1571 cgen_parse_fn * const m32c_cgen_parse_handlers[] = 
1572 {
1573   parse_insn_normal,
1574 };
1575
1576 void
1577 m32c_cgen_init_asm (cd)
1578      CGEN_CPU_DESC cd;
1579 {
1580   m32c_cgen_init_opcode_table (cd);
1581   m32c_cgen_init_ibld_table (cd);
1582   cd->parse_handlers = & m32c_cgen_parse_handlers[0];
1583   cd->parse_operand = m32c_cgen_parse_operand;
1584 }
1585
1586 \f
1587
1588 /* Regex construction routine.
1589
1590    This translates an opcode syntax string into a regex string,
1591    by replacing any non-character syntax element (such as an
1592    opcode) with the pattern '.*'
1593
1594    It then compiles the regex and stores it in the opcode, for
1595    later use by m32c_cgen_assemble_insn
1596
1597    Returns NULL for success, an error message for failure.  */
1598
1599 char * 
1600 m32c_cgen_build_insn_regex (CGEN_INSN *insn)
1601 {  
1602   CGEN_OPCODE *opc = (CGEN_OPCODE *) CGEN_INSN_OPCODE (insn);
1603   const char *mnem = CGEN_INSN_MNEMONIC (insn);
1604   char rxbuf[CGEN_MAX_RX_ELEMENTS];
1605   char *rx = rxbuf;
1606   const CGEN_SYNTAX_CHAR_TYPE *syn;
1607   int reg_err;
1608
1609   syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
1610
1611   /* Mnemonics come first in the syntax string.  */
1612   if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
1613     return _("missing mnemonic in syntax string");
1614   ++syn;
1615
1616   /* Generate a case sensitive regular expression that emulates case
1617      insensitive matching in the "C" locale.  We cannot generate a case
1618      insensitive regular expression because in Turkish locales, 'i' and 'I'
1619      are not equal modulo case conversion.  */
1620
1621   /* Copy the literal mnemonic out of the insn.  */
1622   for (; *mnem; mnem++)
1623     {
1624       char c = *mnem;
1625
1626       if (ISALPHA (c))
1627         {
1628           *rx++ = '[';
1629           *rx++ = TOLOWER (c);
1630           *rx++ = TOUPPER (c);
1631           *rx++ = ']';
1632         }
1633       else
1634         *rx++ = c;
1635     }
1636
1637   /* Copy any remaining literals from the syntax string into the rx.  */
1638   for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
1639     {
1640       if (CGEN_SYNTAX_CHAR_P (* syn)) 
1641         {
1642           char c = CGEN_SYNTAX_CHAR (* syn);
1643
1644           switch (c) 
1645             {
1646               /* Escape any regex metacharacters in the syntax.  */
1647             case '.': case '[': case '\\': 
1648             case '*': case '^': case '$': 
1649
1650 #ifdef CGEN_ESCAPE_EXTENDED_REGEX
1651             case '?': case '{': case '}': 
1652             case '(': case ')': case '*':
1653             case '|': case '+': case ']':
1654 #endif
1655               *rx++ = '\\';
1656               *rx++ = c;
1657               break;
1658
1659             default:
1660               if (ISALPHA (c))
1661                 {
1662                   *rx++ = '[';
1663                   *rx++ = TOLOWER (c);
1664                   *rx++ = TOUPPER (c);
1665                   *rx++ = ']';
1666                 }
1667               else
1668                 *rx++ = c;
1669               break;
1670             }
1671         }
1672       else
1673         {
1674           /* Replace non-syntax fields with globs.  */
1675           *rx++ = '.';
1676           *rx++ = '*';
1677         }
1678     }
1679
1680   /* Trailing whitespace ok.  */
1681   * rx++ = '['; 
1682   * rx++ = ' '; 
1683   * rx++ = '\t'; 
1684   * rx++ = ']'; 
1685   * rx++ = '*'; 
1686
1687   /* But anchor it after that.  */
1688   * rx++ = '$'; 
1689   * rx = '\0';
1690
1691   CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
1692   reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
1693
1694   if (reg_err == 0) 
1695     return NULL;
1696   else
1697     {
1698       static char msg[80];
1699
1700       regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
1701       regfree ((regex_t *) CGEN_INSN_RX (insn));
1702       free (CGEN_INSN_RX (insn));
1703       (CGEN_INSN_RX (insn)) = NULL;
1704       return msg;
1705     }
1706 }
1707
1708 \f
1709 /* Default insn parser.
1710
1711    The syntax string is scanned and operands are parsed and stored in FIELDS.
1712    Relocs are queued as we go via other callbacks.
1713
1714    ??? Note that this is currently an all-or-nothing parser.  If we fail to
1715    parse the instruction, we return 0 and the caller will start over from
1716    the beginning.  Backtracking will be necessary in parsing subexpressions,
1717    but that can be handled there.  Not handling backtracking here may get
1718    expensive in the case of the m68k.  Deal with later.
1719
1720    Returns NULL for success, an error message for failure.  */
1721
1722 static const char *
1723 parse_insn_normal (CGEN_CPU_DESC cd,
1724                    const CGEN_INSN *insn,
1725                    const char **strp,
1726                    CGEN_FIELDS *fields)
1727 {
1728   /* ??? Runtime added insns not handled yet.  */
1729   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
1730   const char *str = *strp;
1731   const char *errmsg;
1732   const char *p;
1733   const CGEN_SYNTAX_CHAR_TYPE * syn;
1734 #ifdef CGEN_MNEMONIC_OPERANDS
1735   /* FIXME: wip */
1736   int past_opcode_p;
1737 #endif
1738
1739   /* For now we assume the mnemonic is first (there are no leading operands).
1740      We can parse it without needing to set up operand parsing.
1741      GAS's input scrubber will ensure mnemonics are lowercase, but we may
1742      not be called from GAS.  */
1743   p = CGEN_INSN_MNEMONIC (insn);
1744   while (*p && TOLOWER (*p) == TOLOWER (*str))
1745     ++p, ++str;
1746
1747   if (* p)
1748     return _("unrecognized instruction");
1749
1750 #ifndef CGEN_MNEMONIC_OPERANDS
1751   if (* str && ! ISSPACE (* str))
1752     return _("unrecognized instruction");
1753 #endif
1754
1755   CGEN_INIT_PARSE (cd);
1756   cgen_init_parse_operand (cd);
1757 #ifdef CGEN_MNEMONIC_OPERANDS
1758   past_opcode_p = 0;
1759 #endif
1760
1761   /* We don't check for (*str != '\0') here because we want to parse
1762      any trailing fake arguments in the syntax string.  */
1763   syn = CGEN_SYNTAX_STRING (syntax);
1764
1765   /* Mnemonics come first for now, ensure valid string.  */
1766   if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
1767     abort ();
1768
1769   ++syn;
1770
1771   while (* syn != 0)
1772     {
1773       /* Non operand chars must match exactly.  */
1774       if (CGEN_SYNTAX_CHAR_P (* syn))
1775         {
1776           /* FIXME: While we allow for non-GAS callers above, we assume the
1777              first char after the mnemonic part is a space.  */
1778           /* FIXME: We also take inappropriate advantage of the fact that
1779              GAS's input scrubber will remove extraneous blanks.  */
1780           if (TOLOWER (*str) == TOLOWER (CGEN_SYNTAX_CHAR (* syn)))
1781             {
1782 #ifdef CGEN_MNEMONIC_OPERANDS
1783               if (CGEN_SYNTAX_CHAR(* syn) == ' ')
1784                 past_opcode_p = 1;
1785 #endif
1786               ++ syn;
1787               ++ str;
1788             }
1789           else if (*str)
1790             {
1791               /* Syntax char didn't match.  Can't be this insn.  */
1792               static char msg [80];
1793
1794               /* xgettext:c-format */
1795               sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
1796                        CGEN_SYNTAX_CHAR(*syn), *str);
1797               return msg;
1798             }
1799           else
1800             {
1801               /* Ran out of input.  */
1802               static char msg [80];
1803
1804               /* xgettext:c-format */
1805               sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
1806                        CGEN_SYNTAX_CHAR(*syn));
1807               return msg;
1808             }
1809           continue;
1810         }
1811
1812       /* We have an operand of some sort.  */
1813       errmsg = cd->parse_operand (cd, CGEN_SYNTAX_FIELD (*syn),
1814                                           &str, fields);
1815       if (errmsg)
1816         return errmsg;
1817
1818       /* Done with this operand, continue with next one.  */
1819       ++ syn;
1820     }
1821
1822   /* If we're at the end of the syntax string, we're done.  */
1823   if (* syn == 0)
1824     {
1825       /* FIXME: For the moment we assume a valid `str' can only contain
1826          blanks now.  IE: We needn't try again with a longer version of
1827          the insn and it is assumed that longer versions of insns appear
1828          before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
1829       while (ISSPACE (* str))
1830         ++ str;
1831
1832       if (* str != '\0')
1833         return _("junk at end of line"); /* FIXME: would like to include `str' */
1834
1835       return NULL;
1836     }
1837
1838   /* We couldn't parse it.  */
1839   return _("unrecognized instruction");
1840 }
1841 \f
1842 /* Main entry point.
1843    This routine is called for each instruction to be assembled.
1844    STR points to the insn to be assembled.
1845    We assume all necessary tables have been initialized.
1846    The assembled instruction, less any fixups, is stored in BUF.
1847    Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
1848    still needs to be converted to target byte order, otherwise BUF is an array
1849    of bytes in target byte order.
1850    The result is a pointer to the insn's entry in the opcode table,
1851    or NULL if an error occured (an error message will have already been
1852    printed).
1853
1854    Note that when processing (non-alias) macro-insns,
1855    this function recurses.
1856
1857    ??? It's possible to make this cpu-independent.
1858    One would have to deal with a few minor things.
1859    At this point in time doing so would be more of a curiosity than useful
1860    [for example this file isn't _that_ big], but keeping the possibility in
1861    mind helps keep the design clean.  */
1862
1863 const CGEN_INSN *
1864 m32c_cgen_assemble_insn (CGEN_CPU_DESC cd,
1865                            const char *str,
1866                            CGEN_FIELDS *fields,
1867                            CGEN_INSN_BYTES_PTR buf,
1868                            char **errmsg)
1869 {
1870   const char *start;
1871   CGEN_INSN_LIST *ilist;
1872   const char *parse_errmsg = NULL;
1873   const char *insert_errmsg = NULL;
1874   int recognized_mnemonic = 0;
1875
1876   /* Skip leading white space.  */
1877   while (ISSPACE (* str))
1878     ++ str;
1879
1880   /* The instructions are stored in hashed lists.
1881      Get the first in the list.  */
1882   ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
1883
1884   /* Keep looking until we find a match.  */
1885   start = str;
1886   for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
1887     {
1888       const CGEN_INSN *insn = ilist->insn;
1889       recognized_mnemonic = 1;
1890
1891 #ifdef CGEN_VALIDATE_INSN_SUPPORTED 
1892       /* Not usually needed as unsupported opcodes
1893          shouldn't be in the hash lists.  */
1894       /* Is this insn supported by the selected cpu?  */
1895       if (! m32c_cgen_insn_supported (cd, insn))
1896         continue;
1897 #endif
1898       /* If the RELAXED attribute is set, this is an insn that shouldn't be
1899          chosen immediately.  Instead, it is used during assembler/linker
1900          relaxation if possible.  */
1901       if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED) != 0)
1902         continue;
1903
1904       str = start;
1905
1906       /* Skip this insn if str doesn't look right lexically.  */
1907       if (CGEN_INSN_RX (insn) != NULL &&
1908           regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
1909         continue;
1910
1911       /* Allow parse/insert handlers to obtain length of insn.  */
1912       CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
1913
1914       parse_errmsg = CGEN_PARSE_FN (cd, insn) (cd, insn, & str, fields);
1915       if (parse_errmsg != NULL)
1916         continue;
1917
1918       /* ??? 0 is passed for `pc'.  */
1919       insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
1920                                                  (bfd_vma) 0);
1921       if (insert_errmsg != NULL)
1922         continue;
1923
1924       /* It is up to the caller to actually output the insn and any
1925          queued relocs.  */
1926       return insn;
1927     }
1928
1929   {
1930     static char errbuf[150];
1931 #ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
1932     const char *tmp_errmsg;
1933
1934     /* If requesting verbose error messages, use insert_errmsg.
1935        Failing that, use parse_errmsg.  */
1936     tmp_errmsg = (insert_errmsg ? insert_errmsg :
1937                   parse_errmsg ? parse_errmsg :
1938                   recognized_mnemonic ?
1939                   _("unrecognized form of instruction") :
1940                   _("unrecognized instruction"));
1941
1942     if (strlen (start) > 50)
1943       /* xgettext:c-format */
1944       sprintf (errbuf, "%s `%.50s...'", tmp_errmsg, start);
1945     else 
1946       /* xgettext:c-format */
1947       sprintf (errbuf, "%s `%.50s'", tmp_errmsg, start);
1948 #else
1949     if (strlen (start) > 50)
1950       /* xgettext:c-format */
1951       sprintf (errbuf, _("bad instruction `%.50s...'"), start);
1952     else 
1953       /* xgettext:c-format */
1954       sprintf (errbuf, _("bad instruction `%.50s'"), start);
1955 #endif
1956       
1957     *errmsg = errbuf;
1958     return NULL;
1959   }
1960 }
1961 \f
1962 #if 0 /* This calls back to GAS which we can't do without care.  */
1963
1964 /* Record each member of OPVALS in the assembler's symbol table.
1965    This lets GAS parse registers for us.
1966    ??? Interesting idea but not currently used.  */
1967
1968 /* Record each member of OPVALS in the assembler's symbol table.
1969    FIXME: Not currently used.  */
1970
1971 void
1972 m32c_cgen_asm_hash_keywords (CGEN_CPU_DESC cd, CGEN_KEYWORD *opvals)
1973 {
1974   CGEN_KEYWORD_SEARCH search = cgen_keyword_search_init (opvals, NULL);
1975   const CGEN_KEYWORD_ENTRY * ke;
1976
1977   while ((ke = cgen_keyword_search_next (& search)) != NULL)
1978     {
1979 #if 0 /* Unnecessary, should be done in the search routine.  */
1980       if (! m32c_cgen_opval_supported (ke))
1981         continue;
1982 #endif
1983       cgen_asm_record_register (cd, ke->name, ke->value);
1984     }
1985 }
1986
1987 #endif /* 0 */