On Tue, Feb 19, 2013 at 4:10 PM, Michael Matz wrote:
> Hi,
>
> from IRC:
> "[15:45:21] ick - lookup_constraint for multi-letter constraints
> is quite expensive ... strncmp is not expanded inline for some reason"
>
> Instead of fiddling with strncmp inlining, simply generate better code
> from the start for two character constraints:
>
> switch (str[0]) {
> case 'Y':
> switch (str[1])
> {
> case 'i':
> return CONSTRAINT_Yi;
> case 'm':
> return CONSTRAINT_Ym;
>
> ...
Bootstrapped and tested on ... ?
I suppose this is ok, even ontop of my recent improvement (which
we noticed can be improved further by using memcmp instead of
strncmp). We seem to have at most seven-letter constraints at the moment
(rx port - they seem to use descriptive constraint names like "NEGint4" and
"Symbol" with only 10 constraints in total ...). I wonder where the cut-off
is for expanding the whole comparison to nested switch statements ...
or even expand the 2nd level to a switch on properly masked short /
int / long compares.
Richard.
>
> Ciao,
> Michael.
> --
> * genpreds (write_lookup_constraint): Special case two-character
> constraints to also expand to a switch.
>
> Index: genpreds.c
> ===
> --- genpreds.c (revision 196053)
> +++ genpreds.c (working copy)
> @@ -941,6 +941,22 @@ write_lookup_constraint (void)
>printf ("case '%c':\n", i);
>if (c->namelen == 1)
> printf (" return CONSTRAINT_%s;\n", c->c_name);
> + else if (c->namelen == 2)
> + {
> + puts (" switch (str[1])\n"
> + "{");
> + do
> + {
> + printf ("case '%c':\n"
> + " return CONSTRAINT_%s;\n",
> + c->name[1], c->c_name);
> + c = c->next_this_letter;
> + }
> + while (c);
> + puts ("default: break;\n"
> + "}\n"
> + " break;");
> + }
>else
> {
> do