OSDN Git Service

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