diff options
author | obrien <obrien@FreeBSD.org> | 2002-02-01 18:16:02 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2002-02-01 18:16:02 +0000 |
commit | c9ab9ae440a8066b2c2b85b157b1fdadcf09916a (patch) | |
tree | 086d9d6c8fbd4fc8fe4495059332f66bc0f8d12b /contrib/gcc/genemit.c | |
parent | 2ecfd8bd04b63f335c1ec6295740a4bfd97a4fa6 (diff) | |
download | FreeBSD-src-c9ab9ae440a8066b2c2b85b157b1fdadcf09916a.zip FreeBSD-src-c9ab9ae440a8066b2c2b85b157b1fdadcf09916a.tar.gz |
Enlist the FreeBSD-CURRENT users as testers of what is to become Gcc 3.1.0.
These bits are taken from the FSF anoncvs repo on 1-Feb-2002 08:20 PST.
Diffstat (limited to 'contrib/gcc/genemit.c')
-rw-r--r-- | contrib/gcc/genemit.c | 460 |
1 files changed, 252 insertions, 208 deletions
diff --git a/contrib/gcc/genemit.c b/contrib/gcc/genemit.c index c7daa1d..712dd24 100644 --- a/contrib/gcc/genemit.c +++ b/contrib/gcc/genemit.c @@ -1,44 +1,35 @@ /* Generate code from machine description to emit insns as rtl. - Copyright (C) 1987, 88, 91, 94, 95, 97, 98, 1999 Free Software Foundation, Inc. + Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. -This file is part of GNU CC. +This file is part of GCC. -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ #include "hconfig.h" #include "system.h" #include "rtl.h" -#include "obstack.h" +#include "errors.h" +#include "gensupport.h" -static struct obstack obstack; -struct obstack *rtl_obstack = &obstack; - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -void fatal PVPROTO ((const char *, ...)) - ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN; - -/* Define this so we can link with print-rtl.o to get debug_rtx function. */ -char **insn_name_ptr = 0; static int max_opno; static int max_dup_opno; +static int max_scratch_opno; static int register_constraints; static int insn_code_number; static int insn_index_number; @@ -53,6 +44,7 @@ struct clobber_pat rtx pattern; int first_clobber; struct clobber_pat *next; + int has_hard_reg; } *clobber_list; /* Records one insn that uses the clobber list. */ @@ -63,25 +55,27 @@ struct clobber_ent struct clobber_ent *next; }; -static void max_operand_1 PROTO((rtx)); -static int max_operand_vec PROTO((rtx, int)); -static void print_code PROTO((RTX_CODE)); -static void gen_exp PROTO((rtx)); -static void gen_insn PROTO((rtx)); -static void gen_expand PROTO((rtx)); -static void gen_split PROTO((rtx)); -static void output_add_clobbers PROTO((void)); -static void output_init_mov_optab PROTO((void)); +static void max_operand_1 PARAMS ((rtx)); +static int max_operand_vec PARAMS ((rtx, int)); +static void print_code PARAMS ((RTX_CODE)); +static void gen_exp PARAMS ((rtx, enum rtx_code)); +static void gen_insn PARAMS ((rtx)); +static void gen_expand PARAMS ((rtx)); +static void gen_split PARAMS ((rtx)); +static void output_add_clobbers PARAMS ((void)); +static void output_added_clobbers_hard_reg_p PARAMS ((void)); +static void gen_rtx_scratch PARAMS ((rtx, enum rtx_code)); +static void output_peephole2_scratches PARAMS ((rtx)); static void max_operand_1 (x) rtx x; { - register RTX_CODE code; - register int i; - register int len; - register char *fmt; + RTX_CODE code; + int i; + int len; + const char *fmt; if (x == 0) return; @@ -97,6 +91,8 @@ max_operand_1 (x) max_opno = MAX (max_opno, XINT (x, 0)); if (code == MATCH_DUP || code == MATCH_OP_DUP || code == MATCH_PAR_DUP) max_dup_opno = MAX (max_dup_opno, XINT (x, 0)); + if (code == MATCH_SCRATCH) + max_scratch_opno = MAX (max_scratch_opno, XINT (x, 0)); fmt = GET_RTX_FORMAT (code); len = GET_RTX_LENGTH (code); @@ -118,11 +114,12 @@ max_operand_vec (insn, arg) rtx insn; int arg; { - register int len = XVECLEN (insn, arg); - register int i; + int len = XVECLEN (insn, arg); + int i; max_opno = -1; max_dup_opno = -1; + max_scratch_opno = -1; for (i = 0; i < len; i++) max_operand_1 (XVECEXP (insn, arg, i)); @@ -134,13 +131,23 @@ static void print_code (code) RTX_CODE code; { - register char *p1; + const char *p1; for (p1 = GET_RTX_NAME (code); *p1; p1++) + putchar (TOUPPER(*p1)); +} + +static void +gen_rtx_scratch (x, subroutine_type) + rtx x; + enum rtx_code subroutine_type; +{ + if (subroutine_type == DEFINE_PEEPHOLE2) { - if (*p1 >= 'a' && *p1 <= 'z') - putchar (*p1 + 'A' - 'a'); - else - putchar (*p1); + printf ("operand%d", XINT (x, 0)); + } + else + { + printf ("gen_rtx_SCRATCH (%smode)", GET_MODE_NAME (GET_MODE (x))); } } @@ -148,13 +155,14 @@ print_code (code) substituting any operand references appearing within. */ static void -gen_exp (x) +gen_exp (x, subroutine_type) rtx x; + enum rtx_code subroutine_type; { - register RTX_CODE code; - register int i; - register int len; - register char *fmt; + RTX_CODE code; + int i; + int len; + const char *fmt; if (x == 0) { @@ -180,7 +188,7 @@ gen_exp (x) for (i = 0; i < XVECLEN (x, 1); i++) { printf (",\n\t\t"); - gen_exp (XVECEXP (x, 1, i)); + gen_exp (XVECEXP (x, 1, i), subroutine_type); } printf (")"); return; @@ -191,7 +199,7 @@ gen_exp (x) for (i = 0; i < XVECLEN (x, 2); i++) { printf (",\n\t\t"); - gen_exp (XVECEXP (x, 2, i)); + gen_exp (XVECEXP (x, 2, i), subroutine_type); } printf (")"); return; @@ -202,7 +210,7 @@ gen_exp (x) return; case MATCH_SCRATCH: - printf ("gen_rtx_SCRATCH (%smode)", GET_MODE_NAME (GET_MODE (x))); + gen_rtx_scratch (x, subroutine_type); return; case ADDRESS: @@ -254,7 +262,7 @@ gen_exp (x) break; printf (",\n\t"); if (fmt[i] == 'e' || fmt[i] == 'u') - gen_exp (XEXP (x, i)); + gen_exp (XEXP (x, i), subroutine_type); else if (fmt[i] == 'i') printf ("%u", XINT (x, i)); else if (fmt[i] == 's') @@ -266,7 +274,7 @@ gen_exp (x) for (j = 0; j < XVECLEN (x, i); j++) { printf (",\n\t\t"); - gen_exp (XVECEXP (x, i, j)); + gen_exp (XVECEXP (x, i, j), subroutine_type); } printf (")"); } @@ -283,7 +291,7 @@ gen_insn (insn) rtx insn; { int operands; - register int i; + int i; /* See if the pattern for this insn ends with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes. If so, store away the information for @@ -291,18 +299,25 @@ gen_insn (insn) if (XVEC (insn, 1)) { + int has_hard_reg = 0; + for (i = XVECLEN (insn, 1) - 1; i > 0; i--) - if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER - || (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != REG - && GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH)) - break; + { + if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER) + break; + + if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) == REG) + has_hard_reg = 1; + else if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH) + break; + } if (i != XVECLEN (insn, 1) - 1) { - register struct clobber_pat *p; - register struct clobber_ent *link + struct clobber_pat *p; + struct clobber_ent *link = (struct clobber_ent *) xmalloc (sizeof (struct clobber_ent)); - register int j; + int j; link->code_number = insn_code_number; @@ -343,6 +358,7 @@ gen_insn (insn) p->pattern = insn; p->first_clobber = i + 1; p->next = clobber_list; + p->has_hard_reg = has_hard_reg; clobber_list = p; } @@ -367,7 +383,10 @@ gen_insn (insn) /* Output the function name and argument declarations. */ printf ("rtx\ngen_%s (", XSTR (insn, 0)); for (i = 0; i < operands; i++) - printf (i ? ", operand%d" : "operand%d", i); + if (i) + printf (", operand%d", i); + else + printf ("operand%d", i); printf (")\n"); for (i = 0; i < operands; i++) printf (" rtx operand%d;\n", i); @@ -378,16 +397,18 @@ gen_insn (insn) if (XVECLEN (insn, 1) == 1) { printf (" return "); - gen_exp (XVECEXP (insn, 1, 0)); + gen_exp (XVECEXP (insn, 1, 0), DEFINE_INSN); printf (";\n}\n\n"); } else { - printf (" return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (%d", XVECLEN (insn, 1)); + printf (" return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (%d", + XVECLEN (insn, 1)); + for (i = 0; i < XVECLEN (insn, 1); i++) { printf (",\n\t\t"); - gen_exp (XVECEXP (insn, 1, i)); + gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN); } printf ("));\n}\n\n"); } @@ -400,7 +421,7 @@ gen_expand (expand) rtx expand; { int operands; - register int i; + int i; if (strlen (XSTR (expand, 0)) == 0) fatal ("define_expand lacks a name"); @@ -416,7 +437,10 @@ gen_expand (expand) /* Output the function name and argument declarations. */ printf ("rtx\ngen_%s (", XSTR (expand, 0)); for (i = 0; i < operands; i++) - printf (i ? ", operand%d" : "operand%d", i); + if (i) + printf (", operand%d", i); + else + printf ("operand%d", i); printf (")\n"); for (i = 0; i < operands; i++) printf (" rtx operand%d;\n", i); @@ -430,7 +454,7 @@ gen_expand (expand) && XVECLEN (expand, 1) == 1) { printf (" return "); - gen_exp (XVECEXP (expand, 1, 0)); + gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND); printf (";\n}\n\n"); return; } @@ -439,8 +463,8 @@ gen_expand (expand) make a local variable. */ for (i = operands; i <= max_dup_opno; i++) printf (" rtx operand%d;\n", i); - if (operands > 0 || max_dup_opno >= 0) - printf (" rtx operands[%d];\n", MAX (operands, max_dup_opno + 1)); + for (; i <= max_scratch_opno; i++) + printf (" rtx operand%d ATTRIBUTE_UNUSED;\n", i); printf (" rtx _val = 0;\n"); printf (" start_sequence ();\n"); @@ -452,9 +476,13 @@ gen_expand (expand) So copy the operand values there before executing it. */ if (XSTR (expand, 3) && *XSTR (expand, 3)) { + printf (" {\n"); + if (operands > 0 || max_dup_opno >= 0 || max_scratch_opno >= 0) + printf (" rtx operands[%d];\n", + MAX (operands, MAX (max_scratch_opno, max_dup_opno) + 1)); /* Output code to copy the arguments into `operands'. */ for (i = 0; i < operands; i++) - printf (" operands[%d] = operand%d;\n", i, i); + printf (" operands[%d] = operand%d;\n", i, i); /* Output the special code to be executed before the sequence is generated. */ @@ -465,10 +493,13 @@ gen_expand (expand) if (XVEC (expand, 1) != 0) { for (i = 0; i < operands; i++) - printf (" operand%d = operands[%d];\n", i, i); + printf (" operand%d = operands[%d];\n", i, i); for (; i <= max_dup_opno; i++) - printf (" operand%d = operands[%d];\n", i, i); + printf (" operand%d = operands[%d];\n", i, i); + for (; i <= max_scratch_opno; i++) + printf (" operand%d = operands[%d];\n", i, i); } + printf (" }\n"); } /* Output code to construct the rtl for the instruction bodies. @@ -495,15 +526,16 @@ gen_expand (expand) else if (GET_CODE (next) == CODE_LABEL) printf (" emit_label ("); else if (GET_CODE (next) == MATCH_OPERAND + || GET_CODE (next) == MATCH_DUP || GET_CODE (next) == MATCH_OPERATOR - || GET_CODE (next) == MATCH_PARALLEL || GET_CODE (next) == MATCH_OP_DUP - || GET_CODE (next) == MATCH_DUP + || GET_CODE (next) == MATCH_PARALLEL + || GET_CODE (next) == MATCH_PAR_DUP || GET_CODE (next) == PARALLEL) printf (" emit ("); else printf (" emit_insn ("); - gen_exp (next); + gen_exp (next, DEFINE_EXPAND); printf (");\n"); if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC && GET_CODE (SET_SRC (next)) == LABEL_REF) @@ -524,29 +556,51 @@ static void gen_split (split) rtx split; { - register int i; + int i; int operands; + const char *const name = + ((GET_CODE (split) == DEFINE_PEEPHOLE2) ? "peephole2" : "split"); + const char *unused; if (XVEC (split, 0) == 0) - fatal ("define_split (definition %d) lacks a pattern", insn_index_number); + fatal ("define_%s (definition %d) lacks a pattern", name, + insn_index_number); else if (XVEC (split, 2) == 0) - fatal ("define_split (definition %d) lacks a replacement pattern", + fatal ("define_%s (definition %d) lacks a replacement pattern", name, insn_index_number); /* Find out how many operands this function has. */ max_operand_vec (split, 2); - operands = MAX (max_opno, max_dup_opno) + 1; + operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1; + unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : ""); - /* Output the function name and argument declarations. */ - printf ("rtx\ngen_split_%d (operands)\n rtx *operands;\n", - insn_code_number); + /* Output the prototype, function name and argument declarations. */ + if (GET_CODE (split) == DEFINE_PEEPHOLE2) + { + printf ("extern rtx gen_%s_%d PARAMS ((rtx, rtx *));\n", + name, insn_code_number); + printf ("rtx\ngen_%s_%d (curr_insn, operands)\n", + name, insn_code_number); + printf (" rtx curr_insn ATTRIBUTE_UNUSED;\n"); + printf (" rtx *operands%s;\n", unused); + } + else + { + printf ("extern rtx gen_split_%d PARAMS ((rtx *));\n", insn_code_number); + printf ("rtx\ngen_%s_%d (operands)\n", name, insn_code_number); + printf (" rtx *operands%s;\n", unused); + } printf ("{\n"); /* Declare all local variables. */ for (i = 0; i < operands; i++) printf (" rtx operand%d;\n", i); printf (" rtx _val = 0;\n"); + + if (GET_CODE (split) == DEFINE_PEEPHOLE2) + output_peephole2_scratches (split); + printf (" start_sequence ();\n"); /* The fourth operand of DEFINE_SPLIT is some code to be executed @@ -591,7 +645,7 @@ gen_split (split) printf (" emit ("); else printf (" emit_insn ("); - gen_exp (next); + gen_exp (next, GET_CODE (split)); printf (");\n"); if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC && GET_CODE (SET_SRC (next)) == LABEL_REF) @@ -618,7 +672,7 @@ output_add_clobbers () int i; printf ("\n\nvoid\nadd_clobbers (pattern, insn_code_number)\n"); - printf (" rtx pattern;\n int insn_code_number;\n"); + printf (" rtx pattern ATTRIBUTE_UNUSED;\n int insn_code_number;\n"); printf ("{\n"); printf (" switch (insn_code_number)\n"); printf (" {\n"); @@ -631,7 +685,8 @@ output_add_clobbers () for (i = clobber->first_clobber; i < XVECLEN (clobber->pattern, 1); i++) { printf (" XVECEXP (pattern, 0, %d) = ", i); - gen_exp (XVECEXP (clobber->pattern, 1, i)); + gen_exp (XVECEXP (clobber->pattern, 1, i), + GET_CODE (clobber->pattern)); printf (";\n"); } @@ -644,119 +699,98 @@ output_add_clobbers () printf ("}\n"); } -/* Write a function, init_mov_optab, that is called to set up entries - in mov_optab for EXTRA_CC_MODES. */ +/* Write a function, `added_clobbers_hard_reg_p' this is given an insn_code + number that needs clobbers and returns 1 if they include a clobber of a + hard reg and 0 if they just clobber SCRATCH. */ static void -output_init_mov_optab () +output_added_clobbers_hard_reg_p () { -#ifdef EXTRA_CC_NAMES - static char *cc_names[] = { EXTRA_CC_NAMES }; - char *p; - size_t i; + struct clobber_pat *clobber; + struct clobber_ent *ent; + int clobber_p; - printf ("\nvoid\ninit_mov_optab ()\n{\n"); + printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n"); + printf (" int insn_code_number;\n"); + printf ("{\n"); + printf (" switch (insn_code_number)\n"); + printf (" {\n"); - for (i = 0; i < sizeof cc_names / sizeof cc_names[0]; i++) + for (clobber_p = 0; clobber_p <= 1; clobber_p++) { - printf ("#ifdef HAVE_mov"); - for (p = cc_names[i]; *p; p++) - printf ("%c", *p >= 'A' && *p <= 'Z' ? *p - 'A' + 'a' : *p); - printf ("\n"); - printf (" if (HAVE_mov"); - for (p = cc_names[i]; *p; p++) - printf ("%c", *p >= 'A' && *p <= 'Z' ? *p - 'A' + 'a' : *p); - printf (")\n"); - printf (" mov_optab->handlers[(int) %smode].insn_code = CODE_FOR_mov", - cc_names[i]); - for (p = cc_names[i]; *p; p++) - printf ("%c", *p >= 'A' && *p <= 'Z' ? *p - 'A' + 'a' : *p); - printf (";\n#endif\n"); + for (clobber = clobber_list; clobber; clobber = clobber->next) + if (clobber->has_hard_reg == clobber_p) + for (ent = clobber->insns; ent; ent = ent->next) + printf (" case %d:\n", ent->code_number); + + printf (" return %d;\n\n", clobber_p); } + printf (" default:\n"); + printf (" abort ();\n"); + printf (" }\n"); printf ("}\n"); -#endif } -PTR -xmalloc (size) - size_t size; -{ - register PTR val = (PTR) malloc (size); +/* Generate code to invoke find_free_register () as needed for the + scratch registers used by the peephole2 pattern in SPLIT. */ - if (val == 0) - fatal ("virtual memory exhausted"); +static void +output_peephole2_scratches (split) + rtx split; +{ + int i; + int insn_nr = 0; - return val; -} + printf (" HARD_REG_SET _regs_allocated;\n"); + printf (" CLEAR_HARD_REG_SET (_regs_allocated);\n"); -PTR -xrealloc (old, size) - PTR old; - size_t size; -{ - register PTR ptr; - if (old) - ptr = (PTR) realloc (old, size); - else - ptr = (PTR) malloc (size); - if (!ptr) - fatal ("virtual memory exhausted"); - return ptr; -} + for (i = 0; i < XVECLEN (split, 0); i++) + { + rtx elt = XVECEXP (split, 0, i); + if (GET_CODE (elt) == MATCH_SCRATCH) + { + int last_insn_nr = insn_nr; + int cur_insn_nr = insn_nr; + int j; + for (j = i + 1; j < XVECLEN (split, 0); j++) + if (GET_CODE (XVECEXP (split, 0, j)) == MATCH_DUP) + { + if (XINT (XVECEXP (split, 0, j), 0) == XINT (elt, 0)) + last_insn_nr = cur_insn_nr; + } + else if (GET_CODE (XVECEXP (split, 0, j)) != MATCH_SCRATCH) + cur_insn_nr++; + + printf (" if ((operands[%d] = peep2_find_free_register (%d, %d, \"%s\", %smode, &_regs_allocated)) == NULL_RTX)\n\ + return NULL;\n", + XINT (elt, 0), + insn_nr, last_insn_nr, + XSTR (elt, 1), + GET_MODE_NAME (GET_MODE (elt))); -void -fatal VPROTO ((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, const char *); -#endif - - fprintf (stderr, "genemit: "); - vfprintf (stderr, format, ap); - va_end (ap); - fprintf (stderr, "\n"); - exit (FATAL_EXIT_CODE); + } + else if (GET_CODE (elt) != MATCH_DUP) + insn_nr++; + } } -/* More 'friendly' abort that prints the line and file. - config.h can #define abort fancy_abort if you like that sort of thing. */ +extern int main PARAMS ((int, char **)); -void -fancy_abort () -{ - fatal ("Internal gcc abort."); -} - int main (argc, argv) int argc; char **argv; { rtx desc; - FILE *infile; - register int c; - obstack_init (rtl_obstack); + progname = "genemit"; if (argc <= 1) - fatal ("No input file name."); - - infile = fopen (argv[1], "r"); - if (infile == 0) - { - perror (argv[1]); - exit (FATAL_EXIT_CODE); - } + fatal ("no input file name"); - init_rtl (); + if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE) + return (FATAL_EXIT_CODE); /* Assign sequential codes to all entries in the machine description in parallel with the tables in insn-output.c. */ @@ -770,17 +804,20 @@ from the machine description file `md'. */\n\n"); printf ("#include \"config.h\"\n"); printf ("#include \"system.h\"\n"); printf ("#include \"rtl.h\"\n"); + printf ("#include \"tm_p.h\"\n"); + printf ("#include \"function.h\"\n"); printf ("#include \"expr.h\"\n"); + printf ("#include \"optabs.h\"\n"); printf ("#include \"real.h\"\n"); printf ("#include \"flags.h\"\n"); printf ("#include \"output.h\"\n"); printf ("#include \"insn-config.h\"\n"); - printf ("#include \"insn-flags.h\"\n"); - printf ("#include \"insn-codes.h\"\n"); + printf ("#include \"hard-reg-set.h\"\n"); printf ("#include \"recog.h\"\n"); - printf ("#include \"reload.h\"\n\n"); - printf ("extern rtx recog_operand[];\n"); - printf ("#define operands emit_operand\n\n"); + printf ("#include \"resource.h\"\n"); + printf ("#include \"reload.h\"\n"); + printf ("#include \"toplev.h\"\n"); + printf ("#include \"ggc.h\"\n\n"); printf ("#define FAIL return (end_sequence (), _val)\n"); printf ("#define DONE return (_val = gen_sequence (), end_sequence (), _val)\n"); @@ -788,42 +825,49 @@ from the machine description file `md'. */\n\n"); while (1) { - c = read_skip_spaces (infile); - if (c == EOF) + int line_no; + + desc = read_md_rtx (&line_no, &insn_code_number); + if (desc == NULL) break; - ungetc (c, infile); - desc = read_rtx (infile); - if (GET_CODE (desc) == DEFINE_INSN) - { - gen_insn (desc); - ++insn_code_number; - } - if (GET_CODE (desc) == DEFINE_EXPAND) - { - gen_expand (desc); - ++insn_code_number; - } - if (GET_CODE (desc) == DEFINE_SPLIT) - { - gen_split (desc); - ++insn_code_number; - } - if (GET_CODE (desc) == DEFINE_PEEPHOLE) + switch (GET_CODE (desc)) { - ++insn_code_number; - } + case DEFINE_INSN: + gen_insn (desc); + break; + + case DEFINE_EXPAND: + gen_expand (desc); + break; + + case DEFINE_SPLIT: + gen_split (desc); + break; + + case DEFINE_PEEPHOLE2: + gen_split (desc); + break; + + default: + break; + } ++insn_index_number; } - /* Write out the routine to add CLOBBERs to a pattern. */ + /* Write out the routines to add CLOBBERs to a pattern and say whether they + clobber a hard reg. */ output_add_clobbers (); - - /* Write the routine to initialize mov_optab for the EXTRA_CC_MODES. */ - output_init_mov_optab (); + output_added_clobbers_hard_reg_p (); fflush (stdout); - exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); - /* NOTREACHED */ - return 0; + return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); +} + +/* Define this so we can link with print-rtl.o to get debug_rtx function. */ +const char * +get_insn_name (code) + int code ATTRIBUTE_UNUSED; +{ + return NULL; } |