xref: /netbsd-src/external/gpl3/binutils.old/dist/opcodes/m32c-asm.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1ede78133Schristos /* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
275fd0b74Schristos /* Assembler interface for targets using CGEN. -*- C -*-
375fd0b74Schristos    CGEN: Cpu tools GENerator
475fd0b74Schristos 
575fd0b74Schristos    THIS FILE IS MACHINE GENERATED WITH CGEN.
675fd0b74Schristos    - the resultant file is machine generated, cgen-asm.in isn't
775fd0b74Schristos 
8*e992f068Schristos    Copyright (C) 1996-2022 Free Software Foundation, Inc.
975fd0b74Schristos 
1075fd0b74Schristos    This file is part of libopcodes.
1175fd0b74Schristos 
1275fd0b74Schristos    This library is free software; you can redistribute it and/or modify
1375fd0b74Schristos    it under the terms of the GNU General Public License as published by
1475fd0b74Schristos    the Free Software Foundation; either version 3, or (at your option)
1575fd0b74Schristos    any later version.
1675fd0b74Schristos 
1775fd0b74Schristos    It is distributed in the hope that it will be useful, but WITHOUT
1875fd0b74Schristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1975fd0b74Schristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
2075fd0b74Schristos    License for more details.
2175fd0b74Schristos 
2275fd0b74Schristos    You should have received a copy of the GNU General Public License
2375fd0b74Schristos    along with this program; if not, write to the Free Software Foundation, Inc.,
2475fd0b74Schristos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2575fd0b74Schristos 
2675fd0b74Schristos 
2775fd0b74Schristos /* ??? Eventually more and more of this stuff can go to cpu-independent files.
2875fd0b74Schristos    Keep that in mind.  */
2975fd0b74Schristos 
3075fd0b74Schristos #include "sysdep.h"
3175fd0b74Schristos #include <stdio.h>
3275fd0b74Schristos #include "ansidecl.h"
3375fd0b74Schristos #include "bfd.h"
3475fd0b74Schristos #include "symcat.h"
3575fd0b74Schristos #include "m32c-desc.h"
3675fd0b74Schristos #include "m32c-opc.h"
3775fd0b74Schristos #include "opintl.h"
3875fd0b74Schristos #include "xregex.h"
3975fd0b74Schristos #include "libiberty.h"
4075fd0b74Schristos #include "safe-ctype.h"
4175fd0b74Schristos 
4275fd0b74Schristos #undef  min
4375fd0b74Schristos #define min(a,b) ((a) < (b) ? (a) : (b))
4475fd0b74Schristos #undef  max
4575fd0b74Schristos #define max(a,b) ((a) > (b) ? (a) : (b))
4675fd0b74Schristos 
4775fd0b74Schristos static const char * parse_insn_normal
4875fd0b74Schristos   (CGEN_CPU_DESC, const CGEN_INSN *, const char **, CGEN_FIELDS *);
4975fd0b74Schristos 
5075fd0b74Schristos /* -- assembler routines inserted here.  */
5175fd0b74Schristos 
5275fd0b74Schristos /* -- asm.c */
5375fd0b74Schristos #include "safe-ctype.h"
5475fd0b74Schristos 
5575fd0b74Schristos #define MACH_M32C 5		/* Must match md_begin.  */
5675fd0b74Schristos 
5775fd0b74Schristos static int
m32c_cgen_isa_register(const char ** strp)5875fd0b74Schristos m32c_cgen_isa_register (const char **strp)
5975fd0b74Schristos  {
6075fd0b74Schristos    int u;
6175fd0b74Schristos    const char *s = *strp;
6275fd0b74Schristos    static char * m32c_register_names [] =
6375fd0b74Schristos      {
6475fd0b74Schristos        "r0", "r1", "r2", "r3", "r0l", "r0h", "r1l", "r1h",
6575fd0b74Schristos        "a0", "a1", "r2r0", "r3r1", "sp", "fb", "dct0", "dct1", "flg", "svf",
6675fd0b74Schristos        "drc0", "drc1", "dmd0", "dmd1", "intb", "svp", "vct", "isp", "dma0",
6775fd0b74Schristos        "dma1", "dra0", "dra1", "dsa0", "dsa1", 0
6875fd0b74Schristos      };
6975fd0b74Schristos 
7075fd0b74Schristos    for (u = 0; m32c_register_names[u]; u++)
7175fd0b74Schristos      {
7275fd0b74Schristos        int len = strlen (m32c_register_names[u]);
7375fd0b74Schristos 
7475fd0b74Schristos        if (memcmp (m32c_register_names[u], s, len) == 0
7575fd0b74Schristos 	   && (s[len] == 0 || ! ISALNUM (s[len])))
7675fd0b74Schristos         return 1;
7775fd0b74Schristos      }
7875fd0b74Schristos    return 0;
7975fd0b74Schristos }
8075fd0b74Schristos 
8175fd0b74Schristos #define PARSE_UNSIGNED							\
8275fd0b74Schristos   do									\
8375fd0b74Schristos     {									\
8475fd0b74Schristos       /* Don't successfully parse literals beginning with '['.  */	\
8575fd0b74Schristos       if (**strp == '[')						\
8675fd0b74Schristos 	return "Invalid literal"; /* Anything -- will not be seen.  */	\
8775fd0b74Schristos 									\
8875fd0b74Schristos       errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);\
8975fd0b74Schristos       if (errmsg)							\
9075fd0b74Schristos 	return errmsg;							\
9175fd0b74Schristos     }									\
9275fd0b74Schristos   while (0)
9375fd0b74Schristos 
9475fd0b74Schristos #define PARSE_SIGNED							\
9575fd0b74Schristos   do									\
9675fd0b74Schristos     {									\
9775fd0b74Schristos       /* Don't successfully parse literals beginning with '['.  */	\
9875fd0b74Schristos       if (**strp == '[')						\
9975fd0b74Schristos 	return "Invalid literal"; /* Anything -- will not be seen.  */	\
10075fd0b74Schristos 									\
10175fd0b74Schristos       errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);  \
10275fd0b74Schristos       if (errmsg)							\
10375fd0b74Schristos 	return errmsg;							\
10475fd0b74Schristos     }									\
10575fd0b74Schristos   while (0)
10675fd0b74Schristos 
10775fd0b74Schristos static const char *
parse_unsigned6(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)10875fd0b74Schristos parse_unsigned6 (CGEN_CPU_DESC cd, const char **strp,
10975fd0b74Schristos 		 int opindex, unsigned long *valuep)
11075fd0b74Schristos {
11175fd0b74Schristos   const char *errmsg = 0;
11275fd0b74Schristos   unsigned long value;
11375fd0b74Schristos 
11475fd0b74Schristos   PARSE_UNSIGNED;
11575fd0b74Schristos 
11675fd0b74Schristos   if (value > 0x3f)
11775fd0b74Schristos     return _("imm:6 immediate is out of range");
11875fd0b74Schristos 
11975fd0b74Schristos   *valuep = value;
12075fd0b74Schristos   return 0;
12175fd0b74Schristos }
12275fd0b74Schristos 
12375fd0b74Schristos static const char *
parse_unsigned8(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)12475fd0b74Schristos parse_unsigned8 (CGEN_CPU_DESC cd, const char **strp,
12575fd0b74Schristos 		 int opindex, unsigned long *valuep)
12675fd0b74Schristos {
12775fd0b74Schristos   const char *errmsg = 0;
12875fd0b74Schristos   unsigned long value = 0;
12975fd0b74Schristos   long have_zero = 0;
13075fd0b74Schristos 
13175fd0b74Schristos   if (strncasecmp (*strp, "%dsp8(", 6) == 0)
13275fd0b74Schristos     {
13375fd0b74Schristos       enum cgen_parse_operand_result result_type;
13475fd0b74Schristos       bfd_vma val;
13575fd0b74Schristos 
13675fd0b74Schristos       *strp += 6;
13775fd0b74Schristos       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_8,
13875fd0b74Schristos 				   & result_type, & val);
13975fd0b74Schristos       if (**strp != ')')
14075fd0b74Schristos 	return _("missing `)'");
14175fd0b74Schristos       (*strp) ++;
14275fd0b74Schristos 
14375fd0b74Schristos       if (errmsg == NULL
14475fd0b74Schristos   	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
14575fd0b74Schristos 	return _("%dsp8() takes a symbolic address, not a number");
14675fd0b74Schristos 
14775fd0b74Schristos       value = val;
14875fd0b74Schristos       *valuep = value;
14975fd0b74Schristos       return errmsg;
15075fd0b74Schristos     }
15175fd0b74Schristos 
15275fd0b74Schristos   if (strncmp (*strp, "0x0", 3) == 0
15375fd0b74Schristos       || (**strp == '0' && *(*strp + 1) != 'x'))
15475fd0b74Schristos     have_zero = 1;
15575fd0b74Schristos 
15675fd0b74Schristos   PARSE_UNSIGNED;
15775fd0b74Schristos 
15875fd0b74Schristos   if (value > 0xff)
15975fd0b74Schristos     return _("dsp:8 immediate is out of range");
16075fd0b74Schristos 
16175fd0b74Schristos   /* If this field may require a relocation then use larger dsp16.  */
16275fd0b74Schristos   if (! have_zero && value == 0)
16375fd0b74Schristos     return _("dsp:8 immediate is out of range");
16475fd0b74Schristos 
16575fd0b74Schristos   *valuep = value;
16675fd0b74Schristos   return 0;
16775fd0b74Schristos }
16875fd0b74Schristos 
16975fd0b74Schristos static const char *
parse_signed4(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)17075fd0b74Schristos parse_signed4 (CGEN_CPU_DESC cd, const char **strp,
17175fd0b74Schristos 	       int opindex, signed long *valuep)
17275fd0b74Schristos {
17375fd0b74Schristos   const char *errmsg = 0;
17475fd0b74Schristos   signed long value;
17575fd0b74Schristos   long have_zero = 0;
17675fd0b74Schristos 
17775fd0b74Schristos   if (strncmp (*strp, "0x0", 3) == 0
17875fd0b74Schristos       || (**strp == '0' && *(*strp + 1) != 'x'))
17975fd0b74Schristos     have_zero = 1;
18075fd0b74Schristos 
18175fd0b74Schristos   PARSE_SIGNED;
18275fd0b74Schristos 
18375fd0b74Schristos   if (value < -8 || value > 7)
18475fd0b74Schristos     return _("Immediate is out of range -8 to 7");
18575fd0b74Schristos 
18675fd0b74Schristos   /* If this field may require a relocation then use larger dsp16.  */
18775fd0b74Schristos   if (! have_zero && value == 0)
18875fd0b74Schristos     return _("Immediate is out of range -8 to 7");
18975fd0b74Schristos 
19075fd0b74Schristos   *valuep = value;
19175fd0b74Schristos   return 0;
19275fd0b74Schristos }
19375fd0b74Schristos 
19475fd0b74Schristos static const char *
parse_signed4n(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)19575fd0b74Schristos parse_signed4n (CGEN_CPU_DESC cd, const char **strp,
19675fd0b74Schristos 		int opindex, signed long *valuep)
19775fd0b74Schristos {
19875fd0b74Schristos   const char *errmsg = 0;
19975fd0b74Schristos   signed long value;
20075fd0b74Schristos   long have_zero = 0;
20175fd0b74Schristos 
20275fd0b74Schristos   if (strncmp (*strp, "0x0", 3) == 0
20375fd0b74Schristos       || (**strp == '0' && *(*strp + 1) != 'x'))
20475fd0b74Schristos     have_zero = 1;
20575fd0b74Schristos 
20675fd0b74Schristos   PARSE_SIGNED;
20775fd0b74Schristos 
20875fd0b74Schristos   if (value < -7 || value > 8)
20975fd0b74Schristos     return _("Immediate is out of range -7 to 8");
21075fd0b74Schristos 
21175fd0b74Schristos   /* If this field may require a relocation then use larger dsp16.  */
21275fd0b74Schristos   if (! have_zero && value == 0)
21375fd0b74Schristos     return _("Immediate is out of range -7 to 8");
21475fd0b74Schristos 
21575fd0b74Schristos   *valuep = -value;
21675fd0b74Schristos   return 0;
21775fd0b74Schristos }
21875fd0b74Schristos 
21975fd0b74Schristos static const char *
parse_signed8(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)22075fd0b74Schristos parse_signed8 (CGEN_CPU_DESC cd, const char **strp,
22175fd0b74Schristos 	       int opindex, signed long *valuep)
22275fd0b74Schristos {
22375fd0b74Schristos   const char *errmsg = 0;
22475fd0b74Schristos   signed long value = 0;
22575fd0b74Schristos 
22675fd0b74Schristos   if (strncasecmp (*strp, "%hi8(", 5) == 0)
22775fd0b74Schristos     {
22875fd0b74Schristos       enum cgen_parse_operand_result result_type;
22975fd0b74Schristos       bfd_vma val;
23075fd0b74Schristos 
23175fd0b74Schristos       *strp += 5;
23275fd0b74Schristos       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32C_HI8,
23375fd0b74Schristos 				   & result_type, & val);
23475fd0b74Schristos       if (**strp != ')')
23575fd0b74Schristos 	return _("missing `)'");
23675fd0b74Schristos       (*strp) ++;
23775fd0b74Schristos 
23875fd0b74Schristos       if (errmsg == NULL
23975fd0b74Schristos   	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
24075fd0b74Schristos 	val >>= 16;
24175fd0b74Schristos 
24275fd0b74Schristos       value = val;
24375fd0b74Schristos       *valuep = value;
24475fd0b74Schristos       return errmsg;
24575fd0b74Schristos     }
24675fd0b74Schristos 
24775fd0b74Schristos   PARSE_SIGNED;
24875fd0b74Schristos 
24975fd0b74Schristos   if (value <= 255 && value > 127)
25075fd0b74Schristos     value -= 0x100;
25175fd0b74Schristos 
25275fd0b74Schristos   if (value < -128 || value > 127)
25375fd0b74Schristos     return _("dsp:8 immediate is out of range");
25475fd0b74Schristos 
25575fd0b74Schristos   *valuep = value;
25675fd0b74Schristos   return 0;
25775fd0b74Schristos }
25875fd0b74Schristos 
25975fd0b74Schristos static const char *
parse_unsigned16(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)26075fd0b74Schristos parse_unsigned16 (CGEN_CPU_DESC cd, const char **strp,
26175fd0b74Schristos 		 int opindex, unsigned long *valuep)
26275fd0b74Schristos {
26375fd0b74Schristos   const char *errmsg = 0;
26475fd0b74Schristos   unsigned long value = 0;
26575fd0b74Schristos   long have_zero = 0;
26675fd0b74Schristos 
26775fd0b74Schristos   if (strncasecmp (*strp, "%dsp16(", 7) == 0)
26875fd0b74Schristos     {
26975fd0b74Schristos       enum cgen_parse_operand_result result_type;
27075fd0b74Schristos       bfd_vma val;
27175fd0b74Schristos 
27275fd0b74Schristos       *strp += 7;
27375fd0b74Schristos       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_16,
27475fd0b74Schristos 				   & result_type, & val);
27575fd0b74Schristos       if (**strp != ')')
27675fd0b74Schristos 	return _("missing `)'");
27775fd0b74Schristos       (*strp) ++;
27875fd0b74Schristos 
27975fd0b74Schristos       if (errmsg == NULL
28075fd0b74Schristos   	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
28175fd0b74Schristos 	return _("%dsp16() takes a symbolic address, not a number");
28275fd0b74Schristos 
28375fd0b74Schristos       value = val;
28475fd0b74Schristos       *valuep = value;
28575fd0b74Schristos       return errmsg;
28675fd0b74Schristos     }
28775fd0b74Schristos 
28875fd0b74Schristos   /* Don't successfully parse literals beginning with '['.  */
28975fd0b74Schristos   if (**strp == '[')
29075fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
29175fd0b74Schristos 
29275fd0b74Schristos   /* Don't successfully parse register names.  */
29375fd0b74Schristos   if (m32c_cgen_isa_register (strp))
29475fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
29575fd0b74Schristos 
29675fd0b74Schristos   if (strncmp (*strp, "0x0", 3) == 0
29775fd0b74Schristos       || (**strp == '0' && *(*strp + 1) != 'x'))
29875fd0b74Schristos     have_zero = 1;
29975fd0b74Schristos 
30075fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
30175fd0b74Schristos   if (errmsg)
30275fd0b74Schristos     return errmsg;
30375fd0b74Schristos 
30475fd0b74Schristos   if (value > 0xffff)
30575fd0b74Schristos     return _("dsp:16 immediate is out of range");
30675fd0b74Schristos 
30775fd0b74Schristos   /* If this field may require a relocation then use larger dsp24.  */
30875fd0b74Schristos   if (cd->machs == MACH_M32C && ! have_zero && value == 0
30975fd0b74Schristos       && (strncmp (*strp, "[a", 2) == 0
31075fd0b74Schristos 	  || **strp == ','
31175fd0b74Schristos 	  || **strp == 0))
31275fd0b74Schristos     return _("dsp:16 immediate is out of range");
31375fd0b74Schristos 
31475fd0b74Schristos   *valuep = value;
31575fd0b74Schristos   return 0;
31675fd0b74Schristos }
31775fd0b74Schristos 
31875fd0b74Schristos static const char *
parse_signed16(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)31975fd0b74Schristos parse_signed16 (CGEN_CPU_DESC cd, const char **strp,
32075fd0b74Schristos 	       int opindex, signed long *valuep)
32175fd0b74Schristos {
32275fd0b74Schristos   const char *errmsg = 0;
32375fd0b74Schristos   signed long value = 0;
32475fd0b74Schristos 
32575fd0b74Schristos   if (strncasecmp (*strp, "%lo16(", 6) == 0)
32675fd0b74Schristos     {
32775fd0b74Schristos       enum cgen_parse_operand_result result_type;
32875fd0b74Schristos       bfd_vma val;
32975fd0b74Schristos 
33075fd0b74Schristos       *strp += 6;
33175fd0b74Schristos       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_LO16,
33275fd0b74Schristos 				   & result_type, & val);
33375fd0b74Schristos       if (**strp != ')')
33475fd0b74Schristos 	return _("missing `)'");
33575fd0b74Schristos       (*strp) ++;
33675fd0b74Schristos 
33775fd0b74Schristos       if (errmsg == NULL
33875fd0b74Schristos   	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
33975fd0b74Schristos 	val &= 0xffff;
34075fd0b74Schristos 
34175fd0b74Schristos       value = val;
34275fd0b74Schristos       *valuep = value;
34375fd0b74Schristos       return errmsg;
34475fd0b74Schristos     }
34575fd0b74Schristos 
34675fd0b74Schristos   if (strncasecmp (*strp, "%hi16(", 6) == 0)
34775fd0b74Schristos     {
34875fd0b74Schristos       enum cgen_parse_operand_result result_type;
34975fd0b74Schristos       bfd_vma val;
35075fd0b74Schristos 
35175fd0b74Schristos       *strp += 6;
35275fd0b74Schristos       errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16,
35375fd0b74Schristos 				   & result_type, & val);
35475fd0b74Schristos       if (**strp != ')')
35575fd0b74Schristos 	return _("missing `)'");
35675fd0b74Schristos       (*strp) ++;
35775fd0b74Schristos 
35875fd0b74Schristos       if (errmsg == NULL
35975fd0b74Schristos   	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
36075fd0b74Schristos 	val >>= 16;
36175fd0b74Schristos 
36275fd0b74Schristos       value = val;
36375fd0b74Schristos       *valuep = value;
36475fd0b74Schristos       return errmsg;
36575fd0b74Schristos     }
36675fd0b74Schristos 
36775fd0b74Schristos   PARSE_SIGNED;
36875fd0b74Schristos 
36975fd0b74Schristos   if (value <= 65535 && value > 32767)
37075fd0b74Schristos     value -= 0x10000;
37175fd0b74Schristos 
37275fd0b74Schristos   if (value < -32768 || value > 32767)
37375fd0b74Schristos     return _("dsp:16 immediate is out of range");
37475fd0b74Schristos 
37575fd0b74Schristos   *valuep = value;
37675fd0b74Schristos   return 0;
37775fd0b74Schristos }
37875fd0b74Schristos 
37975fd0b74Schristos static const char *
parse_unsigned20(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)38075fd0b74Schristos parse_unsigned20 (CGEN_CPU_DESC cd, const char **strp,
38175fd0b74Schristos 		 int opindex, unsigned long *valuep)
38275fd0b74Schristos {
38375fd0b74Schristos   const char *errmsg = 0;
38475fd0b74Schristos   unsigned long value;
38575fd0b74Schristos 
38675fd0b74Schristos   /* Don't successfully parse literals beginning with '['.  */
38775fd0b74Schristos   if (**strp == '[')
38875fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
38975fd0b74Schristos 
39075fd0b74Schristos   /* Don't successfully parse register names.  */
39175fd0b74Schristos   if (m32c_cgen_isa_register (strp))
39275fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
39375fd0b74Schristos 
39475fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
39575fd0b74Schristos   if (errmsg)
39675fd0b74Schristos     return errmsg;
39775fd0b74Schristos 
39875fd0b74Schristos   if (value > 0xfffff)
39975fd0b74Schristos     return _("dsp:20 immediate is out of range");
40075fd0b74Schristos 
40175fd0b74Schristos   *valuep = value;
40275fd0b74Schristos   return 0;
40375fd0b74Schristos }
40475fd0b74Schristos 
40575fd0b74Schristos static const char *
parse_unsigned24(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)40675fd0b74Schristos parse_unsigned24 (CGEN_CPU_DESC cd, const char **strp,
40775fd0b74Schristos 		 int opindex, unsigned long *valuep)
40875fd0b74Schristos {
40975fd0b74Schristos   const char *errmsg = 0;
41075fd0b74Schristos   unsigned long value;
41175fd0b74Schristos 
41275fd0b74Schristos   /* Don't successfully parse literals beginning with '['.  */
41375fd0b74Schristos   if (**strp == '[')
41475fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
41575fd0b74Schristos 
41675fd0b74Schristos   /* Don't successfully parse register names.  */
41775fd0b74Schristos   if (m32c_cgen_isa_register (strp))
41875fd0b74Schristos     return "Invalid literal"; /* Anything -- will not be seen.  */
41975fd0b74Schristos 
42075fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
42175fd0b74Schristos   if (errmsg)
42275fd0b74Schristos     return errmsg;
42375fd0b74Schristos 
42475fd0b74Schristos   if (value > 0xffffff)
42575fd0b74Schristos     return _("dsp:24 immediate is out of range");
42675fd0b74Schristos 
42775fd0b74Schristos   *valuep = value;
42875fd0b74Schristos   return 0;
42975fd0b74Schristos }
43075fd0b74Schristos 
43175fd0b74Schristos /* This should only be used for #imm->reg.  */
43275fd0b74Schristos static const char *
parse_signed24(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)43375fd0b74Schristos parse_signed24 (CGEN_CPU_DESC cd, const char **strp,
43475fd0b74Schristos 		 int opindex, signed long *valuep)
43575fd0b74Schristos {
43675fd0b74Schristos   const char *errmsg = 0;
43775fd0b74Schristos   signed long value;
43875fd0b74Schristos 
43975fd0b74Schristos   PARSE_SIGNED;
44075fd0b74Schristos 
44175fd0b74Schristos   if (value <= 0xffffff && value > 0x7fffff)
44275fd0b74Schristos     value -= 0x1000000;
44375fd0b74Schristos 
44475fd0b74Schristos   if (value > 0xffffff)
44575fd0b74Schristos     return _("dsp:24 immediate is out of range");
44675fd0b74Schristos 
44775fd0b74Schristos   *valuep = value;
44875fd0b74Schristos   return 0;
44975fd0b74Schristos }
45075fd0b74Schristos 
45175fd0b74Schristos static const char *
parse_signed32(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)45275fd0b74Schristos parse_signed32 (CGEN_CPU_DESC cd, const char **strp,
45375fd0b74Schristos 		int opindex, signed long *valuep)
45475fd0b74Schristos {
45575fd0b74Schristos   const char *errmsg = 0;
45675fd0b74Schristos   signed long value;
45775fd0b74Schristos 
45875fd0b74Schristos   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
45975fd0b74Schristos   if (errmsg)
46075fd0b74Schristos     return errmsg;
46175fd0b74Schristos 
46275fd0b74Schristos   *valuep = value;
46375fd0b74Schristos   return 0;
46475fd0b74Schristos }
46575fd0b74Schristos 
46675fd0b74Schristos static const char *
parse_imm1_S(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)46775fd0b74Schristos parse_imm1_S (CGEN_CPU_DESC cd, const char **strp,
46875fd0b74Schristos 	     int opindex, signed long *valuep)
46975fd0b74Schristos {
47075fd0b74Schristos   const char *errmsg = 0;
47175fd0b74Schristos   signed long value;
47275fd0b74Schristos 
47375fd0b74Schristos   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
47475fd0b74Schristos   if (errmsg)
47575fd0b74Schristos     return errmsg;
47675fd0b74Schristos 
47775fd0b74Schristos   if (value < 1 || value > 2)
47875fd0b74Schristos     return _("immediate is out of range 1-2");
47975fd0b74Schristos 
48075fd0b74Schristos   *valuep = value;
48175fd0b74Schristos   return 0;
48275fd0b74Schristos }
48375fd0b74Schristos 
48475fd0b74Schristos static const char *
parse_imm3_S(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)48575fd0b74Schristos parse_imm3_S (CGEN_CPU_DESC cd, const char **strp,
48675fd0b74Schristos 	     int opindex, signed long *valuep)
48775fd0b74Schristos {
48875fd0b74Schristos   const char *errmsg = 0;
48975fd0b74Schristos   signed long value;
49075fd0b74Schristos 
49175fd0b74Schristos   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
49275fd0b74Schristos   if (errmsg)
49375fd0b74Schristos     return errmsg;
49475fd0b74Schristos 
49575fd0b74Schristos   if (value < 1 || value > 8)
49675fd0b74Schristos     return _("immediate is out of range 1-8");
49775fd0b74Schristos 
49875fd0b74Schristos   *valuep = value;
49975fd0b74Schristos   return 0;
50075fd0b74Schristos }
50175fd0b74Schristos 
50275fd0b74Schristos static const char *
parse_bit3_S(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)50375fd0b74Schristos parse_bit3_S (CGEN_CPU_DESC cd, const char **strp,
50475fd0b74Schristos 	     int opindex, signed long *valuep)
50575fd0b74Schristos {
50675fd0b74Schristos   const char *errmsg = 0;
50775fd0b74Schristos   signed long value;
50875fd0b74Schristos 
50975fd0b74Schristos   errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
51075fd0b74Schristos   if (errmsg)
51175fd0b74Schristos     return errmsg;
51275fd0b74Schristos 
51375fd0b74Schristos   if (value < 0 || value > 7)
51475fd0b74Schristos     return _("immediate is out of range 0-7");
51575fd0b74Schristos 
51675fd0b74Schristos   *valuep = value;
51775fd0b74Schristos   return 0;
51875fd0b74Schristos }
51975fd0b74Schristos 
52075fd0b74Schristos static const char *
parse_lab_5_3(CGEN_CPU_DESC cd,const char ** strp,int opindex ATTRIBUTE_UNUSED,int opinfo,enum cgen_parse_operand_result * type_addr,bfd_vma * valuep)52175fd0b74Schristos parse_lab_5_3 (CGEN_CPU_DESC cd,
52275fd0b74Schristos 	       const char **strp,
52375fd0b74Schristos 	       int opindex ATTRIBUTE_UNUSED,
52475fd0b74Schristos 	       int opinfo,
52575fd0b74Schristos 	       enum cgen_parse_operand_result *type_addr,
52675fd0b74Schristos 	       bfd_vma *valuep)
52775fd0b74Schristos {
52875fd0b74Schristos   const char *errmsg = 0;
52975fd0b74Schristos   bfd_vma value;
53075fd0b74Schristos   enum cgen_parse_operand_result op_res;
53175fd0b74Schristos 
53275fd0b74Schristos   errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_5_3,
53375fd0b74Schristos 			       opinfo, & op_res, & value);
53475fd0b74Schristos 
53575fd0b74Schristos   if (type_addr)
53675fd0b74Schristos     *type_addr = op_res;
53775fd0b74Schristos 
53875fd0b74Schristos   if (op_res == CGEN_PARSE_OPERAND_RESULT_QUEUED)
53975fd0b74Schristos     {
54075fd0b74Schristos       /* This is a hack; the field cannot handle near-zero signed
54175fd0b74Schristos 	 offsets that CGEN wants to put in to indicate an "empty"
54275fd0b74Schristos 	 operand at first.  */
54375fd0b74Schristos       *valuep = 2;
54475fd0b74Schristos       return 0;
54575fd0b74Schristos     }
54675fd0b74Schristos   if (errmsg)
54775fd0b74Schristos     return errmsg;
54875fd0b74Schristos 
54975fd0b74Schristos   if (value < 2 || value > 9)
55075fd0b74Schristos     return _("immediate is out of range 2-9");
55175fd0b74Schristos 
55275fd0b74Schristos   *valuep = value;
55375fd0b74Schristos   return 0;
55475fd0b74Schristos }
55575fd0b74Schristos 
55675fd0b74Schristos static const char *
parse_Bitno16R(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)55775fd0b74Schristos parse_Bitno16R (CGEN_CPU_DESC cd, const char **strp,
55875fd0b74Schristos 		int opindex, unsigned long *valuep)
55975fd0b74Schristos {
56075fd0b74Schristos   const char *errmsg = 0;
56175fd0b74Schristos   unsigned long value;
56275fd0b74Schristos 
56375fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
56475fd0b74Schristos   if (errmsg)
56575fd0b74Schristos     return errmsg;
56675fd0b74Schristos 
56775fd0b74Schristos   if (value > 15)
56875fd0b74Schristos     return _("Bit number for indexing general register is out of range 0-15");
56975fd0b74Schristos 
57075fd0b74Schristos   *valuep = value;
57175fd0b74Schristos   return 0;
57275fd0b74Schristos }
57375fd0b74Schristos 
57475fd0b74Schristos static const char *
parse_unsigned_bitbase(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep,unsigned bits,int allow_syms)57575fd0b74Schristos parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp,
57675fd0b74Schristos 			int opindex, unsigned long *valuep,
57775fd0b74Schristos 			unsigned bits, int allow_syms)
57875fd0b74Schristos {
57975fd0b74Schristos   const char *errmsg = 0;
58075fd0b74Schristos   unsigned long bit;
58175fd0b74Schristos   unsigned long base;
58275fd0b74Schristos   const char *newp = *strp;
58375fd0b74Schristos   unsigned long long bitbase;
58475fd0b74Schristos   long have_zero = 0;
58575fd0b74Schristos 
58675fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
58775fd0b74Schristos   if (errmsg)
58875fd0b74Schristos     return errmsg;
58975fd0b74Schristos 
59075fd0b74Schristos   if (*newp != ',')
59175fd0b74Schristos     return "Missing base for bit,base:8";
59275fd0b74Schristos 
59375fd0b74Schristos   ++newp;
59475fd0b74Schristos 
59575fd0b74Schristos   if (strncmp (newp, "0x0", 3) == 0
59675fd0b74Schristos       || (newp[0] == '0' && newp[1] != 'x'))
59775fd0b74Schristos     have_zero = 1;
59875fd0b74Schristos 
59975fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & base);
60075fd0b74Schristos   if (errmsg)
60175fd0b74Schristos     return errmsg;
60275fd0b74Schristos 
60375fd0b74Schristos   bitbase = (unsigned long long) bit + ((unsigned long long) base * 8);
60475fd0b74Schristos 
60575fd0b74Schristos   if (bitbase >= (1ull << bits))
60675fd0b74Schristos     return _("bit,base is out of range");
60775fd0b74Schristos 
60875fd0b74Schristos   /* If this field may require a relocation then use larger displacement.  */
60975fd0b74Schristos   if (! have_zero && base == 0)
61075fd0b74Schristos     {
61175fd0b74Schristos       switch (allow_syms) {
61275fd0b74Schristos       case 0:
61375fd0b74Schristos 	return _("bit,base out of range for symbol");
61475fd0b74Schristos       case 1:
61575fd0b74Schristos 	break;
61675fd0b74Schristos       case 2:
61775fd0b74Schristos 	if (strncmp (newp, "[sb]", 4) != 0)
61875fd0b74Schristos 	  return _("bit,base out of range for symbol");
61975fd0b74Schristos 	break;
62075fd0b74Schristos       }
62175fd0b74Schristos     }
62275fd0b74Schristos 
62375fd0b74Schristos   *valuep = bitbase;
62475fd0b74Schristos   *strp = newp;
62575fd0b74Schristos   return 0;
62675fd0b74Schristos }
62775fd0b74Schristos 
62875fd0b74Schristos static const char *
parse_signed_bitbase(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep,unsigned bits,int allow_syms)62975fd0b74Schristos parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp,
63075fd0b74Schristos 		      int opindex, signed long *valuep,
63175fd0b74Schristos 		      unsigned bits, int allow_syms)
63275fd0b74Schristos {
63375fd0b74Schristos   const char *errmsg = 0;
63475fd0b74Schristos   unsigned long bit;
63575fd0b74Schristos   signed long base;
63675fd0b74Schristos   const char *newp = *strp;
63775fd0b74Schristos   long long bitbase;
63875fd0b74Schristos   long long limit;
63975fd0b74Schristos   long have_zero = 0;
64075fd0b74Schristos 
64175fd0b74Schristos   errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
64275fd0b74Schristos   if (errmsg)
64375fd0b74Schristos     return errmsg;
64475fd0b74Schristos 
64575fd0b74Schristos   if (*newp != ',')
64675fd0b74Schristos     return "Missing base for bit,base:8";
64775fd0b74Schristos 
64875fd0b74Schristos   ++newp;
64975fd0b74Schristos 
65075fd0b74Schristos   if (strncmp (newp, "0x0", 3) == 0
65175fd0b74Schristos       || (newp[0] == '0' && newp[1] != 'x'))
65275fd0b74Schristos     have_zero = 1;
65375fd0b74Schristos 
65475fd0b74Schristos   errmsg = cgen_parse_signed_integer (cd, & newp, opindex, & base);
65575fd0b74Schristos   if (errmsg)
65675fd0b74Schristos     return errmsg;
65775fd0b74Schristos 
65875fd0b74Schristos   bitbase = (long long)bit + ((long long)base * 8);
65975fd0b74Schristos 
66075fd0b74Schristos   limit = 1ll << (bits - 1);
66175fd0b74Schristos   if (bitbase < -limit || bitbase >= limit)
66275fd0b74Schristos     return _("bit,base is out of range");
66375fd0b74Schristos 
66475fd0b74Schristos   /* If this field may require a relocation then use larger displacement.  */
66575fd0b74Schristos   if (! have_zero && base == 0 && ! allow_syms)
66675fd0b74Schristos     return _("bit,base out of range for symbol");
66775fd0b74Schristos 
66875fd0b74Schristos   *valuep = bitbase;
66975fd0b74Schristos   *strp = newp;
67075fd0b74Schristos   return 0;
67175fd0b74Schristos }
67275fd0b74Schristos 
67375fd0b74Schristos static const char *
parse_unsigned_bitbase8(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)67475fd0b74Schristos parse_unsigned_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
67575fd0b74Schristos 			 int opindex, unsigned long *valuep)
67675fd0b74Schristos {
67775fd0b74Schristos   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 8, 0);
67875fd0b74Schristos }
67975fd0b74Schristos 
68075fd0b74Schristos static const char *
parse_unsigned_bitbase11(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)68175fd0b74Schristos parse_unsigned_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
68275fd0b74Schristos 			 int opindex, unsigned long *valuep)
68375fd0b74Schristos {
68475fd0b74Schristos   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 11, 0);
68575fd0b74Schristos }
68675fd0b74Schristos 
68775fd0b74Schristos static const char *
parse_unsigned_bitbase16(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)68875fd0b74Schristos parse_unsigned_bitbase16 (CGEN_CPU_DESC cd, const char **strp,
68975fd0b74Schristos 			  int opindex, unsigned long *valuep)
69075fd0b74Schristos {
69175fd0b74Schristos   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 16, 1);
69275fd0b74Schristos }
69375fd0b74Schristos 
69475fd0b74Schristos static const char *
parse_unsigned_bitbase19(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)69575fd0b74Schristos parse_unsigned_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
69675fd0b74Schristos 			 int opindex, unsigned long *valuep)
69775fd0b74Schristos {
69875fd0b74Schristos   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 19, 2);
69975fd0b74Schristos }
70075fd0b74Schristos 
70175fd0b74Schristos static const char *
parse_unsigned_bitbase27(CGEN_CPU_DESC cd,const char ** strp,int opindex,unsigned long * valuep)70275fd0b74Schristos parse_unsigned_bitbase27 (CGEN_CPU_DESC cd, const char **strp,
70375fd0b74Schristos 			 int opindex, unsigned long *valuep)
70475fd0b74Schristos {
70575fd0b74Schristos   return parse_unsigned_bitbase (cd, strp, opindex, valuep, 27, 1);
70675fd0b74Schristos }
70775fd0b74Schristos 
70875fd0b74Schristos static const char *
parse_signed_bitbase8(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)70975fd0b74Schristos parse_signed_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
71075fd0b74Schristos 		       int opindex, signed long *valuep)
71175fd0b74Schristos {
71275fd0b74Schristos   return parse_signed_bitbase (cd, strp, opindex, valuep, 8, 1);
71375fd0b74Schristos }
71475fd0b74Schristos 
71575fd0b74Schristos static const char *
parse_signed_bitbase11(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)71675fd0b74Schristos parse_signed_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
71775fd0b74Schristos 		       int opindex, signed long *valuep)
71875fd0b74Schristos {
71975fd0b74Schristos   return parse_signed_bitbase (cd, strp, opindex, valuep, 11, 0);
72075fd0b74Schristos }
72175fd0b74Schristos 
72275fd0b74Schristos static const char *
parse_signed_bitbase19(CGEN_CPU_DESC cd,const char ** strp,int opindex,signed long * valuep)72375fd0b74Schristos parse_signed_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
72475fd0b74Schristos 		       int opindex, signed long *valuep)
72575fd0b74Schristos {
72675fd0b74Schristos   return parse_signed_bitbase (cd, strp, opindex, valuep, 19, 1);
72775fd0b74Schristos }
72875fd0b74Schristos 
72975fd0b74Schristos /* Parse the suffix as :<char> or as nothing followed by a whitespace.  */
73075fd0b74Schristos 
73175fd0b74Schristos static const char *
parse_suffix(const char ** strp,char suffix)73275fd0b74Schristos parse_suffix (const char **strp, char suffix)
73375fd0b74Schristos {
73475fd0b74Schristos   const char *newp = *strp;
73575fd0b74Schristos 
73675fd0b74Schristos   if (**strp == ':' && TOLOWER (*(*strp + 1)) == suffix)
73775fd0b74Schristos     newp = *strp + 2;
73875fd0b74Schristos 
73975fd0b74Schristos   if (ISSPACE (*newp))
74075fd0b74Schristos     {
74175fd0b74Schristos       *strp = newp;
74275fd0b74Schristos       return 0;
74375fd0b74Schristos     }
74475fd0b74Schristos 
74575fd0b74Schristos   return "Invalid suffix"; /* Anything -- will not be seen.  */
74675fd0b74Schristos }
74775fd0b74Schristos 
74875fd0b74Schristos static const char *
parse_S(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)74975fd0b74Schristos parse_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
75075fd0b74Schristos 	 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
75175fd0b74Schristos {
75275fd0b74Schristos   return parse_suffix (strp, 's');
75375fd0b74Schristos }
75475fd0b74Schristos 
75575fd0b74Schristos static const char *
parse_G(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)75675fd0b74Schristos parse_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
75775fd0b74Schristos 	 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
75875fd0b74Schristos {
75975fd0b74Schristos   return parse_suffix (strp, 'g');
76075fd0b74Schristos }
76175fd0b74Schristos 
76275fd0b74Schristos static const char *
parse_Q(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)76375fd0b74Schristos parse_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
76475fd0b74Schristos 	 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
76575fd0b74Schristos {
76675fd0b74Schristos   return parse_suffix (strp, 'q');
76775fd0b74Schristos }
76875fd0b74Schristos 
76975fd0b74Schristos static const char *
parse_Z(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)77075fd0b74Schristos parse_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
77175fd0b74Schristos 	 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
77275fd0b74Schristos {
77375fd0b74Schristos   return parse_suffix (strp, 'z');
77475fd0b74Schristos }
77575fd0b74Schristos 
77675fd0b74Schristos /* Parse an empty suffix. Fail if the next char is ':'.  */
77775fd0b74Schristos 
77875fd0b74Schristos static const char *
parse_X(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)77975fd0b74Schristos parse_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
78075fd0b74Schristos 	 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
78175fd0b74Schristos {
78275fd0b74Schristos   if (**strp == ':')
78375fd0b74Schristos     return "Unexpected suffix";
78475fd0b74Schristos   return 0;
78575fd0b74Schristos }
78675fd0b74Schristos 
78775fd0b74Schristos static const char *
parse_r0l_r0h(CGEN_CPU_DESC cd,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep)78875fd0b74Schristos parse_r0l_r0h (CGEN_CPU_DESC cd, const char **strp,
78975fd0b74Schristos 	       int opindex ATTRIBUTE_UNUSED, signed long *valuep)
79075fd0b74Schristos {
79175fd0b74Schristos   const char *errmsg;
79275fd0b74Schristos   signed long value;
79375fd0b74Schristos   signed long junk;
79475fd0b74Schristos   const char *newp = *strp;
79575fd0b74Schristos 
79675fd0b74Schristos   /* Parse r0[hl].  */
79775fd0b74Schristos   errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l_r0h, & value);
79875fd0b74Schristos   if (errmsg)
79975fd0b74Schristos     return errmsg;
80075fd0b74Schristos 
80175fd0b74Schristos   if (*newp != ',')
80275fd0b74Schristos     return _("not a valid r0l/r0h pair");
80375fd0b74Schristos   ++newp;
80475fd0b74Schristos 
80575fd0b74Schristos   /* Parse the second register in the pair.  */
80675fd0b74Schristos   if (value == 0) /* r0l */
80775fd0b74Schristos     errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0h, & junk);
80875fd0b74Schristos   else
80975fd0b74Schristos     errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l, & junk);
81075fd0b74Schristos   if (errmsg)
81175fd0b74Schristos     return errmsg;
81275fd0b74Schristos 
81375fd0b74Schristos   *strp = newp;
81475fd0b74Schristos   *valuep = ! value;
81575fd0b74Schristos   return 0;
81675fd0b74Schristos }
81775fd0b74Schristos 
81875fd0b74Schristos /* Accept .b or .w in any case.  */
81975fd0b74Schristos 
82075fd0b74Schristos static const char *
parse_size(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,signed long * valuep ATTRIBUTE_UNUSED)82175fd0b74Schristos parse_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
82275fd0b74Schristos 	    int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
82375fd0b74Schristos {
82475fd0b74Schristos   if (**strp == '.'
82575fd0b74Schristos       && (*(*strp + 1) == 'b' || *(*strp + 1) == 'B'
82675fd0b74Schristos 	  || *(*strp + 1) == 'w' || *(*strp + 1) == 'W'))
82775fd0b74Schristos     {
82875fd0b74Schristos       *strp += 2;
82975fd0b74Schristos       return NULL;
83075fd0b74Schristos     }
83175fd0b74Schristos 
83275fd0b74Schristos   return _("Invalid size specifier");
83375fd0b74Schristos }
83475fd0b74Schristos 
83575fd0b74Schristos /* Special check to ensure that instruction exists for given machine.  */
83675fd0b74Schristos 
83775fd0b74Schristos int
m32c_cgen_insn_supported(CGEN_CPU_DESC cd,const CGEN_INSN * insn)83875fd0b74Schristos m32c_cgen_insn_supported (CGEN_CPU_DESC cd,
83975fd0b74Schristos 			  const CGEN_INSN *insn)
84075fd0b74Schristos {
84175fd0b74Schristos   int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
84275fd0b74Schristos   CGEN_BITSET isas = CGEN_INSN_BITSET_ATTR_VALUE (insn, CGEN_INSN_ISA);
84375fd0b74Schristos 
84475fd0b74Schristos   /* If attributes are absent, assume no restriction.  */
84575fd0b74Schristos   if (machs == 0)
84675fd0b74Schristos     machs = ~0;
84775fd0b74Schristos 
84875fd0b74Schristos   return ((machs & cd->machs)
84975fd0b74Schristos           && cgen_bitset_intersect_p (& isas, cd->isas));
85075fd0b74Schristos }
85175fd0b74Schristos 
85275fd0b74Schristos /* Parse a set of registers, R0,R1,A0,A1,SB,FB.  */
85375fd0b74Schristos 
85475fd0b74Schristos static const char *
parse_regset(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,unsigned long * valuep,int push)85575fd0b74Schristos parse_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
85675fd0b74Schristos 	      const char **strp,
85775fd0b74Schristos 	      int opindex ATTRIBUTE_UNUSED,
85875fd0b74Schristos 	      unsigned long *valuep,
85975fd0b74Schristos 	      int push)
86075fd0b74Schristos {
86175fd0b74Schristos   const char *errmsg = 0;
86275fd0b74Schristos   int regno = 0;
86375fd0b74Schristos 
86475fd0b74Schristos   *valuep = 0;
86575fd0b74Schristos   while (**strp && **strp != ')')
86675fd0b74Schristos     {
86775fd0b74Schristos       if (**strp == 'r' || **strp == 'R')
86875fd0b74Schristos 	{
86975fd0b74Schristos 	  ++*strp;
87075fd0b74Schristos 	  regno = **strp - '0';
87175fd0b74Schristos 	  if (regno > 4)
87275fd0b74Schristos 	    errmsg = _("Register number is not valid");
87375fd0b74Schristos 	}
87475fd0b74Schristos       else if (**strp == 'a' || **strp == 'A')
87575fd0b74Schristos 	{
87675fd0b74Schristos 	  ++*strp;
87775fd0b74Schristos 	  regno = **strp - '0';
87875fd0b74Schristos 	  if (regno > 2)
87975fd0b74Schristos 	    errmsg = _("Register number is not valid");
88075fd0b74Schristos 	  regno = **strp - '0' + 4;
88175fd0b74Schristos 	}
88275fd0b74Schristos 
88375fd0b74Schristos       else if (strncasecmp (*strp, "sb", 2) == 0 || strncasecmp (*strp, "SB", 2) == 0)
88475fd0b74Schristos 	{
88575fd0b74Schristos 	  regno = 6;
88675fd0b74Schristos 	  ++*strp;
88775fd0b74Schristos 	}
88875fd0b74Schristos 
88975fd0b74Schristos       else if (strncasecmp (*strp, "fb", 2) == 0 || strncasecmp (*strp, "FB", 2) == 0)
89075fd0b74Schristos 	{
89175fd0b74Schristos 	  regno = 7;
89275fd0b74Schristos 	  ++*strp;
89375fd0b74Schristos 	}
89475fd0b74Schristos 
89575fd0b74Schristos       if (push) /* Mask is reversed for push.  */
89675fd0b74Schristos 	*valuep |= 0x80 >> regno;
89775fd0b74Schristos       else
89875fd0b74Schristos 	*valuep |= 1 << regno;
89975fd0b74Schristos 
90075fd0b74Schristos       ++*strp;
90175fd0b74Schristos       if (**strp == ',')
90275fd0b74Schristos         {
90375fd0b74Schristos           if (*(*strp + 1) == ')')
90475fd0b74Schristos             break;
90575fd0b74Schristos           ++*strp;
90675fd0b74Schristos         }
90775fd0b74Schristos     }
90875fd0b74Schristos 
90975fd0b74Schristos   if (!*strp)
91075fd0b74Schristos     errmsg = _("Register list is not valid");
91175fd0b74Schristos 
91275fd0b74Schristos   return errmsg;
91375fd0b74Schristos }
91475fd0b74Schristos 
91575fd0b74Schristos #define POP  0
91675fd0b74Schristos #define PUSH 1
91775fd0b74Schristos 
91875fd0b74Schristos static const char *
parse_pop_regset(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,unsigned long * valuep)91975fd0b74Schristos parse_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
92075fd0b74Schristos 		  const char **strp,
92175fd0b74Schristos 		  int opindex ATTRIBUTE_UNUSED,
92275fd0b74Schristos 		  unsigned long *valuep)
92375fd0b74Schristos {
92475fd0b74Schristos   return parse_regset (cd, strp, opindex, valuep, POP);
92575fd0b74Schristos }
92675fd0b74Schristos 
92775fd0b74Schristos static const char *
parse_push_regset(CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,const char ** strp,int opindex ATTRIBUTE_UNUSED,unsigned long * valuep)92875fd0b74Schristos parse_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
92975fd0b74Schristos 		   const char **strp,
93075fd0b74Schristos 		   int opindex ATTRIBUTE_UNUSED,
93175fd0b74Schristos 		   unsigned long *valuep)
93275fd0b74Schristos {
93375fd0b74Schristos   return parse_regset (cd, strp, opindex, valuep, PUSH);
93475fd0b74Schristos }
93575fd0b74Schristos 
93675fd0b74Schristos /* -- dis.c */
93775fd0b74Schristos 
93875fd0b74Schristos const char * m32c_cgen_parse_operand
93975fd0b74Schristos   (CGEN_CPU_DESC, int, const char **, CGEN_FIELDS *);
94075fd0b74Schristos 
94175fd0b74Schristos /* Main entry point for operand parsing.
94275fd0b74Schristos 
94375fd0b74Schristos    This function is basically just a big switch statement.  Earlier versions
94475fd0b74Schristos    used tables to look up the function to use, but
94575fd0b74Schristos    - if the table contains both assembler and disassembler functions then
94675fd0b74Schristos      the disassembler contains much of the assembler and vice-versa,
94775fd0b74Schristos    - there's a lot of inlining possibilities as things grow,
94875fd0b74Schristos    - using a switch statement avoids the function call overhead.
94975fd0b74Schristos 
95075fd0b74Schristos    This function could be moved into `parse_insn_normal', but keeping it
95175fd0b74Schristos    separate makes clear the interface between `parse_insn_normal' and each of
95275fd0b74Schristos    the handlers.  */
95375fd0b74Schristos 
95475fd0b74Schristos const char *
m32c_cgen_parse_operand(CGEN_CPU_DESC cd,int opindex,const char ** strp,CGEN_FIELDS * fields)95575fd0b74Schristos m32c_cgen_parse_operand (CGEN_CPU_DESC cd,
95675fd0b74Schristos 			   int opindex,
95775fd0b74Schristos 			   const char ** strp,
95875fd0b74Schristos 			   CGEN_FIELDS * fields)
95975fd0b74Schristos {
96075fd0b74Schristos   const char * errmsg = NULL;
96175fd0b74Schristos   /* Used by scalar operands that still need to be parsed.  */
96275fd0b74Schristos   long junk ATTRIBUTE_UNUSED;
96375fd0b74Schristos 
96475fd0b74Schristos   switch (opindex)
96575fd0b74Schristos     {
96675fd0b74Schristos     case M32C_OPERAND_A0 :
96775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_a0, & junk);
96875fd0b74Schristos       break;
96975fd0b74Schristos     case M32C_OPERAND_A1 :
97075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_a1, & junk);
97175fd0b74Schristos       break;
97275fd0b74Schristos     case M32C_OPERAND_AN16_PUSH_S :
97375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_4_1);
97475fd0b74Schristos       break;
97575fd0b74Schristos     case M32C_OPERAND_BIT16AN :
97675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst16_an);
97775fd0b74Schristos       break;
97875fd0b74Schristos     case M32C_OPERAND_BIT16RN :
97975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst16_rn);
98075fd0b74Schristos       break;
98175fd0b74Schristos     case M32C_OPERAND_BIT3_S :
98275fd0b74Schristos       errmsg = parse_bit3_S (cd, strp, M32C_OPERAND_BIT3_S, (long *) (& fields->f_imm3_S));
98375fd0b74Schristos       break;
98475fd0b74Schristos     case M32C_OPERAND_BIT32ANPREFIXED :
98575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
98675fd0b74Schristos       break;
98775fd0b74Schristos     case M32C_OPERAND_BIT32ANUNPREFIXED :
98875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
98975fd0b74Schristos       break;
99075fd0b74Schristos     case M32C_OPERAND_BIT32RNPREFIXED :
99175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_prefixed_QI);
99275fd0b74Schristos       break;
99375fd0b74Schristos     case M32C_OPERAND_BIT32RNUNPREFIXED :
99475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_unprefixed_QI);
99575fd0b74Schristos       break;
99675fd0b74Schristos     case M32C_OPERAND_BITBASE16_16_S8 :
99775fd0b74Schristos       errmsg = parse_signed_bitbase8 (cd, strp, M32C_OPERAND_BITBASE16_16_S8, (long *) (& fields->f_dsp_16_s8));
99875fd0b74Schristos       break;
99975fd0b74Schristos     case M32C_OPERAND_BITBASE16_16_U16 :
100075fd0b74Schristos       errmsg = parse_unsigned_bitbase16 (cd, strp, M32C_OPERAND_BITBASE16_16_U16, (unsigned long *) (& fields->f_dsp_16_u16));
100175fd0b74Schristos       break;
100275fd0b74Schristos     case M32C_OPERAND_BITBASE16_16_U8 :
100375fd0b74Schristos       errmsg = parse_unsigned_bitbase8 (cd, strp, M32C_OPERAND_BITBASE16_16_U8, (unsigned long *) (& fields->f_dsp_16_u8));
100475fd0b74Schristos       break;
100575fd0b74Schristos     case M32C_OPERAND_BITBASE16_8_U11_S :
100675fd0b74Schristos       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE16_8_U11_S, (unsigned long *) (& fields->f_bitbase16_u11_S));
100775fd0b74Schristos       break;
100875fd0b74Schristos     case M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED :
100975fd0b74Schristos       errmsg = parse_signed_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED, (long *) (& fields->f_bitbase32_16_s11_unprefixed));
101075fd0b74Schristos       break;
101175fd0b74Schristos     case M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED :
101275fd0b74Schristos       errmsg = parse_signed_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED, (long *) (& fields->f_bitbase32_16_s19_unprefixed));
101375fd0b74Schristos       break;
101475fd0b74Schristos     case M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED :
101575fd0b74Schristos       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u11_unprefixed));
101675fd0b74Schristos       break;
101775fd0b74Schristos     case M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED :
101875fd0b74Schristos       errmsg = parse_unsigned_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u19_unprefixed));
101975fd0b74Schristos       break;
102075fd0b74Schristos     case M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED :
102175fd0b74Schristos       errmsg = parse_unsigned_bitbase27 (cd, strp, M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED, (unsigned long *) (& fields->f_bitbase32_16_u27_unprefixed));
102275fd0b74Schristos       break;
102375fd0b74Schristos     case M32C_OPERAND_BITBASE32_24_S11_PREFIXED :
102475fd0b74Schristos       errmsg = parse_signed_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_24_S11_PREFIXED, (long *) (& fields->f_bitbase32_24_s11_prefixed));
102575fd0b74Schristos       break;
102675fd0b74Schristos     case M32C_OPERAND_BITBASE32_24_S19_PREFIXED :
102775fd0b74Schristos       errmsg = parse_signed_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_24_S19_PREFIXED, (long *) (& fields->f_bitbase32_24_s19_prefixed));
102875fd0b74Schristos       break;
102975fd0b74Schristos     case M32C_OPERAND_BITBASE32_24_U11_PREFIXED :
103075fd0b74Schristos       errmsg = parse_unsigned_bitbase11 (cd, strp, M32C_OPERAND_BITBASE32_24_U11_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u11_prefixed));
103175fd0b74Schristos       break;
103275fd0b74Schristos     case M32C_OPERAND_BITBASE32_24_U19_PREFIXED :
103375fd0b74Schristos       errmsg = parse_unsigned_bitbase19 (cd, strp, M32C_OPERAND_BITBASE32_24_U19_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u19_prefixed));
103475fd0b74Schristos       break;
103575fd0b74Schristos     case M32C_OPERAND_BITBASE32_24_U27_PREFIXED :
103675fd0b74Schristos       errmsg = parse_unsigned_bitbase27 (cd, strp, M32C_OPERAND_BITBASE32_24_U27_PREFIXED, (unsigned long *) (& fields->f_bitbase32_24_u27_prefixed));
103775fd0b74Schristos       break;
103875fd0b74Schristos     case M32C_OPERAND_BITNO16R :
103975fd0b74Schristos       errmsg = parse_Bitno16R (cd, strp, M32C_OPERAND_BITNO16R, (unsigned long *) (& fields->f_dsp_16_u8));
104075fd0b74Schristos       break;
104175fd0b74Schristos     case M32C_OPERAND_BITNO32PREFIXED :
104275fd0b74Schristos       errmsg = cgen_parse_unsigned_integer (cd, strp, M32C_OPERAND_BITNO32PREFIXED, (unsigned long *) (& fields->f_bitno32_prefixed));
104375fd0b74Schristos       break;
104475fd0b74Schristos     case M32C_OPERAND_BITNO32UNPREFIXED :
104575fd0b74Schristos       errmsg = cgen_parse_unsigned_integer (cd, strp, M32C_OPERAND_BITNO32UNPREFIXED, (unsigned long *) (& fields->f_bitno32_unprefixed));
104675fd0b74Schristos       break;
104775fd0b74Schristos     case M32C_OPERAND_DSP_10_U6 :
104875fd0b74Schristos       errmsg = parse_unsigned6 (cd, strp, M32C_OPERAND_DSP_10_U6, (unsigned long *) (& fields->f_dsp_10_u6));
104975fd0b74Schristos       break;
105075fd0b74Schristos     case M32C_OPERAND_DSP_16_S16 :
105175fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_16_S16, (long *) (& fields->f_dsp_16_s16));
105275fd0b74Schristos       break;
105375fd0b74Schristos     case M32C_OPERAND_DSP_16_S8 :
105475fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_16_S8, (long *) (& fields->f_dsp_16_s8));
105575fd0b74Schristos       break;
105675fd0b74Schristos     case M32C_OPERAND_DSP_16_U16 :
105775fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_16_U16, (unsigned long *) (& fields->f_dsp_16_u16));
105875fd0b74Schristos       break;
105975fd0b74Schristos     case M32C_OPERAND_DSP_16_U20 :
106075fd0b74Schristos       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_16_U20, (unsigned long *) (& fields->f_dsp_16_u24));
106175fd0b74Schristos       break;
106275fd0b74Schristos     case M32C_OPERAND_DSP_16_U24 :
106375fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_16_U24, (unsigned long *) (& fields->f_dsp_16_u24));
106475fd0b74Schristos       break;
106575fd0b74Schristos     case M32C_OPERAND_DSP_16_U8 :
106675fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_16_U8, (unsigned long *) (& fields->f_dsp_16_u8));
106775fd0b74Schristos       break;
106875fd0b74Schristos     case M32C_OPERAND_DSP_24_S16 :
106975fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_24_S16, (long *) (& fields->f_dsp_24_s16));
107075fd0b74Schristos       break;
107175fd0b74Schristos     case M32C_OPERAND_DSP_24_S8 :
107275fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_24_S8, (long *) (& fields->f_dsp_24_s8));
107375fd0b74Schristos       break;
107475fd0b74Schristos     case M32C_OPERAND_DSP_24_U16 :
107575fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_24_U16, (unsigned long *) (& fields->f_dsp_24_u16));
107675fd0b74Schristos       break;
107775fd0b74Schristos     case M32C_OPERAND_DSP_24_U20 :
107875fd0b74Schristos       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_24_U20, (unsigned long *) (& fields->f_dsp_24_u24));
107975fd0b74Schristos       break;
108075fd0b74Schristos     case M32C_OPERAND_DSP_24_U24 :
108175fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_24_U24, (unsigned long *) (& fields->f_dsp_24_u24));
108275fd0b74Schristos       break;
108375fd0b74Schristos     case M32C_OPERAND_DSP_24_U8 :
108475fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_24_U8, (unsigned long *) (& fields->f_dsp_24_u8));
108575fd0b74Schristos       break;
108675fd0b74Schristos     case M32C_OPERAND_DSP_32_S16 :
108775fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_32_S16, (long *) (& fields->f_dsp_32_s16));
108875fd0b74Schristos       break;
108975fd0b74Schristos     case M32C_OPERAND_DSP_32_S8 :
109075fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_32_S8, (long *) (& fields->f_dsp_32_s8));
109175fd0b74Schristos       break;
109275fd0b74Schristos     case M32C_OPERAND_DSP_32_U16 :
109375fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_32_U16, (unsigned long *) (& fields->f_dsp_32_u16));
109475fd0b74Schristos       break;
109575fd0b74Schristos     case M32C_OPERAND_DSP_32_U20 :
109675fd0b74Schristos       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_32_U20, (unsigned long *) (& fields->f_dsp_32_u24));
109775fd0b74Schristos       break;
109875fd0b74Schristos     case M32C_OPERAND_DSP_32_U24 :
109975fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_32_U24, (unsigned long *) (& fields->f_dsp_32_u24));
110075fd0b74Schristos       break;
110175fd0b74Schristos     case M32C_OPERAND_DSP_32_U8 :
110275fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_32_U8, (unsigned long *) (& fields->f_dsp_32_u8));
110375fd0b74Schristos       break;
110475fd0b74Schristos     case M32C_OPERAND_DSP_40_S16 :
110575fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_40_S16, (long *) (& fields->f_dsp_40_s16));
110675fd0b74Schristos       break;
110775fd0b74Schristos     case M32C_OPERAND_DSP_40_S8 :
110875fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_40_S8, (long *) (& fields->f_dsp_40_s8));
110975fd0b74Schristos       break;
111075fd0b74Schristos     case M32C_OPERAND_DSP_40_U16 :
111175fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_40_U16, (unsigned long *) (& fields->f_dsp_40_u16));
111275fd0b74Schristos       break;
111375fd0b74Schristos     case M32C_OPERAND_DSP_40_U20 :
111475fd0b74Schristos       errmsg = parse_unsigned20 (cd, strp, M32C_OPERAND_DSP_40_U20, (unsigned long *) (& fields->f_dsp_40_u20));
111575fd0b74Schristos       break;
111675fd0b74Schristos     case M32C_OPERAND_DSP_40_U24 :
111775fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_40_U24, (unsigned long *) (& fields->f_dsp_40_u24));
111875fd0b74Schristos       break;
111975fd0b74Schristos     case M32C_OPERAND_DSP_40_U8 :
112075fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_40_U8, (unsigned long *) (& fields->f_dsp_40_u8));
112175fd0b74Schristos       break;
112275fd0b74Schristos     case M32C_OPERAND_DSP_48_S16 :
112375fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_DSP_48_S16, (long *) (& fields->f_dsp_48_s16));
112475fd0b74Schristos       break;
112575fd0b74Schristos     case M32C_OPERAND_DSP_48_S8 :
112675fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_48_S8, (long *) (& fields->f_dsp_48_s8));
112775fd0b74Schristos       break;
112875fd0b74Schristos     case M32C_OPERAND_DSP_48_U16 :
112975fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_48_U16, (unsigned long *) (& fields->f_dsp_48_u16));
113075fd0b74Schristos       break;
113175fd0b74Schristos     case M32C_OPERAND_DSP_48_U20 :
113275fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_48_U20, (unsigned long *) (& fields->f_dsp_48_u20));
113375fd0b74Schristos       break;
113475fd0b74Schristos     case M32C_OPERAND_DSP_48_U24 :
113575fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_48_U24, (unsigned long *) (& fields->f_dsp_48_u24));
113675fd0b74Schristos       break;
113775fd0b74Schristos     case M32C_OPERAND_DSP_48_U8 :
113875fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_48_U8, (unsigned long *) (& fields->f_dsp_48_u8));
113975fd0b74Schristos       break;
114075fd0b74Schristos     case M32C_OPERAND_DSP_8_S24 :
114175fd0b74Schristos       errmsg = parse_signed24 (cd, strp, M32C_OPERAND_DSP_8_S24, (long *) (& fields->f_dsp_8_s24));
114275fd0b74Schristos       break;
114375fd0b74Schristos     case M32C_OPERAND_DSP_8_S8 :
114475fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_DSP_8_S8, (long *) (& fields->f_dsp_8_s8));
114575fd0b74Schristos       break;
114675fd0b74Schristos     case M32C_OPERAND_DSP_8_U16 :
114775fd0b74Schristos       errmsg = parse_unsigned16 (cd, strp, M32C_OPERAND_DSP_8_U16, (unsigned long *) (& fields->f_dsp_8_u16));
114875fd0b74Schristos       break;
114975fd0b74Schristos     case M32C_OPERAND_DSP_8_U24 :
115075fd0b74Schristos       errmsg = parse_unsigned24 (cd, strp, M32C_OPERAND_DSP_8_U24, (unsigned long *) (& fields->f_dsp_8_u24));
115175fd0b74Schristos       break;
115275fd0b74Schristos     case M32C_OPERAND_DSP_8_U6 :
115375fd0b74Schristos       errmsg = parse_unsigned6 (cd, strp, M32C_OPERAND_DSP_8_U6, (unsigned long *) (& fields->f_dsp_8_u6));
115475fd0b74Schristos       break;
115575fd0b74Schristos     case M32C_OPERAND_DSP_8_U8 :
115675fd0b74Schristos       errmsg = parse_unsigned8 (cd, strp, M32C_OPERAND_DSP_8_U8, (unsigned long *) (& fields->f_dsp_8_u8));
115775fd0b74Schristos       break;
115875fd0b74Schristos     case M32C_OPERAND_DST16AN :
115975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst16_an);
116075fd0b74Schristos       break;
116175fd0b74Schristos     case M32C_OPERAND_DST16AN_S :
116275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst16_an_s);
116375fd0b74Schristos       break;
116475fd0b74Schristos     case M32C_OPERAND_DST16ANHI :
116575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst16_an);
116675fd0b74Schristos       break;
116775fd0b74Schristos     case M32C_OPERAND_DST16ANQI :
116875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst16_an);
116975fd0b74Schristos       break;
117075fd0b74Schristos     case M32C_OPERAND_DST16ANQI_S :
117175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst16_rn_QI_s);
117275fd0b74Schristos       break;
117375fd0b74Schristos     case M32C_OPERAND_DST16ANSI :
117475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_SI, & fields->f_dst16_an);
117575fd0b74Schristos       break;
117675fd0b74Schristos     case M32C_OPERAND_DST16RNEXTQI :
117775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_QI, & fields->f_dst16_rn_ext);
117875fd0b74Schristos       break;
117975fd0b74Schristos     case M32C_OPERAND_DST16RNHI :
118075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst16_rn);
118175fd0b74Schristos       break;
118275fd0b74Schristos     case M32C_OPERAND_DST16RNQI :
118375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst16_rn);
118475fd0b74Schristos       break;
118575fd0b74Schristos     case M32C_OPERAND_DST16RNQI_S :
118675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l_r0h, & fields->f_dst16_rn_QI_s);
118775fd0b74Schristos       break;
118875fd0b74Schristos     case M32C_OPERAND_DST16RNSI :
118975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst16_rn);
119075fd0b74Schristos       break;
119175fd0b74Schristos     case M32C_OPERAND_DST32ANEXTUNPREFIXED :
119275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
119375fd0b74Schristos       break;
119475fd0b74Schristos     case M32C_OPERAND_DST32ANPREFIXED :
119575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
119675fd0b74Schristos       break;
119775fd0b74Schristos     case M32C_OPERAND_DST32ANPREFIXEDHI :
119875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst32_an_prefixed);
119975fd0b74Schristos       break;
120075fd0b74Schristos     case M32C_OPERAND_DST32ANPREFIXEDQI :
120175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst32_an_prefixed);
120275fd0b74Schristos       break;
120375fd0b74Schristos     case M32C_OPERAND_DST32ANPREFIXEDSI :
120475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_prefixed);
120575fd0b74Schristos       break;
120675fd0b74Schristos     case M32C_OPERAND_DST32ANUNPREFIXED :
120775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
120875fd0b74Schristos       break;
120975fd0b74Schristos     case M32C_OPERAND_DST32ANUNPREFIXEDHI :
121075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_dst32_an_unprefixed);
121175fd0b74Schristos       break;
121275fd0b74Schristos     case M32C_OPERAND_DST32ANUNPREFIXEDQI :
121375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_dst32_an_unprefixed);
121475fd0b74Schristos       break;
121575fd0b74Schristos     case M32C_OPERAND_DST32ANUNPREFIXEDSI :
121675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_dst32_an_unprefixed);
121775fd0b74Schristos       break;
121875fd0b74Schristos     case M32C_OPERAND_DST32R0HI_S :
121975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0, & junk);
122075fd0b74Schristos       break;
122175fd0b74Schristos     case M32C_OPERAND_DST32R0QI_S :
122275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l, & junk);
122375fd0b74Schristos       break;
122475fd0b74Schristos     case M32C_OPERAND_DST32RNEXTUNPREFIXEDHI :
122575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_HI, & fields->f_dst32_rn_ext_unprefixed);
122675fd0b74Schristos       break;
122775fd0b74Schristos     case M32C_OPERAND_DST32RNEXTUNPREFIXEDQI :
122875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_ext_QI, & fields->f_dst32_rn_ext_unprefixed);
122975fd0b74Schristos       break;
123075fd0b74Schristos     case M32C_OPERAND_DST32RNPREFIXEDHI :
123175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst32_rn_prefixed_HI);
123275fd0b74Schristos       break;
123375fd0b74Schristos     case M32C_OPERAND_DST32RNPREFIXEDQI :
123475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_prefixed_QI);
123575fd0b74Schristos       break;
123675fd0b74Schristos     case M32C_OPERAND_DST32RNPREFIXEDSI :
123775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst32_rn_prefixed_SI);
123875fd0b74Schristos       break;
123975fd0b74Schristos     case M32C_OPERAND_DST32RNUNPREFIXEDHI :
124075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_dst32_rn_unprefixed_HI);
124175fd0b74Schristos       break;
124275fd0b74Schristos     case M32C_OPERAND_DST32RNUNPREFIXEDQI :
124375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_dst32_rn_unprefixed_QI);
124475fd0b74Schristos       break;
124575fd0b74Schristos     case M32C_OPERAND_DST32RNUNPREFIXEDSI :
124675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_dst32_rn_unprefixed_SI);
124775fd0b74Schristos       break;
124875fd0b74Schristos     case M32C_OPERAND_G :
124975fd0b74Schristos       errmsg = parse_G (cd, strp, M32C_OPERAND_G, (long *) (& junk));
125075fd0b74Schristos       break;
125175fd0b74Schristos     case M32C_OPERAND_IMM_12_S4 :
125275fd0b74Schristos       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_12_S4, (long *) (& fields->f_imm_12_s4));
125375fd0b74Schristos       break;
125475fd0b74Schristos     case M32C_OPERAND_IMM_12_S4N :
125575fd0b74Schristos       errmsg = parse_signed4n (cd, strp, M32C_OPERAND_IMM_12_S4N, (long *) (& fields->f_imm_12_s4));
125675fd0b74Schristos       break;
125775fd0b74Schristos     case M32C_OPERAND_IMM_13_U3 :
125875fd0b74Schristos       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_13_U3, (long *) (& fields->f_imm_13_u3));
125975fd0b74Schristos       break;
126075fd0b74Schristos     case M32C_OPERAND_IMM_16_HI :
126175fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_16_HI, (long *) (& fields->f_dsp_16_s16));
126275fd0b74Schristos       break;
126375fd0b74Schristos     case M32C_OPERAND_IMM_16_QI :
126475fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_16_QI, (long *) (& fields->f_dsp_16_s8));
126575fd0b74Schristos       break;
126675fd0b74Schristos     case M32C_OPERAND_IMM_16_SI :
126775fd0b74Schristos       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_16_SI, (long *) (& fields->f_dsp_16_s32));
126875fd0b74Schristos       break;
126975fd0b74Schristos     case M32C_OPERAND_IMM_20_S4 :
127075fd0b74Schristos       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_20_S4, (long *) (& fields->f_imm_20_s4));
127175fd0b74Schristos       break;
127275fd0b74Schristos     case M32C_OPERAND_IMM_24_HI :
127375fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_24_HI, (long *) (& fields->f_dsp_24_s16));
127475fd0b74Schristos       break;
127575fd0b74Schristos     case M32C_OPERAND_IMM_24_QI :
127675fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_24_QI, (long *) (& fields->f_dsp_24_s8));
127775fd0b74Schristos       break;
127875fd0b74Schristos     case M32C_OPERAND_IMM_24_SI :
127975fd0b74Schristos       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_24_SI, (long *) (& fields->f_dsp_24_s32));
128075fd0b74Schristos       break;
128175fd0b74Schristos     case M32C_OPERAND_IMM_32_HI :
128275fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_32_HI, (long *) (& fields->f_dsp_32_s16));
128375fd0b74Schristos       break;
128475fd0b74Schristos     case M32C_OPERAND_IMM_32_QI :
128575fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_32_QI, (long *) (& fields->f_dsp_32_s8));
128675fd0b74Schristos       break;
128775fd0b74Schristos     case M32C_OPERAND_IMM_32_SI :
128875fd0b74Schristos       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_32_SI, (long *) (& fields->f_dsp_32_s32));
128975fd0b74Schristos       break;
129075fd0b74Schristos     case M32C_OPERAND_IMM_40_HI :
129175fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_40_HI, (long *) (& fields->f_dsp_40_s16));
129275fd0b74Schristos       break;
129375fd0b74Schristos     case M32C_OPERAND_IMM_40_QI :
129475fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_40_QI, (long *) (& fields->f_dsp_40_s8));
129575fd0b74Schristos       break;
129675fd0b74Schristos     case M32C_OPERAND_IMM_40_SI :
129775fd0b74Schristos       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_40_SI, (long *) (& fields->f_dsp_40_s32));
129875fd0b74Schristos       break;
129975fd0b74Schristos     case M32C_OPERAND_IMM_48_HI :
130075fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_48_HI, (long *) (& fields->f_dsp_48_s16));
130175fd0b74Schristos       break;
130275fd0b74Schristos     case M32C_OPERAND_IMM_48_QI :
130375fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_48_QI, (long *) (& fields->f_dsp_48_s8));
130475fd0b74Schristos       break;
130575fd0b74Schristos     case M32C_OPERAND_IMM_48_SI :
130675fd0b74Schristos       errmsg = parse_signed32 (cd, strp, M32C_OPERAND_IMM_48_SI, (long *) (& fields->f_dsp_48_s32));
130775fd0b74Schristos       break;
130875fd0b74Schristos     case M32C_OPERAND_IMM_56_HI :
130975fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_56_HI, (long *) (& fields->f_dsp_56_s16));
131075fd0b74Schristos       break;
131175fd0b74Schristos     case M32C_OPERAND_IMM_56_QI :
131275fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_56_QI, (long *) (& fields->f_dsp_56_s8));
131375fd0b74Schristos       break;
131475fd0b74Schristos     case M32C_OPERAND_IMM_64_HI :
131575fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_64_HI, (long *) (& fields->f_dsp_64_s16));
131675fd0b74Schristos       break;
131775fd0b74Schristos     case M32C_OPERAND_IMM_8_HI :
131875fd0b74Schristos       errmsg = parse_signed16 (cd, strp, M32C_OPERAND_IMM_8_HI, (long *) (& fields->f_dsp_8_s16));
131975fd0b74Schristos       break;
132075fd0b74Schristos     case M32C_OPERAND_IMM_8_QI :
132175fd0b74Schristos       errmsg = parse_signed8 (cd, strp, M32C_OPERAND_IMM_8_QI, (long *) (& fields->f_dsp_8_s8));
132275fd0b74Schristos       break;
132375fd0b74Schristos     case M32C_OPERAND_IMM_8_S4 :
132475fd0b74Schristos       errmsg = parse_signed4 (cd, strp, M32C_OPERAND_IMM_8_S4, (long *) (& fields->f_imm_8_s4));
132575fd0b74Schristos       break;
132675fd0b74Schristos     case M32C_OPERAND_IMM_8_S4N :
132775fd0b74Schristos       errmsg = parse_signed4n (cd, strp, M32C_OPERAND_IMM_8_S4N, (long *) (& fields->f_imm_8_s4));
132875fd0b74Schristos       break;
132975fd0b74Schristos     case M32C_OPERAND_IMM_SH_12_S4 :
133075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_12_s4);
133175fd0b74Schristos       break;
133275fd0b74Schristos     case M32C_OPERAND_IMM_SH_20_S4 :
133375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_20_s4);
133475fd0b74Schristos       break;
133575fd0b74Schristos     case M32C_OPERAND_IMM_SH_8_S4 :
133675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_shimm, & fields->f_imm_8_s4);
133775fd0b74Schristos       break;
133875fd0b74Schristos     case M32C_OPERAND_IMM1_S :
133975fd0b74Schristos       errmsg = parse_imm1_S (cd, strp, M32C_OPERAND_IMM1_S, (long *) (& fields->f_imm1_S));
134075fd0b74Schristos       break;
134175fd0b74Schristos     case M32C_OPERAND_IMM3_S :
134275fd0b74Schristos       errmsg = parse_imm3_S (cd, strp, M32C_OPERAND_IMM3_S, (long *) (& fields->f_imm3_S));
134375fd0b74Schristos       break;
134475fd0b74Schristos     case M32C_OPERAND_LAB_16_8 :
134575fd0b74Schristos       {
134675fd0b74Schristos         bfd_vma value = 0;
134775fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_16_8, 0, NULL,  & value);
134875fd0b74Schristos         fields->f_lab_16_8 = value;
134975fd0b74Schristos       }
135075fd0b74Schristos       break;
135175fd0b74Schristos     case M32C_OPERAND_LAB_24_8 :
135275fd0b74Schristos       {
135375fd0b74Schristos         bfd_vma value = 0;
135475fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_24_8, 0, NULL,  & value);
135575fd0b74Schristos         fields->f_lab_24_8 = value;
135675fd0b74Schristos       }
135775fd0b74Schristos       break;
135875fd0b74Schristos     case M32C_OPERAND_LAB_32_8 :
135975fd0b74Schristos       {
136075fd0b74Schristos         bfd_vma value = 0;
136175fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_32_8, 0, NULL,  & value);
136275fd0b74Schristos         fields->f_lab_32_8 = value;
136375fd0b74Schristos       }
136475fd0b74Schristos       break;
136575fd0b74Schristos     case M32C_OPERAND_LAB_40_8 :
136675fd0b74Schristos       {
136775fd0b74Schristos         bfd_vma value = 0;
136875fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_40_8, 0, NULL,  & value);
136975fd0b74Schristos         fields->f_lab_40_8 = value;
137075fd0b74Schristos       }
137175fd0b74Schristos       break;
137275fd0b74Schristos     case M32C_OPERAND_LAB_5_3 :
137375fd0b74Schristos       {
137475fd0b74Schristos         bfd_vma value = 0;
137575fd0b74Schristos         errmsg = parse_lab_5_3 (cd, strp, M32C_OPERAND_LAB_5_3, 0, NULL,  & value);
137675fd0b74Schristos         fields->f_lab_5_3 = value;
137775fd0b74Schristos       }
137875fd0b74Schristos       break;
137975fd0b74Schristos     case M32C_OPERAND_LAB_8_16 :
138075fd0b74Schristos       {
138175fd0b74Schristos         bfd_vma value = 0;
138275fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_16, 0, NULL,  & value);
138375fd0b74Schristos         fields->f_lab_8_16 = value;
138475fd0b74Schristos       }
138575fd0b74Schristos       break;
138675fd0b74Schristos     case M32C_OPERAND_LAB_8_24 :
138775fd0b74Schristos       {
138875fd0b74Schristos         bfd_vma value = 0;
138975fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_24, 0, NULL,  & value);
139075fd0b74Schristos         fields->f_lab_8_24 = value;
139175fd0b74Schristos       }
139275fd0b74Schristos       break;
139375fd0b74Schristos     case M32C_OPERAND_LAB_8_8 :
139475fd0b74Schristos       {
139575fd0b74Schristos         bfd_vma value = 0;
139675fd0b74Schristos         errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_8_8, 0, NULL,  & value);
139775fd0b74Schristos         fields->f_lab_8_8 = value;
139875fd0b74Schristos       }
139975fd0b74Schristos       break;
140075fd0b74Schristos     case M32C_OPERAND_LAB32_JMP_S :
140175fd0b74Schristos       {
140275fd0b74Schristos         bfd_vma value = 0;
140375fd0b74Schristos         errmsg = parse_lab_5_3 (cd, strp, M32C_OPERAND_LAB32_JMP_S, 0, NULL,  & value);
140475fd0b74Schristos         fields->f_lab32_jmp_s = value;
140575fd0b74Schristos       }
140675fd0b74Schristos       break;
140775fd0b74Schristos     case M32C_OPERAND_Q :
140875fd0b74Schristos       errmsg = parse_Q (cd, strp, M32C_OPERAND_Q, (long *) (& junk));
140975fd0b74Schristos       break;
141075fd0b74Schristos     case M32C_OPERAND_R0 :
141175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0, & junk);
141275fd0b74Schristos       break;
141375fd0b74Schristos     case M32C_OPERAND_R0H :
141475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0h, & junk);
141575fd0b74Schristos       break;
141675fd0b74Schristos     case M32C_OPERAND_R0L :
141775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r0l, & junk);
141875fd0b74Schristos       break;
141975fd0b74Schristos     case M32C_OPERAND_R1 :
142075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r1, & junk);
142175fd0b74Schristos       break;
142275fd0b74Schristos     case M32C_OPERAND_R1R2R0 :
142375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r1r2r0, & junk);
142475fd0b74Schristos       break;
142575fd0b74Schristos     case M32C_OPERAND_R2 :
142675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r2, & junk);
142775fd0b74Schristos       break;
142875fd0b74Schristos     case M32C_OPERAND_R2R0 :
142975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r2r0, & junk);
143075fd0b74Schristos       break;
143175fd0b74Schristos     case M32C_OPERAND_R3 :
143275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r3, & junk);
143375fd0b74Schristos       break;
143475fd0b74Schristos     case M32C_OPERAND_R3R1 :
143575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_r3r1, & junk);
143675fd0b74Schristos       break;
143775fd0b74Schristos     case M32C_OPERAND_REGSETPOP :
143875fd0b74Schristos       errmsg = parse_pop_regset (cd, strp, M32C_OPERAND_REGSETPOP, (unsigned long *) (& fields->f_8_8));
143975fd0b74Schristos       break;
144075fd0b74Schristos     case M32C_OPERAND_REGSETPUSH :
144175fd0b74Schristos       errmsg = parse_push_regset (cd, strp, M32C_OPERAND_REGSETPUSH, (unsigned long *) (& fields->f_8_8));
144275fd0b74Schristos       break;
144375fd0b74Schristos     case M32C_OPERAND_RN16_PUSH_S :
144475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_4_1);
144575fd0b74Schristos       break;
144675fd0b74Schristos     case M32C_OPERAND_S :
144775fd0b74Schristos       errmsg = parse_S (cd, strp, M32C_OPERAND_S, (long *) (& junk));
144875fd0b74Schristos       break;
144975fd0b74Schristos     case M32C_OPERAND_SRC16AN :
145075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src16_an);
145175fd0b74Schristos       break;
145275fd0b74Schristos     case M32C_OPERAND_SRC16ANHI :
145375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src16_an);
145475fd0b74Schristos       break;
145575fd0b74Schristos     case M32C_OPERAND_SRC16ANQI :
145675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src16_an);
145775fd0b74Schristos       break;
145875fd0b74Schristos     case M32C_OPERAND_SRC16RNHI :
145975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src16_rn);
146075fd0b74Schristos       break;
146175fd0b74Schristos     case M32C_OPERAND_SRC16RNQI :
146275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src16_rn);
146375fd0b74Schristos       break;
146475fd0b74Schristos     case M32C_OPERAND_SRC32ANPREFIXED :
146575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_prefixed);
146675fd0b74Schristos       break;
146775fd0b74Schristos     case M32C_OPERAND_SRC32ANPREFIXEDHI :
146875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src32_an_prefixed);
146975fd0b74Schristos       break;
147075fd0b74Schristos     case M32C_OPERAND_SRC32ANPREFIXEDQI :
147175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src32_an_prefixed);
147275fd0b74Schristos       break;
147375fd0b74Schristos     case M32C_OPERAND_SRC32ANPREFIXEDSI :
147475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_prefixed);
147575fd0b74Schristos       break;
147675fd0b74Schristos     case M32C_OPERAND_SRC32ANUNPREFIXED :
147775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_unprefixed);
147875fd0b74Schristos       break;
147975fd0b74Schristos     case M32C_OPERAND_SRC32ANUNPREFIXEDHI :
148075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_HI, & fields->f_src32_an_unprefixed);
148175fd0b74Schristos       break;
148275fd0b74Schristos     case M32C_OPERAND_SRC32ANUNPREFIXEDQI :
148375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar_QI, & fields->f_src32_an_unprefixed);
148475fd0b74Schristos       break;
148575fd0b74Schristos     case M32C_OPERAND_SRC32ANUNPREFIXEDSI :
148675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_ar, & fields->f_src32_an_unprefixed);
148775fd0b74Schristos       break;
148875fd0b74Schristos     case M32C_OPERAND_SRC32RNPREFIXEDHI :
148975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src32_rn_prefixed_HI);
149075fd0b74Schristos       break;
149175fd0b74Schristos     case M32C_OPERAND_SRC32RNPREFIXEDQI :
149275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src32_rn_prefixed_QI);
149375fd0b74Schristos       break;
149475fd0b74Schristos     case M32C_OPERAND_SRC32RNPREFIXEDSI :
149575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_src32_rn_prefixed_SI);
149675fd0b74Schristos       break;
149775fd0b74Schristos     case M32C_OPERAND_SRC32RNUNPREFIXEDHI :
149875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_HI, & fields->f_src32_rn_unprefixed_HI);
149975fd0b74Schristos       break;
150075fd0b74Schristos     case M32C_OPERAND_SRC32RNUNPREFIXEDQI :
150175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_QI, & fields->f_src32_rn_unprefixed_QI);
150275fd0b74Schristos       break;
150375fd0b74Schristos     case M32C_OPERAND_SRC32RNUNPREFIXEDSI :
150475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_gr_SI, & fields->f_src32_rn_unprefixed_SI);
150575fd0b74Schristos       break;
150675fd0b74Schristos     case M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL :
150775fd0b74Schristos       errmsg = parse_r0l_r0h (cd, strp, M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL, (long *) (& fields->f_5_1));
150875fd0b74Schristos       break;
150975fd0b74Schristos     case M32C_OPERAND_X :
151075fd0b74Schristos       errmsg = parse_X (cd, strp, M32C_OPERAND_X, (long *) (& junk));
151175fd0b74Schristos       break;
151275fd0b74Schristos     case M32C_OPERAND_Z :
151375fd0b74Schristos       errmsg = parse_Z (cd, strp, M32C_OPERAND_Z, (long *) (& junk));
151475fd0b74Schristos       break;
151575fd0b74Schristos     case M32C_OPERAND_COND16_16 :
151675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_16_u8);
151775fd0b74Schristos       break;
151875fd0b74Schristos     case M32C_OPERAND_COND16_24 :
151975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_24_u8);
152075fd0b74Schristos       break;
152175fd0b74Schristos     case M32C_OPERAND_COND16_32 :
152275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16, & fields->f_dsp_32_u8);
152375fd0b74Schristos       break;
152475fd0b74Schristos     case M32C_OPERAND_COND16C :
152575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16c, & fields->f_cond16);
152675fd0b74Schristos       break;
152775fd0b74Schristos     case M32C_OPERAND_COND16J :
152875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16j, & fields->f_cond16);
152975fd0b74Schristos       break;
153075fd0b74Schristos     case M32C_OPERAND_COND16J5 :
153175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond16j_5, & fields->f_cond16j_5);
153275fd0b74Schristos       break;
153375fd0b74Schristos     case M32C_OPERAND_COND32 :
153475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond32);
153575fd0b74Schristos       break;
153675fd0b74Schristos     case M32C_OPERAND_COND32_16 :
153775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_16_u8);
153875fd0b74Schristos       break;
153975fd0b74Schristos     case M32C_OPERAND_COND32_24 :
154075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_24_u8);
154175fd0b74Schristos       break;
154275fd0b74Schristos     case M32C_OPERAND_COND32_32 :
154375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_32_u8);
154475fd0b74Schristos       break;
154575fd0b74Schristos     case M32C_OPERAND_COND32_40 :
154675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_dsp_40_u8);
154775fd0b74Schristos       break;
154875fd0b74Schristos     case M32C_OPERAND_COND32J :
154975fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond32j);
155075fd0b74Schristos       break;
155175fd0b74Schristos     case M32C_OPERAND_CR1_PREFIXED_32 :
155275fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr1_32, & fields->f_21_3);
155375fd0b74Schristos       break;
155475fd0b74Schristos     case M32C_OPERAND_CR1_UNPREFIXED_32 :
155575fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr1_32, & fields->f_13_3);
155675fd0b74Schristos       break;
155775fd0b74Schristos     case M32C_OPERAND_CR16 :
155875fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr_16, & fields->f_9_3);
155975fd0b74Schristos       break;
156075fd0b74Schristos     case M32C_OPERAND_CR2_32 :
156175fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr2_32, & fields->f_13_3);
156275fd0b74Schristos       break;
156375fd0b74Schristos     case M32C_OPERAND_CR3_PREFIXED_32 :
156475fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr3_32, & fields->f_21_3);
156575fd0b74Schristos       break;
156675fd0b74Schristos     case M32C_OPERAND_CR3_UNPREFIXED_32 :
156775fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cr3_32, & fields->f_13_3);
156875fd0b74Schristos       break;
156975fd0b74Schristos     case M32C_OPERAND_FLAGS16 :
157075fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_flags, & fields->f_9_3);
157175fd0b74Schristos       break;
157275fd0b74Schristos     case M32C_OPERAND_FLAGS32 :
157375fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_flags, & fields->f_13_3);
157475fd0b74Schristos       break;
157575fd0b74Schristos     case M32C_OPERAND_SCCOND32 :
157675fd0b74Schristos       errmsg = cgen_parse_keyword (cd, strp, & m32c_cgen_opval_h_cond32, & fields->f_cond16);
157775fd0b74Schristos       break;
157875fd0b74Schristos     case M32C_OPERAND_SIZE :
157975fd0b74Schristos       errmsg = parse_size (cd, strp, M32C_OPERAND_SIZE, (long *) (& junk));
158075fd0b74Schristos       break;
158175fd0b74Schristos 
158275fd0b74Schristos     default :
158375fd0b74Schristos       /* xgettext:c-format */
1584ede78133Schristos       opcodes_error_handler
1585ede78133Schristos 	(_("internal error: unrecognized field %d while parsing"),
1586ede78133Schristos 	 opindex);
158775fd0b74Schristos       abort ();
158875fd0b74Schristos   }
158975fd0b74Schristos 
159075fd0b74Schristos   return errmsg;
159175fd0b74Schristos }
159275fd0b74Schristos 
159375fd0b74Schristos cgen_parse_fn * const m32c_cgen_parse_handlers[] =
159475fd0b74Schristos {
159575fd0b74Schristos   parse_insn_normal,
159675fd0b74Schristos };
159775fd0b74Schristos 
159875fd0b74Schristos void
m32c_cgen_init_asm(CGEN_CPU_DESC cd)159975fd0b74Schristos m32c_cgen_init_asm (CGEN_CPU_DESC cd)
160075fd0b74Schristos {
160175fd0b74Schristos   m32c_cgen_init_opcode_table (cd);
160275fd0b74Schristos   m32c_cgen_init_ibld_table (cd);
160375fd0b74Schristos   cd->parse_handlers = & m32c_cgen_parse_handlers[0];
160475fd0b74Schristos   cd->parse_operand = m32c_cgen_parse_operand;
160575fd0b74Schristos #ifdef CGEN_ASM_INIT_HOOK
160675fd0b74Schristos CGEN_ASM_INIT_HOOK
160775fd0b74Schristos #endif
160875fd0b74Schristos }
160975fd0b74Schristos 
161075fd0b74Schristos 
161175fd0b74Schristos 
161275fd0b74Schristos /* Regex construction routine.
161375fd0b74Schristos 
161475fd0b74Schristos    This translates an opcode syntax string into a regex string,
161575fd0b74Schristos    by replacing any non-character syntax element (such as an
161675fd0b74Schristos    opcode) with the pattern '.*'
161775fd0b74Schristos 
161875fd0b74Schristos    It then compiles the regex and stores it in the opcode, for
161975fd0b74Schristos    later use by m32c_cgen_assemble_insn
162075fd0b74Schristos 
162175fd0b74Schristos    Returns NULL for success, an error message for failure.  */
162275fd0b74Schristos 
162375fd0b74Schristos char *
m32c_cgen_build_insn_regex(CGEN_INSN * insn)162475fd0b74Schristos m32c_cgen_build_insn_regex (CGEN_INSN *insn)
162575fd0b74Schristos {
162675fd0b74Schristos   CGEN_OPCODE *opc = (CGEN_OPCODE *) CGEN_INSN_OPCODE (insn);
162775fd0b74Schristos   const char *mnem = CGEN_INSN_MNEMONIC (insn);
162875fd0b74Schristos   char rxbuf[CGEN_MAX_RX_ELEMENTS];
162975fd0b74Schristos   char *rx = rxbuf;
163075fd0b74Schristos   const CGEN_SYNTAX_CHAR_TYPE *syn;
163175fd0b74Schristos   int reg_err;
163275fd0b74Schristos 
163375fd0b74Schristos   syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
163475fd0b74Schristos 
163575fd0b74Schristos   /* Mnemonics come first in the syntax string.  */
163675fd0b74Schristos   if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
163775fd0b74Schristos     return _("missing mnemonic in syntax string");
163875fd0b74Schristos   ++syn;
163975fd0b74Schristos 
164075fd0b74Schristos   /* Generate a case sensitive regular expression that emulates case
164175fd0b74Schristos      insensitive matching in the "C" locale.  We cannot generate a case
164275fd0b74Schristos      insensitive regular expression because in Turkish locales, 'i' and 'I'
164375fd0b74Schristos      are not equal modulo case conversion.  */
164475fd0b74Schristos 
164575fd0b74Schristos   /* Copy the literal mnemonic out of the insn.  */
164675fd0b74Schristos   for (; *mnem; mnem++)
164775fd0b74Schristos     {
164875fd0b74Schristos       char c = *mnem;
164975fd0b74Schristos 
165075fd0b74Schristos       if (ISALPHA (c))
165175fd0b74Schristos 	{
165275fd0b74Schristos 	  *rx++ = '[';
165375fd0b74Schristos 	  *rx++ = TOLOWER (c);
165475fd0b74Schristos 	  *rx++ = TOUPPER (c);
165575fd0b74Schristos 	  *rx++ = ']';
165675fd0b74Schristos 	}
165775fd0b74Schristos       else
165875fd0b74Schristos 	*rx++ = c;
165975fd0b74Schristos     }
166075fd0b74Schristos 
166175fd0b74Schristos   /* Copy any remaining literals from the syntax string into the rx.  */
166275fd0b74Schristos   for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
166375fd0b74Schristos     {
166475fd0b74Schristos       if (CGEN_SYNTAX_CHAR_P (* syn))
166575fd0b74Schristos 	{
166675fd0b74Schristos 	  char c = CGEN_SYNTAX_CHAR (* syn);
166775fd0b74Schristos 
166875fd0b74Schristos 	  switch (c)
166975fd0b74Schristos 	    {
167075fd0b74Schristos 	      /* Escape any regex metacharacters in the syntax.  */
167175fd0b74Schristos 	    case '.': case '[': case '\\':
167275fd0b74Schristos 	    case '*': case '^': case '$':
167375fd0b74Schristos 
167475fd0b74Schristos #ifdef CGEN_ESCAPE_EXTENDED_REGEX
167575fd0b74Schristos 	    case '?': case '{': case '}':
167675fd0b74Schristos 	    case '(': case ')': case '*':
167775fd0b74Schristos 	    case '|': case '+': case ']':
167875fd0b74Schristos #endif
167975fd0b74Schristos 	      *rx++ = '\\';
168075fd0b74Schristos 	      *rx++ = c;
168175fd0b74Schristos 	      break;
168275fd0b74Schristos 
168375fd0b74Schristos 	    default:
168475fd0b74Schristos 	      if (ISALPHA (c))
168575fd0b74Schristos 		{
168675fd0b74Schristos 		  *rx++ = '[';
168775fd0b74Schristos 		  *rx++ = TOLOWER (c);
168875fd0b74Schristos 		  *rx++ = TOUPPER (c);
168975fd0b74Schristos 		  *rx++ = ']';
169075fd0b74Schristos 		}
169175fd0b74Schristos 	      else
169275fd0b74Schristos 		*rx++ = c;
169375fd0b74Schristos 	      break;
169475fd0b74Schristos 	    }
169575fd0b74Schristos 	}
169675fd0b74Schristos       else
169775fd0b74Schristos 	{
169875fd0b74Schristos 	  /* Replace non-syntax fields with globs.  */
169975fd0b74Schristos 	  *rx++ = '.';
170075fd0b74Schristos 	  *rx++ = '*';
170175fd0b74Schristos 	}
170275fd0b74Schristos     }
170375fd0b74Schristos 
170475fd0b74Schristos   /* Trailing whitespace ok.  */
170575fd0b74Schristos   * rx++ = '[';
170675fd0b74Schristos   * rx++ = ' ';
170775fd0b74Schristos   * rx++ = '\t';
170875fd0b74Schristos   * rx++ = ']';
170975fd0b74Schristos   * rx++ = '*';
171075fd0b74Schristos 
171175fd0b74Schristos   /* But anchor it after that.  */
171275fd0b74Schristos   * rx++ = '$';
171375fd0b74Schristos   * rx = '\0';
171475fd0b74Schristos 
171575fd0b74Schristos   CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
171675fd0b74Schristos   reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
171775fd0b74Schristos 
171875fd0b74Schristos   if (reg_err == 0)
171975fd0b74Schristos     return NULL;
172075fd0b74Schristos   else
172175fd0b74Schristos     {
172275fd0b74Schristos       static char msg[80];
172375fd0b74Schristos 
172475fd0b74Schristos       regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
172575fd0b74Schristos       regfree ((regex_t *) CGEN_INSN_RX (insn));
172675fd0b74Schristos       free (CGEN_INSN_RX (insn));
172775fd0b74Schristos       (CGEN_INSN_RX (insn)) = NULL;
172875fd0b74Schristos       return msg;
172975fd0b74Schristos     }
173075fd0b74Schristos }
173175fd0b74Schristos 
173275fd0b74Schristos 
173375fd0b74Schristos /* Default insn parser.
173475fd0b74Schristos 
173575fd0b74Schristos    The syntax string is scanned and operands are parsed and stored in FIELDS.
173675fd0b74Schristos    Relocs are queued as we go via other callbacks.
173775fd0b74Schristos 
173875fd0b74Schristos    ??? Note that this is currently an all-or-nothing parser.  If we fail to
173975fd0b74Schristos    parse the instruction, we return 0 and the caller will start over from
174075fd0b74Schristos    the beginning.  Backtracking will be necessary in parsing subexpressions,
174175fd0b74Schristos    but that can be handled there.  Not handling backtracking here may get
174275fd0b74Schristos    expensive in the case of the m68k.  Deal with later.
174375fd0b74Schristos 
174475fd0b74Schristos    Returns NULL for success, an error message for failure.  */
174575fd0b74Schristos 
174675fd0b74Schristos static const char *
parse_insn_normal(CGEN_CPU_DESC cd,const CGEN_INSN * insn,const char ** strp,CGEN_FIELDS * fields)174775fd0b74Schristos parse_insn_normal (CGEN_CPU_DESC cd,
174875fd0b74Schristos 		   const CGEN_INSN *insn,
174975fd0b74Schristos 		   const char **strp,
175075fd0b74Schristos 		   CGEN_FIELDS *fields)
175175fd0b74Schristos {
175275fd0b74Schristos   /* ??? Runtime added insns not handled yet.  */
175375fd0b74Schristos   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
175475fd0b74Schristos   const char *str = *strp;
175575fd0b74Schristos   const char *errmsg;
175675fd0b74Schristos   const char *p;
175775fd0b74Schristos   const CGEN_SYNTAX_CHAR_TYPE * syn;
175875fd0b74Schristos #ifdef CGEN_MNEMONIC_OPERANDS
175975fd0b74Schristos   /* FIXME: wip */
176075fd0b74Schristos   int past_opcode_p;
176175fd0b74Schristos #endif
176275fd0b74Schristos 
176375fd0b74Schristos   /* For now we assume the mnemonic is first (there are no leading operands).
176475fd0b74Schristos      We can parse it without needing to set up operand parsing.
176575fd0b74Schristos      GAS's input scrubber will ensure mnemonics are lowercase, but we may
176675fd0b74Schristos      not be called from GAS.  */
176775fd0b74Schristos   p = CGEN_INSN_MNEMONIC (insn);
176875fd0b74Schristos   while (*p && TOLOWER (*p) == TOLOWER (*str))
176975fd0b74Schristos     ++p, ++str;
177075fd0b74Schristos 
177175fd0b74Schristos   if (* p)
177275fd0b74Schristos     return _("unrecognized instruction");
177375fd0b74Schristos 
177475fd0b74Schristos #ifndef CGEN_MNEMONIC_OPERANDS
177575fd0b74Schristos   if (* str && ! ISSPACE (* str))
177675fd0b74Schristos     return _("unrecognized instruction");
177775fd0b74Schristos #endif
177875fd0b74Schristos 
177975fd0b74Schristos   CGEN_INIT_PARSE (cd);
178075fd0b74Schristos   cgen_init_parse_operand (cd);
178175fd0b74Schristos #ifdef CGEN_MNEMONIC_OPERANDS
178275fd0b74Schristos   past_opcode_p = 0;
178375fd0b74Schristos #endif
178475fd0b74Schristos 
178575fd0b74Schristos   /* We don't check for (*str != '\0') here because we want to parse
178675fd0b74Schristos      any trailing fake arguments in the syntax string.  */
178775fd0b74Schristos   syn = CGEN_SYNTAX_STRING (syntax);
178875fd0b74Schristos 
178975fd0b74Schristos   /* Mnemonics come first for now, ensure valid string.  */
179075fd0b74Schristos   if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
179175fd0b74Schristos     abort ();
179275fd0b74Schristos 
179375fd0b74Schristos   ++syn;
179475fd0b74Schristos 
179575fd0b74Schristos   while (* syn != 0)
179675fd0b74Schristos     {
179775fd0b74Schristos       /* Non operand chars must match exactly.  */
179875fd0b74Schristos       if (CGEN_SYNTAX_CHAR_P (* syn))
179975fd0b74Schristos 	{
180075fd0b74Schristos 	  /* FIXME: While we allow for non-GAS callers above, we assume the
180175fd0b74Schristos 	     first char after the mnemonic part is a space.  */
180275fd0b74Schristos 	  /* FIXME: We also take inappropriate advantage of the fact that
180375fd0b74Schristos 	     GAS's input scrubber will remove extraneous blanks.  */
180475fd0b74Schristos 	  if (TOLOWER (*str) == TOLOWER (CGEN_SYNTAX_CHAR (* syn)))
180575fd0b74Schristos 	    {
180675fd0b74Schristos #ifdef CGEN_MNEMONIC_OPERANDS
180775fd0b74Schristos 	      if (CGEN_SYNTAX_CHAR(* syn) == ' ')
180875fd0b74Schristos 		past_opcode_p = 1;
180975fd0b74Schristos #endif
181075fd0b74Schristos 	      ++ syn;
181175fd0b74Schristos 	      ++ str;
181275fd0b74Schristos 	    }
181375fd0b74Schristos 	  else if (*str)
181475fd0b74Schristos 	    {
181575fd0b74Schristos 	      /* Syntax char didn't match.  Can't be this insn.  */
181675fd0b74Schristos 	      static char msg [80];
181775fd0b74Schristos 
181875fd0b74Schristos 	      /* xgettext:c-format */
181975fd0b74Schristos 	      sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
182075fd0b74Schristos 		       CGEN_SYNTAX_CHAR(*syn), *str);
182175fd0b74Schristos 	      return msg;
182275fd0b74Schristos 	    }
182375fd0b74Schristos 	  else
182475fd0b74Schristos 	    {
182575fd0b74Schristos 	      /* Ran out of input.  */
182675fd0b74Schristos 	      static char msg [80];
182775fd0b74Schristos 
182875fd0b74Schristos 	      /* xgettext:c-format */
182975fd0b74Schristos 	      sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
183075fd0b74Schristos 		       CGEN_SYNTAX_CHAR(*syn));
183175fd0b74Schristos 	      return msg;
183275fd0b74Schristos 	    }
183375fd0b74Schristos 	  continue;
183475fd0b74Schristos 	}
183575fd0b74Schristos 
183675fd0b74Schristos #ifdef CGEN_MNEMONIC_OPERANDS
183775fd0b74Schristos       (void) past_opcode_p;
183875fd0b74Schristos #endif
183975fd0b74Schristos       /* We have an operand of some sort.  */
184075fd0b74Schristos       errmsg = cd->parse_operand (cd, CGEN_SYNTAX_FIELD (*syn), &str, fields);
184175fd0b74Schristos       if (errmsg)
184275fd0b74Schristos 	return errmsg;
184375fd0b74Schristos 
184475fd0b74Schristos       /* Done with this operand, continue with next one.  */
184575fd0b74Schristos       ++ syn;
184675fd0b74Schristos     }
184775fd0b74Schristos 
184875fd0b74Schristos   /* If we're at the end of the syntax string, we're done.  */
184975fd0b74Schristos   if (* syn == 0)
185075fd0b74Schristos     {
185175fd0b74Schristos       /* FIXME: For the moment we assume a valid `str' can only contain
185275fd0b74Schristos 	 blanks now.  IE: We needn't try again with a longer version of
185375fd0b74Schristos 	 the insn and it is assumed that longer versions of insns appear
185475fd0b74Schristos 	 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
185575fd0b74Schristos       while (ISSPACE (* str))
185675fd0b74Schristos 	++ str;
185775fd0b74Schristos 
185875fd0b74Schristos       if (* str != '\0')
185975fd0b74Schristos 	return _("junk at end of line"); /* FIXME: would like to include `str' */
186075fd0b74Schristos 
186175fd0b74Schristos       return NULL;
186275fd0b74Schristos     }
186375fd0b74Schristos 
186475fd0b74Schristos   /* We couldn't parse it.  */
186575fd0b74Schristos   return _("unrecognized instruction");
186675fd0b74Schristos }
186775fd0b74Schristos 
186875fd0b74Schristos /* Main entry point.
186975fd0b74Schristos    This routine is called for each instruction to be assembled.
187075fd0b74Schristos    STR points to the insn to be assembled.
187175fd0b74Schristos    We assume all necessary tables have been initialized.
187275fd0b74Schristos    The assembled instruction, less any fixups, is stored in BUF.
187375fd0b74Schristos    Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
187475fd0b74Schristos    still needs to be converted to target byte order, otherwise BUF is an array
187575fd0b74Schristos    of bytes in target byte order.
187675fd0b74Schristos    The result is a pointer to the insn's entry in the opcode table,
187775fd0b74Schristos    or NULL if an error occured (an error message will have already been
187875fd0b74Schristos    printed).
187975fd0b74Schristos 
188075fd0b74Schristos    Note that when processing (non-alias) macro-insns,
188175fd0b74Schristos    this function recurses.
188275fd0b74Schristos 
188375fd0b74Schristos    ??? It's possible to make this cpu-independent.
188475fd0b74Schristos    One would have to deal with a few minor things.
188575fd0b74Schristos    At this point in time doing so would be more of a curiosity than useful
188675fd0b74Schristos    [for example this file isn't _that_ big], but keeping the possibility in
188775fd0b74Schristos    mind helps keep the design clean.  */
188875fd0b74Schristos 
188975fd0b74Schristos const CGEN_INSN *
m32c_cgen_assemble_insn(CGEN_CPU_DESC cd,const char * str,CGEN_FIELDS * fields,CGEN_INSN_BYTES_PTR buf,char ** errmsg)189075fd0b74Schristos m32c_cgen_assemble_insn (CGEN_CPU_DESC cd,
189175fd0b74Schristos 			   const char *str,
189275fd0b74Schristos 			   CGEN_FIELDS *fields,
189375fd0b74Schristos 			   CGEN_INSN_BYTES_PTR buf,
189475fd0b74Schristos 			   char **errmsg)
189575fd0b74Schristos {
189675fd0b74Schristos   const char *start;
189775fd0b74Schristos   CGEN_INSN_LIST *ilist;
189875fd0b74Schristos   const char *parse_errmsg = NULL;
189975fd0b74Schristos   const char *insert_errmsg = NULL;
190075fd0b74Schristos   int recognized_mnemonic = 0;
190175fd0b74Schristos 
190275fd0b74Schristos   /* Skip leading white space.  */
190375fd0b74Schristos   while (ISSPACE (* str))
190475fd0b74Schristos     ++ str;
190575fd0b74Schristos 
190675fd0b74Schristos   /* The instructions are stored in hashed lists.
190775fd0b74Schristos      Get the first in the list.  */
190875fd0b74Schristos   ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
190975fd0b74Schristos 
191075fd0b74Schristos   /* Keep looking until we find a match.  */
191175fd0b74Schristos   start = str;
191275fd0b74Schristos   for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
191375fd0b74Schristos     {
191475fd0b74Schristos       const CGEN_INSN *insn = ilist->insn;
191575fd0b74Schristos       recognized_mnemonic = 1;
191675fd0b74Schristos 
191775fd0b74Schristos #ifdef CGEN_VALIDATE_INSN_SUPPORTED
191875fd0b74Schristos       /* Not usually needed as unsupported opcodes
191975fd0b74Schristos 	 shouldn't be in the hash lists.  */
192075fd0b74Schristos       /* Is this insn supported by the selected cpu?  */
192175fd0b74Schristos       if (! m32c_cgen_insn_supported (cd, insn))
192275fd0b74Schristos 	continue;
192375fd0b74Schristos #endif
192475fd0b74Schristos       /* If the RELAXED attribute is set, this is an insn that shouldn't be
192575fd0b74Schristos 	 chosen immediately.  Instead, it is used during assembler/linker
192675fd0b74Schristos 	 relaxation if possible.  */
192775fd0b74Schristos       if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED) != 0)
192875fd0b74Schristos 	continue;
192975fd0b74Schristos 
193075fd0b74Schristos       str = start;
193175fd0b74Schristos 
193275fd0b74Schristos       /* Skip this insn if str doesn't look right lexically.  */
193375fd0b74Schristos       if (CGEN_INSN_RX (insn) != NULL &&
193475fd0b74Schristos 	  regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
193575fd0b74Schristos 	continue;
193675fd0b74Schristos 
193775fd0b74Schristos       /* Allow parse/insert handlers to obtain length of insn.  */
193875fd0b74Schristos       CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
193975fd0b74Schristos 
194075fd0b74Schristos       parse_errmsg = CGEN_PARSE_FN (cd, insn) (cd, insn, & str, fields);
194175fd0b74Schristos       if (parse_errmsg != NULL)
194275fd0b74Schristos 	continue;
194375fd0b74Schristos 
194475fd0b74Schristos       /* ??? 0 is passed for `pc'.  */
194575fd0b74Schristos       insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
194675fd0b74Schristos 						 (bfd_vma) 0);
194775fd0b74Schristos       if (insert_errmsg != NULL)
194875fd0b74Schristos         continue;
194975fd0b74Schristos 
195075fd0b74Schristos       /* It is up to the caller to actually output the insn and any
195175fd0b74Schristos          queued relocs.  */
195275fd0b74Schristos       return insn;
195375fd0b74Schristos     }
195475fd0b74Schristos 
195575fd0b74Schristos   {
195675fd0b74Schristos     static char errbuf[150];
195775fd0b74Schristos     const char *tmp_errmsg;
195875fd0b74Schristos #ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
195975fd0b74Schristos #define be_verbose 1
196075fd0b74Schristos #else
196175fd0b74Schristos #define be_verbose 0
196275fd0b74Schristos #endif
196375fd0b74Schristos 
196475fd0b74Schristos     if (be_verbose)
196575fd0b74Schristos       {
196675fd0b74Schristos 	/* If requesting verbose error messages, use insert_errmsg.
196775fd0b74Schristos 	   Failing that, use parse_errmsg.  */
196875fd0b74Schristos 	tmp_errmsg = (insert_errmsg ? insert_errmsg :
196975fd0b74Schristos 		      parse_errmsg ? parse_errmsg :
197075fd0b74Schristos 		      recognized_mnemonic ?
197175fd0b74Schristos 		      _("unrecognized form of instruction") :
197275fd0b74Schristos 		      _("unrecognized instruction"));
197375fd0b74Schristos 
197475fd0b74Schristos 	if (strlen (start) > 50)
197575fd0b74Schristos 	  /* xgettext:c-format */
197675fd0b74Schristos 	  sprintf (errbuf, "%s `%.50s...'", tmp_errmsg, start);
197775fd0b74Schristos 	else
197875fd0b74Schristos 	  /* xgettext:c-format */
197975fd0b74Schristos 	  sprintf (errbuf, "%s `%.50s'", tmp_errmsg, start);
198075fd0b74Schristos       }
198175fd0b74Schristos     else
198275fd0b74Schristos       {
198375fd0b74Schristos 	if (strlen (start) > 50)
198475fd0b74Schristos 	  /* xgettext:c-format */
198575fd0b74Schristos 	  sprintf (errbuf, _("bad instruction `%.50s...'"), start);
198675fd0b74Schristos 	else
198775fd0b74Schristos 	  /* xgettext:c-format */
198875fd0b74Schristos 	  sprintf (errbuf, _("bad instruction `%.50s'"), start);
198975fd0b74Schristos       }
199075fd0b74Schristos 
199175fd0b74Schristos     *errmsg = errbuf;
199275fd0b74Schristos     return NULL;
199375fd0b74Schristos   }
199475fd0b74Schristos }
1995