1 /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
2 /* Assembler interface for targets using CGEN. -*- C -*-
3 CGEN: Cpu tools GENerator
5 THIS FILE IS MACHINE GENERATED WITH CGEN.
6 - the resultant file is machine generated, cgen-asm.in isn't
8 Copyright (C) 1996-2023 Free Software Foundation, Inc.
10 This file is part of libopcodes.
12 This library is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
17 It is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
20 License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software Foundation, Inc.,
24 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
27 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
35 #include "m32c-desc.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
43 #define min(a,b) ((a) < (b) ? (a) : (b))
45 #define max(a,b) ((a) > (b) ? (a) : (b))
47 static const char * parse_insn_normal
48 (CGEN_CPU_DESC
, const CGEN_INSN
*, const char **, CGEN_FIELDS
*);
50 /* -- assembler routines inserted here. */
53 #include "safe-ctype.h"
55 #define MACH_M32C 5 /* Must match md_begin. */
58 m32c_cgen_isa_register (const char **strp
)
61 const char *s
= *strp
;
62 static char * m32c_register_names
[] =
64 "r0", "r1", "r2", "r3", "r0l", "r0h", "r1l", "r1h",
65 "a0", "a1", "r2r0", "r3r1", "sp", "fb", "dct0", "dct1", "flg", "svf",
66 "drc0", "drc1", "dmd0", "dmd1", "intb", "svp", "vct", "isp", "dma0",
67 "dma1", "dra0", "dra1", "dsa0", "dsa1", 0
70 for (u
= 0; m32c_register_names
[u
]; u
++)
72 int len
= strlen (m32c_register_names
[u
]);
74 if (memcmp (m32c_register_names
[u
], s
, len
) == 0
75 && (s
[len
] == 0 || ! ISALNUM (s
[len
])))
81 #define PARSE_UNSIGNED \
84 /* Don't successfully parse literals beginning with '['. */ \
86 return "Invalid literal"; /* Anything -- will not be seen. */ \
88 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);\
94 #define PARSE_SIGNED \
97 /* Don't successfully parse literals beginning with '['. */ \
99 return "Invalid literal"; /* Anything -- will not be seen. */ \
101 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); \
108 parse_unsigned6 (CGEN_CPU_DESC cd
, const char **strp
,
109 int opindex
, unsigned long *valuep
)
111 const char *errmsg
= 0;
117 return _("imm:6 immediate is out of range");
124 parse_unsigned8 (CGEN_CPU_DESC cd
, const char **strp
,
125 int opindex
, unsigned long *valuep
)
127 const char *errmsg
= 0;
128 unsigned long value
= 0;
131 if (strncasecmp (*strp
, "%dsp8(", 6) == 0)
133 enum cgen_parse_operand_result result_type
;
137 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_8
,
138 & result_type
, & val
);
140 return _("missing `)'");
144 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
145 return _("%dsp8() takes a symbolic address, not a number");
152 if (strncmp (*strp
, "0x0", 3) == 0
153 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
159 return _("dsp:8 immediate is out of range");
161 /* If this field may require a relocation then use larger dsp16. */
162 if (! have_zero
&& value
== 0)
163 return _("dsp:8 immediate is out of range");
170 parse_signed4 (CGEN_CPU_DESC cd
, const char **strp
,
171 int opindex
, signed long *valuep
)
173 const char *errmsg
= 0;
177 if (strncmp (*strp
, "0x0", 3) == 0
178 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
183 if (value
< -8 || value
> 7)
184 return _("Immediate is out of range -8 to 7");
186 /* If this field may require a relocation then use larger dsp16. */
187 if (! have_zero
&& value
== 0)
188 return _("Immediate is out of range -8 to 7");
195 parse_signed4n (CGEN_CPU_DESC cd
, const char **strp
,
196 int opindex
, signed long *valuep
)
198 const char *errmsg
= 0;
202 if (strncmp (*strp
, "0x0", 3) == 0
203 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
208 if (value
< -7 || value
> 8)
209 return _("Immediate is out of range -7 to 8");
211 /* If this field may require a relocation then use larger dsp16. */
212 if (! have_zero
&& value
== 0)
213 return _("Immediate is out of range -7 to 8");
220 parse_signed8 (CGEN_CPU_DESC cd
, const char **strp
,
221 int opindex
, signed long *valuep
)
223 const char *errmsg
= 0;
224 signed long value
= 0;
226 if (strncasecmp (*strp
, "%hi8(", 5) == 0)
228 enum cgen_parse_operand_result result_type
;
232 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_M32C_HI8
,
233 & result_type
, & val
);
235 return _("missing `)'");
239 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
249 if (value
<= 255 && value
> 127)
252 if (value
< -128 || value
> 127)
253 return _("dsp:8 immediate is out of range");
260 parse_unsigned16 (CGEN_CPU_DESC cd
, const char **strp
,
261 int opindex
, unsigned long *valuep
)
263 const char *errmsg
= 0;
264 unsigned long value
= 0;
267 if (strncasecmp (*strp
, "%dsp16(", 7) == 0)
269 enum cgen_parse_operand_result result_type
;
273 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_16
,
274 & result_type
, & val
);
276 return _("missing `)'");
280 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
281 return _("%dsp16() takes a symbolic address, not a number");
288 /* Don't successfully parse literals beginning with '['. */
290 return "Invalid literal"; /* Anything -- will not be seen. */
292 /* Don't successfully parse register names. */
293 if (m32c_cgen_isa_register (strp
))
294 return "Invalid literal"; /* Anything -- will not be seen. */
296 if (strncmp (*strp
, "0x0", 3) == 0
297 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
300 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
305 return _("dsp:16 immediate is out of range");
307 /* If this field may require a relocation then use larger dsp24. */
308 if (cd
->machs
== MACH_M32C
&& ! have_zero
&& value
== 0
309 && (strncmp (*strp
, "[a", 2) == 0
312 return _("dsp:16 immediate is out of range");
319 parse_signed16 (CGEN_CPU_DESC cd
, const char **strp
,
320 int opindex
, signed long *valuep
)
322 const char *errmsg
= 0;
323 signed long value
= 0;
325 if (strncasecmp (*strp
, "%lo16(", 6) == 0)
327 enum cgen_parse_operand_result result_type
;
331 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_LO16
,
332 & result_type
, & val
);
334 return _("missing `)'");
338 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
346 if (strncasecmp (*strp
, "%hi16(", 6) == 0)
348 enum cgen_parse_operand_result result_type
;
352 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_HI16
,
353 & result_type
, & val
);
355 return _("missing `)'");
359 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
369 if (value
<= 65535 && value
> 32767)
372 if (value
< -32768 || value
> 32767)
373 return _("dsp:16 immediate is out of range");
380 parse_unsigned20 (CGEN_CPU_DESC cd
, const char **strp
,
381 int opindex
, unsigned long *valuep
)
383 const char *errmsg
= 0;
386 /* Don't successfully parse literals beginning with '['. */
388 return "Invalid literal"; /* Anything -- will not be seen. */
390 /* Don't successfully parse register names. */
391 if (m32c_cgen_isa_register (strp
))
392 return "Invalid literal"; /* Anything -- will not be seen. */
394 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
399 return _("dsp:20 immediate is out of range");
406 parse_unsigned24 (CGEN_CPU_DESC cd
, const char **strp
,
407 int opindex
, unsigned long *valuep
)
409 const char *errmsg
= 0;
412 /* Don't successfully parse literals beginning with '['. */
414 return "Invalid literal"; /* Anything -- will not be seen. */
416 /* Don't successfully parse register names. */
417 if (m32c_cgen_isa_register (strp
))
418 return "Invalid literal"; /* Anything -- will not be seen. */
420 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
424 if (value
> 0xffffff)
425 return _("dsp:24 immediate is out of range");
431 /* This should only be used for #imm->reg. */
433 parse_signed24 (CGEN_CPU_DESC cd
, const char **strp
,
434 int opindex
, signed long *valuep
)
436 const char *errmsg
= 0;
441 if (value
<= 0xffffff && value
> 0x7fffff)
444 if (value
> 0xffffff)
445 return _("dsp:24 immediate is out of range");
452 parse_signed32 (CGEN_CPU_DESC cd
, const char **strp
,
453 int opindex
, signed long *valuep
)
455 const char *errmsg
= 0;
458 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
467 parse_imm1_S (CGEN_CPU_DESC cd
, const char **strp
,
468 int opindex
, signed long *valuep
)
470 const char *errmsg
= 0;
473 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
477 if (value
< 1 || value
> 2)
478 return _("immediate is out of range 1-2");
485 parse_imm3_S (CGEN_CPU_DESC cd
, const char **strp
,
486 int opindex
, signed long *valuep
)
488 const char *errmsg
= 0;
491 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
495 if (value
< 1 || value
> 8)
496 return _("immediate is out of range 1-8");
503 parse_bit3_S (CGEN_CPU_DESC cd
, const char **strp
,
504 int opindex
, signed long *valuep
)
506 const char *errmsg
= 0;
509 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
513 if (value
< 0 || value
> 7)
514 return _("immediate is out of range 0-7");
521 parse_lab_5_3 (CGEN_CPU_DESC cd
,
523 int opindex ATTRIBUTE_UNUSED
,
525 enum cgen_parse_operand_result
*type_addr
,
528 const char *errmsg
= 0;
530 enum cgen_parse_operand_result op_res
;
532 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_5_3
,
533 opinfo
, & op_res
, & value
);
538 if (op_res
== CGEN_PARSE_OPERAND_RESULT_QUEUED
)
540 /* This is a hack; the field cannot handle near-zero signed
541 offsets that CGEN wants to put in to indicate an "empty"
549 if (value
< 2 || value
> 9)
550 return _("immediate is out of range 2-9");
557 parse_Bitno16R (CGEN_CPU_DESC cd
, const char **strp
,
558 int opindex
, unsigned long *valuep
)
560 const char *errmsg
= 0;
563 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
568 return _("Bit number for indexing general register is out of range 0-15");
575 parse_unsigned_bitbase (CGEN_CPU_DESC cd
, const char **strp
,
576 int opindex
, unsigned long *valuep
,
577 unsigned bits
, int allow_syms
)
579 const char *errmsg
= 0;
582 const char *newp
= *strp
;
583 unsigned long long bitbase
;
586 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & bit
);
591 return "Missing base for bit,base:8";
595 if (strncmp (newp
, "0x0", 3) == 0
596 || (newp
[0] == '0' && newp
[1] != 'x'))
599 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & base
);
603 bitbase
= (unsigned long long) bit
+ ((unsigned long long) base
* 8);
605 if (bitbase
>= (1ull << bits
))
606 return _("bit,base is out of range");
608 /* If this field may require a relocation then use larger displacement. */
609 if (! have_zero
&& base
== 0)
611 switch (allow_syms
) {
613 return _("bit,base out of range for symbol");
617 if (strncmp (newp
, "[sb]", 4) != 0)
618 return _("bit,base out of range for symbol");
629 parse_signed_bitbase (CGEN_CPU_DESC cd
, const char **strp
,
630 int opindex
, signed long *valuep
,
631 unsigned bits
, int allow_syms
)
633 const char *errmsg
= 0;
636 const char *newp
= *strp
;
641 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & bit
);
646 return "Missing base for bit,base:8";
650 if (strncmp (newp
, "0x0", 3) == 0
651 || (newp
[0] == '0' && newp
[1] != 'x'))
654 errmsg
= cgen_parse_signed_integer (cd
, & newp
, opindex
, & base
);
658 bitbase
= (long long)bit
+ ((long long)base
* 8);
660 limit
= 1ll << (bits
- 1);
661 if (bitbase
< -limit
|| bitbase
>= limit
)
662 return _("bit,base is out of range");
664 /* If this field may require a relocation then use larger displacement. */
665 if (! have_zero
&& base
== 0 && ! allow_syms
)
666 return _("bit,base out of range for symbol");
674 parse_unsigned_bitbase8 (CGEN_CPU_DESC cd
, const char **strp
,
675 int opindex
, unsigned long *valuep
)
677 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 8, 0);
681 parse_unsigned_bitbase11 (CGEN_CPU_DESC cd
, const char **strp
,
682 int opindex
, unsigned long *valuep
)
684 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 11, 0);
688 parse_unsigned_bitbase16 (CGEN_CPU_DESC cd
, const char **strp
,
689 int opindex
, unsigned long *valuep
)
691 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 16, 1);
695 parse_unsigned_bitbase19 (CGEN_CPU_DESC cd
, const char **strp
,
696 int opindex
, unsigned long *valuep
)
698 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 19, 2);
702 parse_unsigned_bitbase27 (CGEN_CPU_DESC cd
, const char **strp
,
703 int opindex
, unsigned long *valuep
)
705 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 27, 1);
709 parse_signed_bitbase8 (CGEN_CPU_DESC cd
, const char **strp
,
710 int opindex
, signed long *valuep
)
712 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 8, 1);
716 parse_signed_bitbase11 (CGEN_CPU_DESC cd
, const char **strp
,
717 int opindex
, signed long *valuep
)
719 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 11, 0);
723 parse_signed_bitbase19 (CGEN_CPU_DESC cd
, const char **strp
,
724 int opindex
, signed long *valuep
)
726 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 19, 1);
729 /* Parse the suffix as :<char> or as nothing followed by a whitespace. */
732 parse_suffix (const char **strp
, char suffix
)
734 const char *newp
= *strp
;
736 if (**strp
== ':' && TOLOWER (*(*strp
+ 1)) == suffix
)
745 return "Invalid suffix"; /* Anything -- will not be seen. */
749 parse_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
750 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
752 return parse_suffix (strp
, 's');
756 parse_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
757 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
759 return parse_suffix (strp
, 'g');
763 parse_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
764 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
766 return parse_suffix (strp
, 'q');
770 parse_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
771 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
773 return parse_suffix (strp
, 'z');
776 /* Parse an empty suffix. Fail if the next char is ':'. */
779 parse_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
780 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
783 return "Unexpected suffix";
788 parse_r0l_r0h (CGEN_CPU_DESC cd
, const char **strp
,
789 int opindex ATTRIBUTE_UNUSED
, signed long *valuep
)
794 const char *newp
= *strp
;
797 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0l_r0h
, & value
);
802 return _("not a valid r0l/r0h pair");
805 /* Parse the second register in the pair. */
806 if (value
== 0) /* r0l */
807 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0h
, & junk
);
809 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0l
, & junk
);
818 /* Accept .b or .w in any case. */
821 parse_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
822 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
825 && (*(*strp
+ 1) == 'b' || *(*strp
+ 1) == 'B'
826 || *(*strp
+ 1) == 'w' || *(*strp
+ 1) == 'W'))
832 return _("Invalid size specifier");
835 /* Special check to ensure that instruction exists for given machine. */
838 m32c_cgen_insn_supported (CGEN_CPU_DESC cd
,
839 const CGEN_INSN
*insn
)
841 int machs
= CGEN_INSN_ATTR_VALUE (insn
, CGEN_INSN_MACH
);
842 CGEN_BITSET isas
= CGEN_INSN_BITSET_ATTR_VALUE (insn
, CGEN_INSN_ISA
);
844 /* If attributes are absent, assume no restriction. */
848 return ((machs
& cd
->machs
)
849 && cgen_bitset_intersect_p (& isas
, cd
->isas
));
852 /* Parse a set of registers, R0,R1,A0,A1,SB,FB. */
855 parse_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
857 int opindex ATTRIBUTE_UNUSED
,
858 unsigned long *valuep
,
861 const char *errmsg
= 0;
865 while (**strp
&& **strp
!= ')')
867 if (**strp
== 'r' || **strp
== 'R')
870 regno
= **strp
- '0';
872 errmsg
= _("Register number is not valid");
874 else if (**strp
== 'a' || **strp
== 'A')
877 regno
= **strp
- '0';
879 errmsg
= _("Register number is not valid");
880 regno
= **strp
- '0' + 4;
883 else if (strncasecmp (*strp
, "sb", 2) == 0 || strncasecmp (*strp
, "SB", 2) == 0)
889 else if (strncasecmp (*strp
, "fb", 2) == 0 || strncasecmp (*strp
, "FB", 2) == 0)
895 if (push
) /* Mask is reversed for push. */
896 *valuep
|= 0x80 >> regno
;
898 *valuep
|= 1 << regno
;
903 if (*(*strp
+ 1) == ')')
910 errmsg
= _("Register list is not valid");
919 parse_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
921 int opindex ATTRIBUTE_UNUSED
,
922 unsigned long *valuep
)
924 return parse_regset (cd
, strp
, opindex
, valuep
, POP
);
928 parse_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
930 int opindex ATTRIBUTE_UNUSED
,
931 unsigned long *valuep
)
933 return parse_regset (cd
, strp
, opindex
, valuep
, PUSH
);
938 const char * m32c_cgen_parse_operand
939 (CGEN_CPU_DESC
, int, const char **, CGEN_FIELDS
*);
941 /* Main entry point for operand parsing.
943 This function is basically just a big switch statement. Earlier versions
944 used tables to look up the function to use, but
945 - if the table contains both assembler and disassembler functions then
946 the disassembler contains much of the assembler and vice-versa,
947 - there's a lot of inlining possibilities as things grow,
948 - using a switch statement avoids the function call overhead.
950 This function could be moved into `parse_insn_normal', but keeping it
951 separate makes clear the interface between `parse_insn_normal' and each of
955 m32c_cgen_parse_operand (CGEN_CPU_DESC cd
,
958 CGEN_FIELDS
* fields
)
960 const char * errmsg
= NULL
;
961 /* Used by scalar operands that still need to be parsed. */
962 long junk ATTRIBUTE_UNUSED
;
966 case M32C_OPERAND_A0
:
967 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_a0
, & junk
);
969 case M32C_OPERAND_A1
:
970 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_a1
, & junk
);
972 case M32C_OPERAND_AN16_PUSH_S
:
973 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_4_1
);
975 case M32C_OPERAND_BIT16AN
:
976 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst16_an
);
978 case M32C_OPERAND_BIT16RN
:
979 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst16_rn
);
981 case M32C_OPERAND_BIT3_S
:
982 errmsg
= parse_bit3_S (cd
, strp
, M32C_OPERAND_BIT3_S
, (long *) (& fields
->f_imm3_S
));
984 case M32C_OPERAND_BIT32ANPREFIXED
:
985 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
987 case M32C_OPERAND_BIT32ANUNPREFIXED
:
988 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
990 case M32C_OPERAND_BIT32RNPREFIXED
:
991 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_prefixed_QI
);
993 case M32C_OPERAND_BIT32RNUNPREFIXED
:
994 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_unprefixed_QI
);
996 case M32C_OPERAND_BITBASE16_16_S8
:
997 errmsg
= parse_signed_bitbase8 (cd
, strp
, M32C_OPERAND_BITBASE16_16_S8
, (long *) (& fields
->f_dsp_16_s8
));
999 case M32C_OPERAND_BITBASE16_16_U16
:
1000 errmsg
= parse_unsigned_bitbase16 (cd
, strp
, M32C_OPERAND_BITBASE16_16_U16
, (unsigned long *) (& fields
->f_dsp_16_u16
));
1002 case M32C_OPERAND_BITBASE16_16_U8
:
1003 errmsg
= parse_unsigned_bitbase8 (cd
, strp
, M32C_OPERAND_BITBASE16_16_U8
, (unsigned long *) (& fields
->f_dsp_16_u8
));
1005 case M32C_OPERAND_BITBASE16_8_U11_S
:
1006 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE16_8_U11_S
, (unsigned long *) (& fields
->f_bitbase16_u11_S
));
1008 case M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED
:
1009 errmsg
= parse_signed_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED
, (long *) (& fields
->f_bitbase32_16_s11_unprefixed
));
1011 case M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED
:
1012 errmsg
= parse_signed_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED
, (long *) (& fields
->f_bitbase32_16_s19_unprefixed
));
1014 case M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED
:
1015 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u11_unprefixed
));
1017 case M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED
:
1018 errmsg
= parse_unsigned_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u19_unprefixed
));
1020 case M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED
:
1021 errmsg
= parse_unsigned_bitbase27 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u27_unprefixed
));
1023 case M32C_OPERAND_BITBASE32_24_S11_PREFIXED
:
1024 errmsg
= parse_signed_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_24_S11_PREFIXED
, (long *) (& fields
->f_bitbase32_24_s11_prefixed
));
1026 case M32C_OPERAND_BITBASE32_24_S19_PREFIXED
:
1027 errmsg
= parse_signed_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_24_S19_PREFIXED
, (long *) (& fields
->f_bitbase32_24_s19_prefixed
));
1029 case M32C_OPERAND_BITBASE32_24_U11_PREFIXED
:
1030 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U11_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u11_prefixed
));
1032 case M32C_OPERAND_BITBASE32_24_U19_PREFIXED
:
1033 errmsg
= parse_unsigned_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U19_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u19_prefixed
));
1035 case M32C_OPERAND_BITBASE32_24_U27_PREFIXED
:
1036 errmsg
= parse_unsigned_bitbase27 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U27_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u27_prefixed
));
1038 case M32C_OPERAND_BITNO16R
:
1039 errmsg
= parse_Bitno16R (cd
, strp
, M32C_OPERAND_BITNO16R
, (unsigned long *) (& fields
->f_dsp_16_u8
));
1041 case M32C_OPERAND_BITNO32PREFIXED
:
1042 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, M32C_OPERAND_BITNO32PREFIXED
, (unsigned long *) (& fields
->f_bitno32_prefixed
));
1044 case M32C_OPERAND_BITNO32UNPREFIXED
:
1045 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, M32C_OPERAND_BITNO32UNPREFIXED
, (unsigned long *) (& fields
->f_bitno32_unprefixed
));
1047 case M32C_OPERAND_DSP_10_U6
:
1048 errmsg
= parse_unsigned6 (cd
, strp
, M32C_OPERAND_DSP_10_U6
, (unsigned long *) (& fields
->f_dsp_10_u6
));
1050 case M32C_OPERAND_DSP_16_S16
:
1051 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_16_S16
, (long *) (& fields
->f_dsp_16_s16
));
1053 case M32C_OPERAND_DSP_16_S8
:
1054 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_16_S8
, (long *) (& fields
->f_dsp_16_s8
));
1056 case M32C_OPERAND_DSP_16_U16
:
1057 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_16_U16
, (unsigned long *) (& fields
->f_dsp_16_u16
));
1059 case M32C_OPERAND_DSP_16_U20
:
1060 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_16_U20
, (unsigned long *) (& fields
->f_dsp_16_u24
));
1062 case M32C_OPERAND_DSP_16_U24
:
1063 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_16_U24
, (unsigned long *) (& fields
->f_dsp_16_u24
));
1065 case M32C_OPERAND_DSP_16_U8
:
1066 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_16_U8
, (unsigned long *) (& fields
->f_dsp_16_u8
));
1068 case M32C_OPERAND_DSP_24_S16
:
1069 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_24_S16
, (long *) (& fields
->f_dsp_24_s16
));
1071 case M32C_OPERAND_DSP_24_S8
:
1072 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_24_S8
, (long *) (& fields
->f_dsp_24_s8
));
1074 case M32C_OPERAND_DSP_24_U16
:
1075 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_24_U16
, (unsigned long *) (& fields
->f_dsp_24_u16
));
1077 case M32C_OPERAND_DSP_24_U20
:
1078 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_24_U20
, (unsigned long *) (& fields
->f_dsp_24_u24
));
1080 case M32C_OPERAND_DSP_24_U24
:
1081 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_24_U24
, (unsigned long *) (& fields
->f_dsp_24_u24
));
1083 case M32C_OPERAND_DSP_24_U8
:
1084 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_24_U8
, (unsigned long *) (& fields
->f_dsp_24_u8
));
1086 case M32C_OPERAND_DSP_32_S16
:
1087 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_32_S16
, (long *) (& fields
->f_dsp_32_s16
));
1089 case M32C_OPERAND_DSP_32_S8
:
1090 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_32_S8
, (long *) (& fields
->f_dsp_32_s8
));
1092 case M32C_OPERAND_DSP_32_U16
:
1093 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_32_U16
, (unsigned long *) (& fields
->f_dsp_32_u16
));
1095 case M32C_OPERAND_DSP_32_U20
:
1096 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_32_U20
, (unsigned long *) (& fields
->f_dsp_32_u24
));
1098 case M32C_OPERAND_DSP_32_U24
:
1099 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_32_U24
, (unsigned long *) (& fields
->f_dsp_32_u24
));
1101 case M32C_OPERAND_DSP_32_U8
:
1102 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_32_U8
, (unsigned long *) (& fields
->f_dsp_32_u8
));
1104 case M32C_OPERAND_DSP_40_S16
:
1105 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_40_S16
, (long *) (& fields
->f_dsp_40_s16
));
1107 case M32C_OPERAND_DSP_40_S8
:
1108 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_40_S8
, (long *) (& fields
->f_dsp_40_s8
));
1110 case M32C_OPERAND_DSP_40_U16
:
1111 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_40_U16
, (unsigned long *) (& fields
->f_dsp_40_u16
));
1113 case M32C_OPERAND_DSP_40_U20
:
1114 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_40_U20
, (unsigned long *) (& fields
->f_dsp_40_u20
));
1116 case M32C_OPERAND_DSP_40_U24
:
1117 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_40_U24
, (unsigned long *) (& fields
->f_dsp_40_u24
));
1119 case M32C_OPERAND_DSP_40_U8
:
1120 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_40_U8
, (unsigned long *) (& fields
->f_dsp_40_u8
));
1122 case M32C_OPERAND_DSP_48_S16
:
1123 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_48_S16
, (long *) (& fields
->f_dsp_48_s16
));
1125 case M32C_OPERAND_DSP_48_S8
:
1126 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_48_S8
, (long *) (& fields
->f_dsp_48_s8
));
1128 case M32C_OPERAND_DSP_48_U16
:
1129 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_48_U16
, (unsigned long *) (& fields
->f_dsp_48_u16
));
1131 case M32C_OPERAND_DSP_48_U20
:
1132 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_48_U20
, (unsigned long *) (& fields
->f_dsp_48_u20
));
1134 case M32C_OPERAND_DSP_48_U24
:
1135 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_48_U24
, (unsigned long *) (& fields
->f_dsp_48_u24
));
1137 case M32C_OPERAND_DSP_48_U8
:
1138 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_48_U8
, (unsigned long *) (& fields
->f_dsp_48_u8
));
1140 case M32C_OPERAND_DSP_8_S24
:
1141 errmsg
= parse_signed24 (cd
, strp
, M32C_OPERAND_DSP_8_S24
, (long *) (& fields
->f_dsp_8_s24
));
1143 case M32C_OPERAND_DSP_8_S8
:
1144 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_8_S8
, (long *) (& fields
->f_dsp_8_s8
));
1146 case M32C_OPERAND_DSP_8_U16
:
1147 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_8_U16
, (unsigned long *) (& fields
->f_dsp_8_u16
));
1149 case M32C_OPERAND_DSP_8_U24
:
1150 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_8_U24
, (unsigned long *) (& fields
->f_dsp_8_u24
));
1152 case M32C_OPERAND_DSP_8_U6
:
1153 errmsg
= parse_unsigned6 (cd
, strp
, M32C_OPERAND_DSP_8_U6
, (unsigned long *) (& fields
->f_dsp_8_u6
));
1155 case M32C_OPERAND_DSP_8_U8
:
1156 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_8_U8
, (unsigned long *) (& fields
->f_dsp_8_u8
));
1158 case M32C_OPERAND_DST16AN
:
1159 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst16_an
);
1161 case M32C_OPERAND_DST16AN_S
:
1162 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst16_an_s
);
1164 case M32C_OPERAND_DST16ANHI
:
1165 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst16_an
);
1167 case M32C_OPERAND_DST16ANQI
:
1168 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst16_an
);
1170 case M32C_OPERAND_DST16ANQI_S
:
1171 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst16_rn_QI_s
);
1173 case M32C_OPERAND_DST16ANSI
:
1174 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_SI
, & fields
->f_dst16_an
);
1176 case M32C_OPERAND_DST16RNEXTQI
:
1177 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_QI
, & fields
->f_dst16_rn_ext
);
1179 case M32C_OPERAND_DST16RNHI
:
1180 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst16_rn
);
1182 case M32C_OPERAND_DST16RNQI
:
1183 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst16_rn
);
1185 case M32C_OPERAND_DST16RNQI_S
:
1186 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l_r0h
, & fields
->f_dst16_rn_QI_s
);
1188 case M32C_OPERAND_DST16RNSI
:
1189 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst16_rn
);
1191 case M32C_OPERAND_DST32ANEXTUNPREFIXED
:
1192 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1194 case M32C_OPERAND_DST32ANPREFIXED
:
1195 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
1197 case M32C_OPERAND_DST32ANPREFIXEDHI
:
1198 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst32_an_prefixed
);
1200 case M32C_OPERAND_DST32ANPREFIXEDQI
:
1201 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst32_an_prefixed
);
1203 case M32C_OPERAND_DST32ANPREFIXEDSI
:
1204 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
1206 case M32C_OPERAND_DST32ANUNPREFIXED
:
1207 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1209 case M32C_OPERAND_DST32ANUNPREFIXEDHI
:
1210 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst32_an_unprefixed
);
1212 case M32C_OPERAND_DST32ANUNPREFIXEDQI
:
1213 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst32_an_unprefixed
);
1215 case M32C_OPERAND_DST32ANUNPREFIXEDSI
:
1216 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1218 case M32C_OPERAND_DST32R0HI_S
:
1219 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0
, & junk
);
1221 case M32C_OPERAND_DST32R0QI_S
:
1222 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l
, & junk
);
1224 case M32C_OPERAND_DST32RNEXTUNPREFIXEDHI
:
1225 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_HI
, & fields
->f_dst32_rn_ext_unprefixed
);
1227 case M32C_OPERAND_DST32RNEXTUNPREFIXEDQI
:
1228 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_QI
, & fields
->f_dst32_rn_ext_unprefixed
);
1230 case M32C_OPERAND_DST32RNPREFIXEDHI
:
1231 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst32_rn_prefixed_HI
);
1233 case M32C_OPERAND_DST32RNPREFIXEDQI
:
1234 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_prefixed_QI
);
1236 case M32C_OPERAND_DST32RNPREFIXEDSI
:
1237 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst32_rn_prefixed_SI
);
1239 case M32C_OPERAND_DST32RNUNPREFIXEDHI
:
1240 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst32_rn_unprefixed_HI
);
1242 case M32C_OPERAND_DST32RNUNPREFIXEDQI
:
1243 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_unprefixed_QI
);
1245 case M32C_OPERAND_DST32RNUNPREFIXEDSI
:
1246 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst32_rn_unprefixed_SI
);
1248 case M32C_OPERAND_G
:
1249 errmsg
= parse_G (cd
, strp
, M32C_OPERAND_G
, (long *) (& junk
));
1251 case M32C_OPERAND_IMM_12_S4
:
1252 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_12_S4
, (long *) (& fields
->f_imm_12_s4
));
1254 case M32C_OPERAND_IMM_12_S4N
:
1255 errmsg
= parse_signed4n (cd
, strp
, M32C_OPERAND_IMM_12_S4N
, (long *) (& fields
->f_imm_12_s4
));
1257 case M32C_OPERAND_IMM_13_U3
:
1258 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_13_U3
, (long *) (& fields
->f_imm_13_u3
));
1260 case M32C_OPERAND_IMM_16_HI
:
1261 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_16_HI
, (long *) (& fields
->f_dsp_16_s16
));
1263 case M32C_OPERAND_IMM_16_QI
:
1264 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_16_QI
, (long *) (& fields
->f_dsp_16_s8
));
1266 case M32C_OPERAND_IMM_16_SI
:
1267 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_16_SI
, (long *) (& fields
->f_dsp_16_s32
));
1269 case M32C_OPERAND_IMM_20_S4
:
1270 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_20_S4
, (long *) (& fields
->f_imm_20_s4
));
1272 case M32C_OPERAND_IMM_24_HI
:
1273 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_24_HI
, (long *) (& fields
->f_dsp_24_s16
));
1275 case M32C_OPERAND_IMM_24_QI
:
1276 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_24_QI
, (long *) (& fields
->f_dsp_24_s8
));
1278 case M32C_OPERAND_IMM_24_SI
:
1279 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_24_SI
, (long *) (& fields
->f_dsp_24_s32
));
1281 case M32C_OPERAND_IMM_32_HI
:
1282 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_32_HI
, (long *) (& fields
->f_dsp_32_s16
));
1284 case M32C_OPERAND_IMM_32_QI
:
1285 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_32_QI
, (long *) (& fields
->f_dsp_32_s8
));
1287 case M32C_OPERAND_IMM_32_SI
:
1288 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_32_SI
, (long *) (& fields
->f_dsp_32_s32
));
1290 case M32C_OPERAND_IMM_40_HI
:
1291 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_40_HI
, (long *) (& fields
->f_dsp_40_s16
));
1293 case M32C_OPERAND_IMM_40_QI
:
1294 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_40_QI
, (long *) (& fields
->f_dsp_40_s8
));
1296 case M32C_OPERAND_IMM_40_SI
:
1297 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_40_SI
, (long *) (& fields
->f_dsp_40_s32
));
1299 case M32C_OPERAND_IMM_48_HI
:
1300 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_48_HI
, (long *) (& fields
->f_dsp_48_s16
));
1302 case M32C_OPERAND_IMM_48_QI
:
1303 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_48_QI
, (long *) (& fields
->f_dsp_48_s8
));
1305 case M32C_OPERAND_IMM_48_SI
:
1306 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_48_SI
, (long *) (& fields
->f_dsp_48_s32
));
1308 case M32C_OPERAND_IMM_56_HI
:
1309 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_56_HI
, (long *) (& fields
->f_dsp_56_s16
));
1311 case M32C_OPERAND_IMM_56_QI
:
1312 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_56_QI
, (long *) (& fields
->f_dsp_56_s8
));
1314 case M32C_OPERAND_IMM_64_HI
:
1315 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_64_HI
, (long *) (& fields
->f_dsp_64_s16
));
1317 case M32C_OPERAND_IMM_8_HI
:
1318 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_8_HI
, (long *) (& fields
->f_dsp_8_s16
));
1320 case M32C_OPERAND_IMM_8_QI
:
1321 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_8_QI
, (long *) (& fields
->f_dsp_8_s8
));
1323 case M32C_OPERAND_IMM_8_S4
:
1324 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_8_S4
, (long *) (& fields
->f_imm_8_s4
));
1326 case M32C_OPERAND_IMM_8_S4N
:
1327 errmsg
= parse_signed4n (cd
, strp
, M32C_OPERAND_IMM_8_S4N
, (long *) (& fields
->f_imm_8_s4
));
1329 case M32C_OPERAND_IMM_SH_12_S4
:
1330 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_12_s4
);
1332 case M32C_OPERAND_IMM_SH_20_S4
:
1333 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_20_s4
);
1335 case M32C_OPERAND_IMM_SH_8_S4
:
1336 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_8_s4
);
1338 case M32C_OPERAND_IMM1_S
:
1339 errmsg
= parse_imm1_S (cd
, strp
, M32C_OPERAND_IMM1_S
, (long *) (& fields
->f_imm1_S
));
1341 case M32C_OPERAND_IMM3_S
:
1342 errmsg
= parse_imm3_S (cd
, strp
, M32C_OPERAND_IMM3_S
, (long *) (& fields
->f_imm3_S
));
1344 case M32C_OPERAND_LAB_16_8
:
1347 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_16_8
, 0, NULL
, & value
);
1348 fields
->f_lab_16_8
= value
;
1351 case M32C_OPERAND_LAB_24_8
:
1354 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_24_8
, 0, NULL
, & value
);
1355 fields
->f_lab_24_8
= value
;
1358 case M32C_OPERAND_LAB_32_8
:
1361 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_32_8
, 0, NULL
, & value
);
1362 fields
->f_lab_32_8
= value
;
1365 case M32C_OPERAND_LAB_40_8
:
1368 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_40_8
, 0, NULL
, & value
);
1369 fields
->f_lab_40_8
= value
;
1372 case M32C_OPERAND_LAB_5_3
:
1375 errmsg
= parse_lab_5_3 (cd
, strp
, M32C_OPERAND_LAB_5_3
, 0, NULL
, & value
);
1376 fields
->f_lab_5_3
= value
;
1379 case M32C_OPERAND_LAB_8_16
:
1382 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_16
, 0, NULL
, & value
);
1383 fields
->f_lab_8_16
= value
;
1386 case M32C_OPERAND_LAB_8_24
:
1389 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_24
, 0, NULL
, & value
);
1390 fields
->f_lab_8_24
= value
;
1393 case M32C_OPERAND_LAB_8_8
:
1396 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_8
, 0, NULL
, & value
);
1397 fields
->f_lab_8_8
= value
;
1400 case M32C_OPERAND_LAB32_JMP_S
:
1403 errmsg
= parse_lab_5_3 (cd
, strp
, M32C_OPERAND_LAB32_JMP_S
, 0, NULL
, & value
);
1404 fields
->f_lab32_jmp_s
= value
;
1407 case M32C_OPERAND_Q
:
1408 errmsg
= parse_Q (cd
, strp
, M32C_OPERAND_Q
, (long *) (& junk
));
1410 case M32C_OPERAND_R0
:
1411 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0
, & junk
);
1413 case M32C_OPERAND_R0H
:
1414 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0h
, & junk
);
1416 case M32C_OPERAND_R0L
:
1417 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l
, & junk
);
1419 case M32C_OPERAND_R1
:
1420 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r1
, & junk
);
1422 case M32C_OPERAND_R1R2R0
:
1423 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r1r2r0
, & junk
);
1425 case M32C_OPERAND_R2
:
1426 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r2
, & junk
);
1428 case M32C_OPERAND_R2R0
:
1429 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r2r0
, & junk
);
1431 case M32C_OPERAND_R3
:
1432 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r3
, & junk
);
1434 case M32C_OPERAND_R3R1
:
1435 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r3r1
, & junk
);
1437 case M32C_OPERAND_REGSETPOP
:
1438 errmsg
= parse_pop_regset (cd
, strp
, M32C_OPERAND_REGSETPOP
, (unsigned long *) (& fields
->f_8_8
));
1440 case M32C_OPERAND_REGSETPUSH
:
1441 errmsg
= parse_push_regset (cd
, strp
, M32C_OPERAND_REGSETPUSH
, (unsigned long *) (& fields
->f_8_8
));
1443 case M32C_OPERAND_RN16_PUSH_S
:
1444 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_4_1
);
1446 case M32C_OPERAND_S
:
1447 errmsg
= parse_S (cd
, strp
, M32C_OPERAND_S
, (long *) (& junk
));
1449 case M32C_OPERAND_SRC16AN
:
1450 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src16_an
);
1452 case M32C_OPERAND_SRC16ANHI
:
1453 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src16_an
);
1455 case M32C_OPERAND_SRC16ANQI
:
1456 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src16_an
);
1458 case M32C_OPERAND_SRC16RNHI
:
1459 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src16_rn
);
1461 case M32C_OPERAND_SRC16RNQI
:
1462 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src16_rn
);
1464 case M32C_OPERAND_SRC32ANPREFIXED
:
1465 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_prefixed
);
1467 case M32C_OPERAND_SRC32ANPREFIXEDHI
:
1468 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src32_an_prefixed
);
1470 case M32C_OPERAND_SRC32ANPREFIXEDQI
:
1471 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src32_an_prefixed
);
1473 case M32C_OPERAND_SRC32ANPREFIXEDSI
:
1474 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_prefixed
);
1476 case M32C_OPERAND_SRC32ANUNPREFIXED
:
1477 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_unprefixed
);
1479 case M32C_OPERAND_SRC32ANUNPREFIXEDHI
:
1480 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src32_an_unprefixed
);
1482 case M32C_OPERAND_SRC32ANUNPREFIXEDQI
:
1483 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src32_an_unprefixed
);
1485 case M32C_OPERAND_SRC32ANUNPREFIXEDSI
:
1486 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_unprefixed
);
1488 case M32C_OPERAND_SRC32RNPREFIXEDHI
:
1489 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src32_rn_prefixed_HI
);
1491 case M32C_OPERAND_SRC32RNPREFIXEDQI
:
1492 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src32_rn_prefixed_QI
);
1494 case M32C_OPERAND_SRC32RNPREFIXEDSI
:
1495 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_src32_rn_prefixed_SI
);
1497 case M32C_OPERAND_SRC32RNUNPREFIXEDHI
:
1498 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src32_rn_unprefixed_HI
);
1500 case M32C_OPERAND_SRC32RNUNPREFIXEDQI
:
1501 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src32_rn_unprefixed_QI
);
1503 case M32C_OPERAND_SRC32RNUNPREFIXEDSI
:
1504 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_src32_rn_unprefixed_SI
);
1506 case M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL
:
1507 errmsg
= parse_r0l_r0h (cd
, strp
, M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL
, (long *) (& fields
->f_5_1
));
1509 case M32C_OPERAND_X
:
1510 errmsg
= parse_X (cd
, strp
, M32C_OPERAND_X
, (long *) (& junk
));
1512 case M32C_OPERAND_Z
:
1513 errmsg
= parse_Z (cd
, strp
, M32C_OPERAND_Z
, (long *) (& junk
));
1515 case M32C_OPERAND_COND16_16
:
1516 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_16_u8
);
1518 case M32C_OPERAND_COND16_24
:
1519 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_24_u8
);
1521 case M32C_OPERAND_COND16_32
:
1522 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_32_u8
);
1524 case M32C_OPERAND_COND16C
:
1525 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16c
, & fields
->f_cond16
);
1527 case M32C_OPERAND_COND16J
:
1528 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16j
, & fields
->f_cond16
);
1530 case M32C_OPERAND_COND16J5
:
1531 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16j_5
, & fields
->f_cond16j_5
);
1533 case M32C_OPERAND_COND32
:
1534 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond32
);
1536 case M32C_OPERAND_COND32_16
:
1537 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_16_u8
);
1539 case M32C_OPERAND_COND32_24
:
1540 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_24_u8
);
1542 case M32C_OPERAND_COND32_32
:
1543 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_32_u8
);
1545 case M32C_OPERAND_COND32_40
:
1546 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_40_u8
);
1548 case M32C_OPERAND_COND32J
:
1549 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond32j
);
1551 case M32C_OPERAND_CR1_PREFIXED_32
:
1552 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr1_32
, & fields
->f_21_3
);
1554 case M32C_OPERAND_CR1_UNPREFIXED_32
:
1555 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr1_32
, & fields
->f_13_3
);
1557 case M32C_OPERAND_CR16
:
1558 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr_16
, & fields
->f_9_3
);
1560 case M32C_OPERAND_CR2_32
:
1561 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr2_32
, & fields
->f_13_3
);
1563 case M32C_OPERAND_CR3_PREFIXED_32
:
1564 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr3_32
, & fields
->f_21_3
);
1566 case M32C_OPERAND_CR3_UNPREFIXED_32
:
1567 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr3_32
, & fields
->f_13_3
);
1569 case M32C_OPERAND_FLAGS16
:
1570 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_flags
, & fields
->f_9_3
);
1572 case M32C_OPERAND_FLAGS32
:
1573 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_flags
, & fields
->f_13_3
);
1575 case M32C_OPERAND_SCCOND32
:
1576 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond16
);
1578 case M32C_OPERAND_SIZE
:
1579 errmsg
= parse_size (cd
, strp
, M32C_OPERAND_SIZE
, (long *) (& junk
));
1583 /* xgettext:c-format */
1584 opcodes_error_handler
1585 (_("internal error: unrecognized field %d while parsing"),
1593 cgen_parse_fn
* const m32c_cgen_parse_handlers
[] =
1599 m32c_cgen_init_asm (CGEN_CPU_DESC cd
)
1601 m32c_cgen_init_opcode_table (cd
);
1602 m32c_cgen_init_ibld_table (cd
);
1603 cd
->parse_handlers
= & m32c_cgen_parse_handlers
[0];
1604 cd
->parse_operand
= m32c_cgen_parse_operand
;
1605 #ifdef CGEN_ASM_INIT_HOOK
1612 /* Regex construction routine.
1614 This translates an opcode syntax string into a regex string,
1615 by replacing any non-character syntax element (such as an
1616 opcode) with the pattern '.*'
1618 It then compiles the regex and stores it in the opcode, for
1619 later use by m32c_cgen_assemble_insn
1621 Returns NULL for success, an error message for failure. */
1624 m32c_cgen_build_insn_regex (CGEN_INSN
*insn
)
1626 CGEN_OPCODE
*opc
= (CGEN_OPCODE
*) CGEN_INSN_OPCODE (insn
);
1627 const char *mnem
= CGEN_INSN_MNEMONIC (insn
);
1628 char rxbuf
[CGEN_MAX_RX_ELEMENTS
];
1630 const CGEN_SYNTAX_CHAR_TYPE
*syn
;
1633 syn
= CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc
));
1635 /* Mnemonics come first in the syntax string. */
1636 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1637 return _("missing mnemonic in syntax string");
1640 /* Generate a case sensitive regular expression that emulates case
1641 insensitive matching in the "C" locale. We cannot generate a case
1642 insensitive regular expression because in Turkish locales, 'i' and 'I'
1643 are not equal modulo case conversion. */
1645 /* Copy the literal mnemonic out of the insn. */
1646 for (; *mnem
; mnem
++)
1653 *rx
++ = TOLOWER (c
);
1654 *rx
++ = TOUPPER (c
);
1661 /* Copy any remaining literals from the syntax string into the rx. */
1662 for(; * syn
!= 0 && rx
<= rxbuf
+ (CGEN_MAX_RX_ELEMENTS
- 7 - 4); ++syn
)
1664 if (CGEN_SYNTAX_CHAR_P (* syn
))
1666 char c
= CGEN_SYNTAX_CHAR (* syn
);
1670 /* Escape any regex metacharacters in the syntax. */
1671 case '.': case '[': case '\\':
1672 case '*': case '^': case '$':
1674 #ifdef CGEN_ESCAPE_EXTENDED_REGEX
1675 case '?': case '{': case '}':
1676 case '(': case ')': case '*':
1677 case '|': case '+': case ']':
1687 *rx
++ = TOLOWER (c
);
1688 *rx
++ = TOUPPER (c
);
1698 /* Replace non-syntax fields with globs. */
1704 /* Trailing whitespace ok. */
1711 /* But anchor it after that. */
1715 CGEN_INSN_RX (insn
) = xmalloc (sizeof (regex_t
));
1716 reg_err
= regcomp ((regex_t
*) CGEN_INSN_RX (insn
), rxbuf
, REG_NOSUB
);
1722 static char msg
[80];
1724 regerror (reg_err
, (regex_t
*) CGEN_INSN_RX (insn
), msg
, 80);
1725 regfree ((regex_t
*) CGEN_INSN_RX (insn
));
1726 free (CGEN_INSN_RX (insn
));
1727 (CGEN_INSN_RX (insn
)) = NULL
;
1733 /* Default insn parser.
1735 The syntax string is scanned and operands are parsed and stored in FIELDS.
1736 Relocs are queued as we go via other callbacks.
1738 ??? Note that this is currently an all-or-nothing parser. If we fail to
1739 parse the instruction, we return 0 and the caller will start over from
1740 the beginning. Backtracking will be necessary in parsing subexpressions,
1741 but that can be handled there. Not handling backtracking here may get
1742 expensive in the case of the m68k. Deal with later.
1744 Returns NULL for success, an error message for failure. */
1747 parse_insn_normal (CGEN_CPU_DESC cd
,
1748 const CGEN_INSN
*insn
,
1750 CGEN_FIELDS
*fields
)
1752 /* ??? Runtime added insns not handled yet. */
1753 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
1754 const char *str
= *strp
;
1757 const CGEN_SYNTAX_CHAR_TYPE
* syn
;
1758 #ifdef CGEN_MNEMONIC_OPERANDS
1763 /* For now we assume the mnemonic is first (there are no leading operands).
1764 We can parse it without needing to set up operand parsing.
1765 GAS's input scrubber will ensure mnemonics are lowercase, but we may
1766 not be called from GAS. */
1767 p
= CGEN_INSN_MNEMONIC (insn
);
1768 while (*p
&& TOLOWER (*p
) == TOLOWER (*str
))
1772 return _("unrecognized instruction");
1774 #ifndef CGEN_MNEMONIC_OPERANDS
1775 if (* str
&& ! ISSPACE (* str
))
1776 return _("unrecognized instruction");
1779 CGEN_INIT_PARSE (cd
);
1780 cgen_init_parse_operand (cd
);
1781 #ifdef CGEN_MNEMONIC_OPERANDS
1785 /* We don't check for (*str != '\0') here because we want to parse
1786 any trailing fake arguments in the syntax string. */
1787 syn
= CGEN_SYNTAX_STRING (syntax
);
1789 /* Mnemonics come first for now, ensure valid string. */
1790 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1797 /* Non operand chars must match exactly. */
1798 if (CGEN_SYNTAX_CHAR_P (* syn
))
1800 /* FIXME: While we allow for non-GAS callers above, we assume the
1801 first char after the mnemonic part is a space. */
1802 /* FIXME: We also take inappropriate advantage of the fact that
1803 GAS's input scrubber will remove extraneous blanks. */
1804 if (TOLOWER (*str
) == TOLOWER (CGEN_SYNTAX_CHAR (* syn
)))
1806 #ifdef CGEN_MNEMONIC_OPERANDS
1807 if (CGEN_SYNTAX_CHAR(* syn
) == ' ')
1815 /* Syntax char didn't match. Can't be this insn. */
1816 static char msg
[80];
1818 /* xgettext:c-format */
1819 sprintf (msg
, _("syntax error (expected char `%c', found `%c')"),
1820 CGEN_SYNTAX_CHAR(*syn
), *str
);
1825 /* Ran out of input. */
1826 static char msg
[80];
1828 /* xgettext:c-format */
1829 sprintf (msg
, _("syntax error (expected char `%c', found end of instruction)"),
1830 CGEN_SYNTAX_CHAR(*syn
));
1836 #ifdef CGEN_MNEMONIC_OPERANDS
1837 (void) past_opcode_p
;
1839 /* We have an operand of some sort. */
1840 errmsg
= cd
->parse_operand (cd
, CGEN_SYNTAX_FIELD (*syn
), &str
, fields
);
1844 /* Done with this operand, continue with next one. */
1848 /* If we're at the end of the syntax string, we're done. */
1851 /* FIXME: For the moment we assume a valid `str' can only contain
1852 blanks now. IE: We needn't try again with a longer version of
1853 the insn and it is assumed that longer versions of insns appear
1854 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
1855 while (ISSPACE (* str
))
1859 return _("junk at end of line"); /* FIXME: would like to include `str' */
1864 /* We couldn't parse it. */
1865 return _("unrecognized instruction");
1868 /* Main entry point.
1869 This routine is called for each instruction to be assembled.
1870 STR points to the insn to be assembled.
1871 We assume all necessary tables have been initialized.
1872 The assembled instruction, less any fixups, is stored in BUF.
1873 Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
1874 still needs to be converted to target byte order, otherwise BUF is an array
1875 of bytes in target byte order.
1876 The result is a pointer to the insn's entry in the opcode table,
1877 or NULL if an error occured (an error message will have already been
1880 Note that when processing (non-alias) macro-insns,
1881 this function recurses.
1883 ??? It's possible to make this cpu-independent.
1884 One would have to deal with a few minor things.
1885 At this point in time doing so would be more of a curiosity than useful
1886 [for example this file isn't _that_ big], but keeping the possibility in
1887 mind helps keep the design clean. */
1890 m32c_cgen_assemble_insn (CGEN_CPU_DESC cd
,
1892 CGEN_FIELDS
*fields
,
1893 CGEN_INSN_BYTES_PTR buf
,
1897 CGEN_INSN_LIST
*ilist
;
1898 const char *parse_errmsg
= NULL
;
1899 const char *insert_errmsg
= NULL
;
1900 int recognized_mnemonic
= 0;
1902 /* Skip leading white space. */
1903 while (ISSPACE (* str
))
1906 /* The instructions are stored in hashed lists.
1907 Get the first in the list. */
1908 ilist
= CGEN_ASM_LOOKUP_INSN (cd
, str
);
1910 /* Keep looking until we find a match. */
1912 for ( ; ilist
!= NULL
; ilist
= CGEN_ASM_NEXT_INSN (ilist
))
1914 const CGEN_INSN
*insn
= ilist
->insn
;
1915 recognized_mnemonic
= 1;
1917 #ifdef CGEN_VALIDATE_INSN_SUPPORTED
1918 /* Not usually needed as unsupported opcodes
1919 shouldn't be in the hash lists. */
1920 /* Is this insn supported by the selected cpu? */
1921 if (! m32c_cgen_insn_supported (cd
, insn
))
1924 /* If the RELAXED attribute is set, this is an insn that shouldn't be
1925 chosen immediately. Instead, it is used during assembler/linker
1926 relaxation if possible. */
1927 if (CGEN_INSN_ATTR_VALUE (insn
, CGEN_INSN_RELAXED
) != 0)
1932 /* Skip this insn if str doesn't look right lexically. */
1933 if (CGEN_INSN_RX (insn
) != NULL
&&
1934 regexec ((regex_t
*) CGEN_INSN_RX (insn
), str
, 0, NULL
, 0) == REG_NOMATCH
)
1937 /* Allow parse/insert handlers to obtain length of insn. */
1938 CGEN_FIELDS_BITSIZE (fields
) = CGEN_INSN_BITSIZE (insn
);
1940 parse_errmsg
= CGEN_PARSE_FN (cd
, insn
) (cd
, insn
, & str
, fields
);
1941 if (parse_errmsg
!= NULL
)
1944 /* ??? 0 is passed for `pc'. */
1945 insert_errmsg
= CGEN_INSERT_FN (cd
, insn
) (cd
, insn
, fields
, buf
,
1947 if (insert_errmsg
!= NULL
)
1950 /* It is up to the caller to actually output the insn and any
1956 static char errbuf
[150];
1957 const char *tmp_errmsg
;
1958 #ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
1959 #define be_verbose 1
1961 #define be_verbose 0
1966 /* If requesting verbose error messages, use insert_errmsg.
1967 Failing that, use parse_errmsg. */
1968 tmp_errmsg
= (insert_errmsg
? insert_errmsg
:
1969 parse_errmsg
? parse_errmsg
:
1970 recognized_mnemonic
?
1971 _("unrecognized form of instruction") :
1972 _("unrecognized instruction"));
1974 if (strlen (start
) > 50)
1975 /* xgettext:c-format */
1976 sprintf (errbuf
, "%s `%.50s...'", tmp_errmsg
, start
);
1978 /* xgettext:c-format */
1979 sprintf (errbuf
, "%s `%.50s'", tmp_errmsg
, start
);
1983 if (strlen (start
) > 50)
1984 /* xgettext:c-format */
1985 sprintf (errbuf
, _("bad instruction `%.50s...'"), start
);
1987 /* xgettext:c-format */
1988 sprintf (errbuf
, _("bad instruction `%.50s'"), start
);