1 /* Assembler interface for targets using CGEN. -*- C -*-
2 CGEN: Cpu tools GENerator
4 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 - the resultant file is machine generated, cgen-asm.in isn't
7 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
8 Free Software Foundation, Inc.
10 This file is part of the GNU Binutils and GDB, the GNU debugger.
12 This program 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 2, or (at your option)
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public 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. */
26 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
34 #include "m32c-desc.h"
38 #include "libiberty.h"
39 #include "safe-ctype.h"
42 #define min(a,b) ((a) < (b) ? (a) : (b))
44 #define max(a,b) ((a) > (b) ? (a) : (b))
46 static const char * parse_insn_normal
47 (CGEN_CPU_DESC
, const CGEN_INSN
*, const char **, CGEN_FIELDS
*);
49 /* -- assembler routines inserted here. */
52 #include "safe-ctype.h"
54 #define MACH_M32C 5 /* Must match md_begin. */
57 m32c_cgen_isa_register (const char **strp
)
60 const char *s
= *strp
;
61 static char * m32c_register_names
[] =
63 "r0", "r1", "r2", "r3", "r0l", "r0h", "r1l", "r1h",
64 "a0", "a1", "r2r0", "r3r1", "sp", "fb", "dct0", "dct1", "flg", "svf",
65 "drc0", "drc1", "dmd0", "dmd1", "intb", "svp", "vct", "isp", "dma0",
66 "dma1", "dra0", "dra1", "dsa0", "dsa1", 0
69 for (u
= 0; m32c_register_names
[u
]; u
++)
71 int len
= strlen (m32c_register_names
[u
]);
73 if (memcmp (m32c_register_names
[u
], s
, len
) == 0
74 && (s
[len
] == 0 || ! ISALNUM (s
[len
])))
80 #define PARSE_UNSIGNED \
83 /* Don't successfully parse literals beginning with '['. */ \
85 return "Invalid literal"; /* Anything -- will not be seen. */ \
87 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);\
93 #define PARSE_SIGNED \
96 /* Don't successfully parse literals beginning with '['. */ \
98 return "Invalid literal"; /* Anything -- will not be seen. */ \
100 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); \
107 parse_unsigned6 (CGEN_CPU_DESC cd
, const char **strp
,
108 int opindex
, unsigned long *valuep
)
110 const char *errmsg
= 0;
116 return _("imm:6 immediate is out of range");
123 parse_unsigned8 (CGEN_CPU_DESC cd
, const char **strp
,
124 int opindex
, unsigned long *valuep
)
126 const char *errmsg
= 0;
130 if (strncasecmp (*strp
, "%dsp8(", 6) == 0)
132 enum cgen_parse_operand_result result_type
;
137 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_8
,
138 & result_type
, & value
);
140 return _("missing `)'");
144 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
146 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;
226 if (strncasecmp (*strp
, "%hi8(", 5) == 0)
228 enum cgen_parse_operand_result result_type
;
233 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_M32C_HI8
,
234 & result_type
, & value
);
236 return _("missing `)'");
240 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
250 if (value
<= 255 && value
> 127)
253 if (value
< -128 || value
> 127)
254 return _("dsp:8 immediate is out of range");
261 parse_unsigned16 (CGEN_CPU_DESC cd
, const char **strp
,
262 int opindex
, unsigned long *valuep
)
264 const char *errmsg
= 0;
268 if (strncasecmp (*strp
, "%dsp16(", 7) == 0)
270 enum cgen_parse_operand_result result_type
;
275 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_16
,
276 & result_type
, & value
);
278 return _("missing `)'");
282 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
284 return _("%dsp16() takes a symbolic address, not a number");
290 /* Don't successfully parse literals beginning with '['. */
292 return "Invalid literal"; /* Anything -- will not be seen. */
294 /* Don't successfully parse register names. */
295 if (m32c_cgen_isa_register (strp
))
296 return "Invalid literal"; /* Anything -- will not be seen. */
298 if (strncmp (*strp
, "0x0", 3) == 0
299 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
302 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
307 return _("dsp:16 immediate is out of range");
309 /* If this field may require a relocation then use larger dsp24. */
310 if (cd
->machs
== MACH_M32C
&& ! have_zero
&& value
== 0
311 && (strncmp (*strp
, "[a", 2) == 0
314 return _("dsp:16 immediate is out of range");
321 parse_signed16 (CGEN_CPU_DESC cd
, const char **strp
,
322 int opindex
, signed long *valuep
)
324 const char *errmsg
= 0;
327 if (strncasecmp (*strp
, "%lo16(", 6) == 0)
329 enum cgen_parse_operand_result result_type
;
334 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_LO16
,
335 & result_type
, & value
);
337 return _("missing `)'");
341 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
349 if (strncasecmp (*strp
, "%hi16(", 6) == 0)
351 enum cgen_parse_operand_result result_type
;
356 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_HI16
,
357 & result_type
, & value
);
359 return _("missing `)'");
363 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
373 if (value
<= 65535 && value
> 32767)
376 if (value
< -32768 || value
> 32767)
377 return _("dsp:16 immediate is out of range");
384 parse_unsigned20 (CGEN_CPU_DESC cd
, const char **strp
,
385 int opindex
, unsigned long *valuep
)
387 const char *errmsg
= 0;
390 /* Don't successfully parse literals beginning with '['. */
392 return "Invalid literal"; /* Anything -- will not be seen. */
394 /* Don't successfully parse register names. */
395 if (m32c_cgen_isa_register (strp
))
396 return "Invalid literal"; /* Anything -- will not be seen. */
398 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
403 return _("dsp:20 immediate is out of range");
410 parse_unsigned24 (CGEN_CPU_DESC cd
, const char **strp
,
411 int opindex
, unsigned long *valuep
)
413 const char *errmsg
= 0;
416 /* Don't successfully parse literals beginning with '['. */
418 return "Invalid literal"; /* Anything -- will not be seen. */
420 /* Don't successfully parse register names. */
421 if (m32c_cgen_isa_register (strp
))
422 return "Invalid literal"; /* Anything -- will not be seen. */
424 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
428 if (value
> 0xffffff)
429 return _("dsp:24 immediate is out of range");
435 /* This should only be used for #imm->reg. */
437 parse_signed24 (CGEN_CPU_DESC cd
, const char **strp
,
438 int opindex
, signed long *valuep
)
440 const char *errmsg
= 0;
445 if (value
<= 0xffffff && value
> 0x7fffff)
448 if (value
> 0xffffff)
449 return _("dsp:24 immediate is out of range");
456 parse_signed32 (CGEN_CPU_DESC cd
, const char **strp
,
457 int opindex
, signed long *valuep
)
459 const char *errmsg
= 0;
462 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
471 parse_imm1_S (CGEN_CPU_DESC cd
, const char **strp
,
472 int opindex
, signed long *valuep
)
474 const char *errmsg
= 0;
477 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
481 if (value
< 1 || value
> 2)
482 return _("immediate is out of range 1-2");
489 parse_imm3_S (CGEN_CPU_DESC cd
, const char **strp
,
490 int opindex
, signed long *valuep
)
492 const char *errmsg
= 0;
495 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
499 if (value
< 1 || value
> 8)
500 return _("immediate is out of range 1-8");
507 parse_bit3_S (CGEN_CPU_DESC cd
, const char **strp
,
508 int opindex
, signed long *valuep
)
510 const char *errmsg
= 0;
513 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
517 if (value
< 0 || value
> 7)
518 return _("immediate is out of range 0-7");
525 parse_lab_5_3 (CGEN_CPU_DESC cd
,
527 int opindex ATTRIBUTE_UNUSED
,
529 enum cgen_parse_operand_result
*type_addr
,
532 const char *errmsg
= 0;
534 enum cgen_parse_operand_result op_res
;
536 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_5_3
,
537 opinfo
, & op_res
, & value
);
542 if (op_res
== CGEN_PARSE_OPERAND_ADDRESS
)
544 /* This is a hack; the field cannot handle near-zero signed
545 offsets that CGEN wants to put in to indicate an "empty"
553 if (value
< 2 || value
> 9)
554 return _("immediate is out of range 2-9");
561 parse_Bitno16R (CGEN_CPU_DESC cd
, const char **strp
,
562 int opindex
, unsigned long *valuep
)
564 const char *errmsg
= 0;
567 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, opindex
, & value
);
572 return _("Bit number for indexing general register is out of range 0-15");
579 parse_unsigned_bitbase (CGEN_CPU_DESC cd
, const char **strp
,
580 int opindex
, unsigned long *valuep
,
583 const char *errmsg
= 0;
586 const char *newp
= *strp
;
587 unsigned long long bitbase
;
589 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & bit
);
594 return "Missing base for bit,base:8";
597 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & base
);
601 bitbase
= (unsigned long long) bit
+ ((unsigned long long) base
* 8);
603 if (bitbase
>= (1ull << bits
))
604 return _("bit,base is out of range");
612 parse_signed_bitbase (CGEN_CPU_DESC cd
, const char **strp
,
613 int opindex
, signed long *valuep
,
616 const char *errmsg
= 0;
619 const char *newp
= *strp
;
623 errmsg
= cgen_parse_unsigned_integer (cd
, & newp
, opindex
, & bit
);
628 return "Missing base for bit,base:8";
631 errmsg
= cgen_parse_signed_integer (cd
, & newp
, opindex
, & base
);
635 bitbase
= (long long)bit
+ ((long long)base
* 8);
637 limit
= 1ll << (bits
- 1);
638 if (bitbase
< -limit
|| bitbase
>= limit
)
639 return _("bit,base is out of range");
647 parse_unsigned_bitbase8 (CGEN_CPU_DESC cd
, const char **strp
,
648 int opindex
, unsigned long *valuep
)
650 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 8);
654 parse_unsigned_bitbase11 (CGEN_CPU_DESC cd
, const char **strp
,
655 int opindex
, unsigned long *valuep
)
657 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 11);
661 parse_unsigned_bitbase16 (CGEN_CPU_DESC cd
, const char **strp
,
662 int opindex
, unsigned long *valuep
)
664 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 16);
668 parse_unsigned_bitbase19 (CGEN_CPU_DESC cd
, const char **strp
,
669 int opindex
, unsigned long *valuep
)
671 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 19);
675 parse_unsigned_bitbase27 (CGEN_CPU_DESC cd
, const char **strp
,
676 int opindex
, unsigned long *valuep
)
678 return parse_unsigned_bitbase (cd
, strp
, opindex
, valuep
, 27);
682 parse_signed_bitbase8 (CGEN_CPU_DESC cd
, const char **strp
,
683 int opindex
, signed long *valuep
)
685 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 8);
689 parse_signed_bitbase11 (CGEN_CPU_DESC cd
, const char **strp
,
690 int opindex
, signed long *valuep
)
692 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 11);
696 parse_signed_bitbase19 (CGEN_CPU_DESC cd
, const char **strp
,
697 int opindex
, signed long *valuep
)
699 return parse_signed_bitbase (cd
, strp
, opindex
, valuep
, 19);
702 /* Parse the suffix as :<char> or as nothing followed by a whitespace. */
705 parse_suffix (const char **strp
, char suffix
)
707 const char *newp
= *strp
;
709 if (**strp
== ':' && TOLOWER (*(*strp
+ 1)) == suffix
)
718 return "Invalid suffix"; /* Anything -- will not be seen. */
722 parse_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
723 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
725 return parse_suffix (strp
, 's');
729 parse_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
730 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
732 return parse_suffix (strp
, 'g');
736 parse_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
737 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
739 return parse_suffix (strp
, 'q');
743 parse_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
744 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
746 return parse_suffix (strp
, 'z');
749 /* Parse an empty suffix. Fail if the next char is ':'. */
752 parse_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
753 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
756 return "Unexpected suffix";
761 parse_r0l_r0h (CGEN_CPU_DESC cd
, const char **strp
,
762 int opindex ATTRIBUTE_UNUSED
, signed long *valuep
)
767 const char *newp
= *strp
;
770 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0l_r0h
, & value
);
775 return _("not a valid r0l/r0h pair");
778 /* Parse the second register in the pair. */
779 if (value
== 0) /* r0l */
780 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0h
, & junk
);
782 errmsg
= cgen_parse_keyword (cd
, & newp
, & m32c_cgen_opval_h_r0l
, & junk
);
791 /* Accept .b or .w in any case. */
794 parse_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
, const char **strp
,
795 int opindex ATTRIBUTE_UNUSED
, signed long *valuep ATTRIBUTE_UNUSED
)
798 && (*(*strp
+ 1) == 'b' || *(*strp
+ 1) == 'B'
799 || *(*strp
+ 1) == 'w' || *(*strp
+ 1) == 'W'))
805 return _("Invalid size specifier");
808 /* Special check to ensure that instruction exists for given machine. */
811 m32c_cgen_insn_supported (CGEN_CPU_DESC cd
,
812 const CGEN_INSN
*insn
)
814 int machs
= CGEN_INSN_ATTR_VALUE (insn
, CGEN_INSN_MACH
);
815 CGEN_BITSET isas
= CGEN_INSN_BITSET_ATTR_VALUE (insn
, CGEN_INSN_ISA
);
817 /* If attributes are absent, assume no restriction. */
821 return ((machs
& cd
->machs
)
822 && cgen_bitset_intersect_p (& isas
, cd
->isas
));
825 /* Parse a set of registers, R0,R1,A0,A1,SB,FB. */
828 parse_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
830 int opindex ATTRIBUTE_UNUSED
,
831 unsigned long *valuep
,
834 const char *errmsg
= 0;
838 while (**strp
&& **strp
!= ')')
840 if (**strp
== 'r' || **strp
== 'R')
843 regno
= **strp
- '0';
845 errmsg
= _("Register number is not valid");
847 else if (**strp
== 'a' || **strp
== 'A')
850 regno
= **strp
- '0';
852 errmsg
= _("Register number is not valid");
853 regno
= **strp
- '0' + 4;
856 else if (strncasecmp (*strp
, "sb", 2) == 0 || strncasecmp (*strp
, "SB", 2) == 0)
862 else if (strncasecmp (*strp
, "fb", 2) == 0 || strncasecmp (*strp
, "FB", 2) == 0)
868 if (push
) /* Mask is reversed for push. */
869 *valuep
|= 0x80 >> regno
;
871 *valuep
|= 1 << regno
;
876 if (*(*strp
+ 1) == ')')
883 errmsg
= _("Register list is not valid");
892 parse_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
894 int opindex ATTRIBUTE_UNUSED
,
895 unsigned long *valuep
)
897 return parse_regset (cd
, strp
, opindex
, valuep
, POP
);
901 parse_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
903 int opindex ATTRIBUTE_UNUSED
,
904 unsigned long *valuep
)
906 return parse_regset (cd
, strp
, opindex
, valuep
, PUSH
);
911 const char * m32c_cgen_parse_operand
912 (CGEN_CPU_DESC
, int, const char **, CGEN_FIELDS
*);
914 /* Main entry point for operand parsing.
916 This function is basically just a big switch statement. Earlier versions
917 used tables to look up the function to use, but
918 - if the table contains both assembler and disassembler functions then
919 the disassembler contains much of the assembler and vice-versa,
920 - there's a lot of inlining possibilities as things grow,
921 - using a switch statement avoids the function call overhead.
923 This function could be moved into `parse_insn_normal', but keeping it
924 separate makes clear the interface between `parse_insn_normal' and each of
928 m32c_cgen_parse_operand (CGEN_CPU_DESC cd
,
931 CGEN_FIELDS
* fields
)
933 const char * errmsg
= NULL
;
934 /* Used by scalar operands that still need to be parsed. */
935 long junk ATTRIBUTE_UNUSED
;
939 case M32C_OPERAND_A0
:
940 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_a0
, & junk
);
942 case M32C_OPERAND_A1
:
943 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_a1
, & junk
);
945 case M32C_OPERAND_AN16_PUSH_S
:
946 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_4_1
);
948 case M32C_OPERAND_BIT16AN
:
949 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst16_an
);
951 case M32C_OPERAND_BIT16RN
:
952 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst16_rn
);
954 case M32C_OPERAND_BIT3_S
:
955 errmsg
= parse_bit3_S (cd
, strp
, M32C_OPERAND_BIT3_S
, (long *) (& fields
->f_imm3_S
));
957 case M32C_OPERAND_BIT32ANPREFIXED
:
958 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
960 case M32C_OPERAND_BIT32ANUNPREFIXED
:
961 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
963 case M32C_OPERAND_BIT32RNPREFIXED
:
964 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_prefixed_QI
);
966 case M32C_OPERAND_BIT32RNUNPREFIXED
:
967 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_unprefixed_QI
);
969 case M32C_OPERAND_BITBASE16_16_S8
:
970 errmsg
= parse_signed_bitbase8 (cd
, strp
, M32C_OPERAND_BITBASE16_16_S8
, (long *) (& fields
->f_dsp_16_s8
));
972 case M32C_OPERAND_BITBASE16_16_U16
:
973 errmsg
= parse_unsigned_bitbase16 (cd
, strp
, M32C_OPERAND_BITBASE16_16_U16
, (unsigned long *) (& fields
->f_dsp_16_u16
));
975 case M32C_OPERAND_BITBASE16_16_U8
:
976 errmsg
= parse_unsigned_bitbase8 (cd
, strp
, M32C_OPERAND_BITBASE16_16_U8
, (unsigned long *) (& fields
->f_dsp_16_u8
));
978 case M32C_OPERAND_BITBASE16_8_U11_S
:
979 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE16_8_U11_S
, (unsigned long *) (& fields
->f_bitbase16_u11_S
));
981 case M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED
:
982 errmsg
= parse_signed_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_16_S11_UNPREFIXED
, (long *) (& fields
->f_bitbase32_16_s11_unprefixed
));
984 case M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED
:
985 errmsg
= parse_signed_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_16_S19_UNPREFIXED
, (long *) (& fields
->f_bitbase32_16_s19_unprefixed
));
987 case M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED
:
988 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U11_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u11_unprefixed
));
990 case M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED
:
991 errmsg
= parse_unsigned_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U19_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u19_unprefixed
));
993 case M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED
:
994 errmsg
= parse_unsigned_bitbase27 (cd
, strp
, M32C_OPERAND_BITBASE32_16_U27_UNPREFIXED
, (unsigned long *) (& fields
->f_bitbase32_16_u27_unprefixed
));
996 case M32C_OPERAND_BITBASE32_24_S11_PREFIXED
:
997 errmsg
= parse_signed_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_24_S11_PREFIXED
, (long *) (& fields
->f_bitbase32_24_s11_prefixed
));
999 case M32C_OPERAND_BITBASE32_24_S19_PREFIXED
:
1000 errmsg
= parse_signed_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_24_S19_PREFIXED
, (long *) (& fields
->f_bitbase32_24_s19_prefixed
));
1002 case M32C_OPERAND_BITBASE32_24_U11_PREFIXED
:
1003 errmsg
= parse_unsigned_bitbase11 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U11_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u11_prefixed
));
1005 case M32C_OPERAND_BITBASE32_24_U19_PREFIXED
:
1006 errmsg
= parse_unsigned_bitbase19 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U19_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u19_prefixed
));
1008 case M32C_OPERAND_BITBASE32_24_U27_PREFIXED
:
1009 errmsg
= parse_unsigned_bitbase27 (cd
, strp
, M32C_OPERAND_BITBASE32_24_U27_PREFIXED
, (unsigned long *) (& fields
->f_bitbase32_24_u27_prefixed
));
1011 case M32C_OPERAND_BITNO16R
:
1012 errmsg
= parse_Bitno16R (cd
, strp
, M32C_OPERAND_BITNO16R
, (unsigned long *) (& fields
->f_dsp_16_u8
));
1014 case M32C_OPERAND_BITNO32PREFIXED
:
1015 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, M32C_OPERAND_BITNO32PREFIXED
, (unsigned long *) (& fields
->f_bitno32_prefixed
));
1017 case M32C_OPERAND_BITNO32UNPREFIXED
:
1018 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, M32C_OPERAND_BITNO32UNPREFIXED
, (unsigned long *) (& fields
->f_bitno32_unprefixed
));
1020 case M32C_OPERAND_DSP_10_U6
:
1021 errmsg
= parse_unsigned6 (cd
, strp
, M32C_OPERAND_DSP_10_U6
, (unsigned long *) (& fields
->f_dsp_10_u6
));
1023 case M32C_OPERAND_DSP_16_S16
:
1024 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_16_S16
, (long *) (& fields
->f_dsp_16_s16
));
1026 case M32C_OPERAND_DSP_16_S8
:
1027 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_16_S8
, (long *) (& fields
->f_dsp_16_s8
));
1029 case M32C_OPERAND_DSP_16_U16
:
1030 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_16_U16
, (unsigned long *) (& fields
->f_dsp_16_u16
));
1032 case M32C_OPERAND_DSP_16_U20
:
1033 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_16_U20
, (unsigned long *) (& fields
->f_dsp_16_u24
));
1035 case M32C_OPERAND_DSP_16_U24
:
1036 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_16_U24
, (unsigned long *) (& fields
->f_dsp_16_u24
));
1038 case M32C_OPERAND_DSP_16_U8
:
1039 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_16_U8
, (unsigned long *) (& fields
->f_dsp_16_u8
));
1041 case M32C_OPERAND_DSP_24_S16
:
1042 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_24_S16
, (long *) (& fields
->f_dsp_24_s16
));
1044 case M32C_OPERAND_DSP_24_S8
:
1045 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_24_S8
, (long *) (& fields
->f_dsp_24_s8
));
1047 case M32C_OPERAND_DSP_24_U16
:
1048 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_24_U16
, (unsigned long *) (& fields
->f_dsp_24_u16
));
1050 case M32C_OPERAND_DSP_24_U20
:
1051 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_24_U20
, (unsigned long *) (& fields
->f_dsp_24_u24
));
1053 case M32C_OPERAND_DSP_24_U24
:
1054 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_24_U24
, (unsigned long *) (& fields
->f_dsp_24_u24
));
1056 case M32C_OPERAND_DSP_24_U8
:
1057 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_24_U8
, (unsigned long *) (& fields
->f_dsp_24_u8
));
1059 case M32C_OPERAND_DSP_32_S16
:
1060 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_32_S16
, (long *) (& fields
->f_dsp_32_s16
));
1062 case M32C_OPERAND_DSP_32_S8
:
1063 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_32_S8
, (long *) (& fields
->f_dsp_32_s8
));
1065 case M32C_OPERAND_DSP_32_U16
:
1066 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_32_U16
, (unsigned long *) (& fields
->f_dsp_32_u16
));
1068 case M32C_OPERAND_DSP_32_U20
:
1069 errmsg
= parse_unsigned20 (cd
, strp
, M32C_OPERAND_DSP_32_U20
, (unsigned long *) (& fields
->f_dsp_32_u24
));
1071 case M32C_OPERAND_DSP_32_U24
:
1072 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_32_U24
, (unsigned long *) (& fields
->f_dsp_32_u24
));
1074 case M32C_OPERAND_DSP_32_U8
:
1075 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_32_U8
, (unsigned long *) (& fields
->f_dsp_32_u8
));
1077 case M32C_OPERAND_DSP_40_S16
:
1078 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_40_S16
, (long *) (& fields
->f_dsp_40_s16
));
1080 case M32C_OPERAND_DSP_40_S8
:
1081 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_40_S8
, (long *) (& fields
->f_dsp_40_s8
));
1083 case M32C_OPERAND_DSP_40_U16
:
1084 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_40_U16
, (unsigned long *) (& fields
->f_dsp_40_u16
));
1086 case M32C_OPERAND_DSP_40_U24
:
1087 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_40_U24
, (unsigned long *) (& fields
->f_dsp_40_u24
));
1089 case M32C_OPERAND_DSP_40_U8
:
1090 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_40_U8
, (unsigned long *) (& fields
->f_dsp_40_u8
));
1092 case M32C_OPERAND_DSP_48_S16
:
1093 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_DSP_48_S16
, (long *) (& fields
->f_dsp_48_s16
));
1095 case M32C_OPERAND_DSP_48_S8
:
1096 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_48_S8
, (long *) (& fields
->f_dsp_48_s8
));
1098 case M32C_OPERAND_DSP_48_U16
:
1099 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_48_U16
, (unsigned long *) (& fields
->f_dsp_48_u16
));
1101 case M32C_OPERAND_DSP_48_U24
:
1102 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_48_U24
, (unsigned long *) (& fields
->f_dsp_48_u24
));
1104 case M32C_OPERAND_DSP_48_U8
:
1105 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_48_U8
, (unsigned long *) (& fields
->f_dsp_48_u8
));
1107 case M32C_OPERAND_DSP_8_S24
:
1108 errmsg
= parse_signed24 (cd
, strp
, M32C_OPERAND_DSP_8_S24
, (long *) (& fields
->f_dsp_8_s24
));
1110 case M32C_OPERAND_DSP_8_S8
:
1111 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_DSP_8_S8
, (long *) (& fields
->f_dsp_8_s8
));
1113 case M32C_OPERAND_DSP_8_U16
:
1114 errmsg
= parse_unsigned16 (cd
, strp
, M32C_OPERAND_DSP_8_U16
, (unsigned long *) (& fields
->f_dsp_8_u16
));
1116 case M32C_OPERAND_DSP_8_U24
:
1117 errmsg
= parse_unsigned24 (cd
, strp
, M32C_OPERAND_DSP_8_U24
, (unsigned long *) (& fields
->f_dsp_8_u24
));
1119 case M32C_OPERAND_DSP_8_U6
:
1120 errmsg
= parse_unsigned6 (cd
, strp
, M32C_OPERAND_DSP_8_U6
, (unsigned long *) (& fields
->f_dsp_8_u6
));
1122 case M32C_OPERAND_DSP_8_U8
:
1123 errmsg
= parse_unsigned8 (cd
, strp
, M32C_OPERAND_DSP_8_U8
, (unsigned long *) (& fields
->f_dsp_8_u8
));
1125 case M32C_OPERAND_DST16AN
:
1126 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst16_an
);
1128 case M32C_OPERAND_DST16AN_S
:
1129 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst16_an_s
);
1131 case M32C_OPERAND_DST16ANHI
:
1132 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst16_an
);
1134 case M32C_OPERAND_DST16ANQI
:
1135 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst16_an
);
1137 case M32C_OPERAND_DST16ANQI_S
:
1138 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst16_rn_QI_s
);
1140 case M32C_OPERAND_DST16ANSI
:
1141 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_SI
, & fields
->f_dst16_an
);
1143 case M32C_OPERAND_DST16RNEXTQI
:
1144 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_QI
, & fields
->f_dst16_rn_ext
);
1146 case M32C_OPERAND_DST16RNHI
:
1147 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst16_rn
);
1149 case M32C_OPERAND_DST16RNQI
:
1150 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst16_rn
);
1152 case M32C_OPERAND_DST16RNQI_S
:
1153 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l_r0h
, & fields
->f_dst16_rn_QI_s
);
1155 case M32C_OPERAND_DST16RNSI
:
1156 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst16_rn
);
1158 case M32C_OPERAND_DST32ANEXTUNPREFIXED
:
1159 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1161 case M32C_OPERAND_DST32ANPREFIXED
:
1162 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
1164 case M32C_OPERAND_DST32ANPREFIXEDHI
:
1165 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst32_an_prefixed
);
1167 case M32C_OPERAND_DST32ANPREFIXEDQI
:
1168 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst32_an_prefixed
);
1170 case M32C_OPERAND_DST32ANPREFIXEDSI
:
1171 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_prefixed
);
1173 case M32C_OPERAND_DST32ANUNPREFIXED
:
1174 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1176 case M32C_OPERAND_DST32ANUNPREFIXEDHI
:
1177 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_dst32_an_unprefixed
);
1179 case M32C_OPERAND_DST32ANUNPREFIXEDQI
:
1180 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_dst32_an_unprefixed
);
1182 case M32C_OPERAND_DST32ANUNPREFIXEDSI
:
1183 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_dst32_an_unprefixed
);
1185 case M32C_OPERAND_DST32R0HI_S
:
1186 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0
, & junk
);
1188 case M32C_OPERAND_DST32R0QI_S
:
1189 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l
, & junk
);
1191 case M32C_OPERAND_DST32RNEXTUNPREFIXEDHI
:
1192 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_HI
, & fields
->f_dst32_rn_ext_unprefixed
);
1194 case M32C_OPERAND_DST32RNEXTUNPREFIXEDQI
:
1195 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_ext_QI
, & fields
->f_dst32_rn_ext_unprefixed
);
1197 case M32C_OPERAND_DST32RNPREFIXEDHI
:
1198 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst32_rn_prefixed_HI
);
1200 case M32C_OPERAND_DST32RNPREFIXEDQI
:
1201 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_prefixed_QI
);
1203 case M32C_OPERAND_DST32RNPREFIXEDSI
:
1204 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst32_rn_prefixed_SI
);
1206 case M32C_OPERAND_DST32RNUNPREFIXEDHI
:
1207 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_dst32_rn_unprefixed_HI
);
1209 case M32C_OPERAND_DST32RNUNPREFIXEDQI
:
1210 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_dst32_rn_unprefixed_QI
);
1212 case M32C_OPERAND_DST32RNUNPREFIXEDSI
:
1213 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_dst32_rn_unprefixed_SI
);
1215 case M32C_OPERAND_G
:
1216 errmsg
= parse_G (cd
, strp
, M32C_OPERAND_G
, (long *) (& junk
));
1218 case M32C_OPERAND_IMM_12_S4
:
1219 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_12_S4
, (long *) (& fields
->f_imm_12_s4
));
1221 case M32C_OPERAND_IMM_12_S4N
:
1222 errmsg
= parse_signed4n (cd
, strp
, M32C_OPERAND_IMM_12_S4N
, (long *) (& fields
->f_imm_12_s4
));
1224 case M32C_OPERAND_IMM_13_U3
:
1225 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_13_U3
, (long *) (& fields
->f_imm_13_u3
));
1227 case M32C_OPERAND_IMM_16_HI
:
1228 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_16_HI
, (long *) (& fields
->f_dsp_16_s16
));
1230 case M32C_OPERAND_IMM_16_QI
:
1231 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_16_QI
, (long *) (& fields
->f_dsp_16_s8
));
1233 case M32C_OPERAND_IMM_16_SI
:
1234 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_16_SI
, (long *) (& fields
->f_dsp_16_s32
));
1236 case M32C_OPERAND_IMM_20_S4
:
1237 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_20_S4
, (long *) (& fields
->f_imm_20_s4
));
1239 case M32C_OPERAND_IMM_24_HI
:
1240 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_24_HI
, (long *) (& fields
->f_dsp_24_s16
));
1242 case M32C_OPERAND_IMM_24_QI
:
1243 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_24_QI
, (long *) (& fields
->f_dsp_24_s8
));
1245 case M32C_OPERAND_IMM_24_SI
:
1246 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_24_SI
, (long *) (& fields
->f_dsp_24_s32
));
1248 case M32C_OPERAND_IMM_32_HI
:
1249 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_32_HI
, (long *) (& fields
->f_dsp_32_s16
));
1251 case M32C_OPERAND_IMM_32_QI
:
1252 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_32_QI
, (long *) (& fields
->f_dsp_32_s8
));
1254 case M32C_OPERAND_IMM_32_SI
:
1255 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_32_SI
, (long *) (& fields
->f_dsp_32_s32
));
1257 case M32C_OPERAND_IMM_40_HI
:
1258 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_40_HI
, (long *) (& fields
->f_dsp_40_s16
));
1260 case M32C_OPERAND_IMM_40_QI
:
1261 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_40_QI
, (long *) (& fields
->f_dsp_40_s8
));
1263 case M32C_OPERAND_IMM_40_SI
:
1264 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_40_SI
, (long *) (& fields
->f_dsp_40_s32
));
1266 case M32C_OPERAND_IMM_48_HI
:
1267 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_48_HI
, (long *) (& fields
->f_dsp_48_s16
));
1269 case M32C_OPERAND_IMM_48_QI
:
1270 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_48_QI
, (long *) (& fields
->f_dsp_48_s8
));
1272 case M32C_OPERAND_IMM_48_SI
:
1273 errmsg
= parse_signed32 (cd
, strp
, M32C_OPERAND_IMM_48_SI
, (long *) (& fields
->f_dsp_48_s32
));
1275 case M32C_OPERAND_IMM_56_HI
:
1276 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_56_HI
, (long *) (& fields
->f_dsp_56_s16
));
1278 case M32C_OPERAND_IMM_56_QI
:
1279 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_56_QI
, (long *) (& fields
->f_dsp_56_s8
));
1281 case M32C_OPERAND_IMM_64_HI
:
1282 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_64_HI
, (long *) (& fields
->f_dsp_64_s16
));
1284 case M32C_OPERAND_IMM_8_HI
:
1285 errmsg
= parse_signed16 (cd
, strp
, M32C_OPERAND_IMM_8_HI
, (long *) (& fields
->f_dsp_8_s16
));
1287 case M32C_OPERAND_IMM_8_QI
:
1288 errmsg
= parse_signed8 (cd
, strp
, M32C_OPERAND_IMM_8_QI
, (long *) (& fields
->f_dsp_8_s8
));
1290 case M32C_OPERAND_IMM_8_S4
:
1291 errmsg
= parse_signed4 (cd
, strp
, M32C_OPERAND_IMM_8_S4
, (long *) (& fields
->f_imm_8_s4
));
1293 case M32C_OPERAND_IMM_8_S4N
:
1294 errmsg
= parse_signed4n (cd
, strp
, M32C_OPERAND_IMM_8_S4N
, (long *) (& fields
->f_imm_8_s4
));
1296 case M32C_OPERAND_IMM_SH_12_S4
:
1297 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_12_s4
);
1299 case M32C_OPERAND_IMM_SH_20_S4
:
1300 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_20_s4
);
1302 case M32C_OPERAND_IMM_SH_8_S4
:
1303 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_shimm
, & fields
->f_imm_8_s4
);
1305 case M32C_OPERAND_IMM1_S
:
1306 errmsg
= parse_imm1_S (cd
, strp
, M32C_OPERAND_IMM1_S
, (long *) (& fields
->f_imm1_S
));
1308 case M32C_OPERAND_IMM3_S
:
1309 errmsg
= parse_imm3_S (cd
, strp
, M32C_OPERAND_IMM3_S
, (long *) (& fields
->f_imm3_S
));
1311 case M32C_OPERAND_LAB_16_8
:
1314 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_16_8
, 0, NULL
, & value
);
1315 fields
->f_lab_16_8
= value
;
1318 case M32C_OPERAND_LAB_24_8
:
1321 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_24_8
, 0, NULL
, & value
);
1322 fields
->f_lab_24_8
= value
;
1325 case M32C_OPERAND_LAB_32_8
:
1328 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_32_8
, 0, NULL
, & value
);
1329 fields
->f_lab_32_8
= value
;
1332 case M32C_OPERAND_LAB_40_8
:
1335 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_40_8
, 0, NULL
, & value
);
1336 fields
->f_lab_40_8
= value
;
1339 case M32C_OPERAND_LAB_5_3
:
1342 errmsg
= parse_lab_5_3 (cd
, strp
, M32C_OPERAND_LAB_5_3
, 0, NULL
, & value
);
1343 fields
->f_lab_5_3
= value
;
1346 case M32C_OPERAND_LAB_8_16
:
1349 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_16
, 0, NULL
, & value
);
1350 fields
->f_lab_8_16
= value
;
1353 case M32C_OPERAND_LAB_8_24
:
1356 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_24
, 0, NULL
, & value
);
1357 fields
->f_lab_8_24
= value
;
1360 case M32C_OPERAND_LAB_8_8
:
1363 errmsg
= cgen_parse_address (cd
, strp
, M32C_OPERAND_LAB_8_8
, 0, NULL
, & value
);
1364 fields
->f_lab_8_8
= value
;
1367 case M32C_OPERAND_LAB32_JMP_S
:
1370 errmsg
= parse_lab_5_3 (cd
, strp
, M32C_OPERAND_LAB32_JMP_S
, 0, NULL
, & value
);
1371 fields
->f_lab32_jmp_s
= value
;
1374 case M32C_OPERAND_Q
:
1375 errmsg
= parse_Q (cd
, strp
, M32C_OPERAND_Q
, (long *) (& junk
));
1377 case M32C_OPERAND_R0
:
1378 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0
, & junk
);
1380 case M32C_OPERAND_R0H
:
1381 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0h
, & junk
);
1383 case M32C_OPERAND_R0L
:
1384 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r0l
, & junk
);
1386 case M32C_OPERAND_R1
:
1387 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r1
, & junk
);
1389 case M32C_OPERAND_R1R2R0
:
1390 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r1r2r0
, & junk
);
1392 case M32C_OPERAND_R2
:
1393 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r2
, & junk
);
1395 case M32C_OPERAND_R2R0
:
1396 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r2r0
, & junk
);
1398 case M32C_OPERAND_R3
:
1399 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r3
, & junk
);
1401 case M32C_OPERAND_R3R1
:
1402 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_r3r1
, & junk
);
1404 case M32C_OPERAND_REGSETPOP
:
1405 errmsg
= parse_pop_regset (cd
, strp
, M32C_OPERAND_REGSETPOP
, (unsigned long *) (& fields
->f_8_8
));
1407 case M32C_OPERAND_REGSETPUSH
:
1408 errmsg
= parse_push_regset (cd
, strp
, M32C_OPERAND_REGSETPUSH
, (unsigned long *) (& fields
->f_8_8
));
1410 case M32C_OPERAND_RN16_PUSH_S
:
1411 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_4_1
);
1413 case M32C_OPERAND_S
:
1414 errmsg
= parse_S (cd
, strp
, M32C_OPERAND_S
, (long *) (& junk
));
1416 case M32C_OPERAND_SRC16AN
:
1417 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src16_an
);
1419 case M32C_OPERAND_SRC16ANHI
:
1420 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src16_an
);
1422 case M32C_OPERAND_SRC16ANQI
:
1423 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src16_an
);
1425 case M32C_OPERAND_SRC16RNHI
:
1426 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src16_rn
);
1428 case M32C_OPERAND_SRC16RNQI
:
1429 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src16_rn
);
1431 case M32C_OPERAND_SRC32ANPREFIXED
:
1432 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_prefixed
);
1434 case M32C_OPERAND_SRC32ANPREFIXEDHI
:
1435 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src32_an_prefixed
);
1437 case M32C_OPERAND_SRC32ANPREFIXEDQI
:
1438 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src32_an_prefixed
);
1440 case M32C_OPERAND_SRC32ANPREFIXEDSI
:
1441 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_prefixed
);
1443 case M32C_OPERAND_SRC32ANUNPREFIXED
:
1444 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_unprefixed
);
1446 case M32C_OPERAND_SRC32ANUNPREFIXEDHI
:
1447 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_HI
, & fields
->f_src32_an_unprefixed
);
1449 case M32C_OPERAND_SRC32ANUNPREFIXEDQI
:
1450 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar_QI
, & fields
->f_src32_an_unprefixed
);
1452 case M32C_OPERAND_SRC32ANUNPREFIXEDSI
:
1453 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_ar
, & fields
->f_src32_an_unprefixed
);
1455 case M32C_OPERAND_SRC32RNPREFIXEDHI
:
1456 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src32_rn_prefixed_HI
);
1458 case M32C_OPERAND_SRC32RNPREFIXEDQI
:
1459 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src32_rn_prefixed_QI
);
1461 case M32C_OPERAND_SRC32RNPREFIXEDSI
:
1462 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_src32_rn_prefixed_SI
);
1464 case M32C_OPERAND_SRC32RNUNPREFIXEDHI
:
1465 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_HI
, & fields
->f_src32_rn_unprefixed_HI
);
1467 case M32C_OPERAND_SRC32RNUNPREFIXEDQI
:
1468 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_QI
, & fields
->f_src32_rn_unprefixed_QI
);
1470 case M32C_OPERAND_SRC32RNUNPREFIXEDSI
:
1471 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_gr_SI
, & fields
->f_src32_rn_unprefixed_SI
);
1473 case M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL
:
1474 errmsg
= parse_r0l_r0h (cd
, strp
, M32C_OPERAND_SRCDST16_R0L_R0H_S_NORMAL
, (long *) (& fields
->f_5_1
));
1476 case M32C_OPERAND_X
:
1477 errmsg
= parse_X (cd
, strp
, M32C_OPERAND_X
, (long *) (& junk
));
1479 case M32C_OPERAND_Z
:
1480 errmsg
= parse_Z (cd
, strp
, M32C_OPERAND_Z
, (long *) (& junk
));
1482 case M32C_OPERAND_COND16_16
:
1483 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_16_u8
);
1485 case M32C_OPERAND_COND16_24
:
1486 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_24_u8
);
1488 case M32C_OPERAND_COND16_32
:
1489 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16
, & fields
->f_dsp_32_u8
);
1491 case M32C_OPERAND_COND16C
:
1492 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16c
, & fields
->f_cond16
);
1494 case M32C_OPERAND_COND16J
:
1495 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16j
, & fields
->f_cond16
);
1497 case M32C_OPERAND_COND16J5
:
1498 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond16j_5
, & fields
->f_cond16j_5
);
1500 case M32C_OPERAND_COND32
:
1501 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond32
);
1503 case M32C_OPERAND_COND32_16
:
1504 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_16_u8
);
1506 case M32C_OPERAND_COND32_24
:
1507 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_24_u8
);
1509 case M32C_OPERAND_COND32_32
:
1510 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_32_u8
);
1512 case M32C_OPERAND_COND32_40
:
1513 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_dsp_40_u8
);
1515 case M32C_OPERAND_COND32J
:
1516 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond32j
);
1518 case M32C_OPERAND_CR1_PREFIXED_32
:
1519 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr1_32
, & fields
->f_21_3
);
1521 case M32C_OPERAND_CR1_UNPREFIXED_32
:
1522 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr1_32
, & fields
->f_13_3
);
1524 case M32C_OPERAND_CR16
:
1525 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr_16
, & fields
->f_9_3
);
1527 case M32C_OPERAND_CR2_32
:
1528 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr2_32
, & fields
->f_13_3
);
1530 case M32C_OPERAND_CR3_PREFIXED_32
:
1531 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr3_32
, & fields
->f_21_3
);
1533 case M32C_OPERAND_CR3_UNPREFIXED_32
:
1534 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cr3_32
, & fields
->f_13_3
);
1536 case M32C_OPERAND_FLAGS16
:
1537 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_flags
, & fields
->f_9_3
);
1539 case M32C_OPERAND_FLAGS32
:
1540 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_flags
, & fields
->f_13_3
);
1542 case M32C_OPERAND_SCCOND32
:
1543 errmsg
= cgen_parse_keyword (cd
, strp
, & m32c_cgen_opval_h_cond32
, & fields
->f_cond16
);
1545 case M32C_OPERAND_SIZE
:
1546 errmsg
= parse_size (cd
, strp
, M32C_OPERAND_SIZE
, (long *) (& junk
));
1550 /* xgettext:c-format */
1551 fprintf (stderr
, _("Unrecognized field %d while parsing.\n"), opindex
);
1558 cgen_parse_fn
* const m32c_cgen_parse_handlers
[] =
1564 m32c_cgen_init_asm (CGEN_CPU_DESC cd
)
1566 m32c_cgen_init_opcode_table (cd
);
1567 m32c_cgen_init_ibld_table (cd
);
1568 cd
->parse_handlers
= & m32c_cgen_parse_handlers
[0];
1569 cd
->parse_operand
= m32c_cgen_parse_operand
;
1574 /* Regex construction routine.
1576 This translates an opcode syntax string into a regex string,
1577 by replacing any non-character syntax element (such as an
1578 opcode) with the pattern '.*'
1580 It then compiles the regex and stores it in the opcode, for
1581 later use by m32c_cgen_assemble_insn
1583 Returns NULL for success, an error message for failure. */
1586 m32c_cgen_build_insn_regex (CGEN_INSN
*insn
)
1588 CGEN_OPCODE
*opc
= (CGEN_OPCODE
*) CGEN_INSN_OPCODE (insn
);
1589 const char *mnem
= CGEN_INSN_MNEMONIC (insn
);
1590 char rxbuf
[CGEN_MAX_RX_ELEMENTS
];
1592 const CGEN_SYNTAX_CHAR_TYPE
*syn
;
1595 syn
= CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc
));
1597 /* Mnemonics come first in the syntax string. */
1598 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1599 return _("missing mnemonic in syntax string");
1602 /* Generate a case sensitive regular expression that emulates case
1603 insensitive matching in the "C" locale. We cannot generate a case
1604 insensitive regular expression because in Turkish locales, 'i' and 'I'
1605 are not equal modulo case conversion. */
1607 /* Copy the literal mnemonic out of the insn. */
1608 for (; *mnem
; mnem
++)
1615 *rx
++ = TOLOWER (c
);
1616 *rx
++ = TOUPPER (c
);
1623 /* Copy any remaining literals from the syntax string into the rx. */
1624 for(; * syn
!= 0 && rx
<= rxbuf
+ (CGEN_MAX_RX_ELEMENTS
- 7 - 4); ++syn
)
1626 if (CGEN_SYNTAX_CHAR_P (* syn
))
1628 char c
= CGEN_SYNTAX_CHAR (* syn
);
1632 /* Escape any regex metacharacters in the syntax. */
1633 case '.': case '[': case '\\':
1634 case '*': case '^': case '$':
1636 #ifdef CGEN_ESCAPE_EXTENDED_REGEX
1637 case '?': case '{': case '}':
1638 case '(': case ')': case '*':
1639 case '|': case '+': case ']':
1649 *rx
++ = TOLOWER (c
);
1650 *rx
++ = TOUPPER (c
);
1660 /* Replace non-syntax fields with globs. */
1666 /* Trailing whitespace ok. */
1673 /* But anchor it after that. */
1677 CGEN_INSN_RX (insn
) = xmalloc (sizeof (regex_t
));
1678 reg_err
= regcomp ((regex_t
*) CGEN_INSN_RX (insn
), rxbuf
, REG_NOSUB
);
1684 static char msg
[80];
1686 regerror (reg_err
, (regex_t
*) CGEN_INSN_RX (insn
), msg
, 80);
1687 regfree ((regex_t
*) CGEN_INSN_RX (insn
));
1688 free (CGEN_INSN_RX (insn
));
1689 (CGEN_INSN_RX (insn
)) = NULL
;
1695 /* Default insn parser.
1697 The syntax string is scanned and operands are parsed and stored in FIELDS.
1698 Relocs are queued as we go via other callbacks.
1700 ??? Note that this is currently an all-or-nothing parser. If we fail to
1701 parse the instruction, we return 0 and the caller will start over from
1702 the beginning. Backtracking will be necessary in parsing subexpressions,
1703 but that can be handled there. Not handling backtracking here may get
1704 expensive in the case of the m68k. Deal with later.
1706 Returns NULL for success, an error message for failure. */
1709 parse_insn_normal (CGEN_CPU_DESC cd
,
1710 const CGEN_INSN
*insn
,
1712 CGEN_FIELDS
*fields
)
1714 /* ??? Runtime added insns not handled yet. */
1715 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
1716 const char *str
= *strp
;
1719 const CGEN_SYNTAX_CHAR_TYPE
* syn
;
1720 #ifdef CGEN_MNEMONIC_OPERANDS
1725 /* For now we assume the mnemonic is first (there are no leading operands).
1726 We can parse it without needing to set up operand parsing.
1727 GAS's input scrubber will ensure mnemonics are lowercase, but we may
1728 not be called from GAS. */
1729 p
= CGEN_INSN_MNEMONIC (insn
);
1730 while (*p
&& TOLOWER (*p
) == TOLOWER (*str
))
1734 return _("unrecognized instruction");
1736 #ifndef CGEN_MNEMONIC_OPERANDS
1737 if (* str
&& ! ISSPACE (* str
))
1738 return _("unrecognized instruction");
1741 CGEN_INIT_PARSE (cd
);
1742 cgen_init_parse_operand (cd
);
1743 #ifdef CGEN_MNEMONIC_OPERANDS
1747 /* We don't check for (*str != '\0') here because we want to parse
1748 any trailing fake arguments in the syntax string. */
1749 syn
= CGEN_SYNTAX_STRING (syntax
);
1751 /* Mnemonics come first for now, ensure valid string. */
1752 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1759 /* Non operand chars must match exactly. */
1760 if (CGEN_SYNTAX_CHAR_P (* syn
))
1762 /* FIXME: While we allow for non-GAS callers above, we assume the
1763 first char after the mnemonic part is a space. */
1764 /* FIXME: We also take inappropriate advantage of the fact that
1765 GAS's input scrubber will remove extraneous blanks. */
1766 if (TOLOWER (*str
) == TOLOWER (CGEN_SYNTAX_CHAR (* syn
)))
1768 #ifdef CGEN_MNEMONIC_OPERANDS
1769 if (CGEN_SYNTAX_CHAR(* syn
) == ' ')
1777 /* Syntax char didn't match. Can't be this insn. */
1778 static char msg
[80];
1780 /* xgettext:c-format */
1781 sprintf (msg
, _("syntax error (expected char `%c', found `%c')"),
1782 CGEN_SYNTAX_CHAR(*syn
), *str
);
1787 /* Ran out of input. */
1788 static char msg
[80];
1790 /* xgettext:c-format */
1791 sprintf (msg
, _("syntax error (expected char `%c', found end of instruction)"),
1792 CGEN_SYNTAX_CHAR(*syn
));
1798 /* We have an operand of some sort. */
1799 errmsg
= cd
->parse_operand (cd
, CGEN_SYNTAX_FIELD (*syn
),
1804 /* Done with this operand, continue with next one. */
1808 /* If we're at the end of the syntax string, we're done. */
1811 /* FIXME: For the moment we assume a valid `str' can only contain
1812 blanks now. IE: We needn't try again with a longer version of
1813 the insn and it is assumed that longer versions of insns appear
1814 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
1815 while (ISSPACE (* str
))
1819 return _("junk at end of line"); /* FIXME: would like to include `str' */
1824 /* We couldn't parse it. */
1825 return _("unrecognized instruction");
1828 /* Main entry point.
1829 This routine is called for each instruction to be assembled.
1830 STR points to the insn to be assembled.
1831 We assume all necessary tables have been initialized.
1832 The assembled instruction, less any fixups, is stored in BUF.
1833 Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
1834 still needs to be converted to target byte order, otherwise BUF is an array
1835 of bytes in target byte order.
1836 The result is a pointer to the insn's entry in the opcode table,
1837 or NULL if an error occured (an error message will have already been
1840 Note that when processing (non-alias) macro-insns,
1841 this function recurses.
1843 ??? It's possible to make this cpu-independent.
1844 One would have to deal with a few minor things.
1845 At this point in time doing so would be more of a curiosity than useful
1846 [for example this file isn't _that_ big], but keeping the possibility in
1847 mind helps keep the design clean. */
1850 m32c_cgen_assemble_insn (CGEN_CPU_DESC cd
,
1852 CGEN_FIELDS
*fields
,
1853 CGEN_INSN_BYTES_PTR buf
,
1857 CGEN_INSN_LIST
*ilist
;
1858 const char *parse_errmsg
= NULL
;
1859 const char *insert_errmsg
= NULL
;
1860 int recognized_mnemonic
= 0;
1862 /* Skip leading white space. */
1863 while (ISSPACE (* str
))
1866 /* The instructions are stored in hashed lists.
1867 Get the first in the list. */
1868 ilist
= CGEN_ASM_LOOKUP_INSN (cd
, str
);
1870 /* Keep looking until we find a match. */
1872 for ( ; ilist
!= NULL
; ilist
= CGEN_ASM_NEXT_INSN (ilist
))
1874 const CGEN_INSN
*insn
= ilist
->insn
;
1875 recognized_mnemonic
= 1;
1877 #ifdef CGEN_VALIDATE_INSN_SUPPORTED
1878 /* Not usually needed as unsupported opcodes
1879 shouldn't be in the hash lists. */
1880 /* Is this insn supported by the selected cpu? */
1881 if (! m32c_cgen_insn_supported (cd
, insn
))
1884 /* If the RELAXED attribute is set, this is an insn that shouldn't be
1885 chosen immediately. Instead, it is used during assembler/linker
1886 relaxation if possible. */
1887 if (CGEN_INSN_ATTR_VALUE (insn
, CGEN_INSN_RELAXED
) != 0)
1892 /* Skip this insn if str doesn't look right lexically. */
1893 if (CGEN_INSN_RX (insn
) != NULL
&&
1894 regexec ((regex_t
*) CGEN_INSN_RX (insn
), str
, 0, NULL
, 0) == REG_NOMATCH
)
1897 /* Allow parse/insert handlers to obtain length of insn. */
1898 CGEN_FIELDS_BITSIZE (fields
) = CGEN_INSN_BITSIZE (insn
);
1900 parse_errmsg
= CGEN_PARSE_FN (cd
, insn
) (cd
, insn
, & str
, fields
);
1901 if (parse_errmsg
!= NULL
)
1904 /* ??? 0 is passed for `pc'. */
1905 insert_errmsg
= CGEN_INSERT_FN (cd
, insn
) (cd
, insn
, fields
, buf
,
1907 if (insert_errmsg
!= NULL
)
1910 /* It is up to the caller to actually output the insn and any
1916 static char errbuf
[150];
1917 #ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
1918 const char *tmp_errmsg
;
1920 /* If requesting verbose error messages, use insert_errmsg.
1921 Failing that, use parse_errmsg. */
1922 tmp_errmsg
= (insert_errmsg
? insert_errmsg
:
1923 parse_errmsg
? parse_errmsg
:
1924 recognized_mnemonic
?
1925 _("unrecognized form of instruction") :
1926 _("unrecognized instruction"));
1928 if (strlen (start
) > 50)
1929 /* xgettext:c-format */
1930 sprintf (errbuf
, "%s `%.50s...'", tmp_errmsg
, start
);
1932 /* xgettext:c-format */
1933 sprintf (errbuf
, "%s `%.50s'", tmp_errmsg
, start
);
1935 if (strlen (start
) > 50)
1936 /* xgettext:c-format */
1937 sprintf (errbuf
, _("bad instruction `%.50s...'"), start
);
1939 /* xgettext:c-format */
1940 sprintf (errbuf
, _("bad instruction `%.50s'"), start
);