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