diff options
Diffstat (limited to 'gnu/usr.bin/cc')
92 files changed, 15824 insertions, 9945 deletions
diff --git a/gnu/usr.bin/cc/Makefile.inc b/gnu/usr.bin/cc/Makefile.inc index a8624a5..dda9af7 100644 --- a/gnu/usr.bin/cc/Makefile.inc +++ b/gnu/usr.bin/cc/Makefile.inc @@ -1,11 +1,13 @@ # -# $Id: Makefile.inc,v 1.5 1994/09/19 21:37:42 wollman Exp $ +# $Id: Makefile.inc,v 1.6 1994/10/25 07:02:18 davidg Exp $ # CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../include CFLAGS+= -Dbsd4_4 CFLAGS+= -DGCC_INCLUDE_DIR=\"FOO\" -CFLAGS+= -DDEFAULT_TARGET_VERSION=\"2.6.0\" +CFLAGS+= -DTOOL_INCLUDE_DIR=\"FOO\" +CFLAGS+= -DGPLUSPLUS_INCLUDE_DIR=\"FOO\" +CFLAGS+= -DDEFAULT_TARGET_VERSION=\"2.6.1\" CFLAGS+= -DDEFAULT_TARGET_MACHINE=\"i386--freebsd\" CFLAGS+= -DMD_EXEC_PREFIX=\"/usr/libexec/\" CFLAGS+= -DSTANDARD_STARTFILE_PREFIX=\"/usr/lib\" diff --git a/gnu/usr.bin/cc/README b/gnu/usr.bin/cc/README index 01303ea..e47729a 100644 --- a/gnu/usr.bin/cc/README +++ b/gnu/usr.bin/cc/README @@ -1,5 +1,5 @@ -$FreeBSD$ +$Id$ This directory contains gcc in a form that uses "bmake" makefiles. This is not the place you want to start, if you want to hack gcc. diff --git a/gnu/usr.bin/cc/c++/g++.c b/gnu/usr.bin/cc/c++/g++.c index fcd1029..2875524 100644 --- a/gnu/usr.bin/cc/c++/g++.c +++ b/gnu/usr.bin/cc/c++/g++.c @@ -40,6 +40,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include <sys/types.h> #include <sys/file.h> /* May get R_OK, etc. on some systems. */ +#include <errno.h> /* Defined to the name of the compiler; if using a cross compiler, the Makefile should compile this file with the proper name @@ -78,8 +79,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #endif -extern int errno, sys_nerr; -#if defined(bsd4_4) || defined(__NetBSD__) +#ifndef errno +extern int errno; +#endif + +extern int sys_nerr; +#if defined(bsd4_4) || defined(__NetBSD__) || defined(__FreeBSD__) extern const char *const sys_errlist[]; #else extern char *sys_errlist[]; @@ -390,7 +395,7 @@ main (argc, argv) #endif args = (int *) malloc (argc * sizeof (int)); - bzero (args, argc * sizeof (int)); + bzero ((char *) args, argc * sizeof (int)); for (i = 1; i < argc; i++) { @@ -431,7 +436,7 @@ main (argc, argv) && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL) || strcmp (argv[i], "-Tdata") == 0)) quote = argv[i]; - else if (((argv[i][2] == '\0' + else if (library != NULL && ((argv[i][2] == '\0' && (char *) strchr ("cSEM", argv[i][1]) != NULL) || strcmp (argv[i], "-MM") == 0)) { @@ -449,7 +454,10 @@ main (argc, argv) int len; if (saw_speclang) - continue; + { + saw_speclang = 0; + continue; + } /* If the filename ends in .c or .i, put options around it. But not if a specified -x option is currently active. */ diff --git a/gnu/usr.bin/cc/cc/gcc.c b/gnu/usr.bin/cc/cc/gcc.c index b8d4b2e..595f594 100644 --- a/gnu/usr.bin/cc/cc/gcc.c +++ b/gnu/usr.bin/cc/cc/gcc.c @@ -34,7 +34,13 @@ compilation is specified by a string called a "spec". */ #include <ctype.h> #include <signal.h> #include <sys/stat.h> +#include <errno.h> + +#ifndef WINNT #include <sys/file.h> /* May get R_OK, etc. on some systems. */ +#else +#include <process.h> +#endif #include "config.h" #include "obstack.h" @@ -54,6 +60,19 @@ compilation is specified by a string called a "spec". */ #define X_OK 1 #endif +#ifndef WIFSIGNALED +#define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) +#endif +#ifndef WTERMSIG +#define WTERMSIG(S) ((S) & 0x7f) +#endif +#ifndef WIFEXITED +#define WIFEXITED(S) (((S) & 0xff) == 0) +#endif +#ifndef WEXITSTATUS +#define WEXITSTATUS(S) (((S) & 0xff00) >> 8) +#endif + /* Add prototype support. */ #ifndef PROTO #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) @@ -81,6 +100,11 @@ compilation is specified by a string called a "spec". */ #define NULL 0 #endif +/* Define O_RDONLY if the system hasn't defined it for us. */ +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif + #ifndef GENERIC_PTR #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) #define GENERIC_PTR void * @@ -125,14 +149,24 @@ compilation is specified by a string called a "spec". */ #define PATH_SEPARATOR ':' #endif +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +static char dir_separator_str[] = {DIR_SEPARATOR, 0}; + #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free extern void free (); extern char *getenv (); -extern int errno, sys_nerr; -#if defined(bsd4_4) || defined(__NetBSD__) +#ifndef errno +extern int errno; +#endif + +extern int sys_nerr; +#if defined(bsd4_4) || defined(__NetBSD__) || defined (__FreeBSD__) extern const char *const sys_errlist[]; #else extern char *sys_errlist[]; @@ -229,7 +263,11 @@ static void choose_temp_base PROTO((void)); static int check_live_switch PROTO((int, int)); static char *handle_braces PROTO((char *)); static char *save_string PROTO((char *, int)); -static char *concat PROTO((char *, char *, char *)); +static char *concat PROTO((char *, char *)); +static char *concat3 PROTO((char *, char *, char *)); +static char *concat4 PROTO((char *, char *, char *, char *)); +static char *concat6 PROTO((char *, char *, char *, char *, char *, \ + char *)); static int do_spec PROTO((char *)); static int do_spec_1 PROTO((char *, int, char *)); static char *find_file PROTO((char *)); @@ -310,6 +348,7 @@ or with constant text in a single argument. %x{OPTION} Accumulate an option for %X. %X Output the accumulated linker options specified by compilations. %Y Output the accumulated assembler options specified by compilations. + %Z Output the accumulated preprocessor options specified by compilations. %v1 Substitute the major version number of GCC. (For version 2.5.n, this is 2.) %v2 Substitute the minor version number of GCC. @@ -319,7 +358,7 @@ or with constant text in a single argument. %A process ASM_FINAL_SPEC as a spec. A capital A is actually used here. This can be used to run a post-processor after the assembler has done it's job. - %D Dump out a -L option for each directory in startfile_prefix. + %D Dump out a -L option for each directory in startfile_prefixes. If multilib_dir is set, extra entries are generated with it affixed. %l process LINK_SPEC as a spec. %L process LIB_SPEC as a spec. @@ -425,7 +464,7 @@ proper position among the other output files. */ /* config.h can define STARTFILE_SPEC to override the default crt0 files. */ #ifndef STARTFILE_SPEC #define STARTFILE_SPEC \ - "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}" + "%{!shared:%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}" #endif /* config.h can define SWITCHES_NEED_SPACES to control passing -o and -L. @@ -535,7 +574,7 @@ static struct compiler default_compilers[] = %{!undef:%{!ansi:%p} %P} %{trigraphs} \ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a}\ @@ -556,7 +595,7 @@ static struct compiler default_compilers[] = %{!undef:%{!ansi:%p} %P} %{trigraphs}\ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %W{o*}}\ %{!E:%e-E required when input is from standard input}"}, {".m", "@objective-c"}, @@ -569,7 +608,7 @@ static struct compiler default_compilers[] = %{!undef:%{!ansi:%p} %P} %{trigraphs}\ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \ %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a}\ @@ -593,11 +632,12 @@ static struct compiler default_compilers[] = %{!undef:%{!ansi:%p} %P} %{trigraphs}\ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %W{o*}"}, {".cc", "@c++"}, {".cxx", "@c++"}, {".cpp", "@c++"}, + {".c++", "@c++"}, {".C", "@c++"}, {"@c++", "cpp -lang-c++ %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ @@ -607,7 +647,7 @@ static struct compiler default_compilers[] = %{ansi:-trigraphs -$ -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional} %{trigraphs}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.ii}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:cc1plus %{!pipe:%g.ii} %1 %2\ %{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\ @@ -654,7 +694,7 @@ static struct compiler default_compilers[] = -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \ %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\ + %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:%{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\ @@ -746,16 +786,22 @@ static char *link_command_spec = "\ #endif /* A vector of options to give to the linker. - These options are accumulated by -Xlinker and -Wl, + These options are accumulated by %x, and substituted into the linker command with %X. */ static int n_linker_options; static char **linker_options; /* A vector of options to give to the assembler. These options are accumulated by -Wa, - and substituted into the assembler command with %X. */ + and substituted into the assembler command with %Y. */ static int n_assembler_options; static char **assembler_options; + +/* A vector of options to give to the preprocessor. + These options are accumulated by -Wp, + and substituted into the preprocessor command with %Z. */ +static int n_preprocessor_options; +static char **preprocessor_options; /* Define how to map long options into short ones. */ @@ -770,7 +816,7 @@ struct option_map a => argument required. o => argument optional. j => join argument to equivalent, making one word. - * => allow other text after NAME as an argument. */ + * => require other text after NAME as an argument. */ char *arg_info; }; @@ -779,76 +825,74 @@ struct option_map struct option_map option_map[] = { - {"--profile-blocks", "-a", 0}, - {"--target", "-b", "a"}, + {"--all-warnings", "-Wall", 0}, + {"--ansi", "-ansi", 0}, + {"--assemble", "-S", 0}, + {"--assert", "-A", "a"}, + {"--comments", "-C", 0}, {"--compile", "-c", 0}, + {"--debug", "-g", "oj"}, + {"--define-macro", "-D", "a"}, + {"--dependencies", "-M", 0}, {"--dump", "-d", "a"}, + {"--dumpbase", "-dumpbase", "a"}, {"--entry", "-e", 0}, - {"--debug", "-g", "oj"}, - {"--include", "-include", "a"}, + {"--extra-warnings", "-W", 0}, + {"--for-assembler", "-Wa", "a"}, + {"--for-linker", "-Xlinker", "a"}, + {"--force-link", "-u", "a"}, {"--imacros", "-imacros", "a"}, - {"--include-prefix", "-iprefix", "a"}, + {"--include", "-include", "a"}, + {"--include-barrier", "-I-", 0}, + {"--include-directory", "-I", "a"}, {"--include-directory-after", "-idirafter", "a"}, + {"--include-prefix", "-iprefix", "a"}, {"--include-with-prefix", "-iwithprefix", "a"}, {"--include-with-prefix-before", "-iwithprefixbefore", "a"}, {"--include-with-prefix-after", "-iwithprefix", "a"}, - {"--machine-", "-m", "*j"}, + {"--language", "-x", "a"}, + {"--library-directory", "-L", "a"}, {"--machine", "-m", "aj"}, + {"--machine-", "-m", "*j"}, + {"--no-line-commands", "-P", 0}, + {"--no-precompiled-includes", "-noprecomp", 0}, {"--no-standard-includes", "-nostdinc", 0}, {"--no-standard-libraries", "-nostdlib", 0}, - {"--no-precompiled-includes", "-noprecomp", 0}, - {"--output", "-o", "a"}, - {"--profile", "-p", 0}, - {"--quiet", "-q", 0}, - {"--silent", "-q", 0}, - {"--force-link", "-u", "a"}, - {"--verbose", "-v", 0}, - {"--version", "-dumpversion", 0}, {"--no-warnings", "-w", 0}, - {"--language", "-x", "a"}, - - {"--assert", "-A", "a"}, - {"--prefix", "-B", "a"}, - {"--comments", "-C", 0}, - {"--define-macro", "-D", "a"}, - {"--preprocess", "-E", 0}, - {"--trace-includes", "-H", 0}, - {"--include-directory", "-I", "a"}, - {"--include-barrier", "-I-", 0}, - {"--library-directory", "-L", "a"}, - {"--dependencies", "-M", 0}, - {"--user-dependencies", "-MM", 0}, - {"--write-dependencies", "-MD", 0}, - {"--write-user-dependencies", "-MMD", 0}, - {"--print-missing-file-dependencies", "-MG", 0}, {"--optimize", "-O", "oj"}, - {"--no-line-commands", "-P", 0}, - {"--assemble", "-S", 0}, - {"--undefine-macro", "-U", "a"}, - {"--use-version", "-V", "a"}, - {"--for-assembler", "-Wa", "a"}, - {"--extra-warnings", "-W", 0}, - {"--all-warnings", "-Wall", 0}, - {"--warn-", "-W", "*j"}, - {"--for-linker", "-Xlinker", "a"}, - - {"--ansi", "-ansi", 0}, - {"--traditional", "-traditional", 0}, - {"--traditional-cpp", "-traditional-cpp", 0}, - {"--trigraphs", "-trigraphs", 0}, - {"--pipe", "-pipe", 0}, - {"--dumpbase", "-dumpbase", "a"}, + {"--output", "-o", "a"}, {"--pedantic", "-pedantic", 0}, {"--pedantic-errors", "-pedantic-errors", 0}, - {"--save-temps", "-save-temps", 0}, - {"--print-libgcc-file-name", "-print-libgcc-file-name", 0}, + {"--pipe", "-pipe", 0}, + {"--prefix", "-B", "a"}, + {"--preprocess", "-E", 0}, {"--print-file-name", "-print-file-name=", "aj"}, - {"--print-prog-name", "-print-prog-name=", "aj"}, + {"--print-libgcc-file-name", "-print-libgcc-file-name", 0}, + {"--print-missing-file-dependencies", "-MG", 0}, {"--print-multi-lib", "-print-multi-lib", 0}, {"--print-multi-directory", "-print-multi-directory", 0}, - {"--static", "-static", 0}, + {"--print-prog-name", "-print-prog-name=", "aj"}, + {"--profile", "-p", 0}, + {"--profile-blocks", "-a", 0}, + {"--quiet", "-q", 0}, + {"--save-temps", "-save-temps", 0}, {"--shared", "-shared", 0}, + {"--silent", "-q", 0}, + {"--static", "-static", 0}, {"--symbolic", "-symbolic", 0}, + {"--target", "-b", "a"}, + {"--trace-includes", "-H", 0}, + {"--traditional", "-traditional", 0}, + {"--traditional-cpp", "-traditional-cpp", 0}, + {"--trigraphs", "-trigraphs", 0}, + {"--undefine-macro", "-U", "a"}, + {"--use-version", "-V", "a"}, + {"--user-dependencies", "-MM", 0}, + {"--verbose", "-v", 0}, + {"--version", "-dumpversion", 0}, + {"--warn-", "-W", "*j"}, + {"--write-dependencies", "-MD", 0}, + {"--write-user-dependencies", "-MMD", 0}, {"--", "-f", "*j"} }; @@ -861,7 +905,7 @@ translate_options (argcp, argvp) int *argcp; char ***argvp; { - int i, j; + int i, j, k; int argc = *argcp; char **argv = *argvp; char **newv = (char **) xmalloc ((argc + 2) * 2 * sizeof (char *)); @@ -879,49 +923,74 @@ translate_options (argcp, argvp) for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++) { int optlen = strlen (option_map[j].name); - int complen = strlen (argv[i]); + int arglen = strlen (argv[i]); + int complen = arglen > optlen ? optlen : arglen; char *arginfo = option_map[j].arg_info; if (arginfo == 0) arginfo = ""; - if (complen > optlen) - complen = optlen; + if (!strncmp (argv[i], option_map[j].name, complen)) { - int extra = strlen (argv[i]) > optlen; char *arg = 0; - if (extra) + if (arglen < optlen) + { + for (k = j + 1; + k < sizeof (option_map) / sizeof (option_map[0]); + k++) + if (strlen (option_map[k].name) >= arglen + && !strncmp (argv[i], option_map[k].name, arglen)) + { + error ("Ambiguous abbreviation %s", argv[i]); + break; + } + + if (k != sizeof (option_map) / sizeof (option_map[0])) + break; + } + + if (arglen > optlen) { /* If the option has an argument, accept that. */ if (argv[i][optlen] == '=') arg = argv[i] + optlen + 1; - /* If this mapping allows extra text at end of name, + + /* If this mapping requires extra text at end of name, accept that as "argument". */ else if (index (arginfo, '*') != 0) arg = argv[i] + optlen; + /* Otherwise, extra text at end means mismatch. Try other mappings. */ else continue; } + else if (index (arginfo, '*') != 0) - error ("Incomplete `%s' option", option_map[j].name); + { + error ("Incomplete `%s' option", option_map[j].name); + break; + } /* Handle arguments. */ - if (index (arginfo, 'o') != 0) + if (index (arginfo, 'a') != 0) { if (arg == 0) { if (i + 1 == argc) - error ("Missing argument to `%s' option", - option_map[j].name); + { + error ("Missing argument to `%s' option", + option_map[j].name); + break; + } + arg = argv[++i]; } } else if (index (arginfo, '*') != 0) ; - else if (index (arginfo, 'a') == 0) + else if (index (arginfo, 'o') == 0) { if (arg != 0) error ("Extraneous argument to `%s' option", @@ -931,8 +1000,7 @@ translate_options (argcp, argvp) /* Store the translation as one argv elt or as two. */ if (arg != 0 && index (arginfo, 'j') != 0) - newv[newindex++] = concat (option_map[j].equivalent, - arg, ""); + newv[newindex++] = concat (option_map[j].equivalent, arg); else if (arg != 0) { newv[newindex++] = option_map[j].equivalent; @@ -946,6 +1014,7 @@ translate_options (argcp, argvp) } i++; } + /* Handle old-fashioned options--just copy them through, with their arguments. */ else if (argv[i][0] == '-') @@ -1011,7 +1080,7 @@ read_specs (filename) fprintf (stderr, "Reading specs from %s\n", filename); /* Open and stat the file. */ - desc = open (filename, 0, 0); + desc = open (filename, O_RDONLY, 0); if (desc < 0) pfatal_with_name (filename); if (stat (filename, &statbuf) < 0) @@ -1171,7 +1240,7 @@ set_spec (name, spec) old_spec = sl->spec; if (name && spec[0] == '+' && isspace (spec[1])) - sl->spec = concat (old_spec, spec + 1, ""); + sl->spec = concat (old_spec, spec + 1); else sl->spec = save_string (spec, strlen (spec)); @@ -1266,15 +1335,15 @@ struct path_prefix /* List of prefixes to try when looking for executables. */ -static struct path_prefix exec_prefix = { 0, 0, "exec" }; +static struct path_prefix exec_prefixes = { 0, 0, "exec" }; /* List of prefixes to try when looking for startup (crt0) files. */ -static struct path_prefix startfile_prefix = { 0, 0, "startfile" }; +static struct path_prefix startfile_prefixes = { 0, 0, "startfile" }; /* List of prefixes to try when looking for include files. */ -static struct path_prefix include_prefix = { 0, 0, "include" }; +static struct path_prefix include_prefixes = { 0, 0, "include" }; /* Suffix to attach to directories searched for commands. This looks like `MACHINE/VERSION/'. */ @@ -1524,18 +1593,21 @@ choose_temp_base () base = choose_temp_base_try (P_tmpdir, base); #endif - base = choose_temp_base_try ("/usr/tmp", base); - base = choose_temp_base_try ("/tmp", base); - + base = choose_temp_base_try (concat4 (dir_separator_str, "usr", + dir_separator_str, "tmp"), + base); + base = choose_temp_base_try (concat (dir_separator_str, "tmp"), base); + /* If all else fails, use the current directory! */ - if (base == (char *)0) - base = "./"; + if (base == (char *)0) base = concat(".", dir_separator_str); len = strlen (base); - temp_filename = xmalloc (len + sizeof("/ccXXXXXX") + 1); + temp_filename = xmalloc (len + strlen (concat (dir_separator_str, + "ccXXXXXX")) + 1); strcpy (temp_filename, base); - if (len > 0 && temp_filename[len-1] != '/') - temp_filename[len++] = '/'; + if (len > 0 && temp_filename[len-1] != '/' + && temp_filename[len-1] != DIR_SEPARATOR) + temp_filename[len++] = DIR_SEPARATOR; strcpy (temp_filename + len, "ccXXXXXX"); mktemp (temp_filename); @@ -1679,7 +1751,7 @@ find_a_file (pprefix, name, mode) /* Determine the filename to execute (special case for absolute paths). */ - if (*name == '/') + if (*name == '/' || *name == DIR_SEPARATOR) { if (access (name, mode)) { @@ -1899,13 +1971,9 @@ static int last_pipe_input; NOT_LAST is nonzero if this is not the last subcommand (i.e. its output should be piped to the next one.) */ -#ifndef OS2 #ifdef __MSDOS__ -/* Declare these to avoid compilation error. They won't be called. */ -int execv(const char *a, const char **b){} -int execvp(const char *a, const char **b){} - +#include <process.h> static int pexecute (search_flag, program, argv, not_last) int search_flag; @@ -1913,6 +1981,9 @@ pexecute (search_flag, program, argv, not_last) char *argv[]; int not_last; { +#ifdef __GO32__ + int i = (search_flag ? spawnv : spawnvp) (1, program, argv); +#else char *scmd, *rf; FILE *argfile; int i, el = search_flag ? 0 : 4; @@ -1941,17 +2012,19 @@ pexecute (search_flag, program, argv, not_last) i = system (scmd); remove (rf); +#endif if (i == -1) { perror_exec (program); return MIN_FATAL_STATUS << 8; } - return i << 8; } -#else /* not __MSDOS__ */ +#endif + +#if !defined(__MSDOS__) && !defined(OS2) && !defined(WINNT) static int pexecute (search_flag, program, argv, not_last) @@ -2041,8 +2114,54 @@ pexecute (search_flag, program, argv, not_last) } } -#endif /* not __MSDOS__ */ -#else /* not OS2 */ +#endif /* not __MSDOS__ and not OS2 */ + +#if defined(OS2) || defined(WINNT) + +#ifdef WINNT + +char ** +fix_argv (argvec) + char **argvec +{ + int i; + + for (i = 1; argvec[i] != 0; i++) + { + int len, j; + char *temp, *newtemp; + + temp = argvec[i]; + len = strlen (temp); + for (j = 0; j < len; j++) + { + if (temp[j] == '"') + { + newtemp = xmalloc (len + 2); + strncpy (newtemp, temp, j); + newtemp [j] = '\\'; + strncpy (&newtemp [j+1], &temp [j], len-j); + newtemp [len+1] = 0; + free (temp); + temp = newtemp; + len++; + j++; + } + } + + argvec[i] = temp; + } + + return argvec; +} + +#define FIX_ARGV(a) fix_argv(a) + +#else + +#define FIX_ARGV(a) a + +#endif /* OS2 or WINNT */ static int pexecute (search_flag, program, argv, not_last) @@ -2051,9 +2170,10 @@ pexecute (search_flag, program, argv, not_last) char *argv[]; int not_last; { - return (search_flag ? spawnv : spawnvp) (1, program, argv); + return (search_flag ? spawnv : spawnvp) (1, program, FIX_ARGV (argv)); } -#endif /* not OS2 */ +#endif /* OS2 or WINNT */ + /* Execute the command specified by the arguments on the current line of spec. When using pipes, this includes several piped-together commands @@ -2091,7 +2211,7 @@ execute () commands[0].prog = argbuf[0]; /* first command. */ commands[0].argv = &argbuf[0]; - string = find_a_file (&exec_prefix, commands[0].prog, X_OK); + string = find_a_file (&exec_prefixes, commands[0].prog, X_OK); if (string) commands[0].argv[0] = string; @@ -2104,7 +2224,7 @@ execute () argbuf[i] = 0; /* termination of command args. */ commands[n_commands].prog = argbuf[i + 1]; commands[n_commands].argv = &argbuf[i + 1]; - string = find_a_file (&exec_prefix, commands[n_commands].prog, X_OK); + string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK); if (string) commands[n_commands].argv[0] = string; n_commands++; @@ -2174,8 +2294,12 @@ execute () #ifdef __MSDOS__ status = pid = commands[i].pid; #else +#ifdef WINNT + pid = cwait (&status, commands[i].pid, WAIT_CHILD); +#else pid = wait (&status); #endif +#endif if (pid < 0) abort (); @@ -2186,13 +2310,15 @@ execute () if (commands[j].pid == pid) prog = commands[j].prog; - if ((status & 0x7F) != 0) + if (WIFSIGNALED (status)) { fatal ("Internal compiler error: program %s got fatal signal %d", - prog, (status & 0x7F)); + prog, WTERMSIG (status)); signal_count++; + ret_code = -1; } - if (((status & 0xFF00) >> 8) >= MIN_FATAL_STATUS) + else if (WIFEXITED (status) + && WEXITSTATUS (status) >= MIN_FATAL_STATUS) ret_code = -1; } } @@ -2273,8 +2399,8 @@ process_command (argc, argv) if (gcc_exec_prefix) { - add_prefix (&exec_prefix, gcc_exec_prefix, 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, gcc_exec_prefix, 0, 0, NULL_PTR); + add_prefix (&exec_prefixes, gcc_exec_prefix, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, gcc_exec_prefix, 0, 0, NULL_PTR); } /* COMPILER_PATH and LIBRARY_PATH have values @@ -2293,17 +2419,15 @@ process_command (argc, argv) { strncpy (nstore, startp, endp-startp); if (endp == startp) + strcpy (nstore, concat (".", dir_separator_str)); + else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR) { - strcpy (nstore, "./"); - } - else if (endp[-1] != '/') - { - nstore[endp-startp] = '/'; + nstore[endp-startp] = DIR_SEPARATOR; nstore[endp-startp+1] = 0; } else nstore[endp-startp] = 0; - add_prefix (&exec_prefix, nstore, 0, 0, NULL_PTR); + add_prefix (&exec_prefixes, nstore, 0, 0, NULL_PTR); if (*endp == 0) break; endp = startp = endp + 1; @@ -2326,17 +2450,15 @@ process_command (argc, argv) { strncpy (nstore, startp, endp-startp); if (endp == startp) + strcpy (nstore, concat (".", dir_separator_str)); + else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR) { - strcpy (nstore, "./"); - } - else if (endp[-1] != '/') - { - nstore[endp-startp] = '/'; + nstore[endp-startp] = DIR_SEPARATOR; nstore[endp-startp+1] = 0; } else nstore[endp-startp] = 0; - add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, nstore, 0, 0, NULL_PTR); if (*endp == 0) break; endp = startp = endp + 1; @@ -2360,17 +2482,15 @@ process_command (argc, argv) { strncpy (nstore, startp, endp-startp); if (endp == startp) + strcpy (nstore, concat (".", dir_separator_str)); + else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR) { - strcpy (nstore, "./"); - } - else if (endp[-1] != '/') - { - nstore[endp-startp] = '/'; + nstore[endp-startp] = DIR_SEPARATOR; nstore[endp-startp+1] = 0; } else nstore[endp-startp] = 0; - add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, nstore, 0, 0, NULL_PTR); if (*endp == 0) break; endp = startp = endp + 1; @@ -2413,6 +2533,11 @@ process_command (argc, argv) printf ("%s\n", version_string); exit (0); } + else if (! strcmp (argv[i], "-dumpmachine")) + { + printf ("%s\n", spec_machine); + exit (0); + } else if (! strcmp (argv[i], "-print-libgcc-file-name")) print_file_name = "libgcc.a"; else if (! strncmp (argv[i], "-print-file-name=", 17)) @@ -2423,54 +2548,6 @@ process_command (argc, argv) print_multi_lib = 1; else if (! strcmp (argv[i], "-print-multi-directory")) print_multi_directory = 1; - else if (! strcmp (argv[i], "-Xlinker")) - { - /* Pass the argument of this option to the linker when we link. */ - - if (i + 1 == argc) - fatal ("argument to `-Xlinker' is missing"); - - n_linker_options++; - if (!linker_options) - linker_options - = (char **) xmalloc (n_linker_options * sizeof (char **)); - else - linker_options - = (char **) xrealloc (linker_options, - n_linker_options * sizeof (char **)); - - linker_options[n_linker_options - 1] = argv[++i]; - } - else if (! strncmp (argv[i], "-Wl,", 4)) - { - int prev, j; - /* Pass the rest of this option to the linker when we link. */ - - n_linker_options++; - if (!linker_options) - linker_options - = (char **) xmalloc (n_linker_options * sizeof (char **)); - else - linker_options - = (char **) xrealloc (linker_options, - n_linker_options * sizeof (char **)); - - /* Split the argument at commas. */ - prev = 4; - for (j = 4; argv[i][j]; j++) - if (argv[i][j] == ',') - { - linker_options[n_linker_options - 1] - = save_string (argv[i] + prev, j - prev); - n_linker_options++; - linker_options - = (char **) xrealloc (linker_options, - n_linker_options * sizeof (char **)); - prev = j + 1; - } - /* Record the part after the last comma. */ - linker_options[n_linker_options - 1] = argv[i] + prev; - } else if (! strncmp (argv[i], "-Wa,", 4)) { int prev, j; @@ -2501,10 +2578,57 @@ process_command (argc, argv) /* Record the part after the last comma. */ assembler_options[n_assembler_options - 1] = argv[i] + prev; } + else if (! strncmp (argv[i], "-Wp,", 4)) + { + int prev, j; + /* Pass the rest of this option to the preprocessor. */ + + n_preprocessor_options++; + if (!preprocessor_options) + preprocessor_options + = (char **) xmalloc (n_preprocessor_options * sizeof (char **)); + else + preprocessor_options + = (char **) xrealloc (preprocessor_options, + n_preprocessor_options * sizeof (char **)); + + /* Split the argument at commas. */ + prev = 4; + for (j = 4; argv[i][j]; j++) + if (argv[i][j] == ',') + { + preprocessor_options[n_preprocessor_options - 1] + = save_string (argv[i] + prev, j - prev); + n_preprocessor_options++; + preprocessor_options + = (char **) xrealloc (preprocessor_options, + n_preprocessor_options * sizeof (char **)); + prev = j + 1; + } + /* Record the part after the last comma. */ + preprocessor_options[n_preprocessor_options - 1] = argv[i] + prev; + } else if (argv[i][0] == '+' && argv[i][1] == 'e') /* The +e options to the C++ front-end. */ n_switches++; - else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l') + else if (strncmp (argv[i], "-Wl,", 4) == 0) + { + int j; + /* Split the argument at commas. */ + for (j = 3; argv[i][j]; j++) + n_infiles += (argv[i][j] == ','); + } + else if (strcmp (argv[i], "-Xlinker") == 0) + { + if (i + 1 == argc) + fatal ("argument to `-Xlinker' is missing"); + + n_infiles++; + i++; + } + else if (strncmp (argv[i], "-l", 2) == 0) + n_infiles++; + else if (argv[i][0] == '-' && argv[i][1] != 0) { register char *p = &argv[i][1]; register int c = *p; @@ -2530,21 +2654,34 @@ process_command (argc, argv) value = argv[++i]; else value = p + 1; - add_prefix (&exec_prefix, value, 1, 0, temp); - add_prefix (&startfile_prefix, value, 1, 0, temp); - add_prefix (&include_prefix, concat (value, "include", ""), + add_prefix (&exec_prefixes, value, 1, 0, temp); + add_prefix (&startfile_prefixes, value, 1, 0, temp); + add_prefix (&include_prefixes, concat (value, "include"), 1, 0, 0); /* As a kludge, if the arg is "[foo/]stageN/", just add - "[foo/]stageN/../include" to the include prefix. */ + "[foo/]include" to the include prefix. */ { int len = strlen (value); - if ((len == 7 || (len > 7 && value[len - 8] == '/')) + if ((len == 7 + || (len > 7 + && (value[len - 8] == '/' + || value[len - 8] == DIR_SEPARATOR))) && strncmp (value + len - 7, "stage", 5) == 0 && isdigit (value[len - 2]) - && value[len - 1] == '/') - add_prefix (&include_prefix, - concat (value, "../include", ""), 1, 0, 0); + && (value[len - 1] == '/' + || value[len - 1] == DIR_SEPARATOR)) + { + if (len == 7) + add_prefix (&include_prefixes, "include", 1, 0, 0); + else + { + char *string = xmalloc (len + 1); + strncpy (string, value, len-7); + strcat (string, "include"); + add_prefix (&include_prefixes, string, 1, 0, 0); + } + } } } break; @@ -2594,44 +2731,52 @@ process_command (argc, argv) (such as cpp) rather than those of the host system. */ /* Use 2 as fourth arg meaning try just the machine as a suffix, as well as trying the machine and the version. */ - add_prefix (&exec_prefix, standard_exec_prefix, 0, 2, NULL_PTR); - add_prefix (&exec_prefix, standard_exec_prefix_1, 0, 2, NULL_PTR); +#ifndef OS2 + add_prefix (&exec_prefixes, standard_exec_prefix, 0, 2, NULL_PTR); + add_prefix (&exec_prefixes, standard_exec_prefix_1, 0, 2, NULL_PTR); +#endif - add_prefix (&startfile_prefix, standard_exec_prefix, 0, 1, NULL_PTR); - add_prefix (&startfile_prefix, standard_exec_prefix_1, 0, 1, NULL_PTR); + add_prefix (&startfile_prefixes, standard_exec_prefix, 0, 1, NULL_PTR); + add_prefix (&startfile_prefixes, standard_exec_prefix_1, 0, 1, NULL_PTR); - tooldir_prefix = concat (tooldir_base_prefix, spec_machine, "/"); + tooldir_prefix = concat3 (tooldir_base_prefix, spec_machine, + dir_separator_str); - /* If tooldir is relative, base it on exec_prefix. A relative + /* If tooldir is relative, base it on exec_prefixes. A relative tooldir lets us move the installed tree as a unit. If GCC_EXEC_PREFIX is defined, then we want to add two relative directories, so that we can search both the user specified directory and the standard place. */ - if (*tooldir_prefix != '/') + if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR) { if (gcc_exec_prefix) { char *gcc_exec_tooldir_prefix - = concat (concat (gcc_exec_prefix, spec_machine, "/"), - concat (spec_version, "/", tooldir_prefix), - ""); + = concat6 (gcc_exec_prefix, spec_machine, dir_separator_str, + spec_version, dir_separator_str, tooldir_prefix); - add_prefix (&exec_prefix, concat (gcc_exec_tooldir_prefix, "bin", "/"), + add_prefix (&exec_prefixes, + concat3 (gcc_exec_tooldir_prefix, "bin", + dir_separator_str), 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, concat (gcc_exec_tooldir_prefix, "lib", "/"), + add_prefix (&startfile_prefixes, + concat3 (gcc_exec_tooldir_prefix, "lib", + dir_separator_str), 0, 0, NULL_PTR); } - tooldir_prefix = concat (concat (standard_exec_prefix, spec_machine, "/"), - concat (spec_version, "/", tooldir_prefix), - ""); + tooldir_prefix = concat6 (standard_exec_prefix, spec_machine, + dir_separator_str, spec_version, + dir_separator_str, tooldir_prefix); } - add_prefix (&exec_prefix, concat (tooldir_prefix, "bin", "/"), + add_prefix (&exec_prefixes, + concat3 (tooldir_prefix, "bin", dir_separator_str), 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, concat (tooldir_prefix, "lib", "/"), + add_prefix (&startfile_prefixes, + concat3 (tooldir_prefix, "lib", dir_separator_str), 0, 0, NULL_PTR); /* More prefixes are enabled in main, after we read the specs file @@ -2654,11 +2799,9 @@ process_command (argc, argv) for (i = 1; i < argc; i++) { /* Just skip the switches that were handled by the preceding loop. */ - if (!strcmp (argv[i], "-Xlinker")) - i++; - else if (! strncmp (argv[i], "-Wl,", 4)) + if (! strncmp (argv[i], "-Wa,", 4)) ; - else if (! strncmp (argv[i], "-Wa,", 4)) + else if (! strncmp (argv[i], "-Wp,", 4)) ; else if (! strcmp (argv[i], "-print-libgcc-file-name")) ; @@ -2683,7 +2826,34 @@ process_command (argc, argv) switches[n_switches].valid = 0; n_switches++; } - else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l') + else if (strncmp (argv[i], "-Wl,", 4) == 0) + { + int prev, j; + /* Split the argument at commas. */ + prev = 4; + for (j = 4; argv[i][j]; j++) + if (argv[i][j] == ',') + { + infiles[n_infiles].language = spec_lang; + infiles[n_infiles++].name + = save_string (argv[i] + prev, j - prev); + prev = j + 1; + } + /* Record the part after the last comma. */ + infiles[n_infiles].language = spec_lang; + infiles[n_infiles++].name = argv[i] + prev; + } + else if (strcmp (argv[i], "-Xlinker") == 0) + { + infiles[n_infiles].language = spec_lang; + infiles[n_infiles++].name = argv[++i]; + } + else if (strncmp (argv[i], "-l", 2) == 0) + { + infiles[n_infiles].language = spec_lang; + infiles[n_infiles++].name = argv[i]; + } + else if (argv[i][0] == '-' && argv[i][1] != 0) { register char *p = &argv[i][1]; register int c = *p; @@ -2756,9 +2926,7 @@ process_command (argc, argv) } else { - if ((argv[i][0] != '-' || argv[i][1] != 'l') - && strcmp (argv[i], "-") - && access (argv[i], R_OK) < 0) + if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0) { perror_with_name (argv[i]); error_count++; @@ -2784,9 +2952,9 @@ process_command (argc, argv) + strlen (spec_machine) + 3); strcpy (temp, gcc_exec_prefix); strcat (temp, spec_machine); - strcat (temp, "/"); + strcat (temp, dir_separator_str); strcat (temp, spec_version); - strcat (temp, "/"); + strcat (temp, dir_separator_str); gcc_exec_prefix = temp; } } @@ -2998,7 +3166,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) that we search for startfiles. */ case 'D': { - struct prefix_list *pl = startfile_prefix.plist; + struct prefix_list *pl = startfile_prefixes.plist; int bufsize = 100; char *buffer = (char *) xmalloc (bufsize); int idx; @@ -3011,7 +3179,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) /* Relative directories always come from -B, and it is better not to use them for searching at run time. In particular, stage1 loses */ - if (pl->prefix[0] != '/') + if (pl->prefix[0] != '/' && pl->prefix[0] != DIR_SEPARATOR) continue; #endif /* Try subdirectory if there is one. */ @@ -3068,7 +3236,8 @@ do_spec_1 (spec, inswitch, soft_matched_part) buffer = (char *) xrealloc (buffer, bufsize); strcpy (buffer, machine_suffix); idx = strlen (buffer); - if (buffer[idx - 1] == '/') + if (buffer[idx - 1] == '/' + || buffer[idx - 1] == DIR_SEPARATOR) buffer[idx - 1] = 0; do_spec_1 (buffer, 1, NULL_PTR); /* Make this a separate argument. */ @@ -3089,7 +3258,8 @@ do_spec_1 (spec, inswitch, soft_matched_part) buffer = (char *) xrealloc (buffer, bufsize); strcpy (buffer, pl->prefix); idx = strlen (buffer); - if (buffer[idx - 1] == '/') + if (buffer[idx - 1] == '/' + || buffer[idx - 1] == DIR_SEPARATOR) buffer[idx - 1] = 0; do_spec_1 (buffer, 1, NULL_PTR); /* Make this a separate argument. */ @@ -3187,7 +3357,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) case 'I': { - struct prefix_list *pl = include_prefix.plist; + struct prefix_list *pl = include_prefixes.plist; if (gcc_exec_prefix) { @@ -3276,8 +3446,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) } break; - /* Dump out the options accumulated previously using %x, - -Xlinker and -Wl,. */ + /* Dump out the options accumulated previously using %x. */ case 'X': for (i = 0; i < n_linker_options; i++) { @@ -3297,6 +3466,16 @@ do_spec_1 (spec, inswitch, soft_matched_part) } break; + /* Dump out the options accumulated previously using -Wp,. */ + case 'Z': + for (i = 0; i < n_preprocessor_options; i++) + { + do_spec_1 (preprocessor_options[i], 1, NULL_PTR); + /* Make each accumulated option a separate argument. */ + do_spec_1 (" ", 0, NULL_PTR); + } + break; + /* Here are digits and numbers that just process a certain constant string as a spec. */ @@ -3957,10 +4136,10 @@ find_file (name) try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2); strcpy (try, multilib_dir); - strcat (try, "/"); + strcat (try, dir_separator_str); strcat (try, name); - newname = find_a_file (&startfile_prefix, try, R_OK); + newname = find_a_file (&startfile_prefixes, try, R_OK); /* If we don't find it in the multi library dir, then fall through and look for it in the normal places. */ @@ -3968,7 +4147,7 @@ find_file (name) return newname; } - newname = find_a_file (&startfile_prefix, name, R_OK); + newname = find_a_file (&startfile_prefixes, name, R_OK); return newname ? newname : name; } @@ -4000,15 +4179,20 @@ is_directory (path1, path2, linker) bcopy (path1, path, len1); bcopy (path2, path + len1, len2); cp = path + len1 + len2; - if (cp[-1] != '/') - *cp++ = '/'; + if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR) + *cp++ = DIR_SEPARATOR; *cp++ = '.'; *cp = '\0'; /* Exclude directories that the linker is known to search. */ if (linker - && ((cp - path == 6 && strcmp (path, "/lib/.") == 0) - || (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0))) + && ((cp - path == 6 + && strcmp (path, concat4 (dir_separator_str, "lib", + dir_separator_str, ".")) == 0) + || (cp - path == 10 + && strcmp (path, concat6 (dir_separator_str, "usr", + dir_separator_str, "lib", + dir_separator_str, ".")) == 0))) return 0; return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode)); @@ -4042,7 +4226,7 @@ main (argc, argv) char *p; p = argv[0] + strlen (argv[0]); - while (p != argv[0] && p[-1] != '/') --p; + while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p; programname = p; if (signal (SIGINT, SIG_IGN) != SIG_IGN) @@ -4091,10 +4275,11 @@ main (argc, argv) /* Read specs from a file if there is one. */ - machine_suffix = concat (spec_machine, "/", concat (spec_version, "/", "")); - just_machine_suffix = concat (spec_machine, "/", ""); + machine_suffix = concat4 (spec_machine, dir_separator_str, + spec_version, dir_separator_str); + just_machine_suffix = concat (spec_machine, dir_separator_str); - specs_file = find_a_file (&startfile_prefix, "specs", R_OK); + specs_file = find_a_file (&startfile_prefixes, "specs", R_OK); /* Read the specs file unless it is a default one. */ if (specs_file != 0 && strcmp (specs_file, "specs")) read_specs (specs_file); @@ -4106,46 +4291,45 @@ main (argc, argv) if (!cross_compile) { #ifdef MD_EXEC_PREFIX - add_prefix (&exec_prefix, md_exec_prefix, 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, md_exec_prefix, 0, 0, NULL_PTR); + add_prefix (&exec_prefixes, md_exec_prefix, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, md_exec_prefix, 0, 0, NULL_PTR); #endif #ifdef MD_STARTFILE_PREFIX - add_prefix (&startfile_prefix, md_startfile_prefix, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, md_startfile_prefix, 0, 0, NULL_PTR); #endif #ifdef MD_STARTFILE_PREFIX_1 - add_prefix (&startfile_prefix, md_startfile_prefix_1, 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, md_startfile_prefix_1, 0, 0, NULL_PTR); #endif /* If standard_startfile_prefix is relative, base it on standard_exec_prefix. This lets us move the installed tree as a unit. If GCC_EXEC_PREFIX is defined, base standard_startfile_prefix on that as well. */ - if (*standard_startfile_prefix == '/') - add_prefix (&startfile_prefix, standard_startfile_prefix, 0, 0, + if (*standard_startfile_prefix == '/' + || *standard_startfile_prefix == DIR_SEPARATOR) + add_prefix (&startfile_prefixes, standard_startfile_prefix, 0, 0, NULL_PTR); else { if (gcc_exec_prefix) - add_prefix (&startfile_prefix, - concat (gcc_exec_prefix, - standard_startfile_prefix, - ""), + add_prefix (&startfile_prefixes, + concat (gcc_exec_prefix, standard_startfile_prefix), 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, - concat (standard_exec_prefix, - machine_suffix, - standard_startfile_prefix), + add_prefix (&startfile_prefixes, + concat3 (standard_exec_prefix, + machine_suffix, + standard_startfile_prefix), 0, 0, NULL_PTR); } - add_prefix (&startfile_prefix, standard_startfile_prefix_1, 0, 0, + add_prefix (&startfile_prefixes, standard_startfile_prefix_1, 0, 0, NULL_PTR); - add_prefix (&startfile_prefix, standard_startfile_prefix_2, 0, 0, + add_prefix (&startfile_prefixes, standard_startfile_prefix_2, 0, 0, NULL_PTR); #if 0 /* Can cause surprises, and one can use -B./ instead. */ - add_prefix (&startfile_prefix, "./", 0, 1, NULL_PTR); + add_prefix (&startfile_prefixes, "./", 0, 1, NULL_PTR); #endif } @@ -4174,7 +4358,7 @@ main (argc, argv) if (print_prog_name) { - char *newname = find_a_file (&exec_prefix, print_prog_name, X_OK); + char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK); printf ("%s\n", (newname ? newname : print_prog_name)); exit (0); } @@ -4244,7 +4428,7 @@ main (argc, argv) input_basename = input_filename; for (p = input_filename; *p; p++) - if (*p == '/') + if (*p == '/' || *p == DIR_SEPARATOR) input_basename = p + 1; /* Find a suffix starting with the last period, @@ -4309,8 +4493,8 @@ main (argc, argv) /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect. */ - putenv_from_prefixes (&exec_prefix, "COMPILER_PATH="); - putenv_from_prefixes (&startfile_prefix, "LIBRARY_PATH="); + putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH="); + putenv_from_prefixes (&startfile_prefixes, "LIBRARY_PATH="); /* Build COLLECT_GCC_OPTIONS to have all of the options specified to the compiler. */ @@ -4345,8 +4529,8 @@ main (argc, argv) } /* Warn if a -B option was specified but the prefix was never used. */ - unused_prefix_warnings (&exec_prefix); - unused_prefix_warnings (&startfile_prefix); + unused_prefix_warnings (&exec_prefixes); + unused_prefix_warnings (&startfile_prefixes); /* If options said don't run linker, complain about input files to be given to the linker. */ @@ -4403,8 +4587,16 @@ lookup_compiler (name, length, language) || (strlen (cp->suffix) < length /* See if the suffix matches the end of NAME. */ +#ifdef OS2 + && (!strcmp (cp->suffix, + name + length - strlen (cp->suffix)) + || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") + && !strcasecmp (cp->suffix, + name + length - strlen (cp->suffix))))) +#else && !strcmp (cp->suffix, name + length - strlen (cp->suffix)))) +#endif { if (cp->spec[0][0] == '@') { @@ -4449,24 +4641,45 @@ xrealloc (ptr, size) return value; } -/* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ +/* Return a newly-allocated string whose contents concatenate those of s1, s2 */ static char * -concat (s1, s2, s3) - char *s1, *s2, *s3; +concat (s1, s2) + char *s1, *s2; { - int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); - char *result = xmalloc (len1 + len2 + len3 + 1); + int len1 = strlen (s1); + int len2 = strlen (s2); + char *result = xmalloc (len1 + len2 + 1); strcpy (result, s1); strcpy (result + len1, s2); - strcpy (result + len1 + len2, s3); - *(result + len1 + len2 + len3) = 0; + *(result + len1 + len2) = 0; return result; } static char * +concat3 (s1, s2, s3) + char *s1, *s2, *s3; +{ + return concat (concat (s1, s2), s3); +} + +static char * +concat4 (s1, s2, s3, s4) + char *s1, *s2, *s3, *s4; +{ + return concat (concat (s1, s2), concat (s3, s4)); +} + +static char * +concat6 (s1, s2, s3, s4, s5, s6) + char *s1, *s2, *s3, *s4, *s5, *s6; +{ + return concat3 (concat (s1, s2), concat (s3, s4), concat (s5, s6)); +} + +static char * save_string (s, len) char *s; int len; @@ -4485,7 +4698,7 @@ pfatal_with_name (name) char *s; if (errno < sys_nerr) - s = concat ("%s: ", sys_errlist[errno], ""); + s = concat ("%s: ", sys_errlist[errno]); else s = "cannot open %s"; fatal (s, name); @@ -4498,7 +4711,7 @@ perror_with_name (name) char *s; if (errno < sys_nerr) - s = concat ("%s: ", sys_errlist[errno], ""); + s = concat ("%s: ", sys_errlist[errno]); else s = "cannot open %s"; error (s, name); @@ -4511,8 +4724,7 @@ perror_exec (name) char *s; if (errno < sys_nerr) - s = concat ("installation problem, cannot exec %s: ", - sys_errlist[errno], ""); + s = concat ("installation problem, cannot exec %s: ", sys_errlist[errno]); else s = "installation problem, cannot exec %s"; error (s, name); diff --git a/gnu/usr.bin/cc/cc1/c-decl.c b/gnu/usr.bin/cc/cc1/c-decl.c index c1a8dc9..995009a 100644 --- a/gnu/usr.bin/cc/cc1/c-decl.c +++ b/gnu/usr.bin/cc/cc1/c-decl.c @@ -1303,6 +1303,7 @@ duplicate_decls (newdecl, olddecl) && DECL_INITIAL (newdecl) != 0); tree oldtype = TREE_TYPE (olddecl); tree newtype = TREE_TYPE (newdecl); + char *errmsg = 0; if (TREE_CODE (newtype) == ERROR_MARK || TREE_CODE (oldtype) == ERROR_MARK) @@ -1528,7 +1529,7 @@ duplicate_decls (newdecl, olddecl) } else { - char *errmsg = redeclaration_error_message (newdecl, olddecl); + errmsg = redeclaration_error_message (newdecl, olddecl); if (errmsg) { error_with_decl (newdecl, errmsg); @@ -1625,7 +1626,7 @@ duplicate_decls (newdecl, olddecl) } /* Optionally warn about more than one declaration for the same name. */ - if (warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0 + if (errmsg == 0 && warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0 /* Dont warn about a function declaration followed by a definition. */ && !(TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl) != 0 @@ -2439,6 +2440,21 @@ shadow_label (name) if (decl != 0) { + register tree dup; + + /* Check to make sure that the label hasn't already been declared + at this label scope */ + for (dup = named_labels; dup; dup = TREE_CHAIN (dup)) + if (TREE_VALUE (dup) == decl) + { + error ("duplicate label declaration `%s'", + IDENTIFIER_POINTER (name)); + error_with_decl (TREE_VALUE (dup), + "this is a previous declaration"); + /* Just use the previous declaration. */ + return lookup_label (name); + } + shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); IDENTIFIER_LABEL_VALUE (name) = decl = 0; } @@ -3673,7 +3689,7 @@ finish_decl (decl, init, asmspec_tree) references to it. */ /* This test used to include TREE_STATIC, but this won't be set for function level initializers. */ - if (TREE_READONLY (decl)) + if (TREE_READONLY (decl) || ITERATOR_P (decl)) { preserve_initializer (); /* Hack? Set the permanent bit for something that is permanent, @@ -5418,7 +5434,7 @@ finish_struct (t, fieldlist) #endif } } - else + else if (TREE_TYPE (x) != error_mark_node) { int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT : TYPE_ALIGN (TREE_TYPE (x))); @@ -5646,37 +5662,6 @@ start_enum (name) return enumtype; } -/* Return the minimum number of bits needed to represent VALUE in a - signed or unsigned type, UNSIGNEDP says which. */ - -static int -min_precision (value, unsignedp) - tree value; - int unsignedp; -{ - int log; - - /* If the value is negative, compute its negative minus 1. The latter - adjustment is because the absolute value of the largest negative value - is one larger than the largest positive value. This is equivalent to - a bit-wise negation, so use that operation instead. */ - - if (tree_int_cst_sgn (value) < 0) - value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value)); - - /* Return the number of bits needed, taking into account the fact - that we need one more bit for a signed than unsigned type. */ - - if (integer_zerop (value)) - log = 0; - else if (TREE_INT_CST_HIGH (value) != 0) - log = HOST_BITS_PER_WIDE_INT + floor_log2 (TREE_INT_CST_HIGH (value)); - else - log = floor_log2 (TREE_INT_CST_LOW (value)); - - return log + 1 + ! unsignedp; -} - /* After processing and defining all the values of an enumeration type, install their decls in the enumeration type and finish it off. ENUMTYPE is the type object and VALUES a list of decl-value pairs. @@ -5868,6 +5853,7 @@ start_function (declspecs, declarator, nested) { tree decl1, old_decl; tree restype; + int old_immediate_size_expand = immediate_size_expand; current_function_returns_value = 0; /* Assume, until we see it does. */ current_function_returns_null = 0; @@ -5877,6 +5863,9 @@ start_function (declspecs, declarator, nested) named_labels = 0; shadowed_labels = 0; + /* Don't expand any sizes in the return type of the function. */ + immediate_size_expand = 0; + decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1); /* If the declarator is not suitable for a function definition, @@ -5922,6 +5911,11 @@ start_function (declspecs, declarator, nested) current_function_prototype_line = DECL_SOURCE_LINE (old_decl); } + /* If there is no explicit declaration, look for any out-of-scope implicit + declarations. */ + if (old_decl == 0) + old_decl = IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)); + /* Optionally warn of old-fashioned def with no previous prototype. */ if (warn_strict_prototypes && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0 @@ -5937,7 +5931,7 @@ start_function (declspecs, declarator, nested) if the function has already been used. */ else if (warn_missing_prototypes && old_decl != 0 && TREE_USED (old_decl) - && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0)) + && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0) warning_with_decl (decl1, "`%s' was used with no prototype before its definition"); /* Optionally warn of any global def with no previous declaration. */ @@ -5949,7 +5943,8 @@ start_function (declspecs, declarator, nested) /* Optionally warn of any def with no previous declaration if the function has already been used. */ else if (warn_missing_declarations - && old_decl != 0 && TREE_USED (old_decl)) + && old_decl != 0 && TREE_USED (old_decl) + && old_decl == IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1))) warning_with_decl (decl1, "`%s' was used with no declaration before its definition"); @@ -6006,6 +6001,8 @@ start_function (declspecs, declarator, nested) if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl))) TREE_ADDRESSABLE (current_function_decl) = 1; + immediate_size_expand = old_immediate_size_expand; + return 1; } diff --git a/gnu/usr.bin/cc/cc1/c-parse.c b/gnu/usr.bin/cc/cc1/c-parse.c index 5120144..8a6465c 100644 --- a/gnu/usr.bin/cc/cc1/c-parse.c +++ b/gnu/usr.bin/cc/cc1/c-parse.c @@ -395,9 +395,9 @@ static const short yyrline[] = { 0, 1576, 1585, 1590, 1595, 1600, 1604, 1608, 1619, 1626, 1633, 1640, 1651, 1655, 1658, 1663, 1686, 1720, 1745, 1774, 1789, 1800, 1804, 1808, 1811, 1816, 1818, 1821, 1823, 1827, 1832, - 1835, 1841, 1846, 1851, 1853, 1862, 1863, 1869, 1871, 1876, - 1878, 1882, 1885, 1891, 1894, 1896, 1898, 1900, 1907, 1912, - 1917, 1919, 1928, 1931, 1936, 1939 + 1835, 1841, 1846, 1851, 1853, 1862, 1863, 1869, 1871, 1881, + 1883, 1887, 1890, 1896, 1899, 1901, 1903, 1905, 1912, 1917, + 1922, 1924, 1933, 1936, 1941, 1944 }; static const char * const yytname[] = { "$","error","$illegal.","IDENTIFIER", @@ -3252,60 +3252,65 @@ case 348: case 349: #line 1872 "c-parse.y" { yyval.ttype = get_parm_info (0); - if (pedantic) - pedwarn ("ANSI C requires a named argument before `...'"); + /* Gcc used to allow this as an extension. However, it does + not work for all targets, and thus has been disabled. + Also, since func (...) and func () are indistinguishable, + it caused problems with the code in expand_builtin which + tries to verify that BUILT_IN_NEXT_ARG is being used + correctly. */ + error ("ANSI C requires a named argument before `...'"); ; break;} case 350: -#line 1877 "c-parse.y" +#line 1882 "c-parse.y" { yyval.ttype = get_parm_info (1); ; break;} case 351: -#line 1879 "c-parse.y" +#line 1884 "c-parse.y" { yyval.ttype = get_parm_info (0); ; break;} case 352: -#line 1884 "c-parse.y" +#line 1889 "c-parse.y" { push_parm_decl (yyvsp[0].ttype); ; break;} case 353: -#line 1886 "c-parse.y" +#line 1891 "c-parse.y" { push_parm_decl (yyvsp[0].ttype); ; break;} case 354: -#line 1893 "c-parse.y" +#line 1898 "c-parse.y" { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; break;} case 355: -#line 1895 "c-parse.y" +#line 1900 "c-parse.y" { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; break;} case 356: -#line 1897 "c-parse.y" +#line 1902 "c-parse.y" { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 357: -#line 1899 "c-parse.y" +#line 1904 "c-parse.y" { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; break;} case 358: -#line 1901 "c-parse.y" +#line 1906 "c-parse.y" { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 359: -#line 1908 "c-parse.y" +#line 1913 "c-parse.y" { pushlevel (0); clear_parm_order (); declare_parm_level (1); ; break;} case 360: -#line 1912 "c-parse.y" +#line 1917 "c-parse.y" { yyval.ttype = yyvsp[0].ttype; parmlist_tags_warning (); poplevel (0, 0, 0); ; break;} case 362: -#line 1920 "c-parse.y" +#line 1925 "c-parse.y" { tree t; for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t)) if (TREE_VALUE (t) == NULL_TREE) @@ -3313,19 +3318,19 @@ case 362: yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ; break;} case 363: -#line 1930 "c-parse.y" +#line 1935 "c-parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 364: -#line 1932 "c-parse.y" +#line 1937 "c-parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} case 365: -#line 1938 "c-parse.y" +#line 1943 "c-parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 366: -#line 1940 "c-parse.y" +#line 1945 "c-parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} } @@ -3526,5 +3531,5 @@ yyerrhandle: yystate = yyn; goto yynewstate; } -#line 1943 "c-parse.y" +#line 1948 "c-parse.y" diff --git a/gnu/usr.bin/cc/cc1/c-typeck.c b/gnu/usr.bin/cc/cc1/c-typeck.c index d5283c6..c40d08a 100644 --- a/gnu/usr.bin/cc/cc1/c-typeck.c +++ b/gnu/usr.bin/cc/cc1/c-typeck.c @@ -655,7 +655,8 @@ type_lists_compatible_p (args1, args2) /* Allow wait (union {union wait *u; int *i} *) and wait (union wait *) to be compatible. */ if (TREE_CODE (TREE_VALUE (args1)) == UNION_TYPE - && TYPE_NAME (TREE_VALUE (args1)) == 0 + && (TYPE_NAME (TREE_VALUE (args1)) == 0 + || TYPE_TRANSPARENT_UNION (TREE_VALUE (args1))) && TREE_CODE (TYPE_SIZE (TREE_VALUE (args1))) == INTEGER_CST && tree_int_cst_equal (TYPE_SIZE (TREE_VALUE (args1)), TYPE_SIZE (TREE_VALUE (args2)))) @@ -669,7 +670,8 @@ type_lists_compatible_p (args1, args2) return 0; } else if (TREE_CODE (TREE_VALUE (args2)) == UNION_TYPE - && TYPE_NAME (TREE_VALUE (args2)) == 0 + && (TYPE_NAME (TREE_VALUE (args2)) == 0 + || TYPE_TRANSPARENT_UNION (TREE_VALUE (args2))) && TREE_CODE (TYPE_SIZE (TREE_VALUE (args2))) == INTEGER_CST && tree_int_cst_equal (TYPE_SIZE (TREE_VALUE (args2)), TYPE_SIZE (TREE_VALUE (args1)))) @@ -990,8 +992,11 @@ default_conversion (exp) /* Constants can be used directly unless they're not loadable. */ if (TREE_CODE (exp) == CONST_DECL) exp = DECL_INITIAL (exp); - /* Replace a nonvolatile const static variable with its value. */ - else if (optimize && TREE_CODE (exp) == VAR_DECL) + + /* Replace a nonvolatile const static variable with its value unless + it is an array, in which case we must be sure that taking the + address of the array produces consistent results. */ + else if (optimize && TREE_CODE (exp) == VAR_DECL && code != ARRAY_TYPE) { exp = decl_constant_value (exp); type = TREE_TYPE (exp); @@ -1630,37 +1635,28 @@ convert_arguments (typelist, values, name, fundecl) } else { -#if 0 /* This turns out not to win--there's no way to write a prototype - for a function whose arg type is a union with no tag. */ - /* Nameless union automatically casts the types it contains. */ - if (TREE_CODE (type) == UNION_TYPE && TYPE_NAME (type) == 0) - { - tree field; - - for (field = TYPE_FIELDS (type); field; - field = TREE_CHAIN (field)) - if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)), - TYPE_MAIN_VARIANT (TREE_TYPE (val)))) - break; - - if (field) - val = build1 (CONVERT_EXPR, type, val); - } -#endif - /* Optionally warn about conversions that differ from the default conversions. */ if (warn_conversion) { int formal_prec = TYPE_PRECISION (type); - if (TREE_CODE (type) != REAL_TYPE + if (INTEGRAL_TYPE_P (type) && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE) warn_for_assignment ("%s as integer rather than floating due to prototype", (char *) 0, name, parmnum + 1); + else if (TREE_CODE (type) == COMPLEX_TYPE + && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE) + warn_for_assignment ("%s as complex rather than floating due to prototype", (char *) 0, name, parmnum + 1); else if (TREE_CODE (type) == REAL_TYPE - && TREE_CODE (TREE_TYPE (val)) != REAL_TYPE) + && INTEGRAL_TYPE_P (TREE_TYPE (val))) warn_for_assignment ("%s as floating rather than integer due to prototype", (char *) 0, name, parmnum + 1); else if (TREE_CODE (type) == REAL_TYPE + && TREE_CODE (TREE_TYPE (val)) == COMPLEX_TYPE) + warn_for_assignment ("%s as floating rather than complex due to prototype", (char *) 0, name, parmnum + 1); + /* ??? At some point, messages should be written about + conversions between complex types, but that's too messy + to do now. */ + else if (TREE_CODE (type) == REAL_TYPE && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE) { /* Warn if any argument is passed as `float', @@ -1669,10 +1665,8 @@ convert_arguments (typelist, values, name, fundecl) warn_for_assignment ("%s as `float' rather than `double' due to prototype", (char *) 0, name, parmnum + 1); } /* Detect integer changing in width or signedness. */ - else if ((TREE_CODE (type) == INTEGER_TYPE - || TREE_CODE (type) == ENUMERAL_TYPE) - && (TREE_CODE (TREE_TYPE (val)) == INTEGER_TYPE - || TREE_CODE (TREE_TYPE (val)) == ENUMERAL_TYPE)) + else if (INTEGRAL_TYPE_P (type) + && INTEGRAL_TYPE_P (TREE_TYPE (val))) { tree would_have_been = default_conversion (val); tree type1 = TREE_TYPE (would_have_been); @@ -2798,7 +2792,7 @@ build_unary_op (code, xarg, noconvert) ((code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ? "increment" : "decrement")); - inc = c_sizeof_nowarn (TREE_TYPE (result_type)); + inc = c_size_in_bytes (TREE_TYPE (result_type)); } else inc = integer_one_node; @@ -3211,6 +3205,18 @@ mark_addressable (exp) IDENTIFIER_POINTER (DECL_NAME (x))); return 0; } + + /* If we are making this addressable due to its having + volatile components, give a different error message. Also + handle the case of an unnamed parameter by not trying + to give the name. */ + + else if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (x))) + { + error ("cannot put object with volatile field into register"); + return 0; + } + pedwarn ("address of register variable `%s' requested", IDENTIFIER_POINTER (DECL_NAME (x))); } @@ -3868,14 +3874,15 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum) /* Arithmetic types all interconvert, and enum is treated like int. */ if ((codel == INTEGER_TYPE || codel == REAL_TYPE || codel == ENUMERAL_TYPE || codel == COMPLEX_TYPE) - && - (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == ENUMERAL_TYPE - || coder == COMPLEX_TYPE)) + && (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == ENUMERAL_TYPE + || coder == COMPLEX_TYPE)) return convert_and_check (type, rhs); + /* Conversion to a union from its member types. */ else if (codel == UNION_TYPE) { tree memb_types; + for (memb_types = TYPE_FIELDS (type); memb_types; memb_types = TREE_CHAIN (memb_types)) { @@ -3886,6 +3893,7 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum) pedwarn ("ANSI C prohibits argument conversion to union type"); return build1 (NOP_EXPR, type, rhs); } + else if (coder == POINTER_TYPE && TREE_CODE (TREE_TYPE (memb_types)) == POINTER_TYPE) { @@ -3895,44 +3903,59 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum) /* Any non-function converts to a [const][volatile] void * and vice versa; otherwise, targets must be the same. - Meanwhile, the lhs target must have all the qualifiers of the rhs. */ + Meanwhile, the lhs target must have all the qualifiers of + the rhs. */ if (TYPE_MAIN_VARIANT (ttl) == void_type_node || TYPE_MAIN_VARIANT (ttr) == void_type_node || comp_target_types (memb_type, rhstype)) { - /* Const and volatile mean something different for function types, - so the usual warnings are not appropriate. */ + /* Const and volatile mean something different for function + types, so the usual warnings are not appropriate. */ if (TREE_CODE (ttr) != FUNCTION_TYPE || TREE_CODE (ttl) != FUNCTION_TYPE) { if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr)) warn_for_assignment ("%s discards `const' from pointer target type", - get_spelling (errtype), funname, parmnum); + get_spelling (errtype), funname, + parmnum); if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr)) warn_for_assignment ("%s discards `volatile' from pointer target type", - get_spelling (errtype), funname, parmnum); + get_spelling (errtype), funname, + parmnum); } else { - /* Because const and volatile on functions are restrictions - that say the function will not do certain things, - it is okay to use a const or volatile function - where an ordinary one is wanted, but not vice-versa. */ + /* Because const and volatile on functions are + restrictions that say the function will not do + certain things, it is okay to use a const or volatile + function where an ordinary one is wanted, but not + vice-versa. */ if (TYPE_READONLY (ttl) && ! TYPE_READONLY (ttr)) warn_for_assignment ("%s makes `const *' function pointer from non-const", - get_spelling (errtype), funname, parmnum); + get_spelling (errtype), funname, + parmnum); if (TYPE_VOLATILE (ttl) && ! TYPE_VOLATILE (ttr)) warn_for_assignment ("%s makes `volatile *' function pointer from non-volatile", - get_spelling (errtype), funname, parmnum); + get_spelling (errtype), funname, + parmnum); } + if (pedantic && !(fundecl != 0 && DECL_IN_SYSTEM_HEADER (fundecl))) pedwarn ("ANSI C prohibits argument conversion to union type"); return build1 (NOP_EXPR, type, rhs); } } + + /* Can convert integer zero to any pointer type. */ + else if (TREE_CODE (TREE_TYPE (memb_types)) == POINTER_TYPE + && (integer_zerop (rhs) + || (TREE_CODE (rhs) == NOP_EXPR + && integer_zerop (TREE_OPERAND (rhs, 0))))) + return build1 (NOP_EXPR, type, null_pointer_node); } } + /* Conversions among pointers */ else if (codel == POINTER_TYPE && coder == POINTER_TYPE) { @@ -5155,8 +5178,8 @@ push_init_level (implicit) /* Structure elements may require alignment. Do this now if necessary for the subaggregate. */ - if (constructor_incremental && TREE_CODE (constructor_type) == RECORD_TYPE - && constructor_fields) + if (constructor_incremental && constructor_type != 0 + && TREE_CODE (constructor_type) == RECORD_TYPE && constructor_fields) { /* Advance to offset of this element. */ if (! tree_int_cst_equal (constructor_bit_index, @@ -6020,6 +6043,7 @@ process_init_element (value) /* Otherwise, if we have come to a subaggregate, and we don't have an element of its type, push into it. */ else if (value != 0 && !constructor_no_implicit + && value != error_mark_node && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE || fieldcode == UNION_TYPE)) @@ -6083,6 +6107,7 @@ process_init_element (value) /* Otherwise, if we have come to a subaggregate, and we don't have an element of its type, push into it. */ else if (value != 0 && !constructor_no_implicit + && value != error_mark_node && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE || fieldcode == UNION_TYPE)) @@ -6126,6 +6151,7 @@ process_init_element (value) /* Otherwise, if we have come to a subaggregate, and we don't have an element of its type, push into it. */ else if (value != 0 && !constructor_no_implicit + && value != error_mark_node && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != elttype && (eltcode == RECORD_TYPE || eltcode == ARRAY_TYPE || eltcode == UNION_TYPE)) @@ -6142,6 +6168,10 @@ process_init_element (value) break; } + /* In the case of [LO .. HI] = VALUE, only evaluate VALUE once. */ + if (constructor_range_end) + value = save_expr (value); + /* Now output the actual element. Ordinarily, output once. If there is a range, repeat it till we advance past the range. */ diff --git a/gnu/usr.bin/cc/cc1plus/call.c b/gnu/usr.bin/cc/cc1plus/call.c index 3392a7a..41580a6 100644 --- a/gnu/usr.bin/cc/cc1plus/call.c +++ b/gnu/usr.bin/cc/cc1plus/call.c @@ -700,11 +700,17 @@ compute_conversion_costs (function, tta_in, cp, arglen) int strike_index = 0, win; struct harshness_code lose; + extern int cp_silent; #ifdef GATHER_STATISTICS n_compute_conversion_costs++; #endif +#ifndef DEBUG_MATCHING + /* We don't emit any warnings or errors while trying out each candidate. */ + cp_silent = 1; +#endif + cp->function = function; cp->arg = tta ? TREE_VALUE (tta) : NULL_TREE; cp->u.bad_arg = 0; /* optimistic! */ @@ -712,7 +718,7 @@ compute_conversion_costs (function, tta_in, cp, arglen) cp->h.code = 0; cp->h.distance = 0; cp->h.int_penalty = 0; - bzero (cp->harshness, + bzero ((char *) cp->harshness, (cp->h_len + 1) * sizeof (struct harshness_code)); while (ttf && tta) @@ -812,6 +818,7 @@ compute_conversion_costs (function, tta_in, cp, arglen) { cp->h.code = EVIL_CODE; cp->u.bad_arg = -1; + cp_silent = 0; return; } else @@ -833,6 +840,7 @@ compute_conversion_costs (function, tta_in, cp, arglen) { cp->h.code = EVIL_CODE; cp->u.bad_arg = -2; + cp_silent = 0; return; } /* Store index of first default. */ @@ -855,6 +863,7 @@ compute_conversion_costs (function, tta_in, cp, arglen) if (dont_convert_types) { cp->h.code = EVIL_CODE; + cp_silent = 0; return; } @@ -1002,6 +1011,7 @@ compute_conversion_costs (function, tta_in, cp, arglen) cp->h.code |= ELLIPSIS_CODE; if (user_strikes) cp->h.code |= USER_CODE; + cp_silent = 0; #ifdef DEBUG_MATCHING cp_error ("final eval %s", print_harshness (&cp->h)); #endif @@ -1428,11 +1438,11 @@ build_scoped_method_call (exp, scopes, name, parms) if (type != basetype) cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')", exp, basetype, type); - name = IDENTIFIER_TYPE_VALUE (TREE_OPERAND (name, 0)); - if (basetype != name) - cp_error ("qualified type `%T' does not match destructor type `%T'", + name = TREE_OPERAND (name, 0); + if (basetype != get_type_value (name)) + cp_error ("qualified type `%T' does not match destructor name `~%T'", basetype, name); - return void_zero_node; + return convert (void_type_node, exp); } if (! is_aggr_typedef (basename, 1)) @@ -1460,15 +1470,16 @@ build_scoped_method_call (exp, scopes, name, parms) { /* Explicit call to destructor. */ name = TREE_OPERAND (name, 0); - if (name != constructor_name (TREE_TYPE (decl))) + if (! (name == constructor_name (TREE_TYPE (decl)) + || TREE_TYPE (decl) == get_type_value (name))) { cp_error - ("qualified type `%T' does not match destructor type `%T'", + ("qualified type `%T' does not match destructor name `~%T'", TREE_TYPE (decl), name); return error_mark_node; } if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl))) - return void_zero_node; + return convert (void_type_node, exp); return build_delete (TREE_TYPE (decl), decl, integer_two_node, LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, @@ -1604,23 +1615,19 @@ build_method_call (instance, name, parms, basetype_path, flags) if (parms) error ("destructors take no parameters"); basetype = TREE_TYPE (instance); - if (IS_AGGR_TYPE (basetype)) - { - if (name == constructor_name (basetype)) - goto huzzah; - } - else + if (TREE_CODE (basetype) == REFERENCE_TYPE) + basetype = TREE_TYPE (basetype); + if (! ((IS_AGGR_TYPE (basetype) + && name == constructor_name (basetype)) + || basetype == get_type_value (name))) { - if (basetype == get_type_value (name)) - goto huzzah; + cp_error ("destructor name `~%D' does not match type `%T' of expression", + name, basetype); + return convert (void_type_node, instance); } - cp_error ("destructor name `~%D' does not match type `%T' of expression", - name, basetype); - return void_zero_node; - huzzah: if (! TYPE_HAS_DESTRUCTOR (basetype)) - return void_zero_node; + return convert (void_type_node, instance); instance = default_conversion (instance); instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); return build_delete (build_pointer_type (basetype), @@ -1806,7 +1813,11 @@ build_method_call (instance, name, parms, basetype_path, flags) } else { - if (TREE_CODE (instance) != CALL_EXPR) + if (TREE_CODE (instance) != CALL_EXPR +#ifdef PCC_STATIC_STRUCT_RETURN + && TREE_CODE (instance) != RTL_EXPR +#endif + ) my_friendly_abort (125); if (TYPE_NEEDS_CONSTRUCTING (basetype)) instance = build_cplus_new (basetype, instance, 0); @@ -1897,6 +1908,8 @@ build_method_call (instance, name, parms, basetype_path, flags) { TREE_VALUE (parm) = build_unary_op (ADDR_EXPR, TREE_VALUE (parm), 0); } +#if 0 + /* This breaks reference-to-array parameters. */ if (TREE_CODE (t) == ARRAY_TYPE) { /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place. @@ -1904,6 +1917,7 @@ build_method_call (instance, name, parms, basetype_path, flags) TREE_VALUE (parm) = default_conversion (TREE_VALUE (parm)); t = TREE_TYPE (TREE_VALUE (parm)); } +#endif if (t == error_mark_node) return error_mark_node; last = build_tree_list (NULL_TREE, t); @@ -1932,7 +1946,9 @@ build_method_call (instance, name, parms, basetype_path, flags) { constp = 0; volatilep = 0; - parms = tree_cons (NULL_TREE, build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), integer_zero_node), parms); + parms = tree_cons (NULL_TREE, + build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), + integer_zero_node), parms); } else { @@ -1945,6 +1961,10 @@ build_method_call (instance, name, parms, basetype_path, flags) TREE_CALLS_NEW (instance_ptr) = 1; instance = build_indirect_ref (instance_ptr, NULL_PTR); +#if 0 + /* This breaks initialization of a reference from a new + expression of a different type. And it doesn't appear to + serve its original purpose any more, either. jason 10/12/94 */ /* If it's a default argument initialized from a ctor, what we get from instance_ptr will match the arglist for the FUNCTION_DECL of the constructor. */ @@ -1953,6 +1973,7 @@ build_method_call (instance, name, parms, basetype_path, flags) && TREE_CALLS_NEW (TREE_VALUE (TREE_OPERAND (TREE_VALUE (parms), 1)))) parms = build_tree_list (NULL_TREE, instance_ptr); else +#endif parms = tree_cons (NULL_TREE, instance_ptr, parms); } } @@ -2012,6 +2033,7 @@ build_method_call (instance, name, parms, basetype_path, flags) return error_mark_node; +#if 0 /* Now, go look for this method name. We do not find destructors here. Putting `void_list_node' on the end of the parmtypes @@ -2021,6 +2043,7 @@ build_method_call (instance, name, parms, basetype_path, flags) 1 + (name == constructor_name (save_basetype) || name == constructor_name_full (save_basetype))); TREE_CHAIN (last) = NULL_TREE; +#endif for (pass = 0; pass < 2; pass++) { @@ -2040,7 +2063,7 @@ build_method_call (instance, name, parms, basetype_path, flags) candidates = (struct candidate *) alloca ((ever_seen+1) * sizeof (struct candidate)); - bzero (candidates, (ever_seen + 1) * sizeof (struct candidate)); + bzero ((char *) candidates, (ever_seen + 1) * sizeof (struct candidate)); cp = candidates; len = list_length (parms); ever_seen = 0; @@ -2062,7 +2085,7 @@ build_method_call (instance, name, parms, basetype_path, flags) { tree new_type; parm = build_indirect_ref (parm, "friendifying parms (compiler error)"); - new_type = c_build_type_variant (TREE_TYPE (parm), constp, + new_type = cp_build_type_variant (TREE_TYPE (parm), constp, volatilep); new_type = build_reference_type (new_type); parm = convert (new_type, parm); @@ -2147,9 +2170,11 @@ build_method_call (instance, name, parms, basetype_path, flags) && ! DECL_STATIC_FUNCTION_P (function)) continue; +#if 0 if (pass == 0 && DECL_ASSEMBLER_NAME (function) == method_name) goto found; +#endif if (pass > 0) { @@ -2244,6 +2269,7 @@ build_method_call (instance, name, parms, basetype_path, flags) if (cp - candidates > 1) { int n_candidates = cp - candidates; + extern int warn_synth; TREE_VALUE (parms) = instance_ptr; cp = ideal_candidate (save_basetype, candidates, n_candidates, parms, len); @@ -2251,14 +2277,25 @@ build_method_call (instance, name, parms, basetype_path, flags) { if (flags & LOOKUP_COMPLAIN) { - cp_error ("call of overloaded %s `%D' is ambiguous", - name_kind, name); + TREE_CHAIN (last) = void_list_node; + cp_error ("call of overloaded %s `%D(%A)' is ambiguous", + name_kind, name, TREE_CHAIN (parmtypes)); print_n_candidates (candidates, n_candidates); } return error_mark_node; } if (cp->h.code & EVIL_CODE) return error_mark_node; + if (warn_synth + && DECL_NAME (cp->function) == ansi_opname[MODIFY_EXPR] + && DECL_ARTIFICIAL (cp->function) + && n_candidates == 2) + { + cp_warning ("using synthesized `%#D' for copy assignment", + cp->function); + cp_warning_at (" where cfront would use `%#D'", + candidates->function); + } } else if (cp[-1].h.code & EVIL_CODE) { @@ -2664,7 +2701,11 @@ build_overload_call_real (fnname, parms, flags, final_cp, buildxxx) final_cp->h.code = EVIL_CODE; return error_mark_node; } - if (TREE_CODE (t) == ARRAY_TYPE || TREE_CODE (t) == OFFSET_TYPE) + if (TREE_CODE (t) == OFFSET_TYPE) +#if 0 + /* This breaks reference-to-array parameters. */ + || TREE_CODE (t) == ARRAY_TYPE +#endif { /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place. Also convert OFFSET_TYPE entities to their normal selves. @@ -2738,7 +2779,7 @@ build_overload_call_real (fnname, parms, flags, final_cp, buildxxx) { candidates = (struct candidate *)alloca ((length+1) * sizeof (struct candidate)); - bzero (candidates, (length + 1) * sizeof (struct candidate)); + bzero ((char *) candidates, (length + 1) * sizeof (struct candidate)); } cp = candidates; diff --git a/gnu/usr.bin/cc/cc1plus/class.c b/gnu/usr.bin/cc/cc1plus/class.c index e715c89..a3bcb26 100644 --- a/gnu/usr.bin/cc/cc1plus/class.c +++ b/gnu/usr.bin/cc/cc1plus/class.c @@ -942,7 +942,7 @@ add_method (type, fields, method) * sizeof (char *) + len * sizeof (tree)); tmp_vec = (tree) obstack_base (ob); - bcopy (method_vec, tmp_vec, + bcopy ((char *) method_vec, (char *) tmp_vec, (sizeof (struct tree_common) + tree_code_length[(int) TREE_VEC] * sizeof (char *) + (len-1) * sizeof (tree))); @@ -992,20 +992,18 @@ add_method (type, fields, method) not duplicates, they are just anonymous fields. This happens when we have unnamed bitfields, for example. */ static tree -delete_duplicate_fields_1 (field, field_ptr, fields) - tree field, *field_ptr, fields; +delete_duplicate_fields_1 (field, fields) + tree field, fields; { tree x; - tree prev = field_ptr ? *field_ptr : 0; + tree prev = 0; if (DECL_NAME (field) == 0) { if (TREE_CODE (TREE_TYPE (field)) != UNION_TYPE) return fields; for (x = TYPE_FIELDS (TREE_TYPE (field)); x; x = TREE_CHAIN (x)) - fields = delete_duplicate_fields_1 (x, field_ptr, fields); - if (prev) - TREE_CHAIN (prev) = fields; + fields = delete_duplicate_fields_1 (x, fields); return fields; } else @@ -1017,7 +1015,7 @@ delete_duplicate_fields_1 (field, field_ptr, fields) if (TREE_CODE (TREE_TYPE (x)) != UNION_TYPE) continue; TYPE_FIELDS (TREE_TYPE (x)) - = delete_duplicate_fields_1 (field, (tree *)0, TYPE_FIELDS (TREE_TYPE (x))); + = delete_duplicate_fields_1 (field, TYPE_FIELDS (TREE_TYPE (x))); if (TYPE_FIELDS (TREE_TYPE (x)) == 0) { if (prev == 0) @@ -1039,7 +1037,7 @@ delete_duplicate_fields_1 (field, field_ptr, fields) x); else if (TREE_CODE (field) == TYPE_DECL && TREE_CODE (x) == TYPE_DECL) - cp_error_at ("duplicate class scope type `%D'", x); + cp_error_at ("duplicate nested type `%D'", x); else if (TREE_CODE (field) == TYPE_DECL || TREE_CODE (x) == TYPE_DECL) cp_error_at ("duplicate field `%D' (as type and non-type)", @@ -1063,7 +1061,7 @@ delete_duplicate_fields (fields) { tree x; for (x = fields; x && TREE_CHAIN (x); x = TREE_CHAIN (x)) - TREE_CHAIN (x) = delete_duplicate_fields_1 (x, &x, TREE_CHAIN (x)); + TREE_CHAIN (x) = delete_duplicate_fields_1 (x, TREE_CHAIN (x)); } /* Change the access of FDECL to ACCESS in T. @@ -1121,10 +1119,14 @@ get_vfield_offset (binfo) BINFO_OFFSET (binfo)); } -/* Get the offset to the start of the original binfo that we derived this - binfo from. */ -tree get_derived_offset (binfo) - tree binfo; +/* Get the offset to the start of the original binfo that we derived + this binfo from. If we find TYPE first, return the offset only + that far. The shortened search is useful because the this pointer + on method calling is expected to point to a DECL_CONTEXT (fndecl) + object, and not a baseclass of it. */ +static tree +get_derived_offset (binfo, type) + tree binfo, type; { tree offset1 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo))); tree offset2; @@ -1133,6 +1135,8 @@ tree get_derived_offset (binfo) && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1) { tree binfos = BINFO_BASETYPES (binfo); + if (BINFO_TYPE (binfo) == type) + break; binfo = TREE_VEC_ELT (binfos, i); } offset2 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo))); @@ -1340,7 +1344,7 @@ finish_base_struct (t, b, t_binfo) tree binfos = BINFO_BASETYPES (t_binfo); int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; int first_vfn_base_index = -1; - bzero (b, sizeof (struct base_info)); + bzero ((char *) b, sizeof (struct base_info)); for (i = 0; i < n_baseclasses; i++) { @@ -1682,8 +1686,8 @@ finish_struct_bits (t, max_has_virtual) tree *tmp; int i; - bzero (first_conversions, sizeof (first_conversions)); - bzero (last_conversions, sizeof (last_conversions)); + bzero ((char *) first_conversions, sizeof (first_conversions)); + bzero ((char *) last_conversions, sizeof (last_conversions)); for (tmp = &TREE_VEC_ELT (method_vec, 1); tmp != TREE_VEC_END (method_vec); tmp += 1) { @@ -1830,8 +1834,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method) { tree parmtype = TREE_VALUE (FUNCTION_ARG_CHAIN (fn_fields)); - if (TREE_CODE (parmtype) == REFERENCE_TYPE - && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == t) + if (copy_assignment_arg_p (parmtype, DECL_VIRTUAL_P (fn_fields))) { if (TREE_PROTECTED (fn_fields)) TYPE_HAS_NONPUBLIC_ASSIGN_REF (t) = 1; @@ -1938,8 +1941,8 @@ finish_struct_methods (t, fn_fields, nonprivate_method) && CLASSTYPE_FRIEND_CLASSES (t) == NULL_TREE && DECL_FRIENDLIST (TYPE_NAME (t)) == NULL_TREE && warn_ctor_dtor_privacy) - warning ("class `%s' only defines a private destructor and has no friends", - TYPE_NAME_STRING (t)); + cp_warning ("`%#T' only defines a private destructor and has no friends", + t); break; } } @@ -2060,7 +2063,7 @@ duplicate_tag_error (t) int interface_only = CLASSTYPE_INTERFACE_ONLY (t); int interface_unknown = CLASSTYPE_INTERFACE_UNKNOWN (t); - bzero (TYPE_LANG_SPECIFIC (t), sizeof (struct lang_type)); + bzero ((char *) TYPE_LANG_SPECIFIC (t), sizeof (struct lang_type)); BINFO_BASETYPES(binfo) = NULL_TREE; CLASSTYPE_AS_LIST (t) = as_list; @@ -2151,6 +2154,86 @@ overrides (fndecl, base_fndecl) return 0; } +static tree +get_class_offset_1 (parent, binfo, context, t, fndecl) + tree parent, binfo, context, t, fndecl; +{ + tree binfos = BINFO_BASETYPES (binfo); + int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; + tree rval = NULL_TREE; + + if (binfo == parent) + return error_mark_node; + + for (i = 0; i < n_baselinks; i++) + { + tree base_binfo = TREE_VEC_ELT (binfos, i); + tree nrval; + + if (TREE_VIA_VIRTUAL (base_binfo)) + base_binfo = binfo_member (BINFO_TYPE (base_binfo), + CLASSTYPE_VBASECLASSES (t)); + nrval = get_class_offset_1 (parent, base_binfo, context, t, fndecl); + /* See if we have a new value */ + if (nrval && (nrval != error_mark_node || rval==0)) + { + /* Only compare if we have two offsets */ + if (rval && rval != error_mark_node + && ! tree_int_cst_equal (nrval, rval)) + { + /* Only give error if the two offsets are different */ + error ("every virtual function must have a unique final overrider"); + cp_error (" found two (or more) `%T' class subobjects in `%T'", context, t); + cp_error (" with virtual `%D' from virtual base class", fndecl); + return rval; + } + rval = nrval; + } + + if (rval && BINFO_TYPE (binfo) == context) + { + my_friendly_assert (rval == error_mark_node + || tree_int_cst_equal (rval, BINFO_OFFSET (binfo)), 999); + rval = BINFO_OFFSET (binfo); + } + } + return rval; +} + +/* Get the offset to the CONTEXT subobject that is related to the + given BINFO. */ +static tree +get_class_offset (context, t, binfo, fndecl) + tree context, t, binfo, fndecl; +{ + tree first_binfo = binfo; + tree offset; + int i; + + if (context == t) + return integer_zero_node; + + if (BINFO_TYPE (binfo) == context) + return BINFO_OFFSET (binfo); + + /* Check less derived binfos first. */ + while (BINFO_BASETYPES (binfo) + && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1) + { + tree binfos = BINFO_BASETYPES (binfo); + binfo = TREE_VEC_ELT (binfos, i); + if (BINFO_TYPE (binfo) == context) + return BINFO_OFFSET (binfo); + } + + /* Ok, not found in the less derived binfos, now check the more + derived binfos. */ + offset = get_class_offset_1 (first_binfo, TYPE_BINFO (t), context, t, fndecl); + if (offset==0 || TREE_CODE (offset) != INTEGER_CST) + my_friendly_abort (999); /* we have to find it. */ + return offset; +} + static void modify_one_vtable (binfo, t, fndecl, pfn) tree binfo, t, fndecl, pfn; @@ -2174,16 +2257,7 @@ modify_one_vtable (binfo, t, fndecl, pfn) tree vfield = CLASSTYPE_VFIELD (t); tree this_offset; - offset = integer_zero_node; - if (context != t && TYPE_USES_COMPLEX_INHERITANCE (t)) - { - offset = virtual_offset (context, CLASSTYPE_VBASECLASSES (t), offset); - if (offset == NULL_TREE) - { - tree binfo = get_binfo (context, t, 0); - offset = BINFO_OFFSET (binfo); - } - } + offset = get_class_offset (context, t, binfo, fndecl); /* Find the right offset for the this pointer based on the base class we just found. We have to take into @@ -2193,7 +2267,7 @@ modify_one_vtable (binfo, t, fndecl, pfn) Also, we want just the delta bewteen the most base class that we derived this vfield from and us. */ base_offset = size_binop (PLUS_EXPR, - get_derived_offset (binfo), + get_derived_offset (binfo, DECL_CONTEXT (current_fndecl)), BINFO_OFFSET (binfo)); this_offset = size_binop (MINUS_EXPR, offset, base_offset); @@ -2288,16 +2362,7 @@ fixup_vtable_deltas (binfo, t) tree vfield = CLASSTYPE_VFIELD (t); tree this_offset; - offset = integer_zero_node; - if (context != t && TYPE_USES_COMPLEX_INHERITANCE (t)) - { - offset = virtual_offset (context, CLASSTYPE_VBASECLASSES (t), offset); - if (offset == NULL_TREE) - { - tree binfo = get_binfo (context, t, 0); - offset = BINFO_OFFSET (binfo); - } - } + offset = get_class_offset (context, t, binfo, fndecl); /* Find the right offset for the this pointer based on the base class we just found. We have to take into @@ -2307,7 +2372,7 @@ fixup_vtable_deltas (binfo, t) Also, we want just the delta bewteen the most base class that we derived this vfield from and us. */ base_offset = size_binop (PLUS_EXPR, - get_derived_offset (binfo), + get_derived_offset (binfo, DECL_CONTEXT (fndecl)), BINFO_OFFSET (binfo)); this_offset = size_binop (MINUS_EXPR, offset, base_offset); @@ -2684,6 +2749,7 @@ finish_struct (t, list_of_fieldlists, warn_anon) will fill in the right line number. (mrs) */ if (DECL_SOURCE_LINE (name)) DECL_SOURCE_LINE (name) = lineno; + CLASSTYPE_SOURCE_LINE (t) = lineno; } name = DECL_NAME (name); } @@ -2713,18 +2779,15 @@ finish_struct (t, list_of_fieldlists, warn_anon) TYPE_SIZE (t) = NULL_TREE; CLASSTYPE_GOT_SEMICOLON (t) = 0; - /* A signature type will contain the fields of the signature table. - Therefore, it's not only an interface. */ - if (IS_SIGNATURE (t)) - { - CLASSTYPE_INTERFACE_ONLY (t) = 0; - SET_CLASSTYPE_INTERFACE_KNOWN (t); - } - else +#if 0 + /* This is in general too late to do this. I moved the main case up to + left_curly, what else needs to move? */ + if (! IS_SIGNATURE (t)) { - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); + my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999); + my_friendly_assert (CLASSTYPE_INTERFACE_KNOWN (t) == ! interface_unknown, 999); } +#endif if (flag_dossier) build_t_desc (t, 0); @@ -2787,14 +2850,15 @@ finish_struct (t, list_of_fieldlists, warn_anon) needs_virtual_dtor = 0; } +#if 0 + /* Both of these should be done before now. */ if (write_virtuals == 3 && CLASSTYPE_INTERFACE_KNOWN (t) && ! IS_SIGNATURE (t)) { - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! interface_only; + my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999); + my_friendly_assert (CLASSTYPE_VTABLE_NEEDS_WRITING (t) == ! interface_only, 999); } - else if (IS_SIGNATURE (t)) - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = 0; +#endif /* The three of these are approximations which may later be modified. Needed at this point to make add_virtual_function @@ -2951,6 +3015,9 @@ finish_struct (t, list_of_fieldlists, warn_anon) TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x)); } + if (DECL_NAME (x) == constructor_name (t)) + cant_have_default_ctor = cant_synth_copy_ctor = 1; + if (TREE_TYPE (x) == error_mark_node) continue; @@ -3217,12 +3284,14 @@ finish_struct (t, list_of_fieldlists, warn_anon) CLASSTYPE_REF_FIELDS_NEED_INIT (t) = ref_sans_init; CLASSTYPE_ABSTRACT_VIRTUALS (t) = abstract_virtuals; + /* Synthesize any needed methods. Note that methods will be synthesized + for anonymous unions; grok_x_components undoes that. */ + if (TYPE_NEEDS_DESTRUCTOR (t) && !TYPE_HAS_DESTRUCTOR (t) && !IS_SIGNATURE (t)) { /* Here we must cons up a destructor on the fly. */ - tree dtor = cons_up_default_function (t, name, fields, - needs_virtual_dtor != 0); + tree dtor = cons_up_default_function (t, name, needs_virtual_dtor != 0); /* If we couldn't make it work, then pretend we didn't need it. */ if (dtor == void_type_node) @@ -3251,9 +3320,6 @@ finish_struct (t, list_of_fieldlists, warn_anon) TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_HAS_DESTRUCTOR (t); - /* Synthesize any needed methods. Note that methods will be synthesized - for anonymous unions; grok_x_components undoes that. */ - if (! fn_fields) nonprivate_method = 1; @@ -3271,7 +3337,7 @@ finish_struct (t, list_of_fieldlists, warn_anon) if (! TYPE_HAS_CONSTRUCTOR (t) && ! cant_have_default_ctor && ! IS_SIGNATURE (t)) { - tree default_fn = cons_up_default_function (t, name, fields, 2); + tree default_fn = cons_up_default_function (t, name, 2); TREE_CHAIN (default_fn) = fn_fields; fn_fields = default_fn; } @@ -3282,9 +3348,8 @@ finish_struct (t, list_of_fieldlists, warn_anon) { /* ARM 12.18: You get either X(X&) or X(const X&), but not both. --Chip */ - tree default_fn = - cons_up_default_function (t, name, fields, - cant_have_const_ctor ? 4 : 3); + tree default_fn = cons_up_default_function (t, name, + 3 + cant_have_const_ctor); TREE_CHAIN (default_fn) = fn_fields; fn_fields = default_fn; } @@ -3298,9 +3363,8 @@ finish_struct (t, list_of_fieldlists, warn_anon) if (! TYPE_HAS_ASSIGN_REF (t) && ! cant_synth_asn_ref && ! IS_SIGNATURE (t)) { - tree default_fn = - cons_up_default_function (t, name, fields, - no_const_asn_ref ? 6 : 5); + tree default_fn = cons_up_default_function (t, name, + 5 + no_const_asn_ref); TREE_CHAIN (default_fn) = fn_fields; fn_fields = default_fn; } @@ -3351,7 +3415,7 @@ finish_struct (t, list_of_fieldlists, warn_anon) tree flist = NULL_TREE; tree name; enum access_type access = (enum access_type)TREE_PURPOSE(access_decls); - int i = 0; + int i = TREE_VEC_ELT (method_vec, 0) ? 0 : 1; tree tmp; if (TREE_CODE (fdecl) == TREE_LIST) @@ -3459,6 +3523,27 @@ finish_struct (t, list_of_fieldlists, warn_anon) /* Delete all duplicate fields from the fields */ delete_duplicate_fields (fields); + /* Catch function/field name conflict. We don't need to do this for a + signature, since it can only contain the fields constructed in + append_signature_fields. */ + if (! IS_SIGNATURE (t)) + { + int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; + for (x = fields; x; x = TREE_CHAIN (x)) + { + tree name = DECL_NAME (x); + int i = /*TREE_VEC_ELT (method_vec, 0) ? 0 : */ 1; + for (; i < n_methods; ++i) + if (DECL_NAME (TREE_VEC_ELT (method_vec, i)) == name) + { + cp_error_at ("data member `%#D' conflicts with", x); + cp_error_at ("function member `%#D'", + TREE_VEC_ELT (method_vec, i)); + break; + } + } + } + /* Now we have the final fieldlist for the data fields. Record it, then lay out the structure or union (including the fields). */ @@ -3498,6 +3583,9 @@ finish_struct (t, list_of_fieldlists, warn_anon) tree uelt = TYPE_FIELDS (TREE_TYPE (field)); for (; uelt; uelt = TREE_CHAIN (uelt)) { + if (TREE_CODE (uelt) != FIELD_DECL) + continue; + DECL_FIELD_CONTEXT (uelt) = DECL_FIELD_CONTEXT (field); DECL_FIELD_BITPOS (uelt) = DECL_FIELD_BITPOS (field); } @@ -3552,6 +3640,9 @@ finish_struct (t, list_of_fieldlists, warn_anon) tree uelt = TYPE_FIELDS (TREE_TYPE (field)); for (; uelt; uelt = TREE_CHAIN (uelt)) { + if (TREE_CODE (uelt) != FIELD_DECL) + continue; + DECL_FIELD_CONTEXT (uelt) = DECL_FIELD_CONTEXT (field); DECL_FIELD_BITPOS (uelt) = DECL_FIELD_BITPOS (field); } @@ -4634,11 +4725,42 @@ instantiate_type (lhstype, rhs, complain) { elem = get_first_fn (rhs); while (elem) - if (TREE_TYPE (elem) != lhstype) + if (! comptypes (lhstype, TREE_TYPE (elem), 1)) elem = DECL_CHAIN (elem); else return elem; - /* No exact match found, look for a compatible function. */ + + /* No exact match found, look for a compatible template. */ + { + tree save_elem = 0; + for (elem = get_first_fn (rhs); elem; elem = DECL_CHAIN (elem)) + if (TREE_CODE (elem) == TEMPLATE_DECL) + { + int n = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (elem)); + tree *t = (tree *) alloca (sizeof (tree) * n); + int i, d; + i = type_unification (DECL_TEMPLATE_PARMS (elem), t, + TYPE_ARG_TYPES (TREE_TYPE (elem)), + TYPE_ARG_TYPES (lhstype), &d, 0); + if (i == 0) + { + if (save_elem) + { + cp_error ("ambiguous template instantiation converting to `%#T'", lhstype); + return error_mark_node; + } + save_elem = instantiate_template (elem, t); + /* Check the return type. */ + if (! comptypes (TREE_TYPE (lhstype), + TREE_TYPE (TREE_TYPE (save_elem)), 1)) + save_elem = 0; + } + } + if (save_elem) + return save_elem; + } + + /* No match found, look for a compatible function. */ elem = get_first_fn (rhs); while (elem && ! comp_target_types (lhstype, TREE_TYPE (elem), 1)) elem = DECL_CHAIN (elem); @@ -4660,18 +4782,6 @@ instantiate_type (lhstype, rhs, complain) } return error_mark_node; } - if (TREE_CODE (save_elem) == TEMPLATE_DECL) - { - int ntparms = TREE_VEC_LENGTH - (DECL_TEMPLATE_PARMS (save_elem)); - tree *targs = (tree *) alloca (sizeof (tree) * ntparms); - int i, dummy; - i = type_unification - (DECL_TEMPLATE_PARMS (save_elem), targs, - TYPE_ARG_TYPES (TREE_TYPE (save_elem)), - TYPE_ARG_TYPES (lhstype), &dummy, 0); - save_elem = instantiate_template (save_elem, targs); - } return save_elem; } if (complain) @@ -4864,12 +4974,14 @@ instantiate_type (lhstype, rhs, complain) } TREE_TYPE (rhs) = lhstype; lhstype = TREE_TYPE (lhstype); - TREE_OPERAND (rhs, 0) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain); - if (TREE_OPERAND (rhs, 0) == error_mark_node) - return error_mark_node; - - mark_addressable (TREE_OPERAND (rhs, 0)); + { + tree fn = instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain); + if (fn == error_mark_node) + return error_mark_node; + mark_addressable (fn); + TREE_OPERAND (rhs, 0) = fn; + TREE_CONSTANT (rhs) = staticp (fn); + } return rhs; case ENTRY_VALUE_EXPR: diff --git a/gnu/usr.bin/cc/cc1plus/cp-tree.h b/gnu/usr.bin/cc/cc1plus/cp-tree.h index 80fd832..13c21dc 100644 --- a/gnu/usr.bin/cc/cc1plus/cp-tree.h +++ b/gnu/usr.bin/cc/cc1plus/cp-tree.h @@ -502,8 +502,12 @@ struct lang_type union tree_node *signature; union tree_node *signature_pointer_to; union tree_node *signature_reference_to; + + int linenum; }; +#define CLASSTYPE_SOURCE_LINE(NODE) (TYPE_LANG_SPECIFIC(NODE)->linenum) + /* Indicates whether or not (and how) a template was expanded for this class. 0=no information yet/non-template class 1=implicit template instantiation @@ -1355,7 +1359,7 @@ extern void check_function_format PROTO((tree, tree, tree)); /* Print an error message for invalid operands to arith operation CODE. NOP_EXPR is used as a special case (see truthvalue_conversion). */ extern void binary_op_error PROTO((enum tree_code)); -extern tree c_build_type_variant PROTO((tree, int, int)); +extern tree cp_build_type_variant PROTO((tree, int, int)); extern void c_expand_expr_stmt PROTO((tree)); /* Validate the expression after `case' and apply default promotions. */ extern tree check_case_value PROTO((tree)); @@ -2011,7 +2015,7 @@ extern void expand_end_all_catch PROTO((void)); extern void start_catch_block PROTO((tree, tree)); extern void end_catch_block PROTO((void)); extern void expand_throw PROTO((tree)); -extern void build_exception_table PROTO((void)); +extern int build_exception_table PROTO((void)); extern tree build_throw PROTO((tree)); extern void init_exception_processing PROTO((void)); @@ -2091,7 +2095,7 @@ extern void reinit_parse_for_method PROTO((int, tree)); #if 0 extern void reinit_parse_for_block PROTO((int, struct obstack *, int)); #endif -extern tree cons_up_default_function PROTO((tree, tree, tree, int)); +extern tree cons_up_default_function PROTO((tree, tree, int)); extern void check_for_missing_semicolon PROTO((tree)); extern void note_got_semicolon PROTO((tree)); extern void note_list_got_semicolon PROTO((tree)); @@ -2141,6 +2145,7 @@ extern void clear_anon_parm_name PROTO((void)); extern void do_inline_function_hair PROTO((tree, tree)); /* skip report_type_mismatch */ extern char *build_overload_name PROTO((tree, int, int)); +extern tree build_static_name PROTO((tree, tree)); extern tree cplus_exception_name PROTO((tree)); extern tree build_decl_overload PROTO((tree, tree, int)); extern tree build_typename_overload PROTO((tree)); @@ -2254,7 +2259,6 @@ extern tree copy_binfo PROTO((tree)); extern tree binfo_value PROTO((tree, tree)); extern tree reverse_path PROTO((tree)); extern tree virtual_member PROTO((tree, tree)); -extern tree virtual_offset PROTO((tree, tree, tree)); extern void debug_binfo PROTO((tree)); extern int decl_list_length PROTO((tree)); extern int count_functions PROTO((tree)); @@ -2360,7 +2364,7 @@ extern void GNU_xref_end PROTO((int)); extern void GNU_xref_file PROTO((char *)); extern void GNU_xref_start_scope PROTO((HOST_WIDE_INT)); extern void GNU_xref_end_scope PROTO((HOST_WIDE_INT, HOST_WIDE_INT, int, int, int)); -extern void GNU_xref_def PROTO((tree, char *)); +extern void GNU_xref_ref PROTO((tree, char *)); extern void GNU_xref_decl PROTO((tree, tree)); extern void GNU_xref_call PROTO((tree, char *)); extern void GNU_xref_function PROTO((tree, tree)); diff --git a/gnu/usr.bin/cc/cc1plus/cvt.c b/gnu/usr.bin/cc/cc1plus/cvt.c index cb8d968..7777350 100644 --- a/gnu/usr.bin/cc/cc1plus/cvt.c +++ b/gnu/usr.bin/cc/cc1plus/cvt.c @@ -304,7 +304,7 @@ build_up_reference (type, arg, flags, checkconst) /* Pass along const and volatile down into the type. */ if (TYPE_READONLY (type) || TYPE_VOLATILE (type)) - target_type = c_build_type_variant (target_type, TYPE_READONLY (type), + target_type = cp_build_type_variant (target_type, TYPE_READONLY (type), TYPE_VOLATILE (type)); targ = arg; if (TREE_CODE (targ) == SAVE_EXPR) @@ -425,10 +425,11 @@ build_up_reference (type, arg, flags, checkconst) break; case PARM_DECL: +#if 0 if (targ == current_class_decl) { error ("address of `this' not available"); -#if 0 +/* #if 0 */ /* This code makes the following core dump the compiler on a sun4, if the code below is used. @@ -465,16 +466,18 @@ build_up_reference (type, arg, flags, checkconst) TREE_ADDRESSABLE (targ) = 1; /* so compiler doesn't die later */ put_var_into_stack (targ); break; -#else +/* #else */ return error_mark_node; -#endif +/* #endif */ } +#endif /* Fall through. */ case VAR_DECL: case CONST_DECL: - if (DECL_REGISTER (targ) && !TREE_ADDRESSABLE (targ)) - warning ("address needed to build reference for `%s', which is declared `register'", - IDENTIFIER_POINTER (DECL_NAME (targ))); + if (DECL_REGISTER (targ) && !TREE_ADDRESSABLE (targ) + && !DECL_ARTIFICIAL (targ)) + cp_warning ("address needed to build reference for `%D', which is declared `register'", + targ); else if (staticp (targ)) literal_flag = 1; @@ -491,6 +494,8 @@ build_up_reference (type, arg, flags, checkconst) return rval; } + case PREINCREMENT_EXPR: + case PREDECREMENT_EXPR: case MODIFY_EXPR: case INIT_EXPR: { @@ -631,7 +636,7 @@ convert_to_reference (reftype, expr, convtype, flags, decl) { int r = TREE_READONLY (expr); int v = TREE_THIS_VOLATILE (expr); - ttr = c_build_type_variant (TREE_TYPE (expr), r, v); + ttr = cp_build_type_variant (TREE_TYPE (expr), r, v); } if (! lvalue_p (expr) && @@ -1206,6 +1211,9 @@ cp_convert (type, expr, convtype, flags) else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE) e = convert_from_reference (e); + if (TREE_CODE (e) == OFFSET_REF) + e = resolve_offset_ref (e); + if (TREE_READONLY_DECL_P (e)) e = decl_constant_value (e); @@ -1223,18 +1231,13 @@ cp_convert (type, expr, convtype, flags) if (flag_pedantic_errors) return error_mark_node; } - if (form == OFFSET_TYPE) - cp_error_at ("pointer-to-member expression object not composed with type `%D' object", - TYPE_NAME (TYPE_OFFSET_BASETYPE (intype))); - else if (IS_AGGR_TYPE (intype)) + if (IS_AGGR_TYPE (intype)) { tree rval; rval = build_type_conversion (CONVERT_EXPR, type, e, 1); - if (rval) return rval; - if (code == BOOLEAN_TYPE) - cp_error ("`%#T' used where a `bool' was expected", intype); - else - cp_error ("`%#T' used where an `int' was expected", intype); + if (rval) + return rval; + cp_error ("`%#T' used where a `%T' was expected", intype, type); return error_mark_node; } if (code == BOOLEAN_TYPE) @@ -2021,11 +2024,16 @@ type_promotes_to (type) wider. */ else if (TREE_CODE (type) == ENUMERAL_TYPE || type == wchar_type_node) - type = type_for_size - (MAX (TYPE_PRECISION (type), TYPE_PRECISION (integer_type_node)), - (flag_traditional - || (TYPE_PRECISION (type) >= TYPE_PRECISION (integer_type_node))) - && TREE_UNSIGNED (type)); + { + int precision = MAX (TYPE_PRECISION (type), + TYPE_PRECISION (integer_type_node)); + tree totype = type_for_size (precision, 0); + if (TREE_UNSIGNED (type) + && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype)) + type = type_for_size (precision, 1); + else + type = totype; + } else if (C_PROMOTING_INTEGER_TYPE_P (type)) { /* Traditionally, unsignedness is preserved in default promotions. @@ -2040,5 +2048,5 @@ type_promotes_to (type) else if (type == float_type_node) type = double_type_node; - return c_build_type_variant (type, constp, volatilep); + return cp_build_type_variant (type, constp, volatilep); } diff --git a/gnu/usr.bin/cc/cc1plus/decl.c b/gnu/usr.bin/cc/cc1plus/decl.c index 0690340..048ce5e 100644 --- a/gnu/usr.bin/cc/cc1plus/decl.c +++ b/gnu/usr.bin/cc/cc1plus/decl.c @@ -162,6 +162,8 @@ tree wchar_type_node; tree signed_wchar_type_node; tree unsigned_wchar_type_node; +tree wchar_decl_node; + tree float_type_node; tree double_type_node; tree long_double_type_node; @@ -401,6 +403,11 @@ extern int flag_short_double; extern int flag_no_builtin; +/* Nonzero means don't recognize the non-ANSI builtin functions. + -ansi sets this. */ + +extern int flag_no_nonansi_builtin; + /* Nonzero means disable GNU extensions. */ extern int flag_ansi; @@ -1743,6 +1750,7 @@ pushtag (name, type, globalize) #else d = build_decl (TYPE_DECL, name, type); #endif + SET_DECL_ARTIFICIAL (d); #ifdef DWARF_DEBUGGING_INFO if (write_symbols == DWARF_DEBUG) { @@ -1778,6 +1786,7 @@ pushtag (name, type, globalize) /* Make nested declarations go into class-level scope. */ newdecl = 1; d = build_decl (TYPE_DECL, name, type); + SET_DECL_ARTIFICIAL (d); #ifdef DWARF_DEBUGGING_INFO if (write_symbols == DWARF_DEBUG) { @@ -1981,11 +1990,11 @@ decls_match (newdecl, olddecl) for (i = 0; i < len; i++) { - tree newarg = TREE_VEC_ELT (newargs, i); - tree oldarg = TREE_VEC_ELT (oldargs, i); + tree newarg = TREE_VALUE (TREE_VEC_ELT (newargs, i)); + tree oldarg = TREE_VALUE (TREE_VEC_ELT (oldargs, i)); if (TREE_CODE (newarg) != TREE_CODE (oldarg)) return 0; - else if (TREE_CODE (newarg) == IDENTIFIER_NODE) + else if (TREE_CODE (newarg) == TYPE_DECL) /* continue */; else if (! comptypes (TREE_TYPE (newarg), TREE_TYPE (oldarg), 1)) return 0; @@ -2104,6 +2113,7 @@ duplicate_decls (newdecl, olddecl) after implicit decl. */ ; else if (TREE_CODE (olddecl) == FUNCTION_DECL + && DECL_ARTIFICIAL (olddecl) && (DECL_BUILT_IN (olddecl) || DECL_BUILT_IN_NONANSI (olddecl))) { /* If you declare a built-in or predefined function name as static, @@ -2188,9 +2198,8 @@ duplicate_decls (newdecl, olddecl) newdecl); cp_error_at ("previous declaration `%#D' here", olddecl); } - - if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), - TYPE_ARG_TYPES (TREE_TYPE (olddecl)), 2)) + else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), + TYPE_ARG_TYPES (TREE_TYPE (olddecl)), 2)) { cp_error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); @@ -2199,16 +2208,21 @@ duplicate_decls (newdecl, olddecl) return 0; } + if (olddecl == wchar_decl_node) + { + if (pedantic && ! DECL_IN_SYSTEM_HEADER (newdecl)) + cp_pedwarn ("redeclaration of wchar_t as `%T'", + TREE_TYPE (newdecl)); + + /* Throw away the redeclaration. */ + return 1; + } + /* Already complained about this, so don't do so again. */ else if (current_class_type == NULL_TREE || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) { - /* Since we're doing this before finish_struct can set the - line number on NEWDECL, we just do a regular error here. */ - if (DECL_SOURCE_LINE (newdecl) == 0) - cp_error ("conflicting types for `%#D'", newdecl); - else - cp_error_at ("conflicting types for `%#D'", newdecl); + cp_error ("conflicting types for `%#D'", newdecl); cp_error_at ("previous declaration as `%#D'", olddecl); } } @@ -2521,12 +2535,15 @@ duplicate_decls (newdecl, olddecl) DECL_TEMPLATE_MEMBERS (newdecl) = DECL_TEMPLATE_MEMBERS (olddecl); DECL_TEMPLATE_INSTANTIATIONS (newdecl) = DECL_TEMPLATE_INSTANTIATIONS (olddecl); + if (DECL_CHAIN (newdecl) == NULL_TREE) + DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl); } /* Now preserve various other info from the definition. */ TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl); TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl); DECL_COMMON (newdecl) = DECL_COMMON (olddecl); + DECL_ASSEMBLER_NAME (newdecl) = DECL_ASSEMBLER_NAME (olddecl); /* Don't really know how much of the language-specific values we should copy from old to new. */ @@ -2678,7 +2695,8 @@ pushdecl (x) /* don't do anything just yet */; else if (TREE_CODE (t) != TREE_CODE (x)) { - if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (x) == TYPE_DECL) + if ((TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)) + || (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x))) { /* We do nothing special here, because C++ does such nasty things with TYPE_DECLs. Instead, just let the TYPE_DECL @@ -3892,7 +3910,9 @@ lookup_name_real (name, prefer_type, nonclass) if (got_scope != NULL_TREE) { - if (got_scope == void_type_node) + if (got_scope == error_mark_node) + return error_mark_node; + else if (got_scope == void_type_node) val = IDENTIFIER_GLOBAL_VALUE (name); else if (TREE_CODE (got_scope) == TEMPLATE_TYPE_PARM /* TFIXME -- don't do this for UPTs in new model. */ @@ -4540,14 +4560,29 @@ init_decl_processing () sizetype, endlink)), BUILT_IN_ALLOCA, "alloca"); -#if 0 - builtin_function ("alloca", - build_function_type (ptr_type_node, - tree_cons (NULL_TREE, - sizetype, - endlink)), - BUILT_IN_ALLOCA, NULL_PTR); -#endif + /* Define alloca, ffs as builtins. + Declare _exit just to mark it as volatile. */ + if (! flag_no_builtin && !flag_no_nonansi_builtin) + { + temp = builtin_function ("alloca", + build_function_type (ptr_type_node, + tree_cons (NULL_TREE, + sizetype, + endlink)), + BUILT_IN_ALLOCA, NULL_PTR); + /* Suppress error if redefined as a non-function. */ + DECL_BUILT_IN_NONANSI (temp) = 1; + temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); + /* Suppress error if redefined as a non-function. */ + DECL_BUILT_IN_NONANSI (temp) = 1; + temp = builtin_function ("_exit", build_function_type (void_type_node, + int_endlink), + NOT_BUILT_IN, NULL_PTR); + TREE_THIS_VOLATILE (temp) = 1; + TREE_SIDE_EFFECTS (temp) = 1; + /* Suppress error if redefined as a non-function. */ + DECL_BUILT_IN_NONANSI (temp) = 1; + } builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR); @@ -4647,6 +4682,23 @@ init_decl_processing () builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, NULL_PTR); builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR); builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR); + + /* Declare these functions volatile + to avoid spurious "control drops through" warnings. */ + temp = builtin_function ("abort", + build_function_type (void_type_node, endlink), + NOT_BUILT_IN, NULL_PTR); + TREE_THIS_VOLATILE (temp) = 1; + TREE_SIDE_EFFECTS (temp) = 1; + /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on + them... */ + DECL_BUILT_IN_NONANSI (temp) = 1; + temp = builtin_function ("exit", build_function_type (void_type_node, + int_endlink), + NOT_BUILT_IN, NULL_PTR); + TREE_THIS_VOLATILE (temp) = 1; + TREE_SIDE_EFFECTS (temp) = 1; + DECL_BUILT_IN_NONANSI (temp) = 1; } #if 0 @@ -4708,6 +4760,11 @@ init_decl_processing () : signed_wchar_type_node; record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node); + /* Artificial declaration of wchar_t -- can be bashed */ + wchar_decl_node = build_decl (TYPE_DECL, get_identifier ("wchar_t"), + wchar_type_node); + pushdecl (wchar_decl_node); + /* This is for wide string constants. */ wchar_array_type_node = build_array_type (wchar_type_node, array_domain_type); @@ -4758,7 +4815,7 @@ init_decl_processing () vtbl_type_node = build_array_type (vtable_entry_type, NULL_TREE); layout_type (vtbl_type_node); - vtbl_type_node = c_build_type_variant (vtbl_type_node, 1, 0); + vtbl_type_node = cp_build_type_variant (vtbl_type_node, 1, 0); record_builtin_type (RID_MAX, NULL_PTR, vtbl_type_node); /* Simplify life by making a "sigtable_entry_type". Give its @@ -4928,7 +4985,7 @@ init_decl_processing () NOT_BUILT_IN); abort_fndecl - = define_function ("abort", + = define_function ("__pure_virtual", build_function_type (void_type_node, void_list_node), NOT_BUILT_IN, 0, 0); @@ -5010,7 +5067,6 @@ shadow_tag (declspecs) tree declspecs; { int found_tag = 0; - int warned = 0; tree ob_modifier = NULL_TREE; register tree link; register enum tree_code code, ok_code = ERROR_MARK; @@ -5023,41 +5079,14 @@ shadow_tag (declspecs) code = TREE_CODE (value); if (IS_AGGR_TYPE_CODE (code) || code == ENUMERAL_TYPE) { - register tree name = TYPE_NAME (value); + my_friendly_assert (TYPE_NAME (value) != NULL_TREE, 261); if (code == ENUMERAL_TYPE && TYPE_SIZE (value) == 0) cp_error ("forward declaration of `%#T'", value); - if (name == NULL_TREE) - name = lookup_tag_reverse (value, NULL_TREE); - - if (name && TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - - t = lookup_tag (code, name, inner_binding_level, 1); - - if (t == NULL_TREE) - { - push_obstacks (&permanent_obstack, &permanent_obstack); - if (IS_AGGR_TYPE_CODE (code)) - t = make_lang_type (code); - else - t = make_node (code); - pushtag (name, t, 0); - pop_obstacks (); - ok_code = code; - } - else if (name != NULL_TREE || code == ENUMERAL_TYPE) - ok_code = code; - - if (ok_code != ERROR_MARK) - found_tag++; - else - { - if (!warned) - pedwarn ("useless keyword or type name in declaration"); - warned = 1; - } + t = value; + ok_code = code; + found_tag++; } else if (value == ridpointers[(int) RID_STATIC] || value == ridpointers[(int) RID_EXTERN] @@ -5097,32 +5126,9 @@ shadow_tag (declspecs) cp_error ("`%D' can only be specified for objects and functions", ob_modifier); - if (ok_code == RECORD_TYPE - && found_tag == 1 - && TYPE_LANG_SPECIFIC (t) - && CLASSTYPE_DECLARED_EXCEPTION (t)) - { - if (TYPE_SIZE (t)) - cp_error ("redeclaration of exception `%T'", t); - else - { - tree ename, decl; - - push_obstacks (&permanent_obstack, &permanent_obstack); - - pushclass (t, 0); - - ename = TYPE_NAME (t); - if (TREE_CODE (ename) == TYPE_DECL) - ename = DECL_NAME (ename); - decl = build_lang_field_decl (VAR_DECL, ename, t); - - pop_obstacks (); - } - } - else if (found_tag == 0) + if (found_tag == 0) pedwarn ("abstract declarator used as declaration"); - else if (!warned && found_tag > 1) + else if (found_tag > 1) pedwarn ("multiple types in one declaration"); } } @@ -5255,8 +5261,7 @@ start_decl (declarator, declspecs, initialized, raises) if (interface_unknown && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl)) warn_if_unknown_interface (); - TREE_PUBLIC (d) = TREE_PUBLIC (decl) = - flag_external_templates && !interface_unknown; + TREE_PUBLIC (d) = TREE_PUBLIC (decl); TREE_STATIC (d) = TREE_STATIC (decl); DECL_EXTERNAL (d) = (DECL_EXTERNAL (decl) && !(context && !DECL_THIS_EXTERN (decl))); @@ -5714,6 +5719,14 @@ finish_decl (decl, init, asmspec_tree, need_pop) type = TREE_TYPE (decl); + if (type == error_mark_node) + { + if (current_binding_level == global_binding_level && temporary) + end_temporary_allocation (); + + return; + } + was_incomplete = (DECL_SIZE (decl) == NULL_TREE); /* Take care of TYPE_DECLs up front. */ @@ -5808,6 +5821,10 @@ finish_decl (decl, init, asmspec_tree, need_pop) else if (TREE_CODE (type) == REFERENCE_TYPE || (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE_REFERENCE (type))) { + if (TREE_STATIC (decl)) + make_decl_rtl (decl, NULL_PTR, + current_binding_level == global_binding_level + || pseudo_global_level_p ()); grok_reference_init (decl, type, init, &cleanup); init = NULL_TREE; } @@ -6315,9 +6332,11 @@ finish_decl (decl, init, asmspec_tree, need_pop) expand_aggr_init (decl, init, 0); } - /* Set this to 0 so we can tell whether an aggregate - which was initialized was ever used. */ - if (TYPE_NEEDS_CONSTRUCTING (type)) + /* Set this to 0 so we can tell whether an aggregate which + was initialized was ever used. Don't do this if it has a + destructor, so we don't complain about the 'resource + allocation is initialization' idiom. */ + if (TYPE_NEEDS_CONSTRUCTING (type) && cleanup == NULL_TREE) TREE_USED (decl) = 0; /* Store the cleanup, if there was one. */ @@ -6792,6 +6811,7 @@ grokvardecl (type, declarator, specbits, initialized) decl = build_lang_field_decl (VAR_DECL, declarator, type); DECL_CONTEXT (decl) = basetype; DECL_CLASS_CONTEXT (decl) = basetype; + DECL_ASSEMBLER_NAME (decl) = build_static_name (basetype, declarator); } else decl = build_decl (VAR_DECL, declarator, type); @@ -6857,6 +6877,8 @@ build_ptrmemfunc_type (type) /* Let the front-end know this is a pointer to member function. */ TYPE_PTRMEMFUNC_FLAG(t) = 1; + /* and not really an aggregate. */ + IS_AGGR_TYPE (t) = 0; fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, delta_type_node); @@ -7091,7 +7113,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) dname = decl; decl = NULL_TREE; - if (IDENTIFIER_OPNAME_P (dname)) + if (! IDENTIFIER_OPNAME_P (dname) + /* Linux headers use '__op'. Arrgh. */ + || IDENTIFIER_TYPENAME_P (dname) && ! TREE_TYPE (dname)) + name = IDENTIFIER_POINTER (dname); + else { if (IDENTIFIER_TYPENAME_P (dname)) { @@ -7102,8 +7128,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) } name = operator_name_string (dname); } - else - name = IDENTIFIER_POINTER (dname); break; case RECORD_TYPE: @@ -7281,7 +7305,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) goto found; } - for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++) + for (i = (int) RID_FIRST_MODIFIER; i <= (int) RID_LAST_MODIFIER; i++) { if (ridpointers[i] == id) { @@ -7521,10 +7545,13 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) volatilep = !! RIDBIT_SETP (RID_VOLATILE, specbits) + TYPE_VOLATILE (type); staticp = 0; inlinep = !! RIDBIT_SETP (RID_INLINE, specbits); +#if 0 + /* This sort of redundancy is blessed in a footnote to the Sep 94 WP. */ if (constp > 1) warning ("duplicate `const'"); if (volatilep > 1) warning ("duplicate `volatile'"); +#endif virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits); if (RIDBIT_SETP (RID_STATIC, specbits)) @@ -7688,17 +7715,13 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) break; } - if (scanner == IDENTIFIER_AS_LIST (ridpointers [(int) RID_TYPEDEF])) - { - if (previous_declspec) - TREE_CHAIN (previous_declspec) - = IDENTIFIER_AS_LIST (ridpointers [(int) RID_STATIC]); - else - declspecs - = IDENTIFIER_AS_LIST (ridpointers [(int) RID_STATIC]); - } + if (previous_declspec) + TREE_CHAIN (previous_declspec) = TREE_CHAIN (scanner); else - TREE_VALUE (scanner) = ridpointers[(int) RID_STATIC]; + declspecs = TREE_CHAIN (scanner); + + declspecs = tree_cons (NULL_TREE, ridpointers[(int) RID_STATIC], + declspecs); /* In the recursive call to grokdeclarator we need to know whether we are working on a signature-local typedef. */ @@ -7707,6 +7730,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) loc_typedecl = grokdeclarator (declarator, declspecs, FIELD, 0, NULL_TREE); + + if (previous_declspec) + TREE_CHAIN (previous_declspec) = scanner; if (loc_typedecl != error_mark_node) { @@ -7714,6 +7740,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) register int *pi; TREE_SET_CODE (loc_typedecl, TYPE_DECL); + /* This is the same field as DECL_ARGUMENTS, which is set for + function typedefs by the above grokdeclarator. */ + DECL_NESTED_TYPENAME (loc_typedecl) = 0; pi = (int *) permalloc (sizeof (struct lang_decl_flags)); while (i > 0) @@ -7983,7 +8012,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) type = build_cplus_array_type (type, itype); if (constp || volatilep) - type = c_build_type_variant (type, constp, volatilep); + type = cp_build_type_variant (type, constp, volatilep); ctype = NULL_TREE; } @@ -7992,6 +8021,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) case CALL_EXPR: { tree arg_types; + int funcdecl_p; + tree inner_parms = TREE_OPERAND (declarator, 1); + tree inner_decl = TREE_OPERAND (declarator, 0); /* Declaring a function type. Make sure we have a valid type for the function to return. */ @@ -8005,7 +8037,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) if (constp || volatilep) { - type = c_build_type_variant (type, constp, volatilep); + type = cp_build_type_variant (type, constp, volatilep); if (IS_AGGR_TYPE (type)) build_pointer_type (type); constp = 0; @@ -8026,8 +8058,17 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) type = integer_type_node; } + if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF) + inner_decl = TREE_OPERAND (inner_decl, 1); + + /* Say it's a definition only for the CALL_EXPR + closest to the identifier. */ + funcdecl_p = + inner_decl && TREE_CODE (inner_decl) == IDENTIFIER_NODE; + if (ctype == NULL_TREE && decl_context == FIELD + && funcdecl_p && (friendp == 0 || dname == current_class_name)) ctype = current_class_type; @@ -8141,27 +8182,12 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) /* Construct the function type and go to the next inner layer of declarator. */ - { - int funcdef_p; - tree inner_parms = TREE_OPERAND (declarator, 1); - tree inner_decl = TREE_OPERAND (declarator, 0); - - declarator = TREE_OPERAND (declarator, 0); - - if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF) - inner_decl = TREE_OPERAND (inner_decl, 1); - - /* Say it's a definition only for the CALL_EXPR - closest to the identifier. */ - funcdef_p = - (inner_decl && TREE_CODE (inner_decl) == IDENTIFIER_NODE) - ? funcdef_flag : 0; + declarator = TREE_OPERAND (declarator, 0); - /* FIXME: This is where default args should be fully - processed. */ + /* FIXME: This is where default args should be fully + processed. */ - arg_types = grokparms (inner_parms, funcdef_p); - } + arg_types = grokparms (inner_parms, funcdecl_p ? funcdef_flag : 0); if (declarator) { @@ -8216,7 +8242,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) signature pointer/reference itself. */ if (! IS_SIGNATURE (type)) { - type = c_build_type_variant (type, constp, volatilep); + type = cp_build_type_variant (type, constp, volatilep); if (IS_AGGR_TYPE (type)) build_pointer_type (type); constp = 0; @@ -8511,7 +8537,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) /* Note that the grammar rejects storage classes in typenames, fields or parameters. */ if (constp || volatilep) - type = c_build_type_variant (type, constp, volatilep); + type = cp_build_type_variant (type, constp, volatilep); /* If the user declares "struct {...} foo" then `foo' will have an anonymous name. Fill that name in now. Nothing can @@ -8600,7 +8626,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) if (IS_SIGNATURE (type)) error ("`const' or `volatile' specified with signature type"); else - type = c_build_type_variant (type, constp, volatilep); + type = cp_build_type_variant (type, constp, volatilep); /* Special case: "friend class foo" looks like a TYPENAME context. */ if (friendp) @@ -8682,7 +8708,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) { /* Transfer const-ness of array into that of type pointed to. */ type = build_pointer_type - (c_build_type_variant (TREE_TYPE (type), constp, volatilep)); + (cp_build_type_variant (TREE_TYPE (type), constp, volatilep)); volatilep = constp = 0; } else if (TREE_CODE (type) == FUNCTION_TYPE) @@ -8961,14 +8987,10 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), TREE_TYPE (type), TYPE_ARG_TYPES (type)); - /* Record presence of `static'. In C++, `inline' is like `static'. - Methods of classes should be public, unless we're dropping them - into some other file, so we don't clear TREE_PUBLIC for them. */ + /* Record presence of `static'. In C++, `inline' is like `static'. */ publicp - = ((ctype - && CLASSTYPE_INTERFACE_KNOWN (ctype)) - || !(RIDBIT_SETP (RID_STATIC, specbits) - || RIDBIT_SETP (RID_INLINE, specbits))); + = !(RIDBIT_SETP (RID_STATIC, specbits) + || RIDBIT_SETP (RID_INLINE, specbits)); decl = grokfndecl (ctype, type, original_name, virtualp, flags, quals, @@ -8989,7 +9011,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) declaring main to be static. */ if (TREE_CODE (type) == METHOD_TYPE) { - cp_error_at ("cannot declare member function `%D' to have static linkage", decl); + cp_pedwarn ("cannot declare member function `%D' to have static linkage", decl); illegal_static = 1; } else if (! ctype @@ -9791,6 +9813,7 @@ xref_defn_tag (code_type_node, name, binfo) if (! ANON_AGGRNAME_P (name)) { register tree type_decl = build_decl (TYPE_DECL, ncp, rv); + SET_DECL_ARTIFICIAL (type_decl); #ifdef DWARF_DEBUGGING_INFO /* Mark the TYPE_DECL node created just above as a gratuitous one so that dwarfout.c will know not to generate a TAG_typedef DIE @@ -9939,48 +9962,21 @@ xref_tag (code_type_node, name, binfo, globalize) } else { - extern tree pending_vtables; struct binding_level *old_b = class_binding_level; - int needs_writing; ref = make_lang_type (code); - /* A signature type will contain the fields of the signature - table. Therefore, it's not only an interface. */ if (tag_code == signature_type) { SET_SIGNATURE (ref); + /* Since a signature type will be turned into the type + of signature tables, it's not only an interface. */ CLASSTYPE_INTERFACE_ONLY (ref) = 0; - CLASSTYPE_INTERFACE_UNKNOWN (ref) = 0; - } - - /* Record how to set the access of this class's - virtual functions. If write_virtuals == 2 or 3, then - inline virtuals are ``extern inline''. */ - switch (write_virtuals) - { - case 0: - case 1: - needs_writing = 1; - break; - case 2: - needs_writing = !! value_member (name, pending_vtables); - break; - case 3: - needs_writing = ! CLASSTYPE_INTERFACE_ONLY (ref) - && CLASSTYPE_INTERFACE_KNOWN (ref); - break; - default: - needs_writing = 0; + SET_CLASSTYPE_INTERFACE_KNOWN (ref); + /* A signature doesn't have a vtable. */ + CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = 0; } - /* Signatures don't have a vtable. As long as we don't have default - implementations, they behave as if `write_virtuals' were 3. */ - if (tag_code == signature_type) - CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = 0; - else - CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = needs_writing; - #ifdef NONNESTED_CLASSES /* Class types don't nest the way enums do. */ class_binding_level = (struct binding_level *)0; @@ -10108,6 +10104,7 @@ xref_tag (code_type_node, name, binfo, globalize) TREE_VIA_PUBLIC (base_binfo) = via_public; TREE_VIA_PROTECTED (base_binfo) = via_protected; TREE_VIA_VIRTUAL (base_binfo) = via_virtual; + BINFO_INHERITANCE_CHAIN (base_binfo) = TYPE_BINFO (ref); SET_CLASSTYPE_MARKED (basetype); #if 0 @@ -10209,6 +10206,7 @@ start_enum (name) TREE_ADDRESSABLE (b->tags) = 1; current_local_enum = NULL_TREE; +#if 0 /* This stuff gets cleared in finish_enum anyway. */ if (TYPE_VALUES (enumtype) != NULL_TREE) /* Completely replace its old definition. The old enumerators remain defined, however. */ @@ -10221,7 +10219,8 @@ start_enum (name) TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node); TYPE_SIZE (enumtype) = NULL_TREE; - fixup_unsigned_type (enumtype); + fixup_signed_type (enumtype); +#endif /* We copy this value because enumerated type constants are really of the type of the enumerator, not integer_type_node. */ @@ -10241,84 +10240,89 @@ tree finish_enum (enumtype, values) register tree enumtype, values; { - register tree pair, tem; - register HOST_WIDE_INT maxvalue = 0; - register HOST_WIDE_INT minvalue = 0; - register HOST_WIDE_INT i; - + register tree minnode, maxnode; /* Calculate the maximum value of any enumerator in this type. */ if (values) { + register tree pair; + register tree value = DECL_INITIAL (TREE_VALUE (values)); + /* Speed up the main loop by performing some precalculations */ - - HOST_WIDE_INT value; TREE_TYPE (TREE_VALUE (values)) = enumtype; - TREE_TYPE (DECL_INITIAL (TREE_VALUE (values))) = enumtype; - TREE_VALUE (values) = DECL_INITIAL (TREE_VALUE (values)); - value = TREE_INT_CST_LOW (TREE_VALUE (values)); - minvalue = maxvalue = value; + TREE_TYPE (value) = enumtype; + TREE_VALUE (values) = value; + minnode = maxnode = value; for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair)) { + value = DECL_INITIAL (TREE_VALUE (pair)); TREE_TYPE (TREE_VALUE (pair)) = enumtype; - TREE_TYPE (DECL_INITIAL (TREE_VALUE (pair))) = enumtype; - TREE_VALUE (pair) = DECL_INITIAL (TREE_VALUE (pair)); - value = TREE_INT_CST_LOW (TREE_VALUE (pair)); - if (value > maxvalue) - maxvalue = value; - else if (value < minvalue) - minvalue = value; + TREE_TYPE (value) = enumtype; + TREE_VALUE (pair) = value; + if (tree_int_cst_lt (maxnode, value)) + maxnode = value; + else if (tree_int_cst_lt (value, minnode)) + minnode = value; } } + else + maxnode = minnode = integer_zero_node; TYPE_VALUES (enumtype) = values; - if (flag_short_enums) - { - /* Determine the precision this type needs, lay it out, and define - it. */ - - /* First reset precision */ - TYPE_PRECISION (enumtype) = 0; - - for (i = maxvalue; i; i >>= 1) - TYPE_PRECISION (enumtype)++; - - if (!TYPE_PRECISION (enumtype)) - TYPE_PRECISION (enumtype) = 1; - - /* Cancel the laying out previously done for the enum type, - so that fixup_unsigned_type will do it over. */ - TYPE_SIZE (enumtype) = NULL_TREE; + { + int unsignedp = tree_int_cst_sgn (minnode) >= 0; + int lowprec = min_precision (minnode, unsignedp); + int highprec = min_precision (maxnode, unsignedp); + int precision = MAX (lowprec, highprec); + + if (! flag_short_enums && precision < TYPE_PRECISION (integer_type_node)) + precision = TYPE_PRECISION (integer_type_node); + + + /* + * The following code is unnecessary since the function + * type_promotes_to deals correctly with promotion of enums of + * underlying unsigned types to signed integer types. + * Moreover, it causes an enum bitfield to require one more bit of + * storage than defined by the ANSI/ISO C++ resolution section r.7.2 + * which defines the range of an enum. + */ +#if 0 + /* Unlike the C frontend, we prefer signed types. */ + if (unsignedp && int_fits_type_p (maxnode, type_for_size (precision, 0))) + unsignedp = 0; +#endif + TYPE_PRECISION (enumtype) = precision; + TYPE_SIZE (enumtype) = NULL_TREE; + if (unsignedp) fixup_unsigned_type (enumtype); - } - - TREE_INT_CST_LOW (TYPE_MAX_VALUE (enumtype)) = maxvalue; + else + fixup_signed_type (enumtype); + } - /* An enum can have some negative values; then it is signed. */ - if (minvalue < 0) - { - TREE_INT_CST_LOW (TYPE_MIN_VALUE (enumtype)) = minvalue; - TREE_INT_CST_HIGH (TYPE_MIN_VALUE (enumtype)) = -1; - TREE_UNSIGNED (enumtype) = 0; - } if (flag_cadillac) cadillac_finish_enum (enumtype); - /* Fix up all variant types of this enum type. */ - for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem)) - { - TYPE_VALUES (tem) = TYPE_VALUES (enumtype); - TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); - TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); - TYPE_SIZE (tem) = TYPE_SIZE (enumtype); - TYPE_MODE (tem) = TYPE_MODE (enumtype); - TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); - TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); - TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); - } + { + register tree tem; + + /* Fix up all variant types of this enum type. */ + for (tem = TYPE_MAIN_VARIANT (enumtype); tem; + tem = TYPE_NEXT_VARIANT (tem)) + { + TYPE_VALUES (tem) = TYPE_VALUES (enumtype); + TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); + TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); + TYPE_SIZE (tem) = TYPE_SIZE (enumtype); + TYPE_MODE (tem) = TYPE_MODE (enumtype); + TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); + TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); + TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); + } + } /* Finish debugging output for this type. */ #if 0 @@ -10678,15 +10682,14 @@ start_function (declspecs, declarator, raises, pre_parsed_p) /* If this function belongs to an interface, it is public. If it belongs to someone else's interface, it is also external. It doesn't matter whether it's inline or not. */ - if (interface_unknown == 0) + if (interface_unknown == 0 + && ! TREE_PUBLIC (decl1)) { TREE_PUBLIC (decl1) = 1; DECL_EXTERNAL (decl1) = (interface_only || (DECL_INLINE (decl1) && ! flag_implement_inlines)); } - else if (DECL_EXPLICIT_INSTANTIATION (decl1)) - /* PUBLIC and EXTERNAL set by do_*_instantiation */; else { /* This is a definition, not a reference. @@ -10695,7 +10698,10 @@ start_function (declspecs, declarator, raises, pre_parsed_p) defining how to inline. So set DECL_EXTERNAL in that case. */ DECL_EXTERNAL (decl1) = current_extern_inline; - DECL_DEFER_OUTPUT (decl1) = DECL_INLINE (decl1); + DECL_DEFER_OUTPUT (decl1) + = DECL_INLINE (decl1) && ! TREE_PUBLIC (decl1) + && (DECL_FUNCTION_MEMBER_P (decl1) + || DECL_TEMPLATE_INSTANTIATION (decl1)); } if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1)) @@ -11023,59 +11029,6 @@ store_return_init (return_id, init) } } -#if 0 -/* Generate code for default X() constructor. */ -static void -build_default_constructor (fndecl) - tree fndecl; -{ - int i = CLASSTYPE_N_BASECLASSES (current_class_type); - tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); - tree fields = TYPE_FIELDS (current_class_type); - tree binfos = TYPE_BINFO_BASETYPES (current_class_type); - - if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) - parm = TREE_CHAIN (parm); - parm = DECL_REFERENCE_SLOT (parm); - - while (--i >= 0) - { - tree basetype = TREE_VEC_ELT (binfos, i); - if (TYPE_HAS_INIT_REF (basetype)) - { - tree name = TYPE_NAME (basetype); - if (TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - current_base_init_list = tree_cons (name, parm, current_base_init_list); - } - } - for (; fields; fields = TREE_CHAIN (fields)) - { - tree name, init; - if (TREE_STATIC (fields)) - continue; - if (TREE_CODE (fields) != FIELD_DECL) - continue; - if (DECL_NAME (fields)) - { - if (VFIELD_NAME_P (DECL_NAME (fields))) - continue; - if (VBASE_NAME_P (DECL_NAME (fields))) - continue; - - /* True for duplicate members. */ - if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields) - continue; - } - - init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields); - init = build_tree_list (NULL_TREE, init); - - current_member_init_list - = tree_cons (DECL_NAME (fields), init, current_member_init_list); - } -} -#endif /* Finish up a function declaration and compile that function all the way to assembler language output. The free the storage @@ -11529,20 +11482,19 @@ finish_function (lineno, call_poplevel) /* So we can tell if jump_optimize sets it to 1. */ can_reach_end = 0; - /* ??? Compensate for Sun brain damage in dealing with data segments - of PIC code. */ - if (flag_pic - && (DECL_CONSTRUCTOR_P (fndecl) - || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) - && CLASSTYPE_NEEDS_VIRTUAL_REINIT (TYPE_METHOD_BASETYPE (fntype))) - DECL_INLINE (fndecl) = 0; - if (DECL_EXTERNAL (fndecl) /* This function is just along for the ride. If we can make it inline, that's great. Otherwise, just punt it. */ && (DECL_INLINE (fndecl) == 0 || flag_no_inline - || function_cannot_inline_p (fndecl))) + || function_cannot_inline_p (fndecl) + /* ??? Compensate for Sun brain damage in dealing with + data segments of PIC code. */ + || (flag_pic + && (DECL_CONSTRUCTOR_P (fndecl) + || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) + && CLASSTYPE_NEEDS_VIRTUAL_REINIT (TYPE_METHOD_BASETYPE (fntype))))) + { extern int rtl_dump_and_exit; int old_rtl_dump_and_exit = rtl_dump_and_exit; @@ -11564,8 +11516,8 @@ finish_function (lineno, call_poplevel) rest_of_compilation (fndecl); } - if (DECL_INLINE (fndecl) - && !TREE_ASM_WRITTEN (fndecl) && DECL_FUNCTION_MEMBER_P (fndecl)) + if (DECL_INLINE (fndecl) && !TREE_ASM_WRITTEN (fndecl) + && DECL_DEFER_OUTPUT (fndecl)) { mark_inline_for_output (fndecl); } diff --git a/gnu/usr.bin/cc/cc1plus/decl2.c b/gnu/usr.bin/cc/cc1plus/decl2.c index 2b9f8a7..a50b7bc 100644 --- a/gnu/usr.bin/cc/cc1plus/decl2.c +++ b/gnu/usr.bin/cc/cc1plus/decl2.c @@ -84,6 +84,11 @@ int flag_no_asm; int flag_no_builtin; +/* Nonzero means don't recognize the non-ANSI builtin functions. + -ansi sets this. */ + +int flag_no_nonansi_builtin; + /* Nonzero means do some things the same way PCC does. */ int flag_traditional; @@ -207,6 +212,12 @@ int warn_nonvdtor; /* Non-zero means warn when a function is declared extern and later inline. */ int warn_extern_inline; +/* Non-zero means warn when the compiler will reorder code. */ +int warn_reorder; + +/* Non-zero means warn when sysnthesis behavior differs from Cfront's. */ +int warn_synth; + /* Nonzero means `$' can be in an identifier. See cccp.c for reasons why this breaks some obscure ANSI C programs. */ @@ -320,6 +331,9 @@ int flag_huge_objects; definitions. */ int flag_conserve_space; +/* Nonzero if we want to obey access control semantics. */ +int flag_access_control = 1; + /* Table of language-dependent -f options. STRING is the option name. VARIABLE is the address of the variable. ON_VALUE is the value to store in VARIABLE @@ -361,6 +375,8 @@ static struct { char *string; int *variable; int on_value;} lang_f_options[] = {"conserve-space", &flag_conserve_space, 1}, {"vtable-thunks", &flag_vtable_thunks, 1}, {"short-temps", &flag_short_temps, 1}, + {"access-control", &flag_access_control, 1}, + {"nonansi-builtins", &flag_no_nonansi_builtin, 0} }; /* Decode the string P as a language-specific option. @@ -447,6 +463,10 @@ lang_decode_option (p) flag_alt_external_templates = 0; found = 1; } + else if (!strcmp (p, "ansi-overloading")) + { + warning ("-fansi-overloading is no longer meaningful"); + } else for (j = 0; !found && j < sizeof (lang_f_options) / sizeof (lang_f_options[0]); j++) @@ -511,6 +531,10 @@ lang_decode_option (p) warn_nonvdtor = setting; else if (!strcmp (p, "extern-inline")) warn_extern_inline = setting; + else if (!strcmp (p, "reorder")) + warn_reorder = setting; + else if (!strcmp (p, "synth")) + warn_synth = setting; else if (!strcmp (p, "comment")) ; /* cpp handles this one. */ else if (!strcmp (p, "comments")) @@ -537,6 +561,7 @@ lang_decode_option (p) if (warn_uninitialized != 1) warn_uninitialized = (setting ? 2 : 0); warn_template_debugging = setting; + warn_reorder = setting; } else if (!strcmp (p, "overloaded-virtual")) @@ -544,7 +569,8 @@ lang_decode_option (p) else return 0; } else if (!strcmp (p, "-ansi")) - flag_no_asm = 1, dollars_in_ident = 0, flag_ansi = 1; + flag_no_asm = 1, dollars_in_ident = 0, flag_no_nonansi_builtin = 1, + flag_ansi = 1; #ifdef SPEW_DEBUG /* Undocumented, only ever used when you're invoking cc1plus by hand, since it's probably safe to assume no sane person would ever want to use this @@ -983,7 +1009,7 @@ grok_array_decl (array_expr, index_exp) if (TYPE_LANG_SPECIFIC (type) && TYPE_OVERLOADS_ARRAY_REF (type)) return build_opfncall (ARRAY_REF, LOOKUP_NORMAL, - array_expr, index_exp, NULL_TREE); + array_expr, index_exp, NULL_TREE); /* Otherwise, create an ARRAY_REF for a pointer or array type. */ if (TREE_CODE (type) == POINTER_TYPE @@ -1000,17 +1026,14 @@ grok_array_decl (array_expr, index_exp) || TREE_CODE (type) == REFERENCE_TYPE) type = TREE_TYPE (type); - if (TYPE_LANG_SPECIFIC (type) - && TYPE_OVERLOADS_ARRAY_REF (type)) - error ("array expression backwards"); - else if (TREE_CODE (type) == POINTER_TYPE - || TREE_CODE (type) == ARRAY_TYPE) + if (TREE_CODE (type) == POINTER_TYPE + || TREE_CODE (type) == ARRAY_TYPE) return build_array_ref (index_exp, array_expr); - else - error("`[]' applied to non-pointer type"); - /* We gave an error, so give an error. Huh? */ - return error_mark_node; + /* The expression E1[E2] is identical (by definition) to *((E1)+(E2)). */ + return build_indirect_ref (build_binary_op (PLUS_EXPR, array_expr, + index_exp, 1), + "array indexing"); } /* Given the cast expression EXP, checking out its validity. Either return @@ -1057,11 +1080,20 @@ delete_sanity (exp, size, doing_vec, use_global_delete) return build1 (NOP_EXPR, void_type_node, t); } - /* You can't delete a pointer to constant. */ - if (code == POINTER_TYPE && TREE_READONLY (TREE_TYPE (type))) + if (code == POINTER_TYPE) { - error ("`const *' cannot be deleted"); - return error_mark_node; + /* You can't delete a pointer to constant. */ + if (TREE_READONLY (TREE_TYPE (type))) + { + error ("`const *' cannot be deleted"); + return error_mark_node; + } + /* You also can't delete functions. */ + if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) + { + error ("cannot delete a function"); + return error_mark_node; + } } #if 0 @@ -1128,13 +1160,13 @@ check_classfn (ctype, cname, function) } if (methods != end) - cp_error ("argument list for `%D' does not match any in class `%T'", - fn_name, ctype); + cp_error ("argument list for `%#D' does not match any in class `%T'", + function, ctype); else { methods = 0; - cp_error ("no `%D' member function declared in class `%T'", - fn_name, ctype); + cp_error ("no `%#D' member function declared in class `%T'", + function, ctype); } /* If we did not find the method in the class, add it to @@ -1301,19 +1333,10 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) /* current_class_type can be NULL_TREE in case of error. */ if (asmspec == 0 && current_class_type) { - tree name; - char *buf, *buf2; - - buf2 = build_overload_name (current_class_type, 1, 1); - buf = (char *)alloca (IDENTIFIER_LENGTH (DECL_NAME (value)) - + sizeof (STATIC_NAME_FORMAT) - + strlen (buf2)); - sprintf (buf, STATIC_NAME_FORMAT, buf2, - IDENTIFIER_POINTER (DECL_NAME (value))); - name = get_identifier (buf); TREE_PUBLIC (value) = 1; DECL_INITIAL (value) = error_mark_node; - DECL_ASSEMBLER_NAME (value) = name; + DECL_ASSEMBLER_NAME (value) + = build_static_name (current_class_type, DECL_NAME (value)); } pending_statics = perm_tree_cons (NULL_TREE, value, pending_statics); @@ -1366,9 +1389,11 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) if (DECL_FRIEND_P (value)) return void_type_node; +#if 0 /* Just because a fn is declared doesn't mean we'll try to define it. */ if (current_function_decl && ! IS_SIGNATURE (current_class_type)) cp_error ("method `%#D' of local class must be defined in class body", value); +#endif DECL_IN_AGGR_P (value) = 1; return value; @@ -2067,9 +2092,13 @@ finish_anon_union (anon_union_decl) return; } - while (field) + for (; field; field = TREE_CHAIN (field)) { - tree decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); + tree decl; + if (TREE_CODE (field) != FIELD_DECL) + continue; + + decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); /* tell `pushdecl' that this is not tentative. */ DECL_INITIAL (decl) = error_mark_node; TREE_PUBLIC (decl) = public_p; @@ -2096,12 +2125,19 @@ finish_anon_union (anon_union_decl) TREE_PURPOSE of the following TREE_LIST. */ elems = tree_cons (NULL_TREE, decl, elems); TREE_TYPE (elems) = type; - field = TREE_CHAIN (field); } if (static_p) { - make_decl_rtl (main_decl, 0, global_bindings_p ()); - DECL_RTL (anon_union_decl) = DECL_RTL (main_decl); + if (main_decl) + { + make_decl_rtl (main_decl, 0, global_bindings_p ()); + DECL_RTL (anon_union_decl) = DECL_RTL (main_decl); + } + else + { + warning ("anonymous union with no members"); + return; + } } /* The following call assumes that there are never any cleanups @@ -2522,6 +2558,37 @@ walk_sigtables (typedecl_fn, vardecl_fn) } } +/* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an + inline function at end-of-file. */ + +void +import_export_inline (decl) + tree decl; +{ + if (TREE_PUBLIC (decl)) + return; + + /* If an explicit instantiation doesn't have TREE_PUBLIC set, it was with + 'extern'. */ + if (DECL_EXPLICIT_INSTANTIATION (decl) + || (DECL_IMPLICIT_INSTANTIATION (decl) && ! flag_implicit_templates)) + { + TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) = 1; + } + else if (DECL_FUNCTION_MEMBER_P (decl)) + { + tree ctype = DECL_CLASS_CONTEXT (decl); + if (CLASSTYPE_INTERFACE_KNOWN (ctype)) + { + TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) + = (CLASSTYPE_INTERFACE_ONLY (ctype) + || (DECL_INLINE (decl) && ! flag_implement_inlines)); + } + } +} + extern int parse_time, varconst_time; #define TIMEVAR(VAR, BODY) \ @@ -2541,8 +2608,7 @@ finish_file () tree fnname; tree vars = static_aggregates; int needs_cleaning = 0, needs_messing_up = 0; - - build_exception_table (); + int have_exception_handlers = build_exception_table (); if (flag_detailed_statistics) dump_tree_statistics (); @@ -2636,7 +2702,7 @@ finish_file () mess_up: /* Must do this while we think we are at the top level. */ vars = nreverse (static_aggregates); - if (vars != NULL_TREE) + if (vars != NULL_TREE || have_exception_handlers) { fnname = get_file_function_name ('I'); start_function (void_list_node, build_parse_node (CALL_EXPR, fnname, void_list_node, NULL_TREE), 0, 0); @@ -2648,6 +2714,9 @@ finish_file () push_momentary (); expand_start_bindings (0); + if (have_exception_handlers) + register_exception_table (); + while (vars) { tree decl = TREE_VALUE (vars); @@ -2712,7 +2781,6 @@ finish_file () } } if (IS_AGGR_TYPE (TREE_TYPE (decl)) - || init == 0 || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) expand_aggr_init (decl, init, 0); else if (TREE_CODE (init) == TREE_VEC) @@ -2828,24 +2896,12 @@ finish_file () 0; don't crash. */ if (TREE_ASM_WRITTEN (decl) || DECL_SAVED_INSNS (decl) == 0) continue; - if (DECL_FUNCTION_MEMBER_P (decl) && !TREE_PUBLIC (decl)) - { - tree ctype = DECL_CLASS_CONTEXT (decl); - if (CLASSTYPE_INTERFACE_KNOWN (ctype)) - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) - = (CLASSTYPE_INTERFACE_ONLY (ctype) - || (DECL_INLINE (decl) && ! flag_implement_inlines)); - } - } + import_export_inline (decl); if (TREE_PUBLIC (decl) || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) || flag_keep_inline_functions) { - if (DECL_EXTERNAL (decl) - || (DECL_IMPLICIT_INSTANTIATION (decl) - && ! flag_implicit_templates)) + if (DECL_EXTERNAL (decl)) assemble_external (decl); else { @@ -2872,9 +2928,7 @@ finish_file () if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) && ! TREE_ASM_WRITTEN (decl)) { - if (DECL_EXTERNAL (decl) - || (DECL_IMPLICIT_INSTANTIATION (decl) - && ! flag_implicit_templates)) + if (DECL_EXTERNAL (decl)) assemble_external (decl); else { diff --git a/gnu/usr.bin/cc/cc1plus/errfn.c b/gnu/usr.bin/cc/cc1plus/errfn.c index 1b345fd..2f78164 100644 --- a/gnu/usr.bin/cc/cc1plus/errfn.c +++ b/gnu/usr.bin/cc/cc1plus/errfn.c @@ -30,6 +30,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ typedef char* cp_printer PROTO((HOST_WIDE_INT, int)); extern cp_printer * cp_printers[256]; +/* Whether or not we should try to be quiet for errors and warnings; this is + used to avoid being too talkative about problems with tentative choices + when we're computing the conversion costs for a method call. */ +int cp_silent = 0; + typedef void errorfn (); /* deliberately vague */ extern char* cp_file_of PROTO((tree)); @@ -150,7 +155,8 @@ cp_error (format, arglist) arglist_dcl { extern errorfn error; - cp_thing (error, 0, format, arglist); + if (! cp_silent) + cp_thing (error, 0, format, arglist); } void @@ -159,7 +165,8 @@ cp_warning (format, arglist) arglist_dcl { extern errorfn warning; - cp_thing (warning, 0, format, arglist); + if (! cp_silent) + cp_thing (warning, 0, format, arglist); } void @@ -168,7 +175,8 @@ cp_pedwarn (format, arglist) arglist_dcl { extern errorfn pedwarn; - cp_thing (pedwarn, 0, format, arglist); + if (! cp_silent) + cp_thing (pedwarn, 0, format, arglist); } void @@ -177,7 +185,8 @@ cp_compiler_error (format, arglist) arglist_dcl { extern errorfn compiler_error; - cp_thing (compiler_error, 0, format, arglist); + if (! cp_silent) + cp_thing (compiler_error, 0, format, arglist); } void @@ -195,7 +204,8 @@ cp_error_at (format, arglist) arglist_dcl { extern errorfn error_with_file_and_line; - cp_thing (error_with_file_and_line, 1, format, arglist); + if (! cp_silent) + cp_thing (error_with_file_and_line, 1, format, arglist); } void @@ -204,7 +214,8 @@ cp_warning_at (format, arglist) arglist_dcl { extern errorfn warning_with_file_and_line; - cp_thing (warning_with_file_and_line, 1, format, arglist); + if (! cp_silent) + cp_thing (warning_with_file_and_line, 1, format, arglist); } void @@ -213,5 +224,6 @@ cp_pedwarn_at (format, arglist) arglist_dcl { extern errorfn pedwarn_with_file_and_line; - cp_thing (pedwarn_with_file_and_line, 1, format, arglist); + if (! cp_silent) + cp_thing (pedwarn_with_file_and_line, 1, format, arglist); } diff --git a/gnu/usr.bin/cc/cc1plus/error.c b/gnu/usr.bin/cc/cc1plus/error.c index f431f6a..b826283 100644 --- a/gnu/usr.bin/cc/cc1plus/error.c +++ b/gnu/usr.bin/cc/cc1plus/error.c @@ -104,6 +104,8 @@ dump_readonly_or_volatile (t, p) if (p == before) OB_PUTC (' '); if (TYPE_READONLY (t)) OB_PUTS ("const"); + if (TYPE_READONLY (t) && TYPE_VOLATILE (t)) + OB_PUTC (' '); if (TYPE_VOLATILE (t)) OB_PUTS ("volatile"); if (p == after) OB_PUTC (' '); @@ -569,7 +571,8 @@ dump_decl (t, v) { /* Don't say 'typedef class A' */ tree type = TREE_TYPE (t); - if (IS_AGGR_TYPE (type) && ! TYPE_PTRMEMFUNC_P (type) + if (((IS_AGGR_TYPE (type) && ! TYPE_PTRMEMFUNC_P (type)) + || TREE_CODE (type) == ENUMERAL_TYPE) && type == TYPE_MAIN_VARIANT (type)) { dump_type (type, v); @@ -666,21 +669,31 @@ dump_decl (t, v) case TEMPLATE_DECL: { tree args = DECL_TEMPLATE_PARMS (t); - int i, len = TREE_VEC_LENGTH (args); + int i, len = args ? TREE_VEC_LENGTH (args) : 0; OB_PUTS ("template <"); for (i = 0; i < len; i++) { tree arg = TREE_VEC_ELT (args, i); - if (TREE_CODE (arg) == IDENTIFIER_NODE) + tree defval = TREE_PURPOSE (arg); + arg = TREE_VALUE (arg); + if (TREE_CODE (arg) == TYPE_DECL) { OB_PUTS ("class "); - OB_PUTID (arg); + OB_PUTID (DECL_NAME (arg)); } else dump_decl (arg, 1); + + if (defval) + { + OB_PUTS (" = "); + dump_decl (defval, 1); + } + OB_PUTC2 (',', ' '); } - OB_UNPUT (2); + if (len != 0) + OB_UNPUT (2); OB_PUTC2 ('>', ' '); if (DECL_TEMPLATE_IS_CLASS (t)) @@ -1219,6 +1232,14 @@ dump_expr (t, nop) break; } + case TREE_LIST: + if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL) + { + OB_PUTID (DECL_NAME (TREE_VALUE (t))); + break; + } + /* else fall through */ + /* This list is incomplete, but should suffice for now. It is very important that `sorry' does not call `report_error_function'. That could cause an infinite loop. */ @@ -1331,12 +1352,26 @@ int cp_line_of (t) tree t; { + int line = 0; if (TREE_CODE (t) == PARM_DECL) - return DECL_SOURCE_LINE (DECL_CONTEXT (t)); - else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') - return DECL_SOURCE_LINE (TYPE_NAME (t)); + line = DECL_SOURCE_LINE (DECL_CONTEXT (t)); + if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)) + t = TREE_TYPE (t); + + if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') + { + if (IS_AGGR_TYPE (t)) + line = CLASSTYPE_SOURCE_LINE (t); + else + line = DECL_SOURCE_LINE (TYPE_NAME (t)); + } else - return DECL_SOURCE_LINE (t); + line = DECL_SOURCE_LINE (t); + + if (line == 0) + return lineno; + + return line; } char * diff --git a/gnu/usr.bin/cc/cc1plus/except.c b/gnu/usr.bin/cc/cc1plus/except.c index dc91b9d..9821471 100644 --- a/gnu/usr.bin/cc/cc1plus/except.c +++ b/gnu/usr.bin/cc/cc1plus/except.c @@ -59,11 +59,6 @@ sorry_no_eh () } void -build_exception_table () -{ -} - -void expand_exception_blocks () { } @@ -180,29 +175,9 @@ output_exception_table_entry (file, start_label, end_label, eh_label) { char label[100]; - fprintf (file, "\t%s\t ", ASM_LONG); - if (GET_CODE (start_label) == CODE_LABEL) - { - ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (start_label)); - assemble_name (file, label); - } - else if (GET_CODE (start_label) == SYMBOL_REF) - { - fprintf (stderr, "YYYYYYYYYEEEEEEEESSSSSSSSSSSS!!!!!!!!!!\n"); - assemble_name (file, XSTR (start_label, 0)); - } - putc ('\n', file); - - fprintf (file, "\t%s\t ", ASM_LONG); - ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (end_label)); - assemble_name (file, label); - putc ('\n', file); - - fprintf (file, "\t%s\t ", ASM_LONG); - ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (eh_label)); - assemble_name (file, label); - putc ('\n', file); - + assemble_integer (start_label, BITS_PER_WORD/BITS_PER_UNIT, 1); + assemble_integer (end_label, BITS_PER_WORD/BITS_PER_UNIT, 1); + assemble_integer (eh_label, BITS_PER_WORD/BITS_PER_UNIT, 1); putc ('\n', file); /* blank line */ } @@ -1161,13 +1136,12 @@ expand_start_catch_block (declspecs, declarator) else type = NULL_TREE; - false_label_rtx = gen_label_rtx (); - push_label_entry (&false_label_stack, false_label_rtx); - - /* This is saved for the exception table. */ + /* These are saved for the exception table. */ push_rtl_perm (); + false_label_rtx = gen_label_rtx (); protect_label_rtx = gen_label_rtx (); pop_rtl_from_perm (); + push_label_entry (&false_label_stack, false_label_rtx); push_label_entry (&false_label_stack, protect_label_rtx); if (type) @@ -1436,39 +1410,62 @@ expand_throw (exp) emit_jump (throw_label); } +/* end of: my-cp-except.c */ +#endif -/* output the exception table */ -void + +/* Output the exception table. + Return the number of handlers. */ +int build_exception_table () { + int count = 0; +#ifdef TRY_NEW_EH extern FILE *asm_out_file; struct ehEntry *entry; + tree eh_node_decl; if (! doing_eh (0)) - return; - - exception_section (); - - /* Beginning marker for table. */ - fprintf (asm_out_file, " .global ___EXCEPTION_TABLE__\n"); - fprintf (asm_out_file, " .align 4\n"); - fprintf (asm_out_file, "___EXCEPTION_TABLE__:\n"); - fprintf (asm_out_file, " .word 0, 0, 0\n"); + return 0; - while (entry = dequeue_eh_entry (&eh_table_output_queue)) { + while (entry = dequeue_eh_entry (&eh_table_output_queue)) + { + if (count == 0) + { + exception_section (); + + /* Beginning marker for table. */ + ASM_OUTPUT_ALIGN (asm_out_file, 2); + ASM_OUTPUT_LABEL (asm_out_file, "__EXCEPTION_TABLE__"); + fprintf (asm_out_file, " .word 0, 0, 0\n"); + } + count++; output_exception_table_entry (asm_out_file, - entry->start_label, entry->end_label, entry->exception_handler_label); + entry->start_label, entry->end_label, + entry->exception_handler_label); } - /* Ending marker for table. */ - fprintf (asm_out_file, " .global ___EXCEPTION_END__\n"); - fprintf (asm_out_file, "___EXCEPTION_END__:\n"); - fprintf (asm_out_file, " .word -1, -1, -1\n"); -} + if (count) + { + /* Ending marker for table. */ + ASM_OUTPUT_LABEL (asm_out_file, "__EXCEPTION_END__"); + fprintf (asm_out_file, " .word -1, -1, -1\n"); + } -/* end of: my-cp-except.c */ -#endif +#endif /* TRY_NEW_EH */ + return count; +} +void +register_exception_table () +{ +#ifdef TRY_NEW_EH + emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__register_exceptions"), 0, + VOIDmode, 1, + gen_rtx (SYMBOL_REF, Pmode, "__EXCEPTION_TABLE__"), + Pmode); +#endif /* TRY_NEW_EH */ +} /* Build a throw expression. */ tree diff --git a/gnu/usr.bin/cc/cc1plus/expr.c b/gnu/usr.bin/cc/cc1plus/expr.c index c2213d5..3b4f65d 100644 --- a/gnu/usr.bin/cc/cc1plus/expr.c +++ b/gnu/usr.bin/cc/cc1plus/expr.c @@ -148,9 +148,16 @@ cplus_expand_expr (exp, target, tmode, modifier) { if (pcc_struct_return) { + extern int flag_access_control; + int old_ac = flag_access_control; + tree init = build (RTL_EXPR, type, 0, return_target); TREE_ADDRESSABLE (init) = 1; + + flag_access_control = 0; expand_aggr_init (slot, init, 0); + flag_access_control = old_ac; + if (TYPE_NEEDS_DESTRUCTOR (type)) { init = build (RTL_EXPR, build_reference_type (type), 0, diff --git a/gnu/usr.bin/cc/cc1plus/init.c b/gnu/usr.bin/cc/cc1plus/init.c index 5e5d580..e0905c6 100644 --- a/gnu/usr.bin/cc/cc1plus/init.c +++ b/gnu/usr.bin/cc/cc1plus/init.c @@ -217,6 +217,7 @@ perform_member_init (member, name, init, explicit) expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init)); } } + expand_cleanups_to (NULL_TREE); if (flag_handle_exceptions && TYPE_NEEDS_DESTRUCTOR (type)) cp_warning ("caution, member `%D' may not be destroyed in the presense of an exception during construction", member); } @@ -226,15 +227,19 @@ static tree sort_member_init (t) tree t; { + extern int warn_reorder; tree x, member, name, field, init; tree init_list = NULL_TREE; tree fields_to_unmark = NULL_TREE; int found; + int last_pos = 0; + tree last_field; for (member = TYPE_FIELDS (t); member ; member = TREE_CHAIN (member)) { + int pos; found = 0; - for (x = current_member_init_list ; x ; x = TREE_CHAIN (x)) + for (x = current_member_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos) { /* If we cleared this out, then pay no attention to it. */ if (TREE_PURPOSE (x) == NULL_TREE) @@ -264,6 +269,17 @@ sort_member_init (t) field); continue; } + else + { + if (pos < last_pos && warn_reorder) + { + cp_warning_at ("member initializers for `%#D'", last_field); + cp_warning_at (" and `%#D'", field); + warning (" will be re-ordered to match declaration order"); + } + last_pos = pos; + last_field = field; + } init_list = chainon (init_list, build_tree_list (name, TREE_VALUE (x))); @@ -500,9 +516,10 @@ emit_base_init (t, immediately) continue; member = convert_pointer_to (binfo, current_class_decl); - expand_aggr_init_1 (t_binfo, 0, + expand_aggr_init_1 (binfo, 0, build_indirect_ref (member, NULL_PTR), init, - BINFO_OFFSET_ZEROP (binfo), LOOKUP_COMPLAIN); + BINFO_OFFSET_ZEROP (binfo), LOOKUP_NORMAL); + expand_cleanups_to (NULL_TREE); } if (pass == 0) @@ -568,9 +585,10 @@ emit_base_init (t, immediately) current_class_decl, BINFO_OFFSET (base_binfo)); ref = build_indirect_ref (base, NULL_PTR); - expand_aggr_init_1 (t_binfo, 0, ref, NULL_TREE, + expand_aggr_init_1 (base_binfo, 0, ref, NULL_TREE, BINFO_OFFSET_ZEROP (base_binfo), - LOOKUP_COMPLAIN); + LOOKUP_NORMAL); + expand_cleanups_to (NULL_TREE); } } CLEAR_BINFO_BASEINIT_MARKED (base_binfo); @@ -655,11 +673,6 @@ emit_base_init (t, immediately) current_member_init_list = NULL_TREE; - /* It is possible for the initializers to need cleanups. - Expand those cleanups now that all the initialization - has been done. */ - expand_cleanups_to (NULL_TREE); - if (! immediately) { extern rtx base_init_insns; @@ -734,6 +747,7 @@ expand_aggr_vbase_init_1 (binfo, exp, addr, init_list) /* Call constructors, but don't set up vtables. */ expand_aggr_init_1 (binfo, exp, ref, init, 0, LOOKUP_COMPLAIN|LOOKUP_SPECULATIVELY); + expand_cleanups_to (NULL_TREE); CLEAR_BINFO_VBASE_INIT_MARKED (binfo); } @@ -1117,7 +1131,11 @@ expand_aggr_init (exp, init, alias_this) int was_const_elts = TYPE_READONLY (TREE_TYPE (type)); tree itype = init ? TREE_TYPE (init) : NULL_TREE; if (was_const_elts) - TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); + { + TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); + if (init) + TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype); + } if (init && TREE_TYPE (init) == NULL_TREE) { /* Handle bad initializers like: @@ -1139,7 +1157,8 @@ expand_aggr_init (exp, init, alias_this) init && comptypes (TREE_TYPE (init), TREE_TYPE (exp), 1)); TREE_READONLY (exp) = was_const; TREE_TYPE (exp) = type; - if (init) TREE_TYPE (init) = itype; + if (init) + TREE_TYPE (init) = itype; return; } @@ -1187,6 +1206,7 @@ expand_default_init (binfo, true_exp, exp, type, init, alias_this, flags) else if (TREE_CODE (init) == INDIRECT_REF && TREE_HAS_CONSTRUCTOR (init)) { rval = convert_for_initialization (exp, type, init, 0, 0, 0, 0); + TREE_USED (rval) = 1; expand_expr_stmt (rval); return; } @@ -1392,7 +1412,7 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags) separately from the object being initialized. */ if (TREE_CODE (init) == TARGET_EXPR) { - if (init_type == type) + if (TYPE_MAIN_VARIANT (init_type) == TYPE_MAIN_VARIANT (type)) { if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == RESULT_DECL) @@ -1966,12 +1986,6 @@ build_offset_ref (cname, name) name, NULL_TREE, 1); #endif - fnfields = lookup_fnfields (TYPE_BINFO (type), name, 1); - fields = lookup_field (type, name, 0, 0); - - if (fields == error_mark_node || fnfields == error_mark_node) - return error_mark_node; - if (current_class_type == 0 || get_base_distance (type, current_class_type, 0, &basetypes) == -1) { @@ -1986,6 +2000,12 @@ build_offset_ref (cname, name) else decl = C_C_D; + fnfields = lookup_fnfields (basetypes, name, 1); + fields = lookup_field (basetypes, name, 0, 0); + + if (fields == error_mark_node || fnfields == error_mark_node) + return error_mark_node; + /* A lot of this logic is now handled in lookup_field and lookup_fnfield. */ if (fnfields) @@ -2018,7 +2038,6 @@ build_offset_ref (cname, name) { extern int flag_save_memoized_contexts; - /* This does not handle access checking yet. */ if (DECL_CHAIN (t) == NULL_TREE || dtor) { enum access_type access; @@ -2287,9 +2306,11 @@ resolve_offset_ref (exp) { basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (member)); addr = convert_pointer_to (basetype, addr); - member = convert (ptr_type_node, build_unary_op (ADDR_EXPR, member, 0)); + member = convert (ptrdiff_type_node, + build_unary_op (ADDR_EXPR, member, 0)); return build1 (INDIRECT_REF, type, - build (PLUS_EXPR, ptr_type_node, addr, member)); + build (PLUS_EXPR, build_pointer_type (type), + addr, member)); } else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member))) { @@ -3261,7 +3282,7 @@ build_new (placement, decl, init, use_global_new) build_tree_list (NULL_TREE, rval)))); } - return save_expr (rval); + return rval; } /* `expand_vec_init' performs initialization of a vector of aggregate diff --git a/gnu/usr.bin/cc/cc1plus/lex.c b/gnu/usr.bin/cc/cc1plus/lex.c index 5edf659..44c78f0 100644 --- a/gnu/usr.bin/cc/cc1plus/lex.c +++ b/gnu/usr.bin/cc/cc1plus/lex.c @@ -75,6 +75,12 @@ void yyerror (); struct obstack inline_text_obstack; static char *inline_text_firstobj; +/* This obstack is used to hold information about methods to be + synthesized. It should go away when synthesized methods are handled + properly (i.e. only when needed). */ +struct obstack synth_obstack; +static char *synth_firstobj; + int end_of_file; /* Pending language change. @@ -564,6 +570,8 @@ init_lex () init_error (); gcc_obstack_init (&inline_text_obstack); inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0); + gcc_obstack_init (&synth_obstack); + synth_firstobj = (char *) obstack_alloc (&synth_obstack, 0); /* Start it at 0, because check_newline is called at the very beginning and will increment it to 1. */ @@ -960,15 +968,6 @@ set_yydebug (value) #endif } -#ifdef SPEW_DEBUG -const char * -debug_yytranslate (value) - int value; -{ - return yytname[YYTRANSLATE (value)]; -} - -#endif /* Functions and data structures for #pragma interface. @@ -1095,30 +1094,72 @@ set_vardecl_interface_info (prev, vars) void do_pending_inlines () { - struct pending_inline *prev = 0, *tail; struct pending_inline *t; /* Oops, we're still dealing with the last batch. */ if (yychar == PRE_PARSED_FUNCTION_DECL) return; - + /* Reverse the pending inline functions, since they were cons'd instead of appended. */ - - for (t = pending_inlines; t; t = tail) - { - t->deja_vu = 1; - tail = t->next; - t->next = prev; - prev = t; - } - /* Reset to zero so that if the inline functions we are currently - processing define inline functions of their own, that is handled - correctly. ??? This hasn't been checked in a while. */ - pending_inlines = 0; - + { + struct pending_inline *prev = 0, *tail, *bottom = 0; + t = pending_inlines; + pending_inlines = 0; + + for (; t; t = tail) + { + tail = t->next; + t->next = prev; + t->deja_vu = 1; + prev = t; + } + + /* This kludge should go away when synthesized methods are handled + properly, i.e. only when needed. */ + for (t = prev; t; t = t->next) + { + if (t->lineno <= 0) + { + tree f = t->fndecl; + DECL_PENDING_INLINE_INFO (f) = 0; + interface_unknown = t->interface == 1; + interface_only = t->interface == 0; + switch (- t->lineno) + { + case 0: case 1: + build_dtor (f); break; + case 2: + build_default_constructor (f); break; + case 3: case 4: + build_copy_constructor (f); break; + case 5: case 6: + build_assign_ref (f); break; + default: + ; + } + if (tail) + tail->next = t->next; + else + prev = t->next; + if (! bottom) + bottom = t; + } + else + tail = t; + } + if (bottom) + { + obstack_free (&synth_obstack, bottom); + extract_interface_info (); + } + t = prev; + } + + if (t == 0) + return; + /* Now start processing the first inline function. */ - t = prev; my_friendly_assert ((t->parm_vec == NULL_TREE) == (t->bindings == NULL_TREE), 226); if (t->parm_vec) @@ -1660,8 +1701,8 @@ reinit_parse_for_block (yychar, obstackp, is_template) When KIND == 6, build default operator = (X&). */ tree -cons_up_default_function (type, name, fields, kind) - tree type, name, fields; +cons_up_default_function (type, name, kind) + tree type, name; int kind; { extern tree void_list_node; @@ -1685,14 +1726,6 @@ cons_up_default_function (type, name, fields, kind) case 2: /* Default constructor. */ args = void_list_node; - { - if (declspecs) - declspecs = decl_tree_cons (NULL_TREE, - ridpointers [(int) RID_INLINE], - declspecs); - else - declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_INLINE]); - } break; case 3: @@ -1700,16 +1733,12 @@ cons_up_default_function (type, name, fields, kind) /* Fall through... */ case 4: /* According to ARM $12.8, the default copy ctor will be declared, but - not defined, unless it's needed. So we mark this as `inline'; that - way, if it's never used it won't be emitted. */ - declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_INLINE]); - + not defined, unless it's needed. */ argtype = build_reference_type (type); args = tree_cons (NULL_TREE, build_tree_list (hash_tree_chain (argtype, NULL_TREE), get_identifier ("_ctor_arg")), void_list_node); - default_copy_constructor_body (&func_buf, &func_len, type, fields); break; case 5: @@ -1717,11 +1746,7 @@ cons_up_default_function (type, name, fields, kind) /* Fall through... */ case 6: retref = 1; - declspecs = - decl_tree_cons (NULL_TREE, name, - decl_tree_cons (NULL_TREE, - ridpointers [(int) RID_INLINE], - NULL_TREE)); + declspecs = build_decl_list (NULL_TREE, name); name = ansi_opname [(int) MODIFY_EXPR]; @@ -1730,19 +1755,14 @@ cons_up_default_function (type, name, fields, kind) build_tree_list (hash_tree_chain (argtype, NULL_TREE), get_identifier ("_ctor_arg")), void_list_node); - default_assign_ref_body (&func_buf, &func_len, type, fields); break; default: my_friendly_abort (59); } - if (!func_buf) - { - func_len = 2; - func_buf = obstack_alloc (&inline_text_obstack, func_len); - strcpy (func_buf, "{}"); - } + declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE], + declspecs); TREE_PARMLIST (args) = 1; @@ -1751,52 +1771,27 @@ cons_up_default_function (type, name, fields, kind) if (retref) declarator = build_parse_node (ADDR_EXPR, declarator); - fn = start_method (declspecs, declarator, NULL_TREE); + fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE); } if (fn == void_type_node) return fn; - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; + if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)) + SET_DECL_IMPLICIT_INSTANTIATION (fn); + /* This kludge should go away when synthesized methods are handled + properly, i.e. only when needed. */ { struct pending_inline *t; - - t = (struct pending_inline *) obstack_alloc (&inline_text_obstack, - sizeof (struct pending_inline)); - t->lineno = lineno; - -#if 1 - t->filename = input_filename; -#else /* This breaks; why? */ -#define MGMSG "(synthetic code at) " - t->filename = obstack_alloc (&inline_text_obstack, - strlen (input_filename) + sizeof (MGMSG) + 1); - strcpy (t->filename, MGMSG); - strcat (t->filename, input_filename); -#endif - t->token = YYEMPTY; - t->token_value = 0; - t->buf = func_buf; - t->len = func_len; - t->can_free = 1; - t->deja_vu = 0; - if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (fn)) - warn_if_unknown_interface (); + t = (struct pending_inline *) + obstack_alloc (&synth_obstack, sizeof (struct pending_inline)); + t->lineno = -kind; + t->can_free = 0; t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2)); store_pending_inline (fn, t); - if (interface_unknown) - TREE_PUBLIC (fn) = 0; - else - { - TREE_PUBLIC (fn) = 1; - DECL_EXTERNAL (fn) = interface_only; - } } - finish_method (fn); - #ifdef DEBUG_DEFAULT_FUNCTIONS { char *fn_type = NULL; tree t = name; @@ -1818,14 +1813,13 @@ cons_up_default_function (type, name, fields, kind) } #endif /* DEBUG_DEFAULT_FUNCTIONS */ - DECL_CLASS_CONTEXT (fn) = TYPE_MAIN_VARIANT (type); - /* Show that this function was generated by the compiler. */ SET_DECL_ARTIFICIAL (fn); return fn; } +#if 0 /* Used by default_copy_constructor_body. For the anonymous union in TYPE, return the member that is at least as large as the rest of the members, so we can copy it. */ @@ -2171,6 +2165,7 @@ default_copy_constructor_body (bufp, lenp, type, fields) strcpy (*bufp, prologue.object_base); strcat (*bufp, "{}"); } +#endif /* Heuristic to tell whether the user is missing a semicolon after a struct or enum declaration. Emit an error message @@ -2182,17 +2177,17 @@ check_for_missing_semicolon (type) if (yychar < 0) yychar = yylex (); - if (yychar > 255 - && yychar != SCSPEC - && yychar != IDENTIFIER - && yychar != TYPENAME) + if ((yychar > 255 + && yychar != SCSPEC + && yychar != IDENTIFIER + && yychar != TYPENAME) + || end_of_file) { if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))) error ("semicolon missing after %s declaration", TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct"); else - error ("semicolon missing after declaration of `%s'", - TYPE_NAME_STRING (type)); + cp_error ("semicolon missing after declaration of `%T'", type); shadow_tag (build_tree_list (0, type)); } /* Could probably also hack cases where class { ... } f (); appears. */ @@ -2875,7 +2870,7 @@ linenum: if (c_header_level && --c_header_level == 0) { if (entering_c_header) - warning ("Badly nested C headers from preprocessor"); + warning ("badly nested C headers from preprocessor"); --pending_lang_change; } if (flag_cadillac) @@ -4203,12 +4198,12 @@ real_yylex () || ((result >> (num_bits - 1)) & 1) == 0) yylval.ttype = build_int_2 (result & ((unsigned HOST_WIDE_INT) ~0 - >> (HOST_BITS_PER_INT - num_bits)), + >> (HOST_BITS_PER_WIDE_INT - num_bits)), 0); else yylval.ttype = build_int_2 (result | ~((unsigned HOST_WIDE_INT) ~0 - >> (HOST_BITS_PER_INT - num_bits)), + >> (HOST_BITS_PER_WIDE_INT - num_bits)), -1); if (num_chars<=1) TREE_TYPE (yylval.ttype) = char_type_node; diff --git a/gnu/usr.bin/cc/cc1plus/lex.h b/gnu/usr.bin/cc/cc1plus/lex.h index 3da4635..291b9cd 100644 --- a/gnu/usr.bin/cc/cc1plus/lex.h +++ b/gnu/usr.bin/cc/cc1plus/lex.h @@ -58,14 +58,16 @@ enum rid RID_VOLATILE, RID_FRIEND, RID_VIRTUAL, + RID_SIGNED, + RID_AUTO, + RID_MUTABLE, + + /* This is where grokdeclarator ends its search when setting the specbits. */ + RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, - RID_SIGNED, RID_EXCEPTION, - RID_RAISES, - RID_AUTO, - RID_MUTABLE, RID_TEMPLATE, RID_SIGNATURE, /* Before adding enough to get up to 64, the RIDBIT_* macros @@ -76,6 +78,7 @@ enum rid #define NORID RID_UNUSED #define RID_FIRST_MODIFIER RID_EXTERN +#define RID_LAST_MODIFIER RID_MUTABLE /* The type that can represent all values of RIDBIT. */ /* We assume that we can stick in at least 32 bits into this. */ diff --git a/gnu/usr.bin/cc/cc1plus/method.c b/gnu/usr.bin/cc/cc1plus/method.c index f64a16a..b22aa7c 100644 --- a/gnu/usr.bin/cc/cc1plus/method.c +++ b/gnu/usr.bin/cc/cc1plus/method.c @@ -313,6 +313,7 @@ flush_repeats (type) OB_PUTC ('_'); } +static int numeric_outputed_need_bar; static void build_overload_identifier (); static void @@ -463,9 +464,9 @@ build_overload_identifier (name) icat (nparms); for (i = 0; i < nparms; i++) { - tree parm = TREE_VEC_ELT (parmlist, i); + tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i)); tree arg = TREE_VEC_ELT (arglist, i); - if (TREE_CODE (parm) == IDENTIFIER_NODE) + if (TREE_CODE (parm) == TYPE_DECL) { /* This parameter is a type. */ OB_PUTC ('Z'); @@ -476,11 +477,17 @@ build_overload_identifier (name) /* It's a PARM_DECL. */ build_overload_name (TREE_TYPE (parm), 0, 0); build_overload_value (parm, arg); + numeric_outputed_need_bar = 1; } } } else { + if (numeric_outputed_need_bar) + { + OB_PUTC ('_'); + numeric_outputed_need_bar = 0; + } icat (IDENTIFIER_LENGTH (name)); OB_PUTID (name); } @@ -772,6 +779,7 @@ build_overload_name (parmtypes, begin, end) icat (i); if (i > 9) OB_PUTC ('_'); + numeric_outputed_need_bar = 0; build_overload_nested_name (TYPE_NAME (parmtype)); } else @@ -817,6 +825,18 @@ build_overload_name (parmtypes, begin, end) if (end) OB_FINISH (); return (char *)obstack_base (&scratch_obstack); } + +tree +build_static_name (basetype, name) + tree basetype, name; +{ + char *basename = build_overload_name (basetype, 1, 1); + char *buf = (char *) alloca (IDENTIFIER_LENGTH (name) + + sizeof (STATIC_NAME_FORMAT) + + strlen (basename)); + sprintf (buf, STATIC_NAME_FORMAT, basename, IDENTIFIER_POINTER (name)); + return get_identifier (buf); +} /* Generate an identifier that encodes the (ANSI) exception TYPE. */ @@ -852,18 +872,17 @@ build_decl_overload (dname, parms, for_method) /* member operators new and delete look like methods at this point. */ if (! for_method && parms != NULL_TREE && TREE_CODE (parms) == TREE_LIST) { - if (TREE_VALUE (parms) == sizetype - && TREE_CHAIN (parms) == void_list_node) + if (dname == ansi_opname[(int) DELETE_EXPR]) + return get_identifier ("__builtin_delete"); + else if (dname == ansi_opname[(int) VEC_DELETE_EXPR]) + return get_identifier ("__builtin_vec_delete"); + else if (TREE_CHAIN (parms) == void_list_node) { if (dname == ansi_opname[(int) NEW_EXPR]) return get_identifier ("__builtin_new"); else if (dname == ansi_opname[(int) VEC_NEW_EXPR]) return get_identifier ("__builtin_vec_new"); } - else if (dname == ansi_opname[(int) DELETE_EXPR]) - return get_identifier ("__builtin_delete"); - else if (dname == ansi_opname[(int) VEC_DELETE_EXPR]) - return get_identifier ("__builtin_vec_delete"); } OB_INIT (); @@ -901,6 +920,7 @@ build_decl_overload (dname, parms, for_method) { ALLOCATE_TYPEVEC (parms); nofold = 0; + numeric_outputed_need_bar = 0; if (for_method) { build_overload_name (TREE_VALUE (parms), 0, 0); @@ -1461,11 +1481,13 @@ hack_identifier (value, name, yychar) if (really_overloaded_fn (value)) { tree t = get_first_fn (value); - while (t) + for (; t; t = DECL_CHAIN (t)) { + if (TREE_CODE (t) == TEMPLATE_DECL) + continue; + assemble_external (t); TREE_USED (t) = 1; - t = DECL_CHAIN (t); } } else if (TREE_CODE (value) == TREE_LIST) @@ -1946,3 +1968,204 @@ emit_thunk (thunk_fndecl) decl_printable_name = save_decl_printable_name; current_function_decl = 0; } + +/* Code for synthesizing methods which have default semantics defined. */ + +void +build_default_constructor (fndecl) + tree fndecl; +{ + start_function (NULL_TREE, fndecl, NULL_TREE, 1); + store_parm_decls (); + setup_vtbl_ptr (); + finish_function (lineno, 0); +} + +/* For the anonymous union in TYPE, return the member that is at least as + large as the rest of the members, so we can copy it. */ +static tree +largest_union_member (type) + tree type; +{ + tree f, type_size = TYPE_SIZE (type); + + for (f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f)) + if (simple_cst_equal (DECL_SIZE (f), type_size)) + return f; + + /* We should always find one. */ + my_friendly_abort (323); + return NULL_TREE; +} + +/* Generate code for default X(X&) constructor. */ +void +build_copy_constructor (fndecl) + tree fndecl; +{ + tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); + tree t; + + start_function (NULL_TREE, fndecl, NULL_TREE, 1); + store_parm_decls (); + clear_last_expr (); + push_momentary (); + + if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) + parm = TREE_CHAIN (parm); + parm = convert_from_reference (parm); + + if (! TYPE_HAS_COMPLEX_INIT_REF (current_class_type)) + { + t = build (INIT_EXPR, void_type_node, C_C_D, parm); + TREE_SIDE_EFFECTS (t) = 1; + cplus_expand_expr_stmt (t); + } + else + { + tree fields = TYPE_FIELDS (current_class_type); + int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); + tree binfos = TYPE_BINFO_BASETYPES (current_class_type); + int i; + + for (t = CLASSTYPE_VBASECLASSES (current_class_type); t; + t = TREE_CHAIN (t)) + { + tree basetype = BINFO_TYPE (t); + tree p = convert (build_reference_type (basetype), parm); + p = convert_from_reference (p); + current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype), + p, current_base_init_list); + } + + for (i = 0; i < n_bases; ++i) + { + tree p, basetype = TREE_VEC_ELT (binfos, i); + if (TREE_VIA_VIRTUAL (basetype)) + continue; + + basetype = BINFO_TYPE (basetype); + p = convert (build_reference_type (basetype), parm); + p = convert_from_reference (p); + current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype), + p, current_base_init_list); + } + for (; fields; fields = TREE_CHAIN (fields)) + { + tree name, init, t; + if (TREE_CODE (fields) != FIELD_DECL) + continue; + if (DECL_NAME (fields)) + { + if (VFIELD_NAME_P (DECL_NAME (fields))) + continue; + if (VBASE_NAME_P (DECL_NAME (fields))) + continue; + + /* True for duplicate members. */ + if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields) + continue; + } + else if ((t = TREE_TYPE (fields)) != NULL_TREE + && TREE_CODE (t) == UNION_TYPE + && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)) + && TYPE_FIELDS (t) != NULL_TREE) + fields = largest_union_member (t); + else + continue; + + init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields); + init = build_tree_list (NULL_TREE, init); + + current_member_init_list + = tree_cons (DECL_NAME (fields), init, current_member_init_list); + } + current_member_init_list = nreverse (current_member_init_list); + setup_vtbl_ptr (); + } + + pop_momentary (); + finish_function (lineno, 0); +} + +void +build_assign_ref (fndecl) + tree fndecl; +{ + tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); + + start_function (NULL_TREE, fndecl, NULL_TREE, 1); + store_parm_decls (); + push_momentary (); + + parm = convert_from_reference (parm); + + if (! TYPE_HAS_COMPLEX_ASSIGN_REF (current_class_type)) + { + tree t = build (MODIFY_EXPR, void_type_node, C_C_D, parm); + TREE_SIDE_EFFECTS (t) = 1; + cplus_expand_expr_stmt (t); + } + else + { + tree fields = TYPE_FIELDS (current_class_type); + int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); + tree binfos = TYPE_BINFO_BASETYPES (current_class_type); + int i; + + for (i = 0; i < n_bases; ++i) + { + tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); + if (TYPE_HAS_ASSIGN_REF (basetype)) + { + tree p = convert (build_reference_type (basetype), parm); + p = convert_from_reference (p); + p = build_member_call (TYPE_NESTED_NAME (basetype), + ansi_opname [MODIFY_EXPR], + build_tree_list (NULL_TREE, p)); + expand_expr_stmt (p); + } + } + for (; fields; fields = TREE_CHAIN (fields)) + { + tree comp, init, t; + if (TREE_CODE (fields) != FIELD_DECL) + continue; + if (DECL_NAME (fields)) + { + if (VFIELD_NAME_P (DECL_NAME (fields))) + continue; + if (VBASE_NAME_P (DECL_NAME (fields))) + continue; + + /* True for duplicate members. */ + if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields) + continue; + } + else if ((t = TREE_TYPE (fields)) != NULL_TREE + && TREE_CODE (t) == UNION_TYPE + && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)) + && TYPE_FIELDS (t) != NULL_TREE) + fields = largest_union_member (t); + else + continue; + + comp = build (COMPONENT_REF, TREE_TYPE (fields), C_C_D, fields); + init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields); + + expand_expr_stmt (build_modify_expr (comp, NOP_EXPR, init)); + } + } + c_expand_return (C_C_D); + pop_momentary (); + finish_function (lineno, 0); +} + +void +build_dtor (fndecl) + tree fndecl; +{ + start_function (NULL_TREE, fndecl, NULL_TREE, 1); + store_parm_decls (); + finish_function (lineno, 0); +} diff --git a/gnu/usr.bin/cc/cc1plus/parse.c b/gnu/usr.bin/cc/cc1plus/parse.c index fb8c2e15..ef0ec2f 100644 --- a/gnu/usr.bin/cc/cc1plus/parse.c +++ b/gnu/usr.bin/cc/cc1plus/parse.c @@ -150,7 +150,7 @@ empty_parms () #line 108 "parse.y" typedef union {long itype; tree ttype; char *strtype; enum tree_code code; } YYSTYPE; -#line 276 "parse.y" +#line 277 "parse.y" /* List of types and structure classes of the current declaration. */ static tree current_declspecs; @@ -190,11 +190,11 @@ typedef -#define YYFINAL 1346 +#define YYFINAL 1356 #define YYFLAG -32768 #define YYNTBASE 106 -#define YYTRANSLATE(x) ((unsigned)(x) <= 336 ? yytranslate[x] : 336) +#define YYTRANSLATE(x) ((unsigned)(x) <= 336 ? yytranslate[x] : 338) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -237,408 +237,412 @@ static const char yytranslate[] = { 0, static const short yyprhs[] = { 0, 0, 1, 3, 4, 7, 10, 11, 12, 14, 16, 17, 20, 22, 24, 26, 28, 34, 39, 43, 48, - 53, 55, 56, 62, 64, 68, 71, 76, 78, 82, - 84, 88, 89, 95, 96, 102, 103, 109, 110, 116, - 120, 124, 131, 139, 144, 148, 152, 154, 156, 158, - 160, 162, 165, 169, 173, 177, 181, 184, 187, 190, - 193, 196, 198, 202, 207, 211, 217, 222, 226, 230, - 233, 237, 241, 244, 246, 253, 258, 262, 266, 269, - 272, 274, 278, 283, 286, 290, 291, 292, 294, 298, - 301, 305, 307, 312, 315, 320, 323, 328, 331, 333, - 335, 337, 339, 341, 343, 345, 347, 351, 355, 360, - 365, 369, 374, 379, 380, 382, 386, 388, 390, 391, - 398, 399, 401, 402, 405, 407, 409, 411, 413, 415, - 417, 419, 421, 425, 427, 431, 432, 434, 436, 437, - 446, 448, 451, 456, 461, 463, 467, 471, 475, 479, - 481, 483, 485, 486, 490, 493, 496, 499, 502, 505, - 508, 513, 516, 521, 524, 528, 532, 537, 542, 548, - 554, 561, 564, 569, 575, 579, 583, 587, 589, 593, - 596, 600, 605, 607, 610, 616, 618, 623, 628, 633, - 635, 639, 643, 647, 651, 655, 659, 663, 667, 671, - 675, 679, 683, 687, 691, 695, 699, 703, 707, 711, - 717, 721, 725, 727, 730, 734, 736, 738, 740, 742, - 744, 746, 748, 751, 754, 756, 758, 760, 762, 764, - 766, 768, 772, 776, 777, 782, 783, 790, 793, 798, - 801, 804, 806, 811, 813, 821, 829, 837, 845, 850, - 855, 858, 861, 863, 868, 871, 874, 877, 883, 887, - 893, 897, 902, 909, 911, 914, 916, 919, 921, 923, - 925, 928, 929, 932, 935, 939, 943, 947, 951, 955, - 958, 961, 963, 965, 967, 970, 973, 976, 979, 981, - 983, 985, 987, 990, 993, 997, 1001, 1006, 1008, 1011, - 1014, 1016, 1018, 1021, 1024, 1026, 1029, 1032, 1036, 1038, - 1041, 1043, 1045, 1047, 1052, 1057, 1062, 1067, 1069, 1071, - 1073, 1075, 1079, 1081, 1085, 1087, 1091, 1092, 1097, 1098, - 1106, 1111, 1112, 1120, 1125, 1126, 1134, 1139, 1140, 1148, - 1153, 1154, 1156, 1158, 1161, 1168, 1170, 1174, 1175, 1177, - 1182, 1189, 1194, 1196, 1198, 1200, 1202, 1204, 1208, 1210, - 1213, 1217, 1222, 1224, 1226, 1230, 1235, 1242, 1246, 1252, - 1253, 1261, 1266, 1267, 1274, 1278, 1281, 1284, 1289, 1291, - 1292, 1294, 1295, 1297, 1299, 1302, 1305, 1308, 1311, 1315, - 1318, 1321, 1324, 1328, 1332, 1334, 1337, 1338, 1339, 1343, - 1347, 1350, 1352, 1354, 1355, 1357, 1360, 1362, 1366, 1368, - 1371, 1373, 1378, 1383, 1385, 1387, 1390, 1393, 1395, 1396, - 1398, 1403, 1407, 1409, 1412, 1415, 1418, 1421, 1424, 1427, - 1430, 1433, 1438, 1441, 1443, 1449, 1453, 1454, 1456, 1460, - 1461, 1463, 1467, 1469, 1471, 1473, 1475, 1480, 1487, 1492, - 1497, 1504, 1509, 1513, 1518, 1525, 1530, 1535, 1542, 1547, - 1551, 1553, 1557, 1559, 1563, 1566, 1568, 1575, 1576, 1579, - 1581, 1584, 1585, 1588, 1592, 1596, 1599, 1602, 1606, 1608, - 1610, 1612, 1615, 1621, 1627, 1631, 1637, 1642, 1646, 1650, - 1653, 1655, 1659, 1663, 1666, 1669, 1673, 1675, 1679, 1683, - 1686, 1689, 1693, 1695, 1701, 1707, 1711, 1717, 1721, 1725, - 1730, 1734, 1737, 1740, 1742, 1745, 1750, 1755, 1758, 1760, - 1762, 1764, 1767, 1770, 1773, 1775, 1778, 1780, 1783, 1786, - 1790, 1792, 1796, 1799, 1803, 1806, 1809, 1813, 1815, 1819, - 1824, 1828, 1831, 1834, 1836, 1840, 1843, 1846, 1848, 1851, - 1855, 1857, 1861, 1863, 1869, 1873, 1878, 1882, 1887, 1890, - 1893, 1897, 1900, 1902, 1904, 1907, 1910, 1913, 1914, 1915, - 1917, 1919, 1922, 1926, 1928, 1931, 1935, 1941, 1948, 1954, - 1955, 1956, 1963, 1965, 1968, 1970, 1972, 1974, 1977, 1978, - 1983, 1985, 1986, 1987, 1994, 1995, 1996, 2004, 2005, 2006, - 2007, 2018, 2019, 2020, 2021, 2032, 2033, 2041, 2042, 2048, - 2049, 2057, 2058, 2063, 2066, 2069, 2072, 2076, 2083, 2092, - 2103, 2116, 2121, 2125, 2128, 2131, 2133, 2135, 2136, 2137, - 2145, 2147, 2150, 2153, 2154, 2155, 2161, 2163, 2165, 2169, - 2173, 2176, 2179, 2183, 2188, 2193, 2197, 2202, 2209, 2216, - 2217, 2219, 2220, 2222, 2224, 2225, 2227, 2229, 2233, 2238, - 2240, 2244, 2245, 2247, 2249, 2251, 2254, 2257, 2260, 2262, - 2264, 2267, 2270, 2273, 2276, 2278, 2282, 2285, 2290, 2293, - 2298, 2301, 2304, 2307, 2310, 2313, 2316, 2318, 2321, 2323, - 2325, 2326, 2327, 2329, 2330, 2335, 2337, 2339, 2343, 2344, - 2348, 2352, 2356, 2358, 2361, 2364, 2367, 2370, 2373, 2376, - 2379, 2382, 2385, 2388, 2391, 2394, 2397, 2400, 2403, 2406, - 2409, 2412, 2415, 2418, 2421, 2424, 2427, 2431, 2434, 2437, - 2440, 2443, 2447, 2450, 2453, 2458, 2463, 2467 + 53, 55, 56, 62, 64, 68, 70, 73, 75, 79, + 81, 85, 87, 91, 92, 98, 99, 105, 106, 112, + 113, 119, 123, 127, 134, 142, 147, 151, 155, 157, + 159, 161, 163, 165, 168, 172, 176, 180, 184, 187, + 190, 193, 196, 199, 201, 205, 210, 214, 220, 225, + 229, 233, 236, 240, 244, 247, 249, 256, 261, 265, + 269, 272, 275, 277, 281, 286, 289, 293, 294, 295, + 297, 301, 304, 308, 310, 315, 318, 323, 326, 331, + 334, 336, 338, 340, 342, 344, 346, 348, 350, 354, + 358, 363, 368, 372, 377, 381, 386, 387, 389, 393, + 395, 397, 398, 405, 406, 408, 409, 412, 414, 416, + 418, 420, 422, 424, 426, 428, 432, 434, 438, 439, + 441, 443, 444, 453, 455, 458, 463, 468, 470, 474, + 478, 482, 486, 488, 490, 492, 493, 497, 500, 503, + 506, 509, 512, 515, 520, 523, 528, 531, 535, 539, + 544, 549, 555, 561, 568, 571, 576, 582, 586, 590, + 594, 596, 600, 603, 607, 612, 614, 617, 623, 625, + 630, 635, 640, 642, 646, 650, 654, 658, 662, 666, + 670, 674, 678, 682, 686, 690, 694, 698, 702, 706, + 710, 714, 718, 724, 728, 732, 734, 737, 741, 743, + 745, 747, 749, 751, 753, 755, 758, 761, 765, 767, + 769, 771, 775, 777, 779, 781, 783, 787, 791, 792, + 797, 798, 805, 808, 813, 816, 819, 821, 826, 828, + 836, 844, 852, 860, 865, 870, 873, 876, 878, 883, + 886, 889, 892, 898, 902, 908, 912, 917, 924, 926, + 929, 931, 934, 936, 938, 940, 943, 944, 947, 950, + 954, 958, 962, 966, 970, 973, 976, 978, 980, 982, + 985, 988, 991, 994, 996, 998, 1000, 1002, 1005, 1008, + 1012, 1016, 1021, 1023, 1026, 1029, 1031, 1033, 1036, 1039, + 1041, 1044, 1047, 1051, 1053, 1056, 1058, 1060, 1062, 1067, + 1072, 1077, 1082, 1084, 1086, 1088, 1090, 1094, 1096, 1100, + 1102, 1106, 1107, 1112, 1113, 1121, 1126, 1127, 1135, 1140, + 1141, 1149, 1154, 1155, 1163, 1168, 1169, 1171, 1173, 1176, + 1183, 1185, 1189, 1190, 1192, 1197, 1204, 1209, 1211, 1213, + 1215, 1217, 1219, 1223, 1225, 1228, 1232, 1237, 1239, 1241, + 1245, 1250, 1257, 1261, 1267, 1268, 1276, 1281, 1282, 1289, + 1293, 1296, 1299, 1304, 1306, 1307, 1309, 1310, 1312, 1314, + 1317, 1320, 1323, 1326, 1330, 1333, 1336, 1339, 1343, 1347, + 1349, 1352, 1353, 1354, 1358, 1362, 1365, 1367, 1369, 1370, + 1372, 1375, 1377, 1381, 1383, 1386, 1388, 1393, 1398, 1400, + 1402, 1405, 1408, 1410, 1411, 1413, 1418, 1422, 1424, 1427, + 1430, 1433, 1436, 1439, 1442, 1445, 1448, 1453, 1456, 1458, + 1464, 1468, 1469, 1471, 1475, 1476, 1478, 1482, 1484, 1486, + 1488, 1490, 1495, 1502, 1507, 1512, 1519, 1524, 1528, 1533, + 1540, 1545, 1550, 1557, 1562, 1566, 1568, 1572, 1574, 1578, + 1581, 1583, 1590, 1591, 1594, 1596, 1599, 1600, 1603, 1607, + 1611, 1614, 1617, 1621, 1623, 1625, 1627, 1630, 1636, 1642, + 1646, 1652, 1657, 1661, 1665, 1668, 1670, 1674, 1678, 1681, + 1684, 1688, 1690, 1694, 1698, 1701, 1704, 1708, 1710, 1716, + 1722, 1726, 1732, 1736, 1741, 1745, 1748, 1751, 1753, 1756, + 1761, 1766, 1769, 1771, 1773, 1775, 1778, 1781, 1784, 1786, + 1789, 1791, 1794, 1797, 1801, 1803, 1807, 1810, 1814, 1817, + 1820, 1824, 1826, 1830, 1835, 1839, 1842, 1845, 1847, 1851, + 1854, 1857, 1859, 1862, 1866, 1868, 1872, 1874, 1880, 1884, + 1889, 1893, 1898, 1901, 1904, 1908, 1911, 1913, 1915, 1918, + 1921, 1924, 1925, 1926, 1928, 1930, 1933, 1937, 1939, 1942, + 1946, 1952, 1959, 1965, 1966, 1967, 1974, 1976, 1979, 1981, + 1983, 1985, 1988, 1989, 1994, 1996, 1997, 1998, 2005, 2006, + 2007, 2015, 2016, 2017, 2018, 2029, 2030, 2031, 2032, 2043, + 2044, 2052, 2053, 2059, 2060, 2068, 2069, 2074, 2077, 2080, + 2083, 2087, 2094, 2103, 2114, 2127, 2132, 2136, 2139, 2142, + 2144, 2146, 2147, 2148, 2156, 2158, 2161, 2164, 2165, 2166, + 2172, 2174, 2176, 2180, 2184, 2187, 2190, 2193, 2197, 2202, + 2207, 2211, 2216, 2223, 2230, 2231, 2233, 2234, 2236, 2238, + 2239, 2241, 2243, 2247, 2252, 2254, 2258, 2259, 2261, 2263, + 2265, 2268, 2271, 2274, 2276, 2278, 2281, 2284, 2287, 2290, + 2292, 2296, 2299, 2302, 2307, 2310, 2313, 2316, 2319, 2322, + 2325, 2327, 2330, 2332, 2336, 2338, 2340, 2341, 2342, 2344, + 2345, 2350, 2352, 2354, 2358, 2359, 2363, 2367, 2371, 2373, + 2376, 2379, 2382, 2385, 2388, 2391, 2394, 2397, 2400, 2403, + 2406, 2409, 2412, 2415, 2418, 2421, 2424, 2427, 2430, 2433, + 2436, 2439, 2442, 2446, 2449, 2452, 2455, 2458, 2462, 2465, + 2468, 2473, 2478, 2482 }; static const short yyrhs[] = { -1, 107, 0, 0, 108, 112, 0, 107, 112, 0, 0, - 0, 25, 0, 26, 0, 0, 113, 114, 0, 129, - 0, 128, 0, 122, 0, 120, 0, 111, 88, 179, + 0, 25, 0, 26, 0, 0, 113, 114, 0, 130, + 0, 129, 0, 123, 0, 121, 0, 111, 88, 180, 102, 56, 0, 115, 54, 107, 103, 0, 115, 54, - 103, 0, 115, 109, 129, 110, 0, 115, 109, 128, + 103, 0, 115, 109, 130, 110, 0, 115, 109, 129, 110, 0, 95, 0, 0, 45, 69, 117, 118, 70, - 0, 119, 0, 118, 55, 119, 0, 220, 138, 0, - 220, 140, 60, 232, 0, 327, 0, 39, 121, 56, - 0, 3, 0, 121, 55, 3, 0, 0, 116, 222, - 54, 123, 56, 0, 0, 116, 223, 54, 124, 56, - 0, 0, 116, 222, 60, 125, 56, 0, 0, 116, - 223, 60, 126, 56, 0, 116, 222, 56, 0, 116, - 223, 56, 0, 116, 258, 330, 197, 206, 127, 0, - 116, 186, 183, 330, 197, 206, 127, 0, 116, 189, - 258, 127, 0, 116, 1, 103, 0, 116, 1, 56, - 0, 54, 0, 60, 0, 56, 0, 58, 0, 23, - 0, 196, 56, 0, 189, 195, 56, 0, 189, 258, - 56, 0, 186, 194, 56, 0, 186, 183, 56, 0, - 189, 56, 0, 141, 56, 0, 186, 56, 0, 1, - 56, 0, 1, 103, 0, 56, 0, 130, 134, 282, - 0, 130, 133, 134, 282, 0, 130, 180, 282, 0, - 130, 133, 56, 180, 282, 0, 130, 133, 180, 282, - 0, 186, 183, 1, 0, 189, 258, 1, 0, 258, - 1, 0, 186, 183, 330, 0, 189, 258, 330, 0, - 258, 330, 0, 94, 0, 186, 88, 322, 102, 250, - 330, 0, 186, 44, 250, 330, 0, 186, 183, 330, - 0, 189, 258, 330, 0, 258, 330, 0, 23, 3, - 0, 132, 0, 132, 58, 213, 0, 132, 88, 160, - 102, 0, 132, 44, 0, 60, 135, 136, 0, 0, - 0, 137, 0, 136, 55, 137, 0, 136, 1, 0, - 88, 160, 102, 0, 44, 0, 139, 88, 160, 102, - 0, 139, 44, 0, 268, 88, 160, 102, 0, 268, - 44, 0, 262, 88, 160, 102, 0, 262, 44, 0, - 3, 0, 4, 0, 53, 0, 3, 0, 53, 0, - 99, 0, 98, 0, 100, 0, 45, 221, 149, 0, - 45, 186, 183, 0, 5, 45, 221, 149, 0, 5, - 45, 186, 183, 0, 143, 144, 149, 0, 53, 69, - 145, 70, 0, 4, 69, 145, 70, 0, 0, 146, - 0, 145, 55, 146, 0, 185, 0, 168, 0, 0, - 97, 229, 148, 234, 235, 103, 0, 0, 147, 0, - 0, 147, 150, 0, 74, 0, 73, 0, 81, 0, - 82, 0, 104, 0, 159, 0, 168, 0, 44, 0, - 88, 152, 102, 0, 44, 0, 88, 156, 102, 0, - 0, 156, 0, 1, 0, 0, 311, 183, 330, 197, - 206, 58, 157, 213, 0, 152, 0, 54, 103, 0, - 54, 279, 276, 103, 0, 54, 279, 1, 103, 0, - 289, 0, 168, 55, 168, 0, 168, 55, 1, 0, - 159, 55, 168, 0, 159, 55, 1, 0, 168, 0, - 159, 0, 173, 0, 0, 33, 162, 166, 0, 75, - 166, 0, 65, 166, 0, 83, 166, 0, 151, 166, - 0, 62, 138, 0, 11, 161, 0, 11, 88, 185, - 102, 0, 28, 161, 0, 28, 88, 185, 102, 0, - 176, 249, 0, 176, 249, 164, 0, 176, 163, 249, - 0, 176, 163, 249, 164, 0, 176, 88, 185, 102, - 0, 176, 88, 185, 102, 164, 0, 176, 163, 88, - 185, 102, 0, 176, 163, 88, 185, 102, 164, 0, - 177, 166, 0, 177, 89, 105, 166, 0, 177, 89, - 152, 105, 166, 0, 88, 160, 102, 0, 54, 160, - 103, 0, 88, 160, 102, 0, 44, 0, 88, 192, - 102, 0, 58, 213, 0, 88, 185, 102, 0, 165, - 88, 185, 102, 0, 167, 0, 165, 167, 0, 165, - 54, 214, 218, 103, 0, 161, 0, 29, 88, 152, - 102, 0, 30, 88, 152, 102, 0, 30, 88, 4, - 102, 0, 166, 0, 168, 78, 168, 0, 168, 79, - 168, 0, 168, 73, 168, 0, 168, 74, 168, 0, - 168, 75, 168, 0, 168, 76, 168, 0, 168, 77, - 168, 0, 168, 71, 168, 0, 168, 72, 168, 0, - 168, 68, 168, 0, 168, 69, 168, 0, 168, 70, - 168, 0, 168, 67, 168, 0, 168, 66, 168, 0, - 168, 65, 168, 0, 168, 63, 168, 0, 168, 64, - 168, 0, 168, 62, 168, 0, 168, 61, 168, 0, - 168, 59, 317, 60, 168, 0, 168, 58, 168, 0, - 168, 57, 168, 0, 92, 0, 92, 168, 0, 83, - 328, 138, 0, 335, 0, 3, 0, 53, 0, 169, - 0, 4, 0, 169, 0, 262, 0, 75, 171, 0, - 65, 171, 0, 260, 0, 169, 0, 262, 0, 169, - 0, 8, 0, 178, 0, 179, 0, 88, 152, 102, - 0, 88, 1, 102, 0, 0, 88, 174, 283, 102, - 0, 0, 173, 88, 160, 102, 175, 150, 0, 173, - 44, 0, 173, 89, 152, 105, 0, 173, 81, 0, - 173, 82, 0, 40, 0, 7, 88, 160, 102, 0, - 264, 0, 47, 69, 185, 70, 88, 152, 102, 0, - 48, 69, 185, 70, 88, 152, 102, 0, 49, 69, - 185, 70, 88, 152, 102, 0, 50, 69, 185, 70, - 88, 152, 102, 0, 46, 88, 152, 102, 0, 46, - 88, 185, 102, 0, 271, 3, 0, 271, 335, 0, - 263, 0, 263, 88, 160, 102, 0, 263, 44, 0, - 181, 170, 0, 181, 261, 0, 181, 170, 88, 160, - 102, 0, 181, 170, 44, 0, 181, 261, 88, 160, - 102, 0, 181, 261, 44, 0, 181, 83, 6, 44, - 0, 181, 6, 51, 83, 6, 44, 0, 38, 0, - 271, 38, 0, 37, 0, 271, 177, 0, 42, 0, - 43, 0, 9, 0, 179, 9, 0, 0, 173, 87, - 0, 173, 86, 0, 192, 183, 56, 0, 186, 183, - 56, 0, 192, 194, 56, 0, 186, 194, 56, 0, - 189, 195, 56, 0, 186, 56, 0, 189, 56, 0, - 254, 0, 258, 0, 44, 0, 184, 44, 0, 190, - 274, 0, 251, 274, 0, 192, 274, 0, 190, 0, - 251, 0, 190, 0, 187, 0, 189, 192, 0, 192, - 188, 0, 189, 192, 188, 0, 189, 192, 191, 0, - 189, 192, 191, 188, 0, 5, 0, 188, 193, 0, - 188, 5, 0, 251, 0, 5, 0, 189, 7, 0, - 189, 5, 0, 192, 0, 251, 192, 0, 192, 191, - 0, 251, 192, 191, 0, 193, 0, 191, 193, 0, - 215, 0, 6, 0, 268, 0, 27, 88, 152, 102, - 0, 27, 88, 185, 102, 0, 31, 88, 152, 102, - 0, 31, 88, 185, 102, 0, 6, 0, 7, 0, - 215, 0, 198, 0, 194, 55, 200, 0, 202, 0, - 195, 55, 200, 0, 204, 0, 196, 55, 200, 0, - 0, 111, 88, 179, 102, 0, 0, 183, 330, 197, - 206, 58, 199, 213, 0, 183, 330, 197, 206, 0, - 0, 183, 330, 197, 206, 58, 201, 213, 0, 183, - 330, 197, 206, 0, 0, 258, 330, 197, 206, 58, - 203, 213, 0, 258, 330, 197, 206, 0, 0, 258, - 330, 197, 206, 58, 205, 213, 0, 258, 330, 197, - 206, 0, 0, 207, 0, 208, 0, 207, 208, 0, - 32, 88, 88, 209, 102, 102, 0, 210, 0, 209, - 55, 210, 0, 0, 211, 0, 211, 88, 3, 102, - 0, 211, 88, 3, 55, 160, 102, 0, 211, 88, - 160, 102, 0, 138, 0, 5, 0, 6, 0, 7, - 0, 138, 0, 212, 55, 138, 0, 168, 0, 54, - 103, 0, 54, 214, 103, 0, 54, 214, 55, 103, - 0, 1, 0, 213, 0, 214, 55, 213, 0, 89, - 168, 105, 213, 0, 214, 55, 19, 168, 60, 213, - 0, 138, 60, 213, 0, 214, 55, 138, 60, 213, - 0, 0, 12, 138, 54, 216, 247, 219, 103, 0, - 12, 138, 54, 103, 0, 0, 12, 54, 217, 247, - 219, 103, 0, 12, 54, 103, 0, 12, 138, 0, - 12, 269, 0, 228, 234, 235, 103, 0, 228, 0, - 0, 55, 0, 0, 55, 0, 35, 0, 220, 5, - 0, 220, 6, 0, 220, 7, 0, 220, 35, 0, - 220, 143, 56, 0, 220, 138, 0, 220, 269, 0, - 220, 142, 0, 220, 143, 54, 0, 220, 143, 60, - 0, 221, 0, 220, 140, 0, 0, 0, 222, 224, - 229, 0, 223, 225, 229, 0, 220, 54, 0, 227, - 0, 226, 0, 0, 60, 0, 60, 230, 0, 231, - 0, 230, 55, 231, 0, 232, 0, 233, 232, 0, - 268, 0, 31, 88, 152, 102, 0, 31, 88, 185, - 102, 0, 36, 0, 5, 0, 233, 36, 0, 233, - 5, 0, 54, 0, 0, 236, 0, 235, 36, 60, - 236, 0, 235, 36, 60, 0, 237, 0, 236, 237, - 0, 236, 56, 0, 238, 56, 0, 238, 103, 0, - 131, 60, 0, 131, 54, 0, 186, 239, 0, 189, - 240, 0, 258, 330, 197, 206, 0, 60, 168, 0, - 1, 0, 186, 88, 322, 102, 250, 0, 186, 44, - 250, 0, 0, 241, 0, 239, 55, 242, 0, 0, - 244, 0, 240, 55, 246, 0, 243, 0, 244, 0, - 245, 0, 246, 0, 254, 330, 197, 206, 0, 254, - 330, 197, 206, 58, 213, 0, 4, 60, 168, 206, - 0, 258, 330, 197, 206, 0, 258, 330, 197, 206, - 58, 213, 0, 3, 60, 168, 206, 0, 60, 168, - 206, 0, 254, 330, 197, 206, 0, 254, 330, 197, - 206, 58, 213, 0, 4, 60, 168, 206, 0, 258, - 330, 197, 206, 0, 258, 330, 197, 206, 58, 213, - 0, 3, 60, 168, 206, 0, 60, 168, 206, 0, - 248, 0, 247, 55, 248, 0, 138, 0, 138, 58, - 168, 0, 311, 272, 0, 311, 0, 88, 185, 102, - 89, 152, 105, 0, 0, 250, 7, 0, 7, 0, - 251, 7, 0, 0, 253, 152, 0, 75, 251, 254, - 0, 65, 251, 254, 0, 75, 254, 0, 65, 254, - 0, 270, 250, 254, 0, 257, 0, 265, 0, 256, - 0, 266, 265, 0, 257, 88, 160, 102, 250, 0, - 257, 88, 322, 102, 250, 0, 257, 44, 250, 0, - 257, 88, 1, 102, 250, 0, 257, 89, 252, 105, - 0, 257, 89, 105, 0, 88, 254, 102, 0, 266, - 265, 0, 265, 0, 75, 251, 258, 0, 65, 251, - 258, 0, 75, 258, 0, 65, 258, 0, 270, 250, - 258, 0, 172, 0, 75, 251, 258, 0, 65, 251, - 258, 0, 75, 259, 0, 65, 259, 0, 270, 250, - 258, 0, 260, 0, 172, 88, 160, 102, 250, 0, - 172, 88, 322, 102, 250, 0, 172, 44, 250, 0, - 172, 88, 1, 102, 250, 0, 88, 171, 102, 0, - 88, 259, 102, 0, 172, 89, 252, 105, 0, 172, - 89, 105, 0, 266, 170, 0, 266, 169, 0, 262, - 0, 271, 262, 0, 192, 88, 160, 102, 0, 192, - 88, 171, 102, 0, 192, 184, 0, 4, 0, 142, - 0, 267, 0, 266, 267, 0, 4, 51, 0, 142, - 51, 0, 255, 0, 271, 255, 0, 256, 0, 271, - 255, 0, 266, 75, 0, 271, 266, 75, 0, 51, - 0, 75, 250, 272, 0, 75, 250, 0, 65, 250, - 272, 0, 65, 250, 0, 270, 250, 0, 270, 250, - 272, 0, 273, 0, 89, 152, 105, 0, 273, 89, - 252, 105, 0, 75, 251, 274, 0, 75, 274, 0, - 75, 251, 0, 75, 0, 65, 251, 274, 0, 65, - 274, 0, 65, 251, 0, 65, 0, 270, 250, 0, - 270, 250, 274, 0, 275, 0, 88, 274, 102, 0, - 85, 0, 275, 88, 322, 102, 250, 0, 275, 44, - 250, 0, 275, 89, 252, 105, 0, 275, 89, 105, - 0, 88, 323, 102, 250, 0, 165, 250, 0, 184, - 250, 0, 89, 252, 105, 0, 89, 105, 0, 288, - 0, 277, 0, 276, 288, 0, 276, 277, 0, 1, - 56, 0, 0, 0, 280, 0, 281, 0, 280, 281, - 0, 34, 212, 56, 0, 283, 0, 1, 283, 0, - 54, 278, 103, 0, 54, 278, 279, 276, 103, 0, - 54, 278, 279, 276, 1, 103, 0, 54, 278, 279, - 1, 103, 0, 0, 0, 13, 285, 278, 154, 286, - 287, 0, 283, 0, 278, 289, 0, 283, 0, 289, - 0, 182, 0, 152, 56, 0, 0, 284, 14, 290, - 287, 0, 284, 0, 0, 0, 15, 291, 278, 154, - 292, 158, 0, 0, 0, 16, 293, 287, 15, 294, - 153, 56, 0, 0, 0, 0, 314, 295, 278, 155, - 56, 296, 317, 102, 297, 158, 0, 0, 0, 0, - 315, 298, 278, 155, 56, 299, 317, 102, 300, 158, - 0, 0, 18, 278, 88, 156, 102, 301, 287, 0, - 0, 19, 168, 60, 302, 288, 0, 0, 19, 168, - 10, 168, 60, 303, 288, 0, 0, 20, 60, 304, - 288, 0, 21, 56, 0, 22, 56, 0, 23, 56, - 0, 23, 152, 56, 0, 111, 316, 88, 179, 102, - 56, 0, 111, 316, 88, 179, 60, 318, 102, 56, - 0, 111, 316, 88, 179, 60, 318, 60, 318, 102, - 56, 0, 111, 316, 88, 179, 60, 318, 60, 318, - 60, 321, 102, 56, 0, 24, 75, 152, 56, 0, - 24, 138, 56, 0, 313, 288, 0, 313, 103, 0, - 56, 0, 305, 0, 0, 0, 90, 54, 278, 306, - 308, 307, 309, 0, 103, 0, 276, 103, 0, 1, - 103, 0, 0, 0, 309, 91, 310, 312, 283, 0, - 190, 0, 251, 0, 88, 10, 102, 0, 88, 327, - 102, 0, 3, 60, 0, 53, 60, 0, 17, 88, - 56, 0, 17, 88, 152, 56, 0, 17, 88, 54, - 103, 0, 17, 88, 182, 0, 17, 88, 1, 56, - 0, 17, 88, 54, 278, 276, 103, 0, 17, 88, - 54, 278, 1, 103, 0, 0, 7, 0, 0, 152, - 0, 1, 0, 0, 319, 0, 320, 0, 319, 55, - 320, 0, 9, 88, 152, 102, 0, 9, 0, 321, - 55, 9, 0, 0, 323, 0, 185, 0, 324, 0, - 325, 10, 0, 324, 10, 0, 185, 10, 0, 10, - 0, 93, 0, 324, 93, 0, 185, 93, 0, 324, - 60, 0, 185, 60, 0, 326, 0, 327, 58, 213, - 0, 325, 327, 0, 325, 327, 58, 213, 0, 325, - 329, 0, 325, 329, 58, 213, 0, 324, 55, 0, - 185, 55, 0, 187, 183, 0, 190, 183, 0, 192, - 183, 0, 187, 274, 0, 187, 0, 189, 258, 0, - 326, 0, 185, 0, 0, 0, 258, 0, 0, 92, - 88, 332, 102, 0, 185, 0, 331, 0, 332, 55, - 331, 0, 0, 75, 250, 333, 0, 65, 250, 333, - 0, 270, 250, 333, 0, 41, 0, 334, 75, 0, - 334, 76, 0, 334, 77, 0, 334, 73, 0, 334, - 74, 0, 334, 65, 0, 334, 63, 0, 334, 64, - 0, 334, 83, 0, 334, 55, 0, 334, 68, 0, - 334, 69, 0, 334, 70, 0, 334, 67, 0, 334, - 57, 0, 334, 58, 0, 334, 71, 0, 334, 72, - 0, 334, 81, 0, 334, 82, 0, 334, 62, 0, - 334, 61, 0, 334, 104, 0, 334, 59, 60, 0, - 334, 66, 0, 334, 86, 0, 334, 78, 0, 334, - 44, 0, 334, 89, 105, 0, 334, 38, 0, 334, - 37, 0, 334, 38, 89, 105, 0, 334, 37, 89, - 105, 0, 334, 311, 333, 0, 334, 1, 0 + 0, 120, 0, 118, 55, 120, 0, 221, 0, 221, + 139, 0, 119, 0, 119, 58, 193, 0, 328, 0, + 39, 122, 56, 0, 3, 0, 122, 55, 3, 0, + 0, 116, 223, 54, 124, 56, 0, 0, 116, 224, + 54, 125, 56, 0, 0, 116, 223, 60, 126, 56, + 0, 0, 116, 224, 60, 127, 56, 0, 116, 223, + 56, 0, 116, 224, 56, 0, 116, 259, 332, 198, + 207, 128, 0, 116, 187, 184, 332, 198, 207, 128, + 0, 116, 190, 259, 128, 0, 116, 1, 103, 0, + 116, 1, 56, 0, 54, 0, 60, 0, 56, 0, + 58, 0, 23, 0, 197, 56, 0, 190, 196, 56, + 0, 190, 259, 56, 0, 187, 195, 56, 0, 187, + 184, 56, 0, 190, 56, 0, 142, 56, 0, 187, + 56, 0, 1, 56, 0, 1, 103, 0, 56, 0, + 131, 135, 283, 0, 131, 134, 135, 283, 0, 131, + 181, 283, 0, 131, 134, 56, 181, 283, 0, 131, + 134, 181, 283, 0, 187, 184, 1, 0, 190, 259, + 1, 0, 259, 1, 0, 187, 184, 332, 0, 190, + 259, 332, 0, 259, 332, 0, 94, 0, 187, 88, + 323, 102, 251, 332, 0, 187, 44, 251, 332, 0, + 187, 184, 332, 0, 190, 259, 332, 0, 259, 332, + 0, 23, 3, 0, 133, 0, 133, 58, 214, 0, + 133, 88, 161, 102, 0, 133, 44, 0, 60, 136, + 137, 0, 0, 0, 138, 0, 137, 55, 138, 0, + 137, 1, 0, 88, 161, 102, 0, 44, 0, 140, + 88, 161, 102, 0, 140, 44, 0, 269, 88, 161, + 102, 0, 269, 44, 0, 263, 88, 161, 102, 0, + 263, 44, 0, 3, 0, 4, 0, 53, 0, 3, + 0, 53, 0, 99, 0, 98, 0, 100, 0, 45, + 222, 150, 0, 45, 187, 184, 0, 5, 45, 222, + 150, 0, 5, 45, 187, 184, 0, 144, 145, 150, + 0, 53, 69, 146, 70, 0, 53, 69, 70, 0, + 4, 69, 146, 70, 0, 0, 147, 0, 146, 55, + 147, 0, 186, 0, 169, 0, 0, 97, 230, 149, + 235, 236, 103, 0, 0, 148, 0, 0, 148, 151, + 0, 74, 0, 73, 0, 81, 0, 82, 0, 104, + 0, 160, 0, 169, 0, 44, 0, 88, 153, 102, + 0, 44, 0, 88, 157, 102, 0, 0, 157, 0, + 1, 0, 0, 312, 184, 332, 198, 207, 58, 158, + 214, 0, 153, 0, 54, 103, 0, 54, 280, 277, + 103, 0, 54, 280, 1, 103, 0, 290, 0, 169, + 55, 169, 0, 169, 55, 1, 0, 160, 55, 169, + 0, 160, 55, 1, 0, 169, 0, 160, 0, 174, + 0, 0, 33, 163, 167, 0, 75, 167, 0, 65, + 167, 0, 83, 167, 0, 152, 167, 0, 62, 139, + 0, 11, 162, 0, 11, 88, 186, 102, 0, 28, + 162, 0, 28, 88, 186, 102, 0, 177, 250, 0, + 177, 250, 165, 0, 177, 164, 250, 0, 177, 164, + 250, 165, 0, 177, 88, 186, 102, 0, 177, 88, + 186, 102, 165, 0, 177, 164, 88, 186, 102, 0, + 177, 164, 88, 186, 102, 165, 0, 178, 167, 0, + 178, 89, 105, 167, 0, 178, 89, 153, 105, 167, + 0, 88, 161, 102, 0, 54, 161, 103, 0, 88, + 161, 102, 0, 44, 0, 88, 193, 102, 0, 58, + 214, 0, 88, 186, 102, 0, 166, 88, 186, 102, + 0, 168, 0, 166, 168, 0, 166, 54, 215, 219, + 103, 0, 162, 0, 29, 88, 153, 102, 0, 30, + 88, 153, 102, 0, 30, 88, 4, 102, 0, 167, + 0, 169, 78, 169, 0, 169, 79, 169, 0, 169, + 73, 169, 0, 169, 74, 169, 0, 169, 75, 169, + 0, 169, 76, 169, 0, 169, 77, 169, 0, 169, + 71, 169, 0, 169, 72, 169, 0, 169, 68, 169, + 0, 169, 69, 169, 0, 169, 70, 169, 0, 169, + 67, 169, 0, 169, 66, 169, 0, 169, 65, 169, + 0, 169, 63, 169, 0, 169, 64, 169, 0, 169, + 62, 169, 0, 169, 61, 169, 0, 169, 59, 318, + 60, 169, 0, 169, 58, 169, 0, 169, 57, 169, + 0, 92, 0, 92, 169, 0, 83, 330, 139, 0, + 337, 0, 3, 0, 53, 0, 170, 0, 4, 0, + 170, 0, 263, 0, 75, 172, 0, 65, 172, 0, + 88, 172, 102, 0, 261, 0, 170, 0, 263, 0, + 88, 172, 102, 0, 170, 0, 8, 0, 179, 0, + 180, 0, 88, 153, 102, 0, 88, 1, 102, 0, + 0, 88, 175, 284, 102, 0, 0, 174, 88, 161, + 102, 176, 151, 0, 174, 44, 0, 174, 89, 153, + 105, 0, 174, 81, 0, 174, 82, 0, 40, 0, + 7, 88, 161, 102, 0, 265, 0, 47, 69, 186, + 70, 88, 153, 102, 0, 48, 69, 186, 70, 88, + 153, 102, 0, 49, 69, 186, 70, 88, 153, 102, + 0, 50, 69, 186, 70, 88, 153, 102, 0, 46, + 88, 153, 102, 0, 46, 88, 186, 102, 0, 272, + 3, 0, 272, 337, 0, 264, 0, 264, 88, 161, + 102, 0, 264, 44, 0, 182, 171, 0, 182, 262, + 0, 182, 171, 88, 161, 102, 0, 182, 171, 44, + 0, 182, 262, 88, 161, 102, 0, 182, 262, 44, + 0, 182, 83, 6, 44, 0, 182, 6, 51, 83, + 6, 44, 0, 38, 0, 272, 38, 0, 37, 0, + 272, 178, 0, 42, 0, 43, 0, 9, 0, 180, + 9, 0, 0, 174, 87, 0, 174, 86, 0, 193, + 184, 56, 0, 187, 184, 56, 0, 193, 195, 56, + 0, 187, 195, 56, 0, 190, 196, 56, 0, 187, + 56, 0, 190, 56, 0, 255, 0, 259, 0, 44, + 0, 185, 44, 0, 191, 275, 0, 252, 275, 0, + 193, 275, 0, 191, 0, 252, 0, 191, 0, 188, + 0, 190, 193, 0, 193, 189, 0, 190, 193, 189, + 0, 190, 193, 192, 0, 190, 193, 192, 189, 0, + 5, 0, 189, 194, 0, 189, 5, 0, 252, 0, + 5, 0, 190, 7, 0, 190, 5, 0, 193, 0, + 252, 193, 0, 193, 192, 0, 252, 193, 192, 0, + 194, 0, 192, 194, 0, 216, 0, 6, 0, 269, + 0, 27, 88, 153, 102, 0, 27, 88, 186, 102, + 0, 31, 88, 153, 102, 0, 31, 88, 186, 102, + 0, 6, 0, 7, 0, 216, 0, 199, 0, 195, + 55, 201, 0, 203, 0, 196, 55, 201, 0, 205, + 0, 197, 55, 201, 0, 0, 111, 88, 180, 102, + 0, 0, 184, 332, 198, 207, 58, 200, 214, 0, + 184, 332, 198, 207, 0, 0, 184, 332, 198, 207, + 58, 202, 214, 0, 184, 332, 198, 207, 0, 0, + 259, 332, 198, 207, 58, 204, 214, 0, 259, 332, + 198, 207, 0, 0, 259, 332, 198, 207, 58, 206, + 214, 0, 259, 332, 198, 207, 0, 0, 208, 0, + 209, 0, 208, 209, 0, 32, 88, 88, 210, 102, + 102, 0, 211, 0, 210, 55, 211, 0, 0, 212, + 0, 212, 88, 3, 102, 0, 212, 88, 3, 55, + 161, 102, 0, 212, 88, 161, 102, 0, 139, 0, + 5, 0, 6, 0, 7, 0, 139, 0, 213, 55, + 139, 0, 169, 0, 54, 103, 0, 54, 215, 103, + 0, 54, 215, 55, 103, 0, 1, 0, 214, 0, + 215, 55, 214, 0, 89, 169, 105, 214, 0, 215, + 55, 19, 169, 60, 214, 0, 139, 60, 214, 0, + 215, 55, 139, 60, 214, 0, 0, 12, 139, 54, + 217, 248, 220, 103, 0, 12, 139, 54, 103, 0, + 0, 12, 54, 218, 248, 220, 103, 0, 12, 54, + 103, 0, 12, 139, 0, 12, 270, 0, 229, 235, + 236, 103, 0, 229, 0, 0, 55, 0, 0, 55, + 0, 35, 0, 221, 5, 0, 221, 6, 0, 221, + 7, 0, 221, 35, 0, 221, 144, 56, 0, 221, + 139, 0, 221, 270, 0, 221, 143, 0, 221, 144, + 54, 0, 221, 144, 60, 0, 222, 0, 221, 141, + 0, 0, 0, 223, 225, 230, 0, 224, 226, 230, + 0, 221, 54, 0, 228, 0, 227, 0, 0, 60, + 0, 60, 231, 0, 232, 0, 231, 55, 232, 0, + 233, 0, 234, 233, 0, 269, 0, 31, 88, 153, + 102, 0, 31, 88, 186, 102, 0, 36, 0, 5, + 0, 234, 36, 0, 234, 5, 0, 54, 0, 0, + 237, 0, 236, 36, 60, 237, 0, 236, 36, 60, + 0, 238, 0, 237, 238, 0, 237, 56, 0, 239, + 56, 0, 239, 103, 0, 132, 60, 0, 132, 54, + 0, 187, 240, 0, 190, 241, 0, 259, 332, 198, + 207, 0, 60, 169, 0, 1, 0, 187, 88, 323, + 102, 251, 0, 187, 44, 251, 0, 0, 242, 0, + 240, 55, 243, 0, 0, 245, 0, 241, 55, 247, + 0, 244, 0, 245, 0, 246, 0, 247, 0, 255, + 332, 198, 207, 0, 255, 332, 198, 207, 58, 214, + 0, 4, 60, 169, 207, 0, 259, 332, 198, 207, + 0, 259, 332, 198, 207, 58, 214, 0, 3, 60, + 169, 207, 0, 60, 169, 207, 0, 255, 332, 198, + 207, 0, 255, 332, 198, 207, 58, 214, 0, 4, + 60, 169, 207, 0, 259, 332, 198, 207, 0, 259, + 332, 198, 207, 58, 214, 0, 3, 60, 169, 207, + 0, 60, 169, 207, 0, 249, 0, 248, 55, 249, + 0, 139, 0, 139, 58, 169, 0, 312, 273, 0, + 312, 0, 88, 186, 102, 89, 153, 105, 0, 0, + 251, 7, 0, 7, 0, 252, 7, 0, 0, 254, + 153, 0, 75, 252, 255, 0, 65, 252, 255, 0, + 75, 255, 0, 65, 255, 0, 271, 251, 255, 0, + 258, 0, 266, 0, 257, 0, 267, 266, 0, 258, + 88, 161, 102, 251, 0, 258, 88, 323, 102, 251, + 0, 258, 44, 251, 0, 258, 88, 1, 102, 251, + 0, 258, 89, 253, 105, 0, 258, 89, 105, 0, + 88, 255, 102, 0, 267, 266, 0, 266, 0, 75, + 252, 259, 0, 65, 252, 259, 0, 75, 259, 0, + 65, 259, 0, 271, 251, 259, 0, 173, 0, 75, + 252, 259, 0, 65, 252, 259, 0, 75, 260, 0, + 65, 260, 0, 271, 251, 259, 0, 261, 0, 173, + 88, 161, 102, 251, 0, 173, 88, 323, 102, 251, + 0, 173, 44, 251, 0, 173, 88, 1, 102, 251, + 0, 88, 260, 102, 0, 173, 89, 253, 105, 0, + 173, 89, 105, 0, 267, 171, 0, 267, 170, 0, + 263, 0, 272, 263, 0, 193, 88, 161, 102, 0, + 193, 88, 172, 102, 0, 193, 185, 0, 4, 0, + 143, 0, 268, 0, 267, 268, 0, 4, 51, 0, + 143, 51, 0, 256, 0, 272, 256, 0, 257, 0, + 272, 256, 0, 267, 75, 0, 272, 267, 75, 0, + 51, 0, 75, 251, 273, 0, 75, 251, 0, 65, + 251, 273, 0, 65, 251, 0, 271, 251, 0, 271, + 251, 273, 0, 274, 0, 89, 153, 105, 0, 274, + 89, 253, 105, 0, 75, 252, 275, 0, 75, 275, + 0, 75, 252, 0, 75, 0, 65, 252, 275, 0, + 65, 275, 0, 65, 252, 0, 65, 0, 271, 251, + 0, 271, 251, 275, 0, 276, 0, 88, 275, 102, + 0, 85, 0, 276, 88, 323, 102, 251, 0, 276, + 44, 251, 0, 276, 89, 253, 105, 0, 276, 89, + 105, 0, 88, 324, 102, 251, 0, 166, 251, 0, + 185, 251, 0, 89, 253, 105, 0, 89, 105, 0, + 289, 0, 278, 0, 277, 289, 0, 277, 278, 0, + 1, 56, 0, 0, 0, 281, 0, 282, 0, 281, + 282, 0, 34, 213, 56, 0, 284, 0, 1, 284, + 0, 54, 279, 103, 0, 54, 279, 280, 277, 103, + 0, 54, 279, 280, 277, 1, 103, 0, 54, 279, + 280, 1, 103, 0, 0, 0, 13, 286, 279, 155, + 287, 288, 0, 284, 0, 279, 290, 0, 284, 0, + 290, 0, 183, 0, 153, 56, 0, 0, 285, 14, + 291, 288, 0, 285, 0, 0, 0, 15, 292, 279, + 155, 293, 159, 0, 0, 0, 16, 294, 288, 15, + 295, 154, 56, 0, 0, 0, 0, 315, 296, 279, + 156, 56, 297, 318, 102, 298, 159, 0, 0, 0, + 0, 316, 299, 279, 156, 56, 300, 318, 102, 301, + 159, 0, 0, 18, 279, 88, 157, 102, 302, 288, + 0, 0, 19, 169, 60, 303, 289, 0, 0, 19, + 169, 10, 169, 60, 304, 289, 0, 0, 20, 60, + 305, 289, 0, 21, 56, 0, 22, 56, 0, 23, + 56, 0, 23, 153, 56, 0, 111, 317, 88, 180, + 102, 56, 0, 111, 317, 88, 180, 60, 319, 102, + 56, 0, 111, 317, 88, 180, 60, 319, 60, 319, + 102, 56, 0, 111, 317, 88, 180, 60, 319, 60, + 319, 60, 322, 102, 56, 0, 24, 75, 153, 56, + 0, 24, 139, 56, 0, 314, 289, 0, 314, 103, + 0, 56, 0, 306, 0, 0, 0, 90, 54, 279, + 307, 309, 308, 310, 0, 103, 0, 277, 103, 0, + 1, 103, 0, 0, 0, 310, 91, 311, 313, 284, + 0, 191, 0, 252, 0, 88, 10, 102, 0, 88, + 329, 102, 0, 3, 60, 0, 53, 60, 0, 4, + 60, 0, 17, 88, 56, 0, 17, 88, 153, 56, + 0, 17, 88, 54, 103, 0, 17, 88, 183, 0, + 17, 88, 1, 56, 0, 17, 88, 54, 279, 277, + 103, 0, 17, 88, 54, 279, 1, 103, 0, 0, + 7, 0, 0, 153, 0, 1, 0, 0, 320, 0, + 321, 0, 320, 55, 321, 0, 9, 88, 153, 102, + 0, 9, 0, 322, 55, 9, 0, 0, 324, 0, + 186, 0, 325, 0, 326, 10, 0, 325, 10, 0, + 186, 10, 0, 10, 0, 93, 0, 325, 93, 0, + 186, 93, 0, 325, 60, 0, 186, 60, 0, 327, + 0, 329, 58, 214, 0, 326, 328, 0, 326, 331, + 0, 326, 331, 58, 214, 0, 325, 55, 0, 186, + 55, 0, 188, 184, 0, 191, 184, 0, 193, 184, + 0, 188, 275, 0, 188, 0, 190, 259, 0, 329, + 0, 329, 58, 214, 0, 327, 0, 186, 0, 0, + 0, 259, 0, 0, 92, 88, 334, 102, 0, 186, + 0, 333, 0, 334, 55, 333, 0, 0, 75, 251, + 335, 0, 65, 251, 335, 0, 271, 251, 335, 0, + 41, 0, 336, 75, 0, 336, 76, 0, 336, 77, + 0, 336, 73, 0, 336, 74, 0, 336, 65, 0, + 336, 63, 0, 336, 64, 0, 336, 83, 0, 336, + 55, 0, 336, 68, 0, 336, 69, 0, 336, 70, + 0, 336, 67, 0, 336, 57, 0, 336, 58, 0, + 336, 71, 0, 336, 72, 0, 336, 81, 0, 336, + 82, 0, 336, 62, 0, 336, 61, 0, 336, 104, + 0, 336, 59, 60, 0, 336, 66, 0, 336, 86, + 0, 336, 78, 0, 336, 44, 0, 336, 89, 105, + 0, 336, 38, 0, 336, 37, 0, 336, 38, 89, + 105, 0, 336, 37, 89, 105, 0, 336, 312, 335, + 0, 336, 1, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 291, 292, 306, 308, 309, 313, 318, 322, 324, 327, - 330, 334, 337, 339, 341, 342, 345, 347, 349, 352, - 357, 362, 365, 369, 372, 376, 392, 401, 404, 409, - 411, 415, 421, 421, 424, 424, 427, 427, 442, 442, - 447, 452, 469, 492, 502, 503, 506, 507, 508, 509, - 510, 513, 516, 519, 524, 529, 535, 537, 538, 557, - 558, 559, 562, 576, 589, 592, 595, 598, 600, 602, - 606, 612, 617, 622, 629, 640, 647, 649, 651, 655, - 663, 665, 667, 669, 673, 686, 709, 712, 714, 715, - 718, 724, 730, 732, 734, 736, 739, 743, 749, 751, - 752, 755, 757, 760, 762, 763, 766, 769, 771, 773, - 777, 782, 785, 789, 794, 797, 801, 804, 807, 841, - 857, 860, 864, 867, 871, 873, 875, 877, 879, 883, - 885, 888, 893, 897, 902, 906, 909, 910, 914, 933, - 940, 943, 946, 948, 950, 954, 958, 961, 963, 967, - 970, 973, 982, 985, 988, 990, 992, 994, 1001, 1012, - 1032, 1034, 1036, 1041, 1043, 1045, 1047, 1049, 1052, 1054, - 1056, 1059, 1061, 1065, 1071, 1074, 1081, 1084, 1086, 1094, - 1103, 1109, 1115, 1117, 1119, 1132, 1134, 1136, 1138, 1155, - 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, 1176, - 1178, 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, - 1198, 1200, 1207, 1209, 1226, 1229, 1230, 1231, 1234, 1236, - 1239, 1241, 1242, 1244, 1248, 1250, 1251, 1256, 1276, 1277, - 1278, 1280, 1282, 1284, 1292, 1313, 1318, 1325, 1332, 1334, - 1343, 1348, 1371, 1415, 1416, 1419, 1422, 1425, 1428, 1430, - 1433, 1472, 1479, 1481, 1483, 1485, 1487, 1489, 1504, 1519, - 1530, 1542, 1549, 1598, 1600, 1604, 1606, 1610, 1613, 1618, - 1620, 1624, 1637, 1638, 1644, 1655, 1663, 1669, 1674, 1676, - 1681, 1688, 1690, 1694, 1698, 1704, 1707, 1709, 1711, 1713, - 1721, 1723, 1725, 1728, 1730, 1732, 1734, 1739, 1745, 1747, - 1758, 1761, 1763, 1766, 1781, 1784, 1786, 1788, 1792, 1795, - 1803, 1804, 1805, 1806, 1810, 1814, 1828, 1846, 1847, 1848, - 1851, 1853, 1856, 1858, 1861, 1863, 1866, 1869, 1873, 1890, - 1892, 1910, 1916, 1917, 1923, 1931, 1933, 1942, 1950, 1952, - 1963, 1966, 1970, 1973, 1977, 1982, 1985, 1989, 1992, 1994, - 1996, 1998, 2005, 2007, 2008, 2009, 2013, 2016, 2020, 2022, - 2025, 2028, 2031, 2037, 2040, 2043, 2045, 2047, 2049, 2053, - 2057, 2061, 2064, 2067, 2071, 2074, 2076, 2080, 2131, 2146, - 2148, 2151, 2153, 2157, 2158, 2160, 2162, 2164, 2168, 2177, - 2180, 2182, 2184, 2190, 2192, 2195, 2200, 2203, 2206, 2215, - 2226, 2231, 2231, 2233, 2236, 2238, 2242, 2244, 2248, 2276, - 2307, 2309, 2331, 2355, 2357, 2361, 2387, 2396, 2424, 2427, - 2434, 2445, 2454, 2458, 2471, 2474, 2476, 2481, 2483, 2487, - 2495, 2499, 2502, 2504, 2515, 2520, 2528, 2531, 2532, 2543, - 2546, 2547, 2558, 2560, 2563, 2565, 2568, 2573, 2577, 2583, - 2588, 2592, 2596, 2602, 2606, 2609, 2614, 2618, 2621, 2624, - 2633, 2635, 2639, 2642, 2647, 2650, 2654, 2663, 2666, 2670, - 2673, 2681, 2683, 2688, 2691, 2693, 2695, 2697, 2701, 2704, - 2718, 2721, 2726, 2729, 2731, 2733, 2735, 2737, 2739, 2741, - 2745, 2751, 2754, 2756, 2758, 2760, 2764, 2767, 2770, 2772, - 2774, 2776, 2780, 2783, 2786, 2788, 2790, 2792, 2794, 2796, - 2798, 2802, 2808, 2814, 2816, 2820, 2823, 2825, 2829, 2831, - 2834, 2836, 2842, 2845, 2859, 2861, 2865, 2867, 2871, 2874, - 2880, 2886, 2889, 2891, 2893, 2895, 2899, 2903, 2907, 2910, - 2915, 2918, 2920, 2922, 2924, 2926, 2928, 2930, 2932, 2936, - 2940, 2944, 2948, 2949, 2951, 2953, 2955, 2957, 2959, 2961, - 2963, 2965, 2973, 2975, 2976, 2977, 2980, 2987, 2997, 2999, - 3004, 3006, 3009, 3023, 3026, 3029, 3033, 3037, 3041, 3047, - 3050, 3054, 3056, 3059, 3065, 3068, 3071, 3074, 3087, 3090, - 3095, 3101, 3106, 3109, 3114, 3118, 3121, 3127, 3132, 3135, - 3140, 3149, 3153, 3156, 3162, 3172, 3179, 3185, 3210, 3210, - 3242, 3242, 3258, 3258, 3262, 3266, 3269, 3274, 3281, 3290, - 3299, 3308, 3311, 3317, 3319, 3323, 3325, 3328, 3332, 3335, - 3338, 3346, 3350, 3356, 3358, 3360, 3364, 3366, 3369, 3382, - 3387, 3395, 3399, 3402, 3404, 3408, 3411, 3413, 3415, 3421, - 3425, 3429, 3432, 3433, 3439, 3441, 3444, 3446, 3450, 3455, - 3458, 3468, 3475, 3476, 3483, 3489, 3494, 3498, 3503, 3510, - 3514, 3518, 3523, 3534, 3548, 3551, 3553, 3555, 3557, 3559, - 3563, 3565, 3573, 3590, 3592, 3594, 3596, 3598, 3602, 3604, - 3607, 3629, 3635, 3642, 3645, 3649, 3654, 3656, 3663, 3666, - 3668, 3670, 3676, 3680, 3683, 3685, 3687, 3689, 3691, 3693, - 3695, 3697, 3699, 3701, 3703, 3705, 3707, 3709, 3711, 3713, - 3715, 3717, 3719, 3721, 3723, 3725, 3727, 3729, 3731, 3733, - 3735, 3737, 3739, 3741, 3743, 3745, 3748, 3750 + 292, 293, 307, 309, 310, 314, 319, 323, 325, 328, + 331, 335, 338, 340, 342, 343, 346, 348, 350, 353, + 358, 363, 366, 370, 373, 377, 387, 391, 401, 403, + 406, 411, 413, 417, 423, 423, 426, 426, 429, 429, + 444, 444, 449, 454, 471, 494, 504, 505, 508, 509, + 510, 511, 512, 515, 518, 521, 526, 531, 537, 539, + 540, 559, 560, 561, 564, 578, 591, 594, 597, 600, + 602, 604, 608, 614, 619, 624, 631, 642, 649, 651, + 653, 657, 665, 667, 669, 671, 675, 688, 711, 714, + 716, 717, 720, 726, 732, 734, 736, 738, 741, 745, + 751, 753, 754, 757, 759, 762, 764, 765, 768, 771, + 773, 775, 779, 784, 787, 789, 793, 798, 801, 805, + 808, 811, 845, 861, 864, 868, 871, 875, 877, 879, + 881, 883, 887, 889, 892, 897, 902, 907, 912, 915, + 918, 922, 941, 948, 951, 954, 956, 958, 962, 966, + 969, 971, 975, 978, 981, 990, 993, 996, 998, 1000, + 1002, 1009, 1020, 1040, 1042, 1044, 1049, 1051, 1053, 1055, + 1057, 1060, 1062, 1064, 1067, 1069, 1073, 1079, 1082, 1089, + 1092, 1094, 1102, 1111, 1117, 1123, 1125, 1127, 1140, 1142, + 1144, 1146, 1163, 1166, 1168, 1170, 1172, 1174, 1176, 1178, + 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, 1198, + 1200, 1202, 1204, 1206, 1208, 1215, 1217, 1234, 1237, 1238, + 1239, 1242, 1244, 1247, 1249, 1250, 1252, 1254, 1258, 1260, + 1261, 1264, 1268, 1288, 1289, 1290, 1292, 1294, 1296, 1304, + 1325, 1330, 1337, 1344, 1346, 1355, 1360, 1383, 1427, 1428, + 1431, 1434, 1437, 1440, 1442, 1445, 1484, 1491, 1493, 1495, + 1497, 1499, 1501, 1516, 1531, 1542, 1554, 1561, 1610, 1612, + 1616, 1618, 1622, 1625, 1630, 1632, 1636, 1649, 1650, 1656, + 1667, 1675, 1681, 1686, 1688, 1693, 1700, 1702, 1706, 1710, + 1716, 1719, 1721, 1723, 1725, 1733, 1735, 1737, 1740, 1742, + 1744, 1746, 1751, 1757, 1759, 1770, 1773, 1775, 1778, 1793, + 1796, 1798, 1800, 1804, 1807, 1815, 1816, 1817, 1818, 1822, + 1826, 1840, 1858, 1859, 1860, 1863, 1865, 1868, 1870, 1873, + 1875, 1878, 1881, 1885, 1902, 1904, 1922, 1928, 1929, 1935, + 1943, 1945, 1954, 1962, 1964, 1975, 1978, 1982, 1985, 1989, + 1994, 1997, 2001, 2004, 2006, 2008, 2010, 2017, 2019, 2020, + 2021, 2025, 2028, 2032, 2034, 2037, 2040, 2043, 2049, 2052, + 2055, 2057, 2059, 2061, 2065, 2069, 2073, 2076, 2079, 2083, + 2086, 2088, 2092, 2143, 2158, 2160, 2163, 2165, 2169, 2170, + 2172, 2174, 2176, 2180, 2189, 2192, 2194, 2196, 2202, 2204, + 2207, 2212, 2215, 2218, 2227, 2238, 2243, 2243, 2245, 2248, + 2250, 2254, 2256, 2260, 2288, 2319, 2321, 2343, 2367, 2369, + 2373, 2399, 2408, 2470, 2473, 2480, 2491, 2500, 2504, 2517, + 2520, 2522, 2527, 2529, 2533, 2541, 2545, 2548, 2550, 2561, + 2566, 2574, 2577, 2578, 2589, 2592, 2593, 2604, 2606, 2609, + 2611, 2614, 2619, 2623, 2629, 2634, 2638, 2642, 2648, 2652, + 2655, 2660, 2664, 2667, 2670, 2679, 2681, 2685, 2688, 2693, + 2696, 2700, 2709, 2712, 2716, 2719, 2727, 2729, 2734, 2737, + 2739, 2741, 2743, 2747, 2750, 2764, 2767, 2772, 2775, 2777, + 2779, 2781, 2783, 2785, 2787, 2791, 2797, 2800, 2802, 2804, + 2806, 2810, 2813, 2816, 2818, 2820, 2822, 2826, 2829, 2832, + 2834, 2836, 2838, 2840, 2842, 2846, 2852, 2858, 2860, 2864, + 2867, 2869, 2873, 2875, 2878, 2880, 2886, 2889, 2903, 2905, + 2909, 2911, 2915, 2918, 2924, 2930, 2933, 2935, 2937, 2939, + 2943, 2947, 2951, 2954, 2959, 2962, 2964, 2966, 2968, 2970, + 2972, 2974, 2976, 2980, 2984, 2988, 2992, 2993, 2995, 2997, + 2999, 3001, 3003, 3005, 3007, 3009, 3017, 3019, 3020, 3021, + 3024, 3031, 3041, 3043, 3048, 3050, 3053, 3067, 3070, 3073, + 3077, 3081, 3085, 3091, 3094, 3098, 3100, 3103, 3109, 3112, + 3115, 3118, 3131, 3134, 3139, 3145, 3150, 3153, 3158, 3162, + 3165, 3171, 3176, 3179, 3184, 3193, 3197, 3200, 3206, 3216, + 3223, 3229, 3254, 3254, 3286, 3286, 3302, 3302, 3306, 3310, + 3313, 3318, 3325, 3334, 3343, 3352, 3355, 3361, 3363, 3367, + 3369, 3372, 3376, 3379, 3382, 3390, 3394, 3400, 3402, 3404, + 3408, 3410, 3413, 3426, 3431, 3439, 3441, 3445, 3448, 3450, + 3454, 3457, 3459, 3461, 3467, 3471, 3475, 3478, 3479, 3485, + 3487, 3490, 3492, 3496, 3501, 3504, 3514, 3521, 3522, 3529, + 3535, 3540, 3544, 3549, 3556, 3560, 3564, 3569, 3580, 3594, + 3597, 3599, 3601, 3603, 3607, 3609, 3617, 3634, 3636, 3638, + 3640, 3642, 3646, 3649, 3653, 3655, 3658, 3680, 3686, 3693, + 3696, 3700, 3705, 3707, 3714, 3717, 3719, 3721, 3727, 3731, + 3734, 3736, 3738, 3740, 3742, 3744, 3746, 3748, 3750, 3752, + 3754, 3756, 3758, 3760, 3762, 3764, 3766, 3768, 3770, 3772, + 3774, 3776, 3778, 3780, 3782, 3784, 3786, 3788, 3790, 3792, + 3794, 3796, 3799, 3801 }; static const char * const yytname[] = { "$","error","$illegal.","IDENTIFIER", @@ -656,2065 +660,2086 @@ static const char * const yytname[] = { "$","error","$illegal.","IDENTIFIER", "ALL","PRE_PARSED_CLASS_DECL","TYPENAME_DEFN","IDENTIFIER_DEFN","PTYPENAME_DEFN", "END_OF_SAVED_INPUT","')'","'}'","'!'","']'","program","extdefs","@1",".hush_warning", ".warning_ok","asm_keyword","lang_extdef","@2","extdef","extern_lang_string", -"template_header","@3","template_parm_list","template_parm","overloaddef","ov_identifiers", -"template_def","@4","@5","@6","@7","fn_tmpl_end","datadef","fndef","fn.def1", -"fn.def2","return_id","return_init","base_init",".set_base_init","member_init_list", -"member_init","identifier","notype_identifier","identifier_defn","explicit_instantiation", -"template_type","template_type_name","tmpl.2","template_arg_list","template_arg", -"template_instantiate_once","@8","template_instantiation","template_instantiate_some", -"unop","expr","paren_expr_or_null","paren_cond_or_null","xcond","condition", -"@9","already_scoped_stmt","nontrivial_exprlist","nonnull_exprlist","unary_expr", -"@10","new_placement","new_initializer","regcast_or_absdcl","cast_expr","sub_cast_expr", -"expr_no_commas","notype_unqualified_id","unqualified_id","expr_or_declarator", -"direct_notype_declarator","primary","@11","@12","new","delete","boolean.literal", -"string","nodecls","object","decl","declarator","fcast_or_absdcl","type_id", -"typed_declspecs","typed_declspecs1","reserved_declspecs","declmods","typed_typespecs", -"reserved_typespecquals","typespec","typespecqual_reserved","initdecls","notype_initdecls", -"nomods_initdecls","maybeasm","initdcl0","@13","initdcl","@14","notype_initdcl0", -"@15","nomods_initdcl0","@16","maybe_attribute","attributes","attribute","attribute_list", -"attrib","any_word","identifiers_or_typenames","init","initlist","structsp", -"@17","@18","maybecomma","maybecomma_warn","aggr","specialization","named_class_head_sans_basetype", -"named_class_head_sans_basetype_defn","do_xref","do_xref_defn","named_class_head", -"unnamed_class_head","class_head","maybe_base_class_list","base_class_list", -"base_class","base_class.1","base_class_access_list","left_curly","opt.component_decl_list", -"component_decl_list","component_decl","component_decl_1","components","notype_components", -"component_declarator0","component_declarator","after_type_component_declarator0", -"notype_component_declarator0","after_type_component_declarator","notype_component_declarator", -"enumlist","enumerator","new_type_id","type_quals","nonempty_type_quals","nonmomentary_expr", -"@19","after_type_declarator","qualified_type_name","nested_type","direct_after_type_declarator", -"notype_declarator","complex_notype_declarator","complex_direct_notype_declarator", -"qualified_id","notype_qualified_id","overqualified_id","functional_cast","type_name", -"nested_name_specifier","nested_name_specifier_1","complete_type_name","complex_type_name", -"ptr_to_mem","global_scope","new_declarator","direct_new_declarator","absdcl", -"direct_abstract_declarator","stmts","errstmt",".pushlevel","maybe_label_decls", -"label_decls","label_decl","compstmt_or_error","compstmt","simple_if","@20", -"@21","implicitly_scoped_stmt","stmt","simple_stmt","@22","@23","@24","@25", -"@26","@27","@28","@29","@30","@31","@32","@33","@34","@35","@36","try_block", -"@37","@38","ansi_try_stmts","handler_seq","@39","type_specifier_seq","handler_args", -"label_colon","forhead.1","forhead.2","maybe_type_qual","xexpr","asm_operands", -"nonnull_asm_operands","asm_operand","asm_clobbers","parmlist","complex_parmlist", -"parms","parms_comma","named_parm","parm","see_typename","bad_parm","maybe_raises", -"ansi_raise_identifier","ansi_raise_identifiers","conversion_declarator","operator", -"operator_name","" +"template_header","@3","template_parm_list","template_type_parm","template_parm", +"overloaddef","ov_identifiers","template_def","@4","@5","@6","@7","fn_tmpl_end", +"datadef","fndef","fn.def1","fn.def2","return_id","return_init","base_init", +".set_base_init","member_init_list","member_init","identifier","notype_identifier", +"identifier_defn","explicit_instantiation","template_type","template_type_name", +"tmpl.2","template_arg_list","template_arg","template_instantiate_once","@8", +"template_instantiation","template_instantiate_some","unop","expr","paren_expr_or_null", +"paren_cond_or_null","xcond","condition","@9","already_scoped_stmt","nontrivial_exprlist", +"nonnull_exprlist","unary_expr","@10","new_placement","new_initializer","regcast_or_absdcl", +"cast_expr","sub_cast_expr","expr_no_commas","notype_unqualified_id","unqualified_id", +"expr_or_declarator","direct_notype_declarator","primary","@11","@12","new", +"delete","boolean.literal","string","nodecls","object","decl","declarator","fcast_or_absdcl", +"type_id","typed_declspecs","typed_declspecs1","reserved_declspecs","declmods", +"typed_typespecs","reserved_typespecquals","typespec","typespecqual_reserved", +"initdecls","notype_initdecls","nomods_initdecls","maybeasm","initdcl0","@13", +"initdcl","@14","notype_initdcl0","@15","nomods_initdcl0","@16","maybe_attribute", +"attributes","attribute","attribute_list","attrib","any_word","identifiers_or_typenames", +"init","initlist","structsp","@17","@18","maybecomma","maybecomma_warn","aggr", +"specialization","named_class_head_sans_basetype","named_class_head_sans_basetype_defn", +"do_xref","do_xref_defn","named_class_head","unnamed_class_head","class_head", +"maybe_base_class_list","base_class_list","base_class","base_class.1","base_class_access_list", +"left_curly","opt.component_decl_list","component_decl_list","component_decl", +"component_decl_1","components","notype_components","component_declarator0", +"component_declarator","after_type_component_declarator0","notype_component_declarator0", +"after_type_component_declarator","notype_component_declarator","enumlist","enumerator", +"new_type_id","type_quals","nonempty_type_quals","nonmomentary_expr","@19","after_type_declarator", +"qualified_type_name","nested_type","direct_after_type_declarator","notype_declarator", +"complex_notype_declarator","complex_direct_notype_declarator","qualified_id", +"notype_qualified_id","overqualified_id","functional_cast","type_name","nested_name_specifier", +"nested_name_specifier_1","complete_type_name","complex_type_name","ptr_to_mem", +"global_scope","new_declarator","direct_new_declarator","absdcl","direct_abstract_declarator", +"stmts","errstmt",".pushlevel","maybe_label_decls","label_decls","label_decl", +"compstmt_or_error","compstmt","simple_if","@20","@21","implicitly_scoped_stmt", +"stmt","simple_stmt","@22","@23","@24","@25","@26","@27","@28","@29","@30","@31", +"@32","@33","@34","@35","@36","try_block","@37","@38","ansi_try_stmts","handler_seq", +"@39","type_specifier_seq","handler_args","label_colon","forhead.1","forhead.2", +"maybe_type_qual","xexpr","asm_operands","nonnull_asm_operands","asm_operand", +"asm_clobbers","parmlist","complex_parmlist","parms","parms_comma","named_parm", +"full_parm","parm","see_typename","bad_parm","maybe_raises","ansi_raise_identifier", +"ansi_raise_identifiers","conversion_declarator","operator","operator_name", +"" }; #endif static const short yyr1[] = { 0, 106, 106, 108, 107, 107, 109, 110, 111, 111, 113, 112, 114, 114, 114, 114, 114, 114, 114, 114, 114, - 115, 117, 116, 118, 118, 119, 119, 119, 120, 121, - 121, 123, 122, 124, 122, 125, 122, 126, 122, 122, - 122, 122, 122, 122, 122, 122, 127, 127, 127, 127, - 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, - 130, 130, 130, 130, 131, 131, 131, 131, 131, 132, - 133, 133, 133, 133, 134, 135, 136, 136, 136, 136, - 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, - 138, 139, 139, 140, 140, 140, 141, 141, 141, 141, - 142, 143, 143, 144, 145, 145, 146, 146, 148, 147, - 149, 149, 150, 150, 151, 151, 151, 151, 151, 152, - 152, 153, 153, 154, 154, 155, 155, 155, 157, 156, - 156, 158, 158, 158, 158, 159, 159, 159, 159, 160, - 160, 161, 162, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 163, 163, 164, 164, 164, 164, - 165, 165, 166, 166, 166, 167, 167, 167, 167, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, - 171, 171, 171, 171, 172, 172, 172, 173, 173, 173, - 173, 173, 173, 174, 173, 175, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 176, 176, 177, 177, 178, 178, 179, - 179, 180, 181, 181, 182, 182, 182, 182, 182, 182, - 182, 183, 183, 184, 184, 185, 185, 185, 185, 185, - 186, 186, 187, 187, 187, 187, 187, 188, 188, 188, - 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, - 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, - 194, 194, 195, 195, 196, 196, 197, 197, 199, 198, - 198, 201, 200, 200, 203, 202, 202, 205, 204, 204, - 206, 206, 207, 207, 208, 209, 209, 210, 210, 210, - 210, 210, 211, 211, 211, 211, 212, 212, 213, 213, - 213, 213, 213, 214, 214, 214, 214, 214, 214, 216, - 215, 215, 217, 215, 215, 215, 215, 215, 215, 218, - 218, 219, 219, 220, 220, 220, 220, 220, 221, 222, - 222, 222, 222, 222, 222, 223, 224, 225, 226, 226, - 227, 228, 228, 229, 229, 229, 230, 230, 231, 231, - 232, 232, 232, 233, 233, 233, 233, 234, 235, 235, - 235, 235, 236, 236, 236, 237, 237, 237, 237, 238, - 238, 238, 238, 238, 238, 238, 239, 239, 239, 240, - 240, 240, 241, 241, 242, 242, 243, 243, 243, 244, - 244, 244, 244, 245, 245, 245, 246, 246, 246, 246, - 247, 247, 248, 248, 249, 249, 249, 250, 250, 251, - 251, 253, 252, 254, 254, 254, 254, 254, 254, 255, - 255, 256, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 258, 258, 258, 258, 258, 258, 259, 259, 259, - 259, 259, 259, 260, 260, 260, 260, 260, 260, 260, - 260, 261, 262, 263, 263, 264, 264, 264, 265, 265, - 266, 266, 267, 267, 268, 268, 269, 269, 270, 270, - 271, 272, 272, 272, 272, 272, 272, 272, 273, 273, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 275, 276, 276, 276, 276, 277, 278, 279, 279, - 280, 280, 281, 282, 282, 283, 283, 283, 283, 285, - 286, 284, 287, 287, 288, 288, 289, 289, 290, 289, - 289, 291, 292, 289, 293, 294, 289, 295, 296, 297, - 289, 298, 299, 300, 289, 301, 289, 302, 289, 303, - 289, 304, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 306, 307, 305, - 308, 308, 308, 309, 310, 309, 311, 311, 312, 312, - 313, 313, 314, 314, 314, 315, 315, 315, 315, 316, - 316, 317, 317, 317, 318, 318, 319, 319, 320, 321, - 321, 322, 322, 322, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 324, 324, 324, 324, 324, 324, - 325, 325, 326, 326, 326, 326, 326, 326, 327, 327, - 328, 329, 329, 330, 330, 331, 332, 332, 333, 333, - 333, 333, 334, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335 + 115, 117, 116, 118, 118, 119, 119, 120, 120, 120, + 121, 122, 122, 124, 123, 125, 123, 126, 123, 127, + 123, 123, 123, 123, 123, 123, 123, 123, 128, 128, + 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, + 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 132, 133, 134, 134, 134, 134, 135, 136, 137, 137, + 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, + 139, 139, 139, 140, 140, 141, 141, 141, 142, 142, + 142, 142, 143, 144, 144, 144, 145, 146, 146, 147, + 147, 149, 148, 150, 150, 151, 151, 152, 152, 152, + 152, 152, 153, 153, 154, 154, 155, 155, 156, 156, + 156, 158, 157, 157, 159, 159, 159, 159, 160, 160, + 160, 160, 161, 161, 162, 163, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 164, 164, 165, + 165, 165, 165, 166, 166, 167, 167, 167, 168, 168, + 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, + 170, 171, 171, 172, 172, 172, 172, 172, 173, 173, + 173, 173, 174, 174, 174, 174, 174, 174, 175, 174, + 176, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 177, 177, + 178, 178, 179, 179, 180, 180, 181, 182, 182, 183, + 183, 183, 183, 183, 183, 183, 184, 184, 185, 185, + 186, 186, 186, 186, 186, 187, 187, 188, 188, 188, + 188, 188, 189, 189, 189, 190, 190, 190, 190, 191, + 191, 191, 191, 192, 192, 193, 193, 193, 193, 193, + 193, 193, 194, 194, 194, 195, 195, 196, 196, 197, + 197, 198, 198, 200, 199, 199, 202, 201, 201, 204, + 203, 203, 206, 205, 205, 207, 207, 208, 208, 209, + 210, 210, 211, 211, 211, 211, 211, 212, 212, 212, + 212, 213, 213, 214, 214, 214, 214, 214, 215, 215, + 215, 215, 215, 215, 217, 216, 216, 218, 216, 216, + 216, 216, 216, 216, 219, 219, 220, 220, 221, 221, + 221, 221, 221, 222, 223, 223, 223, 223, 223, 223, + 224, 225, 226, 227, 227, 228, 229, 229, 230, 230, + 230, 231, 231, 232, 232, 233, 233, 233, 234, 234, + 234, 234, 235, 236, 236, 236, 236, 237, 237, 237, + 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, + 239, 240, 240, 240, 241, 241, 241, 242, 242, 243, + 243, 244, 244, 244, 245, 245, 245, 245, 246, 246, + 246, 247, 247, 247, 247, 248, 248, 249, 249, 250, + 250, 250, 251, 251, 252, 252, 254, 253, 255, 255, + 255, 255, 255, 255, 256, 256, 257, 258, 258, 258, + 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, + 259, 259, 260, 260, 260, 260, 260, 260, 261, 261, + 261, 261, 261, 261, 261, 262, 263, 264, 264, 265, + 265, 265, 266, 266, 267, 267, 268, 268, 269, 269, + 270, 270, 271, 271, 272, 273, 273, 273, 273, 273, + 273, 273, 274, 274, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, + 278, 279, 280, 280, 281, 281, 282, 283, 283, 284, + 284, 284, 284, 286, 287, 285, 288, 288, 289, 289, + 290, 290, 291, 290, 290, 292, 293, 290, 294, 295, + 290, 296, 297, 298, 290, 299, 300, 301, 290, 302, + 290, 303, 290, 304, 290, 305, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 307, 308, 306, 309, 309, 309, 310, 311, 310, + 312, 312, 313, 313, 314, 314, 314, 315, 315, 315, + 316, 316, 316, 316, 317, 317, 318, 318, 318, 319, + 319, 320, 320, 321, 322, 322, 323, 323, 323, 324, + 324, 324, 324, 324, 324, 324, 324, 324, 324, 325, + 325, 325, 325, 325, 326, 326, 327, 327, 327, 327, + 327, 327, 328, 328, 329, 329, 330, 331, 331, 332, + 332, 333, 334, 334, 335, 335, 335, 335, 336, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337 }; static const short yyr2[] = { 0, 0, 1, 0, 2, 2, 0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 5, 4, 3, 4, 4, - 1, 0, 5, 1, 3, 2, 4, 1, 3, 1, - 3, 0, 5, 0, 5, 0, 5, 0, 5, 3, - 3, 6, 7, 4, 3, 3, 1, 1, 1, 1, - 1, 2, 3, 3, 3, 3, 2, 2, 2, 2, - 2, 1, 3, 4, 3, 5, 4, 3, 3, 2, - 3, 3, 2, 1, 6, 4, 3, 3, 2, 2, - 1, 3, 4, 2, 3, 0, 0, 1, 3, 2, - 3, 1, 4, 2, 4, 2, 4, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, - 3, 4, 4, 0, 1, 3, 1, 1, 0, 6, - 0, 1, 0, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 3, 0, 1, 1, 0, 8, - 1, 2, 4, 4, 1, 3, 3, 3, 3, 1, - 1, 1, 0, 3, 2, 2, 2, 2, 2, 2, - 4, 2, 4, 2, 3, 3, 4, 4, 5, 5, - 6, 2, 4, 5, 3, 3, 3, 1, 3, 2, - 3, 4, 1, 2, 5, 1, 4, 4, 4, 1, + 1, 0, 5, 1, 3, 1, 2, 1, 3, 1, + 3, 1, 3, 0, 5, 0, 5, 0, 5, 0, + 5, 3, 3, 6, 7, 4, 3, 3, 1, 1, + 1, 1, 1, 2, 3, 3, 3, 3, 2, 2, + 2, 2, 2, 1, 3, 4, 3, 5, 4, 3, + 3, 2, 3, 3, 2, 1, 6, 4, 3, 3, + 2, 2, 1, 3, 4, 2, 3, 0, 0, 1, + 3, 2, 3, 1, 4, 2, 4, 2, 4, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 4, 4, 3, 4, 3, 4, 0, 1, 3, 1, + 1, 0, 6, 0, 1, 0, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 3, 0, 1, + 1, 0, 8, 1, 2, 4, 4, 1, 3, 3, + 3, 3, 1, 1, 1, 0, 3, 2, 2, 2, + 2, 2, 2, 4, 2, 4, 2, 3, 3, 4, + 4, 5, 5, 6, 2, 4, 5, 3, 3, 3, + 1, 3, 2, 3, 4, 1, 2, 5, 1, 4, + 4, 4, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, - 3, 3, 1, 2, 3, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 0, 4, 0, 6, 2, 4, 2, - 2, 1, 4, 1, 7, 7, 7, 7, 4, 4, - 2, 2, 1, 4, 2, 2, 2, 5, 3, 5, - 3, 4, 6, 1, 2, 1, 2, 1, 1, 1, - 2, 0, 2, 2, 3, 3, 3, 3, 3, 2, - 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 2, 2, 3, 3, 4, 1, 2, 2, - 1, 1, 2, 2, 1, 2, 2, 3, 1, 2, - 1, 1, 1, 4, 4, 4, 4, 1, 1, 1, - 1, 3, 1, 3, 1, 3, 0, 4, 0, 7, - 4, 0, 7, 4, 0, 7, 4, 0, 7, 4, - 0, 1, 1, 2, 6, 1, 3, 0, 1, 4, - 6, 4, 1, 1, 1, 1, 1, 3, 1, 2, - 3, 4, 1, 1, 3, 4, 6, 3, 5, 0, - 7, 4, 0, 6, 3, 2, 2, 4, 1, 0, - 1, 0, 1, 1, 2, 2, 2, 2, 3, 2, - 2, 2, 3, 3, 1, 2, 0, 0, 3, 3, - 2, 1, 1, 0, 1, 2, 1, 3, 1, 2, - 1, 4, 4, 1, 1, 2, 2, 1, 0, 1, - 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 4, 2, 1, 5, 3, 0, 1, 3, 0, - 1, 3, 1, 1, 1, 1, 4, 6, 4, 4, - 6, 4, 3, 4, 6, 4, 4, 6, 4, 3, - 1, 3, 1, 3, 2, 1, 6, 0, 2, 1, - 2, 0, 2, 3, 3, 2, 2, 3, 1, 1, - 1, 2, 5, 5, 3, 5, 4, 3, 3, 2, - 1, 3, 3, 2, 2, 3, 1, 3, 3, 2, - 2, 3, 1, 5, 5, 3, 5, 3, 3, 4, - 3, 2, 2, 1, 2, 4, 4, 2, 1, 1, - 1, 2, 2, 2, 1, 2, 1, 2, 2, 3, - 1, 3, 2, 3, 2, 2, 3, 1, 3, 4, - 3, 2, 2, 1, 3, 2, 2, 1, 2, 3, - 1, 3, 1, 5, 3, 4, 3, 4, 2, 2, - 3, 2, 1, 1, 2, 2, 2, 0, 0, 1, - 1, 2, 3, 1, 2, 3, 5, 6, 5, 0, - 0, 6, 1, 2, 1, 1, 1, 2, 0, 4, - 1, 0, 0, 6, 0, 0, 7, 0, 0, 0, - 10, 0, 0, 0, 10, 0, 7, 0, 5, 0, - 7, 0, 4, 2, 2, 2, 3, 6, 8, 10, - 12, 4, 3, 2, 2, 1, 1, 0, 0, 7, - 1, 2, 2, 0, 0, 5, 1, 1, 3, 3, - 2, 2, 3, 4, 4, 3, 4, 6, 6, 0, - 1, 0, 1, 1, 0, 1, 1, 3, 4, 1, - 3, 0, 1, 1, 1, 2, 2, 2, 1, 1, - 2, 2, 2, 2, 1, 3, 2, 4, 2, 4, - 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, - 0, 0, 1, 0, 4, 1, 1, 3, 0, 3, - 3, 3, 1, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 5, 3, 3, 1, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 3, 1, 1, + 1, 3, 1, 1, 1, 1, 3, 3, 0, 4, + 0, 6, 2, 4, 2, 2, 1, 4, 1, 7, + 7, 7, 7, 4, 4, 2, 2, 1, 4, 2, + 2, 2, 5, 3, 5, 3, 4, 6, 1, 2, + 1, 2, 1, 1, 1, 2, 0, 2, 2, 3, + 3, 3, 3, 3, 2, 2, 1, 1, 1, 2, + 2, 2, 2, 1, 1, 1, 1, 2, 2, 3, + 3, 4, 1, 2, 2, 1, 1, 2, 2, 1, + 2, 2, 3, 1, 2, 1, 1, 1, 4, 4, + 4, 4, 1, 1, 1, 1, 3, 1, 3, 1, + 3, 0, 4, 0, 7, 4, 0, 7, 4, 0, + 7, 4, 0, 7, 4, 0, 1, 1, 2, 6, + 1, 3, 0, 1, 4, 6, 4, 1, 1, 1, + 1, 1, 3, 1, 2, 3, 4, 1, 1, 3, + 4, 6, 3, 5, 0, 7, 4, 0, 6, 3, + 2, 2, 4, 1, 0, 1, 0, 1, 1, 2, + 2, 2, 2, 3, 2, 2, 2, 3, 3, 1, + 2, 0, 0, 3, 3, 2, 1, 1, 0, 1, + 2, 1, 3, 1, 2, 1, 4, 4, 1, 1, + 2, 2, 1, 0, 1, 4, 3, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 1, 5, + 3, 0, 1, 3, 0, 1, 3, 1, 1, 1, + 1, 4, 6, 4, 4, 6, 4, 3, 4, 6, + 4, 4, 6, 4, 3, 1, 3, 1, 3, 2, + 1, 6, 0, 2, 1, 2, 0, 2, 3, 3, + 2, 2, 3, 1, 1, 1, 2, 5, 5, 3, + 5, 4, 3, 3, 2, 1, 3, 3, 2, 2, + 3, 1, 3, 3, 2, 2, 3, 1, 5, 5, + 3, 5, 3, 4, 3, 2, 2, 1, 2, 4, + 4, 2, 1, 1, 1, 2, 2, 2, 1, 2, + 1, 2, 2, 3, 1, 3, 2, 3, 2, 2, + 3, 1, 3, 4, 3, 2, 2, 1, 3, 2, + 2, 1, 2, 3, 1, 3, 1, 5, 3, 4, + 3, 4, 2, 2, 3, 2, 1, 1, 2, 2, + 2, 0, 0, 1, 1, 2, 3, 1, 2, 3, + 5, 6, 5, 0, 0, 6, 1, 2, 1, 1, + 1, 2, 0, 4, 1, 0, 0, 6, 0, 0, + 7, 0, 0, 0, 10, 0, 0, 0, 10, 0, + 7, 0, 5, 0, 7, 0, 4, 2, 2, 2, + 3, 6, 8, 10, 12, 4, 3, 2, 2, 1, + 1, 0, 0, 7, 1, 2, 2, 0, 0, 5, + 1, 1, 3, 3, 2, 2, 2, 3, 4, 4, + 3, 4, 6, 6, 0, 1, 0, 1, 1, 0, + 1, 1, 3, 4, 1, 3, 0, 1, 1, 1, + 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, + 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, + 1, 2, 1, 3, 1, 1, 0, 0, 1, 0, + 4, 1, 1, 3, 0, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, - 2, 3, 2, 2, 4, 4, 3, 2 + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, + 4, 4, 3, 2 }; static const short yydefact[] = { 3, - 10, 10, 5, 0, 4, 0, 217, 519, 302, 312, - 470, 0, 8, 9, 0, 0, 384, 0, 703, 0, - 531, 218, 62, 0, 0, 691, 0, 74, 21, 0, - 11, 6, 0, 15, 14, 13, 12, 272, 0, 520, - 114, 226, 497, 0, 292, 0, 291, 305, 0, 325, - 311, 0, 395, 397, 398, 403, 402, 379, 301, 525, - 481, 0, 225, 227, 480, 0, 521, 313, 468, 0, - 0, 216, 60, 61, 523, 0, 0, 99, 100, 101, - 373, 376, 0, 527, 0, 377, 0, 0, 0, 30, - 0, 302, 0, 22, 0, 0, 395, 0, 0, 0, - 0, 495, 0, 0, 0, 494, 0, 0, 0, 226, - 0, 0, 0, 225, 227, 468, 0, 3, 0, 0, - 0, 0, 397, 398, 694, 0, 86, 81, 272, 0, - 0, 58, 524, 121, 468, 0, 472, 59, 0, 0, - 0, 0, 0, 321, 282, 479, 283, 491, 0, 468, - 304, 303, 57, 293, 0, 323, 0, 298, 318, 319, - 294, 307, 309, 320, 0, 52, 385, 386, 387, 388, - 401, 105, 104, 106, 390, 396, 392, 114, 391, 404, - 404, 418, 0, 471, 306, 70, 0, 73, 529, 513, - 482, 522, 0, 526, 0, 738, 734, 733, 731, 713, - 718, 719, 0, 725, 724, 710, 711, 709, 728, 717, - 714, 715, 716, 720, 721, 707, 708, 704, 705, 706, - 730, 722, 723, 712, 729, 0, 726, 637, 305, 638, - 699, 470, 229, 270, 0, 0, 0, 0, 153, 266, - 264, 242, 268, 269, 0, 0, 0, 0, 0, 0, - 0, 126, 125, 0, 127, 128, 0, 0, 213, 129, - 0, 115, 0, 186, 0, 190, 183, 118, 228, 152, - 0, 0, 230, 231, 0, 117, 289, 305, 290, 514, - 253, 244, 0, 0, 0, 395, 375, 0, 370, 528, - 0, 130, 131, 0, 0, 0, 0, 29, 0, 108, - 404, 122, 107, 0, 493, 0, 492, 100, 101, 215, - 224, 0, 501, 223, 0, 500, 508, 509, 0, 0, - 18, 10, 0, 7, 7, 46, 45, 694, 0, 32, - 40, 36, 34, 41, 38, 327, 80, 87, 84, 0, - 0, 272, 0, 0, 0, 568, 63, 574, 65, 111, - 506, 0, 669, 670, 151, 0, 150, 664, 687, 0, - 289, 305, 290, 0, 663, 665, 692, 675, 0, 511, - 0, 0, 0, 477, 0, 476, 0, 0, 0, 468, - 68, 56, 71, 0, 55, 468, 0, 472, 490, 0, - 295, 296, 0, 53, 69, 54, 72, 300, 299, 310, - 694, 326, 393, 389, 394, 405, 399, 400, 434, 0, - 0, 437, 440, 0, 0, 423, 0, 694, 308, 0, - 0, 341, 469, 496, 530, 0, 0, 727, 732, 468, - 468, 0, 468, 737, 0, 0, 0, 160, 0, 0, - 162, 0, 0, 0, 0, 0, 0, 0, 0, 159, - 156, 155, 157, 0, 0, 0, 0, 214, 0, 113, - 158, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 10, 10, 5, 0, 4, 0, 220, 523, 307, 317, + 475, 0, 8, 9, 0, 0, 389, 0, 709, 0, + 535, 221, 64, 0, 0, 697, 0, 76, 21, 0, + 11, 6, 0, 15, 14, 13, 12, 277, 0, 524, + 117, 230, 502, 0, 297, 0, 296, 310, 0, 330, + 316, 0, 400, 402, 403, 408, 407, 384, 306, 529, + 486, 0, 229, 231, 485, 0, 525, 318, 473, 0, + 0, 219, 62, 63, 527, 0, 0, 101, 102, 103, + 378, 381, 0, 531, 0, 382, 0, 0, 0, 32, + 0, 307, 0, 22, 0, 0, 400, 0, 0, 0, + 0, 500, 0, 0, 0, 499, 0, 0, 0, 0, + 230, 0, 0, 0, 229, 231, 473, 0, 3, 0, + 0, 0, 0, 402, 403, 700, 0, 88, 83, 277, + 0, 0, 60, 528, 124, 473, 0, 477, 61, 0, + 0, 0, 0, 0, 326, 287, 484, 288, 496, 0, + 473, 309, 308, 59, 298, 0, 328, 0, 303, 323, + 324, 299, 312, 314, 325, 0, 54, 390, 391, 392, + 393, 406, 107, 106, 108, 395, 401, 397, 117, 396, + 409, 409, 423, 0, 476, 311, 72, 0, 75, 533, + 517, 487, 526, 0, 530, 0, 744, 740, 739, 737, + 719, 724, 725, 0, 731, 730, 716, 717, 715, 734, + 723, 720, 721, 722, 726, 727, 713, 714, 710, 711, + 712, 736, 728, 729, 718, 735, 0, 732, 641, 310, + 642, 705, 475, 234, 275, 0, 0, 0, 0, 156, + 271, 269, 247, 273, 274, 0, 0, 0, 0, 0, + 0, 0, 129, 128, 0, 130, 131, 0, 0, 216, + 132, 0, 118, 0, 189, 0, 193, 186, 121, 233, + 155, 0, 0, 235, 236, 0, 120, 294, 310, 295, + 518, 258, 249, 0, 0, 0, 400, 380, 0, 375, + 532, 0, 133, 134, 0, 0, 0, 0, 31, 0, + 110, 409, 125, 109, 115, 0, 498, 0, 497, 102, + 103, 218, 227, 0, 506, 226, 0, 505, 0, 232, + 513, 0, 0, 18, 10, 0, 7, 7, 48, 47, + 700, 0, 34, 42, 38, 36, 43, 40, 332, 82, + 89, 86, 0, 0, 277, 0, 0, 0, 572, 65, + 578, 67, 113, 511, 0, 674, 675, 154, 0, 153, + 669, 691, 0, 294, 310, 295, 0, 668, 670, 698, + 680, 0, 515, 0, 0, 0, 482, 0, 481, 0, + 0, 0, 0, 473, 70, 58, 73, 0, 57, 473, + 0, 477, 495, 0, 300, 301, 0, 55, 71, 56, + 74, 305, 304, 315, 700, 331, 398, 394, 399, 410, + 404, 405, 439, 0, 0, 442, 445, 0, 0, 428, + 0, 700, 313, 0, 0, 346, 474, 501, 534, 0, + 0, 733, 738, 473, 473, 0, 473, 743, 0, 0, + 0, 163, 0, 0, 165, 0, 0, 0, 0, 0, + 0, 0, 0, 162, 159, 158, 160, 0, 0, 0, + 0, 217, 0, 116, 161, 0, 0, 187, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 240, 241, 274, - 273, 0, 0, 0, 0, 0, 164, 466, 0, 172, - 271, 220, 0, 691, 219, 256, 257, 0, 284, 548, - 544, 553, 0, 472, 468, 468, 468, 286, 551, 0, - 518, 288, 0, 287, 255, 0, 251, 265, 267, 515, - 0, 252, 110, 109, 463, 382, 461, 372, 0, 314, - 0, 0, 315, 316, 317, 31, 0, 24, 690, 305, - 0, 689, 28, 119, 112, 499, 498, 502, 0, 17, - 20, 19, 327, 51, 47, 49, 50, 48, 44, 0, - 0, 0, 0, 341, 102, 92, 103, 0, 85, 88, - 0, 0, 0, 363, 0, 359, 82, 0, 0, 64, - 67, 575, 569, 468, 468, 668, 682, 674, 672, 548, - 544, 0, 683, 468, 686, 688, 684, 0, 685, 468, - 667, 681, 673, 671, 666, 693, 677, 679, 0, 510, - 473, 475, 474, 0, 0, 489, 0, 341, 322, 485, - 0, 0, 0, 488, 0, 478, 297, 324, 341, 327, - 415, 0, 414, 406, 407, 409, 0, 411, 433, 429, - 428, 217, 519, 468, 0, 662, 694, 430, 438, 443, - 444, 694, 694, 431, 441, 694, 0, 378, 425, 424, - 426, 427, 327, 696, 305, 697, 0, 0, 0, 340, - 342, 343, 736, 735, 699, 699, 699, 0, 0, 0, - 518, 0, 0, 519, 0, 154, 0, 0, 0, 0, - 0, 0, 233, 232, 0, 181, 116, 217, 519, 218, - 0, 0, 364, 380, 0, 212, 211, 654, 653, 0, - 209, 208, 206, 207, 205, 204, 203, 200, 201, 202, - 198, 199, 193, 194, 195, 196, 197, 191, 192, 0, - 0, 0, 0, 0, 0, 166, 178, 0, 0, 165, - 468, 468, 0, 468, 465, 538, 0, 0, 0, 0, - 259, 0, 261, 0, 512, 547, 546, 543, 542, 690, - 0, 0, 562, 0, 0, 559, 285, 560, 549, 468, - 662, 472, 548, 544, 0, 0, 468, 228, 0, 514, - 0, 0, 0, 383, 0, 382, 149, 148, 147, 146, - 0, 23, 390, 396, 0, 16, 341, 33, 37, 35, - 39, 0, 0, 90, 0, 94, 0, 98, 0, 96, - 0, 360, 0, 83, 66, 0, 576, 0, 570, 571, - 507, 504, 547, 543, 548, 544, 480, 0, 468, 549, - 548, 544, 0, 228, 0, 514, 505, 0, 0, 676, - 331, 468, 468, 468, 487, 337, 341, 0, 0, 417, - 416, 410, 0, 0, 436, 341, 0, 77, 0, 327, - 327, 0, 327, 0, 341, 0, 695, 0, 0, 338, - 344, 701, 700, 702, 243, 161, 0, 0, 163, 187, - 189, 188, 249, 250, 0, 0, 0, 0, 235, 0, - 0, 0, 0, 182, 0, 236, 239, 176, 175, 168, - 0, 167, 180, 0, 0, 535, 533, 0, 536, 472, - 173, 0, 0, 262, 0, 0, 545, 541, 552, 468, - 561, 550, 555, 0, 557, 0, 548, 544, 516, 517, - 0, 254, 464, 462, 374, 0, 25, 0, 0, 0, - 42, 91, 89, 0, 0, 0, 0, 361, 357, 0, - 0, 217, 580, 592, 595, 0, 568, 0, 0, 0, - 0, 0, 0, 218, 626, 0, 650, 0, 587, 0, - 0, 305, 0, 564, 585, 591, 563, 586, 627, 0, - 598, 602, 572, 547, 543, 482, 549, 517, 678, 680, - 329, 486, 483, 484, 335, 334, 0, 0, 408, 341, - 341, 76, 453, 468, 217, 519, 0, 439, 445, 446, - 694, 694, 341, 341, 442, 0, 432, 698, 328, 348, - 0, 0, 0, 0, 0, 0, 368, 0, 0, 365, - 185, 210, 123, 0, 169, 170, 177, 179, 534, 532, - 539, 537, 0, 174, 0, 258, 260, 558, 468, 556, - 371, 27, 0, 43, 93, 97, 95, 362, 0, 573, - 567, 579, 641, 568, 568, 568, 0, 0, 0, 612, - 614, 615, 616, 0, 0, 0, 642, 568, 651, 0, - 588, 280, 694, 0, 281, 0, 694, 0, 694, 0, - 0, 577, 566, 565, 589, 625, 624, 568, 568, 0, - 0, 332, 412, 413, 452, 449, 435, 0, 0, 341, - 327, 327, 447, 450, 354, 355, 356, 353, 0, 346, - 349, 339, 0, 0, 0, 0, 366, 0, 0, 123, - 237, 0, 171, 540, 263, 554, 120, 358, 0, 0, - 0, 583, 0, 0, 568, 643, 0, 646, 0, 0, - 608, 0, 617, 0, 623, 628, 0, 276, 327, 278, - 279, 327, 0, 0, 0, 275, 277, 578, 568, 0, - 0, 330, 336, 0, 75, 341, 341, 460, 341, 341, - 0, 0, 348, 0, 0, 245, 246, 247, 248, 0, - 369, 124, 467, 134, 0, 581, 593, 584, 596, 647, - 645, 0, 644, 141, 0, 305, 0, 0, 0, 613, - 622, 0, 0, 590, 138, 0, 137, 0, 333, 459, - 456, 454, 457, 448, 451, 347, 345, 217, 0, 367, - 0, 568, 0, 0, 0, 0, 606, 694, 610, 609, - 0, 631, 0, 629, 655, 0, 599, 603, 0, 0, - 0, 350, 352, 135, 582, 569, 594, 145, 132, 0, - 0, 649, 0, 648, 568, 327, 0, 633, 632, 634, - 0, 0, 656, 657, 618, 0, 0, 455, 458, 0, - 142, 0, 0, 597, 607, 341, 611, 630, 0, 655, - 0, 0, 0, 0, 351, 0, 0, 133, 0, 635, - 0, 0, 619, 658, 600, 604, 144, 143, 139, 0, - 659, 0, 0, 0, 0, 0, 0, 0, 660, 0, - 620, 601, 605, 140, 0, 0, 636, 0, 0, 639, - 640, 661, 621, 0, 0, 0 + 243, 245, 246, 279, 278, 0, 0, 0, 0, 0, + 167, 471, 0, 175, 276, 223, 0, 697, 222, 261, + 262, 0, 289, 552, 548, 557, 0, 477, 473, 473, + 473, 291, 555, 0, 522, 293, 0, 292, 260, 0, + 256, 270, 272, 519, 0, 257, 112, 111, 468, 387, + 466, 377, 0, 319, 0, 0, 320, 321, 322, 33, + 0, 28, 24, 696, 310, 26, 695, 30, 693, 122, + 114, 504, 503, 232, 507, 0, 17, 20, 19, 332, + 53, 49, 51, 52, 50, 46, 0, 0, 0, 0, + 346, 104, 94, 105, 0, 87, 90, 0, 0, 0, + 368, 0, 364, 84, 0, 0, 66, 69, 579, 573, + 473, 473, 673, 686, 679, 677, 552, 548, 0, 687, + 473, 690, 692, 688, 0, 689, 473, 672, 685, 678, + 676, 671, 699, 682, 683, 0, 514, 478, 480, 479, + 0, 0, 494, 0, 346, 327, 490, 0, 0, 0, + 493, 0, 483, 302, 329, 346, 332, 420, 0, 419, + 411, 412, 414, 0, 416, 438, 434, 433, 220, 523, + 473, 0, 667, 700, 435, 443, 448, 449, 700, 700, + 436, 446, 700, 0, 383, 430, 429, 431, 432, 332, + 702, 310, 703, 0, 0, 0, 345, 347, 348, 742, + 741, 705, 705, 705, 0, 0, 0, 522, 0, 0, + 523, 0, 157, 0, 0, 0, 0, 0, 0, 238, + 237, 0, 184, 119, 220, 523, 221, 0, 0, 369, + 385, 0, 215, 214, 659, 658, 0, 212, 211, 209, + 210, 208, 207, 206, 203, 204, 205, 201, 202, 196, + 197, 198, 199, 200, 194, 195, 0, 0, 0, 0, + 0, 0, 169, 181, 0, 0, 168, 473, 473, 0, + 473, 470, 542, 0, 0, 0, 0, 264, 0, 266, + 0, 516, 551, 550, 547, 546, 696, 0, 0, 566, + 0, 0, 563, 290, 564, 553, 473, 667, 477, 552, + 548, 0, 0, 473, 233, 0, 518, 0, 0, 0, + 388, 0, 387, 152, 151, 150, 149, 0, 23, 0, + 395, 0, 0, 16, 346, 35, 39, 37, 41, 0, + 0, 92, 0, 96, 0, 100, 0, 98, 0, 365, + 0, 85, 68, 0, 580, 0, 574, 575, 512, 509, + 551, 547, 552, 548, 0, 485, 0, 473, 553, 552, + 548, 0, 233, 0, 518, 510, 0, 681, 336, 473, + 473, 473, 492, 342, 346, 0, 0, 422, 421, 415, + 0, 0, 441, 346, 0, 79, 0, 332, 332, 0, + 332, 0, 346, 0, 701, 0, 0, 343, 349, 707, + 706, 708, 248, 164, 0, 0, 0, 166, 190, 192, + 191, 254, 255, 0, 0, 0, 0, 240, 0, 0, + 0, 0, 185, 0, 241, 244, 179, 178, 171, 0, + 170, 183, 0, 0, 539, 537, 0, 540, 477, 176, + 0, 0, 267, 0, 0, 549, 545, 556, 473, 565, + 554, 559, 0, 561, 0, 0, 520, 521, 0, 259, + 469, 467, 379, 0, 25, 29, 694, 0, 0, 44, + 93, 91, 0, 0, 0, 0, 366, 362, 0, 0, + 220, 523, 584, 596, 599, 0, 572, 0, 0, 0, + 0, 0, 0, 221, 630, 0, 655, 0, 591, 0, + 0, 310, 0, 568, 589, 595, 567, 590, 631, 0, + 602, 606, 576, 551, 547, 487, 553, 521, 684, 334, + 491, 488, 489, 340, 339, 0, 0, 413, 346, 346, + 78, 458, 473, 220, 523, 0, 444, 450, 451, 700, + 700, 346, 346, 447, 0, 437, 704, 333, 353, 0, + 0, 0, 0, 0, 0, 373, 0, 0, 370, 188, + 213, 126, 0, 172, 173, 180, 182, 538, 536, 543, + 541, 0, 177, 0, 263, 265, 562, 473, 560, 228, + 376, 0, 45, 95, 99, 97, 367, 0, 577, 571, + 583, 645, 647, 572, 572, 572, 0, 0, 0, 616, + 618, 619, 620, 0, 0, 0, 646, 572, 656, 0, + 592, 285, 700, 0, 286, 0, 700, 0, 700, 0, + 0, 581, 570, 569, 593, 629, 628, 572, 572, 0, + 0, 337, 417, 418, 457, 454, 440, 0, 0, 346, + 332, 332, 452, 455, 359, 360, 361, 358, 0, 351, + 354, 344, 0, 0, 0, 0, 371, 0, 0, 126, + 242, 0, 174, 544, 268, 558, 123, 363, 0, 0, + 0, 587, 0, 0, 572, 648, 0, 651, 0, 0, + 612, 0, 621, 0, 627, 632, 0, 281, 332, 283, + 284, 332, 0, 0, 0, 280, 282, 582, 572, 0, + 0, 335, 341, 0, 77, 346, 346, 465, 346, 346, + 0, 0, 353, 0, 0, 250, 251, 252, 253, 0, + 374, 127, 472, 137, 0, 585, 597, 588, 600, 652, + 650, 0, 649, 144, 0, 310, 0, 0, 0, 617, + 626, 0, 0, 594, 141, 0, 140, 0, 338, 464, + 461, 459, 462, 453, 456, 352, 350, 220, 0, 372, + 0, 572, 0, 0, 0, 0, 610, 700, 614, 613, + 0, 635, 0, 633, 660, 0, 603, 607, 0, 0, + 0, 355, 357, 138, 586, 573, 598, 148, 135, 0, + 0, 654, 0, 653, 572, 332, 0, 637, 636, 638, + 0, 0, 661, 662, 622, 0, 0, 460, 463, 0, + 145, 0, 0, 601, 611, 346, 615, 634, 0, 660, + 0, 0, 0, 0, 356, 0, 0, 136, 0, 639, + 0, 0, 623, 663, 604, 608, 147, 146, 142, 0, + 664, 0, 0, 0, 0, 0, 0, 0, 665, 0, + 624, 605, 609, 143, 0, 0, 640, 0, 0, 643, + 644, 666, 625, 0, 0, 0 }; -static const short yydefgoto[] = { 1344, - 1, 2, 119, 561, 977, 3, 4, 31, 32, 33, - 299, 547, 548, 34, 91, 35, 570, 572, 571, 573, - 569, 36, 37, 38, 411, 128, 129, 130, 338, 579, - 580, 535, 581, 176, 39, 40, 41, 134, 261, 262, - 302, 805, 303, 1141, 263, 978, 1271, 1206, 1226, 1227, - 1326, 1267, 292, 786, 264, 444, 496, 750, 265, 266, - 267, 293, 269, 506, 311, 43, 270, 456, 1043, 271, - 272, 273, 274, 131, 275, 979, 401, 516, 770, 980, - 45, 161, 981, 47, 162, 439, 163, 143, 155, 49, - 628, 144, 1110, 402, 1184, 156, 1111, 50, 1031, 680, - 681, 682, 1129, 1130, 1131, 960, 713, 714, 51, 539, - 288, 903, 795, 52, 53, 54, 55, 180, 181, 56, - 57, 58, 407, 644, 645, 646, 647, 183, 414, 415, - 416, 417, 658, 664, 659, 1018, 660, 661, 1019, 1020, - 536, 537, 497, 776, 59, 371, 372, 145, 60, 61, - 146, 147, 113, 63, 507, 280, 281, 282, 65, 283, - 67, 68, 179, 69, 284, 755, 756, 767, 519, 983, - 984, 1151, 828, 829, 830, 347, 985, 986, 1074, 1242, - 1153, 987, 988, 1179, 1075, 1243, 1076, 1244, 1108, 1286, - 1324, 1109, 1287, 1325, 1275, 1219, 1277, 1162, 989, 1222, - 1280, 1254, 1298, 1320, 1217, 1328, 990, 991, 992, 1090, - 720, 1282, 1283, 1284, 1330, 364, 772, 366, 367, 368, - 369, 107, 618, 1169, 676, 677, 434, 71, 72 +static const short yydefgoto[] = { 1354, + 1, 2, 120, 568, 987, 3, 4, 31, 32, 33, + 300, 551, 552, 553, 34, 91, 35, 577, 579, 578, + 580, 576, 36, 37, 38, 415, 129, 130, 131, 341, + 586, 587, 539, 588, 177, 39, 40, 41, 135, 262, + 263, 303, 813, 304, 1151, 264, 988, 1281, 1216, 1236, + 1237, 1336, 1277, 293, 793, 265, 448, 500, 757, 266, + 267, 268, 294, 270, 510, 313, 43, 271, 460, 1052, + 272, 273, 274, 275, 132, 276, 989, 405, 520, 777, + 990, 45, 162, 991, 47, 163, 443, 164, 144, 156, + 49, 635, 145, 1120, 406, 1194, 157, 1121, 50, 1040, + 687, 688, 689, 1139, 1140, 1141, 969, 720, 721, 51, + 543, 289, 912, 802, 52, 53, 54, 55, 181, 182, + 56, 57, 58, 411, 651, 652, 653, 654, 184, 418, + 419, 420, 421, 665, 671, 666, 1027, 667, 668, 1028, + 1029, 540, 541, 501, 783, 59, 374, 375, 146, 60, + 61, 147, 148, 114, 63, 511, 281, 282, 283, 65, + 284, 67, 68, 180, 69, 285, 762, 763, 778, 523, + 993, 994, 1161, 836, 837, 838, 350, 995, 996, 1084, + 1252, 1163, 997, 998, 1189, 1085, 1253, 1086, 1254, 1118, + 1296, 1334, 1119, 1297, 1335, 1285, 1229, 1287, 1172, 999, + 1232, 1290, 1264, 1308, 1330, 1227, 1338, 1000, 1001, 1002, + 1100, 727, 1292, 1293, 1294, 1340, 367, 779, 369, 370, + 371, 558, 372, 107, 625, 1179, 683, 684, 438, 71, + 72 }; -static const short yypact[] = { 71, - 88,-32768,-32768, 2859,-32768, 188,-32768, 266, 64,-32768, --32768, 555,-32768,-32768, 140, 146,-32768, 235,-32768, 1989, --32768, 237,-32768, 1666, 1666,-32768, 1814,-32768,-32768, 222, --32768, 285, 3383,-32768,-32768,-32768,-32768, 201, 286, 315, --32768,-32768, 80, 1865,-32768, 4890,-32768, 846, 619,-32768, --32768, 142,-32768,-32768,-32768,-32768,-32768, 316, 1575,-32768, --32768, 675,-32768,-32768,-32768, 347,-32768,-32768,-32768, 215, - 3638,-32768,-32768,-32768,-32768, 8393, 4228,-32768, 266, 237, - 284, 340, 315,-32768, 215,-32768, 215, 8393, 8393,-32768, - 623,-32768, 237,-32768, 2940, 4475, 399, 215, 8393, 266, - 2258,-32768, 410, 245, 2258,-32768, 420, 2904, 2904, 296, - 325, 80, 331, 345, 348,-32768, 444, 361, 2291, 262, - 2940, 9527, 664, 847, 375, 475,-32768, 382, 149, 119, - 119,-32768,-32768, 387,-32768, 6095, 390,-32768, 3062, 3062, - 4178, 1327, 637,-32768,-32768, 242,-32768,-32768, 347,-32768, --32768,-32768,-32768, 846, 688,-32768, 1462,-32768,-32768,-32768, - 959, 730,-32768,-32768, 2940,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 315, 871,-32768, 443, - 443,-32768, 2169,-32768, 730,-32768, 469, 861,-32768,-32768, --32768,-32768, 3286,-32768, 155,-32768, 419, 499,-32768,-32768, --32768,-32768, 463,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +static const short yypact[] = { 64, + 80,-32768,-32768, 2131,-32768, 130,-32768, 283, 48,-32768, +-32768, 556,-32768,-32768, 66, 87,-32768, 206,-32768, 2650, +-32768, 210,-32768, 1299, 1299,-32768, 1901,-32768,-32768, 292, +-32768, 333, 3137,-32768,-32768,-32768,-32768, 573, 353, 368, +-32768,-32768, 166, 1701,-32768, 2829,-32768, 1033, 294,-32768, +-32768, 540,-32768,-32768,-32768,-32768,-32768, 396, 1486,-32768, +-32768, 591,-32768,-32768,-32768, 82,-32768,-32768,-32768, 214, + 6712,-32768,-32768,-32768,-32768, 8620, 2499,-32768, 283, 210, + 355, 414, 368,-32768, 214,-32768, 214, 8620, 8620,-32768, + 512,-32768, 210,-32768, 4042, 3298, 1, 214, 8446, 283, + 2225,-32768, 361, 267, 2225,-32768, 262, 2706, 2706, 1901, + 383, 435, 166, 453, 495, 498,-32768, 571, 446, 2532, + 224, 4042, 3192, 680, 723, 521, 617,-32768, 55, 16, + 143, 143,-32768,-32768, 546,-32768, 6059, 532,-32768, 3255, + 3255, 4407, 641, 569,-32768,-32768, 255,-32768,-32768, 82, +-32768,-32768,-32768,-32768, 1033, 669,-32768, 998,-32768,-32768, +-32768, 1070, 673,-32768,-32768, 4042,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 368, 775,-32768, + 609, 609,-32768, 2064,-32768, 673,-32768, 604, 970,-32768, +-32768,-32768,-32768, 3851,-32768, 50,-32768, 605, 633,-32768, +-32768,-32768,-32768, 640,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 485,-32768,-32768, 730, 1575, - 342, 504,-32768,-32768, 3906, 9334, 542, 573,-32768,-32768, --32768,-32768,-32768,-32768, 577, 588, 616, 643, 646, 420, - 9085,-32768,-32768, 9085,-32768,-32768, 9085, 6659, 4696,-32768, - 41,-32768, 9085,-32768, 8480,-32768,-32768, 9696,-32768, 898, - 3155, 8563,-32768, 678, 713,-32768, 1174, 2042, 3006,-32768, - 157,-32768, 393, 808, 2940, 399,-32768, 420, 622,-32768, - 630, 666, 9604, 647, 656, 674, 780,-32768, 4228,-32768, - 443,-32768,-32768, 282,-32768, 195,-32768,-32768,-32768,-32768, --32768, 2258,-32768,-32768, 2258,-32768,-32768,-32768, 3286, 42, --32768, 686, 4228,-32768,-32768,-32768,-32768, 375, 732,-32768, --32768,-32768,-32768,-32768,-32768, 589,-32768, 209,-32768, 6749, - 8650,-32768, 119, 119, 745,-32768,-32768,-32768,-32768,-32768, - 803, 721,-32768,-32768, 666, 726, 9604, 74, 2165, 9527, - 2165, 3271, 3772, 742,-32768, 143, 9420, 763, 776,-32768, - 749, 8650, 3372,-32768, 3372,-32768, 3542, 3542, 748,-32768, --32768,-32768, 861, 2940,-32768,-32768, 6197, 751,-32768, 4114, - 959, 846, 2940,-32768,-32768,-32768, 861,-32768,-32768,-32768, - 375,-32768,-32768,-32768,-32768, 764,-32768,-32768,-32768, 8650, - 39, 1890, 9437, 72, 1839,-32768, 269, 375, 730, 3218, - 759, 832,-32768,-32768,-32768, 794, 801,-32768,-32768,-32768, --32768, 229,-32768,-32768, 8650, 504, 6659,-32768, 191, 6659, --32768, 8650, 8737, 9085, 8393, 3218, 3218, 3218, 3218,-32768, --32768,-32768,-32768, 767, 790, 745, 812,-32768, 8393,-32768, --32768, 2485, 6659,-32768, 8650, 8650, 6839, 8650, 8650, 8650, - 8650, 8650, 8650, 8650, 8650, 8650, 8650, 8650, 8650, 8650, - 8650, 8650, 8650, 8650, 8650, 8650,-32768,-32768,-32768,-32768, --32768, 8650, 8650, 8650, 8393, 997, 558, 225, 7388,-32768, --32768, 266, 873, 920,-32768, 477, 543, 631,-32768, 99, - 99,-32768, 3482, 817, 848, 894,-32768,-32768, 539, 7863, - 1305,-32768, 252,-32768,-32768, 8650,-32768,-32768,-32768,-32768, - 174,-32768,-32768,-32768, 893, 905,-32768,-32768, 420,-32768, - 7211, 7301,-32768,-32768,-32768,-32768, 320,-32768,-32768, 4012, - 142,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 897,-32768, --32768,-32768, 589,-32768,-32768,-32768,-32768,-32768,-32768, 907, - 927, 939, 942, 832,-32768,-32768, 237, 8650, 945,-32768, - 559, 563, 567,-32768, 6299, 9673,-32768, 906, 119,-32768, --32768,-32768, 36,-32768,-32768,-32768,-32768,-32768,-32768, 2346, - 2346, 3148,-32768,-32768,-32768,-32768,-32768, 7954,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 944, 949, 6749,-32768, --32768,-32768,-32768, 3372, 3372,-32768, 4114, 832,-32768, 803, - 908, 912, 913,-32768, 911,-32768, 959,-32768, 832, 589, --32768, 930,-32768, 962,-32768,-32768, 916,-32768, 9673,-32768, --32768, 961, 639,-32768, 8650, 4879, 375, 970,-32768,-32768, --32768, 594, 596, 971,-32768, 375, 969,-32768,-32768,-32768, --32768,-32768, 535,-32768, 4103,-32768, 210, 444, 943, 976, - 832,-32768,-32768,-32768, 424, 424, 424, 933, 934, 8824, - 894, 935, 938, 141, 940,-32768, 950, 951, 974, 975, - 985, 986,-32768,-32768, 955,-32768,-32768, 998, 849, 509, - 8650, 1003,-32768, 991, 968, 9673, 9673,-32768,-32768, 1004, - 9714, 9731, 9747, 4614, 4486, 2373, 3583, 1046, 1046, 1046, - 1055, 1055, 800, 800, 540, 540, 540,-32768,-32768, 973, - 966, 977, 980, 984, 3218, 558,-32768, 6749, 8650,-32768, --32768,-32768, 8650,-32768,-32768, 983, 9085, 982, 995, 1035, --32768, 8650,-32768, 8650,-32768, 467,-32768, 467,-32768, 70, - 989, 990,-32768, 988, 3218, 803,-32768, 803, 719,-32768, - 1540, 993, 8045, 8045, 5119, 994, 8480, 296, 1000, 348, - 808, 1001, 8650, 420, 996, 905,-32768, 9673,-32768, 9673, - 4228,-32768, 428, 1040, 316,-32768, 832,-32768,-32768,-32768, --32768, 732, 1005,-32768, 209,-32768, 8650,-32768, 8650,-32768, - 8650,-32768, 24,-32768,-32768, 420,-32768, 5723, 1071,-32768, - 803, 803, 2634, 2634, 2729, 2729,-32768, 347,-32768, 2804, - 8132, 8132, 5993, 317, 1007, 412, 803, 6749, 6749,-32768, - 1048,-32768,-32768,-32768,-32768, 1052, 832, 8393, 764,-32768, --32768,-32768, 8650, 8650, 68, 9579, 1009,-32768, 1369, 589, - 589, 2412, 731, 2580, 832, 3218,-32768, 60, 1025,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 9168, 9168,-32768,-32768, --32768,-32768,-32768,-32768, 1027, 1038, 1047, 1053,-32768, 9555, - 6749, 6389, 1033,-32768, 8650,-32768,-32768,-32768,-32768, 536, - 1041,-32768,-32768, 1042, 265, 273, 273, 1049, 273,-32768, --32768, 9085, 1139,-32768, 1044, 1051,-32768,-32768,-32768,-32768, --32768,-32768, 803, 1056,-32768, 1050, 8219, 8219,-32768,-32768, - 821,-32768, 9673,-32768,-32768, 1057,-32768, 435, 2169, 732, --32768,-32768,-32768, 1059, 1061, 1063, 6479,-32768,-32768, 705, - 354, 1099,-32768,-32768,-32768, 1084,-32768, 8650, 1114, 1119, - 1120, 8306, 329, 524,-32768, 1127, 1177, 1129,-32768, 4142, - 9510, 2148, 5029,-32768,-32768, 1178,-32768,-32768,-32768, 7491, --32768,-32768,-32768, 2634, 2634,-32768, 2804, 1719,-32768,-32768, --32768, 803, 803, 803,-32768, 1130, 1089, 1092,-32768, 9579, - 9579,-32768,-32768,-32768, 1136, 899, 8650,-32768,-32768,-32768, - 375, 375, 832, 832,-32768, 1978,-32768,-32768,-32768, 569, - 6749, 8650, 8650, 8650, 8650, 6749,-32768, 8650, 1137,-32768, --32768, 4942, 387, 8650,-32768, 536,-32768,-32768,-32768,-32768, --32768,-32768, 1094,-32768, 1159,-32768,-32768, 803,-32768,-32768, --32768,-32768, 83,-32768,-32768,-32768,-32768,-32768, 420,-32768, --32768,-32768,-32768,-32768,-32768, 745, 6569, 1117, 5185,-32768, --32768,-32768,-32768, 1151, 8650, 1152,-32768,-32768,-32768, 1122, --32768,-32768, 31, 750,-32768, 787, 375, 8911, 34, 900, - 362,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 6749, - 6749,-32768,-32768,-32768,-32768,-32768, 68, 8650, 8650, 9579, - 589, 589, 1153, 1154,-32768,-32768,-32768,-32768, 330,-32768, - 1126,-32768, 1113, 1115, 1121, 1131,-32768, 9627, 6749, 387, --32768, 1111,-32768,-32768,-32768, 803,-32768,-32768, 582, 582, - 7773,-32768, 1204, 1165, 1138,-32768, 1166,-32768, 8393, 8650, --32768, 7593,-32768, 1168,-32768,-32768, 444,-32768, 589,-32768, --32768, 589, 9251, 9251, 6929,-32768,-32768,-32768, 745, 7019, - 7019,-32768,-32768, 6749,-32768, 9579, 9579,-32768, 832, 832, - 6749, 6749, 569, 1142, 8998,-32768,-32768,-32768,-32768, 6749, --32768,-32768,-32768,-32768, 8393,-32768,-32768,-32768,-32768,-32768, --32768, 5813,-32768,-32768, 1144, 257, 2940, 9650, 7593,-32768, --32768, 5271, 53,-32768,-32768, 1176,-32768, 1191,-32768,-32768, --32768, 1190, 1192,-32768,-32768,-32768,-32768, 380, 1149,-32768, - 1156, 745, 7683, 585, 423, 5411,-32768, 375,-32768,-32768, - 434,-32768, 5515,-32768, 1245, 1208,-32768,-32768, 6749, 6749, - 8650,-32768,-32768,-32768,-32768, 48,-32768,-32768,-32768, 8650, - 1209,-32768, 1213,-32768, 745, 589, 7593,-32768,-32768,-32768, - 1183, 8, 1217,-32768,-32768, 7109, 7109,-32768,-32768, 1173, --32768, 5903, 1184,-32768,-32768, 832,-32768, 1187, 8650, 1245, - 1223, 1245, 1188, 1189,-32768, 498, 5619,-32768, 1222,-32768, - 1195, 239,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1201, --32768, 1283, 1237, 7683, 7683, 6749, 4122, 745,-32768, 436, --32768,-32768,-32768,-32768, 1196, 1199,-32768, 1294, 1248,-32768, --32768,-32768,-32768, 1306, 1307,-32768 +-32768,-32768,-32768,-32768,-32768,-32768, 601,-32768,-32768, 673, + 1486, 654, 627,-32768,-32768, 9561, 9644, 659, 664,-32768, +-32768,-32768,-32768,-32768,-32768, 675, 689, 696, 698, 701, + 262, 9312,-32768,-32768, 9312,-32768,-32768, 9312, 6796, 3961, +-32768, 422,-32768, 9312,-32768, 8707,-32768,-32768, 9780,-32768, + 845, 1829, 8790,-32768, 781, 434,-32768, 126, 1601, 4144, +-32768, 160,-32768, 475, 813, 4042, 1,-32768, 262, 690, +-32768, 721, 743, 9688, 726, 728, 734, 800,-32768, 2499, +-32768, 609,-32768,-32768,-32768, 478,-32768, 125,-32768,-32768, +-32768,-32768,-32768, 2225,-32768,-32768, 2225,-32768, 758,-32768, +-32768, 3851, 47,-32768, 729, 2499,-32768,-32768,-32768,-32768, + 521, 708,-32768,-32768,-32768,-32768,-32768,-32768, 712,-32768, + 249,-32768, 6886, 8877,-32768, 143, 143, 803,-32768,-32768, +-32768,-32768,-32768, 855, 765,-32768,-32768, 743, 767, 9688, + 296, 2466, 3192, 2466, 3043, 3464, 772,-32768, 100, 3351, + 807, 819,-32768, 776, 8877, 3862,-32768, 3862,-32768, 4280, + 4280, 4407, 785,-32768,-32768,-32768, 970, 4042,-32768,-32768, + 6161, 792,-32768, 4311, 1070, 1033, 4042,-32768,-32768,-32768, + 970,-32768,-32768,-32768, 521,-32768,-32768,-32768,-32768, 905, +-32768,-32768,-32768, 8877, 447, 1155, 3724, 60, 1544,-32768, + 252, 521, 673, 2142, 802, 867,-32768,-32768,-32768, 796, + 798,-32768,-32768,-32768,-32768, 164,-32768,-32768, 8877, 627, + 6796,-32768, 229, 6796,-32768, 8877, 8964, 9312, 8620, 2142, + 2142, 2142, 2142,-32768,-32768,-32768,-32768, 805, 809, 803, + 810,-32768, 8620,-32768,-32768, 6623, 6796,-32768, 8877, 8877, + 6976, 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8877, + 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8877, +-32768,-32768,-32768,-32768,-32768, 8877, 8877, 8877, 8620, 1393, + 564, 670, 7615,-32768,-32768, 283, 865, 912,-32768, 237, + 244, 615,-32768, 1080, 1080,-32768, 3796, 814, 837, 884, +-32768,-32768, 490, 8090, 114,-32768, 188,-32768,-32768, 8877, +-32768,-32768,-32768,-32768, 626,-32768,-32768,-32768, 877, 874, +-32768,-32768, 262,-32768, 7438, 7528,-32768,-32768,-32768,-32768, + 606, 879,-32768,-32768, 3594, 540,-32768,-32768, 887,-32768, +-32768,-32768,-32768, 844,-32768, 891,-32768,-32768,-32768, 712, +-32768,-32768,-32768,-32768,-32768,-32768, 893, 896, 897, 903, + 867,-32768,-32768, 210, 8877, 906,-32768, 280, 420, 436, +-32768, 6263, 9757,-32768, 849, 143,-32768,-32768,-32768, 24, +-32768,-32768,-32768,-32768,-32768,-32768, 817, 817, 4802,-32768, +-32768,-32768,-32768,-32768, 8181,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 902, 6886,-32768,-32768,-32768,-32768, + 3862, 3862,-32768, 4311, 867,-32768, 855, 861, 863, 866, +-32768, 872,-32768, 1070,-32768, 867, 712,-32768, 883,-32768, + 923,-32768,-32768, 939,-32768, 9757,-32768,-32768, 922, 18, +-32768, 8877, 2818, 521, 930,-32768,-32768,-32768, 510, 611, + 934,-32768, 521, 937,-32768,-32768,-32768,-32768,-32768, 748, +-32768, 3086,-32768, 281, 571, 916, 947, 867,-32768,-32768, +-32768, 282, 282, 282, 904, 908, 9051, 884, 913, 915, + 192, 917,-32768, 918, 920, 938, 944, 948, 957,-32768, +-32768, 932,-32768,-32768, 975, 421, 338, 8877, 976,-32768, + 987, 941, 9757, 9757,-32768,-32768, 988, 4588, 9818, 4862, + 4703, 4168, 4535, 3669, 1937, 1937, 1937, 1334, 1334, 1050, + 1050, 713, 713, 713,-32768,-32768, 955, 954, 959, 958, + 961, 2142, 564,-32768, 6886, 8877,-32768,-32768,-32768, 8877, +-32768,-32768, 980, 9312, 967, 981, 1030,-32768, 8877,-32768, + 8877,-32768, 1350,-32768, 1350,-32768, 71, 977, 978,-32768, + 973, 2142, 855,-32768, 855, 1728,-32768, 1109, 983, 8272, + 8272, 5855, 979, 8707, 383, 984, 498, 813, 989, 8877, + 262, 982, 874,-32768, 9757,-32768, 9757, 2499,-32768, 2761, + 662, 6886, 396,-32768, 867,-32768,-32768,-32768,-32768, 708, + 994,-32768, 249,-32768, 8877,-32768, 8877,-32768, 8877,-32768, + 116,-32768,-32768, 262,-32768, 5585, 1049,-32768, 855, 855, + 1260, 1260, 1918, 1918, 4802,-32768, 82,-32768, 2412, 8359, + 8359, 5957, 240, 1005, 341, 855, 6886,-32768, 1031,-32768, +-32768,-32768,-32768, 1051, 867, 8620, 905,-32768,-32768,-32768, + 8877, 8877, 152, 4929, 1006,-32768, 401, 712, 712, 3568, + 755, 2290, 867, 2142,-32768, 54, 1023,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 9395, 9395, 7066,-32768,-32768,-32768, +-32768,-32768,-32768, 1024, 1029, 1032, 1034,-32768, 4688, 6886, + 6353, 1020,-32768, 8877,-32768,-32768,-32768,-32768, 474, 1035, +-32768,-32768, 1039, 44, 181, 181, 1027, 181,-32768,-32768, + 9312, 1128,-32768, 1044, 1046,-32768,-32768,-32768,-32768,-32768, +-32768, 855, 1059,-32768, 1047, 1062,-32768,-32768, 452,-32768, + 9757,-32768,-32768, 1063,-32768,-32768,-32768, 2064, 708,-32768, +-32768,-32768, 1068, 1071, 1073, 6443,-32768,-32768, 745, 289, + 1075, 575,-32768,-32768,-32768, 1065,-32768, 8877, 1116, 1121, + 1122, 8533, 67, 572,-32768, 1129, 1175, 1131,-32768, 2565, + 4428, 2918, 5022,-32768,-32768, 1170,-32768,-32768,-32768, 7718, +-32768,-32768,-32768, 1260, 1260,-32768, 2412, 1408,-32768,-32768, + 855, 855, 855,-32768, 1132, 1089, 1093,-32768, 4929, 4929, +-32768,-32768,-32768, 1138, 624, 8877,-32768,-32768,-32768, 521, + 521, 867, 867,-32768, 2406,-32768,-32768,-32768, 583, 6886, + 8877, 8877, 8877, 8877, 6886,-32768, 8877, 1140,-32768,-32768, + 9801, 546, 8877,-32768, 474,-32768,-32768,-32768,-32768,-32768, +-32768, 1100,-32768, 1163,-32768,-32768, 855,-32768,-32768,-32768, +-32768, 73,-32768,-32768,-32768,-32768,-32768, 262,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 803, 6533, 1123, 4518,-32768, +-32768,-32768,-32768, 1153, 8877, 1158,-32768,-32768,-32768, 1130, +-32768,-32768, 191, 763,-32768, 788, 521, 9138, 427, 797, + 307,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 6886, + 6886,-32768,-32768,-32768,-32768,-32768, 152, 8877, 8877, 4929, + 712, 712, 1159, 1161,-32768,-32768,-32768,-32768, 315,-32768, + 1133,-32768, 1120, 1126, 1127, 1137,-32768, 9711, 6886, 546, +-32768, 1119,-32768,-32768,-32768, 855,-32768,-32768, 462, 462, + 8000,-32768, 1210, 1184, 1139,-32768, 1189,-32768, 8620, 8877, +-32768, 7820,-32768, 1190,-32768,-32768, 571,-32768, 712,-32768, +-32768, 712, 9478, 9478, 7156,-32768,-32768,-32768, 803, 7246, + 7246,-32768,-32768, 6886,-32768, 4929, 4929,-32768, 867, 867, + 6886, 6886, 583, 1146, 9225,-32768,-32768,-32768,-32768, 6886, +-32768,-32768,-32768,-32768, 8620,-32768,-32768,-32768,-32768,-32768, +-32768, 5675,-32768,-32768, 1148, 416, 4042, 9734, 7820,-32768, +-32768, 5141, 51,-32768,-32768, 1198,-32768, 1199,-32768,-32768, +-32768, 1174, 1200,-32768,-32768,-32768,-32768, 369, 1154,-32768, + 1160, 803, 7910, 527, 370, 5273,-32768, 521,-32768,-32768, + 379,-32768, 5377,-32768, 1248, 1204,-32768,-32768, 6886, 6886, + 8877,-32768,-32768,-32768,-32768, 25,-32768,-32768,-32768, 8877, + 1205,-32768, 1213,-32768, 803, 712, 7820,-32768,-32768,-32768, + 1178, 271, 1216,-32768,-32768, 7336, 7336,-32768,-32768, 1171, +-32768, 5765, 1172,-32768,-32768, 867,-32768, 1181, 8877, 1248, + 1222, 1248, 1177, 1187,-32768, 397, 5481,-32768, 1233,-32768, + 1192, 365,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1208, +-32768, 1271, 1236, 7910, 7910, 6886, 3413, 803,-32768, 410, +-32768,-32768,-32768,-32768, 1195, 1197,-32768, 1296, 1251,-32768, +-32768,-32768,-32768, 1308, 1309,-32768 }; static const short yypgoto[] = {-32768, - 1193,-32768,-32768, 992, 18, 1303,-32768,-32768,-32768,-32768, --32768,-32768, 513,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - -756, 1200, 1202,-32768,-32768,-32768,-32768, 1181,-32768,-32768, - 503, 0,-32768, 771,-32768, 3899, -26,-32768, 1226, 867, - -998,-32768, -84, 187,-32768, 196,-32768, 179, 150, -1074, --32768, -350, 929, 118, 753,-32768,-32768, -703, 2564, 926, - -251, 2283, 2895, 822, 618, 425,-32768,-32768,-32768,-32768, - -248,-32768, -108, -83,-32768, 255, 17, -273, 82, 21, - -121, -120, -3, 1868, 46, 1413, -98, -418, 352,-32768, - -160,-32768,-32768, 207,-32768,-32768,-32768,-32768,-32768, 66, --32768, 653,-32768, 144,-32768,-32768, 394, 756, 29,-32768, --32768,-32768, 546, -261, 37, 1302, 1310,-32768,-32768,-32768, --32768,-32768, -116,-32768, 479, -614,-32768, 531, 395, 471, - -409,-32768,-32768,-32768,-32768,-32768,-32768, 941,-32768, 474, - 809, 553, 860, 1539, 1625, -357,-32768, 2462, -63, 20, --32768, 4399, -90, 441,-32768, 3481,-32768,-32768, 4001, -4, - 154, -311, 1345, 3650, 789, -169,-32768, 4093,-32768, -1136, - -924, -335, 92,-32768, 532, -92, -128,-32768,-32768,-32768, - -1121, -930, -1102,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 1191,-32768,-32768, 986, 7, 1310,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 507,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, -770, 1196, 1207,-32768,-32768,-32768,-32768, 1201,-32768, +-32768, 496, 135,-32768,-32768,-32768, 2838, -25,-32768, 1221, + 888, -999,-32768, -88, 178,-32768, 895,-32768, 169, 139, + -1101,-32768, -524, 1474, -99, 619,-32768,-32768, -714, 3947, + 43, -240, 2252, 2872, 825, 1176, 432,-32768,-32768,-32768, +-32768, -273,-32768, -116, -94,-32768, 266, 17, -276, 132, + 75, -106, -109, -3, 1594, 27, 1371, -118, -752, 364, +-32768, -82,-32768,-32768, 265,-32768,-32768,-32768,-32768,-32768, + 327,-32768, 677,-32768, 155,-32768,-32768, 730, 769, 74, +-32768,-32768,-32768, 560, -272, 13, 1335, 1336,-32768,-32768, +-32768,-32768,-32768, -141,-32768, 500, 716,-32768, 559, 418, + 497, -414,-32768,-32768,-32768,-32768,-32768,-32768, 960,-32768, + 501, 835, 582, 889, 2241, 1820, -368,-32768, 3695, -55, + 10,-32768, 4252, -90, 717,-32768, 3290,-32768,-32768, 3834, + -4, 245, -328, 1372, 3416, 871, -214,-32768, 4134,-32768, + -1157, -942, -343, 117,-32768, 553, -97, -122,-32768,-32768, +-32768, -1137, -860, -1112,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, -24,-32768,-32768,-32768,-32768,-32768, - -281, 67,-32768, 76,-32768, -343, -132,-32768,-32768, -289, - -286,-32768,-32768, 40, 490,-32768, -18,-32768, -247 +-32768,-32768,-32768,-32768,-32768, -37,-32768,-32768,-32768,-32768, +-32768, -425, 86,-32768, 90,-32768, -354, -133,-32768,-32768, + -293, 1052, -286,-32768,-32768, 40, 530,-32768, 57,-32768, + -260 }; -#define YYLAST 9826 +#define YYLAST 9897 static const short yytable[] = { 66, - 46, 348, 348, 365, 521, 670, 194, 85, 320, 552, - 593, 82, 553, 464, 359, 85, 96, 313, 316, 103, - 103, 30, 103, 290, 44, 178, 583, 422, 66, 122, - 635, 84, 862, 391, 194, 529, 532, 551, 349, 149, - 95, 66, 912, 633, 1140, 344, 231, 85, 1208, 350, - 501, 175, 1104, 121, 85, 951, 97, 1224, 1103, 1107, - 142, 501, 399, 400, 408, 195, 85, 1300, 501, 826, - -1, 84, 85, 96, 423, 1246, 164, 552, 957, 596, - 617, 826, 85, 596, 1215, 1253, 1168, -2, 521, 1176, - 149, 85, 650, 85, 648, 459, 103, 285, 651, 306, - 103, 188, 100, 103, 103, 11, 310, 667, 77, 1301, - 460, 300, 1255, 286, 66, 46, 149, 66, 667, 345, - 1265, -694, 187, 135, 597, 187, 958, -694, 597, 598, - 1241, -690, 360, 598, 149, 149, 149, 328, 827, 44, - 1268, 1140, 509, 559, 78, 79, 167, 168, 169, 21, - 1291, 93, 611, 1295, 1256, 1307, 774, 276, 8, 187, - 149, 1029, 599, 510, 336, 691, 599, 136, 137, 294, - 296, 706, 346, 511, 668, 574, 170, 359, 66, 413, - 276, 383, 164, 512, 554, 1147, 513, 514, 103, 164, - 164, 75, 21, 1064, 80, 171, 397, 612, 100, 392, - 525, 534, 613, 412, 342, 421, 1045, 93, 127, 76, - 240, 575, 8, 164, 348, 348, 592, 358, 8, 192, - 194, 1268, 1268, 126, 21, 85, 432, 88, 100, 425, - 419, 1220, 100, 89, 509, 614, 639, 90, 192, 172, - 173, 174, 891, 73, 526, 359, 498, 93, 100, 450, - 590, 591, 576, 356, 365, 8, 192, 164, 589, 21, - 127, 577, 159, 160, 876, 359, 85, 93, 12, 425, - 508, 637, 432, 432, 523, 21, 100, 93, 690, 423, - 149, 93, 529, 291, 295, 386, 313, 316, 1250, 751, - 74, 17, 399, 400, 85, 360, 578, 93, 1322, 752, - 509, 533, 192, 189, 93, 99, 164, 103, 509, 117, - 103, 877, 867, 753, 103, 1104, 75, 326, 85, 96, - 400, 1103, 1104, 21, 671, 93, 189, 705, 1103, 387, - 388, 78, 308, 1062, 76, 648, 459, 751, 118, 457, - 1323, 132, 1143, 95, 690, 100, 1297, 752, 192, 7, - 8, 555, 690, 421, 149, 66, 149, 149, 523, 97, - -226, 753, 66, 360, 327, 133, 1048, 563, 149, 182, - 149, 672, 149, 149, 801, 603, 1104, 607, 609, 149, - 549, 309, 1103, 360, 1193, 149, 287, 19, 149, 802, - 164, 359, 21, 289, 93, 7, 8, -221, 359, 22, - 421, 85, 807, 1085, -226, -226, 430, 149, 66, 1071, - 66, 413, 7, 100, 421, 85, 431, 1071, -221, 164, - 164, 189, 78, 308, 936, 339, 317, 100, 657, 26, - 423, 1194, 318, 19, 1261, 412, 192, 934, 8, 340, - 640, 85, 85, 85, 85, 22, -503, 164, 549, -222, - 19, 112, 234, 455, -121, -227, 1072, 673, 588, 192, - 348, 712, 22, 321, 1178, 642, 187, 114, 358, 341, - 100, 498, 309, 184, 21, 26, 93, 337, 1071, 857, - 359, 1262, -26, 301, 189, 21, 359, 93, 430, 1071, - 1338, 85, 26, 432, 370, 301, 825, -26, 431, -227, - -227, 674, 406, 583, 632, 432, 432, 426, 523, 360, - 509, 552, 875, -222, 553, 66, 360, 21, 689, 93, - 761, 692, 428, 365, 178, 1272, 698, 699, 700, 701, - 702, 510, 112, 112, 359, 464, 1278, 1339, 399, 551, - 276, 511, 529, 532, 715, 149, 85, 648, 114, 114, - 803, 512, 688, 1071, 513, 514, 420, 78, 79, 13, - 14, 1094, 1053, 1100, 762, 112, 609, 621, -101, 878, - 84, 78, 308, 1125, 1126, 1127, 744, 99, 164, 747, - 421, 114, 780, 1087, 712, 192, 763, 427, -79, 429, - 629, 435, 99, 748, -79, 149, 149, 838, 360, 638, - 1317, 747, 816, 838, 360, 21, 818, 80, 81, 740, - 820, 742, 743, 13, 14, 748, 670, 485, 486, 149, - 149, 309, 149, 749, 1044, 1204, 781, 782, 1269, 442, - 764, 1078, 455, 7, 502, 455, 648, 693, 695, 812, - 697, 691, 85, 792, 111, 749, 817, -282, 365, -283, - 819, 838, 360, -282, 821, -283, 446, 421, 455, 359, - 443, 192, 719, 359, 445, 164, 882, 883, 884, 1205, - 432, 19, 1270, 165, 166, 186, 192, 297, 298, 359, - 432, 432, 432, 22, 447, 187, 501, 187, 741, 75, - 421, 384, 385, 851, 758, 813, 868, -694, 864, -694, - -694, 870, 871, 164, 856, 873, -694, 76, 691, 1023, - 1024, 448, 1024, 26, 449, 7, 502, 330, 503, 331, - 541, 359, 100, 332, 538, 423, 314, 194, -694, -694, - -694, 540, -694, 587, -694, 159, 160, 358, 1149, 1150, - 85, 12, 393, 394, 313, 316, 1049, 1050, 543, 1052, - 313, 316, 1166, 19, 564, 13, 14, 544, 111, 1069, - 1070, 432, 509, 432, 17, 22, 187, 8, 641, 21, - 85, 93, 1180, 1181, 432, 545, 85, 360, 66, 66, - 66, 360, 546, 510, -78, 565, 941, 566, 560, 567, - -78, 568, 70, 511, 642, 504, 85, 360, 346, 643, - 87, 112, 112, 512, 384, 1170, 513, 514, 98, 423, - 527, 8, 104, 104, 21, 104, 93, 114, 114, 1212, - -689, 70, 594, 7, 8, 959, 911, 595, 149, 149, - 149, 149, 104, 619, 70, 149, 838, 838, 838, 360, - 87, 393, 1171, 610, 240, 528, 678, 98, 19, 626, - 158, 159, 160, 620, 85, 634, 715, 12, 21, 98, - 93, 19, 358, 679, 149, 98, 914, 103, 703, 66, - 413, 85, 950, 22, 482, 483, 484, 485, 486, 925, - 17, 926, 549, 104, 98, 13, 14, 421, 421, 104, - 421, 704, -327, 104, 412, 425, 104, 104, 683, 75, - 333, 1039, 334, 26, 1012, 684, 335, 70, -100, 104, - 70, 432, 432, 706, 432, -327, -327, 76, -327, 8, - 860, 773, 1006, 759, 403, 760, 404, 104, 104, 104, - 405, 1013, 66, 66, 954, 775, 955, 777, 956, 1008, - 1027, 487, 691, 85, 66, 413, 642, 1152, 918, 75, - 793, 861, 806, 104, 384, 1177, 1039, 674, 1119, 794, - 1189, 1190, 808, 398, 159, 160, 21, 76, 93, 412, - 12, 70, 1086, 1332, 1333, 149, 66, 149, 488, 489, - 455, 104, 809, 490, 491, 492, 493, 438, 441, 149, - 149, 192, 149, 17, 810, 314, 1093, 811, 1099, 815, - 8, 848, 10, 11, 1303, 1304, 849, 824, 12, 852, - 164, 639, 850, 853, 854, 855, 859, 858, 98, 104, - 863, 66, 413, 15, 869, 872, 112, 16, 874, 1128, - 879, 17, 112, 880, 885, 886, 889, 552, 455, 890, - 1336, 892, 114, 895, 896, 902, 412, 21, 114, 93, - 1152, 893, 894, 1007, 897, 898, 899, -99, 1223, 98, - 1121, 1122, 901, 905, 355, 104, 104, 70, 1148, 904, - 907, 920, 531, 104, 906, 1115, 1116, 923, 924, 908, - 112, 909, 313, 316, 745, 910, 922, 98, 1123, 1124, - 929, 930, 931, 838, 192, 939, 114, 935, 945, 948, - 104, 940, 942, 104, 826, 1001, 952, 104, 998, 1005, - 1014, 98, 1030, 1152, 1032, 1296, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 1033, 98, 480, 481, 482, - 483, 484, 485, 486, 1034, 1041, 1172, 789, 421, 421, - 1035, 913, 1046, 1047, 1055, 1056, 1152, 104, 70, 104, - 104, 70, 1057, 1051, 1060, 70, 1185, 1059, 1073, 1061, - 1065, 104, 1066, 104, 1067, 104, 104, 1084, 838, 838, - 838, 1077, 104, 1080, 1081, 1082, 451, 100, 104, 452, - 1088, 104, 453, 1089, 1091, 1188, 421, 1112, 461, 421, - 1113, 1105, 1128, 1114, 98, 1118, 1139, 500, 1144, 1337, - 104, 70, 1145, 70, 1159, 359, 1163, 1165, 98, 1167, - 1191, 1192, 149, 1195, 1196, 1203, 1197, 509, 1209, 111, - 1210, 1213, 1198, 1221, 21, 845, 93, 1133, 1134, 1135, - 1136, 1257, 1199, 1248, 98, 98, 98, 98, 510, 1142, - 1211, 999, 1000, 1237, 164, 1247, 1258, 1259, 511, 1260, - 1263, 1230, 1231, 1281, 1232, 1233, 457, 1264, 512, 112, - 112, 513, 514, 1285, 1294, 112, 112, 112, 1071, 355, - 1299, 1302, 1157, 111, 1305, 114, 114, 1310, 1313, 1319, - 1164, 114, 114, 114, 98, 1308, 104, 1276, 1327, 1315, - 1316, 1329, 1331, 421, 1037, 1040, 1321, 1340, 104, 104, - 1341, 70, 1342, 1343, 5, 1345, 1346, 789, 791, 343, - 322, -468, 1239, 947, -468, 355, 562, 953, 324, 531, - 325, 804, 85, 360, 304, 707, 1202, 381, 1207, 765, - 1228, 1158, 1096, 881, 123, 949, 1236, 1009, 104, 87, - 823, 946, 124, 1063, 1026, 1025, 944, 796, 777, -694, - 1040, -694, -694, 665, 1214, 746, 86, 1292, -694, -468, - 993, 1309, -468, 355, -468, 1028, 1312, 0, 0, 696, - 455, 1015, 1016, 0, -468, 1214, 1214, 1314, 1290, 0, - -694, -694, 382, 0, -694, 0, -694, 0, 104, 104, - 70, 0, -468, -468, 0, 0, 791, -468, 0, 0, - 1214, 314, 0, 0, 0, 0, -468, 0, 549, 19, - 0, 0, 104, 104, 0, 104, 48, 0, 187, 21, - 355, 22, 355, 355, 1132, 0, 0, 0, 1017, 1137, - 0, 0, 48, 139, 0, 98, 0, 0, 0, 0, - 0, 0, 0, 140, 70, 48, 0, 0, 355, 0, - 0, 26, 0, 314, 355, 0, 141, 0, 154, 314, - 111, 0, 395, 104, 0, 1293, 0, 0, 0, 0, - 0, 185, 0, 104, 104, 104, 0, 0, 0, 0, - 0, 719, 719, 229, -694, 0, -694, -694, 278, 48, - 0, 0, 0, -694, 1311, 0, 0, 0, 0, 0, - 278, 278, 0, 1182, 1183, 314, 355, 0, 154, 0, - 0, 278, 0, 0, 0, -694, -694, 396, 0, -694, - 0, -694, 112, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 1201, 98, 154, 0, 355, 0, 114, 0, - 0, 0, 0, 8, 92, 10, 11, 0, 362, 353, - 0, 12, 0, 187, 104, 0, 104, 0, 0, 0, - 0, 0, 0, 98, 0, 0, 15, 104, 0, 98, - 16, 791, 791, 791, 17, 0, 0, 1229, 8, 531, - 10, 184, 0, 0, 1234, 1235, 12, 0, 0, 98, - 21, 0, 93, 1240, 0, 48, 0, 112, 112, 112, - 0, 15, 0, 98, 0, 16, 0, 193, 0, 17, - 0, 0, 0, 114, 114, 114, 0, 0, 355, 0, - 0, 104, 104, 104, 104, 21, 0, 93, 104, 791, - 791, 791, 354, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 185, 0, 0, 0, 0, 98, 101, 105, - 0, 0, 1288, 1289, 319, 0, 0, 104, 0, 0, - 104, 0, 70, 0, 98, 0, 0, 0, 7, 100, - 278, 0, 11, 351, 0, 0, 0, 355, 0, 0, - 0, 0, 921, 229, 0, 0, 0, 0, 390, 0, - 355, 185, 355, 0, 0, 230, 0, 0, 0, 0, - 279, 0, 0, 0, 104, 104, 19, 104, 451, 452, - 0, 550, 279, 279, 0, 845, 21, 0, 22, 1334, - 0, 0, 0, 279, 0, 791, 791, 0, -508, 0, - 24, 0, 312, 315, 0, 48, 98, 70, 0, 0, - 25, 0, 0, -508, -508, 355, 0, 355, 26, 355, - -508, 0, 0, 27, 0, 0, 0, 0, 0, 0, - 363, 0, -508, 373, 375, 0, 451, 452, 104, 70, - 104, 0, 154, -508, -508, 185, -508, 0, -508, 550, - 0, 0, 104, 104, 0, 104, 0, 0, 0, 0, - 0, 314, 111, 0, 0, 0, 0, 0, 0, 362, - 0, 0, 0, 0, 0, 0, -508, -508, 0, 0, - -508, -508, 451, 452, 70, 0, 7, 100, 0, 0, - -508, 0, 0, 0, 0, 154, 0, 48, 0, 0, - 0, 0, 675, 0, 0, 0, 0, 0, 0, 409, - 0, 7, 8, 92, 10, 11, 0, 1054, 0, 278, - 12, 0, 278, 0, 19, 0, 0, 278, 675, 675, - 675, 675, 451, 452, 21, 15, 22, 7, 8, 16, - 0, 278, 0, 17, -420, 278, 0, 0, 108, 19, - 0, 0, 279, 0, 0, 0, 791, 0, 109, 21, - 0, 22, 652, 653, 669, 230, 26, 0, 410, 0, - 0, 27, 0, 24, 0, 19, 0, 278, 229, 0, - 0, 0, 0, 25, 0, 21, 0, 22, 627, 0, - 138, 26, 0, 363, 630, 550, 27, 0, 0, 139, - 19, 0, 362, 654, 0, 0, 0, 0, 228, 140, - 21, -420, 22, 277, 0, 0, 0, 26, 0, 655, - 0, 0, 141, 0, 139, 277, 277, 0, 0, 0, - 0, 791, 791, 791, 140, 0, 277, 0, 685, 686, - 0, 687, 26, 0, 0, 0, 0, 656, 409, 0, - 7, 8, 92, 10, 11, 0, 0, 0, 0, 12, - 0, 363, 8, 92, 10, 11, 0, 0, 0, 0, - 12, 624, 625, 361, 15, 104, 0, 0, 16, 0, - 0, 363, 17, -421, 550, 15, 0, 0, 19, 16, - 362, 0, 0, 17, 0, 0, 355, 0, 21, 0, - 22, 0, 0, 669, 0, 0, 0, 410, 0, 21, - 0, 93, 24, 0, 279, 100, 0, 159, 160, 0, - 0, 0, 25, 12, 778, 779, 0, 94, 0, 778, - 26, 279, 0, 0, 279, 27, 0, 0, 550, 279, - 279, 279, 279, 279, 0, 0, 17, 0, 0, 0, - -421, 0, 0, 279, 0, 509, 0, 279, 0, 0, - 0, 0, 21, 0, 93, 0, 0, 0, 451, 452, - 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, - 0, 0, 0, 0, 0, 98, 511, 0, 0, 279, - 230, 0, 0, 355, 0, 277, 512, 0, 0, 520, - 514, 0, 831, 832, 766, 768, 0, 363, 228, 0, - 0, 0, 840, 0, 363, 0, 0, 0, 847, 0, - 7, 8, 158, 159, 160, 0, 0, 675, 0, 12, - 0, 915, 0, 0, 0, 0, 361, 7, 8, 409, - 0, 7, 8, 92, 10, 11, 0, 0, 0, 0, - 12, 0, 17, 0, 0, 0, 0, 675, 19, 355, - 0, 509, 865, 550, 0, 15, 0, 362, 21, 16, - 22, 0, 0, 17, -419, 19, 0, 0, 509, 19, - 0, 0, 139, 550, 0, 21, 0, 22, 0, 21, - 0, 22, 140, 0, 833, 834, 363, 0, 410, 600, - 26, 0, 363, 24, 361, 1098, 0, 0, 0, 601, - 982, 0, 0, 25, 0, 0, 0, 26, 0, 512, - 0, 26, 602, 514, 361, 362, 27, 0, 0, 0, - 7, 100, 0, 0, 184, 0, 0, 0, 0, 0, - 278, -419, 0, 0, 0, 0, 0, 0, 0, 0, - 363, 0, 0, 0, 0, 0, 48, 277, 675, 916, - 917, 6, 919, 7, 8, 9, 10, 11, 19, 0, - 0, 0, 12, 0, 277, 0, 0, 277, 21, 0, - 22, 0, 277, 277, 277, 277, 277, 15, 933, 0, - 0, 16, 24, 0, 0, 17, 277, 0, 0, 0, - 277, 19, 25, 0, 0, 323, 0, 0, 0, 0, - 26, 21, 0, 22, 0, 27, 23, 0, 7, 8, - 0, 0, 11, 0, 0, 24, 0, 0, 268, 0, - 0, 48, 277, 228, 0, 25, 0, 0, 0, 279, - 0, 0, 0, 26, 0, 0, 0, 997, 27, 0, - 361, 268, 0, 0, 28, 0, 19, 361, 0, 509, - 1002, 1003, 1004, 154, 0, 982, 21, 0, 22, 279, - 0, 0, 982, 0, 0, 363, 0, 766, 768, 363, - 600, 0, 0, 0, 1015, 100, 0, 0, 357, 0, - 601, 0, 0, 0, 0, 363, 0, 0, 26, 0, - 512, 0, 0, 602, 514, 0, 0, 0, 48, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 19, 0, 0, 0, 0, 0, 0, 994, - 995, 0, 21, 0, 22, 994, 995, 363, 1058, 361, - 0, 1017, 0, 0, 0, 361, 24, 0, 0, 0, - 0, 0, 279, 0, 0, 584, 25, 708, 709, 982, - 10, 436, 233, 234, 26, 235, 12, 0, 0, 27, - 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 236, 237, 238, 16, 0, 239, 0, 17, - 0, 240, 241, 361, 242, 19, 243, 244, 0, 0, - 245, 246, 247, 248, 249, 21, 0, 710, 585, 0, - 0, 458, 0, 0, 0, 0, 250, 0, 0, 251, - 0, 0, 1117, 0, 0, 0, 0, 252, 253, 254, - 0, 766, 768, 982, 0, 255, 256, 257, 0, 0, - 0, 1216, 258, 711, 982, 0, 259, 0, 0, 0, - 409, 0, 7, 8, 92, 10, 11, 278, 260, 0, - 0, 12, 1216, 1216, 0, 0, 0, 1146, 0, 0, - 374, 376, 379, 0, 0, 0, 15, 0, 0, 0, - 16, 0, 277, 0, 17, -422, 0, 1216, 0, 0, - 19, 0, 586, 357, 982, 0, 0, 0, 0, 0, - 21, 982, 22, 0, 982, 0, 7, 8, 0, 410, - 184, 0, 277, 0, 24, 0, 0, 0, 361, 0, - 0, 0, 361, 0, 25, 982, 0, 0, 982, 0, - 0, 0, 26, 0, 0, 982, 0, 27, 361, 357, - 0, 0, 0, 0, 19, 0, 0, 509, 0, 0, - 0, 0, -422, 0, 21, 0, 22, 0, 0, 982, - 0, 0, 649, 0, 0, 0, 0, 0, 600, 0, - 0, 0, 0, 0, 982, 0, 0, 0, 601, 0, - 361, 0, 0, 0, 0, 0, 26, 357, 512, 982, - 0, 602, 514, 0, 0, 277, 0, 0, 0, 0, - 0, 7, 8, 0, 0, 11, 982, 982, 0, 550, - 0, 268, 0, 277, 586, 0, 0, 716, 717, 0, - 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 19, - 0, 0, 509, 0, 357, 0, 357, 357, 0, 21, - 0, 22, 0, 230, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 835, 0, 0, 0, 624, 625, 279, - 0, 0, 357, 836, 230, 230, 7, 8, 357, 0, - 423, 26, 0, 512, 0, 0, 602, 514, 0, 0, - 0, 0, 0, 798, 800, 0, 0, 0, 0, 230, - 0, 0, 0, 0, 622, 0, 623, 0, 374, 376, - 515, 515, 515, 0, 19, 0, 0, 509, 0, 0, - 0, 636, 0, 0, 21, 0, 22, 0, 0, 6, - 357, 7, 8, 9, 10, 11, 0, 586, 600, 0, - 12, 0, 0, 662, 0, 0, 0, 0, 601, 0, - 0, 0, 0, 13, 14, 15, 26, 0, 512, 16, - 357, 602, 514, 17, 0, 0, 0, 18, 42, 19, - 0, 586, 0, 20, 0, 0, 7, 100, 0, 21, - 11, 22, 0, 0, 23, 0, 0, 0, 42, 42, - 0, 110, 515, 24, 515, 515, 515, 42, 0, 0, - 0, 0, 0, 25, 0, 0, 0, 866, 42, 0, - 42, 26, 7, 8, 19, 0, 27, 0, 0, 0, - 0, 363, 28, 29, 21, 0, 22, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 108, 0, - 0, 0, 357, 0, 0, 0, 0, 0, 109, 0, - 19, 0, 0, 0, 0, 0, 26, 0, 0, 42, - 21, 27, 22, 900, 0, 42, 0, 190, 0, 42, - 0, 0, 110, 110, 139, 0, 0, 0, 0, 8, - 0, 10, 184, 42, 140, 42, 42, 12, 0, 0, - 0, 0, 26, 0, 0, 0, 228, 141, 0, 0, - 586, 357, 15, 42, 42, 110, 16, 0, 0, 0, - 17, 0, 277, 190, 357, 0, 357, 228, 228, 509, - 0, 0, 0, 0, 0, 0, 21, 0, 93, 42, - 0, 374, 376, 379, 7, 8, 0, 0, 11, 379, - 510, 0, 228, 515, 515, 943, 515, 42, 0, 0, - 511, 0, 0, 787, 0, 622, 623, 42, 636, 0, - 512, 0, 0, 513, 514, 0, 0, 0, 0, 357, - 0, 357, 19, 357, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 515, 22, 0, 0, 379, 0, 0, - 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, - 586, 586, 0, 0, 0, 0, 140, 0, 0, 0, - 0, 0, 0, 0, 26, 1010, 1011, 0, 0, 141, - 7, 8, 92, 10, 11, 0, 0, 353, 8, 12, - 10, 11, 0, 515, 515, 515, 12, 0, 0, 505, - 0, 787, 0, 0, 15, 0, 0, 190, 16, 42, - 0, 15, 17, 586, 586, 16, 0, 1042, 19, 17, - 0, 509, 0, 0, 361, 0, 0, 0, 21, 0, - 22, 0, 0, 0, 0, 21, 42, 93, 494, 42, - 0, 0, 835, 42, 0, 0, 0, 0, 0, 0, - 0, 8, 836, 10, 11, 0, 0, 0, 0, 12, - 26, 0, 512, 0, 0, 602, 514, 0, 515, 586, - 354, 0, 495, 0, 15, 0, 0, 0, 16, 0, - 1079, 0, 17, 42, 42, 42, 42, 0, 0, 0, - 0, 42, 0, 0, 0, 0, 0, 42, 21, 42, - 93, 110, 110, 7, 8, 158, 159, 160, 42, 0, - 0, 0, 12, 0, 42, 0, 0, 42, 7, 100, - 0, 0, 423, 0, 622, 623, 374, 376, 0, 1120, - 0, 636, 374, 376, 379, 17, 42, 42, 0, 42, - 0, 19, 0, 586, 509, 0, 0, 0, 586, 0, - 1138, 21, 0, 22, 0, 0, 19, 0, 0, 515, - 1021, 515, 0, 0, 0, 600, 21, 0, 22, 0, - 0, 0, 515, 0, 0, 601, 787, 787, 787, 0, - 24, 0, 0, 26, 0, 512, 0, 0, 608, 514, - 25, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 27, 7, 8, 0, 0, 184, 0, - 357, 0, 0, 120, 0, 7, 8, 92, 10, 11, - 0, 0, 586, 586, 12, 0, 515, 515, 515, 515, - 1186, 1187, 505, 515, 787, 787, 787, 0, 0, 15, - 0, 0, 19, 16, 788, 0, 0, 17, 0, 0, - 0, 586, 21, 19, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 21, 0, 22, 139, 0, 0, 0, - 0, 0, 1218, 0, 42, 0, 140, 24, 0, 0, - 0, 0, 0, 0, 26, 622, 623, 25, 636, 141, - 0, 0, 0, 0, 0, 26, 586, 0, 0, 0, - 27, 0, 0, 586, 586, 0, 0, 357, 0, 0, - 0, 0, 586, 0, 64, 8, 92, 10, 11, 0, - 0, 353, 0, 12, 42, 42, 110, 0, 0, 0, - 787, 787, 844, 0, 64, 64, 0, 115, 15, 0, - 0, 0, 16, 64, 0, 0, 17, 0, 42, 42, - 0, 42, 0, 0, 64, 509, 64, 0, 0, 0, - 0, 0, 21, 0, 93, 0, 0, 0, 0, 0, - 0, 586, 586, 357, 7, 8, 510, 0, 11, 0, - 110, 0, 0, 0, 0, 0, 511, 515, 515, 379, - 515, 0, 0, 0, 0, 0, 512, 0, 0, 513, - 514, 0, 0, 0, 354, 64, 0, 0, 0, 0, - 0, 64, 19, 0, 788, 64, 0, 0, 115, 115, - 0, 0, 21, 0, 22, 0, 0, 0, 0, 64, - 0, 64, 64, 0, 0, 0, 377, 0, 586, 0, - 0, 0, 0, 0, 0, 0, 378, 0, 0, 64, - 64, 115, 0, 0, 26, 0, 0, 0, 0, 141, - 0, 0, 0, 0, 374, 376, 379, 0, 196, 0, - 0, 8, 0, 10, 11, 64, 0, 0, 0, 12, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 0, 64, 15, 0, 0, 0, 16, 0, - 0, 0, 17, 64, 197, 198, 116, 788, 788, 0, - 0, 199, 0, 0, 0, 0, 0, 0, 21, 0, - 93, 0, 200, 150, 201, 202, 203, 0, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 0, 0, 222, 223, - 224, 0, 0, 225, 0, 0, 226, 42, 42, 110, - 110, 0, 190, 0, 42, 844, 844, 844, 0, 0, - 0, 227, 0, 0, 150, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 116, 0, - 0, 0, 0, 42, 530, 64, 42, 0, 42, 0, - 150, 0, 0, 0, -301, 8, -301, 10, 184, 0, - 0, 788, 788, 12, 0, 0, 0, 0, 150, 150, - 380, 0, 64, 0, 0, 64, 0, 0, 15, 64, - 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, - 0, 0, -301, 0, 150, 509, 0, 0, 582, 0, - 0, 0, 21, 0, 93, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 510, 0, 0, 64, - 64, 64, 64, 42, 0, 0, 511, 64, 0, 0, - 0, 0, 0, 64, -301, 64, 512, 115, 115, 513, - 514, 0, 0, 0, 64, 0, 0, 0, 0, 0, - 64, 0, 0, 64, 42, 42, 42, 0, 0, 0, - 433, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 0, 42, 64, 64, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, - 83, 10, 436, 233, 234, 0, 235, 12, 0, 0, - 42, 0, 83, 83, 0, 83, 517, 517, 517, 0, - 0, 0, 15, 236, 150, 0, 16, 0, 239, 0, - 17, 0, 240, 241, 0, 242, 19, 243, 244, 0, - 177, 245, 246, 247, 248, 249, 21, 0, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, - 251, 0, 0, 0, 0, 0, 0, 0, 252, 253, - 254, 0, 0, 0, 0, 0, 255, 256, 257, 0, - 0, 0, 844, 437, 0, 0, 0, 0, 0, 83, - 790, 83, 83, 83, 0, 0, 83, 83, 604, 260, - 604, 604, 517, 0, 7, 8, 158, 159, 160, 0, - 0, 0, 150, 12, 150, 0, 380, 380, 0, 0, - 64, 0, 0, 150, 0, 0, 0, 0, 0, 150, - 0, 0, 150, 0, 148, 0, 17, 0, 0, 0, - 0, 0, 19, 0, 0, 509, 0, 0, 0, 0, - 0, 150, 21, 0, 22, 0, 191, 844, 844, 844, - 0, 0, 0, 0, 0, 0, 600, 0, 0, 0, - 64, 64, 115, 0, 0, 191, 601, 0, 846, 0, - 0, 83, 0, 0, 26, 148, 512, 0, 0, 602, - 514, 0, 0, 0, 64, 64, 100, 64, 159, 160, - 0, 42, 0, 0, 12, 0, 7, 8, 0, 0, - 423, 148, 0, 0, 0, 8, 92, 10, 11, 83, - 0, 1335, 0, 12, 0, 0, 115, 17, 0, 148, - 148, 148, 0, 0, 7, 8, 509, 754, 15, 389, - 0, 0, 16, 21, 19, 93, 17, 0, 0, 517, - 517, 0, 517, 0, 21, 148, 22, 510, 0, 517, - 790, 0, 21, 83, 93, 83, 83, 511, 139, 0, - 7, 8, 19, 0, 0, 0, 0, 512, 140, 0, - 513, 514, 21, 0, 22, 191, 26, 1092, 0, 604, - 0, 141, 0, 0, 83, 0, 139, 0, 0, 0, - 83, 0, 0, 83, 0, 0, 140, 83, 19, 0, - 0, 0, 0, 0, 26, 0, 0, 0, 21, 141, - 22, 8, 92, 10, 11, 0, 0, 0, 0, 12, - 0, 0, 377, 0, 0, 0, 0, 0, 0, 604, - 604, 839, 378, 0, 15, 0, 0, 839, 16, 0, - 26, 0, 17, 790, 790, 141, 0, 0, 0, 0, - 0, 530, 0, 150, 150, 0, 150, 0, 21, 0, - 93, 0, 0, 191, 0, 148, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, - 0, 0, 0, 64, 64, 115, 115, 0, 0, 0, - 64, 846, 846, 846, 517, 0, 0, 0, 0, 0, - 83, 0, 0, 0, 433, 433, 433, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 64, 0, 64, 0, 0, 0, 0, 148, - 0, 148, 148, 0, 0, 0, 0, 790, 790, 518, - 522, 524, 0, 148, 0, 148, 0, 148, 148, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, - 148, 0, 0, 148, 0, 0, 83, 0, 0, 0, - 0, 0, 62, 0, 0, 0, 83, 0, 83, 83, - 0, 0, 148, 0, 0, 517, 0, 517, 0, 0, - 0, 0, 102, 106, 0, 0, 0, 0, 517, 64, - 0, 125, 517, 517, 517, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 157, 0, 0, 0, 0, 177, - 0, 605, 0, 518, 522, 524, 0, 0, 0, 0, - 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 64, 64, 0, 64, 8, 151, - 10, 152, 604, 604, 839, 839, 12, 0, 0, 604, - 839, 839, 839, 0, 0, 0, 0, 0, 0, 305, - 0, 15, 0, 307, 0, 16, 64, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 62, 150, 0, - 329, 0, 0, 191, 0, 21, 0, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 102, 106, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 754, 754, 0, 754, 0, - 0, 0, 0, 83, 0, 0, 0, 0, 846, 0, - 0, 418, 0, 83, 83, 83, 517, 517, 0, 0, - 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 148, 837, 769, 0, 771, 0, 0, 837, 0, - 0, 0, 771, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 148, 0, 148, 0, 150, - 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 522, 604, 604, 0, 604, 0, 0, 0, - 0, 0, 0, 846, 846, 846, 837, 0, 0, 0, - 0, 0, 0, 0, 83, 0, 83, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 472, 473, + 46, 323, 525, 368, 677, 600, 557, 85, 351, 351, + 30, 533, 590, 559, 195, 85, 96, 315, 318, 103, + 103, 84, 103, 642, 536, 468, 179, 556, 66, 123, + 362, 291, 97, 232, 352, 347, 640, 359, 921, 150, + 412, 66, 195, 403, 404, 395, 353, 85, 1218, 960, + 1113, 1234, 1150, 8, 85, 505, -124, 834, 834, 505, + 143, 84, 505, -1, 1256, 196, 85, 1225, 75, 78, + 310, 345, 85, 96, 1263, 128, 557, 872, 44, -2, + 603, 655, 85, 559, 7, 8, 76, 513, 525, 287, + 150, 85, 77, 85, 95, 674, 103, 302, 342, 308, + 103, 189, 93, 103, 103, 103, 426, 122, 674, 618, + 1265, 301, 343, 1251, 1275, 66, 46, 150, 66, 311, + -473, 165, 19, -473, 429, 604, 835, 1301, 100, 100, + 605, 697, 1114, 363, 22, 150, 150, 150, 331, 1117, + 1278, 1095, 344, 348, 1317, 1057, 82, 1305, 566, 781, + 1150, 286, 1266, 88, 619, 1038, 190, 784, 427, 620, + 560, 150, 675, 606, 26, 339, 698, 100, -473, 513, + 966, -473, 713, -473, 89, 1157, 21, 93, 93, 66, + 417, 396, 387, -473, 100, 73, 176, 427, 1073, 103, + 514, 8, 621, 362, 44, 425, 349, 401, 538, 429, + 515, -473, -473, 529, 1054, -700, -473, 277, 90, 136, + 516, -700, 423, 517, 518, -473, 93, 8, 967, 295, + 297, 1278, 1278, 351, 351, 599, 85, 436, 165, 195, + 277, 21, 74, 93, 502, 165, 165, 1104, 190, 1110, + 93, 312, 75, 188, 595, 758, 1178, 530, 597, 598, + 596, 582, 8, 137, 138, 759, 581, 368, 416, 165, + 76, 533, 190, 362, 78, 310, 93, 85, 361, 760, + 100, 512, 513, 436, 436, 527, 403, 404, 99, 329, + 768, 150, 188, -230, 362, 100, 644, 770, 427, 315, + 318, 639, 583, 900, 455, 85, 363, 456, 390, 21, + 457, 584, 537, 165, 404, 603, 465, 678, 875, 103, + 193, 1230, 103, 1113, 311, 504, 697, 103, 646, 93, + 1113, 85, 96, 824, 769, 655, 330, -230, -230, 193, + 1310, 771, 21, 75, 93, 884, 585, 712, 97, 695, + 1153, -224, 391, 392, 1080, 425, 434, 193, 166, 167, + 604, 76, 165, -696, 679, 605, 435, 150, 66, 150, + 150, 527, 1080, 7, 100, 66, 363, 825, 1260, 1203, + 570, 150, 1311, 150, 1113, 150, 150, 150, 610, 118, + 614, 616, 885, 150, -231, 454, 119, 363, 606, 150, + 461, 1081, 150, 425, 193, 1114, 747, -103, 749, 750, + 95, 19, 1114, 1024, 1025, 85, 99, 425, 133, 1188, + 362, 150, 66, 22, 66, 417, 1204, 362, 134, 85, + 945, 160, 161, 1271, 1332, 1080, 1307, 12, -231, -231, + 799, 554, 664, 943, 1080, 190, 7, 506, 165, 507, + 193, 19, -225, 26, 647, 85, 85, 85, 85, 183, + 17, 21, 1080, 22, 7, 8, 1114, 288, 113, 513, + 1026, 680, 502, 826, 1348, 140, 1333, 290, 165, 165, + 1272, 75, 1282, 351, 19, 141, 463, 7, 8, 828, + -102, 1288, 1186, 26, -224, 821, 22, 815, 142, 76, + 703, 464, 19, 416, 590, 85, 165, 436, 833, 1327, + 657, 554, 362, 697, 22, 1214, 658, 827, 362, 436, + 436, 1349, 527, 363, 557, 19, 508, 754, 188, 66, + 363, 559, 361, 829, 533, 403, 429, 22, 193, 368, + 179, 755, 463, 787, 26, 556, 320, 536, 655, 113, + 113, 113, 78, 79, 168, 169, 170, 561, 324, 1215, + 150, 85, 193, 468, 321, 681, 362, 26, 78, 79, + 1062, 756, 1053, -287, 865, 84, 298, 299, 886, -287, + 1279, 616, 696, 113, 171, 699, 425, 788, 789, 235, + 705, 706, 707, 708, 709, 78, 310, 1135, 1136, 1137, + 21, 187, 80, 172, 277, 127, -508, 883, 722, -225, + 719, 188, 150, 150, 847, 363, 21, 754, 80, 81, + 847, 363, 188, -700, 1280, -700, -700, 7, 506, 340, + 677, 755, -700, 388, 389, 75, 150, 150, 165, 150, + 751, 1097, 128, 1088, 1083, 311, 373, 173, 174, 175, + 99, 385, 302, 76, -700, -700, -700, 698, -700, 85, + -700, 756, 636, 425, 368, 19, 923, 100, 847, 363, + 808, 645, 241, -700, -288, -700, -700, 22, 410, 934, + -288, 935, -700, 100, 75, 809, 21, 436, 160, 161, + 193, 362, 188, 1129, 12, 362, 425, 436, 436, 436, + 811, 424, 76, 430, -700, -700, 386, 26, -700, 432, + -700, 362, 188, 876, 21, 433, 93, 17, 878, 879, + 1058, 1059, 881, 1061, 439, 698, -27, 165, 434, -27, + 21, 431, 93, 397, 398, 963, 719, 964, 435, 965, + 571, -27, 188, 333, 758, 334, 13, 14, 362, 335, + 1159, 1160, 195, 115, 759, 362, 446, 85, 890, 891, + 892, 447, 315, 318, 1176, 165, 193, 450, 760, 315, + 318, 572, 449, 573, 451, 574, 452, 575, 436, 453, + 436, 193, 13, 14, 1190, 1191, 336, 85, 337, 13, + 14, 436, 338, 85, 363, 66, 66, 66, 363, 505, + 489, 490, 542, 949, 361, 1032, 1033, 545, 1033, 1078, + 1079, -81, 550, 85, 363, 85, 930, -81, -80, 1342, + 1343, 113, 113, 113, -80, 531, 8, 388, 1180, 7, + 8, 1222, 544, 11, 115, 115, 115, 547, 407, 548, + 408, 567, 455, 456, 409, 549, 150, 150, 150, 150, + 847, 363, 397, 1181, 150, 847, 847, 847, 363, 241, + 532, 388, 1187, 19, 442, 445, 349, 19, 115, 564, + 513, 427, 85, 21, -695, 93, 601, 21, 602, 22, + 1313, 1314, 150, 617, 70, 103, 626, 66, 417, 85, + 627, 607, 87, 920, 425, 425, 633, 425, 491, 685, + 98, 608, 455, 456, 104, 104, 641, 104, 686, 26, + 690, 516, 691, 70, 609, 518, 710, 820, 8, 648, + 711, 713, 1021, 722, 104, 766, 70, 767, 780, 361, + 436, 436, 87, 436, 782, 492, 493, 784, 801, 98, + 494, 495, 496, 497, 800, 649, 810, 455, 456, 554, + 650, 98, 8, 868, 812, -228, 814, 98, 816, 698, + 832, 817, 818, 66, 417, 21, 416, 93, 819, 857, + 823, 859, 860, 1162, 861, 104, 98, 862, 968, 649, + 866, 104, 864, 1063, 869, 104, 863, 867, 104, 104, + 104, 871, 292, 296, 877, 150, 66, 150, 880, 21, + 70, 93, 104, 70, 13, 14, 882, 1017, 399, 150, + 150, -332, 150, 887, 888, 893, 1103, 904, 1109, 894, + 104, 104, 104, 905, 898, 681, 899, 906, 901, 902, + -700, 903, -700, -700, -332, -332, 907, -332, 461, -700, + 66, 417, 416, 908, -101, 910, 104, 159, 160, 161, + 113, 911, 913, 557, 12, 1048, 113, 914, 1199, 1200, + 1346, -700, -700, 400, 70, -700, 915, -700, 916, 918, + 1233, 917, 919, 932, 104, 165, 1162, 17, 929, 1131, + 1132, 931, 594, 933, 402, 160, 161, 940, 938, 939, + 947, 12, 834, 100, 953, 948, 11, 944, 1010, 188, + 950, 193, 315, 318, 113, 961, 115, 115, 115, 646, + 1048, 98, 104, 847, 17, 1249, 1008, 1023, 1014, 416, + 1039, 1041, 8, 92, 10, 11, 1042, 1096, 356, 1043, + 12, 1044, 1050, 513, 486, 487, 488, 489, 490, 1162, + 21, 1060, 93, 1064, 1082, 15, 1055, 425, 425, 16, + 1056, 959, 98, 17, 514, 1065, 1182, 1066, 104, 104, + 70, 1069, 1087, 459, 515, 535, 104, 659, 660, 21, + 1068, 93, 1162, 1070, 516, 1071, 1195, 517, 518, 1074, + 98, 1300, 1075, 1138, 1076, 1090, 1091, 1092, 847, 847, + 847, 1099, 1098, 1115, 104, 425, 1101, 104, 425, 1122, + 1123, 1015, 104, 193, 1124, 19, 98, 1128, 661, 1149, + 1022, 357, 112, 1306, 1154, 21, 1155, 22, 1173, 1036, + 1169, 98, 1158, 1175, 662, 1347, 1201, 1177, 1202, 140, + 1205, 1206, 150, 1213, 1219, 455, 456, 1207, 1208, 141, + 362, 1269, 104, 70, 104, 104, 70, 26, 1209, 1220, + 70, 1221, 663, 1258, 1223, 1231, 104, 1247, 104, 1257, + 104, 104, 104, 1267, 1268, 1273, 1291, 1270, 104, 1295, + 1304, 1274, 7, 8, 104, 1309, 185, 104, 1080, 628, + 1312, 1320, 1315, 1318, 113, 113, 113, 1323, 1325, 1339, + 98, 113, 113, 113, 316, 319, 104, 70, 1326, 70, + 1329, 1341, 425, 1331, 98, 1337, 1350, 1286, 1351, 165, + 19, 7, 100, 513, 1352, 11, 1353, 1355, 1356, 325, + 21, 5, 22, 569, 955, 327, 461, 112, 962, 306, + 98, 98, 98, 98, 607, 115, 328, 1212, 1217, 1238, + 346, 115, 85, 363, 608, 459, 772, 1138, 459, 19, + 700, 702, 26, 704, 516, 1125, 1126, 609, 518, 21, + 714, 22, 1168, 100, 1106, 858, 185, 1246, 1133, 1134, + 831, 459, 954, 24, 889, 726, 1018, 124, 125, 870, + 98, 958, 104, 25, 48, 1072, 672, 803, 1035, 115, + 1034, 26, 952, 86, 104, 104, 27, 70, 753, 1003, + 48, 748, 1302, 513, 798, 1322, 8, 765, 10, 11, + 21, 1324, 93, 48, 12, 535, 484, 485, 486, 487, + 488, 489, 490, 1037, 514, 0, 155, -232, 0, 15, + 0, 624, 0, 16, 515, 104, 87, 17, 0, 186, + 0, 0, -232, -232, 516, 0, 0, 517, 518, -232, + 0, 230, 0, 21, 0, 93, 279, 48, 0, 0, + 0, -232, 0, 0, 0, 0, 1198, 0, 279, 279, + 0, 0, -232, -232, 0, -232, 155, -232, 554, 279, + 0, 0, 0, 0, 0, 0, 0, 104, 104, 70, + 752, 0, 0, 0, 922, 798, 0, 0, 0, 8, + 48, 10, 185, 155, 0, -232, -232, 12, 0, -232, + -232, 104, 104, 0, 104, 0, 0, 365, 0, -232, + 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, + 17, 0, 1240, 1241, 98, 1242, 1243, 0, 0, 0, + 0, 0, 0, 70, 0, 0, 21, 0, 93, 113, + 0, 957, 0, 0, 413, 0, 7, 8, 92, 10, + 11, 0, 104, 0, 48, 12, 316, 319, 0, 115, + 115, 115, 104, 104, 104, 0, 115, 115, 115, 0, + 15, 0, 0, 0, 16, 0, 0, 0, 17, -425, + 0, 0, 0, 0, 19, 0, 1009, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 22, 0, 0, 676, + 0, 186, 0, 414, 100, 0, 160, 161, 24, 0, + 358, 0, 12, 0, 113, 113, 113, 0, 25, 0, + 0, 0, 98, 0, 0, 0, 26, 0, 0, 279, + 0, 27, 1319, 0, 0, 17, 0, 0, 0, 1046, + 1049, 0, 230, 104, 513, 104, -425, 0, 0, 0, + 186, 21, 98, 93, 927, 0, 104, 0, 98, 0, + 798, 798, 798, 0, 229, 514, 0, 0, 535, 278, + 555, 0, 0, 0, 0, 515, 0, 0, 98, 0, + 98, 278, 278, 0, 0, 516, 459, 0, 524, 518, + 0, 0, 278, 98, 0, 1049, 48, 0, 0, 796, + 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, + 0, 104, 104, 104, 104, 70, 0, 0, 0, 104, + 798, 798, 798, 0, 0, 0, 0, 0, 0, 0, + 364, 100, 0, 155, 427, 0, 186, 98, 0, 0, + 555, 19, 0, 0, 0, 0, 459, 104, 0, 0, + 104, 21, 70, 22, 98, 0, 139, 0, 0, 0, + 1016, 365, 0, 0, 0, 140, 0, 0, 0, 1142, + 0, 513, 0, 0, 1147, 141, 0, 0, 21, 0, + 93, 0, 0, 26, 112, 0, 0, 155, 142, 48, + 854, 459, 514, 0, 682, 104, 104, 0, 104, 0, + 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, + 0, 279, 516, 0, 279, 517, 518, 358, 0, 279, + 682, 682, 682, 682, 115, 0, 0, 0, 70, 0, + 0, 0, 8, 279, 10, 11, 0, 279, 112, 0, + 12, 0, 0, 101, 105, 0, 0, 0, 0, 1192, + 1193, 0, 278, 0, 0, 15, 0, 0, 0, 16, + 104, 70, 104, 17, 358, 229, 0, 0, 0, 279, + 230, 0, 796, 0, 104, 104, 1094, 104, 1211, 21, + 0, 93, 498, 0, 0, 0, 0, 555, 0, 0, + 231, 0, 0, 364, 365, 280, 0, 0, 0, 115, + 115, 115, 0, 7, 100, 70, 0, 280, 280, 0, + 0, 0, 358, 0, 0, 0, 499, 0, 280, 0, + 7, 8, 0, 1239, 11, 0, 0, 314, 317, 0, + 1244, 1245, 0, 0, 0, 1143, 1144, 1145, 1146, 1250, + 0, 19, 0, 0, 0, 0, 0, 1152, 0, 0, + 0, 21, 0, 22, 0, 0, 366, 0, 19, 376, + 378, 513, 0, 364, 0, 108, 316, 946, 21, 358, + 22, 358, 358, 0, 0, 109, 0, 0, 798, 555, + 0, 1167, 843, 26, 364, 365, 0, 0, 110, 1174, + 0, 0, 844, 0, 0, 0, 0, 358, 1298, 1299, + 26, 0, 516, 358, 0, 845, 518, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 0, 278, 0, 316, + 319, 0, 0, 0, 0, 0, 316, 319, 0, 0, + 0, 0, 0, 555, 278, 0, 0, 278, 0, 0, + 0, 0, 278, 278, 278, 278, 278, 0, 0, 0, + 0, 0, 0, 798, 798, 798, 278, 0, 358, 0, + 278, 0, 0, 1224, 413, 1344, 7, 8, 92, 10, + 11, 316, 946, 0, 0, 12, 0, 0, 280, 459, + 0, 0, 0, 0, 1224, 1224, 0, 0, 358, 0, + 15, 231, 278, 229, 16, 0, 0, 104, 17, -424, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 1224, + 364, 0, 0, 0, 21, 0, 22, 364, 0, 366, + 0, 0, 682, 414, 0, 0, 924, 0, 24, 0, + 0, 6, 0, 7, 8, 9, 10, 11, 25, 0, + 0, 0, 12, 0, 0, 8, 26, 10, 11, 0, + 0, 27, 682, 12, 0, 13, 14, 15, 555, 0, + 0, 16, 365, 0, 0, 17, -424, 0, 15, 18, + 358, 19, 16, 0, 1303, 20, 17, 0, 555, 0, + 956, 21, 0, 22, 0, 0, 23, 0, 0, 366, + 726, 726, 21, 0, 93, 24, 0, 0, 0, 631, + 632, 0, 364, 1321, 0, 25, 992, 98, 364, 0, + 366, 0, 0, 26, 0, 555, 0, 0, 27, 0, + 0, 0, 365, 0, 28, 29, 0, 7, 100, 358, + 0, 185, 0, 0, 0, 0, 279, 0, 0, 0, + 0, 0, 358, 280, 358, 0, 0, 0, 0, 0, + 0, 0, 48, 0, 682, 0, 364, 0, 0, 0, + 280, 0, 0, 280, 0, 19, 0, 279, 280, 280, + 280, 280, 280, 0, 0, 21, 0, 22, 0, 0, + 0, 0, 280, 854, 0, 0, 280, 0, 0, 24, + 413, 0, 7, 8, 92, 10, 11, 0, 358, 25, + 358, 12, 358, 0, 0, 0, 0, 26, 0, 194, + 0, 0, 27, 0, 0, 0, 15, 0, 280, 231, + 16, 0, 0, 0, 17, -427, 0, 269, 48, 0, + 19, 0, 0, 773, 775, 0, 366, 0, 0, 0, + 21, 0, 22, 366, 0, 278, 0, 0, 0, 414, + 269, 0, 0, 0, 24, 0, 0, 322, 0, 316, + 319, 155, 0, 992, 25, 0, 0, 0, 0, 0, + 992, 0, 26, 0, 0, 278, 354, 27, 0, 0, + 0, 364, 0, 0, 0, 364, 0, 0, 360, 0, + 0, 394, -427, 0, 0, 0, 0, 0, 0, 0, + 0, 364, 0, 0, 0, 48, 413, 0, 7, 8, + 92, 10, 11, 0, 7, 8, 0, 12, 427, 0, + 0, 0, 0, 0, 0, 0, 841, 842, 366, 0, + 0, 0, 15, 0, 366, 0, 16, 0, 364, 0, + 17, -426, 0, 0, 0, 364, 19, 0, 0, 0, + 0, 0, 19, 0, 0, 513, 21, 992, 22, 278, + 0, 676, 21, 0, 22, 414, 0, 0, 7, 8, + 24, 0, 0, 0, 0, 0, 607, 278, 0, 0, + 25, 0, 366, 0, 0, 0, 608, 0, 26, 0, + 278, 0, 0, 27, 26, 0, 516, 0, 0, 609, + 518, 0, 8, 92, 10, 11, 19, 0, -426, 513, + 12, 462, 0, 0, 0, 0, 21, 0, 22, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, + 607, 992, 6, 17, 7, 8, 9, 10, 11, 1226, + 608, 0, 992, 12, 0, 0, 0, 0, 26, 21, + 516, 93, 0, 609, 518, 279, 0, 0, 15, 0, + 1226, 1226, 16, 0, 0, 0, 17, 7, 8, 0, + 0, 280, 19, 0, 0, 0, 326, 0, 0, 0, + 0, 358, 21, 0, 22, 1226, 0, 23, 0, 0, + 0, 0, 992, 0, 593, 360, 24, 0, 0, 992, + 0, 280, 992, 0, 0, 19, 25, 366, 0, 773, + 775, 366, 0, 0, 26, 21, 0, 22, 0, 27, + 1102, 0, 0, 992, 634, 28, 992, 366, 0, 140, + 637, 0, 0, 992, 0, 0, 0, 0, 0, 141, + 0, 0, 360, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 142, 8, 92, 10, 11, 992, 0, 0, + 0, 12, 1004, 1005, 366, 656, 0, 0, 0, 1004, + 1005, 366, 992, 0, 692, 693, 15, 694, 358, 0, + 16, 0, 0, 0, 17, 280, 0, 992, 0, 0, + 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 0, 93, 280, 992, 992, 0, 555, 7, 100, + 0, 0, 11, 0, 269, 0, 280, 593, 94, 0, + 723, 724, 0, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 0, 0, 358, 0, 19, 360, 0, 360, + 360, 0, 0, 0, 0, 0, 21, 0, 22, 0, + 785, 786, 229, 0, 8, 785, 10, 0, 0, 0, + 108, 0, 12, 0, 0, 360, 0, 0, 278, 0, + 109, 360, 0, 229, 229, 0, 0, 15, 26, 0, + 0, 16, 0, 110, 0, 17, 805, 807, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, + 0, 21, 0, 93, 0, 0, 0, 0, 0, 0, + 7, 8, 92, 10, 11, 0, 0, 356, 0, 12, + 0, 7, 8, 152, 10, 153, 360, 0, 0, 0, + 12, 839, 840, 593, 15, 0, 0, 0, 16, 83, + 0, 849, 17, 0, 0, 15, 0, 856, 19, 16, + 0, 83, 83, 17, 83, 0, 360, 0, 21, 19, + 22, 0, 0, 0, 0, 42, 0, 593, 0, 21, + 0, 22, 380, 0, 154, 0, 0, 0, 0, 178, + 0, 0, 381, 24, 0, 42, 42, 0, 111, 0, + 26, 873, 0, 25, 42, 382, 0, 0, 0, 0, + 357, 26, 0, 874, 0, 42, 27, 42, 0, 0, + 7, 8, 159, 160, 161, 0, 0, 0, 0, 12, + 364, 0, 0, 0, 0, 0, 0, 191, 83, 0, + 83, 83, 83, 0, 0, 83, 83, 83, 360, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 19, 0, + 0, 513, 0, 0, 0, 0, 42, 0, 21, 909, + 22, 0, 42, 0, 191, 0, 42, 0, 0, 111, + 111, 111, 140, 0, 0, 0, 0, 0, 231, 0, + 0, 42, 141, 42, 42, 0, 0, 0, 925, 926, + 26, 928, 631, 632, 280, 1108, 593, 360, 0, 231, + 231, 42, 42, 111, 0, 0, 0, 0, 0, 0, + 360, 191, 360, 0, 0, 0, 0, 942, 0, 0, + 0, 83, 0, 0, 231, 0, 0, 42, 0, 0, + 0, 0, 0, 0, 0, 7, 8, 159, 160, 161, + 0, 951, 0, 0, 12, 42, 0, 0, 0, 0, + 0, 0, 0, 593, 0, 42, 0, 0, 0, 83, + 0, 0, 0, 0, 0, 0, 360, 17, 360, 0, + 360, 0, 0, 19, 0, 0, 513, 0, 1007, 100, + 0, 160, 161, 21, 0, 22, 0, 12, 0, 0, + 1011, 1012, 1013, 0, 0, 0, 0, 607, 593, 0, + 0, 0, 0, 83, 0, 83, 83, 608, 0, 0, + 17, 0, 1019, 1020, 0, 26, 0, 516, 0, 513, + 615, 518, 0, 0, 0, 0, 21, 121, 93, 7, + 8, 92, 10, 11, 0, 83, 0, 509, 12, 0, + 514, 83, 0, 0, 83, 191, 366, 42, 0, 83, + 515, 593, 593, 15, 0, 1051, 0, 16, 0, 0, + 516, 17, 0, 517, 518, 0, 0, 19, 0, 1067, + 0, 0, 0, 0, 0, 42, 0, 21, 42, 22, + 0, 0, 0, 42, 7, 8, 152, 10, 153, 0, + 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, + 0, 25, 0, 0, 0, 0, 0, 593, 15, 26, + 0, 0, 16, 0, 27, 0, 17, 0, 0, 1089, + 0, 0, 19, 42, 42, 42, 42, 0, 0, 0, + 0, 42, 21, 0, 22, 0, 0, 42, 0, 42, + 0, 111, 111, 111, 0, 0, 24, 7, 8, 42, + 0, 11, 0, 1127, 0, 42, 25, 0, 42, 0, + 0, 0, 0, 83, 26, 0, 0, 1130, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, + 42, 593, 0, 64, 0, 19, 593, 0, 1148, 0, + 0, 8, 152, 10, 153, 21, 0, 22, 1156, 12, + 0, 0, 0, 64, 64, 0, 116, 0, 0, 140, + 0, 0, 64, 0, 15, 0, 0, 0, 16, 141, + 0, 0, 17, 64, 0, 64, 0, 26, 0, 83, + 0, 0, 142, 0, 0, 0, 0, 0, 21, 83, + 93, 83, 83, 7, 8, 92, 10, 11, 0, 360, + 622, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 593, 593, 0, 0, 0, 0, 15, 0, 1196, + 1197, 16, 0, 509, 64, 17, 0, 0, 0, 0, + 64, 19, 0, 178, 64, 795, 0, 116, 116, 116, + 593, 21, 0, 22, 0, 0, 0, 0, 0, 64, + 0, 64, 64, 0, 0, 24, 8, 92, 10, 11, + 0, 1228, 1345, 0, 12, 25, 42, 0, 0, 64, + 64, 116, 0, 26, 0, 0, 0, 0, 27, 15, + 0, 0, 117, 16, 0, 593, 0, 17, 0, 0, + 0, 0, 593, 593, 0, 64, 360, 0, 0, 151, + 0, 593, 0, 21, 0, 93, -306, 8, -306, 10, + 185, 0, 0, 64, 0, 12, 0, 0, 42, 42, + 111, 0, 0, 64, 0, 0, 853, 0, 0, 0, + 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, + 0, 0, 42, 42, -306, 42, 0, 513, 0, 0, + 151, 0, 0, 0, 21, 0, 93, 0, 0, 83, + 593, 593, 360, 117, 117, 117, 0, 0, 514, 83, + 83, 83, 0, 0, 111, 0, 0, 151, 515, 0, + 0, 0, 0, 0, 0, 0, -306, 0, 516, 0, + 0, 517, 518, 0, 0, 151, 151, 384, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 795, 0, + 1024, 100, 0, 0, 534, 64, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 0, 0, 593, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 8, 159, 160, + 161, 0, 0, 64, 0, 12, 64, 0, 19, 0, + 83, 64, 83, 0, 0, 0, 0, 0, 21, 0, + 22, 0, 0, 83, 0, 0, 0, 1026, 17, 0, + 589, 0, 24, 0, 19, 0, 0, 513, 0, 0, + 0, 0, 25, 0, 21, 0, 22, 437, 0, 0, + 26, 64, 64, 64, 64, 27, 0, 0, 607, 64, + 0, 795, 795, 795, 0, 64, 0, 64, 608, 116, + 116, 116, 0, 0, 0, 0, 26, 64, 516, 0, + 0, 609, 518, 64, 0, 0, 64, 0, 0, 0, + 0, 0, 0, 521, 521, 521, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 64, 64, 0, 64, 0, + 0, 0, 42, 42, 111, 111, 111, 83, 191, 0, + 42, 853, 853, 853, 0, 0, 659, 8, 152, 10, + 153, 0, 0, 0, 0, 12, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 42, 0, + 15, 42, 0, 42, 16, 0, 0, 0, 17, 0, + 0, 0, 83, 83, 19, 83, 795, 795, 795, 0, + 0, 0, 0, 0, 21, 0, 22, 611, 0, 611, + 611, 521, 0, 662, 0, 0, 0, 0, 24, 0, + 0, 151, 0, 151, 0, 384, 384, 384, 25, 8, + 92, 10, 11, 151, 0, 356, 26, 12, 0, 151, + 0, 27, 151, 797, 0, 0, 0, 0, 0, 0, + 191, 0, 15, 0, 0, 0, 16, 0, 0, 42, + 17, 151, 0, 0, 377, 379, 383, 0, 0, 513, + 0, 0, 0, 0, 64, 0, 21, 0, 93, 0, + 0, 0, 0, 7, 100, 0, 0, 427, 0, 0, + 514, 42, 42, 42, 7, 8, 0, 0, 185, 0, + 515, 0, 0, 0, 0, 42, 42, 149, 42, 0, + 516, 0, 0, 517, 518, 0, 0, 0, 357, 0, + 0, 19, 0, 0, 0, 0, 64, 64, 116, 192, + 0, 21, 19, 22, 855, 0, 42, 0, 0, 0, + 0, 0, 21, 0, 22, 24, 0, 761, 192, 0, + 64, 64, 0, 64, 0, 25, 140, 0, 149, 521, + 521, 0, 521, 26, 0, 0, 141, 0, 27, 521, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 142, + 0, 0, 116, 0, 0, 149, 0, 0, 0, 0, + 0, 0, 0, 7, 8, 0, 10, 440, 234, 235, + 611, 236, 12, 149, 149, 149, 0, 0, 0, 853, + 0, 0, 0, 393, 0, 0, 797, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 149, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 611, 611, 848, 0, 0, 0, 0, 192, + 848, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 256, 257, 258, 7, 8, 151, 151, 259, 151, + 0, 0, 260, 0, 853, 853, 853, 0, 0, 0, + 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, + 629, 0, 630, 0, 377, 379, 383, 0, 384, 797, + 797, 797, 19, 0, 0, 0, 0, 534, 643, 0, + 0, 0, 21, 0, 22, 0, 0, 521, 42, 0, + 0, 0, 0, 0, 0, 0, 140, 437, 437, 437, + 669, 0, 589, 0, 0, 0, 141, 192, 0, 149, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 142, + 64, 64, 116, 116, 116, 0, 0, 0, 64, 855, + 855, 855, 0, 0, 0, 0, 0, 8, 0, 10, + 185, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, + 15, 64, 0, 0, 16, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 797, 797, 797, 513, 521, 0, + 521, 0, 0, 0, 21, 149, 93, 149, 149, 0, + 0, 521, 0, 0, 0, 521, 521, 521, 514, 149, + 0, 149, 0, 149, 149, 149, 0, 0, 515, 0, + 0, 149, 0, 0, 519, 519, 519, 149, 516, 0, + 149, 517, 518, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 64, 0, 149, + 0, 0, 0, 0, 0, 62, 611, 611, 848, 848, + 848, 0, 0, 0, 611, 848, 848, 848, 0, 0, + 0, 0, 0, 0, 0, 102, 106, 0, 0, 64, + 64, 64, 7, 8, 126, 0, 11, 0, 0, 0, + 0, 0, 151, 64, 64, 0, 64, 158, 0, 0, + 0, 377, 379, 383, 0, 0, 0, 0, 519, 383, + 519, 519, 519, 7, 8, 0, 0, 427, 0, 0, + 19, 0, 0, 0, 64, 629, 630, 0, 643, 0, + 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 761, 761, 0, 761, 380, 0, 0, 0, 0, 0, + 0, 19, 307, 0, 381, 0, 309, 383, 0, 0, + 192, 21, 26, 22, 0, 0, 0, 382, 0, 0, + 0, 62, 0, 0, 332, 140, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 141, 0, 0, 149, 0, + 0, 102, 106, 26, 0, 0, 0, 855, 142, 0, + 0, 0, 0, 0, 0, 151, 0, 151, 0, 7, + 8, 522, 526, 528, 0, 0, 0, 0, 0, 611, + 611, 0, 611, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 152, 10, 153, 422, 0, 0, 0, 12, + 149, 149, 846, 0, 0, 428, 0, 19, 846, 0, + 0, 0, 0, 0, 15, 0, 0, 21, 16, 22, + 519, 519, 17, 519, 149, 149, 0, 149, 19, 0, + 794, 380, 855, 855, 855, 0, 0, 0, 21, 0, + 22, 381, 0, 1105, 0, 0, 0, 0, 0, 26, + 0, 0, 24, 0, 382, 612, 846, 522, 526, 528, + 0, 519, 25, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 27, 64, 0, 0, 0, + 0, 0, 0, 384, 0, 0, 0, 1170, 0, 0, + 0, 0, 0, 0, 0, 629, 630, 377, 379, 383, + 0, 0, 0, 643, 377, 379, 383, 0, 0, 0, + 0, 0, 0, 519, 519, 519, 0, 0, 0, 0, + 0, 794, 0, 0, 0, 562, 0, 0, 563, 0, + 0, 1030, 0, 565, 469, 470, 471, 1171, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 769, 771, 0, 0, 64, 7, 8, - 771, 10, 436, 233, 234, 0, 235, 12, 0, 0, - 556, 0, 0, 557, 0, 0, 0, 558, 0, 0, - 0, 0, 15, 236, 237, 238, 16, 0, 239, 0, - 17, 0, 240, 241, 0, 242, 19, 243, 244, 0, - 0, 245, 246, 247, 248, 249, 21, 380, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, - 0, 0, 0, 0, 0, 616, 0, 522, 0, 0, - 83, 305, 0, 307, 0, 0, 255, 256, 257, 0, - 0, 0, 0, 258, 0, 0, 0, 259, 424, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, + 484, 485, 486, 487, 488, 489, 490, 0, 384, 384, + 384, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 613, 0, 0, 0, 0, 0, + 0, 623, 0, 0, 0, 0, 0, 307, 519, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 663, 666, 0, 418, 83, 83, 0, 83, 0, 0, - 0, 0, 380, 380, 380, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 148, 148, 148, 0, 996, 0, - 148, 837, 837, 837, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 927, 0, - 928, 0, 0, 0, 0, 0, 150, 0, 0, 148, - 0, 932, 0, 0, 0, 0, 769, 771, 0, 0, - 0, 7, 8, 92, 10, 11, 0, 0, 353, 0, - 12, 0, 7, 8, 151, 10, 152, 0, 0, 0, - 0, 12, 0, 0, 0, 15, 0, 0, 0, 16, - 0, 0, 0, 17, 0, 0, 15, 0, 0, 19, - 16, 0, 0, 0, 17, 927, 928, 0, 769, 21, - 19, 22, 932, 0, 769, 771, 0, 0, 0, 0, - 21, 191, 22, 377, 0, 153, 0, 0, 0, 0, - 0, 0, 0, 378, 24, 0, 0, 0, 0, 0, - 0, 26, 0, 0, 25, 0, 141, 0, 0, 0, - 0, 354, 26, 0, 0, 0, 0, 27, 0, 0, - 148, 0, 148, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 148, 0, 148, 102, 106, - 467, 0, 468, 469, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 0, 556, 557, 0, 558, 0, 0, 0, 1101, - 769, 962, 8, 92, 10, 232, 233, 234, 0, 235, - 12, 963, 0, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 13, 14, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 974, 346, 0, 975, 0, 927, 928, 0, 932, - 250, 0, 0, 251, 0, 0, 0, 0, 837, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 976, 454, - 259, 7, 8, 92, 10, 232, 233, 234, 353, 235, - 12, 1102, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 509, 0, 245, 246, 247, 248, 249, 21, - 0, 22, -234, 837, 837, 837, 0, 0, 0, 0, - 250, 0, 0, 937, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 938, 1160, 0, 0, 0, 0, 255, - 256, 257, 0, 512, 0, 0, 785, 514, 0, 0, - 259, 354, 0, 0, 0, 0, 0, 148, 0, 0, - 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 305, 307, 0, 0, 0, 0, 0, 424, 0, - 0, 465, 466, 467, 1161, 468, 469, 470, 471, 472, + 0, 0, 151, 0, 0, 428, 0, 774, 776, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 670, 673, 0, + 422, 0, 0, 0, 149, 149, 149, 149, 846, 0, + 1006, 0, 149, 846, 846, 846, 0, 0, 526, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 629, 630, + 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 0, 0, 0, 0, 0, 0, 0, 0, 519, + 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 519, 0, 0, 0, 794, 794, 794, 0, + 774, 776, 0, 0, 469, 470, 471, 0, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 192, 0, 0, 0, 0, 519, 519, 519, + 519, 519, 1045, 0, 0, 519, 794, 794, 794, 0, + 0, 0, 383, 0, 7, 8, 92, 10, 11, 0, + 0, 356, 0, 12, 0, 526, 0, 0, 0, 0, + 0, 0, 0, 149, 0, 149, 0, 0, 15, 0, + 0, 0, 16, 0, 0, 0, 17, 149, 149, 0, + 149, 0, 19, 0, 0, 513, 0, 0, 0, 0, + 0, 0, 21, 0, 22, 0, 0, 0, 102, 106, + 0, 0, 0, 0, 0, 0, 843, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 844, 377, 379, 383, + 0, 0, 562, 563, 26, 565, 516, 0, 0, 845, + 518, 0, 0, 0, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 936, 0, 937, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 941, + 0, 0, 0, 774, 776, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 846, 0, 0, 0, 0, 0, 0, 0, 0, + 519, 519, 0, 519, 0, 0, 0, 0, 0, 0, + 686, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 936, 937, 774, 776, 0, 0, + 0, 0, 941, 774, 776, 469, 470, 471, 0, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 0, 0, 0, 1022, 0, 0, - 1022, 1251, 418, 962, 8, 92, 10, 232, 233, 234, - 0, 235, 12, 963, 0, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 13, 14, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 974, 346, 0, 975, 0, 0, 0, - 0, 0, 250, 0, 0, 251, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 254, 0, 418, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 258, 0, - 976, 0, 259, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1252, 260, 0, 0, 0, 0, 1097, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 556, 557, 0, 558, 0, 0, 0, 0, + 483, 484, 485, 486, 487, 488, 489, 490, 0, 0, + 0, 0, 0, 0, 0, 0, 846, 846, 846, 0, + 0, 0, 1111, 0, 971, 972, 92, 10, 233, 234, + 235, 0, 236, 12, 973, 0, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 983, 13, 14, 15, 237, + 238, 239, 16, 0, 240, 0, 17, 0, 241, 242, + 149, 243, 19, 244, 245, 0, 0, 246, 247, 248, + 249, 250, 21, 0, 984, 349, 0, 985, 0, 0, + 0, 0, 0, 251, 0, 0, 252, 0, 0, 0, + 0, 0, 307, 309, 253, 254, 255, 0, 0, 0, + 428, 0, 256, 257, 258, 0, 0, 0, 0, 259, + 0, 986, 0, 260, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1112, 261, 0, 0, 1031, 0, + 0, 1031, 0, 422, 0, 0, 0, 936, 937, 0, + 941, 1261, 0, 971, 972, 92, 10, 233, 234, 235, + 0, 236, 12, 973, 0, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 13, 14, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 984, 349, 0, 985, 0, 0, 0, + 0, 0, 251, 0, 0, 252, 0, 0, 0, 422, + 0, 0, 0, 253, 254, 255, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 0, 0, 0, 259, 0, + 986, 0, 260, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1107, 1262, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 562, 563, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1273, 0, 962, 8, 92, 10, 232, 233, 234, - 0, 235, 12, 963, 418, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 13, 14, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 974, 346, 0, 975, 0, 0, 0, - 0, 0, 250, 0, 0, 251, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 254, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 258, 0, - 976, 0, 259, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1274, 260, 1273, 0, 962, 8, 92, - 10, 232, 233, 234, 0, 235, 12, 963, 0, 964, - 965, 966, 967, 968, 969, 970, 971, 972, 973, 13, - 14, 15, 236, 237, 238, 16, 0, 239, 0, 17, - 0, 240, 241, 0, 242, 19, 243, 244, 0, 0, - 245, 246, 247, 248, 249, 21, 0, 974, 346, 0, - 975, 0, 0, 0, 0, 0, 250, 0, 0, 251, - 0, 0, 0, 0, 0, 0, 0, 252, 253, 254, - 0, 0, 0, 0, 0, 255, 256, 257, 0, 0, - 0, 0, 258, 0, 976, 0, 259, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1279, 260, 1273, - 0, 962, 8, 92, 10, 232, 233, 234, 0, 235, - 12, 963, 0, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 13, 14, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 974, 346, 0, 975, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 976, 0, - 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1318, 260, 961, 0, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 0, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 346, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 1245, 259, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 260, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 346, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 1306, 259, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 260, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 346, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 454, 259, 7, 8, 92, 10, 232, - 233, 234, 353, 235, 12, 0, 260, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 509, 0, 245, 246, - 247, 248, 249, 21, 0, 22, -234, 0, 0, 0, - 0, 0, 0, 0, 250, 0, 0, 841, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 842, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 512, 0, 0, - 843, 514, 0, 0, 259, 354, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 352, 260, 7, 8, 92, - 10, 232, 233, 234, 353, 235, 12, 0, 0, 0, + 0, 0, 0, 1283, 0, 971, 972, 92, 10, 233, + 234, 235, 0, 236, 12, 973, 422, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 13, 14, 15, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 984, 349, 0, 985, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 0, 986, 0, 260, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1284, 261, 1283, 0, 971, + 972, 92, 10, 233, 234, 235, 0, 236, 12, 973, + 0, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 983, 13, 14, 15, 237, 238, 239, 16, 0, 240, + 0, 17, 0, 241, 242, 0, 243, 19, 244, 245, + 0, 0, 246, 247, 248, 249, 250, 21, 0, 984, + 349, 0, 985, 0, 0, 0, 0, 0, 251, 0, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 253, + 254, 255, 0, 0, 0, 0, 0, 256, 257, 258, + 0, 0, 0, 0, 259, 0, 986, 0, 260, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1289, + 261, 1283, 0, 971, 972, 92, 10, 233, 234, 235, + 0, 236, 12, 973, 0, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 13, 14, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 984, 349, 0, 985, 0, 0, 0, + 0, 0, 251, 0, 0, 252, 0, 0, 0, 0, + 0, 0, 0, 253, 254, 255, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 0, 0, 0, 259, 0, + 986, 0, 260, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1328, 261, 970, 0, 971, 972, 92, + 10, 233, 234, 235, 0, 236, 12, 973, 0, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 13, + 14, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 984, 349, 0, + 985, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 0, 0, 259, 0, 986, 1255, 260, 971, 972, 92, + 10, 233, 234, 235, 0, 236, 12, 973, 261, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 13, + 14, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 984, 349, 0, + 985, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 0, 0, 259, 0, 986, 1316, 260, 971, 972, 92, + 10, 233, 234, 235, 0, 236, 12, 973, 261, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 13, + 14, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 984, 349, 0, + 985, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 0, 0, 259, 0, 986, 458, 260, 7, 8, 92, + 10, 233, 234, 235, 356, 236, 12, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 236, 237, 238, 16, 0, 239, 0, 17, - 0, 240, 241, 0, 242, 19, 243, 244, 0, 0, - 245, 246, 247, 248, 249, 21, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 0, 0, 251, - 0, 0, 0, 0, 0, 0, 0, 252, 253, 254, - 0, 0, 0, 0, 0, 255, 256, 257, 0, 0, - 0, 0, 258, 0, 0, 0, 259, 354, 0, 0, - 0, 0, 0, 0, 0, 0, -662, 631, 260, 7, - 8, 92, 10, 232, 233, 234, 353, 235, 12, 0, + 0, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 513, 0, + 246, 247, 248, 249, 250, 21, 0, 22, -239, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 790, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 791, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 516, + 0, 0, 792, 518, 0, 0, 260, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 458, 261, 7, + 8, 92, 10, 233, 234, 235, 356, 236, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 236, 237, 238, 16, 0, 239, - 0, 17, 0, 240, 241, 0, 242, 19, 243, 244, - 0, 0, 245, 246, 247, 248, 249, 21, 0, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, - 0, 251, 0, 0, 0, 0, 0, 0, 0, 252, - 253, 254, 0, 0, 0, 0, 0, 255, 256, 257, - 0, 0, 0, 0, 258, 0, 0, 0, 259, 354, - 0, 0, 0, 0, 0, 0, 0, 0, -662, 584, - 260, 708, 709, 0, 10, 436, 233, 234, 0, 235, + 0, 0, 0, 15, 237, 238, 239, 16, 0, 240, + 0, 17, 0, 241, 242, 0, 243, 19, 244, 245, + 513, 0, 246, 247, 248, 249, 250, 21, 0, 22, + -239, 0, 0, 0, 0, 0, 0, 0, 251, 0, + 0, 850, 0, 0, 0, 0, 0, 0, 0, 253, + 254, 851, 0, 0, 0, 0, 0, 256, 257, 258, + 0, 516, 0, 0, 852, 518, 0, 0, 260, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, + 261, 7, 8, 92, 10, 233, 234, 235, 356, 236, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 710, 585, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 711, 0, 584, - 259, 708, 709, 0, 10, 436, 233, 234, 0, 235, - 12, 822, 260, 0, 0, 0, 0, 1038, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 710, 585, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 584, - 259, 708, 709, 0, 10, 436, 233, 234, 0, 235, - 12, -381, 260, 0, 0, 0, 0, 1038, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 710, 585, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 1154, - 259, 7, 8, 92, 10, 232, 233, 234, 0, 235, - 12, 1068, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, 1155, 0, 1156, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 454, - 259, 7, 8, 0, 10, 232, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, -234, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 584, - 259, 7, 8, 0, 10, 436, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, 585, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 718, - 259, 7, 8, 0, 10, 436, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, 0, 0, 0, 0, 0, 0, -652, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 454, - 259, 7, 8, 0, 10, 232, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, -234, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 1173, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 1174, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 1175, 0, 0, 1225, - 259, 7, 8, 0, 10, 232, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, - 0, 22, 0, 0, -136, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 718, - 259, 7, 8, 0, 10, 436, 233, 234, 0, 235, - 12, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 0, 0, 245, 246, 247, 248, 249, 21, + 0, 0, 0, 0, 0, 15, 237, 238, 239, 16, + 0, 240, 0, 17, 0, 241, 242, 0, 243, 19, + 244, 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 251, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 254, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 0, 0, 0, 258, 0, 0, 0, - 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -652, 797, 260, 7, 8, 0, 10, 436, 233, 234, - 0, 235, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 0, 0, 251, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 254, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 258, 0, - 0, 799, 259, 7, 8, 0, 10, 436, 233, 234, - 0, 235, 12, 0, 260, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 0, 0, 251, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 254, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 258, 0, - 7, 8, 259, 10, 436, 233, 234, 0, 235, 12, - 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 236, 237, 238, 16, 0, - 239, 0, 17, 0, 240, 241, 0, 242, 19, 243, - 244, 0, 0, 245, 246, 247, 248, 249, 21, 0, - 22, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, - 252, 253, 254, 0, 0, 0, 0, 0, 255, 256, - 257, 0, 0, 0, 0, 258, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 260, 757, 962, 8, 92, 10, 232, 233, 234, - 0, 235, 12, 963, 0, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 13, 14, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 974, 346, 0, 975, 0, 0, 0, - 0, 0, 250, 0, 0, 251, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 254, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 258, 0, - 976, 0, 259, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1106, 260, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 0, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 346, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 0, 259, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 260, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 1266, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 0, 259, 962, 8, 92, 10, 232, - 233, 234, 0, 235, 12, 963, 260, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 13, 14, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 974, 0, 0, 975, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 976, 0, 259, 7, 8, 92, 10, 232, - 233, 234, 353, 235, 12, 0, 260, 0, 0, 0, + 251, 0, 0, 252, 0, 0, 0, 0, 0, 0, + 0, 253, 254, 255, 0, 0, 0, 0, 0, 256, + 257, 258, 0, 0, 0, 0, 259, 0, 0, 0, + 260, 357, 0, 0, 0, 0, 0, 0, 0, 0, + -667, 638, 261, 7, 8, 92, 10, 233, 234, 235, + 356, 236, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 252, 0, 0, 0, 0, + 0, 0, 0, 253, 254, 255, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 0, 0, 0, 259, 0, + 0, 0, 260, 357, 0, 0, 0, 0, 0, 0, + 0, 0, -667, 591, 261, 715, 716, 0, 10, 440, + 234, 235, 0, 236, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 717, 592, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 718, 0, 591, 260, 715, 716, 0, 10, 440, + 234, 235, 0, 236, 12, 830, 261, 0, 0, 0, + 0, 1047, 0, 0, 0, 0, 0, 0, 0, 15, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 717, 592, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 0, 0, 591, 260, 715, 716, 0, 10, 440, + 234, 235, 0, 236, 12, -386, 261, 0, 0, 0, + 0, 1047, 0, 0, 0, 0, 0, 0, 0, 15, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 717, 592, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 0, 0, 1164, 260, 7, 8, 92, 10, 233, + 234, 235, 0, 236, 12, 1077, 261, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 22, 1165, 0, 1166, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 0, 0, 591, 260, 715, 716, 0, 10, 440, + 234, 235, 0, 236, 12, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 509, 0, 245, 246, - 247, 248, 249, 21, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 0, 0, 783, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 784, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 512, 0, 0, - 785, 514, 0, 0, 259, 354, 7, 8, 92, 10, - 232, 233, 234, 353, 235, 12, 260, 0, 0, 0, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 717, 592, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 718, 197, 0, 260, 8, 0, 10, 11, 0, + 0, 0, 0, 12, 0, 0, 261, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 16, 0, 0, 0, 17, 0, 198, 199, + 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, + 0, 0, 21, 0, 93, 0, 201, 0, 202, 203, + 204, 0, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 0, 0, 223, 224, 225, 0, 458, 226, 7, 8, + 227, 10, 233, 234, 235, 0, 236, 12, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, -239, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 0, 591, 260, 7, 8, + 0, 10, 440, 234, 235, 0, 236, 12, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 236, 237, 238, 16, 0, 239, 0, 17, 0, - 240, 241, 0, 242, 19, 243, 244, 509, 0, 245, - 246, 247, 248, 249, 21, 0, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 0, 0, 841, 0, - 0, 0, 0, 0, 0, 0, 252, 253, 842, 0, - 0, 0, 0, 0, 255, 256, 257, 0, 512, 0, - 0, 843, 514, 0, 0, 259, 354, 7, 8, 0, - 10, 232, 233, 234, 0, 235, 12, 260, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, 592, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 0, 725, 260, 7, 8, + 0, 10, 440, 234, 235, 0, 236, 12, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 236, 237, 238, 16, 0, 239, 0, 17, - 0, 240, 241, 0, 242, 19, 243, 244, 509, 0, - 245, 246, 247, 248, 249, 21, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 0, 0, 783, - 0, 0, 0, 0, 0, 0, 0, 252, 253, 784, - 0, 0, 0, 0, 0, 255, 256, 257, 0, 512, - 0, 0, 785, 514, 7, 8, 0, 10, 232, 233, - 234, 0, 235, 12, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 236, - 237, 238, 16, 0, 239, 0, 17, 0, 240, 241, - 0, 242, 19, 243, 244, 509, 0, 245, 246, 247, - 248, 249, 21, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 250, 0, 0, 841, 0, 0, 0, - 0, 0, 0, 0, 252, 253, 842, 0, 0, 0, - 0, 0, 255, 256, 257, 0, 512, 0, 0, 843, - 514, 7, 8, 0, 10, 232, 233, 234, 0, 235, - 12, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 236, 237, 238, 16, - 0, 239, 0, 17, 0, 240, 241, 0, 242, 19, - 243, 244, 509, 0, 245, 246, 247, 248, 249, 21, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, + 0, 0, 0, 0, 0, -657, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 0, 458, 260, 7, 8, + 0, 10, 233, 234, 235, 0, 236, 12, 0, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, -239, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 895, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 896, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 897, 0, 0, 458, 260, 7, 8, + 0, 10, 233, 234, 235, 0, 236, 12, 0, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, -239, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 1183, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 1184, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 1185, 0, 0, 1235, 260, 7, 8, + 0, 10, 233, 234, 235, 0, 236, 12, 0, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, + 0, -139, 0, 0, 0, 0, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 0, 725, 260, 7, 8, + 0, 10, 440, 234, 235, 0, 236, 12, 0, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 0, 0, 260, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -657, 804, 261, + 7, 8, 0, 10, 440, 234, 235, 0, 236, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 237, 238, 239, 16, 0, + 240, 0, 17, 0, 241, 242, 0, 243, 19, 244, + 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 251, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 253, 254, 255, 0, 0, 0, 0, 0, 256, 257, + 258, 0, 0, 0, 0, 259, 0, 0, 806, 260, + 7, 8, 0, 10, 440, 234, 235, 0, 236, 12, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 237, 238, 239, 16, 0, + 240, 0, 17, 0, 241, 242, 0, 243, 19, 244, + 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 251, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 253, 254, 255, 0, 0, 0, 0, 0, 256, 257, + 258, 0, 0, 0, 0, 259, 0, 7, 8, 260, + 10, 440, 234, 235, 0, 236, 12, 0, 0, 0, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 0, 0, 259, 0, 0, 0, 260, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 261, 764, + 971, 972, 92, 10, 233, 234, 235, 0, 236, 12, + 973, 0, 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 13, 14, 15, 237, 238, 239, 16, 0, + 240, 0, 17, 0, 241, 242, 0, 243, 19, 244, + 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, + 984, 349, 0, 985, 0, 0, 0, 0, 0, 251, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 253, 254, 255, 0, 0, 0, 0, 0, 256, 257, + 258, 0, 0, 0, 0, 259, 0, 986, 0, 260, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1116, 261, 971, 972, 92, 10, 233, 234, 235, 0, + 236, 12, 973, 0, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 13, 14, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 0, 0, 246, 247, 248, 249, 250, + 21, 0, 984, 349, 0, 985, 0, 0, 0, 0, + 0, 251, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 0, 0, 0, 259, 0, 986, + 0, 260, 971, 972, 92, 10, 233, 234, 235, 0, + 236, 12, 973, 261, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 13, 14, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 0, 0, 246, 247, 248, 249, 250, + 21, 0, 984, 1276, 0, 985, 0, 0, 0, 0, + 0, 251, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 0, 0, 0, 259, 0, 986, + 0, 260, 971, 972, 92, 10, 233, 234, 235, 0, + 236, 12, 973, 261, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 13, 14, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 0, 0, 246, 247, 248, 249, 250, + 21, 0, 984, 0, 0, 985, 0, 0, 0, 0, + 0, 251, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 0, 0, 0, 259, 0, 986, + 0, 260, 7, 8, 92, 10, 233, 234, 235, 356, + 236, 12, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 513, 0, 246, 247, 248, 249, 250, + 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 251, 0, 0, 790, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 791, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 516, 0, 0, 792, 518, 0, + 0, 260, 357, 7, 8, 92, 10, 233, 234, 235, + 356, 236, 12, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 513, 0, 246, 247, 248, 249, + 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 850, 0, 0, 0, 0, + 0, 0, 0, 253, 254, 851, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 516, 0, 0, 852, 518, + 0, 0, 260, 357, 7, 8, 0, 10, 233, 234, + 235, 0, 236, 12, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 237, + 238, 239, 16, 0, 240, 0, 17, 0, 241, 242, + 0, 243, 19, 244, 245, 513, 0, 246, 247, 248, + 249, 250, 21, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 251, 0, 0, 790, 0, 0, 0, + 0, 0, 0, 0, 253, 254, 791, 0, 0, 0, + 0, 0, 256, 257, 258, 0, 516, 0, 0, 792, + 518, 7, 8, 0, 10, 233, 234, 235, 0, 236, + 12, 0, 0, 0, 0, 261, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 237, 238, 239, 16, + 0, 240, 0, 17, 0, 241, 242, 0, 243, 19, + 244, 245, 513, 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, - 250, 0, 0, 937, 0, 0, 0, 0, 0, 0, - 0, 252, 253, 938, 0, 0, 0, 0, 0, 255, - 256, 257, 0, 512, 0, 0, 785, 514, 7, 8, - 0, 10, 436, 233, 234, 0, 235, 12, 0, 0, - 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 236, 237, 238, 16, 0, 239, 0, - 17, 0, 240, 241, 0, 242, 19, 243, 244, 0, - 0, 245, 246, 247, 248, 249, 21, 0, 22, 0, - 0, 1083, 0, 0, 0, 0, 0, 250, 0, 0, - 251, 0, 0, 0, 0, 0, 0, 0, 252, 253, - 254, 0, 0, 0, 0, 0, 255, 256, 257, 0, - 0, 0, 0, 258, 0, 7, 8, 259, 10, 232, - 233, 234, 0, 235, 12, 0, 0, 0, 0, 260, + 251, 0, 0, 850, 0, 0, 0, 0, 0, 0, + 0, 253, 254, 851, 0, 0, 0, 0, 0, 256, + 257, 258, 0, 516, 0, 0, 852, 518, 7, 8, + 0, 10, 233, 234, 235, 0, 236, 12, 0, 0, + 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 237, 238, 239, 16, 0, 240, 0, + 17, 0, 241, 242, 0, 243, 19, 244, 245, 0, + 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, + 252, 0, 0, 0, 0, 305, 0, 0, 253, 254, + 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, + 0, 0, 0, 259, 0, 7, 8, 260, 10, 440, + 234, 235, 0, 236, 12, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 0, 7, 8, 259, 10, 436, 233, 234, 0, - 235, 12, 0, 0, 0, 0, 260, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 236, 237, 238, - 16, 0, 239, 0, 17, 0, 240, 241, 0, 242, - 19, 243, 244, 0, 0, 245, 246, 247, 248, 249, - 21, 0, 22, 462, 0, 0, 0, 0, 0, 0, - 0, 250, 0, 0, 251, 0, 0, 0, 0, 0, - 0, 0, 252, 253, 254, 0, 0, 0, 0, 0, - 255, 256, 257, 0, 0, 7, 8, 463, 10, 436, - 233, 234, 0, 235, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 0, 15, - 236, 237, 238, 16, 0, 239, 0, 17, 0, 240, - 241, 0, 242, 19, 243, 244, 0, 0, 245, 246, - 247, 248, 249, 21, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 255, 256, 257, 0, 0, 0, 0, - 258, 499, 7, 8, 0, 10, 436, 233, 234, 0, - 235, 12, 0, 0, 0, 0, 260, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 236, 237, 238, - 16, 0, 239, 0, 17, 0, 240, 241, 0, 242, - 19, 243, 244, 0, 0, 245, 246, 247, 248, 249, + 237, 238, 239, 16, 0, 240, 0, 17, 0, 241, + 242, 0, 243, 19, 244, 245, 0, 0, 246, 247, + 248, 249, 250, 21, 0, 22, 0, 0, 1093, 0, + 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 253, 254, 255, 0, 0, + 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, + 259, 0, 7, 8, 260, 10, 233, 234, 235, 0, + 236, 12, 0, 0, 0, 0, 261, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 0, 250, 0, 0, 251, 0, 0, 0, 0, 0, - 0, 0, 252, 253, 254, 0, 0, 0, 0, 0, - 255, 256, 257, 0, 0, 0, 0, 258, 0, 7, - 694, 259, 10, 436, 233, 234, 0, 235, 12, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 236, 237, 238, 16, 0, 239, - 0, 17, 0, 240, 241, 0, 242, 19, 243, 244, - 0, 0, 245, 246, 247, 248, 249, 21, 0, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, - 0, 251, 0, 0, 0, 0, 0, 0, 0, 252, - 253, 254, 0, 0, 0, 0, 0, 255, 256, 257, - 0, 0, 0, 0, 258, 0, 7, 8, 259, 10, - 436, 233, 234, 0, 235, 12, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 236, 237, 238, 16, 0, 239, 0, 17, 0, - 240, 241, 0, 242, 19, 243, 244, 0, 0, 245, - 246, 247, 248, 249, 21, 0, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 0, 0, 887, 0, - 0, 0, 0, 0, 0, 0, 252, 253, 888, 0, - 0, 0, 0, 0, 255, 256, 257, 0, 0, 0, - 0, 258, 0, 7, 8, 259, 10, 436, 233, 234, - 0, 235, 12, 0, 0, 0, 0, 260, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 0, 0, 1173, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 1174, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 0, 0, 1175, 0, - 1238, 8, 259, 10, 436, 233, 234, 0, 235, 12, - 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 236, 237, 238, 16, 0, - 239, 0, 17, 0, 240, 241, 0, 242, 19, 243, - 244, 0, 0, 245, 246, 247, 248, 249, 21, 0, - 22, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, - 252, 253, 254, 0, 0, 0, 0, 0, 255, 256, - 257, 0, 0, 0, 0, 258, 0, 7, 8, 259, - 10, 436, 233, 234, 0, 235, 12, 0, 0, 0, - 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 236, 237, 238, 16, 0, 239, 0, 17, - 0, 240, 241, 0, 242, 19, 243, 244, 0, 0, - 245, 246, 247, 248, 249, 21, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 0, 0, 251, - 0, 0, 0, 0, 0, 0, 0, 252, 253, 254, - 0, 0, 0, 0, 0, 255, 256, 257, 0, 0, - 7, 8, 258, 10, 436, 233, 234, 0, 235, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 0, 15, 236, 237, 238, 16, 0, - 239, 0, 17, 0, 240, 241, 0, 242, 19, 243, - 244, 0, 0, 245, 246, 247, 248, 249, 21, 0, - 22, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 0, 0, 887, 0, 0, 0, 0, 0, 0, 0, - 252, 253, 888, 0, 0, 0, 0, 0, 255, 256, - 257, 0, 0, 7, 8, 258, 10, 232, 233, 234, - 0, 235, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 260, 0, 0, 0, 0, 0, 15, 236, 237, - 238, 16, 0, 239, 0, 17, 0, 240, 241, 0, - 242, 19, 243, 244, 0, 0, 245, 246, 247, 248, - 249, 21, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 0, 0, 1173, 0, 0, 0, 0, - 0, 0, 0, 252, 253, 1174, 0, 0, 0, 0, - 0, 255, 256, 257, 0, 0, 7, 8, 1175, 10, - 436, 233, 234, 0, 235, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, - 15, 236, 0, 0, 16, 0, 239, 0, 17, 0, - 240, 241, 0, 242, 19, 243, 244, 0, 0, 245, - 246, 247, 248, 249, 21, 0, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 0, 0, 251, 0, - 0, 0, 0, 0, 0, 0, 252, 253, 254, 0, - 0, 0, 0, 0, 255, 256, 257, 0, 0, 0, - 0, 440, 7, 8, 92, 10, 11, 0, 0, 615, - 0, 12, 0, 0, 0, 0, 0, 260, 0, 652, - 8, 151, 10, 152, 0, 0, 15, 0, 12, 0, - 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 19, 0, 0, 15, 0, 0, 0, 16, 0, 0, - 21, 17, 22, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 21, 0, 22, - 0, 0, 0, 0, 25, 0, 655, 0, 0, 0, - 0, 24, 26, 0, 0, 0, 0, 27, 0, 0, - 0, 25, 7, 8, 151, 10, 152, 0, 0, 26, - 0, 12, 0, 0, 27, 0, 0, 0, 0, 7, - 8, 151, 10, 152, 0, 0, 15, 0, 12, 0, - 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 19, 0, 0, 15, 0, 0, 0, 16, 0, 0, - 21, 17, 22, 0, 0, 1095, 0, 19, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 21, 0, 22, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, - 0, 24, 26, 0, 0, 0, 0, 27, 0, 0, - 0, 25, 0, 0, 0, 0, 0, 0, 0, 26, - 679, 465, 466, 467, 27, 468, 469, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 0, 465, 466, 467, 0, 468, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 542, 1036, - 465, 466, 467, 0, 468, 469, 470, 471, 472, 473, + 0, 251, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 0, 0, 0, 259, 0, 7, + 8, 260, 10, 440, 234, 235, 0, 236, 12, 0, + 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 237, 238, 239, 16, 0, 240, + 0, 17, 0, 241, 242, 0, 243, 19, 244, 245, + 0, 0, 246, 247, 248, 249, 250, 21, 0, 22, + 466, 0, 0, 0, 0, 0, 0, 0, 251, 0, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 253, + 254, 255, 0, 0, 0, 0, 0, 256, 257, 258, + 0, 0, 7, 8, 467, 10, 440, 234, 235, 0, + 236, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 0, 0, 0, 0, 0, 15, 237, 238, 239, + 16, 0, 240, 0, 17, 0, 241, 242, 0, 243, + 19, 244, 245, 0, 0, 246, 247, 248, 249, 250, + 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 251, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 0, 0, 0, 0, 0, + 256, 257, 258, 0, 0, 0, 0, 259, 503, 7, + 8, 0, 10, 440, 234, 235, 0, 236, 12, 0, + 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 237, 238, 239, 16, 0, 240, + 0, 17, 0, 241, 242, 0, 243, 19, 244, 245, + 0, 0, 246, 247, 248, 249, 250, 21, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 253, + 254, 255, 0, 0, 0, 0, 0, 256, 257, 258, + 0, 0, 0, 0, 259, 0, 7, 701, 260, 10, + 440, 234, 235, 0, 236, 12, 0, 0, 0, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 237, 238, 239, 16, 0, 240, 0, 17, 0, + 241, 242, 0, 243, 19, 244, 245, 0, 0, 246, + 247, 248, 249, 250, 21, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 251, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 253, 254, 255, 0, + 0, 0, 0, 0, 256, 257, 258, 0, 0, 0, + 0, 259, 0, 7, 8, 260, 10, 440, 234, 235, + 0, 236, 12, 0, 0, 0, 0, 261, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 237, 238, + 239, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 895, 0, 0, 0, 0, + 0, 0, 0, 253, 254, 896, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 0, 0, 0, 897, 0, + 7, 8, 260, 10, 440, 234, 235, 0, 236, 12, + 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 237, 238, 239, 16, 0, + 240, 0, 17, 0, 241, 242, 0, 243, 19, 244, + 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 251, + 0, 0, 1183, 0, 0, 0, 0, 0, 0, 0, + 253, 254, 1184, 0, 0, 0, 0, 0, 256, 257, + 258, 0, 0, 0, 0, 1185, 0, 1248, 8, 260, + 10, 440, 234, 235, 0, 236, 12, 0, 0, 0, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 0, 0, 259, 0, 7, 8, 260, 10, 440, 234, + 235, 0, 236, 12, 0, 0, 0, 0, 261, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 237, + 238, 239, 16, 0, 240, 0, 17, 0, 241, 242, + 0, 243, 19, 244, 245, 0, 0, 246, 247, 248, + 249, 250, 21, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 251, 0, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 253, 254, 255, 0, 0, 0, + 0, 0, 256, 257, 258, 0, 0, 7, 8, 259, + 10, 440, 234, 235, 0, 236, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, + 0, 15, 237, 238, 239, 16, 0, 240, 0, 17, + 0, 241, 242, 0, 243, 19, 244, 245, 0, 0, + 246, 247, 248, 249, 250, 21, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 895, + 0, 0, 0, 0, 0, 0, 0, 253, 254, 896, + 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, + 7, 8, 897, 10, 233, 234, 235, 0, 236, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, + 0, 0, 0, 0, 15, 237, 238, 239, 16, 0, + 240, 0, 17, 0, 241, 242, 0, 243, 19, 244, + 245, 0, 0, 246, 247, 248, 249, 250, 21, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 251, + 0, 0, 1183, 0, 0, 0, 0, 0, 0, 0, + 253, 254, 1184, 0, 0, 0, 0, 0, 256, 257, + 258, 0, 0, 7, 8, 1185, 10, 440, 234, 235, + 0, 236, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 261, 0, 0, 0, 0, 0, 15, 237, 0, + 0, 16, 0, 240, 0, 17, 0, 241, 242, 0, + 243, 19, 244, 245, 0, 0, 246, 247, 248, 249, + 250, 21, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 252, 0, 0, 0, 0, + 0, 0, 0, 253, 254, 255, 0, 0, 0, 0, + 0, 256, 257, 258, 0, 0, 7, 8, 441, 10, + 440, 234, 235, 0, 236, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, + 15, 237, 0, 0, 16, 0, 240, 0, 17, 0, + 241, 242, 0, 243, 19, 244, 245, 0, 0, 246, + 247, 248, 249, 250, 21, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 251, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 253, 254, 255, 0, + 0, 0, 0, 0, 256, 257, 258, 0, 0, 0, + 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 546, 0, 469, 470, 471, 261, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 465, 466, 467, 1200, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 465, 466, 467, 1249, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 465, - 466, 467, 0, 468, 469, 470, 471, 472, 473, 474, + 484, 485, 486, 487, 488, 489, 490, 469, 470, 471, + 1210, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 469, 470, 471, 1259, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 469, 470, 471, 0, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 465, 466, 467, 0, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 0, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 469, 470, 471, 472, 473, + 485, 486, 487, 488, 489, 490, 469, 470, 471, 0, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 0, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 471, + 0, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486 + 484, 485, 486, 487, 488, 489, 490 }; static const short yycheck[] = { 4, - 4, 130, 131, 136, 278, 415, 70, 12, 117, 299, - 346, 12, 299, 265, 136, 20, 20, 108, 109, 24, - 25, 4, 27, 87, 4, 52, 338, 188, 33, 33, - 388, 12, 647, 154, 98, 284, 284, 299, 131, 44, - 20, 46, 746, 387, 1043, 129, 71, 52, 1151, 134, - 9, 52, 983, 33, 59, 812, 20, 1179, 983, 990, - 44, 9, 161, 162, 181, 70, 71, 60, 9, 34, - 0, 52, 77, 77, 7, 1212, 48, 367, 55, 10, - 367, 34, 87, 10, 1159, 1222, 56, 0, 362, 56, - 95, 96, 54, 98, 406, 55, 101, 77, 60, 104, - 105, 62, 4, 108, 109, 7, 107, 36, 45, 102, - 70, 95, 60, 77, 119, 119, 121, 122, 36, 1, - 1242, 54, 92, 44, 55, 92, 103, 60, 55, 60, - 1205, 58, 136, 60, 139, 140, 141, 121, 103, 119, - 1243, 1140, 44, 102, 3, 4, 5, 6, 7, 51, - 103, 53, 10, 1275, 102, 1292, 514, 76, 4, 92, - 165, 102, 93, 65, 125, 439, 93, 88, 89, 88, - 89, 102, 54, 75, 103, 336, 35, 299, 183, 183, - 99, 142, 154, 85, 301, 103, 88, 89, 193, 161, - 162, 51, 51, 950, 53, 54, 157, 55, 4, 154, - 44, 286, 60, 183, 56, 188, 910, 53, 60, 69, - 37, 3, 4, 185, 343, 344, 345, 136, 4, 66, - 284, 1324, 1325, 23, 51, 230, 231, 88, 4, 75, - 185, 1162, 4, 88, 44, 93, 397, 3, 85, 98, - 99, 100, 102, 56, 88, 367, 271, 53, 4, 250, - 343, 344, 44, 136, 387, 4, 103, 229, 342, 51, - 60, 53, 6, 7, 55, 387, 271, 53, 12, 75, - 275, 392, 277, 278, 279, 51, 4, 53, 88, 7, - 285, 53, 531, 88, 89, 44, 377, 378, 1219, 65, - 103, 35, 391, 392, 299, 299, 88, 53, 60, 75, - 44, 285, 149, 75, 53, 69, 278, 312, 44, 88, - 315, 102, 656, 89, 319, 1246, 51, 56, 323, 323, - 419, 1246, 1253, 51, 56, 53, 75, 456, 1253, 88, - 89, 3, 4, 948, 69, 647, 55, 65, 54, 258, - 102, 56, 1046, 323, 88, 4, 1277, 75, 195, 3, - 4, 70, 88, 336, 359, 360, 361, 362, 363, 323, - 44, 89, 367, 367, 103, 51, 102, 328, 373, 54, - 375, 103, 377, 378, 55, 359, 1307, 361, 362, 384, - 299, 53, 1307, 387, 55, 390, 103, 41, 393, 70, - 362, 513, 51, 54, 53, 3, 4, 102, 520, 53, - 383, 406, 563, 75, 88, 89, 65, 412, 413, 56, - 415, 415, 3, 4, 397, 420, 75, 56, 102, 391, - 392, 75, 3, 4, 782, 44, 102, 4, 412, 83, - 7, 102, 102, 41, 55, 415, 283, 781, 4, 58, - 401, 446, 447, 448, 449, 53, 102, 419, 367, 102, - 41, 27, 9, 258, 56, 44, 103, 418, 341, 306, - 589, 462, 53, 103, 103, 31, 92, 27, 387, 88, - 4, 496, 53, 7, 51, 83, 53, 3, 56, 640, - 602, 102, 55, 97, 75, 51, 608, 53, 65, 56, - 55, 496, 83, 498, 105, 97, 589, 70, 75, 88, - 89, 420, 60, 815, 387, 510, 511, 89, 513, 513, - 44, 801, 673, 102, 801, 520, 520, 51, 437, 53, - 44, 440, 60, 656, 551, 103, 445, 446, 447, 448, - 449, 65, 108, 109, 656, 787, 103, 102, 637, 801, - 459, 75, 791, 791, 463, 550, 551, 859, 108, 109, - 551, 85, 435, 56, 88, 89, 88, 3, 4, 25, - 26, 980, 920, 982, 88, 141, 550, 372, 60, 678, - 551, 3, 4, 5, 6, 7, 495, 69, 550, 44, - 563, 141, 44, 60, 585, 432, 44, 89, 54, 105, - 384, 88, 69, 58, 60, 600, 601, 602, 602, 393, - 103, 44, 44, 608, 608, 51, 44, 53, 54, 492, - 44, 494, 495, 25, 26, 58, 1026, 78, 79, 624, - 625, 53, 627, 88, 89, 44, 88, 89, 44, 88, - 88, 967, 437, 3, 4, 440, 948, 442, 443, 574, - 445, 915, 647, 526, 27, 88, 88, 54, 781, 54, - 88, 656, 656, 60, 88, 60, 69, 640, 463, 781, - 88, 508, 467, 785, 88, 637, 685, 686, 687, 88, - 675, 41, 88, 55, 56, 1, 523, 55, 56, 801, - 685, 686, 687, 53, 69, 92, 9, 92, 493, 51, - 673, 55, 56, 628, 499, 578, 657, 23, 60, 25, - 26, 662, 663, 675, 639, 666, 32, 69, 982, 870, - 871, 69, 873, 83, 69, 3, 4, 54, 6, 56, - 55, 843, 4, 60, 103, 7, 109, 791, 54, 55, - 56, 102, 58, 340, 60, 6, 7, 656, 1074, 1075, - 745, 12, 55, 56, 835, 836, 916, 917, 102, 919, - 841, 842, 1088, 41, 23, 25, 26, 102, 141, 55, - 56, 766, 44, 768, 35, 53, 92, 4, 5, 51, - 775, 53, 1108, 1109, 779, 102, 781, 781, 783, 784, - 785, 785, 3, 65, 54, 54, 791, 56, 103, 58, - 60, 60, 4, 75, 31, 83, 801, 801, 54, 36, - 12, 377, 378, 85, 55, 56, 88, 89, 20, 7, - 3, 4, 24, 25, 51, 27, 53, 377, 378, 1155, - 58, 33, 102, 3, 4, 826, 745, 102, 833, 834, - 835, 836, 44, 58, 46, 840, 841, 842, 843, 843, - 52, 55, 56, 102, 37, 38, 88, 59, 41, 102, - 5, 6, 7, 105, 859, 105, 775, 12, 51, 71, - 53, 41, 781, 32, 869, 77, 749, 872, 102, 874, - 874, 876, 807, 53, 75, 76, 77, 78, 79, 762, - 35, 764, 801, 95, 96, 25, 26, 870, 871, 101, - 873, 102, 32, 105, 874, 75, 108, 109, 105, 51, - 54, 902, 56, 83, 865, 105, 60, 119, 60, 121, - 122, 916, 917, 102, 919, 55, 56, 69, 58, 4, - 5, 105, 857, 51, 54, 6, 56, 139, 140, 141, - 60, 866, 937, 938, 817, 88, 819, 44, 821, 858, - 875, 44, 1216, 948, 949, 949, 31, 1076, 753, 51, - 58, 36, 56, 165, 55, 56, 957, 876, 60, 55, - 1121, 1122, 56, 5, 6, 7, 51, 69, 53, 949, - 12, 183, 973, 1324, 1325, 980, 981, 982, 81, 82, - 785, 193, 56, 86, 87, 88, 89, 235, 236, 994, - 995, 838, 997, 35, 56, 378, 980, 56, 982, 55, - 4, 58, 6, 7, 1286, 1287, 58, 102, 12, 102, - 982, 1172, 619, 102, 102, 105, 55, 88, 230, 231, - 60, 1026, 1026, 27, 55, 55, 602, 31, 60, 1030, - 88, 35, 608, 58, 102, 102, 102, 1327, 843, 102, - 1327, 102, 602, 70, 70, 55, 1026, 51, 608, 53, - 1179, 102, 102, 858, 70, 70, 102, 60, 1167, 271, - 1021, 1022, 60, 60, 136, 277, 278, 279, 1069, 102, - 105, 89, 284, 285, 102, 1010, 1011, 83, 44, 103, - 656, 102, 1173, 1174, 88, 102, 105, 299, 1023, 1024, - 102, 102, 105, 1098, 941, 102, 656, 105, 103, 60, - 312, 102, 102, 315, 34, 58, 102, 319, 102, 58, - 102, 323, 88, 1242, 88, 1276, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 88, 338, 73, 74, 75, - 76, 77, 78, 79, 88, 103, 1097, 520, 1121, 1122, - 88, 748, 102, 102, 6, 102, 1275, 359, 360, 361, - 362, 363, 102, 105, 105, 367, 1117, 102, 60, 103, - 102, 373, 102, 375, 102, 377, 378, 972, 1173, 1174, - 1175, 88, 384, 60, 56, 56, 251, 4, 390, 254, - 54, 393, 257, 7, 56, 1120, 1169, 58, 263, 1172, - 102, 14, 1193, 102, 406, 60, 60, 272, 105, 1328, - 412, 413, 44, 415, 88, 1327, 56, 56, 420, 88, - 58, 58, 1217, 88, 102, 105, 102, 44, 15, 602, - 56, 56, 102, 56, 51, 608, 53, 1032, 1033, 1034, - 1035, 56, 102, 1217, 446, 447, 448, 449, 65, 1044, - 103, 848, 849, 102, 1216, 102, 56, 58, 75, 58, - 102, 1186, 1187, 9, 1189, 1190, 1175, 102, 85, 835, - 836, 88, 89, 56, 56, 841, 842, 843, 56, 341, - 88, 55, 1077, 656, 102, 835, 836, 91, 56, 58, - 1085, 841, 842, 843, 496, 102, 498, 1248, 88, 102, - 102, 9, 56, 1276, 901, 902, 102, 102, 510, 511, - 102, 513, 9, 56, 2, 0, 0, 690, 520, 129, - 118, 7, 1195, 801, 10, 387, 325, 815, 119, 531, - 119, 551, 1327, 1327, 99, 459, 1140, 1, 1150, 508, - 1181, 1077, 981, 681, 33, 805, 1193, 859, 550, 551, - 585, 796, 33, 949, 874, 872, 794, 539, 44, 23, - 957, 25, 26, 413, 1159, 496, 12, 1266, 32, 55, - 829, 1296, 58, 435, 60, 876, 1300, -1, -1, 444, - 1175, 3, 4, -1, 70, 1180, 1181, 1302, 1261, -1, - 54, 55, 56, -1, 58, -1, 60, -1, 600, 601, - 602, -1, 88, 89, -1, -1, 608, 93, -1, -1, - 1205, 784, -1, -1, -1, -1, 102, -1, 1327, 41, - -1, -1, 624, 625, -1, 627, 4, -1, 92, 51, - 492, 53, 494, 495, 1031, -1, -1, -1, 60, 1036, - -1, -1, 20, 65, -1, 647, -1, -1, -1, -1, - -1, -1, -1, 75, 656, 33, -1, -1, 520, -1, - -1, 83, -1, 836, 526, -1, 88, -1, 46, 842, - 843, -1, 1, 675, -1, 1270, -1, -1, -1, -1, - -1, 59, -1, 685, 686, 687, -1, -1, -1, -1, - -1, 1286, 1287, 71, 23, -1, 25, 26, 76, 77, - -1, -1, -1, 32, 1299, -1, -1, -1, -1, -1, - 88, 89, -1, 1110, 1111, 888, 578, -1, 96, -1, - -1, 99, -1, -1, -1, 54, 55, 56, -1, 58, - -1, 60, 1098, -1, -1, -1, -1, -1, -1, -1, - -1, 119, 1139, 745, 122, -1, 608, -1, 1098, -1, - -1, -1, -1, 4, 5, 6, 7, -1, 136, 10, - -1, 12, -1, 92, 766, -1, 768, -1, -1, -1, - -1, -1, -1, 775, -1, -1, 27, 779, -1, 781, - 31, 783, 784, 785, 35, -1, -1, 1184, 4, 791, - 6, 7, -1, -1, 1191, 1192, 12, -1, -1, 801, - 51, -1, 53, 1200, -1, 183, -1, 1173, 1174, 1175, - -1, 27, -1, 815, -1, 31, -1, 69, -1, 35, - -1, -1, -1, 1173, 1174, 1175, -1, -1, 690, -1, - -1, 833, 834, 835, 836, 51, -1, 53, 840, 841, - 842, 843, 93, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 230, -1, -1, -1, -1, 859, 24, 25, - -1, -1, 1259, 1260, 116, -1, -1, 869, -1, -1, - 872, -1, 874, -1, 876, -1, -1, -1, 3, 4, - 258, -1, 7, 135, -1, -1, -1, 749, -1, -1, - -1, -1, 757, 271, -1, -1, -1, -1, 150, -1, - 762, 279, 764, -1, -1, 71, -1, -1, -1, -1, - 76, -1, -1, -1, 916, 917, 41, 919, 783, 784, - -1, 299, 88, 89, -1, 1098, 51, -1, 53, 1326, - -1, -1, -1, 99, -1, 937, 938, -1, 10, -1, - 65, -1, 108, 109, -1, 323, 948, 949, -1, -1, - 75, -1, -1, 25, 26, 817, -1, 819, 83, 821, - 32, -1, -1, 88, -1, -1, -1, -1, -1, -1, - 136, -1, 44, 139, 140, -1, 841, 842, 980, 981, - 982, -1, 360, 55, 56, 363, 58, -1, 60, 367, - -1, -1, 994, 995, -1, 997, -1, -1, -1, -1, - -1, 1174, 1175, -1, -1, -1, -1, -1, -1, 387, - -1, -1, -1, -1, -1, -1, 88, 89, -1, -1, - 92, 93, 887, 888, 1026, -1, 3, 4, -1, -1, - 102, -1, -1, -1, -1, 413, -1, 415, -1, -1, - -1, -1, 420, -1, -1, -1, -1, -1, -1, 1, - -1, 3, 4, 5, 6, 7, -1, 922, -1, 437, - 12, -1, 440, -1, 41, -1, -1, 445, 446, 447, - 448, 449, 937, 938, 51, 27, 53, 3, 4, 31, - -1, 459, -1, 35, 36, 463, -1, -1, 65, 41, - -1, -1, 258, -1, -1, -1, 1098, -1, 75, 51, - -1, 53, 3, 4, 56, 271, 83, -1, 60, -1, - -1, 88, -1, 65, -1, 41, -1, 495, 496, -1, - -1, -1, -1, 75, -1, 51, -1, 53, 380, -1, - 56, 83, -1, 299, 386, 513, 88, -1, -1, 65, - 41, -1, 520, 44, -1, -1, -1, -1, 71, 75, - 51, 103, 53, 76, -1, -1, -1, 83, -1, 60, - -1, -1, 88, -1, 65, 88, 89, -1, -1, -1, - -1, 1173, 1174, 1175, 75, -1, 99, -1, 430, 431, - -1, 433, 83, -1, -1, -1, -1, 88, 1, -1, + 4, 118, 279, 137, 419, 349, 300, 12, 131, 132, + 4, 285, 341, 300, 70, 20, 20, 108, 109, 24, + 25, 12, 27, 392, 285, 266, 52, 300, 33, 33, + 137, 87, 20, 71, 132, 130, 391, 137, 753, 44, + 182, 46, 98, 162, 163, 155, 135, 52, 1161, 820, + 993, 1189, 1052, 4, 59, 9, 56, 34, 34, 9, + 44, 52, 9, 0, 1222, 70, 71, 1169, 51, 3, + 4, 56, 77, 77, 1232, 60, 370, 60, 4, 0, + 10, 410, 87, 370, 3, 4, 69, 44, 365, 77, + 95, 96, 45, 98, 20, 36, 101, 97, 44, 104, + 105, 62, 53, 108, 109, 110, 189, 33, 36, 10, + 60, 95, 58, 1215, 1252, 120, 120, 122, 123, 53, + 7, 48, 41, 10, 75, 55, 103, 103, 4, 4, + 60, 88, 993, 137, 53, 140, 141, 142, 122, 1000, + 1253, 75, 88, 1, 1302, 102, 12, 1285, 102, 518, + 1150, 77, 102, 88, 55, 102, 75, 44, 7, 60, + 302, 166, 103, 93, 83, 126, 443, 4, 55, 44, + 55, 58, 102, 60, 88, 103, 51, 53, 53, 184, + 184, 155, 143, 70, 4, 56, 52, 7, 959, 194, + 65, 4, 93, 300, 120, 189, 54, 158, 287, 75, + 75, 88, 89, 44, 919, 54, 93, 76, 3, 44, + 85, 60, 186, 88, 89, 102, 53, 4, 103, 88, + 89, 1334, 1335, 346, 347, 348, 231, 232, 155, 285, + 99, 51, 103, 53, 272, 162, 163, 990, 75, 992, + 53, 107, 51, 92, 344, 65, 56, 88, 346, 347, + 345, 3, 4, 88, 89, 75, 339, 391, 184, 186, + 69, 535, 75, 370, 3, 4, 53, 272, 137, 89, + 4, 276, 44, 278, 279, 280, 395, 396, 69, 56, + 44, 286, 92, 44, 391, 4, 396, 44, 7, 380, + 381, 391, 44, 102, 252, 300, 300, 255, 44, 51, + 258, 53, 286, 230, 423, 10, 264, 56, 663, 314, + 66, 1172, 317, 1256, 53, 273, 88, 322, 401, 53, + 1263, 326, 326, 44, 88, 654, 103, 88, 89, 85, + 60, 88, 51, 51, 53, 55, 88, 460, 326, 439, + 1055, 102, 88, 89, 56, 339, 65, 103, 55, 56, + 55, 69, 279, 58, 103, 60, 75, 362, 363, 364, + 365, 366, 56, 3, 4, 370, 370, 88, 1229, 55, + 331, 376, 102, 378, 1317, 380, 381, 382, 362, 88, + 364, 365, 102, 388, 44, 251, 54, 391, 93, 394, + 259, 103, 397, 387, 150, 1256, 496, 60, 498, 499, + 326, 41, 1263, 3, 4, 410, 69, 401, 56, 103, + 517, 416, 417, 53, 419, 419, 102, 524, 51, 424, + 789, 6, 7, 55, 60, 56, 1287, 12, 88, 89, + 530, 300, 416, 788, 56, 75, 3, 4, 365, 6, + 196, 41, 102, 83, 405, 450, 451, 452, 453, 54, + 35, 51, 56, 53, 3, 4, 1317, 103, 27, 44, + 60, 422, 500, 44, 55, 65, 102, 54, 395, 396, + 102, 51, 103, 596, 41, 75, 55, 3, 4, 44, + 60, 103, 56, 83, 102, 585, 53, 570, 88, 69, + 448, 70, 41, 419, 823, 500, 423, 502, 596, 103, + 54, 370, 609, 88, 53, 44, 60, 88, 615, 514, + 515, 102, 517, 517, 808, 41, 83, 44, 92, 524, + 524, 808, 391, 88, 798, 644, 75, 53, 284, 663, + 556, 58, 55, 44, 83, 808, 102, 798, 867, 108, + 109, 110, 3, 4, 5, 6, 7, 70, 103, 88, + 555, 556, 308, 794, 102, 424, 663, 83, 3, 4, + 929, 88, 89, 54, 647, 556, 55, 56, 685, 60, + 44, 555, 441, 142, 35, 444, 570, 88, 89, 9, + 449, 450, 451, 452, 453, 3, 4, 5, 6, 7, + 51, 1, 53, 54, 463, 23, 102, 680, 467, 102, + 466, 92, 607, 608, 609, 609, 51, 44, 53, 54, + 615, 615, 92, 23, 88, 25, 26, 3, 4, 3, + 1035, 58, 32, 55, 56, 51, 631, 632, 555, 634, + 499, 60, 60, 977, 60, 53, 105, 98, 99, 100, + 69, 1, 97, 69, 54, 55, 56, 924, 58, 654, + 60, 88, 388, 647, 788, 41, 756, 4, 663, 663, + 55, 397, 37, 23, 54, 25, 26, 53, 60, 769, + 60, 771, 32, 4, 51, 70, 51, 682, 6, 7, + 436, 788, 92, 60, 12, 792, 680, 692, 693, 694, + 556, 88, 69, 89, 54, 55, 56, 83, 58, 60, + 60, 808, 92, 664, 51, 105, 53, 35, 669, 670, + 925, 926, 673, 928, 88, 992, 55, 644, 65, 58, + 51, 89, 53, 55, 56, 825, 592, 827, 75, 829, + 23, 70, 92, 54, 65, 56, 25, 26, 845, 60, + 1084, 1085, 798, 27, 75, 852, 88, 752, 692, 693, + 694, 88, 843, 844, 1098, 682, 512, 69, 89, 850, + 851, 54, 88, 56, 69, 58, 69, 60, 773, 69, + 775, 527, 25, 26, 1118, 1119, 54, 782, 56, 25, + 26, 786, 60, 788, 788, 790, 791, 792, 792, 9, + 78, 79, 103, 798, 663, 878, 879, 55, 881, 55, + 56, 54, 3, 808, 808, 810, 764, 60, 54, 1334, + 1335, 380, 381, 382, 60, 3, 4, 55, 56, 3, + 4, 1165, 102, 7, 108, 109, 110, 102, 54, 102, + 56, 103, 790, 791, 60, 102, 841, 842, 843, 844, + 845, 845, 55, 56, 849, 850, 851, 852, 852, 37, + 38, 55, 56, 41, 236, 237, 54, 41, 142, 102, + 44, 7, 867, 51, 58, 53, 102, 51, 102, 53, + 1296, 1297, 877, 102, 4, 880, 58, 882, 882, 884, + 105, 65, 12, 752, 878, 879, 102, 881, 44, 88, + 20, 75, 850, 851, 24, 25, 105, 27, 32, 83, + 105, 85, 105, 33, 88, 89, 102, 581, 4, 5, + 102, 102, 873, 782, 44, 51, 46, 6, 105, 788, + 925, 926, 52, 928, 88, 81, 82, 44, 55, 59, + 86, 87, 88, 89, 58, 31, 58, 895, 896, 808, + 36, 71, 4, 5, 58, 102, 56, 77, 56, 1226, + 102, 56, 56, 958, 958, 51, 882, 53, 56, 58, + 55, 635, 102, 1086, 102, 95, 96, 102, 834, 31, + 88, 101, 646, 931, 36, 105, 105, 55, 108, 109, + 110, 60, 88, 89, 55, 990, 991, 992, 55, 51, + 120, 53, 122, 123, 25, 26, 60, 866, 1, 1004, + 1005, 32, 1007, 88, 58, 102, 990, 70, 992, 102, + 140, 141, 142, 70, 102, 884, 102, 70, 102, 102, + 23, 102, 25, 26, 55, 56, 70, 58, 897, 32, + 1035, 1035, 958, 102, 60, 60, 166, 5, 6, 7, + 609, 55, 102, 1337, 12, 911, 615, 60, 1131, 1132, + 1337, 54, 55, 56, 184, 58, 102, 60, 105, 102, + 1177, 103, 102, 83, 194, 992, 1189, 35, 89, 1030, + 1031, 105, 343, 44, 5, 6, 7, 105, 102, 102, + 102, 12, 34, 4, 103, 102, 7, 105, 58, 92, + 102, 847, 1183, 1184, 663, 102, 380, 381, 382, 1182, + 966, 231, 232, 1108, 35, 1205, 102, 102, 58, 1035, + 88, 88, 4, 5, 6, 7, 88, 983, 10, 88, + 12, 88, 103, 44, 75, 76, 77, 78, 79, 1252, + 51, 105, 53, 6, 60, 27, 102, 1131, 1132, 31, + 102, 815, 272, 35, 65, 102, 1107, 102, 278, 279, + 280, 105, 88, 259, 75, 285, 286, 3, 4, 51, + 102, 53, 1285, 102, 85, 103, 1127, 88, 89, 102, + 300, 1271, 102, 1039, 102, 60, 56, 56, 1183, 1184, + 1185, 7, 54, 14, 314, 1179, 56, 317, 1182, 58, + 102, 865, 322, 949, 102, 41, 326, 60, 44, 60, + 874, 93, 27, 1286, 105, 51, 44, 53, 56, 883, + 88, 341, 1078, 56, 60, 1338, 58, 88, 58, 65, + 88, 102, 1227, 105, 15, 1183, 1184, 102, 102, 75, + 1337, 58, 362, 363, 364, 365, 366, 83, 102, 56, + 370, 103, 88, 1227, 56, 56, 376, 102, 378, 102, + 380, 381, 382, 56, 56, 102, 9, 58, 388, 56, + 56, 102, 3, 4, 394, 88, 7, 397, 56, 375, + 55, 91, 102, 102, 843, 844, 845, 56, 102, 9, + 410, 850, 851, 852, 109, 110, 416, 417, 102, 419, + 58, 56, 1286, 102, 424, 88, 102, 1258, 102, 1226, + 41, 3, 4, 44, 9, 7, 56, 0, 0, 119, + 51, 2, 53, 328, 808, 120, 1185, 142, 823, 99, + 450, 451, 452, 453, 65, 609, 120, 1150, 1160, 1191, + 130, 615, 1337, 1337, 75, 441, 512, 1203, 444, 41, + 446, 447, 83, 449, 85, 1019, 1020, 88, 89, 51, + 463, 53, 1087, 4, 991, 626, 7, 1203, 1032, 1033, + 592, 467, 803, 65, 688, 471, 867, 33, 33, 654, + 500, 813, 502, 75, 4, 958, 417, 543, 882, 663, + 880, 83, 801, 12, 514, 515, 88, 517, 500, 837, + 20, 497, 1276, 44, 524, 1310, 4, 503, 6, 7, + 51, 1312, 53, 33, 12, 535, 73, 74, 75, 76, + 77, 78, 79, 884, 65, -1, 46, 10, -1, 27, + -1, 370, -1, 31, 75, 555, 556, 35, -1, 59, + -1, -1, 25, 26, 85, -1, -1, 88, 89, 32, + -1, 71, -1, 51, -1, 53, 76, 77, -1, -1, + -1, 44, -1, -1, -1, -1, 1130, -1, 88, 89, + -1, -1, 55, 56, -1, 58, 96, 60, 1337, 99, + -1, -1, -1, -1, -1, -1, -1, 607, 608, 609, + 88, -1, -1, -1, 755, 615, -1, -1, -1, 4, + 120, 6, 7, 123, -1, 88, 89, 12, -1, 92, + 93, 631, 632, -1, 634, -1, -1, 137, -1, 102, + -1, -1, 27, -1, -1, -1, 31, -1, -1, -1, + 35, -1, 1196, 1197, 654, 1199, 1200, -1, -1, -1, + -1, -1, -1, 663, -1, -1, 51, -1, 53, 1108, + -1, 812, -1, -1, 1, -1, 3, 4, 5, 6, + 7, -1, 682, -1, 184, 12, 381, 382, -1, 843, + 844, 845, 692, 693, 694, -1, 850, 851, 852, -1, + 27, -1, -1, -1, 31, -1, -1, -1, 35, 36, + -1, -1, -1, -1, 41, -1, 857, -1, -1, -1, + -1, -1, -1, -1, 51, -1, 53, -1, -1, 56, + -1, 231, -1, 60, 4, -1, 6, 7, 65, -1, + 137, -1, 12, -1, 1183, 1184, 1185, -1, 75, -1, + -1, -1, 752, -1, -1, -1, 83, -1, -1, 259, + -1, 88, 1306, -1, -1, 35, -1, -1, -1, 910, + 911, -1, 272, 773, 44, 775, 103, -1, -1, -1, + 280, 51, 782, 53, 760, -1, 786, -1, 788, -1, + 790, 791, 792, -1, 71, 65, -1, -1, 798, 76, + 300, -1, -1, -1, -1, 75, -1, -1, 808, -1, + 810, 88, 89, -1, -1, 85, 792, -1, 88, 89, + -1, -1, 99, 823, -1, 966, 326, -1, -1, 524, + -1, -1, -1, 3, 4, -1, -1, -1, -1, -1, + -1, 841, 842, 843, 844, 845, -1, -1, -1, 849, + 850, 851, 852, -1, -1, -1, -1, -1, -1, -1, + 137, 4, -1, 363, 7, -1, 366, 867, -1, -1, + 370, 41, -1, -1, -1, -1, 852, 877, -1, -1, + 880, 51, 882, 53, 884, -1, 56, -1, -1, -1, + 866, 391, -1, -1, -1, 65, -1, -1, -1, 1040, + -1, 44, -1, -1, 1045, 75, -1, -1, 51, -1, + 53, -1, -1, 83, 609, -1, -1, 417, 88, 419, + 615, 897, 65, -1, 424, 925, 926, -1, 928, -1, + -1, -1, 75, -1, -1, -1, -1, -1, -1, -1, + -1, 441, 85, -1, 444, 88, 89, 344, -1, 449, + 450, 451, 452, 453, 1108, -1, -1, -1, 958, -1, + -1, -1, 4, 463, 6, 7, -1, 467, 663, -1, + 12, -1, -1, 24, 25, -1, -1, -1, -1, 1120, + 1121, -1, 259, -1, -1, 27, -1, -1, -1, 31, + 990, 991, 992, 35, 391, 272, -1, -1, -1, 499, + 500, -1, 697, -1, 1004, 1005, 982, 1007, 1149, 51, + -1, 53, 54, -1, -1, -1, -1, 517, -1, -1, + 71, -1, -1, 300, 524, 76, -1, -1, -1, 1183, + 1184, 1185, -1, 3, 4, 1035, -1, 88, 89, -1, + -1, -1, 439, -1, -1, -1, 88, -1, 99, -1, + 3, 4, -1, 1194, 7, -1, -1, 108, 109, -1, + 1201, 1202, -1, -1, -1, 1041, 1042, 1043, 1044, 1210, + -1, 41, -1, -1, -1, -1, -1, 1053, -1, -1, + -1, 51, -1, 53, -1, -1, 137, -1, 41, 140, + 141, 44, -1, 370, -1, 65, 791, 792, 51, 496, + 53, 498, 499, -1, -1, 75, -1, -1, 1108, 609, + -1, 1087, 65, 83, 391, 615, -1, -1, 88, 1095, + -1, -1, 75, -1, -1, -1, -1, 524, 1269, 1270, + 83, -1, 85, 530, -1, 88, 89, 71, 72, 73, + 74, 75, 76, 77, 78, 79, -1, 424, -1, 844, + 845, -1, -1, -1, -1, -1, 851, 852, -1, -1, + -1, -1, -1, 663, 441, -1, -1, 444, -1, -1, + -1, -1, 449, 450, 451, 452, 453, -1, -1, -1, + -1, -1, -1, 1183, 1184, 1185, 463, -1, 585, -1, + 467, -1, -1, 1169, 1, 1336, 3, 4, 5, 6, + 7, 896, 897, -1, -1, 12, -1, -1, 259, 1185, + -1, -1, -1, -1, 1190, 1191, -1, -1, 615, -1, + 27, 272, 499, 500, 31, -1, -1, 1227, 35, 36, + -1, -1, -1, -1, 41, -1, -1, -1, -1, 1215, + 517, -1, -1, -1, 51, -1, 53, 524, -1, 300, + -1, -1, 752, 60, -1, -1, 756, -1, 65, -1, + -1, 1, -1, 3, 4, 5, 6, 7, 75, -1, + -1, -1, 12, -1, -1, 4, 83, 6, 7, -1, + -1, 88, 782, 12, -1, 25, 26, 27, 788, -1, + -1, 31, 792, -1, -1, 35, 103, -1, 27, 39, + 697, 41, 31, -1, 1280, 45, 35, -1, 808, -1, + 810, 51, -1, 53, -1, -1, 56, -1, -1, 370, + 1296, 1297, 51, -1, 53, 65, -1, -1, -1, 380, + 381, -1, 609, 1309, -1, 75, 836, 1337, 615, -1, + 391, -1, -1, 83, -1, 845, -1, -1, 88, -1, + -1, -1, 852, -1, 94, 95, -1, 3, 4, 756, + -1, 7, -1, -1, -1, -1, 866, -1, -1, -1, + -1, -1, 769, 424, 771, -1, -1, -1, -1, -1, + -1, -1, 882, -1, 884, -1, 663, -1, -1, -1, + 441, -1, -1, 444, -1, 41, -1, 897, 449, 450, + 451, 452, 453, -1, -1, 51, -1, 53, -1, -1, + -1, -1, 463, 1108, -1, -1, 467, -1, -1, 65, + 1, -1, 3, 4, 5, 6, 7, -1, 825, 75, + 827, 12, 829, -1, -1, -1, -1, 83, -1, 69, + -1, -1, 88, -1, -1, -1, 27, -1, 499, 500, + 31, -1, -1, -1, 35, 36, -1, 76, 958, -1, + 41, -1, -1, 514, 515, -1, 517, -1, -1, -1, + 51, -1, 53, 524, -1, 752, -1, -1, -1, 60, + 99, -1, -1, -1, 65, -1, -1, 117, -1, 1184, + 1185, 991, -1, 993, 75, -1, -1, -1, -1, -1, + 1000, -1, 83, -1, -1, 782, 136, 88, -1, -1, + -1, 788, -1, -1, -1, 792, -1, -1, 137, -1, + -1, 151, 103, -1, -1, -1, -1, -1, -1, -1, + -1, 808, -1, -1, -1, 1035, 1, -1, 3, 4, + 5, 6, 7, -1, 3, 4, -1, 12, 7, -1, + -1, -1, -1, -1, -1, -1, 607, 608, 609, -1, + -1, -1, 27, -1, 615, -1, 31, -1, 845, -1, + 35, 36, -1, -1, -1, 852, 41, -1, -1, -1, + -1, -1, 41, -1, -1, 44, 51, 1087, 53, 866, + -1, 56, 51, -1, 53, 60, -1, -1, 3, 4, + 65, -1, -1, -1, -1, -1, 65, 884, -1, -1, + 75, -1, 663, -1, -1, -1, 75, -1, 83, -1, + 897, -1, -1, 88, 83, -1, 85, -1, -1, 88, + 89, -1, 4, 5, 6, 7, 41, -1, 103, 44, + 12, 260, -1, -1, -1, -1, 51, -1, 53, -1, + -1, -1, -1, -1, -1, 27, -1, -1, -1, 31, + 65, 1161, 1, 35, 3, 4, 5, 6, 7, 1169, + 75, -1, 1172, 12, -1, -1, -1, -1, 83, 51, + 85, 53, -1, 88, 89, 1185, -1, -1, 27, -1, + 1190, 1191, 31, -1, -1, -1, 35, 3, 4, -1, + -1, 752, 41, -1, -1, -1, 45, -1, -1, -1, + -1, 1108, 51, -1, 53, 1215, -1, 56, -1, -1, + -1, -1, 1222, -1, 343, 344, 65, -1, -1, 1229, + -1, 782, 1232, -1, -1, 41, 75, 788, -1, 790, + 791, 792, -1, -1, 83, 51, -1, 53, -1, 88, + 56, -1, -1, 1253, 384, 94, 1256, 808, -1, 65, + 390, -1, -1, 1263, -1, -1, -1, -1, -1, 75, + -1, -1, 391, -1, -1, -1, -1, 83, -1, -1, + -1, -1, 88, 4, 5, 6, 7, 1287, -1, -1, + -1, 12, 843, 844, 845, 414, -1, -1, -1, 850, + 851, 852, 1302, -1, 434, 435, 27, 437, 1205, -1, + 31, -1, -1, -1, 35, 866, -1, 1317, -1, -1, + 439, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 51, -1, 53, 884, 1334, 1335, -1, 1337, 3, 4, + -1, -1, 7, -1, 463, -1, 897, 466, 69, -1, + 469, 470, -1, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, -1, -1, 1271, -1, 41, 496, -1, 498, + 499, -1, -1, -1, -1, -1, 51, -1, 53, -1, + 520, 521, 1169, -1, 4, 525, 6, -1, -1, -1, + 65, -1, 12, -1, -1, 524, -1, -1, 1185, -1, + 75, 530, -1, 1190, 1191, -1, -1, 27, 83, -1, + -1, 31, -1, 88, -1, 35, 545, 546, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1215, -1, + -1, 51, -1, 53, -1, -1, -1, -1, -1, -1, + 3, 4, 5, 6, 7, -1, -1, 10, -1, 12, + -1, 3, 4, 5, 6, 7, 585, -1, -1, -1, + 12, 601, 602, 592, 27, -1, -1, -1, 31, 12, + -1, 611, 35, -1, -1, 27, -1, 617, 41, 31, + -1, 24, 25, 35, 27, -1, 615, -1, 51, 41, + 53, -1, -1, -1, -1, 4, -1, 626, -1, 51, + -1, 53, 65, -1, 56, -1, -1, -1, -1, 52, + -1, -1, 75, 65, -1, 24, 25, -1, 27, -1, + 83, 661, -1, 75, 33, 88, -1, -1, -1, -1, + 93, 83, -1, 662, -1, 44, 88, 46, -1, -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, 12, - -1, 367, 4, 5, 6, 7, -1, -1, -1, -1, - 12, 377, 378, 136, 27, 1217, -1, -1, 31, -1, - -1, 387, 35, 36, 602, 27, -1, -1, 41, 31, - 608, -1, -1, 35, -1, -1, 1098, -1, 51, -1, - 53, -1, -1, 56, -1, -1, -1, 60, -1, 51, - -1, 53, 65, -1, 420, 4, -1, 6, 7, -1, - -1, -1, 75, 12, 516, 517, -1, 69, -1, 521, - 83, 437, -1, -1, 440, 88, -1, -1, 656, 445, - 446, 447, 448, 449, -1, -1, 35, -1, -1, -1, - 103, -1, -1, 459, -1, 44, -1, 463, -1, -1, - -1, -1, 51, -1, 53, -1, -1, -1, 1173, 1174, - -1, -1, -1, -1, -1, -1, 65, -1, -1, -1, - -1, -1, -1, -1, -1, 1327, 75, -1, -1, 495, - 496, -1, -1, 1195, -1, 258, 85, -1, -1, 88, - 89, -1, 594, 595, 510, 511, -1, 513, 271, -1, - -1, -1, 604, -1, 520, -1, -1, -1, 610, -1, - 3, 4, 5, 6, 7, -1, -1, 745, -1, 12, - -1, 749, -1, -1, -1, -1, 299, 3, 4, 1, - -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, - 12, -1, 35, -1, -1, -1, -1, 775, 41, 1261, - -1, 44, 654, 781, -1, 27, -1, 785, 51, 31, - 53, -1, -1, 35, 36, 41, -1, -1, 44, 41, - -1, -1, 65, 801, -1, 51, -1, 53, -1, 51, - -1, 53, 75, -1, 600, 601, 602, -1, 60, 65, - 83, -1, 608, 65, 367, 88, -1, -1, -1, 75, - 828, -1, -1, 75, -1, -1, -1, 83, -1, 85, - -1, 83, 88, 89, 387, 843, 88, -1, -1, -1, - 3, 4, -1, -1, 7, -1, -1, -1, -1, -1, - 858, 103, -1, -1, -1, -1, -1, -1, -1, -1, - 656, -1, -1, -1, -1, -1, 874, 420, 876, 751, - 752, 1, 754, 3, 4, 5, 6, 7, 41, -1, - -1, -1, 12, -1, 437, -1, -1, 440, 51, -1, - 53, -1, 445, 446, 447, 448, 449, 27, 780, -1, - -1, 31, 65, -1, -1, 35, 459, -1, -1, -1, - 463, 41, 75, -1, -1, 45, -1, -1, -1, -1, - 83, 51, -1, 53, -1, 88, 56, -1, 3, 4, - -1, -1, 7, -1, -1, 65, -1, -1, 76, -1, - -1, 949, 495, 496, -1, 75, -1, -1, -1, 745, - -1, -1, -1, 83, -1, -1, -1, 839, 88, -1, - 513, 99, -1, -1, 94, -1, 41, 520, -1, 44, - 852, 853, 854, 981, -1, 983, 51, -1, 53, 775, - -1, -1, 990, -1, -1, 781, -1, 783, 784, 785, - 65, -1, -1, -1, 3, 4, -1, -1, 136, -1, - 75, -1, -1, -1, -1, 801, -1, -1, 83, -1, - 85, -1, -1, 88, 89, -1, -1, -1, 1026, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 41, -1, -1, -1, -1, -1, -1, 835, - 836, -1, 51, -1, 53, 841, 842, 843, 930, 602, - -1, 60, -1, -1, -1, 608, 65, -1, -1, -1, - -1, -1, 858, -1, -1, 1, 75, 3, 4, 1077, - 6, 7, 8, 9, 83, 11, 12, -1, -1, 88, - 876, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, - -1, 37, 38, 656, 40, 41, 42, 43, -1, -1, - 46, 47, 48, 49, 50, 51, -1, 53, 54, -1, - -1, 259, -1, -1, -1, -1, 62, -1, -1, 65, - -1, -1, 1014, -1, -1, -1, -1, 73, 74, 75, - -1, 937, 938, 1151, -1, 81, 82, 83, -1, -1, - -1, 1159, 88, 89, 1162, -1, 92, -1, -1, -1, - 1, -1, 3, 4, 5, 6, 7, 1175, 104, -1, - -1, 12, 1180, 1181, -1, -1, -1, 1059, -1, -1, - 139, 140, 141, -1, -1, -1, 27, -1, -1, -1, - 31, -1, 745, -1, 35, 36, -1, 1205, -1, -1, - 41, -1, 340, 341, 1212, -1, -1, -1, -1, -1, - 51, 1219, 53, -1, 1222, -1, 3, 4, -1, 60, - 7, -1, 775, -1, 65, -1, -1, -1, 781, -1, - -1, -1, 785, -1, 75, 1243, -1, -1, 1246, -1, - -1, -1, 83, -1, -1, 1253, -1, 88, 801, 387, - -1, -1, -1, -1, 41, -1, -1, 44, -1, -1, - -1, -1, 103, -1, 51, -1, 53, -1, -1, 1277, - -1, -1, 410, -1, -1, -1, -1, -1, 65, -1, - -1, -1, -1, -1, 1292, -1, -1, -1, 75, -1, - 843, -1, -1, -1, -1, -1, 83, 435, 85, 1307, - -1, 88, 89, -1, -1, 858, -1, -1, -1, -1, - -1, 3, 4, -1, -1, 7, 1324, 1325, -1, 1327, - -1, 459, -1, 876, 462, -1, -1, 465, 466, -1, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 41, - -1, -1, 44, -1, 492, -1, 494, 495, -1, 51, - -1, 53, -1, 1159, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 65, -1, -1, -1, 1173, 1174, 1175, - -1, -1, 520, 75, 1180, 1181, 3, 4, 526, -1, - 7, 83, -1, 85, -1, -1, 88, 89, -1, -1, - -1, -1, -1, 541, 542, -1, -1, -1, -1, 1205, - -1, -1, -1, -1, 373, -1, 375, -1, 377, 378, - 277, 278, 279, -1, 41, -1, -1, 44, -1, -1, - -1, 390, -1, -1, 51, -1, 53, -1, -1, 1, - 578, 3, 4, 5, 6, 7, -1, 585, 65, -1, - 12, -1, -1, 412, -1, -1, -1, -1, 75, -1, - -1, -1, -1, 25, 26, 27, 83, -1, 85, 31, - 608, 88, 89, 35, -1, -1, -1, 39, 4, 41, - -1, 619, -1, 45, -1, -1, 3, 4, -1, 51, - 7, 53, -1, -1, 56, -1, -1, -1, 24, 25, - -1, 27, 359, 65, 361, 362, 363, 33, -1, -1, - -1, -1, -1, 75, -1, -1, -1, 655, 44, -1, - 46, 83, 3, 4, 41, -1, 88, -1, -1, -1, - -1, 1327, 94, 95, 51, -1, 53, -1, -1, -1, - 66, -1, -1, -1, -1, -1, -1, -1, 65, -1, - -1, -1, 690, -1, -1, -1, -1, -1, 75, -1, - 41, -1, -1, -1, -1, -1, 83, -1, -1, 95, - 51, 88, 53, 711, -1, 101, -1, 103, -1, 105, - -1, -1, 108, 109, 65, -1, -1, -1, -1, 4, - -1, 6, 7, 119, 75, 121, 122, 12, -1, -1, - -1, -1, 83, -1, -1, -1, 1159, 88, -1, -1, - 748, 749, 27, 139, 140, 141, 31, -1, -1, -1, - 35, -1, 1175, 149, 762, -1, 764, 1180, 1181, 44, - -1, -1, -1, -1, -1, -1, 51, -1, 53, 165, - -1, 600, 601, 602, 3, 4, -1, -1, 7, 608, - 65, -1, 1205, 510, 511, 793, 513, 183, -1, -1, - 75, -1, -1, 520, -1, 624, 625, 193, 627, -1, - 85, -1, -1, 88, 89, -1, -1, -1, -1, 817, - -1, 819, 41, 821, -1, -1, -1, -1, -1, -1, - -1, -1, 51, 550, 53, -1, -1, 656, -1, -1, - -1, -1, -1, -1, -1, -1, 65, -1, -1, -1, - 848, 849, -1, -1, -1, -1, 75, -1, -1, -1, - -1, -1, -1, -1, 83, 863, 864, -1, -1, 88, - 3, 4, 5, 6, 7, -1, -1, 10, 4, 12, - 6, 7, -1, 600, 601, 602, 12, -1, -1, 275, - -1, 608, -1, -1, 27, -1, -1, 283, 31, 285, - -1, 27, 35, 901, 902, 31, -1, 905, 41, 35, - -1, 44, -1, -1, 1327, -1, -1, -1, 51, -1, - 53, -1, -1, -1, -1, 51, 312, 53, 54, 315, - -1, -1, 65, 319, -1, -1, -1, -1, -1, -1, - -1, 4, 75, 6, 7, -1, -1, -1, -1, 12, - 83, -1, 85, -1, -1, 88, 89, -1, 675, 957, - 93, -1, 88, -1, 27, -1, -1, -1, 31, -1, - 968, -1, 35, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, -1, -1, 373, 51, 375, - 53, 377, 378, 3, 4, 5, 6, 7, 384, -1, - -1, -1, 12, -1, 390, -1, -1, 393, 3, 4, - -1, -1, 7, -1, 833, 834, 835, 836, -1, 1017, - -1, 840, 841, 842, 843, 35, 412, 413, -1, 415, - -1, 41, -1, 1031, 44, -1, -1, -1, 1036, -1, - 1038, 51, -1, 53, -1, -1, 41, -1, -1, 766, - 869, 768, -1, -1, -1, 65, 51, -1, 53, -1, - -1, -1, 779, -1, -1, 75, 783, 784, 785, -1, - 65, -1, -1, 83, -1, 85, -1, -1, 88, 89, - 75, -1, -1, -1, -1, -1, -1, -1, 83, -1, - -1, -1, -1, 88, 3, 4, -1, -1, 7, -1, - 1098, -1, -1, 1, -1, 3, 4, 5, 6, 7, - -1, -1, 1110, 1111, 12, -1, 833, 834, 835, 836, - 1118, 1119, 508, 840, 841, 842, 843, -1, -1, 27, - -1, -1, 41, 31, 520, -1, -1, 35, -1, -1, - -1, 1139, 51, 41, 53, -1, -1, -1, -1, -1, - -1, -1, -1, 51, -1, 53, 65, -1, -1, -1, - -1, -1, 1160, -1, 550, -1, 75, 65, -1, -1, - -1, -1, -1, -1, 83, 994, 995, 75, 997, 88, - -1, -1, -1, -1, -1, 83, 1184, -1, -1, -1, - 88, -1, -1, 1191, 1192, -1, -1, 1195, -1, -1, - -1, -1, 1200, -1, 4, 4, 5, 6, 7, -1, - -1, 10, -1, 12, 600, 601, 602, -1, -1, -1, - 937, 938, 608, -1, 24, 25, -1, 27, 27, -1, - -1, -1, 31, 33, -1, -1, 35, -1, 624, 625, - -1, 627, -1, -1, 44, 44, 46, -1, -1, -1, - -1, -1, 51, -1, 53, -1, -1, -1, -1, -1, - -1, 1259, 1260, 1261, 3, 4, 65, -1, 7, -1, - 656, -1, -1, -1, -1, -1, 75, 994, 995, 1098, - 997, -1, -1, -1, -1, -1, 85, -1, -1, 88, - 89, -1, -1, -1, 93, 95, -1, -1, -1, -1, - -1, 101, 41, -1, 690, 105, -1, -1, 108, 109, - -1, -1, 51, -1, 53, -1, -1, -1, -1, 119, - -1, 121, 122, -1, -1, -1, 65, -1, 1326, -1, - -1, -1, -1, -1, -1, -1, 75, -1, -1, 139, - 140, 141, -1, -1, 83, -1, -1, -1, -1, 88, - -1, -1, -1, -1, 1173, 1174, 1175, -1, 1, -1, - -1, 4, -1, 6, 7, 165, -1, -1, -1, 12, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, -1, 183, 27, -1, -1, -1, 31, -1, - -1, -1, 35, 193, 37, 38, 27, 783, 784, -1, - -1, 44, -1, -1, -1, -1, -1, -1, 51, -1, - 53, -1, 55, 44, 57, 58, 59, -1, 61, 62, + 1337, -1, -1, -1, -1, -1, -1, 66, 101, -1, + 103, 104, 105, -1, -1, 108, 109, 110, 697, -1, + -1, -1, 35, -1, -1, -1, -1, -1, 41, -1, + -1, 44, -1, -1, -1, -1, 95, -1, 51, 718, + 53, -1, 101, -1, 103, -1, 105, -1, -1, 108, + 109, 110, 65, -1, -1, -1, -1, -1, 1169, -1, + -1, 120, 75, 122, 123, -1, -1, -1, 758, 759, + 83, 761, 1183, 1184, 1185, 88, 755, 756, -1, 1190, + 1191, 140, 141, 142, -1, -1, -1, -1, -1, -1, + 769, 150, 771, -1, -1, -1, -1, 787, -1, -1, + -1, 194, -1, -1, 1215, -1, -1, 166, -1, -1, + -1, -1, -1, -1, -1, 3, 4, 5, 6, 7, + -1, 800, -1, -1, 12, 184, -1, -1, -1, -1, + -1, -1, -1, 812, -1, 194, -1, -1, -1, 232, + -1, -1, -1, -1, -1, -1, 825, 35, 827, -1, + 829, -1, -1, 41, -1, -1, 44, -1, 848, 4, + -1, 6, 7, 51, -1, 53, -1, 12, -1, -1, + 860, 861, 862, -1, -1, -1, -1, 65, 857, -1, + -1, -1, -1, 276, -1, 278, 279, 75, -1, -1, + 35, -1, 871, 872, -1, 83, -1, 85, -1, 44, + 88, 89, -1, -1, -1, -1, 51, 1, 53, 3, + 4, 5, 6, 7, -1, 308, -1, 276, 12, -1, + 65, 314, -1, -1, 317, 284, 1337, 286, -1, 322, + 75, 910, 911, 27, -1, 914, -1, 31, -1, -1, + 85, 35, -1, 88, 89, -1, -1, 41, -1, 939, + -1, -1, -1, -1, -1, 314, -1, 51, 317, 53, + -1, -1, -1, 322, 3, 4, 5, 6, 7, -1, + -1, 65, -1, 12, -1, -1, -1, -1, -1, -1, + -1, 75, -1, -1, -1, -1, -1, 966, 27, 83, + -1, -1, 31, -1, 88, -1, 35, -1, -1, 978, + -1, -1, 41, 362, 363, 364, 365, -1, -1, -1, + -1, 370, 51, -1, 53, -1, -1, 376, -1, 378, + -1, 380, 381, 382, -1, -1, 65, 3, 4, 388, + -1, 7, -1, 1023, -1, 394, 75, -1, 397, -1, + -1, -1, -1, 436, 83, -1, -1, 1026, -1, 88, + -1, -1, -1, -1, -1, -1, -1, 416, 417, -1, + 419, 1040, -1, 4, -1, 41, 1045, -1, 1047, -1, + -1, 4, 5, 6, 7, 51, -1, 53, 1068, 12, + -1, -1, -1, 24, 25, -1, 27, -1, -1, 65, + -1, -1, 33, -1, 27, -1, -1, -1, 31, 75, + -1, -1, 35, 44, -1, 46, -1, 83, -1, 502, + -1, -1, 88, -1, -1, -1, -1, -1, 51, 512, + 53, 514, 515, 3, 4, 5, 6, 7, -1, 1108, + 10, -1, 12, -1, -1, -1, -1, -1, -1, -1, + -1, 1120, 1121, -1, -1, -1, -1, 27, -1, 1128, + 1129, 31, -1, 512, 95, 35, -1, -1, -1, -1, + 101, 41, -1, 556, 105, 524, -1, 108, 109, 110, + 1149, 51, -1, 53, -1, -1, -1, -1, -1, 120, + -1, 122, 123, -1, -1, 65, 4, 5, 6, 7, + -1, 1170, 10, -1, 12, 75, 555, -1, -1, 140, + 141, 142, -1, 83, -1, -1, -1, -1, 88, 27, + -1, -1, 27, 31, -1, 1194, -1, 35, -1, -1, + -1, -1, 1201, 1202, -1, 166, 1205, -1, -1, 44, + -1, 1210, -1, 51, -1, 53, 3, 4, 5, 6, + 7, -1, -1, 184, -1, 12, -1, -1, 607, 608, + 609, -1, -1, 194, -1, -1, 615, -1, -1, -1, + 27, -1, -1, -1, 31, -1, -1, -1, 35, -1, + -1, -1, 631, 632, 41, 634, -1, 44, -1, -1, + 95, -1, -1, -1, 51, -1, 53, -1, -1, 682, + 1269, 1270, 1271, 108, 109, 110, -1, -1, 65, 692, + 693, 694, -1, -1, 663, -1, -1, 122, 75, -1, + -1, -1, -1, -1, -1, -1, 83, -1, 85, -1, + -1, 88, 89, -1, -1, 140, 141, 142, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 697, -1, + 3, 4, -1, -1, 285, 286, -1, -1, -1, -1, + -1, 166, -1, -1, -1, -1, -1, 1336, -1, -1, + -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, + 7, -1, -1, 314, -1, 12, 317, -1, 41, -1, + 773, 322, 775, -1, -1, -1, -1, -1, 51, -1, + 53, -1, -1, 786, -1, -1, -1, 60, 35, -1, + 341, -1, 65, -1, 41, -1, -1, 44, -1, -1, + -1, -1, 75, -1, 51, -1, 53, 232, -1, -1, + 83, 362, 363, 364, 365, 88, -1, -1, 65, 370, + -1, 790, 791, 792, -1, 376, -1, 378, 75, 380, + 381, 382, -1, -1, -1, -1, 83, 388, 85, -1, + -1, 88, 89, 394, -1, -1, 397, -1, -1, -1, + -1, -1, -1, 278, 279, 280, -1, -1, -1, -1, + -1, 286, -1, -1, -1, 416, 417, -1, 419, -1, + -1, -1, 841, 842, 843, 844, 845, 880, 847, -1, + 849, 850, 851, 852, -1, -1, 3, 4, 5, 6, + 7, -1, -1, -1, -1, 12, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 877, -1, + 27, 880, -1, 882, 31, -1, -1, -1, 35, -1, + -1, -1, 925, 926, 41, 928, 895, 896, 897, -1, + -1, -1, -1, -1, 51, -1, 53, 362, -1, 364, + 365, 366, -1, 60, -1, -1, -1, -1, 65, -1, + -1, 376, -1, 378, -1, 380, 381, 382, 75, 4, + 5, 6, 7, 388, -1, 10, 83, 12, -1, 394, + -1, 88, 397, 524, -1, -1, -1, -1, -1, -1, + 949, -1, 27, -1, -1, -1, 31, -1, -1, 958, + 35, 416, -1, -1, 140, 141, 142, -1, -1, 44, + -1, -1, -1, -1, 555, -1, 51, -1, 53, -1, + -1, -1, -1, 3, 4, -1, -1, 7, -1, -1, + 65, 990, 991, 992, 3, 4, -1, -1, 7, -1, + 75, -1, -1, -1, -1, 1004, 1005, 44, 1007, -1, + 85, -1, -1, 88, 89, -1, -1, -1, 93, -1, + -1, 41, -1, -1, -1, -1, 607, 608, 609, 66, + -1, 51, 41, 53, 615, -1, 1035, -1, -1, -1, + -1, -1, 51, -1, 53, 65, -1, 502, 85, -1, + 631, 632, -1, 634, -1, 75, 65, -1, 95, 514, + 515, -1, 517, 83, -1, -1, 75, -1, 88, 524, + -1, -1, -1, -1, 83, -1, -1, -1, -1, 88, + -1, -1, 663, -1, -1, 122, -1, -1, -1, -1, + -1, -1, -1, 3, 4, -1, 6, 7, 8, 9, + 555, 11, 12, 140, 141, 142, -1, -1, -1, 1108, + -1, -1, -1, 150, -1, -1, 697, 27, 28, 29, + 30, 31, -1, 33, -1, 35, -1, 37, 38, 166, + 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, + 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, 607, 608, 609, -1, -1, -1, -1, 196, + 615, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 81, 82, 83, 3, 4, 631, 632, 88, 634, + -1, -1, 92, -1, 1183, 1184, 1185, -1, -1, -1, + -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, + 376, -1, 378, -1, 380, 381, 382, -1, 663, 790, + 791, 792, 41, -1, -1, -1, -1, 798, 394, -1, + -1, -1, 51, -1, 53, -1, -1, 682, 1227, -1, + -1, -1, -1, -1, -1, -1, 65, 692, 693, 694, + 416, -1, 823, -1, -1, -1, 75, 284, -1, 286, + -1, -1, -1, -1, 83, -1, -1, -1, -1, 88, + 841, 842, 843, 844, 845, -1, -1, -1, 849, 850, + 851, 852, -1, -1, -1, -1, -1, 4, -1, 6, + 7, -1, -1, -1, -1, 12, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 877, -1, -1, 880, + 27, 882, -1, -1, 31, -1, -1, -1, 35, -1, + -1, -1, -1, -1, 895, 896, 897, 44, 773, -1, + 775, -1, -1, -1, 51, 362, 53, 364, 365, -1, + -1, 786, -1, -1, -1, 790, 791, 792, 65, 376, + -1, 378, -1, 380, 381, 382, -1, -1, 75, -1, + -1, 388, -1, -1, 278, 279, 280, 394, 85, -1, + 397, 88, 89, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 958, -1, 416, + -1, -1, -1, -1, -1, 4, 841, 842, 843, 844, + 845, -1, -1, -1, 849, 850, 851, 852, -1, -1, + -1, -1, -1, -1, -1, 24, 25, -1, -1, 990, + 991, 992, 3, 4, 33, -1, 7, -1, -1, -1, + -1, -1, 877, 1004, 1005, -1, 1007, 46, -1, -1, + -1, 607, 608, 609, -1, -1, -1, -1, 362, 615, + 364, 365, 366, 3, 4, -1, -1, 7, -1, -1, + 41, -1, -1, -1, 1035, 631, 632, -1, 634, -1, + 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, + 925, 926, -1, 928, 65, -1, -1, -1, -1, -1, + -1, 41, 101, -1, 75, -1, 105, 663, -1, -1, + 527, 51, 83, 53, -1, -1, -1, 88, -1, -1, + -1, 120, -1, -1, 123, 65, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 75, -1, -1, 555, -1, + -1, 140, 141, 83, -1, -1, -1, 1108, 88, -1, + -1, -1, -1, -1, -1, 990, -1, 992, -1, 3, + 4, 278, 279, 280, -1, -1, -1, -1, -1, 1004, + 1005, -1, 1007, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, 6, 7, 184, -1, -1, -1, 12, + 607, 608, 609, -1, -1, 194, -1, 41, 615, -1, + -1, -1, -1, -1, 27, -1, -1, 51, 31, 53, + 514, 515, 35, 517, 631, 632, -1, 634, 41, -1, + 524, 65, 1183, 1184, 1185, -1, -1, -1, 51, -1, + 53, 75, -1, 56, -1, -1, -1, -1, -1, 83, + -1, -1, 65, -1, 88, 362, 663, 364, 365, 366, + -1, 555, 75, -1, -1, -1, -1, -1, -1, -1, + 83, -1, -1, -1, -1, 88, 1227, -1, -1, -1, + -1, -1, -1, 1108, -1, -1, -1, 10, -1, -1, + -1, -1, -1, -1, -1, 841, 842, 843, 844, 845, + -1, -1, -1, 849, 850, 851, 852, -1, -1, -1, + -1, -1, -1, 607, 608, 609, -1, -1, -1, -1, + -1, 615, -1, -1, -1, 314, -1, -1, 317, -1, + -1, 877, -1, 322, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, -1, -1, 81, 82, - 83, -1, -1, 86, -1, -1, 89, 833, 834, 835, - 836, -1, 838, -1, 840, 841, 842, 843, -1, -1, - -1, 104, -1, -1, 95, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 108, 109, -1, - -1, -1, -1, 869, 284, 285, 872, -1, 874, -1, - 121, -1, -1, -1, 3, 4, 5, 6, 7, -1, - -1, 887, 888, 12, -1, -1, -1, -1, 139, 140, - 141, -1, 312, -1, -1, 315, -1, -1, 27, 319, - -1, -1, 31, -1, -1, -1, 35, -1, -1, -1, - -1, -1, 41, -1, 165, 44, -1, -1, 338, -1, - -1, -1, 51, -1, 53, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 941, 65, -1, -1, 359, - 360, 361, 362, 949, -1, -1, 75, 367, -1, -1, - -1, -1, -1, 373, 83, 375, 85, 377, 378, 88, - 89, -1, -1, -1, 384, -1, -1, -1, -1, -1, - 390, -1, -1, 393, 980, 981, 982, -1, -1, -1, - 231, -1, -1, -1, -1, -1, -1, -1, 994, 995, - -1, 997, 412, 413, -1, 415, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3, 4, - 12, 6, 7, 8, 9, -1, 11, 12, -1, -1, - 1026, -1, 24, 25, -1, 27, 277, 278, 279, -1, - -1, -1, 27, 28, 285, -1, 31, -1, 33, -1, - 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, - 52, 46, 47, 48, 49, 50, 51, -1, 53, -1, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, - 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, - -1, -1, 1098, 88, -1, -1, -1, -1, -1, 101, - 520, 103, 104, 105, -1, -1, 108, 109, 359, 104, - 361, 362, 363, -1, 3, 4, 5, 6, 7, -1, - -1, -1, 373, 12, 375, -1, 377, 378, -1, -1, - 550, -1, -1, 384, -1, -1, -1, -1, -1, 390, - -1, -1, 393, -1, 44, -1, 35, -1, -1, -1, - -1, -1, 41, -1, -1, 44, -1, -1, -1, -1, - -1, 412, 51, -1, 53, -1, 66, 1173, 1174, 1175, - -1, -1, -1, -1, -1, -1, 65, -1, -1, -1, - 600, 601, 602, -1, -1, 85, 75, -1, 608, -1, - -1, 193, -1, -1, 83, 95, 85, -1, -1, 88, - 89, -1, -1, -1, 624, 625, 4, 627, 6, 7, - -1, 1217, -1, -1, 12, -1, 3, 4, -1, -1, - 7, 121, -1, -1, -1, 4, 5, 6, 7, 231, - -1, 10, -1, 12, -1, -1, 656, 35, -1, 139, - 140, 141, -1, -1, 3, 4, 44, 498, 27, 149, - -1, -1, 31, 51, 41, 53, 35, -1, -1, 510, - 511, -1, 513, -1, 51, 165, 53, 65, -1, 520, - 690, -1, 51, 275, 53, 277, 278, 75, 65, -1, - 3, 4, 41, -1, -1, -1, -1, 85, 75, -1, - 88, 89, 51, -1, 53, 195, 83, 56, -1, 550, - -1, 88, -1, -1, 306, -1, 65, -1, -1, -1, - 312, -1, -1, 315, -1, -1, 75, 319, 41, -1, - -1, -1, -1, -1, 83, -1, -1, -1, 51, 88, - 53, 4, 5, 6, 7, -1, -1, -1, -1, 12, - -1, -1, 65, -1, -1, -1, -1, -1, -1, 600, - 601, 602, 75, -1, 27, -1, -1, 608, 31, -1, - 83, -1, 35, 783, 784, 88, -1, -1, -1, -1, - -1, 791, -1, 624, 625, -1, 627, -1, 51, -1, - 53, -1, -1, 283, -1, 285, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 815, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 656, -1, -1, -1, -1, - -1, -1, -1, 833, 834, 835, 836, -1, -1, -1, - 840, 841, 842, 843, 675, -1, -1, -1, -1, -1, - 432, -1, -1, -1, 685, 686, 687, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 869, - -1, -1, 872, -1, 874, -1, -1, -1, -1, 359, - -1, 361, 362, -1, -1, -1, -1, 887, 888, 277, - 278, 279, -1, 373, -1, 375, -1, 377, 378, -1, - -1, -1, -1, -1, 384, -1, -1, -1, -1, -1, - 390, -1, -1, 393, -1, -1, 498, -1, -1, -1, - -1, -1, 4, -1, -1, -1, 508, -1, 510, 511, - -1, -1, 412, -1, -1, 766, -1, 768, -1, -1, - -1, -1, 24, 25, -1, -1, -1, -1, 779, 949, - -1, 33, 783, 784, 785, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, 551, - -1, 359, -1, 361, 362, 363, -1, -1, -1, -1, - 980, 981, 982, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 994, 995, -1, 997, 4, 5, - 6, 7, 833, 834, 835, 836, 12, -1, -1, 840, - 841, 842, 843, -1, -1, -1, -1, -1, -1, 101, - -1, 27, -1, 105, -1, 31, 1026, -1, -1, 35, - -1, -1, -1, -1, -1, -1, -1, 119, 869, -1, - 122, -1, -1, 523, -1, 51, -1, 53, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 139, 140, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 550, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 916, 917, -1, 919, -1, - -1, -1, -1, 675, -1, -1, -1, -1, 1098, -1, - -1, 183, -1, 685, 686, 687, 937, 938, -1, -1, - -1, 193, -1, -1, -1, -1, -1, -1, -1, -1, - 600, 601, 602, 511, -1, 513, -1, -1, 608, -1, - -1, -1, 520, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 624, 625, -1, 627, -1, 980, - -1, 982, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 550, 994, 995, -1, 997, -1, -1, -1, - -1, -1, -1, 1173, 1174, 1175, 656, -1, -1, -1, - -1, -1, -1, -1, 766, -1, 768, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 779, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 601, 602, -1, -1, 1217, 3, 4, - 608, 6, 7, 8, 9, -1, 11, 12, -1, -1, - 312, -1, -1, 315, -1, -1, -1, 319, -1, -1, - -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, - 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, - -1, 46, 47, 48, 49, 50, 51, 1098, 53, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 360, -1, - -1, -1, -1, -1, -1, 367, -1, 675, -1, -1, - 872, 373, -1, 375, -1, -1, 81, 82, 83, -1, - -1, -1, -1, 88, -1, -1, -1, 92, 390, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, + 73, 74, 75, 76, 77, 78, 79, -1, 1183, 1184, + 1185, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 363, -1, -1, -1, -1, -1, + -1, 370, -1, -1, -1, -1, -1, 376, 682, 378, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 412, 413, -1, 415, 916, 917, -1, 919, -1, -1, - -1, -1, 1173, 1174, 1175, -1, -1, -1, -1, -1, - -1, -1, -1, 833, 834, 835, 836, -1, 838, -1, - 840, 841, 842, 843, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 766, -1, - 768, -1, -1, -1, -1, -1, 1217, -1, -1, 869, - -1, 779, -1, -1, -1, -1, 784, 785, -1, -1, - -1, 3, 4, 5, 6, 7, -1, -1, 10, -1, - 12, -1, 3, 4, 5, 6, 7, -1, -1, -1, - -1, 12, -1, -1, -1, 27, -1, -1, -1, 31, - -1, -1, -1, 35, -1, -1, 27, -1, -1, 41, - 31, -1, -1, -1, 35, 833, 834, -1, 836, 51, - 41, 53, 840, -1, 842, 843, -1, -1, -1, -1, - 51, 941, 53, 65, -1, 56, -1, -1, -1, -1, - -1, -1, -1, 75, 65, -1, -1, -1, -1, -1, - -1, 83, -1, -1, 75, -1, 88, -1, -1, -1, - -1, 93, 83, -1, -1, -1, -1, 88, -1, -1, - 980, -1, 982, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 994, 995, -1, 997, 600, 601, - 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, + -1, -1, 1227, -1, -1, 394, -1, 514, 515, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 416, 417, -1, + 419, -1, -1, -1, 841, 842, 843, 844, 845, -1, + 847, -1, 849, 850, 851, 852, -1, -1, 555, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1004, 1005, + -1, 1007, -1, -1, -1, -1, -1, -1, -1, -1, + 877, -1, -1, -1, -1, -1, -1, -1, -1, 773, + -1, 775, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 786, -1, -1, -1, 790, 791, 792, -1, + 607, 608, -1, -1, 57, 58, 59, -1, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 949, -1, -1, -1, -1, 841, 842, 843, + 844, 845, 105, -1, -1, 849, 850, 851, 852, -1, + -1, -1, 1108, -1, 3, 4, 5, 6, 7, -1, + -1, 10, -1, 12, -1, 682, -1, -1, -1, -1, + -1, -1, -1, 990, -1, 992, -1, -1, 27, -1, + -1, -1, 31, -1, -1, -1, 35, 1004, 1005, -1, + 1007, -1, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, 51, -1, 53, -1, -1, -1, 607, 608, + -1, -1, -1, -1, -1, -1, 65, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 75, 1183, 1184, 1185, + -1, -1, 631, 632, 83, 634, 85, -1, -1, 88, + 89, -1, -1, -1, 93, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 773, -1, 775, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 786, + -1, -1, -1, 790, 791, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, -1, 624, 625, -1, 627, -1, -1, -1, 1, - 938, 3, 4, 5, 6, 7, 8, 9, -1, 11, - 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, 56, -1, 994, 995, -1, 997, - 62, -1, -1, 65, -1, -1, -1, -1, 1098, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, 90, 1, - 92, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 103, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, 1173, 1174, 1175, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, 10, -1, -1, -1, -1, 81, - 82, 83, -1, 85, -1, -1, 88, 89, -1, -1, - 92, 93, -1, -1, -1, -1, -1, 1217, -1, -1, - -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, 833, 834, -1, -1, -1, -1, -1, 840, -1, - -1, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, -1, -1, -1, 869, -1, -1, - 872, 1, 874, 3, 4, 5, 6, 7, 8, 9, + 79, 1108, -1, -1, -1, -1, -1, -1, -1, -1, + 1004, 1005, -1, 1007, -1, -1, -1, -1, -1, -1, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 841, 842, 843, 844, -1, -1, + -1, -1, 849, 850, 851, 57, 58, 59, -1, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, -1, -1, + -1, -1, -1, -1, -1, -1, 1183, 1184, 1185, -1, + -1, -1, 1, -1, 3, 4, 5, 6, 7, 8, + 9, -1, 11, 12, 13, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, + 1227, 40, 41, 42, 43, -1, -1, 46, 47, 48, + 49, 50, 51, -1, 53, 54, -1, 56, -1, -1, + -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, + -1, -1, 841, 842, 73, 74, 75, -1, -1, -1, + 849, -1, 81, 82, 83, -1, -1, -1, -1, 88, + -1, 90, -1, 92, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 103, 104, -1, -1, 877, -1, + -1, 880, -1, 882, -1, -1, -1, 1004, 1005, -1, + 1007, 1, -1, 3, 4, 5, 6, 7, 8, 9, -1, 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, -1, -1, - -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, - -1, -1, -1, 73, 74, 75, -1, 949, -1, -1, + -1, -1, 62, -1, -1, 65, -1, -1, -1, 958, + -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, 90, -1, 92, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 103, 104, -1, -1, -1, -1, 981, + -1, -1, 991, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1004, 1005, -1, 1007, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 994, 995, -1, 997, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1, -1, 3, 4, 5, 6, 7, 8, 9, - -1, 11, 12, 13, 1026, 15, 16, 17, 18, 19, + -1, -1, -1, 1, -1, 3, 4, 5, 6, 7, + 8, 9, -1, 11, 12, 13, 1035, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, + -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, + -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + 88, -1, 90, -1, 92, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 103, 104, 1, -1, 3, + 4, 5, 6, 7, 8, 9, -1, 11, 12, 13, + -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, -1, 33, + -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, + -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, + 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, + -1, -1, -1, -1, 88, -1, 90, -1, 92, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, + 104, 1, -1, 3, 4, 5, 6, 7, 8, 9, + -1, 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, @@ -2732,169 +2757,57 @@ static const short yycheck[] = { 4, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, - -1, -1, 88, -1, 90, -1, 92, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 103, 104, 1, - -1, 3, 4, 5, 6, 7, 8, 9, -1, 11, - 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, 56, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, 90, -1, - 92, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 103, 104, 1, -1, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, - -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, - -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, 1, 92, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, 104, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, - -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, - -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, 1, 92, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, 104, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, - -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, - -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, 1, 92, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, -1, 104, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, - 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, - -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, - -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, 85, -1, -1, - 88, 89, -1, -1, 92, 93, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1, 104, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, + -1, -1, 88, -1, 90, 1, 92, 3, 4, 5, + 6, 7, 8, 9, -1, 11, 12, 13, 104, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, -1, 33, -1, 35, + -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, + 46, 47, 48, 49, 50, 51, -1, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, + -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, + -1, -1, 88, -1, 90, 1, 92, 3, 4, 5, + 6, 7, 8, 9, -1, 11, 12, 13, 104, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, -1, 33, -1, 35, + -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, + 46, 47, 48, 49, 50, 51, -1, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, + -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, + -1, -1, 88, -1, 90, 1, 92, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, - -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, - 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, + -1, 37, 38, -1, 40, 41, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, - -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, - -1, -1, 88, -1, -1, -1, 92, 93, -1, -1, - -1, -1, -1, -1, -1, -1, 102, 1, 104, 3, + -1, -1, -1, -1, -1, 81, 82, 83, -1, 85, + -1, -1, 88, 89, -1, -1, 92, 93, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1, 104, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, - -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, - -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, + 44, -1, 46, 47, 48, 49, 50, 51, -1, 53, + 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, - -1, -1, -1, -1, 88, -1, -1, -1, 92, 93, - -1, -1, -1, -1, -1, -1, -1, -1, 102, 1, - 104, 3, 4, -1, 6, 7, 8, 9, -1, 11, + -1, 85, -1, -1, 88, 89, -1, -1, 92, 93, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + 104, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, 89, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, 103, 104, -1, -1, -1, -1, 19, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, 103, 104, -1, -1, -1, -1, 19, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, 5, 6, 7, 8, 9, -1, 11, - 12, 103, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, 56, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, -1, -1, -1, -1, -1, -1, 60, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, - -1, 53, -1, -1, 56, -1, -1, -1, -1, -1, - 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, - -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, - 82, 83, -1, -1, -1, -1, 88, -1, -1, 1, - 92, 3, 4, -1, 6, 7, 8, 9, -1, 11, - 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, - 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, -1, -1, - 92, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 102, 1, 104, 3, 4, -1, 6, 7, 8, 9, - -1, 11, 12, -1, -1, -1, -1, -1, -1, -1, + 92, 93, -1, -1, -1, -1, -1, -1, -1, -1, + 102, 1, 104, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, @@ -2902,91 +2815,210 @@ static const short yycheck[] = { 4, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, - -1, 1, 92, 3, 4, -1, 6, 7, 8, 9, - -1, 11, 12, -1, 104, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, - 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, - 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, - 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, - -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, - -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, - 3, 4, 92, 6, 7, 8, 9, -1, 11, 12, - -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, - 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, - 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, - 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, - -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, - 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, - 83, -1, -1, -1, -1, 88, -1, -1, -1, 92, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 104, 105, 3, 4, 5, 6, 7, 8, 9, - -1, 11, 12, 13, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, - 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, - 50, 51, -1, 53, 54, -1, 56, -1, -1, -1, - -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, - -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, - -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, - 90, -1, 92, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 103, 104, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, 92, 93, -1, -1, -1, -1, -1, -1, + -1, -1, 102, 1, 104, 3, 4, -1, 6, 7, + 8, 9, -1, 11, 12, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, + 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, -1, 92, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, 104, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 88, 89, -1, 1, 92, 3, 4, -1, 6, 7, + 8, 9, -1, 11, 12, 103, 104, -1, -1, -1, + -1, 19, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, + 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, -1, 92, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, 104, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 88, -1, -1, 1, 92, 3, 4, -1, 6, 7, + 8, 9, -1, 11, 12, 103, 104, -1, -1, -1, + -1, 19, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, -1, -1, 56, -1, + 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, -1, 90, -1, 92, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, -1, 104, -1, -1, -1, + 88, -1, -1, 1, 92, 3, 4, 5, 6, 7, + 8, 9, -1, 11, 12, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, -1, 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, 85, -1, -1, - 88, 89, -1, -1, 92, 93, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 104, -1, -1, -1, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + 88, -1, -1, 1, 92, 3, 4, -1, 6, 7, + 8, 9, -1, 11, 12, -1, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, + 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, -1, 53, 54, -1, -1, -1, + -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, + -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + 88, 89, 1, -1, 92, 4, -1, 6, 7, -1, + -1, -1, -1, 12, -1, -1, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, + -1, -1, 31, -1, -1, -1, 35, -1, 37, 38, + -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, + -1, -1, 51, -1, 53, -1, 55, -1, 57, 58, + 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + -1, -1, 81, 82, 83, -1, 1, 86, 3, 4, + 89, 6, 7, 8, 9, -1, 11, 12, -1, -1, + -1, -1, -1, -1, -1, 104, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, 54, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, - 37, 38, -1, 40, 41, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, -1, 53, -1, -1, -1, - -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, - -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, - -1, -1, -1, -1, 81, 82, 83, -1, 85, -1, - -1, 88, 89, -1, -1, 92, 93, 3, 4, -1, - 6, 7, 8, 9, -1, 11, 12, 104, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, 54, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, + -1, -1, -1, -1, -1, 60, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, 54, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, 54, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, 1, 92, 3, 4, + -1, 6, 7, 8, 9, -1, 11, 12, -1, 104, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, + 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, + -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, 88, -1, -1, -1, 92, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 102, 1, 104, + 3, 4, -1, 6, 7, 8, 9, -1, 11, 12, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, + 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, + 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, + -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, + 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, 88, -1, -1, 1, 92, + 3, 4, -1, 6, 7, 8, 9, -1, 11, 12, + -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, + 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, + 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, + -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, + 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, 88, -1, 3, 4, 92, + 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, + -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, - -1, 37, 38, -1, 40, 41, 42, 43, 44, -1, + -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, - -1, -1, -1, -1, -1, 81, 82, 83, -1, 85, - -1, -1, 88, 89, 3, 4, -1, 6, 7, 8, - 9, -1, 11, 12, -1, -1, -1, -1, 104, -1, + -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, + -1, -1, 88, -1, -1, -1, 92, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 104, 105, + 3, 4, 5, 6, 7, 8, 9, -1, 11, 12, + 13, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, -1, + 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, + 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, + -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, + 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, 88, -1, 90, -1, 92, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 103, 104, 3, 4, 5, 6, 7, 8, 9, -1, + 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, + 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, + 51, -1, 53, 54, -1, 56, -1, -1, -1, -1, + -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, + -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, + 81, 82, 83, -1, -1, -1, -1, 88, -1, 90, + -1, 92, 3, 4, 5, 6, 7, 8, 9, -1, + 11, 12, 13, 104, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, + 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, + 51, -1, 53, 54, -1, 56, -1, -1, -1, -1, + -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, + -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, + 81, 82, 83, -1, -1, -1, -1, 88, -1, 90, + -1, 92, 3, 4, 5, 6, 7, 8, 9, -1, + 11, 12, 13, 104, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, + 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, + 51, -1, 53, -1, -1, 56, -1, -1, -1, -1, + -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, + -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, + 81, 82, 83, -1, -1, -1, -1, 88, -1, 90, + -1, 92, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, -1, 104, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, + 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, + 41, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, + -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, + -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, + 81, 82, 83, -1, 85, -1, -1, 88, 89, -1, + -1, 92, 93, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 104, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, + 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, + 40, 41, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, + -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, + -1, 81, 82, 83, -1, 85, -1, -1, 88, 89, + -1, -1, 92, 93, 3, 4, -1, 6, 7, 8, + 9, -1, 11, 12, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, 44, -1, 46, 47, 48, @@ -3008,15 +3040,15 @@ static const short yycheck[] = { 4, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 65, -1, -1, -1, -1, 70, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, 88, -1, 3, 4, 92, 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, + 48, 49, 50, 51, -1, 53, -1, -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, @@ -3025,28 +3057,28 @@ static const short yycheck[] = { 4, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, - 51, -1, 53, 54, -1, -1, -1, -1, -1, -1, + 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, - 81, 82, 83, -1, -1, 3, 4, 88, 6, 7, - 8, 9, -1, 11, 12, -1, -1, -1, -1, -1, - -1, -1, -1, 104, -1, -1, -1, -1, -1, 27, - 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, - 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, - 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, - -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, - -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, - -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, - 88, 89, 3, 4, -1, 6, 7, 8, 9, -1, - 11, 12, -1, -1, -1, -1, 104, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, + 81, 82, 83, -1, -1, -1, -1, 88, -1, 3, + 4, 92, 6, 7, 8, 9, -1, 11, 12, -1, + -1, -1, -1, 104, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, + -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, + -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, + 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, + -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, + 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, + -1, -1, 3, 4, 88, 6, 7, 8, 9, -1, + 11, 12, -1, -1, -1, -1, -1, -1, -1, -1, + 104, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, - 81, 82, 83, -1, -1, -1, -1, 88, -1, 3, - 4, 92, 6, 7, 8, 9, -1, 11, 12, -1, + 81, 82, 83, -1, -1, -1, -1, 88, 89, 3, + 4, -1, 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, @@ -3089,6 +3121,23 @@ static const short yycheck[] = { 4, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, + -1, -1, 88, -1, 3, 4, 92, 6, 7, 8, + 9, -1, 11, 12, -1, -1, -1, -1, 104, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, + 29, 30, 31, -1, 33, -1, 35, -1, 37, 38, + -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, + 49, 50, 51, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, + -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, + -1, -1, 81, 82, 83, -1, -1, 3, 4, 88, + 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, + -1, -1, -1, -1, -1, 104, -1, -1, -1, -1, + -1, 27, 28, 29, 30, 31, -1, 33, -1, 35, + -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, + 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, + -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, + -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, + -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, 3, 4, 88, 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, -1, @@ -3099,8 +3148,8 @@ static const short yycheck[] = { 4, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, 3, 4, 88, 6, 7, 8, 9, -1, 11, 12, -1, -1, -1, -1, -1, -1, -1, - -1, 104, -1, -1, -1, -1, -1, 27, 28, 29, - 30, 31, -1, 33, -1, 35, -1, 37, 38, -1, + -1, 104, -1, -1, -1, -1, -1, 27, 28, -1, + -1, 31, -1, 33, -1, 35, -1, 37, 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, 51, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, @@ -3114,47 +3163,23 @@ static const short yycheck[] = { 4, -1, -1, -1, -1, -1, 62, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, - -1, 88, 3, 4, 5, 6, 7, -1, -1, 10, - -1, 12, -1, -1, -1, -1, -1, 104, -1, 3, - 4, 5, 6, 7, -1, -1, 27, -1, 12, -1, - 31, -1, -1, -1, 35, -1, -1, -1, -1, -1, - 41, -1, -1, 27, -1, -1, -1, 31, -1, -1, - 51, 35, 53, -1, -1, -1, -1, 41, -1, -1, - -1, -1, -1, -1, 65, -1, -1, 51, -1, 53, - -1, -1, -1, -1, 75, -1, 60, -1, -1, -1, - -1, 65, 83, -1, -1, -1, -1, 88, -1, -1, - -1, 75, 3, 4, 5, 6, 7, -1, -1, 83, - -1, 12, -1, -1, 88, -1, -1, -1, -1, 3, - 4, 5, 6, 7, -1, -1, 27, -1, 12, -1, - 31, -1, -1, -1, 35, -1, -1, -1, -1, -1, - 41, -1, -1, 27, -1, -1, -1, 31, -1, -1, - 51, 35, 53, -1, -1, 56, -1, 41, -1, -1, - -1, -1, -1, -1, 65, -1, -1, 51, -1, 53, - -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, - -1, 65, 83, -1, -1, -1, -1, 88, -1, -1, - -1, 75, -1, -1, -1, -1, -1, -1, -1, 83, - 32, 57, 58, 59, 88, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, -1, 57, 58, 59, -1, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 55, 105, - 57, 58, 59, -1, 61, 62, 63, 64, 65, 66, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, -1, 57, 58, 59, 104, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 57, 58, 59, 60, 61, 62, 63, + 77, 78, 79, 57, 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 57, - 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 57, 58, 59, -1, 61, 62, 63, 64, - 65, 66, 67, 68, 69, -1, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 63, 64, 65, 66, 67, 68, 69, + 74, 75, 76, 77, 78, 79, 57, 58, 59, -1, + 61, 62, 63, 64, 65, 66, 67, 68, 69, -1, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 59, + -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79 + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/lib/bison.simple" @@ -3637,7 +3662,7 @@ yyreduce: switch (yyn) { case 2: -#line 293 "parse.y" +#line 294 "parse.y" { /* In case there were missing closebraces, get us back to the global binding level. */ @@ -3647,138 +3672,140 @@ case 2: ; break;} case 3: -#line 307 "parse.y" +#line 308 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 4: -#line 308 "parse.y" +#line 309 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 5: -#line 310 "parse.y" +#line 311 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 6: -#line 314 "parse.y" +#line 315 "parse.y" { have_extern_spec = 1; used_extern_spec = 0; yyval.ttype = NULL_TREE; ; break;} case 7: -#line 319 "parse.y" +#line 320 "parse.y" { have_extern_spec = 0; ; break;} case 10: -#line 328 "parse.y" +#line 329 "parse.y" { if (pending_lang_change) do_pending_lang_change(); ; break;} case 11: -#line 330 "parse.y" +#line 331 "parse.y" { if (! global_bindings_p () && ! pseudo_global_level_p()) pop_everything (); ; break;} case 12: -#line 336 "parse.y" +#line 337 "parse.y" { if (pending_inlines) do_pending_inlines (); ; break;} case 13: -#line 338 "parse.y" +#line 339 "parse.y" { if (pending_inlines) do_pending_inlines (); ; break;} case 14: -#line 340 "parse.y" +#line 341 "parse.y" { if (pending_inlines) do_pending_inlines (); ; break;} case 16: -#line 343 "parse.y" +#line 344 "parse.y" { if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); assemble_asm (yyvsp[-2].ttype); ; break;} case 17: -#line 346 "parse.y" +#line 347 "parse.y" { pop_lang_context (); ; break;} case 18: -#line 348 "parse.y" +#line 349 "parse.y" { pop_lang_context (); ; break;} case 19: -#line 350 "parse.y" +#line 351 "parse.y" { if (pending_inlines) do_pending_inlines (); pop_lang_context (); ; break;} case 20: -#line 353 "parse.y" +#line 354 "parse.y" { if (pending_inlines) do_pending_inlines (); pop_lang_context (); ; break;} case 21: -#line 359 "parse.y" +#line 360 "parse.y" { push_lang_context (yyvsp[0].ttype); ; break;} case 22: -#line 364 "parse.y" +#line 365 "parse.y" { begin_template_parm_list (); ; break;} case 23: -#line 366 "parse.y" +#line 367 "parse.y" { yyval.ttype = end_template_parm_list (yyvsp[-1].ttype); ; break;} case 24: -#line 371 "parse.y" +#line 372 "parse.y" { yyval.ttype = process_template_parm (NULL_TREE, yyvsp[0].ttype); ; break;} case 25: -#line 373 "parse.y" +#line 374 "parse.y" { yyval.ttype = process_template_parm (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 26: -#line 385 "parse.y" -{ - if (yyvsp[-1].ttype == signature_type_node) - sorry ("signature as template type parameter"); - else if (yyvsp[-1].ttype != class_type_node) - error ("template type parameter must use keyword `class'"); +#line 379 "parse.y" +{ yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); + ttpa: + if (TREE_PURPOSE (yyval.ttype) == signature_type_node) + sorry ("signature as template type parameter"); + else if (TREE_PURPOSE (yyval.ttype) != class_type_node) + pedwarn ("template type parameters must use the keyword `class'"); ; break;} case 27: -#line 393 "parse.y" -{ - if (yyvsp[-3].ttype == signature_type_node) - sorry ("signature as template type parameter"); - else if (yyvsp[-3].ttype != class_type_node) - error ("template type parameter must use keyword `class'"); - warning ("restricted template type parameters not yet implemented"); - yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); - ; +#line 388 "parse.y" +{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); goto ttpa; ; break;} -case 29: -#line 406 "parse.y" -{ warning ("use of `overload' is an anachronism"); ; +case 28: +#line 400 "parse.y" +{ yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 30: -#line 410 "parse.y" -{ declare_overloaded (yyvsp[0].ttype); ; +case 29: +#line 402 "parse.y" +{ yyval.ttype = build_tree_list (yyvsp[0].ttype, yyval.ttype); ; break;} case 31: +#line 408 "parse.y" +{ warning ("use of `overload' is an anachronism"); ; + break;} +case 32: #line 412 "parse.y" { declare_overloaded (yyvsp[0].ttype); ; break;} -case 32: -#line 419 "parse.y" -{ yychar = '{'; goto template1; ; +case 33: +#line 414 "parse.y" +{ declare_overloaded (yyvsp[0].ttype); ; break;} case 34: -#line 422 "parse.y" +#line 421 "parse.y" { yychar = '{'; goto template1; ; break;} case 36: -#line 425 "parse.y" -{ yychar = ':'; goto template1; ; +#line 424 "parse.y" +{ yychar = '{'; goto template1; ; break;} case 38: -#line 428 "parse.y" +#line 427 "parse.y" +{ yychar = ':'; goto template1; ; + break;} +case 40: +#line 430 "parse.y" { yychar = ':'; template1: @@ -3793,22 +3820,22 @@ case 38: yychar = YYEMPTY; ; break;} -case 40: -#line 443 "parse.y" +case 42: +#line 445 "parse.y" { end_template_decl (yyvsp[-2].ttype, yyvsp[-1].ttype, current_aggr, 0); /* declare $2 as template name with $1 parm list */ ; break;} -case 41: -#line 448 "parse.y" +case 43: +#line 450 "parse.y" { end_template_decl (yyvsp[-2].ttype, yyvsp[-1].ttype, current_aggr, 0); /* declare $2 as template name with $1 parm list */ ; break;} -case 42: -#line 455 "parse.y" +case 44: +#line 457 "parse.y" { tree d; int momentary; @@ -3824,8 +3851,8 @@ case 42: resume_momentary (momentary); ; break;} -case 43: -#line 472 "parse.y" +case 45: +#line 474 "parse.y" { tree d; int momentary; @@ -3847,8 +3874,8 @@ case 43: resume_momentary (momentary); ; break;} -case 44: -#line 493 "parse.y" +case 46: +#line 495 "parse.y" { int def = (yyvsp[0].itype != ';'); tree d = start_decl (yyvsp[-1].ttype, yyvsp[-2].ttype, 0, NULL_TREE); @@ -3858,69 +3885,69 @@ case 44: reinit_parse_for_template ((int) yyvsp[0].itype, yyvsp[-3].ttype, d); ; break;} -case 45: -#line 502 "parse.y" -{ end_template_decl (yyvsp[-2].ttype, 0, 0, 0); ; - break;} -case 46: -#line 503 "parse.y" -{ end_template_decl (yyvsp[-2].ttype, 0, 0, 0); ; - break;} case 47: -#line 506 "parse.y" -{ yyval.itype = '{'; ; +#line 504 "parse.y" +{ end_template_decl (yyvsp[-2].ttype, 0, 0, 0); ; break;} case 48: -#line 507 "parse.y" -{ yyval.itype = ':'; ; +#line 505 "parse.y" +{ end_template_decl (yyvsp[-2].ttype, 0, 0, 0); ; break;} case 49: #line 508 "parse.y" -{ yyval.itype = ';'; ; +{ yyval.itype = '{'; ; break;} case 50: #line 509 "parse.y" -{ yyval.itype = '='; ; +{ yyval.itype = ':'; ; break;} case 51: #line 510 "parse.y" -{ yyval.itype = RETURN; ; +{ yyval.itype = ';'; ; break;} case 52: -#line 515 "parse.y" -{; +#line 511 "parse.y" +{ yyval.itype = '='; ; break;} case 53: +#line 512 "parse.y" +{ yyval.itype = RETURN; ; + break;} +case 54: #line 517 "parse.y" {; break;} -case 54: -#line 520 "parse.y" +case 55: +#line 519 "parse.y" +{; + break;} +case 56: +#line 522 "parse.y" { tree d; d = start_decl (yyvsp[-1].ttype, yyval.ttype, 0, NULL_TREE); finish_decl (d, NULL_TREE, NULL_TREE, 0); ; break;} -case 55: -#line 525 "parse.y" +case 57: +#line 527 "parse.y" { note_list_got_semicolon (yyval.ttype); ; break;} -case 56: -#line 530 "parse.y" +case 58: +#line 532 "parse.y" { tree d; d = start_decl (yyvsp[-1].ttype, yyval.ttype, 0, NULL_TREE); finish_decl (d, NULL_TREE, NULL_TREE, 0); note_list_got_semicolon (yyval.ttype); ; break;} -case 57: -#line 536 "parse.y" +case 59: +#line 538 "parse.y" { pedwarn ("empty declaration"); ; break;} -case 59: -#line 539 "parse.y" +case 61: +#line 541 "parse.y" { tree t = yyval.ttype; shadow_tag (t); @@ -3940,8 +3967,8 @@ case 59: note_list_got_semicolon (yyval.ttype); ; break;} -case 63: -#line 564 "parse.y" +case 65: +#line 566 "parse.y" { finish_function (lineno, 1); /* finish_function performs these three statements: @@ -3955,8 +3982,8 @@ case 63: if (yyval.ttype) process_next_inline (yyval.ttype); ; break;} -case 64: -#line 577 "parse.y" +case 66: +#line 579 "parse.y" { finish_function (lineno, 1); /* finish_function performs these three statements: @@ -3970,61 +3997,61 @@ case 64: if (yyval.ttype) process_next_inline (yyval.ttype); ; break;} -case 65: -#line 590 "parse.y" +case 67: +#line 592 "parse.y" { finish_function (lineno, 0); if (yyval.ttype) process_next_inline (yyval.ttype); ; break;} -case 66: -#line 593 "parse.y" +case 68: +#line 595 "parse.y" { finish_function (lineno, 0); if (yyval.ttype) process_next_inline (yyval.ttype); ; break;} -case 67: -#line 596 "parse.y" +case 69: +#line 598 "parse.y" { finish_function (lineno, 0); if (yyval.ttype) process_next_inline (yyval.ttype); ; break;} -case 68: -#line 599 "parse.y" -{; - break;} -case 69: +case 70: #line 601 "parse.y" {; break;} -case 70: +case 71: #line 603 "parse.y" {; break;} -case 71: -#line 608 "parse.y" +case 72: +#line 605 "parse.y" +{; + break;} +case 73: +#line 610 "parse.y" { if (! start_function (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype, 0)) YYERROR1; reinit_parse_for_function (); yyval.ttype = NULL_TREE; ; break;} -case 72: -#line 613 "parse.y" +case 74: +#line 615 "parse.y" { if (! start_function (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype, 0)) YYERROR1; reinit_parse_for_function (); yyval.ttype = NULL_TREE; ; break;} -case 73: -#line 618 "parse.y" +case 75: +#line 620 "parse.y" { if (! start_function (NULL_TREE, yyval.ttype, yyvsp[0].ttype, 0)) YYERROR1; reinit_parse_for_function (); yyval.ttype = NULL_TREE; ; break;} -case 74: -#line 623 "parse.y" +case 76: +#line 625 "parse.y" { start_function (NULL_TREE, TREE_VALUE (yyval.ttype), NULL_TREE, 1); reinit_parse_for_function (); ; break;} -case 75: -#line 631 "parse.y" +case 77: +#line 633 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, TREE_VALUE (yyvsp[-5].ttype), yyvsp[-3].ttype, yyvsp[-1].ttype); yyval.ttype = start_method (TREE_CHAIN (yyvsp[-5].ttype), yyval.ttype, yyvsp[0].ttype); @@ -4035,8 +4062,8 @@ case 75: yychar = YYLEX; reinit_parse_for_method (yychar, yyval.ttype); ; break;} -case 76: -#line 641 "parse.y" +case 78: +#line 643 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, TREE_VALUE (yyvsp[-3].ttype), empty_parms (), yyvsp[-1].ttype); @@ -4044,44 +4071,44 @@ case 76: goto rest_of_mdef; ; break;} -case 77: -#line 648 "parse.y" -{ yyval.ttype = start_method (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); goto rest_of_mdef; ; - break;} -case 78: +case 79: #line 650 "parse.y" { yyval.ttype = start_method (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); goto rest_of_mdef; ; break;} -case 79: +case 80: #line 652 "parse.y" +{ yyval.ttype = start_method (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); goto rest_of_mdef; ; + break;} +case 81: +#line 654 "parse.y" { yyval.ttype = start_method (NULL_TREE, yyval.ttype, yyvsp[0].ttype); goto rest_of_mdef; ; break;} -case 80: -#line 656 "parse.y" +case 82: +#line 658 "parse.y" { if (! current_function_parms_stored) store_parm_decls (); yyval.ttype = yyvsp[0].ttype; ; break;} -case 81: -#line 664 "parse.y" +case 83: +#line 666 "parse.y" { store_return_init (yyval.ttype, NULL_TREE); ; break;} -case 82: -#line 666 "parse.y" +case 84: +#line 668 "parse.y" { store_return_init (yyval.ttype, yyvsp[0].ttype); ; break;} -case 83: -#line 668 "parse.y" +case 85: +#line 670 "parse.y" { store_return_init (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 84: -#line 670 "parse.y" +case 86: +#line 672 "parse.y" { store_return_init (yyval.ttype, NULL_TREE); ; break;} -case 85: -#line 675 "parse.y" +case 87: +#line 677 "parse.y" { if (yyvsp[0].itype == 0) error ("no base initializers given following ':'"); @@ -4092,8 +4119,8 @@ case 85: keep_next_level (); ; break;} -case 86: -#line 688 "parse.y" +case 88: +#line 690 "parse.y" { if (! current_function_parms_stored) store_parm_decls (); @@ -4114,104 +4141,108 @@ case 86: error ("only constructors take base initializers"); ; break;} -case 87: -#line 711 "parse.y" +case 89: +#line 713 "parse.y" { yyval.itype = 0; ; break;} -case 88: -#line 713 "parse.y" +case 90: +#line 715 "parse.y" { yyval.itype = 1; ; break;} -case 91: -#line 719 "parse.y" +case 93: +#line 721 "parse.y" { if (current_class_name && !flag_traditional) pedwarn ("anachronistic old style base class initializer"); expand_member_init (C_C_D, NULL_TREE, yyvsp[-1].ttype); ; break;} -case 92: -#line 725 "parse.y" +case 94: +#line 727 "parse.y" { if (current_class_name && !flag_traditional) pedwarn ("anachronistic old style base class initializer"); expand_member_init (C_C_D, NULL_TREE, void_type_node); ; break;} -case 93: -#line 731 "parse.y" +case 95: +#line 733 "parse.y" { expand_member_init (C_C_D, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 94: -#line 733 "parse.y" +case 96: +#line 735 "parse.y" { expand_member_init (C_C_D, yyval.ttype, void_type_node); ; break;} -case 95: -#line 735 "parse.y" +case 97: +#line 737 "parse.y" { expand_member_init (C_C_D, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 96: -#line 737 "parse.y" +case 98: +#line 739 "parse.y" { expand_member_init (C_C_D, yyval.ttype, void_type_node); ; break;} -case 97: -#line 740 "parse.y" +case 99: +#line 742 "parse.y" { do_member_init (OP0 (yyvsp[-3].ttype), OP1 (yyvsp[-3].ttype), yyvsp[-1].ttype); ; break;} -case 98: -#line 744 "parse.y" +case 100: +#line 746 "parse.y" { do_member_init (OP0 (yyvsp[-1].ttype), OP1 (yyvsp[-1].ttype), void_type_node); ; break;} -case 107: -#line 768 "parse.y" +case 109: +#line 770 "parse.y" { do_type_instantiation (yyvsp[0].ttype ? yyvsp[0].ttype : yyvsp[-1].ttype, NULL_TREE); ; break;} -case 108: -#line 770 "parse.y" +case 110: +#line 772 "parse.y" { do_function_instantiation (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} -case 109: -#line 772 "parse.y" +case 111: +#line 774 "parse.y" { do_type_instantiation (yyvsp[0].ttype ? yyvsp[0].ttype : yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} -case 110: -#line 774 "parse.y" +case 112: +#line 776 "parse.y" { do_function_instantiation (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); ; break;} -case 111: -#line 779 "parse.y" +case 113: +#line 781 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = yyvsp[0].ttype; ; break;} -case 112: -#line 784 "parse.y" +case 114: +#line 786 "parse.y" { yyval.ttype = lookup_template_class (yyval.ttype, yyvsp[-1].ttype, NULL_TREE); ; break;} -case 113: -#line 786 "parse.y" +case 115: +#line 788 "parse.y" +{ yyval.ttype = lookup_template_class (yyval.ttype, NULL_TREE, NULL_TREE); ; + break;} +case 116: +#line 790 "parse.y" { yyval.ttype = lookup_template_class (yyval.ttype, yyvsp[-1].ttype, NULL_TREE); ; break;} -case 114: -#line 791 "parse.y" +case 117: +#line 795 "parse.y" { yyval.ttype = instantiate_class_template (yyvsp[0].ttype, 1); ; break;} -case 115: -#line 796 "parse.y" +case 118: +#line 800 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 116: -#line 798 "parse.y" +case 119: +#line 802 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 117: -#line 803 "parse.y" +case 120: +#line 807 "parse.y" { yyval.ttype = groktypename (yyval.ttype); ; break;} -case 119: -#line 809 "parse.y" +case 122: +#line 813 "parse.y" { tree t, decl, tmpl; @@ -4245,8 +4276,8 @@ case 119: TYPE_BEING_DEFINED (t) = 0; ; break;} -case 120: -#line 842 "parse.y" +case 123: +#line 846 "parse.y" { tree t = finish_struct (yyvsp[-3].ttype, yyvsp[-1].ttype, 0); @@ -4261,76 +4292,83 @@ case 120: CLASSTYPE_GOT_SEMICOLON (t) = 1; ; break;} -case 121: -#line 859 "parse.y" +case 124: +#line 863 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 122: -#line 861 "parse.y" +case 125: +#line 865 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 123: -#line 866 "parse.y" +case 126: +#line 870 "parse.y" { yyval.ttype = NULL_TREE; /* never used from here... */; break;} -case 124: -#line 868 "parse.y" +case 127: +#line 872 "parse.y" { yyval.ttype = yyvsp[-1].ttype; /*???*/ ; break;} -case 125: -#line 872 "parse.y" +case 128: +#line 876 "parse.y" { yyval.code = NEGATE_EXPR; ; break;} -case 126: -#line 874 "parse.y" +case 129: +#line 878 "parse.y" { yyval.code = CONVERT_EXPR; ; break;} -case 127: -#line 876 "parse.y" +case 130: +#line 880 "parse.y" { yyval.code = PREINCREMENT_EXPR; ; break;} -case 128: -#line 878 "parse.y" +case 131: +#line 882 "parse.y" { yyval.code = PREDECREMENT_EXPR; ; break;} -case 129: -#line 880 "parse.y" +case 132: +#line 884 "parse.y" { yyval.code = TRUTH_NOT_EXPR; ; break;} -case 130: -#line 884 "parse.y" +case 133: +#line 888 "parse.y" { yyval.ttype = build_x_compound_expr (yyval.ttype); ; break;} -case 132: -#line 890 "parse.y" +case 135: +#line 894 "parse.y" { error ("ANSI C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} -case 133: -#line 894 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; +case 136: +#line 898 "parse.y" +{ yyval.ttype = build1 (CLEANUP_POINT_EXPR, bool_type_node, + bool_truthvalue_conversion (yyvsp[-1].ttype)); ; break;} -case 134: -#line 899 "parse.y" +case 137: +#line 904 "parse.y" { error ("ANSI C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} -case 135: -#line 903 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 136: +case 138: #line 908 "parse.y" -{ yyval.ttype = NULL_TREE; ; +{ yyval.ttype = build1 (CLEANUP_POINT_EXPR, bool_type_node, + bool_truthvalue_conversion (yyvsp[-1].ttype)); ; break;} -case 138: -#line 911 "parse.y" +case 139: +#line 914 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 139: +case 140: #line 916 "parse.y" +{ yyval.ttype = build1 (CLEANUP_POINT_EXPR, bool_type_node, + bool_truthvalue_conversion (yyval.ttype)); ; + break;} +case 141: +#line 919 "parse.y" +{ yyval.ttype = NULL_TREE; ; + break;} +case 142: +#line 924 "parse.y" { { tree d; for (d = getdecls (); d; d = TREE_CHAIN (d)) @@ -4348,8 +4386,8 @@ case 139: cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 140: -#line 933 "parse.y" +case 143: +#line 941 "parse.y" { finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].ttype, 0); resume_momentary (yyvsp[-2].itype); @@ -4358,42 +4396,42 @@ case 140: cp_error ("definition of array `%#D' in condition", yyval.ttype); ; break;} -case 142: -#line 945 "parse.y" +case 145: +#line 953 "parse.y" { finish_stmt (); ; break;} -case 143: -#line 947 "parse.y" +case 146: +#line 955 "parse.y" { finish_stmt (); ; break;} -case 144: -#line 949 "parse.y" +case 147: +#line 957 "parse.y" { finish_stmt (); ; break;} -case 146: -#line 956 "parse.y" +case 149: +#line 964 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 147: -#line 959 "parse.y" +case 150: +#line 967 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} -case 148: -#line 962 "parse.y" +case 151: +#line 970 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 149: -#line 964 "parse.y" +case 152: +#line 972 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} -case 150: -#line 969 "parse.y" +case 153: +#line 977 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 152: -#line 975 "parse.y" +case 155: +#line 983 "parse.y" { #if 0 if (TREE_CODE (yyval.ttype) == TYPE_EXPR) @@ -4401,38 +4439,38 @@ case 152: #endif ; break;} -case 153: -#line 983 "parse.y" +case 156: +#line 991 "parse.y" { yyvsp[0].itype = pedantic; pedantic = 0; ; break;} -case 154: -#line 986 "parse.y" +case 157: +#line 994 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-2].itype; ; break;} -case 155: -#line 989 "parse.y" +case 158: +#line 997 "parse.y" { yyval.ttype = build_x_indirect_ref (yyvsp[0].ttype, "unary *"); ; break;} -case 156: -#line 991 "parse.y" +case 159: +#line 999 "parse.y" { yyval.ttype = build_x_unary_op (ADDR_EXPR, yyvsp[0].ttype); ; break;} -case 157: -#line 993 "parse.y" +case 160: +#line 1001 "parse.y" { yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} -case 158: -#line 995 "parse.y" +case 161: +#line 1003 "parse.y" { yyval.ttype = build_x_unary_op (yyvsp[-1].code, yyvsp[0].ttype); if (yyvsp[-1].code == NEGATE_EXPR && TREE_CODE (yyvsp[0].ttype) == INTEGER_CST) TREE_NEGATED_INT (yyval.ttype) = 1; overflow_warning (yyval.ttype); ; break;} -case 159: -#line 1002 "parse.y" +case 162: +#line 1010 "parse.y" { tree label = lookup_label (yyvsp[0].ttype); if (label == NULL_TREE) yyval.ttype = null_pointer_node; @@ -4444,8 +4482,8 @@ case 159: } ; break;} -case 160: -#line 1013 "parse.y" +case 163: +#line 1021 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF && DECL_BIT_FIELD (TREE_OPERAND (yyvsp[0].ttype, 1))) error ("sizeof applied to a bit-field"); @@ -4466,120 +4504,120 @@ case 160: } yyval.ttype = c_sizeof (TREE_TYPE (yyvsp[0].ttype)); ; break;} -case 161: -#line 1033 "parse.y" +case 164: +#line 1041 "parse.y" { yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ttype)); ; break;} -case 162: -#line 1035 "parse.y" +case 165: +#line 1043 "parse.y" { yyval.ttype = grok_alignof (yyvsp[0].ttype); ; break;} -case 163: -#line 1037 "parse.y" +case 166: +#line 1045 "parse.y" { yyval.ttype = c_alignof (groktypename (yyvsp[-1].ttype)); ; break;} -case 164: -#line 1042 "parse.y" +case 167: +#line 1050 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[0].ttype, NULL_TREE, yyvsp[-1].itype); ; break;} -case 165: -#line 1044 "parse.y" +case 168: +#line 1052 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-2].itype); ; break;} -case 166: -#line 1046 "parse.y" +case 169: +#line 1054 "parse.y" { yyval.ttype = build_new (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE, yyvsp[-2].itype); ; break;} -case 167: -#line 1048 "parse.y" +case 170: +#line 1056 "parse.y" { yyval.ttype = build_new (yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].itype); ; break;} -case 168: -#line 1050 "parse.y" +case 171: +#line 1058 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-1].ttype), NULL_TREE, yyvsp[-3].itype); ; break;} -case 169: -#line 1053 "parse.y" +case 172: +#line 1061 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-2].ttype), yyvsp[0].ttype, yyvsp[-4].itype); ; break;} -case 170: -#line 1055 "parse.y" +case 173: +#line 1063 "parse.y" { yyval.ttype = build_new (yyvsp[-3].ttype, groktypename(yyvsp[-1].ttype), NULL_TREE, yyvsp[-4].itype); ; break;} -case 171: -#line 1057 "parse.y" +case 174: +#line 1065 "parse.y" { yyval.ttype = build_new (yyvsp[-4].ttype, groktypename(yyvsp[-2].ttype), yyvsp[0].ttype, yyvsp[-5].itype); ; break;} -case 172: -#line 1060 "parse.y" +case 175: +#line 1068 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 0, yyvsp[-1].itype); ; break;} -case 173: -#line 1062 "parse.y" +case 176: +#line 1070 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 1, yyvsp[-3].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} -case 174: -#line 1066 "parse.y" +case 177: +#line 1074 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, yyvsp[-2].ttype, 2, yyvsp[-4].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} -case 175: -#line 1073 "parse.y" +case 178: +#line 1081 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 176: -#line 1075 "parse.y" +case 179: +#line 1083 "parse.y" { yyval.ttype = yyvsp[-1].ttype; pedwarn ("old style placement syntax, use () instead"); ; break;} -case 177: -#line 1083 "parse.y" +case 180: +#line 1091 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 178: -#line 1085 "parse.y" +case 181: +#line 1093 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 179: -#line 1087 "parse.y" +case 182: +#line 1095 "parse.y" { cp_error ("`%T' is not a valid expression", yyvsp[-1].ttype); yyval.ttype = error_mark_node; ; break;} -case 180: -#line 1095 "parse.y" +case 183: +#line 1103 "parse.y" { if (flag_ansi) pedwarn ("ANSI C++ forbids initialization of new expression with `='"); yyval.ttype = yyvsp[0].ttype; ; break;} -case 181: -#line 1105 "parse.y" +case 184: +#line 1113 "parse.y" { yyvsp[-1].ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, void_list_node); TREE_PARMLIST (yyvsp[-1].ttype) = 1; yyval.ttype = build_parse_node (CALL_EXPR, NULL_TREE, yyvsp[-1].ttype, NULL_TREE); ; break;} -case 182: -#line 1110 "parse.y" +case 185: +#line 1118 "parse.y" { yyvsp[-1].ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, void_list_node); TREE_PARMLIST (yyvsp[-1].ttype) = 1; yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-1].ttype, NULL_TREE); ; break;} -case 184: -#line 1118 "parse.y" +case 187: +#line 1126 "parse.y" { yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, yyvsp[0].ttype); ; break;} -case 185: -#line 1120 "parse.y" +case 188: +#line 1128 "parse.y" { tree init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); @@ -4591,16 +4629,16 @@ case 185: yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, init); ; break;} -case 187: -#line 1135 "parse.y" +case 190: +#line 1143 "parse.y" { yyval.ttype = build_headof (yyvsp[-1].ttype); ; break;} -case 188: -#line 1137 "parse.y" +case 191: +#line 1145 "parse.y" { yyval.ttype = build_classof (yyvsp[-1].ttype); ; break;} -case 189: -#line 1139 "parse.y" +case 192: +#line 1147 "parse.y" { if (is_aggr_typedef (yyvsp[-1].ttype, 1)) { tree type = IDENTIFIER_TYPE_VALUE (yyvsp[-1].ttype); @@ -4616,92 +4654,92 @@ case 189: yyval.ttype = error_mark_node; ; break;} -case 191: -#line 1159 "parse.y" -{ yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 192: -#line 1161 "parse.y" -{ yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 193: -#line 1163 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} case 194: -#line 1165 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; +#line 1167 "parse.y" +{ yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 195: -#line 1167 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; +#line 1169 "parse.y" +{ yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; break;} case 196: -#line 1169 "parse.y" +#line 1171 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 197: -#line 1171 "parse.y" +#line 1173 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 198: -#line 1173 "parse.y" +#line 1175 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 199: -#line 1175 "parse.y" +#line 1177 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 200: -#line 1177 "parse.y" +#line 1179 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 201: -#line 1179 "parse.y" -{ yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 202: #line 1181 "parse.y" -{ yyval.ttype = build_x_binary_op (GT_EXPR, yyval.ttype, yyvsp[0].ttype); ; +{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} -case 203: +case 202: #line 1183 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} -case 204: +case 203: #line 1185 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} -case 205: +case 204: #line 1187 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; +{ yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} -case 206: +case 205: #line 1189 "parse.y" +{ yyval.ttype = build_x_binary_op (GT_EXPR, yyval.ttype, yyvsp[0].ttype); ; + break;} +case 206: +#line 1191 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 207: -#line 1191 "parse.y" +#line 1193 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 208: -#line 1193 "parse.y" -{ yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; +#line 1195 "parse.y" +{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 209: -#line 1195 "parse.y" -{ yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; +#line 1197 "parse.y" +{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 210: -#line 1197 "parse.y" -{ yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; +#line 1199 "parse.y" +{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 211: -#line 1199 "parse.y" -{ yyval.ttype = build_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); ; +#line 1201 "parse.y" +{ yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 212: -#line 1201 "parse.y" +#line 1203 "parse.y" +{ yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; + break;} +case 213: +#line 1205 "parse.y" +{ yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; + break;} +case 214: +#line 1207 "parse.y" +{ yyval.ttype = build_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); ; + break;} +case 215: +#line 1209 "parse.y" { register tree rval; if ((rval = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, yyval.ttype, yyvsp[0].ttype, make_node (yyvsp[-1].code)))) @@ -4709,33 +4747,41 @@ case 212: else yyval.ttype = build_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; break;} -case 213: -#line 1208 "parse.y" +case 216: +#line 1216 "parse.y" { yyval.ttype = build_throw (NULL_TREE); ; break;} -case 214: -#line 1210 "parse.y" +case 217: +#line 1218 "parse.y" { yyval.ttype = build_throw (yyvsp[0].ttype); ; break;} -case 215: -#line 1228 "parse.y" +case 218: +#line 1236 "parse.y" { yyval.ttype = build_parse_node (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} -case 223: -#line 1243 "parse.y" +case 226: +#line 1251 "parse.y" { yyval.ttype = build_parse_node (INDIRECT_REF, yyvsp[0].ttype); ; break;} -case 224: -#line 1245 "parse.y" +case 227: +#line 1253 "parse.y" { yyval.ttype = build_parse_node (ADDR_EXPR, yyvsp[0].ttype); ; break;} -case 227: -#line 1252 "parse.y" +case 228: +#line 1255 "parse.y" +{ yyval.ttype = yyvsp[-1].ttype; ; + break;} +case 231: +#line 1262 "parse.y" { push_nested_class (TREE_TYPE (OP0 (yyval.ttype)), 3); TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; break;} -case 228: -#line 1258 "parse.y" +case 232: +#line 1265 "parse.y" +{ yyval.ttype = finish_decl_parsing (yyvsp[-1].ttype); ; + break;} +case 233: +#line 1270 "parse.y" { if (TREE_CODE (yyval.ttype) == BIT_NOT_EXPR) yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (yyval.ttype, 0)); @@ -4755,20 +4801,20 @@ case 228: yyval.ttype = do_identifier (yyval.ttype); ; break;} -case 231: -#line 1279 "parse.y" +case 236: +#line 1291 "parse.y" { yyval.ttype = combine_strings (yyval.ttype); ; break;} -case 232: -#line 1281 "parse.y" +case 237: +#line 1293 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 233: -#line 1283 "parse.y" +case 238: +#line 1295 "parse.y" { yyval.ttype = error_mark_node; ; break;} -case 234: -#line 1285 "parse.y" +case 239: +#line 1297 "parse.y" { if (current_function_decl == 0) { error ("braced-group within expression allowed only inside a function"); @@ -4777,8 +4823,8 @@ case 234: keep_next_level (); yyval.ttype = expand_start_stmt_expr (); ; break;} -case 235: -#line 1293 "parse.y" +case 240: +#line 1305 "parse.y" { tree rtl_exp; if (flag_ansi) pedwarn ("ANSI C++ forbids braced-groups within expressions"); @@ -4800,16 +4846,16 @@ case 235: yyval.ttype = yyvsp[-1].ttype; ; break;} -case 236: -#line 1314 "parse.y" +case 241: +#line 1326 "parse.y" { /* [eichin:19911016.1902EST] */ yyval.ttype = build_x_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype, current_class_decl); /* here we instantiate_class_template as needed... */ do_pending_templates (); ; break;} -case 237: -#line 1318 "parse.y" +case 242: +#line 1330 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == CALL_EXPR && TREE_TYPE (yyvsp[-1].ttype) != void_type_node) @@ -4818,8 +4864,8 @@ case 237: yyval.ttype = yyvsp[-1].ttype; ; break;} -case 238: -#line 1326 "parse.y" +case 243: +#line 1338 "parse.y" { yyval.ttype = build_x_function_call (yyval.ttype, NULL_TREE, current_class_decl); if (TREE_CODE (yyval.ttype) == CALL_EXPR @@ -4827,12 +4873,12 @@ case 238: yyval.ttype = require_complete_type (yyval.ttype); ; break;} -case 239: -#line 1333 "parse.y" +case 244: +#line 1345 "parse.y" { yyval.ttype = grok_array_decl (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 240: -#line 1335 "parse.y" +case 245: +#line 1347 "parse.y" { /* If we get an OFFSET_REF, turn it into what it really means (e.g., a COMPONENT_REF). This way if we've got, say, a reference to a static member that's being operated @@ -4842,14 +4888,14 @@ case 240: yyval.ttype = resolve_offset_ref (yyval.ttype); yyval.ttype = build_x_unary_op (POSTINCREMENT_EXPR, yyval.ttype); ; break;} -case 241: -#line 1344 "parse.y" +case 246: +#line 1356 "parse.y" { if (TREE_CODE (yyval.ttype) == OFFSET_REF) yyval.ttype = resolve_offset_ref (yyval.ttype); yyval.ttype = build_x_unary_op (POSTDECREMENT_EXPR, yyval.ttype); ; break;} -case 242: -#line 1349 "parse.y" +case 247: +#line 1361 "parse.y" { if (current_class_decl) { #ifdef WARNING_ABOUT_CCD @@ -4873,8 +4919,8 @@ case 242: } ; break;} -case 243: -#line 1372 "parse.y" +case 248: +#line 1384 "parse.y" { tree type; tree id = yyval.ttype; @@ -4919,37 +4965,37 @@ case 243: } ; break;} -case 245: -#line 1417 "parse.y" +case 250: +#line 1429 "parse.y" { tree type = groktypename (yyvsp[-4].ttype); yyval.ttype = build_dynamic_cast (type, yyvsp[-1].ttype); ; break;} -case 246: -#line 1420 "parse.y" +case 251: +#line 1432 "parse.y" { tree type = groktypename (yyvsp[-4].ttype); yyval.ttype = build_static_cast (type, yyvsp[-1].ttype); ; break;} -case 247: -#line 1423 "parse.y" +case 252: +#line 1435 "parse.y" { tree type = groktypename (yyvsp[-4].ttype); yyval.ttype = build_reinterpret_cast (type, yyvsp[-1].ttype); ; break;} -case 248: -#line 1426 "parse.y" +case 253: +#line 1438 "parse.y" { tree type = groktypename (yyvsp[-4].ttype); yyval.ttype = build_const_cast (type, yyvsp[-1].ttype); ; break;} -case 249: -#line 1429 "parse.y" +case 254: +#line 1441 "parse.y" { yyval.ttype = build_typeid (yyvsp[-1].ttype); ; break;} -case 250: -#line 1431 "parse.y" +case 255: +#line 1443 "parse.y" { tree type = groktypename (yyvsp[-1].ttype); yyval.ttype = get_typeid (type); ; break;} -case 251: -#line 1434 "parse.y" +case 256: +#line 1446 "parse.y" { do_scoped_id: yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); @@ -4989,8 +5035,8 @@ case 251: ; break;} -case 252: -#line 1473 "parse.y" +case 257: +#line 1485 "parse.y" { got_scope = NULL_TREE; if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) @@ -4998,28 +5044,28 @@ case 252: yyval.ttype = yyvsp[0].ttype; ; break;} -case 253: -#line 1480 "parse.y" +case 258: +#line 1492 "parse.y" { yyval.ttype = build_offset_ref (OP0 (yyval.ttype), OP1 (yyval.ttype)); ; break;} -case 254: -#line 1482 "parse.y" +case 259: +#line 1494 "parse.y" { yyval.ttype = build_member_call (OP0 (yyval.ttype), OP1 (yyval.ttype), yyvsp[-1].ttype); ; break;} -case 255: -#line 1484 "parse.y" +case 260: +#line 1496 "parse.y" { yyval.ttype = build_member_call (OP0 (yyval.ttype), OP1 (yyval.ttype), NULL_TREE); ; break;} -case 256: -#line 1486 "parse.y" +case 261: +#line 1498 "parse.y" { yyval.ttype = build_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; break;} -case 257: -#line 1488 "parse.y" +case 262: +#line 1500 "parse.y" { yyval.ttype = build_object_ref (yyval.ttype, OP0 (yyvsp[0].ttype), OP1 (yyvsp[0].ttype)); ; break;} -case 258: -#line 1490 "parse.y" +case 263: +#line 1502 "parse.y" { #if 0 /* This is a future direction of this code, but because @@ -5035,8 +5081,8 @@ case 258: #endif ; break;} -case 259: -#line 1505 "parse.y" +case 264: +#line 1517 "parse.y" { #if 0 /* This is a future direction of this code, but because @@ -5052,8 +5098,8 @@ case 259: #endif ; break;} -case 260: -#line 1520 "parse.y" +case 265: +#line 1532 "parse.y" { if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (OP0 (yyvsp[-3].ttype)))) { @@ -5065,8 +5111,8 @@ case 260: yyval.ttype = build_scoped_method_call (yyval.ttype, OP0 (yyvsp[-3].ttype), OP1 (yyvsp[-3].ttype), yyvsp[-1].ttype); ; break;} -case 261: -#line 1531 "parse.y" +case 266: +#line 1543 "parse.y" { if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (OP0 (yyvsp[-1].ttype)))) { @@ -5078,56 +5124,56 @@ case 261: yyval.ttype = build_scoped_method_call (yyval.ttype, OP0 (yyvsp[-1].ttype), OP1 (yyvsp[-1].ttype), NULL_TREE); ; break;} -case 262: -#line 1543 "parse.y" +case 267: +#line 1555 "parse.y" { if (TREE_CODE (TREE_TYPE (yyvsp[-3].ttype)) != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (yyvsp[-1].ttype)))) cp_error ("`%E' is not of type `%T'", yyvsp[-3].ttype, yyvsp[-1].ttype); - yyval.ttype = void_zero_node; + yyval.ttype = convert (void_type_node, yyvsp[-3].ttype); ; break;} -case 263: -#line 1550 "parse.y" +case 268: +#line 1562 "parse.y" { if (yyvsp[-4].ttype != yyvsp[-1].ttype) cp_error ("destructor specifier `%T::~%T()' must have matching names", yyvsp[-4].ttype, yyvsp[-1].ttype); if (TREE_CODE (TREE_TYPE (yyvsp[-5].ttype)) != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (yyvsp[-4].ttype)))) cp_error ("`%E' is not of type `%T'", yyvsp[-5].ttype, yyvsp[-4].ttype); - yyval.ttype = void_zero_node; + yyval.ttype = convert (void_type_node, yyvsp[-5].ttype); ; break;} -case 264: -#line 1599 "parse.y" +case 269: +#line 1611 "parse.y" { yyval.itype = 0; ; break;} -case 265: -#line 1601 "parse.y" +case 270: +#line 1613 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} -case 266: -#line 1605 "parse.y" +case 271: +#line 1617 "parse.y" { yyval.itype = 0; ; break;} -case 267: -#line 1607 "parse.y" +case 272: +#line 1619 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} -case 268: -#line 1612 "parse.y" +case 273: +#line 1624 "parse.y" { yyval.ttype = true_node; ; break;} -case 269: -#line 1614 "parse.y" +case 274: +#line 1626 "parse.y" { yyval.ttype = false_node; ; break;} -case 271: -#line 1621 "parse.y" +case 276: +#line 1633 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 272: -#line 1626 "parse.y" +case 277: +#line 1638 "parse.y" { if (! current_function_parms_stored) store_parm_decls (); @@ -5138,14 +5184,14 @@ case 272: keep_next_level (); ; break;} -case 274: -#line 1639 "parse.y" +case 279: +#line 1651 "parse.y" { yyval.ttype = build_x_arrow (yyval.ttype); ; break;} -case 275: -#line 1647 "parse.y" +case 280: +#line 1659 "parse.y" { tree d = get_decl_list (yyvsp[-2].ttype); int yes = suspend_momentary (); d = start_decl (yyvsp[-1].ttype, d, 0, NULL_TREE); @@ -5155,8 +5201,8 @@ case 275: note_got_semicolon (yyvsp[-2].ttype); ; break;} -case 276: -#line 1656 "parse.y" +case 281: +#line 1668 "parse.y" { tree d = yyvsp[-2].ttype; int yes = suspend_momentary (); d = start_decl (yyvsp[-1].ttype, d, 0, NULL_TREE); @@ -5165,164 +5211,164 @@ case 276: note_list_got_semicolon (yyvsp[-2].ttype); ; break;} -case 277: -#line 1664 "parse.y" +case 282: +#line 1676 "parse.y" { resume_momentary (yyvsp[-1].itype); if (IS_AGGR_TYPE_CODE (TREE_CODE (yyvsp[-2].ttype))) note_got_semicolon (yyvsp[-2].ttype); ; break;} -case 278: -#line 1670 "parse.y" +case 283: +#line 1682 "parse.y" { resume_momentary (yyvsp[-1].itype); note_list_got_semicolon (yyvsp[-2].ttype); ; break;} -case 279: -#line 1675 "parse.y" +case 284: +#line 1687 "parse.y" { resume_momentary (yyvsp[-1].itype); ; break;} -case 280: -#line 1677 "parse.y" +case 285: +#line 1689 "parse.y" { shadow_tag (yyvsp[-1].ttype); note_list_got_semicolon (yyvsp[-1].ttype); ; break;} -case 281: -#line 1682 "parse.y" +case 286: +#line 1694 "parse.y" { warning ("empty declaration"); ; break;} -case 284: -#line 1696 "parse.y" +case 289: +#line 1708 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, NULL_TREE, empty_parms (), NULL_TREE); ; break;} -case 285: -#line 1699 "parse.y" +case 290: +#line 1711 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, empty_parms (), NULL_TREE); ; break;} -case 286: -#line 1706 "parse.y" +case 291: +#line 1718 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 287: -#line 1708 "parse.y" +case 292: +#line 1720 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 288: -#line 1710 "parse.y" +case 293: +#line 1722 "parse.y" { yyval.ttype = build_decl_list (get_decl_list (yyval.ttype), yyvsp[0].ttype); ; break;} -case 289: -#line 1712 "parse.y" +case 294: +#line 1724 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, NULL_TREE); ; break;} -case 290: -#line 1714 "parse.y" +case 295: +#line 1726 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, NULL_TREE); ; break;} -case 293: -#line 1727 "parse.y" +case 298: +#line 1739 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 294: -#line 1729 "parse.y" +case 299: +#line 1741 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyval.ttype, yyvsp[0].ttype); ; break;} -case 295: -#line 1731 "parse.y" +case 300: +#line 1743 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyval.ttype)); ; break;} -case 296: -#line 1733 "parse.y" +case 301: +#line 1745 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyval.ttype)); ; break;} -case 297: -#line 1735 "parse.y" +case 302: +#line 1747 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[-2].ttype, chainon (yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyval.ttype))); ; break;} -case 298: -#line 1741 "parse.y" +case 303: +#line 1753 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyval.ttype)); yyval.ttype = build_decl_list (NULL_TREE, yyval.ttype); ; break;} -case 299: -#line 1746 "parse.y" +case 304: +#line 1758 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 300: -#line 1748 "parse.y" +case 305: +#line 1760 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyvsp[0].ttype)); yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 301: -#line 1760 "parse.y" +case 306: +#line 1772 "parse.y" { TREE_STATIC (yyval.ttype) = 1; ; break;} -case 302: -#line 1762 "parse.y" +case 307: +#line 1774 "parse.y" { yyval.ttype = IDENTIFIER_AS_LIST (yyval.ttype); ; break;} -case 303: -#line 1764 "parse.y" +case 308: +#line 1776 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); TREE_STATIC (yyval.ttype) = 1; ; break;} -case 304: -#line 1767 "parse.y" +case 309: +#line 1779 "parse.y" { if (extra_warnings && TREE_STATIC (yyval.ttype)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyvsp[0].ttype)); yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); TREE_STATIC (yyval.ttype) = TREE_STATIC (yyvsp[-1].ttype); ; break;} -case 305: -#line 1783 "parse.y" +case 310: +#line 1795 "parse.y" { yyval.ttype = get_decl_list (yyval.ttype); ; break;} -case 306: -#line 1785 "parse.y" +case 311: +#line 1797 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 307: -#line 1787 "parse.y" +case 312: +#line 1799 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyval.ttype, yyvsp[0].ttype); ; break;} -case 308: -#line 1789 "parse.y" +case 313: +#line 1801 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyval.ttype)); ; break;} -case 309: -#line 1794 "parse.y" +case 314: +#line 1806 "parse.y" { yyval.ttype = build_decl_list (NULL_TREE, yyval.ttype); ; break;} -case 310: -#line 1796 "parse.y" +case 315: +#line 1808 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 314: -#line 1807 "parse.y" +case 319: +#line 1819 "parse.y" { yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); if (flag_ansi) pedwarn ("ANSI C++ forbids `typeof'"); ; break;} -case 315: -#line 1811 "parse.y" +case 320: +#line 1823 "parse.y" { yyval.ttype = groktypename (yyvsp[-1].ttype); if (flag_ansi) pedwarn ("ANSI C++ forbids `typeof'"); ; break;} -case 316: -#line 1815 "parse.y" +case 321: +#line 1827 "parse.y" { tree type = TREE_TYPE (yyvsp[-1].ttype); if (IS_AGGR_TYPE (type)) @@ -5337,8 +5383,8 @@ case 316: } ; break;} -case 317: -#line 1829 "parse.y" +case 322: +#line 1841 "parse.y" { tree type = groktypename (yyvsp[-1].ttype); if (IS_AGGR_TYPE (type)) @@ -5353,16 +5399,16 @@ case 317: } ; break;} -case 327: -#line 1868 "parse.y" +case 332: +#line 1880 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 328: -#line 1870 "parse.y" +case 333: +#line 1882 "parse.y" { if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); yyval.ttype = yyvsp[-1].ttype; ; break;} -case 329: -#line 1875 "parse.y" +case 334: +#line 1887 "parse.y" { current_declspecs = yyvsp[-5].ttype; if (TREE_CODE (current_declspecs) != TREE_LIST) current_declspecs = get_decl_list (current_declspecs); @@ -5377,13 +5423,13 @@ case 329: yyval.ttype = start_decl (yyvsp[-4].ttype, current_declspecs, 1, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 330: -#line 1890 "parse.y" +case 335: +#line 1902 "parse.y" { finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 0); yyval.itype = yyvsp[-2].itype; ; break;} -case 331: -#line 1893 "parse.y" +case 336: +#line 1905 "parse.y" { tree d; current_declspecs = yyvsp[-4].ttype; if (TREE_CODE (current_declspecs) != TREE_LIST) @@ -5400,35 +5446,35 @@ case 331: cplus_decl_attributes (d, yyvsp[0].ttype); finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 0); ; break;} -case 332: -#line 1912 "parse.y" +case 337: +#line 1924 "parse.y" { yyval.ttype = start_decl (yyvsp[-4].ttype, current_declspecs, 1, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 333: -#line 1916 "parse.y" +case 338: +#line 1928 "parse.y" { finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 0); ; break;} -case 334: -#line 1918 "parse.y" +case 339: +#line 1930 "parse.y" { yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 0, yyvsp[-2].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); finish_decl (yyval.ttype, NULL_TREE, yyvsp[-1].ttype, 0); ; break;} -case 335: -#line 1925 "parse.y" +case 340: +#line 1937 "parse.y" { current_declspecs = yyvsp[-5].ttype; yyvsp[0].itype = suspend_momentary (); yyval.ttype = start_decl (yyvsp[-4].ttype, current_declspecs, 1, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 336: -#line 1931 "parse.y" +case 341: +#line 1943 "parse.y" { finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 0); yyval.itype = yyvsp[-2].itype; ; break;} -case 337: -#line 1934 "parse.y" +case 342: +#line 1946 "parse.y" { tree d; current_declspecs = yyvsp[-4].ttype; yyval.itype = suspend_momentary (); @@ -5436,20 +5482,20 @@ case 337: cplus_decl_attributes (d, yyvsp[0].ttype); finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 0); ; break;} -case 338: -#line 1944 "parse.y" +case 343: +#line 1956 "parse.y" { current_declspecs = NULL_TREE; yyvsp[0].itype = suspend_momentary (); yyval.ttype = start_decl (yyvsp[-4].ttype, current_declspecs, 1, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 339: -#line 1950 "parse.y" +case 344: +#line 1962 "parse.y" { finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 0); yyval.itype = yyvsp[-2].itype; ; break;} -case 340: -#line 1953 "parse.y" +case 345: +#line 1965 "parse.y" { tree d; current_declspecs = NULL_TREE; yyval.itype = suspend_momentary (); @@ -5457,147 +5503,147 @@ case 340: cplus_decl_attributes (d, yyvsp[0].ttype); finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 0); ; break;} -case 341: -#line 1965 "parse.y" +case 346: +#line 1977 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 342: -#line 1967 "parse.y" +case 347: +#line 1979 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 343: -#line 1972 "parse.y" +case 348: +#line 1984 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 344: -#line 1974 "parse.y" +case 349: +#line 1986 "parse.y" { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 345: -#line 1979 "parse.y" +case 350: +#line 1991 "parse.y" { yyval.ttype = yyvsp[-2].ttype; ; break;} -case 346: -#line 1984 "parse.y" +case 351: +#line 1996 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} -case 347: -#line 1986 "parse.y" +case 352: +#line 1998 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 348: -#line 1991 "parse.y" +case 353: +#line 2003 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 349: -#line 1993 "parse.y" +case 354: +#line 2005 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 350: -#line 1995 "parse.y" +case 355: +#line 2007 "parse.y" { yyval.ttype = tree_cons (yyvsp[-3].ttype, NULL_TREE, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; break;} -case 351: -#line 1997 "parse.y" +case 356: +#line 2009 "parse.y" { yyval.ttype = tree_cons (yyvsp[-5].ttype, NULL_TREE, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; break;} -case 352: -#line 1999 "parse.y" +case 357: +#line 2011 "parse.y" { yyval.ttype = tree_cons (yyvsp[-3].ttype, NULL_TREE, yyvsp[-1].ttype); ; break;} -case 357: -#line 2015 "parse.y" +case 362: +#line 2027 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} -case 358: -#line 2017 "parse.y" +case 363: +#line 2029 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 360: -#line 2023 "parse.y" +case 365: +#line 2035 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} -case 361: -#line 2026 "parse.y" +case 366: +#line 2038 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-1].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} -case 362: -#line 2029 "parse.y" +case 367: +#line 2041 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} -case 363: -#line 2032 "parse.y" +case 368: +#line 2044 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 364: -#line 2039 "parse.y" +case 369: +#line 2051 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 365: -#line 2041 "parse.y" +case 370: +#line 2053 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 366: -#line 2044 "parse.y" +case 371: +#line 2056 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 367: -#line 2046 "parse.y" +case 372: +#line 2058 "parse.y" { yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; break;} -case 368: -#line 2048 "parse.y" +case 373: +#line 2060 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 369: -#line 2050 "parse.y" +case 374: +#line 2062 "parse.y" { yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; break;} -case 370: -#line 2055 "parse.y" +case 375: +#line 2067 "parse.y" { yyvsp[0].itype = suspend_momentary (); yyval.ttype = start_enum (yyvsp[-1].ttype); ; break;} -case 371: -#line 2058 "parse.y" +case 376: +#line 2070 "parse.y" { yyval.ttype = finish_enum (yyvsp[-3].ttype, yyvsp[-2].ttype); resume_momentary ((int) yyvsp[-4].itype); check_for_missing_semicolon (yyvsp[-3].ttype); ; break;} -case 372: -#line 2062 "parse.y" +case 377: +#line 2074 "parse.y" { yyval.ttype = finish_enum (start_enum (yyvsp[-2].ttype), NULL_TREE); check_for_missing_semicolon (yyval.ttype); ; break;} -case 373: -#line 2065 "parse.y" +case 378: +#line 2077 "parse.y" { yyvsp[0].itype = suspend_momentary (); yyval.ttype = start_enum (make_anon_name ()); ; break;} -case 374: -#line 2068 "parse.y" +case 379: +#line 2080 "parse.y" { yyval.ttype = finish_enum (yyvsp[-3].ttype, yyvsp[-2].ttype); resume_momentary ((int) yyvsp[-5].itype); check_for_missing_semicolon (yyvsp[-3].ttype); ; break;} -case 375: -#line 2072 "parse.y" +case 380: +#line 2084 "parse.y" { yyval.ttype = finish_enum (start_enum (make_anon_name()), NULL_TREE); check_for_missing_semicolon (yyval.ttype); ; break;} -case 376: -#line 2075 "parse.y" +case 381: +#line 2087 "parse.y" { yyval.ttype = xref_tag (enum_type_node, yyvsp[0].ttype, NULL_TREE, 0); ; break;} -case 377: -#line 2077 "parse.y" +case 382: +#line 2089 "parse.y" { yyval.ttype = xref_tag (enum_type_node, yyvsp[0].ttype, NULL_TREE, 0); ; break;} -case 378: -#line 2081 "parse.y" +case 383: +#line 2093 "parse.y" { int semi; tree id; @@ -5649,8 +5695,8 @@ case 378: if (! semi) check_for_missing_semicolon (yyval.ttype); ; break;} -case 379: -#line 2132 "parse.y" +case 384: +#line 2144 "parse.y" { #if 0 /* It's no longer clear what the following error is supposed to @@ -5664,72 +5710,72 @@ case 379: #endif ; break;} -case 383: -#line 2154 "parse.y" +case 388: +#line 2166 "parse.y" { if (pedantic) pedwarn ("comma at end of enumerator list"); ; break;} -case 385: -#line 2159 "parse.y" +case 390: +#line 2171 "parse.y" { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} -case 386: -#line 2161 "parse.y" +case 391: +#line 2173 "parse.y" { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} -case 387: -#line 2163 "parse.y" +case 392: +#line 2175 "parse.y" { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} -case 388: -#line 2165 "parse.y" +case 393: +#line 2177 "parse.y" { error ("no body nor ';' separates two class, struct or union declarations"); ; break;} -case 389: -#line 2170 "parse.y" +case 394: +#line 2182 "parse.y" { yyungetc (';', 1); current_aggr = yyval.ttype; yyval.ttype = yyvsp[-1].ttype; if (yyvsp[-3].ttype == ridpointers[(int) RID_TEMPLATE]) instantiate_class_template (yyval.ttype, 2); ; break;} -case 390: -#line 2179 "parse.y" +case 395: +#line 2191 "parse.y" { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 391: -#line 2181 "parse.y" +case 396: +#line 2193 "parse.y" { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 392: -#line 2183 "parse.y" +case 397: +#line 2195 "parse.y" { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 393: -#line 2185 "parse.y" +case 398: +#line 2197 "parse.y" { yyungetc ('{', 1); aggr2: current_aggr = yyval.ttype; yyval.ttype = yyvsp[-1].ttype; overload_template_name (yyval.ttype, 0); ; break;} -case 394: -#line 2191 "parse.y" +case 399: +#line 2203 "parse.y" { yyungetc (':', 1); goto aggr2; ; break;} -case 396: -#line 2197 "parse.y" +case 401: +#line 2209 "parse.y" { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 397: -#line 2201 "parse.y" +case 402: +#line 2213 "parse.y" { yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, NULL_TREE, 1); ; break;} -case 398: -#line 2204 "parse.y" +case 403: +#line 2216 "parse.y" { yyval.ttype = xref_defn_tag (current_aggr, yyvsp[0].ttype, NULL_TREE); ; break;} -case 399: -#line 2209 "parse.y" +case 404: +#line 2221 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = xref_tag (current_aggr, yyvsp[-2].ttype, yyvsp[0].ttype, 1); @@ -5737,8 +5783,8 @@ case 399: yyval.ttype = yyvsp[-1].ttype; ; break;} -case 400: -#line 2218 "parse.y" +case 405: +#line 2230 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = xref_defn_tag (current_aggr, yyvsp[-2].ttype, yyvsp[0].ttype); @@ -5746,29 +5792,29 @@ case 400: yyval.ttype = yyvsp[-1].ttype; ; break;} -case 401: -#line 2227 "parse.y" +case 406: +#line 2239 "parse.y" { yyval.ttype = xref_tag (yyval.ttype, make_anon_name (), NULL_TREE, 0); yyungetc ('{', 1); ; break;} -case 404: -#line 2235 "parse.y" +case 409: +#line 2247 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 405: -#line 2237 "parse.y" +case 410: +#line 2249 "parse.y" { yyungetc(':', 1); yyval.ttype = NULL_TREE; ; break;} -case 406: -#line 2239 "parse.y" +case 411: +#line 2251 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 408: -#line 2245 "parse.y" +case 413: +#line 2257 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 409: -#line 2250 "parse.y" +case 414: +#line 2262 "parse.y" { tree type; do_base_class1: @@ -5796,8 +5842,8 @@ case 409: yyval.ttype = build_tree_list ((tree)access_default, yyval.ttype); ; break;} -case 410: -#line 2277 "parse.y" +case 415: +#line 2289 "parse.y" { tree type; do_base_class2: @@ -5827,8 +5873,8 @@ case 410: yyval.ttype = build_tree_list ((tree) yyval.ttype, yyvsp[0].ttype); ; break;} -case 412: -#line 2310 "parse.y" +case 417: +#line 2322 "parse.y" { if (current_aggr == signature_type_node) { @@ -5851,8 +5897,8 @@ case 412: } ; break;} -case 413: -#line 2332 "parse.y" +case 418: +#line 2344 "parse.y" { if (current_aggr == signature_type_node) { @@ -5875,14 +5921,14 @@ case 413: } ; break;} -case 415: -#line 2358 "parse.y" +case 420: +#line 2370 "parse.y" { if (yyval.ttype != ridpointers[(int)RID_VIRTUAL]) sorry ("non-virtual access"); yyval.itype = access_default_virtual; ; break;} -case 416: -#line 2362 "parse.y" +case 421: +#line 2374 "parse.y" { int err = 0; if (yyvsp[0].itype == access_protected) { @@ -5909,8 +5955,8 @@ case 416: } ; break;} -case 417: -#line 2388 "parse.y" +case 422: +#line 2400 "parse.y" { if (yyvsp[0].ttype != ridpointers[(int)RID_VIRTUAL]) sorry ("non-virtual access"); if (yyval.itype == access_public) @@ -5918,27 +5964,61 @@ case 417: else if (yyval.itype == access_private) yyval.itype = access_private_virtual; ; break;} -case 418: -#line 2397 "parse.y" -{ tree t; +case 423: +#line 2409 "parse.y" +{ tree t = yyvsp[-1].ttype; push_obstacks_nochange (); end_temporary_allocation (); - if (! IS_AGGR_TYPE (yyvsp[-1].ttype)) + if (! IS_AGGR_TYPE (t)) { - yyvsp[-1].ttype = make_lang_type (RECORD_TYPE); - TYPE_NAME (yyvsp[-1].ttype) = get_identifier ("erroneous type"); + t = yyvsp[-1].ttype = make_lang_type (RECORD_TYPE); + TYPE_NAME (t) = get_identifier ("erroneous type"); } - if (TYPE_SIZE (yyvsp[-1].ttype)) - duplicate_tag_error (yyvsp[-1].ttype); - if (TYPE_SIZE (yyvsp[-1].ttype) || TYPE_BEING_DEFINED (yyvsp[-1].ttype)) + if (TYPE_SIZE (t)) + duplicate_tag_error (t); + if (TYPE_SIZE (t) || TYPE_BEING_DEFINED (t)) { - t = make_lang_type (TREE_CODE (yyvsp[-1].ttype)); + t = make_lang_type (TREE_CODE (t)); pushtag (TYPE_IDENTIFIER (yyvsp[-1].ttype), t, 0); yyvsp[-1].ttype = t; } - pushclass (yyvsp[-1].ttype, 0); - TYPE_BEING_DEFINED (yyvsp[-1].ttype) = 1; + pushclass (t, 0); + TYPE_BEING_DEFINED (t) = 1; + /* Reset the interface data, at the earliest possible + moment, as it might have been set via a class foo; + before. */ + /* Don't change signatures. */ + if (! IS_SIGNATURE (t)) + { + extern tree pending_vtables; + int needs_writing; + tree name = TYPE_IDENTIFIER (t); + + CLASSTYPE_INTERFACE_ONLY (t) = interface_only; + SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); + + /* Record how to set the access of this class's + virtual functions. If write_virtuals == 2 or 3, then + inline virtuals are ``extern inline''. */ + switch (write_virtuals) + { + case 0: + case 1: + needs_writing = 1; + break; + case 2: + needs_writing = !! value_member (name, pending_vtables); + break; + case 3: + needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t) + && CLASSTYPE_INTERFACE_KNOWN (t); + break; + default: + needs_writing = 0; + } + CLASSTYPE_VTABLE_NEEDS_WRITING (t) = needs_writing; + } #if 0 t = TYPE_IDENTIFIER (yyvsp[-1].ttype); if (t && IDENTIFIER_TEMPLATE (t)) @@ -5946,12 +6026,12 @@ case 418: #endif ; break;} -case 419: -#line 2426 "parse.y" +case 424: +#line 2472 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 420: -#line 2428 "parse.y" +case 425: +#line 2474 "parse.y" { if (current_aggr == signature_type_node) yyval.ttype = build_tree_list ((tree) access_public, yyval.ttype); @@ -5959,8 +6039,8 @@ case 420: yyval.ttype = build_tree_list ((tree) access_default, yyval.ttype); ; break;} -case 421: -#line 2435 "parse.y" +case 426: +#line 2481 "parse.y" { tree visspec = (tree) yyvsp[-2].itype; @@ -5972,20 +6052,20 @@ case 421: yyval.ttype = chainon (yyval.ttype, build_tree_list (visspec, yyvsp[0].ttype)); ; break;} -case 422: -#line 2446 "parse.y" +case 427: +#line 2492 "parse.y" { if (current_aggr == signature_type_node) error ("access specifier not allowed in signature"); ; break;} -case 423: -#line 2456 "parse.y" +case 428: +#line 2502 "parse.y" { if (yyval.ttype == void_type_node) yyval.ttype = NULL_TREE; ; break;} -case 424: -#line 2459 "parse.y" +case 429: +#line 2505 "parse.y" { /* In pushdecl, we created a reverse list of names in this binding level. Make sure that the chain of what we're trying to add isn't the item itself @@ -5999,64 +6079,64 @@ case 424: } ; break;} -case 427: -#line 2477 "parse.y" +case 432: +#line 2523 "parse.y" { error ("missing ';' before right brace"); yyungetc ('}', 0); ; break;} -case 428: -#line 2482 "parse.y" +case 433: +#line 2528 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} -case 429: -#line 2484 "parse.y" +case 434: +#line 2530 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} -case 430: -#line 2492 "parse.y" +case 435: +#line 2538 "parse.y" { yyval.ttype = grok_x_components (yyval.ttype, yyvsp[0].ttype); ; break;} -case 431: -#line 2496 "parse.y" +case 436: +#line 2542 "parse.y" { yyval.ttype = grok_x_components (yyval.ttype, yyvsp[0].ttype); ; break;} -case 432: -#line 2500 "parse.y" +case 437: +#line 2546 "parse.y" { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 433: -#line 2503 "parse.y" +case 438: +#line 2549 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ; break;} -case 434: -#line 2505 "parse.y" +case 439: +#line 2551 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 435: -#line 2516 "parse.y" +case 440: +#line 2562 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, TREE_VALUE (yyvsp[-4].ttype), yyvsp[-2].ttype, yyvsp[0].ttype); yyval.ttype = grokfield (yyval.ttype, TREE_CHAIN (yyvsp[-4].ttype), NULL_TREE, NULL_TREE, NULL_TREE); ; break;} -case 436: -#line 2521 "parse.y" +case 441: +#line 2567 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, TREE_VALUE (yyvsp[-2].ttype), empty_parms (), yyvsp[0].ttype); yyval.ttype = grokfield (yyval.ttype, TREE_CHAIN (yyvsp[-2].ttype), NULL_TREE, NULL_TREE, NULL_TREE); ; break;} -case 437: -#line 2530 "parse.y" +case 442: +#line 2576 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 439: -#line 2533 "parse.y" +case 444: +#line 2579 "parse.y" { /* In this context, void_type_node encodes friends. They have been recorded elsewhere. */ @@ -6066,12 +6146,12 @@ case 439: yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 440: -#line 2545 "parse.y" +case 445: +#line 2591 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 442: -#line 2548 "parse.y" +case 447: +#line 2594 "parse.y" { /* In this context, void_type_node encodes friends. They have been recorded elsewhere. */ @@ -6081,105 +6161,105 @@ case 442: yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 447: -#line 2570 "parse.y" +case 452: +#line 2616 "parse.y" { current_declspecs = yyvsp[-4].ttype; yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 448: -#line 2574 "parse.y" +case 453: +#line 2620 "parse.y" { current_declspecs = yyvsp[-6].ttype; yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-4].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-2].ttype); ; break;} -case 449: -#line 2578 "parse.y" +case 454: +#line 2624 "parse.y" { current_declspecs = yyvsp[-4].ttype; yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 450: -#line 2585 "parse.y" +case 455: +#line 2631 "parse.y" { current_declspecs = yyvsp[-4].ttype; yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 451: -#line 2589 "parse.y" +case 456: +#line 2635 "parse.y" { current_declspecs = yyvsp[-6].ttype; yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-4].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-2].ttype); ; break;} -case 452: -#line 2593 "parse.y" +case 457: +#line 2639 "parse.y" { current_declspecs = yyvsp[-4].ttype; yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 453: -#line 2597 "parse.y" +case 458: +#line 2643 "parse.y" { current_declspecs = yyvsp[-3].ttype; yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 454: -#line 2604 "parse.y" +case 459: +#line 2650 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 455: -#line 2607 "parse.y" +case 460: +#line 2653 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-4].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-2].ttype); ; break;} -case 456: -#line 2610 "parse.y" +case 461: +#line 2656 "parse.y" { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 457: -#line 2616 "parse.y" +case 462: +#line 2662 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 458: -#line 2619 "parse.y" +case 463: +#line 2665 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[-4].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[-2].ttype); ; break;} -case 459: -#line 2622 "parse.y" +case 464: +#line 2668 "parse.y" { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 460: -#line 2625 "parse.y" +case 465: +#line 2671 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype); ; break;} -case 462: -#line 2636 "parse.y" +case 467: +#line 2682 "parse.y" { TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 463: -#line 2641 "parse.y" +case 468: +#line 2687 "parse.y" { yyval.ttype = build_enumerator (yyval.ttype, NULL_TREE); ; break;} -case 464: -#line 2643 "parse.y" +case 469: +#line 2689 "parse.y" { yyval.ttype = build_enumerator (yyval.ttype, yyvsp[0].ttype); ; break;} -case 465: -#line 2649 "parse.y" +case 470: +#line 2695 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 466: -#line 2651 "parse.y" +case 471: +#line 2697 "parse.y" { yyval.ttype = build_decl_list (yyval.ttype, NULL_TREE); ; break;} -case 467: -#line 2655 "parse.y" +case 472: +#line 2701 "parse.y" { if (flag_ansi) pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new"); @@ -6187,54 +6267,54 @@ case 467: yyval.ttype = build_decl_list (TREE_PURPOSE (yyvsp[-4].ttype), yyval.ttype); ; break;} -case 468: -#line 2665 "parse.y" +case 473: +#line 2711 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 469: -#line 2667 "parse.y" +case 474: +#line 2713 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 470: -#line 2672 "parse.y" +case 475: +#line 2718 "parse.y" { yyval.ttype = IDENTIFIER_AS_LIST (yyval.ttype); ; break;} -case 471: -#line 2674 "parse.y" +case 476: +#line 2720 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 472: -#line 2682 "parse.y" +case 477: +#line 2728 "parse.y" { yyval.itype = suspend_momentary (); ; break;} -case 473: -#line 2683 "parse.y" +case 478: +#line 2729 "parse.y" { resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = yyvsp[0].ttype; ; break;} -case 474: -#line 2690 "parse.y" +case 479: +#line 2736 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 475: -#line 2692 "parse.y" +case 480: +#line 2738 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 476: -#line 2694 "parse.y" +case 481: +#line 2740 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 477: -#line 2696 "parse.y" +case 482: +#line 2742 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 478: -#line 2698 "parse.y" +case 483: +#line 2744 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 480: -#line 2706 "parse.y" +case 485: +#line 2752 "parse.y" { /* Remember that this name has been used in the class definition, as per [class.scope0] */ @@ -6248,313 +6328,309 @@ case 480: } ; break;} -case 482: -#line 2723 "parse.y" +case 487: +#line 2769 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 483: -#line 2728 "parse.y" +case 488: +#line 2774 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 484: -#line 2730 "parse.y" +case 489: +#line 2776 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 485: -#line 2732 "parse.y" +case 490: +#line 2778 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, empty_parms (), yyvsp[0].ttype); ; break;} -case 486: -#line 2734 "parse.y" +case 491: +#line 2780 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, NULL_TREE, NULL_TREE); ; break;} -case 487: -#line 2736 "parse.y" +case 492: +#line 2782 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 488: -#line 2738 "parse.y" +case 493: +#line 2784 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} -case 489: -#line 2740 "parse.y" +case 494: +#line 2786 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 490: -#line 2742 "parse.y" +case 495: +#line 2788 "parse.y" { push_nested_class (TREE_TYPE (yyval.ttype), 3); yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; break;} -case 492: -#line 2753 "parse.y" +case 497: +#line 2799 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 493: -#line 2755 "parse.y" +case 498: +#line 2801 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 494: -#line 2757 "parse.y" +case 499: +#line 2803 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 495: -#line 2759 "parse.y" +case 500: +#line 2805 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 496: -#line 2761 "parse.y" +case 501: +#line 2807 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 498: -#line 2769 "parse.y" +case 503: +#line 2815 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 499: -#line 2771 "parse.y" +case 504: +#line 2817 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 500: -#line 2773 "parse.y" +case 505: +#line 2819 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 501: -#line 2775 "parse.y" +case 506: +#line 2821 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 502: -#line 2777 "parse.y" +case 507: +#line 2823 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 504: -#line 2785 "parse.y" +case 509: +#line 2831 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 505: -#line 2787 "parse.y" +case 510: +#line 2833 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 506: -#line 2789 "parse.y" +case 511: +#line 2835 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, empty_parms (), yyvsp[0].ttype); ; break;} -case 507: -#line 2791 "parse.y" +case 512: +#line 2837 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, NULL_TREE, NULL_TREE); ; break;} -case 508: -#line 2793 "parse.y" -{ yyval.ttype = finish_decl_parsing (yyvsp[-1].ttype); ; - break;} -case 509: -#line 2795 "parse.y" +case 513: +#line 2839 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 510: -#line 2797 "parse.y" +case 514: +#line 2841 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 511: -#line 2799 "parse.y" +case 515: +#line 2843 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} -case 512: -#line 2804 "parse.y" +case 516: +#line 2848 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} -case 513: -#line 2810 "parse.y" +case 517: +#line 2854 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} -case 515: -#line 2817 "parse.y" +case 519: +#line 2861 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 516: -#line 2822 "parse.y" +case 520: +#line 2866 "parse.y" { yyval.ttype = build_functional_cast (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 517: -#line 2824 "parse.y" +case 521: +#line 2868 "parse.y" { yyval.ttype = reparse_decl_as_expr (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 518: -#line 2826 "parse.y" +case 522: +#line 2870 "parse.y" { yyval.ttype = reparse_absdcl_as_expr (yyval.ttype, yyvsp[0].ttype); ; break;} -case 522: -#line 2837 "parse.y" +case 526: +#line 2881 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 523: -#line 2844 "parse.y" +case 527: +#line 2888 "parse.y" { got_scope = TREE_TYPE (yyval.ttype); ; break;} -case 524: -#line 2846 "parse.y" +case 528: +#line 2890 "parse.y" { got_scope = TREE_TYPE (yyval.ttype); ; break;} -case 526: -#line 2862 "parse.y" +case 530: +#line 2906 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 528: -#line 2868 "parse.y" +case 532: +#line 2912 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} -case 529: -#line 2873 "parse.y" +case 533: +#line 2917 "parse.y" { got_scope = NULL_TREE; ; break;} -case 530: -#line 2875 "parse.y" +case 534: +#line 2919 "parse.y" { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; break;} -case 531: -#line 2882 "parse.y" +case 535: +#line 2926 "parse.y" { got_scope = void_type_node; ; break;} -case 532: -#line 2888 "parse.y" +case 536: +#line 2932 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 533: -#line 2890 "parse.y" +case 537: +#line 2934 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} -case 534: -#line 2892 "parse.y" +case 538: +#line 2936 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 535: -#line 2894 "parse.y" +case 539: +#line 2938 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} -case 536: -#line 2896 "parse.y" +case 540: +#line 2940 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} -case 537: -#line 2900 "parse.y" +case 541: +#line 2944 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 539: -#line 2909 "parse.y" +case 543: +#line 2953 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} -case 540: -#line 2911 "parse.y" +case 544: +#line 2955 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 541: -#line 2917 "parse.y" +case 545: +#line 2961 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 542: -#line 2919 "parse.y" +case 546: +#line 2963 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 543: -#line 2921 "parse.y" +case 547: +#line 2965 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} -case 544: -#line 2923 "parse.y" +case 548: +#line 2967 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; break;} -case 545: -#line 2925 "parse.y" +case 549: +#line 2969 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 546: -#line 2927 "parse.y" +case 550: +#line 2971 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} -case 547: -#line 2929 "parse.y" +case 551: +#line 2973 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} -case 548: -#line 2931 "parse.y" +case 552: +#line 2975 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; break;} -case 549: -#line 2933 "parse.y" +case 553: +#line 2977 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} -case 550: -#line 2937 "parse.y" +case 554: +#line 2981 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 552: -#line 2946 "parse.y" +case 556: +#line 2990 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 554: -#line 2950 "parse.y" +case 558: +#line 2994 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 555: -#line 2952 "parse.y" +case 559: +#line 2996 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, yyval.ttype, empty_parms (), yyvsp[0].ttype); ; break;} -case 556: -#line 2954 "parse.y" +case 560: +#line 2998 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} -case 557: -#line 2956 "parse.y" +case 561: +#line 3000 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} -case 558: -#line 2958 "parse.y" +case 562: +#line 3002 "parse.y" { yyval.ttype = build_parse_node (CALL_EXPR, NULL_TREE, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} -case 559: -#line 2960 "parse.y" +case 563: +#line 3004 "parse.y" { TREE_OPERAND (yyval.ttype, 2) = yyvsp[0].ttype; ; break;} -case 560: -#line 2962 "parse.y" +case 564: +#line 3006 "parse.y" { TREE_OPERAND (yyval.ttype, 2) = yyvsp[0].ttype; ; break;} -case 561: -#line 2964 "parse.y" +case 565: +#line 3008 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} -case 562: -#line 2966 "parse.y" +case 566: +#line 3010 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ; break;} -case 568: -#line 2988 "parse.y" +case 572: +#line 3032 "parse.y" { emit_line_note (input_filename, lineno); pushlevel (0); clear_last_expr (); push_momentary (); expand_start_bindings (0); ; break;} -case 570: -#line 3000 "parse.y" +case 574: +#line 3044 "parse.y" { if (flag_ansi) pedwarn ("ANSI C++ forbids label declarations"); ; break;} -case 573: -#line 3011 "parse.y" +case 577: +#line 3055 "parse.y" { tree link; for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link)) { @@ -6564,63 +6640,63 @@ case 573: } ; break;} -case 574: -#line 3025 "parse.y" +case 578: +#line 3069 "parse.y" {; break;} -case 576: -#line 3030 "parse.y" +case 580: +#line 3074 "parse.y" { expand_end_bindings (getdecls (), kept_level_p(), 1); yyval.ttype = poplevel (kept_level_p (), 1, 0); pop_momentary (); ; break;} -case 577: -#line 3034 "parse.y" +case 581: +#line 3078 "parse.y" { expand_end_bindings (getdecls (), kept_level_p(), 1); yyval.ttype = poplevel (kept_level_p (), 1, 0); pop_momentary (); ; break;} -case 578: -#line 3038 "parse.y" +case 582: +#line 3082 "parse.y" { expand_end_bindings (getdecls (), kept_level_p(), 1); yyval.ttype = poplevel (kept_level_p (), 0, 0); pop_momentary (); ; break;} -case 579: -#line 3042 "parse.y" +case 583: +#line 3086 "parse.y" { expand_end_bindings (getdecls (), kept_level_p(), 1); yyval.ttype = poplevel (kept_level_p (), 0, 0); pop_momentary (); ; break;} -case 580: -#line 3049 "parse.y" +case 584: +#line 3093 "parse.y" { cond_stmt_keyword = "if"; ; break;} -case 581: -#line 3051 "parse.y" +case 585: +#line 3095 "parse.y" { emit_line_note (input_filename, lineno); - expand_start_cond (bool_truthvalue_conversion (yyvsp[0].ttype), 0); ; + expand_start_cond (yyvsp[0].ttype, 0); ; break;} -case 583: -#line 3058 "parse.y" +case 587: +#line 3102 "parse.y" { finish_stmt (); ; break;} -case 584: -#line 3060 "parse.y" +case 588: +#line 3104 "parse.y" { expand_end_bindings (getdecls (), kept_level_p (), 1); yyval.ttype = poplevel (kept_level_p (), 1, 0); pop_momentary (); ; break;} -case 585: -#line 3067 "parse.y" +case 589: +#line 3111 "parse.y" { finish_stmt (); ; break;} -case 587: -#line 3073 "parse.y" +case 591: +#line 3117 "parse.y" { finish_stmt (); ; break;} -case 588: -#line 3075 "parse.y" +case 592: +#line 3119 "parse.y" { tree expr = yyvsp[-1].ttype; emit_line_note (input_filename, lineno); @@ -6634,82 +6710,82 @@ case 588: clear_momentary (); finish_stmt (); ; break;} -case 589: -#line 3088 "parse.y" +case 593: +#line 3132 "parse.y" { expand_start_else (); ; break;} -case 590: -#line 3090 "parse.y" +case 594: +#line 3134 "parse.y" { expand_end_cond (); expand_end_bindings (getdecls (), kept_level_p (), 1); poplevel (kept_level_p (), 1, 0); pop_momentary (); finish_stmt (); ; break;} -case 591: -#line 3096 "parse.y" +case 595: +#line 3140 "parse.y" { expand_end_cond (); expand_end_bindings (getdecls (), kept_level_p (), 1); poplevel (kept_level_p (), 1, 0); pop_momentary (); finish_stmt (); ; break;} -case 592: -#line 3102 "parse.y" +case 596: +#line 3146 "parse.y" { emit_nop (); emit_line_note (input_filename, lineno); expand_start_loop (1); cond_stmt_keyword = "while"; ; break;} -case 593: -#line 3107 "parse.y" -{ expand_exit_loop_if_false (0, bool_truthvalue_conversion (yyvsp[0].ttype)); ; +case 597: +#line 3151 "parse.y" +{ expand_exit_loop_if_false (0, yyvsp[0].ttype); ; break;} -case 594: -#line 3109 "parse.y" +case 598: +#line 3153 "parse.y" { expand_end_bindings (getdecls (), kept_level_p (), 1); poplevel (kept_level_p (), 1, 0); pop_momentary (); expand_end_loop (); finish_stmt (); ; break;} -case 595: -#line 3115 "parse.y" +case 599: +#line 3159 "parse.y" { emit_nop (); emit_line_note (input_filename, lineno); expand_start_loop_continue_elsewhere (1); ; break;} -case 596: -#line 3119 "parse.y" +case 600: +#line 3163 "parse.y" { expand_loop_continue_here (); cond_stmt_keyword = "do"; ; break;} -case 597: -#line 3122 "parse.y" +case 601: +#line 3166 "parse.y" { emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (0, bool_truthvalue_conversion (yyvsp[-1].ttype)); + expand_exit_loop_if_false (0, yyvsp[-1].ttype); expand_end_loop (); clear_momentary (); finish_stmt (); ; break;} -case 598: -#line 3128 "parse.y" +case 602: +#line 3172 "parse.y" { emit_nop (); emit_line_note (input_filename, lineno); if (yyvsp[0].ttype) cplus_expand_expr_stmt (yyvsp[0].ttype); expand_start_loop_continue_elsewhere (1); ; break;} -case 599: -#line 3133 "parse.y" +case 603: +#line 3177 "parse.y" { emit_line_note (input_filename, lineno); - if (yyvsp[-1].ttype) expand_exit_loop_if_false (0, bool_truthvalue_conversion (yyvsp[-1].ttype)); ; + if (yyvsp[-1].ttype) expand_exit_loop_if_false (0, yyvsp[-1].ttype); ; break;} -case 600: -#line 3138 "parse.y" +case 604: +#line 3182 "parse.y" { push_momentary (); ; break;} -case 601: -#line 3140 "parse.y" +case 605: +#line 3184 "parse.y" { emit_line_note (input_filename, lineno); expand_end_bindings (getdecls (), kept_level_p (), 1); poplevel (kept_level_p (), 1, 0); @@ -6720,24 +6796,24 @@ case 601: expand_end_loop (); finish_stmt (); ; break;} -case 602: -#line 3150 "parse.y" +case 606: +#line 3194 "parse.y" { emit_nop (); emit_line_note (input_filename, lineno); expand_start_loop_continue_elsewhere (1); ; break;} -case 603: -#line 3154 "parse.y" +case 607: +#line 3198 "parse.y" { emit_line_note (input_filename, lineno); - if (yyvsp[-1].ttype) expand_exit_loop_if_false (0, bool_truthvalue_conversion (yyvsp[-1].ttype)); ; + if (yyvsp[-1].ttype) expand_exit_loop_if_false (0, yyvsp[-1].ttype); ; break;} -case 604: -#line 3159 "parse.y" +case 608: +#line 3203 "parse.y" { push_momentary (); yyvsp[0].itype = lineno; ; break;} -case 605: -#line 3162 "parse.y" +case 609: +#line 3206 "parse.y" { emit_line_note (input_filename, (int) yyvsp[-2].itype); expand_end_bindings (getdecls (), kept_level_p (), 1); poplevel (kept_level_p (), 1, 0); @@ -6749,16 +6825,16 @@ case 605: finish_stmt (); ; break;} -case 606: -#line 3173 "parse.y" +case 610: +#line 3217 "parse.y" { emit_line_note (input_filename, lineno); - c_expand_start_case (yyvsp[-1].ttype); + c_expand_start_case (yyvsp[-1].ttype); /* Don't let the tree nodes for $4 be discarded by clear_momentary during the parsing of the next stmt. */ push_momentary (); ; break;} -case 607: -#line 3179 "parse.y" +case 611: +#line 3223 "parse.y" { expand_end_case (yyvsp[-3].ttype); pop_momentary (); expand_end_bindings (getdecls (), kept_level_p (), 1); @@ -6766,8 +6842,8 @@ case 607: pop_momentary (); finish_stmt (); ; break;} -case 608: -#line 3186 "parse.y" +case 612: +#line 3230 "parse.y" { register tree value = check_cp_case_value (yyvsp[-1].ttype); register tree label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); @@ -6792,8 +6868,8 @@ case 608: define_case_label (label); ; break;} -case 610: -#line 3211 "parse.y" +case 614: +#line 3255 "parse.y" { register tree value1 = check_cp_case_value (yyvsp[-3].ttype); register tree value2 = check_cp_case_value (yyvsp[-1].ttype); register tree label @@ -6825,8 +6901,8 @@ case 610: define_case_label (label); ; break;} -case 612: -#line 3243 "parse.y" +case 616: +#line 3287 "parse.y" { tree duplicate; register tree label @@ -6842,40 +6918,40 @@ case 612: define_case_label (NULL_TREE); ; break;} -case 614: -#line 3259 "parse.y" +case 618: +#line 3303 "parse.y" { emit_line_note (input_filename, lineno); if ( ! expand_exit_something ()) error ("break statement not within loop or switch"); ; break;} -case 615: -#line 3263 "parse.y" +case 619: +#line 3307 "parse.y" { emit_line_note (input_filename, lineno); if (! expand_continue_loop (0)) error ("continue statement not within a loop"); ; break;} -case 616: -#line 3267 "parse.y" +case 620: +#line 3311 "parse.y" { emit_line_note (input_filename, lineno); c_expand_return (NULL_TREE); ; break;} -case 617: -#line 3270 "parse.y" +case 621: +#line 3314 "parse.y" { emit_line_note (input_filename, lineno); c_expand_return (yyvsp[-1].ttype); finish_stmt (); ; break;} -case 618: -#line 3275 "parse.y" +case 622: +#line 3319 "parse.y" { if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); emit_line_note (input_filename, lineno); expand_asm (yyvsp[-2].ttype); finish_stmt (); ; break;} -case 619: -#line 3282 "parse.y" +case 623: +#line 3326 "parse.y" { if (TREE_CHAIN (yyvsp[-4].ttype)) yyvsp[-4].ttype = combine_strings (yyvsp[-4].ttype); emit_line_note (input_filename, lineno); c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, @@ -6884,8 +6960,8 @@ case 619: finish_stmt (); ; break;} -case 620: -#line 3291 "parse.y" +case 624: +#line 3335 "parse.y" { if (TREE_CHAIN (yyvsp[-6].ttype)) yyvsp[-6].ttype = combine_strings (yyvsp[-6].ttype); emit_line_note (input_filename, lineno); c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, @@ -6894,8 +6970,8 @@ case 620: finish_stmt (); ; break;} -case 621: -#line 3301 "parse.y" +case 625: +#line 3345 "parse.y" { if (TREE_CHAIN (yyvsp[-8].ttype)) yyvsp[-8].ttype = combine_strings (yyvsp[-8].ttype); emit_line_note (input_filename, lineno); c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, @@ -6904,83 +6980,83 @@ case 621: finish_stmt (); ; break;} -case 622: -#line 3309 "parse.y" +case 626: +#line 3353 "parse.y" { emit_line_note (input_filename, lineno); expand_computed_goto (yyvsp[-1].ttype); ; break;} -case 623: -#line 3312 "parse.y" +case 627: +#line 3356 "parse.y" { tree decl; emit_line_note (input_filename, lineno); decl = lookup_label (yyvsp[-1].ttype); TREE_USED (decl) = 1; expand_goto (decl); ; break;} -case 624: -#line 3318 "parse.y" +case 628: +#line 3362 "parse.y" { finish_stmt (); ; break;} -case 625: -#line 3320 "parse.y" +case 629: +#line 3364 "parse.y" { error ("label must be followed by statement"); yyungetc ('}', 0); finish_stmt (); ; break;} -case 626: -#line 3324 "parse.y" +case 630: +#line 3368 "parse.y" { finish_stmt (); ; break;} -case 628: -#line 3330 "parse.y" +case 632: +#line 3374 "parse.y" { expand_start_try_stmts (); ; break;} -case 629: -#line 3332 "parse.y" +case 633: +#line 3376 "parse.y" { expand_end_try_stmts (); expand_start_all_catch (); ; break;} -case 630: -#line 3335 "parse.y" +case 634: +#line 3379 "parse.y" { expand_end_all_catch (); ; break;} -case 631: -#line 3343 "parse.y" +case 635: +#line 3387 "parse.y" { expand_end_bindings (0,1,1); poplevel (2,0,0); ; break;} -case 632: -#line 3347 "parse.y" +case 636: +#line 3391 "parse.y" { expand_end_bindings (0,1,1); poplevel (2,0,0); ; break;} -case 633: -#line 3351 "parse.y" +case 637: +#line 3395 "parse.y" { expand_end_bindings (0,1,1); poplevel (2,0,0); ; break;} -case 635: -#line 3359 "parse.y" +case 639: +#line 3403 "parse.y" { emit_line_note (input_filename, lineno); ; break;} -case 636: -#line 3361 "parse.y" +case 640: +#line 3405 "parse.y" { expand_end_catch_block (); ; break;} -case 639: -#line 3371 "parse.y" +case 643: +#line 3415 "parse.y" { expand_start_catch_block (NULL_TREE, NULL_TREE); ; break;} -case 640: -#line 3383 "parse.y" +case 644: +#line 3427 "parse.y" { expand_start_catch_block (TREE_PURPOSE (yyvsp[-1].ttype), TREE_VALUE (yyvsp[-1].ttype)); ; break;} -case 641: -#line 3389 "parse.y" +case 645: +#line 3433 "parse.y" { tree label; do_label: label = define_label (input_filename, lineno, yyvsp[-1].ttype); @@ -6988,77 +7064,81 @@ case 641: expand_label (label); ; break;} -case 642: -#line 3396 "parse.y" +case 646: +#line 3440 "parse.y" +{ goto do_label; ; + break;} +case 647: +#line 3442 "parse.y" { goto do_label; ; break;} -case 643: -#line 3401 "parse.y" +case 648: +#line 3447 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 644: -#line 3403 "parse.y" +case 649: +#line 3449 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 645: -#line 3405 "parse.y" +case 650: +#line 3451 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 646: -#line 3410 "parse.y" +case 651: +#line 3456 "parse.y" { yyval.itype = 0; ; break;} -case 647: -#line 3412 "parse.y" +case 652: +#line 3458 "parse.y" { yyval.itype = 0; ; break;} -case 648: -#line 3414 "parse.y" +case 653: +#line 3460 "parse.y" { yyval.itype = 1; ; break;} -case 649: -#line 3416 "parse.y" +case 654: +#line 3462 "parse.y" { yyval.itype = -1; ; break;} -case 650: -#line 3423 "parse.y" +case 655: +#line 3469 "parse.y" { emit_line_note (input_filename, lineno); yyval.ttype = NULL_TREE; ; break;} -case 651: -#line 3426 "parse.y" +case 656: +#line 3472 "parse.y" { emit_line_note (input_filename, lineno); ; break;} -case 652: -#line 3431 "parse.y" +case 657: +#line 3477 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 654: -#line 3434 "parse.y" +case 659: +#line 3480 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 655: -#line 3440 "parse.y" +case 660: +#line 3486 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 658: -#line 3447 "parse.y" +case 663: +#line 3493 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 659: -#line 3452 "parse.y" +case 664: +#line 3498 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ; break;} -case 660: -#line 3457 "parse.y" +case 665: +#line 3503 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ; break;} -case 661: -#line 3459 "parse.y" +case 666: +#line 3505 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} -case 662: -#line 3469 "parse.y" +case 667: +#line 3515 "parse.y" { if (strict_prototype) yyval.ttype = void_list_node; @@ -7066,39 +7146,39 @@ case 662: yyval.ttype = NULL_TREE; ; break;} -case 664: -#line 3477 "parse.y" +case 669: +#line 3523 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, void_list_node); TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 665: -#line 3485 "parse.y" +case 670: +#line 3531 "parse.y" { yyval.ttype = chainon (yyval.ttype, void_list_node); TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 666: -#line 3490 "parse.y" +case 671: +#line 3536 "parse.y" { TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 667: -#line 3495 "parse.y" +case 672: +#line 3541 "parse.y" { TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 668: -#line 3499 "parse.y" +case 673: +#line 3545 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 669: -#line 3504 "parse.y" +case 674: +#line 3550 "parse.y" { /* ARM $8.2.5 has this as a boxed-off comment. */ if (pedantic) @@ -7106,27 +7186,27 @@ case 669: yyval.ttype = NULL_TREE; ; break;} -case 670: -#line 3511 "parse.y" +case 675: +#line 3557 "parse.y" { TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 671: -#line 3515 "parse.y" +case 676: +#line 3561 "parse.y" { TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 672: -#line 3519 "parse.y" +case 677: +#line 3565 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); TREE_PARMLIST (yyval.ttype) = 1; ; break;} -case 673: -#line 3524 "parse.y" +case 678: +#line 3570 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7138,8 +7218,8 @@ case 673: yychar = ')'; ; break;} -case 674: -#line 3535 "parse.y" +case 679: +#line 3581 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7151,255 +7231,259 @@ case 674: yychar = ')'; ; break;} -case 675: -#line 3550 "parse.y" +case 680: +#line 3596 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 676: -#line 3552 "parse.y" +case 681: +#line 3598 "parse.y" { yyval.ttype = build_tree_list (yyvsp[0].ttype, yyval.ttype); ; break;} -case 677: -#line 3554 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 678: -#line 3556 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; +case 682: +#line 3600 "parse.y" +{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} -case 679: -#line 3558 "parse.y" +case 683: +#line 3602 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} -case 680: -#line 3560 "parse.y" +case 684: +#line 3604 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; break;} -case 682: -#line 3566 "parse.y" +case 686: +#line 3610 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} -case 683: -#line 3589 "parse.y" +case 687: +#line 3633 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 684: -#line 3591 "parse.y" +case 688: +#line 3635 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 685: -#line 3593 "parse.y" +case 689: +#line 3637 "parse.y" { yyval.ttype = build_tree_list (get_decl_list (yyval.ttype), yyvsp[0].ttype); ; break;} -case 686: -#line 3595 "parse.y" +case 690: +#line 3639 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 687: -#line 3597 "parse.y" +case 691: +#line 3641 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, NULL_TREE); ; break;} -case 688: -#line 3599 "parse.y" +case 692: +#line 3643 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} -case 691: -#line 3608 "parse.y" +case 693: +#line 3648 "parse.y" +{ yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; + break;} +case 694: +#line 3650 "parse.y" +{ yyval.ttype = build_tree_list (yyvsp[0].ttype, yyval.ttype); ; + break;} +case 697: +#line 3659 "parse.y" { see_typename (); ; break;} -case 692: -#line 3631 "parse.y" +case 698: +#line 3682 "parse.y" { warning ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (TREE_PURPOSE (TREE_VALUE (yyvsp[-1].ttype)), NULL_TREE); ; break;} -case 693: -#line 3636 "parse.y" +case 699: +#line 3687 "parse.y" { warning ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (TREE_PURPOSE (TREE_VALUE (yyvsp[-2].ttype)), yyval.ttype); ; break;} -case 694: -#line 3644 "parse.y" +case 700: +#line 3695 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 695: -#line 3646 "parse.y" +case 701: +#line 3697 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} -case 696: -#line 3651 "parse.y" +case 702: +#line 3702 "parse.y" { yyval.ttype = build_decl_list (NULL_TREE, yyval.ttype); ; break;} -case 698: -#line 3657 "parse.y" +case 704: +#line 3708 "parse.y" { TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} -case 699: -#line 3665 "parse.y" +case 705: +#line 3716 "parse.y" { yyval.ttype = NULL_TREE; ; break;} -case 700: -#line 3667 "parse.y" +case 706: +#line 3718 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 701: -#line 3669 "parse.y" +case 707: +#line 3720 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 702: -#line 3671 "parse.y" +case 708: +#line 3722 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} -case 703: -#line 3677 "parse.y" +case 709: +#line 3728 "parse.y" { got_scope = NULL_TREE; ; break;} -case 704: -#line 3682 "parse.y" +case 710: +#line 3733 "parse.y" { yyval.ttype = ansi_opname[MULT_EXPR]; ; break;} -case 705: -#line 3684 "parse.y" +case 711: +#line 3735 "parse.y" { yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ; break;} -case 706: -#line 3686 "parse.y" +case 712: +#line 3737 "parse.y" { yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ; break;} -case 707: -#line 3688 "parse.y" +case 713: +#line 3739 "parse.y" { yyval.ttype = ansi_opname[PLUS_EXPR]; ; break;} -case 708: -#line 3690 "parse.y" +case 714: +#line 3741 "parse.y" { yyval.ttype = ansi_opname[MINUS_EXPR]; ; break;} -case 709: -#line 3692 "parse.y" +case 715: +#line 3743 "parse.y" { yyval.ttype = ansi_opname[BIT_AND_EXPR]; ; break;} -case 710: -#line 3694 "parse.y" +case 716: +#line 3745 "parse.y" { yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ; break;} -case 711: -#line 3696 "parse.y" +case 717: +#line 3747 "parse.y" { yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ; break;} -case 712: -#line 3698 "parse.y" +case 718: +#line 3749 "parse.y" { yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ; break;} -case 713: -#line 3700 "parse.y" +case 719: +#line 3751 "parse.y" { yyval.ttype = ansi_opname[COMPOUND_EXPR]; ; break;} -case 714: -#line 3702 "parse.y" +case 720: +#line 3753 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} -case 715: -#line 3704 "parse.y" +case 721: +#line 3755 "parse.y" { yyval.ttype = ansi_opname[LT_EXPR]; ; break;} -case 716: -#line 3706 "parse.y" +case 722: +#line 3757 "parse.y" { yyval.ttype = ansi_opname[GT_EXPR]; ; break;} -case 717: -#line 3708 "parse.y" +case 723: +#line 3759 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} -case 718: -#line 3710 "parse.y" +case 724: +#line 3761 "parse.y" { yyval.ttype = ansi_assopname[yyvsp[0].code]; ; break;} -case 719: -#line 3712 "parse.y" +case 725: +#line 3763 "parse.y" { yyval.ttype = ansi_opname [MODIFY_EXPR]; ; break;} -case 720: -#line 3714 "parse.y" +case 726: +#line 3765 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} -case 721: -#line 3716 "parse.y" +case 727: +#line 3767 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} -case 722: -#line 3718 "parse.y" +case 728: +#line 3769 "parse.y" { yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ; break;} -case 723: -#line 3720 "parse.y" +case 729: +#line 3771 "parse.y" { yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ; break;} -case 724: -#line 3722 "parse.y" +case 730: +#line 3773 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ; break;} -case 725: -#line 3724 "parse.y" +case 731: +#line 3775 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ; break;} -case 726: -#line 3726 "parse.y" +case 732: +#line 3777 "parse.y" { yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ; break;} -case 727: -#line 3728 "parse.y" +case 733: +#line 3779 "parse.y" { yyval.ttype = ansi_opname[COND_EXPR]; ; break;} -case 728: -#line 3730 "parse.y" +case 734: +#line 3781 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} -case 729: -#line 3732 "parse.y" +case 735: +#line 3783 "parse.y" { yyval.ttype = ansi_opname[COMPONENT_REF]; ; break;} -case 730: -#line 3734 "parse.y" +case 736: +#line 3785 "parse.y" { yyval.ttype = ansi_opname[MEMBER_REF]; ; break;} -case 731: -#line 3736 "parse.y" +case 737: +#line 3787 "parse.y" { yyval.ttype = ansi_opname[CALL_EXPR]; ; break;} -case 732: -#line 3738 "parse.y" +case 738: +#line 3789 "parse.y" { yyval.ttype = ansi_opname[ARRAY_REF]; ; break;} -case 733: -#line 3740 "parse.y" +case 739: +#line 3791 "parse.y" { yyval.ttype = ansi_opname[NEW_EXPR]; ; break;} -case 734: -#line 3742 "parse.y" +case 740: +#line 3793 "parse.y" { yyval.ttype = ansi_opname[DELETE_EXPR]; ; break;} -case 735: -#line 3744 "parse.y" +case 741: +#line 3795 "parse.y" { yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ; break;} -case 736: -#line 3746 "parse.y" +case 742: +#line 3797 "parse.y" { yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ; break;} -case 737: -#line 3749 "parse.y" +case 743: +#line 3800 "parse.y" { yyval.ttype = grokoptypename (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} -case 738: -#line 3751 "parse.y" +case 744: +#line 3802 "parse.y" { yyval.ttype = ansi_opname[ERROR_MARK]; ; break;} } @@ -7600,5 +7684,15 @@ yyerrhandle: yystate = yyn; goto yynewstate; } -#line 3754 "parse.y" +#line 3805 "parse.y" + + +#ifdef SPEW_DEBUG +const char * +debug_yytranslate (value) + int value; +{ + return yytname[YYTRANSLATE (value)]; +} +#endif diff --git a/gnu/usr.bin/cc/cc1plus/pt.c b/gnu/usr.bin/cc/cc1plus/pt.c index c808cf4..e3c3f0d 100644 --- a/gnu/usr.bin/cc/cc1plus/pt.c +++ b/gnu/usr.bin/cc/cc1plus/pt.c @@ -81,18 +81,19 @@ process_template_parm (list, next) { tree parm; tree decl = 0; + tree defval; int is_type; parm = next; my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259); - is_type = TREE_CODE (TREE_PURPOSE (parm)) == IDENTIFIER_NODE; + defval = TREE_PURPOSE (parm); + parm = TREE_VALUE (parm); + is_type = TREE_PURPOSE (parm) == class_type_node; if (!is_type) { tree tinfo = 0; - parm = TREE_PURPOSE (parm); - my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 260); - parm = TREE_VALUE (parm); + my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260); /* is a const-param */ - parm = grokdeclarator (TREE_VALUE (next), TREE_PURPOSE (next), + parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), PARM, 0, NULL_TREE); /* A template parameter is not modifiable. */ TREE_READONLY (parm) = 1; @@ -117,11 +118,19 @@ process_template_parm (list, next) else { tree t = make_node (TEMPLATE_TYPE_PARM); - decl = build_decl (TYPE_DECL, TREE_PURPOSE (parm), t); - TYPE_NAME (t) = decl; - TREE_VALUE (parm) = t; + decl = build_decl (TYPE_DECL, TREE_VALUE (parm), t); + TYPE_MAIN_DECL (t) = decl; + parm = decl; + if (defval) + { + if (IDENTIFIER_HAS_TYPE_VALUE (defval)) + defval = IDENTIFIER_TYPE_VALUE (defval); + else + defval = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (defval)); + } } pushdecl (decl); + parm = build_tree_list (defval, parm); return chainon (list, parm); } @@ -135,6 +144,7 @@ end_template_parm_list (parms) tree parms; { int nparms = 0; + int saw_default = 0; tree saved_parmlist; tree parm; for (parm = parms; parm; parm = TREE_CHAIN (parm)) @@ -143,13 +153,19 @@ end_template_parm_list (parms) for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++) { - tree p = parm; - if (TREE_CODE (p) == TREE_LIST) + tree p = TREE_VALUE (parm); + if (TREE_PURPOSE (parm)) + saw_default = 1; + else if (saw_default) + { + error ("if a default argument is given for one template parameter"); + error ("default arguments must be given for all subsequent"); + error ("parameters as well"); + } + + if (TREE_CODE (p) == TYPE_DECL) { - tree t = TREE_VALUE (p); - TREE_VALUE (p) = NULL_TREE; - p = TREE_PURPOSE (p); - my_friendly_assert (TREE_CODE (p) == IDENTIFIER_NODE, 261); + tree t = TREE_TYPE (p); TEMPLATE_TYPE_SET_INFO (t, saved_parmlist, nparms); } else @@ -158,7 +174,7 @@ end_template_parm_list (parms) DECL_INITIAL (p) = NULL_TREE; TEMPLATE_CONST_SET_INFO (tinfo, saved_parmlist, nparms); } - TREE_VEC_ELT (saved_parmlist, nparms) = p; + TREE_VEC_ELT (saved_parmlist, nparms) = parm; } set_current_level_tags_transparency (1); processing_template_decl++; @@ -317,7 +333,7 @@ grok_template_type (tvec, type) { /* we are here for cases like const T* etc. */ grok_template_type (tvec, &TYPE_MAIN_VARIANT (*type)); - *type = c_build_type_variant (TYPE_MAIN_VARIANT (*type), + *type = cp_build_type_variant (TYPE_MAIN_VARIANT (*type), TYPE_READONLY (*type), TYPE_VOLATILE (*type)); } @@ -354,51 +370,68 @@ coerce_template_parms (parms, arglist, in_decl) tree parms, arglist; tree in_decl; { - int nparms, i, lost = 0; + int nparms, nargs, i, lost = 0; tree vec; - if (TREE_CODE (arglist) == TREE_VEC) - nparms = TREE_VEC_LENGTH (arglist); + if (arglist == NULL_TREE) + nargs = 0; + else if (TREE_CODE (arglist) == TREE_VEC) + nargs = TREE_VEC_LENGTH (arglist); else - nparms = list_length (arglist); - if (nparms != TREE_VEC_LENGTH (parms)) + nargs = list_length (arglist); + + nparms = TREE_VEC_LENGTH (parms); + + if (nargs > nparms + || (nargs < nparms + && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE)) { error ("incorrect number of parameters (%d, should be %d)", - nparms, TREE_VEC_LENGTH (parms)); + nargs, nparms); if (in_decl) cp_error_at ("in template expansion for decl `%D'", in_decl); return error_mark_node; } - if (TREE_CODE (arglist) == TREE_VEC) + if (arglist && TREE_CODE (arglist) == TREE_VEC) vec = copy_node (arglist); else { vec = make_tree_vec (nparms); for (i = 0; i < nparms; i++) { - tree arg = arglist; - arglist = TREE_CHAIN (arglist); - if (arg == error_mark_node) - lost++; + tree arg; + + if (arglist) + { + arg = arglist; + arglist = TREE_CHAIN (arglist); + + if (arg == error_mark_node) + lost++; + else + arg = TREE_VALUE (arg); + } else - arg = TREE_VALUE (arg); + arg = TREE_PURPOSE (TREE_VEC_ELT (parms, i)); + TREE_VEC_ELT (vec, i) = arg; } } for (i = 0; i < nparms; i++) { tree arg = TREE_VEC_ELT (vec, i); - tree parm = TREE_VEC_ELT (parms, i); + tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i)); tree val = 0; int is_type, requires_type; is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't'; - requires_type = TREE_CODE (parm) == IDENTIFIER_NODE; + requires_type = TREE_CODE (parm) == TYPE_DECL; if (is_type != requires_type) { if (in_decl) - cp_error_at ("type/value mismatch in template parameter list for `%D'", in_decl); + cp_error ("type/value mismatch in template parameter list for `%D'", + in_decl); lost++; TREE_VEC_ELT (vec, i) = error_mark_node; continue; @@ -415,7 +448,7 @@ coerce_template_parms (parms, arglist, in_decl) { grok_template_type (vec, &TREE_TYPE (parm)); val = digest_init (TREE_TYPE (parm), arg, (tree *) 0); - + if (val == error_mark_node) ; @@ -489,12 +522,13 @@ mangle_class_name_for_template (name, parms, arglist) my_friendly_assert (nparms == TREE_VEC_LENGTH (arglist), 268); for (i = 0; i < nparms; i++) { - tree parm = TREE_VEC_ELT (parms, i), arg = TREE_VEC_ELT (arglist, i); + tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i)); + tree arg = TREE_VEC_ELT (arglist, i); if (i) ccat (','); - if (TREE_CODE (parm) == IDENTIFIER_NODE) + if (TREE_CODE (parm) == TYPE_DECL) { cat (type_as_string (arg, 0)); continue; @@ -573,7 +607,7 @@ lookup_template_class (d1, arglist, in_decl) } parmlist = DECL_TEMPLATE_PARMS (template); - arglist = coerce_template_parms (parmlist, arglist, in_decl); + arglist = coerce_template_parms (parmlist, arglist, template); if (arglist == error_mark_node) return error_mark_node; if (uses_template_parms (arglist)) @@ -619,11 +653,11 @@ push_template_decls (parmlist, arglist, class_level) for (i = 0; i < nparms; i++) { int requires_type, is_type; - tree parm = TREE_VEC_ELT (parmlist, i); + tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i)); tree arg = TREE_VEC_ELT (arglist, i); tree decl = 0; - requires_type = TREE_CODE (parm) == IDENTIFIER_NODE; + requires_type = TREE_CODE (parm) == TYPE_DECL; is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't'; if (is_type) { @@ -635,7 +669,7 @@ push_template_decls (parmlist, arglist, class_level) } decl = arg; my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (decl)) == 't', 273); - decl = build_decl (TYPE_DECL, parm, decl); + decl = build_decl (TYPE_DECL, DECL_NAME (parm), decl); } else { @@ -864,23 +898,25 @@ instantiate_member_templates (classname) &TREE_VEC_ELT (parmvec, 0)); type = IDENTIFIER_TYPE_VALUE (id); my_friendly_assert (type != 0, 277); - if (CLASSTYPE_INTERFACE_UNKNOWN (type)) - { - DECL_EXTERNAL (t2) = 0; - TREE_PUBLIC (t2) = 0; - } - else + if (flag_external_templates) { - DECL_EXTERNAL (t2) = CLASSTYPE_INTERFACE_ONLY (type); - TREE_PUBLIC (t2) = 1; + if (CLASSTYPE_INTERFACE_UNKNOWN (type)) + { + DECL_EXTERNAL (t2) = 0; + TREE_PUBLIC (t2) = 0; + } + else + { + DECL_EXTERNAL (t2) = CLASSTYPE_INTERFACE_ONLY (type); + TREE_PUBLIC (t2) = 1; + } } break; case 1: /* Failure. */ failure: - cp_error ("type unification error instantiating %T::%D", - classname, tdecl); - cp_error_at ("for template declaration `%D'", tdecl); + cp_error_at ("type unification error instantiating `%D'", tdecl); + cp_error ("while instantiating members of `%T'", classname); continue /* loop of members */; default: @@ -1125,7 +1161,7 @@ tsubst (t, args, nargs, in_decl) && type != integer_type_node && type != void_type_node && type != char_type_node) - type = c_build_type_variant (tsubst (type, args, nargs, in_decl), + type = cp_build_type_variant (tsubst (type, args, nargs, in_decl), TYPE_READONLY (type), TYPE_VOLATILE (type)); switch (TREE_CODE (t)) @@ -1162,7 +1198,7 @@ tsubst (t, args, nargs, in_decl) tsubst (TYPE_MAX_VALUE (t), args, nargs, in_decl)); case TEMPLATE_TYPE_PARM: - return c_build_type_variant (args[TEMPLATE_TYPE_IDX (t)], + return cp_build_type_variant (args[TEMPLATE_TYPE_IDX (t)], TYPE_READONLY (t), TYPE_VOLATILE (t)); @@ -1356,9 +1392,10 @@ tsubst (t, args, nargs, in_decl) if (!got_it) { - r = build_decl_overload (r, TYPE_VALUES (type), - DECL_CONTEXT (t) != NULL_TREE); + tree a = build_decl_overload (r, TYPE_VALUES (type), + DECL_CONTEXT (t) != NULL_TREE); r = build_lang_decl (FUNCTION_DECL, r, type); + DECL_ASSEMBLER_NAME (r) = a; } else if (DECL_INLINE (r) && DECL_SAVED_INSNS (r)) { @@ -1392,9 +1429,11 @@ tsubst (t, args, nargs, in_decl) make_decl_rtl (r, NULL_PTR, 1); DECL_ARGUMENTS (r) = fnargs; DECL_RESULT (r) = result; +#if 0 if (DECL_CONTEXT (t) == NULL_TREE || TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) != 't') push_overloaded_decl_top_level (r, 0); +#endif return r; } @@ -1442,7 +1481,7 @@ tsubst (t, args, nargs, in_decl) { int len = TREE_VEC_LENGTH (t), need_new = 0, i; tree *elts = (tree *) alloca (len * sizeof (tree)); - bzero (elts, len * sizeof (tree)); + bzero ((char *) elts, len * sizeof (tree)); for (i = 0; i < len; i++) { @@ -1472,7 +1511,7 @@ tsubst (t, args, nargs, in_decl) r = build_pointer_type (type); else r = build_reference_type (type); - r = c_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t)); + r = cp_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t)); /* Will this ever be needed for TYPE_..._TO values? */ layout_type (r); return r; @@ -1781,6 +1820,7 @@ overload_template_name (id, classlevel) || TREE_CODE (t) == UNINSTANTIATED_P_TYPE, 286); decl = build_decl (TYPE_DECL, template, t); + SET_DECL_ARTIFICIAL (decl); #if 0 /* fix this later */ /* We don't want to call here if the work has already been done. */ @@ -1890,7 +1930,7 @@ reinit_parse_for_template (yychar, d1, d2) if (!template_info) { template_info = (struct template_info *) permalloc (sizeof (struct template_info)); - bzero (template_info, sizeof (struct template_info)); + bzero ((char *) template_info, sizeof (struct template_info)); DECL_TEMPLATE_INFO (d2) = template_info; } template_info->filename = input_filename; @@ -1940,7 +1980,7 @@ type_unification (tparms, targs, parms, args, nsubsts, subr) my_friendly_assert (ntparms > 0, 292); if (!subr) - bzero (targs, sizeof (tree) * ntparms); + bzero ((char *) targs, sizeof (tree) * ntparms); while (parms && parms != void_list_node @@ -1968,9 +2008,16 @@ type_unification (tparms, targs, parms, args, nsubsts, subr) arg = TREE_TYPE (arg); } #endif - if (TREE_CODE (arg) == FUNCTION_TYPE - || TREE_CODE (arg) == METHOD_TYPE) - arg = build_pointer_type (arg); + if (TREE_CODE (parm) != REFERENCE_TYPE) + { + if (TREE_CODE (arg) == FUNCTION_TYPE + || TREE_CODE (arg) == METHOD_TYPE) + arg = build_pointer_type (arg); + else if (TREE_CODE (arg) == ARRAY_TYPE) + arg = build_pointer_type (TREE_TYPE (arg)); + else + arg = TYPE_MAIN_VARIANT (arg); + } switch (unify (tparms, targs, ntparms, parm, arg, nsubsts)) { @@ -2035,22 +2082,20 @@ unify (tparms, targs, ntparms, parm, arg, nsubsts) return 1; } idx = TEMPLATE_TYPE_IDX (parm); + /* Template type parameters cannot contain cv-quals; i.e. + template <class T> void f (T& a, T& b) will not generate + void f (const int& a, const int& b). */ + if (TYPE_READONLY (arg) > TYPE_READONLY (parm) + || TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm)) + return 1; + arg = TYPE_MAIN_VARIANT (arg); /* Simple cases: Value already set, does match or doesn't. */ if (targs[idx] == arg) return 0; else if (targs[idx]) - { - if (TYPE_MAIN_VARIANT (targs[idx]) == TYPE_MAIN_VARIANT (arg)) - /* allow different parms to have different cv-qualifiers */; - else - return 1; - } - /* Check for mixed types and values. */ - if (TREE_CODE (TREE_VEC_ELT (tparms, idx)) != IDENTIFIER_NODE) return 1; - /* Allow trivial conversions. */ - if (TYPE_READONLY (parm) < TYPE_READONLY (arg) - || TYPE_VOLATILE (parm) < TYPE_VOLATILE (arg)) + /* Check for mixed types and values. */ + if (TREE_CODE (TREE_VALUE (TREE_VEC_ELT (tparms, idx))) != TYPE_DECL) return 1; targs[idx] = arg; return 0; @@ -2106,7 +2151,10 @@ unify (tparms, targs, ntparms, parm, arg, nsubsts) case REAL_TYPE: case INTEGER_TYPE: - if (TREE_CODE (parm) == INTEGER_TYPE && TREE_CODE (arg) == INTEGER_TYPE) + if (TREE_CODE (arg) != TREE_CODE (parm)) + return 1; + + if (TREE_CODE (parm) == INTEGER_TYPE) { if (TYPE_MIN_VALUE (parm) && TYPE_MIN_VALUE (arg) && unify (tparms, targs, ntparms, @@ -2377,16 +2425,20 @@ do_function_instantiation (declspecs, declarator, storage) if (flag_external_templates) return; - if (DECL_EXPLICIT_INSTANTIATION (result) && ! DECL_EXTERNAL (result)) + if (DECL_EXPLICIT_INSTANTIATION (result) && TREE_PUBLIC (result)) return; SET_DECL_EXPLICIT_INSTANTIATION (result); - TREE_PUBLIC (result) = 1; if (storage == NULL_TREE) - DECL_EXTERNAL (result) = DECL_INLINE (result) && ! flag_implement_inlines; + { + TREE_PUBLIC (result) = 1; + DECL_EXTERNAL (result) = (DECL_INLINE (result) + && ! flag_implement_inlines); + TREE_STATIC (result) = ! DECL_EXTERNAL (result); + } else if (storage == ridpointers[(int) RID_EXTERN]) - DECL_EXTERNAL (result) = 1; + ; else cp_error ("storage class `%D' applied to template instantiation", storage); @@ -2399,12 +2451,11 @@ do_type_instantiation (name, storage) tree t = TREE_TYPE (name); int extern_p; + /* With -fexternal-templates, explicit instantiations are treated the same + as implicit ones. */ if (flag_external_templates) return; - if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && ! CLASSTYPE_INTERFACE_ONLY (t)) - return; - if (TYPE_SIZE (t) == NULL_TREE) { cp_error ("explicit instantiation of `%#T' before definition of template", @@ -2423,30 +2474,62 @@ do_type_instantiation (name, storage) extern_p = 0; } - SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t); - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p; - SET_CLASSTYPE_INTERFACE_KNOWN (t); - CLASSTYPE_INTERFACE_ONLY (t) = extern_p; - if (! extern_p) + /* We've already instantiated this. */ + if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && CLASSTYPE_INTERFACE_KNOWN (t)) + { + if (! extern_p) + cp_pedwarn ("multiple explicit instantiation of `%#T'", t); + return; + } + + if (! CLASSTYPE_TEMPLATE_SPECIALIZATION (t)) { - CLASSTYPE_DEBUG_REQUESTED (t) = 1; - TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = 0; - rest_of_type_compilation (t, 1); + SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t); + if (! extern_p) + { + SET_CLASSTYPE_INTERFACE_KNOWN (t); + CLASSTYPE_INTERFACE_ONLY (t) = 0; + CLASSTYPE_VTABLE_NEEDS_WRITING (t) = 1; + CLASSTYPE_DEBUG_REQUESTED (t) = 1; + TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = 0; + rest_of_type_compilation (t, 1); + } } + instantiate_member_templates (TYPE_IDENTIFIER (t)); + /* this should really be done by instantiate_member_templates */ { - tree method = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 0); - for (; method; method = TREE_CHAIN (method)) + tree tmp = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 0); + for (; tmp; tmp = TREE_CHAIN (tmp)) + { + if (DECL_TEMPLATE_SPECIALIZATION (tmp) + || (DECL_USE_TEMPLATE (tmp) == 0 + && CLASSTYPE_TEMPLATE_SPECIALIZATION (t))) + continue; + + SET_DECL_EXPLICIT_INSTANTIATION (tmp); + if (! extern_p) + { + TREE_PUBLIC (tmp) = 1; + DECL_EXTERNAL (tmp) = (DECL_INLINE (tmp) + && ! flag_implement_inlines); + TREE_STATIC (tmp) = ! DECL_EXTERNAL (tmp); + } + } + +#if 0 + for (tmp = TYPE_FIELDS (t); tmp; tmp = TREE_CHAIN (tmp)) { - SET_DECL_EXPLICIT_INSTANTIATION (method); - TREE_PUBLIC (method) = 1; - DECL_EXTERNAL (method) - = (extern_p || (DECL_INLINE (method) && ! flag_implement_inlines)); + if (TREE_CODE (tmp) == VAR_DECL) + /* eventually do something */; } - } +#endif - /* and data member templates, too */ + for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp)) + if (IS_AGGR_TYPE (TREE_VALUE (tmp))) + do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage); + } } tree diff --git a/gnu/usr.bin/cc/cc1plus/search.c b/gnu/usr.bin/cc/cc1plus/search.c index c4c6a4e..7f6af72 100644 --- a/gnu/usr.bin/cc/cc1plus/search.c +++ b/gnu/usr.bin/cc/cc1plus/search.c @@ -236,7 +236,7 @@ my_new_memoized_entry (chain) struct memoized_entry *p = (struct memoized_entry *)obstack_alloc (&type_obstack_entries, sizeof (struct memoized_entry)); - bzero (p, sizeof (struct memoized_entry)); + bzero ((char *) p, sizeof (struct memoized_entry)); MEMOIZED_CHAIN (p) = chain; MEMOIZED_UID (p) = ++my_memoized_entry_counter; return p; @@ -768,6 +768,7 @@ compute_access (basetype_path, field) tree types; tree context; int protected_ok, via_protected; + extern int flag_access_control; #if 1 /* Replaces static decl above. */ tree previous_scope; @@ -776,6 +777,9 @@ compute_access (basetype_path, field) ((TREE_CODE (field) == FUNCTION_DECL && DECL_STATIC_FUNCTION_P (field)) || (TREE_CODE (field) != FUNCTION_DECL && TREE_STATIC (field))); + if (! flag_access_control) + return access_public; + /* The field lives in the current class. */ if (BINFO_TYPE (basetype_path) == current_class_type) return access_public; @@ -1913,6 +1917,10 @@ get_matching_virtual (binfo, fndecl, dtorp) if (IDENTIFIER_VIRTUAL_P (declarator) == 0) return NULL_TREE; + baselink = get_virtuals_named_this (binfo); + if (baselink == NULL_TREE) + return NULL_TREE; + drettype = TREE_TYPE (TREE_TYPE (fndecl)); dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); if (DECL_STATIC_FUNCTION_P (fndecl)) @@ -1920,8 +1928,7 @@ get_matching_virtual (binfo, fndecl, dtorp) else instptr_type = TREE_TYPE (TREE_VALUE (dtypes)); - for (baselink = get_virtuals_named_this (binfo); - baselink; baselink = next_baselink (baselink)) + for (; baselink; baselink = next_baselink (baselink)) { for (tmp = TREE_VALUE (baselink); tmp; tmp = DECL_CHAIN (tmp)) { @@ -1945,7 +1952,7 @@ get_matching_virtual (binfo, fndecl, dtorp) && ! comptypes (TREE_TYPE (TREE_TYPE (tmp)), drettype, 1)) { cp_error ("conflicting return type specified for virtual function `%#D'", fndecl); - cp_error ("overriding definition as `%#D'", tmp); + cp_error_at ("overriding definition as `%#D'", tmp); SET_IDENTIFIER_ERROR_LOCUS (name, basetype); } break; @@ -2697,13 +2704,22 @@ free_mi_matrix () /* If we want debug info for a type TYPE, make sure all its base types are also marked as being potentially interesting. This avoids the problem of not writing any debug info for intermediate basetypes - that have abstract virtual functions. */ + that have abstract virtual functions. Also mark member types. */ void note_debug_info_needed (type) tree type; { + tree field; dfs_walk (TYPE_BINFO (type), dfs_debug_mark, dfs_debug_unmarkedp); + for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) + { + tree ttype; + if (TREE_CODE (field) == FIELD_DECL + && IS_AGGR_TYPE (ttype = target_type (TREE_TYPE (field))) + && dfs_debug_unmarkedp (TYPE_BINFO (ttype))) + note_debug_info_needed (ttype); + } } /* Subroutines of push_class_decls (). */ diff --git a/gnu/usr.bin/cc/cc1plus/sig.c b/gnu/usr.bin/cc/cc1plus/sig.c index 1426168..65938b3 100644 --- a/gnu/usr.bin/cc/cc1plus/sig.c +++ b/gnu/usr.bin/cc/cc1plus/sig.c @@ -177,7 +177,7 @@ build_signature_pointer_or_reference_type (to_type, constp, volatilep, refp) } else { - tree sig_tbl_type = c_build_type_variant (to_type, 1, 0); + tree sig_tbl_type = cp_build_type_variant (to_type, 1, 0); sptr = build_lang_field_decl (FIELD_DECL, get_identifier (SIGNATURE_SPTR_NAME), diff --git a/gnu/usr.bin/cc/cc1plus/spew.c b/gnu/usr.bin/cc/cc1plus/spew.c index ea00ba2..c28e2c1 100644 --- a/gnu/usr.bin/cc/cc1plus/spew.c +++ b/gnu/usr.bin/cc/cc1plus/spew.c @@ -202,8 +202,10 @@ shift_tokens (n) * sizeof (struct token)); /* This move does not rely on the system being able to handle overlapping moves. */ - bcopy (nth_token (0), tmp, old_token_count * sizeof (struct token)); - bcopy (tmp, nth_token (n), old_token_count * sizeof (struct token)); + bcopy ((char *) nth_token (0), tmp, + old_token_count * sizeof (struct token)); + bcopy (tmp, (char *) nth_token (n), + old_token_count * sizeof (struct token)); } first_token = 0; } diff --git a/gnu/usr.bin/cc/cc1plus/tree.c b/gnu/usr.bin/cc/cc1plus/tree.c index 88466b8..5db4a66 100644 --- a/gnu/usr.bin/cc/cc1plus/tree.c +++ b/gnu/usr.bin/cc/cc1plus/tree.c @@ -35,66 +35,75 @@ int lvalue_p (ref) tree ref; { - register enum tree_code code = TREE_CODE (ref); + if (! language_lvalue_valid (ref)) + return 0; + + if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE) + return 1; + + if (ref == current_class_decl && flag_this_is_variable <= 0) + return 0; - if (language_lvalue_valid (ref)) + switch (TREE_CODE (ref)) { - if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE) + /* preincrements and predecrements are valid lvals, provided + what they refer to are valid lvals. */ + case PREINCREMENT_EXPR: + case PREDECREMENT_EXPR: + case COMPONENT_REF: + case SAVE_EXPR: + return lvalue_p (TREE_OPERAND (ref, 0)); + + case STRING_CST: + return 1; + + case VAR_DECL: + if (TREE_READONLY (ref) && ! TREE_STATIC (ref) + && DECL_LANG_SPECIFIC (ref) + && DECL_IN_AGGR_P (ref)) + return 0; + case INDIRECT_REF: + case ARRAY_REF: + case PARM_DECL: + case RESULT_DECL: + case ERROR_MARK: + if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE) return 1; - - switch (code) - { - /* preincrements and predecrements are valid lvals, provided - what they refer to are valid lvals. */ - case PREINCREMENT_EXPR: - case PREDECREMENT_EXPR: - case COMPONENT_REF: - case SAVE_EXPR: - return lvalue_p (TREE_OPERAND (ref, 0)); - - case STRING_CST: - return 1; - - case VAR_DECL: - if (TREE_READONLY (ref) && ! TREE_STATIC (ref) - && DECL_LANG_SPECIFIC (ref) - && DECL_IN_AGGR_P (ref)) - return 0; - case INDIRECT_REF: - case ARRAY_REF: - case PARM_DECL: - case RESULT_DECL: - case ERROR_MARK: - if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE - && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE) - return 1; - break; + break; - case TARGET_EXPR: - case WITH_CLEANUP_EXPR: - return 1; - - /* A currently unresolved scope ref. */ - case SCOPE_REF: - my_friendly_abort (103); - case OFFSET_REF: - if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL) - return 1; - return lvalue_p (TREE_OPERAND (ref, 0)) - && lvalue_p (TREE_OPERAND (ref, 1)); - break; + case WITH_CLEANUP_EXPR: + return lvalue_p (TREE_OPERAND (ref, 0)); - case COND_EXPR: - return (lvalue_p (TREE_OPERAND (ref, 1)) - && lvalue_p (TREE_OPERAND (ref, 2))); + case TARGET_EXPR: + return 1; - case MODIFY_EXPR: - return 1; + case CALL_EXPR: + if (TREE_ADDRESSABLE (TREE_TYPE (ref))) + return 1; + break; - case COMPOUND_EXPR: - return lvalue_p (TREE_OPERAND (ref, 1)); - } + /* A currently unresolved scope ref. */ + case SCOPE_REF: + my_friendly_abort (103); + case OFFSET_REF: + if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL) + return 1; + return lvalue_p (TREE_OPERAND (ref, 0)) + && lvalue_p (TREE_OPERAND (ref, 1)); + break; + + case COND_EXPR: + return (lvalue_p (TREE_OPERAND (ref, 1)) + && lvalue_p (TREE_OPERAND (ref, 2))); + + case MODIFY_EXPR: + return 1; + + case COMPOUND_EXPR: + return lvalue_p (TREE_OPERAND (ref, 1)); } + return 0; } @@ -221,12 +230,15 @@ break_out_calls (exp) return exp; case 'd': /* A decl node */ +#if 0 /* This is bogus. jason 9/21/94 */ + t1 = break_out_calls (DECL_INITIAL (exp)); if (t1 != DECL_INITIAL (exp)) { exp = copy_node (exp); DECL_INITIAL (exp) = t1; } +#endif return exp; case 'b': /* A block node */ @@ -379,6 +391,40 @@ build_cplus_array_type (elt_type, index_type) return t; } +/* Make a variant type in the proper way for C/C++, propagating qualifiers + down to the element type of an array. */ + +tree +cp_build_type_variant (type, constp, volatilep) + tree type; + int constp, volatilep; +{ + if (TREE_CODE (type) == ARRAY_TYPE) + { + tree real_main_variant = TYPE_MAIN_VARIANT (type); + + push_obstacks (TYPE_OBSTACK (real_main_variant), + TYPE_OBSTACK (real_main_variant)); + type = build_cplus_array_type (cp_build_type_variant (TREE_TYPE (type), + constp, volatilep), + TYPE_DOMAIN (type)); + + /* TYPE must be on same obstack as REAL_MAIN_VARIANT. If not, + make a copy. (TYPE might have come from the hash table and + REAL_MAIN_VARIANT might be in some function's obstack.) */ + + if (TYPE_OBSTACK (type) != TYPE_OBSTACK (real_main_variant)) + { + type = copy_node (type); + TYPE_POINTER_TO (type) = TYPE_REFERENCE_TO (type) = 0; + } + + TYPE_MAIN_VARIANT (type) = real_main_variant; + pop_obstacks (); + } + return build_type_variant (type, constp, volatilep); +} + /* Add OFFSET to all base types of T. OFFSET, which is a type offset, is number of bytes. @@ -1184,50 +1230,6 @@ virtual_member (elem, list) return rval; } -/* Return the offset (as an INTEGER_CST) for ELEM in LIST. - INITIAL_OFFSET is the value to add to the offset that ELEM's - binfo entry in LIST provides. - - Returns NULL if ELEM does not have an binfo value in LIST. */ - -tree -virtual_offset (elem, list, initial_offset) - tree elem; - tree list; - tree initial_offset; -{ - tree vb, offset; - tree rval, nval; - - for (vb = list; vb; vb = TREE_CHAIN (vb)) - if (elem == BINFO_TYPE (vb)) - return size_binop (PLUS_EXPR, initial_offset, BINFO_OFFSET (vb)); - rval = 0; - for (vb = list; vb; vb = TREE_CHAIN (vb)) - { - tree binfos = BINFO_BASETYPES (vb); - int i; - - if (binfos == NULL_TREE) - continue; - - for (i = TREE_VEC_LENGTH (binfos)-1; i >= 0; i--) - { - nval = binfo_value (elem, BINFO_TYPE (TREE_VEC_ELT (binfos, i))); - if (nval) - { - if (rval && BINFO_OFFSET (nval) != BINFO_OFFSET (rval)) - my_friendly_abort (105); - offset = BINFO_OFFSET (vb); - rval = nval; - } - } - } - if (rval == NULL_TREE) - return rval; - return size_binop (PLUS_EXPR, offset, BINFO_OFFSET (rval)); -} - void debug_binfo (elem) tree elem; @@ -1661,6 +1663,31 @@ make_deep_copy (t) TREE_OPERAND (t, 0) = make_deep_copy (TREE_OPERAND (t, 0)); return t; + case POINTER_TYPE: + return build_pointer_type (make_deep_copy (TREE_TYPE (t))); + case REFERENCE_TYPE: + return build_reference_type (make_deep_copy (TREE_TYPE (t))); + case FUNCTION_TYPE: + return build_function_type (make_deep_copy (TREE_TYPE (t)), + make_deep_copy (TYPE_ARG_TYPES (t))); + case ARRAY_TYPE: + return build_array_type (make_deep_copy (TREE_TYPE (t)), + make_deep_copy (TYPE_DOMAIN (t))); + case OFFSET_TYPE: + return build_offset_type (make_deep_copy (TYPE_OFFSET_BASETYPE (t)), + make_deep_copy (TREE_TYPE (t))); + case METHOD_TYPE: + return build_method_type + (make_deep_copy (TYPE_METHOD_BASETYPE (t)), + build_function_type + (make_deep_copy (TREE_TYPE (t)), + make_deep_copy (TREE_CHAIN (TYPE_ARG_TYPES (t))))); + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (t)) + return build_ptrmemfunc_type + (make_deep_copy (TYPE_PTRMEMFUNC_FN_TYPE (t))); + /* else fall through */ + /* This list is incomplete, but should suffice for now. It is very important that `sorry' does not call `report_error_function'. That could cause an infinite loop. */ @@ -1738,7 +1765,7 @@ tree array_type_nelts_top (type) tree type; { - return fold (build (PLUS_EXPR, integer_type_node, + return fold (build (PLUS_EXPR, sizetype, array_type_nelts (type), integer_one_node)); } @@ -1756,7 +1783,7 @@ array_type_nelts_total (type) while (TREE_CODE (type) == ARRAY_TYPE) { tree n = array_type_nelts_top (type); - sz = fold (build (MULT_EXPR, integer_type_node, sz, n)); + sz = fold (build (MULT_EXPR, sizetype, sz, n)); type = TREE_TYPE (type); } return sz; diff --git a/gnu/usr.bin/cc/cc1plus/typeck.c b/gnu/usr.bin/cc/cc1plus/typeck.c index fe8e7ba..cdf40668 100644 --- a/gnu/usr.bin/cc/cc1plus/typeck.c +++ b/gnu/usr.bin/cc/cc1plus/typeck.c @@ -161,7 +161,7 @@ qualify_type (type, like) int constflag = TYPE_READONLY (type) || TYPE_READONLY (like); int volflag = TYPE_VOLATILE (type) || TYPE_VOLATILE (like); /* @@ Must do member pointers here. */ - return c_build_type_variant (type, constflag, volflag); + return cp_build_type_variant (type, constflag, volflag); } /* Return the common type of two parameter lists. @@ -372,7 +372,7 @@ common_type (t1, t2) = TYPE_READONLY (TREE_TYPE (t1)) || TYPE_READONLY (TREE_TYPE (t2)); int volatilep = TYPE_VOLATILE (TREE_TYPE (t1)) || TYPE_VOLATILE (TREE_TYPE (t2)); - target = c_build_type_variant (target, constp, volatilep); + target = cp_build_type_variant (target, constp, volatilep); if (code1 == POINTER_TYPE) t1 = build_pointer_type (target); else @@ -734,8 +734,6 @@ comp_target_types (ttl, ttr, nptrs) ttr = TYPE_MAIN_VARIANT (ttr); if (ttl == ttr) return 1; - if (TREE_CODE (ttr) == TEMPLATE_TYPE_PARM) - return 1; if (TREE_CODE (ttr) != TREE_CODE (ttl)) return 0; @@ -813,12 +811,14 @@ common_base_type (tt1, tt2) if (UNIQUELY_DERIVED_FROM_P (tt2, tt1)) return tt2; +#if 0 /* If they share a virtual baseclass, that's good enough. */ for (tmp = CLASSTYPE_VBASECLASSES (tt1); tmp; tmp = TREE_CHAIN (tmp)) { if (binfo_member (BINFO_TYPE (tmp), CLASSTYPE_VBASECLASSES (tt2))) return BINFO_TYPE (tmp); } +#endif /* Otherwise, try to find a unique baseclass of TT1 that is shared by TT2, and follow that down. */ @@ -904,6 +904,8 @@ compparms (parms1, parms2, strict) return t2 == void_list_node && TREE_PURPOSE (t1); return TREE_PURPOSE (t1) || TREE_PURPOSE (t2); } +#if 0 + /* Default parms are not part of the type of a function. */ if (strict != 3 && TREE_PURPOSE (t1) && TREE_PURPOSE (t2)) { int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)); @@ -912,6 +914,7 @@ compparms (parms1, parms2, strict) if (cmp == 0) return 0; } +#endif t1 = TREE_CHAIN (t1); t2 = TREE_CHAIN (t2); @@ -959,8 +962,6 @@ comp_target_parms (parms1, parms2, strict) p2 = TREE_VALUE (t2); if (p1 == p2) continue; - if (TREE_CODE (p2) == TEMPLATE_TYPE_PARM) - continue; if ((TREE_CODE (p1) == POINTER_TYPE && TREE_CODE (p2) == POINTER_TYPE) || (TREE_CODE (p1) == REFERENCE_TYPE && TREE_CODE (p2) == REFERENCE_TYPE)) @@ -970,9 +971,6 @@ comp_target_parms (parms1, parms2, strict) == TYPE_MAIN_VARIANT (TREE_TYPE (p2)))) continue; - if (TREE_CODE (TREE_TYPE (p2)) == TEMPLATE_TYPE_PARM) - continue; - /* The following is wrong for contravariance, but many programs depend on it. */ if (TREE_TYPE (p1) == void_type_node) @@ -1308,7 +1306,7 @@ default_conversion (exp) if (INTEGRAL_CODE_P (code)) { tree t = type_promotes_to (type); - if (t != TYPE_MAIN_VARIANT (type)) + if (t != type) return convert (t, exp); } if (flag_traditional @@ -1380,7 +1378,7 @@ default_conversion (exp) restype = TREE_TYPE (type); if (TYPE_READONLY (type) || TYPE_VOLATILE (type) || constp || volatilep) - restype = c_build_type_variant (restype, + restype = cp_build_type_variant (restype, TYPE_READONLY (type) || constp, TYPE_VOLATILE (type) || volatilep); ptrtype = build_pointer_type (restype); @@ -1410,8 +1408,19 @@ tree build_object_ref (datum, basetype, field) tree datum, basetype, field; { + tree dtype; if (datum == error_mark_node) return error_mark_node; + + dtype = TREE_TYPE (datum); + if (TREE_CODE (dtype) == REFERENCE_TYPE) + dtype = TREE_TYPE (dtype); + if (! IS_AGGR_TYPE_CODE (TREE_CODE (dtype))) + { + cp_error ("request for member `%T::%D' in expression of non-aggregate type `%T'", + basetype, field, dtype); + return error_mark_node; + } else if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (basetype))) { warning ("signature name in scope resolution ignored"); @@ -1524,8 +1533,7 @@ build_component_ref (datum, component, basetype_path, protect) register tree field = NULL; register tree ref; - /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference inside it - unless we are not to support things not strictly ANSI. */ + /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference inside it. */ switch (TREE_CODE (datum)) { case COMPOUND_EXPR: @@ -1697,7 +1705,8 @@ build_component_ref (datum, component, basetype_path, protect) datum = build_indirect_ref (addr, NULL_PTR); my_friendly_assert (datum != error_mark_node, 311); } - ref = build (COMPONENT_REF, TREE_TYPE (field), break_out_cleanups (datum), field); + ref = fold (build (COMPONENT_REF, TREE_TYPE (field), + break_out_cleanups (datum), field)); if (TREE_READONLY (datum) || TREE_READONLY (field)) TREE_READONLY (ref) = 1; @@ -2519,13 +2528,15 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)) val = TREE_OPERAND (val, 0); - if ((type == 0 || TREE_CODE (type) != REFERENCE_TYPE) - && (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE + if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE) + { + if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE - || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)) - val = default_conversion (val); + || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE) + val = default_conversion (val); - val = require_complete_type (val); + val = require_complete_type (val); + } if (val == error_mark_node) continue; @@ -2544,7 +2555,8 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) } else { -#ifdef PROMOTE_PROTOTYPES +#if 0 && defined (PROMOTE_PROTOTYPES) + /* This breaks user-defined conversions. */ /* Rather than truncating and then reextending, convert directly to int, if that's the type we will want. */ if (! flag_traditional @@ -2607,7 +2619,7 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) /* See if there are default arguments that can be used */ if (TREE_PURPOSE (typetail)) { - while (typetail != void_list_node) + for (; typetail != void_list_node; ++i) { tree type = TREE_VALUE (typetail); tree val = TREE_PURPOSE (typetail); @@ -3247,6 +3259,7 @@ build_binary_op_nodefault (code, orig_op0, orig_op1, error_code) case GE_EXPR: case LT_EXPR: case GT_EXPR: + result_type = bool_type_node; if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) short_compare = 1; @@ -3295,7 +3308,8 @@ build_binary_op_nodefault (code, orig_op0, orig_op1, error_code) warning ("comparison between pointer and integer"); op0 = convert (TREE_TYPE (op1), op0); } - result_type = bool_type_node; + else + result_type = 0; converted = 1; break; } @@ -3717,7 +3731,7 @@ build_component_addr (arg, argtype, msg) } else /* This conversion is harmless. */ - rval = convert (argtype, rval); + rval = convert_force (argtype, rval); if (! integer_zerop (DECL_FIELD_BITPOS (field))) { @@ -4088,42 +4102,16 @@ build_unary_op (code, xarg, noconvert) if (TREE_CODE (arg) == TREE_LIST) { - /* Look at methods with only this name. */ - if (TREE_CODE (TREE_VALUE (arg)) == FUNCTION_DECL) - { - tree targ = TREE_VALUE (arg); - - /* If this function is unique, or it is a unique - constructor, we can take its address easily. */ - if (DECL_CHAIN (targ) == NULL_TREE - || (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (targ)) - && DECL_CHAIN (DECL_CHAIN (targ)) == NULL_TREE)) - { - if (DECL_CHAIN (targ)) - targ = DECL_CHAIN (targ); - if (DECL_CLASS_CONTEXT (targ)) - targ = build (OFFSET_REF, TREE_TYPE (targ), C_C_D, targ); - - val = unary_complex_lvalue (ADDR_EXPR, targ); - if (val) - return val; - } - - /* This possible setting of TREE_CONSTANT is what makes it possible - with an initializer list to emit the entire thing in the data - section, rather than a run-time initialization. */ - arg = build1 (ADDR_EXPR, unknown_type_node, arg); - if (staticp (targ)) - TREE_CONSTANT (arg) = 1; - return arg; - } + if (TREE_CODE (TREE_VALUE (arg)) == FUNCTION_DECL + && DECL_CHAIN (TREE_VALUE (arg)) == NULL_TREE) + /* Unique overloaded non-member function. */ + return build_unary_op (ADDR_EXPR, TREE_VALUE (arg), 0); if (TREE_CHAIN (arg) == NULL_TREE && TREE_CODE (TREE_VALUE (arg)) == TREE_LIST && DECL_CHAIN (TREE_VALUE (TREE_VALUE (arg))) == NULL_TREE) - { - /* Unique overloaded member function. */ - return build_unary_op (ADDR_EXPR, TREE_VALUE (TREE_VALUE (arg)), 0); - } + /* Unique overloaded member function. */ + return build_unary_op (ADDR_EXPR, TREE_VALUE (TREE_VALUE (arg)), + 0); return build1 (ADDR_EXPR, unknown_type_node, arg); } @@ -4165,7 +4153,7 @@ build_unary_op (code, xarg, noconvert) || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r') { if (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)) - argtype = c_build_type_variant (argtype, + argtype = cp_build_type_variant (argtype, TREE_READONLY (arg), TREE_THIS_VOLATILE (arg)); } @@ -4573,7 +4561,7 @@ build_conditional_expr (ifexp, op1, op2) else if (TREE_READONLY_DECL_P (op2)) op2 = decl_constant_value (op2); if (type1 != type2) - type1 = c_build_type_variant + type1 = cp_build_type_variant (type1, TREE_READONLY (op1) || TREE_READONLY (op2), TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2)); @@ -4622,7 +4610,7 @@ build_conditional_expr (ifexp, op1, op2) if (type1 == type2) result_type = type1; else - result_type = c_build_type_variant + result_type = cp_build_type_variant (type1, TREE_READONLY (op1) || TREE_READONLY (op2), TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2)); @@ -4669,11 +4657,20 @@ build_conditional_expr (ifexp, op1, op2) { if (result_type == error_mark_node) { - message_2_types (error, "common base type of types `%s' and `%s' is ambiguous", - TREE_TYPE (type1), TREE_TYPE (type2)); + cp_error ("common base type of types `%T' and `%T' is ambiguous", + TREE_TYPE (type1), TREE_TYPE (type2)); result_type = ptr_type_node; } - else result_type = TYPE_POINTER_TO (result_type); + else + { + if (pedantic + && result_type != TREE_TYPE (type1) + && result_type != TREE_TYPE (type2)) + cp_pedwarn ("`%T' and `%T' converted to `%T *' in conditional expression", + type1, type2, result_type); + + result_type = TYPE_POINTER_TO (result_type); + } } else { @@ -4939,7 +4936,7 @@ build_c_cast (type, expr) value = TREE_VALUE (value); if (TREE_CODE (type) == VOID_TYPE) - value = build1 (NOP_EXPR, type, value); + value = build1 (CONVERT_EXPR, type, value); else if (TREE_TYPE (value) == NULL_TREE || type_unknown_p (value)) { @@ -5002,6 +4999,9 @@ build_c_cast (type, expr) warning ("cast to pointer from integer of different size"); #endif + if (TREE_READONLY_DECL_P (value)) + value = decl_constant_value (value); + ovalue = value; value = convert_force (type, value); @@ -5326,13 +5326,13 @@ build_modify_expr (lhs, modifycode, rhs) tree olhstype = lhstype; tree olhs = lhs; - /* Types that aren't fully specified cannot be used in assignments. */ - lhs = require_complete_type (lhs); - /* Avoid duplicate error messages from operands that had errors. */ if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK) return error_mark_node; + /* Types that aren't fully specified cannot be used in assignments. */ + lhs = require_complete_type (lhs); + /* Decide early if we are going to protect RHS from GC before assigning it to LHS. */ if (type_needs_gc_entry (TREE_TYPE (rhs)) @@ -5388,9 +5388,9 @@ build_modify_expr (lhs, modifycode, rhs) so the code to compute it is only emitted once. */ tree cond = build_conditional_expr (TREE_OPERAND (lhs, 0), - build_modify_expr (TREE_OPERAND (lhs, 1), + build_modify_expr (convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 1)), modifycode, rhs), - build_modify_expr (TREE_OPERAND (lhs, 2), + build_modify_expr (convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 2)), modifycode, rhs)); if (TREE_CODE (cond) == ERROR_MARK) return cond; @@ -5763,10 +5763,12 @@ build_modify_expr (lhs, modifycode, rhs) if (TREE_CODE (lhstype) == ARRAY_TYPE) { + int from_array; + /* Allow array assignment in compiler-generated code. */ if ((pedantic || flag_ansi) && ! DECL_ARTIFICIAL (current_function_decl)) - pedwarn ("ANSI C++ forbids assignment between arrays"); + pedwarn ("ANSI C++ forbids assignment of arrays"); /* Have to wrap this in RTL_EXPR for two cases: in base or member initialization and if we @@ -5782,8 +5784,10 @@ build_modify_expr (lhs, modifycode, rhs) /* As a matter of principle, `start_sequence' should do this. */ emit_note (0, -1); + from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE + ? 1 + (modifycode != INIT_EXPR): 0; expand_vec_init (lhs, lhs, array_type_nelts (lhstype), newrhs, - 1 + (modifycode != INIT_EXPR)); + from_array); do_pending_stack_adjust (); @@ -6101,12 +6105,15 @@ build_ptrmemfunc (type, pfn, force) return digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0); } - if (TREE_CODE (pfn) == TREE_LIST) + if (TREE_CODE (pfn) == TREE_LIST + || (TREE_CODE (pfn) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (pfn, 0)) == TREE_LIST)) { pfn = instantiate_type (type, pfn, 1); if (pfn == error_mark_node) return error_mark_node; - pfn = build_unary_op (ADDR_EXPR, pfn, 0); + if (TREE_CODE (pfn) != ADDR_EXPR) + pfn = build_unary_op (ADDR_EXPR, pfn, 0); } /* Allow pointer to member conversions here. */ @@ -6445,7 +6452,8 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum) add_quals = 1; left_const &= TYPE_READONLY (ttl); - if (TREE_CODE (ttl) != POINTER_TYPE) + if (TREE_CODE (ttl) != POINTER_TYPE + || TREE_CODE (ttr) != POINTER_TYPE) break; } unsigned_parity = TREE_UNSIGNED (ttl) - TREE_UNSIGNED (ttr); @@ -6561,10 +6569,11 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum) } return null_pointer_node; } - else if (codel == INTEGER_TYPE + else if ((codel == INTEGER_TYPE || codel == BOOLEAN_TYPE) && (coder == POINTER_TYPE || (coder == RECORD_TYPE && (IS_SIGNATURE_POINTER (rhstype) + || TYPE_PTRMEMFUNC_FLAG (rhstype) || IS_SIGNATURE_REFERENCE (rhstype))))) { if (fndecl) @@ -6717,7 +6726,8 @@ convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum) && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))) return build_signature_pointer_constructor (type, rhs); - if (IS_AGGR_TYPE (type) && TYPE_NEEDS_CONSTRUCTING (type)) + if (IS_AGGR_TYPE (type) + && (TYPE_NEEDS_CONSTRUCTING (type) || TREE_HAS_CONSTRUCTOR (rhs))) { if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype)) { @@ -6973,8 +6983,11 @@ c_expand_return (retval) while (TREE_CODE (whats_returned) == NEW_EXPR || TREE_CODE (whats_returned) == TARGET_EXPR || TREE_CODE (whats_returned) == WITH_CLEANUP_EXPR) - /* Get the target. */ - whats_returned = TREE_OPERAND (whats_returned, 0); + { + /* Get the target. */ + whats_returned = TREE_OPERAND (whats_returned, 0); + warning ("returning reference to temporary"); + } } if (TREE_CODE (whats_returned) == VAR_DECL && DECL_NAME (whats_returned)) @@ -7028,6 +7041,7 @@ c_expand_return (retval) && TREE_CODE (TREE_OPERAND (retval, 0)) == TARGET_EXPR) retval = TREE_OPERAND (retval, 0); expand_aggr_init (result, retval, 0); + expand_cleanups_to (NULL_TREE); DECL_INITIAL (result) = NULL_TREE; retval = 0; } @@ -7046,6 +7060,7 @@ c_expand_return (retval) && any_pending_cleanups (1)) { retval = get_temp_regvar (valtype, retval); + expand_cleanups_to (NULL_TREE); use_temp = obey_regdecls; result = 0; } @@ -7071,7 +7086,10 @@ c_expand_return (retval) { /* Everything's great--RETVAL is in RESULT. */ if (original_result_rtx) - store_expr (result, original_result_rtx, 0); + { + store_expr (result, original_result_rtx, 0); + expand_cleanups_to (NULL_TREE); + } else if (retval && retval != result) { /* Clear this out so the later call to decl_function_context @@ -7081,6 +7099,9 @@ c_expand_return (retval) /* Here is where we finally get RETVAL into RESULT. `expand_return' does the magic of protecting RESULT from cleanups. */ + retval = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (result), retval); + /* This part _must_ come second, because expand_return looks for + the INIT_EXPR as the toplevel node only. :-( */ retval = build (INIT_EXPR, TREE_TYPE (result), result, retval); TREE_SIDE_EFFECTS (retval) = 1; expand_return (retval); @@ -7190,7 +7211,8 @@ c_expand_start_case (exp) exp = index; } - expand_start_case (1, exp, type, "switch statement"); + expand_start_case (1, build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp), + type, "switch statement"); return exp; } diff --git a/gnu/usr.bin/cc/cc1plus/typeck2.c b/gnu/usr.bin/cc/cc1plus/typeck2.c index 871173f..dd6364e 100644 --- a/gnu/usr.bin/cc/cc1plus/typeck2.c +++ b/gnu/usr.bin/cc/cc1plus/typeck2.c @@ -329,7 +329,7 @@ ack (s, v, v2) silly. So instead, we just do the equivalent of a call to fatal in the same situation (call exit). */ -/* First used: 0 (reserved), Last used: 360. Free: */ +/* First used: 0 (reserved), Last used: 360. Free: 261. */ static int abortcount = 0; @@ -599,6 +599,7 @@ store_init_value (decl, init) )) return value; +#if 0 /* No, that's C. jason 9/19/94 */ else { if (pedantic && TREE_CODE (value) == CONSTRUCTOR @@ -613,6 +614,7 @@ store_init_value (decl, init) pedwarn ("ANSI C++ forbids non-constant aggregate initializer expressions"); } } +#endif DECL_INITIAL (decl) = value; return NULL_TREE; } @@ -631,7 +633,7 @@ digest_init (type, init, tail) tree type, init, *tail; { enum tree_code code = TREE_CODE (type); - tree element = 0; + tree element = NULL_TREE; tree old_tail_contents; /* Nonzero if INIT is a braced grouping, which comes in as a CONSTRUCTOR tree node which has no TREE_TYPE. */ @@ -659,8 +661,9 @@ digest_init (type, init, tail) if (init && TYPE_PTRMEMFUNC_P (type) && ((TREE_CODE (init) == ADDR_EXPR - && TREE_CODE (TREE_TYPE (init)) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (init))) == METHOD_TYPE) + && ((TREE_CODE (TREE_TYPE (init)) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (init))) == METHOD_TYPE) + || TREE_CODE (TREE_OPERAND (init, 0)) == TREE_LIST)) || TREE_CODE (init) == TREE_LIST || integer_zerop (init) || (TREE_TYPE (init) && TYPE_PTRMEMFUNC_P (TREE_TYPE (init))))) @@ -903,7 +906,7 @@ process_init_constructor (type, init, elts) { error ("non-empty initializer for array of empty elements"); /* Just ignore what we were supposed to use. */ - tail1 = 0; + tail1 = NULL_TREE; } tail = tail1; } @@ -1151,7 +1154,9 @@ build_scoped_ref (datum, types) if (TREE_CODE (types) == SCOPE_REF) { /* We have some work to do. */ - struct type_chain { tree type; struct type_chain *next; } *chain = 0, *head = 0, scratch; + struct type_chain + { tree type; struct type_chain *next; } + *chain = NULL, *head = NULL, scratch; ref = build_unary_op (ADDR_EXPR, datum, 0); while (TREE_CODE (types) == SCOPE_REF) { diff --git a/gnu/usr.bin/cc/cc_int/aux-output.c b/gnu/usr.bin/cc/cc_int/aux-output.c index bc498e0..830f3dd 100644 --- a/gnu/usr.bin/cc/cc_int/aux-output.c +++ b/gnu/usr.bin/cc/cc_int/aux-output.c @@ -1,5 +1,5 @@ -/* Subroutines for insn-output.c for Intel 80386. - Copyright (C) 1988, 1992 Free Software Foundation, Inc. +/* Subroutines for insn-output.c for Intel X86. + Copyright (C) 1988, 1992, 1994 Free Software Foundation, Inc. This file is part of GNU CC. @@ -74,8 +74,151 @@ enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] = /* Test and compare insns in i386.md store the information needed to generate branch and scc insns here. */ -struct rtx_def *i386_compare_op0, *i386_compare_op1; +struct rtx_def *i386_compare_op0 = NULL_RTX; +struct rtx_def *i386_compare_op1 = NULL_RTX; struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)(); + +/* Register allocation order */ +char *i386_reg_alloc_order = (char *)0; +static char regs_allocated[FIRST_PSEUDO_REGISTER]; + + +/* Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ + +void +override_options () +{ + int ch, i, regno; + +#ifdef SUBTARGET_OVERRIDE_OPTIONS + SUBTARGET_OVERRIDE_OPTIONS; +#endif + + /* Validate registers in register allocation order */ + if (i386_reg_alloc_order) + { + for (i = 0; (ch = i386_reg_alloc_order[i]) != '\0'; i++) + { + switch (ch) + { + case 'a': regno = 0; break; + case 'd': regno = 1; break; + case 'c': regno = 2; break; + case 'b': regno = 3; break; + case 'S': regno = 4; break; + case 'D': regno = 5; break; + case 'B': regno = 6; break; + + default: fatal ("Register '%c' is unknown", ch); + } + + if (regs_allocated[regno]) + fatal ("Register '%c' was already specified in the allocation order", ch); + + regs_allocated[regno] = 1; + } + } +} + +/* A C statement (sans semicolon) to choose the order in which to + allocate hard registers for pseudo-registers local to a basic + block. + + Store the desired register order in the array `reg_alloc_order'. + Element 0 should be the register to allocate first; element 1, the + next register; and so on. + + The macro body should not assume anything about the contents of + `reg_alloc_order' before execution of the macro. + + On most machines, it is not necessary to define this macro. */ + +void +order_regs_for_local_alloc () +{ + int i, ch, order, regno; + + /* User specified the register allocation order */ + if (i386_reg_alloc_order) + { + for (i = order = 0; (ch = i386_reg_alloc_order[i]) != '\0'; i++) + { + switch (ch) + { + case 'a': regno = 0; break; + case 'd': regno = 1; break; + case 'c': regno = 2; break; + case 'b': regno = 3; break; + case 'S': regno = 4; break; + case 'D': regno = 5; break; + case 'B': regno = 6; break; + } + + reg_alloc_order[order++] = regno; + } + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + if (!regs_allocated[i]) + reg_alloc_order[order++] = i; + } + } + + /* If users did not specify a register allocation order, favor eax + normally except if DImode variables are used, in which case + favor edx before eax, which seems to cause less spill register + not found messages. */ + else + { + rtx insn; + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + reg_alloc_order[i] = i; + + if (optimize) + { + int use_dca = FALSE; + + for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) + { + if (GET_CODE (insn) == INSN) + { + rtx set = NULL_RTX; + rtx pattern = PATTERN (insn); + + if (GET_CODE (pattern) == SET) + set = pattern; + + else if ((GET_CODE (pattern) == PARALLEL + || GET_CODE (pattern) == SEQUENCE) + && GET_CODE (XVECEXP (pattern, 0, 0)) == SET) + set = XVECEXP (pattern, 0, 0); + + if (set && GET_MODE (SET_SRC (set)) == DImode) + { + use_dca = TRUE; + break; + } + } + } + + if (use_dca) + { + reg_alloc_order[0] = 1; /* edx */ + reg_alloc_order[1] = 2; /* ecx */ + reg_alloc_order[2] = 0; /* eax */ + } + } + } +} + /* Output an insn whose source is a 386 integer register. SRC is the rtx for the register, and TEMPLATE is the op-code template. SRC may @@ -235,6 +378,7 @@ find_addr_reg (addr) abort (); } + /* Output an insn to add the constant N to the register X. */ static void @@ -243,19 +387,25 @@ asm_add (n, x) rtx x; { rtx xops[2]; - xops[1] = x; - if (n < 0) + xops[0] = x; + + if (n == -1) + output_asm_insn (AS1 (dec%L0,%0), xops); + else if (n == 1) + output_asm_insn (AS1 (inc%L0,%0), xops); + else if (n < 0) { - xops[0] = GEN_INT (-n); - output_asm_insn (AS2 (sub%L0,%0,%1), xops); + xops[1] = GEN_INT (-n); + output_asm_insn (AS2 (sub%L0,%1,%0), xops); } else if (n > 0) { - xops[0] = GEN_INT (n); - output_asm_insn (AS2 (add%L0,%0,%1), xops); + xops[1] = GEN_INT (n); + output_asm_insn (AS2 (add%L0,%1,%0), xops); } } + /* Output assembler code to perform a doubleword move insn with operands OPERANDS. */ @@ -587,6 +737,199 @@ compadr: return ""; } + + +#define MAX_TMPS 2 /* max temporary registers used */ + +/* Output the appropriate code to move push memory on the stack */ + +char * +output_move_pushmem (operands, insn, length, tmp_start, n_operands) + rtx operands[]; + rtx insn; + int length; + int tmp_start; + int n_operands; +{ + + struct { + char *load; + char *push; + rtx xops[2]; + } tmp_info[MAX_TMPS]; + + rtx src = operands[1]; + int max_tmps = 0; + int offset = 0; + int stack_p = reg_overlap_mentioned_p (stack_pointer_rtx, src); + int stack_offset = 0; + int i, num_tmps; + rtx xops[1]; + + if (!offsettable_memref_p (src)) + fatal_insn ("Source is not offsettable", insn); + + if ((length & 3) != 0) + fatal_insn ("Pushing non-word aligned size", insn); + + /* Figure out which temporary registers we have available */ + for (i = tmp_start; i < n_operands; i++) + { + if (GET_CODE (operands[i]) == REG) + { + if (reg_overlap_mentioned_p (operands[i], src)) + continue; + + tmp_info[ max_tmps++ ].xops[1] = operands[i]; + if (max_tmps == MAX_TMPS) + break; + } + } + + if (max_tmps == 0) + for (offset = length - 4; offset >= 0; offset -= 4) + { + xops[0] = adj_offsettable_operand (src, offset + stack_offset); + output_asm_insn (AS1(push%L0,%0), xops); + if (stack_p) + stack_offset += 4; + } + + else + for (offset = length - 4; offset >= 0; ) + { + for (num_tmps = 0; num_tmps < max_tmps && offset >= 0; num_tmps++) + { + tmp_info[num_tmps].load = AS2(mov%L0,%0,%1); + tmp_info[num_tmps].push = AS1(push%L0,%1); + tmp_info[num_tmps].xops[0] = adj_offsettable_operand (src, offset + stack_offset); + offset -= 4; + } + + for (i = 0; i < num_tmps; i++) + output_asm_insn (tmp_info[i].load, tmp_info[i].xops); + + for (i = 0; i < num_tmps; i++) + output_asm_insn (tmp_info[i].push, tmp_info[i].xops); + + if (stack_p) + stack_offset += 4*num_tmps; + } + + return ""; +} + + + +/* Output the appropriate code to move data between two memory locations */ + +char * +output_move_memory (operands, insn, length, tmp_start, n_operands) + rtx operands[]; + rtx insn; + int length; + int tmp_start; + int n_operands; +{ + struct { + char *load; + char *store; + rtx xops[3]; + } tmp_info[MAX_TMPS]; + + rtx dest = operands[0]; + rtx src = operands[1]; + rtx qi_tmp = NULL_RTX; + int max_tmps = 0; + int offset = 0; + int i, num_tmps; + rtx xops[3]; + + if (GET_CODE (dest) == MEM + && GET_CODE (XEXP (dest, 0)) == PRE_INC + && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx) + return output_move_pushmem (operands, insn, length, tmp_start, n_operands); + + if (!offsettable_memref_p (src)) + fatal_insn ("Source is not offsettable", insn); + + if (!offsettable_memref_p (dest)) + fatal_insn ("Destination is not offsettable", insn); + + /* Figure out which temporary registers we have available */ + for (i = tmp_start; i < n_operands; i++) + { + if (GET_CODE (operands[i]) == REG) + { + if ((length & 1) != 0 && !qi_tmp && QI_REG_P (operands[i])) + qi_tmp = operands[i]; + + if (reg_overlap_mentioned_p (operands[i], dest)) + fatal_insn ("Temporary register overlaps the destination", insn); + + if (reg_overlap_mentioned_p (operands[i], src)) + fatal_insn ("Temporary register overlaps the source", insn); + + tmp_info[ max_tmps++ ].xops[2] = operands[i]; + if (max_tmps == MAX_TMPS) + break; + } + } + + if (max_tmps == 0) + fatal_insn ("No scratch registers were found to do memory->memory moves", insn); + + if ((length & 1) != 0) + { + if (!qi_tmp) + fatal_insn ("No byte register found when moving odd # of bytes.", insn); + } + + while (length > 1) + { + for (num_tmps = 0; num_tmps < max_tmps; num_tmps++) + { + if (length >= 4) + { + tmp_info[num_tmps].load = AS2(mov%L0,%1,%2); + tmp_info[num_tmps].store = AS2(mov%L0,%2,%0); + tmp_info[num_tmps].xops[0] = adj_offsettable_operand (dest, offset); + tmp_info[num_tmps].xops[1] = adj_offsettable_operand (src, offset); + offset += 4; + length -= 4; + } + else if (length >= 2) + { + tmp_info[num_tmps].load = AS2(mov%W0,%1,%2); + tmp_info[num_tmps].store = AS2(mov%W0,%2,%0); + tmp_info[num_tmps].xops[0] = adj_offsettable_operand (dest, offset); + tmp_info[num_tmps].xops[1] = adj_offsettable_operand (src, offset); + offset += 2; + length -= 2; + } + else + break; + } + + for (i = 0; i < num_tmps; i++) + output_asm_insn (tmp_info[i].load, tmp_info[i].xops); + + for (i = 0; i < num_tmps; i++) + output_asm_insn (tmp_info[i].store, tmp_info[i].xops); + } + + if (length == 1) + { + xops[0] = adj_offsettable_operand (dest, offset); + xops[1] = adj_offsettable_operand (src, offset); + xops[2] = qi_tmp; + output_asm_insn (AS2(mov%B0,%1,%2), xops); + output_asm_insn (AS2(mov%B0,%2,%0), xops); + } + + return ""; +} + int standard_80387_constant_p (x) @@ -741,111 +1084,6 @@ symbolic_reference_mentioned_p (op) return 0; } -/* Return a legitimate reference for ORIG (an address) using the - register REG. If REG is 0, a new pseudo is generated. - - There are three types of references that must be handled: - - 1. Global data references must load the address from the GOT, via - the PIC reg. An insn is emitted to do this load, and the reg is - returned. - - 2. Static data references must compute the address as an offset - from the GOT, whose base is in the PIC reg. An insn is emitted to - compute the address into a reg, and the reg is returned. Static - data objects have SYMBOL_REF_FLAG set to differentiate them from - global data objects. - - 3. Constant pool addresses must be handled special. They are - considered legitimate addresses, but only if not used with regs. - When printed, the output routines know to print the reference with the - PIC reg, even though the PIC reg doesn't appear in the RTL. - - GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC - reg also appears in the address (except for constant pool references, - noted above). - - "switch" statements also require special handling when generating - PIC code. See comments by the `casesi' insn in i386.md for details. */ - -rtx -legitimize_pic_address (orig, reg) - rtx orig; - rtx reg; -{ - rtx addr = orig; - rtx new = orig; - - if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF) - { - if (GET_CODE (addr) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (addr)) - reg = new = orig; - else - { - if (reg == 0) - reg = gen_reg_rtx (Pmode); - - if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_FLAG (addr)) - new = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, orig); - else - new = gen_rtx (MEM, Pmode, - gen_rtx (PLUS, Pmode, - pic_offset_table_rtx, orig)); - - emit_move_insn (reg, new); - } - current_function_uses_pic_offset_table = 1; - return reg; - } - else if (GET_CODE (addr) == CONST || GET_CODE (addr) == PLUS) - { - rtx base; - - if (GET_CODE (addr) == CONST) - { - addr = XEXP (addr, 0); - if (GET_CODE (addr) != PLUS) - abort (); - } - - if (XEXP (addr, 0) == pic_offset_table_rtx) - return orig; - - if (reg == 0) - reg = gen_reg_rtx (Pmode); - - base = legitimize_pic_address (XEXP (addr, 0), reg); - addr = legitimize_pic_address (XEXP (addr, 1), - base == reg ? NULL_RTX : reg); - - if (GET_CODE (addr) == CONST_INT) - return plus_constant (base, INTVAL (addr)); - - if (GET_CODE (addr) == PLUS && CONSTANT_P (XEXP (addr, 1))) - { - base = gen_rtx (PLUS, Pmode, base, XEXP (addr, 0)); - addr = XEXP (addr, 1); - } - return gen_rtx (PLUS, Pmode, base, addr); - } - return new; -} - -/* Emit insns to move operands[1] into operands[0]. */ - -void -emit_pic_move (operands, mode) - rtx *operands; - enum machine_mode mode; -{ - rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode); - - if (GET_CODE (operands[0]) == MEM && SYMBOLIC_CONST (operands[1])) - operands[1] = (rtx) force_reg (SImode, operands[1]); - else - operands[1] = legitimize_pic_address (operands[1], temp); -} - /* This function generates the assembly code for function entry. FILE is an stdio stream to output the code to. SIZE is an int: how many units of temporary storage to allocate. */ @@ -859,8 +1097,7 @@ function_prologue (file, size) int limit; rtx xops[4]; int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table - || current_function_uses_const_pool - || profile_flag || profile_block_flag); + || current_function_uses_const_pool); xops[0] = stack_pointer_rtx; xops[1] = frame_pointer_rtx; @@ -921,16 +1158,8 @@ simple_386_epilogue () int nregs = 0; int reglimit = (frame_pointer_needed ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM); - -#ifdef FUNCTION_PROFILER_EPILOGUE - if (profile_flag) - return 0; -#endif - - if (flag_pic && (current_function_uses_pic_offset_table - || current_function_uses_const_pool - || profile_flag || profile_block_flag)) - return 0; + int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table + || current_function_uses_const_pool); #ifdef NON_SAVING_SETJMP if (NON_SAVING_SETJMP && current_function_calls_setjmp) @@ -941,12 +1170,14 @@ simple_386_epilogue () return 0; for (regno = reglimit - 1; regno >= 0; regno--) - if (regs_ever_live[regno] && ! call_used_regs[regno]) + if ((regs_ever_live[regno] && ! call_used_regs[regno]) + || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used)) nregs++; return nregs == 0 || ! frame_pointer_needed; } + /* This function generates the assembly code for function exit. FILE is an stdio stream to output the code to. SIZE is an int: how many units of temporary storage to deallocate. */ @@ -963,11 +1194,6 @@ function_epilogue (file, size) int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table || current_function_uses_const_pool); -#ifdef FUNCTION_PROFILER_EPILOGUE - if (profile_flag) - FUNCTION_PROFILER_EPILOGUE (file); -#endif - /* Compute the number of registers to pop */ limit = (frame_pointer_needed @@ -1025,7 +1251,7 @@ function_epilogue (file, size) { /* On i486, mov & pop is faster than "leave". */ - if (TARGET_486) + if (!TARGET_386) { xops[0] = frame_pointer_rtx; output_asm_insn (AS2 (mov%L2,%0,%2), xops); @@ -1064,6 +1290,527 @@ function_epilogue (file, size) else output_asm_insn ("ret", xops); } + + +/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression + that is a valid memory address for an instruction. + The MODE argument is the machine mode for the MEM expression + that wants to use this address. + + On x86, legitimate addresses are: + base movl (base),reg + displacement movl disp,reg + base + displacement movl disp(base),reg + index + base movl (base,index),reg + (index + base) + displacement movl disp(base,index),reg + index*scale movl (,index,scale),reg + index*scale + disp movl disp(,index,scale),reg + index*scale + base movl (base,index,scale),reg + (index*scale + base) + disp movl disp(base,index,scale),reg + + In each case, scale can be 1, 2, 4, 8. */ + +/* This is exactly the same as print_operand_addr, except that + it recognizes addresses instead of printing them. + + It only recognizes address in canonical form. LEGITIMIZE_ADDRESS should + convert common non-canonical forms to canonical form so that they will + be recognized. */ + +#define ADDR_INVALID(msg,insn) \ +do { \ + if (TARGET_DEBUG_ADDR) \ + { \ + fprintf (stderr, msg); \ + debug_rtx (insn); \ + } \ +} while (0) + +int +legitimate_address_p (mode, addr, strict) + enum machine_mode mode; + register rtx addr; + int strict; +{ + rtx base = NULL_RTX; + rtx indx = NULL_RTX; + rtx scale = NULL_RTX; + rtx disp = NULL_RTX; + + if (TARGET_DEBUG_ADDR) + { + fprintf (stderr, + "\n==========\nGO_IF_LEGITIMATE_ADDRESS, mode = %s, strict = %d\n", + GET_MODE_NAME (mode), strict); + + debug_rtx (addr); + } + + if (GET_CODE (addr) == REG || GET_CODE (addr) == SUBREG) + base = addr; /* base reg */ + + else if (GET_CODE (addr) == PLUS) + { + rtx op0 = XEXP (addr, 0); + rtx op1 = XEXP (addr, 1); + enum rtx_code code0 = GET_CODE (op0); + enum rtx_code code1 = GET_CODE (op1); + + if (code0 == REG || code0 == SUBREG) + { + if (code1 == REG || code1 == SUBREG) + { + indx = op0; /* index + base */ + base = op1; + } + + else + { + base = op0; /* base + displacement */ + disp = op1; + } + } + + else if (code0 == MULT) + { + indx = XEXP (op0, 0); + scale = XEXP (op0, 1); + + if (code1 == REG || code1 == SUBREG) + base = op1; /* index*scale + base */ + + else + disp = op1; /* index*scale + disp */ + } + + else if (code0 == PLUS && GET_CODE (XEXP (op0, 0)) == MULT) + { + indx = XEXP (XEXP (op0, 0), 0); /* index*scale + base + disp */ + scale = XEXP (XEXP (op0, 0), 1); + base = XEXP (op0, 1); + disp = op1; + } + + else if (code0 == PLUS) + { + indx = XEXP (op0, 0); /* index + base + disp */ + base = XEXP (op0, 1); + disp = op1; + } + + else + { + ADDR_INVALID ("PLUS subcode is not valid.\n", op0); + return FALSE; + } + } + + else if (GET_CODE (addr) == MULT) + { + indx = XEXP (addr, 0); /* index*scale */ + scale = XEXP (addr, 1); + } + + else + disp = addr; /* displacement */ + + /* Allow arg pointer and stack pointer as index if there is not scaling */ + if (base && indx && !scale + && (indx == arg_pointer_rtx || indx == stack_pointer_rtx)) + { + rtx tmp = base; + base = indx; + indx = tmp; + } + + /* Validate base register */ + /* Don't allow SUBREG's here, it can lead to spill failures when the base + is one word out of a two word structure, which is represented internally + as a DImode int. */ + if (base) + { + if (GET_CODE (base) != REG) + { + ADDR_INVALID ("Base is not a register.\n", base); + return FALSE; + } + + if ((strict && !REG_OK_FOR_BASE_STRICT_P (base)) + || (!strict && !REG_OK_FOR_BASE_NONSTRICT_P (base))) + { + ADDR_INVALID ("Base is not valid.\n", base); + return FALSE; + } + } + + /* Validate index register */ + /* Don't allow SUBREG's here, it can lead to spill failures when the index + is one word out of a two word structure, which is represented internally + as a DImode int. */ + if (indx) + { + if (GET_CODE (indx) != REG) + { + ADDR_INVALID ("Index is not a register.\n", indx); + return FALSE; + } + + if ((strict && !REG_OK_FOR_INDEX_STRICT_P (indx)) + || (!strict && !REG_OK_FOR_INDEX_NONSTRICT_P (indx))) + { + ADDR_INVALID ("Index is not valid.\n", indx); + return FALSE; + } + } + else if (scale) + abort (); /* scale w/o index illegal */ + + /* Validate scale factor */ + if (scale) + { + HOST_WIDE_INT value; + + if (GET_CODE (scale) != CONST_INT) + { + ADDR_INVALID ("Scale is not valid.\n", scale); + return FALSE; + } + + value = INTVAL (scale); + if (value != 1 && value != 2 && value != 4 && value != 8) + { + ADDR_INVALID ("Scale is not a good multiplier.\n", scale); + return FALSE; + } + } + + /* Validate displacement */ + if (disp) + { + if (!CONSTANT_ADDRESS_P (disp)) + { + ADDR_INVALID ("Displacement is not valid.\n", disp); + return FALSE; + } + + if (GET_CODE (disp) == CONST_DOUBLE) + { + ADDR_INVALID ("Displacement is a const_double.\n", disp); + return FALSE; + } + + if (flag_pic && SYMBOLIC_CONST (disp) && base != pic_offset_table_rtx + && (indx != pic_offset_table_rtx || scale != NULL_RTX)) + { + ADDR_INVALID ("Displacement is an invalid pic reference.\n", disp); + return FALSE; + } + + if (HALF_PIC_P () && HALF_PIC_ADDRESS_P (disp) + && (base != NULL_RTX || indx != NULL_RTX)) + { + ADDR_INVALID ("Displacement is an invalid half-pic reference.\n", disp); + return FALSE; + } + } + + if (TARGET_DEBUG_ADDR) + fprintf (stderr, "Address is valid.\n"); + + /* Everything looks valid, return true */ + return TRUE; +} + + +/* Return a legitimate reference for ORIG (an address) using the + register REG. If REG is 0, a new pseudo is generated. + + There are three types of references that must be handled: + + 1. Global data references must load the address from the GOT, via + the PIC reg. An insn is emitted to do this load, and the reg is + returned. + + 2. Static data references must compute the address as an offset + from the GOT, whose base is in the PIC reg. An insn is emitted to + compute the address into a reg, and the reg is returned. Static + data objects have SYMBOL_REF_FLAG set to differentiate them from + global data objects. + + 3. Constant pool addresses must be handled special. They are + considered legitimate addresses, but only if not used with regs. + When printed, the output routines know to print the reference with the + PIC reg, even though the PIC reg doesn't appear in the RTL. + + GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC + reg also appears in the address (except for constant pool references, + noted above). + + "switch" statements also require special handling when generating + PIC code. See comments by the `casesi' insn in i386.md for details. */ + +rtx +legitimize_pic_address (orig, reg) + rtx orig; + rtx reg; +{ + rtx addr = orig; + rtx new = orig; + + if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF) + { + if (GET_CODE (addr) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (addr)) + reg = new = orig; + else + { + if (reg == 0) + reg = gen_reg_rtx (Pmode); + + if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_FLAG (addr)) + || GET_CODE (addr) == LABEL_REF) + new = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, orig); + else + new = gen_rtx (MEM, Pmode, + gen_rtx (PLUS, Pmode, + pic_offset_table_rtx, orig)); + + emit_move_insn (reg, new); + } + current_function_uses_pic_offset_table = 1; + return reg; + } + else if (GET_CODE (addr) == CONST || GET_CODE (addr) == PLUS) + { + rtx base; + + if (GET_CODE (addr) == CONST) + { + addr = XEXP (addr, 0); + if (GET_CODE (addr) != PLUS) + abort (); + } + + if (XEXP (addr, 0) == pic_offset_table_rtx) + return orig; + + if (reg == 0) + reg = gen_reg_rtx (Pmode); + + base = legitimize_pic_address (XEXP (addr, 0), reg); + addr = legitimize_pic_address (XEXP (addr, 1), + base == reg ? NULL_RTX : reg); + + if (GET_CODE (addr) == CONST_INT) + return plus_constant (base, INTVAL (addr)); + + if (GET_CODE (addr) == PLUS && CONSTANT_P (XEXP (addr, 1))) + { + base = gen_rtx (PLUS, Pmode, base, XEXP (addr, 0)); + addr = XEXP (addr, 1); + } + return gen_rtx (PLUS, Pmode, base, addr); + } + return new; +} + + +/* Emit insns to move operands[1] into operands[0]. */ + +void +emit_pic_move (operands, mode) + rtx *operands; + enum machine_mode mode; +{ + rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode); + + if (GET_CODE (operands[0]) == MEM && SYMBOLIC_CONST (operands[1])) + operands[1] = (rtx) force_reg (SImode, operands[1]); + else + operands[1] = legitimize_pic_address (operands[1], temp); +} + + +/* Try machine-dependent ways of modifying an illegitimate address + to be legitimate. If we find one, return the new, valid address. + This macro is used in only one place: `memory_address' in explow.c. + + OLDX is the address as it was before break_out_memory_refs was called. + In some cases it is useful to look at this to decide what needs to be done. + + MODE and WIN are passed so that this macro can use + GO_IF_LEGITIMATE_ADDRESS. + + It is always safe for this macro to do nothing. It exists to recognize + opportunities to optimize the output. + + For the 80386, we handle X+REG by loading X into a register R and + using R+REG. R will go in a general reg and indexing will be used. + However, if REG is a broken-out memory address or multiplication, + nothing needs to be done because REG can certainly go in a general reg. + + When -fpic is used, special handling is needed for symbolic references. + See comments by legitimize_pic_address in i386.c for details. */ + +rtx +legitimize_address (x, oldx, mode) + register rtx x; + register rtx oldx; + enum machine_mode mode; +{ + int changed = 0; + unsigned log; + + if (TARGET_DEBUG_ADDR) + { + fprintf (stderr, "\n==========\nLEGITIMIZE_ADDRESS, mode = %s\n", GET_MODE_NAME (mode)); + debug_rtx (x); + } + + if (flag_pic && SYMBOLIC_CONST (x)) + return legitimize_pic_address (x, 0); + + /* Canonicalize shifts by 0, 1, 2, 3 into multiply */ + if (GET_CODE (x) == ASHIFT + && GET_CODE (XEXP (x, 1)) == CONST_INT + && (log = (unsigned)exact_log2 (INTVAL (XEXP (x, 1)))) < 4) + { + changed = 1; + x = gen_rtx (MULT, Pmode, + force_reg (Pmode, XEXP (x, 0)), + GEN_INT (1 << log)); + } + + if (GET_CODE (x) == PLUS) + { + /* Canonicalize shifts by 0, 1, 2, 3 into multiply */ + if (GET_CODE (XEXP (x, 0)) == ASHIFT + && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT + && (log = (unsigned)exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) < 4) + { + changed = 1; + XEXP (x, 0) = gen_rtx (MULT, Pmode, + force_reg (Pmode, XEXP (XEXP (x, 0), 0)), + GEN_INT (1 << log)); + } + + if (GET_CODE (XEXP (x, 1)) == ASHIFT + && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT + && (log = (unsigned)exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1)))) < 4) + { + changed = 1; + XEXP (x, 1) = gen_rtx (MULT, Pmode, + force_reg (Pmode, XEXP (XEXP (x, 1), 0)), + GEN_INT (1 << log)); + } + + /* Put multiply first if it isn't already */ + if (GET_CODE (XEXP (x, 1)) == MULT) + { + rtx tmp = XEXP (x, 0); + XEXP (x, 0) = XEXP (x, 1); + XEXP (x, 1) = tmp; + changed = 1; + } + + /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const))) + into (plus (plus (mult (reg) (const)) (reg)) (const)). This can be + created by virtual register instantiation, register elimination, and + similar optimizations. */ + if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS) + { + changed = 1; + x = gen_rtx (PLUS, Pmode, + gen_rtx (PLUS, Pmode, XEXP (x, 0), XEXP (XEXP (x, 1), 0)), + XEXP (XEXP (x, 1), 1)); + } + + /* Canonicalize (plus (plus (mult (reg) (const)) (plus (reg) (const))) const) + into (plus (plus (mult (reg) (const)) (reg)) (const)). */ + else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS + && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT + && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS + && CONSTANT_P (XEXP (x, 1))) + { + rtx constant, other; + + if (GET_CODE (XEXP (x, 1)) == CONST_INT) + { + constant = XEXP (x, 1); + other = XEXP (XEXP (XEXP (x, 0), 1), 1); + } + else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT) + { + constant = XEXP (XEXP (XEXP (x, 0), 1), 1); + other = XEXP (x, 1); + } + else + constant = 0; + + if (constant) + { + changed = 1; + x = gen_rtx (PLUS, Pmode, + gen_rtx (PLUS, Pmode, XEXP (XEXP (x, 0), 0), + XEXP (XEXP (XEXP (x, 0), 1), 0)), + plus_constant (other, INTVAL (constant))); + } + } + + if (changed && legitimate_address_p (mode, x, FALSE)) + return x; + + if (GET_CODE (XEXP (x, 0)) == MULT) + { + changed = 1; + XEXP (x, 0) = force_operand (XEXP (x, 0), 0); + } + + if (GET_CODE (XEXP (x, 1)) == MULT) + { + changed = 1; + XEXP (x, 1) = force_operand (XEXP (x, 1), 0); + } + + if (changed + && GET_CODE (XEXP (x, 1)) == REG + && GET_CODE (XEXP (x, 0)) == REG) + return x; + + if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1))) + { + changed = 1; + x = legitimize_pic_address (x, 0); + } + + if (changed && legitimate_address_p (mode, x, FALSE)) + return x; + + if (GET_CODE (XEXP (x, 0)) == REG) + { + register rtx temp = gen_reg_rtx (Pmode); + register rtx val = force_operand (XEXP (x, 1), temp); + if (val != temp) + emit_move_insn (temp, val); + + XEXP (x, 1) = temp; + return x; + } + + else if (GET_CODE (XEXP (x, 1)) == REG) + { + register rtx temp = gen_reg_rtx (Pmode); + register rtx val = force_operand (XEXP (x, 0), temp); + if (val != temp) + emit_move_insn (temp, val); + + XEXP (x, 0) = temp; + return x; + } + } + + return x; +} + /* Print an integer constant expression in assembler syntax. Addition and subtraction are the only arithmetic that may appear in these @@ -1102,7 +1849,9 @@ output_pic_addr_const (file, x, code) fprintf (file, "@GOTOFF(%%ebx)"); else if (code == 'P') fprintf (file, "@PLT"); - else if (GET_CODE (x) == LABEL_REF || ! SYMBOL_REF_FLAG (x)) + else if (GET_CODE (x) == LABEL_REF) + fprintf (file, "@GOTOFF"); + else if (! SYMBOL_REF_FLAG (x)) fprintf (file, "@GOT"); else fprintf (file, "@GOTOFF"); @@ -1424,15 +2173,14 @@ print_operand_address (file, addr) if (addr != 0) { - if (GET_CODE (addr) == LABEL_REF) + if (flag_pic) + output_pic_addr_const (file, addr, 0); + + else if (GET_CODE (addr) == LABEL_REF) output_asm_label (addr); + else - { - if (flag_pic) - output_pic_addr_const (file, addr, 0); - else - output_addr_const (file, addr); - } + output_addr_const (file, addr); } if (ireg != 0 && GET_CODE (ireg) == MULT) @@ -1666,32 +2414,7 @@ binary_387_op (op, mode) } } -/* Return 1 if this is a valid conversion operation on a 387. - OP is the expression matched, and MODE is its mode. */ - -int -convert_387_op (op, mode) - register rtx op; - enum machine_mode mode; -{ - if (mode != VOIDmode && mode != GET_MODE (op)) - return 0; - - switch (GET_CODE (op)) - { - case FLOAT: - return GET_MODE (XEXP (op, 0)) == SImode; - - case FLOAT_EXTEND: - return ((mode == DFmode && GET_MODE (XEXP (op, 0)) == SFmode) - || (mode == XFmode && GET_MODE (XEXP (op, 0)) == DFmode) - || (mode == XFmode && GET_MODE (XEXP (op, 0)) == SFmode)); - - default: - return 0; - } -} - + /* Return 1 if this is a valid shift or rotate operation on a 386. OP is the expression matched, and MODE is its mode. */ @@ -1813,9 +2536,9 @@ output_387_binary_op (insn, operands) return strcat (buf, AS2 (p,%2,%0)); if (STACK_TOP_P (operands[0])) - return strcat (buf, AS2 (,%y2,%0)); + return strcat (buf, AS2C (%y2,%0)); else - return strcat (buf, AS2 (,%2,%0)); + return strcat (buf, AS2C (%2,%0)); case MINUS: case DIV: @@ -1848,12 +2571,12 @@ output_387_binary_op (insn, operands) if (STACK_TOP_P (operands[0])) { if (STACK_TOP_P (operands[1])) - return strcat (buf, AS2 (,%y2,%0)); + return strcat (buf, AS2C (%y2,%0)); else return strcat (buf, AS2 (r,%y1,%0)); } else if (STACK_TOP_P (operands[1])) - return strcat (buf, AS2 (,%1,%0)); + return strcat (buf, AS2C (%1,%0)); else return strcat (buf, AS2 (r,%2,%0)); diff --git a/gnu/usr.bin/cc/cc_int/bc-emit.c b/gnu/usr.bin/cc/cc_int/bc-emit.c index b5d0c6c..55e4fe4 100644 --- a/gnu/usr.bin/cc/cc_int/bc-emit.c +++ b/gnu/usr.bin/cc/cc_int/bc-emit.c @@ -145,14 +145,14 @@ bc_sym_write (file) { fprintf (file, "\n\t.comm "); prsym (file, s->name); - fprintf (file, ", %d\n", s->val); + fprintf (file, ", %lu\n", s->val); } } else if (s->common) { fprintf (file, "\n\t.lcomm "); prsym (file, s->name); - fprintf (file, ", %d\n", s->val); + fprintf (file, ", %lu\n", s->val); } } } diff --git a/gnu/usr.bin/cc/cc_int/c-common.c b/gnu/usr.bin/cc/cc_int/c-common.c index 9d4cc2f..efc5fcb 100644 --- a/gnu/usr.bin/cc/cc_int/c-common.c +++ b/gnu/usr.bin/cc/cc_int/c-common.c @@ -253,6 +253,19 @@ decl_attributes (decl, attributes) else warning_with_decl (decl, "`const' attribute ignored"); } + else if (TREE_VALUE (a) == get_identifier ("transparent_union")) + { + if (TREE_CODE (decl) == PARM_DECL + && TREE_CODE (type) == UNION_TYPE + && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type))) + DECL_TRANSPARENT_UNION (decl) = 1; + else if (TREE_CODE (decl) == TYPE_DECL + && TREE_CODE (type) == UNION_TYPE + && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type))) + TYPE_TRANSPARENT_UNION (type) = 1; + else + warning_with_decl (decl, "`transparent_union' attribute ignored"); + } else if (TREE_CODE (name) != TREE_LIST) { #ifdef VALID_MACHINE_ATTRIBUTE @@ -518,7 +531,7 @@ static format_char_info print_char_table[] = { { "s", 1, T_C, NULL, T_W, NULL, NULL, "-wp" }, { "S", 1, T_W, NULL, NULL, NULL, NULL, "-wp" }, { "p", 1, T_V, NULL, NULL, NULL, NULL, "-w" }, - { "n", 1, T_I, T_S, T_L, NULL, NULL, "" }, + { "n", 1, T_I, T_S, T_L, T_LL, NULL, "" }, { NULL } }; @@ -531,7 +544,7 @@ static format_char_info scan_char_table[] = { { "C", 1, T_W, NULL, NULL, NULL, NULL, "*" }, { "S", 1, T_W, NULL, NULL, NULL, NULL, "*" }, { "p", 2, T_V, NULL, NULL, NULL, NULL, "*" }, - { "n", 1, T_I, T_S, T_L, NULL, NULL, "" }, + { "n", 1, T_I, T_S, T_L, T_LL, NULL, "" }, { NULL } }; @@ -1340,6 +1353,37 @@ type_for_mode (mode, unsignedp) return 0; } +/* Return the minimum number of bits needed to represent VALUE in a + signed or unsigned type, UNSIGNEDP says which. */ + +int +min_precision (value, unsignedp) + tree value; + int unsignedp; +{ + int log; + + /* If the value is negative, compute its negative minus 1. The latter + adjustment is because the absolute value of the largest negative value + is one larger than the largest positive value. This is equivalent to + a bit-wise negation, so use that operation instead. */ + + if (tree_int_cst_sgn (value) < 0) + value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value)); + + /* Return the number of bits needed, taking into account the fact + that we need one more bit for a signed than unsigned type. */ + + if (integer_zerop (value)) + log = 0; + else if (TREE_INT_CST_HIGH (value) != 0) + log = HOST_BITS_PER_WIDE_INT + floor_log2 (TREE_INT_CST_HIGH (value)); + else + log = floor_log2 (TREE_INT_CST_LOW (value)); + + return log + 1 + ! unsignedp; +} + /* Print an error message for invalid operands to arith operation CODE. NOP_EXPR is used as a special case (see truthvalue_conversion). */ @@ -1451,9 +1495,11 @@ shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr) real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE; /* If first arg is constant, swap the args (changing operation - so value is preserved), for canonicalization. */ + so value is preserved), for canonicalization. Don't do this if + the second arg is 0. */ - if (TREE_CONSTANT (primop0)) + if (TREE_CONSTANT (primop0) + && ! integer_zerop (primop1) && ! real_zerop (primop1)) { register tree tem = primop0; register int temi = unsignedp0; @@ -1692,13 +1738,23 @@ shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr) switch (code) { case GE_EXPR: - if (extra_warnings) + /* All unsigned values are >= 0, so we warn if extra warnings + are requested. However, if OP0 is a constant that is + >= 0, the signedness of the comparison isn't an issue, + so suppress the warning. */ + if (extra_warnings + && ! (TREE_CODE (primop0) == INTEGER_CST + && ! TREE_OVERFLOW (convert (signed_type (type), + primop0)))) warning ("unsigned value >= 0 is always 1"); value = integer_one_node; break; case LT_EXPR: - if (extra_warnings) + if (extra_warnings + && ! (TREE_CODE (primop0) == INTEGER_CST + && ! TREE_OVERFLOW (convert (signed_type (type), + primop0)))) warning ("unsigned value < 0 is always 0"); value = integer_zero_node; } diff --git a/gnu/usr.bin/cc/cc_int/calls.c b/gnu/usr.bin/cc/cc_int/calls.c index f035079..2002322 100644 --- a/gnu/usr.bin/cc/cc_int/calls.c +++ b/gnu/usr.bin/cc/cc_int/calls.c @@ -443,7 +443,8 @@ emit_call_1 (funexp, funtype, stack_size, struct_value_size, next_arg_reg, { if (!already_popped) CALL_INSN_FUNCTION_USAGE (call_insn) = - gen_rtx (EXPR_LIST, CLOBBER, stack_pointer_rtx, + gen_rtx (EXPR_LIST, VOIDmode, + gen_rtx (CLOBBER, VOIDmode, stack_pointer_rtx), CALL_INSN_FUNCTION_USAGE (call_insn)); stack_size -= RETURN_POPS_ARGS (funtype, stack_size); stack_size_rtx = GEN_INT (stack_size); @@ -667,9 +668,6 @@ expand_call (exp, target, ignore) { struct_value_size = int_size_in_bytes (TREE_TYPE (exp)); - if (struct_value_size < 0) - abort (); - if (target && GET_CODE (target) == MEM) structure_value_addr = XEXP (target, 0); else @@ -680,6 +678,9 @@ expand_call (exp, target, ignore) specified. If we were to allocate space on the stack here, we would have no way of knowing when to free it. */ + if (struct_value_size < 0) + abort (); + structure_value_addr = XEXP (assign_stack_temp (BLKmode, struct_value_size, 1), 0); target = 0; @@ -901,15 +902,18 @@ expand_call (exp, target, ignore) as if it were an extra parameter. */ if (structure_value_addr && struct_value_rtx == 0) { + /* If structure_value_addr is a REG other than + virtual_outgoing_args_rtx, we can use always use it. If it + is not a REG, we must always copy it into a register. + If it is virtual_outgoing_args_rtx, we must copy it to another + register in some cases. */ + rtx temp = (GET_CODE (structure_value_addr) != REG #ifdef ACCUMULATE_OUTGOING_ARGS - /* If the stack will be adjusted, make sure the structure address - does not refer to virtual_outgoing_args_rtx. */ - rtx temp = (stack_arg_under_construction - ? copy_addr_to_reg (structure_value_addr) - : force_reg (Pmode, structure_value_addr)); -#else - rtx temp = force_reg (Pmode, structure_value_addr); + || (stack_arg_under_construction + && structure_value_addr == virtual_outgoing_args_rtx) #endif + ? copy_addr_to_reg (structure_value_addr) + : structure_value_addr); actparms = tree_cons (error_mark_node, @@ -979,6 +983,12 @@ expand_call (exp, target, ignore) if (type == error_mark_node || TYPE_SIZE (type) == 0) args[i].tree_value = integer_zero_node, type = integer_type_node; + /* If TYPE is a transparent union, pass things the way we would + pass the first field of the union. We have already verified that + the modes are the same. */ + if (TYPE_TRANSPARENT_UNION (type)) + type = TREE_TYPE (TYPE_FIELDS (type)); + /* Decide where to pass this arg. args[i].reg is nonzero if all or part is passed in registers. @@ -1343,98 +1353,103 @@ expand_call (exp, target, ignore) } argblock = push_block (ARGS_SIZE_RTX (args_size), 0, 0); } - else if (must_preallocate) + else { /* Note that we must go through the motions of allocating an argument block even if the size is zero because we may be storing args in the area reserved for register arguments, which may be part of the stack frame. */ + int needed = args_size.constant; -#ifdef ACCUMULATE_OUTGOING_ARGS /* Store the maximum argument space used. It will be pushed by the - prologue. - - Since the stack pointer will never be pushed, it is possible for - the evaluation of a parm to clobber something we have already - written to the stack. Since most function calls on RISC machines - do not use the stack, this is uncommon, but must work correctly. - - Therefore, we save any area of the stack that was already written - and that we are using. Here we set up to do this by making a new - stack usage map from the old one. The actual save will be done - by store_one_arg. - - Another approach might be to try to reorder the argument - evaluations to avoid this conflicting stack usage. */ + prologue (if ACCUMULATE_OUTGOING_ARGS, or stack overflow checking). */ if (needed > current_function_outgoing_args_size) current_function_outgoing_args_size = needed; + if (must_preallocate) + { +#ifdef ACCUMULATE_OUTGOING_ARGS + /* Since the stack pointer will never be pushed, it is possible for + the evaluation of a parm to clobber something we have already + written to the stack. Since most function calls on RISC machines + do not use the stack, this is uncommon, but must work correctly. + + Therefore, we save any area of the stack that was already written + and that we are using. Here we set up to do this by making a new + stack usage map from the old one. The actual save will be done + by store_one_arg. + + Another approach might be to try to reorder the argument + evaluations to avoid this conflicting stack usage. */ + #if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE) - /* Since we will be writing into the entire argument area, the - map must be allocated for its entire size, not just the part that - is the responsibility of the caller. */ - needed += reg_parm_stack_space; + /* Since we will be writing into the entire argument area, the + map must be allocated for its entire size, not just the part that + is the responsibility of the caller. */ + needed += reg_parm_stack_space; #endif #ifdef ARGS_GROW_DOWNWARD - highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, - needed + 1); + highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, + needed + 1); #else - highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, needed); + highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, + needed); #endif - stack_usage_map = (char *) alloca (highest_outgoing_arg_in_use); + stack_usage_map = (char *) alloca (highest_outgoing_arg_in_use); - if (initial_highest_arg_in_use) - bcopy (initial_stack_usage_map, stack_usage_map, - initial_highest_arg_in_use); + if (initial_highest_arg_in_use) + bcopy (initial_stack_usage_map, stack_usage_map, + initial_highest_arg_in_use); - if (initial_highest_arg_in_use != highest_outgoing_arg_in_use) - bzero (&stack_usage_map[initial_highest_arg_in_use], - highest_outgoing_arg_in_use - initial_highest_arg_in_use); - needed = 0; + if (initial_highest_arg_in_use != highest_outgoing_arg_in_use) + bzero (&stack_usage_map[initial_highest_arg_in_use], + highest_outgoing_arg_in_use - initial_highest_arg_in_use); + needed = 0; - /* The address of the outgoing argument list must not be copied to a - register here, because argblock would be left pointing to the - wrong place after the call to allocate_dynamic_stack_space below. */ + /* The address of the outgoing argument list must not be copied to a + register here, because argblock would be left pointing to the + wrong place after the call to allocate_dynamic_stack_space below. + */ - argblock = virtual_outgoing_args_rtx; + argblock = virtual_outgoing_args_rtx; #else /* not ACCUMULATE_OUTGOING_ARGS */ - if (inhibit_defer_pop == 0) - { - /* Try to reuse some or all of the pending_stack_adjust - to get this space. Maybe we can avoid any pushing. */ - if (needed > pending_stack_adjust) + if (inhibit_defer_pop == 0) { - needed -= pending_stack_adjust; - pending_stack_adjust = 0; + /* Try to reuse some or all of the pending_stack_adjust + to get this space. Maybe we can avoid any pushing. */ + if (needed > pending_stack_adjust) + { + needed -= pending_stack_adjust; + pending_stack_adjust = 0; + } + else + { + pending_stack_adjust -= needed; + needed = 0; + } } + /* Special case this because overhead of `push_block' in this + case is non-trivial. */ + if (needed == 0) + argblock = virtual_outgoing_args_rtx; else - { - pending_stack_adjust -= needed; - needed = 0; - } - } - /* Special case this because overhead of `push_block' in this - case is non-trivial. */ - if (needed == 0) - argblock = virtual_outgoing_args_rtx; - else - argblock = push_block (GEN_INT (needed), 0, 0); - - /* We only really need to call `copy_to_reg' in the case where push - insns are going to be used to pass ARGBLOCK to a function - call in ARGS. In that case, the stack pointer changes value - from the allocation point to the call point, and hence - the value of VIRTUAL_OUTGOING_ARGS_RTX changes as well. - But might as well always do it. */ - argblock = copy_to_reg (argblock); + argblock = push_block (GEN_INT (needed), 0, 0); + + /* We only really need to call `copy_to_reg' in the case where push + insns are going to be used to pass ARGBLOCK to a function + call in ARGS. In that case, the stack pointer changes value + from the allocation point to the call point, and hence + the value of VIRTUAL_OUTGOING_ARGS_RTX changes as well. + But might as well always do it. */ + argblock = copy_to_reg (argblock); #endif /* not ACCUMULATE_OUTGOING_ARGS */ + } } - #ifdef ACCUMULATE_OUTGOING_ARGS /* The save/restore code in store_one_arg handles all cases except one: a constructor call (including a C function returning a BLKmode struct) @@ -2193,7 +2208,7 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode, be viewed as just an efficiency improvement. */ rtx slot = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0); emit_move_insn (slot, val); - val = XEXP (slot, 0); + val = force_operand (XEXP (slot, 0), NULL_RTX); mode = Pmode; } #endif @@ -2266,9 +2281,10 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode, #endif #endif -#ifdef ACCUMULATE_OUTGOING_ARGS if (args_size.constant > current_function_outgoing_args_size) current_function_outgoing_args_size = args_size.constant; + +#ifdef ACCUMULATE_OUTGOING_ARGS args_size.constant = 0; #endif @@ -2613,9 +2629,10 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue, #endif #endif -#ifdef ACCUMULATE_OUTGOING_ARGS if (args_size.constant > current_function_outgoing_args_size) current_function_outgoing_args_size = args_size.constant; + +#ifdef ACCUMULATE_OUTGOING_ARGS args_size.constant = 0; #endif diff --git a/gnu/usr.bin/cc/cc_int/combine.c b/gnu/usr.bin/cc/cc_int/combine.c index 990fa4d..4399bb0 100644 --- a/gnu/usr.bin/cc/cc_int/combine.c +++ b/gnu/usr.bin/cc/cc_int/combine.c @@ -170,11 +170,6 @@ static int last_call_cuid; static rtx subst_insn; -/* If nonzero, this is the insn that should be presumed to be - immediately in front of `subst_insn'. */ - -static rtx subst_prev_insn; - /* This is the lowest CUID that `subst' is currently dealing with. get_last_value will not return a value if the register was set at or after this CUID. If not for this mechanism, we could get confused if @@ -880,7 +875,11 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc) /* Can't merge a function call. */ || GET_CODE (src) == CALL /* Don't eliminate a function call argument. */ - || (GET_CODE (i3) == CALL_INSN && find_reg_fusage (i3, USE, dest)) + || (GET_CODE (i3) == CALL_INSN + && (find_reg_fusage (i3, USE, dest) + || (GET_CODE (dest) == REG + && REGNO (dest) < FIRST_PSEUDO_REGISTER + && global_regs[REGNO (dest)]))) /* Don't substitute into an incremented register. */ || FIND_REG_INC_NOTE (i3, dest) || (succ && FIND_REG_INC_NOTE (succ, dest)) @@ -1203,6 +1202,8 @@ try_combine (i3, i2, i1) rtx new_i3_notes, new_i2_notes; /* Notes that we substituted I3 into I2 instead of the normal case. */ int i3_subst_into_i2 = 0; + /* Notes that I1, I2 or I3 is a MULT operation. */ + int have_mult = 0; int maxreg; rtx temp; @@ -1238,7 +1239,6 @@ try_combine (i3, i2, i1) if (i1 && INSN_CUID (i1) > INSN_CUID (i2)) temp = i1, i1 = i2, i2 = temp; - subst_prev_insn = 0; added_links_insn = 0; /* First check for one important special-case that the code below will @@ -1354,9 +1354,8 @@ try_combine (i3, i2, i1) never appear in the insn stream so giving it the same INSN_UID as I2 will not cause a problem. */ - subst_prev_insn = i1 - = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2, - XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0); + i1 = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2, + XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0); SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0)); SUBST (XEXP (SET_SRC (PATTERN (i2)), 0), @@ -1392,6 +1391,15 @@ try_combine (i3, i2, i1) return 0; } + /* See if any of the insns is a MULT operation. Unless one is, we will + reject a combination that is, since it must be slower. Be conservative + here. */ + if (GET_CODE (i2src) == MULT + || (i1 != 0 && GET_CODE (i1src) == MULT) + || (GET_CODE (PATTERN (i3)) == SET + && GET_CODE (SET_SRC (PATTERN (i3))) == MULT)) + have_mult = 1; + /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd. We used to do this EXCEPT in one case: I3 has a post-inc in an output operand. However, that exception can give rise to insns like @@ -1601,7 +1609,11 @@ try_combine (i3, i2, i1) really no reason to). */ || max_reg_num () != maxreg /* Fail if we couldn't do something and have a CLOBBER. */ - || GET_CODE (newpat) == CLOBBER) + || GET_CODE (newpat) == CLOBBER + /* Fail if this new pattern is a MULT and we didn't have one before + at the outer level. */ + || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT + && ! have_mult)) { undo_all (); return 0; @@ -1804,13 +1816,14 @@ try_combine (i3, i2, i1) && ! reg_referenced_p (i2dest, newpat)) { rtx newdest = i2dest; + enum rtx_code split_code = GET_CODE (*split); + enum machine_mode split_mode = GET_MODE (*split); /* Get NEWDEST as a register in the proper mode. We have already validated that we can do this. */ - if (GET_MODE (i2dest) != GET_MODE (*split) - && GET_MODE (*split) != VOIDmode) + if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode) { - newdest = gen_rtx (REG, GET_MODE (*split), REGNO (i2dest)); + newdest = gen_rtx (REG, split_mode, REGNO (i2dest)); if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER) SUBST (regno_reg_rtx[REGNO (i2dest)], newdest); @@ -1819,25 +1832,27 @@ try_combine (i3, i2, i1) /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to an ASHIFT. This can occur if it was inside a PLUS and hence appeared to be a memory address. This is a kludge. */ - if (GET_CODE (*split) == MULT + if (split_code == MULT && GET_CODE (XEXP (*split, 1)) == CONST_INT && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0) - SUBST (*split, gen_rtx_combine (ASHIFT, GET_MODE (*split), + SUBST (*split, gen_rtx_combine (ASHIFT, split_mode, XEXP (*split, 0), GEN_INT (i))); #ifdef INSN_SCHEDULING /* If *SPLIT is a paradoxical SUBREG, when we split it, it should be written as a ZERO_EXTEND. */ - if (GET_CODE (*split) == SUBREG - && GET_CODE (SUBREG_REG (*split)) == MEM) - SUBST (*split, gen_rtx_combine (ZERO_EXTEND, GET_MODE (*split), + if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM) + SUBST (*split, gen_rtx_combine (ZERO_EXTEND, split_mode, XEXP (*split, 0))); #endif newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split); SUBST (*split, newdest); i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes); - if (i2_code_number >= 0) + + /* If the split point was a MULT and we didn't have one before, + don't use one now. */ + if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult)) insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); } } @@ -3261,10 +3276,7 @@ simplify_rtx (x, op0_mode, last, in_dest) && (temp = simplify_unary_operation (NOT, mode, XEXP (XEXP (x, 0), 1), mode)) != 0) - { - SUBST (XEXP (XEXP (x, 0), 1), temp); - return XEXP (x, 0); - } + return gen_binary (XOR, mode, XEXP (XEXP (x, 0), 0), temp); /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for operands other than 1, but that is not valid. We could do a similar @@ -3436,6 +3448,13 @@ simplify_rtx (x, op0_mode, last, in_dest) && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode) return gen_unary (GET_CODE (XEXP (x, 0)), mode, mode, XEXP (XEXP (XEXP (x, 0), 0), 0)); + + /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0)) + is (float_truncate:SF x). */ + if (GET_CODE (XEXP (x, 0)) == SUBREG + && subreg_lowpart_p (XEXP (x, 0)) + && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE) + return SUBREG_REG (XEXP (x, 0)); break; #ifdef HAVE_cc0 @@ -4354,6 +4373,7 @@ simplify_set (x) && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE) && XEXP (XEXP (src, 0), 1) == const0_rtx + && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0)) && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0), GET_MODE (XEXP (XEXP (src, 0), 0))) == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0)))) @@ -6874,8 +6894,10 @@ nonzero_bits (x, mode) int width1 = floor_log2 (nz1) + 1; int low0 = floor_log2 (nz0 & -nz0); int low1 = floor_log2 (nz1 & -nz1); - int op0_maybe_minusp = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); - int op1_maybe_minusp = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); + HOST_WIDE_INT op0_maybe_minusp + = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); + HOST_WIDE_INT op1_maybe_minusp + = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); int result_width = mode_width; int result_low = 0; @@ -8618,6 +8640,7 @@ simplify_comparison (code, pop0, pop1) { op0 = gen_lowpart_for_combine (tmode, inner_op0); op1 = gen_lowpart_for_combine (tmode, inner_op1); + code = unsigned_condition (code); changed = 1; break; } @@ -8819,6 +8842,7 @@ simplify_comparison (code, pop0, pop1) { const_op = 0, op1 = const0_rtx; code = LT; + break; } else break; @@ -9811,15 +9835,10 @@ get_last_value (x) { rtx insn, set; - /* If there is an insn that is supposed to be immediately - in front of subst_insn, use it. */ - if (subst_prev_insn != 0) - insn = subst_prev_insn; - else - for (insn = prev_nonnote_insn (subst_insn); - insn && INSN_CUID (insn) >= subst_low_cuid; - insn = prev_nonnote_insn (insn)) - ; + for (insn = prev_nonnote_insn (subst_insn); + insn && INSN_CUID (insn) >= subst_low_cuid; + insn = prev_nonnote_insn (insn)) + ; if (insn && (set = single_set (insn)) != 0 @@ -10332,10 +10351,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) switch (REG_NOTE_KIND (note)) { case REG_UNUSED: - /* If this note is from any insn other than i3, then we have no - use for it, and must ignore it. - - Any clobbers for i3 may still exist, and so we must process + /* Any clobbers for i3 may still exist, and so we must process REG_UNUSED notes from that insn. Any clobbers from i2 or i1 can only exist if they were added by @@ -10345,14 +10361,18 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) if it is for the same register as the original i3 dest. In that case, we will notice that the register is set in i3, and then add a REG_UNUSED note for the destination of i3, which - is wrong. */ - if (from_insn != i3) - break; + is wrong. However, it is possible to have REG_UNUSED notes from + i2 or i1 for register which were both used and clobbered, so + we keep notes from i2 or i1 if they will turn into REG_DEAD + notes. */ /* If this register is set or clobbered in I3, put the note there unless there is one already. */ - else if (reg_set_p (XEXP (note, 0), PATTERN (i3))) + if (reg_set_p (XEXP (note, 0), PATTERN (i3))) { + if (from_insn != i3) + break; + if (! (GET_CODE (XEXP (note, 0)) == REG ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0))) : find_reg_note (i3, REG_UNUSED, XEXP (note, 0)))) @@ -10633,7 +10653,9 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) { rtx piece = gen_rtx (REG, reg_raw_mode[i], i); - if (reg_referenced_p (piece, PATTERN (place)) + if ((reg_referenced_p (piece, PATTERN (place)) + || (GET_CODE (place) == CALL_INSN + && find_reg_fusage (place, USE, piece))) && ! dead_or_set_p (place, piece) && ! reg_bitfield_target_p (piece, PATTERN (place))) diff --git a/gnu/usr.bin/cc/cc_int/cse.c b/gnu/usr.bin/cc/cc_int/cse.c index b4947d0..75c2fb9 100644 --- a/gnu/usr.bin/cc/cc_int/cse.c +++ b/gnu/usr.bin/cc/cc_int/cse.c @@ -618,7 +618,7 @@ static struct table_elt *insert PROTO((rtx, struct table_elt *, unsigned, enum machine_mode)); static void merge_equiv_classes PROTO((struct table_elt *, struct table_elt *)); -static void invalidate PROTO((rtx)); +static void invalidate PROTO((rtx, enum machine_mode)); static void remove_invalid_refs PROTO((int)); static void rehash_using_reg PROTO((rtx)); static void invalidate_memory PROTO((struct write_data *)); @@ -1466,7 +1466,10 @@ merge_equiv_classes (class1, class2) remove_from_table (elt, hash); if (insert_regs (exp, class1, 0)) - hash = HASH (exp, mode); + { + rehash_using_reg (exp); + hash = HASH (exp, mode); + } new = insert (exp, class1, hash, mode); new->in_memory = hash_arg_in_memory; new->in_struct = hash_arg_in_struct; @@ -1480,14 +1483,18 @@ merge_equiv_classes (class1, class2) (because, when a memory reference with a varying address is stored in, all memory references are removed by invalidate_memory so specific invalidation is superfluous). + FULL_MODE, if not VOIDmode, indicates that this much should be invalidated + instead of just the amount indicated by the mode of X. This is only used + for bitfield stores into memory. A nonvarying address may be just a register or just a symbol reference, or it may be either of those plus a numeric offset. */ static void -invalidate (x) +invalidate (x, full_mode) rtx x; + enum machine_mode full_mode; { register int i; register struct table_elt *p; @@ -1562,7 +1569,7 @@ invalidate (x) { if (GET_CODE (SUBREG_REG (x)) != REG) abort (); - invalidate (SUBREG_REG (x)); + invalidate (SUBREG_REG (x), VOIDmode); return; } @@ -1573,7 +1580,10 @@ invalidate (x) if (GET_CODE (x) != MEM) abort (); - set_nonvarying_address_components (XEXP (x, 0), GET_MODE_SIZE (GET_MODE (x)), + if (full_mode == VOIDmode) + full_mode = GET_MODE (x); + + set_nonvarying_address_components (XEXP (x, 0), GET_MODE_SIZE (full_mode), &base, &start, &end); for (i = 0; i < NBUCKETS; i++) @@ -1711,7 +1721,7 @@ invalidate_for_call () if (reg_tick[regno] >= 0) reg_tick[regno]++; - in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, regno); + in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0); } /* In the case where we have no call-clobbered hard registers in the @@ -1948,17 +1958,6 @@ canon_hash (x, mode) if (fmt[i] == 'e') { rtx tem = XEXP (x, i); - rtx tem1; - - /* If the operand is a REG that is equivalent to a constant, hash - as if we were hashing the constant, since we will be comparing - that way. */ - if (tem != 0 && GET_CODE (tem) == REG - && REGNO_QTY_VALID_P (REGNO (tem)) - && qty_mode[reg_qty[REGNO (tem)]] == GET_MODE (tem) - && (tem1 = qty_const[reg_qty[REGNO (tem)]]) != 0 - && CONSTANT_P (tem1)) - tem = tem1; /* If we are about to do the last recursive call needed at this level, change it into iteration. @@ -2230,9 +2229,10 @@ refers_to_p (x, y) set PBASE, PSTART, and PEND which correspond to the base of the address, the starting offset, and ending offset respectively. - ADDR is known to be a nonvarying address. + ADDR is known to be a nonvarying address. */ - cse_address_varies_p returns zero for nonvarying addresses. */ +/* ??? Despite what the comments say, this function is in fact frequently + passed varying addresses. This does not appear to cause any problems. */ static void set_nonvarying_address_components (addr, size, pbase, pstart, pend) @@ -2323,6 +2323,12 @@ set_nonvarying_address_components (addr, size, pbase, pstart, pend) break; } + if (GET_CODE (base) == CONST_INT) + { + start += INTVAL (base); + base = const0_rtx; + } + end = start + size; /* Set the return values. */ @@ -2353,13 +2359,6 @@ refers_to_mem_p (x, base, start, end) register enum rtx_code code; register char *fmt; - if (GET_CODE (base) == CONST_INT) - { - start += INTVAL (base); - end += INTVAL (base); - base = const0_rtx; - } - repeat: if (x == 0) return 0; @@ -3086,7 +3085,7 @@ simplify_unary_operation (code, mode, op, op_mode) /* We can do some operations on integer CONST_DOUBLEs. Also allow for a DImode operation on a CONST_INT. */ - else if (GET_MODE (op) == VOIDmode && width == HOST_BITS_PER_INT * 2 + else if (GET_MODE (op) == VOIDmode && width <= HOST_BITS_PER_INT * 2 && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT)) { HOST_WIDE_INT l1, h1, lv, hv; @@ -3123,10 +3122,8 @@ simplify_unary_operation (code, mode, op, op_mode) break; case TRUNCATE: - if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) - return GEN_INT (l1 & GET_MODE_MASK (mode)); - else - return 0; + /* This is just a change-of-mode, so do nothing. */ + lv = l1, hv = h1; break; case ZERO_EXTEND: @@ -3220,7 +3217,10 @@ simplify_unary_operation (code, mode, op, op_mode) set_float_handler (NULL_PTR); return x; } - else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE_CLASS (mode) == MODE_INT + + else if (GET_CODE (op) == CONST_DOUBLE + && GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT + && GET_MODE_CLASS (mode) == MODE_INT && width <= HOST_BITS_PER_WIDE_INT && width > 0) { REAL_VALUE_TYPE d; @@ -5001,7 +5001,11 @@ fold_rtx (x, insn) if (GET_MODE (table) != Pmode) new = gen_rtx (TRUNCATE, GET_MODE (table), new); - return new; + /* Indicate this is a constant. This isn't a + valid form of CONST, but it will only be used + to fold the next insns and then discarded, so + it should be safe. */ + return gen_rtx (CONST, GET_MODE (new), new); } } } @@ -5174,13 +5178,26 @@ fold_rtx (x, insn) switch (GET_RTX_CLASS (code)) { case '1': - /* We can't simplify extension ops unless we know the original mode. */ - if ((code == ZERO_EXTEND || code == SIGN_EXTEND) - && mode_arg0 == VOIDmode) - break; - new = simplify_unary_operation (code, mode, - const_arg0 ? const_arg0 : folded_arg0, - mode_arg0); + { + int is_const = 0; + + /* We can't simplify extension ops unless we know the + original mode. */ + if ((code == ZERO_EXTEND || code == SIGN_EXTEND) + && mode_arg0 == VOIDmode) + break; + + /* If we had a CONST, strip it off and put it back later if we + fold. */ + if (const_arg0 != 0 && GET_CODE (const_arg0) == CONST) + is_const = 1, const_arg0 = XEXP (const_arg0, 0); + + new = simplify_unary_operation (code, mode, + const_arg0 ? const_arg0 : folded_arg0, + mode_arg0); + if (new != 0 && is_const) + new = gen_rtx (CONST, mode, new); + } break; case '<': @@ -5353,11 +5370,41 @@ fold_rtx (x, insn) ADDR_DIFF_VEC table. */ if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF) { - rtx y = lookup_as_function (folded_arg0, MINUS); + rtx y + = GET_CODE (folded_arg0) == MINUS ? folded_arg0 + : lookup_as_function (folded_arg0, MINUS); if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF && XEXP (XEXP (y, 1), 0) == XEXP (const_arg1, 0)) return XEXP (y, 0); + + /* Now try for a CONST of a MINUS like the above. */ + if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0 + : lookup_as_function (folded_arg0, CONST))) != 0 + && GET_CODE (XEXP (y, 0)) == MINUS + && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF + && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg1, 0)) + return XEXP (XEXP (y, 0), 0); + } + + /* Likewise if the operands are in the other order. */ + if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF) + { + rtx y + = GET_CODE (folded_arg1) == MINUS ? folded_arg1 + : lookup_as_function (folded_arg1, MINUS); + + if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF + && XEXP (XEXP (y, 1), 0) == XEXP (const_arg0, 0)) + return XEXP (y, 0); + + /* Now try for a CONST of a MINUS like the above. */ + if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1 + : lookup_as_function (folded_arg1, CONST))) != 0 + && GET_CODE (XEXP (y, 0)) == MINUS + && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF + && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg0, 0)) + return XEXP (XEXP (y, 0), 0); } /* If second operand is a register equivalent to a negative @@ -5759,6 +5806,13 @@ record_jump_cond (code, mode, op0, op1, reversed_nonequality) op0_elt = lookup (op0, op0_hash, mode); op1_elt = lookup (op1, op1_hash, mode); + /* If both operands are already equivalent or if they are not in the + table but are identical, do nothing. */ + if ((op0_elt != 0 && op1_elt != 0 + && op0_elt->first_same_value == op1_elt->first_same_value) + || op0 == op1 || rtx_equal_p (op0, op1)) + return; + /* If we aren't setting two things equal all we can do is save this comparison. Similarly if this is floating-point. In the latter case, OP1 might be zero and both -0.0 and 0.0 are equal to it. @@ -5945,7 +5999,7 @@ cse_insn (insn, in_libcall_block) { for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1)) if (GET_CODE (XEXP (tem, 0)) == CLOBBER) - invalidate (SET_DEST (XEXP (tem, 0))); + invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode); } if (GET_CODE (x) == SET) @@ -5976,7 +6030,7 @@ cse_insn (insn, in_libcall_block) canon_reg (SET_SRC (x), insn); apply_change_group (); fold_rtx (SET_SRC (x), insn); - invalidate (SET_DEST (x)); + invalidate (SET_DEST (x), VOIDmode); } else n_sets = 1; @@ -6007,10 +6061,10 @@ cse_insn (insn, in_libcall_block) if (GET_CODE (clobbered) == REG || GET_CODE (clobbered) == SUBREG) - invalidate (clobbered); + invalidate (clobbered, VOIDmode); else if (GET_CODE (clobbered) == STRICT_LOW_PART || GET_CODE (clobbered) == ZERO_EXTRACT) - invalidate (XEXP (clobbered, 0)); + invalidate (XEXP (clobbered, 0), GET_MODE (clobbered)); } } @@ -6026,7 +6080,7 @@ cse_insn (insn, in_libcall_block) canon_reg (SET_SRC (y), insn); apply_change_group (); fold_rtx (SET_SRC (y), insn); - invalidate (SET_DEST (y)); + invalidate (SET_DEST (y), VOIDmode); } else if (SET_DEST (y) == pc_rtx && GET_CODE (SET_SRC (y)) == LABEL_REF) @@ -6663,7 +6717,11 @@ cse_insn (insn, in_libcall_block) else if (constant_pool_entries_cost && CONSTANT_P (trial) - && (src_folded == 0 || GET_CODE (src_folded) != MEM) + && ! (GET_CODE (trial) == CONST + && GET_CODE (XEXP (trial, 0)) == TRUNCATE) + && (src_folded == 0 + || (GET_CODE (src_folded) != MEM + && ! src_folded_force_flag)) && GET_MODE_CLASS (mode) != MODE_CC) { src_folded_force_flag = 1; @@ -6916,10 +6974,10 @@ cse_insn (insn, in_libcall_block) { if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG || GET_CODE (dest) == MEM) - invalidate (dest); + invalidate (dest, VOIDmode); else if (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == ZERO_EXTRACT) - invalidate (XEXP (dest, 0)); + invalidate (XEXP (dest, 0), GET_MODE (dest)); sets[i].rtl = 0; } @@ -6965,7 +7023,10 @@ cse_insn (insn, in_libcall_block) classp = 0; } if (insert_regs (src_eqv, classp, 0)) - src_eqv_hash = HASH (src_eqv, eqvmode); + { + rehash_using_reg (src_eqv); + src_eqv_hash = HASH (src_eqv, eqvmode); + } elt = insert (src_eqv, classp, src_eqv_hash, eqvmode); elt->in_memory = src_eqv_in_memory; elt->in_struct = src_eqv_in_struct; @@ -7012,7 +7073,10 @@ cse_insn (insn, in_libcall_block) any of the src_elt's, because they would have failed to match if not still valid. */ if (insert_regs (src, classp, 0)) - sets[i].src_hash = HASH (src, mode); + { + rehash_using_reg (src); + sets[i].src_hash = HASH (src, mode); + } elt = insert (src, classp, sets[i].src_hash, mode); elt->in_memory = sets[i].src_in_memory; elt->in_struct = sets[i].src_in_struct; @@ -7054,18 +7118,21 @@ cse_insn (insn, in_libcall_block) for (i = 0; i < n_sets; i++) if (sets[i].rtl) { - register rtx dest = sets[i].inner_dest; + /* We can't use the inner dest, because the mode associated with + a ZERO_EXTRACT is significant. */ + register rtx dest = SET_DEST (sets[i].rtl); /* Needed for registers to remove the register from its previous quantity's chain. Needed for memory if this is a nonvarying address, unless we have just done an invalidate_memory that covers even those. */ if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG - || (! writes_memory.all && ! cse_rtx_addr_varies_p (dest))) - invalidate (dest); + || (GET_CODE (dest) == MEM && ! writes_memory.all + && ! cse_rtx_addr_varies_p (dest))) + invalidate (dest, VOIDmode); else if (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == ZERO_EXTRACT) - invalidate (XEXP (dest, 0)); + invalidate (XEXP (dest, 0), GET_MODE (dest)); } /* Make sure registers mentioned in destinations @@ -7122,7 +7189,17 @@ cse_insn (insn, in_libcall_block) || in_libcall_block /* If we didn't put a REG_EQUAL value or a source into the hash table, there is no point is recording DEST. */ - || sets[i].src_elt == 0) + || sets[i].src_elt == 0 + /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND + or SIGN_EXTEND, don't record DEST since it can cause + some tracking to be wrong. + + ??? Think about this more later. */ + || (GET_CODE (dest) == SUBREG + && (GET_MODE_SIZE (GET_MODE (dest)) + > GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))) + && (GET_CODE (sets[i].src) == SIGN_EXTEND + || GET_CODE (sets[i].src) == ZERO_EXTEND))) continue; /* STRICT_LOW_PART isn't part of the value BEING set, @@ -7134,9 +7211,12 @@ cse_insn (insn, in_libcall_block) if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG) /* Registers must also be inserted into chains for quantities. */ if (insert_regs (dest, sets[i].src_elt, 1)) - /* If `insert_regs' changes something, the hash code must be - recalculated. */ - sets[i].dest_hash = HASH (dest, GET_MODE (dest)); + { + /* If `insert_regs' changes something, the hash code must be + recalculated. */ + rehash_using_reg (dest); + sets[i].dest_hash = HASH (dest, GET_MODE (dest)); + } elt = insert (dest, sets[i].src_elt, sets[i].dest_hash, GET_MODE (dest)); @@ -7200,7 +7280,10 @@ cse_insn (insn, in_libcall_block) if (src_elt == 0) { if (insert_regs (new_src, classp, 0)) - src_hash = HASH (new_src, new_mode); + { + rehash_using_reg (new_src); + src_hash = HASH (new_src, new_mode); + } src_elt = insert (new_src, classp, src_hash, new_mode); src_elt->in_memory = elt->in_memory; src_elt->in_struct = elt->in_struct; @@ -7377,7 +7460,7 @@ invalidate_from_clobbers (w, x) /* This should be *very* rare. */ if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM)) - invalidate (stack_pointer_rtx); + invalidate (stack_pointer_rtx, VOIDmode); } if (GET_CODE (x) == CLOBBER) @@ -7387,10 +7470,10 @@ invalidate_from_clobbers (w, x) { if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG || (GET_CODE (ref) == MEM && ! w->all)) - invalidate (ref); + invalidate (ref, VOIDmode); else if (GET_CODE (ref) == STRICT_LOW_PART || GET_CODE (ref) == ZERO_EXTRACT) - invalidate (XEXP (ref, 0)); + invalidate (XEXP (ref, 0), GET_MODE (ref)); } } else if (GET_CODE (x) == PARALLEL) @@ -7406,10 +7489,10 @@ invalidate_from_clobbers (w, x) { if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG || (GET_CODE (ref) == MEM && !w->all)) - invalidate (ref); + invalidate (ref, VOIDmode); else if (GET_CODE (ref) == STRICT_LOW_PART || GET_CODE (ref) == ZERO_EXTRACT) - invalidate (XEXP (ref, 0)); + invalidate (XEXP (ref, 0), GET_MODE (ref)); } } } @@ -7537,11 +7620,12 @@ cse_around_loop (loop_start) for (p = last_jump_equiv_class->first_same_value; p; p = p->next_same_value) if (GET_CODE (p->exp) == MEM || GET_CODE (p->exp) == REG - || GET_CODE (p->exp) == SUBREG) - invalidate (p->exp); + || (GET_CODE (p->exp) == SUBREG + && GET_CODE (SUBREG_REG (p->exp)) == REG)) + invalidate (p->exp, VOIDmode); else if (GET_CODE (p->exp) == STRICT_LOW_PART || GET_CODE (p->exp) == ZERO_EXTRACT) - invalidate (XEXP (p->exp, 0)); + invalidate (XEXP (p->exp, 0), GET_MODE (p->exp)); /* Process insns starting after LOOP_START until we hit a CALL_INSN or a CODE_LABEL (we could handle a CALL_INSN, but it isn't worth it). @@ -7600,10 +7684,10 @@ invalidate_skipped_set (dest, set) if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG || (! skipped_writes_memory.all && ! cse_rtx_addr_varies_p (dest))) - invalidate (dest); + invalidate (dest, VOIDmode); else if (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == ZERO_EXTRACT) - invalidate (XEXP (dest, 0)); + invalidate (XEXP (dest, 0), GET_MODE (dest)); } /* Invalidate all insns from START up to the end of the function or the @@ -7755,10 +7839,10 @@ cse_set_around_loop (x, insn, loop_start) if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG || (GET_CODE (SET_DEST (x)) == MEM && ! writes_memory.all && ! cse_rtx_addr_varies_p (SET_DEST (x)))) - invalidate (SET_DEST (x)); + invalidate (SET_DEST (x), VOIDmode); else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT) - invalidate (XEXP (SET_DEST (x), 0)); + invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x))); } /* Find the end of INSN's basic block and return its range, diff --git a/gnu/usr.bin/cc/cc_int/dbxout.c b/gnu/usr.bin/cc/cc_int/dbxout.c index d34497d..f09d52c 100644 --- a/gnu/usr.bin/cc/cc_int/dbxout.c +++ b/gnu/usr.bin/cc/cc_int/dbxout.c @@ -1843,7 +1843,13 @@ dbxout_symbol_location (decl, type, suffix, home) letter = decl_function_context (decl) ? 'V' : 'S'; - if (!DECL_INITIAL (decl)) + /* This should be the same condition as in assemble_variable, but + we don't have access to dont_output_data here. So, instead, + we rely on the fact that error_mark_node initializers always + end up in bss for C++ and never end up in bss for C. */ + if (DECL_INITIAL (decl) == 0 + || (!strcmp (lang_identify (), "cplusplus") + && DECL_INITIAL (decl) == error_mark_node)) current_sym_code = N_LCSYM; else if (DECL_IN_TEXT_SECTION (decl)) /* This is not quite right, but it's the closest diff --git a/gnu/usr.bin/cc/cc_int/dwarfout.c b/gnu/usr.bin/cc/cc_int/dwarfout.c index a48c9b97..ccf436b 100644 --- a/gnu/usr.bin/cc/cc_int/dwarfout.c +++ b/gnu/usr.bin/cc/cc_int/dwarfout.c @@ -4435,118 +4435,91 @@ output_decl (decl, containing_scope) output_formal_types (TREE_TYPE (decl)); else { + /* Generate DIEs to represent all known formal parameters */ + register tree arg_decls = DECL_ARGUMENTS (decl); + register tree parm; + + /* WARNING! Kludge zone ahead! Here we have a special + hack for svr4 SDB compatibility. Instead of passing the + current FUNCTION_DECL node as the second parameter (i.e. + the `containing_scope' parameter) to `output_decl' (as + we ought to) we instead pass a pointer to our own private + fake_containing_scope node. That node is a RECORD_TYPE + node which NO OTHER TYPE may ever actually be a member of. + + This pointer will ultimately get passed into `output_type' + as its `containing_scope' parameter. `Output_type' will + then perform its part in the hack... i.e. it will pend + the type of the formal parameter onto the pending_types + list. Later on, when we are done generating the whole + sequence of formal parameter DIEs for this function + definition, we will un-pend all previously pended types + of formal parameters for this function definition. + + This whole kludge prevents any type DIEs from being + mixed in with the formal parameter DIEs. That's good + because svr4 SDB believes that the list of formal + parameter DIEs for a function ends wherever the first + non-formal-parameter DIE appears. Thus, we have to + keep the formal parameter DIEs segregated. They must + all appear (consecutively) at the start of the list of + children for the DIE representing the function definition. + Then (and only then) may we output any additional DIEs + needed to represent the types of these formal parameters. + */ - { - register tree last_arg; + /* + When generating DIEs, generate the unspecified_parameters + DIE instead if we come across the arg "__builtin_va_alist" + */ - last_arg = (arg_decls && TREE_CODE (arg_decls) != ERROR_MARK) - ? tree_last (arg_decls) - : NULL; + for (parm = arg_decls; parm; parm = TREE_CHAIN (parm)) + if (TREE_CODE (parm) == PARM_DECL) + { + if (DECL_NAME(parm) && + !strcmp(IDENTIFIER_POINTER(DECL_NAME(parm)), + "__builtin_va_alist") ) + output_die (output_unspecified_parameters_die, decl); + else + output_decl (parm, fake_containing_scope); + } - /* Generate DIEs to represent all known formal parameters, but - don't do it if this looks like a varargs function. A given - function is considered to be a varargs function if (and only - if) its last named argument is named `__builtin_va_alist'. */ + /* + Now that we have finished generating all of the DIEs to + represent the formal parameters themselves, force out + any DIEs needed to represent their types. We do this + simply by un-pending all previously pended types which + can legitimately go into the chain of children DIEs for + the current FUNCTION_DECL. + */ - if (! last_arg - || ! DECL_NAME (last_arg) - || strcmp (IDENTIFIER_POINTER (DECL_NAME (last_arg)), - "__builtin_va_alist")) - { - register tree parm; - - /* WARNING! Kludge zone ahead! Here we have a special - hack for svr4 SDB compatibility. Instead of passing the - current FUNCTION_DECL node as the second parameter (i.e. - the `containing_scope' parameter) to `output_decl' (as - we ought to) we instead pass a pointer to our own private - fake_containing_scope node. That node is a RECORD_TYPE - node which NO OTHER TYPE may ever actually be a member of. - - This pointer will ultimately get passed into `output_type' - as its `containing_scope' parameter. `Output_type' will - then perform its part in the hack... i.e. it will pend - the type of the formal parameter onto the pending_types - list. Later on, when we are done generating the whole - sequence of formal parameter DIEs for this function - definition, we will un-pend all previously pended types - of formal parameters for this function definition. - - This whole kludge prevents any type DIEs from being - mixed in with the formal parameter DIEs. That's good - because svr4 SDB believes that the list of formal - parameter DIEs for a function ends wherever the first - non-formal-parameter DIE appears. Thus, we have to - keep the formal parameter DIEs segregated. They must - all appear (consecutively) at the start of the list of - children for the DIE representing the function definition. - Then (and only then) may we output any additional DIEs - needed to represent the types of these formal parameters. - */ - - for (parm = arg_decls; parm; parm = TREE_CHAIN (parm)) - if (TREE_CODE (parm) == PARM_DECL) - output_decl (parm, fake_containing_scope); - - /* Now that we have finished generating all of the DIEs to - represent the formal parameters themselves, force out - any DIEs needed to represent their types. We do this - simply by un-pending all previously pended types which - can legitimately go into the chain of children DIEs for - the current FUNCTION_DECL. */ - - output_pending_types_for_scope (decl); - } - } + output_pending_types_for_scope (decl); - /* Now try to decide if we should put an ellipsis at the end. */ + /* + Decide whether we need a unspecified_parameters DIE at the end. + There are 2 more cases to do this for: + 1) the ansi ... declaration - this is detectable when the end + of the arg list is not a void_type_node + 2) an unprototyped function declaration (not a definition). This + just means that we have no info about the parameters at all. + */ { - register int has_ellipsis = TRUE; /* default assumption */ register tree fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl)); if (fn_arg_types) { - /* This function declaration/definition was prototyped. */ - - /* If the list of formal argument types ends with a - void_type_node, then the formals list did *not* end - with an ellipsis. */ - - if (TREE_VALUE (tree_last (fn_arg_types)) == void_type_node) - has_ellipsis = FALSE; - } - else - { - /* This function declaration/definition was not prototyped. */ - - /* Note that all non-prototyped function *declarations* are - assumed to represent varargs functions (until proven - otherwise). */ - - if (DECL_INITIAL (decl)) /* if this is a func definition */ - { - if (!arg_decls) - has_ellipsis = FALSE; /* no args == (void) */ - else - { - /* For a non-prototyped function definition which - declares one or more formal parameters, if the name - of the first formal parameter is *not* - __builtin_va_alist then we must assume that this - is *not* a varargs function. */ - - if (DECL_NAME (arg_decls) - && strcmp (IDENTIFIER_POINTER (DECL_NAME (arg_decls)), - "__builtin_va_alist")) - has_ellipsis = FALSE; - } - } - } - - if (has_ellipsis) - output_die (output_unspecified_parameters_die, decl); + /* this is the prototyped case, check for ... */ + if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node) + output_die (output_unspecified_parameters_die, decl); + } + else + { + /* this is unprotoyped, check for undefined (just declaration) */ + if (!DECL_INITIAL (decl)) + output_die (output_unspecified_parameters_die, decl); + } } } diff --git a/gnu/usr.bin/cc/cc_int/emit-rtl.c b/gnu/usr.bin/cc/cc_int/emit-rtl.c index 3afcccb..615aeb1 100644 --- a/gnu/usr.bin/cc/cc_int/emit-rtl.c +++ b/gnu/usr.bin/cc/cc_int/emit-rtl.c @@ -1176,7 +1176,7 @@ operand_subword (op, i, validate_address, mode) if (GET_MODE_CLASS (mode) != MODE_INT || (GET_CODE (op) != CONST_INT && GET_CODE (op) != CONST_DOUBLE) - || BITS_PER_WORD > HOST_BITS_PER_INT) + || BITS_PER_WORD > HOST_BITS_PER_WIDE_INT) return 0; if (WORDS_BIG_ENDIAN) @@ -2130,9 +2130,10 @@ add_insn (insn) last_insn = insn; } -/* Add INSN into the doubly-linked list after insn AFTER. This should be the - only function called to insert an insn once delay slots have been filled - since only it knows how to update a SEQUENCE. */ +/* Add INSN into the doubly-linked list after insn AFTER. This and + the next should be the only functions called to insert an insn once + delay slots have been filled since only they know how to update a + SEQUENCE. */ void add_insn_after (insn, after) @@ -2140,6 +2141,9 @@ add_insn_after (insn, after) { rtx next = NEXT_INSN (after); + if (optimize && INSN_DELETED_P (after)) + abort (); + NEXT_INSN (insn) = next; PREV_INSN (insn) = after; @@ -2157,7 +2161,13 @@ add_insn_after (insn, after) /* Scan all pending sequences too. */ for (; stack; stack = stack->next) if (after == stack->last) - stack->last = insn; + { + stack->last = insn; + break; + } + + if (stack == 0) + abort (); } NEXT_INSN (after) = insn; @@ -2168,6 +2178,54 @@ add_insn_after (insn, after) } } +/* Add INSN into the doubly-linked list before insn BEFORE. This and + the previous should be the only functions called to insert an insn once + delay slots have been filled since only they know how to update a + SEQUENCE. */ + +void +add_insn_before (insn, before) + rtx insn, before; +{ + rtx prev = PREV_INSN (before); + + if (optimize && INSN_DELETED_P (before)) + abort (); + + PREV_INSN (insn) = prev; + NEXT_INSN (insn) = before; + + if (prev) + { + NEXT_INSN (prev) = insn; + if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE) + { + rtx sequence = PATTERN (prev); + NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn; + } + } + else if (first_insn == before) + first_insn = insn; + else + { + struct sequence_stack *stack = sequence_stack; + /* Scan all pending sequences too. */ + for (; stack; stack = stack->next) + if (before == stack->first) + { + stack->first = insn; + break; + } + + if (stack == 0) + abort (); + } + + PREV_INSN (before) = insn; + if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE) + PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn; +} + /* Delete all insns made since FROM. FROM becomes the new last instruction. */ @@ -2279,7 +2337,7 @@ emit_insn_before (pattern, before) for (i = 0; i < XVECLEN (pattern, 0); i++) { insn = XVECEXP (pattern, 0, i); - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); } if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE) sequence_result[XVECLEN (pattern, 0)] = pattern; @@ -2287,7 +2345,7 @@ emit_insn_before (pattern, before) else { insn = make_insn_raw (pattern); - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); } return insn; @@ -2307,7 +2365,7 @@ emit_jump_insn_before (pattern, before) else { insn = make_jump_insn_raw (pattern); - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); } return insn; @@ -2327,7 +2385,7 @@ emit_call_insn_before (pattern, before) else { insn = make_call_insn_raw (pattern); - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); PUT_CODE (insn, CALL_INSN); } @@ -2345,7 +2403,7 @@ emit_barrier_before (before) INSN_UID (insn) = cur_insn_uid++; - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); return insn; } @@ -2361,7 +2419,7 @@ emit_note_before (subtype, before) NOTE_SOURCE_FILE (note) = 0; NOTE_LINE_NUMBER (note) = subtype; - add_insn_after (note, PREV_INSN (before)); + add_insn_before (note, before); return note; } @@ -2577,7 +2635,7 @@ emit_insns_before (insn, before) while (insn) { rtx next = NEXT_INSN (insn); - add_insn_after (insn, PREV_INSN (before)); + add_insn_before (insn, before); last = insn; insn = next; } diff --git a/gnu/usr.bin/cc/cc_int/expmed.c b/gnu/usr.bin/cc/cc_int/expmed.c index f3beae0..b5c19aa 100644 --- a/gnu/usr.bin/cc/cc_int/expmed.c +++ b/gnu/usr.bin/cc/cc_int/expmed.c @@ -299,7 +299,10 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) /* Here we transfer the words of the field in the order least significant first. This is because the most significant word is the one which may - be less than full. */ + be less than full. + However, only do that if the value is not BLKmode. */ + + int backwards = WORDS_BIG_ENDIAN && fieldmode != BLKmode; int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD; int i; @@ -315,8 +318,8 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) { /* If I is 0, use the low-order word in both field and target; if I is 1, use the next to lowest word; and so on. */ - int wordnum = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i); - int bit_offset = (WORDS_BIG_ENDIAN + int wordnum = (backwards ? nwords - i - 1 : i); + int bit_offset = (backwards ? MAX (bitsize - (i + 1) * BITS_PER_WORD, 0) : i * BITS_PER_WORD); store_bit_field (op0, MIN (BITS_PER_WORD, @@ -369,7 +372,10 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) && !(bitsize == 1 && GET_CODE (value) == CONST_INT) /* Ensure insv's size is wide enough for this field. */ && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_insv][3]) - >= bitsize)) + >= bitsize) + && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) + && (bitsize + bitpos + > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_insv][3])))) { int xbitpos = bitpos; rtx value1; @@ -741,19 +747,13 @@ store_split_bit_field (op0, bitsize, bitpos, value, align) >> (bitsize - bitsdone - thissize)) & (((HOST_WIDE_INT) 1 << thissize) - 1)); else - { - /* The args are chosen so that the last part - includes the lsb. */ - int bit_offset = 0; - /* If the value isn't in memory, then it must be right aligned - if a register, so skip past the padding on the left. If it - is in memory, then there is no padding on the left. */ - if (GET_CODE (value) != MEM) - bit_offset = BITS_PER_WORD - bitsize; - part = extract_fixed_bit_field (word_mode, value, 0, thissize, - bit_offset + bitsdone, - NULL_RTX, 1, align); - } + /* The args are chosen so that the last part includes the lsb. + Give extract_bit_field the value it needs (with endianness + compensation) to fetch the piece we want. */ + part = extract_fixed_bit_field (word_mode, value, 0, thissize, + GET_MODE_BITSIZE (GET_MODE (value)) + - bitsize + bitsdone, + NULL_RTX, 1, align); #else /* Fetch successively more significant portions. */ if (GET_CODE (value) == CONST_INT) @@ -972,7 +972,10 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, #ifdef HAVE_extzv if (HAVE_extzv && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extzv][0]) - >= bitsize)) + >= bitsize) + && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) + && (bitsize + bitpos + > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extzv][0])))) { int xbitpos = bitpos, xoffset = offset; rtx bitsize_rtx, bitpos_rtx; @@ -1111,7 +1114,10 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, #ifdef HAVE_extv if (HAVE_extv && (GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extv][0]) - >= bitsize)) + >= bitsize) + && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) + && (bitsize + bitpos + > GET_MODE_BITSIZE (insn_operand_mode[(int) CODE_FOR_extv][0])))) { int xbitpos = bitpos, xoffset = offset; rtx bitsize_rtx, bitpos_rtx; @@ -2053,23 +2059,31 @@ expand_mult (mode, op0, op1, target, unsignedp) { rtx const_op1 = op1; + /* synth_mult does an `unsigned int' multiply. As long as the mode is + less than or equal in size to `unsigned int' this doesn't matter. + If the mode is larger than `unsigned int', then synth_mult works only + if the constant value exactly fits in an `unsigned int' without any + truncation. This means that multiplying by negative values does + not work; results are off by 2^32 on a 32 bit machine. */ + /* If we are multiplying in DImode, it may still be a win to try to work with shifts and adds. */ if (GET_CODE (op1) == CONST_DOUBLE && GET_MODE_CLASS (GET_MODE (op1)) == MODE_INT - && HOST_BITS_PER_INT <= BITS_PER_WORD) - { - if ((CONST_DOUBLE_HIGH (op1) == 0 && CONST_DOUBLE_LOW (op1) >= 0) - || (CONST_DOUBLE_HIGH (op1) == -1 && CONST_DOUBLE_LOW (op1) < 0)) - const_op1 = GEN_INT (CONST_DOUBLE_LOW (op1)); - } + && HOST_BITS_PER_INT >= BITS_PER_WORD + && CONST_DOUBLE_HIGH (op1) == 0) + const_op1 = GEN_INT (CONST_DOUBLE_LOW (op1)); + else if (HOST_BITS_PER_INT < GET_MODE_BITSIZE (mode) + && GET_CODE (op1) == CONST_INT + && INTVAL (op1) < 0) + const_op1 = 0; /* We used to test optimize here, on the grounds that it's better to produce a smaller program when -O is not used. But this causes such a terrible slowdown sometimes that it seems better to use synth_mult always. */ - if (GET_CODE (const_op1) == CONST_INT) + if (const_op1 && GET_CODE (const_op1) == CONST_INT) { struct algorithm alg; struct algorithm alg2; @@ -2087,13 +2101,20 @@ expand_mult (mode, op0, op1, target, unsignedp) mult_cost = MIN (12 * add_cost, mult_cost); synth_mult (&alg, val, mult_cost); - synth_mult (&alg2, - val, - (alg.cost < mult_cost ? alg.cost : mult_cost) - negate_cost); - if (alg2.cost + negate_cost < alg.cost) - alg = alg2, variant = negate_variant; + + /* This works only if the inverted value actually fits in an + `unsigned int' */ + if (HOST_BITS_PER_INT >= GET_MODE_BITSIZE (mode)) + { + synth_mult (&alg2, - val, + (alg.cost < mult_cost ? alg.cost : mult_cost) - negate_cost); + if (alg2.cost + negate_cost < alg.cost) + alg = alg2, variant = negate_variant; + } /* This proves very useful for division-by-constant. */ - synth_mult (&alg2, val - 1, (alg.cost < mult_cost ? alg.cost : mult_cost) - add_cost); + synth_mult (&alg2, val - 1, + (alg.cost < mult_cost ? alg.cost : mult_cost) - add_cost); if (alg2.cost + add_cost < alg.cost) alg = alg2, variant = add_variant; @@ -2131,7 +2152,9 @@ expand_mult (mode, op0, op1, target, unsignedp) int log = alg.log[opno]; int preserve = preserve_subexpressions_p (); rtx shift_subtarget = preserve ? 0 : accum; - rtx add_target = opno == alg.ops - 1 && target != 0 ? target : 0; + rtx add_target + = (opno == alg.ops - 1 && target != 0 && variant != add_variant + ? target : 0); rtx accum_target = preserve ? 0 : accum; switch (alg.op[opno]) @@ -2568,7 +2591,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) rtx quotient = 0, remainder = 0; rtx last; int size; - rtx insn; + rtx insn, set; optab optab1, optab2; int op1_is_constant, op1_is_pow2; @@ -2813,10 +2836,13 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) } insn = get_last_insn (); - REG_NOTES (insn) - = gen_rtx (EXPR_LIST, REG_EQUAL, - gen_rtx (UDIV, compute_mode, op0, op1), - REG_NOTES (insn)); + if (insn != last + && (set = single_set (insn)) != 0 + && SET_DEST (set) == quotient) + REG_NOTES (insn) + = gen_rtx (EXPR_LIST, REG_EQUAL, + gen_rtx (UDIV, compute_mode, op0, op1), + REG_NOTES (insn)); } else /* TRUNC_DIV, signed */ { @@ -2878,11 +2904,14 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) if (d < 0) { insn = get_last_insn (); - REG_NOTES (insn) - = gen_rtx (EXPR_LIST, REG_EQUAL, - gen_rtx (DIV, compute_mode, op0, - GEN_INT (abs_d)), - REG_NOTES (insn)); + if (insn != last + && (set = single_set (insn)) != 0 + && SET_DEST (set) == quotient) + REG_NOTES (insn) + = gen_rtx (EXPR_LIST, REG_EQUAL, + gen_rtx (DIV, compute_mode, op0, + GEN_INT (abs_d)), + REG_NOTES (insn)); quotient = expand_unop (compute_mode, neg_optab, quotient, quotient, 0); @@ -2935,14 +2964,14 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) } } - if (quotient != 0) - { - insn = get_last_insn (); - REG_NOTES (insn) - = gen_rtx (EXPR_LIST, REG_EQUAL, - gen_rtx (DIV, compute_mode, op0, op1), - REG_NOTES (insn)); - } + insn = get_last_insn (); + if (insn != last + && (set = single_set (insn)) != 0 + && SET_DEST (set) == quotient) + REG_NOTES (insn) + = gen_rtx (EXPR_LIST, REG_EQUAL, + gen_rtx (DIV, compute_mode, op0, op1), + REG_NOTES (insn)); } break; } @@ -3218,6 +3247,44 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) } else /* signed */ { + if (op1_is_constant && EXACT_POWER_OF_2_OR_ZERO_P (INTVAL (op1)) + && INTVAL (op1) >= 0) + { + /* This is extremely similar to the code for the unsigned case + above. For 2.7 we should merge these variants, but for + 2.6.1 I don't want to touch the code for unsigned since that + get used in C. The signed case will only be used by other + languages (Ada). */ + + rtx t1, t2, t3; + unsigned HOST_WIDE_INT d = INTVAL (op1); + t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0, + build_int_2 (floor_log2 (d), 0), + tquotient, 0); + t2 = expand_binop (compute_mode, and_optab, op0, + GEN_INT (d - 1), + NULL_RTX, 1, OPTAB_LIB_WIDEN); + t3 = gen_reg_rtx (compute_mode); + t3 = emit_store_flag (t3, NE, t2, const0_rtx, + compute_mode, 1, 1); + if (t3 == 0) + { + rtx lab; + lab = gen_label_rtx (); + emit_cmp_insn (t2, const0_rtx, EQ, NULL_RTX, + compute_mode, 0, 0); + emit_jump_insn (gen_beq (lab)); + expand_inc (t1, const1_rtx); + emit_label (lab); + quotient = t1; + } + else + quotient = force_operand (gen_rtx (PLUS, compute_mode, + t1, t3), + tquotient); + break; + } + /* Try using an instruction that produces both the quotient and remainder, using truncation. We can easily compensate the quotient or remainder to get ceiling rounding, once we have the diff --git a/gnu/usr.bin/cc/cc_int/expr.c b/gnu/usr.bin/cc/cc_int/expr.c index e764986..de656b6 100644 --- a/gnu/usr.bin/cc/cc_int/expr.c +++ b/gnu/usr.bin/cc/cc_int/expr.c @@ -1025,6 +1025,41 @@ convert_move (to, from, unsignedp) } } + if (to_mode == PDImode) + { + if (from_mode != DImode) + from = convert_to_mode (DImode, from, unsignedp); + +#ifdef HAVE_truncdipdi2 + if (HAVE_truncdipdi2) + { + emit_unop_insn (CODE_FOR_truncdipdi2, to, from, UNKNOWN); + return; + } +#endif /* HAVE_truncdipdi2 */ + abort (); + } + + if (from_mode == PDImode) + { + if (to_mode != DImode) + { + from = convert_to_mode (DImode, from, unsignedp); + from_mode = DImode; + } + else + { +#ifdef HAVE_extendpdidi2 + if (HAVE_extendpdidi2) + { + emit_unop_insn (CODE_FOR_extendpdidi2, to, from, UNKNOWN); + return; + } +#endif /* HAVE_extendpdidi2 */ + abort (); + } + } + /* Now follow all the conversions between integers no more than a word long. */ @@ -1164,6 +1199,58 @@ convert_move (to, from, unsignedp) return; } + if (from_mode == TImode && to_mode == DImode) + { +#ifdef HAVE_trunctidi2 + if (HAVE_trunctidi2) + { + emit_unop_insn (CODE_FOR_trunctidi2, to, from, UNKNOWN); + return; + } +#endif + convert_move (to, force_reg (from_mode, from), unsignedp); + return; + } + + if (from_mode == TImode && to_mode == SImode) + { +#ifdef HAVE_trunctisi2 + if (HAVE_trunctisi2) + { + emit_unop_insn (CODE_FOR_trunctisi2, to, from, UNKNOWN); + return; + } +#endif + convert_move (to, force_reg (from_mode, from), unsignedp); + return; + } + + if (from_mode == TImode && to_mode == HImode) + { +#ifdef HAVE_trunctihi2 + if (HAVE_trunctihi2) + { + emit_unop_insn (CODE_FOR_trunctihi2, to, from, UNKNOWN); + return; + } +#endif + convert_move (to, force_reg (from_mode, from), unsignedp); + return; + } + + if (from_mode == TImode && to_mode == QImode) + { +#ifdef HAVE_trunctiqi2 + if (HAVE_trunctiqi2) + { + emit_unop_insn (CODE_FOR_trunctiqi2, to, from, UNKNOWN); + return; + } +#endif + convert_move (to, force_reg (from_mode, from), unsignedp); + return; + } + /* Handle truncation of volatile memrefs, and so on; the things that couldn't be truncated directly, and for which there was no special instruction. */ @@ -1603,6 +1690,9 @@ move_block_to_reg (regno, x, nregs, mode) int i; rtx pat, last; + if (nregs == 0) + return; + if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x)) x = validize_mem (force_const_mem (mode, x)); @@ -1823,8 +1913,6 @@ emit_move_insn_1 (x, y) int stack = push_operand (x, GET_MODE (x)); rtx insns; - start_sequence (); - /* If this is a stack, push the highpart first, so it will be in the argument order. @@ -1858,17 +1946,6 @@ emit_move_insn_1 (x, y) (gen_imagpart (submode, x), gen_imagpart (submode, y))); } - insns = get_insns (); - end_sequence (); - - /* If X is a CONCAT, we got insns like RD = RS, ID = IS, - each with a separate pseudo as destination. - It's not correct for flow to treat them as a unit. */ - if (GET_CODE (x) != CONCAT) - emit_no_conflict_block (insns, x, y, NULL_RTX, NULL_RTX); - else - emit_insns (insns); - return get_last_insn (); } @@ -1880,8 +1957,6 @@ emit_move_insn_1 (x, y) rtx last_insn = 0; rtx insns; - start_sequence (); - for (i = 0; i < (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD; i++) @@ -1906,10 +1981,6 @@ emit_move_insn_1 (x, y) last_insn = emit_move_insn (xpart, ypart); } - insns = get_insns (); - end_sequence (); - emit_no_conflict_block (insns, x, y, NULL_RTX, NULL_RTX); - return last_insn; } else @@ -2724,6 +2795,7 @@ store_expr (exp, target, want_value) The string constant may be shorter than the array. So copy just the string's actual length, and clear the rest. */ rtx size; + rtx addr; /* Get the size of the data type of the string, which is actually the size of the target. */ @@ -2752,17 +2824,16 @@ store_expr (exp, target, want_value) that we have to clear. */ if (GET_CODE (copy_size_rtx) == CONST_INT) { - temp = plus_constant (XEXP (target, 0), + addr = plus_constant (XEXP (target, 0), TREE_STRING_LENGTH (exp)); - size = plus_constant (size, - - TREE_STRING_LENGTH (exp)); + size = plus_constant (size, - TREE_STRING_LENGTH (exp)); } else { enum machine_mode size_mode = Pmode; - temp = force_reg (Pmode, XEXP (target, 0)); - temp = expand_binop (size_mode, add_optab, temp, + addr = force_reg (Pmode, XEXP (target, 0)); + addr = expand_binop (size_mode, add_optab, addr, copy_size_rtx, NULL_RTX, 0, OPTAB_LIB_WIDEN); @@ -2779,13 +2850,14 @@ store_expr (exp, target, want_value) if (size != const0_rtx) { #ifdef TARGET_MEM_FUNCTIONS - emit_library_call (memset_libfunc, 0, VOIDmode, 3, - temp, Pmode, const0_rtx, Pmode, size, Pmode); + emit_library_call (memset_libfunc, 0, VOIDmode, 3, addr, + Pmode, const0_rtx, Pmode, size, Pmode); #else emit_library_call (bzero_libfunc, 0, VOIDmode, 2, - temp, Pmode, size, Pmode); + addr, Pmode, size, Pmode); #endif } + if (label) emit_label (label); } @@ -3507,7 +3579,13 @@ safe_from_p (x, exp) rtx exp_rtl = 0; int i, nops; - if (x == 0) + if (x == 0 + /* If EXP has varying size, we MUST use a target since we currently + have no way of allocating temporaries of variable size. So we + assume here that something at a higher level has prevented a + clash. This is somewhat bogus, but the best we can do. */ + || (TREE_TYPE (exp) != 0 && TYPE_SIZE (TREE_TYPE (exp)) != 0 + && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST)) return 1; /* If this is a subreg of a hard register, declare it unsafe, otherwise, @@ -4340,13 +4418,16 @@ expand_expr (exp, target, tmode, modifier) } /* Fold an expression like: "foo"[2]. - This is not done in fold so it won't happen inside &. */ + This is not done in fold so it won't happen inside &. + Don't fold if this is for wide characters since it's too + difficult to do correctly and this is a very rare case. */ if (TREE_CODE (array) == STRING_CST && TREE_CODE (index) == INTEGER_CST && !TREE_INT_CST_HIGH (index) && (i = TREE_INT_CST_LOW (index)) < TREE_STRING_LENGTH (array) - && GET_MODE_CLASS (mode) == MODE_INT) + && GET_MODE_CLASS (mode) == MODE_INT + && GET_MODE_SIZE (mode) == 1) return GEN_INT (TREE_STRING_POINTER (array)[i]); /* If this is a constant index into a constant array, @@ -4404,9 +4485,12 @@ expand_expr (exp, target, tmode, modifier) case COMPONENT_REF: case BIT_FIELD_REF: /* If the operand is a CONSTRUCTOR, we can just extract the - appropriate field if it is present. */ + appropriate field if it is present. Don't do this if we have + already written the data since we want to refer to that copy + and varasm.c assumes that's what we'll do. */ if (code != ARRAY_REF - && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR) + && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR + && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0) { tree elt; @@ -5450,7 +5534,9 @@ expand_expr (exp, target, tmode, modifier) temp = 0; else if (original_target && safe_from_p (original_target, TREE_OPERAND (exp, 0)) - && GET_MODE (original_target) == mode) + && GET_MODE (original_target) == mode + && ! (GET_CODE (original_target) == MEM + && MEM_VOLATILE_P (original_target))) temp = original_target; else if (mode == BLKmode) { @@ -5498,8 +5584,7 @@ expand_expr (exp, target, tmode, modifier) && (TREE_CODE (binary_op) == PLUS_EXPR || TREE_CODE (binary_op) == MINUS_EXPR || TREE_CODE (binary_op) == BIT_IOR_EXPR - || TREE_CODE (binary_op) == BIT_XOR_EXPR - || TREE_CODE (binary_op) == BIT_AND_EXPR) + || TREE_CODE (binary_op) == BIT_XOR_EXPR) && integer_onep (TREE_OPERAND (binary_op, 1)) && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == '<') { @@ -5507,8 +5592,7 @@ expand_expr (exp, target, tmode, modifier) optab boptab = (TREE_CODE (binary_op) == PLUS_EXPR ? add_optab : TREE_CODE (binary_op) == MINUS_EXPR ? sub_optab : TREE_CODE (binary_op) == BIT_IOR_EXPR ? ior_optab - : TREE_CODE (binary_op) == BIT_XOR_EXPR ? xor_optab - : and_optab); + : xor_optab); /* If we had X ? A : A + 1, do this as A + (X == 0). @@ -5732,7 +5816,8 @@ expand_expr (exp, target, tmode, modifier) left_cleanups = integer_zero_node; if (! right_cleanups) right_cleanups = integer_zero_node; - new_cleanups = build (COND_EXPR, void_type_node, cond, + new_cleanups = build (COND_EXPR, void_type_node, + truthvalue_conversion (cond), left_cleanups, right_cleanups); new_cleanups = fold (new_cleanups); @@ -5969,7 +6054,10 @@ expand_expr (exp, target, tmode, modifier) op0 = force_const_mem (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))), op0); else if (GET_CODE (op0) == MEM) - temp = XEXP (op0, 0); + { + mark_temp_addr_taken (op0); + temp = XEXP (op0, 0); + } else if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG || GET_CODE (op0) == CONCAT) @@ -5982,6 +6070,7 @@ expand_expr (exp, target, tmode, modifier) = assign_stack_temp (inner_mode, int_size_in_bytes (inner_type), 1); + mark_temp_addr_taken (memloc); emit_move_insn (memloc, op0); op0 = memloc; } @@ -6055,6 +6144,7 @@ expand_expr (exp, target, tmode, modifier) case CONJ_EXPR: { + enum machine_mode partmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp))); rtx imag_t; rtx insns; @@ -6066,11 +6156,12 @@ expand_expr (exp, target, tmode, modifier) start_sequence (); /* Store the realpart and the negated imagpart to target. */ - emit_move_insn (gen_realpart (mode, target), gen_realpart (mode, op0)); + emit_move_insn (gen_realpart (partmode, target), + gen_realpart (partmode, op0)); - imag_t = gen_imagpart (mode, target); - temp = expand_unop (mode, neg_optab, - gen_imagpart (mode, op0), imag_t, 0); + imag_t = gen_imagpart (partmode, target); + temp = expand_unop (partmode, neg_optab, + gen_imagpart (partmode, op0), imag_t, 0); if (temp != imag_t) emit_move_insn (imag_t, temp); @@ -6836,6 +6927,9 @@ expand_builtin (exp, target, subtarget, mode, ignore) case BUILT_IN_SIN: case BUILT_IN_COS: + /* Treat these like sqrt, but only if the user asks for them. */ + if (! flag_fast_math) + break; case BUILT_IN_FSQRT: /* If not optimizing, call the library function. */ if (! optimize) @@ -7792,7 +7886,7 @@ result_vector (savep, result) align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT; if (size % align != 0) size = CEIL (size, align) * align; - reg = gen_rtx (REG, mode, savep ? INCOMING_REGNO (regno) : regno); + reg = gen_rtx (REG, mode, savep ? regno : INCOMING_REGNO (regno)); mem = change_address (result, mode, plus_constant (XEXP (result, 0), size)); savevec[nelts++] = (savep @@ -8284,7 +8378,9 @@ preexpand_calls (exp) /* Do nothing to built-in functions. */ if (TREE_CODE (TREE_OPERAND (exp, 0)) != ADDR_EXPR || TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) != FUNCTION_DECL - || ! DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) + || ! DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) + /* Do nothing if the call returns a variable-sized object. */ + || TREE_CODE (TYPE_SIZE (TREE_TYPE(exp))) != INTEGER_CST) CALL_EXPR_RTL (exp) = expand_call (exp, NULL_RTX, 0); return; @@ -8371,6 +8467,7 @@ defer_cleanups_to (old_cleanups) while (cleanups_this_call != old_cleanups) { (*interim_eh_hook) (TREE_VALUE (cleanups_this_call)); + last = cleanups_this_call; cleanups_this_call = TREE_CHAIN (cleanups_this_call); } @@ -8555,17 +8652,117 @@ do_jump (exp, if_false_label, if_true_label) break; case TRUTH_ANDIF_EXPR: - if (if_false_label == 0) - if_false_label = drop_through_label = gen_label_rtx (); - do_jump (TREE_OPERAND (exp, 0), if_false_label, NULL_RTX); - do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + { + rtx seq1, seq2; + tree cleanups, old_cleanups; + + if (if_false_label == 0) + if_false_label = drop_through_label = gen_label_rtx (); + start_sequence (); + do_jump (TREE_OPERAND (exp, 0), if_false_label, NULL_RTX); + seq1 = get_insns (); + end_sequence (); + + old_cleanups = cleanups_this_call; + start_sequence (); + do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + seq2 = get_insns (); + end_sequence (); + + cleanups = defer_cleanups_to (old_cleanups); + if (cleanups) + { + rtx flag = gen_reg_rtx (word_mode); + tree new_cleanups; + tree cond; + + /* Flag cleanups as not needed. */ + emit_move_insn (flag, const0_rtx); + emit_insns (seq1); + + /* Flag cleanups as needed. */ + emit_move_insn (flag, const1_rtx); + emit_insns (seq2); + + /* convert flag, which is an rtx, into a tree. */ + cond = make_node (RTL_EXPR); + TREE_TYPE (cond) = integer_type_node; + RTL_EXPR_RTL (cond) = flag; + RTL_EXPR_SEQUENCE (cond) = NULL_RTX; + + new_cleanups = build (COND_EXPR, void_type_node, + truthvalue_conversion (cond), + cleanups, integer_zero_node); + new_cleanups = fold (new_cleanups); + + /* Now add in the conditionalized cleanups. */ + cleanups_this_call + = tree_cons (NULL_TREE, new_cleanups, cleanups_this_call); + (*interim_eh_hook) (NULL_TREE); + } + else + { + emit_insns (seq1); + emit_insns (seq2); + } + } break; case TRUTH_ORIF_EXPR: - if (if_true_label == 0) - if_true_label = drop_through_label = gen_label_rtx (); - do_jump (TREE_OPERAND (exp, 0), NULL_RTX, if_true_label); - do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + { + rtx seq1, seq2; + tree cleanups, old_cleanups; + + if (if_true_label == 0) + if_true_label = drop_through_label = gen_label_rtx (); + start_sequence (); + do_jump (TREE_OPERAND (exp, 0), NULL_RTX, if_true_label); + seq1 = get_insns (); + end_sequence (); + + old_cleanups = cleanups_this_call; + start_sequence (); + do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + seq2 = get_insns (); + end_sequence (); + + cleanups = defer_cleanups_to (old_cleanups); + if (cleanups) + { + rtx flag = gen_reg_rtx (word_mode); + tree new_cleanups; + tree cond; + + /* Flag cleanups as not needed. */ + emit_move_insn (flag, const0_rtx); + emit_insns (seq1); + + /* Flag cleanups as needed. */ + emit_move_insn (flag, const1_rtx); + emit_insns (seq2); + + /* convert flag, which is an rtx, into a tree. */ + cond = make_node (RTL_EXPR); + TREE_TYPE (cond) = integer_type_node; + RTL_EXPR_RTL (cond) = flag; + RTL_EXPR_SEQUENCE (cond) = NULL_RTX; + + new_cleanups = build (COND_EXPR, void_type_node, + truthvalue_conversion (cond), + cleanups, integer_zero_node); + new_cleanups = fold (new_cleanups); + + /* Now add in the conditionalized cleanups. */ + cleanups_this_call + = tree_cons (NULL_TREE, new_cleanups, cleanups_this_call); + (*interim_eh_hook) (NULL_TREE); + } + else + { + emit_insns (seq1); + emit_insns (seq2); + } + } break; case COMPOUND_EXPR: @@ -8980,9 +9177,6 @@ do_jump_for_compare (comparison, if_false_label, if_true_label) rtx prev = get_last_insn (); rtx branch = 0; - if (prev != 0) - prev = PREV_INSN (prev); - /* Output the branch with the opposite condition. Then try to invert what is generated. If more than one insn is a branch, or if the branch is not the last insn written, abort. If we can't invert @@ -8990,20 +9184,23 @@ do_jump_for_compare (comparison, if_false_label, if_true_label) emit a jump to the false label and define the true label. */ if (bcc_gen_fctn[(int) GET_CODE (comparison)] != 0) - emit_jump_insn ((*bcc_gen_fctn[(int) GET_CODE (comparison)]) (if_false_label)); + emit_jump_insn ((*bcc_gen_fctn[(int) GET_CODE (comparison)])(if_false_label)); else abort (); - /* Here we get the insn before what was just emitted. - On some machines, emitting the branch can discard - the previous compare insn and emit a replacement. */ + /* Here we get the first insn that was just emitted. It used to be the + case that, on some machines, emitting the branch would discard + the previous compare insn and emit a replacement. This isn't + done anymore, but abort if we see that PREV is deleted. */ + if (prev == 0) - /* If there's only one preceding insn... */ insn = get_insns (); + else if (INSN_DELETED_P (prev)) + abort (); else insn = NEXT_INSN (prev); - for (insn = NEXT_INSN (insn); insn; insn = NEXT_INSN (insn)) + for (; insn; insn = NEXT_INSN (insn)) if (GET_CODE (insn) == JUMP_INSN) { if (branch) diff --git a/gnu/usr.bin/cc/cc_int/final.c b/gnu/usr.bin/cc/cc_int/final.c index 74d01e9..61a90a9 100644 --- a/gnu/usr.bin/cc/cc_int/final.c +++ b/gnu/usr.bin/cc/cc_int/final.c @@ -824,9 +824,13 @@ asm_insn_count (body) char *template; int count = 1; - for (template = decode_asm_operands (body, NULL_PTR, NULL_PTR, - NULL_PTR, NULL_PTR); - *template; template++) + if (GET_CODE (body) == ASM_INPUT) + template = XSTR (body, 0); + else + template = decode_asm_operands (body, NULL_PTR, NULL_PTR, + NULL_PTR, NULL_PTR); + + for ( ; *template; template++) if (IS_ASM_LOGICAL_LINE_SEPARATOR(*template) || *template == '\n') count++; @@ -953,18 +957,14 @@ static void profile_function (file) FILE *file; { -#ifndef NO_PROFILE_DATA int align = MIN (BIGGEST_ALIGNMENT, POINTER_SIZE); -#endif /* not NO_PROFILE_DATA */ int sval = current_function_returns_struct; int cxt = current_function_needs_context; -#ifndef NO_PROFILE_DATA data_section (); ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT)); ASM_OUTPUT_INTERNAL_LABEL (file, "LP", profile_label_no); assemble_integer (const0_rtx, POINTER_SIZE / BITS_PER_UNIT, 1); -#endif /* not NO_PROFILE_DATA */ text_section (); diff --git a/gnu/usr.bin/cc/cc_int/flow.c b/gnu/usr.bin/cc/cc_int/flow.c index cc9fed9..b0245f8 100644 --- a/gnu/usr.bin/cc/cc_int/flow.c +++ b/gnu/usr.bin/cc/cc_int/flow.c @@ -177,6 +177,12 @@ int *reg_basic_block; int *reg_n_refs; +/* Indexed by N; says whether a psuedo register N was ever used + within a SUBREG that changes the size of the reg. Some machines prohibit + such objects to be in certain (usually floating-point) registers. */ + +char *reg_changes_size; + /* Indexed by N, gives number of places register N dies. This information remains valid for the rest of the compilation of the current function; it is used to control register allocation. */ @@ -602,6 +608,20 @@ find_basic_blocks (f, nonlocal_label_list) } } + /* ??? See if we have a "live" basic block that is not reachable. + This can happen if it is headed by a label that is preserved or + in one of the label lists, but no call or computed jump is in + the loop. It's not clear if we can delete the block or not, + but don't for now. However, we will mess up register status if + it remains unreachable, so add a fake reachability from the + previous block. */ + + for (i = 1; i < n_basic_blocks; i++) + if (block_live[i] && ! basic_block_drops_in[i] + && GET_CODE (basic_block_head[i]) == CODE_LABEL + && LABEL_REFS (basic_block_head[i]) == basic_block_head[i]) + basic_block_drops_in[i] = 1; + /* Now delete the code for any basic blocks that can't be reached. They can occur because jump_optimize does not recognize unreachable loops as unreachable. */ @@ -1055,18 +1075,18 @@ life_analysis (f, nregs) { register rtx jump, head; + /* Update the basic_block_new_live_at_end's of the block that falls through into this one (if any). */ head = basic_block_head[i]; - jump = PREV_INSN (head); if (basic_block_drops_in[i]) { - register int from_block = BLOCK_NUM (jump); register int j; for (j = 0; j < regset_size; j++) - basic_block_new_live_at_end[from_block][j] + basic_block_new_live_at_end[i-1][j] |= basic_block_live_at_start[i][j]; } + /* Update the basic_block_new_live_at_end's of all the blocks that jump to this one. */ if (GET_CODE (head) == CODE_LABEL) @@ -1183,6 +1203,9 @@ allocate_for_life_analysis () reg_n_deaths = (short *) oballoc (max_regno * sizeof (short)); bzero ((char *) reg_n_deaths, max_regno * sizeof (short)); + reg_changes_size = (char *) oballoc (max_regno * sizeof (char)); + bzero (reg_changes_size, max_regno * sizeof (char));; + reg_live_length = (int *) oballoc (max_regno * sizeof (int)); bzero ((char *) reg_live_length, max_regno * sizeof (int)); @@ -1512,11 +1535,11 @@ propagate_block (old, first, last, final, significant, bnum) /* Calls may also reference any of the global registers, so they are made live. */ - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (global_regs[i]) - live[i / REGSET_ELT_BITS] - |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)); + mark_used_regs (old, live, + gen_rtx (REG, reg_raw_mode[i], i), + final, insn); /* Calls also clobber memory. */ last_mem_set = 0; @@ -2081,11 +2104,21 @@ find_auto_inc (needed, x, insn) && (use = find_use_as_address (PATTERN (insn), addr, offset), use != 0 && use != (rtx) 1)) { - int win = 0; rtx q = SET_DEST (set); + enum rtx_code inc_code = (INTVAL (XEXP (y, 1)) == size + ? (offset ? PRE_INC : POST_INC) + : (offset ? PRE_DEC : POST_DEC)); if (dead_or_set_p (incr, addr)) - win = 1; + { + /* This is the simple case. Try to make the auto-inc. If + we can't, we are done. Otherwise, we will do any + needed updates below. */ + if (! validate_change (insn, &XEXP (x, 0), + gen_rtx (inc_code, Pmode, addr), + 0)) + return; + } else if (GET_CODE (q) == REG /* PREV_INSN used here to check the semi-open interval [insn,incr). */ @@ -2113,14 +2146,25 @@ find_auto_inc (needed, x, insn) BLOCK_NUM (temp) = BLOCK_NUM (insn); } + /* If we can't make the auto-inc, or can't make the + replacement into Y, exit. There's no point in making + the change below if we can't do the auto-inc and doing + so is not correct in the pre-inc case. */ + + validate_change (insn, &XEXP (x, 0), + gen_rtx (inc_code, Pmode, q), + 1); + validate_change (incr, &XEXP (y, 0), q, 1); + if (! apply_change_group ()) + return; + + /* We now know we'll be doing this change, so emit the + new insn(s) and do the updates. */ emit_insns_before (insns, insn); if (basic_block_head[BLOCK_NUM (insn)] == insn) basic_block_head[BLOCK_NUM (insn)] = insns; - XEXP (x, 0) = q; - XEXP (y, 0) = q; - /* INCR will become a NOTE and INSN won't contain a use of ADDR. If a use of ADDR was just placed in the insn before INSN, make that the next use. @@ -2134,7 +2178,6 @@ find_auto_inc (needed, x, insn) addr = q; regno = REGNO (q); - win = 1; /* REGNO is now used in INCR which is below INSN, but it previously wasn't live here. If we don't mark @@ -2150,46 +2193,38 @@ find_auto_inc (needed, x, insn) reg_n_calls_crossed[regno]++; } - if (win - /* If we have found a suitable auto-increment, do - POST_INC around the register here, and patch out the - increment instruction that follows. */ - && validate_change (insn, &XEXP (x, 0), - gen_rtx ((INTVAL (XEXP (y, 1)) == size - ? (offset ? PRE_INC : POST_INC) - : (offset ? PRE_DEC : POST_DEC)), - Pmode, addr), 0)) + /* If we haven't returned, it means we were able to make the + auto-inc, so update the status. First, record that this insn + has an implicit side effect. */ + + REG_NOTES (insn) + = gen_rtx (EXPR_LIST, REG_INC, addr, REG_NOTES (insn)); + + /* Modify the old increment-insn to simply copy + the already-incremented value of our register. */ + if (! validate_change (incr, &SET_SRC (set), addr, 0)) + abort (); + + /* If that makes it a no-op (copying the register into itself) delete + it so it won't appear to be a "use" and a "set" of this + register. */ + if (SET_DEST (set) == addr) + { + PUT_CODE (incr, NOTE); + NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (incr) = 0; + } + + if (regno >= FIRST_PSEUDO_REGISTER) { - /* Record that this insn has an implicit side effect. */ - REG_NOTES (insn) - = gen_rtx (EXPR_LIST, REG_INC, addr, REG_NOTES (insn)); - - /* Modify the old increment-insn to simply copy - the already-incremented value of our register. */ - SET_SRC (set) = addr; - /* Indicate insn must be re-recognized. */ - INSN_CODE (incr) = -1; - - /* If that makes it a no-op (copying the register into itself) - then delete it so it won't appear to be a "use" and a "set" - of this register. */ - if (SET_DEST (set) == addr) - { - PUT_CODE (incr, NOTE); - NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED; - NOTE_SOURCE_FILE (incr) = 0; - } + /* Count an extra reference to the reg. When a reg is + incremented, spilling it is worse, so we want to make + that less likely. */ + reg_n_refs[regno] += loop_depth; - if (regno >= FIRST_PSEUDO_REGISTER) - { - /* Count an extra reference to the reg. When a reg is - incremented, spilling it is worse, so we want to make - that less likely. */ - reg_n_refs[regno] += loop_depth; - /* Count the increment as a setting of the register, - even though it isn't a SET in rtl. */ - reg_n_sets[regno]++; - } + /* Count the increment as a setting of the register, + even though it isn't a SET in rtl. */ + reg_n_sets[regno]++; } } } @@ -2257,6 +2292,20 @@ mark_used_regs (needed, live, x, final, insn) #endif break; + case SUBREG: + if (GET_CODE (SUBREG_REG (x)) == REG + && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER + && (GET_MODE_SIZE (GET_MODE (x)) + != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) + && (INTEGRAL_MODE_P (GET_MODE (x)) + || INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (x))))) + reg_changes_size[REGNO (SUBREG_REG (x))] = 1; + + /* While we're here, optimize this case. */ + x = SUBREG_REG (x); + + /* ... fall through ... */ + case REG: /* See a register other than being set => mark it as needed. */ @@ -2368,6 +2417,16 @@ mark_used_regs (needed, live, x, final, insn) #endif ) { + /* Check for the case where the register dying partially + overlaps the register set by this insn. */ + if (regno < FIRST_PSEUDO_REGISTER + && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1) + { + int n = HARD_REGNO_NREGS (regno, GET_MODE (x)); + while (--n >= 0) + some_needed |= dead_or_set_regno_p (insn, regno + n); + } + /* If none of the words in X is needed, make a REG_DEAD note. Otherwise, we must make partial REG_DEAD notes. */ if (! some_needed) diff --git a/gnu/usr.bin/cc/cc_int/fold-const.c b/gnu/usr.bin/cc/cc_int/fold-const.c index 0417aab..50217a0 100644 --- a/gnu/usr.bin/cc/cc_int/fold-const.c +++ b/gnu/usr.bin/cc/cc_int/fold-const.c @@ -2836,12 +2836,14 @@ fold_truthop (code, truth_type, lhs, rhs) l_const = convert (unsigned_type (TREE_TYPE (l_const)), l_const); l_const = const_binop (LSHIFT_EXPR, convert (type, l_const), size_int (xll_bitpos), 0); + l_const = const_binop (BIT_AND_EXPR, l_const, ll_mask, 0); } if (r_const) { r_const = convert (unsigned_type (TREE_TYPE (r_const)), r_const); r_const = const_binop (LSHIFT_EXPR, convert (type, r_const), size_int (xrl_bitpos), 0); + r_const = const_binop (BIT_AND_EXPR, r_const, rl_mask, 0); } /* If the right sides are not constant, do the same for it. Also, @@ -3420,6 +3422,15 @@ fold (expr) return t; #endif /* 0 */ + case COMPONENT_REF: + if (TREE_CODE (arg0) == CONSTRUCTOR) + { + tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0)); + if (m) + t = TREE_VALUE (m); + } + return t; + case RANGE_EXPR: TREE_CONSTANT (t) = wins; return t; @@ -3733,8 +3744,8 @@ fold (expr) Also note that operand_equal_p is always false if an operand is volatile. */ - if (operand_equal_p (arg0, arg1, - FLOAT_TYPE_P (type) && ! flag_fast_math)) + if ((! FLOAT_TYPE_P (type) || flag_fast_math) + && operand_equal_p (arg0, arg1, 0)) return convert (type, integer_zero_node); goto associate; diff --git a/gnu/usr.bin/cc/cc_int/function.c b/gnu/usr.bin/cc/cc_int/function.c index 9f33396..821d61a 100644 --- a/gnu/usr.bin/cc/cc_int/function.c +++ b/gnu/usr.bin/cc/cc_int/function.c @@ -152,9 +152,8 @@ int current_function_args_size; int current_function_pretend_args_size; -/* # of bytes of outgoing arguments required to be pushed by the prologue. - If this is non-zero, it means that ACCUMULATE_OUTGOING_ARGS was defined - and no stack adjusts will be done on function calls. */ +/* # of bytes of outgoing arguments. If ACCUMULATE_OUTGOING_ARGS is + defined, the needed space is pushed by the prologue. */ int current_function_outgoing_args_size; @@ -356,6 +355,8 @@ struct temp_slot tree rtl_expr; /* Non-zero if this temporary is currently in use. */ char in_use; + /* Non-zero if this temporary has its address taken. */ + char addr_taken; /* Nesting level at which this slot is being used. */ int level; /* Non-zero if this should survive a call to free_temp_slots. */ @@ -461,7 +462,8 @@ find_function_data (decl) since this function knows only about language-independent variables. */ void -push_function_context () +push_function_context_to (toplevel) + int toplevel; { struct function *p = (struct function *) xmalloc (sizeof (struct function)); @@ -512,7 +514,7 @@ push_function_context () p->fixup_var_refs_queue = 0; p->epilogue_delay_list = current_function_epilogue_delay_list; - save_tree_status (p); + save_tree_status (p, toplevel); save_storage_status (p); save_emit_status (p); init_emit (); @@ -524,11 +526,18 @@ push_function_context () (*save_machine_status) (p); } +void +push_function_context () +{ + push_function_context_to (0); +} + /* Restore the last saved context, at the end of a nested function. This function is called from language-specific code. */ void -pop_function_context () +pop_function_context_from (toplevel) + int toplevel; { struct function *p = outer_function_chain; @@ -545,7 +554,8 @@ pop_function_context () current_function_calls_alloca = p->calls_alloca; current_function_has_nonlocal_label = p->has_nonlocal_label; current_function_has_nonlocal_goto = p->has_nonlocal_goto; - current_function_contains_functions = 1; + if (! toplevel) + current_function_contains_functions = 1; current_function_args_size = p->args_size; current_function_pretend_args_size = p->pretend_args_size; current_function_arg_offset_rtx = p->arg_offset_rtx; @@ -577,8 +587,9 @@ pop_function_context () temp_slots = p->temp_slots; temp_slot_level = p->temp_slot_level; current_function_epilogue_delay_list = p->epilogue_delay_list; + reg_renumber = 0; - restore_tree_status (p); + restore_tree_status (p, toplevel); restore_storage_status (p); restore_expr_status (p); restore_emit_status (p); @@ -602,6 +613,11 @@ pop_function_context () rtx_equal_function_value_matters = 1; virtuals_instantiated = 0; } + +void pop_function_context () +{ + pop_function_context_from (0); +} /* Allocate fixed slots in the stack frame of the current function. */ @@ -784,6 +800,11 @@ assign_stack_temp (mode, size, keep) { struct temp_slot *p, *best_p = 0; + /* If SIZE is -1 it means that somebody tried to allocate a temporary + of a variable size. */ + if (size == -1) + abort (); + /* First try to find an available, already-allocated temporary that is the exact size we require. */ for (p = temp_slots; p; p = p->next) @@ -812,7 +833,7 @@ assign_stack_temp (mode, size, keep) if (best_p->size - rounded_size >= alignment) { p = (struct temp_slot *) oballoc (sizeof (struct temp_slot)); - p->in_use = 0; + p->in_use = p->addr_taken = 0; p->size = best_p->size - rounded_size; p->slot = gen_rtx (MEM, BLKmode, plus_constant (XEXP (best_p->slot, 0), @@ -845,7 +866,9 @@ assign_stack_temp (mode, size, keep) } p->in_use = 1; + p->addr_taken = 0; p->rtl_expr = sequence_rtl_expr; + if (keep == 2) { p->level = target_temp_slot_level; @@ -969,6 +992,28 @@ update_temp_slot_address (old, new) } } +/* If X could be a reference to a temporary slot, mark the fact that its + adddress was taken. */ + +void +mark_temp_addr_taken (x) + rtx x; +{ + struct temp_slot *p; + + if (x == 0) + return; + + /* If X is not in memory or is at a constant address, it cannot be in + a temporary slot. */ + if (GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0))) + return; + + p = find_temp_slot_from_address (XEXP (x, 0)); + if (p != 0) + p->addr_taken = 1; +} + /* If X could be a reference to a temporary slot, mark that slot as belonging to the to one level higher. If X matched one of our slots, just mark that one. Otherwise, we can't easily predict which it is, so upgrade all of @@ -981,31 +1026,52 @@ void preserve_temp_slots (x) rtx x; { - struct temp_slot *p; + struct temp_slot *p = 0; + /* If there is no result, we still might have some objects whose address + were taken, so we need to make sure they stay around. */ if (x == 0) - return; + { + for (p = temp_slots; p; p = p->next) + if (p->in_use && p->level == temp_slot_level && p->addr_taken) + p->level--; + + return; + } /* If X is a register that is being used as a pointer, see if we have a temporary slot we know it points to. To be consistent with the code below, we really should preserve all non-kept slots if we can't find a match, but that seems to be much too costly. */ - if (GET_CODE (x) == REG && REGNO_POINTER_FLAG (REGNO (x)) - && (p = find_temp_slot_from_address (x)) != 0) + if (GET_CODE (x) == REG && REGNO_POINTER_FLAG (REGNO (x))) + p = find_temp_slot_from_address (x); + + /* If X is not in memory or is at a constant address, it cannot be in + a temporary slot, but it can contain something whose address was + taken. */ + if (p == 0 && (GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0)))) { - p->level--; + for (p = temp_slots; p; p = p->next) + if (p->in_use && p->level == temp_slot_level && p->addr_taken) + p->level--; + return; } - - /* If X is not in memory or is at a constant address, it cannot be in - a temporary slot. */ - if (GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0))) - return; /* First see if we can find a match. */ - p = find_temp_slot_from_address (XEXP (x, 0)); + if (p == 0) + p = find_temp_slot_from_address (XEXP (x, 0)); + if (p != 0) { + /* Move everything at our level whose address was taken to our new + level in case we used its address. */ + struct temp_slot *q; + + for (q = temp_slots; q; q = q->next) + if (q != p && q->addr_taken && q->level == p->level) + q->level--; + p->level--; return; } @@ -2191,6 +2257,8 @@ optimize_bit_field (body, insn, equiv_mem) and then for which byte of the word is wanted. */ register int offset = INTVAL (XEXP (bitfield, 2)); + rtx insns; + /* Adjust OFFSET to count bits from low-address byte. */ #if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN offset = (GET_MODE_BITSIZE (GET_MODE (XEXP (bitfield, 0))) @@ -2209,8 +2277,12 @@ optimize_bit_field (body, insn, equiv_mem) #endif } - memref = change_address (memref, mode, + start_sequence (); + memref = change_address (memref, mode, plus_constant (XEXP (memref, 0), offset)); + insns = get_insns (); + end_sequence (); + emit_insns_before (insns, insn); /* Store this memory reference where we found the bit field reference. */ @@ -3150,6 +3222,13 @@ assign_parms (fndecl, second_time) continue; } + /* If the parm is to be passed as a transparent union, use the + type of the first field for the tests below. We have already + verified that the modes are the same. */ + if (DECL_TRANSPARENT_UNION (parm) + || TYPE_TRANSPARENT_UNION (passed_type)) + passed_type = TREE_TYPE (TYPE_FIELDS (passed_type)); + /* See if this arg was passed by invisible reference. It is if it is an object whose size depends on the contents of the object itself or if the machine requires these objects be passed @@ -3426,6 +3505,9 @@ assign_parms (fndecl, second_time) else if (PARM_BOUNDARY % BITS_PER_WORD != 0) abort (); + if (TREE_READONLY (parm)) + RTX_UNCHANGING_P (stack_parm) = 1; + move_block_from_reg (REGNO (entry_parm), validize_mem (stack_parm), size_stored / UNITS_PER_WORD, @@ -4251,7 +4333,9 @@ trampoline_address (function) /* Find an existing trampoline and return it. */ for (link = trampoline_list; link; link = TREE_CHAIN (link)) if (TREE_PURPOSE (link) == function) - return XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0); + return + round_trampoline_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0)); + for (fp = outer_function_chain; fp; fp = fp->next) for (link = fp->trampoline_list; link; link = TREE_CHAIN (link)) if (TREE_PURPOSE (link) == function) @@ -4693,6 +4777,11 @@ mark_varargs () /* Expand a call to __main at the beginning of a possible main function. */ +#if defined(INIT_SECTION_ASM_OP) && !defined(INVOKE__main) +#undef HAS_INIT_SECTION +#define HAS_INIT_SECTION +#endif + void expand_main_function () { @@ -4700,10 +4789,10 @@ expand_main_function () { /* The zero below avoids a possible parse error */ 0; -#if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main) +#if !defined (HAS_INIT_SECTION) emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, VOIDmode, 0); -#endif /* not INIT_SECTION_ASM_OP or INVOKE__main */ +#endif /* not HAS_INIT_SECTION */ } } @@ -4858,7 +4947,7 @@ expand_function_start (subr, parms_have_cleanups) if (aggregate_value_p (DECL_RESULT (subr))) { /* Returning something that won't go in a register. */ - register rtx value_address; + register rtx value_address = 0; #ifdef PCC_STATIC_STRUCT_RETURN if (current_function_returns_pcc_struct) @@ -4965,11 +5054,23 @@ expand_function_start (subr, parms_have_cleanups) /* Fetch static chain values for containing functions. */ tem = decl_function_context (current_function_decl); - /* If not doing stupid register allocation, then start off with the static - chain pointer in a pseudo register. Otherwise, we use the stack - address that was generated above. */ + /* If not doing stupid register allocation copy the static chain + pointer into a psuedo. If we have small register classes, copy the + value from memory if static_chain_incoming_rtx is a REG. If we do + stupid register allocation, we use the stack address generated above. */ if (tem && ! obey_regdecls) - last_ptr = copy_to_reg (static_chain_incoming_rtx); + { +#ifdef SMALL_REGISTER_CLASSES + /* If the static chain originally came in a register, put it back + there, then move it out in the next insn. The reason for + this peculiar code is to satisfy function integration. */ + if (GET_CODE (static_chain_incoming_rtx) == REG) + emit_move_insn (static_chain_incoming_rtx, last_ptr); +#endif + + last_ptr = copy_to_reg (static_chain_incoming_rtx); + } + context_display = 0; while (tem) { @@ -5036,7 +5137,9 @@ expand_function_end (filename, line, end_bindings) on a machine that fails to restore the registers. */ if (NON_SAVING_SETJMP && current_function_calls_setjmp) { - setjmp_protect (DECL_INITIAL (current_function_decl)); + if (DECL_INITIAL (current_function_decl) != error_mark_node) + setjmp_protect (DECL_INITIAL (current_function_decl)); + setjmp_protect_args (); } #endif diff --git a/gnu/usr.bin/cc/cc_int/getpwd.c b/gnu/usr.bin/cc/cc_int/getpwd.c index 922a9ed..d939f39 100644 --- a/gnu/usr.bin/cc/cc_int/getpwd.c +++ b/gnu/usr.bin/cc/cc_int/getpwd.c @@ -14,16 +14,23 @@ extern int errno; BSD systems) now provides getcwd as called for by POSIX. Allow for the few exceptions to the general rule here. */ -#if !(defined (POSIX) || defined (USG) || defined (VMS)) +#if !(defined (POSIX) || defined (USG) || defined (VMS)) || defined (HAVE_GETWD) #include <sys/param.h> extern char *getwd (); #define getcwd(buf,len) getwd(buf) +#ifdef MAXPATHLEN #define GUESSPATHLEN (MAXPATHLEN + 1) +#else +#define GUESSPATHLEN 100 +#endif #else /* (defined (USG) || defined (VMS)) */ extern char *getcwd (); /* We actually use this as a starting point, not a limit. */ #define GUESSPATHLEN 100 #endif /* (defined (USG) || defined (VMS)) */ +#ifdef WINNT +#include <direct.h> +#endif char *getenv (); char *xmalloc (); diff --git a/gnu/usr.bin/cc/cc_int/global.c b/gnu/usr.bin/cc/cc_int/global.c index 297e930..ff86fec 100644 --- a/gnu/usr.bin/cc/cc_int/global.c +++ b/gnu/usr.bin/cc/cc_int/global.c @@ -446,6 +446,18 @@ global_alloc (file) if (regs_ever_live[i]) local_reg_n_refs[i] = 0; + /* Likewise for regs used in a SCRATCH. */ + for (i = 0; i < scratch_list_length; i++) + if (scratch_list[i]) + { + int regno = REGNO (scratch_list[i]); + int lim = regno + HARD_REGNO_NREGS (regno, GET_MODE (scratch_list[i])); + int j; + + for (j = regno; j < lim; j++) + local_reg_n_refs[j] = 0; + } + /* Allocate the space for the conflict and preference tables and initialize them. */ @@ -923,6 +935,12 @@ find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying) IOR_HARD_REG_SET (used1, hard_reg_conflicts[allocno]); +#ifdef CLASS_CANNOT_CHANGE_SIZE + if (reg_changes_size[allocno_reg[allocno]]) + IOR_HARD_REG_SET (used1, + reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE]); +#endif + /* Try each hard reg to see if it fits. Do this in two passes. In the first pass, skip registers that are preferred by some other pseudo to give it a better chance of getting one of those registers. Only if @@ -1097,27 +1115,42 @@ find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying) /* Don't use a reg no good for this pseudo. */ && ! TEST_HARD_REG_BIT (used2, regno) && HARD_REGNO_MODE_OK (regno, mode) - && (((double) local_reg_n_refs[regno] - / local_reg_live_length[regno]) - < ((double) allocno_n_refs[allocno] - / allocno_live_length[allocno]))) +#ifdef CLASS_CANNOT_CHANGE_SIZE + && ! (reg_changes_size[allocno_reg[allocno]] + && (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + regno))) +#endif + ) { - /* Hard reg REGNO was used less in total by local regs - than it would be used by this one allocno! */ - int k; - for (k = 0; k < max_regno; k++) - if (reg_renumber[k] >= 0) - { - int r = reg_renumber[k]; - int endregno - = r + HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (k)); + /* We explicitly evaluate the divide results into temporary + variables so as to avoid excess precision problems that occur + on a i386-unknown-sysv4.2 (unixware) host. */ + + double tmp1 = ((double) local_reg_n_refs[regno] + / local_reg_live_length[regno]); + double tmp2 = ((double) allocno_n_refs[allocno] + / allocno_live_length[allocno]); + + if (tmp1 < tmp2) + { + /* Hard reg REGNO was used less in total by local regs + than it would be used by this one allocno! */ + int k; + for (k = 0; k < max_regno; k++) + if (reg_renumber[k] >= 0) + { + int r = reg_renumber[k]; + int endregno + = r + HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (k)); - if (regno >= r && regno < endregno) - reg_renumber[k] = -1; - } + if (regno >= r && regno < endregno) + reg_renumber[k] = -1; + } - best_reg = regno; - break; + best_reg = regno; + break; + } } } } diff --git a/gnu/usr.bin/cc/cc_int/insn-emit.c b/gnu/usr.bin/cc/cc_int/insn-emit.c index 01463d0..ee62202 100644 --- a/gnu/usr.bin/cc/cc_int/insn-emit.c +++ b/gnu/usr.bin/cc/cc_int/insn-emit.c @@ -659,6 +659,15 @@ gen_movsi (operand0, operand1) if (flag_pic && SYMBOLIC_CONST (operands[1])) emit_pic_move (operands, SImode); + + /* Don't generate memory->memory moves, go through a register */ + else if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (SImode, operands[1]); + } } operand0 = operands[0]; operand1 = operands[1]; @@ -677,9 +686,32 @@ gen_movhi (operand0, operand1) rtx operand0; rtx operand1; { - return gen_rtx (SET, VOIDmode, + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (HImode, operands[1]); + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, operand0, - operand1); + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; } rtx @@ -687,10 +719,33 @@ gen_movstricthi (operand0, operand1) rtx operand0; rtx operand1; { - return gen_rtx (SET, VOIDmode, + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (HImode, operands[1]); + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (STRICT_LOW_PART, VOIDmode, operand0), - operand1); + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; } rtx @@ -698,9 +753,32 @@ gen_movqi (operand0, operand1) rtx operand0; rtx operand1; { - return gen_rtx (SET, VOIDmode, + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (QImode, operands[1]); + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, operand0, - operand1); + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; } rtx @@ -708,10 +786,33 @@ gen_movstrictqi (operand0, operand1) rtx operand0; rtx operand1; { - return gen_rtx (SET, VOIDmode, + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (QImode, operands[1]); + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (STRICT_LOW_PART, VOIDmode, operand0), - operand1); + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; } rtx @@ -719,13 +820,99 @@ gen_movsf (operand0, operand1) rtx operand0; rtx operand1; { + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], SFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], SFmode)) + ? gen_movsf_push + : gen_movsf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, + operand0, + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; +} + +rtx +gen_movsf_push_nomove (operand0, operand1) + rtx operand0; + rtx operand1; +{ return gen_rtx (SET, VOIDmode, operand0, operand1); } rtx -gen_swapdf (operand0, operand1) +gen_movsf_push (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movsf_mem (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movsf_normal (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (SET, VOIDmode, + operand0, + operand1); +} + +rtx +gen_swapsf (operand0, operand1) rtx operand0; rtx operand1; { @@ -743,13 +930,103 @@ gen_movdf (operand0, operand1) rtx operand0; rtx operand1; { + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], DFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], DFmode)) + ? gen_movdf_push + : gen_movdf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, + operand0, + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; +} + +rtx +gen_movdf_push_nomove (operand0, operand1) + rtx operand0; + rtx operand1; +{ return gen_rtx (SET, VOIDmode, operand0, operand1); } rtx -gen_swapxf (operand0, operand1) +gen_movdf_push (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movdf_mem (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movdf_normal (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (SET, VOIDmode, + operand0, + operand1); +} + +rtx +gen_swapdf (operand0, operand1) rtx operand0; rtx operand1; { @@ -767,13 +1044,93 @@ gen_movxf (operand0, operand1) rtx operand0; rtx operand1; { + rtx operands[2]; + rtx _val = 0; + start_sequence (); + operands[0] = operand0; + operands[1] = operand1; + +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], XFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], XFmode)) + ? gen_movxf_push + : gen_movxf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +} + operand0 = operands[0]; + operand1 = operands[1]; + emit_insn (gen_rtx (SET, VOIDmode, + operand0, + operand1)); + _done: + _val = gen_sequence (); + _fail: + end_sequence (); + return _val; +} + +rtx +gen_movxf_push_nomove (operand0, operand1) + rtx operand0; + rtx operand1; +{ return gen_rtx (SET, VOIDmode, operand0, operand1); } rtx -gen_movdi (operand0, operand1) +gen_movxf_push (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movxf_mem (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_movxf_normal (operand0, operand1) rtx operand0; rtx operand1; { @@ -783,6 +1140,35 @@ gen_movdi (operand0, operand1) } rtx +gen_swapxf (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (SET, VOIDmode, + operand1, + operand0))); +} + +rtx +gen_movdi (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3, + gen_rtx (SET, VOIDmode, + operand0, + operand1), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx gen_zero_extendhisi2 (operand0, operand1) rtx operand0; rtx operand1; @@ -1477,11 +1863,14 @@ gen_adddi3 (operand0, operand1, operand2) rtx operand1; rtx operand2; { - return gen_rtx (SET, VOIDmode, + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, operand0, gen_rtx (PLUS, DImode, operand1, - operand2)); + operand2)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); } rtx @@ -1524,6 +1913,16 @@ gen_addqi3 (operand0, operand1, operand2) } rtx +gen_movsi_lea (operand0, operand1) + rtx operand0; + rtx operand1; +{ + return gen_rtx (SET, VOIDmode, + operand0, + operand1); +} + +rtx gen_addxf3 (operand0, operand1, operand2) rtx operand0; rtx operand1; @@ -1568,11 +1967,14 @@ gen_subdi3 (operand0, operand1, operand2) rtx operand1; rtx operand2; { - return gen_rtx (SET, VOIDmode, + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, operand0, gen_rtx (MINUS, DImode, operand1, - operand2)); + operand2)), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); } rtx @@ -1740,6 +2142,48 @@ gen_mulsidi3 (operand0, operand1, operand2) } rtx +gen_umulsi3_highpart (operand0, operand1, operand2) + rtx operand0; + rtx operand1; + rtx operand2; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, + operand0, + gen_rtx (TRUNCATE, SImode, + gen_rtx (LSHIFTRT, DImode, + gen_rtx (MULT, DImode, + gen_rtx (ZERO_EXTEND, DImode, + operand1), + gen_rtx (ZERO_EXTEND, DImode, + operand2)), + GEN_INT (32)))), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx +gen_smulsi3_highpart (operand0, operand1, operand2) + rtx operand0; + rtx operand1; + rtx operand2; +{ + return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, + gen_rtx (SET, VOIDmode, + operand0, + gen_rtx (TRUNCATE, SImode, + gen_rtx (LSHIFTRT, DImode, + gen_rtx (MULT, DImode, + gen_rtx (SIGN_EXTEND, DImode, + operand1), + gen_rtx (SIGN_EXTEND, DImode, + operand2)), + GEN_INT (32)))), + gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)))); +} + +rtx gen_mulxf3 (operand0, operand1, operand2) rtx operand0; rtx operand1; @@ -3554,21 +3998,23 @@ gen_untyped_call (operand0, operand1, operand2) operands[2] = operand2; { - rtx addr; + int i; - if (flag_pic) - current_function_uses_pic_offset_table = 1; + emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx)); - /* With half-pic, force the address into a register. */ - addr = XEXP (operands[0], 0); - if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr)) - XEXP (operands[0], 0) = force_reg (Pmode, addr); + for (i = 0; i < XVECLEN (operands[2], 0); i++) + { + rtx set = XVECEXP (operands[2], 0, i); + emit_move_insn (SET_DEST (set), SET_SRC (set)); + } - operands[1] = change_address (operands[1], DImode, XEXP (operands[1], 0)); - if (! expander_call_insn_operand (operands[1], QImode)) - operands[1] - = change_address (operands[1], VOIDmode, - copy_to_mode_reg (Pmode, XEXP (operands[1], 0))); + /* The optimizer does not know that the call sets the function value + registers we stored in the result block. We avoid problems by + claiming that all hard registers are used and clobbered at this + point. */ + emit_insn (gen_blockage ()); + + DONE; } operand0 = operands[0]; operand1 = operands[1]; @@ -3588,59 +4034,11 @@ gen_untyped_call (operand0, operand1, operand2) } rtx -gen_untyped_return (operand0, operand1) - rtx operand0; - rtx operand1; -{ - rtx operands[2]; - rtx _val = 0; - start_sequence (); - operands[0] = operand0; - operands[1] = operand1; - -{ - rtx valreg1 = gen_rtx (REG, SImode, 0); - rtx valreg2 = gen_rtx (REG, SImode, 1); - rtx result = operands[0]; - - /* Restore the FPU state. */ - emit_insn (gen_update_return (change_address (result, SImode, - plus_constant (XEXP (result, 0), - 8)))); - - /* Reload the function value registers. */ - emit_move_insn (valreg1, change_address (result, SImode, XEXP (result, 0))); - emit_move_insn (valreg2, - change_address (result, SImode, - plus_constant (XEXP (result, 0), 4))); - - /* Put USE insns before the return. */ - emit_insn (gen_rtx (USE, VOIDmode, valreg1)); - emit_insn (gen_rtx (USE, VOIDmode, valreg2)); - - /* Construct the return. */ - expand_null_return (); - - DONE; -} - operand0 = operands[0]; - operand1 = operands[1]; - emit (operand0); - emit (operand1); - _done: - _val = gen_sequence (); - _fail: - end_sequence (); - return _val; -} - -rtx -gen_update_return (operand0) - rtx operand0; +gen_blockage () { - return gen_rtx (UNSPEC, SImode, + return gen_rtx (UNSPEC_VOLATILE, VOIDmode, gen_rtvec (1, - operand0), + const0_rtx), 0); } @@ -3916,22 +4314,40 @@ add_clobbers (pattern, insn_code_number) switch (insn_code_number) { - case 264: - XVECEXP (pattern, 0, 1) = gen_rtx (CLOBBER, VOIDmode, + case 114: + case 113: + case 112: + XVECEXP (pattern, 0, 3) = gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)); break; - case 95: - case 94: - case 93: - XVECEXP (pattern, 0, 3) = gen_rtx (CLOBBER, VOIDmode, + case 108: + case 107: + case 106: + XVECEXP (pattern, 0, 4) = gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)); break; - case 89: - case 88: - case 87: - XVECEXP (pattern, 0, 4) = gen_rtx (CLOBBER, VOIDmode, + case 84: + case 83: + case 80: + case 79: + case 74: + case 73: + XVECEXP (pattern, 0, 1) = gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)); + XVECEXP (pattern, 0, 2) = gen_rtx (CLOBBER, VOIDmode, + gen_rtx (SCRATCH, SImode, 0)); + break; + + case 285: + case 151: + case 150: + case 135: + case 127: + case 68: + case 67: + XVECEXP (pattern, 0, 1) = gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)); break; diff --git a/gnu/usr.bin/cc/cc_int/insn-extract.c b/gnu/usr.bin/cc/cc_int/insn-extract.c index 7f6f1a4..8e8730f 100644 --- a/gnu/usr.bin/cc/cc_int/insn-extract.c +++ b/gnu/usr.bin/cc/cc_int/insn-extract.c @@ -9,12 +9,6 @@ extern rtx recog_operand[]; extern rtx *recog_operand_loc[]; extern rtx *recog_dup_loc[]; extern char recog_dup_num[]; -extern -#ifdef __GNUC__ -__volatile__ -#endif -void fatal_insn_not_found (); - void insn_extract (insn) rtx insn; @@ -27,7 +21,7 @@ insn_extract (insn) case -1: fatal_insn_not_found (insn); - case 308: + case 326: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0, 0), 0)); ro[2] = *(ro_loc[2] = &XVECEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0, 1)); @@ -36,38 +30,38 @@ insn_extract (insn) recog_dup_num[0] = 1; break; - case 306: - case 303: - case 302: - case 300: - case 299: + case 324: + case 321: + case 320: + case 318: + case 317: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (pat, 1), 1), 0)); ro[3] = *(ro_loc[3] = &XEXP (pat, 1)); break; - case 305: - case 301: - case 298: - case 297: - case 295: + case 323: + case 319: + case 316: + case 315: + case 313: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 1)); ro[3] = *(ro_loc[3] = &XEXP (pat, 1)); break; - case 304: - case 296: - case 294: + case 322: + case 314: + case 312: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 1)); ro[3] = *(ro_loc[3] = &XEXP (pat, 1)); break; - case 289: + case 307: ro[0] = *(ro_loc[0] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); @@ -80,7 +74,7 @@ insn_extract (insn) recog_dup_num[2] = 0; break; - case 288: + case 306: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1), 0)); @@ -94,7 +88,7 @@ insn_extract (insn) recog_dup_num[2] = 1; break; - case 286: + case 304: ro[0] = *(ro_loc[0] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); @@ -106,33 +100,18 @@ insn_extract (insn) recog_dup_num[1] = 0; break; - case 284: - case 283: - break; - - case 282: - ro[0] = *(ro_loc[0] = &XVECEXP (pat, 0, 0)); - break; - - case 280: - ro[0] = *(ro_loc[0] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 0), 0)); - ro[1] = *(ro_loc[1] = &XVECEXP (pat, 0, 1)); - ro[2] = *(ro_loc[2] = &XVECEXP (pat, 0, 2)); - break; - - case 279: - ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); - ro[1] = *(ro_loc[1] = &XVECEXP (pat, 0, 1)); - ro[2] = *(ro_loc[2] = &XVECEXP (pat, 0, 2)); + case 302: + case 301: + case 300: break; - case 277: + case 298: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 1)); break; - case 274: + case 295: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1)); @@ -141,7 +120,7 @@ insn_extract (insn) ro[4] = *(ro_loc[4] = &XEXP (XEXP (XVECEXP (pat, 0, 1), 1), 1)); break; - case 273: + case 294: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1)); @@ -150,7 +129,7 @@ insn_extract (insn) ro[4] = *(ro_loc[4] = &XEXP (XEXP (XVECEXP (pat, 0, 1), 1), 1)); break; - case 268: + case 289: ro[0] = *(ro_loc[0] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 0), 1)); ro[2] = const0_rtx; @@ -158,7 +137,7 @@ insn_extract (insn) ro[3] = *(ro_loc[3] = &XEXP (XEXP (XVECEXP (pat, 0, 1), 1), 1)); break; - case 267: + case 288: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 0), 1)); ro[2] = const0_rtx; @@ -166,85 +145,85 @@ insn_extract (insn) ro[3] = *(ro_loc[3] = &XEXP (XEXP (XVECEXP (pat, 0, 1), 1), 1)); break; - case 265: + case 286: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 1)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0)); break; - case 264: + case 285: ro[0] = *(ro_loc[0] = &XEXP (XEXP (XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1), 0), 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1), 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); break; - case 261: + case 282: ro[0] = *(ro_loc[0] = &XEXP (XEXP (pat, 1), 0)); break; - case 260: + case 281: + case 280: + case 279: + case 278: + case 277: + case 276: + case 275: + case 274: + case 273: + case 272: + ro[0] = *(ro_loc[0] = &XEXP (XEXP (XEXP (pat, 1), 2), 0)); + break; + + case 271: + case 269: + case 267: + case 265: + case 263: + case 261: case 259: - case 258: case 257: - case 256: case 255: - case 254: case 253: - case 252: - case 251: - ro[0] = *(ro_loc[0] = &XEXP (XEXP (XEXP (pat, 1), 2), 0)); - break; - - case 250: - case 248: - case 246: - case 244: - case 242: - case 240: - case 238: - case 236: - case 234: - case 232: ro[0] = *(ro_loc[0] = &XEXP (XEXP (XEXP (pat, 1), 1), 0)); break; - case 230: - case 228: - case 226: - case 224: - case 222: - case 220: - case 218: - case 216: - case 214: - case 212: + case 251: + case 249: + case 247: + case 245: + case 243: + case 241: + case 239: + case 237: + case 235: + case 233: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); break; - case 210: - case 209: + case 231: + case 230: ro[0] = *(ro_loc[0] = &XEXP (XEXP (pat, 1), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 1)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 2)); break; - case 208: + case 229: ro[0] = *(ro_loc[0] = &XEXP (XEXP (pat, 1), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 2)); break; - case 207: + case 228: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (pat, 1), 1), 1)); break; - case 206: + case 227: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 1)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 1)); break; - case 205: + case 226: ro[0] = *(ro_loc[0] = &XEXP (XEXP (pat, 0), 0)); ro[1] = const0_rtx; ro_loc[1] = &junk; @@ -252,9 +231,9 @@ insn_extract (insn) ro[3] = *(ro_loc[3] = &XEXP (pat, 1)); break; - case 195: - case 189: - case 183: + case 216: + case 210: + case 204: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1)); @@ -262,37 +241,37 @@ insn_extract (insn) recog_dup_num[0] = 2; break; - case 177: - case 174: + case 198: + case 195: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (XEXP (pat, 1), 0, 0), 0)); break; - case 176: - case 175: - case 173: - case 172: + case 197: + case 196: + case 194: + case 193: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XVECEXP (XEXP (pat, 1), 0, 0)); break; - case 293: - case 291: - case 171: - case 170: - case 168: - case 165: - case 163: - case 160: - case 158: + case 311: + case 309: + case 192: + case 191: + case 189: + case 186: + case 184: + case 181: + case 179: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 0)); break; - case 142: - case 141: - case 140: - case 139: + case 163: + case 162: + case 161: + case 160: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1)); @@ -303,65 +282,79 @@ insn_extract (insn) recog_dup_num[1] = 2; break; - case 130: - case 129: - case 128: - case 127: - ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); - ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 0)); - ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (pat, 1), 1), 0)); - break; - - case 276: - case 204: - case 203: - case 202: - case 201: - case 200: - case 199: - case 198: - case 197: - case 196: - case 194: - case 192: - case 191: - case 190: - case 188: - case 186: - case 185: - case 184: - case 182: case 151: case 150: + ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); + ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0), 0), 0)); + ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0), 1), 0)); + ro[3] = *(ro_loc[3] = &XEXP (XVECEXP (pat, 0, 1), 0)); + break; + case 149: case 148: case 147: case 146: + ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); + ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (pat, 1), 0), 0)); + ro[2] = *(ro_loc[2] = &XEXP (XEXP (XEXP (pat, 1), 1), 0)); + break; + + case 297: + case 225: + case 224: + case 223: + case 222: + case 221: + case 220: + case 219: + case 218: + case 217: + case 215: + case 213: + case 212: + case 211: + case 209: + case 207: + case 206: + case 205: + case 203: + case 172: + case 171: + case 170: + case 169: + case 168: + case 167: + case 166: + case 165: + case 164: + case 156: + case 155: case 145: case 144: case 143: - case 135: - case 134: - case 126: - case 125: - case 124: - case 123: - case 119: - case 118: - case 117: - case 116: - case 111: - case 110: - case 109: - case 108: + case 142: + case 138: + case 137: + case 136: + case 130: + case 129: + case 128: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XEXP (pat, 1), 1)); break; - case 95: - case 94: - case 93: + case 135: + case 127: + ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); + ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); + ro[2] = *(ro_loc[2] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 1)); + ro[3] = *(ro_loc[3] = &XEXP (XVECEXP (pat, 0, 1), 0)); + break; + + case 114: + case 113: + case 112: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); @@ -369,9 +362,9 @@ insn_extract (insn) ro[4] = *(ro_loc[4] = &XEXP (XVECEXP (pat, 0, 3), 0)); break; - case 89: - case 88: - case 87: + case 108: + case 107: + case 106: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 2), 0)); @@ -381,53 +374,66 @@ insn_extract (insn) recog_dup_num[0] = 1; break; - case 78: + case 97: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XEXP (XVECEXP (pat, 0, 0), 1), 0)); ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); break; + case 201: + case 200: + case 199: + case 190: + case 188: + case 187: + case 185: + case 183: + case 182: case 180: - case 179: case 178: - case 169: - case 167: - case 166: - case 164: - case 162: - case 161: - case 159: - case 157: - case 156: - case 155: - case 154: - case 153: - case 152: - case 107: - case 106: - case 105: - case 104: - case 103: - case 102: + case 177: + case 176: + case 175: + case 174: + case 173: + case 126: + case 125: + case 124: + case 123: + case 122: + case 121: + case 99: + case 98: + case 95: + case 94: + case 93: + case 92: + case 91: + case 90: + case 89: + case 88: + case 87: + case 86: + case 85: + ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); + ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); + break; + + case 84: + case 83: case 80: case 79: - case 76: - case 75: case 74: case 73: - case 72: - case 71: - case 70: - case 69: - case 68: - case 67: - case 66: - ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); - ro[1] = *(ro_loc[1] = &XEXP (XEXP (pat, 1), 0)); + ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); + ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 0), 1)); + ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); + ro[3] = *(ro_loc[3] = &XEXP (XVECEXP (pat, 0, 2), 0)); break; - case 62: - case 59: + case 82: + case 76: + case 70: ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 0), 1)); recog_dup_loc[0] = &XEXP (XVECEXP (pat, 0, 1), 0); @@ -436,28 +442,38 @@ insn_extract (insn) recog_dup_num[1] = 0; break; - case 271: - case 55: - case 52: + case 68: + case 67: + ro[0] = *(ro_loc[0] = &XEXP (XVECEXP (pat, 0, 0), 0)); + ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 0), 1)); + ro[2] = *(ro_loc[2] = &XEXP (XVECEXP (pat, 0, 1), 0)); + break; + + case 292: + case 64: + case 57: ro[0] = *(ro_loc[0] = &XEXP (XEXP (pat, 0), 0)); ro[1] = *(ro_loc[1] = &XEXP (pat, 1)); break; - case 270: - case 112: - case 65: - case 64: - case 63: - case 61: + case 291: + case 131: + case 81: + case 78: + case 75: + case 72: + case 69: + case 66: + case 62: case 60: + case 59: case 58: - case 57: - case 56: - case 54: + case 55: case 53: + case 52: case 51: case 50: - case 49: + case 48: case 47: case 46: ro[0] = *(ro_loc[0] = &XEXP (pat, 0)); @@ -520,7 +536,7 @@ insn_extract (insn) ro[1] = *(ro_loc[1] = &XEXP (XVECEXP (pat, 0, 1), 0)); break; - case 262: + case 283: case 4: case 2: case 0: diff --git a/gnu/usr.bin/cc/cc_int/insn-opinit.c b/gnu/usr.bin/cc/cc_int/insn-opinit.c index 8ad7929..18eda5f 100644 --- a/gnu/usr.bin/cc/cc_int/insn-opinit.c +++ b/gnu/usr.bin/cc/cc_int/insn-opinit.c @@ -109,8 +109,14 @@ init_all_optabs () smul_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulsi3; umul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_umulqihi3; smul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulqihi3; - umul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_umulsidi3; - smul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_mulsidi3; + if (HAVE_umulsidi3) + umul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_umulsidi3; + if (HAVE_mulsidi3) + smul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_mulsidi3; + if (HAVE_umulsi3_highpart) + umul_highpart_optab->handlers[(int) SImode].insn_code = CODE_FOR_umulsi3_highpart; + if (HAVE_smulsi3_highpart) + smul_highpart_optab->handlers[(int) SImode].insn_code = CODE_FOR_smulsi3_highpart; if (HAVE_mulxf3) smul_optab->handlers[(int) XFmode].insn_code = CODE_FOR_mulxf3; if (HAVE_muldf3) diff --git a/gnu/usr.bin/cc/cc_int/insn-output.c b/gnu/usr.bin/cc/cc_int/insn-output.c index b354cf4..7186712 100644 --- a/gnu/usr.bin/cc/cc_int/insn-output.c +++ b/gnu/usr.bin/cc/cc_int/insn-output.c @@ -79,7 +79,7 @@ output_6 (operands, insn) if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); } } @@ -98,7 +98,7 @@ output_8 (operands, insn) if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); } } @@ -117,7 +117,7 @@ output_10 (operands, insn) if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); } } @@ -174,7 +174,7 @@ output_18 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -182,7 +182,7 @@ output_19 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -190,7 +190,7 @@ output_20 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -198,7 +198,7 @@ output_21 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -206,7 +206,7 @@ output_22 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -214,7 +214,7 @@ output_23 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -222,7 +222,7 @@ output_24 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -230,7 +230,7 @@ output_25 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -238,7 +238,7 @@ output_26 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -246,7 +246,7 @@ output_27 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -254,7 +254,7 @@ output_28 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -262,7 +262,7 @@ output_29 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -270,7 +270,7 @@ output_30 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -278,7 +278,7 @@ output_31 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -286,7 +286,7 @@ output_32 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -294,7 +294,7 @@ output_33 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_float_compare (insn, operands); + return output_float_compare (insn, operands); } static char * @@ -414,7 +414,7 @@ output_45 (operands, insn) } static char * -output_49 (operands, insn) +output_50 (operands, insn) rtx *operands; rtx insn; { @@ -436,12 +436,15 @@ output_49 (operands, insn) /* Fastest way to change a 0 to a 1. */ return AS1 (inc%L0,%0); + if (flag_pic && SYMBOLIC_CONST (operands[1])) + return AS2 (lea%L0,%a1,%0); + return AS2 (mov%L0,%1,%0); } } static char * -output_51 (operands, insn) +output_55 (operands, insn) rtx *operands; rtx insn; { @@ -476,7 +479,7 @@ output_51 (operands, insn) } static char * -output_52 (operands, insn) +output_57 (operands, insn) rtx *operands; rtx insn; { @@ -503,7 +506,15 @@ output_52 (operands, insn) } static char * -output_53 (operands, insn) +output_58 (operands, insn) + rtx *operands; + rtx insn; +{ + return AS1 (push%W0,%1); +} + +static char * +output_59 (operands, insn) rtx *operands; rtx insn; { @@ -515,7 +526,19 @@ output_53 (operands, insn) } static char * -output_54 (operands, insn) +output_60 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + operands[1] = gen_rtx (REG, HImode, REGNO (operands[1])); + return AS1 (push%W0,%1); +} +} + +static char * +output_62 (operands, insn) rtx *operands; rtx insn; { @@ -546,7 +569,7 @@ output_54 (operands, insn) } static char * -output_55 (operands, insn) +output_64 (operands, insn) rtx *operands; rtx insn; { @@ -580,7 +603,7 @@ output_55 (operands, insn) } static char * -output_56 (operands, insn) +output_66 (operands, insn) rtx *operands; rtx insn; { @@ -610,7 +633,57 @@ output_56 (operands, insn) } static char * -output_57 (operands, insn) +output_67 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + if (! STACK_TOP_P (operands[1])) + abort (); + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (4); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + + if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fstp%S0,%0), xops); + else + output_asm_insn (AS1 (fst%S0,%0), xops); + RET; + } + + else if (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != REG) + return AS1 (push%L1,%1); + + else + { + output_asm_insn (AS2 (mov%L2,%1,%2), operands); + return AS1 (push%L2,%2); + } +} +} + +static char * +output_68 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + output_asm_insn (AS2 (mov%L2,%1,%2), operands); + return AS2 (mov%L0,%2,%0); +} +} + +static char * +output_69 (operands, insn) rtx *operands; rtx insn; { @@ -655,19 +728,33 @@ output_57 (operands, insn) /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all SFmode moves not involving the 387 */ - return (char *) singlemove_string (operands); + return singlemove_string (operands); } } static char * -output_58 (operands, insn) +output_70 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); +} +} + +static char * +output_72 (operands, insn) rtx *operands; rtx insn; { @@ -691,26 +778,53 @@ output_58 (operands, insn) RET; } else - return (char *) output_move_double (operands); + return output_move_double (operands); } } static char * -output_59 (operands, insn) +output_73 (operands, insn) rtx *operands; rtx insn; { { - if (STACK_TOP_P (operands[0])) - return AS1 (fxch,%1); + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (8); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + + if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fstp%Q0,%0), xops); + else + output_asm_insn (AS1 (fst%Q0,%0), xops); + + RET; + } + + else if (GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + else - return AS1 (fxch,%0); + return output_move_pushmem (operands, insn, GET_MODE_SIZE (DFmode), 2, 4); } } static char * -output_60 (operands, insn) +output_74 (operands, insn) + rtx *operands; + rtx insn; +{ + return output_move_memory (operands, insn, GET_MODE_SIZE (DFmode), 2, 4); +} + +static char * +output_75 (operands, insn) rtx *operands; rtx insn; { @@ -755,19 +869,33 @@ output_60 (operands, insn) /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all DFmode moves not involving the 387 */ - return (char *) output_move_double (operands); + return output_move_double (operands); } } static char * -output_61 (operands, insn) +output_76 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); +} +} + +static char * +output_78 (operands, insn) rtx *operands; rtx insn; { @@ -789,26 +917,52 @@ output_61 (operands, insn) RET; } else - return (char *) output_move_double (operands); + return output_move_double (operands); } } static char * -output_62 (operands, insn) +output_79 (operands, insn) rtx *operands; rtx insn; { { - if (STACK_TOP_P (operands[0])) - return AS1 (fxch,%1); + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (12); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + output_asm_insn (AS1 (fstp%T0,%0), xops); + if (! find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fld%T0,%0), xops); + + RET; + } + + else if (GET_CODE (operands[1]) != MEM + || GET_CODE (operands[2]) != REG) + return output_move_double (operands); + else - return AS1 (fxch,%0); + return output_move_pushmem (operands, insn, GET_MODE_SIZE (XFmode), 2, 4); +} } + +static char * +output_80 (operands, insn) + rtx *operands; + rtx insn; +{ + return output_move_memory (operands, insn, GET_MODE_SIZE (XFmode), 2, 4); } static char * -output_63 (operands, insn) +output_81 (operands, insn) rtx *operands; rtx insn; { @@ -854,47 +1008,70 @@ output_63 (operands, insn) /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all XFmode moves not involving the 387 */ - return (char *) output_move_double (operands); + return output_move_double (operands); } } static char * -output_64 (operands, insn) +output_82 (operands, insn) rtx *operands; rtx insn; { { - return (char *) output_move_double (operands); + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); } } static char * -output_65 (operands, insn) +output_83 (operands, insn) rtx *operands; rtx insn; { { - return (char *) output_move_double (operands); + if (GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + + else + return output_move_pushmem (operands, insn, GET_MODE_SIZE (DImode), 2, 4); } } static char * -output_66 (operands, insn) +output_84 (operands, insn) rtx *operands; rtx insn; { { - if ((TARGET_486 || REGNO (operands[0]) == 0) + rtx low[2], high[2], xop[6]; + + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + else + return output_move_memory (operands, insn, GET_MODE_SIZE (DImode), 2, 4); +} +} + +static char * +output_85 (operands, insn) + rtx *operands; + rtx insn; +{ + +{ + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -913,13 +1090,13 @@ output_66 (operands, insn) } static char * -output_67 (operands, insn) +output_86 (operands, insn) rtx *operands; rtx insn; { { - if ((TARGET_486 || REGNO (operands[0]) == 0) + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -938,13 +1115,13 @@ output_67 (operands, insn) } static char * -output_68 (operands, insn) +output_87 (operands, insn) rtx *operands; rtx insn; { { - if ((TARGET_486 || REGNO (operands[0]) == 0) + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -963,7 +1140,7 @@ output_68 (operands, insn) } static char * -output_69 (operands, insn) +output_88 (operands, insn) rtx *operands; rtx insn; { @@ -975,7 +1152,7 @@ output_69 (operands, insn) } static char * -output_70 (operands, insn) +output_89 (operands, insn) rtx *operands; rtx insn; { @@ -1000,7 +1177,7 @@ output_70 (operands, insn) } static char * -output_71 (operands, insn) +output_90 (operands, insn) rtx *operands; rtx insn; { @@ -1023,7 +1200,7 @@ output_71 (operands, insn) } static char * -output_72 (operands, insn) +output_91 (operands, insn) rtx *operands; rtx insn; { @@ -1042,7 +1219,7 @@ output_72 (operands, insn) } static char * -output_73 (operands, insn) +output_92 (operands, insn) rtx *operands; rtx insn; { @@ -1057,7 +1234,7 @@ output_73 (operands, insn) } static char * -output_74 (operands, insn) +output_93 (operands, insn) rtx *operands; rtx insn; { @@ -1093,7 +1270,7 @@ output_74 (operands, insn) } static char * -output_75 (operands, insn) +output_94 (operands, insn) rtx *operands; rtx insn; { @@ -1129,7 +1306,7 @@ output_75 (operands, insn) } static char * -output_76 (operands, insn) +output_95 (operands, insn) rtx *operands; rtx insn; { @@ -1165,7 +1342,7 @@ output_76 (operands, insn) } static char * -output_78 (operands, insn) +output_97 (operands, insn) rtx *operands; rtx insn; { @@ -1191,7 +1368,7 @@ output_78 (operands, insn) } static char * -output_79 (operands, insn) +output_98 (operands, insn) rtx *operands; rtx insn; { @@ -1225,7 +1402,7 @@ output_79 (operands, insn) } static char * -output_80 (operands, insn) +output_99 (operands, insn) rtx *operands; rtx insn; { @@ -1259,55 +1436,55 @@ output_80 (operands, insn) } static char * -output_87 (operands, insn) +output_106 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_88 (operands, insn) +output_107 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_89 (operands, insn) +output_108 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_93 (operands, insn) +output_112 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_94 (operands, insn) +output_113 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_95 (operands, insn) +output_114 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_fix_trunc (insn, operands); + return output_fix_trunc (insn, operands); } static char * -output_102 (operands, insn) +output_121 (operands, insn) rtx *operands; rtx insn; { @@ -1326,7 +1503,7 @@ output_102 (operands, insn) } static char * -output_103 (operands, insn) +output_122 (operands, insn) rtx *operands; rtx insn; { @@ -1345,7 +1522,7 @@ output_103 (operands, insn) } static char * -output_104 (operands, insn) +output_123 (operands, insn) rtx *operands; rtx insn; { @@ -1364,7 +1541,7 @@ output_104 (operands, insn) } static char * -output_105 (operands, insn) +output_124 (operands, insn) rtx *operands; rtx insn; { @@ -1383,7 +1560,7 @@ output_105 (operands, insn) } static char * -output_106 (operands, insn) +output_125 (operands, insn) rtx *operands; rtx insn; { @@ -1402,7 +1579,7 @@ output_106 (operands, insn) } static char * -output_107 (operands, insn) +output_126 (operands, insn) rtx *operands; rtx insn; { @@ -1421,31 +1598,80 @@ output_107 (operands, insn) } static char * -output_108 (operands, insn) +output_127 (operands, insn) rtx *operands; rtx insn; { { - rtx low[3], high[3]; + rtx low[3], high[3], xops[7], temp; CC_STATUS_INIT; + if (rtx_equal_p (operands[0], operands[2])) + { + temp = operands[1]; + operands[1] = operands[2]; + operands[2] = temp; + } + split_di (operands, 3, low, high); + if (!rtx_equal_p (operands[0], operands[1])) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[1]; + xops[3] = low[1]; - if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + { + output_asm_insn (AS2 (mov%L1,%3,%1), xops); + output_asm_insn (AS2 (mov%L0,%2,%0), xops); + } + else + { + xops[4] = high[2]; + xops[5] = low[2]; + xops[6] = operands[3]; + output_asm_insn (AS2 (mov%L6,%3,%6), xops); + output_asm_insn (AS2 (add%L6,%5,%6), xops); + output_asm_insn (AS2 (mov%L1,%6,%1), xops); + output_asm_insn (AS2 (mov%L6,%2,%6), xops); + output_asm_insn (AS2 (adc%L6,%4,%6), xops); + output_asm_insn (AS2 (mov%L0,%6,%0), xops); + RET; + } + } + + if (GET_CODE (operands[3]) == REG && GET_CODE (operands[2]) != REG) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[2]; + xops[3] = low[2]; + xops[4] = operands[3]; + + output_asm_insn (AS2 (mov%L4,%3,%4), xops); + output_asm_insn (AS2 (add%L1,%4,%1), xops); + output_asm_insn (AS2 (mov%L4,%2,%4), xops); + output_asm_insn (AS2 (adc%L0,%4,%0), xops); + } + + else if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) { output_asm_insn (AS2 (add%L0,%2,%0), low); output_asm_insn (AS2 (adc%L0,%2,%0), high); } + else output_asm_insn (AS2 (add%L0,%2,%0), high); + RET; } } static char * -output_109 (operands, insn) +output_128 (operands, insn) rtx *operands; rtx insn; { @@ -1456,23 +1682,20 @@ output_109 (operands, insn) if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2])) return AS2 (add%L0,%1,%0); - if (! TARGET_486 || ! REG_P (operands[2])) - { - CC_STATUS_INIT; + if (operands[2] == stack_pointer_rtx) + { + rtx temp; - if (operands[2] == stack_pointer_rtx) - { - rtx temp; + temp = operands[1]; + operands[1] = operands[2]; + operands[2] = temp; + } - temp = operands[1]; - operands[1] = operands[2]; - operands[2] = temp; - } - if (operands[2] != stack_pointer_rtx) - { - operands[1] = SET_SRC (PATTERN (insn)); - return AS2 (lea%L0,%a1,%0); - } + if (operands[2] != stack_pointer_rtx) + { + CC_STATUS_INIT; + operands[1] = SET_SRC (PATTERN (insn)); + return AS2 (lea%L0,%a1,%0); } output_asm_insn (AS2 (mov%L0,%1,%0), operands); @@ -1489,7 +1712,7 @@ output_109 (operands, insn) } static char * -output_110 (operands, insn) +output_129 (operands, insn) rtx *operands; rtx insn; { @@ -1525,7 +1748,7 @@ output_110 (operands, insn) } static char * -output_111 (operands, insn) +output_130 (operands, insn) rtx *operands; rtx insn; { @@ -1544,7 +1767,7 @@ output_111 (operands, insn) } static char * -output_112 (operands, insn) +output_131 (operands, insn) rtx *operands; rtx insn; { @@ -1572,23 +1795,65 @@ output_112 (operands, insn) } static char * -output_116 (operands, insn) +output_135 (operands, insn) rtx *operands; rtx insn; { { - rtx low[3], high[3]; + rtx low[3], high[3], xops[7]; CC_STATUS_INIT; split_di (operands, 3, low, high); - if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) + if (!rtx_equal_p (operands[0], operands[1])) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[1]; + xops[3] = low[1]; + + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + { + output_asm_insn (AS2 (mov%L1,%3,%1), xops); + output_asm_insn (AS2 (mov%L0,%2,%0), xops); + } + else + { + xops[4] = high[2]; + xops[5] = low[2]; + xops[6] = operands[3]; + output_asm_insn (AS2 (mov%L6,%3,%6), xops); + output_asm_insn (AS2 (sub%L6,%5,%6), xops); + output_asm_insn (AS2 (mov%L1,%6,%1), xops); + output_asm_insn (AS2 (mov%L6,%2,%6), xops); + output_asm_insn (AS2 (sbb%L6,%4,%6), xops); + output_asm_insn (AS2 (mov%L0,%6,%0), xops); + RET; + } + } + + if (GET_CODE (operands[3]) == REG) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[2]; + xops[3] = low[2]; + xops[4] = operands[3]; + + output_asm_insn (AS2 (mov%L4,%3,%4), xops); + output_asm_insn (AS2 (sub%L1,%4,%1), xops); + output_asm_insn (AS2 (mov%L4,%2,%4), xops); + output_asm_insn (AS2 (sbb%L0,%4,%0), xops); + } + + else if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) { output_asm_insn (AS2 (sub%L0,%2,%0), low); output_asm_insn (AS2 (sbb%L0,%2,%0), high); } + else output_asm_insn (AS2 (sub%L0,%2,%0), high); @@ -1597,7 +1862,7 @@ output_116 (operands, insn) } static char * -output_117 (operands, insn) +output_136 (operands, insn) rtx *operands; rtx insn; { @@ -1605,7 +1870,7 @@ output_117 (operands, insn) } static char * -output_118 (operands, insn) +output_137 (operands, insn) rtx *operands; rtx insn; { @@ -1613,7 +1878,7 @@ output_118 (operands, insn) } static char * -output_119 (operands, insn) +output_138 (operands, insn) rtx *operands; rtx insn; { @@ -1621,7 +1886,7 @@ output_119 (operands, insn) } static char * -output_123 (operands, insn) +output_142 (operands, insn) rtx *operands; rtx insn; { @@ -1629,7 +1894,7 @@ output_123 (operands, insn) } static char * -output_124 (operands, insn) +output_143 (operands, insn) rtx *operands; rtx insn; { @@ -1645,7 +1910,7 @@ output_124 (operands, insn) } static char * -output_125 (operands, insn) +output_144 (operands, insn) rtx *operands; rtx insn; { @@ -1653,7 +1918,7 @@ output_125 (operands, insn) } static char * -output_126 (operands, insn) +output_145 (operands, insn) rtx *operands; rtx insn; { @@ -1669,7 +1934,7 @@ output_126 (operands, insn) } static char * -output_139 (operands, insn) +output_160 (operands, insn) rtx *operands; rtx insn; { @@ -1685,7 +1950,7 @@ output_139 (operands, insn) } static char * -output_141 (operands, insn) +output_162 (operands, insn) rtx *operands; rtx insn; { @@ -1697,7 +1962,7 @@ output_141 (operands, insn) } static char * -output_142 (operands, insn) +output_163 (operands, insn) rtx *operands; rtx insn; { @@ -1709,7 +1974,7 @@ output_142 (operands, insn) } static char * -output_143 (operands, insn) +output_164 (operands, insn) rtx *operands; rtx insn; { @@ -1721,7 +1986,7 @@ output_143 (operands, insn) if (INTVAL (operands[2]) == 0xffff && REG_P (operands[0]) && (! REG_P (operands[1]) || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0) - && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1]))) + && (TARGET_386 || ! rtx_equal_p (operands[0], operands[1]))) { /* ??? tege: Should forget CC_STATUS only if we clobber a remembered operand. Fix that later. */ @@ -1737,7 +2002,7 @@ output_143 (operands, insn) && !(REG_P (operands[1]) && NON_QI_REG_P (operands[1])) && (! REG_P (operands[1]) || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0) - && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1]))) + && (TARGET_386 || ! rtx_equal_p (operands[0], operands[1]))) { /* ??? tege: Should forget CC_STATUS only if we clobber a remembered operand. Fix that later. */ @@ -1789,7 +2054,7 @@ output_143 (operands, insn) } static char * -output_144 (operands, insn) +output_165 (operands, insn) rtx *operands; rtx insn; { @@ -1836,7 +2101,7 @@ output_144 (operands, insn) } static char * -output_145 (operands, insn) +output_166 (operands, insn) rtx *operands; rtx insn; { @@ -1844,7 +2109,7 @@ output_145 (operands, insn) } static char * -output_146 (operands, insn) +output_167 (operands, insn) rtx *operands; rtx insn; { @@ -1881,7 +2146,7 @@ output_146 (operands, insn) } static char * -output_147 (operands, insn) +output_168 (operands, insn) rtx *operands; rtx insn; { @@ -1924,7 +2189,7 @@ output_147 (operands, insn) } static char * -output_148 (operands, insn) +output_169 (operands, insn) rtx *operands; rtx insn; { @@ -1932,7 +2197,7 @@ output_148 (operands, insn) } static char * -output_149 (operands, insn) +output_170 (operands, insn) rtx *operands; rtx insn; { @@ -1969,7 +2234,7 @@ output_149 (operands, insn) } static char * -output_150 (operands, insn) +output_171 (operands, insn) rtx *operands; rtx insn; { @@ -2012,7 +2277,7 @@ output_150 (operands, insn) } static char * -output_151 (operands, insn) +output_172 (operands, insn) rtx *operands; rtx insn; { @@ -2020,7 +2285,7 @@ output_151 (operands, insn) } static char * -output_152 (operands, insn) +output_173 (operands, insn) rtx *operands; rtx insn; { @@ -2042,7 +2307,7 @@ output_152 (operands, insn) } static char * -output_182 (operands, insn) +output_203 (operands, insn) rtx *operands; rtx insn; { @@ -2079,7 +2344,7 @@ output_182 (operands, insn) } static char * -output_183 (operands, insn) +output_204 (operands, insn) rtx *operands; rtx insn; { @@ -2114,7 +2379,7 @@ output_183 (operands, insn) } static char * -output_184 (operands, insn) +output_205 (operands, insn) rtx *operands; rtx insn; { @@ -2122,7 +2387,7 @@ output_184 (operands, insn) { if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1])) { - if (TARGET_486 && INTVAL (operands[2]) == 1) + if (!TARGET_386 && INTVAL (operands[2]) == 1) { output_asm_insn (AS2 (mov%L0,%1,%0), operands); return AS2 (add%L0,%1,%0); @@ -2153,7 +2418,7 @@ output_184 (operands, insn) } static char * -output_185 (operands, insn) +output_206 (operands, insn) rtx *operands; rtx insn; { @@ -2170,7 +2435,7 @@ output_185 (operands, insn) } static char * -output_186 (operands, insn) +output_207 (operands, insn) rtx *operands; rtx insn; { @@ -2187,7 +2452,7 @@ output_186 (operands, insn) } static char * -output_188 (operands, insn) +output_209 (operands, insn) rtx *operands; rtx insn; { @@ -2226,7 +2491,7 @@ output_188 (operands, insn) } static char * -output_189 (operands, insn) +output_210 (operands, insn) rtx *operands; rtx insn; { @@ -2261,7 +2526,7 @@ output_189 (operands, insn) } static char * -output_190 (operands, insn) +output_211 (operands, insn) rtx *operands; rtx insn; { @@ -2275,7 +2540,7 @@ output_190 (operands, insn) } static char * -output_191 (operands, insn) +output_212 (operands, insn) rtx *operands; rtx insn; { @@ -2289,7 +2554,7 @@ output_191 (operands, insn) } static char * -output_192 (operands, insn) +output_213 (operands, insn) rtx *operands; rtx insn; { @@ -2303,7 +2568,7 @@ output_192 (operands, insn) } static char * -output_194 (operands, insn) +output_215 (operands, insn) rtx *operands; rtx insn; { @@ -2341,7 +2606,7 @@ output_194 (operands, insn) } static char * -output_195 (operands, insn) +output_216 (operands, insn) rtx *operands; rtx insn; { @@ -2376,7 +2641,7 @@ output_195 (operands, insn) } static char * -output_196 (operands, insn) +output_217 (operands, insn) rtx *operands; rtx insn; { @@ -2390,7 +2655,7 @@ output_196 (operands, insn) } static char * -output_197 (operands, insn) +output_218 (operands, insn) rtx *operands; rtx insn; { @@ -2404,7 +2669,7 @@ output_197 (operands, insn) } static char * -output_198 (operands, insn) +output_219 (operands, insn) rtx *operands; rtx insn; { @@ -2418,7 +2683,7 @@ output_198 (operands, insn) } static char * -output_199 (operands, insn) +output_220 (operands, insn) rtx *operands; rtx insn; { @@ -2432,7 +2697,7 @@ output_199 (operands, insn) } static char * -output_200 (operands, insn) +output_221 (operands, insn) rtx *operands; rtx insn; { @@ -2446,7 +2711,7 @@ output_200 (operands, insn) } static char * -output_201 (operands, insn) +output_222 (operands, insn) rtx *operands; rtx insn; { @@ -2460,7 +2725,7 @@ output_201 (operands, insn) } static char * -output_202 (operands, insn) +output_223 (operands, insn) rtx *operands; rtx insn; { @@ -2474,7 +2739,7 @@ output_202 (operands, insn) } static char * -output_203 (operands, insn) +output_224 (operands, insn) rtx *operands; rtx insn; { @@ -2488,7 +2753,7 @@ output_203 (operands, insn) } static char * -output_204 (operands, insn) +output_225 (operands, insn) rtx *operands; rtx insn; { @@ -2502,7 +2767,7 @@ output_204 (operands, insn) } static char * -output_205 (operands, insn) +output_226 (operands, insn) rtx *operands; rtx insn; { @@ -2518,7 +2783,7 @@ output_205 (operands, insn) } static char * -output_206 (operands, insn) +output_227 (operands, insn) rtx *operands; rtx insn; { @@ -2531,7 +2796,7 @@ output_206 (operands, insn) } static char * -output_207 (operands, insn) +output_228 (operands, insn) rtx *operands; rtx insn; { @@ -2544,7 +2809,7 @@ output_207 (operands, insn) } static char * -output_208 (operands, insn) +output_229 (operands, insn) rtx *operands; rtx insn; { @@ -2556,7 +2821,7 @@ output_208 (operands, insn) } static char * -output_209 (operands, insn) +output_230 (operands, insn) rtx *operands; rtx insn; { @@ -2588,7 +2853,7 @@ output_209 (operands, insn) } static char * -output_210 (operands, insn) +output_231 (operands, insn) rtx *operands; rtx insn; { @@ -2646,7 +2911,7 @@ output_210 (operands, insn) } static char * -output_212 (operands, insn) +output_233 (operands, insn) rtx *operands; rtx insn; { @@ -2660,7 +2925,7 @@ output_212 (operands, insn) } static char * -output_214 (operands, insn) +output_235 (operands, insn) rtx *operands; rtx insn; { @@ -2675,7 +2940,7 @@ output_214 (operands, insn) } static char * -output_216 (operands, insn) +output_237 (operands, insn) rtx *operands; rtx insn; { @@ -2689,7 +2954,7 @@ output_216 (operands, insn) } static char * -output_218 (operands, insn) +output_239 (operands, insn) rtx *operands; rtx insn; { @@ -2697,7 +2962,7 @@ output_218 (operands, insn) } static char * -output_220 (operands, insn) +output_241 (operands, insn) rtx *operands; rtx insn; { @@ -2711,7 +2976,7 @@ output_220 (operands, insn) } static char * -output_222 (operands, insn) +output_243 (operands, insn) rtx *operands; rtx insn; { @@ -2719,7 +2984,7 @@ output_222 (operands, insn) } static char * -output_224 (operands, insn) +output_245 (operands, insn) rtx *operands; rtx insn; { @@ -2733,7 +2998,7 @@ output_224 (operands, insn) } static char * -output_226 (operands, insn) +output_247 (operands, insn) rtx *operands; rtx insn; { @@ -2741,7 +3006,7 @@ output_226 (operands, insn) } static char * -output_228 (operands, insn) +output_249 (operands, insn) rtx *operands; rtx insn; { @@ -2755,7 +3020,7 @@ output_228 (operands, insn) } static char * -output_230 (operands, insn) +output_251 (operands, insn) rtx *operands; rtx insn; { @@ -2763,7 +3028,7 @@ output_230 (operands, insn) } static char * -output_232 (operands, insn) +output_253 (operands, insn) rtx *operands; rtx insn; { @@ -2777,7 +3042,7 @@ output_232 (operands, insn) } static char * -output_234 (operands, insn) +output_255 (operands, insn) rtx *operands; rtx insn; { @@ -2791,7 +3056,7 @@ output_234 (operands, insn) } static char * -output_236 (operands, insn) +output_257 (operands, insn) rtx *operands; rtx insn; { @@ -2805,7 +3070,7 @@ output_236 (operands, insn) } static char * -output_240 (operands, insn) +output_261 (operands, insn) rtx *operands; rtx insn; { @@ -2819,7 +3084,7 @@ output_240 (operands, insn) } static char * -output_244 (operands, insn) +output_265 (operands, insn) rtx *operands; rtx insn; { @@ -2833,7 +3098,7 @@ output_244 (operands, insn) } static char * -output_248 (operands, insn) +output_269 (operands, insn) rtx *operands; rtx insn; { @@ -2847,7 +3112,7 @@ output_248 (operands, insn) } static char * -output_251 (operands, insn) +output_272 (operands, insn) rtx *operands; rtx insn; { @@ -2861,7 +3126,7 @@ output_251 (operands, insn) } static char * -output_252 (operands, insn) +output_273 (operands, insn) rtx *operands; rtx insn; { @@ -2875,7 +3140,7 @@ output_252 (operands, insn) } static char * -output_253 (operands, insn) +output_274 (operands, insn) rtx *operands; rtx insn; { @@ -2889,7 +3154,7 @@ output_253 (operands, insn) } static char * -output_255 (operands, insn) +output_276 (operands, insn) rtx *operands; rtx insn; { @@ -2903,7 +3168,7 @@ output_255 (operands, insn) } static char * -output_257 (operands, insn) +output_278 (operands, insn) rtx *operands; rtx insn; { @@ -2917,7 +3182,7 @@ output_257 (operands, insn) } static char * -output_259 (operands, insn) +output_280 (operands, insn) rtx *operands; rtx insn; { @@ -2931,7 +3196,7 @@ output_259 (operands, insn) } static char * -output_262 (operands, insn) +output_283 (operands, insn) rtx *operands; rtx insn; { @@ -2944,7 +3209,7 @@ output_262 (operands, insn) } static char * -output_264 (operands, insn) +output_285 (operands, insn) rtx *operands; rtx insn; { @@ -2966,7 +3231,7 @@ output_264 (operands, insn) } static char * -output_265 (operands, insn) +output_286 (operands, insn) rtx *operands; rtx insn; { @@ -2979,7 +3244,7 @@ output_265 (operands, insn) } static char * -output_267 (operands, insn) +output_288 (operands, insn) rtx *operands; rtx insn; { @@ -2997,7 +3262,7 @@ output_267 (operands, insn) } static char * -output_270 (operands, insn) +output_291 (operands, insn) rtx *operands; rtx insn; { @@ -3015,7 +3280,7 @@ output_270 (operands, insn) } static char * -output_273 (operands, insn) +output_294 (operands, insn) rtx *operands; rtx insn; { @@ -3035,7 +3300,7 @@ output_273 (operands, insn) } static char * -output_276 (operands, insn) +output_297 (operands, insn) rtx *operands; rtx insn; { @@ -3055,60 +3320,7 @@ output_276 (operands, insn) } static char * -output_279 (operands, insn) - rtx *operands; - rtx insn; -{ - -{ - rtx addr = operands[1]; - - if (GET_CODE (operands[0]) == MEM - && ! CONSTANT_ADDRESS_P (XEXP (operands[0], 0))) - { - operands[0] = XEXP (operands[0], 0); - output_asm_insn (AS1 (call,%*%0), operands); - } - else - output_asm_insn (AS1 (call,%P0), operands); - - operands[2] = gen_rtx (REG, SImode, 0); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[2] = gen_rtx (REG, SImode, 1); - operands[1] = adj_offsettable_operand (addr, 4); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[1] = adj_offsettable_operand (addr, 8); - return AS1 (fnsave,%1); -} -} - -static char * -output_280 (operands, insn) - rtx *operands; - rtx insn; -{ - -{ - rtx addr = operands[1]; - - output_asm_insn (AS1 (call,%P0), operands); - - operands[2] = gen_rtx (REG, SImode, 0); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[2] = gen_rtx (REG, SImode, 1); - operands[1] = adj_offsettable_operand (addr, 4); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[1] = adj_offsettable_operand (addr, 8); - return AS1 (fnsave,%1); -} -} - -static char * -output_283 (operands, insn) +output_301 (operands, insn) rtx *operands; rtx insn; { @@ -3120,7 +3332,7 @@ output_283 (operands, insn) } static char * -output_286 (operands, insn) +output_304 (operands, insn) rtx *operands; rtx insn; { @@ -3155,7 +3367,7 @@ output_286 (operands, insn) } static char * -output_288 (operands, insn) +output_306 (operands, insn) rtx *operands; rtx insn; { @@ -3187,7 +3399,7 @@ output_288 (operands, insn) } static char * -output_289 (operands, insn) +output_307 (operands, insn) rtx *operands; rtx insn; { @@ -3207,7 +3419,7 @@ output_289 (operands, insn) } static char * -output_291 (operands, insn) +output_309 (operands, insn) rtx *operands; rtx insn; { @@ -3246,7 +3458,7 @@ output_291 (operands, insn) } static char * -output_293 (operands, insn) +output_311 (operands, insn) rtx *operands; rtx insn; { @@ -3284,111 +3496,111 @@ output_293 (operands, insn) } static char * -output_294 (operands, insn) +output_312 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_295 (operands, insn) +output_313 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_296 (operands, insn) +output_314 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_297 (operands, insn) +output_315 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_298 (operands, insn) +output_316 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_299 (operands, insn) +output_317 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_300 (operands, insn) +output_318 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_301 (operands, insn) +output_319 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_302 (operands, insn) +output_320 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_303 (operands, insn) +output_321 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_304 (operands, insn) +output_322 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_305 (operands, insn) +output_323 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_306 (operands, insn) +output_324 (operands, insn) rtx *operands; rtx insn; { - return (char *) output_387_binary_op (insn, operands); + return output_387_binary_op (insn, operands); } static char * -output_308 (operands, insn) +output_326 (operands, insn) rtx *operands; rtx insn; { @@ -3454,9 +3666,28 @@ char * const insn_template[] = 0, "push%L0 %1", "push%L0 %1", + "push%L0 %1", 0, 0, "push%W0 %1", + "push%W0 %1", + "push%W0 %1", + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 0, 0, @@ -3537,6 +3768,8 @@ char * const insn_template[] = "imul%B0 %2", "mul%L0 %2", "imul%L0 %2", + "mul%L0 %2", + "imul%L0 %2", 0, 0, 0, @@ -3685,10 +3918,7 @@ char * const insn_template[] = 0, "call %P1", 0, - 0, - 0, - 0, - "frstor %0", + "", 0, "nop", 0, @@ -3768,29 +3998,29 @@ char *(*const insn_outfun[])() = 0, 0, 0, - output_49, 0, - output_51, - output_52, - output_53, - output_54, + output_50, + 0, + 0, + 0, + 0, output_55, - output_56, + 0, output_57, output_58, output_59, output_60, - output_61, + 0, output_62, - output_63, + 0, output_64, - output_65, + 0, output_66, output_67, output_68, output_69, output_70, - output_71, + 0, output_72, output_73, output_74, @@ -3800,55 +4030,72 @@ char *(*const insn_outfun[])() = output_78, output_79, output_80, - 0, - 0, - 0, - 0, - 0, - 0, + output_81, + output_82, + output_83, + output_84, + output_85, + output_86, output_87, output_88, output_89, - 0, - 0, - 0, + output_90, + output_91, + output_92, output_93, output_94, output_95, 0, + output_97, + output_98, + output_99, + 0, 0, 0, 0, 0, 0, - output_102, - output_103, - output_104, - output_105, output_106, output_107, output_108, - output_109, - output_110, - output_111, + 0, + 0, + 0, output_112, + output_113, + output_114, 0, 0, 0, - output_116, - output_117, - output_118, - output_119, 0, 0, 0, + output_121, + output_122, output_123, output_124, output_125, output_126, + output_127, + output_128, + output_129, + output_130, + output_131, 0, 0, 0, + output_135, + output_136, + output_137, + output_138, + 0, + 0, + 0, + output_142, + output_143, + output_144, + output_145, + 0, 0, 0, 0, @@ -3858,23 +4105,25 @@ char *(*const insn_outfun[])() = 0, 0, 0, - output_139, 0, - output_141, - output_142, - output_143, - output_144, - output_145, - output_146, - output_147, - output_148, - output_149, - output_150, - output_151, - output_152, 0, 0, 0, + output_160, + 0, + output_162, + output_163, + output_164, + output_165, + output_166, + output_167, + output_168, + output_169, + output_170, + output_171, + output_172, + output_173, + 0, 0, 0, 0, @@ -3901,133 +4150,132 @@ char *(*const insn_outfun[])() = 0, 0, 0, - output_182, - output_183, - output_184, - output_185, - output_186, 0, - output_188, - output_189, - output_190, - output_191, - output_192, 0, - output_194, - output_195, - output_196, - output_197, - output_198, - output_199, - output_200, - output_201, - output_202, output_203, output_204, output_205, output_206, output_207, - output_208, + 0, output_209, output_210, - 0, + output_211, output_212, + output_213, 0, - output_214, - 0, + output_215, output_216, - 0, + output_217, output_218, - 0, + output_219, output_220, - 0, + output_221, output_222, - 0, + output_223, output_224, - 0, + output_225, output_226, - 0, + output_227, output_228, - 0, + output_229, output_230, + output_231, 0, - output_232, - 0, - output_234, - 0, - output_236, - 0, + output_233, 0, + output_235, 0, - output_240, + output_237, 0, + output_239, 0, + output_241, 0, - output_244, + output_243, 0, + output_245, 0, + output_247, 0, - output_248, - 0, + output_249, 0, output_251, - output_252, + 0, output_253, 0, output_255, 0, output_257, 0, - output_259, 0, 0, - output_262, + output_261, + 0, + 0, 0, - output_264, output_265, 0, - output_267, 0, 0, - output_270, + output_269, 0, 0, + output_272, output_273, - 0, + output_274, 0, output_276, 0, + output_278, 0, - output_279, output_280, 0, 0, output_283, 0, - 0, + output_285, output_286, 0, output_288, - output_289, + 0, 0, output_291, 0, - output_293, + 0, output_294, - output_295, - output_296, + 0, + 0, output_297, - output_298, - output_299, - output_300, + 0, + 0, + 0, output_301, - output_302, - output_303, + 0, + 0, output_304, - output_305, - output_306, 0, - output_308, + output_306, + output_307, + 0, + output_309, + 0, + output_311, + output_312, + output_313, + output_314, + output_315, + output_316, + output_317, + output_318, + output_319, + output_320, + output_321, + output_322, + output_323, + output_324, + 0, + output_326, }; rtx (*const insn_gen_function[]) () = @@ -4080,22 +4328,41 @@ rtx (*const insn_gen_function[]) () = 0, 0, 0, + 0, gen_movsi, 0, 0, + 0, + 0, gen_movhi, + 0, gen_movstricthi, 0, + 0, + 0, + 0, gen_movqi, + 0, gen_movstrictqi, 0, gen_movsf, - 0, - gen_swapdf, + gen_movsf_push_nomove, + gen_movsf_push, + gen_movsf_mem, + gen_movsf_normal, + gen_swapsf, gen_movdf, - 0, - gen_swapxf, + gen_movdf_push_nomove, + gen_movdf_push, + gen_movdf_mem, + gen_movdf_normal, + gen_swapdf, gen_movxf, + gen_movxf_push_nomove, + gen_movxf_push, + gen_movxf_mem, + gen_movxf_normal, + gen_swapxf, 0, gen_movdi, gen_zero_extendhisi2, @@ -4144,7 +4411,7 @@ rtx (*const insn_gen_function[]) () = gen_addsi3, gen_addhi3, gen_addqi3, - 0, + gen_movsi_lea, gen_addxf3, gen_adddf3, gen_addsf3, @@ -4163,6 +4430,8 @@ rtx (*const insn_gen_function[]) () = gen_mulqihi3, gen_umulsidi3, gen_mulsidi3, + gen_umulsi3_highpart, + gen_smulsi3_highpart, gen_mulxf3, gen_muldf3, gen_mulsf3, @@ -4311,10 +4580,7 @@ rtx (*const insn_gen_function[]) () = 0, 0, gen_untyped_call, - 0, - 0, - gen_untyped_return, - gen_update_return, + gen_blockage, gen_return, gen_nop, gen_movstrsi, @@ -4391,25 +4657,44 @@ char *insn_name[] = "cmpsf_ccfpeq+1", "cmpsf_ccfpeq+2", "cmpsf_ccfpeq+3", + "movsi-3", "movsi-2", "movsi-1", "movsi", "movsi+1", + "movsi+2", + "movhi-2", "movhi-1", "movhi", + "movhi+1", "movstricthi", "movstricthi+1", + "movstricthi+2", + "movqi-2", + "movqi-1", "movqi", + "movqi+1", "movstrictqi", "movstrictqi+1", "movsf", - "movsf+1", - "swapdf", + "movsf_push_nomove", + "movsf_push", + "movsf_mem", + "movsf_normal", + "swapsf", "movdf", - "movdf+1", - "swapxf", + "movdf_push_nomove", + "movdf_push", + "movdf_mem", + "movdf_normal", + "swapdf", "movxf", - "movxf+1", + "movxf_push_nomove", + "movxf_push", + "movxf_mem", + "movxf_normal", + "swapxf", + "swapxf+1", "movdi", "zero_extendhisi2", "zero_extendqihi2", @@ -4457,7 +4742,7 @@ char *insn_name[] = "addsi3", "addhi3", "addqi3", - "addqi3+1", + "movsi_lea", "addxf3", "adddf3", "addsf3", @@ -4476,6 +4761,8 @@ char *insn_name[] = "mulqihi3", "umulsidi3", "mulsidi3", + "umulsi3_highpart", + "smulsi3_highpart", "mulxf3", "muldf3", "mulsf3", @@ -4624,10 +4911,7 @@ char *insn_name[] = "call_value+1", "untyped_call-1", "untyped_call", - "untyped_call+1", - "untyped_return-1", - "untyped_return", - "update_return", + "blockage", "return", "nop", "movstrsi", @@ -4726,6 +5010,25 @@ const int insn_n_operands[] = 2, 2, 2, + 3, + 3, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 4, + 2, 2, 2, 2, @@ -4767,7 +5070,7 @@ const int insn_n_operands[] = 2, 2, 2, - 3, + 4, 3, 3, 3, @@ -4775,6 +5078,7 @@ const int insn_n_operands[] = 3, 3, 3, + 4, 3, 3, 3, @@ -4789,7 +5093,8 @@ const int insn_n_operands[] = 3, 3, 3, - 3, + 4, + 4, 3, 3, 3, @@ -4938,10 +5243,7 @@ const int insn_n_operands[] = 3, 3, 3, - 3, - 3, - 2, - 1, + 0, 0, 0, 5, @@ -5031,15 +5333,34 @@ const int insn_n_dups[] = 0, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 2, 0, 0, + 0, + 0, + 0, 2, 0, 0, 0, 0, 0, + 2, + 0, + 0, + 0, + 0, 0, 0, 0, @@ -5111,6 +5432,8 @@ const int insn_n_dups[] = 0, 0, 0, + 0, + 0, 2, 2, 2, @@ -5254,9 +5577,6 @@ const int insn_n_dups[] = 0, 0, 0, - 0, - 0, - 0, 2, 2, 3, @@ -5333,24 +5653,43 @@ char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] = { "%qm", "qi", }, { "=<", "g", }, { "=<", "ri", }, + { "=<", "ri", }, { "", "", }, { "=g,r", "ri,m", }, { "=<", "g", }, + { "=<", "ri", }, + { "=<", "ri", }, + { "", "", }, { "=g,r", "ri,m", }, + { "", "", }, { "+g,r", "ri,m", }, + { "=<", "n", }, { "=<", "q", }, + { "=<", "q", }, + { "", "", }, { "=q,*r,qm", "*g,q,qn", }, + { "", "", }, { "+qm,q", "*qn,m", }, + { "", "", }, { "=<,<", "gF,f", }, + { "=<,<,<,<", "rF,f,m,m", "=X,X,r,X", }, + { "=m", "m", "=&r", }, { "=*rfm,*rf,f,!*rm", "*rf,*rfm,fG,fF", }, - { "=<,<", "gF,f", }, { "f", "f", }, - { "=*rfm,*rf,f,!*rm", "*rf,*rfm,fG,fF", }, + { "", "", }, { "=<,<", "gF,f", }, + { "=<,<,<,<,<", "rF,f,o,o,o", "=X,X,&r,&r,X", "=X,X,&r,X,X", }, + { "=o,o", "o,o", "=&r,&r", "=&r,X", }, + { "=f,fm,!*rf,!*rm", "fmG,f,*rfm,*rfF", }, { "f", "f", }, + { "", "", }, + { "=<,<", "gF,f", }, + { "=<,<,<,<,<", "rF,f,o,o,o", "=X,X,&r,&r,X", "=X,X,&r,X,X", }, + { "=o,o", "o,o", "=&r,&r", "=&r,X", }, { "=f,fm,!*rf,!*rm", "fmG,f,*rfm,*rfF", }, - { "=<", "roiF", }, - { "=r,rm", "m,riF", }, + { "f", "f", }, + { "=<,<,<,<", "riF,o,o,o", "=X,&r,&r,X", "=X,&r,X,X", }, + { "=o,o,r,rm", "o,o,m,riF", "=&r,&r,X,X", "=&r,X,X,X", }, { "=r", "rm", }, { "=r", "qm", }, { "=r", "qm", }, @@ -5393,7 +5732,7 @@ char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] = { "=f", "rm", }, { "=f,f", "m,!*r", }, { "=f", "rm", }, - { "=&r,ro", "%0,0", "o,riF", }, + { "=&r,ro,o,&r,ro,o,&r,o,o,o", "%0,0,0,o,riF,o,or,riF,riF,o", "o,riF,o,0,0,0,oriF,riF,o,o", "=X,X,&r,X,X,&r,X,X,&r,&r", }, { "=?r,rm,r", "%r,0,0", "ri,ri,rm", }, { "=rm,r", "%0,0", "ri,rm", }, { "=qm,q", "%0,0", "qn,qmn", }, @@ -5401,7 +5740,7 @@ char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] = { "", "", "", }, { "", "", "", }, { "", "", "", }, - { "=&r,ro", "0,0", "o,riF", }, + { "=&r,ro,&r,o,o", "0,0,roiF,riF,o", "o,riF,roiF,riF,o", "=X,X,X,X,&r", }, { "=rm,r", "0,0", "ri,rm", }, { "=rm,r", "0,0", "ri,rm", }, { "=qm,q", "0,0", "qn,qmn", }, @@ -5416,6 +5755,8 @@ char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] = { "=a", "%0", "qm", }, { "=A", "%0", "rm", }, { "=A", "%0", "rm", }, + { "=d", "%a", "rm", "=a", }, + { "=d", "%a", "rm", "=a", }, { "", "", "", }, { "", "", "", }, { "", "", "", }, @@ -5564,10 +5905,7 @@ char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] = { "=rf", "m", "g", }, { "=rf", "", "g", }, { "", "", "", }, - { "m", "o", "", }, - { "", "o", "", }, - { "", "", }, - { "m", }, + { 0 }, { 0 }, { 0 }, { "", "", "", "", "", }, @@ -5648,22 +5986,41 @@ const enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] = { SImode, SImode, }, { SImode, SImode, }, { SImode, SImode, }, + { SImode, SImode, }, + { HImode, HImode, }, { HImode, HImode, }, { HImode, HImode, }, { HImode, HImode, }, + { HImode, HImode, }, + { HImode, HImode, }, + { HImode, HImode, }, + { QImode, QImode, }, + { QImode, QImode, }, { QImode, QImode, }, { QImode, QImode, }, { QImode, QImode, }, + { QImode, QImode, }, + { QImode, QImode, }, + { SFmode, SFmode, }, { SFmode, SFmode, }, + { SFmode, SFmode, SImode, }, + { SFmode, SFmode, SImode, }, { SFmode, SFmode, }, + { SFmode, SFmode, }, + { DFmode, DFmode, }, { DFmode, DFmode, }, + { DFmode, DFmode, SImode, SImode, }, + { DFmode, DFmode, SImode, SImode, }, { DFmode, DFmode, }, { DFmode, DFmode, }, { XFmode, XFmode, }, { XFmode, XFmode, }, + { XFmode, XFmode, SImode, SImode, }, + { XFmode, XFmode, SImode, SImode, }, { XFmode, XFmode, }, - { DImode, DImode, }, - { DImode, DImode, }, + { XFmode, XFmode, }, + { DImode, DImode, SImode, SImode, }, + { DImode, DImode, SImode, SImode, }, { SImode, HImode, }, { HImode, QImode, }, { SImode, QImode, }, @@ -5706,7 +6063,7 @@ const enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] = { DFmode, SImode, }, { XFmode, SImode, }, { SFmode, SImode, }, - { DImode, DImode, DImode, }, + { DImode, DImode, DImode, SImode, }, { SImode, SImode, SImode, }, { HImode, HImode, HImode, }, { QImode, QImode, QImode, }, @@ -5714,7 +6071,7 @@ const enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] = { XFmode, XFmode, XFmode, }, { DFmode, DFmode, DFmode, }, { SFmode, SFmode, SFmode, }, - { DImode, DImode, DImode, }, + { DImode, DImode, DImode, SImode, }, { SImode, SImode, SImode, }, { HImode, HImode, HImode, }, { QImode, QImode, QImode, }, @@ -5729,6 +6086,8 @@ const enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] = { HImode, QImode, QImode, }, { DImode, SImode, SImode, }, { DImode, SImode, SImode, }, + { SImode, SImode, SImode, SImode, }, + { SImode, SImode, SImode, SImode, }, { XFmode, XFmode, XFmode, }, { DFmode, DFmode, DFmode, }, { SFmode, SFmode, SFmode, }, @@ -5876,11 +6235,8 @@ const enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] = { VOIDmode, QImode, SImode, }, { VOIDmode, QImode, SImode, }, { VOIDmode, SImode, SImode, }, - { QImode, BLKmode, VOIDmode, }, - { QImode, DImode, VOIDmode, }, - { SImode, DImode, VOIDmode, }, - { BLKmode, VOIDmode, }, - { SImode, }, + { VOIDmode, VOIDmode, VOIDmode, }, + { VOIDmode }, { VOIDmode }, { VOIDmode }, { BLKmode, BLKmode, SImode, SImode, SImode, }, @@ -5963,20 +6319,39 @@ const char insn_operand_strict_low[][MAX_RECOG_OPERANDS] = { 0, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, }, + { 0, 0, }, + { 0, 0, }, + { 0, 0, }, { 1, 0, }, + { 1, 0, }, + { 0, 0, }, + { 0, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, }, + { 1, 0, }, { 1, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, 0, }, + { 0, 0, 0, }, + { 0, 0, }, { 0, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, 0, 0, }, + { 0, 0, 0, 0, }, + { 0, 0, }, { 0, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, 0, 0, }, + { 0, 0, 0, 0, }, { 0, 0, }, { 0, 0, }, + { 0, 0, 0, 0, }, + { 0, 0, 0, 0, }, { 0, 0, }, { 0, 0, }, { 0, 0, }, @@ -6019,7 +6394,7 @@ const char insn_operand_strict_low[][MAX_RECOG_OPERANDS] = { 0, 0, }, { 0, 0, }, { 0, 0, }, - { 0, 0, 0, }, + { 0, 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, @@ -6027,6 +6402,7 @@ const char insn_operand_strict_low[][MAX_RECOG_OPERANDS] = { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, + { 0, 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, @@ -6041,7 +6417,8 @@ const char insn_operand_strict_low[][MAX_RECOG_OPERANDS] = { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, + { 0, 0, 0, 0, }, + { 0, 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, @@ -6190,10 +6567,7 @@ const char insn_operand_strict_low[][MAX_RECOG_OPERANDS] = { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, - { 0, 0, 0, }, - { 0, 0, }, - { 0, }, + { 0 }, { 0 }, { 0 }, { 0, 0, 0, 0, 0, }, @@ -6228,12 +6602,12 @@ extern int scratch_operand (); extern int general_operand (); extern int VOIDmode_compare_op (); extern int push_operand (); +extern int nonmemory_operand (); +extern int immediate_operand (); extern int memory_operand (); extern int address_operand (); -extern int nonmemory_operand (); extern int const_int_operand (); extern int indirect_operand (); -extern int immediate_operand (); extern int call_insn_operand (); extern int symbolic_operand (); extern int binary_387_op (); @@ -6287,25 +6661,44 @@ int (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() = { general_operand, general_operand, }, { general_operand, general_operand, }, { push_operand, general_operand, }, + { push_operand, nonmemory_operand, }, { push_operand, general_operand, }, { general_operand, general_operand, }, { general_operand, general_operand, }, { push_operand, general_operand, }, + { push_operand, nonmemory_operand, }, + { push_operand, general_operand, }, + { general_operand, general_operand, }, + { general_operand, general_operand, }, + { general_operand, general_operand, }, + { general_operand, general_operand, }, + { push_operand, immediate_operand, }, + { push_operand, nonimmediate_operand, }, + { push_operand, register_operand, }, { general_operand, general_operand, }, { general_operand, general_operand, }, - { push_operand, general_operand, }, { general_operand, general_operand, }, { general_operand, general_operand, }, - { push_operand, general_operand, }, { general_operand, general_operand, }, { push_operand, general_operand, }, + { push_operand, general_operand, scratch_operand, }, + { memory_operand, memory_operand, scratch_operand, }, + { general_operand, general_operand, }, { register_operand, register_operand, }, { general_operand, general_operand, }, { push_operand, general_operand, }, + { push_operand, general_operand, scratch_operand, scratch_operand, }, + { memory_operand, memory_operand, scratch_operand, scratch_operand, }, + { general_operand, general_operand, }, { register_operand, register_operand, }, { general_operand, general_operand, }, { push_operand, general_operand, }, + { push_operand, general_operand, scratch_operand, scratch_operand, }, + { memory_operand, memory_operand, scratch_operand, scratch_operand, }, { general_operand, general_operand, }, + { register_operand, register_operand, }, + { push_operand, general_operand, scratch_operand, scratch_operand, }, + { general_operand, general_operand, scratch_operand, scratch_operand, }, { general_operand, nonimmediate_operand, }, { general_operand, nonimmediate_operand, }, { general_operand, nonimmediate_operand, }, @@ -6348,7 +6741,7 @@ int (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() = { register_operand, nonimmediate_operand, }, { register_operand, general_operand, }, { register_operand, nonimmediate_operand, }, - { general_operand, general_operand, general_operand, }, + { general_operand, general_operand, general_operand, scratch_operand, }, { general_operand, general_operand, general_operand, }, { general_operand, general_operand, general_operand, }, { general_operand, general_operand, general_operand, }, @@ -6356,7 +6749,7 @@ int (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() = { register_operand, nonimmediate_operand, nonimmediate_operand, }, { register_operand, nonimmediate_operand, nonimmediate_operand, }, { register_operand, nonimmediate_operand, nonimmediate_operand, }, - { general_operand, general_operand, general_operand, }, + { general_operand, general_operand, general_operand, scratch_operand, }, { general_operand, general_operand, general_operand, }, { general_operand, general_operand, general_operand, }, { general_operand, general_operand, general_operand, }, @@ -6371,6 +6764,8 @@ int (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() = { general_operand, nonimmediate_operand, nonimmediate_operand, }, { register_operand, register_operand, nonimmediate_operand, }, { register_operand, register_operand, nonimmediate_operand, }, + { register_operand, register_operand, nonimmediate_operand, scratch_operand, }, + { register_operand, register_operand, nonimmediate_operand, scratch_operand, }, { register_operand, nonimmediate_operand, nonimmediate_operand, }, { register_operand, nonimmediate_operand, nonimmediate_operand, }, { register_operand, nonimmediate_operand, nonimmediate_operand, }, @@ -6518,11 +6913,8 @@ int (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() = { 0, indirect_operand, general_operand, }, { 0, call_insn_operand, general_operand, }, { 0, symbolic_operand, general_operand, }, - { indirect_operand, memory_operand, 0, }, - { call_insn_operand, memory_operand, 0, }, - { symbolic_operand, memory_operand, 0, }, - { memory_operand, 0, }, - { memory_operand, }, + { 0, 0, 0, }, + { 0 }, { 0 }, { 0 }, { memory_operand, memory_operand, const_int_operand, const_int_operand, scratch_operand, }, @@ -6601,24 +6993,43 @@ const int insn_n_alternatives[] = 1, 1, 1, + 1, 0, 2, 1, + 1, + 1, + 0, 2, + 0, 2, 1, + 1, + 1, + 0, 3, + 0, 2, + 0, 2, 4, - 2, 1, 4, - 2, 1, + 0, + 2, + 5, + 2, 4, 1, + 0, + 2, + 5, 2, + 4, + 1, + 4, + 4, 1, 1, 1, @@ -6661,7 +7072,7 @@ const int insn_n_alternatives[] = 1, 2, 1, - 2, + 10, 3, 2, 2, @@ -6669,7 +7080,7 @@ const int insn_n_alternatives[] = 0, 0, 0, - 2, + 5, 2, 2, 2, @@ -6684,6 +7095,8 @@ const int insn_n_alternatives[] = 1, 1, 1, + 1, + 1, 0, 0, 0, @@ -6832,10 +7245,7 @@ const int insn_n_alternatives[] = 1, 1, 0, - 1, - 1, 0, - 1, 0, 0, 0, diff --git a/gnu/usr.bin/cc/cc_int/insn-recog.c b/gnu/usr.bin/cc/cc_int/insn-recog.c index 293dd7e..c3406b7 100644 --- a/gnu/usr.bin/cc/cc_int/insn-recog.c +++ b/gnu/usr.bin/cc/cc_int/insn-recog.c @@ -58,99 +58,100 @@ recog_1 (x0, insn, pnum_clobbers) switch (GET_CODE (x1)) { case ZERO_EXTEND: - goto L370; + goto L474; case SIGN_EXTEND: - goto L390; + goto L494; case PLUS: - goto L603; + goto L715; case MINUS: - goto L626; + goto L746; case MULT: - goto L660; + goto L780; case AND: - goto L747; + goto L913; case IOR: - goto L762; + goto L928; case XOR: - goto L777; + goto L943; case NEG: - goto L795; + goto L961; case NOT: - goto L904; + goto L1070; case ASHIFT: - goto L930; + goto L1096; case ASHIFTRT: - goto L958; + goto L1124; case LSHIFTRT: - goto L986; + goto L1152; case ROTATE: - goto L1001; + goto L1167; case ROTATERT: - goto L1016; + goto L1182; } } if (general_operand (x1, HImode)) { ro[1] = x1; - return 51; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 55; + } goto ret0; - L370: + L474: x2 = XEXP (x1, 0); if (nonimmediate_operand (x2, QImode)) { ro[1] = x2; - return 67; + return 86; } goto ret0; - L390: + L494: x2 = XEXP (x1, 0); if (nonimmediate_operand (x2, QImode)) { ro[1] = x2; - return 72; + return 91; } goto ret0; - L603: + L715: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L604; + goto L716; } goto ret0; - L604: + L716: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) { ro[2] = x2; - return 110; + return 129; } goto ret0; - L626: + L746: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L627; + goto L747; } goto ret0; - L627: + L747: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) { ro[2] = x2; - return 118; + return 137; } goto ret0; - L660: + L780: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -158,239 +159,239 @@ recog_1 (x0, insn, pnum_clobbers) switch (GET_CODE (x2)) { case ZERO_EXTEND: - goto L661; + goto L781; case SIGN_EXTEND: - goto L668; + goto L788; } } if (general_operand (x2, HImode)) { ro[1] = x2; - goto L637; + goto L757; } goto ret0; - L661: + L781: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, QImode)) { ro[1] = x3; - goto L662; + goto L782; } goto ret0; - L662: + L782: x2 = XEXP (x1, 1); if (GET_MODE (x2) == HImode && GET_CODE (x2) == ZERO_EXTEND && 1) - goto L663; + goto L783; goto ret0; - L663: + L783: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, QImode)) { ro[2] = x3; - return 127; + return 146; } goto ret0; - L668: + L788: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, QImode)) { ro[1] = x3; - goto L669; + goto L789; } goto ret0; - L669: + L789: x2 = XEXP (x1, 1); if (GET_MODE (x2) == HImode && GET_CODE (x2) == SIGN_EXTEND && 1) - goto L670; + goto L790; goto ret0; - L670: + L790: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, QImode)) { ro[2] = x3; - return 128; + return 147; } goto ret0; - L637: + L757: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) - goto L643; + goto L763; goto ret0; - L643: + L763: ro[2] = x2; if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0x80) - return 123; - L644: + return 142; + L764: ro[2] = x2; - return 124; + return 143; - L747: + L913: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L748; + goto L914; } goto ret0; - L748: + L914: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) { ro[2] = x2; - return 144; + return 165; } goto ret0; - L762: + L928: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L763; + goto L929; } goto ret0; - L763: + L929: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) { ro[2] = x2; - return 147; + return 168; } goto ret0; - L777: + L943: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L778; + goto L944; } goto ret0; - L778: + L944: x2 = XEXP (x1, 1); if (general_operand (x2, HImode)) { ro[2] = x2; - return 150; + return 171; } goto ret0; - L795: + L961: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - return 154; + return 175; } goto ret0; - L904: + L1070: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - return 179; + return 200; } goto ret0; - L930: + L1096: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L931; + goto L1097; } goto ret0; - L931: + L1097: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, HImode)) { ro[2] = x2; - return 185; + return 206; } goto ret0; - L958: + L1124: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L959; + goto L1125; } goto ret0; - L959: + L1125: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, HImode)) { ro[2] = x2; - return 191; + return 212; } goto ret0; - L986: + L1152: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L987; + goto L1153; } goto ret0; - L987: + L1153: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, HImode)) { ro[2] = x2; - return 197; + return 218; } goto ret0; - L1001: + L1167: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L1002; + goto L1168; } goto ret0; - L1002: + L1168: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, HImode)) { ro[2] = x2; - return 200; + return 221; } goto ret0; - L1016: + L1182: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L1017; + goto L1183; } goto ret0; - L1017: + L1183: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, HImode)) { ro[2] = x2; - return 203; + return 224; } goto ret0; ret0: return -1; @@ -468,7 +469,7 @@ recog_2 (x0, insn, pnum_clobbers) case COMPARE: goto L39; case ZERO_EXTRACT: - goto L1046; + goto L1212; } L61: if (VOIDmode_compare_op (x1, VOIDmode)) @@ -563,7 +564,7 @@ recog_2 (x0, insn, pnum_clobbers) } goto L61; - L1046: + L1212: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -571,66 +572,66 @@ recog_2 (x0, insn, pnum_clobbers) if (register_operand (x2, SImode)) { ro[0] = x2; - goto L1047; + goto L1213; } break; case QImode: if (general_operand (x2, QImode)) { ro[0] = x2; - goto L1059; + goto L1225; } } goto L61; - L1047: + L1213: x2 = XEXP (x1, 1); if (GET_CODE (x2) != CONST_INT) { goto L61; } if (XWINT (x2, 0) == 1 && 1) - goto L1048; - L1053: + goto L1214; + L1219: ro[1] = x2; - goto L1054; + goto L1220; - L1048: + L1214: x2 = XEXP (x1, 2); if (general_operand (x2, SImode)) { ro[1] = x2; if (GET_CODE (operands[1]) != CONST_INT) - return 208; + return 229; } x2 = XEXP (x1, 1); - goto L1053; + goto L1219; - L1054: + L1220: x2 = XEXP (x1, 2); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; - return 209; + return 230; } goto L61; - L1059: + L1225: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && 1) { ro[1] = x2; - goto L1060; + goto L1226; } goto L61; - L1060: + L1226: x2 = XEXP (x1, 2); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; if (GET_CODE (operands[0]) != MEM || ! MEM_VOLATILE_P (operands[0])) - return 210; + return 231; } goto L61; @@ -1079,477 +1080,477 @@ recog_3 (x0, insn, pnum_clobbers) switch (GET_CODE (x2)) { case EQ: - goto L1115; + goto L1281; case NE: - goto L1124; + goto L1290; case GT: - goto L1133; + goto L1299; case GTU: - goto L1142; + goto L1308; case LT: - goto L1151; + goto L1317; case LTU: - goto L1160; + goto L1326; case GE: - goto L1169; + goto L1335; case GEU: - goto L1178; + goto L1344; case LE: - goto L1187; + goto L1353; case LEU: - goto L1196; + goto L1362; } goto ret0; - L1115: + L1281: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1116; + goto L1282; goto ret0; - L1116: + L1282: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1117; + goto L1283; goto ret0; - L1117: + L1283: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1118; + goto L1284; case PC: - goto L1208; + goto L1374; } goto ret0; - L1118: + L1284: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1119; + goto L1285; - L1119: + L1285: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 232; + return 253; goto ret0; - L1208: + L1374: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1209; + goto L1375; goto ret0; - L1209: + L1375: x3 = XEXP (x2, 0); ro[0] = x3; - return 251; + return 272; - L1124: + L1290: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1125; + goto L1291; goto ret0; - L1125: + L1291: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1126; + goto L1292; goto ret0; - L1126: + L1292: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1127; + goto L1293; case PC: - goto L1217; + goto L1383; } goto ret0; - L1127: + L1293: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1128; + goto L1294; - L1128: + L1294: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 234; + return 255; goto ret0; - L1217: + L1383: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1218; + goto L1384; goto ret0; - L1218: + L1384: x3 = XEXP (x2, 0); ro[0] = x3; - return 252; + return 273; - L1133: + L1299: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1134; + goto L1300; goto ret0; - L1134: + L1300: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1135; + goto L1301; goto ret0; - L1135: + L1301: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1136; + goto L1302; case PC: - goto L1226; + goto L1392; } goto ret0; - L1136: + L1302: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1137; + goto L1303; - L1137: + L1303: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 236; + return 257; goto ret0; - L1226: + L1392: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1227; + goto L1393; goto ret0; - L1227: + L1393: x3 = XEXP (x2, 0); ro[0] = x3; - return 253; + return 274; - L1142: + L1308: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1143; + goto L1309; goto ret0; - L1143: + L1309: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1144; + goto L1310; goto ret0; - L1144: + L1310: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1145; + goto L1311; case PC: - goto L1235; + goto L1401; } goto ret0; - L1145: + L1311: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1146; + goto L1312; - L1146: + L1312: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 238; + return 259; goto ret0; - L1235: + L1401: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1236; + goto L1402; goto ret0; - L1236: + L1402: x3 = XEXP (x2, 0); ro[0] = x3; - return 254; + return 275; - L1151: + L1317: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1152; + goto L1318; goto ret0; - L1152: + L1318: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1153; + goto L1319; goto ret0; - L1153: + L1319: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1154; + goto L1320; case PC: - goto L1244; + goto L1410; } goto ret0; - L1154: + L1320: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1155; + goto L1321; - L1155: + L1321: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 240; + return 261; goto ret0; - L1244: + L1410: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1245; + goto L1411; goto ret0; - L1245: + L1411: x3 = XEXP (x2, 0); ro[0] = x3; - return 255; + return 276; - L1160: + L1326: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1161; + goto L1327; goto ret0; - L1161: + L1327: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1162; + goto L1328; goto ret0; - L1162: + L1328: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1163; + goto L1329; case PC: - goto L1253; + goto L1419; } goto ret0; - L1163: + L1329: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1164; + goto L1330; - L1164: + L1330: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 242; + return 263; goto ret0; - L1253: + L1419: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1254; + goto L1420; goto ret0; - L1254: + L1420: x3 = XEXP (x2, 0); ro[0] = x3; - return 256; + return 277; - L1169: + L1335: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1170; + goto L1336; goto ret0; - L1170: + L1336: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1171; + goto L1337; goto ret0; - L1171: + L1337: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1172; + goto L1338; case PC: - goto L1262; + goto L1428; } goto ret0; - L1172: + L1338: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1173; + goto L1339; - L1173: + L1339: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 244; + return 265; goto ret0; - L1262: + L1428: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1263; + goto L1429; goto ret0; - L1263: + L1429: x3 = XEXP (x2, 0); ro[0] = x3; - return 257; + return 278; - L1178: + L1344: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1179; + goto L1345; goto ret0; - L1179: + L1345: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1180; + goto L1346; goto ret0; - L1180: + L1346: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1181; + goto L1347; case PC: - goto L1271; + goto L1437; } goto ret0; - L1181: + L1347: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1182; + goto L1348; - L1182: + L1348: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 246; + return 267; goto ret0; - L1271: + L1437: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1272; + goto L1438; goto ret0; - L1272: + L1438: x3 = XEXP (x2, 0); ro[0] = x3; - return 258; + return 279; - L1187: + L1353: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1188; + goto L1354; goto ret0; - L1188: + L1354: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1189; + goto L1355; goto ret0; - L1189: + L1355: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1190; + goto L1356; case PC: - goto L1280; + goto L1446; } goto ret0; - L1190: + L1356: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1191; + goto L1357; - L1191: + L1357: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 248; + return 269; goto ret0; - L1280: + L1446: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1281; + goto L1447; goto ret0; - L1281: + L1447: x3 = XEXP (x2, 0); ro[0] = x3; - return 259; + return 280; - L1196: + L1362: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CC0 && 1) - goto L1197; + goto L1363; goto ret0; - L1197: + L1363: x3 = XEXP (x2, 1); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1) - goto L1198; + goto L1364; goto ret0; - L1198: + L1364: x2 = XEXP (x1, 1); switch (GET_CODE (x2)) { case LABEL_REF: - goto L1199; + goto L1365; case PC: - goto L1289; + goto L1455; } goto ret0; - L1199: + L1365: x3 = XEXP (x2, 0); ro[0] = x3; - goto L1200; + goto L1366; - L1200: + L1366: x2 = XEXP (x1, 2); if (GET_CODE (x2) == PC && 1) - return 250; + return 271; goto ret0; - L1289: + L1455: x2 = XEXP (x1, 2); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1290; + goto L1456; goto ret0; - L1290: + L1456: x3 = XEXP (x2, 0); ro[0] = x3; - return 260; + return 281; ret0: return -1; } @@ -1577,133 +1578,151 @@ recog_4 (x0, insn, pnum_clobbers) } break; case ZERO_EXTRACT: - goto L1025; + goto L1191; } - L303: + L304: if (general_operand (x1, SImode)) { ro[0] = x1; - goto L365; + goto L469; } - L611: + L723: if (register_operand (x1, SImode)) { ro[0] = x1; - goto L612; + goto L820; } - L619: + L739: if (general_operand (x1, SImode)) { ro[0] = x1; - goto L620; + goto L740; } break; case HImode: if (GET_CODE (x1) == MEM && push_operand (x1, HImode)) { ro[0] = x1; - goto L307; + goto L308; } - L309: + L316: if (general_operand (x1, HImode)) { ro[0] = x1; - goto L369; + goto L473; } break; case QImode: if (GET_CODE (x1) == MEM && push_operand (x1, QImode)) { ro[0] = x1; - goto L317; + goto L327; } - L319: + L332: if (general_operand (x1, QImode)) { ro[0] = x1; - goto L607; + goto L719; } - L1062: + L1228: if (register_operand (x1, QImode)) { ro[0] = x1; - goto L1063; + goto L1229; } break; case SFmode: if (GET_CODE (x1) == MEM && push_operand (x1, SFmode)) { ro[0] = x1; - goto L327; + goto L340; } - L329: + L359: + if (memory_operand (x1, SFmode)) + { + ro[0] = x1; + goto L360; + } + L362: if (general_operand (x1, SFmode)) { ro[0] = x1; - goto L416; + goto L520; } - L575: + L679: if (register_operand (x1, SFmode)) { ro[0] = x1; - goto L576; + goto L680; } break; case DFmode: if (GET_CODE (x1) == MEM && push_operand (x1, DFmode)) { ro[0] = x1; - goto L333; + goto L373; } - L342: - if (general_operand (x1, DFmode)) + L396: + if (memory_operand (x1, DFmode)) { ro[0] = x1; goto L397; } - L571: + L399: + if (general_operand (x1, DFmode)) + { + ro[0] = x1; + goto L501; + } + L675: if (register_operand (x1, DFmode)) { ro[0] = x1; - goto L572; + goto L676; } break; case XFmode: if (GET_CODE (x1) == MEM && push_operand (x1, XFmode)) { ro[0] = x1; - goto L346; + goto L410; + } + L433: + if (memory_operand (x1, XFmode)) + { + ro[0] = x1; + goto L434; } - L355: + L436: if (general_operand (x1, XFmode)) { ro[0] = x1; - goto L401; + goto L505; } - L567: + L671: if (register_operand (x1, XFmode)) { ro[0] = x1; - goto L568; + goto L672; } break; case DImode: if (GET_CODE (x1) == MEM && push_operand (x1, DImode)) { ro[0] = x1; - goto L359; + goto L455; } - L361: + L465: if (general_operand (x1, DImode)) { ro[0] = x1; - goto L592; + goto L704; } - L376: + L480: if (register_operand (x1, DImode)) { ro[0] = x1; - goto L377; + goto L481; } } switch (GET_CODE (x1)) @@ -1711,49 +1730,49 @@ recog_4 (x0, insn, pnum_clobbers) case CC0: goto L2; case STRICT_LOW_PART: - goto L313; + goto L320; case PC: - goto L1314; + goto L1480; } - L1380: + L1546: ro[0] = x1; - goto L1381; - L1460: + goto L1547; + L1613: switch (GET_MODE (x1)) { case SImode: if (general_operand (x1, SImode)) { ro[0] = x1; - goto L1461; + goto L1614; } break; case HImode: if (general_operand (x1, HImode)) { ro[0] = x1; - goto L1467; + goto L1620; } break; case DFmode: if (register_operand (x1, DFmode)) { ro[0] = x1; - goto L1473; + goto L1626; } break; case XFmode: if (register_operand (x1, XFmode)) { ro[0] = x1; - goto L1484; + goto L1637; } break; case SFmode: if (register_operand (x1, SFmode)) { ro[0] = x1; - goto L1531; + goto L1684; } } goto ret0; @@ -1761,57 +1780,64 @@ recog_4 (x0, insn, pnum_clobbers) L296: x1 = XEXP (x0, 1); if (general_operand (x1, SImode)) - goto L300; - x1 = XEXP (x0, 0); - goto L303; - - L300: - ro[1] = x1; - if (! TARGET_486) - return 46; - L301: - ro[1] = x1; - if (TARGET_486) - return 47; + { + ro[1] = x1; + if (TARGET_386) + return 46; + } + L299: + if (nonmemory_operand (x1, SImode)) + { + ro[1] = x1; + if (!TARGET_386 && TARGET_MOVE) + return 47; + } + L302: + if (general_operand (x1, SImode)) + { + ro[1] = x1; + if (!TARGET_386 && !TARGET_MOVE) + return 48; + } x1 = XEXP (x0, 0); - goto L303; + goto L304; - L1025: + L1191: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && general_operand (x2, SImode)) { ro[0] = x2; - goto L1026; + goto L1192; } - goto L1380; + goto L1546; - L1026: + L1192: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 1 && 1) - goto L1027; - goto L1380; + goto L1193; + goto L1546; - L1027: + L1193: x2 = XEXP (x1, 2); if (general_operand (x2, SImode)) { ro[2] = x2; - goto L1028; + goto L1194; } - goto L1380; + goto L1546; - L1028: + L1194: x1 = XEXP (x0, 1); if (GET_CODE (x1) == CONST_INT && 1) { ro[3] = x1; - if (! TARGET_486 && GET_CODE (operands[2]) != CONST_INT) - return 205; + if (TARGET_386 && GET_CODE (operands[2]) != CONST_INT) + return 226; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L365: + L469: x1 = XEXP (x0, 1); switch (GET_MODE (x1)) { @@ -1819,22 +1845,23 @@ recog_4 (x0, insn, pnum_clobbers) switch (GET_CODE (x1)) { case ZERO_EXTEND: - goto L366; + goto L470; case SIGN_EXTEND: - goto L386; + goto L490; case PLUS: - goto L598; + goto L710; } } if (general_operand (x1, SImode)) { ro[1] = x1; - return 49; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 50; + } x1 = XEXP (x0, 0); - goto L611; + goto L723; - L366: + L470: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -1842,20 +1869,20 @@ recog_4 (x0, insn, pnum_clobbers) if (nonimmediate_operand (x2, HImode)) { ro[1] = x2; - return 66; + return 85; } break; case QImode: if (nonimmediate_operand (x2, QImode)) { ro[1] = x2; - return 68; + return 87; } } x1 = XEXP (x0, 0); - goto L611; + goto L723; - L386: + L490: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -1863,387 +1890,528 @@ recog_4 (x0, insn, pnum_clobbers) if (nonimmediate_operand (x2, HImode)) { ro[1] = x2; - return 71; + return 90; } break; case QImode: if (nonimmediate_operand (x2, QImode)) { ro[1] = x2; - return 73; + return 92; } } x1 = XEXP (x0, 0); - goto L611; + goto L723; - L598: + L710: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L599; + goto L711; } x1 = XEXP (x0, 0); - goto L611; + goto L723; - L599: + L711: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - return 109; + return 128; } x1 = XEXP (x0, 0); - goto L611; + goto L723; - L612: + L820: x1 = XEXP (x0, 1); + if (GET_MODE (x1) == SImode && GET_CODE (x1) == TRUNCATE && 1) + goto L821; if (address_operand (x1, QImode)) { ro[1] = x1; - return 112; + return 131; } x1 = XEXP (x0, 0); - goto L619; + goto L739; - L620: + L821: + x2 = XEXP (x1, 0); + if (GET_MODE (x2) == DImode && GET_CODE (x2) == LSHIFTRT && 1) + goto L822; + x1 = XEXP (x0, 0); + goto L739; + + L822: + x3 = XEXP (x2, 0); + if (GET_MODE (x3) == DImode && GET_CODE (x3) == MULT && 1) + goto L823; + x1 = XEXP (x0, 0); + goto L739; + + L823: + x4 = XEXP (x3, 0); + if (GET_MODE (x4) != DImode) + { + x1 = XEXP (x0, 0); + goto L739; + } + switch (GET_CODE (x4)) + { + case ZERO_EXTEND: + goto L824; + case SIGN_EXTEND: + goto L847; + } + x1 = XEXP (x0, 0); + goto L739; + + L824: + x5 = XEXP (x4, 0); + if (register_operand (x5, SImode)) + { + ro[1] = x5; + goto L825; + } + x1 = XEXP (x0, 0); + goto L739; + + L825: + x4 = XEXP (x3, 1); + if (GET_MODE (x4) == DImode && GET_CODE (x4) == ZERO_EXTEND && 1) + goto L826; + x1 = XEXP (x0, 0); + goto L739; + + L826: + x5 = XEXP (x4, 0); + if (nonimmediate_operand (x5, SImode)) + { + ro[2] = x5; + goto L827; + } + x1 = XEXP (x0, 0); + goto L739; + + L827: + x3 = XEXP (x2, 1); + if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 32 && pnum_clobbers != 0 && 1) + if (TARGET_WIDE_MULTIPLY) + { + *pnum_clobbers = 1; + return 150; + } + x1 = XEXP (x0, 0); + goto L739; + + L847: + x5 = XEXP (x4, 0); + if (register_operand (x5, SImode)) + { + ro[1] = x5; + goto L848; + } + x1 = XEXP (x0, 0); + goto L739; + + L848: + x4 = XEXP (x3, 1); + if (GET_MODE (x4) == DImode && GET_CODE (x4) == SIGN_EXTEND && 1) + goto L849; + x1 = XEXP (x0, 0); + goto L739; + + L849: + x5 = XEXP (x4, 0); + if (nonimmediate_operand (x5, SImode)) + { + ro[2] = x5; + goto L850; + } + x1 = XEXP (x0, 0); + goto L739; + + L850: + x3 = XEXP (x2, 1); + if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 32 && pnum_clobbers != 0 && 1) + if (TARGET_WIDE_MULTIPLY) + { + *pnum_clobbers = 1; + return 151; + } + x1 = XEXP (x0, 0); + goto L739; + + L740: x1 = XEXP (x0, 1); if (GET_MODE (x1) != SImode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case MINUS: - goto L621; + goto L741; case MULT: - goto L648; + goto L768; case AND: - goto L742; + goto L908; case IOR: - goto L757; + goto L923; case XOR: - goto L1032; + goto L1198; case NEG: - goto L791; + goto L957; case NOT: - goto L900; + goto L1066; case ASHIFT: - goto L925; + goto L1091; case ASHIFTRT: - goto L953; + goto L1119; case LSHIFTRT: - goto L981; + goto L1147; case ROTATE: - goto L996; + goto L1162; case ROTATERT: - goto L1011; + goto L1177; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L621: + L741: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L622; + goto L742; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L622: + L742: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - return 117; + return 136; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L648: + L768: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L649; + goto L769; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L649: + L769: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) - goto L655; + goto L775; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L655: + L775: ro[2] = x2; if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0x80) - return 125; - L656: + return 144; + L776: ro[2] = x2; - return 126; + return 145; - L742: + L908: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L743; + goto L909; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L743: + L909: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - return 143; + return 164; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L757: + L923: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L758; + goto L924; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L758: + L924: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - return 146; + return 167; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1032: + L1198: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == ASHIFT && 1) - goto L1033; + goto L1199; if (general_operand (x2, SImode)) { ro[1] = x2; - goto L1040; + goto L1206; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1033: + L1199: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 1 && 1) - goto L1034; + goto L1200; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1034: + L1200: x3 = XEXP (x2, 1); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1035; + goto L1201; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1035: + L1201: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - if (! TARGET_486 && GET_CODE (operands[1]) != CONST_INT) - return 206; + if (TARGET_386 && GET_CODE (operands[1]) != CONST_INT) + return 227; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1040: + L1206: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == ASHIFT && 1) - goto L1041; + goto L1207; if (general_operand (x2, SImode)) { ro[2] = x2; - return 149; + return 170; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1041: + L1207: x3 = XEXP (x2, 0); if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 1 && 1) - goto L1042; + goto L1208; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1042: + L1208: x3 = XEXP (x2, 1); if (general_operand (x3, SImode)) { ro[2] = x3; - if (! TARGET_486 && GET_CODE (operands[2]) != CONST_INT) - return 207; + if (TARGET_386 && GET_CODE (operands[2]) != CONST_INT) + return 228; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L791: + L957: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - return 153; + return 174; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L900: + L1066: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - return 178; + return 199; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L925: + L1091: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L926; + goto L1092; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L926: + L1092: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, SImode)) { ro[2] = x2; - return 184; + return 205; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L953: + L1119: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L954; + goto L1120; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L954: + L1120: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, SImode)) { ro[2] = x2; - return 190; + return 211; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L981: + L1147: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L982; + goto L1148; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L982: + L1148: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, SImode)) { ro[2] = x2; - return 196; + return 217; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L996: + L1162: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L997; + goto L1163; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L997: + L1163: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, SImode)) { ro[2] = x2; - return 199; + return 220; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1011: + L1177: x2 = XEXP (x1, 0); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L1012; + goto L1178; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1012: + L1178: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, SImode)) { ro[2] = x2; - return 202; + return 223; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L307: + L308: x1 = XEXP (x0, 1); if (general_operand (x1, HImode)) { ro[1] = x1; - return 50; - } + if (TARGET_386) + return 51; + } + L311: + if (nonmemory_operand (x1, HImode)) + { + ro[1] = x1; + if (!TARGET_386 && TARGET_MOVE) + return 52; + } + L314: + if (general_operand (x1, HImode)) + { + ro[1] = x1; + if (!TARGET_386 && !TARGET_MOVE) + return 53; + } x1 = XEXP (x0, 0); - goto L309; - L369: + goto L316; + L473: tem = recog_1 (x0, insn, pnum_clobbers); if (tem >= 0) return tem; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L317: + L327: x1 = XEXP (x0, 1); - if (general_operand (x1, QImode)) + switch (GET_MODE (x1)) + { + case QImode: + if (nonimmediate_operand (x1, QImode)) + { + ro[1] = x1; + if (!TARGET_MOVE) + return 59; + } + L330: + if (register_operand (x1, QImode)) + { + ro[1] = x1; + if (TARGET_MOVE) + return 60; + } + } + if (immediate_operand (x1, QImode)) { ro[1] = x1; - return 53; + return 58; } x1 = XEXP (x0, 0); - goto L319; + goto L332; - L607: + L719: x1 = XEXP (x0, 1); switch (GET_MODE (x1)) { @@ -2251,536 +2419,560 @@ recog_4 (x0, insn, pnum_clobbers) switch (GET_CODE (x1)) { case PLUS: - goto L608; + goto L720; case MINUS: - goto L631; + goto L751; case DIV: - goto L688; + goto L854; case UDIV: - goto L693; + goto L859; case AND: - goto L752; + goto L918; case IOR: - goto L767; + goto L933; case XOR: - goto L782; + goto L948; case NEG: - goto L799; + goto L965; case NOT: - goto L908; + goto L1074; case ASHIFT: - goto L935; + goto L1101; case ASHIFTRT: - goto L963; + goto L1129; case LSHIFTRT: - goto L991; + goto L1157; case ROTATE: - goto L1006; + goto L1172; case ROTATERT: - goto L1021; + goto L1187; } } if (general_operand (x1, QImode)) { ro[1] = x1; - return 54; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 62; + } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L608: + L720: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L609; + goto L721; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L609: + L721: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 111; + return 130; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L631: + L751: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L632; + goto L752; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L632: + L752: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 119; + return 138; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L688: + L854: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L689; + goto L855; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L689: + L855: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 134; + return 155; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L693: + L859: x2 = XEXP (x1, 0); if (general_operand (x2, HImode)) { ro[1] = x2; - goto L694; + goto L860; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L694: + L860: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 135; + return 156; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L752: + L918: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L753; + goto L919; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L753: + L919: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 145; + return 166; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L767: + L933: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L768; + goto L934; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L768: + L934: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 148; + return 169; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L782: + L948: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L783; + goto L949; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L783: + L949: x2 = XEXP (x1, 1); if (general_operand (x2, QImode)) { ro[2] = x2; - return 151; + return 172; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L799: + L965: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - return 155; + return 176; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L908: + L1074: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - return 180; + return 201; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L935: + L1101: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L936; + goto L1102; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L936: + L1102: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, QImode)) { ro[2] = x2; - return 186; + return 207; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L963: + L1129: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L964; + goto L1130; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L964: + L1130: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, QImode)) { ro[2] = x2; - return 192; + return 213; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L991: + L1157: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L992; + goto L1158; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L992: + L1158: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, QImode)) { ro[2] = x2; - return 198; + return 219; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L1006: + L1172: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L1007; + goto L1173; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L1007: + L1173: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, QImode)) { ro[2] = x2; - return 201; + return 222; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L1021: + L1187: x2 = XEXP (x1, 0); if (general_operand (x2, QImode)) { ro[1] = x2; - goto L1022; + goto L1188; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L1022: + L1188: x2 = XEXP (x1, 1); if (nonmemory_operand (x2, QImode)) { ro[2] = x2; - return 204; + return 225; } x1 = XEXP (x0, 0); - goto L1062; + goto L1228; - L1063: + L1229: x1 = XEXP (x0, 1); if (GET_MODE (x1) != QImode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case EQ: - goto L1064; + goto L1230; case NE: - goto L1069; + goto L1235; case GT: - goto L1074; + goto L1240; case GTU: - goto L1079; + goto L1245; case LT: - goto L1084; + goto L1250; case LTU: - goto L1089; + goto L1255; case GE: - goto L1094; + goto L1260; case GEU: - goto L1099; + goto L1265; case LE: - goto L1104; + goto L1270; case LEU: - goto L1109; + goto L1275; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1064: + L1230: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1065; + goto L1231; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1065: + L1231: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 212; + return 233; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1069: + L1235: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1070; + goto L1236; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1070: + L1236: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 214; + return 235; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1074: + L1240: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1075; + goto L1241; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1075: + L1241: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 216; + return 237; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1079: + L1245: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1080; + goto L1246; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1080: + L1246: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 218; + return 239; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1084: + L1250: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1085; + goto L1251; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1085: + L1251: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 220; + return 241; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1089: + L1255: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1090; + goto L1256; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1090: + L1256: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 222; + return 243; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1094: + L1260: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1095; + goto L1261; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1095: + L1261: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 224; + return 245; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1099: + L1265: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1100; + goto L1266; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1100: + L1266: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 226; + return 247; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1104: + L1270: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1105; + goto L1271; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1105: + L1271: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 228; + return 249; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1109: + L1275: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CC0 && 1) - goto L1110; + goto L1276; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1110: + L1276: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - return 230; + return 251; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L327: + L340: x1 = XEXP (x0, 1); if (general_operand (x1, SFmode)) + goto L350; + x1 = XEXP (x0, 0); + goto L359; + + L350: + ro[1] = x1; + if (!TARGET_MOVE) + return 66; + L351: + if (pnum_clobbers != 0 && 1) { ro[1] = x1; - return 56; + *pnum_clobbers = 1; + return 67; } x1 = XEXP (x0, 0); - goto L329; + goto L359; - L416: + L360: + x1 = XEXP (x0, 1); + if (pnum_clobbers != 0 && memory_operand (x1, SFmode)) + { + ro[1] = x1; + *pnum_clobbers = 1; + return 68; + } + x1 = XEXP (x0, 0); + goto L362; + + L520: x1 = XEXP (x0, 1); if (GET_MODE (x1) == SFmode && GET_CODE (x1) == FLOAT_TRUNCATE && 1) - goto L417; + goto L521; if (general_operand (x1, SFmode)) { ro[1] = x1; - return 57; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 69; + } x1 = XEXP (x0, 0); - goto L575; + goto L679; - L417: + L521: x2 = XEXP (x1, 0); if (register_operand (x2, XFmode)) { ro[1] = x2; if (TARGET_80387) - return 79; + return 98; } x1 = XEXP (x0, 0); - goto L575; + goto L679; - L576: + L680: x1 = XEXP (x0, 1); if (GET_MODE (x1) != SFmode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case FLOAT: - goto L577; + goto L681; case NEG: - goto L803; + goto L969; case ABS: - goto L825; + goto L991; case SQRT: - goto L847; + goto L1013; case UNSPEC: if (XINT (x1, 1) == 1 && XVECLEN (x1, 0) == 1 && 1) - goto L878; + goto L1044; if (XINT (x1, 1) == 2 && XVECLEN (x1, 0) == 1 && 1) - goto L891; + goto L1057; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L577: + L681: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -2789,7 +2981,7 @@ recog_4 (x0, insn, pnum_clobbers) { ro[1] = x2; if (TARGET_80387) - return 104; + return 123; } break; case SImode: @@ -2797,150 +2989,173 @@ recog_4 (x0, insn, pnum_clobbers) { ro[1] = x2; if (TARGET_80387) - return 107; + return 126; } } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L803: + L969: x2 = XEXP (x1, 0); if (general_operand (x2, SFmode)) { ro[1] = x2; if (TARGET_80387) - return 156; + return 177; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L825: + L991: x2 = XEXP (x1, 0); if (general_operand (x2, SFmode)) { ro[1] = x2; if (TARGET_80387) - return 161; + return 182; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L847: + L1013: x2 = XEXP (x1, 0); if (general_operand (x2, SFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 166; + return 187; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L878: + L1044: x2 = XVECEXP (x1, 0, 0); if (register_operand (x2, SFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 173; + return 194; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L891: + L1057: x2 = XVECEXP (x1, 0, 0); if (register_operand (x2, SFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 176; + return 197; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L333: + L373: x1 = XEXP (x0, 1); if (general_operand (x1, DFmode)) + goto L385; + x1 = XEXP (x0, 0); + goto L396; + + L385: + ro[1] = x1; + if (!TARGET_MOVE) + return 72; + L386: + if (pnum_clobbers != 0 && 1) { ro[1] = x1; - return 58; + *pnum_clobbers = 2; + return 73; } x1 = XEXP (x0, 0); - goto L342; + goto L396; L397: x1 = XEXP (x0, 1); + if (pnum_clobbers != 0 && memory_operand (x1, DFmode)) + { + ro[1] = x1; + *pnum_clobbers = 2; + return 74; + } + x1 = XEXP (x0, 0); + goto L399; + + L501: + x1 = XEXP (x0, 1); switch (GET_MODE (x1)) { case DFmode: switch (GET_CODE (x1)) { case FLOAT_EXTEND: - goto L398; + goto L502; case FLOAT_TRUNCATE: - goto L421; + goto L525; } } if (general_operand (x1, DFmode)) { ro[1] = x1; - return 60; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 75; + } x1 = XEXP (x0, 0); - goto L571; + goto L675; - L398: + L502: x2 = XEXP (x1, 0); if (general_operand (x2, SFmode)) { ro[1] = x2; if (TARGET_80387) - return 74; + return 93; } x1 = XEXP (x0, 0); - goto L571; + goto L675; - L421: + L525: x2 = XEXP (x1, 0); if (register_operand (x2, XFmode)) { ro[1] = x2; if (TARGET_80387) - return 80; + return 99; } x1 = XEXP (x0, 0); - goto L571; + goto L675; - L572: + L676: x1 = XEXP (x0, 1); if (GET_MODE (x1) != DFmode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case FLOAT: - goto L573; + goto L677; case NEG: - goto L811; + goto L977; case ABS: - goto L833; + goto L999; case SQRT: - goto L855; + goto L1021; case UNSPEC: if (XINT (x1, 1) == 1 && XVECLEN (x1, 0) == 1 && 1) - goto L882; + goto L1048; if (XINT (x1, 1) == 2 && XVECLEN (x1, 0) == 1 && 1) - goto L895; + goto L1061; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L573: + L677: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -2949,7 +3164,7 @@ recog_4 (x0, insn, pnum_clobbers) { ro[1] = x2; if (TARGET_80387) - return 103; + return 122; } break; case SImode: @@ -2957,320 +3172,344 @@ recog_4 (x0, insn, pnum_clobbers) { ro[1] = x2; if (TARGET_80387) - return 105; + return 124; } } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L811: + L977: x2 = XEXP (x1, 0); if (GET_MODE (x2) == DFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L812; + goto L978; if (general_operand (x2, DFmode)) { ro[1] = x2; if (TARGET_80387) - return 157; + return 178; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L812: + L978: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[1] = x3; if (TARGET_80387) - return 158; + return 179; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L833: + L999: x2 = XEXP (x1, 0); if (GET_MODE (x2) == DFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L834; + goto L1000; if (general_operand (x2, DFmode)) { ro[1] = x2; if (TARGET_80387) - return 162; + return 183; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L834: + L1000: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[1] = x3; if (TARGET_80387) - return 163; + return 184; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L855: + L1021: x2 = XEXP (x1, 0); if (GET_MODE (x2) == DFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L856; + goto L1022; if (general_operand (x2, DFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 167; + return 188; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L856: + L1022: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[1] = x3; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 168; + return 189; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L882: + L1048: x2 = XVECEXP (x1, 0, 0); if (GET_MODE (x2) != DFmode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } if (GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L883; + goto L1049; if (register_operand (x2, DFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 172; + return 193; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L883: + L1049: x3 = XEXP (x2, 0); if (register_operand (x3, SFmode)) { ro[1] = x3; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 174; + return 195; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L895: + L1061: x2 = XVECEXP (x1, 0, 0); if (GET_MODE (x2) != DFmode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } if (GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L896; + goto L1062; if (register_operand (x2, DFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 175; + return 196; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L896: + L1062: x3 = XEXP (x2, 0); if (register_operand (x3, SFmode)) { ro[1] = x3; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 177; + return 198; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L346: + L410: x1 = XEXP (x0, 1); if (general_operand (x1, XFmode)) + goto L422; + x1 = XEXP (x0, 0); + goto L433; + + L422: + ro[1] = x1; + if (!TARGET_MOVE) + return 78; + L423: + if (pnum_clobbers != 0 && 1) { ro[1] = x1; - return 61; + *pnum_clobbers = 2; + return 79; } x1 = XEXP (x0, 0); - goto L355; + goto L433; - L401: + L434: + x1 = XEXP (x0, 1); + if (pnum_clobbers != 0 && memory_operand (x1, XFmode)) + { + ro[1] = x1; + *pnum_clobbers = 2; + return 80; + } + x1 = XEXP (x0, 0); + goto L436; + + L505: x1 = XEXP (x0, 1); if (GET_MODE (x1) == XFmode && GET_CODE (x1) == FLOAT_EXTEND && 1) - goto L402; + goto L506; if (general_operand (x1, XFmode)) { ro[1] = x1; - return 63; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 81; + } x1 = XEXP (x0, 0); - goto L567; + goto L671; - L402: + L506: x2 = XEXP (x1, 0); if (general_operand (x2, DFmode)) { ro[1] = x2; if (TARGET_80387) - return 75; + return 94; } - L406: + L510: if (general_operand (x2, SFmode)) { ro[1] = x2; if (TARGET_80387) - return 76; + return 95; } x1 = XEXP (x0, 0); - goto L567; + goto L671; - L568: + L672: x1 = XEXP (x0, 1); if (GET_MODE (x1) != XFmode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case FLOAT: - goto L569; + goto L673; case NEG: - goto L820; + goto L986; case ABS: - goto L842; + goto L1008; case SQRT: - goto L864; + goto L1030; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L569: + L673: x2 = XEXP (x1, 0); if (general_operand (x2, DImode)) { ro[1] = x2; if (TARGET_80387) - return 102; + return 121; } - L585: + L689: if (general_operand (x2, SImode)) { ro[1] = x2; if (TARGET_80387) - return 106; + return 125; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L820: + L986: x2 = XEXP (x1, 0); if (GET_MODE (x2) == XFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L821; + goto L987; if (general_operand (x2, XFmode)) { ro[1] = x2; if (TARGET_80387) - return 159; + return 180; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L821: + L987: x3 = XEXP (x2, 0); if (general_operand (x3, DFmode)) { ro[1] = x3; if (TARGET_80387) - return 160; + return 181; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L842: + L1008: x2 = XEXP (x1, 0); if (GET_MODE (x2) == XFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L843; + goto L1009; if (general_operand (x2, XFmode)) { ro[1] = x2; if (TARGET_80387) - return 164; + return 185; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L843: + L1009: x3 = XEXP (x2, 0); if (general_operand (x3, DFmode)) { ro[1] = x3; if (TARGET_80387) - return 165; + return 186; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L864: + L1030: x2 = XEXP (x1, 0); if (GET_MODE (x2) == XFmode && GET_CODE (x2) == FLOAT_EXTEND && 1) - goto L865; + goto L1031; if (general_operand (x2, XFmode)) { ro[1] = x2; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 169; + return 190; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L865: + L1031: x3 = XEXP (x2, 0); if (general_operand (x3, DFmode)) { ro[1] = x3; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 170; + return 191; } - L870: + L1036: if (general_operand (x3, SFmode)) { ro[1] = x3; if (! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math) ) - return 171; + return 192; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L359: + L455: x1 = XEXP (x0, 1); - if (general_operand (x1, DImode)) + if (pnum_clobbers != 0 && general_operand (x1, DImode)) { ro[1] = x1; - return 64; + *pnum_clobbers = 2; + return 83; } x1 = XEXP (x0, 0); - goto L361; + goto L465; - L592: + L704: x1 = XEXP (x0, 1); switch (GET_MODE (x1)) { @@ -3278,253 +3517,258 @@ recog_4 (x0, insn, pnum_clobbers) switch (GET_CODE (x1)) { case PLUS: - goto L593; + goto L705; case MINUS: - goto L616; + goto L736; case NEG: - goto L787; + goto L953; } } - if (general_operand (x1, DImode)) + if (pnum_clobbers != 0 && general_operand (x1, DImode)) { ro[1] = x1; - return 65; + *pnum_clobbers = 2; + return 84; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L593: + L705: x2 = XEXP (x1, 0); if (general_operand (x2, DImode)) { ro[1] = x2; - goto L594; + goto L706; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L594: + L706: x2 = XEXP (x1, 1); - if (general_operand (x2, DImode)) + if (pnum_clobbers != 0 && general_operand (x2, DImode)) { ro[2] = x2; - return 108; + *pnum_clobbers = 1; + return 127; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L616: + L736: x2 = XEXP (x1, 0); if (general_operand (x2, DImode)) { ro[1] = x2; - goto L617; + goto L737; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L617: + L737: x2 = XEXP (x1, 1); - if (general_operand (x2, DImode)) + if (pnum_clobbers != 0 && general_operand (x2, DImode)) { ro[2] = x2; - return 116; + *pnum_clobbers = 1; + return 135; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L787: + L953: x2 = XEXP (x1, 0); if (general_operand (x2, DImode)) { ro[1] = x2; - return 152; + return 173; } x1 = XEXP (x0, 0); - goto L376; + goto L480; - L377: + L481: x1 = XEXP (x0, 1); if (GET_MODE (x1) != DImode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x1)) { case ZERO_EXTEND: - goto L378; + goto L482; case SIGN_EXTEND: - goto L382; + goto L486; case MULT: - goto L674; + goto L794; case ASHIFT: - goto L912; + goto L1078; case ASHIFTRT: - goto L940; + goto L1106; case LSHIFTRT: - goto L968; + goto L1134; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L378: + L482: x2 = XEXP (x1, 0); if (register_operand (x2, SImode)) { ro[1] = x2; - return 69; + return 88; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L382: + L486: x2 = XEXP (x1, 0); if (register_operand (x2, SImode)) { ro[1] = x2; - return 70; + return 89; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L674: + L794: x2 = XEXP (x1, 0); if (GET_MODE (x2) != DImode) { x1 = XEXP (x0, 0); - goto L1380; + goto L1546; } switch (GET_CODE (x2)) { case ZERO_EXTEND: - goto L675; + goto L795; case SIGN_EXTEND: - goto L682; + goto L802; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L675: + L795: x3 = XEXP (x2, 0); if (register_operand (x3, SImode)) { ro[1] = x3; - goto L676; + goto L796; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L676: + L796: x2 = XEXP (x1, 1); if (GET_MODE (x2) == DImode && GET_CODE (x2) == ZERO_EXTEND && 1) - goto L677; + goto L797; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L677: + L797: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, SImode)) { ro[2] = x3; - return 129; - } + if (TARGET_WIDE_MULTIPLY) + return 148; + } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L682: + L802: x3 = XEXP (x2, 0); if (register_operand (x3, SImode)) { ro[1] = x3; - goto L683; + goto L803; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L683: + L803: x2 = XEXP (x1, 1); if (GET_MODE (x2) == DImode && GET_CODE (x2) == SIGN_EXTEND && 1) - goto L684; + goto L804; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L684: + L804: x3 = XEXP (x2, 0); if (nonimmediate_operand (x3, SImode)) { ro[2] = x3; - return 130; - } + if (TARGET_WIDE_MULTIPLY) + return 149; + } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L912: + L1078: x2 = XEXP (x1, 0); if (register_operand (x2, DImode)) { ro[1] = x2; - goto L913; + goto L1079; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L913: + L1079: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; - return 182; + return 203; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L940: + L1106: x2 = XEXP (x1, 0); if (register_operand (x2, DImode)) { ro[1] = x2; - goto L941; + goto L1107; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L941: + L1107: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; - return 188; + return 209; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L968: + L1134: x2 = XEXP (x1, 0); if (register_operand (x2, DImode)) { ro[1] = x2; - goto L969; + goto L1135; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L969: + L1135: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; - return 194; + return 215; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; L2: tem = recog_2 (x0, insn, pnum_clobbers); if (tem >= 0) return tem; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L313: + L320: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -3532,248 +3776,250 @@ recog_4 (x0, insn, pnum_clobbers) if (general_operand (x2, HImode)) { ro[0] = x2; - goto L314; + goto L321; } break; case QImode: if (general_operand (x2, QImode)) { ro[0] = x2; - goto L324; + goto L337; } } - goto L1380; + goto L1546; - L314: + L321: x1 = XEXP (x0, 1); if (general_operand (x1, HImode)) { ro[1] = x1; - return 52; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 57; + } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L324: + L337: x1 = XEXP (x0, 1); if (general_operand (x1, QImode)) { ro[1] = x1; - return 55; - } + if ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) + return 64; + } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1314: + L1480: x1 = XEXP (x0, 1); switch (GET_CODE (x1)) { case MINUS: if (GET_MODE (x1) == SImode && 1) - goto L1315; + goto L1481; break; case IF_THEN_ELSE: - goto L1114; + goto L1280; case LABEL_REF: - goto L1294; + goto L1460; } - L1297: + L1463: if (general_operand (x1, SImode)) { ro[0] = x1; - return 262; + return 283; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1315: + L1481: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == REG && XINT (x2, 0) == 3 && 1) - goto L1316; + goto L1482; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1316: + L1482: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == MEM && 1) - goto L1317; + goto L1483; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1317: + L1483: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == PLUS && 1) - goto L1318; + goto L1484; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1318: + L1484: x4 = XEXP (x3, 0); if (GET_MODE (x4) == SImode && GET_CODE (x4) == MULT && 1) - goto L1319; + goto L1485; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1319: + L1485: x5 = XEXP (x4, 0); if (register_operand (x5, SImode)) { ro[0] = x5; - goto L1320; + goto L1486; } x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1320: + L1486: x5 = XEXP (x4, 1); if (GET_CODE (x5) == CONST_INT && XWINT (x5, 0) == 4 && 1) - goto L1321; + goto L1487; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1321: + L1487: x4 = XEXP (x3, 1); if (GET_CODE (x4) == LABEL_REF && 1) - goto L1322; + goto L1488; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1322: + L1488: x5 = XEXP (x4, 0); if (pnum_clobbers != 0 && 1) { ro[1] = x5; *pnum_clobbers = 1; - return 264; + return 285; } x1 = XEXP (x0, 0); - goto L1380; - L1114: + goto L1546; + L1280: tem = recog_3 (x0, insn, pnum_clobbers); if (tem >= 0) return tem; x1 = XEXP (x0, 0); - goto L1380; + goto L1546; - L1294: + L1460: x2 = XEXP (x1, 0); ro[0] = x2; - return 261; + return 282; - L1381: + L1547: x1 = XEXP (x0, 1); if (GET_CODE (x1) == CALL && 1) - goto L1382; + goto L1548; x1 = XEXP (x0, 0); - goto L1460; + goto L1613; - L1382: + L1548: x2 = XEXP (x1, 0); if (call_insn_operand (x2, QImode)) { ro[1] = x2; - goto L1383; + goto L1549; } - L1387: + L1553: if (GET_MODE (x2) == QImode && GET_CODE (x2) == MEM && 1) - goto L1388; + goto L1554; x1 = XEXP (x0, 0); - goto L1460; + goto L1613; - L1383: + L1549: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; - return 276; + return 297; } x2 = XEXP (x1, 0); - goto L1387; + goto L1553; - L1388: + L1554: x3 = XEXP (x2, 0); if (symbolic_operand (x3, SImode)) { ro[1] = x3; - goto L1389; + goto L1555; } x1 = XEXP (x0, 0); - goto L1460; + goto L1613; - L1389: + L1555: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[2] = x2; if (!HALF_PIC_P ()) - return 277; + return 298; } x1 = XEXP (x0, 0); - goto L1460; + goto L1613; - L1461: + L1614: x1 = XEXP (x0, 1); if (GET_MODE (x1) == SImode && GET_CODE (x1) == PLUS && 1) - goto L1462; + goto L1615; goto ret0; - L1462: + L1615: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == FFS && 1) - goto L1463; + goto L1616; goto ret0; - L1463: + L1616: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1464; + goto L1617; } goto ret0; - L1464: + L1617: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == -1 && 1) - return 291; + return 309; goto ret0; - L1467: + L1620: x1 = XEXP (x0, 1); if (GET_MODE (x1) == HImode && GET_CODE (x1) == PLUS && 1) - goto L1468; + goto L1621; goto ret0; - L1468: + L1621: x2 = XEXP (x1, 0); if (GET_MODE (x2) == HImode && GET_CODE (x2) == FFS && 1) - goto L1469; + goto L1622; goto ret0; - L1469: + L1622: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1470; + goto L1623; } goto ret0; - L1470: + L1623: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == -1 && 1) - return 293; + return 311; goto ret0; - L1473: + L1626: x1 = XEXP (x0, 1); if (binary_387_op (x1, DFmode)) { ro[3] = x1; - goto L1479; + goto L1632; } goto ret0; - L1479: + L1632: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -3781,119 +4027,119 @@ recog_4 (x0, insn, pnum_clobbers) switch (GET_CODE (x2)) { case FLOAT: - goto L1480; + goto L1633; case FLOAT_EXTEND: - goto L1515; + goto L1668; case SUBREG: case REG: case MEM: if (nonimmediate_operand (x2, DFmode)) { ro[1] = x2; - goto L1475; + goto L1628; } } } - L1520: + L1673: if (general_operand (x2, DFmode)) { ro[1] = x2; - goto L1521; + goto L1674; } goto ret0; - L1480: + L1633: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1481; + goto L1634; } goto ret0; - L1481: + L1634: x2 = XEXP (x1, 1); if (general_operand (x2, DFmode)) { ro[2] = x2; if (TARGET_80387) - return 295; + return 313; } goto ret0; - L1515: + L1668: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[1] = x3; - goto L1516; + goto L1669; } goto ret0; - L1516: + L1669: x2 = XEXP (x1, 1); if (general_operand (x2, DFmode)) { ro[2] = x2; if (TARGET_80387) - return 301; + return 319; } goto ret0; - L1475: + L1628: x2 = XEXP (x1, 1); if (nonimmediate_operand (x2, DFmode)) { ro[2] = x2; if (TARGET_80387) - return 294; + return 312; } x2 = XEXP (x1, 0); - goto L1520; + goto L1673; - L1521: + L1674: x2 = XEXP (x1, 1); if (GET_MODE (x2) != DFmode) goto ret0; switch (GET_CODE (x2)) { case FLOAT: - goto L1522; + goto L1675; case FLOAT_EXTEND: - goto L1528; + goto L1681; } goto ret0; - L1522: + L1675: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[2] = x3; if (TARGET_80387) - return 302; + return 320; } goto ret0; - L1528: + L1681: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[2] = x3; if (TARGET_80387) - return 303; + return 321; } goto ret0; - L1484: + L1637: x1 = XEXP (x0, 1); if (binary_387_op (x1, XFmode)) { ro[3] = x1; - goto L1490; + goto L1643; } goto ret0; - L1490: + L1643: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { @@ -3901,182 +4147,182 @@ recog_4 (x0, insn, pnum_clobbers) switch (GET_CODE (x2)) { case FLOAT: - goto L1491; + goto L1644; case FLOAT_EXTEND: - goto L1497; + goto L1650; case SUBREG: case REG: case MEM: if (nonimmediate_operand (x2, XFmode)) { ro[1] = x2; - goto L1486; + goto L1639; } } } - L1502: + L1655: if (general_operand (x2, XFmode)) { ro[1] = x2; - goto L1503; + goto L1656; } goto ret0; - L1491: + L1644: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1492; + goto L1645; } goto ret0; - L1492: + L1645: x2 = XEXP (x1, 1); if (general_operand (x2, XFmode)) { ro[2] = x2; if (TARGET_80387) - return 297; + return 315; } goto ret0; - L1497: + L1650: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[1] = x3; - goto L1498; + goto L1651; } goto ret0; - L1498: + L1651: x2 = XEXP (x1, 1); if (general_operand (x2, XFmode)) { ro[2] = x2; if (TARGET_80387) - return 298; + return 316; } goto ret0; - L1486: + L1639: x2 = XEXP (x1, 1); if (nonimmediate_operand (x2, XFmode)) { ro[2] = x2; if (TARGET_80387) - return 296; + return 314; } x2 = XEXP (x1, 0); - goto L1502; + goto L1655; - L1503: + L1656: x2 = XEXP (x1, 1); if (GET_MODE (x2) != XFmode) goto ret0; switch (GET_CODE (x2)) { case FLOAT: - goto L1504; + goto L1657; case FLOAT_EXTEND: - goto L1510; + goto L1663; } goto ret0; - L1504: + L1657: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[2] = x3; if (TARGET_80387) - return 299; + return 317; } goto ret0; - L1510: + L1663: x3 = XEXP (x2, 0); if (general_operand (x3, SFmode)) { ro[2] = x3; if (TARGET_80387) - return 300; + return 318; } goto ret0; - L1531: + L1684: x1 = XEXP (x0, 1); if (binary_387_op (x1, SFmode)) { ro[3] = x1; - goto L1537; + goto L1690; } goto ret0; - L1537: + L1690: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { case SFmode: if (GET_CODE (x2) == FLOAT && 1) - goto L1538; + goto L1691; if (nonimmediate_operand (x2, SFmode)) { ro[1] = x2; - goto L1533; + goto L1686; } } - L1543: + L1696: if (general_operand (x2, SFmode)) { ro[1] = x2; - goto L1544; + goto L1697; } goto ret0; - L1538: + L1691: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[1] = x3; - goto L1539; + goto L1692; } goto ret0; - L1539: + L1692: x2 = XEXP (x1, 1); if (general_operand (x2, SFmode)) { ro[2] = x2; if (TARGET_80387) - return 305; + return 323; } goto ret0; - L1533: + L1686: x2 = XEXP (x1, 1); if (nonimmediate_operand (x2, SFmode)) { ro[2] = x2; if (TARGET_80387) - return 304; + return 322; } x2 = XEXP (x1, 0); - goto L1543; + goto L1696; - L1544: + L1697: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SFmode && GET_CODE (x2) == FLOAT && 1) - goto L1545; + goto L1698; goto ret0; - L1545: + L1698: x3 = XEXP (x2, 0); if (general_operand (x3, SImode)) { ro[2] = x3; if (TARGET_80387) - return 306; + return 324; } goto ret0; ret0: return -1; @@ -4587,46 +4833,70 @@ recog_6 (x0, insn, pnum_clobbers) x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { + case SFmode: + if (GET_CODE (x2) == MEM && push_operand (x2, SFmode)) + { + ro[0] = x2; + goto L344; + } + L354: + if (memory_operand (x2, SFmode)) + { + ro[0] = x2; + goto L355; + } + L366: + if (register_operand (x2, SFmode)) + { + ro[0] = x2; + goto L367; + } + L513: + if (nonimmediate_operand (x2, SFmode)) + { + ro[0] = x2; + goto L514; + } + break; case DFmode: if (register_operand (x2, DFmode)) { ro[0] = x2; - goto L337; + goto L404; } break; case XFmode: if (register_operand (x2, XFmode)) { ro[0] = x2; - goto L350; + goto L441; } break; - case SFmode: - if (nonimmediate_operand (x2, SFmode)) + case DImode: + if (general_operand (x2, DImode)) { ro[0] = x2; - goto L410; + goto L697; + } + L1082: + if (register_operand (x2, DImode)) + { + ro[0] = x2; + goto L1083; } break; case SImode: if (register_operand (x2, SImode)) { ro[0] = x2; - goto L698; + goto L808; } break; case HImode: if (register_operand (x2, HImode)) { ro[0] = x2; - goto L709; - } - break; - case DImode: - if (register_operand (x2, DImode)) - { - ro[0] = x2; - goto L917; + goto L875; } } switch (GET_CODE (x2)) @@ -4634,536 +4904,864 @@ recog_6 (x0, insn, pnum_clobbers) case CC0: goto L12; case PC: - goto L1301; + goto L1467; } - L1358: + L1524: ro[0] = x2; - goto L1359; - L1548: + goto L1525; + L1701: if (register_operand (x2, SImode)) { ro[0] = x2; - goto L1549; + goto L1702; } goto ret0; - L337: + L344: x2 = XEXP (x1, 1); - if (register_operand (x2, DFmode)) + if (general_operand (x2, SFmode)) { ro[1] = x2; - goto L338; + goto L345; } x2 = XEXP (x1, 0); - goto L1358; + goto L354; - L338: + L345: x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == SET && 1) - goto L339; + if (GET_CODE (x1) == CLOBBER && 1) + goto L346; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L354; - L339: + L346: x2 = XEXP (x1, 0); - if (rtx_equal_p (x2, ro[1]) && 1) - goto L340; + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + return 67; + } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L354; - L340: + L355: x2 = XEXP (x1, 1); - if (rtx_equal_p (x2, ro[0]) && 1) - return 59; + if (memory_operand (x2, SFmode)) + { + ro[1] = x2; + goto L356; + } + x2 = XEXP (x1, 0); + goto L366; + + L356: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L357; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L366; - L350: + L357: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + return 68; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L366; + + L367: x2 = XEXP (x1, 1); - if (register_operand (x2, XFmode)) + if (register_operand (x2, SFmode)) { ro[1] = x2; - goto L351; + goto L368; } x2 = XEXP (x1, 0); - goto L1358; + goto L513; - L351: + L368: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L352; + goto L369; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L513; - L352: + L369: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L353; + goto L370; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L513; - L353: + L370: x2 = XEXP (x1, 1); if (rtx_equal_p (x2, ro[0]) && 1) - return 62; + return 70; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L513; - L410: + L514: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SFmode && GET_CODE (x2) == FLOAT_TRUNCATE && 1) - goto L411; + goto L515; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L411: + L515: x3 = XEXP (x2, 0); if (register_operand (x3, DFmode)) { ro[1] = x3; - goto L412; + goto L516; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L412: + L516: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L413; + goto L517; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L413: + L517: x2 = XEXP (x1, 0); if (memory_operand (x2, SFmode)) { ro[2] = x2; if (TARGET_80387) - return 78; + return 97; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L698: + L404: x2 = XEXP (x1, 1); - if (GET_MODE (x2) != SImode) + if (register_operand (x2, DFmode)) + { + ro[1] = x2; + goto L405; + } + x2 = XEXP (x1, 0); + goto L1524; + + L405: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == SET && 1) + goto L406; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L406: + x2 = XEXP (x1, 0); + if (rtx_equal_p (x2, ro[1]) && 1) + goto L407; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L407: + x2 = XEXP (x1, 1); + if (rtx_equal_p (x2, ro[0]) && 1) + return 76; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L441: + x2 = XEXP (x1, 1); + if (register_operand (x2, XFmode)) + { + ro[1] = x2; + goto L442; + } + x2 = XEXP (x1, 0); + goto L1524; + + L442: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == SET && 1) + goto L443; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L443: + x2 = XEXP (x1, 0); + if (rtx_equal_p (x2, ro[1]) && 1) + goto L444; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L444: + x2 = XEXP (x1, 1); + if (rtx_equal_p (x2, ro[0]) && 1) + return 82; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L697: + x2 = XEXP (x1, 1); + if (GET_MODE (x2) != DImode) { x2 = XEXP (x1, 0); - goto L1358; + goto L1082; } switch (GET_CODE (x2)) { - case DIV: - goto L699; - case UDIV: - goto L721; + case PLUS: + goto L698; + case MINUS: + goto L729; } x2 = XEXP (x1, 0); - goto L1358; + goto L1082; - L699: + L698: x3 = XEXP (x2, 0); - if (register_operand (x3, SImode)) + if (general_operand (x3, DImode)) { ro[1] = x3; + goto L699; + } + x2 = XEXP (x1, 0); + goto L1082; + + L699: + x3 = XEXP (x2, 1); + if (general_operand (x3, DImode)) + { + ro[2] = x3; goto L700; } x2 = XEXP (x1, 0); - goto L1358; + goto L1082; L700: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L701; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1082; + + L701: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 127; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1082; + + L729: + x3 = XEXP (x2, 0); + if (general_operand (x3, DImode)) + { + ro[1] = x3; + goto L730; + } + x2 = XEXP (x1, 0); + goto L1082; + + L730: x3 = XEXP (x2, 1); - if (general_operand (x3, SImode)) + if (general_operand (x3, DImode)) { ro[2] = x3; - goto L701; + goto L731; } x2 = XEXP (x1, 0); - goto L1358; + goto L1082; - L701: + L731: x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == SET && 1) - goto L702; + if (GET_CODE (x1) == CLOBBER && 1) + goto L732; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1082; - L702: + L732: x2 = XEXP (x1, 0); - if (register_operand (x2, SImode)) + if (scratch_operand (x2, SImode)) { ro[3] = x2; - goto L703; + return 135; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1082; - L703: + L1083: x2 = XEXP (x1, 1); - if (GET_MODE (x2) == SImode && GET_CODE (x2) == MOD && 1) - goto L704; - x1 = XVECEXP (x0, 0, 0); + if (GET_MODE (x2) != DImode) + { + x2 = XEXP (x1, 0); + goto L1524; + } + switch (GET_CODE (x2)) + { + case ASHIFT: + goto L1084; + case ASHIFTRT: + goto L1112; + case LSHIFTRT: + goto L1140; + } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L704: + L1084: x3 = XEXP (x2, 0); - if (rtx_equal_p (x3, ro[1]) && 1) - goto L705; - x1 = XVECEXP (x0, 0, 0); + if (register_operand (x3, DImode)) + { + ro[1] = x3; + goto L1085; + } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L705: + L1085: x3 = XEXP (x2, 1); - if (rtx_equal_p (x3, ro[2]) && 1) - return 139; + if (register_operand (x3, QImode)) + { + ro[2] = x3; + goto L1086; + } + x2 = XEXP (x1, 0); + goto L1524; + + L1086: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L1087; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L721: + L1087: + x2 = XEXP (x1, 0); + if (rtx_equal_p (x2, ro[2]) && 1) + return 204; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L1112: x3 = XEXP (x2, 0); - if (register_operand (x3, SImode)) + if (register_operand (x3, DImode)) { ro[1] = x3; - goto L722; + goto L1113; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L722: + L1113: x3 = XEXP (x2, 1); - if (general_operand (x3, SImode)) + if (register_operand (x3, QImode)) { ro[2] = x3; - goto L723; + goto L1114; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L723: + L1114: x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == SET && 1) - goto L724; + if (GET_CODE (x1) == CLOBBER && 1) + goto L1115; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L724: + L1115: x2 = XEXP (x1, 0); - if (register_operand (x2, SImode)) + if (rtx_equal_p (x2, ro[2]) && 1) + return 210; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L1140: + x3 = XEXP (x2, 0); + if (register_operand (x3, DImode)) { - ro[3] = x2; - goto L725; + ro[1] = x3; + goto L1141; } - x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L725: - x2 = XEXP (x1, 1); - if (GET_MODE (x2) == SImode && GET_CODE (x2) == UMOD && 1) - goto L726; - x1 = XVECEXP (x0, 0, 0); + L1141: + x3 = XEXP (x2, 1); + if (register_operand (x3, QImode)) + { + ro[2] = x3; + goto L1142; + } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L726: - x3 = XEXP (x2, 0); - if (rtx_equal_p (x3, ro[1]) && 1) - goto L727; + L1142: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L1143; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L727: - x3 = XEXP (x2, 1); - if (rtx_equal_p (x3, ro[2]) && 1) - return 141; + L1143: + x2 = XEXP (x1, 0); + if (rtx_equal_p (x2, ro[2]) && 1) + return 216; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L709: + L808: x2 = XEXP (x1, 1); - if (GET_MODE (x2) != HImode) + if (GET_MODE (x2) != SImode) { x2 = XEXP (x1, 0); - goto L1358; + goto L1524; } switch (GET_CODE (x2)) { + case TRUNCATE: + goto L809; case DIV: - goto L710; + goto L865; case UDIV: - goto L732; + goto L887; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L710: + L809: x3 = XEXP (x2, 0); - if (register_operand (x3, HImode)) + if (GET_MODE (x3) == DImode && GET_CODE (x3) == LSHIFTRT && 1) + goto L810; + x2 = XEXP (x1, 0); + goto L1524; + + L810: + x4 = XEXP (x3, 0); + if (GET_MODE (x4) == DImode && GET_CODE (x4) == MULT && 1) + goto L811; + x2 = XEXP (x1, 0); + goto L1524; + + L811: + x5 = XEXP (x4, 0); + if (GET_MODE (x5) != DImode) + { + x2 = XEXP (x1, 0); + goto L1524; + } + switch (GET_CODE (x5)) + { + case ZERO_EXTEND: + goto L812; + case SIGN_EXTEND: + goto L835; + } + x2 = XEXP (x1, 0); + goto L1524; + + L812: + x6 = XEXP (x5, 0); + if (register_operand (x6, SImode)) + { + ro[1] = x6; + goto L813; + } + x2 = XEXP (x1, 0); + goto L1524; + + L813: + x5 = XEXP (x4, 1); + if (GET_MODE (x5) == DImode && GET_CODE (x5) == ZERO_EXTEND && 1) + goto L814; + x2 = XEXP (x1, 0); + goto L1524; + + L814: + x6 = XEXP (x5, 0); + if (nonimmediate_operand (x6, SImode)) + { + ro[2] = x6; + goto L815; + } + x2 = XEXP (x1, 0); + goto L1524; + + L815: + x4 = XEXP (x3, 1); + if (GET_CODE (x4) == CONST_INT && XWINT (x4, 0) == 32 && 1) + goto L816; + x2 = XEXP (x1, 0); + goto L1524; + + L816: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L817; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L817: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + if (TARGET_WIDE_MULTIPLY) + return 150; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L835: + x6 = XEXP (x5, 0); + if (register_operand (x6, SImode)) + { + ro[1] = x6; + goto L836; + } + x2 = XEXP (x1, 0); + goto L1524; + + L836: + x5 = XEXP (x4, 1); + if (GET_MODE (x5) == DImode && GET_CODE (x5) == SIGN_EXTEND && 1) + goto L837; + x2 = XEXP (x1, 0); + goto L1524; + + L837: + x6 = XEXP (x5, 0); + if (nonimmediate_operand (x6, SImode)) + { + ro[2] = x6; + goto L838; + } + x2 = XEXP (x1, 0); + goto L1524; + + L838: + x4 = XEXP (x3, 1); + if (GET_CODE (x4) == CONST_INT && XWINT (x4, 0) == 32 && 1) + goto L839; + x2 = XEXP (x1, 0); + goto L1524; + + L839: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L840; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L840: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + if (TARGET_WIDE_MULTIPLY) + return 151; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L865: + x3 = XEXP (x2, 0); + if (register_operand (x3, SImode)) { ro[1] = x3; - goto L711; + goto L866; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L711: + L866: x3 = XEXP (x2, 1); - if (general_operand (x3, HImode)) + if (general_operand (x3, SImode)) { ro[2] = x3; - goto L712; + goto L867; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L712: + L867: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L713; + goto L868; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L713: + L868: x2 = XEXP (x1, 0); - if (register_operand (x2, HImode)) + if (register_operand (x2, SImode)) { ro[3] = x2; - goto L714; + goto L869; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L714: + L869: x2 = XEXP (x1, 1); - if (GET_MODE (x2) == HImode && GET_CODE (x2) == MOD && 1) - goto L715; + if (GET_MODE (x2) == SImode && GET_CODE (x2) == MOD && 1) + goto L870; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L715: + L870: x3 = XEXP (x2, 0); if (rtx_equal_p (x3, ro[1]) && 1) - goto L716; + goto L871; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L716: + L871: x3 = XEXP (x2, 1); if (rtx_equal_p (x3, ro[2]) && 1) - return 140; + return 160; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L732: + L887: x3 = XEXP (x2, 0); - if (register_operand (x3, HImode)) + if (register_operand (x3, SImode)) { ro[1] = x3; - goto L733; + goto L888; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L733: + L888: x3 = XEXP (x2, 1); - if (general_operand (x3, HImode)) + if (general_operand (x3, SImode)) { ro[2] = x3; - goto L734; + goto L889; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L734: + L889: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L735; + goto L890; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L735: + L890: x2 = XEXP (x1, 0); - if (register_operand (x2, HImode)) + if (register_operand (x2, SImode)) { ro[3] = x2; - goto L736; + goto L891; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L736: + L891: x2 = XEXP (x1, 1); - if (GET_MODE (x2) == HImode && GET_CODE (x2) == UMOD && 1) - goto L737; + if (GET_MODE (x2) == SImode && GET_CODE (x2) == UMOD && 1) + goto L892; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L737: + L892: x3 = XEXP (x2, 0); if (rtx_equal_p (x3, ro[1]) && 1) - goto L738; + goto L893; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L738: + L893: x3 = XEXP (x2, 1); if (rtx_equal_p (x3, ro[2]) && 1) - return 142; + return 162; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L917: + L875: x2 = XEXP (x1, 1); - if (GET_MODE (x2) != DImode) + if (GET_MODE (x2) != HImode) { x2 = XEXP (x1, 0); - goto L1358; + goto L1524; } switch (GET_CODE (x2)) { - case ASHIFT: - goto L918; - case ASHIFTRT: - goto L946; - case LSHIFTRT: - goto L974; + case DIV: + goto L876; + case UDIV: + goto L898; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L918: + L876: x3 = XEXP (x2, 0); - if (register_operand (x3, DImode)) + if (register_operand (x3, HImode)) { ro[1] = x3; - goto L919; + goto L877; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L919: + L877: x3 = XEXP (x2, 1); - if (register_operand (x3, QImode)) + if (general_operand (x3, HImode)) { ro[2] = x3; - goto L920; + goto L878; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L920: + L878: x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L921; + if (GET_CODE (x1) == SET && 1) + goto L879; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L921: - x2 = XEXP (x1, 0); - if (rtx_equal_p (x2, ro[2]) && 1) - return 183; - x1 = XVECEXP (x0, 0, 0); + L879: x2 = XEXP (x1, 0); - goto L1358; - - L946: - x3 = XEXP (x2, 0); - if (register_operand (x3, DImode)) + if (register_operand (x2, HImode)) { - ro[1] = x3; - goto L947; + ro[3] = x2; + goto L880; } + x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L947: - x3 = XEXP (x2, 1); - if (register_operand (x3, QImode)) - { - ro[2] = x3; - goto L948; - } + L880: + x2 = XEXP (x1, 1); + if (GET_MODE (x2) == HImode && GET_CODE (x2) == MOD && 1) + goto L881; + x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L948: - x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L949; + L881: + x3 = XEXP (x2, 0); + if (rtx_equal_p (x3, ro[1]) && 1) + goto L882; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L949: - x2 = XEXP (x1, 0); - if (rtx_equal_p (x2, ro[2]) && 1) - return 189; + L882: + x3 = XEXP (x2, 1); + if (rtx_equal_p (x3, ro[2]) && 1) + return 161; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L974: + L898: x3 = XEXP (x2, 0); - if (register_operand (x3, DImode)) + if (register_operand (x3, HImode)) { ro[1] = x3; - goto L975; + goto L899; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L975: + L899: x3 = XEXP (x2, 1); - if (register_operand (x3, QImode)) + if (general_operand (x3, HImode)) { ro[2] = x3; - goto L976; + goto L900; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L976: + L900: x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L977; + if (GET_CODE (x1) == SET && 1) + goto L901; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L977: + L901: x2 = XEXP (x1, 0); - if (rtx_equal_p (x2, ro[2]) && 1) - return 195; + if (register_operand (x2, HImode)) + { + ro[3] = x2; + goto L902; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L902: + x2 = XEXP (x1, 1); + if (GET_MODE (x2) == HImode && GET_CODE (x2) == UMOD && 1) + goto L903; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L903: + x3 = XEXP (x2, 0); + if (rtx_equal_p (x3, ro[1]) && 1) + goto L904; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L1524; + + L904: + x3 = XEXP (x2, 1); + if (rtx_equal_p (x3, ro[2]) && 1) + return 163; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L12: x2 = XEXP (x1, 1); @@ -5200,7 +5798,7 @@ recog_6 (x0, insn, pnum_clobbers) if (GET_MODE (x2) == CCFPEQmode && GET_CODE (x2) == COMPARE && 1) goto L128; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L13: x1 = XVECEXP (x0, 0, 1); @@ -5292,7 +5890,7 @@ recog_6 (x0, insn, pnum_clobbers) } } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L129: x3 = XEXP (x2, 1); @@ -5302,7 +5900,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L130; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L130: x1 = XVECEXP (x0, 0, 1); @@ -5310,7 +5908,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L131; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L131: x2 = XEXP (x1, 0); @@ -5322,7 +5920,7 @@ recog_6 (x0, insn, pnum_clobbers) } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L215: x3 = XEXP (x2, 1); @@ -5332,7 +5930,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L216; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L216: x1 = XVECEXP (x0, 0, 1); @@ -5340,7 +5938,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L217; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L217: x2 = XEXP (x1, 0); @@ -5352,7 +5950,7 @@ recog_6 (x0, insn, pnum_clobbers) } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L271: x3 = XEXP (x2, 1); @@ -5362,7 +5960,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L272; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L272: x1 = XVECEXP (x0, 0, 1); @@ -5370,7 +5968,7 @@ recog_6 (x0, insn, pnum_clobbers) goto L273; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; L273: x2 = XEXP (x1, 0); @@ -5382,307 +5980,307 @@ recog_6 (x0, insn, pnum_clobbers) } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1301: + L1467: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == MINUS && 1) - goto L1302; + goto L1468; if (general_operand (x2, SImode)) { ro[0] = x2; - goto L1327; + goto L1493; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1302: + L1468: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == REG && XINT (x3, 0) == 3 && 1) - goto L1303; + goto L1469; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1303: + L1469: x3 = XEXP (x2, 1); if (GET_MODE (x3) == SImode && GET_CODE (x3) == MEM && 1) - goto L1304; + goto L1470; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1304: + L1470: x4 = XEXP (x3, 0); if (GET_MODE (x4) == SImode && GET_CODE (x4) == PLUS && 1) - goto L1305; + goto L1471; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1305: + L1471: x5 = XEXP (x4, 0); if (GET_MODE (x5) == SImode && GET_CODE (x5) == MULT && 1) - goto L1306; + goto L1472; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1306: + L1472: x6 = XEXP (x5, 0); if (register_operand (x6, SImode)) { ro[0] = x6; - goto L1307; + goto L1473; } x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1307: + L1473: x6 = XEXP (x5, 1); if (GET_CODE (x6) == CONST_INT && XWINT (x6, 0) == 4 && 1) - goto L1308; + goto L1474; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1308: + L1474: x5 = XEXP (x4, 1); if (GET_CODE (x5) == LABEL_REF && 1) - goto L1309; + goto L1475; x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1309: + L1475: x6 = XEXP (x5, 0); ro[1] = x6; - goto L1310; + goto L1476; - L1310: + L1476: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L1311; + goto L1477; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1311: + L1477: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[2] = x2; - return 264; + return 285; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1327: + L1493: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == USE && 1) - goto L1328; + goto L1494; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1328: + L1494: x2 = XEXP (x1, 0); if (GET_CODE (x2) == LABEL_REF && 1) - goto L1329; + goto L1495; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1358; + goto L1524; - L1329: + L1495: x3 = XEXP (x2, 0); ro[1] = x3; - return 265; + return 286; - L1359: + L1525: x2 = XEXP (x1, 1); if (GET_CODE (x2) == CALL && 1) - goto L1371; + goto L1537; x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1371: + L1537: x3 = XEXP (x2, 0); if (GET_MODE (x3) == QImode && GET_CODE (x3) == MEM && 1) - goto L1372; - L1360: + goto L1538; + L1526: if (call_insn_operand (x3, QImode)) { ro[1] = x3; - goto L1361; + goto L1527; } x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1372: + L1538: x4 = XEXP (x3, 0); if (symbolic_operand (x4, SImode)) { ro[1] = x4; - goto L1373; + goto L1539; } - goto L1360; + goto L1526; - L1373: + L1539: x3 = XEXP (x2, 1); if (general_operand (x3, SImode)) { ro[2] = x3; - goto L1374; + goto L1540; } x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1374: + L1540: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L1375; + goto L1541; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 1); x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1375: + L1541: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == REG && XINT (x2, 0) == 7 && 1) - goto L1376; + goto L1542; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 1); x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1376: + L1542: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == PLUS && 1) - goto L1377; + goto L1543; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 1); x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1377: + L1543: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == REG && XINT (x3, 0) == 7 && 1) - goto L1378; + goto L1544; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 1); x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1378: + L1544: x3 = XEXP (x2, 1); if (immediate_operand (x3, SImode)) { ro[4] = x3; if (!HALF_PIC_P ()) - return 274; + return 295; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 1); x3 = XEXP (x2, 0); - goto L1360; + goto L1526; - L1361: + L1527: x3 = XEXP (x2, 1); if (general_operand (x3, SImode)) { ro[2] = x3; - goto L1362; + goto L1528; } x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1362: + L1528: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L1363; + goto L1529; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1363: + L1529: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == REG && XINT (x2, 0) == 7 && 1) - goto L1364; + goto L1530; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1364: + L1530: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == PLUS && 1) - goto L1365; + goto L1531; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1365: + L1531: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == REG && XINT (x3, 0) == 7 && 1) - goto L1366; + goto L1532; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1366: + L1532: x3 = XEXP (x2, 1); if (immediate_operand (x3, SImode)) { ro[4] = x3; - return 273; + return 294; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1548; + goto L1701; - L1549: + L1702: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == UNSPEC && XINT (x2, 1) == 0 && XVECLEN (x2, 0) == 3 && 1) - goto L1550; + goto L1703; goto ret0; - L1550: + L1703: x3 = XVECEXP (x2, 0, 0); if (GET_MODE (x3) == BLKmode && GET_CODE (x3) == MEM && 1) - goto L1551; + goto L1704; goto ret0; - L1551: + L1704: x4 = XEXP (x3, 0); if (address_operand (x4, SImode)) { ro[1] = x4; - goto L1552; + goto L1705; } goto ret0; - L1552: + L1705: x3 = XVECEXP (x2, 0, 1); if (register_operand (x3, QImode)) { ro[2] = x3; - goto L1553; + goto L1706; } goto ret0; - L1553: + L1706: x3 = XVECEXP (x2, 0, 2); if (immediate_operand (x3, SImode)) { ro[3] = x3; - goto L1554; + goto L1707; } goto ret0; - L1554: + L1707: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L1555; + goto L1708; goto ret0; - L1555: + L1708: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - return 308; + return 326; goto ret0; ret0: return -1; } @@ -5701,86 +6299,561 @@ recog_7 (x0, insn, pnum_clobbers) x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { + case DFmode: + if (GET_CODE (x2) == MEM && push_operand (x2, DFmode)) + { + ro[0] = x2; + goto L377; + } + L389: + if (memory_operand (x2, DFmode)) + { + ro[0] = x2; + goto L390; + } + break; + case XFmode: + if (GET_CODE (x2) == MEM && push_operand (x2, XFmode)) + { + ro[0] = x2; + goto L414; + } + L426: + if (memory_operand (x2, XFmode)) + { + ro[0] = x2; + goto L427; + } + break; + case DImode: + if (GET_CODE (x2) == MEM && push_operand (x2, DImode)) + { + ro[0] = x2; + goto L448; + } + L458: + if (general_operand (x2, DImode)) + { + ro[0] = x2; + goto L459; + } + break; + case SImode: + if (general_operand (x2, SImode)) + { + ro[0] = x2; + goto L619; + } + } + goto ret0; + + L377: + x2 = XEXP (x1, 1); + if (general_operand (x2, DFmode)) + { + ro[1] = x2; + goto L378; + } + x2 = XEXP (x1, 0); + goto L389; + + L378: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L379; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L389; + + L379: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L380; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L389; + + L380: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L381; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L389; + + L381: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 73; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L389; + + L390: + x2 = XEXP (x1, 1); + if (memory_operand (x2, DFmode)) + { + ro[1] = x2; + goto L391; + } + goto ret0; + + L391: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L392; + goto ret0; + + L392: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L393; + } + goto ret0; + + L393: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L394; + goto ret0; + + L394: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 74; + } + goto ret0; + + L414: + x2 = XEXP (x1, 1); + if (general_operand (x2, XFmode)) + { + ro[1] = x2; + goto L415; + } + x2 = XEXP (x1, 0); + goto L426; + + L415: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L416; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L426; + + L416: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L417; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L426; + + L417: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L418; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L426; + + L418: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 79; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L426; + + L427: + x2 = XEXP (x1, 1); + if (memory_operand (x2, XFmode)) + { + ro[1] = x2; + goto L428; + } + goto ret0; + + L428: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L429; + goto ret0; + + L429: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L430; + } + goto ret0; + + L430: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L431; + goto ret0; + + L431: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 80; + } + goto ret0; + + L448: + x2 = XEXP (x1, 1); + if (general_operand (x2, DImode)) + { + ro[1] = x2; + goto L449; + } + x2 = XEXP (x1, 0); + goto L458; + + L449: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L450; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L458; + + L450: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L451; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L458; + + L451: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L452; + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L458; + + L452: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 83; + } + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + goto L458; + + L459: + x2 = XEXP (x1, 1); + if (general_operand (x2, DImode)) + { + ro[1] = x2; + goto L460; + } + goto ret0; + + L460: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L461; + goto ret0; + + L461: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[2] = x2; + goto L462; + } + goto ret0; + + L462: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L463; + goto ret0; + + L463: + x2 = XEXP (x1, 0); + if (scratch_operand (x2, SImode)) + { + ro[3] = x2; + return 84; + } + goto ret0; + + L619: + x2 = XEXP (x1, 1); + if (GET_MODE (x2) == SImode && GET_CODE (x2) == FIX && 1) + goto L620; + goto ret0; + + L620: + x3 = XEXP (x2, 0); + if (GET_CODE (x3) != FIX) + goto ret0; + switch (GET_MODE (x3)) + { + case XFmode: + goto L621; + case DFmode: + goto L643; + case SFmode: + goto L665; + } + goto ret0; + + L621: + x4 = XEXP (x3, 0); + if (register_operand (x4, XFmode)) + { + ro[1] = x4; + goto L622; + } + goto ret0; + + L622: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L623; + goto ret0; + + L623: + x2 = XEXP (x1, 0); + if (memory_operand (x2, SImode)) + { + ro[2] = x2; + goto L624; + } + goto ret0; + + L624: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L625; + goto ret0; + + L625: + x2 = XEXP (x1, 0); + if (pnum_clobbers != 0 && memory_operand (x2, SImode)) + { + ro[3] = x2; + if (TARGET_80387) + { + *pnum_clobbers = 1; + return 112; + } + } + goto ret0; + + L643: + x4 = XEXP (x3, 0); + if (register_operand (x4, DFmode)) + { + ro[1] = x4; + goto L644; + } + goto ret0; + + L644: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L645; + goto ret0; + + L645: + x2 = XEXP (x1, 0); + if (memory_operand (x2, SImode)) + { + ro[2] = x2; + goto L646; + } + goto ret0; + + L646: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L647; + goto ret0; + + L647: + x2 = XEXP (x1, 0); + if (pnum_clobbers != 0 && memory_operand (x2, SImode)) + { + ro[3] = x2; + if (TARGET_80387) + { + *pnum_clobbers = 1; + return 113; + } + } + goto ret0; + + L665: + x4 = XEXP (x3, 0); + if (register_operand (x4, SFmode)) + { + ro[1] = x4; + goto L666; + } + goto ret0; + + L666: + x1 = XVECEXP (x0, 0, 1); + if (GET_CODE (x1) == CLOBBER && 1) + goto L667; + goto ret0; + + L667: + x2 = XEXP (x1, 0); + if (memory_operand (x2, SImode)) + { + ro[2] = x2; + goto L668; + } + goto ret0; + + L668: + x1 = XVECEXP (x0, 0, 2); + if (GET_CODE (x1) == CLOBBER && 1) + goto L669; + goto ret0; + + L669: + x2 = XEXP (x1, 0); + if (pnum_clobbers != 0 && memory_operand (x2, SImode)) + { + ro[3] = x2; + if (TARGET_80387) + { + *pnum_clobbers = 1; + return 114; + } + } + goto ret0; + ret0: return -1; +} + +int +recog_8 (x0, insn, pnum_clobbers) + register rtx x0; + rtx insn; + int *pnum_clobbers; +{ + register rtx *ro = &recog_operand[0]; + register rtx x1, x2, x3, x4, x5, x6; + int tem; + + x1 = XVECEXP (x0, 0, 0); + x2 = XEXP (x1, 0); + switch (GET_MODE (x2)) + { case DImode: if (general_operand (x2, DImode)) { ro[0] = x2; - goto L439; + goto L543; } break; case SImode: if (general_operand (x2, SImode)) { ro[0] = x2; - goto L503; + goto L607; } } goto ret0; - L439: + L543: x2 = XEXP (x1, 1); if (GET_MODE (x2) == DImode && GET_CODE (x2) == FIX && 1) - goto L440; + goto L544; goto ret0; - L440: + L544: x3 = XEXP (x2, 0); if (GET_CODE (x3) != FIX) goto ret0; switch (GET_MODE (x3)) { case XFmode: - goto L441; + goto L545; case DFmode: - goto L467; + goto L571; case SFmode: - goto L493; + goto L597; } goto ret0; - L441: + L545: x4 = XEXP (x3, 0); if (register_operand (x4, XFmode)) { ro[1] = x4; - goto L442; + goto L546; } goto ret0; - L442: + L546: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L443; + goto L547; goto ret0; - L443: + L547: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L444; + goto L548; goto ret0; - L444: + L548: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L445; + goto L549; goto ret0; - L445: + L549: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L446; + goto L550; } goto ret0; - L446: + L550: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L447; + goto L551; goto ret0; - L447: + L551: x2 = XEXP (x1, 0); if (pnum_clobbers != 0 && memory_operand (x2, SImode)) { @@ -5788,54 +6861,54 @@ recog_7 (x0, insn, pnum_clobbers) if (TARGET_80387) { *pnum_clobbers = 1; - return 87; + return 106; } } goto ret0; - L467: + L571: x4 = XEXP (x3, 0); if (register_operand (x4, DFmode)) { ro[1] = x4; - goto L468; + goto L572; } goto ret0; - L468: + L572: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L469; + goto L573; goto ret0; - L469: + L573: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L470; + goto L574; goto ret0; - L470: + L574: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L471; + goto L575; goto ret0; - L471: + L575: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L472; + goto L576; } goto ret0; - L472: + L576: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L473; + goto L577; goto ret0; - L473: + L577: x2 = XEXP (x1, 0); if (pnum_clobbers != 0 && memory_operand (x2, SImode)) { @@ -5843,54 +6916,54 @@ recog_7 (x0, insn, pnum_clobbers) if (TARGET_80387) { *pnum_clobbers = 1; - return 88; + return 107; } } goto ret0; - L493: + L597: x4 = XEXP (x3, 0); if (register_operand (x4, SFmode)) { ro[1] = x4; - goto L494; + goto L598; } goto ret0; - L494: + L598: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L495; + goto L599; goto ret0; - L495: + L599: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L496; + goto L600; goto ret0; - L496: + L600: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L497; + goto L601; goto ret0; - L497: + L601: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L498; + goto L602; } goto ret0; - L498: + L602: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L499; + goto L603; goto ret0; - L499: + L603: x2 = XEXP (x1, 0); if (pnum_clobbers != 0 && memory_operand (x2, SImode)) { @@ -5898,194 +6971,194 @@ recog_7 (x0, insn, pnum_clobbers) if (TARGET_80387) { *pnum_clobbers = 1; - return 89; + return 108; } } goto ret0; - L503: + L607: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == FIX && 1) - goto L504; + goto L608; goto ret0; - L504: + L608: x3 = XEXP (x2, 0); if (GET_CODE (x3) != FIX) goto ret0; switch (GET_MODE (x3)) { case XFmode: - goto L505; + goto L609; case DFmode: - goto L527; + goto L631; case SFmode: - goto L549; + goto L653; } goto ret0; - L505: + L609: x4 = XEXP (x3, 0); if (register_operand (x4, XFmode)) { ro[1] = x4; - goto L506; + goto L610; } goto ret0; - L506: + L610: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L507; + goto L611; goto ret0; - L507: + L611: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L508; + goto L612; } goto ret0; - L508: + L612: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L509; + goto L613; goto ret0; - L509: + L613: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L510; + goto L614; } goto ret0; - L510: + L614: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L511; + goto L615; goto ret0; - L511: + L615: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 93; + return 112; } goto ret0; - L527: + L631: x4 = XEXP (x3, 0); if (register_operand (x4, DFmode)) { ro[1] = x4; - goto L528; + goto L632; } goto ret0; - L528: + L632: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L529; + goto L633; goto ret0; - L529: + L633: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L530; + goto L634; } goto ret0; - L530: + L634: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L531; + goto L635; goto ret0; - L531: + L635: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L532; + goto L636; } goto ret0; - L532: + L636: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L533; + goto L637; goto ret0; - L533: + L637: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 94; + return 113; } goto ret0; - L549: + L653: x4 = XEXP (x3, 0); if (register_operand (x4, SFmode)) { ro[1] = x4; - goto L550; + goto L654; } goto ret0; - L550: + L654: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L551; + goto L655; goto ret0; - L551: + L655: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L552; + goto L656; } goto ret0; - L552: + L656: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L553; + goto L657; goto ret0; - L553: + L657: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L554; + goto L658; } goto ret0; - L554: + L658: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L555; + goto L659; goto ret0; - L555: + L659: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 95; + return 114; } goto ret0; ret0: return -1; @@ -6101,45 +7174,36 @@ recog (x0, insn, pnum_clobbers) register rtx x1, x2, x3, x4, x5, x6; int tem; - L1403: + L0: switch (GET_CODE (x0)) { - case UNSPEC: - if (GET_MODE (x0) == SImode && XINT (x0, 1) == 0 && XVECLEN (x0, 0) == 1 && 1) - goto L1404; - break; case SET: goto L295; case PARALLEL: if (XVECLEN (x0, 0) == 2 && 1) goto L10; + if (XVECLEN (x0, 0) == 3 && 1) + goto L375; if (XVECLEN (x0, 0) == 5 && 1) - goto L423; + goto L527; if (XVECLEN (x0, 0) == 4 && 1) - goto L437; - if (XVECLEN (x0, 0) == 3 && 1) - goto L513; + goto L541; if (XVECLEN (x0, 0) == 6 && 1) - goto L1408; + goto L1561; break; case CALL: - goto L1350; + goto L1516; + case UNSPEC_VOLATILE: + if (XINT (x0, 1) == 0 && XVECLEN (x0, 0) == 1 && 1) + goto L1557; + break; case RETURN: if (simple_386_epilogue ()) - return 283; + return 301; break; case CONST_INT: if (XWINT (x0, 0) == 0 && 1) - return 284; - } - goto ret0; - - L1404: - x1 = XVECEXP (x0, 0, 0); - if (memory_operand (x1, SImode)) - { - ro[0] = x1; - return 282; + return 302; } goto ret0; L295: @@ -6150,976 +7214,752 @@ recog (x0, insn, pnum_clobbers) switch (GET_CODE (x1)) { case SET: - goto L336; + goto L343; case CALL: - goto L1341; + goto L1507; } goto ret0; - L336: + L343: return recog_6 (x0, insn, pnum_clobbers); - L1341: + L1507: x2 = XEXP (x1, 0); if (GET_MODE (x2) == QImode && GET_CODE (x2) == MEM && 1) - goto L1342; - L1332: + goto L1508; + L1498: if (call_insn_operand (x2, QImode)) { ro[0] = x2; - goto L1333; + goto L1499; } goto ret0; - L1342: + L1508: x3 = XEXP (x2, 0); if (symbolic_operand (x3, SImode)) { ro[0] = x3; - goto L1343; + goto L1509; } - goto L1332; + goto L1498; - L1343: + L1509: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L1344; + goto L1510; } x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1344: + L1510: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L1345; + goto L1511; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1345: + L1511: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == REG && XINT (x2, 0) == 7 && 1) - goto L1346; + goto L1512; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1346: + L1512: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == PLUS && 1) - goto L1347; + goto L1513; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1347: + L1513: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == REG && XINT (x3, 0) == 7 && 1) - goto L1348; + goto L1514; x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1348: + L1514: x3 = XEXP (x2, 1); if (immediate_operand (x3, SImode)) { ro[3] = x3; if (!HALF_PIC_P ()) - return 268; + return 289; } x1 = XVECEXP (x0, 0, 0); x2 = XEXP (x1, 0); - goto L1332; + goto L1498; - L1333: + L1499: x2 = XEXP (x1, 1); if (general_operand (x2, SImode)) { ro[1] = x2; - goto L1334; + goto L1500; } goto ret0; - L1334: + L1500: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == SET && 1) - goto L1335; + goto L1501; goto ret0; - L1335: + L1501: x2 = XEXP (x1, 0); if (GET_MODE (x2) == SImode && GET_CODE (x2) == REG && XINT (x2, 0) == 7 && 1) - goto L1336; + goto L1502; goto ret0; - L1336: + L1502: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == PLUS && 1) - goto L1337; + goto L1503; goto ret0; - L1337: + L1503: x3 = XEXP (x2, 0); if (GET_MODE (x3) == SImode && GET_CODE (x3) == REG && XINT (x3, 0) == 7 && 1) - goto L1338; + goto L1504; goto ret0; - L1338: + L1504: x3 = XEXP (x2, 1); if (immediate_operand (x3, SImode)) { ro[3] = x3; - return 267; + return 288; } goto ret0; - L423: + L375: + x1 = XVECEXP (x0, 0, 0); + if (GET_CODE (x1) == SET && 1) + goto L376; + goto ret0; + L376: + return recog_7 (x0, insn, pnum_clobbers); + + L527: x1 = XVECEXP (x0, 0, 0); if (GET_CODE (x1) == SET && 1) - goto L424; + goto L528; goto ret0; - L424: + L528: x2 = XEXP (x1, 0); if (GET_MODE (x2) == DImode && general_operand (x2, DImode)) { ro[0] = x2; - goto L425; + goto L529; } goto ret0; - L425: + L529: x2 = XEXP (x1, 1); if (GET_MODE (x2) == DImode && GET_CODE (x2) == FIX && 1) - goto L426; + goto L530; goto ret0; - L426: + L530: x3 = XEXP (x2, 0); if (GET_CODE (x3) != FIX) goto ret0; switch (GET_MODE (x3)) { case XFmode: - goto L427; + goto L531; case DFmode: - goto L453; + goto L557; case SFmode: - goto L479; + goto L583; } goto ret0; - L427: + L531: x4 = XEXP (x3, 0); if (register_operand (x4, XFmode)) { ro[1] = x4; - goto L428; + goto L532; } goto ret0; - L428: + L532: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L429; + goto L533; goto ret0; - L429: + L533: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L430; + goto L534; goto ret0; - L430: + L534: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L431; + goto L535; goto ret0; - L431: + L535: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L432; + goto L536; } goto ret0; - L432: + L536: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L433; + goto L537; goto ret0; - L433: + L537: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L434; + goto L538; } goto ret0; - L434: + L538: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L435; + goto L539; goto ret0; - L435: + L539: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 87; + return 106; } goto ret0; - L453: + L557: x4 = XEXP (x3, 0); if (register_operand (x4, DFmode)) { ro[1] = x4; - goto L454; + goto L558; } goto ret0; - L454: + L558: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L455; + goto L559; goto ret0; - L455: + L559: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L456; + goto L560; goto ret0; - L456: + L560: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L457; + goto L561; goto ret0; - L457: + L561: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L458; + goto L562; } goto ret0; - L458: + L562: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L459; + goto L563; goto ret0; - L459: + L563: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L460; + goto L564; } goto ret0; - L460: + L564: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L461; + goto L565; goto ret0; - L461: + L565: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 88; + return 107; } goto ret0; - L479: + L583: x4 = XEXP (x3, 0); if (register_operand (x4, SFmode)) { ro[1] = x4; - goto L480; + goto L584; } goto ret0; - L480: + L584: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == CLOBBER && 1) - goto L481; + goto L585; goto ret0; - L481: + L585: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L482; + goto L586; goto ret0; - L482: + L586: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == CLOBBER && 1) - goto L483; + goto L587; goto ret0; - L483: + L587: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[2] = x2; - goto L484; + goto L588; } goto ret0; - L484: + L588: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L485; + goto L589; goto ret0; - L485: + L589: x2 = XEXP (x1, 0); if (memory_operand (x2, SImode)) { ro[3] = x2; - goto L486; + goto L590; } goto ret0; - L486: + L590: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L487; + goto L591; goto ret0; - L487: + L591: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; if (TARGET_80387) - return 89; + return 108; } goto ret0; - L437: - x1 = XVECEXP (x0, 0, 0); - if (GET_CODE (x1) == SET && 1) - goto L438; - goto ret0; - L438: - return recog_7 (x0, insn, pnum_clobbers); - - L513: - x1 = XVECEXP (x0, 0, 0); - switch (GET_CODE (x1)) - { - case SET: - goto L514; - case CALL: - goto L1398; - } - goto ret0; - - L514: - x2 = XEXP (x1, 0); - if (GET_MODE (x2) == SImode && general_operand (x2, SImode)) - { - ro[0] = x2; - goto L515; - } - goto ret0; - - L515: - x2 = XEXP (x1, 1); - if (GET_MODE (x2) == SImode && GET_CODE (x2) == FIX && 1) - goto L516; - goto ret0; - - L516: - x3 = XEXP (x2, 0); - if (GET_CODE (x3) != FIX) - goto ret0; - switch (GET_MODE (x3)) - { - case XFmode: - goto L517; - case DFmode: - goto L539; - case SFmode: - goto L561; - } - goto ret0; - - L517: - x4 = XEXP (x3, 0); - if (register_operand (x4, XFmode)) - { - ro[1] = x4; - goto L518; - } - goto ret0; - - L518: - x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L519; - goto ret0; - - L519: - x2 = XEXP (x1, 0); - if (memory_operand (x2, SImode)) - { - ro[2] = x2; - goto L520; - } - goto ret0; - - L520: - x1 = XVECEXP (x0, 0, 2); - if (GET_CODE (x1) == CLOBBER && 1) - goto L521; - goto ret0; - - L521: - x2 = XEXP (x1, 0); - if (pnum_clobbers != 0 && memory_operand (x2, SImode)) - { - ro[3] = x2; - if (TARGET_80387) - { - *pnum_clobbers = 1; - return 93; - } - } - goto ret0; - - L539: - x4 = XEXP (x3, 0); - if (register_operand (x4, DFmode)) - { - ro[1] = x4; - goto L540; - } - goto ret0; - - L540: - x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L541; - goto ret0; - L541: - x2 = XEXP (x1, 0); - if (memory_operand (x2, SImode)) - { - ro[2] = x2; - goto L542; - } - goto ret0; - - L542: - x1 = XVECEXP (x0, 0, 2); - if (GET_CODE (x1) == CLOBBER && 1) - goto L543; - goto ret0; - - L543: - x2 = XEXP (x1, 0); - if (pnum_clobbers != 0 && memory_operand (x2, SImode)) - { - ro[3] = x2; - if (TARGET_80387) - { - *pnum_clobbers = 1; - return 94; - } - } - goto ret0; - - L561: - x4 = XEXP (x3, 0); - if (register_operand (x4, SFmode)) - { - ro[1] = x4; - goto L562; - } - goto ret0; - - L562: - x1 = XVECEXP (x0, 0, 1); - if (GET_CODE (x1) == CLOBBER && 1) - goto L563; - goto ret0; - - L563: - x2 = XEXP (x1, 0); - if (memory_operand (x2, SImode)) - { - ro[2] = x2; - goto L564; - } - goto ret0; - - L564: - x1 = XVECEXP (x0, 0, 2); - if (GET_CODE (x1) == CLOBBER && 1) - goto L565; - goto ret0; - - L565: - x2 = XEXP (x1, 0); - if (pnum_clobbers != 0 && memory_operand (x2, SImode)) - { - ro[3] = x2; - if (TARGET_80387) - { - *pnum_clobbers = 1; - return 95; - } - } - goto ret0; - - L1398: - x2 = XEXP (x1, 0); - if (GET_MODE (x2) == QImode && GET_CODE (x2) == MEM && 1) - goto L1399; - L1392: - if (call_insn_operand (x2, QImode)) - { - ro[0] = x2; - goto L1393; - } - goto ret0; - - L1399: - x3 = XEXP (x2, 0); - if (symbolic_operand (x3, SImode)) - { - ro[0] = x3; - goto L1400; - } - goto L1392; - - L1400: - x2 = XEXP (x1, 1); - if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - goto L1401; - x2 = XEXP (x1, 0); - goto L1392; - - L1401: - x1 = XVECEXP (x0, 0, 1); - if (memory_operand (x1, DImode)) - { - ro[1] = x1; - goto L1402; - } - x1 = XVECEXP (x0, 0, 0); - x2 = XEXP (x1, 0); - goto L1392; - - L1402: - x1 = XVECEXP (x0, 0, 2); - ro[2] = x1; - if (!HALF_PIC_P ()) - return 280; x1 = XVECEXP (x0, 0, 0); - x2 = XEXP (x1, 0); - goto L1392; - - L1393: - x2 = XEXP (x1, 1); - if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1) - goto L1394; - goto ret0; - - L1394: - x1 = XVECEXP (x0, 0, 1); - if (memory_operand (x1, DImode)) - { - ro[1] = x1; - goto L1395; - } + if (GET_CODE (x1) == SET && 1) + goto L542; goto ret0; + L542: + return recog_8 (x0, insn, pnum_clobbers); - L1395: - x1 = XVECEXP (x0, 0, 2); - ro[2] = x1; - return 279; - - L1408: + L1561: x1 = XVECEXP (x0, 0, 0); if (GET_CODE (x1) == SET && 1) - goto L1409; + goto L1562; goto ret0; - L1409: + L1562: x2 = XEXP (x1, 0); switch (GET_MODE (x2)) { case BLKmode: if (GET_CODE (x2) == MEM && 1) - goto L1410; + goto L1563; break; case SImode: if (general_operand (x2, SImode)) { ro[0] = x2; - goto L1426; + goto L1579; } } if (GET_CODE (x2) == CC0 && 1) - goto L1444; + goto L1597; goto ret0; - L1410: + L1563: x3 = XEXP (x2, 0); if (address_operand (x3, SImode)) { ro[0] = x3; - goto L1411; + goto L1564; } goto ret0; - L1411: + L1564: x2 = XEXP (x1, 1); if (GET_MODE (x2) == BLKmode && GET_CODE (x2) == MEM && 1) - goto L1412; + goto L1565; goto ret0; - L1412: + L1565: x3 = XEXP (x2, 0); if (address_operand (x3, SImode)) { ro[1] = x3; - goto L1413; + goto L1566; } goto ret0; - L1413: + L1566: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == USE && 1) - goto L1414; + goto L1567; goto ret0; - L1414: + L1567: x2 = XEXP (x1, 0); if (GET_CODE (x2) == CONST_INT && 1) { ro[2] = x2; - goto L1415; + goto L1568; } goto ret0; - L1415: + L1568: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == USE && 1) - goto L1416; + goto L1569; goto ret0; - L1416: + L1569: x2 = XEXP (x1, 0); if (immediate_operand (x2, SImode)) { ro[3] = x2; - goto L1417; + goto L1570; } goto ret0; - L1417: + L1570: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L1418; + goto L1571; goto ret0; - L1418: + L1571: x2 = XEXP (x1, 0); if (scratch_operand (x2, SImode)) { ro[4] = x2; - goto L1419; + goto L1572; } goto ret0; - L1419: + L1572: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L1420; + goto L1573; goto ret0; - L1420: + L1573: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[0]) && 1) - goto L1421; + goto L1574; goto ret0; - L1421: + L1574: x1 = XVECEXP (x0, 0, 5); if (GET_CODE (x1) == CLOBBER && 1) - goto L1422; + goto L1575; goto ret0; - L1422: + L1575: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - return 286; + return 304; goto ret0; - L1426: + L1579: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == COMPARE && 1) - goto L1427; + goto L1580; goto ret0; - L1427: + L1580: x3 = XEXP (x2, 0); if (GET_MODE (x3) == BLKmode && GET_CODE (x3) == MEM && 1) - goto L1428; + goto L1581; goto ret0; - L1428: + L1581: x4 = XEXP (x3, 0); if (address_operand (x4, SImode)) { ro[1] = x4; - goto L1429; + goto L1582; } goto ret0; - L1429: + L1582: x3 = XEXP (x2, 1); if (GET_MODE (x3) == BLKmode && GET_CODE (x3) == MEM && 1) - goto L1430; + goto L1583; goto ret0; - L1430: + L1583: x4 = XEXP (x3, 0); if (address_operand (x4, SImode)) { ro[2] = x4; - goto L1431; + goto L1584; } goto ret0; - L1431: + L1584: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == USE && 1) - goto L1432; + goto L1585; goto ret0; - L1432: + L1585: x2 = XEXP (x1, 0); if (register_operand (x2, SImode)) { ro[3] = x2; - goto L1433; + goto L1586; } goto ret0; - L1433: + L1586: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == USE && 1) - goto L1434; + goto L1587; goto ret0; - L1434: + L1587: x2 = XEXP (x1, 0); if (immediate_operand (x2, SImode)) { ro[4] = x2; - goto L1435; + goto L1588; } goto ret0; - L1435: + L1588: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L1436; + goto L1589; goto ret0; - L1436: + L1589: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L1437; + goto L1590; goto ret0; - L1437: + L1590: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L1438; + goto L1591; goto ret0; - L1438: + L1591: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[2]) && 1) - goto L1439; + goto L1592; goto ret0; - L1439: + L1592: x1 = XVECEXP (x0, 0, 5); if (GET_CODE (x1) == CLOBBER && 1) - goto L1440; + goto L1593; goto ret0; - L1440: + L1593: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[3]) && 1) - return 288; + return 306; goto ret0; - L1444: + L1597: x2 = XEXP (x1, 1); if (GET_MODE (x2) == SImode && GET_CODE (x2) == COMPARE && 1) - goto L1445; + goto L1598; goto ret0; - L1445: + L1598: x3 = XEXP (x2, 0); if (GET_MODE (x3) == BLKmode && GET_CODE (x3) == MEM && 1) - goto L1446; + goto L1599; goto ret0; - L1446: + L1599: x4 = XEXP (x3, 0); if (address_operand (x4, SImode)) { ro[0] = x4; - goto L1447; + goto L1600; } goto ret0; - L1447: + L1600: x3 = XEXP (x2, 1); if (GET_MODE (x3) == BLKmode && GET_CODE (x3) == MEM && 1) - goto L1448; + goto L1601; goto ret0; - L1448: + L1601: x4 = XEXP (x3, 0); if (address_operand (x4, SImode)) { ro[1] = x4; - goto L1449; + goto L1602; } goto ret0; - L1449: + L1602: x1 = XVECEXP (x0, 0, 1); if (GET_CODE (x1) == USE && 1) - goto L1450; + goto L1603; goto ret0; - L1450: + L1603: x2 = XEXP (x1, 0); if (register_operand (x2, SImode)) { ro[2] = x2; - goto L1451; + goto L1604; } goto ret0; - L1451: + L1604: x1 = XVECEXP (x0, 0, 2); if (GET_CODE (x1) == USE && 1) - goto L1452; + goto L1605; goto ret0; - L1452: + L1605: x2 = XEXP (x1, 0); if (immediate_operand (x2, SImode)) { ro[3] = x2; - goto L1453; + goto L1606; } goto ret0; - L1453: + L1606: x1 = XVECEXP (x0, 0, 3); if (GET_CODE (x1) == CLOBBER && 1) - goto L1454; + goto L1607; goto ret0; - L1454: + L1607: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[0]) && 1) - goto L1455; + goto L1608; goto ret0; - L1455: + L1608: x1 = XVECEXP (x0, 0, 4); if (GET_CODE (x1) == CLOBBER && 1) - goto L1456; + goto L1609; goto ret0; - L1456: + L1609: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[1]) && 1) - goto L1457; + goto L1610; goto ret0; - L1457: + L1610: x1 = XVECEXP (x0, 0, 5); if (GET_CODE (x1) == CLOBBER && 1) - goto L1458; + goto L1611; goto ret0; - L1458: + L1611: x2 = XEXP (x1, 0); if (rtx_equal_p (x2, ro[2]) && 1) - return 289; + return 307; goto ret0; - L1350: + L1516: x1 = XEXP (x0, 0); if (call_insn_operand (x1, QImode)) { ro[0] = x1; - goto L1351; + goto L1517; } - L1353: + L1519: if (GET_MODE (x1) == QImode && GET_CODE (x1) == MEM && 1) - goto L1354; + goto L1520; goto ret0; - L1351: + L1517: x1 = XEXP (x0, 1); if (general_operand (x1, SImode)) { ro[1] = x1; - return 270; + return 291; } x1 = XEXP (x0, 0); - goto L1353; + goto L1519; - L1354: + L1520: x2 = XEXP (x1, 0); if (symbolic_operand (x2, SImode)) { ro[0] = x2; - goto L1355; + goto L1521; } goto ret0; - L1355: + L1521: x1 = XEXP (x0, 1); if (general_operand (x1, SImode)) { ro[1] = x1; if (!HALF_PIC_P ()) - return 271; + return 292; } goto ret0; + + L1557: + x1 = XVECEXP (x0, 0, 0); + if (GET_CODE (x1) == CONST_INT && XWINT (x1, 0) == 0 && 1) + return 300; + goto ret0; ret0: return -1; } diff --git a/gnu/usr.bin/cc/cc_int/integrate.c b/gnu/usr.bin/cc/cc_int/integrate.c index 63b150d..2355508 100644 --- a/gnu/usr.bin/cc/cc_int/integrate.c +++ b/gnu/usr.bin/cc/cc_int/integrate.c @@ -134,10 +134,15 @@ function_cannot_inline_p (fndecl) if (int_size_in_bytes (TREE_TYPE (TREE_TYPE (fndecl))) < 0) return "function with varying-size return value cannot be inline"; - /* Cannot inline a function with a varying size argument. */ + /* Cannot inline a function with a varying size argument or one that + receives a transparent union. */ for (parms = DECL_ARGUMENTS (fndecl); parms; parms = TREE_CHAIN (parms)) - if (int_size_in_bytes (TREE_TYPE (parms)) < 0) - return "function with varying-size parameter cannot be inline"; + { + if (int_size_in_bytes (TREE_TYPE (parms)) < 0) + return "function with varying-size parameter cannot be inline"; + else if (TYPE_TRANSPARENT_UNION (TREE_TYPE (parms))) + return "function with transparent unit parameter cannot be inline"; + } if (!DECL_INLINE (fndecl) && get_max_uid () > max_insns) { @@ -1235,6 +1240,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add tree arg = convert (TREE_TYPE (formal), TREE_VALUE (actual)); /* Mode of the variable used within the function. */ enum machine_mode mode = TYPE_MODE (TREE_TYPE (formal)); + int invisiref = 0; /* Make sure this formal has some correspondence in the users code * before emitting any line notes for it. */ @@ -1263,6 +1269,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add store_expr (arg, stack_slot, 0); arg_vals[i] = XEXP (stack_slot, 0); + invisiref = 1; } else if (GET_CODE (loc) != MEM) { @@ -1288,8 +1295,11 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add be two different pseudos, and `safe_from_p' will make all sorts of smart assumptions about their not conflicting. But if ARG_VALS[I] overlaps TARGET, these assumptions are - wrong, so put ARG_VALS[I] into a fresh register. */ + wrong, so put ARG_VALS[I] into a fresh register. + Don't worry about invisible references, since their stack + temps will never overlap the target. */ || (target != 0 + && ! invisiref && (GET_CODE (arg_vals[i]) == REG || GET_CODE (arg_vals[i]) == SUBREG || GET_CODE (arg_vals[i]) == MEM) @@ -1640,7 +1650,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add for (insn = insns; insn; insn = NEXT_INSN (insn)) { - rtx copy, pattern; + rtx copy, pattern, set; map->orig_asm_operands_vector = 0; @@ -1648,6 +1658,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add { case INSN: pattern = PATTERN (insn); + set = single_set (insn); copy = 0; if (GET_CODE (pattern) == USE && GET_CODE (XEXP (pattern, 0)) == REG @@ -1659,33 +1670,47 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add /* Ignore setting a function value that we don't want to use. */ if (map->inline_target == 0 - && GET_CODE (pattern) == SET - && GET_CODE (SET_DEST (pattern)) == REG - && REG_FUNCTION_VALUE_P (SET_DEST (pattern))) + && set != 0 + && GET_CODE (SET_DEST (set)) == REG + && REG_FUNCTION_VALUE_P (SET_DEST (set))) { - if (volatile_refs_p (SET_SRC (pattern))) + if (volatile_refs_p (SET_SRC (set))) { + rtx new_set; + /* If we must not delete the source, load it into a new temporary. */ copy = emit_insn (copy_rtx_and_substitute (pattern, map)); - SET_DEST (PATTERN (copy)) - = gen_reg_rtx (GET_MODE (SET_DEST (PATTERN (copy)))); + + new_set = single_set (copy); + if (new_set == 0) + abort (); + + SET_DEST (new_set) + = gen_reg_rtx (GET_MODE (SET_DEST (new_set))); } else break; } + + /* If this is setting the static chain rtx, omit it. */ + else if (static_chain_value != 0 + && set != 0 + && GET_CODE (SET_DEST (set)) == REG + && rtx_equal_p (SET_DEST (set), + static_chain_incoming_rtx)) + break; + /* If this is setting the static chain pseudo, set it from the value we want to give it instead. */ else if (static_chain_value != 0 - && GET_CODE (pattern) == SET - && rtx_equal_p (SET_SRC (pattern), + && set != 0 + && rtx_equal_p (SET_SRC (set), static_chain_incoming_rtx)) { - rtx newdest = copy_rtx_and_substitute (SET_DEST (pattern), map); - - copy = emit_insn (gen_rtx (SET, VOIDmode, newdest, - static_chain_value)); + rtx newdest = copy_rtx_and_substitute (SET_DEST (set), map); + copy = emit_move_insn (newdest, static_chain_value); static_chain_value = 0; } else @@ -2585,6 +2610,9 @@ subst_constants (loc, insn, map) /* If storing a recognizable value save it for later recording. */ if ((map->num_sets < MAX_RECOG_OPERANDS) && (CONSTANT_P (src) + || (GET_CODE (src) == REG + && REGNO (src) >= FIRST_VIRTUAL_REGISTER + && REGNO (src) <= LAST_VIRTUAL_REGISTER) || (GET_CODE (src) == PLUS && GET_CODE (XEXP (src, 0)) == REG && REGNO (XEXP (src, 0)) >= FIRST_VIRTUAL_REGISTER diff --git a/gnu/usr.bin/cc/cc_int/jump.c b/gnu/usr.bin/cc/cc_int/jump.c index 0792f17..28d25e5 100644 --- a/gnu/usr.bin/cc/cc_int/jump.c +++ b/gnu/usr.bin/cc/cc_int/jump.c @@ -661,6 +661,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) /* Detect jump to following insn. */ if (reallabelprev == insn && condjump_p (insn)) { + next = next_real_insn (JUMP_LABEL (insn)); delete_jump (insn); changed = 1; continue; @@ -2202,11 +2203,11 @@ duplicate_loop_exit_test (loop_start) emit_barrier_before (loop_start); } - delete_insn (next_nonnote_insn (loop_start)); - /* Mark the exit code as the virtual top of the converted loop. */ emit_note_before (NOTE_INSN_LOOP_VTOP, exitcode); + delete_insn (next_nonnote_insn (loop_start)); + return 1; } diff --git a/gnu/usr.bin/cc/cc_int/local-alloc.c b/gnu/usr.bin/cc/cc_int/local-alloc.c index 3b2d81e..fc5cdb4 100644 --- a/gnu/usr.bin/cc/cc_int/local-alloc.c +++ b/gnu/usr.bin/cc/cc_int/local-alloc.c @@ -165,6 +165,11 @@ static enum reg_class *qty_alternate_class; static rtx *qty_scratch_rtx; +/* Element Q is nonzero if this quantity has been used in a SUBREG + that changes its size. */ + +static char *qty_changes_size; + /* Element Q is the register number of one pseudo register whose reg_qty value is Q, or -1 is this quantity is for a SCRATCH. This register should be the head of the chain maintained in reg_next_in_qty. */ @@ -289,6 +294,7 @@ alloc_qty (regno, mode, size, birth) qty_min_class[qty] = reg_preferred_class (regno); qty_alternate_class[qty] = reg_alternate_class (regno); qty_n_refs[qty] = reg_n_refs[regno]; + qty_changes_size[qty] = reg_changes_size[regno]; } /* Similar to `alloc_qty', but allocates a quantity for a SCRATCH rtx @@ -378,6 +384,7 @@ alloc_qty_for_scratch (scratch, n, insn, insn_code_num, insn_number) qty_min_class[qty] = class; qty_alternate_class[qty] = NO_REGS; qty_n_refs[qty] = 1; + qty_changes_size[qty] = 0; } /* Main entry point of this file. */ @@ -439,6 +446,7 @@ local_alloc () qty_alternate_class = (enum reg_class *) alloca (max_qty * sizeof (enum reg_class)); qty_n_refs = (int *) alloca (max_qty * sizeof (int)); + qty_changes_size = (char *) alloca (max_qty * sizeof (char)); reg_qty = (int *) alloca (max_regno * sizeof (int)); reg_offset = (char *) alloca (max_regno * sizeof (char)); @@ -1925,6 +1933,9 @@ update_qty_class (qty, reg) rclass = reg_alternate_class (reg); if (reg_class_subset_p (rclass, qty_alternate_class[qty])) qty_alternate_class[qty] = rclass; + + if (reg_changes_size[reg]) + qty_changes_size[qty] = 1; } /* Handle something which alters the value of an rtx REG. @@ -2108,6 +2119,12 @@ find_free_reg (class, mode, qty, accept_call_clobbered, just_try_suggested, SET_HARD_REG_BIT (used, FRAME_POINTER_REGNUM); #endif +#ifdef CLASS_CANNOT_CHANGE_SIZE + if (qty_changes_size[qty]) + IOR_HARD_REG_SET (used, + reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE]); +#endif + /* Normally, the registers that can be used for the first register in a multi-register quantity are the same as those that can be used for subsequent registers. However, if just trying suggested registers, diff --git a/gnu/usr.bin/cc/cc_int/loop.c b/gnu/usr.bin/cc/cc_int/loop.c index c6caefe..32f3924 100644 --- a/gnu/usr.bin/cc/cc_int/loop.c +++ b/gnu/usr.bin/cc/cc_int/loop.c @@ -1791,8 +1791,9 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) /* Because the USAGE information potentially contains objects other than hard registers we need to copy it. */ - CALL_INSN_FUNCTION_USAGE (i1) = - copy_rtx (CALL_INSN_FUNCTION_USAGE (temp)); + if (CALL_INSN_FUNCTION_USAGE (temp)) + CALL_INSN_FUNCTION_USAGE (i1) = + copy_rtx (CALL_INSN_FUNCTION_USAGE (temp)); } else i1 = emit_insn_before (body, loop_start); @@ -1834,8 +1835,9 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) /* Because the USAGE information potentially contains objects other than hard registers we need to copy it. */ - CALL_INSN_FUNCTION_USAGE (i1) = - copy_rtx (CALL_INSN_FUNCTION_USAGE (p)); + if (CALL_INSN_FUNCTION_USAGE (p)) + CALL_INSN_FUNCTION_USAGE (i1) = + copy_rtx (CALL_INSN_FUNCTION_USAGE (p)); } else i1 = emit_insn_before (PATTERN (p), loop_start); diff --git a/gnu/usr.bin/cc/cc_int/obstack.c b/gnu/usr.bin/cc/cc_int/obstack.c index a8a4500..bf18ddc 100644 --- a/gnu/usr.bin/cc/cc_int/obstack.c +++ b/gnu/usr.bin/cc/cc_int/obstack.c @@ -31,7 +31,7 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ #define POINTER void * #else #define POINTER char * @@ -267,7 +267,7 @@ _obstack_newchunk (h, length) This is here for debugging. If you use it in a program, you are probably losing. */ -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ /* Suppress -Wmissing-prototypes warning. We don't want to declare this in obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, POINTER obj); @@ -374,7 +374,7 @@ obstack_free (h, obj) /* Now define the functional versions of the obstack macros. Define them to simply use the corresponding macros to do the job. */ -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ /* These function definitions do not work with non-ANSI preprocessors; they won't pass through the macro names in parentheses. */ diff --git a/gnu/usr.bin/cc/cc_int/optabs.c b/gnu/usr.bin/cc/cc_int/optabs.c index 427ccf4..2d188e6 100644 --- a/gnu/usr.bin/cc/cc_int/optabs.c +++ b/gnu/usr.bin/cc/cc_int/optabs.c @@ -117,6 +117,13 @@ rtx bcmp_libfunc; rtx memset_libfunc; rtx bzero_libfunc; +rtx eqhf2_libfunc; +rtx nehf2_libfunc; +rtx gthf2_libfunc; +rtx gehf2_libfunc; +rtx lthf2_libfunc; +rtx lehf2_libfunc; + rtx eqsf2_libfunc; rtx nesf2_libfunc; rtx gtsf2_libfunc; @@ -689,13 +696,6 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) if (carries == 0) inter = 0; else - inter = expand_binop (word_mode, binoptab, outof_input, - op1, outof_target, unsignedp, next_methods); - - if (inter != 0 && inter != outof_target) - emit_move_insn (outof_target, inter); - - if (inter != 0) inter = expand_binop (word_mode, unsigned_shift, into_input, op1, 0, unsignedp, next_methods); @@ -705,6 +705,13 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) if (inter != 0 && inter != into_target) emit_move_insn (into_target, inter); + + if (inter != 0) + inter = expand_binop (word_mode, binoptab, outof_input, + op1, outof_target, unsignedp, next_methods); + + if (inter != 0 && inter != outof_target) + emit_move_insn (outof_target, inter); } insns = get_insns (); @@ -1260,8 +1267,10 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) NULL_RTX, unsignedp, methods); if (temp1 == 0 || temp2 == 0) - res = expand_binop (submode, add_optab, temp1, temp2, - imagr, unsignedp, methods); + break; + + res = expand_binop (submode, add_optab, temp1, temp2, + imagr, unsignedp, methods); if (res == 0) break; @@ -2760,7 +2769,34 @@ emit_float_lib_cmp (x, y, comparison) enum machine_mode mode = GET_MODE (x); rtx libfunc = 0; - if (mode == SFmode) + if (mode == HFmode) + switch (comparison) + { + case EQ: + libfunc = eqhf2_libfunc; + break; + + case NE: + libfunc = nehf2_libfunc; + break; + + case GT: + libfunc = gthf2_libfunc; + break; + + case GE: + libfunc = gehf2_libfunc; + break; + + case LT: + libfunc = lthf2_libfunc; + break; + + case LE: + libfunc = lehf2_libfunc; + break; + } + else if (mode == SFmode) switch (comparison) { case EQ: @@ -3237,8 +3273,11 @@ expand_float (to, from, unsignedp) expand_float (target, temp, 0); /* Multiply by 2 to undo the shift above. */ - target = expand_binop (fmode, add_optab, target, target, + temp = expand_binop (fmode, add_optab, target, target, target, 0, OPTAB_LIB_WIDEN); + if (temp != target) + emit_move_insn (target, temp); + do_pending_stack_adjust (); emit_label (label); goto done; @@ -3278,7 +3317,7 @@ expand_float (to, from, unsignedp) } #endif - /* No hardware instruction available; call a library rotine to convert from + /* No hardware instruction available; call a library routine to convert from SImode, DImode, or TImode into SFmode, DFmode, XFmode, or TFmode. */ { rtx libfcn; @@ -3562,6 +3601,7 @@ expand_fix (to, from, unsignedp) if (libfcn) { rtx insns; + rtx value; to = protect_from_queue (to, 1); from = protect_from_queue (from, 0); @@ -3571,12 +3611,14 @@ expand_fix (to, from, unsignedp) start_sequence (); - emit_library_call (libfcn, 1, GET_MODE (to), 1, from, GET_MODE (from)); + value = emit_library_call_value (libfcn, NULL_RTX, 1, GET_MODE (to), + + 1, from, GET_MODE (from)); insns = get_insns (); end_sequence (); - emit_libcall_block (insns, target, hard_libcall_value (GET_MODE (to)), - gen_rtx (unsignedp ? FIX : UNSIGNED_FIX, + emit_libcall_block (insns, target, value, + gen_rtx (unsignedp ? UNSIGNED_FIX : FIX, GET_MODE (to), from)); } @@ -3957,6 +3999,13 @@ init_optabs () memset_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memset"); bzero_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bzero"); + eqhf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqhf2"); + nehf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nehf2"); + gthf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gthf2"); + gehf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gehf2"); + lthf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__lthf2"); + lehf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__lehf2"); + eqsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqsf2"); nesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nesf2"); gtsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gtsf2"); diff --git a/gnu/usr.bin/cc/cc_int/print-tree.c b/gnu/usr.bin/cc/cc_int/print-tree.c index f4f878f..3eb2d6a 100644 --- a/gnu/usr.bin/cc/cc_int/print-tree.c +++ b/gnu/usr.bin/cc/cc_int/print-tree.c @@ -109,10 +109,22 @@ print_node_brief (file, prefix, node, indent) fprintf (file, " overflow"); if (TREE_INT_CST_HIGH (node) == 0) - fprintf (file, " %1u", TREE_INT_CST_LOW (node)); + fprintf (file, +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + " %1u", +#else + " %1lu", +#endif + TREE_INT_CST_LOW (node)); else if (TREE_INT_CST_HIGH (node) == -1 && TREE_INT_CST_LOW (node) != 0) - fprintf (file, " -%1u", -TREE_INT_CST_LOW (node)); + fprintf (file, +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + " -%1u", +#else + " -%1lu", +#endif + -TREE_INT_CST_LOW (node)); else fprintf (file, #if HOST_BITS_PER_WIDE_INT == 64 @@ -132,8 +144,24 @@ print_node_brief (file, prefix, node, indent) } if (TREE_CODE (node) == REAL_CST) { -#ifndef REAL_IS_NOT_DOUBLE - fprintf (file, " %e", TREE_REAL_CST (node)); + REAL_VALUE_TYPE d; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + +#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) + d = TREE_REAL_CST (node); + if (REAL_VALUE_ISINF (d)) + fprintf (file, " Inf"); + else if (REAL_VALUE_ISNAN (d)) + fprintf (file, " Nan"); + else + { + char string[100]; + + REAL_VALUE_TO_DECIMAL (d, "%e", string); + fprintf (file, " %s", string); + } #else { int i; @@ -143,7 +171,7 @@ print_node_brief (file, prefix, node, indent) fprintf (file, "%02x", *p++); fprintf (file, ""); } -#endif /* REAL_IS_NOT_DOUBLE */ +#endif } fprintf (file, ">"); @@ -324,22 +352,47 @@ print_node (file, prefix, node, indent) case 'd': mode = DECL_MODE (node); + if (DECL_IGNORED_P (node)) + fputs (" ignored", file); + if (DECL_ABSTRACT (node)) + fputs (" abstract", file); + if (DECL_IN_SYSTEM_HEADER (node)) + fputs (" in_system_header", file); + if (DECL_COMMON (node)) + fputs (" common", file); if (DECL_EXTERNAL (node)) fputs (" external", file); - if (DECL_NONLOCAL (node)) - fputs (" nonlocal", file); if (DECL_REGISTER (node)) fputs (" regdecl", file); + if (DECL_PACKED (node)) + fputs (" packed", file); + if (DECL_NONLOCAL (node)) + fputs (" nonlocal", file); if (DECL_INLINE (node)) fputs (" inline", file); - if (DECL_BIT_FIELD (node)) + + if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) + fputs (" supress-debug", file); + + if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) + fputs (" built-in", file); + if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN_NONANSI (node)) + fputs (" built-in-nonansi", file); + + if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node)) fputs (" bit-field", file); + if (TREE_CODE (node) == LABEL_DECL && DECL_TOO_LATE (node)) + fputs (" too-late", file); + if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node)) + fputs (" in-text-section", file); + if (DECL_VIRTUAL_P (node)) fputs (" virtual", file); - if (DECL_IGNORED_P (node)) - fputs (" ignored", file); - if (DECL_IN_SYSTEM_HEADER (node)) - fputs (" in_system_header", file); + if (DECL_DEFER_OUTPUT (node)) + fputs (" defer-output", file); + if (DECL_TRANSPARENT_UNION (node)) + fputs (" transparent-union", file); + if (DECL_LANG_FLAG_0 (node)) fputs (" decl_0", file); if (DECL_LANG_FLAG_1 (node)) @@ -413,7 +466,14 @@ print_node (file, prefix, node, indent) case 't': if (TYPE_NO_FORCE_BLK (node)) - fputs (" no_force_blk", file); + fputs (" no-force-blk", file); + if (TYPE_STRING_FLAG (node)) + fputs (" string-flag", file); + if (TYPE_NEEDS_CONSTRUCTING (node)) + fputs (" needs-constructing", file); + if (TYPE_TRANSPARENT_UNION (node)) + fputs (" transparent-union", file); + if (TYPE_LANG_FLAG_0 (node)) fputs (" type_0", file); if (TYPE_LANG_FLAG_1 (node)) @@ -558,10 +618,22 @@ print_node (file, prefix, node, indent) fprintf (file, " overflow"); if (TREE_INT_CST_HIGH (node) == 0) - fprintf (file, " %1u", TREE_INT_CST_LOW (node)); + fprintf (file, +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + " %1u", +#else + " %1lu", +#endif + TREE_INT_CST_LOW (node)); else if (TREE_INT_CST_HIGH (node) == -1 && TREE_INT_CST_LOW (node) != 0) - fprintf (file, " -%1u", -TREE_INT_CST_LOW (node)); + fprintf (file, +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + " -%1u", +#else + " -%1lu", +#endif + -TREE_INT_CST_LOW (node)); else fprintf (file, #if HOST_BITS_PER_WIDE_INT == 64 @@ -581,17 +653,36 @@ print_node (file, prefix, node, indent) break; case REAL_CST: -#ifndef REAL_IS_NOT_DOUBLE - fprintf (file, " %e", TREE_REAL_CST (node)); -#else { - char *p = (char *) &TREE_REAL_CST (node); - fprintf (file, " 0x"); - for (i = 0; i < sizeof TREE_REAL_CST (node); i++) - fprintf (file, "%02x", *p++); - fprintf (file, ""); + REAL_VALUE_TYPE d; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + +#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) + d = TREE_REAL_CST (node); + if (REAL_VALUE_ISINF (d)) + fprintf (file, " Inf"); + else if (REAL_VALUE_ISNAN (d)) + fprintf (file, " Nan"); + else + { + char string[100]; + + REAL_VALUE_TO_DECIMAL (d, "%e", string); + fprintf (file, " %s", string); + } +#else + { + int i; + unsigned char *p = (unsigned char *) &TREE_REAL_CST (node); + fprintf (file, " 0x"); + for (i = 0; i < sizeof TREE_REAL_CST (node); i++) + fprintf (file, "%02x", *p++); + fprintf (file, ""); + } +#endif } -#endif /* REAL_IS_NOT_DOUBLE */ break; case COMPLEX_CST: diff --git a/gnu/usr.bin/cc/cc_int/recog.c b/gnu/usr.bin/cc/cc_int/recog.c index 1072fe9..a09a1d9 100644 --- a/gnu/usr.bin/cc/cc_int/recog.c +++ b/gnu/usr.bin/cc/cc_int/recog.c @@ -1718,9 +1718,9 @@ constrain_operands (insn_code_num, strict) case 'p': /* p is used for address_operands. When we are called by - gen_input_reload, no one will have checked that the - address is strictly valid, i.e., that all pseudos - requiring hard regs have gotten them. */ + gen_reload, no one will have checked that the address is + strictly valid, i.e., that all pseudos requiring hard regs + have gotten them. */ if (strict <= 0 || (strict_memory_address_p (insn_operand_mode[insn_code_num][opno], op))) diff --git a/gnu/usr.bin/cc/cc_int/reg-stack.c b/gnu/usr.bin/cc/cc_int/reg-stack.c index dd30344..f52b288 100644 --- a/gnu/usr.bin/cc/cc_int/reg-stack.c +++ b/gnu/usr.bin/cc/cc_int/reg-stack.c @@ -1591,7 +1591,6 @@ delete_insn_for_stacker (insn) PUT_CODE (insn, NOTE); NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; NOTE_SOURCE_FILE (insn) = 0; - INSN_DELETED_P (insn) = 1; } /* Emit an insn to pop virtual register REG before or after INSN. @@ -2581,7 +2580,7 @@ subst_stack_regs (insn, regstack) /* subst_stack_regs_pat may have deleted a no-op insn. If so, any REG_UNUSED will already have been dealt with, so just return. */ - if (INSN_DELETED_P (insn)) + if (GET_CODE (insn) == NOTE) return; /* If there is a REG_UNUSED note on a stack register on this insn, diff --git a/gnu/usr.bin/cc/cc_int/reload.c b/gnu/usr.bin/cc/cc_int/reload.c index b9a1c27..aed06e4 100644 --- a/gnu/usr.bin/cc/cc_int/reload.c +++ b/gnu/usr.bin/cc/cc_int/reload.c @@ -86,6 +86,7 @@ a register with any other reload. */ #define REG_OK_STRICT +#include <stdio.h> #include "config.h" #include "rtl.h" #include "insn-config.h" @@ -777,8 +778,8 @@ push_reload (in, out, inloc, outloc, class, a pseudo and hence will become a MEM) with M1 wider than M2 and the register is a pseudo, also reload the inside expression. For machines that extend byte loads, do this for any SUBREG of a pseudo - where both M1 and M2 are a word or smaller unless they are the same - size. + where both M1 and M2 are a word or smaller, M1 is wider than M2, and + M2 is an integral mode that gets extended when loaded. Similar issue for (SUBREG:M1 (REG:M2 ...) ...) for a hard register R where either M1 is not valid for R or M2 is wider than a word but we only need one word to store an M2-sized quantity in R. @@ -792,7 +793,11 @@ push_reload (in, out, inloc, outloc, class, STRICT_LOW_PART (presumably, in == out in the cas). Also reload the inner expression if it does not require a secondary - reload but the SUBREG does. */ + reload but the SUBREG does. + + Finally, reload the inner expression if it is a register that is in + the class whose registers cannot be referenced in a different size + and M1 is not the same size as M2. */ if (in != 0 && GET_CODE (in) == SUBREG && (CONSTANT_P (SUBREG_REG (in)) @@ -808,7 +813,9 @@ push_reload (in, out, inloc, outloc, class, && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) <= UNITS_PER_WORD) && (GET_MODE_SIZE (inmode) - != GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))))) + > GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))) + && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (in))) + && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (in))) != NIL) #endif )) || (GET_CODE (SUBREG_REG (in)) == REG @@ -833,6 +840,15 @@ push_reload (in, out, inloc, outloc, class, SUBREG_REG (in)) == NO_REGS)) #endif +#ifdef CLASS_CANNOT_CHANGE_SIZE + || (GET_CODE (SUBREG_REG (in)) == REG + && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER + && (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + REGNO (SUBREG_REG (in)))) + && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) + != GET_MODE_SIZE (inmode))) +#endif )) { in_subreg_loc = inloc; @@ -885,15 +901,7 @@ push_reload (in, out, inloc, outloc, class, && REGNO (SUBREG_REG (out)) >= FIRST_PSEUDO_REGISTER) || GET_CODE (SUBREG_REG (out)) == MEM) && ((GET_MODE_SIZE (outmode) - > GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))) -#ifdef LOAD_EXTEND_OP - || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD - && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) - <= UNITS_PER_WORD) - && (GET_MODE_SIZE (outmode) - != GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))))) -#endif - )) + > GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))))) || (GET_CODE (SUBREG_REG (out)) == REG && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER && ((GET_MODE_SIZE (outmode) <= UNITS_PER_WORD @@ -913,6 +921,15 @@ push_reload (in, out, inloc, outloc, class, SUBREG_REG (out)) == NO_REGS)) #endif +#ifdef CLASS_CANNOT_CHANGE_SIZE + || (GET_CODE (SUBREG_REG (out)) == REG + && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER + && (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + REGNO (SUBREG_REG (out)))) + && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) + != GET_MODE_SIZE (outmode))) +#endif )) { out_subreg_loc = outloc; @@ -1881,7 +1898,7 @@ operands_match_p (x, y) int n_occurrences (c, s) - char c; + int c; char *s; { int n = 0; @@ -2401,7 +2418,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) && &SET_DEST (set) == recog_operand_loc[i]); else if (code == PLUS) /* We can get a PLUS as an "operand" as a result of - register elimination. See eliminate_regs and gen_input_reload. */ + register elimination. See eliminate_regs and gen_reload. */ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i] = find_reloads_toplev (recog_operand[i], i, address_type[i], ind_levels, 0); @@ -2550,12 +2567,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) || GET_CODE (operand) == PLUS /* We must force a reload of paradoxical SUBREGs of a MEM because the alignment of the inner value - may not be enough to do the outer reference. + may not be enough to do the outer reference. On + big-endian machines, it may also reference outside + the object. On machines that extend byte operations and we have a - SUBREG where both the inner and outer modes are different - size but no wider than a word, combine.c has made - assumptions about the behavior of the machine in such + SUBREG where both the inner and outer modes are no wider + than a word and the inner mode is narrower, is integral, + and gets extended when loaded from memory, combine.c has + made assumptions about the behavior of the machine in such register access. If the data is, in fact, in memory we must always load using the size assumed to be in the register and let the insn do the different-sized @@ -2567,12 +2587,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) < BIGGEST_ALIGNMENT) && (GET_MODE_SIZE (operand_mode[i]) > GET_MODE_SIZE (GET_MODE (operand)))) + || (GET_CODE (operand) == MEM && BYTES_BIG_ENDIAN) #ifdef LOAD_EXTEND_OP || (GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD && (GET_MODE_SIZE (GET_MODE (operand)) <= UNITS_PER_WORD) && (GET_MODE_SIZE (operand_mode[i]) - != GET_MODE_SIZE (GET_MODE (operand)))) + > GET_MODE_SIZE (GET_MODE (operand))) + && INTEGRAL_MODE_P (GET_MODE (operand)) + && LOAD_EXTEND_OP (GET_MODE (operand)) != NIL) #endif )) /* Subreg of a hard reg which can't handle the subreg's mode @@ -2708,7 +2731,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) case 'p': /* All necessary reloads for an address_operand were handled in find_reloads_address. */ - this_alternative[i] = (int) ALL_REGS; + this_alternative[i] = (int) BASE_REG_CLASS; win = 1; break; @@ -4233,12 +4256,12 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels) && ! memory_address_p (mode, ad)) { *loc = ad = gen_rtx (PLUS, GET_MODE (ad), + XEXP (XEXP (ad, 0), 0), plus_constant (XEXP (XEXP (ad, 0), 1), - INTVAL (XEXP (ad, 1))), - XEXP (XEXP (ad, 0), 0)); - find_reloads_address_part (XEXP (ad, 0), &XEXP (ad, 0), BASE_REG_CLASS, + INTVAL (XEXP (ad, 1)))); + find_reloads_address_part (XEXP (ad, 1), &XEXP (ad, 1), BASE_REG_CLASS, GET_MODE (ad), opnum, type, ind_levels); - find_reloads_address_1 (XEXP (ad, 1), 1, &XEXP (ad, 1), opnum, type, 0); + find_reloads_address_1 (XEXP (ad, 0), 1, &XEXP (ad, 0), opnum, type, 0); return 1; } @@ -5648,3 +5671,110 @@ regno_clobbered_p (regno, insn) return 0; } + +static char *reload_when_needed_name[] = +{ + "RELOAD_FOR_INPUT", + "RELOAD_FOR_OUTPUT", + "RELOAD_FOR_INSN", + "RELOAD_FOR_INPUT_ADDRESS", + "RELOAD_FOR_OUTPUT_ADDRESS", + "RELOAD_FOR_OPERAND_ADDRESS", + "RELOAD_FOR_OPADDR_ADDR", + "RELOAD_OTHER", + "RELOAD_FOR_OTHER_ADDRESS" +}; + +static char *reg_class_names[] = REG_CLASS_NAMES; + +/* This function is used to print the variables set by 'find_reloads' */ + +void +debug_reload() +{ + int r; + + fprintf (stderr, "\nn_reloads = %d\n", n_reloads); + + for (r = 0; r < n_reloads; r++) + { + fprintf (stderr, "\nRELOAD %d\n", r); + + if (reload_in[r]) + { + fprintf (stderr, "\nreload_in (%s) = ", mode_name[reload_inmode[r]]); + debug_rtx (reload_in[r]); + } + + if (reload_out[r]) + { + fprintf (stderr, "\nreload_out (%s) = ", mode_name[reload_outmode[r]]); + debug_rtx (reload_out[r]); + } + + fprintf (stderr, "%s, ", reg_class_names[(int) reload_reg_class[r]]); + + fprintf (stderr, "%s (opnum = %d)", reload_when_needed_name[(int)reload_when_needed[r]], + reload_opnum[r]); + + if (reload_optional[r]) + fprintf (stderr, ", optional"); + + if (reload_in[r]) + fprintf (stderr, ", inc by %d\n", reload_inc[r]); + + if (reload_nocombine[r]) + fprintf (stderr, ", can combine", reload_nocombine[r]); + + if (reload_secondary_p[r]) + fprintf (stderr, ", secondary_reload_p"); + + if (reload_in_reg[r]) + { + fprintf (stderr, "\nreload_in_reg:\t\t\t"); + debug_rtx (reload_in_reg[r]); + } + + if (reload_reg_rtx[r]) + { + fprintf (stderr, "\nreload_reg_rtx:\t\t\t"); + debug_rtx (reload_reg_rtx[r]); + } + + if (reload_secondary_in_reload[r] != -1) + { + fprintf (stderr, "\nsecondary_in_reload = "); + fprintf (stderr, "%d ", reload_secondary_in_reload[r]); + } + + if (reload_secondary_out_reload[r] != -1) + { + if (reload_secondary_in_reload[r] != -1) + fprintf (stderr, ", secondary_out_reload = "); + else + fprintf (stderr, "\nsecondary_out_reload = "); + + fprintf (stderr, "%d", reload_secondary_out_reload[r]); + } + + + if (reload_secondary_in_icode[r] != CODE_FOR_nothing) + { + fprintf (stderr, "\nsecondary_in_icode = "); + fprintf (stderr, "%s", insn_name[r]); + } + + if (reload_secondary_out_icode[r] != CODE_FOR_nothing) + { + if (reload_secondary_in_icode[r] != CODE_FOR_nothing) + fprintf (stderr, ", secondary_out_icode = "); + else + fprintf (stderr, "\nsecondary_out_icode = "); + + fprintf (stderr, "%s ", insn_name[r]); + } + fprintf (stderr, "\n"); + } + + fprintf (stderr, "\n"); +} diff --git a/gnu/usr.bin/cc/cc_int/reload1.c b/gnu/usr.bin/cc/cc_int/reload1.c index e46d764..d6dadf2 100644 --- a/gnu/usr.bin/cc/cc_int/reload1.c +++ b/gnu/usr.bin/cc/cc_int/reload1.c @@ -327,7 +327,7 @@ struct hard_reg_n_uses { int regno; int uses; }; static int possible_group_p PROTO((int, int *)); static void count_possible_groups PROTO((int *, enum machine_mode *, - int *)); + int *, int)); static int modes_equiv_for_class_p PROTO((enum machine_mode, enum machine_mode, enum reg_class)); @@ -1153,7 +1153,8 @@ reload (first, global, dumpfile) if (other_mode != VOIDmode && other_mode != allocate_mode && ! modes_equiv_for_class_p (allocate_mode, other_mode, class)) - abort (); + fatal_insn ("Two dissimilar machine modes both need groups of consecutive regs of the same class", + insn); } else if (size == 1) { @@ -1349,19 +1350,14 @@ reload (first, global, dumpfile) } /* Now count extra regs if there might be a conflict with - the return value register. + the return value register. */ - ??? This is not quite correct because we don't properly - handle the case of groups, but if we end up doing - something wrong, it either will end up not mattering or - we will abort elsewhere. */ - for (r = regno; r < regno + nregs; r++) if (spill_reg_order[r] >= 0) for (i = 0; i < N_REG_CLASSES; i++) if (TEST_HARD_REG_BIT (reg_class_contents[i], r)) { - if (basic_needs[i] > 0 || basic_groups[i] > 0) + if (basic_needs[i] > 0) { enum reg_class *p; @@ -1370,6 +1366,15 @@ reload (first, global, dumpfile) while (*p != LIM_REG_CLASSES) insn_needs.other.regs[0][(int) *p++]++; } + if (basic_groups[i] > 0) + { + enum reg_class *p; + + insn_needs.other.groups[i]++; + p = reg_class_superclasses[i]; + while (*p != LIM_REG_CLASSES) + insn_needs.other.groups[(int) *p++]++; + } } } #endif /* SMALL_REGISTER_CLASSES */ @@ -1603,7 +1608,8 @@ reload (first, global, dumpfile) /* If any single spilled regs happen to form groups, count them now. Maybe we don't really need to spill another group. */ - count_possible_groups (group_size, group_mode, max_groups); + count_possible_groups (group_size, group_mode, max_groups, + class); if (max_groups[class] <= 0) break; @@ -2063,68 +2069,65 @@ possible_group_p (regno, max_groups) return 0; } -/* Count any groups that can be formed from the registers recently spilled. - This is done class by class, in order of ascending class number. */ +/* Count any groups of CLASS that can be formed from the registers recently + spilled. */ static void -count_possible_groups (group_size, group_mode, max_groups) +count_possible_groups (group_size, group_mode, max_groups, class) int *group_size; enum machine_mode *group_mode; int *max_groups; + int class; { - int i; + HARD_REG_SET new; + int i, j; + /* Now find all consecutive groups of spilled registers and mark each group off against the need for such groups. But don't count them against ordinary need, yet. */ - for (i = 0; i < N_REG_CLASSES; i++) - if (group_size[i] > 1) + if (group_size[class] == 0) + return; + + CLEAR_HARD_REG_SET (new); + + /* Make a mask of all the regs that are spill regs in class I. */ + for (i = 0; i < n_spills; i++) + if (TEST_HARD_REG_BIT (reg_class_contents[class], spill_regs[i]) + && ! TEST_HARD_REG_BIT (counted_for_groups, spill_regs[i]) + && ! TEST_HARD_REG_BIT (counted_for_nongroups, spill_regs[i])) + SET_HARD_REG_BIT (new, spill_regs[i]); + + /* Find each consecutive group of them. */ + for (i = 0; i < FIRST_PSEUDO_REGISTER && max_groups[class] > 0; i++) + if (TEST_HARD_REG_BIT (new, i) + && i + group_size[class] <= FIRST_PSEUDO_REGISTER + && HARD_REGNO_MODE_OK (i, group_mode[class])) { - HARD_REG_SET new; - int j; - - CLEAR_HARD_REG_SET (new); - - /* Make a mask of all the regs that are spill regs in class I. */ - for (j = 0; j < n_spills; j++) - if (TEST_HARD_REG_BIT (reg_class_contents[i], spill_regs[j]) - && ! TEST_HARD_REG_BIT (counted_for_groups, spill_regs[j]) - && ! TEST_HARD_REG_BIT (counted_for_nongroups, - spill_regs[j])) - SET_HARD_REG_BIT (new, spill_regs[j]); - - /* Find each consecutive group of them. */ - for (j = 0; j < FIRST_PSEUDO_REGISTER && max_groups[i] > 0; j++) - if (TEST_HARD_REG_BIT (new, j) - && j + group_size[i] <= FIRST_PSEUDO_REGISTER - /* Next line in case group-mode for this class - demands an even-odd pair. */ - && HARD_REGNO_MODE_OK (j, group_mode[i])) - { - int k; - for (k = 1; k < group_size[i]; k++) - if (! TEST_HARD_REG_BIT (new, j + k)) - break; - if (k == group_size[i]) - { - /* We found a group. Mark it off against this class's - need for groups, and against each superclass too. */ - register enum reg_class *p; - max_groups[i]--; - p = reg_class_superclasses[i]; - while (*p != LIM_REG_CLASSES) - max_groups[(int) *p++]--; - /* Don't count these registers again. */ - for (k = 0; k < group_size[i]; k++) - SET_HARD_REG_BIT (counted_for_groups, j + k); - } - /* Skip to the last reg in this group. When j is incremented - above, it will then point to the first reg of the next - possible group. */ - j += k - 1; - } - } + for (j = 1; j < group_size[class]; j++) + if (! TEST_HARD_REG_BIT (new, i + j)) + break; + + if (j == group_size[class]) + { + /* We found a group. Mark it off against this class's need for + groups, and against each superclass too. */ + register enum reg_class *p; + + max_groups[class]--; + p = reg_class_superclasses[class]; + while (*p != LIM_REG_CLASSES) + max_groups[(int) *p++]--; + + /* Don't count these registers again. */ + for (j = 0; j < group_size[class]; j++) + SET_HARD_REG_BIT (counted_for_groups, i + j); + } + /* Skip to the last reg in this group. When i is incremented above, + it will then point to the first reg of the next possible group. */ + i += j - 1; + } } /* ALLOCATE_MODE is a register mode that needs to be reloaded. OTHER_MODE is @@ -2165,7 +2168,7 @@ spill_failure (insn) if (asm_noperands (PATTERN (insn)) >= 0) error_for_asm (insn, "`asm' needs too many reloads"); else - abort (); + fatal_insn ("Unable to find a register to spill.", insn); } /* Add a new register to the tables of available spill-registers @@ -2886,11 +2889,20 @@ eliminate_regs (x, mem_mode, insn) /* If we didn't change anything, we must retain the pseudo. */ if (new == reg_equiv_memory_loc[REGNO (SUBREG_REG (x))]) - new = XEXP (x, 0); + new = SUBREG_REG (x); else - /* Otherwise, ensure NEW isn't shared in case we have to reload - it. */ - new = copy_rtx (new); + { + /* Otherwise, ensure NEW isn't shared in case we have to reload + it. */ + new = copy_rtx (new); + + /* In this case, we must show that the pseudo is used in this + insn so that delete_output_reload will do the right thing. */ + if (insn != 0 && GET_CODE (insn) != EXPR_LIST + && GET_CODE (insn) != INSN_LIST) + emit_insn_before (gen_rtx (USE, VOIDmode, SUBREG_REG (x)), + insn); + } } else new = eliminate_regs (SUBREG_REG (x), mem_mode, insn); @@ -2907,7 +2919,11 @@ eliminate_regs (x, mem_mode, insn) smaller. So leave the SUBREG then. */ && ! (GET_CODE (SUBREG_REG (x)) == REG && GET_MODE_SIZE (GET_MODE (x)) <= UNITS_PER_WORD - && GET_MODE_SIZE (GET_MODE (new)) <= UNITS_PER_WORD) + && GET_MODE_SIZE (GET_MODE (new)) <= UNITS_PER_WORD + && (GET_MODE_SIZE (GET_MODE (x)) + > GET_MODE_SIZE (GET_MODE (new))) + && INTEGRAL_MODE_P (GET_MODE (new)) + && LOAD_EXTEND_OP (GET_MODE (new)) != NIL) #endif ) { @@ -3668,11 +3684,12 @@ order_regs_for_reload () } /* Used in reload_as_needed to sort the spilled regs. */ + static int compare_spill_regs (r1, r2) short *r1, *r2; { - return *r1 < *r2 ? -1: 1; + return *r1 - *r2; } /* Reload pseudo-registers into hard regs around each insn as needed. @@ -3840,7 +3857,7 @@ reload_as_needed (first, live_known) && ! reload_optional[i] && (reload_in[i] != 0 || reload_out[i] != 0 || reload_secondary_p[i] != 0)) - abort (); + fatal_insn ("Non-optional registers need a spill register", insn); /* Now compute which reload regs to reload them into. Perhaps reusing reload regs from previous insns, or else output @@ -4836,7 +4853,7 @@ allocate_reload_reg (r, insn, last_reload, noerror) failure: if (asm_noperands (PATTERN (insn)) < 0) /* It's the compiler's fault. */ - abort (); + fatal_insn ("Could not find a spill register", insn); /* It's the user's fault; the operand's mode and constraint don't match. Disable this reload so we don't crash in final. */ @@ -5628,7 +5645,9 @@ emit_reload_insns (insn) { register rtx old; rtx oldequiv_reg = 0; - rtx store_insn = 0; + + if (reload_spill_index[j] >= 0) + new_spill_reg_store[reload_spill_index[j]] = 0; old = reload_in[j]; if (old != 0 && ! reload_inherited[j] @@ -6010,9 +6029,9 @@ emit_reload_insns (insn) third_reload_reg))); } else - gen_input_reload (second_reload_reg, oldequiv, - reload_opnum[j], - reload_when_needed[j]); + gen_reload (second_reload_reg, oldequiv, + reload_opnum[j], + reload_when_needed[j]); oldequiv = second_reload_reg; } @@ -6021,8 +6040,8 @@ emit_reload_insns (insn) #endif if (! special && ! rtx_equal_p (reloadreg, oldequiv)) - gen_input_reload (reloadreg, oldequiv, reload_opnum[j], - reload_when_needed[j]); + gen_reload (reloadreg, oldequiv, reload_opnum[j], + reload_when_needed[j]); #if defined(SECONDARY_INPUT_RELOAD_CLASS) && defined(PRESERVE_DEATH_INFO_REGNO_P) /* We may have to make a REG_DEAD note for the secondary reload @@ -6246,7 +6265,7 @@ emit_reload_insns (insn) /* VOIDmode should never happen for an output. */ if (asm_noperands (PATTERN (insn)) < 0) /* It's the compiler's fault. */ - abort (); + fatal_insn ("VOIDmode on an output", insn); error_for_asm (insn, "output operand is constant in `asm'"); /* Prevent crash--use something we know is valid. */ mode = word_mode; @@ -6259,7 +6278,7 @@ emit_reload_insns (insn) #ifdef SECONDARY_OUTPUT_RELOAD_CLASS /* If we need two reload regs, set RELOADREG to the intermediate - one, since it will be stored into OUT. We might need a secondary + one, since it will be stored into OLD. We might need a secondary register only for an input reload, so check again here. */ if (reload_secondary_out_reload[j] >= 0) @@ -6289,10 +6308,10 @@ emit_reload_insns (insn) { /* See if we need both a scratch and intermediate reload register. */ + int secondary_reload = reload_secondary_out_reload[j]; enum insn_code tertiary_icode = reload_secondary_out_icode[secondary_reload]; - rtx pat; if (GET_MODE (reloadreg) != mode) reloadreg = gen_rtx (REG, mode, REGNO (reloadreg)); @@ -6301,44 +6320,24 @@ emit_reload_insns (insn) { rtx third_reloadreg = reload_reg_rtx[reload_secondary_out_reload[secondary_reload]]; - pat = (GEN_FCN (tertiary_icode) - (reloadreg, second_reloadreg, third_reloadreg)); - } -#ifdef SECONDARY_MEMORY_NEEDED - /* If we need a memory location to do the move, do it that way. */ - else if (GET_CODE (reloadreg) == REG - && REGNO (reloadreg) < FIRST_PSEUDO_REGISTER - && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (reloadreg)), - REGNO_REG_CLASS (REGNO (second_reloadreg)), - GET_MODE (second_reloadreg))) - { - /* Get the memory to use and rewrite both registers - to its mode. */ - rtx loc - = get_secondary_mem (reloadreg, - GET_MODE (second_reloadreg), - reload_opnum[j], - reload_when_needed[j]); - rtx tmp_reloadreg; - - if (GET_MODE (loc) != GET_MODE (second_reloadreg)) - second_reloadreg = gen_rtx (REG, GET_MODE (loc), - REGNO (second_reloadreg)); - - if (GET_MODE (loc) != GET_MODE (reloadreg)) - tmp_reloadreg = gen_rtx (REG, GET_MODE (loc), - REGNO (reloadreg)); - else - tmp_reloadreg = reloadreg; - - emit_move_insn (loc, second_reloadreg); - pat = gen_move_insn (tmp_reloadreg, loc); + + /* Copy primary reload reg to secondary reload reg. + (Note that these have been swapped above, then + secondary reload reg to OLD using our insn. */ + + gen_reload (reloadreg, second_reloadreg, + reload_opnum[j], reload_when_needed[j]); + emit_insn ((GEN_FCN (tertiary_icode) + (real_old, reloadreg, third_reloadreg))); + special = 1; } -#endif + else - pat = gen_move_insn (reloadreg, second_reloadreg); + /* Copy between the reload regs here and then to + OUT later. */ - emit_insn (pat); + gen_reload (reloadreg, second_reloadreg, + reload_opnum[j], reload_when_needed[j]); } } } @@ -6346,34 +6345,8 @@ emit_reload_insns (insn) /* Output the last reload insn. */ if (! special) - { -#ifdef SECONDARY_MEMORY_NEEDED - /* If we need a memory location to do the move, do it that way. */ - if (GET_CODE (old) == REG && REGNO (old) < FIRST_PSEUDO_REGISTER - && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (old)), - REGNO_REG_CLASS (REGNO (reloadreg)), - GET_MODE (reloadreg))) - { - /* Get the memory to use and rewrite both registers to - its mode. */ - rtx loc = get_secondary_mem (old, GET_MODE (reloadreg), - reload_opnum[j], - reload_when_needed[j]); - - if (GET_MODE (loc) != GET_MODE (reloadreg)) - reloadreg = gen_rtx (REG, GET_MODE (loc), - REGNO (reloadreg)); - - if (GET_MODE (loc) != GET_MODE (old)) - old = gen_rtx (REG, GET_MODE (loc), REGNO (old)); - - emit_insn (gen_move_insn (loc, reloadreg)); - emit_insn (gen_move_insn (old, loc)); - } - else -#endif - emit_insn (gen_move_insn (old, reloadreg)); - } + gen_reload (old, reloadreg, reload_opnum[j], + reload_when_needed[j]); #ifdef PRESERVE_DEATH_INFO_REGNO_P /* If final will look at death notes for this reg, @@ -6408,17 +6381,14 @@ emit_reload_insns (insn) reg_has_output_reload will make this do nothing. */ note_stores (PATTERN (p), forget_old_reloads_1); - if (reg_mentioned_p (reload_reg_rtx[j], PATTERN (p))) - store_insn = p; + if (reg_mentioned_p (reload_reg_rtx[j], PATTERN (p)) + && reload_spill_index[j] >= 0) + new_spill_reg_store[reload_spill_index[j]] = p; } output_reload_insns[reload_opnum[j]] = get_insns (); end_sequence (); - } - - if (reload_spill_index[j] >= 0) - new_spill_reg_store[reload_spill_index[j]] = store_insn; } /* Now write all the insns we made for reloads in the order expected by @@ -6640,14 +6610,15 @@ emit_reload_insns (insn) } } -/* Emit code to perform an input reload of IN to RELOADREG. IN is from - operand OPNUM with reload type TYPE. +/* Emit code to perform a reload from IN (which may be a reload register) to + OUT (which may also be a reload register). IN or OUT is from operand + OPNUM with reload type TYPE. Returns first insn emitted. */ rtx -gen_input_reload (reloadreg, in, opnum, type) - rtx reloadreg; +gen_reload (out, in, opnum, type) + rtx out; rtx in; int opnum; enum reload_type type; @@ -6714,13 +6685,13 @@ gen_input_reload (reloadreg, in, opnum, type) it will be A = A + B as constrain_operands expects. */ if (GET_CODE (XEXP (in, 1)) == REG - && REGNO (reloadreg) == REGNO (XEXP (in, 1))) + && REGNO (out) == REGNO (XEXP (in, 1))) tem = op0, op0 = op1, op1 = tem; if (op0 != XEXP (in, 0) || op1 != XEXP (in, 1)) in = gen_rtx (PLUS, GET_MODE (in), op0, op1); - insn = emit_insn (gen_rtx (SET, VOIDmode, reloadreg, in)); + insn = emit_insn (gen_rtx (SET, VOIDmode, out, in)); code = recog_memoized (insn); if (code >= 0) @@ -6749,16 +6720,16 @@ gen_input_reload (reloadreg, in, opnum, type) && REGNO (op1) >= FIRST_PSEUDO_REGISTER)) tem = op0, op0 = op1, op1 = tem; - emit_insn (gen_move_insn (reloadreg, op0)); + emit_insn (gen_move_insn (out, op0)); - /* If OP0 and OP1 are the same, we can use RELOADREG for OP1. + /* If OP0 and OP1 are the same, we can use OUT for OP1. This fixes a problem on the 32K where the stack pointer cannot be used as an operand of an add insn. */ if (rtx_equal_p (op0, op1)) - op1 = reloadreg; + op1 = out; - insn = emit_insn (gen_add2_insn (reloadreg, op1)); + insn = emit_insn (gen_add2_insn (out, op1)); /* If that failed, copy the address register to the reload register. Then add the constant to the reload register. */ @@ -6777,43 +6748,44 @@ gen_input_reload (reloadreg, in, opnum, type) delete_insns_since (last); - emit_insn (gen_move_insn (reloadreg, op1)); - emit_insn (gen_add2_insn (reloadreg, op0)); + emit_insn (gen_move_insn (out, op1)); + emit_insn (gen_add2_insn (out, op0)); } #ifdef SECONDARY_MEMORY_NEEDED /* If we need a memory location to do the move, do it that way. */ else if (GET_CODE (in) == REG && REGNO (in) < FIRST_PSEUDO_REGISTER + && GET_CODE (out) == REG && REGNO (out) < FIRST_PSEUDO_REGISTER && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (in)), - REGNO_REG_CLASS (REGNO (reloadreg)), - GET_MODE (reloadreg))) + REGNO_REG_CLASS (REGNO (out)), + GET_MODE (out))) { /* Get the memory to use and rewrite both registers to its mode. */ - rtx loc = get_secondary_mem (in, GET_MODE (reloadreg), opnum, type); + rtx loc = get_secondary_mem (in, GET_MODE (out), opnum, type); - if (GET_MODE (loc) != GET_MODE (reloadreg)) - reloadreg = gen_rtx (REG, GET_MODE (loc), REGNO (reloadreg)); + if (GET_MODE (loc) != GET_MODE (out)) + out = gen_rtx (REG, GET_MODE (loc), REGNO (out)); if (GET_MODE (loc) != GET_MODE (in)) in = gen_rtx (REG, GET_MODE (loc), REGNO (in)); emit_insn (gen_move_insn (loc, in)); - emit_insn (gen_move_insn (reloadreg, loc)); + emit_insn (gen_move_insn (out, loc)); } #endif /* If IN is a simple operand, use gen_move_insn. */ else if (GET_RTX_CLASS (GET_CODE (in)) == 'o' || GET_CODE (in) == SUBREG) - emit_insn (gen_move_insn (reloadreg, in)); + emit_insn (gen_move_insn (out, in)); #ifdef HAVE_reload_load_address else if (HAVE_reload_load_address) - emit_insn (gen_reload_load_address (reloadreg, in)); + emit_insn (gen_reload_load_address (out, in)); #endif - /* Otherwise, just write (set REGLOADREG IN) and hope for the best. */ + /* Otherwise, just write (set OUT IN) and hope for the best. */ else - emit_insn (gen_rtx (SET, VOIDmode, reloadreg, in)); + emit_insn (gen_rtx (SET, VOIDmode, out, in)); /* Return the first insn emitted. We can not just return get_last_insn, because there may have @@ -6960,7 +6932,7 @@ inc_for_reload (reloadreg, value, inc_amount) emit_insn (gen_move_insn (reloadreg, incloc)); /* See if we can directly increment INCLOC. Use a method similar to that - in gen_input_reload. */ + in gen_reload. */ last = get_last_insn (); add_insn = emit_insn (gen_rtx (SET, VOIDmode, incloc, diff --git a/gnu/usr.bin/cc/cc_int/reorg.c b/gnu/usr.bin/cc/cc_int/reorg.c index 4082ad8..250cf99 100644 --- a/gnu/usr.bin/cc/cc_int/reorg.c +++ b/gnu/usr.bin/cc/cc_int/reorg.c @@ -607,6 +607,22 @@ mark_set_resources (x, res, in_dest, include_delayed_effects) mark_set_resources (XEXP (x, 0), res, 0, 0); return; + case SUBREG: + if (in_dest) + { + if (GET_CODE (SUBREG_REG (x)) != REG) + mark_set_resources (SUBREG_REG (x), res, + in_dest, include_delayed_effects); + else + { + int regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x); + int last_regno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); + for (i = regno; i < last_regno; i++) + SET_HARD_REG_BIT (res->regs, i); + } + } + return; + case REG: if (in_dest) for (i = 0; i < HARD_REGNO_NREGS (REGNO (x), GET_MODE (x)); i++) @@ -1762,6 +1778,7 @@ try_merge_delay_insns (insn, thread) for (trial = thread; !stop_search_p (trial, 1); trial = next_trial) { rtx pat = PATTERN (trial); + rtx oldtrial = trial; next_trial = next_nonnote_insn (trial); @@ -1781,6 +1798,8 @@ try_merge_delay_insns (insn, thread) && (trial = try_split (pat, trial, 0)) != 0 /* Update next_trial, in case try_split succeeded. */ && (next_trial = next_nonnote_insn (trial)) + /* Likewise THREAD. */ + && (thread = oldtrial == thread ? trial : thread) && rtx_equal_p (PATTERN (next_to_match), PATTERN (trial)) /* Have to test this condition if annul condition is different from (and less restrictive than) non-annulling one. */ @@ -1790,6 +1809,9 @@ try_merge_delay_insns (insn, thread) if (! annul_p) { update_block (trial, thread); + if (trial == thread) + thread = next_active_insn (thread); + delete_insn (trial); INSN_FROM_TARGET_P (next_to_match) = 0; } @@ -3265,6 +3287,13 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely, if (own_thread) { update_block (trial, thread); + if (trial == thread) + { + thread = next_active_insn (thread); + if (new_thread == trial) + new_thread = thread; + } + delete_insn (trial); } else @@ -3284,6 +3313,8 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely, trial = try_split (pat, trial, 0); if (new_thread == old_trial) new_thread = trial; + if (thread == old_trial) + thread = trial; pat = PATTERN (trial); if (eligible_for_delay (insn, *pslots_filled, trial, flags)) goto winner; diff --git a/gnu/usr.bin/cc/cc_int/rtlanal.c b/gnu/usr.bin/cc/cc_int/rtlanal.c index 188fb93..d52bd64 100644 --- a/gnu/usr.bin/cc/cc_int/rtlanal.c +++ b/gnu/usr.bin/cc/cc_int/rtlanal.c @@ -1603,6 +1603,10 @@ may_trap_p (x) we can link this file into other programs. */ if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0) return 1; + case EXPR_LIST: + /* An EXPR_LIST is used to represent a function call. This + certainly may trap. */ + return 1; default: /* Any floating arithmetic may trap. */ if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) diff --git a/gnu/usr.bin/cc/cc_int/sched.c b/gnu/usr.bin/cc/cc_int/sched.c index 9870967..0f08b65 100644 --- a/gnu/usr.bin/cc/cc_int/sched.c +++ b/gnu/usr.bin/cc/cc_int/sched.c @@ -315,7 +315,7 @@ static void add_insn_mem_dependence PROTO((rtx *, rtx *, rtx, rtx)); static void flush_pending_lists PROTO((rtx)); static void sched_analyze_1 PROTO((rtx, rtx)); static void sched_analyze_2 PROTO((rtx, rtx)); -static void sched_analyze_insn PROTO((rtx, rtx)); +static void sched_analyze_insn PROTO((rtx, rtx, rtx)); static int sched_analyze PROTO((rtx, rtx)); static void sched_note_set PROTO((int, rtx, int)); static int rank_for_schedule PROTO((rtx *, rtx *)); @@ -2013,8 +2013,9 @@ sched_analyze_2 (x, insn) /* Analyze an INSN with pattern X to find all dependencies. */ static void -sched_analyze_insn (x, insn) +sched_analyze_insn (x, insn, loop_notes) rtx x, insn; + rtx loop_notes; { register RTX_CODE code = GET_CODE (x); rtx link; @@ -2048,6 +2049,36 @@ sched_analyze_insn (x, insn) sched_analyze_2 (XEXP (link, 0), insn); } + /* If there is a LOOP_{BEG,END} note in the middle of a basic block, then + we must be sure that no instructions are scheduled across it. + Otherwise, the reg_n_refs info (which depends on loop_depth) would + become incorrect. */ + + if (loop_notes) + { + int max_reg = max_reg_num (); + rtx link; + + for (i = 0; i < max_reg; i++) + { + rtx u; + for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) + add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); + reg_last_uses[i] = 0; + if (reg_last_sets[i]) + add_dependence (insn, reg_last_sets[i], 0); + } + reg_pending_sets_all = 1; + + flush_pending_lists (insn); + + link = loop_notes; + while (XEXP (link, 1)) + link = XEXP (link, 1); + XEXP (link, 1) = REG_NOTES (insn); + REG_NOTES (insn) = loop_notes; + } + /* After reload, it is possible for an instruction to have a REG_DEAD note for a register that actually dies a few instructions earlier. For example, this can happen with SECONDARY_MEMORY_NEEDED reloads. @@ -2107,7 +2138,8 @@ sched_analyze_insn (x, insn) prev_dep_insn = insn; dep_insn = PREV_INSN (insn); while (GET_CODE (dep_insn) == INSN - && GET_CODE (PATTERN (dep_insn)) == USE) + && GET_CODE (PATTERN (dep_insn)) == USE + && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG) { SCHED_GROUP_P (prev_dep_insn) = 1; @@ -2135,6 +2167,7 @@ sched_analyze (head, tail) register int n_insns = 0; register rtx u; register int luid = 0; + rtx loop_notes = 0; for (insn = head; ; insn = NEXT_INSN (insn)) { @@ -2142,7 +2175,8 @@ sched_analyze (head, tail) if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN) { - sched_analyze_insn (PATTERN (insn), insn); + sched_analyze_insn (PATTERN (insn), insn, loop_notes); + loop_notes = 0; n_insns += 1; } else if (GET_CODE (insn) == CALL_INSN) @@ -2179,7 +2213,8 @@ sched_analyze (head, tail) /* Add a fake REG_NOTE which we will later convert back into a NOTE_INSN_SETJMP note. */ - REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_DEAD, constm1_rtx, + REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_DEAD, + GEN_INT (NOTE_INSN_SETJMP), REG_NOTES (insn)); } else @@ -2207,7 +2242,8 @@ sched_analyze (head, tail) } LOG_LINKS (sched_before_next_call) = 0; - sched_analyze_insn (PATTERN (insn), insn); + sched_analyze_insn (PATTERN (insn), insn, loop_notes); + loop_notes = 0; /* We don't need to flush memory for a function call which does not involve memory. */ @@ -2224,6 +2260,11 @@ sched_analyze (head, tail) last_function_call = insn; n_insns += 1; } + else if (GET_CODE (insn) == NOTE + && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG + || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)) + loop_notes = gen_rtx (EXPR_LIST, REG_DEAD, + GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes); if (insn == tail) return n_insns; @@ -2825,6 +2866,16 @@ attach_deaths (x, insn, set_p) { if (! all_needed && ! dead_or_set_p (insn, x)) { + /* Check for the case where the register dying partially + overlaps the register set by this insn. */ + if (regno < FIRST_PSEUDO_REGISTER + && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1) + { + int n = HARD_REGNO_NREGS (regno, GET_MODE (x)); + while (--n >= 0) + some_needed |= dead_or_set_regno_p (insn, regno + n); + } + /* If none of the words in X is needed, make a REG_DEAD note. Otherwise, we must make partial REG_DEAD notes. */ @@ -2985,8 +3036,11 @@ unlink_notes (insn, tail) /* Don't save away NOTE_INSN_SETJMPs, because they must remain immediately after the call they follow. We use a fake - (REG_DEAD (const_int -1)) note to remember them. */ - else if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP) + (REG_DEAD (const_int -1)) note to remember them. + Likewise with NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END. */ + else if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP + && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG + && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END) { /* Insert the note at the end of the notes list. */ PREV_INSN (insn) = note_list; @@ -3803,17 +3857,23 @@ schedule_block (b, file) PREV_INSN (last) = insn; last = insn; - /* Check to see if we need to re-emit a NOTE_INSN_SETJMP here. */ - if (GET_CODE (insn) == CALL_INSN) - { - rtx note = find_reg_note (insn, REG_DEAD, constm1_rtx); + /* Check to see if we need to re-emit any notes here. */ + { + rtx note; - if (note) - { - emit_note_after (NOTE_INSN_SETJMP, insn); - remove_note (insn, note); - } - } + for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) + { + if (REG_NOTE_KIND (note) == REG_DEAD + && GET_CODE (XEXP (note, 0)) == CONST_INT) + { + if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP) + emit_note_after (INTVAL (XEXP (note, 0)), insn); + else + last = emit_note_before (INTVAL (XEXP (note, 0)), last); + remove_note (insn, note); + } + } + } /* Everything that precedes INSN now either becomes "ready", if it can execute immediately before INSN, or "pending", if diff --git a/gnu/usr.bin/cc/cc_int/sdbout.c b/gnu/usr.bin/cc/cc_int/sdbout.c index 6a03108..4426457 100644 --- a/gnu/usr.bin/cc/cc_int/sdbout.c +++ b/gnu/usr.bin/cc/cc_int/sdbout.c @@ -53,7 +53,7 @@ AT&T C compiler. From the example below I would conclude the following: /* Mips systems use the SDB functions to dump out symbols, but do not supply usable syms.h include files. */ -#if defined(USG) && !defined(MIPS) && !defined (hpux) +#if defined(USG) && !defined(MIPS) && !defined (hpux) && !defined(WINNT) #include <syms.h> /* Use T_INT if we don't have T_VOID. */ #ifndef T_VOID diff --git a/gnu/usr.bin/cc/cc_int/stmt.c b/gnu/usr.bin/cc/cc_int/stmt.c index 4069829..c845d30 100644 --- a/gnu/usr.bin/cc/cc_int/stmt.c +++ b/gnu/usr.bin/cc/cc_int/stmt.c @@ -1380,6 +1380,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) i = decode_reg_name (regname); if (i >= 0 || i == -4) ++nclobbers; + else if (i == -2) + error ("unknown register name `%s' in `asm'", regname); } last_expr_type = 0; @@ -1569,8 +1571,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) continue; } - error ("unknown register name `%s' in `asm'", regname); - return; + /* Ignore unknown register, error already signalled. */ } /* Use QImode since that's guaranteed to clobber just one reg. */ @@ -1730,7 +1731,7 @@ warn_if_unused_value (exp) while (TREE_CODE (tem) == CONVERT_EXPR || TREE_CODE (tem) == NOP_EXPR) tem = TREE_OPERAND (tem, 0); - if (TREE_CODE (tem) == MODIFY_EXPR) + if (TREE_CODE (tem) == MODIFY_EXPR || TREE_CODE (tem) == INIT_EXPR) return 0; } /* ... fall through ... */ @@ -1932,6 +1933,17 @@ expand_start_else () cond_stack->data.cond.next_label = 0; /* No more _else or _elseif calls. */ } +/* After calling expand_start_else, turn this "else" into an "else if" + by providing another condition. */ + +void +expand_elseif (cond) + tree cond; +{ + cond_stack->data.cond.next_label = gen_label_rtx (); + do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX); +} + /* Generate RTL for the end of an if-then. Pop the record for it off of cond_stack. */ @@ -2501,7 +2513,15 @@ expand_return (retval) } /* Are any cleanups needed? E.g. C++ destructors to be run? */ + /* This is not sufficient. We also need to watch for cleanups of the + expression we are about to expand. Unfortunately, we cannot know + if it has cleanups until we expand it, and we want to change how we + expand it depending upon if we need cleanups. We can't win. */ +#if 0 cleanups = any_pending_cleanups (1); +#else + cleanups = 1; +#endif if (TREE_CODE (retval) == RESULT_DECL) retval_rhs = retval; @@ -3510,6 +3530,17 @@ expand_anon_union_decl (decl, cleanup, decl_elts) tree cleanup_elt = TREE_PURPOSE (decl_elts); enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt)); + /* Propagate the union's alignment to the elements. */ + DECL_ALIGN (decl_elt) = DECL_ALIGN (decl); + + /* If the element has BLKmode and the union doesn't, the union is + aligned such that the element doesn't need to have BLKmode, so + change the element's mode to the appropriate one for its size. */ + if (mode == BLKmode && DECL_MODE (decl) != BLKmode) + DECL_MODE (decl_elt) = mode + = mode_for_size (TREE_INT_CST_LOW (DECL_SIZE (decl_elt)), + MODE_INT, 1); + /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we instead create a new MEM rtx with the proper mode. */ if (GET_CODE (x) == MEM) @@ -4055,6 +4086,191 @@ bc_pushcase (value, label) return 0; } +/* Returns the number of possible values of TYPE. + Returns -1 if the number is unknown or variable. + Returns -2 if the number does not fit in a HOST_WIDE_INT. + Sets *SPARENESS to 2 if TYPE is an ENUMERAL_TYPE whose values + do not increase monotonically (there may be duplicates); + to 1 if the values increase monotonically, but not always by 1; + otherwise sets it to 0. */ + +HOST_WIDE_INT +all_cases_count (type, spareness) + tree type; + int *spareness; +{ + HOST_WIDE_INT count, count_high = 0; + *spareness = 0; + + switch (TREE_CODE (type)) + { + tree t; + case BOOLEAN_TYPE: + count = 2; + break; + case CHAR_TYPE: + count = 1 << BITS_PER_UNIT; + break; + default: + case INTEGER_TYPE: + if (TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST + || TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST) + return -1; + else + { + /* count + = TREE_INT_CST_LOW (TYPE_MAX_VALUE (type)) + - TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)) + 1 + but with overflow checking. */ + tree mint = TYPE_MIN_VALUE (type); + tree maxt = TYPE_MAX_VALUE (type); + HOST_WIDE_INT lo, hi; + neg_double(TREE_INT_CST_LOW (mint), TREE_INT_CST_HIGH (mint), + &lo, &hi); + add_double(TREE_INT_CST_LOW (maxt), TREE_INT_CST_HIGH (maxt), + lo, hi, &lo, &hi); + add_double (lo, hi, 1, 0, &lo, &hi); + if (hi != 0 || lo < 0) + return -2; + count = lo; + } + break; + case ENUMERAL_TYPE: + count = 0; + for (t = TYPE_VALUES (type); t != NULL_TREE; t = TREE_CHAIN (t)) + { + if (TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST + || TREE_CODE (TREE_VALUE (t)) != INTEGER_CST + || TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)) + count + != TREE_INT_CST_LOW (TREE_VALUE (t))) + *spareness = 1; + count++; + } + if (*spareness == 1) + { + tree prev = TREE_VALUE (TYPE_VALUES (type)); + for (t = TYPE_VALUES (type); t = TREE_CHAIN (t), t != NULL_TREE; ) + { + if (! tree_int_cst_lt (prev, TREE_VALUE (t))) + { + *spareness = 2; + break; + } + prev = TREE_VALUE (t); + } + + } + } + return count; +} + + +#define BITARRAY_TEST(ARRAY, INDEX) \ + ((ARRAY)[(unsigned)(INDEX) / HOST_BITS_PER_CHAR]\ + & (1 << ((unsigned)(INDEX) % HOST_BITS_PER_CHAR))) +#define BITARRAY_SET(ARRAY, INDEX) \ + ((ARRAY)[(unsigned)(INDEX) / HOST_BITS_PER_CHAR]\ + |= 1 << ((unsigned)(INDEX) % HOST_BITS_PER_CHAR)) + +/* Set the elements of the bitstring CASES_SEEN (which has length COUNT), + with the case values we have seen, assuming the case expression + has the given TYPE. + SPARSENESS is as determined by all_cases_count. + + The time needed is propotional to COUNT, unless + SPARSENESS is 2, in which case quadratic time is needed. */ + +void +mark_seen_cases (type, cases_seen, count, sparseness) + tree type; + unsigned char *cases_seen; + long count; + int sparseness; +{ + long i; + + tree next_node_to_try = NULL_TREE; + long next_node_offset = 0; + + register struct case_node *n; + tree val = make_node (INTEGER_CST); + TREE_TYPE (val) = type; + for (n = case_stack->data.case_stmt.case_list; n; + n = n->right) + { + TREE_INT_CST_LOW (val) = TREE_INT_CST_LOW (n->low); + TREE_INT_CST_HIGH (val) = TREE_INT_CST_HIGH (n->low); + while ( ! tree_int_cst_lt (n->high, val)) + { + /* Calculate (into xlo) the "offset" of the integer (val). + The element with lowest value has offset 0, the next smallest + element has offset 1, etc. */ + + HOST_WIDE_INT xlo, xhi; + tree t; + if (sparseness == 2) + { + /* This less efficient loop is only needed to handle + duplicate case values (multiple enum constants + with the same value). */ + for (t = TYPE_VALUES (type), xlo = 0; t != NULL_TREE; + t = TREE_CHAIN (t), xlo++) + { + if (tree_int_cst_equal (val, TREE_VALUE (t))) + BITARRAY_SET (cases_seen, xlo); + } + } + else + { + if (sparseness && TYPE_VALUES (type) != NULL_TREE) + { + /* The TYPE_VALUES will be in increasing order, so + starting searching where we last ended. */ + t = next_node_to_try; + xlo = next_node_offset; + xhi = 0; + for (;;) + { + if (t == NULL_TREE) + { + t = TYPE_VALUES (type); + xlo = 0; + } + if (tree_int_cst_equal (val, TREE_VALUE (t))) + { + next_node_to_try = TREE_CHAIN (t); + next_node_offset = xlo + 1; + break; + } + xlo++; + t = TREE_CHAIN (t); + if (t == next_node_to_try) + break; + } + } + else + { + t = TYPE_MIN_VALUE (type); + if (t) + neg_double (TREE_INT_CST_LOW (t), TREE_INT_CST_HIGH (t), + &xlo, &xhi); + else + xlo = xhi = 0; + add_double (xlo, xhi, + TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val), + &xlo, &xhi); + } + + if (xhi == 0 && xlo >= 0 && xlo < count) + BITARRAY_SET (cases_seen, xlo); + } + add_double (TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val), + 1, 0, + &TREE_INT_CST_LOW (val), &TREE_INT_CST_HIGH (val)); + } + } +} + /* Called when the index of a switch statement is an enumerated type and there is no default label. @@ -4075,37 +4291,55 @@ check_for_full_enumeration_handling (type) register tree chain; int all_values = 1; + /* True iff the selector type is a numbered set mode. */ + int sparseness = 0; + + /* The number of possible selector values. */ + HOST_WIDE_INT size; + + /* For each possible selector value. a one iff it has been matched + by a case value alternative. */ + unsigned char *cases_seen; + + /* The allocated size of cases_seen, in chars. */ + long bytes_needed; + tree t; + if (output_bytecode) { bc_check_for_full_enumeration_handling (type); return; } - /* The time complexity of this loop is currently O(N * M), with - N being the number of members in the enumerated type, and - M being the number of case expressions in the switch. */ + if (! warn_switch) + return; + + size = all_cases_count (type, &sparseness); + bytes_needed = (size + HOST_BITS_PER_CHAR) / HOST_BITS_PER_CHAR; - for (chain = TYPE_VALUES (type); - chain; - chain = TREE_CHAIN (chain)) + if (size > 0 && size < 600000 + /* We deliberately use malloc here - not xmalloc. */ + && (cases_seen = (unsigned char *) malloc (bytes_needed)) != NULL) { - /* Find a match between enumeral and case expression, if possible. - Quit looking when we've gone too far (since case expressions - are kept sorted in ascending order). Warn about enumerators not - handled in the switch statement case expression list. */ - - for (n = case_stack->data.case_stmt.case_list; - n && tree_int_cst_lt (n->high, TREE_VALUE (chain)); - n = n->right) - ; + long i; + tree v = TYPE_VALUES (type); + bzero (cases_seen, bytes_needed); + + /* The time complexity of this code is normally O(N), where + N being the number of members in the enumerated type. + However, if type is a ENUMERAL_TYPE whose values do not + increase monotonically, quadratic time may be needed. */ - if (!n || tree_int_cst_lt (TREE_VALUE (chain), n->low)) + mark_seen_cases (type, cases_seen, size, sparseness); + + for (i = 0; v != NULL_TREE && i < size; i++, v = TREE_CHAIN (v)) { - if (warn_switch) + if (BITARRAY_TEST(cases_seen, i) == 0) warning ("enumeration value `%s' not handled in switch", - IDENTIFIER_POINTER (TREE_PURPOSE (chain))); - all_values = 0; + IDENTIFIER_POINTER (TREE_PURPOSE (v))); } + + free (cases_seen); } /* Now we go the other way around; we warn if there are case diff --git a/gnu/usr.bin/cc/cc_int/stor-layout.c b/gnu/usr.bin/cc/cc_int/stor-layout.c index d2c6f28..834e96d 100644 --- a/gnu/usr.bin/cc/cc_int/stor-layout.c +++ b/gnu/usr.bin/cc/cc_int/stor-layout.c @@ -44,6 +44,10 @@ tree size_one_node; The value is measured in bits. */ int maximum_field_alignment; +/* If non-zero, the alignment of a bitsting or (power-)set value, in bits. + May be overridden by front-ends. */ +int set_alignment = 0; + #define GET_MODE_ALIGNMENT(MODE) \ MIN (BIGGEST_ALIGNMENT, \ MAX (1, (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT))) @@ -84,8 +88,8 @@ variable_size (size) { /* If the language-processor is to take responsibility for variable-sized items (e.g., languages which have elaboration procedures like Ada), - just return SIZE unchanged. */ - if (global_bindings_p () < 0) + just return SIZE unchanged. Likewise for self-referential sizes. */ + if (global_bindings_p () < 0 || contains_placeholder_p (size)) return size; size = save_expr (size); @@ -898,6 +902,31 @@ layout_type (type) TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type)); break; + case SET_TYPE: + if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) != INTEGER_CST + || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) != INTEGER_CST) + abort(); + else + { +#ifndef SET_WORD_SIZE +#define SET_WORD_SIZE BITS_PER_WORD +#endif + int alignment = set_alignment ? set_alignment : SET_WORD_SIZE; + int size_in_bits = + TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1; + int rounded_size + = ((size_in_bits + alignment - 1) / alignment) * alignment; + if (rounded_size > alignment) + TYPE_MODE (type) = BLKmode; + else + TYPE_MODE (type) = mode_for_size (alignment, MODE_INT, 1); + TYPE_SIZE (type) = size_int (rounded_size); + TYPE_ALIGN (type) = alignment; + TYPE_PRECISION (type) = size_in_bits; + } + break; + case FILE_TYPE: /* The size may vary in different languages, so the language front end should fill in the size. */ diff --git a/gnu/usr.bin/cc/cc_int/stupid.c b/gnu/usr.bin/cc/cc_int/stupid.c index 7ceec9f..e10f2dc 100644 --- a/gnu/usr.bin/cc/cc_int/stupid.c +++ b/gnu/usr.bin/cc/cc_int/stupid.c @@ -82,6 +82,11 @@ static int *reg_order; static char *regs_live; +/* Indexed by reg number, nonzero if reg was used in a SUBREG that changes + its size. */ + +static char *regs_change_size; + /* Indexed by insn's suid, the set of hard regs live after that insn. */ static HARD_REG_SET *after_insn_hard_regs; @@ -93,7 +98,7 @@ static HARD_REG_SET *after_insn_hard_regs; static int stupid_reg_compare PROTO((int *, int *)); static int stupid_find_reg PROTO((int, enum reg_class, enum machine_mode, - int, int)); + int, int, int)); static void stupid_mark_refs PROTO((rtx, rtx)); /* Stupid life analysis is for the case where only variables declared @@ -157,6 +162,9 @@ stupid_life_analysis (f, nregs, file) reg_order = (int *) alloca (nregs * sizeof (int)); bzero ((char *) reg_order, nregs * sizeof (int)); + regs_change_size = (char *) alloca (nregs * sizeof (char)); + bzero ((char *) regs_change_size, nregs * sizeof (char)); + reg_renumber = (short *) oballoc (nregs * sizeof (short)); for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) reg_renumber[i] = i; @@ -254,7 +262,8 @@ stupid_life_analysis (f, nregs, file) reg_preferred_class (r), PSEUDO_REGNO_MODE (r), reg_where_born[r], - reg_where_dead[r]); + reg_where_dead[r], + regs_change_size[r]); /* If no reg available in that class, try alternate class. */ if (reg_renumber[r] == -1 && reg_alternate_class (r) != NO_REGS) @@ -262,7 +271,8 @@ stupid_life_analysis (f, nregs, file) reg_alternate_class (r), PSEUDO_REGNO_MODE (r), reg_where_born[r], - reg_where_dead[r]); + reg_where_dead[r], + regs_change_size[r]); } if (file) @@ -303,14 +313,19 @@ stupid_reg_compare (r1p, r2p) Return -1 if such a block cannot be found. If CALL_PRESERVED is nonzero, insist on registers preserved - over subroutine calls, and return -1 if cannot find such. */ + over subroutine calls, and return -1 if cannot find such. + + If CHANGES_SIZE is nonzero, it means this register was used as the + operand of a SUBREG that changes its size. */ static int -stupid_find_reg (call_preserved, class, mode, born_insn, dead_insn) +stupid_find_reg (call_preserved, class, mode, + born_insn, dead_insn, changes_size) int call_preserved; enum reg_class class; enum machine_mode mode; int born_insn, dead_insn; + int changes_size; { register int i, ins; #ifdef HARD_REG_SET @@ -339,6 +354,12 @@ stupid_find_reg (call_preserved, class, mode, born_insn, dead_insn) IOR_COMPL_HARD_REG_SET (used, reg_class_contents[(int) class]); +#ifdef CLASS_CANNOT_CHANGE_SIZE + if (changes_size) + IOR_HARD_REG_SET (used, + reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE]); +#endif + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) { #ifdef REG_ALLOC_ORDER @@ -471,9 +492,18 @@ stupid_mark_refs (x, insn) return; } + else if (code == SUBREG + && GET_CODE (SUBREG_REG (x)) == REG + && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER + && (GET_MODE_SIZE (GET_MODE (x)) + != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) + && (INTEGRAL_MODE_P (GET_MODE (x)) + || INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (x))))) + regs_change_size[REGNO (SUBREG_REG (x))] = 1; + /* Register value being used, not set. */ - if (code == REG) + else if (code == REG) { regno = REGNO (x); if (regno < FIRST_PSEUDO_REGISTER) diff --git a/gnu/usr.bin/cc/cc_int/toplev.c b/gnu/usr.bin/cc/cc_int/toplev.c index d4b1043..28114c8 100644 --- a/gnu/usr.bin/cc/cc_int/toplev.c +++ b/gnu/usr.bin/cc/cc_int/toplev.c @@ -36,6 +36,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <ctype.h> #include <sys/stat.h> +#ifndef WINNT #ifdef USG #undef FLOAT #include <sys/param.h> @@ -50,6 +51,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <sys/resource.h> #endif #endif +#endif #include "input.h" #include "tree.h" @@ -430,11 +432,7 @@ int flag_inline_functions; int flag_keep_inline_functions; -/* Nonzero means that functions declared `inline' will be treated - as `static'. Prevents generation of zillions of copies of unused - static inline functions; instead, `inlines' are written out - only when actually used. Used in conjunction with -g. Also - does the right thing with #pragma interface. */ +/* Nonzero means that functions will not be inlined. */ int flag_no_inline; @@ -640,6 +638,8 @@ char *lang_options[] = "-+e0", /* gcc.c tacks the `-' on the front. */ "-+e1", "-+e2", + "-faccess-control", + "-fno-access-control", "-fall-virtual", "-fno-all-virtual", "-falt-external-templates", @@ -707,6 +707,10 @@ char *lang_options[] = "-Wno-non-virtual-dtor", "-Wextern-inline", "-Wno-extern-inline", + "-Wreorder", + "-Wno-reorder", + "-Wsynth", + "-Wno-synth", /* these are for obj c */ "-lang-objc", @@ -849,6 +853,9 @@ int dump_time; int get_run_time () { +#ifdef WINNT + return 0; +#else #ifdef USG struct tms tms; #else @@ -881,6 +888,7 @@ get_run_time () return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000; #endif #endif +#endif } #define TIMEVAR(VAR, BODY) \ @@ -942,20 +950,17 @@ fatal_io_error (name) exit (35); } -/* Called to give a better error message when we don't have an insn to match - what we are looking for or if the insn's constraints aren't satisfied, - rather than just calling abort(). */ +/* Called to give a better error message for a bad insn rather than + just calling abort(). */ void -fatal_insn_not_found (insn) +fatal_insn (message, insn) + char *message; rtx insn; { if (!output_bytecode) { - if (INSN_CODE (insn) < 0) - error ("internal error--unrecognizable insn:"); - else - error ("internal error--insn does not satisfy its constraints:"); + error (message); debug_rtx (insn); } if (asm_out_file) @@ -993,6 +998,20 @@ fatal_insn_not_found (insn) abort (); } +/* Called to give a better error message when we don't have an insn to match + what we are looking for or if the insn's constraints aren't satisfied, + rather than just calling abort(). */ + +void +fatal_insn_not_found (insn) + rtx insn; +{ + if (INSN_CODE (insn) < 0) + fatal_insn ("internal error--unrecognizable insn:", insn); + else + fatal_insn ("internal error--insn does not satisfy its constraints:", insn); +} + /* This is the default decl_printable_name function. */ static char * @@ -2719,6 +2738,7 @@ rest_of_compilation (decl) if (warn_inline && specd) warning_with_decl (decl, lose); DECL_INLINE (decl) = 0; + DECL_ABSTRACT_ORIGIN (decl) = 0; /* Don't really compile an extern inline function. If we can't make it inline, pretend it was only declared. */ @@ -3927,8 +3947,7 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE! compile_file (filename); -#ifndef OS2 -#ifndef VMS +#if !defined(OS2) && !defined(VMS) && !defined(WINNT) if (flag_print_mem) { #ifdef __alpha @@ -3946,8 +3965,7 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE! system ("ps v"); #endif /* not USG */ } -#endif /* not VMS */ -#endif /* not OS2 */ +#endif /* not OS2 and not VMS and not WINNT */ if (errorcount) exit (FATAL_EXIT_CODE); diff --git a/gnu/usr.bin/cc/cc_int/tree.c b/gnu/usr.bin/cc/cc_int/tree.c index e0aa0ae..1787d0c 100644 --- a/gnu/usr.bin/cc/cc_int/tree.c +++ b/gnu/usr.bin/cc/cc_int/tree.c @@ -319,8 +319,9 @@ gcc_obstack_init (obstack) This is used before starting a nested function. */ void -save_tree_status (p) +save_tree_status (p, toplevel) struct function *p; + int toplevel; { p->all_types_permanent = all_types_permanent; p->momentary_stack = momentary_stack; @@ -334,10 +335,15 @@ save_tree_status (p) p->saveable_obstack = saveable_obstack; p->rtl_obstack = rtl_obstack; - /* Objects that need to be saved in this function can be in the nonsaved - obstack of the enclosing function since they can't possibly be needed - once it has returned. */ - function_maybepermanent_obstack = function_obstack; + if (! toplevel) + { + /* Objects that need to be saved in this function can be in the nonsaved + obstack of the enclosing function since they can't possibly be needed + once it has returned. */ + function_maybepermanent_obstack = function_obstack; + maybepermanent_firstobj + = (char *) obstack_finish (function_maybepermanent_obstack); + } function_obstack = (struct obstack *) xmalloc (sizeof (struct obstack)); gcc_obstack_init (function_obstack); @@ -348,30 +354,32 @@ save_tree_status (p) momentary_firstobj = (char *) obstack_finish (&momentary_obstack); momentary_function_firstobj = momentary_firstobj; - maybepermanent_firstobj - = (char *) obstack_finish (function_maybepermanent_obstack); } /* Restore all variables describing the current status from the structure *P. This is used after a nested function. */ void -restore_tree_status (p) +restore_tree_status (p, toplevel) struct function *p; + int toplevel; { all_types_permanent = p->all_types_permanent; momentary_stack = p->momentary_stack; obstack_free (&momentary_obstack, momentary_function_firstobj); - /* Free saveable storage used by the function just compiled and not - saved. - - CAUTION: This is in function_obstack of the containing function. So - we must be sure that we never allocate from that obstack during - the compilation of a nested function if we expect it to survive past the - nested function's end. */ - obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); + if (! toplevel) + { + /* Free saveable storage used by the function just compiled and not + saved. + + CAUTION: This is in function_obstack of the containing function. + So we must be sure that we never allocate from that obstack during + the compilation of a nested function if we expect it to survive + past the nested function's end. */ + obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); + } obstack_free (function_obstack, 0); free (function_obstack); @@ -519,7 +527,10 @@ permanent_allocation (function_end) /* Free up previous temporary obstack data */ obstack_free (&temporary_obstack, temporary_firstobj); if (function_end) - obstack_free (&momentary_obstack, momentary_function_firstobj); + { + obstack_free (&momentary_obstack, momentary_function_firstobj); + momentary_firstobj = momentary_function_firstobj; + } else obstack_free (&momentary_obstack, momentary_firstobj); obstack_free (&maybepermanent_obstack, maybepermanent_firstobj); @@ -2353,6 +2364,13 @@ stabilize_reference (ref) stabilize_reference_1 (TREE_OPERAND (ref, 1))); break; + case COMPOUND_EXPR: + result = build_nt (COMPOUND_EXPR, + stabilize_reference_1 (TREE_OPERAND (ref, 0)), + stabilize_reference (TREE_OPERAND (ref, 1))); + break; + + /* If arg isn't a kind of lvalue we recognize, make no change. Caller should recognize the error for an invalid lvalue. */ default: @@ -2792,19 +2810,14 @@ build_type_variant (type, constp, volatilep) constp = !!constp; volatilep = !!volatilep; - /* If not generating auxiliary info, search the chain of variants to see - if there is already one there just like the one we need to have. If so, - use that existing one. + /* Search the chain of variants to see if there is already one there just + like the one we need to have. If so, use that existing one. We must + preserve the TYPE_NAME, since there is code that depends on this. */ - We don't do this in the case where we are generating aux info because - in that case we want each typedef names to get it's own distinct type - node, even if the type of this new typedef is the same as some other - (existing) type. */ - - if (!flag_gen_aux_info) - for (t = TYPE_MAIN_VARIANT(type); t; t = TYPE_NEXT_VARIANT (t)) - if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)) - return t; + for (t = TYPE_MAIN_VARIANT(type); t; t = TYPE_NEXT_VARIANT (t)) + if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t) + && TYPE_NAME (t) == TYPE_NAME (type)) + return t; /* We need a new one. */ @@ -2819,7 +2832,7 @@ build_type_variant (type, constp, volatilep) This is the right thing to do only when something else about TYPE is modified in place. */ -tree +void change_main_variant (type, new_main) tree type, new_main; { @@ -3054,7 +3067,9 @@ type_list_equal (l1, l2) int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)); if (cmp < 0) abort (); - if (cmp == 0) + if (cmp == 0 + || TREE_TYPE (TREE_PURPOSE (t1)) + != TREE_TYPE (TREE_PURPOSE (t2))) return 0; } } @@ -3843,7 +3858,7 @@ decl_function_context (decl) { if (TREE_CODE (context) == RECORD_TYPE || TREE_CODE (context) == UNION_TYPE) - context = TYPE_CONTEXT (context); + context = NULL_TREE; else if (TREE_CODE (context) == TYPE_DECL) context = DECL_CONTEXT (context); else if (TREE_CODE (context) == BLOCK) @@ -3994,3 +4009,102 @@ get_file_function_name (kind) return get_identifier (buf); } + +/* Expand (the constant part of) a SET_TYPE CONTRUCTOR node. + The result is placed in BUFFER (which has length BIT_SIZE), + with one bit in each char ('\000' or '\001'). + + If the constructor is constant, NULL_TREE is returned. + Otherwise, a TREE_LIST of the non-constant elements is emitted. */ + +tree +get_set_constructor_bits (init, buffer, bit_size) + tree init; + char *buffer; + int bit_size; +{ + int i; + tree vals; + HOST_WIDE_INT domain_min + = TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (init)))); + tree non_const_bits = NULL_TREE; + for (i = 0; i < bit_size; i++) + buffer[i] = 0; + + for (vals = TREE_OPERAND (init, 1); + vals != NULL_TREE; vals = TREE_CHAIN (vals)) + { + if (TREE_CODE (TREE_VALUE (vals)) != INTEGER_CST + || (TREE_PURPOSE (vals) != NULL_TREE + && TREE_CODE (TREE_PURPOSE (vals)) != INTEGER_CST)) + non_const_bits = + tree_cons (TREE_PURPOSE (vals), TREE_VALUE (vals), non_const_bits); + else if (TREE_PURPOSE (vals) != NULL_TREE) + { + /* Set a range of bits to ones. */ + HOST_WIDE_INT lo_index + = TREE_INT_CST_LOW (TREE_PURPOSE (vals)) - domain_min; + HOST_WIDE_INT hi_index + = TREE_INT_CST_LOW (TREE_VALUE (vals)) - domain_min; + if (lo_index < 0 || lo_index >= bit_size + || hi_index < 0 || hi_index >= bit_size) + abort (); + for ( ; lo_index <= hi_index; lo_index++) + buffer[lo_index] = 1; + } + else + { + /* Set a single bit to one. */ + HOST_WIDE_INT index + = TREE_INT_CST_LOW (TREE_VALUE (vals)) - domain_min; + if (index < 0 || index >= bit_size) + { + error ("invalid initializer for bit string"); + return NULL_TREE; + } + buffer[index] = 1; + } + } + return non_const_bits; +} + +/* Expand (the constant part of) a SET_TYPE CONTRUCTOR node. + The result is placed in BUFFER (which is an array of WD_SIZE + words). TYPE_ALIGN bits are stored in each element of BUFFER. + If the constructor is constant, NULL_TREE is returned. + Otherwise, a TREE_LIST of the non-constant elements is emitted. */ + +tree +get_set_constructor_words (init, buffer, wd_size) + tree init; + HOST_WIDE_INT *buffer; + int wd_size; +{ + int i; + tree vals = TREE_OPERAND (init, 1); + int set_word_size = TYPE_ALIGN (TREE_TYPE (init)); + int bit_size = wd_size * set_word_size; + int bit_pos = 0; + HOST_WIDE_INT *wordp = buffer; + char *bit_buffer = (char*)alloca(bit_size); + tree non_const_bits = get_set_constructor_bits (init, bit_buffer, bit_size); + + for (i = 0; i < wd_size; i++) + buffer[i] = 0; + + for (i = 0; i < bit_size; i++) + { + if (bit_buffer[i]) + { +#if BITS_BIG_ENDIAN + *wordp |= (1 << (set_word_size - 1 - bit_pos)); +#else + *wordp |= 1 << bit_pos; +#endif + } + bit_pos++; + if (bit_pos >= set_word_size) + bit_pos = 0, wordp++; + } + return non_const_bits; +} diff --git a/gnu/usr.bin/cc/cc_int/unroll.c b/gnu/usr.bin/cc/cc_int/unroll.c index 9b968ac..c82266e 100644 --- a/gnu/usr.bin/cc/cc_int/unroll.c +++ b/gnu/usr.bin/cc/cc_int/unroll.c @@ -1335,11 +1335,27 @@ calculate_giv_inc (pattern, src_insn, regno) one of the LO_SUM rtx. */ if (GET_CODE (increment) == LO_SUM) increment = XEXP (increment, 1); + else if (GET_CODE (increment) == IOR) + { + /* The rs6000 port loads some constants with IOR. */ + rtx second_part = XEXP (increment, 1); + + src_insn = PREV_INSN (src_insn); + increment = SET_SRC (PATTERN (src_insn)); + /* Don't need the last insn anymore. */ + delete_insn (get_last_insn ()); + + if (GET_CODE (second_part) != CONST_INT + || GET_CODE (increment) != CONST_INT) + abort (); + + increment = GEN_INT (INTVAL (increment) | INTVAL (second_part)); + } if (GET_CODE (increment) != CONST_INT) abort (); - /* The insn loading the constant into a register is not longer needed, + /* The insn loading the constant into a register is no longer needed, so delete it. */ delete_insn (get_last_insn ()); } @@ -1730,12 +1746,32 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, case to be a branch past the end of the loop, and the original jump label case to fall_through. */ - if (! invert_exp (pattern, copy) - || ! redirect_exp (&pattern, - map->label_map[CODE_LABEL_NUMBER - (JUMP_LABEL (insn))], - exit_label, copy)) - abort (); + if (invert_exp (pattern, copy)) + { + if (! redirect_exp (&pattern, + map->label_map[CODE_LABEL_NUMBER + (JUMP_LABEL (insn))], + exit_label, copy)) + abort (); + } + else + { + rtx jmp; + rtx lab = gen_label_rtx (); + /* Can't do it by reversing the jump (probably becasue we + couln't reverse the conditions), so emit a new + jump_insn after COPY, and redirect the jump around + that. */ + jmp = emit_jump_insn_after (gen_jump (exit_label), copy); + jmp = emit_barrier_after (jmp); + emit_label_after (lab, jmp); + LABEL_NUSES (lab) = 0; + if (! redirect_exp (&pattern, + map->label_map[CODE_LABEL_NUMBER + (JUMP_LABEL (insn))], + lab, copy)) + abort (); + } } #ifdef HAVE_cc0 @@ -3077,7 +3113,11 @@ loop_iterations (loop_start, loop_end) loop_final_value = 0; loop_iteration_var = 0; - last_loop_insn = prev_nonnote_insn (loop_end); + /* We used to use pren_nonnote_insn here, but that fails because it might + accidentally get the branch for a contained loop if the branch for this + loop was deleted. We can only trust branches immediately before the + loop_end. */ + last_loop_insn = PREV_INSN (loop_end); comparison = get_condition_for_loop (last_loop_insn); if (comparison == 0) @@ -3115,28 +3155,6 @@ loop_iterations (loop_start, loop_end) /* iteration_info already printed a message. */ return 0; - if (increment == 0) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, - "Loop unrolling: Increment value can't be calculated.\n"); - return 0; - } - if (GET_CODE (increment) != CONST_INT) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, - "Loop unrolling: Increment value not constant.\n"); - return 0; - } - if (GET_CODE (initial_value) != CONST_INT) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, - "Loop unrolling: Initial value not constant.\n"); - return 0; - } - /* If the comparison value is an invariant register, then try to find its value from the insns before the start of the loop. */ @@ -3185,7 +3203,28 @@ loop_iterations (loop_start, loop_end) loop_increment = increment; loop_final_value = final_value; - if (final_value == 0) + if (increment == 0) + { + if (loop_dump_stream) + fprintf (loop_dump_stream, + "Loop unrolling: Increment value can't be calculated.\n"); + return 0; + } + else if (GET_CODE (increment) != CONST_INT) + { + if (loop_dump_stream) + fprintf (loop_dump_stream, + "Loop unrolling: Increment value not constant.\n"); + return 0; + } + else if (GET_CODE (initial_value) != CONST_INT) + { + if (loop_dump_stream) + fprintf (loop_dump_stream, + "Loop unrolling: Initial value not constant.\n"); + return 0; + } + else if (final_value == 0) { if (loop_dump_stream) fprintf (loop_dump_stream, diff --git a/gnu/usr.bin/cc/cc_int/varasm.c b/gnu/usr.bin/cc/cc_int/varasm.c index cd49b0c..4a46ec1 100644 --- a/gnu/usr.bin/cc/cc_int/varasm.c +++ b/gnu/usr.bin/cc/cc_int/varasm.c @@ -1358,10 +1358,9 @@ contains_pointers_p (type) } } -/* Output text storage for constructor CONSTR. Returns rtx of - storage. */ +/* Output text storage for constructor CONSTR. */ -rtx +void bc_output_constructor (constr) tree constr; { diff --git a/gnu/usr.bin/cc/cc_int/version.c b/gnu/usr.bin/cc/cc_int/version.c index a77e9ff..1c3fd1b 100644 --- a/gnu/usr.bin/cc/cc_int/version.c +++ b/gnu/usr.bin/cc/cc_int/version.c @@ -1 +1 @@ -char *version_string = "2.6.0"; +char *version_string = "2.6.1"; diff --git a/gnu/usr.bin/cc/cpp/cccp.c b/gnu/usr.bin/cc/cpp/cccp.c index 640b36b..d514466 100644 --- a/gnu/usr.bin/cc/cpp/cccp.c +++ b/gnu/usr.bin/cc/cpp/cccp.c @@ -93,7 +93,6 @@ typedef unsigned char U_CHAR; /* VMS-specific definitions */ #ifdef VMS #include <time.h> -#include <perror.h> /* This defines sys_errlist/sys_nerr properly */ #include <descrip.h> #define O_RDONLY 0 /* Open arg for Read/Only */ #define O_WRONLY 1 /* Open arg for Write/Only */ @@ -186,13 +185,22 @@ extern char *getenv (); extern FILE *fdopen (); extern char *version_string; extern struct tm *localtime (); +#ifndef VMS +#ifndef HAVE_STRERROR extern int sys_nerr; -#if defined(bsd4_4) || defined(__NetBSD__) +#if defined(bsd4_4) || defined(__NetBSD__) || defined(__FreeBSD__) extern const char *const sys_errlist[]; #else extern char *sys_errlist[]; #endif +#else /* HAVE_STERRROR */ +char *strerror (); +#endif +#else /* VMS */ +char *strerror (int,...); +#endif extern int parse_escape (); +extern HOST_WIDE_INT parse_c_expression (); #ifndef errno extern int errno; @@ -276,7 +284,7 @@ static void write_output (); static int check_macro_name (); static int compare_defs (); static int compare_token_lists (); -static int eval_if_expression (); +static HOST_WIDE_INT eval_if_expression (); static int discard_comments (); static int change_newlines (); static int line_for_error (); @@ -388,6 +396,11 @@ static int print_include_names = 0; static int no_line_commands; +/* Nonzero means output the text in failing conditionals, + inside #failed ... #endfailed. */ + +static int output_conditionals; + /* dump_only means inhibit output of the preprocessed text and instead output the definitions of all user-defined macros in a form suitable for use as input to cccp. @@ -1123,7 +1136,12 @@ main (argc, argv) #endif p = argv[0] + strlen (argv[0]); - while (p != argv[0] && p[-1] != '/') --p; + while (p != argv[0] && p[-1] != '/' +#ifdef DIR_SEPARATOR + && p[-1] != DIR_SEPARATOR +#endif + ) + --p; progname = p; #ifdef VMS @@ -1195,6 +1213,9 @@ main (argc, argv) else include_prefix = argv[++i]; } + if (!strcmp (argv[i], "-ifoutput")) { + output_conditionals = 1; + } if (!strcmp (argv[i], "-isystem")) { struct file_name_list *dirtmp; @@ -1322,7 +1343,10 @@ main (argc, argv) pedantic = 1; pedantic_errors = 1; } else if (!strcmp (argv[i], "-pcp")) { - char *pcp_fname = argv[++i]; + char *pcp_fname; + if (i + 1 == argc) + fatal ("Filename missing after -pcp option"); + pcp_fname = argv[++i]; pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0') ? fopen (pcp_fname, "w") @@ -1429,6 +1453,8 @@ main (argc, argv) /* For -MD and -MMD options, write deps on file named by next arg. */ if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD")) { + if (i + 1 == argc) + fatal ("Filename missing after %s option", argv[i]); i++; deps_file = argv[i]; deps_mode = "w"; @@ -1606,7 +1632,11 @@ main (argc, argv) /* Some people say that CPATH should replace the standard include dirs, but that seems pointless: it comes before them, so it overrides them anyway. */ +#ifdef WINNT + p = (char *) getenv ("Include"); +#else p = (char *) getenv ("CPATH"); +#endif if (p != 0 && ! no_standard_includes) path_include (p); @@ -1958,7 +1988,11 @@ main (argc, argv) int len; /* Discard all directory prefixes from filename. */ - if ((q = rindex (in_fname, '/')) != NULL) + if ((q = rindex (in_fname, '/')) != NULL +#ifdef DIR_SEPARATOR + && (q = rindex (in_fname, DIR_SEPARATOR)) != NULL +#endif + ) ++q; else q = in_fname; @@ -2175,6 +2209,33 @@ path_include (path) } } +/* Return the address of the first character in S that equals C. + S is an array of length N, possibly containing '\0's, and followed by '\0'. + Return 0 if there is no such character. Assume that C itself is not '\0'. + If we knew we could use memchr, we could just invoke memchr (S, C, N), + but unfortunately memchr isn't autoconfigured yet. */ + +static U_CHAR * +index0 (s, c, n) + U_CHAR *s; + int c; + int n; +{ + for (;;) { + char *q = index (s, c); + if (q) + return (U_CHAR *) q; + else { + int l = strlen (s); + if (l == n) + return 0; + l++; + s += l; + n -= l; + } + } +} + /* Pre-C-Preprocessor to translate ANSI trigraph idiocy in BUF before main CCCP processing. Name `pcp' is also in honor of the drugs the trigraph designers must have been on. @@ -2188,11 +2249,12 @@ static void trigraph_pcp (buf) FILE_BUF *buf; { - register U_CHAR c, *fptr, *bptr, *sptr; + register U_CHAR c, *fptr, *bptr, *sptr, *lptr; int len; fptr = bptr = sptr = buf->buf; - while ((sptr = (U_CHAR *) index (sptr, '?')) != NULL) { + lptr = fptr + buf->length; + while ((sptr = (U_CHAR *) index0 (sptr, '?', lptr - sptr)) != NULL) { if (*++sptr != '?') continue; switch (*++sptr) { @@ -2261,25 +2323,15 @@ newline_fix (bp) U_CHAR *bp; { register U_CHAR *p = bp; - register int count = 0; /* First count the backslash-newline pairs here. */ - while (1) { - if (p[0] == '\\') { - if (p[1] == '\n') - p += 2, count++; - else if (p[1] == '\r' && p[2] == '\n') - p += 3, count++; - else - break; - } else - break; - } + while (p[0] == '\\' && p[1] == '\n') + p += 2; /* What follows the backslash-newlines is not embarrassing. */ - if (count == 0 || (*p != '/' && *p != '*')) + if (*p != '/' && *p != '*') return; /* Copy all potentially embarrassing characters @@ -2290,7 +2342,7 @@ newline_fix (bp) *bp++ = *p++; /* Now write the same number of pairs after the embarrassing chars. */ - while (count-- > 0) { + while (bp < p) { *bp++ = '\\'; *bp++ = '\n'; } @@ -2304,24 +2356,14 @@ name_newline_fix (bp) U_CHAR *bp; { register U_CHAR *p = bp; - register int count = 0; /* First count the backslash-newline pairs here. */ - while (1) { - if (p[0] == '\\') { - if (p[1] == '\n') - p += 2, count++; - else if (p[1] == '\r' && p[2] == '\n') - p += 3, count++; - else - break; - } else - break; - } + while (p[0] == '\\' && p[1] == '\n') + p += 2; /* What follows the backslash-newlines is not embarrassing. */ - if (count == 0 || !is_idchar[*p]) + if (!is_idchar[*p]) return; /* Copy all potentially embarrassing characters @@ -2332,7 +2374,7 @@ name_newline_fix (bp) *bp++ = *p++; /* Now write the same number of pairs after the embarrassing chars. */ - while (count-- > 0) { + while (bp < p) { *bp++ = '\\'; *bp++ = '\n'; } @@ -2495,7 +2537,7 @@ do { ip = &instack[indepth]; \ obp = op->bufp; } while (0) if (no_output && instack[indepth].fname != 0) - skip_if_group (&instack[indepth], 1); + skip_if_group (&instack[indepth], 1, NULL); obp = op->bufp; RECACHE; @@ -2513,22 +2555,25 @@ do { ip = &instack[indepth]; \ switch (c) { case '\\': - if (ibp >= limit) - break; - if (*ibp == '\n') { - /* Always merge lines ending with backslash-newline, - even in middle of identifier. */ + if (*ibp == '\n' && !ip->macro) { + /* At the top level, always merge lines ending with backslash-newline, + even in middle of identifier. But do not merge lines in a macro, + since backslash might be followed by a newline-space marker. */ ++ibp; ++ip->lineno; --obp; /* remove backslash from obuf */ break; } + /* If ANSI, backslash is just another character outside a string. */ + if (!traditional) + goto randomchar; /* Otherwise, backslash suppresses specialness of following char, so copy it here to prevent the switch from seeing it. But first get any pending identifier processed. */ if (ident_length > 0) goto specialchar; - *obp++ = *ibp++; + if (ibp < limit) + *obp++ = *ibp++; break; case '#': @@ -2608,7 +2653,7 @@ do { ip = &instack[indepth]; \ /* If not generating expanded output, what we do with ordinary text is skip it. Discard everything until next # directive. */ - skip_if_group (&instack[indepth], 1); + skip_if_group (&instack[indepth], 1, 0); RECACHE; beg_of_line = ibp; break; @@ -2632,7 +2677,7 @@ do { ip = &instack[indepth]; \ /* If not generating expanded output, ignore everything until next # directive. */ if (no_output && instack[indepth].fname) - skip_if_group (&instack[indepth], 1); + skip_if_group (&instack[indepth], 1, 0); obp = op->bufp; RECACHE; beg_of_line = ibp; @@ -2790,6 +2835,9 @@ do { ip = &instack[indepth]; \ char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen); if (lintcmd != NULL) { + op->bufp = obp; + check_expand (op, cmdlen + arglen + 14); + obp = op->bufp; /* I believe it is always safe to emit this newline: */ obp[-1] = '\n'; bcopy ("#pragma lint ", (char *) obp, 13); @@ -2804,10 +2852,12 @@ do { ip = &instack[indepth]; \ } /* OK, now bring us back to the state we were in before we entered - this branch. We need #line b/c the newline for the pragma - could fuck things up. */ + this branch. We need #line because the #pragma's newline always + messes up the line count. */ + op->bufp = obp; output_line_command (ip, op, 0, same_file); - *(obp++) = ' '; /* just in case, if comments are copied thru */ + check_expand (op, limit - ibp + 2); + obp = op->bufp; *(obp++) = '/'; } } @@ -2884,9 +2934,7 @@ do { ip = &instack[indepth]; \ ibp += 2; } c = *ibp++; - /* ".." terminates a preprocessing number. This is useless for C - code but useful for preprocessing other things. */ - if (!isalnum (c) && (c != '.' || *ibp == '.') && c != '_') { + if (!is_idchar[c] && c != '.') { --ibp; break; } @@ -2988,7 +3036,7 @@ do { ip = &instack[indepth]; \ if (ip->lineno != op->lineno) { op->bufp = obp; output_line_command (ip, op, 1, same_file); - check_expand (op, ip->length - (ip->bufp - ip->buf)); + check_expand (op, limit - ibp); obp = op->bufp; } break; @@ -3226,9 +3274,17 @@ startagain: /* This is now known to be a macro call. Discard the macro name from the output, - along with any following whitespace just copied. */ + along with any following whitespace just copied, + but preserve newlines at the top level since this + is more likely to do the right thing with line numbers. */ obp = op->buf + obufp_before_macroname; - op->lineno = op_lineno_before_macroname; + if (ip->macro != 0) + op->lineno = op_lineno_before_macroname; + else { + int newlines = op->lineno - op_lineno_before_macroname; + while (0 < newlines--) + *obp++ = '\n'; + } /* Prevent accidental token-pasting with a character before the macro call. */ @@ -3529,8 +3585,9 @@ handle_directive (ip, op) if (*bp == '\n') { ip->lineno++; copy_command = 1; - } - bp++; + bp++; + } else if (traditional) + bp++; } break; @@ -3555,7 +3612,14 @@ handle_directive (ip, op) case '<': if (!kt->angle_brackets) break; - while (*bp && *bp != '>') bp++; + while (bp < limit && *bp != '>' && *bp != '\n') { + if (*bp == '\\' && bp[1] == '\n') { + ip->lineno++; + copy_command = 1; + bp++; + } + bp++; + } break; case '/': @@ -3783,7 +3847,7 @@ timestamp () { static struct tm *timebuf; if (!timebuf) { - time_t t = time (0); + time_t t = time ((time_t *)0); timebuf = localtime (&t); } return timebuf; @@ -3925,7 +3989,8 @@ special_symbol (hp, op) goto oops; if (hp = lookup (ip->bufp, -1, -1)) { if (pcp_outfile && pcp_inside_if - && hp->value.defn->predefined) + && (hp->type == T_CONST + || (hp->type == T_MACRO && hp->value.defn->predefined))) /* Output a precondition for this macro use. */ fprintf (pcp_outfile, "#define %s\n", hp->name); buf = " 1 "; @@ -5360,9 +5425,31 @@ create_definition (buf, limit, op) } else { /* Simple expansion or empty definition. */ - /* Skip spaces and tabs if any. */ - while (bp < limit && (*bp == ' ' || *bp == '\t')) - ++bp; + if (bp < limit) + { + switch (*bp) + { + case '\t': case ' ': + /* Skip spaces and tabs. */ + while (++bp < limit && (*bp == ' ' || *bp == '\t')) + continue; + break; + + case '!': case '"': case '#': case '%': case '&': case '\'': + case ')': case '*': case '+': case ',': case '-': case '.': + case '/': case ':': case ';': case '<': case '=': case '>': + case '?': case '[': case '\\': case ']': case '^': case '{': + case '|': case '}': case '~': + warning ("missing white space after `#define %.*s'", + sym_length, symname); + break; + + default: + pedwarn ("missing white space after `#define %.*s'", + sym_length, symname); + break; + } + } /* Now everything from bp before limit is the definition. */ defn = collect_expansion (bp, limit, -1, NULL_PTR); defn->args.argnames = (U_CHAR *) ""; @@ -5659,16 +5746,8 @@ collect_expansion (buf, end, nargs, arglist) expected_delimiter = c; break; - /* Special hack: if a \# is written in the #define - include a # in the definition. This is useless for C code - but useful for preprocessing other things. */ - case '\\': - /* \# quotes a # even outside of strings. */ - if (p < limit && *p == '#' && !expected_delimiter) { - exp_p--; - *exp_p++ = *p++; - } else if (p < limit && expected_delimiter) { + if (p < limit && expected_delimiter) { /* In a string, backslash goes through and makes next char ordinary. */ *exp_p++ = *p++; @@ -6537,7 +6616,7 @@ do_ident (buf, limit) free (trybuf.buf); /* Output directive name. */ - check_expand (op, 8); + check_expand (op, 7); bcopy ("#ident ", (char *) op->bufp, 7); op->bufp += 7; @@ -6647,11 +6726,11 @@ do_if (buf, limit, op, keyword) FILE_BUF *op; struct directive *keyword; { - int value; + HOST_WIDE_INT value; FILE_BUF *ip = &instack[indepth]; value = eval_if_expression (buf, limit - buf); - conditional_skip (ip, value == 0, T_IF, NULL_PTR); + conditional_skip (ip, value == 0, T_IF, NULL_PTR, op); return 0; } @@ -6666,7 +6745,7 @@ do_elif (buf, limit, op, keyword) FILE_BUF *op; struct directive *keyword; { - int value; + HOST_WIDE_INT value; FILE_BUF *ip = &instack[indepth]; if (if_stack == instack[indepth].if_stack) { @@ -6685,11 +6764,11 @@ do_elif (buf, limit, op, keyword) } if (if_stack->if_succeeded) - skip_if_group (ip, 0); + skip_if_group (ip, 0, op); else { value = eval_if_expression (buf, limit - buf); if (value == 0) - skip_if_group (ip, 0); + skip_if_group (ip, 0, op); else { ++if_stack->if_succeeded; /* continue processing input */ output_line_command (ip, op, 1, same_file); @@ -6702,16 +6781,16 @@ do_elif (buf, limit, op, keyword) * evaluate a #if expression in BUF, of length LENGTH, * then parse the result as a C expression and return the value as an int. */ -static int +static HOST_WIDE_INT eval_if_expression (buf, length) U_CHAR *buf; int length; { FILE_BUF temp_obuf; HASHNODE *save_defined; - int value; + HOST_WIDE_INT value; - save_defined = install ("defined", -1, T_SPEC_DEFINED, 0, 0, -1); + save_defined = install ("defined", -1, T_SPEC_DEFINED, 0, NULL_PTR, -1); pcp_inside_if = 1; temp_obuf = expand_to_temp_buffer (buf, buf + length, 0, 1); pcp_inside_if = 0; @@ -6790,7 +6869,9 @@ do_xifdef (buf, limit, op, keyword) if (pcp_outfile) { /* Output a precondition for this macro. */ - if (hp && hp->value.defn->predefined) + if (hp && + (hp->type == T_CONST + || (hp->type == T_MACRO && hp->value.defn->predefined))) fprintf (pcp_outfile, "#define %s\n", hp->name); else { U_CHAR *cp = buf; @@ -6809,7 +6890,7 @@ do_xifdef (buf, limit, op, keyword) } } - conditional_skip (ip, skip, T_IF, control_macro); + conditional_skip (ip, skip, T_IF, control_macro, op); return 0; } @@ -6819,11 +6900,12 @@ do_xifdef (buf, limit, op, keyword) Otherwise, CONTROL_MACRO is 0. */ static void -conditional_skip (ip, skip, type, control_macro) +conditional_skip (ip, skip, type, control_macro, op) FILE_BUF *ip; int skip; enum node_type type; U_CHAR *control_macro; + FILE_BUF *op; { IF_STACK_FRAME *temp; @@ -6837,7 +6919,7 @@ conditional_skip (ip, skip, type, control_macro) if_stack->type = type; if (skip != 0) { - skip_if_group (ip, 0); + skip_if_group (ip, 0, op); return; } else { ++if_stack->if_succeeded; @@ -6851,9 +6933,10 @@ conditional_skip (ip, skip, type, control_macro) * If ANY is nonzero, return at next directive of any sort. */ static void -skip_if_group (ip, any) +skip_if_group (ip, any, op) FILE_BUF *ip; int any; + FILE_BUF *op; { register U_CHAR *bp = ip->bufp, *cp; register U_CHAR *endb = ip->buf + ip->length; @@ -6862,6 +6945,25 @@ skip_if_group (ip, any) U_CHAR *beg_of_line = bp; register int ident_length; U_CHAR *ident, *after_ident; + /* Save info about where the group starts. */ + U_CHAR *beg_of_group = bp; + int beg_lineno = ip->lineno; + + if (output_conditionals && op != 0) { + char *ptr = "#failed\n"; + int len = strlen (ptr); + + if (op->bufp > op->buf && op->bufp[-1] != '\n') + { + *op->bufp++ = '\n'; + op->lineno++; + } + check_expand (op, len); + bcopy (ptr, (char *) op->bufp, len); + op->bufp += len; + op->lineno++; + output_line_command (ip, op, 1, 0); + } while (bp < endb) { switch (*bp++) { @@ -7013,7 +7115,7 @@ skip_if_group (ip, any) && strncmp (cp, kt->name, kt->length) == 0) { /* If we are asked to return on next directive, do so now. */ if (any) - return; + goto done; switch (kt->type) { case T_IF: @@ -7036,7 +7138,7 @@ skip_if_group (ip, any) break; } else if (if_stack == save_if_stack) - return; /* found what we came for */ + goto done; /* found what we came for */ if (kt->type != T_ENDIF) { if (if_stack->type == T_ELSE) @@ -7058,10 +7160,32 @@ skip_if_group (ip, any) pedwarn ("invalid preprocessor directive name"); } } + ip->bufp = bp; /* after this returns, rescan will exit because ip->bufp now points to the end of the buffer. rescan is responsible for the error message also. */ + + done: + if (output_conditionals && op != 0) { + char *ptr = "#endfailed\n"; + int len = strlen (ptr); + + if (op->bufp > op->buf && op->bufp[-1] != '\n') + { + *op->bufp++ = '\n'; + op->lineno++; + } + check_expand (op, beg_of_line - beg_of_group); + bcopy ((char *) beg_of_group, (char *) op->bufp, + beg_of_line - beg_of_group); + op->bufp += beg_of_line - beg_of_group; + op->lineno += ip->lineno - beg_lineno; + check_expand (op, len); + bcopy (ptr, (char *) op->bufp, len); + op->bufp += len; + op->lineno++; + } } /* @@ -7104,7 +7228,7 @@ do_else (buf, limit, op, keyword) } if (if_stack->if_succeeded) - skip_if_group (ip, 0); + skip_if_group (ip, 0, op); else { ++if_stack->if_succeeded; /* continue processing input */ output_line_command (ip, op, 1, same_file); @@ -8384,6 +8508,39 @@ change_newlines (start, length) } /* + * my_strerror - return the descriptive text associated with an `errno' code. + */ + +char * +my_strerror (errnum) + int errnum; +{ + char *result; + +#ifndef VMS +#ifndef HAVE_STRERROR + result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0); +#else + result = strerror (errnum); +#endif +#else /* VMS */ + /* VAXCRTL's strerror() takes an optional second argument, which only + matters when the first argument is EVMSERR. However, it's simplest + just to pass it unconditionally. `vaxc$errno' is declared in + <errno.h>, and maintained by the library in parallel with `errno'. + We assume that caller's `errnum' either matches the last setting of + `errno' by the library or else does not have the value `EVMSERR'. */ + + result = strerror (errnum, vaxc$errno); +#endif + + if (!result) + result = "undocumented I/O error"; + + return result; +} + +/* * error - print error message and increment count of errors. */ @@ -8430,10 +8587,7 @@ error_from_errno (name) if (ip != NULL) fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno); - if (errno < sys_nerr) - fprintf (stderr, "%s: %s\n", name, sys_errlist[errno]); - else - fprintf (stderr, "%s: undocumented I/O error\n", name); + fprintf (stderr, "%s: %s\n", name, my_strerror (errno)); errors++; } @@ -8929,15 +9083,16 @@ dump_defn_1 (base, start, length, of) U_CHAR *limit = base + start + length; while (p < limit) { - if (*p != '\n') - putc (*p, of); - else if (*p == '\"' || *p =='\'') { + if (*p == '\"' || *p =='\'') { U_CHAR *p1 = skip_quoted_string (p, limit, 0, NULL_PTR, NULL_PTR, NULL_PTR); fwrite (p, p1 - p, 1, of); - p = p1 - 1; + p = p1; + } else { + if (*p != '\n') + putc (*p, of); + p++; } - p++; } } @@ -9012,29 +9167,29 @@ initialize_builtins (inp, outp) FILE_BUF *inp; FILE_BUF *outp; { - install ("__LINE__", -1, T_SPECLINE, 0, 0, -1); - install ("__DATE__", -1, T_DATE, 0, 0, -1); - install ("__FILE__", -1, T_FILE, 0, 0, -1); - install ("__BASE_FILE__", -1, T_BASE_FILE, 0, 0, -1); - install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, 0, -1); - install ("__VERSION__", -1, T_VERSION, 0, 0, -1); + install ("__LINE__", -1, T_SPECLINE, 0, NULL_PTR, -1); + install ("__DATE__", -1, T_DATE, 0, NULL_PTR, -1); + install ("__FILE__", -1, T_FILE, 0, NULL_PTR, -1); + install ("__BASE_FILE__", -1, T_BASE_FILE, 0, NULL_PTR, -1); + install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, NULL_PTR, -1); + install ("__VERSION__", -1, T_VERSION, 0, NULL_PTR, -1); #ifndef NO_BUILTIN_SIZE_TYPE - install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, 0, -1); + install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, NULL_PTR, -1); #endif #ifndef NO_BUILTIN_PTRDIFF_TYPE - install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, 0, -1); + install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, NULL_PTR, -1); #endif - install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, 0, -1); - install ("__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, 0, 0, -1); - install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, 0, -1); - install ("__TIME__", -1, T_TIME, 0, 0, -1); + install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, NULL_PTR, -1); + install ("__USER_LABEL_PREFIX__",-1,T_USER_LABEL_PREFIX_TYPE,0,NULL_PTR, -1); + install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, NULL_PTR, -1); + install ("__TIME__", -1, T_TIME, 0, NULL_PTR, -1); if (!traditional) - install ("__STDC__", -1, T_CONST, STDC_VALUE, 0, -1); + install ("__STDC__", -1, T_CONST, STDC_VALUE, NULL_PTR, -1); if (objc) - install ("__OBJC__", -1, T_CONST, 1, 0, -1); + install ("__OBJC__", -1, T_CONST, 1, NULL_PTR, -1); /* This is supplied using a -D by the compiler driver so that it is present only when truly compiling with GNU C. */ -/* install ("__GNUC__", -1, T_CONST, 2, 0, -1); */ +/* install ("__GNUC__", -1, T_CONST, 2, NULL_PTR, -1); */ if (debug_output) { @@ -9119,6 +9274,12 @@ make_definition (str, op) } while (is_idchar[*++p]) ; + if (*p == '(') { + while (is_idchar[*++p] || *p == ',' || is_hor_space[*p]) + ; + if (*p++ != ')') + p = str; /* Error */ + } if (*p == 0) { buf = (U_CHAR *) alloca (p - buf + 4); strcpy ((char *)buf, str); @@ -9137,7 +9298,18 @@ make_definition (str, op) p++; q = &buf[p - str]; while (*p) { - if (*p == '\\' && p[1] == '\n') + if (*p == '\"' || *p == '\'') { + int unterminated = 0; + U_CHAR *p1 = skip_quoted_string (p, p + strlen (p), 0, + NULL_PTR, NULL_PTR, &unterminated); + if (unterminated) + return; + while (p != p1) + if (*p == '\\' && p[1] == '\n') + p += 2; + else + *q++ = *p++; + } else if (*p == '\\' && p[1] == '\n') p += 2; /* Change newline chars into newline-markers. */ else if (*p == '\n') @@ -9167,7 +9339,7 @@ make_definition (str, op) ; /* Pass NULL instead of OP, since this is a "predefined" macro. */ - do_define (buf, buf + strlen (buf), NULL, kt); + do_define (buf, buf + strlen (buf), NULL_PTR, kt); --indepth; } @@ -9392,10 +9564,7 @@ perror_with_name (name) char *name; { fprintf (stderr, "%s: ", progname); - if (errno < sys_nerr) - fprintf (stderr, "%s: %s\n", name, sys_errlist[errno]); - else - fprintf (stderr, "%s: undocumented I/O error\n", name); + fprintf (stderr, "%s: %s\n", name, my_strerror (errno)); errors++; } diff --git a/gnu/usr.bin/cc/cpp/cexp.c b/gnu/usr.bin/cc/cpp/cexp.c index d1471aa..696635e 100644 --- a/gnu/usr.bin/cc/cpp/cexp.c +++ b/gnu/usr.bin/cc/cpp/cexp.c @@ -55,13 +55,27 @@ struct arglist { #endif #endif +/* Find the largest host integer type and set its size and type. */ + +#ifndef HOST_BITS_PER_WIDE_INT + +#if HOST_BITS_PER_LONG > HOST_BITS_PER_INT +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG +#define HOST_WIDE_INT long +#else +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT +#define HOST_WIDE_INT int +#endif + +#endif + #ifndef NULL_PTR #define NULL_PTR ((GENERIC_PTR)0) #endif int yylex (); void yyerror (); -int expression_value; +HOST_WIDE_INT expression_value; static jmp_buf parse_return_error; @@ -119,7 +133,7 @@ static void integer_overflow (); static long left_shift (); static long right_shift (); -#line 127 "cexp.y" +#line 141 "cexp.y" typedef union { struct constant {long value; int unsignedp;} integer; struct name {U_CHAR *address; int length;} name; @@ -218,10 +232,10 @@ static const short yyrhs[] = { 35, #if YYDEBUG != 0 static const short yyrline[] = { 0, - 159, 164, 165, 172, 177, 180, 182, 185, 189, 191, - 196, 201, 213, 228, 239, 246, 253, 259, 265, 268, - 271, 277, 283, 289, 295, 298, 301, 304, 307, 310, - 313, 315, 317, 322, 324, 337 + 173, 178, 179, 186, 191, 194, 196, 199, 203, 205, + 210, 215, 227, 242, 253, 260, 267, 273, 279, 282, + 285, 291, 297, 303, 309, 312, 315, 318, 321, 324, + 327, 329, 331, 336, 338, 351 }; static const char * const yytname[] = { "$","error","$illegal.","INT","CHAR", @@ -805,59 +819,59 @@ yyreduce: switch (yyn) { case 1: -#line 160 "cexp.y" +#line 174 "cexp.y" { expression_value = yyvsp[0].integer.value; ; break;} case 3: -#line 166 "cexp.y" +#line 180 "cexp.y" { if (pedantic) pedwarn ("comma operator in operand of `#if'"); yyval.integer = yyvsp[0].integer; ; break;} case 4: -#line 173 "cexp.y" +#line 187 "cexp.y" { yyval.integer.value = - yyvsp[0].integer.value; if ((yyval.integer.value & yyvsp[0].integer.value) < 0 && ! yyvsp[0].integer.unsignedp) integer_overflow (); yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ; break;} case 5: -#line 178 "cexp.y" +#line 192 "cexp.y" { yyval.integer.value = ! yyvsp[0].integer.value; yyval.integer.unsignedp = 0; ; break;} case 6: -#line 181 "cexp.y" +#line 195 "cexp.y" { yyval.integer = yyvsp[0].integer; ; break;} case 7: -#line 183 "cexp.y" +#line 197 "cexp.y" { yyval.integer.value = ~ yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ; break;} case 8: -#line 186 "cexp.y" +#line 200 "cexp.y" { yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length, 0, NULL_PTR); yyval.integer.unsignedp = 0; ; break;} case 9: -#line 190 "cexp.y" +#line 204 "cexp.y" { keyword_parsing = 1; ; break;} case 10: -#line 192 "cexp.y" +#line 206 "cexp.y" { yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length, 1, yyvsp[-1].keywords); keyword_parsing = 0; yyval.integer.unsignedp = 0; ; break;} case 11: -#line 197 "cexp.y" +#line 211 "cexp.y" { yyval.integer = yyvsp[-1].integer; ; break;} case 12: -#line 202 "cexp.y" +#line 216 "cexp.y" { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; if (yyval.integer.unsignedp) yyval.integer.value = (unsigned long) yyvsp[-2].integer.value * yyvsp[0].integer.value; @@ -871,7 +885,7 @@ case 12: } ; break;} case 13: -#line 214 "cexp.y" +#line 228 "cexp.y" { if (yyvsp[0].integer.value == 0) { error ("division by zero in #if"); @@ -888,7 +902,7 @@ case 13: } ; break;} case 14: -#line 229 "cexp.y" +#line 243 "cexp.y" { if (yyvsp[0].integer.value == 0) { error ("division by zero in #if"); @@ -901,7 +915,7 @@ case 14: yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; ; break;} case 15: -#line 240 "cexp.y" +#line 254 "cexp.y" { yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; if (! yyval.integer.unsignedp @@ -910,7 +924,7 @@ case 15: integer_overflow (); ; break;} case 16: -#line 247 "cexp.y" +#line 261 "cexp.y" { yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; if (! yyval.integer.unsignedp @@ -919,7 +933,7 @@ case 16: integer_overflow (); ; break;} case 17: -#line 254 "cexp.y" +#line 268 "cexp.y" { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp; if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp) yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); @@ -927,7 +941,7 @@ case 17: yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; break;} case 18: -#line 260 "cexp.y" +#line 274 "cexp.y" { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp; if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp) yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); @@ -935,17 +949,17 @@ case 18: yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; break;} case 19: -#line 266 "cexp.y" +#line 280 "cexp.y" { yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value); yyval.integer.unsignedp = 0; ; break;} case 20: -#line 269 "cexp.y" +#line 283 "cexp.y" { yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value); yyval.integer.unsignedp = 0; ; break;} case 21: -#line 272 "cexp.y" +#line 286 "cexp.y" { yyval.integer.unsignedp = 0; if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) yyval.integer.value = (unsigned long) yyvsp[-2].integer.value <= yyvsp[0].integer.value; @@ -953,7 +967,7 @@ case 21: yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; ; break;} case 22: -#line 278 "cexp.y" +#line 292 "cexp.y" { yyval.integer.unsignedp = 0; if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) yyval.integer.value = (unsigned long) yyvsp[-2].integer.value >= yyvsp[0].integer.value; @@ -961,7 +975,7 @@ case 22: yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; ; break;} case 23: -#line 284 "cexp.y" +#line 298 "cexp.y" { yyval.integer.unsignedp = 0; if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) yyval.integer.value = (unsigned long) yyvsp[-2].integer.value < yyvsp[0].integer.value; @@ -969,7 +983,7 @@ case 23: yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; ; break;} case 24: -#line 290 "cexp.y" +#line 304 "cexp.y" { yyval.integer.unsignedp = 0; if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) yyval.integer.value = (unsigned long) yyvsp[-2].integer.value > yyvsp[0].integer.value; @@ -977,54 +991,54 @@ case 24: yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; ; break;} case 25: -#line 296 "cexp.y" +#line 310 "cexp.y" { yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; break;} case 26: -#line 299 "cexp.y" +#line 313 "cexp.y" { yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; break;} case 27: -#line 302 "cexp.y" +#line 316 "cexp.y" { yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; break;} case 28: -#line 305 "cexp.y" +#line 319 "cexp.y" { yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value); yyval.integer.unsignedp = 0; ; break;} case 29: -#line 308 "cexp.y" +#line 322 "cexp.y" { yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value); yyval.integer.unsignedp = 0; ; break;} case 30: -#line 311 "cexp.y" +#line 325 "cexp.y" { yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : yyvsp[0].integer.value; yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; break;} case 31: -#line 314 "cexp.y" +#line 328 "cexp.y" { yyval.integer = yylval.integer; ; break;} case 32: -#line 316 "cexp.y" +#line 330 "cexp.y" { yyval.integer = yylval.integer; ; break;} case 33: -#line 318 "cexp.y" +#line 332 "cexp.y" { yyval.integer.value = 0; yyval.integer.unsignedp = 0; ; break;} case 34: -#line 323 "cexp.y" +#line 337 "cexp.y" { yyval.keywords = 0; ; break;} case 35: -#line 325 "cexp.y" +#line 339 "cexp.y" { struct arglist *temp; yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); yyval.keywords->next = yyvsp[-2].keywords; @@ -1039,7 +1053,7 @@ case 35: temp->next->length = 1; ; break;} case 36: -#line 338 "cexp.y" +#line 352 "cexp.y" { yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); yyval.keywords->name = yyvsp[-1].name.address; yyval.keywords->length = yyvsp[-1].name.length; @@ -1243,7 +1257,7 @@ yyerrhandle: yystate = yyn; goto yynewstate; } -#line 343 "cexp.y" +#line 357 "cexp.y" /* During parsing of a C expression, the pointer to the next character @@ -1809,7 +1823,7 @@ right_shift (a, b) /* We do not support C comments. They should be removed before this function is called. */ -int +HOST_WIDE_INT parse_c_expression (string) char *string; { @@ -1858,7 +1872,7 @@ main () if (buf[n] == EOF) break; buf[n] = '\0'; - printf ("parser returned %d\n", parse_c_expression (buf)); + printf ("parser returned %ld\n", parse_c_expression (buf)); } return 0; diff --git a/gnu/usr.bin/cc/include/expr.h b/gnu/usr.bin/cc/include/expr.h index 3bb9490..3a4a0af 100644 --- a/gnu/usr.bin/cc/include/expr.h +++ b/gnu/usr.bin/cc/include/expr.h @@ -372,6 +372,13 @@ extern rtx bcmp_libfunc; extern rtx memset_libfunc; extern rtx bzero_libfunc; +extern rtx eqhf2_libfunc; +extern rtx nehf2_libfunc; +extern rtx gthf2_libfunc; +extern rtx gehf2_libfunc; +extern rtx lthf2_libfunc; +extern rtx lehf2_libfunc; + extern rtx eqsf2_libfunc; extern rtx nesf2_libfunc; extern rtx gtsf2_libfunc; diff --git a/gnu/usr.bin/cc/include/gbl-ctors.h b/gnu/usr.bin/cc/include/gbl-ctors.h index 2e7f520..3e2ab83 100644 --- a/gnu/usr.bin/cc/include/gbl-ctors.h +++ b/gnu/usr.bin/cc/include/gbl-ctors.h @@ -63,18 +63,23 @@ extern void __do_global_dtors (); we define it once here as a macro to avoid various instances getting out-of-sync with one another. */ -/* The first word may or may not contain the number of pointers in the table. +/* Some systems place the number of pointers + in the first word of the table. + On other systems, that word is -1. In all cases, the table is null-terminated. - We ignore the first word and scan up to the null. */ + If the length is not recorded, count up to the null. */ /* Some systems use a different strategy for finding the ctors. For example, svr3. */ #ifndef DO_GLOBAL_CTORS_BODY #define DO_GLOBAL_CTORS_BODY \ do { \ - func_ptr *p; \ - for (p = __CTOR_LIST__ + 1; *p; ) \ - (*p++) (); \ -} while (0) + unsigned long nptrs = (unsigned long) __CTOR_LIST__[0]; \ + unsigned i; \ + if (nptrs == -1) \ + for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++); \ + for (i = nptrs; i >= 1; i--) \ + __CTOR_LIST__[i] (); \ +} while (0) #endif diff --git a/gnu/usr.bin/cc/include/i386/i386.h b/gnu/usr.bin/cc/include/i386/i386.h index 983bfc5..a5623a7 100644 --- a/gnu/usr.bin/cc/include/i386/i386.h +++ b/gnu/usr.bin/cc/include/i386/i386.h @@ -1,4 +1,4 @@ -/* Definitions of target machine for GNU compiler for Intel 80386. +/* Definitions of target machine for GNU compiler for Intel X86 (386, 486, pentium) Copyright (C) 1988, 1992, 1994 Free Software Foundation, Inc. This file is part of GNU CC. @@ -62,77 +62,130 @@ extern int target_flags; #define TARGET_CPU_DEFAULT 0 #endif -/* Compile 80387 insns for floating point (not library calls). */ -#define TARGET_80387 (target_flags & 1) -/* Compile code for an i486. */ -#define TARGET_486 (target_flags & 2) +/* Masks for the -m switches */ +#define MASK_80387 000000000001 /* Hardware floating point */ +#define MASK_486 000000000002 /* 80486 specific */ +#define MASK_NOTUSED 000000000004 /* bit not currently used */ +#define MASK_RTD 000000000010 /* Use ret that pops args */ +#define MASK_REGPARM 000000000020 /* Pass args in eax, edx */ +#define MASK_SVR3_SHLIB 000000000040 /* Uninit locals into bss */ +#define MASK_IEEE_FP 000000000100 /* IEEE fp comparisons */ +#define MASK_FLOAT_RETURNS 000000000200 /* Return float in st(0) */ +#define MASK_NO_FANCY_MATH_387 000000000400 /* Disable sin, cos, sqrt */ + + /* Temporary codegen switches */ +#define MASK_DEBUG_ADDR 000001000000 /* Debug GO_IF_LEGITIMATE_ADDRESS */ +#define MASK_NO_WIDE_MULTIPLY 000002000000 /* Disable 32x32->64 multiplies */ +#define MASK_NO_MOVE 000004000000 /* Don't generate mem->mem */ + +/* Use the floating point instructions */ +#define TARGET_80387 (target_flags & MASK_80387) + /* Compile using ret insn that pops args. This will not work unless you use prototypes at least for all functions that can take varying numbers of args. */ -#define TARGET_RTD (target_flags & 8) +#define TARGET_RTD (target_flags & MASK_RTD) + /* Compile passing first two args in regs 0 and 1. This exists only to test compiler features that will be needed for RISC chips. It is not usable and is not intended to be usable on this cpu. */ -#define TARGET_REGPARM (target_flags & 020) +#define TARGET_REGPARM (target_flags & MASK_RTD) /* Put uninitialized locals into bss, not data. Meaningful only on svr3. */ -#define TARGET_SVR3_SHLIB (target_flags & 040) +#define TARGET_SVR3_SHLIB (target_flags & MASK_SVR3_SHLIB) /* Use IEEE floating point comparisons. These handle correctly the cases where the result of a comparison is unordered. Normally SIGFPE is generated in such cases, in which case this isn't needed. */ -#define TARGET_IEEE_FP (target_flags & 0100) +#define TARGET_IEEE_FP (target_flags & MASK_IEEE_FP) /* Functions that return a floating point value may return that value in the 387 FPU or in 386 integer registers. If set, this flag causes the 387 to be used, which is compatible with most calling conventions. */ -#define TARGET_FLOAT_RETURNS_IN_80387 (target_flags & 0200) +#define TARGET_FLOAT_RETURNS_IN_80387 (target_flags & MASK_FLOAT_RETURNS) /* Disable generation of FP sin, cos and sqrt operations for 387. This is because FreeBSD lacks these in the math-emulator-code */ -#define TARGET_NO_FANCY_MATH_387 (target_flags & 0400) - -/* Macro to define tables used to set the flags. - This is a list in braces of pairs in braces, - each pair being { "NAME", VALUE } - where VALUE is the bits to set or minus the bits to clear. - An empty string NAME is used to identify the default VALUE. */ - -#define TARGET_SWITCHES \ - { { "80387", 1}, \ - { "no-80387", -1}, \ - { "soft-float", -1}, \ - { "no-soft-float", 1}, \ - { "486", 2}, \ - { "no-486", -2}, \ - { "386", -2}, \ - { "rtd", 8}, \ - { "no-rtd", -8}, \ - { "regparm", 020}, \ - { "no-regparm", -020}, \ - { "svr3-shlib", 040}, \ - { "no-svr3-shlib", -040}, \ - { "ieee-fp", 0100}, \ - { "no-ieee-fp", -0100}, \ - { "fp-ret-in-387", 0200}, \ - { "no-fp-ret-in-387", -0200}, \ - { "no-fancy-math-387", 0400}, \ - { "fancy-math-387", -0400}, \ - SUBTARGET_SWITCHES \ - { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT}} - -/* This is meant to be redefined in the host dependent files */ +#define TARGET_NO_FANCY_MATH_387 (target_flags & MASK_NO_FANCY_MATH_387) + +/* Temporary switches for tuning code generation */ + +/* Disable 32x32->64 bit multiplies that are used for long long multiplies + and division by constants, but sometimes cause reload problems. */ +#define TARGET_NO_WIDE_MULTIPLY (target_flags & MASK_NO_WIDE_MULTIPLY) +#define TARGET_WIDE_MULTIPLY (!TARGET_NO_WIDE_MULTIPLY) + +/* Debug GO_IF_LEGITIMATE_ADDRESS */ +#define TARGET_DEBUG_ADDR (target_flags & MASK_DEBUG_ADDR) + +/* Hack macros for tuning code generation */ +#define TARGET_MOVE ((target_flags & MASK_NO_MOVE) == 0) /* Don't generate memory->memory */ + +/* Specific hardware switches */ +#define TARGET_486 (target_flags & MASK_486) /* 80486DX, 80486SX, 80486DX[24] */ +#define TARGET_386 (!TARGET_486) /* 80386 */ + +#define TARGET_SWITCHES \ +{ { "80387", MASK_80387 }, \ + { "no-80387", -MASK_80387 }, \ + { "hard-float", MASK_80387 }, \ + { "soft-float", -MASK_80387 }, \ + { "no-soft-float", MASK_80387 }, \ + { "386", -MASK_486 }, \ + { "no-386", MASK_486 }, \ + { "486", MASK_486 }, \ + { "no-486", -MASK_486 }, \ + { "rtd", MASK_RTD }, \ + { "no-rtd", -MASK_RTD }, \ + { "regparm", MASK_REGPARM }, \ + { "no-regparm", -MASK_REGPARM }, \ + { "svr3-shlib", MASK_SVR3_SHLIB }, \ + { "no-svr3-shlib", -MASK_SVR3_SHLIB }, \ + { "ieee-fp", MASK_IEEE_FP }, \ + { "no-ieee-fp", -MASK_IEEE_FP }, \ + { "fp-ret-in-387", MASK_FLOAT_RETURNS }, \ + { "no-fp-ret-in-387", -MASK_FLOAT_RETURNS }, \ + { "no-fancy-math-387", MASK_NO_FANCY_MATH_387 }, \ + { "fancy-math-387", -MASK_NO_FANCY_MATH_387 }, \ + { "no-wide-multiply", MASK_NO_WIDE_MULTIPLY }, \ + { "wide-multiply", -MASK_NO_WIDE_MULTIPLY }, \ + { "debug-addr", MASK_DEBUG_ADDR }, \ + { "no-debug-addr", -MASK_DEBUG_ADDR }, \ + { "move", -MASK_NO_MOVE }, \ + { "no-move", MASK_NO_MOVE }, \ + SUBTARGET_SWITCHES \ + { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT}} + +/* This macro is similar to `TARGET_SWITCHES' but defines names of + command options that have values. Its definition is an + initializer with a subgrouping for each command option. + + Each subgrouping contains a string constant, that defines the + fixed part of the option name, and the address of a variable. The + variable, type `char *', is set to the variable part of the given + option if the fixed part matches. The actual option name is made + by appending `-m' to the specified name. */ +#define TARGET_OPTIONS \ +{ { "reg-alloc=", &i386_reg_alloc_order }, \ + SUBTARGET_OPTIONS } + +/* Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ + +#define OVERRIDE_OPTIONS override_options () + +/* These are meant to be redefined in the host dependent files */ #define SUBTARGET_SWITCHES +#define SUBTARGET_OPTIONS -#define OVERRIDE_OPTIONS \ -{ \ - SUBTARGET_OVERRIDE_OPTIONS \ -} - -/* This is meant to be redefined in the host dependent files */ -#define SUBTARGET_OVERRIDE_OPTIONS /* target machine storage layout */ @@ -263,11 +316,39 @@ extern int target_flags; listed once, even those in FIXED_REGISTERS. List frame pointer late and fixed registers last. Note that, in general, we prefer registers listed in CALL_USED_REGISTERS, keeping the others - available for storage of persistent values. */ + available for storage of persistent values. + + Three different versions of REG_ALLOC_ORDER have been tried: + + If the order is edx, ecx, eax, ... it produces a slightly faster compiler, + but slower code on simple functions returning values in eax. + + If the order is eax, ecx, edx, ... it causes reload to abort when compiling + perl 4.036 due to not being able to create a DImode register (to hold a 2 + word union). + + If the order is eax, edx, ecx, ... it produces better code for simple + functions, and a slightly slower compiler. Users complained about the code + generated by allocating edx first, so restore the 'natural' order of things. */ #define REG_ALLOC_ORDER \ -/*ax,cx,dx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7,arg*/ \ -{ 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } +/*ax,dx,cx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7,arg*/ \ +{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } + +/* A C statement (sans semicolon) to choose the order in which to + allocate hard registers for pseudo-registers local to a basic + block. + + Store the desired register order in the array `reg_alloc_order'. + Element 0 should be the register to allocate first; element 1, the + next register; and so on. + + The macro body should not assume anything about the contents of + `reg_alloc_order' before execution of the macro. + + On most machines, it is not necessary to define this macro. */ + +#define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc () /* Macro to conditionally modify fixed_regs/call_used_regs. */ #define CONDITIONAL_REGISTER_USAGE \ @@ -381,6 +462,27 @@ extern int target_flags; /* Place in which caller passes the structure value address. 0 means push the value on the stack like an argument. */ #define STRUCT_VALUE 0 + +/* A C expression which can inhibit the returning of certain function + values in registers, based on the type of value. A nonzero value + says to return the function value in memory, just as large + structures are always returned. Here TYPE will be a C expression + of type `tree', representing the data type of the value. + + Note that values of mode `BLKmode' must be explicitly handled by + this macro. Also, the option `-fpcc-struct-return' takes effect + regardless of this macro. On most systems, it is possible to + leave the macro undefined; this causes a default definition to be + used, whose value is the constant 1 for `BLKmode' values, and 0 + otherwise. + + Do not use this macro to indicate that structures and unions + should always be returned in memory. You should instead use + `DEFAULT_PCC_STRUCT_RETURN' to indicate this. */ + +#define RETURN_IN_MEMORY(TYPE) \ + ((TYPE_MODE (TYPE) == BLKmode) || int_size_in_bytes (TYPE) > 12) + /* Define the classes of registers for register constraints in the machine description. Also define ranges of constants. @@ -448,7 +550,7 @@ enum reg_class 0x3, /* AD_REGS */ \ 0xf, /* Q_REGS */ \ 0x10, 0x20, /* SIREG, DIREG */ \ - 0x1007f, /* INDEX_REGS */ \ + 0x07f, /* INDEX_REGS */ \ 0x100ff, /* GENERAL_REGS */ \ 0x0100, 0x0200, /* FP_TOP_REG, FP_SECOND_REG */ \ 0xff00, /* FLOAT_REGS */ \ @@ -459,7 +561,6 @@ enum reg_class reg number REGNO. This could be a conditional expression or could index an array. */ -extern enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; #define REGNO_REG_CLASS(REGNO) (regclass_map[REGNO]) /* When defined, the compiler allows registers explicitly used in the @@ -591,6 +692,32 @@ extern enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; #define CLASS_MAX_NREGS(CLASS, MODE) \ (FLOAT_CLASS_P (CLASS) ? 1 : \ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)) + +/* A C expression whose value is nonzero if pseudos that have been + assigned to registers of class CLASS would likely be spilled + because registers of CLASS are needed for spill registers. + + The default value of this macro returns 1 if CLASS has exactly one + register and zero otherwise. On most machines, this default + should be used. Only define this macro to some other expression + if pseudo allocated by `local-alloc.c' end up in memory because + their hard registers were needed for spill regisers. If this + macro returns nonzero for those classes, those pseudos will only + be allocated by `global.c', which knows how to reallocate the + pseudo to another register. If there would not be another + register available for reallocation, you should not change the + definition of this macro since the only effect of such a + definition would be to slow down register allocation. */ + +#define CLASS_LIKELY_SPILLED_P(CLASS) \ + (((CLASS) == AREG) \ + || ((CLASS) == DREG) \ + || ((CLASS) == CREG) \ + || ((CLASS) == BREG) \ + || ((CLASS) == AD_REGS) \ + || ((CLASS) == SIREG) \ + || ((CLASS) == DIREG)) + /* Stack layout; function entry, exit and calling. */ @@ -762,6 +889,102 @@ extern enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; } \ } +/* A C statement or compound statement to output to FILE some + assembler code to initialize basic-block profiling for the current + object module. This code should call the subroutine + `__bb_init_func' once per object module, passing it as its sole + argument the address of a block allocated in the object module. + + The name of the block is a local symbol made with this statement: + + ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0); + + Of course, since you are writing the definition of + `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you + can take a short cut in the definition of this macro and use the + name that you know will result. + + The first word of this block is a flag which will be nonzero if the + object module has already been initialized. So test this word + first, and do not call `__bb_init_func' if the flag is nonzero. */ + +#undef FUNCTION_BLOCK_PROFILER +#define FUNCTION_BLOCK_PROFILER(STREAM, LABELNO) \ +do \ + { \ + static int num_func = 0; \ + rtx xops[8]; \ + char block_table[80], false_label[80]; \ + \ + ASM_GENERATE_INTERNAL_LABEL (block_table, "LPBX", 0); \ + ASM_GENERATE_INTERNAL_LABEL (false_label, "LPBZ", num_func); \ + \ + xops[0] = const0_rtx; \ + xops[1] = gen_rtx (SYMBOL_REF, VOIDmode, block_table); \ + xops[2] = gen_rtx (MEM, Pmode, gen_rtx (SYMBOL_REF, VOIDmode, false_label)); \ + xops[3] = gen_rtx (MEM, Pmode, gen_rtx (SYMBOL_REF, VOIDmode, "__bb_init_func")); \ + xops[4] = gen_rtx (MEM, Pmode, xops[1]); \ + xops[5] = stack_pointer_rtx; \ + xops[6] = GEN_INT (4); \ + xops[7] = gen_rtx (REG, Pmode, 0); /* eax */ \ + \ + CONSTANT_POOL_ADDRESS_P (xops[1]) = TRUE; \ + CONSTANT_POOL_ADDRESS_P (xops[2]) = TRUE; \ + \ + output_asm_insn (AS2(cmp%L4,%0,%4), xops); \ + output_asm_insn (AS1(jne,%2), xops); \ + \ + if (!flag_pic) \ + output_asm_insn (AS1(push%L1,%1), xops); \ + else \ + { \ + output_asm_insn (AS2 (lea%L7,%a1,%7), xops); \ + output_asm_insn (AS1 (push%L7,%7), xops); \ + } \ + \ + output_asm_insn (AS1(call,%P3), xops); \ + output_asm_insn (AS2(add%L0,%6,%5), xops); \ + ASM_OUTPUT_INTERNAL_LABEL (STREAM, "LPBZ", num_func); \ + num_func++; \ + } \ +while (0) + + +/* A C statement or compound statement to increment the count + associated with the basic block number BLOCKNO. Basic blocks are + numbered separately from zero within each compilation. The count + associated with block number BLOCKNO is at index BLOCKNO in a + vector of words; the name of this array is a local symbol made + with this statement: + + ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2); + + Of course, since you are writing the definition of + `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you + can take a short cut in the definition of this macro and use the + name that you know will result. */ + +#define BLOCK_PROFILER(STREAM, BLOCKNO) \ +do \ + { \ + rtx xops[1], cnt_rtx; \ + char counts[80]; \ + \ + ASM_GENERATE_INTERNAL_LABEL (counts, "LPBX", 2); \ + cnt_rtx = gen_rtx (SYMBOL_REF, VOIDmode, counts); \ + SYMBOL_REF_FLAG (cnt_rtx) = TRUE; \ + \ + if (BLOCKNO) \ + cnt_rtx = plus_constant (cnt_rtx, (BLOCKNO)*4); \ + \ + if (flag_pic) \ + cnt_rtx = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, cnt_rtx); \ + \ + xops[0] = gen_rtx (MEM, SImode, cnt_rtx); \ + output_asm_insn (AS1(inc%L0,%0), xops); \ + } \ +while (0) + /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, the stack pointer does not matter. The value is tested only in functions that have frame pointers. @@ -925,36 +1148,35 @@ do { \ After reload, it makes no difference, since pseudo regs have been eliminated by then. */ -#ifndef REG_OK_STRICT - -/* Nonzero if X is a hard reg that can be used as an index or if - it is a pseudo reg. */ -#define REG_OK_FOR_INDEX_P(X) \ - (REGNO (X) < STACK_POINTER_REGNUM \ +/* Non strict versions, pseudos are ok */ +#define REG_OK_FOR_INDEX_NONSTRICT_P(X) \ + (REGNO (X) < STACK_POINTER_REGNUM \ || REGNO (X) >= FIRST_PSEUDO_REGISTER) -/* Nonzero if X is a hard reg that can be used as a base reg - of if it is a pseudo reg. */ - /* ?wfs */ - -#define REG_OK_FOR_BASE_P(X) \ - (REGNO (X) <= STACK_POINTER_REGNUM \ - || REGNO (X) == ARG_POINTER_REGNUM \ - || REGNO(X) >= FIRST_PSEUDO_REGISTER) +#define REG_OK_FOR_BASE_NONSTRICT_P(X) \ + (REGNO (X) <= STACK_POINTER_REGNUM \ + || REGNO (X) == ARG_POINTER_REGNUM \ + || REGNO (X) >= FIRST_PSEUDO_REGISTER) -#define REG_OK_FOR_STRREG_P(X) \ +#define REG_OK_FOR_STRREG_NONSTRICT_P(X) \ (REGNO (X) == 4 || REGNO (X) == 5 || REGNO (X) >= FIRST_PSEUDO_REGISTER) -#else - -/* Nonzero if X is a hard reg that can be used as an index. */ -#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) -/* Nonzero if X is a hard reg that can be used as a base reg. */ -#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) -#define REG_OK_FOR_STRREG_P(X) \ +/* Strict versions, hard registers only */ +#define REG_OK_FOR_INDEX_STRICT_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) +#define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) +#define REG_OK_FOR_STRREG_STRICT_P(X) \ (REGNO_OK_FOR_DIREG_P (REGNO (X)) || REGNO_OK_FOR_SIREG_P (REGNO (X))) +#ifndef REG_OK_STRICT +#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_NONSTRICT_P(X) +#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NONSTRICT_P(X) +#define REG_OK_FOR_STRREG_P(X) REG_OK_FOR_STRREG_NONSTRICT_P(X) + +#else +#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_STRICT_P(X) +#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P(X) +#define REG_OK_FOR_STRREG_P(X) REG_OK_FOR_STRREG_STRICT_P(X) #endif /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression @@ -980,62 +1202,22 @@ do { \ #define LEGITIMATE_CONSTANT_P(X) 1 -#define GO_IF_INDEXABLE_BASE(X, ADDR) \ - if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) goto ADDR - -#define LEGITIMATE_INDEX_REG_P(X) \ - (GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X)) - -/* Return 1 if X is an index or an index times a scale. */ - -#define LEGITIMATE_INDEX_P(X) \ - (LEGITIMATE_INDEX_REG_P (X) \ - || (GET_CODE (X) == MULT \ - && LEGITIMATE_INDEX_REG_P (XEXP (X, 0)) \ - && GET_CODE (XEXP (X, 1)) == CONST_INT \ - && (INTVAL (XEXP (X, 1)) == 2 \ - || INTVAL (XEXP (X, 1)) == 4 \ - || INTVAL (XEXP (X, 1)) == 8))) - -/* Go to ADDR if X is an index term, a base reg, or a sum of those. */ - -#define GO_IF_INDEXING(X, ADDR) \ -{ if (LEGITIMATE_INDEX_P (X)) goto ADDR; \ - GO_IF_INDEXABLE_BASE (X, ADDR); \ - if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 0))) \ - { GO_IF_INDEXABLE_BASE (XEXP (X, 1), ADDR); } \ - if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 1))) \ - { GO_IF_INDEXABLE_BASE (XEXP (X, 0), ADDR); } } - -/* We used to allow this, but it isn't ever used. - || ((GET_CODE (X) == POST_DEC || GET_CODE (X) == POST_INC) \ - && REG_P (XEXP (X, 0)) \ - && REG_OK_FOR_STRREG_P (XEXP (X, 0))) \ -*/ +#ifdef REG_OK_STRICT +#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ +{ \ + if (legitimate_address_p (MODE, X, 1)) \ + goto ADDR; \ +} -#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ +#else +#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ { \ - if (CONSTANT_ADDRESS_P (X) \ - && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (X))) \ + if (legitimate_address_p (MODE, X, 0)) \ goto ADDR; \ - GO_IF_INDEXING (X, ADDR); \ - if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1))) \ - { \ - rtx x0 = XEXP (X, 0); \ - if (! flag_pic || ! SYMBOLIC_CONST (XEXP (X, 1))) \ - { GO_IF_INDEXING (x0, ADDR); } \ - else if (x0 == pic_offset_table_rtx) \ - goto ADDR; \ - else if (GET_CODE (x0) == PLUS) \ - { \ - if (XEXP (x0, 0) == pic_offset_table_rtx) \ - { GO_IF_INDEXABLE_BASE (XEXP (x0, 1), ADDR); } \ - if (XEXP (x0, 1) == pic_offset_table_rtx) \ - { GO_IF_INDEXABLE_BASE (XEXP (x0, 0), ADDR); } \ - } \ - } \ } +#endif + /* Try machine-dependent ways of modifying an illegitimate address to be legitimate. If we find one, return the new, valid address. This macro is used in only one place: `memory_address' in explow.c. @@ -1057,38 +1239,13 @@ do { \ When -fpic is used, special handling is needed for symbolic references. See comments by legitimize_pic_address in i386.c for details. */ -#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \ -{ extern rtx legitimize_pic_address (); \ - int ch = (X) != (OLDX); \ - if (flag_pic && SYMBOLIC_CONST (X)) \ - { \ - (X) = legitimize_pic_address (X, 0); \ - if (memory_address_p (MODE, X)) \ - goto WIN; \ - } \ - if (GET_CODE (X) == PLUS) \ - { if (GET_CODE (XEXP (X, 0)) == MULT) \ - ch = 1, XEXP (X, 0) = force_operand (XEXP (X, 0), 0); \ - if (GET_CODE (XEXP (X, 1)) == MULT) \ - ch = 1, XEXP (X, 1) = force_operand (XEXP (X, 1), 0); \ - if (ch && GET_CODE (XEXP (X, 1)) == REG \ - && GET_CODE (XEXP (X, 0)) == REG) \ - goto WIN; \ - if (flag_pic && SYMBOLIC_CONST (XEXP (X, 1))) \ - ch = 1, (X) = legitimize_pic_address (X, 0); \ - if (ch) { GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); } \ - if (GET_CODE (XEXP (X, 0)) == REG) \ - { register rtx temp = gen_reg_rtx (Pmode); \ - register rtx val = force_operand (XEXP (X, 1), temp); \ - if (val != temp) emit_move_insn (temp, val); \ - XEXP (X, 1) = temp; \ - goto WIN; } \ - else if (GET_CODE (XEXP (X, 1)) == REG) \ - { register rtx temp = gen_reg_rtx (Pmode); \ - register rtx val = force_operand (XEXP (X, 0), temp); \ - if (val != temp) emit_move_insn (temp, val); \ - XEXP (X, 0) = temp; \ - goto WIN; }}} +#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \ +{ \ + rtx orig_x = (X); \ + (X) = legitimize_address (X, OLDX, MODE); \ + if (memory_address_p (MODE, X)) \ + goto WIN; \ +} /* Nonzero if the constant value X is a legitimate general operand when generating PIC code. It is given that flag_pic is on and @@ -1312,7 +1469,6 @@ while (0) stored from the compare operation. Note that we can't use "rtx" here since it hasn't been defined! */ -extern struct rtx_def *i386_compare_op0, *i386_compare_op1; extern struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)(); /* Tell final.c how to eliminate redundant test instructions. */ @@ -1658,6 +1814,60 @@ extern char *qi_high_reg_name[]; #define RET return "" #define AT_SP(mode) (gen_rtx (MEM, (mode), stack_pointer_rtx)) +/* Functions in i386.c */ +extern void override_options (); +extern void order_regs_for_local_alloc (); +extern void output_op_from_reg (); +extern void output_to_reg (); +extern char *singlemove_string (); +extern char *output_move_double (); +extern char *output_move_memory (); +extern char *output_move_pushmem (); +extern int standard_80387_constant_p (); +extern char *output_move_const_single (); +extern int symbolic_operand (); +extern int call_insn_operand (); +extern int expander_call_insn_operand (); +extern int symbolic_reference_mentioned_p (); +extern void emit_pic_move (); +extern void function_prologue (); +extern int simple_386_epilogue (); +extern void function_epilogue (); +extern int legitimate_address_p (); +extern struct rtx_def *legitimize_pic_address (); +extern struct rtx_def *legitimize_address (); +extern void print_operand (); +extern void print_operand_address (); +extern void notice_update_cc (); +extern void split_di (); +extern int binary_387_op (); +extern int shift_op (); +extern int VOIDmode_compare_op (); +extern char *output_387_binary_op (); +extern char *output_fix_trunc (); +extern char *output_float_compare (); +extern char *output_fp_cc0_set (); +extern void save_386_machine_status (); +extern void restore_386_machine_status (); +extern void clear_386_stack_locals (); +extern struct rtx_def *assign_386_stack_local (); + +/* Variables in i386.c */ +extern char *i386_reg_alloc_order; /* register allocation order */ +extern char *hi_reg_name[]; /* names for 16 bit regs */ +extern char *qi_reg_name[]; /* names for 8 bit regs (low) */ +extern char *qi_high_reg_name[]; /* names for 8 bit regs (high) */ +extern enum reg_class regclass_map[]; /* smalled class containing REGNO */ +extern struct rtx_def *i386_compare_op0; /* operand 0 for comparisons */ +extern struct rtx_def *i386_compare_op1; /* operand 1 for comparisons */ + +/* External variables used */ +extern int optimize; /* optimization level */ +extern int obey_regdecls; /* TRUE if stupid register allocation */ + +/* External functions used */ +extern struct rtx_def *force_operand (); + /* Local variables: version-control: t diff --git a/gnu/usr.bin/cc/include/i386/unix.h b/gnu/usr.bin/cc/include/i386/unix.h index 7209176..fb7320b 100644 --- a/gnu/usr.bin/cc/include/i386/unix.h +++ b/gnu/usr.bin/cc/include/i386/unix.h @@ -1,5 +1,5 @@ /* Definitions for Unix assembler syntax for the Intel 80386. - Copyright (C) 1988 Free Software Foundation, Inc. + Copyright (C) 1988, 1994 Free Software Foundation, Inc. This file is part of GNU CC. @@ -28,13 +28,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Note that the other files fail to use these in some of the places where they should. */ -#ifdef __STDC__ +#if defined(__STDC__) || defined(ALMOST_STDC) #define AS2(a,b,c) #a " " #b "," #c +#define AS2C(b,c) " " #b "," #c #define AS3(a,b,c,d) #a " " #b "," #c "," #d #define AS1(a,b) #a " " #b #else #define AS1(a,b) "a b" #define AS2(a,b,c) "a b,c" +#define AS2C(b,c) " b,c" #define AS3(a,b,c,d) "a b,c,d" #endif diff --git a/gnu/usr.bin/cc/include/insn-codes.h b/gnu/usr.bin/cc/include/insn-codes.h index 59e24c9..2c5c593 100644 --- a/gnu/usr.bin/cc/include/insn-codes.h +++ b/gnu/usr.bin/cc/include/insn-codes.h @@ -32,169 +32,184 @@ enum insn_code { CODE_FOR_cmpdf_ccfpeq = 40, CODE_FOR_cmpsf_cc = 41, CODE_FOR_cmpsf_ccfpeq = 42, - CODE_FOR_movsi = 48, - CODE_FOR_movhi = 51, - CODE_FOR_movstricthi = 52, - CODE_FOR_movqi = 54, - CODE_FOR_movstrictqi = 55, - CODE_FOR_movsf = 57, - CODE_FOR_swapdf = 59, - CODE_FOR_movdf = 60, - CODE_FOR_swapxf = 62, - CODE_FOR_movxf = 63, - CODE_FOR_movdi = 65, - CODE_FOR_zero_extendhisi2 = 66, - CODE_FOR_zero_extendqihi2 = 67, - CODE_FOR_zero_extendqisi2 = 68, - CODE_FOR_zero_extendsidi2 = 69, - CODE_FOR_extendsidi2 = 70, - CODE_FOR_extendhisi2 = 71, - CODE_FOR_extendqihi2 = 72, - CODE_FOR_extendqisi2 = 73, - CODE_FOR_extendsfdf2 = 74, - CODE_FOR_extenddfxf2 = 75, - CODE_FOR_extendsfxf2 = 76, - CODE_FOR_truncdfsf2 = 77, - CODE_FOR_truncxfsf2 = 79, - CODE_FOR_truncxfdf2 = 80, - CODE_FOR_fixuns_truncxfsi2 = 81, - CODE_FOR_fixuns_truncdfsi2 = 82, - CODE_FOR_fixuns_truncsfsi2 = 83, - CODE_FOR_fix_truncxfdi2 = 84, - CODE_FOR_fix_truncdfdi2 = 85, - CODE_FOR_fix_truncsfdi2 = 86, - CODE_FOR_fix_truncxfsi2 = 90, - CODE_FOR_fix_truncdfsi2 = 91, - CODE_FOR_fix_truncsfsi2 = 92, - CODE_FOR_floatsisf2 = 96, - CODE_FOR_floatdisf2 = 97, - CODE_FOR_floatsidf2 = 98, - CODE_FOR_floatdidf2 = 99, - CODE_FOR_floatsixf2 = 100, - CODE_FOR_floatdixf2 = 101, - CODE_FOR_adddi3 = 108, - CODE_FOR_addsi3 = 109, - CODE_FOR_addhi3 = 110, - CODE_FOR_addqi3 = 111, - CODE_FOR_addxf3 = 113, - CODE_FOR_adddf3 = 114, - CODE_FOR_addsf3 = 115, - CODE_FOR_subdi3 = 116, - CODE_FOR_subsi3 = 117, - CODE_FOR_subhi3 = 118, - CODE_FOR_subqi3 = 119, - CODE_FOR_subxf3 = 120, - CODE_FOR_subdf3 = 121, - CODE_FOR_subsf3 = 122, - CODE_FOR_mulhi3 = 124, - CODE_FOR_mulsi3 = 126, - CODE_FOR_umulqihi3 = 127, - CODE_FOR_mulqihi3 = 128, - CODE_FOR_umulsidi3 = 129, - CODE_FOR_mulsidi3 = 130, - CODE_FOR_mulxf3 = 131, - CODE_FOR_muldf3 = 132, - CODE_FOR_mulsf3 = 133, - CODE_FOR_divqi3 = 134, - CODE_FOR_udivqi3 = 135, - CODE_FOR_divxf3 = 136, - CODE_FOR_divdf3 = 137, - CODE_FOR_divsf3 = 138, - CODE_FOR_divmodsi4 = 139, - CODE_FOR_divmodhi4 = 140, - CODE_FOR_udivmodsi4 = 141, - CODE_FOR_udivmodhi4 = 142, - CODE_FOR_andsi3 = 143, - CODE_FOR_andhi3 = 144, - CODE_FOR_andqi3 = 145, - CODE_FOR_iorsi3 = 146, - CODE_FOR_iorhi3 = 147, - CODE_FOR_iorqi3 = 148, - CODE_FOR_xorsi3 = 149, - CODE_FOR_xorhi3 = 150, - CODE_FOR_xorqi3 = 151, - CODE_FOR_negdi2 = 152, - CODE_FOR_negsi2 = 153, - CODE_FOR_neghi2 = 154, - CODE_FOR_negqi2 = 155, - CODE_FOR_negsf2 = 156, - CODE_FOR_negdf2 = 157, - CODE_FOR_negxf2 = 159, - CODE_FOR_abssf2 = 161, - CODE_FOR_absdf2 = 162, - CODE_FOR_absxf2 = 164, - CODE_FOR_sqrtsf2 = 166, - CODE_FOR_sqrtdf2 = 167, - CODE_FOR_sqrtxf2 = 169, - CODE_FOR_sindf2 = 172, - CODE_FOR_sinsf2 = 173, - CODE_FOR_cosdf2 = 175, - CODE_FOR_cossf2 = 176, - CODE_FOR_one_cmplsi2 = 178, - CODE_FOR_one_cmplhi2 = 179, - CODE_FOR_one_cmplqi2 = 180, - CODE_FOR_ashldi3 = 181, - CODE_FOR_ashldi3_const_int = 182, - CODE_FOR_ashldi3_non_const_int = 183, - CODE_FOR_ashlsi3 = 184, - CODE_FOR_ashlhi3 = 185, - CODE_FOR_ashlqi3 = 186, - CODE_FOR_ashrdi3 = 187, - CODE_FOR_ashrdi3_const_int = 188, - CODE_FOR_ashrdi3_non_const_int = 189, - CODE_FOR_ashrsi3 = 190, - CODE_FOR_ashrhi3 = 191, - CODE_FOR_ashrqi3 = 192, - CODE_FOR_lshrdi3 = 193, - CODE_FOR_lshrdi3_const_int = 194, - CODE_FOR_lshrdi3_non_const_int = 195, - CODE_FOR_lshrsi3 = 196, - CODE_FOR_lshrhi3 = 197, - CODE_FOR_lshrqi3 = 198, - CODE_FOR_rotlsi3 = 199, - CODE_FOR_rotlhi3 = 200, - CODE_FOR_rotlqi3 = 201, - CODE_FOR_rotrsi3 = 202, - CODE_FOR_rotrhi3 = 203, - CODE_FOR_rotrqi3 = 204, - CODE_FOR_seq = 211, - CODE_FOR_sne = 213, - CODE_FOR_sgt = 215, - CODE_FOR_sgtu = 217, - CODE_FOR_slt = 219, - CODE_FOR_sltu = 221, - CODE_FOR_sge = 223, - CODE_FOR_sgeu = 225, - CODE_FOR_sle = 227, - CODE_FOR_sleu = 229, - CODE_FOR_beq = 231, - CODE_FOR_bne = 233, - CODE_FOR_bgt = 235, - CODE_FOR_bgtu = 237, - CODE_FOR_blt = 239, - CODE_FOR_bltu = 241, - CODE_FOR_bge = 243, - CODE_FOR_bgeu = 245, - CODE_FOR_ble = 247, - CODE_FOR_bleu = 249, - CODE_FOR_jump = 261, - CODE_FOR_indirect_jump = 262, - CODE_FOR_casesi = 263, - CODE_FOR_tablejump = 265, - CODE_FOR_call_pop = 266, - CODE_FOR_call = 269, - CODE_FOR_call_value_pop = 272, - CODE_FOR_call_value = 275, - CODE_FOR_untyped_call = 278, - CODE_FOR_untyped_return = 281, - CODE_FOR_update_return = 282, - CODE_FOR_return = 283, - CODE_FOR_nop = 284, - CODE_FOR_movstrsi = 285, - CODE_FOR_cmpstrsi = 287, - CODE_FOR_ffssi2 = 290, - CODE_FOR_ffshi2 = 292, - CODE_FOR_strlensi = 307, + CODE_FOR_movsi = 49, + CODE_FOR_movhi = 54, + CODE_FOR_movstricthi = 56, + CODE_FOR_movqi = 61, + CODE_FOR_movstrictqi = 63, + CODE_FOR_movsf = 65, + CODE_FOR_movsf_push_nomove = 66, + CODE_FOR_movsf_push = 67, + CODE_FOR_movsf_mem = 68, + CODE_FOR_movsf_normal = 69, + CODE_FOR_swapsf = 70, + CODE_FOR_movdf = 71, + CODE_FOR_movdf_push_nomove = 72, + CODE_FOR_movdf_push = 73, + CODE_FOR_movdf_mem = 74, + CODE_FOR_movdf_normal = 75, + CODE_FOR_swapdf = 76, + CODE_FOR_movxf = 77, + CODE_FOR_movxf_push_nomove = 78, + CODE_FOR_movxf_push = 79, + CODE_FOR_movxf_mem = 80, + CODE_FOR_movxf_normal = 81, + CODE_FOR_swapxf = 82, + CODE_FOR_movdi = 84, + CODE_FOR_zero_extendhisi2 = 85, + CODE_FOR_zero_extendqihi2 = 86, + CODE_FOR_zero_extendqisi2 = 87, + CODE_FOR_zero_extendsidi2 = 88, + CODE_FOR_extendsidi2 = 89, + CODE_FOR_extendhisi2 = 90, + CODE_FOR_extendqihi2 = 91, + CODE_FOR_extendqisi2 = 92, + CODE_FOR_extendsfdf2 = 93, + CODE_FOR_extenddfxf2 = 94, + CODE_FOR_extendsfxf2 = 95, + CODE_FOR_truncdfsf2 = 96, + CODE_FOR_truncxfsf2 = 98, + CODE_FOR_truncxfdf2 = 99, + CODE_FOR_fixuns_truncxfsi2 = 100, + CODE_FOR_fixuns_truncdfsi2 = 101, + CODE_FOR_fixuns_truncsfsi2 = 102, + CODE_FOR_fix_truncxfdi2 = 103, + CODE_FOR_fix_truncdfdi2 = 104, + CODE_FOR_fix_truncsfdi2 = 105, + CODE_FOR_fix_truncxfsi2 = 109, + CODE_FOR_fix_truncdfsi2 = 110, + CODE_FOR_fix_truncsfsi2 = 111, + CODE_FOR_floatsisf2 = 115, + CODE_FOR_floatdisf2 = 116, + CODE_FOR_floatsidf2 = 117, + CODE_FOR_floatdidf2 = 118, + CODE_FOR_floatsixf2 = 119, + CODE_FOR_floatdixf2 = 120, + CODE_FOR_adddi3 = 127, + CODE_FOR_addsi3 = 128, + CODE_FOR_addhi3 = 129, + CODE_FOR_addqi3 = 130, + CODE_FOR_movsi_lea = 131, + CODE_FOR_addxf3 = 132, + CODE_FOR_adddf3 = 133, + CODE_FOR_addsf3 = 134, + CODE_FOR_subdi3 = 135, + CODE_FOR_subsi3 = 136, + CODE_FOR_subhi3 = 137, + CODE_FOR_subqi3 = 138, + CODE_FOR_subxf3 = 139, + CODE_FOR_subdf3 = 140, + CODE_FOR_subsf3 = 141, + CODE_FOR_mulhi3 = 143, + CODE_FOR_mulsi3 = 145, + CODE_FOR_umulqihi3 = 146, + CODE_FOR_mulqihi3 = 147, + CODE_FOR_umulsidi3 = 148, + CODE_FOR_mulsidi3 = 149, + CODE_FOR_umulsi3_highpart = 150, + CODE_FOR_smulsi3_highpart = 151, + CODE_FOR_mulxf3 = 152, + CODE_FOR_muldf3 = 153, + CODE_FOR_mulsf3 = 154, + CODE_FOR_divqi3 = 155, + CODE_FOR_udivqi3 = 156, + CODE_FOR_divxf3 = 157, + CODE_FOR_divdf3 = 158, + CODE_FOR_divsf3 = 159, + CODE_FOR_divmodsi4 = 160, + CODE_FOR_divmodhi4 = 161, + CODE_FOR_udivmodsi4 = 162, + CODE_FOR_udivmodhi4 = 163, + CODE_FOR_andsi3 = 164, + CODE_FOR_andhi3 = 165, + CODE_FOR_andqi3 = 166, + CODE_FOR_iorsi3 = 167, + CODE_FOR_iorhi3 = 168, + CODE_FOR_iorqi3 = 169, + CODE_FOR_xorsi3 = 170, + CODE_FOR_xorhi3 = 171, + CODE_FOR_xorqi3 = 172, + CODE_FOR_negdi2 = 173, + CODE_FOR_negsi2 = 174, + CODE_FOR_neghi2 = 175, + CODE_FOR_negqi2 = 176, + CODE_FOR_negsf2 = 177, + CODE_FOR_negdf2 = 178, + CODE_FOR_negxf2 = 180, + CODE_FOR_abssf2 = 182, + CODE_FOR_absdf2 = 183, + CODE_FOR_absxf2 = 185, + CODE_FOR_sqrtsf2 = 187, + CODE_FOR_sqrtdf2 = 188, + CODE_FOR_sqrtxf2 = 190, + CODE_FOR_sindf2 = 193, + CODE_FOR_sinsf2 = 194, + CODE_FOR_cosdf2 = 196, + CODE_FOR_cossf2 = 197, + CODE_FOR_one_cmplsi2 = 199, + CODE_FOR_one_cmplhi2 = 200, + CODE_FOR_one_cmplqi2 = 201, + CODE_FOR_ashldi3 = 202, + CODE_FOR_ashldi3_const_int = 203, + CODE_FOR_ashldi3_non_const_int = 204, + CODE_FOR_ashlsi3 = 205, + CODE_FOR_ashlhi3 = 206, + CODE_FOR_ashlqi3 = 207, + CODE_FOR_ashrdi3 = 208, + CODE_FOR_ashrdi3_const_int = 209, + CODE_FOR_ashrdi3_non_const_int = 210, + CODE_FOR_ashrsi3 = 211, + CODE_FOR_ashrhi3 = 212, + CODE_FOR_ashrqi3 = 213, + CODE_FOR_lshrdi3 = 214, + CODE_FOR_lshrdi3_const_int = 215, + CODE_FOR_lshrdi3_non_const_int = 216, + CODE_FOR_lshrsi3 = 217, + CODE_FOR_lshrhi3 = 218, + CODE_FOR_lshrqi3 = 219, + CODE_FOR_rotlsi3 = 220, + CODE_FOR_rotlhi3 = 221, + CODE_FOR_rotlqi3 = 222, + CODE_FOR_rotrsi3 = 223, + CODE_FOR_rotrhi3 = 224, + CODE_FOR_rotrqi3 = 225, + CODE_FOR_seq = 232, + CODE_FOR_sne = 234, + CODE_FOR_sgt = 236, + CODE_FOR_sgtu = 238, + CODE_FOR_slt = 240, + CODE_FOR_sltu = 242, + CODE_FOR_sge = 244, + CODE_FOR_sgeu = 246, + CODE_FOR_sle = 248, + CODE_FOR_sleu = 250, + CODE_FOR_beq = 252, + CODE_FOR_bne = 254, + CODE_FOR_bgt = 256, + CODE_FOR_bgtu = 258, + CODE_FOR_blt = 260, + CODE_FOR_bltu = 262, + CODE_FOR_bge = 264, + CODE_FOR_bgeu = 266, + CODE_FOR_ble = 268, + CODE_FOR_bleu = 270, + CODE_FOR_jump = 282, + CODE_FOR_indirect_jump = 283, + CODE_FOR_casesi = 284, + CODE_FOR_tablejump = 286, + CODE_FOR_call_pop = 287, + CODE_FOR_call = 290, + CODE_FOR_call_value_pop = 293, + CODE_FOR_call_value = 296, + CODE_FOR_untyped_call = 299, + CODE_FOR_blockage = 300, + CODE_FOR_return = 301, + CODE_FOR_nop = 302, + CODE_FOR_movstrsi = 303, + CODE_FOR_cmpstrsi = 305, + CODE_FOR_ffssi2 = 308, + CODE_FOR_ffshi2 = 310, + CODE_FOR_strlensi = 325, CODE_FOR_nothing }; #define MAX_INSN_CODE ((int) CODE_FOR_nothing) diff --git a/gnu/usr.bin/cc/include/insn-flags.h b/gnu/usr.bin/cc/include/insn-flags.h index c9dd771..625671e 100644 --- a/gnu/usr.bin/cc/include/insn-flags.h +++ b/gnu/usr.bin/cc/include/insn-flags.h @@ -36,10 +36,23 @@ from the machine description file `md'. */ #define HAVE_movqi 1 #define HAVE_movstrictqi 1 #define HAVE_movsf 1 -#define HAVE_swapdf 1 +#define HAVE_movsf_push_nomove (!TARGET_MOVE) +#define HAVE_movsf_push 1 +#define HAVE_movsf_mem 1 +#define HAVE_movsf_normal ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) +#define HAVE_swapsf 1 #define HAVE_movdf 1 -#define HAVE_swapxf 1 +#define HAVE_movdf_push_nomove (!TARGET_MOVE) +#define HAVE_movdf_push 1 +#define HAVE_movdf_mem 1 +#define HAVE_movdf_normal ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) +#define HAVE_swapdf 1 #define HAVE_movxf 1 +#define HAVE_movxf_push_nomove (!TARGET_MOVE) +#define HAVE_movxf_push 1 +#define HAVE_movxf_mem 1 +#define HAVE_movxf_normal ((!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)) +#define HAVE_swapxf 1 #define HAVE_movdi 1 #define HAVE_zero_extendhisi2 1 #define HAVE_zero_extendqihi2 1 @@ -74,6 +87,7 @@ from the machine description file `md'. */ #define HAVE_addsi3 1 #define HAVE_addhi3 1 #define HAVE_addqi3 1 +#define HAVE_movsi_lea 1 #define HAVE_addxf3 (TARGET_80387) #define HAVE_adddf3 (TARGET_80387) #define HAVE_addsf3 (TARGET_80387) @@ -88,8 +102,10 @@ from the machine description file `md'. */ #define HAVE_mulsi3 1 #define HAVE_umulqihi3 1 #define HAVE_mulqihi3 1 -#define HAVE_umulsidi3 1 -#define HAVE_mulsidi3 1 +#define HAVE_umulsidi3 (TARGET_WIDE_MULTIPLY) +#define HAVE_mulsidi3 (TARGET_WIDE_MULTIPLY) +#define HAVE_umulsi3_highpart (TARGET_WIDE_MULTIPLY) +#define HAVE_smulsi3_highpart (TARGET_WIDE_MULTIPLY) #define HAVE_mulxf3 (TARGET_80387) #define HAVE_muldf3 (TARGET_80387) #define HAVE_mulsf3 (TARGET_80387) @@ -191,8 +207,7 @@ from the machine description file `md'. */ #define HAVE_call_value_pop 1 #define HAVE_call_value 1 #define HAVE_untyped_call 1 -#define HAVE_untyped_return 1 -#define HAVE_update_return 1 +#define HAVE_blockage 1 #define HAVE_return (simple_386_epilogue ()) #define HAVE_nop 1 #define HAVE_movstrsi 1 @@ -236,10 +251,23 @@ extern rtx gen_movstricthi PROTO((rtx, rtx)); extern rtx gen_movqi PROTO((rtx, rtx)); extern rtx gen_movstrictqi PROTO((rtx, rtx)); extern rtx gen_movsf PROTO((rtx, rtx)); -extern rtx gen_swapdf PROTO((rtx, rtx)); +extern rtx gen_movsf_push_nomove PROTO((rtx, rtx)); +extern rtx gen_movsf_push PROTO((rtx, rtx)); +extern rtx gen_movsf_mem PROTO((rtx, rtx)); +extern rtx gen_movsf_normal PROTO((rtx, rtx)); +extern rtx gen_swapsf PROTO((rtx, rtx)); extern rtx gen_movdf PROTO((rtx, rtx)); -extern rtx gen_swapxf PROTO((rtx, rtx)); +extern rtx gen_movdf_push_nomove PROTO((rtx, rtx)); +extern rtx gen_movdf_push PROTO((rtx, rtx)); +extern rtx gen_movdf_mem PROTO((rtx, rtx)); +extern rtx gen_movdf_normal PROTO((rtx, rtx)); +extern rtx gen_swapdf PROTO((rtx, rtx)); extern rtx gen_movxf PROTO((rtx, rtx)); +extern rtx gen_movxf_push_nomove PROTO((rtx, rtx)); +extern rtx gen_movxf_push PROTO((rtx, rtx)); +extern rtx gen_movxf_mem PROTO((rtx, rtx)); +extern rtx gen_movxf_normal PROTO((rtx, rtx)); +extern rtx gen_swapxf PROTO((rtx, rtx)); extern rtx gen_movdi PROTO((rtx, rtx)); extern rtx gen_zero_extendhisi2 PROTO((rtx, rtx)); extern rtx gen_zero_extendqihi2 PROTO((rtx, rtx)); @@ -274,6 +302,7 @@ extern rtx gen_adddi3 PROTO((rtx, rtx, rtx)); extern rtx gen_addsi3 PROTO((rtx, rtx, rtx)); extern rtx gen_addhi3 PROTO((rtx, rtx, rtx)); extern rtx gen_addqi3 PROTO((rtx, rtx, rtx)); +extern rtx gen_movsi_lea PROTO((rtx, rtx)); extern rtx gen_addxf3 PROTO((rtx, rtx, rtx)); extern rtx gen_adddf3 PROTO((rtx, rtx, rtx)); extern rtx gen_addsf3 PROTO((rtx, rtx, rtx)); @@ -290,6 +319,8 @@ extern rtx gen_umulqihi3 PROTO((rtx, rtx, rtx)); extern rtx gen_mulqihi3 PROTO((rtx, rtx, rtx)); extern rtx gen_umulsidi3 PROTO((rtx, rtx, rtx)); extern rtx gen_mulsidi3 PROTO((rtx, rtx, rtx)); +extern rtx gen_umulsi3_highpart PROTO((rtx, rtx, rtx)); +extern rtx gen_smulsi3_highpart PROTO((rtx, rtx, rtx)); extern rtx gen_mulxf3 PROTO((rtx, rtx, rtx)); extern rtx gen_muldf3 PROTO((rtx, rtx, rtx)); extern rtx gen_mulsf3 PROTO((rtx, rtx, rtx)); @@ -380,8 +411,7 @@ extern rtx gen_indirect_jump PROTO((rtx)); extern rtx gen_casesi PROTO((rtx, rtx, rtx, rtx, rtx)); extern rtx gen_tablejump PROTO((rtx, rtx)); extern rtx gen_untyped_call PROTO((rtx, rtx, rtx)); -extern rtx gen_untyped_return PROTO((rtx, rtx)); -extern rtx gen_update_return PROTO((rtx)); +extern rtx gen_blockage PROTO((void)); extern rtx gen_return PROTO((void)); extern rtx gen_nop PROTO((void)); extern rtx gen_movstrsi PROTO((rtx, rtx, rtx, rtx)); @@ -438,10 +468,23 @@ extern rtx gen_movstricthi (); extern rtx gen_movqi (); extern rtx gen_movstrictqi (); extern rtx gen_movsf (); -extern rtx gen_swapdf (); +extern rtx gen_movsf_push_nomove (); +extern rtx gen_movsf_push (); +extern rtx gen_movsf_mem (); +extern rtx gen_movsf_normal (); +extern rtx gen_swapsf (); extern rtx gen_movdf (); -extern rtx gen_swapxf (); +extern rtx gen_movdf_push_nomove (); +extern rtx gen_movdf_push (); +extern rtx gen_movdf_mem (); +extern rtx gen_movdf_normal (); +extern rtx gen_swapdf (); extern rtx gen_movxf (); +extern rtx gen_movxf_push_nomove (); +extern rtx gen_movxf_push (); +extern rtx gen_movxf_mem (); +extern rtx gen_movxf_normal (); +extern rtx gen_swapxf (); extern rtx gen_movdi (); extern rtx gen_zero_extendhisi2 (); extern rtx gen_zero_extendqihi2 (); @@ -476,6 +519,7 @@ extern rtx gen_adddi3 (); extern rtx gen_addsi3 (); extern rtx gen_addhi3 (); extern rtx gen_addqi3 (); +extern rtx gen_movsi_lea (); extern rtx gen_addxf3 (); extern rtx gen_adddf3 (); extern rtx gen_addsf3 (); @@ -492,6 +536,8 @@ extern rtx gen_umulqihi3 (); extern rtx gen_mulqihi3 (); extern rtx gen_umulsidi3 (); extern rtx gen_mulsidi3 (); +extern rtx gen_umulsi3_highpart (); +extern rtx gen_smulsi3_highpart (); extern rtx gen_mulxf3 (); extern rtx gen_muldf3 (); extern rtx gen_mulsf3 (); @@ -582,8 +628,7 @@ extern rtx gen_indirect_jump (); extern rtx gen_casesi (); extern rtx gen_tablejump (); extern rtx gen_untyped_call (); -extern rtx gen_untyped_return (); -extern rtx gen_update_return (); +extern rtx gen_blockage (); extern rtx gen_return (); extern rtx gen_nop (); extern rtx gen_movstrsi (); diff --git a/gnu/usr.bin/cc/include/machmode.def b/gnu/usr.bin/cc/include/machmode.def index 24d0ba5..3fa59aa 100644 --- a/gnu/usr.bin/cc/include/machmode.def +++ b/gnu/usr.bin/cc/include/machmode.def @@ -67,7 +67,7 @@ DEF_MACHMODE (HImode, "HI", MODE_INT, 2, 2, SImode) /* Pointers on some machines use this type to distinguish them from ints. Useful if a pointer is 4 bytes but has some bits that are not significant, so it is really not quite as wide as an integer. */ -DEF_MACHMODE (PSImode, "PSI", MODE_PARTIAL_INT, 4, 4, VOIDmode) +DEF_MACHMODE (PSImode, "PSI", MODE_PARTIAL_INT, 4, 4, PDImode) DEF_MACHMODE (SImode, "SI", MODE_INT, 4, 4, DImode) DEF_MACHMODE (PDImode, "PDI", MODE_PARTIAL_INT, 8, 8, VOIDmode) DEF_MACHMODE (DImode, "DI", MODE_INT, 8, 8, TImode) diff --git a/gnu/usr.bin/cc/include/obstack.h b/gnu/usr.bin/cc/include/obstack.h index 0176719..a5db1a0 100644 --- a/gnu/usr.bin/cc/include/obstack.h +++ b/gnu/usr.bin/cc/include/obstack.h @@ -119,7 +119,7 @@ Summary: but in traditional C it is usually long. If we are in ANSI C and don't already have ptrdiff_t get it. */ -#if defined (__STDC__) && ! defined (offsetof) +#if defined (__STDC__) && __STDC__ && ! defined (offsetof) #if defined (__GNUC__) && defined (IN_GCC) /* On Next machine, the system's stddef.h screws up if included after we have defined just ptrdiff_t, so include all of stddef.h. @@ -132,7 +132,7 @@ Summary: #include <stddef.h> #endif -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ #define PTR_INT_TYPE ptrdiff_t #else #define PTR_INT_TYPE long @@ -167,7 +167,7 @@ struct obstack /* control current object in current chunk */ /* Declare the external functions we use; they are in obstack.c. */ -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ extern void _obstack_newchunk (struct obstack *, int); extern void _obstack_free (struct obstack *, void *); extern int _obstack_begin (struct obstack *, int, int, @@ -181,7 +181,7 @@ extern int _obstack_begin (); extern int _obstack_begin_1 (); #endif -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ /* Do the function-declarations after the structs but before defining the macros. */ @@ -492,7 +492,7 @@ __extension__ \ (h)->object_base = (h)->next_free, \ __INT_TO_PTR ((h)->temp))) -#ifdef __STDC__ +#if defined (__STDC__) && __STDC__ #define obstack_free(h,obj) \ ( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ diff --git a/gnu/usr.bin/cc/include/regs.h b/gnu/usr.bin/cc/include/regs.h index 47463bf..1b394b2 100644 --- a/gnu/usr.bin/cc/include/regs.h +++ b/gnu/usr.bin/cc/include/regs.h @@ -1,5 +1,5 @@ /* Define per-register tables for data flow info and register allocation. - Copyright (C) 1987, 1993 Free Software Foundation, Inc. + Copyright (C) 1987, 1993, 1994 Free Software Foundation, Inc. This file is part of GNU CC. @@ -53,6 +53,12 @@ extern short *reg_n_sets; extern short *reg_n_deaths; +/* Indexed by N; says whether a psuedo register N was ever used + within a SUBREG that changes the size of the reg. Some machines prohibit + such objects to be in certain (usually floating-point) registers. */ + +extern char *reg_changes_size; + /* Get the number of consecutive words required to hold pseudo-reg N. */ #define PSEUDO_REGNO_SIZE(N) \ diff --git a/gnu/usr.bin/cc/include/reload.h b/gnu/usr.bin/cc/include/reload.h index 4478b6a..68c59bb 100644 --- a/gnu/usr.bin/cc/include/reload.h +++ b/gnu/usr.bin/cc/include/reload.h @@ -216,9 +216,10 @@ extern void mark_home_live PROTO((int)); replacement (such as sp), plus an offset. */ extern rtx eliminate_regs PROTO((rtx, enum machine_mode, rtx)); -/* Emit code to perform an input reload of IN to RELOADREG. IN is from - operand OPNUM with reload type TYPE. */ -extern rtx gen_input_reload PROTO((rtx, rtx, int, enum reload_type)); +/* Emit code to perform a reload from IN (which may be a reload register) to + OUT (which may also be a reload register). IN or OUT is from operand + OPNUM with reload type TYPE. */ +extern rtx gen_reload PROTO((rtx, rtx, int, enum reload_type)); /* Functions in caller-save.c: */ diff --git a/gnu/usr.bin/cc/include/rtl.h b/gnu/usr.bin/cc/include/rtl.h index b0eb1c52..8e8a026 100644 --- a/gnu/usr.bin/cc/include/rtl.h +++ b/gnu/usr.bin/cc/include/rtl.h @@ -922,6 +922,10 @@ extern rtx output_constant_def PROTO((union tree_node *)); extern rtx immed_real_const PROTO((union tree_node *)); extern union tree_node *make_tree PROTO((union tree_node *, rtx)); +/* Abort routines */ +extern void fatal_insn_not_found PROTO((rtx)); +extern void fatal_insn PROTO((char *, rtx)); + /* Define a default value for STORE_FLAG_VALUE. */ #ifndef STORE_FLAG_VALUE diff --git a/gnu/usr.bin/cc/include/tm.h b/gnu/usr.bin/cc/include/tm.h index 5efd2e0..e21ce6a 100644 --- a/gnu/usr.bin/cc/include/tm.h +++ b/gnu/usr.bin/cc/include/tm.h @@ -33,21 +33,17 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #undef CPP_PREDEFINES #define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=2 -D__386BSD__ -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)" +#if 0 #define INCLUDE_DEFAULTS { \ { "/usr/include", 0 }, \ { "/usr/include/g++", 1 }, \ { 0, 0} \ } - -#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}" +#endif /* Like the default, except no -lg. */ #define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}" -#define LINK_SPEC \ - "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} %{assert*} \ - %{p:-Bstatic} %{pg:-Bstatic} %{Z}" - #undef SIZE_TYPE #define SIZE_TYPE "unsigned int" @@ -55,12 +51,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define PTRDIFF_TYPE "int" #undef WCHAR_TYPE -#define WCHAR_TYPE "int" +#define WCHAR_TYPE "short unsigned int" -#define WCHAR_UNSIGNED 0 +#define WCHAR_UNSIGNED 1 #undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE BITS_PER_WORD +#define WCHAR_TYPE_SIZE 16 #define HAVE_ATEXIT @@ -74,9 +70,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define FUNCTION_PROFILER(FILE, LABELNO) \ { \ if (flag_pic) \ - fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ + { \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%eax\n", \ + LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ + } \ else \ - fprintf (FILE, "\tcall mcount\n"); \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%eax\n", LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall mcount\n"); \ + } \ } #if 0 /* not ready for this; it should be decided at compile time */ @@ -183,7 +186,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ size_directive_output = 0; \ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \ { \ - size_directive_output = 1; \ + size_directive_output = 1; \ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ assemble_name (FILE, NAME); \ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ @@ -197,20 +200,21 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ size_directive_output was set by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */ -#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ -do { \ - char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ - if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ - && ! AT_END && TOP_LEVEL \ - && DECL_INITIAL (DECL) == error_mark_node \ - && !size_directive_output) \ - { \ - fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ - assemble_name (FILE, name); \ - fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ - } \ +#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ +do { \ + char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ + if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ + && ! AT_END && TOP_LEVEL \ + && DECL_INITIAL (DECL) == error_mark_node \ + && !size_directive_output) \ + { \ + fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ + assemble_name (FILE, name); \ + fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL)));\ + } \ } while (0) + /* This is how to declare the size of a function. */ #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ @@ -232,82 +236,9 @@ do { \ } \ } while (0) -/* This section copied from i386/osfrose.h */ - -/* A C statement or compound statement to output to FILE some - assembler code to initialize basic-block profiling for the current - object module. This code should call the subroutine - `__bb_init_func' once per object module, passing it as its sole - argument the address of a block allocated in the object module. - - The name of the block is a local symbol made with this statement: - - ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0); - - Of course, since you are writing the definition of - `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you - can take a short cut in the definition of this macro and use the - name that you know will result. - - The first word of this block is a flag which will be nonzero if the - object module has already been initialized. So test this word - first, and do not call `__bb_init_func' if the flag is nonzero. */ - -#undef FUNCTION_BLOCK_PROFILER -#define FUNCTION_BLOCK_PROFILER(STREAM, LABELNO) \ -do \ - { \ - if (!flag_pic) \ - { \ - fprintf (STREAM, "\tcmpl $0,%sPBX0\n", LPREFIX); \ - fprintf (STREAM, "\tjne 0f\n"); \ - fprintf (STREAM, "\tpushl $%sPBX0\n", LPREFIX); \ - fprintf (STREAM, "\tcall ___bb_init_func\n"); \ - fprintf (STREAM, "0:\n"); \ - } \ - else \ - { \ - fprintf (STREAM, "\tpushl %eax\n"); \ - fprintf (STREAM, "\tmovl %sPBX0@GOT(%ebx),%eax\n"); \ - fprintf (STREAM, "\tcmpl $0,(%eax)\n"); \ - fprintf (STREAM, "\tjne 0f\n"); \ - fprintf (STREAM, "\tpushl %eax\n"); \ - fprintf (STREAM, "\tcall ___bb_init_func@PLT\n"); \ - fprintf (STREAM, "0:\n"); \ - fprintf (STREAM, "\tpopl %eax\n"); \ - } \ - } \ -while (0) - -/* A C statement or compound statement to increment the count - associated with the basic block number BLOCKNO. Basic blocks are - numbered separately from zero within each compilation. The count - associated with block number BLOCKNO is at index BLOCKNO in a - vector of words; the name of this array is a local symbol made - with this statement: - - ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2); - - Of course, since you are writing the definition of - `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you - can take a short cut in the definition of this macro and use the - name that you know will result. */ - -#undef BLOCK_PROFILER -#define BLOCK_PROFILER(STREAM, BLOCKNO) \ -do \ - { \ - if (!flag_pic) \ - fprintf (STREAM, "\tincl %sPBX2+%d\n", LPREFIX, (BLOCKNO)*4); \ - else \ - { \ - fprintf (STREAM, "\tpushl %eax\n"); \ - fprintf (STREAM, "\tmovl %sPBX2@GOT(%ebx),%eax\n", LPREFIX); \ - fprintf (STREAM, "\tincl %d(%eax)\n", (BLOCKNO)*4); \ - fprintf (STREAM, "\tpopl %eax\n"); \ - } \ - } \ -while (0) +#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}" +#define LINK_SPEC \ + "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} %{assert*}" /* This is defined when gcc is compiled in the BSD-directory-tree, and must * make up for the gap to all the stuff done in the GNU-makefiles. diff --git a/gnu/usr.bin/cc/include/tree.h b/gnu/usr.bin/cc/include/tree.h index dbe5ff9..5976437 100644 --- a/gnu/usr.bin/cc/include/tree.h +++ b/gnu/usr.bin/cc/include/tree.h @@ -619,6 +619,10 @@ struct tree_block function when they are created. */ #define TYPE_NEEDS_CONSTRUCTING(NODE) ((NODE)->type.needs_constructing_flag) +/* Indicates that objects of this type (a UNION_TYPE), should be passed + the same way that the first union alternative would be passed. */ +#define TYPE_TRANSPARENT_UNION(NODE) ((NODE)->type.transparent_union_flag) + struct tree_type { char common[sizeof (struct tree_common)]; @@ -637,6 +641,7 @@ struct tree_type unsigned string_flag : 1; unsigned no_force_blk_flag : 1; unsigned needs_constructing_flag : 1; + unsigned transparent_union_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; @@ -644,7 +649,7 @@ struct tree_type unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; - /* room for 6 more bits */ + /* room for 5 more bits */ unsigned int align; union tree_node *pointer_to; @@ -928,6 +933,11 @@ struct tree_type so it should not be output now. */ #define DECL_DEFER_OUTPUT(NODE) ((NODE)->decl.defer_output) +/* Used in PARM_DECLs whose type are unions to indicate that the + argument should be passed in the same way that the first union + alternative would be passed. */ +#define DECL_TRANSPARENT_UNION(NODE) ((NODE)->decl.transparent_union) + /* Additional flags for language-specific uses. */ #define DECL_LANG_FLAG_0(NODE) ((NODE)->decl.lang_flag_0) #define DECL_LANG_FLAG_1(NODE) ((NODE)->decl.lang_flag_1) @@ -963,7 +973,8 @@ struct tree_decl unsigned in_system_header_flag : 1; unsigned common_flag : 1; unsigned defer_output : 1; - /* room for five more */ + unsigned transparent_union : 1; + /* room for four more */ unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; @@ -1238,6 +1249,12 @@ extern tree get_pending_sizes PROTO((void)); extern tree sizetype; +/* If nonzero, an upper limit on alignment of structure fields, in bits. */ +extern int maximum_field_alignment; + +/* If non-zero, the alignment of a bitsting or (power-)set value, in bits. */ +extern int set_alignment; + /* Concatenate two lists (chains of TREE_LIST nodes) X and Y by making the last node in X point to Y. Returns X, except if X is 0 returns Y. */ @@ -1481,6 +1498,9 @@ extern void (*incomplete_decl_finalize_hook) (); /* In tree.c */ extern char *perm_calloc PROTO((int, long)); +extern tree get_set_constructor_bits PROTO((tree, char*, int)); +extern tree get_set_constructor_words PROTO((tree, + HOST_WIDE_INT*, int)); /* In stmt.c */ diff --git a/gnu/usr.bin/cc/legal/md b/gnu/usr.bin/cc/legal/md index 3e43fb0..a4cfff5 100644 --- a/gnu/usr.bin/cc/legal/md +++ b/gnu/usr.bin/cc/legal/md @@ -1,4 +1,4 @@ -;; GCC machine description for Intel 80386. +;; GCC machine description for Intel X86. ;; Copyright (C) 1988, 1994 Free Software Foundation, Inc. ;; Mostly by William Schelter. @@ -157,7 +157,7 @@ if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); }") ;; Don't generate tstsf if generating IEEE code, since the `ftst' opcode @@ -190,7 +190,7 @@ if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); }") ;; Don't generate tstdf if generating IEEE code, since the `ftst' opcode @@ -223,7 +223,7 @@ if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) output_asm_insn (AS1 (fstp,%y0), operands); - return (char *) output_fp_cc0_set (insn); + return output_fp_cc0_set (insn); }") ;; Don't generate tstdf if generating IEEE code, since the `ftst' opcode @@ -349,7 +349,7 @@ (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387 && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -359,7 +359,7 @@ (match_operand:SI 1 "nonimmediate_operand" "rm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -369,7 +369,7 @@ (match_operand:XF 1 "register_operand" "f")])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -379,7 +379,7 @@ (match_operand:DF 1 "nonimmediate_operand" "fm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -389,7 +389,7 @@ (match_operand:SF 1 "nonimmediate_operand" "fm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -397,7 +397,7 @@ (match_operand:XF 1 "register_operand" "f"))) (clobber (match_scratch:HI 2 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -407,7 +407,7 @@ (clobber (match_scratch:HI 3 "=a,a"))] "TARGET_80387 && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -417,7 +417,7 @@ (match_operand:SI 1 "nonimmediate_operand" "rm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -427,7 +427,7 @@ (match_operand:DF 1 "register_operand" "f")])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -437,7 +437,7 @@ (match_operand:SF 1 "nonimmediate_operand" "fm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -447,7 +447,7 @@ (match_operand:DF 1 "register_operand" "f")])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -455,7 +455,7 @@ (match_operand:DF 1 "register_operand" "f"))) (clobber (match_scratch:HI 2 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") ;; These two insns will never be generated by combine due to the mode of ;; the COMPARE. @@ -466,7 +466,7 @@ ; (match_operand:SF 1 "register_operand" "f")))) ; (clobber (match_scratch:HI 2 "=a"))] ; "TARGET_80387" -; "* return (char *) output_float_compare (insn, operands);") +; "* return output_float_compare (insn, operands);") ; ;(define_insn "" ; [(set (cc0) @@ -475,7 +475,7 @@ ; (match_operand:DF 1 "register_operand" "f"))) ; (clobber (match_scratch:HI 2 "=a"))] ; "TARGET_80387" -; "* return (char *) output_float_compare (insn, operands);") +; "* return output_float_compare (insn, operands);") (define_insn "cmpsf_cc_1" [(set (cc0) @@ -485,7 +485,7 @@ (clobber (match_scratch:HI 3 "=a,a"))] "TARGET_80387 && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -495,7 +495,7 @@ (match_operand:SI 1 "nonimmediate_operand" "rm"))])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -505,7 +505,7 @@ (match_operand:SF 1 "register_operand" "f")])) (clobber (match_scratch:HI 3 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_insn "" [(set (cc0) @@ -513,7 +513,7 @@ (match_operand:SF 1 "register_operand" "f"))) (clobber (match_scratch:HI 2 "=a"))] "TARGET_80387" - "* return (char *) output_float_compare (insn, operands);") + "* return output_float_compare (insn, operands);") (define_expand "cmpxf" [(set (cc0) @@ -740,7 +740,7 @@ (define_insn "" [(set (match_operand:SI 0 "push_operand" "=<") (match_operand:SI 1 "general_operand" "g"))] - "! TARGET_486" + "TARGET_386" "push%L0 %1") ;; On a 486, it is faster to move MEM to a REG and then push, rather than @@ -748,8 +748,14 @@ (define_insn "" [(set (match_operand:SI 0 "push_operand" "=<") + (match_operand:SI 1 "nonmemory_operand" "ri"))] + "!TARGET_386 && TARGET_MOVE" + "push%L0 %1") + +(define_insn "" + [(set (match_operand:SI 0 "push_operand" "=<") (match_operand:SI 1 "general_operand" "ri"))] - "TARGET_486" + "!TARGET_386 && !TARGET_MOVE" "push%L0 %1") ;; General case of fullword move. @@ -767,6 +773,15 @@ if (flag_pic && SYMBOLIC_CONST (operands[1])) emit_pic_move (operands, SImode); + + /* Don't generate memory->memory moves, go through a register */ + else if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (SImode, operands[1]); + } }") ;; On i486, incl reg is faster than movl $1,reg. @@ -774,7 +789,7 @@ (define_insn "" [(set (match_operand:SI 0 "general_operand" "=g,r") (match_operand:SI 1 "general_operand" "ri,m"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { rtx link; @@ -793,21 +808,52 @@ /* Fastest way to change a 0 to a 1. */ return AS1 (inc%L0,%0); + if (flag_pic && SYMBOLIC_CONST (operands[1])) + return AS2 (lea%L0,%a1,%0); + return AS2 (mov%L0,%1,%0); }") (define_insn "" [(set (match_operand:HI 0 "push_operand" "=<") (match_operand:HI 1 "general_operand" "g"))] - "" + "TARGET_386" + "push%W0 %1") + +(define_insn "" + [(set (match_operand:HI 0 "push_operand" "=<") + (match_operand:HI 1 "nonmemory_operand" "ri"))] + "!TARGET_386 && TARGET_MOVE" + "push%W0 %1") + +(define_insn "" + [(set (match_operand:HI 0 "push_operand" "=<") + (match_operand:HI 1 "general_operand" "ri"))] + "!TARGET_386 && !TARGET_MOVE" "push%W0 %1") ;; On i486, an incl and movl are both faster than incw and movw. -(define_insn "movhi" +(define_expand "movhi" + [(set (match_operand:HI 0 "general_operand" "") + (match_operand:HI 1 "general_operand" ""))] + "" + " +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (HImode, operands[1]); + } +}") + +(define_insn "" [(set (match_operand:HI 0 "general_operand" "=g,r") (match_operand:HI 1 "general_operand" "ri,m"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { rtx link; @@ -837,10 +883,26 @@ return AS2 (mov%W0,%1,%0); }") -(define_insn "movstricthi" +(define_expand "movstricthi" + [(set (strict_low_part (match_operand:HI 0 "general_operand" "")) + (match_operand:HI 1 "general_operand" ""))] + "" + " +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (HImode, operands[1]); + } +}") + +(define_insn "" [(set (strict_low_part (match_operand:HI 0 "general_operand" "+g,r")) (match_operand:HI 1 "general_operand" "ri,m"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { rtx link; @@ -868,8 +930,24 @@ ;; the amount pushed up to a halfword. (define_insn "" [(set (match_operand:QI 0 "push_operand" "=<") - (match_operand:QI 1 "general_operand" "q"))] + (match_operand:QI 1 "immediate_operand" "n"))] "" + "* return AS1 (push%W0,%1);") + +(define_insn "" + [(set (match_operand:QI 0 "push_operand" "=<") + (match_operand:QI 1 "nonimmediate_operand" "q"))] + "!TARGET_MOVE" + "* +{ + operands[1] = gen_rtx (REG, HImode, REGNO (operands[1])); + return AS1 (push%W0,%1); +}") + +(define_insn "" + [(set (match_operand:QI 0 "push_operand" "=<") + (match_operand:QI 1 "register_operand" "q"))] + "TARGET_MOVE" "* { operands[1] = gen_rtx (REG, HImode, REGNO (operands[1])); @@ -881,10 +959,26 @@ ;; ??? Do a recognizer for zero_extract that looks just like this, but reads ;; or writes %ah, %bh, %ch, %dh. -(define_insn "movqi" +(define_expand "movqi" + [(set (match_operand:QI 0 "general_operand" "") + (match_operand:QI 1 "general_operand" ""))] + "" + " +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (QImode, operands[1]); + } +}") + +(define_insn "" [(set (match_operand:QI 0 "general_operand" "=q,*r,qm") (match_operand:QI 1 "general_operand" "*g,q,qn"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { rtx link; @@ -919,10 +1013,26 @@ ;; If operands[1] is a constant, then an andl/orl sequence would be ;; faster. -(define_insn "movstrictqi" +(define_expand "movstrictqi" + [(set (strict_low_part (match_operand:QI 0 "general_operand" "")) + (match_operand:QI 1 "general_operand" ""))] + "" + " +{ + /* Don't generate memory->memory moves, go through a register */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM) + { + operands[1] = force_reg (QImode, operands[1]); + } +}") + +(define_insn "" [(set (strict_low_part (match_operand:QI 0 "general_operand" "+qm,q")) (match_operand:QI 1 "general_operand" "*qn,m"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { rtx link; @@ -951,10 +1061,43 @@ return AS2 (mov%B0,%1,%0); }") -(define_insn "" +(define_expand "movsf" + [(set (match_operand:SF 0 "general_operand" "") + (match_operand:SF 1 "general_operand" ""))] + "" + " +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], SFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], SFmode)) + ? gen_movsf_push + : gen_movsf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +}") + +(define_insn "movsf_push_nomove" [(set (match_operand:SF 0 "push_operand" "=<,<") (match_operand:SF 1 "general_operand" "gF,f"))] - "" + "!TARGET_MOVE" "* { if (STACK_REG_P (operands[1])) @@ -979,14 +1122,61 @@ return AS1 (push%L1,%1); }") -;; Allow MEM-MEM moves before reload. The reload class for such a -;; move will be ALL_REGS. PREFERRED_RELOAD_CLASS will narrow this to -;; GENERAL_REGS. For the purposes of regclass, prefer FLOAT_REGS. +(define_insn "movsf_push" + [(set (match_operand:SF 0 "push_operand" "=<,<,<,<") + (match_operand:SF 1 "general_operand" "rF,f,m,m")) + (clobber (match_scratch:SI 2 "=X,X,r,X"))] + "" + "* +{ + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + if (! STACK_TOP_P (operands[1])) + abort (); + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (4); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + + if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fstp%S0,%0), xops); + else + output_asm_insn (AS1 (fst%S0,%0), xops); + RET; + } + + else if (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != REG) + return AS1 (push%L1,%1); + + else + { + output_asm_insn (AS2 (mov%L2,%1,%2), operands); + return AS1 (push%L2,%2); + } +}") + +;; Special memory<->memory pattern that combine will recreate from the +;; moves to pseudos. +(define_insn "movsf_mem" + [(set (match_operand:SF 0 "memory_operand" "=m") + (match_operand:SF 1 "memory_operand" "m")) + (clobber (match_scratch:SI 2 "=&r"))] + "" + "* +{ + output_asm_insn (AS2 (mov%L2,%1,%2), operands); + return AS2 (mov%L0,%2,%0); +}") -(define_insn "movsf" +;; For the purposes of regclass, prefer FLOAT_REGS. +(define_insn "movsf_normal" [(set (match_operand:SF 0 "general_operand" "=*rfm,*rf,f,!*rm") (match_operand:SF 1 "general_operand" "*rf,*rfm,fG,fF"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0; @@ -1028,21 +1218,67 @@ /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all SFmode moves not involving the 387 */ - return (char *) singlemove_string (operands); + return singlemove_string (operands); }") -;;should change to handle the memory operands[1] without doing df push.. -(define_insn "" +(define_insn "swapsf" + [(set (match_operand:SF 0 "register_operand" "f") + (match_operand:SF 1 "register_operand" "f")) + (set (match_dup 1) + (match_dup 0))] + "" + "* +{ + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); +}") + +(define_expand "movdf" + [(set (match_operand:DF 0 "general_operand" "") + (match_operand:DF 1 "general_operand" ""))] + "" + " +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], DFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], DFmode)) + ? gen_movdf_push + : gen_movdf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +}") + +(define_insn "movdf_push_nomove" [(set (match_operand:DF 0 "push_operand" "=<,<") (match_operand:DF 1 "general_operand" "gF,f"))] - "" + "!TARGET_MOVE" "* { if (STACK_REG_P (operands[1])) @@ -1063,31 +1299,55 @@ RET; } else - return (char *) output_move_double (operands); + return output_move_double (operands); }") -(define_insn "swapdf" - [(set (match_operand:DF 0 "register_operand" "f") - (match_operand:DF 1 "register_operand" "f")) - (set (match_dup 1) - (match_dup 0))] +(define_insn "movdf_push" + [(set (match_operand:DF 0 "push_operand" "=<,<,<,<,<") + (match_operand:DF 1 "general_operand" "rF,f,o,o,o")) + (clobber (match_scratch:SI 2 "=X,X,&r,&r,X")) + (clobber (match_scratch:SI 3 "=X,X,&r,X,X"))] "" "* { - if (STACK_TOP_P (operands[0])) - return AS1 (fxch,%1); + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (8); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + + if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fstp%Q0,%0), xops); + else + output_asm_insn (AS1 (fst%Q0,%0), xops); + + RET; + } + + else if (GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + else - return AS1 (fxch,%0); + return output_move_pushmem (operands, insn, GET_MODE_SIZE (DFmode), 2, 4); }") -;; Allow MEM-MEM moves before reload. The reload class for such a -;; move will be ALL_REGS. PREFERRED_RELOAD_CLASS will narrow this to -;; GENERAL_REGS. For the purposes of regclass, prefer FLOAT_REGS. - -(define_insn "movdf" - [(set (match_operand:DF 0 "general_operand" "=*rfm,*rf,f,!*rm") - (match_operand:DF 1 "general_operand" "*rf,*rfm,fG,fF"))] +(define_insn "movdf_mem" + [(set (match_operand:DF 0 "memory_operand" "=o,o") + (match_operand:DF 1 "memory_operand" "o,o")) + (clobber (match_scratch:SI 2 "=&r,&r")) + (clobber (match_scratch:SI 3 "=&r,X"))] "" + "* return output_move_memory (operands, insn, GET_MODE_SIZE (DFmode), 2, 4);") + +;; For the purposes of regclass, prefer FLOAT_REGS. +(define_insn "movdf_normal" + [(set (match_operand:DF 0 "general_operand" "=f,fm,!*rf,!*rm") + (match_operand:DF 1 "general_operand" "fmG,f,*rfm,*rfF"))] + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0; @@ -1129,20 +1389,68 @@ /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all DFmode moves not involving the 387 */ - return (char *) output_move_double (operands); + return output_move_double (operands); }") -(define_insn "" +(define_insn "swapdf" + [(set (match_operand:DF 0 "register_operand" "f") + (match_operand:DF 1 "register_operand" "f")) + (set (match_dup 1) + (match_dup 0))] + "" + "* +{ + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); +}") + +(define_expand "movxf" + [(set (match_operand:XF 0 "general_operand" "") + (match_operand:XF 1 "general_operand" ""))] + "" + " +{ + /* Special case memory->memory moves and pushes */ + if (TARGET_MOVE + && (reload_in_progress | reload_completed) == 0 + && GET_CODE (operands[0]) == MEM + && (GET_CODE (operands[1]) == MEM || push_operand (operands[0], XFmode))) + { + rtx (*genfunc) PROTO((rtx, rtx)) = (push_operand (operands[0], XFmode)) + ? gen_movxf_push + : gen_movxf_mem; + + emit_insn ((*genfunc) (operands[0], operands[1])); + DONE; + } + + /* If we are loading a floating point constant that isn't 0 or 1 into a register, + indicate we need the pic register loaded. This could be optimized into stores + of constants if the target eventually moves to memory, but better safe than + sorry. */ + if (flag_pic + && GET_CODE (operands[0]) != MEM + && GET_CODE (operands[1]) == CONST_DOUBLE + && !standard_80387_constant_p (operands[1])) + { + current_function_uses_pic_offset_table = 1; + } +}") + + +(define_insn "movxf_push_nomove" [(set (match_operand:XF 0 "push_operand" "=<,<") (match_operand:XF 1 "general_operand" "gF,f"))] - "" + "!TARGET_MOVE" "* { if (STACK_REG_P (operands[1])) @@ -1161,29 +1469,53 @@ RET; } else - return (char *) output_move_double (operands); + return output_move_double (operands); }") -(define_insn "swapxf" - [(set (match_operand:XF 0 "register_operand" "f") - (match_operand:XF 1 "register_operand" "f")) - (set (match_dup 1) - (match_dup 0))] +(define_insn "movxf_push" + [(set (match_operand:XF 0 "push_operand" "=<,<,<,<,<") + (match_operand:XF 1 "general_operand" "rF,f,o,o,o")) + (clobber (match_scratch:SI 2 "=X,X,&r,&r,X")) + (clobber (match_scratch:SI 3 "=X,X,&r,X,X"))] "" "* { - if (STACK_TOP_P (operands[0])) - return AS1 (fxch,%1); + if (STACK_REG_P (operands[1])) + { + rtx xops[3]; + + xops[0] = AT_SP (SFmode); + xops[1] = GEN_INT (12); + xops[2] = stack_pointer_rtx; + + output_asm_insn (AS2 (sub%L2,%1,%2), xops); + output_asm_insn (AS1 (fstp%T0,%0), xops); + if (! find_regno_note (insn, REG_DEAD, FIRST_STACK_REG)) + output_asm_insn (AS1 (fld%T0,%0), xops); + + RET; + } + + else if (GET_CODE (operands[1]) != MEM + || GET_CODE (operands[2]) != REG) + return output_move_double (operands); + else - return AS1 (fxch,%0); + return output_move_pushmem (operands, insn, GET_MODE_SIZE (XFmode), 2, 4); }") -(define_insn "movxf" +(define_insn "movxf_mem" + [(set (match_operand:XF 0 "memory_operand" "=o,o") + (match_operand:XF 1 "memory_operand" "o,o")) + (clobber (match_scratch:SI 2 "=&r,&r")) + (clobber (match_scratch:SI 3 "=&r,X"))] + "" + "* return output_move_memory (operands, insn, GET_MODE_SIZE (XFmode), 2, 4);") + +(define_insn "movxf_normal" [(set (match_operand:XF 0 "general_operand" "=f,fm,!*rf,!*rm") (match_operand:XF 1 "general_operand" "fmG,f,*rfm,*rfF"))] -;; [(set (match_operand:XF 0 "general_operand" "=*rf,*rfm,f,!*rm") -;; (match_operand:XF 1 "general_operand" "*rfm,*rf,fG,fF"))] - "" + "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)" "* { int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0; @@ -1226,33 +1558,61 @@ /* Handle other kinds of reads to the 387 */ if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE) - return (char *) output_move_const_single (operands); + return output_move_const_single (operands); if (STACK_TOP_P (operands[0])) return AS1 (fld%z1,%y1); /* Handle all XFmode moves not involving the 387 */ - return (char *) output_move_double (operands); + return output_move_double (operands); +}") + +(define_insn "swapxf" + [(set (match_operand:XF 0 "register_operand" "f") + (match_operand:XF 1 "register_operand" "f")) + (set (match_dup 1) + (match_dup 0))] + "" + "* +{ + if (STACK_TOP_P (operands[0])) + return AS1 (fxch,%1); + else + return AS1 (fxch,%0); }") (define_insn "" - [(set (match_operand:DI 0 "push_operand" "=<") - (match_operand:DI 1 "general_operand" "roiF"))] + [(set (match_operand:DI 0 "push_operand" "=<,<,<,<") + (match_operand:DI 1 "general_operand" "riF,o,o,o")) + (clobber (match_scratch:SI 2 "=X,&r,&r,X")) + (clobber (match_scratch:SI 3 "=X,&r,X,X"))] "" "* { - return (char *) output_move_double (operands); + if (GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + + else + return output_move_pushmem (operands, insn, GET_MODE_SIZE (DImode), 2, 4); }") (define_insn "movdi" - [(set (match_operand:DI 0 "general_operand" "=r,rm") - (match_operand:DI 1 "general_operand" "m,riF"))] + [(set (match_operand:DI 0 "general_operand" "=o,o,r,rm") + (match_operand:DI 1 "general_operand" "o,o,m,riF")) + (clobber (match_scratch:SI 2 "=&r,&r,X,X")) + (clobber (match_scratch:SI 3 "=&r,X,X,X"))] "" "* { - return (char *) output_move_double (operands); + rtx low[2], high[2], xop[6]; + + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + return output_move_double (operands); + else + return output_move_memory (operands, insn, GET_MODE_SIZE (DImode), 2, 4); }") + ;;- conversion instructions ;;- NONE @@ -1267,7 +1627,7 @@ "" "* { - if ((TARGET_486 || REGNO (operands[0]) == 0) + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -1291,7 +1651,7 @@ "" "* { - if ((TARGET_486 || REGNO (operands[0]) == 0) + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -1315,7 +1675,7 @@ "" "* { - if ((TARGET_486 || REGNO (operands[0]) == 0) + if ((!TARGET_386 || REGNO (operands[0]) == 0) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])) { rtx xops[2]; @@ -1778,7 +2138,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") (define_insn "" [(set (match_operand:DI 0 "general_operand" "=rm") @@ -1788,7 +2148,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") (define_insn "" [(set (match_operand:DI 0 "general_operand" "=rm") @@ -1798,7 +2158,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") ;; Signed MODE_FLOAT conversion to SImode. @@ -1851,7 +2211,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") (define_insn "" [(set (match_operand:SI 0 "general_operand" "=rm") @@ -1860,7 +2220,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") (define_insn "" [(set (match_operand:SI 0 "general_operand" "=rm") @@ -1869,7 +2229,7 @@ (clobber (match_operand:SI 3 "memory_operand" "m")) (clobber (match_scratch:SI 4 "=&q"))] "TARGET_80387" - "* return (char *) output_fix_trunc (insn, operands);") + "* return output_fix_trunc (insn, operands);") ;; Conversion between fixed point and floating point. ;; The actual pattern that matches these is at the end of this file. @@ -2019,25 +2379,75 @@ ;;- add instructions (define_insn "adddi3" - [(set (match_operand:DI 0 "general_operand" "=&r,ro") - (plus:DI (match_operand:DI 1 "general_operand" "%0,0") - (match_operand:DI 2 "general_operand" "o,riF")))] + [(set (match_operand:DI 0 "general_operand" "=&r,ro,o,&r,ro,o,&r,o,o,o") + (plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,o,riF,o,or,riF,riF,o") + (match_operand:DI 2 "general_operand" "o,riF,o,0,0,0,oriF,riF,o,o"))) + (clobber (match_scratch:SI 3 "=X,X,&r,X,X,&r,X,X,&r,&r"))] "" "* { - rtx low[3], high[3]; + rtx low[3], high[3], xops[7], temp; CC_STATUS_INIT; + if (rtx_equal_p (operands[0], operands[2])) + { + temp = operands[1]; + operands[1] = operands[2]; + operands[2] = temp; + } + split_di (operands, 3, low, high); + if (!rtx_equal_p (operands[0], operands[1])) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[1]; + xops[3] = low[1]; + + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + { + output_asm_insn (AS2 (mov%L1,%3,%1), xops); + output_asm_insn (AS2 (mov%L0,%2,%0), xops); + } + else + { + xops[4] = high[2]; + xops[5] = low[2]; + xops[6] = operands[3]; + output_asm_insn (AS2 (mov%L6,%3,%6), xops); + output_asm_insn (AS2 (add%L6,%5,%6), xops); + output_asm_insn (AS2 (mov%L1,%6,%1), xops); + output_asm_insn (AS2 (mov%L6,%2,%6), xops); + output_asm_insn (AS2 (adc%L6,%4,%6), xops); + output_asm_insn (AS2 (mov%L0,%6,%0), xops); + RET; + } + } + + if (GET_CODE (operands[3]) == REG && GET_CODE (operands[2]) != REG) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[2]; + xops[3] = low[2]; + xops[4] = operands[3]; + + output_asm_insn (AS2 (mov%L4,%3,%4), xops); + output_asm_insn (AS2 (add%L1,%4,%1), xops); + output_asm_insn (AS2 (mov%L4,%2,%4), xops); + output_asm_insn (AS2 (adc%L0,%4,%0), xops); + } - if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) + else if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) { output_asm_insn (AS2 (add%L0,%2,%0), low); output_asm_insn (AS2 (adc%L0,%2,%0), high); } + else output_asm_insn (AS2 (add%L0,%2,%0), high); + RET; }") @@ -2056,23 +2466,20 @@ if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2])) return AS2 (add%L0,%1,%0); - if (! TARGET_486 || ! REG_P (operands[2])) - { - CC_STATUS_INIT; + if (operands[2] == stack_pointer_rtx) + { + rtx temp; - if (operands[2] == stack_pointer_rtx) - { - rtx temp; + temp = operands[1]; + operands[1] = operands[2]; + operands[2] = temp; + } - temp = operands[1]; - operands[1] = operands[2]; - operands[2] = temp; - } - if (operands[2] != stack_pointer_rtx) - { - operands[1] = SET_SRC (PATTERN (insn)); - return AS2 (lea%L0,%a1,%0); - } + if (operands[2] != stack_pointer_rtx) + { + CC_STATUS_INIT; + operands[1] = SET_SRC (PATTERN (insn)); + return AS2 (lea%L0,%a1,%0); } output_asm_insn (AS2 (mov%L0,%1,%0), operands); @@ -2171,7 +2578,7 @@ ;; addsi3 is faster, so put this after. -(define_insn "" +(define_insn "movsi_lea" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:QI 1 "address_operand" "p"))] "" @@ -2223,23 +2630,66 @@ ;;- subtract instructions (define_insn "subdi3" - [(set (match_operand:DI 0 "general_operand" "=&r,ro") - (minus:DI (match_operand:DI 1 "general_operand" "0,0") - (match_operand:DI 2 "general_operand" "o,riF")))] + [(set (match_operand:DI 0 "general_operand" "=&r,ro,&r,o,o") + (minus:DI (match_operand:DI 1 "general_operand" "0,0,roiF,riF,o") + (match_operand:DI 2 "general_operand" "o,riF,roiF,riF,o"))) + (clobber (match_scratch:SI 3 "=X,X,X,X,&r"))] "" "* { - rtx low[3], high[3]; + rtx low[3], high[3], xops[7]; CC_STATUS_INIT; split_di (operands, 3, low, high); - if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) + if (!rtx_equal_p (operands[0], operands[1])) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[1]; + xops[3] = low[1]; + + if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) + { + output_asm_insn (AS2 (mov%L1,%3,%1), xops); + output_asm_insn (AS2 (mov%L0,%2,%0), xops); + } + else + { + xops[4] = high[2]; + xops[5] = low[2]; + xops[6] = operands[3]; + output_asm_insn (AS2 (mov%L6,%3,%6), xops); + output_asm_insn (AS2 (sub%L6,%5,%6), xops); + output_asm_insn (AS2 (mov%L1,%6,%1), xops); + output_asm_insn (AS2 (mov%L6,%2,%6), xops); + output_asm_insn (AS2 (sbb%L6,%4,%6), xops); + output_asm_insn (AS2 (mov%L0,%6,%0), xops); + RET; + } + } + + if (GET_CODE (operands[3]) == REG) + { + xops[0] = high[0]; + xops[1] = low[0]; + xops[2] = high[2]; + xops[3] = low[2]; + xops[4] = operands[3]; + + output_asm_insn (AS2 (mov%L4,%3,%4), xops); + output_asm_insn (AS2 (sub%L1,%4,%1), xops); + output_asm_insn (AS2 (mov%L4,%2,%4), xops); + output_asm_insn (AS2 (sbb%L0,%4,%0), xops); + } + + else if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0) { output_asm_insn (AS2 (sub%L0,%2,%0), low); output_asm_insn (AS2 (sbb%L0,%2,%0), high); } + else output_asm_insn (AS2 (sub%L0,%2,%0), high); @@ -2361,14 +2811,32 @@ [(set (match_operand:DI 0 "register_operand" "=A") (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%0")) (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))))] - "" + "TARGET_WIDE_MULTIPLY" "mul%L0 %2") (define_insn "mulsidi3" [(set (match_operand:DI 0 "register_operand" "=A") (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0")) (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))))] - "" + "TARGET_WIDE_MULTIPLY" + "imul%L0 %2") + +(define_insn "umulsi3_highpart" + [(set (match_operand:SI 0 "register_operand" "=d") + (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%a")) + (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))) + (const_int 32)))) + (clobber (match_scratch:SI 3 "=a"))] + "TARGET_WIDE_MULTIPLY" + "mul%L0 %2") + +(define_insn "smulsi3_highpart" + [(set (match_operand:SI 0 "register_operand" "=d") + (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%a")) + (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))) + (const_int 32)))) + (clobber (match_scratch:SI 3 "=a"))] + "TARGET_WIDE_MULTIPLY" "imul%L0 %2") ;; The patterns that match these are at the end of this file. @@ -2533,7 +3001,7 @@ if (INTVAL (operands[2]) == 0xffff && REG_P (operands[0]) && (! REG_P (operands[1]) || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0) - && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1]))) + && (TARGET_386 || ! rtx_equal_p (operands[0], operands[1]))) { /* ??? tege: Should forget CC_STATUS only if we clobber a remembered operand. Fix that later. */ @@ -2549,7 +3017,7 @@ && !(REG_P (operands[1]) && NON_QI_REG_P (operands[1])) && (! REG_P (operands[1]) || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0) - && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1]))) + && (TARGET_386 || ! rtx_equal_p (operands[0], operands[1]))) { /* ??? tege: Should forget CC_STATUS only if we clobber a remembered operand. Fix that later. */ @@ -3192,7 +3660,7 @@ { if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1])) { - if (TARGET_486 && INTVAL (operands[2]) == 1) + if (!TARGET_386 && INTVAL (operands[2]) == 1) { output_asm_insn (AS2 (mov%L0,%1,%0), operands); return AS2 (add%L0,%1,%0); @@ -3693,7 +4161,7 @@ (const_int 1) (match_operand:SI 2 "general_operand" "r")) (match_operand:SI 3 "const_int_operand" "n"))] - "! TARGET_486 && GET_CODE (operands[2]) != CONST_INT" + "TARGET_386 && GET_CODE (operands[2]) != CONST_INT" "* { CC_STATUS_INIT; @@ -3711,7 +4179,7 @@ (xor:SI (ashift:SI (const_int 1) (match_operand:SI 1 "general_operand" "r")) (match_operand:SI 2 "general_operand" "0")))] - "! TARGET_486 && GET_CODE (operands[1]) != CONST_INT" + "TARGET_386 && GET_CODE (operands[1]) != CONST_INT" "* { CC_STATUS_INIT; @@ -3724,7 +4192,7 @@ (xor:SI (match_operand:SI 1 "general_operand" "0") (ashift:SI (const_int 1) (match_operand:SI 2 "general_operand" "r"))))] - "! TARGET_486 && GET_CODE (operands[2]) != CONST_INT" + "TARGET_386 && GET_CODE (operands[2]) != CONST_INT" "* { CC_STATUS_INIT; @@ -4742,126 +5210,42 @@ "!HALF_PIC_P ()" "call %P1") +;; Call subroutine returning any type. + (define_expand "untyped_call" - [(parallel [(call (match_operand:QI 0 "indirect_operand" "") + [(parallel [(call (match_operand 0 "" "") (const_int 0)) - (match_operand:BLK 1 "memory_operand" "") + (match_operand 1 "" "") (match_operand 2 "" "")])] "" " { - rtx addr; + int i; - if (flag_pic) - current_function_uses_pic_offset_table = 1; + emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx)); - /* With half-pic, force the address into a register. */ - addr = XEXP (operands[0], 0); - if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr)) - XEXP (operands[0], 0) = force_reg (Pmode, addr); - - operands[1] = change_address (operands[1], DImode, XEXP (operands[1], 0)); - if (! expander_call_insn_operand (operands[1], QImode)) - operands[1] - = change_address (operands[1], VOIDmode, - copy_to_mode_reg (Pmode, XEXP (operands[1], 0))); -}") - -(define_insn "" - [(call (match_operand:QI 0 "call_insn_operand" "m") - (const_int 0)) - (match_operand:DI 1 "memory_operand" "o") - (match_operand 2 "" "")] - "" - "* -{ - rtx addr = operands[1]; - - if (GET_CODE (operands[0]) == MEM - && ! CONSTANT_ADDRESS_P (XEXP (operands[0], 0))) + for (i = 0; i < XVECLEN (operands[2], 0); i++) { - operands[0] = XEXP (operands[0], 0); - output_asm_insn (AS1 (call,%*%0), operands); + rtx set = XVECEXP (operands[2], 0, i); + emit_move_insn (SET_DEST (set), SET_SRC (set)); } - else - output_asm_insn (AS1 (call,%P0), operands); - - operands[2] = gen_rtx (REG, SImode, 0); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[2] = gen_rtx (REG, SImode, 1); - operands[1] = adj_offsettable_operand (addr, 4); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[1] = adj_offsettable_operand (addr, 8); - return AS1 (fnsave,%1); -}") -(define_insn "" - [(call (mem:QI (match_operand:SI 0 "symbolic_operand" "")) - (const_int 0)) - (match_operand:DI 1 "memory_operand" "o") - (match_operand 2 "" "")] - "!HALF_PIC_P ()" - "* -{ - rtx addr = operands[1]; - - output_asm_insn (AS1 (call,%P0), operands); - - operands[2] = gen_rtx (REG, SImode, 0); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[2] = gen_rtx (REG, SImode, 1); - operands[1] = adj_offsettable_operand (addr, 4); - output_asm_insn (AS2 (mov%L2,%2,%1), operands); - - operands[1] = adj_offsettable_operand (addr, 8); - return AS1 (fnsave,%1); -}") - -;; We use fnsave and frstor to save and restore the floating point result. -;; These are expensive instructions and require a large space to save the -;; FPU state. An more complicated alternative is to use fnstenv to store -;; the FPU environment and test whether the stack top is valid. Store the -;; result of the test, and if it is valid, pop and save the value. The -;; untyped_return would check the test and optionally push the saved value. - -(define_expand "untyped_return" - [(match_operand:BLK 0 "memory_operand" "") - (match_operand 1 "" "")] - "" - " -{ - rtx valreg1 = gen_rtx (REG, SImode, 0); - rtx valreg2 = gen_rtx (REG, SImode, 1); - rtx result = operands[0]; - - /* Restore the FPU state. */ - emit_insn (gen_update_return (change_address (result, SImode, - plus_constant (XEXP (result, 0), - 8)))); - - /* Reload the function value registers. */ - emit_move_insn (valreg1, change_address (result, SImode, XEXP (result, 0))); - emit_move_insn (valreg2, - change_address (result, SImode, - plus_constant (XEXP (result, 0), 4))); - - /* Put USE insns before the return. */ - emit_insn (gen_rtx (USE, VOIDmode, valreg1)); - emit_insn (gen_rtx (USE, VOIDmode, valreg2)); - - /* Construct the return. */ - expand_null_return (); + /* The optimizer does not know that the call sets the function value + registers we stored in the result block. We avoid problems by + claiming that all hard registers are used and clobbered at this + point. */ + emit_insn (gen_blockage ()); DONE; }") -(define_insn "update_return" - [(unspec:SI [(match_operand:SI 0 "memory_operand" "m")] 0)] +;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and +;; all of memory. This blocks insns from being moved across this point. + +(define_insn "blockage" + [(unspec_volatile [(const_int 0)] 0)] "" - "frstor %0") + "") ;; Insn emitted into the body of a function to return from a function. ;; This is only done if the function's epilogue is known to be simple. @@ -5153,7 +5537,7 @@ [(match_operand:DF 1 "nonimmediate_operand" "0,fm") (match_operand:DF 2 "nonimmediate_operand" "fm,0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") @@ -5161,7 +5545,7 @@ [(float:DF (match_operand:SI 1 "general_operand" "rm")) (match_operand:DF 2 "general_operand" "0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:XF 0 "register_operand" "=f,f") @@ -5169,7 +5553,7 @@ [(match_operand:XF 1 "nonimmediate_operand" "0,f") (match_operand:XF 2 "nonimmediate_operand" "f,0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:XF 0 "register_operand" "=f") @@ -5177,7 +5561,7 @@ [(float:XF (match_operand:SI 1 "general_operand" "rm")) (match_operand:XF 2 "general_operand" "0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:XF 0 "register_operand" "=f,f") @@ -5185,7 +5569,7 @@ [(float_extend:XF (match_operand:SF 1 "general_operand" "fm,0")) (match_operand:XF 2 "general_operand" "0,f")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:XF 0 "register_operand" "=f") @@ -5193,7 +5577,7 @@ [(match_operand:XF 1 "general_operand" "0") (float:XF (match_operand:SI 2 "general_operand" "rm"))]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:XF 0 "register_operand" "=f,f") @@ -5202,7 +5586,7 @@ (float_extend:XF (match_operand:SF 2 "general_operand" "fm,0"))]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:DF 0 "register_operand" "=f,f") @@ -5210,7 +5594,7 @@ [(float_extend:DF (match_operand:SF 1 "general_operand" "fm,0")) (match_operand:DF 2 "general_operand" "0,f")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") @@ -5218,7 +5602,7 @@ [(match_operand:DF 1 "general_operand" "0") (float:DF (match_operand:SI 2 "general_operand" "rm"))]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:DF 0 "register_operand" "=f,f") @@ -5227,7 +5611,7 @@ (float_extend:DF (match_operand:SF 2 "general_operand" "fm,0"))]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:SF 0 "register_operand" "=f,f") @@ -5235,7 +5619,7 @@ [(match_operand:SF 1 "nonimmediate_operand" "0,fm") (match_operand:SF 2 "nonimmediate_operand" "fm,0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:SF 0 "register_operand" "=f") @@ -5243,7 +5627,7 @@ [(float:SF (match_operand:SI 1 "general_operand" "rm")) (match_operand:SF 2 "general_operand" "0")]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_insn "" [(set (match_operand:SF 0 "register_operand" "=f") @@ -5251,7 +5635,7 @@ [(match_operand:SF 1 "general_operand" "0") (float:SF (match_operand:SI 2 "general_operand" "rm"))]))] "TARGET_80387" - "* return (char *) output_387_binary_op (insn, operands);") + "* return output_387_binary_op (insn, operands);") (define_expand "strlensi" [(parallel [(set (match_dup 4) diff --git a/gnu/usr.bin/cc/libgcc/Makefile b/gnu/usr.bin/cc/libgcc/Makefile index 4b2c5a4..fa966d15 100644 --- a/gnu/usr.bin/cc/libgcc/Makefile +++ b/gnu/usr.bin/cc/libgcc/Makefile @@ -5,10 +5,10 @@ LIB= gcc INSTALL_PIC_ARCHIVE= yes SHLIB_MAJOR= 26 -SHLIB_MINOR= 0 +SHLIB_MINOR= 1 LIB1OBJS= _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o _lshrsi3.o _lshlsi3.o _ashrsi3.o _ashlsi3.o _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _fixdfsi.o _fixsfsi.o _floatsidf.o _floatsisf.o _truncdfsf2.o _extendsfdf2.o _addsf3.o _negsf2.o _subsf3.o _mulsf3.o _divsf3.o _eqdf2.o _nedf2.o _gtdf2.o _gedf2.o _ltdf2.o _ledf2.o _eqsf2.o _nesf2.o _gtsf2.o _gesf2.o _ltsf2.o _lesf2.o -LIB2OBJS= _muldi3.o _divdi3.o _moddi3.o _udivdi3.o _umoddi3.o _negdi2.o _lshrdi3.o _lshldi3.o _ashldi3.o _ashrdi3.o _ffsdi2.o _udiv_w_sdiv.o _udivmoddi4.o _cmpdi2.o _ucmpdi2.o _floatdidf.o _floatdisf.o _fixunsdfsi.o _fixunssfsi.o _fixunsdfdi.o _fixdfdi.o _fixunssfdi.o _fixsfdi.o _fixxfdi.o _fixunsxfdi.o _floatdixf.o _fixunsxfsi.o _fixtfdi.o _fixunstfdi.o _floatditf.o __gcc_bcmp.o _varargs.o _eprintf.o _op_new.o _op_vnew.o _new_handler.o _op_delete.o _op_vdel.o _bb.o _shtab.o _clear_cache.o _trampoline.o __main.o _exit.o _ctors.o +LIB2OBJS= _muldi3.o _divdi3.o _moddi3.o _udivdi3.o _umoddi3.o _negdi2.o _lshrdi3.o _lshldi3.o _ashldi3.o _ashrdi3.o _ffsdi2.o _udiv_w_sdiv.o _udivmoddi4.o _cmpdi2.o _ucmpdi2.o _floatdidf.o _floatdisf.o _fixunsdfsi.o _fixunssfsi.o _fixunsdfdi.o _fixdfdi.o _fixunssfdi.o _fixsfdi.o _fixxfdi.o _fixunsxfdi.o _floatdixf.o _fixunsxfsi.o _fixtfdi.o _fixunstfdi.o _floatditf.o __gcc_bcmp.o _varargs.o _eprintf.o _op_new.o _op_vnew.o _new_handler.o _op_delete.o _op_vdel.o _bb.o _shtab.o _clear_cache.o _trampoline.o __main.o _exit.o _ctors.o _eh.o _pure.o OBJS= ${LIB1OBJS} ${LIB2OBJS} LIB1SOBJS=${LIB1OBJS:.o=.so} diff --git a/gnu/usr.bin/cc/libgcc/libgcc2.c b/gnu/usr.bin/cc/libgcc/libgcc2.c index fc2e1ac..63a7114 100644 --- a/gnu/usr.bin/cc/libgcc/libgcc2.c +++ b/gnu/usr.bin/cc/libgcc/libgcc2.c @@ -1428,6 +1428,7 @@ BLOCK_PROFILER_CODE #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ #include <stdio.h> +char *ctime (); #ifdef HAVE_ATEXIT extern void atexit (void (*) (void)); @@ -1995,21 +1996,9 @@ __do_global_dtors () #ifdef DO_GLOBAL_DTORS_BODY DO_GLOBAL_DTORS_BODY; #else - unsigned nptrs = (unsigned HOST_WIDE_INT) __DTOR_LIST__[0]; - unsigned i; - - /* Some systems place the number of pointers - in the first word of the table. - On other systems, that word is -1. - In all cases, the table is null-terminated. */ - - /* If the length is not recorded, count up to the null. */ - if (nptrs == -1) - for (nptrs = 0; __DTOR_LIST__[nptrs + 1] != 0; nptrs++); - - /* GNU LD format. */ - for (i = nptrs; i >= 1; i--) - __DTOR_LIST__[i] (); + func_ptr *p; + for (p = __DTOR_LIST__ + 1; *p; ) + (*p++) (); #endif } @@ -2149,3 +2138,162 @@ func_ptr __CTOR_LIST__[2]; #include "gbl-ctors.h" func_ptr __DTOR_LIST__[2]; #endif + +#ifdef L_eh +typedef struct { + void *start; + void *end; + void *exception_handler; +} exception_table; + +struct exception_table_node { + exception_table *table; + void *start; + void *end; + struct exception_table_node *next; +}; + +static int except_table_pos = 0; +static void *except_pc = (void *)0; +static struct exception_table_node *exception_table_list = 0; + +static exception_table * +find_exception_table (pc) + void* pc; +{ + register struct exception_table_node *table = exception_table_list; + for ( ; table != 0; table = table->next) + { + if (table->start <= pc && table->end > pc) + return table->table; + } + return 0; +} + +/* this routine takes a pc, and the address of the exception handler associated + with the closest exception table handler entry associated with that PC, + or 0 if there are no table entries the PC fits in. The algorithm works + something like this: + + while(current_entry exists) { + if(current_entry.start < pc ) + current_entry = next_entry; + else { + if(prev_entry.start <= pc && prev_entry.end > pc) { + save pointer to prev_entry; + return prev_entry.exception_handler; + } + else return 0; + } + } + return 0; + + Assuming a correctly sorted table (ascending order) this routine should + return the tighest match... + + In the advent of a tie, we have to give the last entry, as it represents + an inner block. + */ + + +void * +__find_first_exception_table_match(pc) +void *pc; +{ + exception_table *table = find_exception_table (pc); + int pos = 0; + int best = 0; + if (table == 0) + return (void*)0; +#if 0 + printf("find_first_exception_table_match(): pc = %x!\n",pc); +#endif + + except_pc = pc; + +#if 0 + /* We can't do this yet, as we don't know that the table is sorted. */ + do { + ++pos; + if (table[pos].start > except_pc) + /* found the first table[pos].start > except_pc, so the previous + entry better be the one we want! */ + break; + } while(table[pos].exception_handler != (void*)-1); + + --pos; + if (table[pos].start <= except_pc && table[pos].end > except_pc) + { + except_table_pos = pos; +#if 0 + printf("find_first_eh_table_match(): found match: %x\n",table[pos].exception_handler); +#endif + return table[pos].exception_handler; + } +#else + while (table[++pos].exception_handler != (void*)-1) { + if (table[pos].start <= except_pc && table[pos].end > except_pc) + { + /* This can apply. Make sure it is better or as good as the previous + best. */ + /* The best one ends first. */ + if (best == 0 || (table[pos].end <= table[best].end + /* The best one starts last. */ + && table[pos].start >= table[best].start)) + best = pos; + } + } + if (best != 0) + return table[best].exception_handler; +#endif + +#if 0 + printf("find_first_eh_table_match(): else: returning NULL!\n"); +#endif + return (void*)0; +} + +int +__throw_type_match (const char *catch_type, const char *throw_type) +{ +#if 0 + printf("__throw_type_match (): catch_type = %s, throw_type = %s\n", + catch_type, throw_type); +#endif + return strcmp (catch_type, throw_type); +} + +void +__register_exceptions (exception_table *table) +{ + struct exception_table_node *node = (struct exception_table_node*) + malloc (sizeof (struct exception_table_node)); + exception_table *range = table + 1; + node->table = table; + + /* This look can be optimized away either if the table + is sorted, or if we pass in extra parameters. */ + node->start = range->start; + node->end = range->end; + for (range++ ; range->start != (void*)(-1); range++) + { + if (range->start < node->start) + node->start = range->start; + if (range->end < node->end) + node->end = range->end; + } + + node->next = exception_table_list; + exception_table_list = node; +} +#endif /* L_eh */ + +#ifdef L_pure +#define MESSAGE "pure virtual method called\n" +void +__pure_virtual () +{ + write (2, MESSAGE, sizeof (MESSAGE) - 1); + _exit (-1); +} +#endif |