diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-07-29 18:02:47 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-07-29 18:02:47 +0000 |
commit | b70bd5426e751c76b70d8d569862671a10ecac13 (patch) | |
tree | 8880ef10951d3d1fbca761d1c3b95b762f0409e5 /gcc/genflags.c | |
parent | 22ac052b185623a692f9173da4e7d61070afeec0 (diff) | |
download | gcc-b70bd5426e751c76b70d8d569862671a10ecac13.tar.gz |
* 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
Diffstat (limited to 'gcc/genflags.c')
-rw-r--r-- | gcc/genflags.c | 63 |
1 files changed, 47 insertions, 16 deletions
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); |