From b70bd5426e751c76b70d8d569862671a10ecac13 Mon Sep 17 00:00:00 2001 From: zack Date: Mon, 29 Jul 2002 18:02:47 +0000 Subject: * gensupport.c: Include hashtab.h. (insn_elision, condition_table, hash_c_test, cmp_c_test, maybe_eval_c_test): New routines and data structures to support insn elision. (init_md_reader): Read and initialize the condition_table. (read_md_rtx): Discard insn patterns whose C test is provably always false. * gensupport.h: Declare new functions and data structures. * genconditions.c, dummy-conditions.c: New files. * Makefile.in: Build genconditions; run it to construct insn-conditions.c; build that and link it into most gen* programs. (HOST_SUPPORT, HOST_EARLY_SUPPORT): New variables. (GEN): Delete, unused. (STAGESTUFF): Update. * gencodes.c: (gen_insn): #define CODE_FOR_xxx equal to CODE_FOR_nothing for all elided patterns. (main): Tweaked to support this. * genflags.c (gen_proto): Emit a static inline generator function here for all elided patterns, which simply returns NULL_RTX. (gen_insn): Do not define HAVE_xxx for elided patterns. (main): Tweaked to support this. No need to forward-declare struct rtx_def. * genrecog.c: Do not bother emitting the C test if it's known to be true at compile time. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@55839 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/genflags.c | 63 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 16 deletions(-) (limited to 'gcc/genflags.c') diff --git a/gcc/genflags.c b/gcc/genflags.c index 114b98b837e..94806816762 100644 --- a/gcc/genflags.c +++ b/gcc/genflags.c @@ -124,14 +124,18 @@ gen_macro (name, real, expect) printf ("(%c))\n", i + 'A'); } -/* Print out prototype information for a function. */ +/* Print out prototype information for a generator function. If the + insn pattern has been elided, print out a dummy generator that + does nothing. */ static void gen_proto (insn) rtx insn; { int num = num_operands (insn); + int i; const char *name = XSTR (insn, 0); + int truth = maybe_eval_c_test (XSTR (insn, 2)); /* Many md files don't refer to the last two operands passed to the call patterns. This means their generator functions will be two @@ -152,19 +156,41 @@ gen_proto (insn) gen_macro (name, num, 5); } - printf ("extern struct rtx_def *gen_%-*s PARAMS ((", max_id_len, name); + if (truth != 0) + printf ("extern rtx gen_%-*s PARAMS ((", max_id_len, name); + else + printf ("static inline rtx gen_%-*s PARAMS ((", max_id_len, name); if (num == 0) - printf ("void"); + fputs ("void", stdout); else { - while (num-- > 1) - printf ("struct rtx_def *, "); - - printf ("struct rtx_def *"); + for (i = 1; i < num; i++) + fputs ("rtx, ", stdout); + + fputs ("rtx", stdout); } - printf ("));\n"); + puts ("));"); + + /* Some back ends want to take the address of generator functions, + so we cannot simply use #define for these dummy definitions. */ + if (truth == 0) + { + printf ("static inline rtx\ngen_%s", name); + if (num > 0) + { + putchar ('('); + for (i = 0; i < num-1; i++) + printf ("%c, ", 'a' + i); + printf ("%c)\n", 'a' + i); + for (i = 0; i < num; i++) + printf (" rtx %c ATTRIBUTE_UNUSED;\n", 'a' + i); + } + else + puts ("()"); + puts ("{\n return 0;\n}"); + } } @@ -175,6 +201,7 @@ gen_insn (insn) const char *name = XSTR (insn, 0); const char *p; int len; + int truth = maybe_eval_c_test (XSTR (insn, 2)); /* Don't mention instructions whose names are the null string or begin with '*'. They are in the machine description just @@ -187,22 +214,23 @@ gen_insn (insn) if (len > max_id_len) max_id_len = len; - printf ("#define HAVE_%s ", name); - if (strlen (XSTR (insn, 2)) == 0) - printf ("1\n"); + if (truth == 0) + /* emit nothing */; + else if (truth == 1) + printf ("#define HAVE_%s 1\n", name); else { /* Write the macro definition, putting \'s at the end of each line, if more than one. */ - printf ("("); + printf ("#define HAVE_%s (", name); for (p = XSTR (insn, 2); *p; p++) { if (IS_VSPACE (*p)) - printf (" \\\n"); + fputs (" \\\n", stdout); else - printf ("%c", *p); + putchar (*p); } - printf (")\n"); + fputs (")\n", stdout); } obstack_grow (&obstack, &insn, sizeof (rtx)); @@ -223,6 +251,10 @@ main (argc, argv) progname = "genflags"; obstack_init (&obstack); + /* We need to see all the possibilities. Elided insns may have + direct calls to their generators in C code. */ + insn_elision = 0; + if (argc <= 1) fatal ("no input file name"); @@ -252,7 +284,6 @@ main (argc, argv) obstack_grow (&obstack, &dummy, sizeof (rtx)); insns = (rtx *) obstack_finish (&obstack); - printf ("struct rtx_def;\n"); for (insn_ptr = insns; *insn_ptr; insn_ptr++) gen_proto (*insn_ptr); -- cgit v1.2.1