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