X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgenpeep.c;h=5e22ec0b0687b57019618f5e0e679734cdb51b06;hb=e97f0bd60765119183ab4a4833d870fa04ab3cb1;hp=5d6a4925e3a8b9f7d802b1713f9edcdaaaf8e6f7;hpb=9721bc378d10725644fe816610c9ad5b45c1d267;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/genpeep.c b/gcc/genpeep.c index 5d6a4925e3a..5e22ec0b068 100644 --- a/gcc/genpeep.c +++ b/gcc/genpeep.c @@ -1,35 +1,33 @@ /* Generate code from machine description to perform peephole optimizations. - Copyright (C) 1987, 89, 92, 97, 98, 1999 Free Software Foundation, Inc. + Copyright (C) 1987, 1989, 1992, 1997, 1998, + 1999, 2000, 2003 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 "bconfig.h" #include "system.h" +#include "coretypes.h" +#include "tm.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 /* While tree-walking an instruction pattern, we keep a chain of these `struct link's to record how to get down to the @@ -55,14 +53,13 @@ static int n_operands; static int insn_code_number = 0; -static void gen_peephole PROTO((rtx)); -static void match_rtx PROTO((rtx, struct link *, int)); -static void print_path PROTO((struct link *)); -static void print_code PROTO((RTX_CODE)); +static void gen_peephole (rtx); +static void match_rtx (rtx, struct link *, int); +static void print_path (struct link *); +static void print_code (RTX_CODE); static void -gen_peephole (peep) - rtx peep; +gen_peephole (rtx peep) { int ninsns = XVECLEN (peep, 0); int i; @@ -70,9 +67,6 @@ gen_peephole (peep) n_operands = 0; printf (" insn = ins1;\n"); -#if 0 - printf (" want_jump = 0;\n"); -#endif for (i = 0; i < ninsns; i++) { @@ -88,20 +82,15 @@ gen_peephole (peep) printf (" if (GET_CODE (insn) == CODE_LABEL\n\ || GET_CODE (insn) == BARRIER)\n goto L%d;\n", - insn_code_number); + insn_code_number); } -#if 0 - printf (" if (GET_CODE (insn) == JUMP_INSN)\n"); - printf (" want_jump = JUMP_LABEL (insn);\n"); -#endif - printf (" pat = PATTERN (insn);\n"); /* Walk the insn's pattern, remembering at all times the path down to the walking point. */ - match_rtx (XVECEXP (peep, 0, i), NULL_PTR, insn_code_number); + match_rtx (XVECEXP (peep, 0, i), NULL, insn_code_number); } /* We get this far if the pattern matches. @@ -119,15 +108,6 @@ gen_peephole (peep) printf (" PATTERN (ins1) = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (%d, operands));\n", n_operands); -#if 0 - printf (" if (want_jump && GET_CODE (ins1) != JUMP_INSN)\n"); - printf (" {\n"); - printf (" rtx insn2 = emit_jump_insn_before (PATTERN (ins1), ins1);\n"); - printf (" delete_insn (ins1);\n"); - printf (" ins1 = ins2;\n"); - printf (" }\n"); -#endif - /* Record this define_peephole's insn code in the insn, as if it had been recognized to match this. */ printf (" INSN_CODE (ins1) = %d;\n", @@ -145,15 +125,12 @@ gen_peephole (peep) } static void -match_rtx (x, path, fail_label) - rtx x; - struct link *path; - int fail_label; +match_rtx (rtx x, struct link *path, int fail_label) { - register RTX_CODE code; - register int i; - register int len; - register const char *fmt; + RTX_CODE code; + int i; + int len; + const char *fmt; struct link link; if (x == 0) @@ -258,7 +235,7 @@ match_rtx (x, path, fail_label) case ADDRESS: match_rtx (XEXP (x, 0), path, fail_label); return; - + default: break; } @@ -345,8 +322,7 @@ match_rtx (x, path, fail_label) evaluate to the rtx at that point. */ static void -print_path (path) - struct link *path; +print_path (struct link *path) { if (path == 0) printf ("pat"); @@ -365,71 +341,37 @@ print_path (path) } static void -print_code (code) - RTX_CODE code; +print_code (RTX_CODE code) { - register const char *p1; + const char *p1; for (p1 = GET_RTX_NAME (code); *p1; p1++) putchar (TOUPPER(*p1)); } - -PTR -xmalloc (size) - size_t size; -{ - register PTR val = (PTR) malloc (size); - if (val == 0) - fatal ("virtual memory exhausted"); - return val; -} - -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; -} - -extern int main PROTO ((int, char **)); +extern int main (int, char **); int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { rtx desc; - FILE *infile; - register int c; max_opno = -1; progname = "genpeep"; - obstack_init (rtl_obstack); if (argc <= 1) - fatal ("No input file name."); + fatal ("no input file name"); - infile = fopen (argv[1], "r"); - if (infile == 0) - { - perror (argv[1]); - return (FATAL_EXIT_CODE); - } + if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE) + return (FATAL_EXIT_CODE); printf ("/* Generated automatically by the program `genpeep'\n\ from the machine description file `md'. */\n\n"); printf ("#include \"config.h\"\n"); printf ("#include \"system.h\"\n"); + printf ("#include \"coretypes.h\"\n"); + printf ("#include \"tm.h\"\n"); printf ("#include \"insn-config.h\"\n"); printf ("#include \"rtl.h\"\n"); printf ("#include \"tm_p.h\"\n"); @@ -456,20 +398,21 @@ from the machine description file `md'. */\n\n"); while (1) { - c = read_skip_spaces (infile); - if (c == EOF) + int line_no, rtx_number = 0; + + desc = read_md_rtx (&line_no, &rtx_number); + if (desc == NULL) break; - ungetc (c, infile); - desc = read_rtx (infile); - if (GET_CODE (desc) == DEFINE_PEEPHOLE) + if (GET_CODE (desc) == DEFINE_PEEPHOLE) { gen_peephole (desc); insn_code_number++; } if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND - || GET_CODE (desc) == DEFINE_SPLIT) + || GET_CODE (desc) == DEFINE_SPLIT + || GET_CODE (desc) == DEFINE_PEEPHOLE2) { insn_code_number++; } @@ -489,8 +432,7 @@ from the machine description file `md'. */\n\n"); /* 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; +get_insn_name (int code ATTRIBUTE_UNUSED) { return NULL; }