X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gcc%2Fgenpeep.c;h=875598d6e462f4a026cecd2657121fecf609b516;hb=7adcbafe45f8001b698967defe682687b52c0007;hp=fd3939843bb77740f1f548331d6602d93a028469;hpb=320e7c40e730e7b6ab8346b4cc41989a9031c28d;p=thirdparty%2Fgcc.git diff --git a/gcc/genpeep.c b/gcc/genpeep.c index fd3939843bb7..875598d6e462 100644 --- a/gcc/genpeep.c +++ b/gcc/genpeep.c @@ -1,42 +1,31 @@ /* Generate code from machine description to perform peephole optimizations. - Copyright (C) 1987, 1989, 1992, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1987-2022 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 3, 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 COPYING3. If not see +. */ -#include "hconfig.h" -#ifdef __STDC__ -#include -#else -#include -#endif +#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 - -/* Define this so we can link with print-rtl.o to get debug_rtx function. */ -char **insn_name_ptr = 0; /* While tree-walking an instruction pattern, we keep a chain of these `struct link's to record how to get down to the @@ -51,68 +40,48 @@ struct link int vecelt; }; -char *xmalloc PROTO((unsigned)); -static void fatal PVPROTO ((char *, ...)) ATTRIBUTE_PRINTF_1; -void fancy_abort PROTO((void)); - static int max_opno; /* Number of operands used in current peephole definition. */ static int n_operands; -/* Peephole optimizations get insn codes just like insn patterns. - Count them so we know the code of the define_peephole we are handling. */ - -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 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 (md_rtx_info *info) { + rtx peep = info->def; int ninsns = XVECLEN (peep, 0); int i; n_operands = 0; printf (" insn = ins1;\n"); -#if 0 - printf (" want_jump = 0;\n"); -#endif for (i = 0; i < ninsns; i++) { if (i > 0) { printf (" do { insn = NEXT_INSN (insn);\n"); - printf (" if (insn == 0) goto L%d; }\n", - insn_code_number); - printf (" while (GET_CODE (insn) == NOTE\n"); - printf ("\t || (GET_CODE (insn) == INSN\n"); + printf (" if (insn == 0) goto L%d; }\n", info->index); + printf (" while (NOTE_P (insn)\n"); + printf ("\t || (NONJUMP_INSN_P (insn)\n"); printf ("\t && (GET_CODE (PATTERN (insn)) == USE\n"); printf ("\t\t || GET_CODE (PATTERN (insn)) == CLOBBER)));\n"); - printf (" if (GET_CODE (insn) == CODE_LABEL\n\ - || GET_CODE (insn) == BARRIER)\n goto L%d;\n", - insn_code_number); + printf (" if (LABEL_P (insn)\n\ + || BARRIER_P (insn))\n goto L%d;\n", info->index); } -#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, info->index); } /* We get this far if the pattern matches. @@ -120,7 +89,7 @@ gen_peephole (peep) if (XSTR (peep, 1) && XSTR (peep, 1)[0]) printf (" if (! (%s)) goto L%d;\n", - XSTR (peep, 1), insn_code_number); + XSTR (peep, 1), info->index); /* If that matches, construct new pattern and put it in the first insn. This new pattern will never be matched. @@ -130,19 +99,9 @@ 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", - insn_code_number); + printf (" INSN_CODE (ins1) = %d;\n", info->index); /* Delete the remaining insns. */ if (ninsns > 1) @@ -152,19 +111,16 @@ gen_peephole (peep) cannot be zero. */ printf (" return NEXT_INSN (insn);\n"); - printf (" L%d:\n\n", insn_code_number); + printf (" L%d:\n\n", info->index); } 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 char *fmt; + RTX_CODE code; + int i; + int len; + const char *fmt; struct link link; if (x == 0) @@ -266,10 +222,6 @@ match_rtx (x, path, fail_label) } return; - case ADDRESS: - match_rtx (XEXP (x, 0), path, fail_label); - return; - default: break; } @@ -321,6 +273,12 @@ match_rtx (x, path, fail_label) printf (" if (XINT (x, %d) != %d) goto L%d;\n", i, XINT (x, i), fail_label); } + else if (fmt[i] == 'r') + { + gcc_assert (i == 0); + printf (" if (REGNO (x) != %d) goto L%d;\n", + REGNO (x), fail_label); + } else if (fmt[i] == 'w') { /* Make sure that at run time `x' is the RTX we want to test. */ @@ -348,6 +306,9 @@ match_rtx (x, path, fail_label) printf (" if (strcmp (XSTR (x, %d), \"%s\")) goto L%d;\n", i, XSTR (x, i), fail_label); } + else if (fmt[i] == 'p') + /* Not going to support subregs for legacy define_peeholes. */ + gcc_unreachable (); } } @@ -356,8 +317,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"); @@ -376,140 +336,75 @@ print_path (path) } static void -print_code (code) - RTX_CODE code; +print_code (RTX_CODE code) { - register char *p1; + const char *p1; for (p1 = GET_RTX_NAME (code); *p1; p1++) - { - if (*p1 >= 'a' && *p1 <= 'z') - putchar (*p1 + 'A' - 'a'); - else - putchar (*p1); - } -} - -char * -xmalloc (size) - unsigned size; -{ - register char *val = (char *) malloc (size); - - if (val == 0) - fatal ("virtual memory exhausted"); - return val; + putchar (TOUPPER (*p1)); } -char * -xrealloc (ptr, size) - char *ptr; - unsigned size; -{ - char *result = (char *) realloc (ptr, size); - if (!result) - fatal ("virtual memory exhausted"); - return result; -} +extern int main (int, const char **); -static void -fatal VPROTO ((char *format, ...)) -{ -#ifndef __STDC__ - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef __STDC__ - format = va_arg (ap, char *); -#endif - - fprintf (stderr, "genpeep: "); - vfprintf (stderr, format, ap); - va_end (ap); - fprintf (stderr, "\n"); - exit (FATAL_EXIT_CODE); -} - -/* More 'friendly' abort that prints the line and file. - config.h can #define abort fancy_abort if you like that sort of thing. */ - -void -fancy_abort () -{ - fatal ("Internal gcc abort."); -} - int -main (argc, argv) - int argc; - char **argv; +main (int argc, const char **argv) { - rtx desc; - FILE *infile; - register int c; - max_opno = -1; - obstack_init (rtl_obstack); + progname = "genpeep"; - if (argc <= 1) - fatal ("No input file name."); - - infile = fopen (argv[1], "r"); - if (infile == 0) - { - perror (argv[1]); - exit (FATAL_EXIT_CODE); - } - - init_rtl (); + if (!init_rtx_reader_args (argc, argv)) + return (FATAL_EXIT_CODE); printf ("/* Generated automatically by the program `genpeep'\n\ from the machine description file `md'. */\n\n"); + printf ("#define IN_TARGET_CODE 1\n"); printf ("#include \"config.h\"\n"); printf ("#include \"system.h\"\n"); + printf ("#include \"coretypes.h\"\n"); + printf ("#include \"backend.h\"\n"); + printf ("#include \"tree.h\"\n"); printf ("#include \"rtl.h\"\n"); + printf ("#include \"insn-config.h\"\n"); + printf ("#include \"alias.h\"\n"); + printf ("#include \"varasm.h\"\n"); + printf ("#include \"stor-layout.h\"\n"); + printf ("#include \"calls.h\"\n"); + printf ("#include \"memmodel.h\"\n"); + printf ("#include \"tm_p.h\"\n"); printf ("#include \"regs.h\"\n"); printf ("#include \"output.h\"\n"); - printf ("#include \"real.h\"\n"); - printf ("#include \"except.h\"\n\n"); + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n"); + printf ("#include \"diagnostic-core.h\"\n"); + printf ("#include \"flags.h\"\n"); + printf ("#include \"tm-constrs.h\"\n\n"); printf ("extern rtx peep_operand[];\n\n"); printf ("#define operands peep_operand\n\n"); - printf ("rtx\npeephole (ins1)\n rtx ins1;\n{\n"); - printf (" rtx insn, x, pat;\n\n"); + printf ("rtx_insn *\npeephole (rtx_insn *ins1)\n{\n"); + printf (" rtx_insn *insn ATTRIBUTE_UNUSED;\n"); + printf (" rtx x ATTRIBUTE_UNUSED, pat ATTRIBUTE_UNUSED;\n\n"); /* Early out: no peepholes for insns followed by barriers. */ printf (" if (NEXT_INSN (ins1)\n"); - printf (" && GET_CODE (NEXT_INSN (ins1)) == BARRIER)\n"); + printf (" && BARRIER_P (NEXT_INSN (ins1)))\n"); printf (" return 0;\n\n"); /* Read the machine description. */ - while (1) - { - c = read_skip_spaces (infile); - if (c == EOF) + md_rtx_info info; + while (read_md_rtx (&info)) + switch (GET_CODE (info.def)) + { + case DEFINE_PEEPHOLE: + gen_peephole (&info); break; - ungetc (c, infile); - desc = read_rtx (infile); - 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) - { - insn_code_number++; - } - } + default: + break; + } printf (" return 0;\n}\n\n"); @@ -519,7 +414,5 @@ from the machine description file `md'. */\n\n"); printf ("rtx peep_operand[%d];\n", max_opno + 1); 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); }