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