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, 2007, 2008
8 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.
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. */
56 #define CGEN_VALIDATE_INSN_SUPPORTED
58 const char * parse_csrn (CGEN_CPU_DESC
, const char **, CGEN_KEYWORD
*, long *);
59 const char * parse_tpreg (CGEN_CPU_DESC
, const char **, CGEN_KEYWORD
*, long *);
60 const char * parse_spreg (CGEN_CPU_DESC
, const char **, CGEN_KEYWORD
*, long *);
61 const char * parse_mep_align (CGEN_CPU_DESC
, const char **, enum cgen_operand_type
, long *);
62 const char * parse_mep_alignu (CGEN_CPU_DESC
, const char **, enum cgen_operand_type
, unsigned long *);
63 static const char * parse_signed16 (CGEN_CPU_DESC
, const char **, int, long *);
64 static const char * parse_unsigned16 (CGEN_CPU_DESC
, const char **, int, unsigned long *);
65 static const char * parse_lo16 (CGEN_CPU_DESC
, const char **, int, long *, long);
66 static const char * parse_unsigned7 (CGEN_CPU_DESC
, const char **, enum cgen_operand_type
, unsigned long *);
67 static const char * parse_zero (CGEN_CPU_DESC
, const char **, int, long *);
70 parse_csrn (CGEN_CPU_DESC cd
, const char **strp
,
71 CGEN_KEYWORD
*keyword_table
, long *field
)
76 err
= cgen_parse_keyword (cd
, strp
, keyword_table
, field
);
80 err
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CSRN_IDX
, & value
);
87 /* begin-cop-ip-parse-handlers */
89 parse_ivc2_cr (CGEN_CPU_DESC
,
92 long *) ATTRIBUTE_UNUSED
;
94 parse_ivc2_cr (CGEN_CPU_DESC cd
,
96 CGEN_KEYWORD
*keyword_table ATTRIBUTE_UNUSED
,
99 return cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr_ivc2
, field
);
102 parse_ivc2_ccr (CGEN_CPU_DESC
,
105 long *) ATTRIBUTE_UNUSED
;
107 parse_ivc2_ccr (CGEN_CPU_DESC cd
,
109 CGEN_KEYWORD
*keyword_table ATTRIBUTE_UNUSED
,
112 return cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_ccr_ivc2
, field
);
114 /* end-cop-ip-parse-handlers */
117 parse_tpreg (CGEN_CPU_DESC cd
, const char ** strp
,
118 CGEN_KEYWORD
*keyword_table
, long *field
)
122 err
= cgen_parse_keyword (cd
, strp
, keyword_table
, field
);
126 return _("Only $tp or $13 allowed for this opcode");
131 parse_spreg (CGEN_CPU_DESC cd
, const char ** strp
,
132 CGEN_KEYWORD
*keyword_table
, long *field
)
136 err
= cgen_parse_keyword (cd
, strp
, keyword_table
, field
);
140 return _("Only $sp or $15 allowed for this opcode");
145 parse_mep_align (CGEN_CPU_DESC cd
, const char ** strp
,
146 enum cgen_operand_type type
, long *field
)
153 case MEP_OPERAND_PCREL8A2
:
154 case MEP_OPERAND_PCREL12A2
:
155 case MEP_OPERAND_PCREL17A2
:
156 case MEP_OPERAND_PCREL24A2
:
157 err
= cgen_parse_signed_integer (cd
, strp
, type
, field
);
159 case MEP_OPERAND_PCABS24A2
:
160 case MEP_OPERAND_UDISP7
:
161 case MEP_OPERAND_UDISP7A2
:
162 case MEP_OPERAND_UDISP7A4
:
163 case MEP_OPERAND_UIMM7A4
:
164 case MEP_OPERAND_ADDR24A4
:
165 err
= cgen_parse_unsigned_integer (cd
, strp
, type
, (unsigned long *) field
);
174 case MEP_OPERAND_UDISP7
:
177 case MEP_OPERAND_PCREL8A2
:
178 case MEP_OPERAND_PCREL12A2
:
179 case MEP_OPERAND_PCREL17A2
:
180 case MEP_OPERAND_PCREL24A2
:
181 case MEP_OPERAND_PCABS24A2
:
182 case MEP_OPERAND_UDISP7A2
:
185 case MEP_OPERAND_UDISP7A4
:
186 case MEP_OPERAND_UIMM7A4
:
187 case MEP_OPERAND_ADDR24A4
:
193 /* Safe assumption? */
197 return "Value is not aligned enough";
202 parse_mep_alignu (CGEN_CPU_DESC cd
, const char ** strp
,
203 enum cgen_operand_type type
, unsigned long *field
)
205 return parse_mep_align (cd
, strp
, type
, (long *) field
);
209 /* Handle %lo(), %tpoff(), %sdaoff(), %hi(), and other signed
210 constants in a signed context. */
213 parse_signed16 (CGEN_CPU_DESC cd
,
218 return parse_lo16 (cd
, strp
, opindex
, valuep
, 1);
222 parse_lo16 (CGEN_CPU_DESC cd
,
229 enum cgen_parse_operand_result result_type
;
232 if (strncasecmp (*strp
, "%lo(", 4) == 0)
235 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_LOW16
,
236 & result_type
, & value
);
238 return _("missing `)'");
241 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
244 *valuep
= (long)(short) value
;
250 if (strncasecmp (*strp
, "%hi(", 4) == 0)
253 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_HI16S
,
254 & result_type
, & value
);
256 return _("missing `)'");
259 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
260 value
= (value
+ 0x8000) >> 16;
265 if (strncasecmp (*strp
, "%uhi(", 5) == 0)
268 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_HI16U
,
269 & result_type
, & value
);
271 return _("missing `)'");
274 && result_type
== CGEN_PARSE_OPERAND_RESULT_NUMBER
)
280 if (strncasecmp (*strp
, "%sdaoff(", 8) == 0)
283 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_GPREL
,
286 return _("missing `)'");
292 if (strncasecmp (*strp
, "%tpoff(", 7) == 0)
295 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_TPREL
,
298 return _("missing `)'");
305 return _("invalid %function() here");
307 return cgen_parse_signed_integer (cd
, strp
, opindex
, valuep
);
311 parse_unsigned16 (CGEN_CPU_DESC cd
,
314 unsigned long *valuep
)
316 return parse_lo16 (cd
, strp
, opindex
, (long *) valuep
, 0);
319 /* A special case of parse_signed16 which accepts only the value zero. */
322 parse_zero (CGEN_CPU_DESC cd
, const char **strp
, int opindex
, long *valuep
)
325 enum cgen_parse_operand_result result_type
;
328 /*fprintf(stderr, "dj: signed parse opindex `%s'\n", *strp);*/
330 /* Prevent ($ry) from being attempted as an expression on 'sw $rx,($ry)'.
331 It will fail and cause ry to be listed as an undefined symbol in the
333 if (strncmp (*strp
, "($", 2) == 0)
334 return "not zero"; /* any string will do -- will never be seen. */
336 if (strncasecmp (*strp
, "%lo(", 4) == 0)
339 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_LOW16
,
340 &result_type
, &value
);
342 return "missing `)'";
345 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
346 return "not zero"; /* any string will do -- will never be seen. */
351 if (strncasecmp (*strp
, "%hi(", 4) == 0)
354 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_HI16S
,
355 &result_type
, &value
);
357 return "missing `)'";
360 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
361 return "not zero"; /* any string will do -- will never be seen. */
366 if (strncasecmp (*strp
, "%uhi(", 5) == 0)
369 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_HI16U
,
370 &result_type
, &value
);
372 return "missing `)'";
375 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
376 return "not zero"; /* any string will do -- will never be seen. */
381 if (strncasecmp (*strp
, "%sdaoff(", 8) == 0)
384 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_GPREL
,
385 &result_type
, &value
);
387 return "missing `)'";
390 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
391 return "not zero"; /* any string will do -- will never be seen. */
396 if (strncasecmp (*strp
, "%tpoff(", 7) == 0)
399 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_MEP_TPREL
,
400 &result_type
, &value
);
402 return "missing `)'";
405 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
406 return "not zero"; /* any string will do -- will never be seen. */
412 return "invalid %function() here";
414 errmsg
= cgen_parse_address (cd
, strp
, opindex
, BFD_RELOC_NONE
,
415 &result_type
, &value
);
417 && (result_type
!= CGEN_PARSE_OPERAND_RESULT_NUMBER
|| value
!= 0))
418 return "not zero"; /* any string will do -- will never be seen. */
424 parse_unsigned7 (CGEN_CPU_DESC cd
, const char **strp
,
425 enum cgen_operand_type opindex
, unsigned long *valuep
)
430 /* fprintf(stderr, "dj: unsigned7 parse `%s'\n", *strp); */
432 if (strncasecmp (*strp
, "%tpoff(", 7) == 0)
438 case MEP_OPERAND_UDISP7
:
439 reloc
= BFD_RELOC_MEP_TPREL7
;
441 case MEP_OPERAND_UDISP7A2
:
442 reloc
= BFD_RELOC_MEP_TPREL7A2
;
444 case MEP_OPERAND_UDISP7A4
:
445 reloc
= BFD_RELOC_MEP_TPREL7A4
;
448 /* Safe assumption? */
451 errmsg
= cgen_parse_address (cd
, strp
, opindex
, reloc
,
454 return "missing `)'";
461 return _("invalid %function() here");
463 return parse_mep_alignu (cd
, strp
, opindex
, valuep
);
466 static ATTRIBUTE_UNUSED
const char *
467 parse_cdisp10 (CGEN_CPU_DESC cd
,
472 const char *errmsg
= 0;
480 case MEP_OPERAND_CDISP10A4
:
483 case MEP_OPERAND_CDISP10A2
:
486 case MEP_OPERAND_CDISP10
:
492 if ((MEP_CPU
& EF_MEP_CPU_MASK
) == EF_MEP_CPU_C5
)
495 if (strncmp (*strp
, "0x0", 3) == 0
496 || (**strp
== '0' && *(*strp
+ 1) != 'x'))
499 errmsg
= cgen_parse_signed_integer (cd
, strp
, opindex
, & value
);
505 if (value
< -512 || value
> 511)
506 return _("Immediate is out of range -512 to 511");
510 if (value
< -128 || value
> 127)
511 return _("Immediate is out of range -128 to 127");
514 if (value
& ((1<<alignment
)-1))
515 return _("Value is not aligned enough");
517 /* If this field may require a relocation then use larger dsp16. */
518 if (! have_zero
&& value
== 0)
519 return (wide
? _("Immediate is out of range -512 to 511")
520 : _("Immediate is out of range -128 to 127"));
526 /* BEGIN LIGHTWEIGHT MACRO PROCESSOR. */
544 { "sizeof", "(`1.end + (- `1))"},
545 { "startof", "(`1 | 0)" },
546 { "align4", "(`1&(~3))"},
547 /*{ "hi", "(((`1+0x8000)>>16) & 0xffff)" }, */
548 /*{ "lo", "(`1 & 0xffff)" }, */
549 /*{ "sdaoff", "((`1-__sdabase) & 0x7f)"}, */
550 /*{ "tpoff", "((`1-__tpbase) & 0x7f)"}, */
554 static char * expand_string (const char *, int);
557 mep_cgen_expand_macros_and_parse_operand
558 (CGEN_CPU_DESC
, int, const char **, CGEN_FIELDS
*);
561 str_append (char *dest
, const char *input
, int len
)
568 /* printf("str_append: <<%s>>, <<%s>>, %d\n", dest, input, len); */
569 oldlen
= (dest
? strlen(dest
) : 0);
570 new_dest
= realloc (dest
, oldlen
+ len
+ 1);
571 memset (new_dest
+ oldlen
, 0, len
+ 1);
572 return strncat (new_dest
, input
, len
);
576 lookup_macro (const char *name
)
580 for (m
= macros
; m
->name
; ++m
)
581 if (strncmp (m
->name
, name
, strlen(m
->name
)) == 0)
588 expand_macro (arg
*args
, int narg
, macro
*mac
)
590 char *result
= 0, *rescanned_result
= 0;
591 char *e
= mac
->expansion
;
595 /* printf("expanding macro %s with %d args\n", mac->name, narg + 1); */
600 ((*(e
+ 1) - '1') <= MAXARGS
) &&
601 ((*(e
+ 1) - '1') <= narg
))
603 result
= str_append (result
, mark
, e
- mark
);
604 arg
= (*(e
+ 1) - '1');
605 /* printf("replacing `%d with %s\n", arg+1, args[arg].start); */
606 result
= str_append (result
, args
[arg
].start
, args
[arg
].len
);
614 result
= str_append (result
, mark
, e
- mark
);
618 rescanned_result
= expand_string (result
, 0);
620 return rescanned_result
;
630 expand_string (const char *in
, int first_only
)
632 int num_expansions
= 0;
637 const char *mark
= in
;
648 if (*in
== '%' && *(in
+ 1) && (!first_only
|| num_expansions
== 0))
650 macro
= lookup_macro (in
+ 1);
653 /* printf("entering state %d at '%s'...\n", state, in); */
654 result
= str_append (result
, mark
, in
- mark
);
656 in
+= 1 + strlen (macro
->name
);
657 while (*in
== ' ') ++in
;
667 args
[narg
].start
= in
+ 1;
681 args
[narg
].start
= (in
+ 1);
686 /* printf("entering state %d at '%s'...\n", state, in); */
690 expansion
= expand_macro (args
, narg
, macro
);
694 result
= str_append (result
, expansion
, strlen (expansion
));
700 result
= str_append (result
, mark
, in
- mark
);
725 result
= str_append (result
, mark
, in
- mark
);
735 /* END LIGHTWEIGHT MACRO PROCESSOR. */
737 const char * mep_cgen_parse_operand
738 (CGEN_CPU_DESC
, int, const char **, CGEN_FIELDS
*);
741 mep_cgen_expand_macros_and_parse_operand (CGEN_CPU_DESC cd
, int opindex
,
742 const char ** strp_in
, CGEN_FIELDS
* fields
)
744 const char * errmsg
= NULL
;
745 char *str
= 0, *hold
= 0;
746 const char **strp
= 0;
748 /* Set up a new pointer to macro-expanded string. */
749 str
= expand_string (*strp_in
, 1);
750 /* fprintf (stderr, " expanded <<%s>> to <<%s>>\n", *strp_in, str); */
753 strp
= (const char **)(&str
);
755 errmsg
= mep_cgen_parse_operand (cd
, opindex
, strp
, fields
);
757 /* Now work out the advance. */
758 if (strlen (str
) == 0)
759 *strp_in
+= strlen (*strp_in
);
763 if (strstr (*strp_in
, str
))
764 /* A macro-expansion was pulled off the front. */
765 *strp_in
= strstr (*strp_in
, str
);
767 /* A non-macro-expansion was pulled off the front. */
768 *strp_in
+= (str
- hold
);
777 #define CGEN_ASM_INIT_HOOK (cd->parse_operand = mep_cgen_expand_macros_and_parse_operand);
781 const char * mep_cgen_parse_operand
782 (CGEN_CPU_DESC
, int, const char **, CGEN_FIELDS
*);
784 /* Main entry point for operand parsing.
786 This function is basically just a big switch statement. Earlier versions
787 used tables to look up the function to use, but
788 - if the table contains both assembler and disassembler functions then
789 the disassembler contains much of the assembler and vice-versa,
790 - there's a lot of inlining possibilities as things grow,
791 - using a switch statement avoids the function call overhead.
793 This function could be moved into `parse_insn_normal', but keeping it
794 separate makes clear the interface between `parse_insn_normal' and each of
798 mep_cgen_parse_operand (CGEN_CPU_DESC cd
,
801 CGEN_FIELDS
* fields
)
803 const char * errmsg
= NULL
;
804 /* Used by scalar operands that still need to be parsed. */
805 long junk ATTRIBUTE_UNUSED
;
809 case MEP_OPERAND_ADDR24A4
:
810 errmsg
= parse_mep_alignu (cd
, strp
, MEP_OPERAND_ADDR24A4
, (unsigned long *) (& fields
->f_24u8a4n
));
812 case MEP_OPERAND_C5RMUIMM20
:
813 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_C5RMUIMM20
, (unsigned long *) (& fields
->f_c5_rmuimm20
));
815 case MEP_OPERAND_C5RNMUIMM24
:
816 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_C5RNMUIMM24
, (unsigned long *) (& fields
->f_c5_rnmuimm24
));
818 case MEP_OPERAND_CALLNUM
:
819 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CALLNUM
, (unsigned long *) (& fields
->f_callnum
));
821 case MEP_OPERAND_CCCC
:
822 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CCCC
, (unsigned long *) (& fields
->f_rm
));
824 case MEP_OPERAND_CCRN
:
825 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_ccr
, & fields
->f_ccrn
);
827 case MEP_OPERAND_CDISP10
:
828 errmsg
= parse_cdisp10 (cd
, strp
, MEP_OPERAND_CDISP10
, (long *) (& fields
->f_cdisp10
));
830 case MEP_OPERAND_CDISP10A2
:
831 errmsg
= parse_cdisp10 (cd
, strp
, MEP_OPERAND_CDISP10A2
, (long *) (& fields
->f_cdisp10
));
833 case MEP_OPERAND_CDISP10A4
:
834 errmsg
= parse_cdisp10 (cd
, strp
, MEP_OPERAND_CDISP10A4
, (long *) (& fields
->f_cdisp10
));
836 case MEP_OPERAND_CDISP10A8
:
837 errmsg
= parse_cdisp10 (cd
, strp
, MEP_OPERAND_CDISP10A8
, (long *) (& fields
->f_cdisp10
));
839 case MEP_OPERAND_CDISP12
:
840 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_CDISP12
, (long *) (& fields
->f_12s20
));
842 case MEP_OPERAND_CIMM4
:
843 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CIMM4
, (unsigned long *) (& fields
->f_rn
));
845 case MEP_OPERAND_CIMM5
:
846 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CIMM5
, (unsigned long *) (& fields
->f_5u24
));
848 case MEP_OPERAND_CODE16
:
849 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CODE16
, (unsigned long *) (& fields
->f_16u16
));
851 case MEP_OPERAND_CODE24
:
852 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CODE24
, (unsigned long *) (& fields
->f_24u4n
));
854 case MEP_OPERAND_CP_FLAG
:
855 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_ccr
, & junk
);
857 case MEP_OPERAND_CRN
:
858 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr
, & fields
->f_crn
);
860 case MEP_OPERAND_CRN64
:
861 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_crn
);
863 case MEP_OPERAND_CRNX
:
864 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr
, & fields
->f_crnx
);
866 case MEP_OPERAND_CRNX64
:
867 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_crnx
);
869 case MEP_OPERAND_CROC
:
870 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u7
);
872 case MEP_OPERAND_CROP
:
873 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u23
);
875 case MEP_OPERAND_CRPC
:
876 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u26
);
878 case MEP_OPERAND_CRPP
:
879 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u18
);
881 case MEP_OPERAND_CRQC
:
882 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u21
);
884 case MEP_OPERAND_CRQP
:
885 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_5u13
);
887 case MEP_OPERAND_CSRN
:
888 errmsg
= parse_csrn (cd
, strp
, & mep_cgen_opval_h_csr
, & fields
->f_csrn
);
890 case MEP_OPERAND_CSRN_IDX
:
891 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_CSRN_IDX
, (unsigned long *) (& fields
->f_csrn
));
893 case MEP_OPERAND_DBG
:
894 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
896 case MEP_OPERAND_DEPC
:
897 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
899 case MEP_OPERAND_EPC
:
900 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
902 case MEP_OPERAND_EXC
:
903 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
905 case MEP_OPERAND_HI
:
906 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
908 case MEP_OPERAND_IMM16P0
:
909 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM16P0
, (unsigned long *) (& fields
->f_ivc2_imm16p0
));
911 case MEP_OPERAND_IMM3P12
:
912 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM3P12
, (unsigned long *) (& fields
->f_ivc2_3u12
));
914 case MEP_OPERAND_IMM3P25
:
915 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM3P25
, (unsigned long *) (& fields
->f_ivc2_3u25
));
917 case MEP_OPERAND_IMM3P4
:
918 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM3P4
, (unsigned long *) (& fields
->f_ivc2_3u4
));
920 case MEP_OPERAND_IMM3P5
:
921 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM3P5
, (unsigned long *) (& fields
->f_ivc2_3u5
));
923 case MEP_OPERAND_IMM3P9
:
924 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM3P9
, (unsigned long *) (& fields
->f_ivc2_3u9
));
926 case MEP_OPERAND_IMM4P10
:
927 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM4P10
, (unsigned long *) (& fields
->f_ivc2_4u10
));
929 case MEP_OPERAND_IMM4P4
:
930 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM4P4
, (unsigned long *) (& fields
->f_ivc2_4u4
));
932 case MEP_OPERAND_IMM4P8
:
933 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM4P8
, (unsigned long *) (& fields
->f_ivc2_4u8
));
935 case MEP_OPERAND_IMM5P23
:
936 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM5P23
, (unsigned long *) (& fields
->f_ivc2_5u23
));
938 case MEP_OPERAND_IMM5P3
:
939 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM5P3
, (unsigned long *) (& fields
->f_ivc2_5u3
));
941 case MEP_OPERAND_IMM5P7
:
942 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM5P7
, (unsigned long *) (& fields
->f_ivc2_5u7
));
944 case MEP_OPERAND_IMM5P8
:
945 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM5P8
, (unsigned long *) (& fields
->f_ivc2_5u8
));
947 case MEP_OPERAND_IMM6P2
:
948 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM6P2
, (unsigned long *) (& fields
->f_ivc2_6u2
));
950 case MEP_OPERAND_IMM6P6
:
951 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM6P6
, (unsigned long *) (& fields
->f_ivc2_6u6
));
953 case MEP_OPERAND_IMM8P0
:
954 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM8P0
, (unsigned long *) (& fields
->f_ivc2_8u0
));
956 case MEP_OPERAND_IMM8P20
:
957 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM8P20
, (unsigned long *) (& fields
->f_ivc2_8u20
));
959 case MEP_OPERAND_IMM8P4
:
960 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IMM8P4
, (unsigned long *) (& fields
->f_ivc2_8u4
));
962 case MEP_OPERAND_IVC_X_0_2
:
963 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_0_2
, (unsigned long *) (& fields
->f_ivc2_2u0
));
965 case MEP_OPERAND_IVC_X_0_3
:
966 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_0_3
, (unsigned long *) (& fields
->f_ivc2_3u0
));
968 case MEP_OPERAND_IVC_X_0_4
:
969 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_0_4
, (unsigned long *) (& fields
->f_ivc2_4u0
));
971 case MEP_OPERAND_IVC_X_0_5
:
972 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_0_5
, (unsigned long *) (& fields
->f_ivc2_5u0
));
974 case MEP_OPERAND_IVC_X_6_1
:
975 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_6_1
, (unsigned long *) (& fields
->f_ivc2_1u6
));
977 case MEP_OPERAND_IVC_X_6_2
:
978 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_6_2
, (unsigned long *) (& fields
->f_ivc2_2u6
));
980 case MEP_OPERAND_IVC_X_6_3
:
981 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_IVC_X_6_3
, (unsigned long *) (& fields
->f_ivc2_3u6
));
983 case MEP_OPERAND_IVC2C3CCRN
:
984 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_ccr_ivc2
, & fields
->f_ccrn
);
986 case MEP_OPERAND_IVC2CCRN
:
987 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_ccr_ivc2
, & fields
->f_ivc2_ccrn
);
989 case MEP_OPERAND_IVC2CRN
:
990 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_cr64
, & fields
->f_ivc2_crnx
);
992 case MEP_OPERAND_IVC2RM
:
993 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_ivc2_crm
);
995 case MEP_OPERAND_LO
:
996 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
998 case MEP_OPERAND_LP
:
999 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1001 case MEP_OPERAND_MB0
:
1002 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1004 case MEP_OPERAND_MB1
:
1005 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1007 case MEP_OPERAND_ME0
:
1008 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1010 case MEP_OPERAND_ME1
:
1011 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1013 case MEP_OPERAND_NPC
:
1014 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1016 case MEP_OPERAND_OPT
:
1017 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1019 case MEP_OPERAND_PCABS24A2
:
1020 errmsg
= parse_mep_alignu (cd
, strp
, MEP_OPERAND_PCABS24A2
, (unsigned long *) (& fields
->f_24u5a2n
));
1022 case MEP_OPERAND_PCREL12A2
:
1023 errmsg
= parse_mep_align (cd
, strp
, MEP_OPERAND_PCREL12A2
, (long *) (& fields
->f_12s4a2
));
1025 case MEP_OPERAND_PCREL17A2
:
1026 errmsg
= parse_mep_align (cd
, strp
, MEP_OPERAND_PCREL17A2
, (long *) (& fields
->f_17s16a2
));
1028 case MEP_OPERAND_PCREL24A2
:
1029 errmsg
= parse_mep_align (cd
, strp
, MEP_OPERAND_PCREL24A2
, (long *) (& fields
->f_24s5a2n
));
1031 case MEP_OPERAND_PCREL8A2
:
1032 errmsg
= parse_mep_align (cd
, strp
, MEP_OPERAND_PCREL8A2
, (long *) (& fields
->f_8s8a2
));
1034 case MEP_OPERAND_PSW
:
1035 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1037 case MEP_OPERAND_R0
:
1038 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1040 case MEP_OPERAND_R1
:
1041 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1043 case MEP_OPERAND_RL
:
1044 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rl
);
1046 case MEP_OPERAND_RL5
:
1047 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rl5
);
1049 case MEP_OPERAND_RM
:
1050 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rm
);
1052 case MEP_OPERAND_RMA
:
1053 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rm
);
1055 case MEP_OPERAND_RN
:
1056 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1058 case MEP_OPERAND_RN3
:
1059 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1061 case MEP_OPERAND_RN3C
:
1062 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1064 case MEP_OPERAND_RN3L
:
1065 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1067 case MEP_OPERAND_RN3S
:
1068 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1070 case MEP_OPERAND_RN3UC
:
1071 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1073 case MEP_OPERAND_RN3UL
:
1074 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1076 case MEP_OPERAND_RN3US
:
1077 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn3
);
1079 case MEP_OPERAND_RNC
:
1080 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1082 case MEP_OPERAND_RNL
:
1083 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1085 case MEP_OPERAND_RNS
:
1086 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1088 case MEP_OPERAND_RNUC
:
1089 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1091 case MEP_OPERAND_RNUL
:
1092 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1094 case MEP_OPERAND_RNUS
:
1095 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & fields
->f_rn
);
1097 case MEP_OPERAND_SAR
:
1098 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_csr
, & junk
);
1100 case MEP_OPERAND_SDISP16
:
1101 errmsg
= parse_signed16 (cd
, strp
, MEP_OPERAND_SDISP16
, (long *) (& fields
->f_16s16
));
1103 case MEP_OPERAND_SIMM16
:
1104 errmsg
= parse_signed16 (cd
, strp
, MEP_OPERAND_SIMM16
, (long *) (& fields
->f_16s16
));
1106 case MEP_OPERAND_SIMM16P0
:
1107 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM16P0
, (long *) (& fields
->f_ivc2_simm16p0
));
1109 case MEP_OPERAND_SIMM6
:
1110 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM6
, (long *) (& fields
->f_6s8
));
1112 case MEP_OPERAND_SIMM8
:
1113 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM8
, (long *) (& fields
->f_8s8
));
1115 case MEP_OPERAND_SIMM8P0
:
1116 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM8P0
, (long *) (& fields
->f_ivc2_8s0
));
1118 case MEP_OPERAND_SIMM8P20
:
1119 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM8P20
, (long *) (& fields
->f_ivc2_8s20
));
1121 case MEP_OPERAND_SIMM8P4
:
1122 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_SIMM8P4
, (long *) (& fields
->f_ivc2_8s4
));
1124 case MEP_OPERAND_SP
:
1125 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1127 case MEP_OPERAND_SPR
:
1128 errmsg
= parse_spreg (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1130 case MEP_OPERAND_TP
:
1131 errmsg
= cgen_parse_keyword (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1133 case MEP_OPERAND_TPR
:
1134 errmsg
= parse_tpreg (cd
, strp
, & mep_cgen_opval_h_gpr
, & junk
);
1136 case MEP_OPERAND_UDISP2
:
1137 errmsg
= cgen_parse_signed_integer (cd
, strp
, MEP_OPERAND_UDISP2
, (long *) (& fields
->f_2u6
));
1139 case MEP_OPERAND_UDISP7
:
1140 errmsg
= parse_unsigned7 (cd
, strp
, MEP_OPERAND_UDISP7
, (unsigned long *) (& fields
->f_7u9
));
1142 case MEP_OPERAND_UDISP7A2
:
1143 errmsg
= parse_unsigned7 (cd
, strp
, MEP_OPERAND_UDISP7A2
, (unsigned long *) (& fields
->f_7u9a2
));
1145 case MEP_OPERAND_UDISP7A4
:
1146 errmsg
= parse_unsigned7 (cd
, strp
, MEP_OPERAND_UDISP7A4
, (unsigned long *) (& fields
->f_7u9a4
));
1148 case MEP_OPERAND_UIMM16
:
1149 errmsg
= parse_unsigned16 (cd
, strp
, MEP_OPERAND_UIMM16
, (unsigned long *) (& fields
->f_16u16
));
1151 case MEP_OPERAND_UIMM2
:
1152 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_UIMM2
, (unsigned long *) (& fields
->f_2u10
));
1154 case MEP_OPERAND_UIMM24
:
1155 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_UIMM24
, (unsigned long *) (& fields
->f_24u8n
));
1157 case MEP_OPERAND_UIMM3
:
1158 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_UIMM3
, (unsigned long *) (& fields
->f_3u5
));
1160 case MEP_OPERAND_UIMM4
:
1161 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_UIMM4
, (unsigned long *) (& fields
->f_4u8
));
1163 case MEP_OPERAND_UIMM5
:
1164 errmsg
= cgen_parse_unsigned_integer (cd
, strp
, MEP_OPERAND_UIMM5
, (unsigned long *) (& fields
->f_5u8
));
1166 case MEP_OPERAND_UIMM7A4
:
1167 errmsg
= parse_mep_alignu (cd
, strp
, MEP_OPERAND_UIMM7A4
, (unsigned long *) (& fields
->f_7u9a4
));
1169 case MEP_OPERAND_ZERO
:
1170 errmsg
= parse_zero (cd
, strp
, MEP_OPERAND_ZERO
, (long *) (& junk
));
1174 /* xgettext:c-format */
1175 fprintf (stderr
, _("Unrecognized field %d while parsing.\n"), opindex
);
1182 cgen_parse_fn
* const mep_cgen_parse_handlers
[] =
1188 mep_cgen_init_asm (CGEN_CPU_DESC cd
)
1190 mep_cgen_init_opcode_table (cd
);
1191 mep_cgen_init_ibld_table (cd
);
1192 cd
->parse_handlers
= & mep_cgen_parse_handlers
[0];
1193 cd
->parse_operand
= mep_cgen_parse_operand
;
1194 #ifdef CGEN_ASM_INIT_HOOK
1201 /* Regex construction routine.
1203 This translates an opcode syntax string into a regex string,
1204 by replacing any non-character syntax element (such as an
1205 opcode) with the pattern '.*'
1207 It then compiles the regex and stores it in the opcode, for
1208 later use by mep_cgen_assemble_insn
1210 Returns NULL for success, an error message for failure. */
1213 mep_cgen_build_insn_regex (CGEN_INSN
*insn
)
1215 CGEN_OPCODE
*opc
= (CGEN_OPCODE
*) CGEN_INSN_OPCODE (insn
);
1216 const char *mnem
= CGEN_INSN_MNEMONIC (insn
);
1217 char rxbuf
[CGEN_MAX_RX_ELEMENTS
];
1219 const CGEN_SYNTAX_CHAR_TYPE
*syn
;
1222 syn
= CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc
));
1224 /* Mnemonics come first in the syntax string. */
1225 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1226 return _("missing mnemonic in syntax string");
1229 /* Generate a case sensitive regular expression that emulates case
1230 insensitive matching in the "C" locale. We cannot generate a case
1231 insensitive regular expression because in Turkish locales, 'i' and 'I'
1232 are not equal modulo case conversion. */
1234 /* Copy the literal mnemonic out of the insn. */
1235 for (; *mnem
; mnem
++)
1242 *rx
++ = TOLOWER (c
);
1243 *rx
++ = TOUPPER (c
);
1250 /* Copy any remaining literals from the syntax string into the rx. */
1251 for(; * syn
!= 0 && rx
<= rxbuf
+ (CGEN_MAX_RX_ELEMENTS
- 7 - 4); ++syn
)
1253 if (CGEN_SYNTAX_CHAR_P (* syn
))
1255 char c
= CGEN_SYNTAX_CHAR (* syn
);
1259 /* Escape any regex metacharacters in the syntax. */
1260 case '.': case '[': case '\\':
1261 case '*': case '^': case '$':
1263 #ifdef CGEN_ESCAPE_EXTENDED_REGEX
1264 case '?': case '{': case '}':
1265 case '(': case ')': case '*':
1266 case '|': case '+': case ']':
1276 *rx
++ = TOLOWER (c
);
1277 *rx
++ = TOUPPER (c
);
1287 /* Replace non-syntax fields with globs. */
1293 /* Trailing whitespace ok. */
1300 /* But anchor it after that. */
1304 CGEN_INSN_RX (insn
) = xmalloc (sizeof (regex_t
));
1305 reg_err
= regcomp ((regex_t
*) CGEN_INSN_RX (insn
), rxbuf
, REG_NOSUB
);
1311 static char msg
[80];
1313 regerror (reg_err
, (regex_t
*) CGEN_INSN_RX (insn
), msg
, 80);
1314 regfree ((regex_t
*) CGEN_INSN_RX (insn
));
1315 free (CGEN_INSN_RX (insn
));
1316 (CGEN_INSN_RX (insn
)) = NULL
;
1322 /* Default insn parser.
1324 The syntax string is scanned and operands are parsed and stored in FIELDS.
1325 Relocs are queued as we go via other callbacks.
1327 ??? Note that this is currently an all-or-nothing parser. If we fail to
1328 parse the instruction, we return 0 and the caller will start over from
1329 the beginning. Backtracking will be necessary in parsing subexpressions,
1330 but that can be handled there. Not handling backtracking here may get
1331 expensive in the case of the m68k. Deal with later.
1333 Returns NULL for success, an error message for failure. */
1336 parse_insn_normal (CGEN_CPU_DESC cd
,
1337 const CGEN_INSN
*insn
,
1339 CGEN_FIELDS
*fields
)
1341 /* ??? Runtime added insns not handled yet. */
1342 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
1343 const char *str
= *strp
;
1346 const CGEN_SYNTAX_CHAR_TYPE
* syn
;
1347 #ifdef CGEN_MNEMONIC_OPERANDS
1352 /* For now we assume the mnemonic is first (there are no leading operands).
1353 We can parse it without needing to set up operand parsing.
1354 GAS's input scrubber will ensure mnemonics are lowercase, but we may
1355 not be called from GAS. */
1356 p
= CGEN_INSN_MNEMONIC (insn
);
1357 while (*p
&& TOLOWER (*p
) == TOLOWER (*str
))
1361 return _("unrecognized instruction");
1363 #ifndef CGEN_MNEMONIC_OPERANDS
1364 if (* str
&& ! ISSPACE (* str
))
1365 return _("unrecognized instruction");
1368 CGEN_INIT_PARSE (cd
);
1369 cgen_init_parse_operand (cd
);
1370 #ifdef CGEN_MNEMONIC_OPERANDS
1374 /* We don't check for (*str != '\0') here because we want to parse
1375 any trailing fake arguments in the syntax string. */
1376 syn
= CGEN_SYNTAX_STRING (syntax
);
1378 /* Mnemonics come first for now, ensure valid string. */
1379 if (! CGEN_SYNTAX_MNEMONIC_P (* syn
))
1386 /* Non operand chars must match exactly. */
1387 if (CGEN_SYNTAX_CHAR_P (* syn
))
1389 /* FIXME: While we allow for non-GAS callers above, we assume the
1390 first char after the mnemonic part is a space. */
1391 /* FIXME: We also take inappropriate advantage of the fact that
1392 GAS's input scrubber will remove extraneous blanks. */
1393 if (TOLOWER (*str
) == TOLOWER (CGEN_SYNTAX_CHAR (* syn
)))
1395 #ifdef CGEN_MNEMONIC_OPERANDS
1396 if (CGEN_SYNTAX_CHAR(* syn
) == ' ')
1404 /* Syntax char didn't match. Can't be this insn. */
1405 static char msg
[80];
1407 /* xgettext:c-format */
1408 sprintf (msg
, _("syntax error (expected char `%c', found `%c')"),
1409 CGEN_SYNTAX_CHAR(*syn
), *str
);
1414 /* Ran out of input. */
1415 static char msg
[80];
1417 /* xgettext:c-format */
1418 sprintf (msg
, _("syntax error (expected char `%c', found end of instruction)"),
1419 CGEN_SYNTAX_CHAR(*syn
));
1425 /* We have an operand of some sort. */
1426 errmsg
= cd
->parse_operand (cd
, CGEN_SYNTAX_FIELD (*syn
),
1431 /* Done with this operand, continue with next one. */
1435 /* If we're at the end of the syntax string, we're done. */
1438 /* FIXME: For the moment we assume a valid `str' can only contain
1439 blanks now. IE: We needn't try again with a longer version of
1440 the insn and it is assumed that longer versions of insns appear
1441 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
1442 while (ISSPACE (* str
))
1446 return _("junk at end of line"); /* FIXME: would like to include `str' */
1451 /* We couldn't parse it. */
1452 return _("unrecognized instruction");
1455 /* Main entry point.
1456 This routine is called for each instruction to be assembled.
1457 STR points to the insn to be assembled.
1458 We assume all necessary tables have been initialized.
1459 The assembled instruction, less any fixups, is stored in BUF.
1460 Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
1461 still needs to be converted to target byte order, otherwise BUF is an array
1462 of bytes in target byte order.
1463 The result is a pointer to the insn's entry in the opcode table,
1464 or NULL if an error occured (an error message will have already been
1467 Note that when processing (non-alias) macro-insns,
1468 this function recurses.
1470 ??? It's possible to make this cpu-independent.
1471 One would have to deal with a few minor things.
1472 At this point in time doing so would be more of a curiosity than useful
1473 [for example this file isn't _that_ big], but keeping the possibility in
1474 mind helps keep the design clean. */
1477 mep_cgen_assemble_insn (CGEN_CPU_DESC cd
,
1479 CGEN_FIELDS
*fields
,
1480 CGEN_INSN_BYTES_PTR buf
,
1484 CGEN_INSN_LIST
*ilist
;
1485 const char *parse_errmsg
= NULL
;
1486 const char *insert_errmsg
= NULL
;
1487 int recognized_mnemonic
= 0;
1489 /* Skip leading white space. */
1490 while (ISSPACE (* str
))
1493 /* The instructions are stored in hashed lists.
1494 Get the first in the list. */
1495 ilist
= CGEN_ASM_LOOKUP_INSN (cd
, str
);
1497 /* Keep looking until we find a match. */
1499 for ( ; ilist
!= NULL
; ilist
= CGEN_ASM_NEXT_INSN (ilist
))
1501 const CGEN_INSN
*insn
= ilist
->insn
;
1502 recognized_mnemonic
= 1;
1504 #ifdef CGEN_VALIDATE_INSN_SUPPORTED
1505 /* Not usually needed as unsupported opcodes
1506 shouldn't be in the hash lists. */
1507 /* Is this insn supported by the selected cpu? */
1508 if (! mep_cgen_insn_supported (cd
, insn
))
1511 /* If the RELAXED attribute is set, this is an insn that shouldn't be
1512 chosen immediately. Instead, it is used during assembler/linker
1513 relaxation if possible. */
1514 if (CGEN_INSN_ATTR_VALUE (insn
, CGEN_INSN_RELAXED
) != 0)
1519 /* Skip this insn if str doesn't look right lexically. */
1520 if (CGEN_INSN_RX (insn
) != NULL
&&
1521 regexec ((regex_t
*) CGEN_INSN_RX (insn
), str
, 0, NULL
, 0) == REG_NOMATCH
)
1524 /* Allow parse/insert handlers to obtain length of insn. */
1525 CGEN_FIELDS_BITSIZE (fields
) = CGEN_INSN_BITSIZE (insn
);
1527 parse_errmsg
= CGEN_PARSE_FN (cd
, insn
) (cd
, insn
, & str
, fields
);
1528 if (parse_errmsg
!= NULL
)
1531 /* ??? 0 is passed for `pc'. */
1532 insert_errmsg
= CGEN_INSERT_FN (cd
, insn
) (cd
, insn
, fields
, buf
,
1534 if (insert_errmsg
!= NULL
)
1537 /* It is up to the caller to actually output the insn and any
1543 static char errbuf
[150];
1544 #ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
1545 const char *tmp_errmsg
;
1547 /* If requesting verbose error messages, use insert_errmsg.
1548 Failing that, use parse_errmsg. */
1549 tmp_errmsg
= (insert_errmsg
? insert_errmsg
:
1550 parse_errmsg
? parse_errmsg
:
1551 recognized_mnemonic
?
1552 _("unrecognized form of instruction") :
1553 _("unrecognized instruction"));
1555 if (strlen (start
) > 50)
1556 /* xgettext:c-format */
1557 sprintf (errbuf
, "%s `%.50s...'", tmp_errmsg
, start
);
1559 /* xgettext:c-format */
1560 sprintf (errbuf
, "%s `%.50s'", tmp_errmsg
, start
);
1562 if (strlen (start
) > 50)
1563 /* xgettext:c-format */
1564 sprintf (errbuf
, _("bad instruction `%.50s...'"), start
);
1566 /* xgettext:c-format */
1567 sprintf (errbuf
, _("bad instruction `%.50s'"), start
);