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